[{"data":1,"prerenderedAt":22741},["ShallowReactive",2],{"navigation_docs":3,"-tailwind-tailwind-dark-mode-theming":3338,"-tailwind-tailwind-dark-mode-theming-surround":22736},[4,1707,1904,2358,2539,2608,2815,2937,2987,3044,3078,3204,3281,3334],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1905,"icon":1906,"path":1907,"stem":1908,"children":1909,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1910,1936,1990,2012,2316,2354],{"title":1911,"icon":1912,"path":1913,"stem":1914,"children":1915,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1916,1920,1924,1928,1932],{"title":1917,"path":1918,"stem":1919},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1921,"path":1922,"stem":1923},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1925,"path":1926,"stem":1927},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1929,"path":1930,"stem":1931},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1933,"path":1934,"stem":1935},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1937,"icon":1938,"path":1939,"stem":1940,"children":1941,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1942,1946,1950,1954,1958,1962,1966,1970,1974,1978,1982,1986],{"title":1943,"path":1944,"stem":1945},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1947,"path":1948,"stem":1949},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1951,"path":1952,"stem":1953},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1955,"path":1956,"stem":1957},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1959,"path":1960,"stem":1961},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1963,"path":1964,"stem":1965},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1967,"path":1968,"stem":1969},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1971,"path":1972,"stem":1973},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1975,"path":1976,"stem":1977},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1979,"path":1980,"stem":1981},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1983,"path":1984,"stem":1985},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1987,"path":1988,"stem":1989},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1991,"icon":1992,"path":1993,"stem":1994,"children":1995,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[1996,2000,2004,2008],{"title":1997,"path":1998,"stem":1999},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2001,"path":2002,"stem":2003},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2005,"path":2006,"stem":2007},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2009,"path":2010,"stem":2011},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2013,"icon":2014,"path":2015,"stem":2016,"children":2017},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2018,2019,2023,2027,2031,2035,2098,2133,2285],{"title":2013,"path":2015,"stem":2016},{"title":2020,"path":2021,"stem":2022},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2024,"path":2025,"stem":2026},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2028,"path":2029,"stem":2030},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2032,"path":2033,"stem":2034},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2036,"icon":132,"path":2037,"stem":2038,"children":2039},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2040,2042,2046,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094],{"title":2041,"path":2037,"stem":2038},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2043,"path":2044,"stem":2045},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2047,"path":2048,"stem":2049},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2051,"path":2052,"stem":2053},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2055,"path":2056,"stem":2057},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2059,"path":2060,"stem":2061},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2063,"path":2064,"stem":2065},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2067,"path":2068,"stem":2069},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2071,"path":2072,"stem":2073},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2075,"path":2076,"stem":2077},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2079,"path":2080,"stem":2081},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2083,"path":2084,"stem":2085},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2087,"path":2088,"stem":2089},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2091,"path":2092,"stem":2093},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2095,"path":2096,"stem":2097},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2099,"icon":2014,"path":2100,"stem":2101,"children":2102},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2103,2105,2109,2113,2117,2121,2125,2129],{"title":2104,"path":2100,"stem":2101},"React Router: Навігаційна система сучасного вебу",{"title":2106,"path":2107,"stem":2108},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2110,"path":2111,"stem":2112},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2114,"path":2115,"stem":2116},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2118,"path":2119,"stem":2120},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2122,"path":2123,"stem":2124},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2126,"path":2127,"stem":2128},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2130,"path":2131,"stem":2132},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2134,"icon":132,"path":2135,"stem":2136,"children":2137},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2138,2140,2156,2185,2194,2215,2231,2260],{"title":2139,"path":2135,"stem":2136},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2141,"stem":2142,"children":2143,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2144,2148,2152],{"title":2145,"path":2146,"stem":2147},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2149,"path":2150,"stem":2151},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2153,"path":2154,"stem":2155},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2157,"icon":132,"path":2158,"stem":2159,"children":2160,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2161,2165,2169,2173,2177,2181],{"title":2162,"path":2163,"stem":2164},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2166,"path":2167,"stem":2168},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2170,"path":2171,"stem":2172},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2174,"path":2175,"stem":2176},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2178,"path":2179,"stem":2180},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2182,"path":2183,"stem":2184},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2186,"icon":132,"path":2187,"stem":2188,"children":2189,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2190],{"title":2191,"path":2192,"stem":2193},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2195,"icon":132,"path":2196,"stem":2197,"children":2198,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2199,2203,2207,2211],{"title":2200,"path":2201,"stem":2202},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2204,"path":2205,"stem":2206},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2208,"path":2209,"stem":2210},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2212,"path":2213,"stem":2214},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2216,"icon":92,"path":2217,"stem":2218,"children":2219,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2220,2224,2228],{"title":2221,"path":2222,"stem":2223},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2225,"path":2226,"stem":2227},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2075,"path":2229,"stem":2230},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2232,"icon":132,"path":2233,"stem":2234,"children":2235,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2236,2240,2244,2248,2252,2256],{"title":2237,"path":2238,"stem":2239},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2241,"path":2242,"stem":2243},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2245,"path":2246,"stem":2247},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2249,"path":2250,"stem":2251},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2253,"path":2254,"stem":2255},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2257,"path":2258,"stem":2259},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2261,"icon":132,"path":2262,"stem":2263,"children":2264,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2265,2269,2273,2277,2281],{"title":2266,"path":2267,"stem":2268},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2270,"path":2271,"stem":2272},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2274,"path":2275,"stem":2276},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2278,"path":2279,"stem":2280},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2282,"path":2283,"stem":2284},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2286,"icon":132,"path":2287,"stem":2288,"children":2289},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2290,2292,2296,2300,2304,2308,2312],{"title":2291,"path":2287,"stem":2288},"UI Бібліотеки в React",{"title":2293,"path":2294,"stem":2295},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2297,"path":2298,"stem":2299},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2301,"path":2302,"stem":2303},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2305,"path":2306,"stem":2307},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2309,"path":2310,"stem":2311},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2313,"path":2314,"stem":2315},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2317,"icon":2318,"path":2319,"stem":2320,"children":2321,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2322,2326,2330,2334,2338,2342,2346,2350],{"title":2323,"path":2324,"stem":2325},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2327,"path":2328,"stem":2329},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2331,"path":2332,"stem":2333},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2335,"path":2336,"stem":2337},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2339,"path":2340,"stem":2341},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2343,"path":2344,"stem":2345},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2347,"path":2348,"stem":2349},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2351,"path":2352,"stem":2353},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2355,"path":2356,"stem":2357},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2359,"icon":2360,"path":2361,"stem":2362,"children":2363,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2364,2367,2370,2374,2378,2382,2386],{"title":162,"path":2365,"stem":2366},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2368,"stem":2369},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2371,"path":2372,"stem":2373},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2375,"path":2376,"stem":2377},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2379,"path":2380,"stem":2381},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2383,"path":2384,"stem":2385},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2387,"path":2388,"stem":2389,"children":2390,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2391,2395,2399,2403,2407,2411,2415,2419,2423,2427,2431,2435,2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2495,2499,2503,2507,2511,2515,2519,2523,2527,2531,2535],{"title":2392,"path":2393,"stem":2394},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2396,"path":2397,"stem":2398},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2400,"path":2401,"stem":2402},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2404,"path":2405,"stem":2406},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2408,"path":2409,"stem":2410},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2412,"path":2413,"stem":2414},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2416,"path":2417,"stem":2418},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2420,"path":2421,"stem":2422},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2424,"path":2425,"stem":2426},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2428,"path":2429,"stem":2430},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2432,"path":2433,"stem":2434},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2436,"path":2437,"stem":2438},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2440,"path":2441,"stem":2442},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2444,"path":2445,"stem":2446},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2448,"path":2449,"stem":2450},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2452,"path":2453,"stem":2454},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2456,"path":2457,"stem":2458},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2460,"path":2461,"stem":2462},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2464,"path":2465,"stem":2466},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2468,"path":2469,"stem":2470},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2472,"path":2473,"stem":2474},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2476,"path":2477,"stem":2478},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2480,"path":2481,"stem":2482},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2484,"path":2485,"stem":2486},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2488,"path":2489,"stem":2490},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2492,"path":2493,"stem":2494},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2496,"path":2497,"stem":2498},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2500,"path":2501,"stem":2502},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2504,"path":2505,"stem":2506},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2508,"path":2509,"stem":2510},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2512,"path":2513,"stem":2514},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2516,"path":2517,"stem":2518},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2520,"path":2521,"stem":2522},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2524,"path":2525,"stem":2526},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2528,"path":2529,"stem":2530},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2532,"path":2533,"stem":2534},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2536,"path":2537,"stem":2538},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2540,"icon":2541,"path":2542,"stem":2543,"children":2544,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2545,2549,2552,2556,2560,2564,2568,2572,2576,2580,2584,2588,2592,2596,2600,2604],{"title":2546,"path":2547,"stem":2548},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2550,"stem":2551},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2553,"path":2554,"stem":2555},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2557,"path":2558,"stem":2559},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2561,"path":2562,"stem":2563},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2565,"path":2566,"stem":2567},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2569,"path":2570,"stem":2571},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2573,"path":2574,"stem":2575},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2577,"path":2578,"stem":2579},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2581,"path":2582,"stem":2583},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2585,"path":2586,"stem":2587},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2589,"path":2590,"stem":2591},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2593,"path":2594,"stem":2595},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2597,"path":2598,"stem":2599},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2601,"path":2602,"stem":2603},"📦 Повний посібник з модулів, пакетів та віртуальних середовищ у Python","\u002Fpython\u002Flesson_9","05.python\u002Flesson_9",{"title":2605,"path":2606,"stem":2607},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2609,"icon":2610,"path":2611,"stem":2612,"children":2613,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2614,2644,2667,2704,2733,2751,2785,2797,2806],{"title":2615,"icon":2616,"path":2617,"stem":2618,"children":2619,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2620,2624,2628,2632,2636,2640],{"title":2621,"path":2622,"stem":2623},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2625,"path":2626,"stem":2627},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2629,"path":2630,"stem":2631},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2633,"path":2634,"stem":2635},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2637,"path":2638,"stem":2639},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2641,"path":2642,"stem":2643},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2645,"icon":2610,"path":2646,"stem":2647,"children":2648,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2649,2653,2659,2663],{"title":2650,"path":2651,"stem":2652},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2654,"path":2655,"stem":2656,"children":2657},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2658],{"title":2654,"path":2655,"stem":2656},{"title":2660,"path":2661,"stem":2662},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2664,"path":2665,"stem":2666},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2668,"icon":2610,"path":2669,"stem":2670,"children":2671,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2672,2676,2680,2684,2688,2692,2696,2700],{"title":2673,"path":2674,"stem":2675},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2677,"path":2678,"stem":2679},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2681,"path":2682,"stem":2683},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2685,"path":2686,"stem":2687},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2689,"path":2690,"stem":2691},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2693,"path":2694,"stem":2695},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2697,"path":2698,"stem":2699},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2701,"path":2702,"stem":2703},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2705,"icon":2610,"path":2706,"stem":2707,"children":2708,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2709,2713,2717,2721,2725,2729],{"title":2710,"path":2711,"stem":2712},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2714,"path":2715,"stem":2716},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2718,"path":2719,"stem":2720},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2722,"path":2723,"stem":2724},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2726,"path":2727,"stem":2728},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2730,"path":2731,"stem":2732},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2734,"icon":2735,"path":2736,"stem":2737,"children":2738,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2739,2743,2747],{"title":2740,"path":2741,"stem":2742},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2744,"path":2745,"stem":2746},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2748,"path":2749,"stem":2750},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2752,"icon":2753,"path":2754,"stem":2755,"children":2756,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2757,2761,2765,2769,2773,2777,2781],{"title":2758,"path":2759,"stem":2760},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2762,"path":2763,"stem":2764},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2766,"path":2767,"stem":2768},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2770,"path":2771,"stem":2772},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2774,"path":2775,"stem":2776},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2778,"path":2779,"stem":2780},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2782,"path":2783,"stem":2784},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2782,"icon":793,"path":2786,"stem":2787,"children":2788,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2789,2793],{"title":2790,"path":2791,"stem":2792},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2794,"path":2795,"stem":2796},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2798,"icon":2799,"path":2800,"stem":2801,"children":2802,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2803],{"title":2798,"path":2804,"stem":2805},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2807,"icon":2808,"path":2809,"stem":2810,"children":2811,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2812],{"title":2807,"path":2813,"stem":2814},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2816,"icon":2817,"path":2818,"stem":2819,"children":2820,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2821,2897],{"title":2822,"icon":2823,"path":2824,"stem":2825,"children":2826},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2827,2829,2833,2837,2841,2845,2849,2853,2857,2861,2865,2869,2873,2877,2881,2885,2889,2893],{"title":2828,"path":2824,"stem":2825},"Docker: від нуля до production",{"title":2830,"path":2831,"stem":2832},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2834,"path":2835,"stem":2836},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2838,"path":2839,"stem":2840},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2842,"path":2843,"stem":2844},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2846,"path":2847,"stem":2848},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2850,"path":2851,"stem":2852},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2854,"path":2855,"stem":2856},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2858,"path":2859,"stem":2860},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2862,"path":2863,"stem":2864},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2866,"path":2867,"stem":2868},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2870,"path":2871,"stem":2872},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2874,"path":2875,"stem":2876},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2878,"path":2879,"stem":2880},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2882,"path":2883,"stem":2884},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2886,"path":2887,"stem":2888},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2890,"path":2891,"stem":2892},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2894,"path":2895,"stem":2896},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2898,"icon":2899,"path":2900,"stem":2901,"children":2902},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2903,2905,2909,2913,2917,2921,2925,2929,2933],{"title":2904,"path":2900,"stem":2901},"Kubernetes: від розробки до production",{"title":2906,"path":2907,"stem":2908},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2910,"path":2911,"stem":2912},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2914,"path":2915,"stem":2916},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2918,"path":2919,"stem":2920},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2922,"path":2923,"stem":2924},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2926,"path":2927,"stem":2928},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2930,"path":2931,"stem":2932},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2934,"path":2935,"stem":2936},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":2938,"icon":2939,"path":2940,"stem":2941,"children":2942,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[2943,2947,2951,2955,2959,2963,2967,2971,2975,2979,2983],{"title":2944,"path":2945,"stem":2946},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":2948,"path":2949,"stem":2950},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":2952,"path":2953,"stem":2954},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":2956,"path":2957,"stem":2958},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":2960,"path":2961,"stem":2962},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":2964,"path":2965,"stem":2966},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":2968,"path":2969,"stem":2970},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":2972,"path":2973,"stem":2974},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":2976,"path":2977,"stem":2978},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":2980,"path":2981,"stem":2982},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":2984,"path":2985,"stem":2986},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":2988,"icon":943,"path":2989,"stem":2990,"children":2991,"page":59},"DDD","\u002Fddd","10.ddd",[2992,2996,3000,3004,3008,3012,3016,3020,3024,3028,3032,3036,3040],{"title":2993,"path":2994,"stem":2995},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":2997,"path":2998,"stem":2999},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3001,"path":3002,"stem":3003},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3005,"path":3006,"stem":3007},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3009,"path":3010,"stem":3011},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3013,"path":3014,"stem":3015},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3017,"path":3018,"stem":3019},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3021,"path":3022,"stem":3023},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3025,"path":3026,"stem":3027},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3029,"path":3030,"stem":3031},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3033,"path":3034,"stem":3035},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3037,"path":3038,"stem":3039},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3041,"path":3042,"stem":3043},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3045,"icon":3046,"path":3047,"stem":3048,"children":3049,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3050,3054,3058,3062,3066,3070,3074],{"title":3051,"path":3052,"stem":3053},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3055,"path":3056,"stem":3057},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3059,"path":3060,"stem":3061},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3063,"path":3064,"stem":3065},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3067,"path":3068,"stem":3069},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3071,"path":3072,"stem":3073},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3075,"path":3076,"stem":3077},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3079,"icon":3080,"path":3081,"stem":3082,"children":3083,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3084,3088,3092,3096,3100,3104,3108,3112,3116,3120,3124,3128,3132,3136,3140,3144,3148,3152,3156,3160,3164,3168,3172,3176,3180,3184,3188,3192,3196,3200],{"title":3085,"path":3086,"stem":3087},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3089,"path":3090,"stem":3091},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3093,"path":3094,"stem":3095},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3097,"path":3098,"stem":3099},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3101,"path":3102,"stem":3103},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3105,"path":3106,"stem":3107},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3109,"path":3110,"stem":3111},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3113,"path":3114,"stem":3115},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3117,"path":3118,"stem":3119},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3121,"path":3122,"stem":3123},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3125,"path":3126,"stem":3127},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3129,"path":3130,"stem":3131},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3133,"path":3134,"stem":3135},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3137,"path":3138,"stem":3139},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3141,"path":3142,"stem":3143},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3145,"path":3146,"stem":3147},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3149,"path":3150,"stem":3151},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3153,"path":3154,"stem":3155},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3157,"path":3158,"stem":3159},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3161,"path":3162,"stem":3163},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3165,"path":3166,"stem":3167},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3169,"path":3170,"stem":3171},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3173,"path":3174,"stem":3175},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3177,"path":3178,"stem":3179},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3181,"path":3182,"stem":3183},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3185,"path":3186,"stem":3187},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3189,"path":3190,"stem":3191},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3193,"path":3194,"stem":3195},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3197,"path":3198,"stem":3199},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3201,"path":3202,"stem":3203},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3205,"path":3206,"stem":3207,"children":3208,"page":59},"AWS","\u002Faws","13.aws",[3209,3213,3217,3221,3225,3229,3233,3237,3241,3245,3249,3253,3257,3261,3265,3269,3273,3277],{"title":3210,"path":3211,"stem":3212},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3214,"path":3215,"stem":3216},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3218,"path":3219,"stem":3220},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3222,"path":3223,"stem":3224},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3226,"path":3227,"stem":3228},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3230,"path":3231,"stem":3232},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3234,"path":3235,"stem":3236},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3238,"path":3239,"stem":3240},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3242,"path":3243,"stem":3244},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3246,"path":3247,"stem":3248},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3250,"path":3251,"stem":3252},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3254,"path":3255,"stem":3256},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3258,"path":3259,"stem":3260},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3262,"path":3263,"stem":3264},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3266,"path":3267,"stem":3268},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3270,"path":3271,"stem":3272},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3274,"path":3275,"stem":3276},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3278,"path":3279,"stem":3280},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3282,"path":3283,"stem":3284,"children":3285,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3330],{"title":3287,"path":3288,"stem":3289},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3291,"path":3292,"stem":3293},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3295,"path":3296,"stem":3297},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3299,"path":3300,"stem":3301},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3303,"path":3304,"stem":3305},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3307,"path":3308,"stem":3309},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3311,"path":3312,"stem":3313},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3315,"path":3316,"stem":3317},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3319,"path":3320,"stem":3321},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":3323,"path":3324,"stem":3325},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":3327,"path":3328,"stem":3329},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":3331,"path":3332,"stem":3333},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":3335,"path":3336,"stem":3337},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3339,"title":3319,"body":3340,"description":22730,"extension":22731,"links":22732,"meta":22733,"navigation":3494,"path":3320,"seo":22734,"stem":3321,"__hash__":22735},"docs\u002F21.tailwind\u002F09.tailwind-dark-mode-theming.md",{"type":3341,"value":3342,"toc":22683},"minimark",[3343,3347,3352,3361,3384,3387,3395,3398,3402,3407,3414,3421,3424,3532,3549,3553,3558,3565,3650,4710,4727,4729,4733,4736,4742,4810,4816,4869,4876,5003,5010,5039,5050,5052,5056,5059,5148,5155,5157,5164,5171,5176,5185,5247,5250,5270,5273,5280,5286,5421,6162,6170,6172,6179,6188,6194,6230,6237,6283,6286,6368,6373,6473,6489,6491,6497,6500,7145,7157,7159,7163,7167,7170,7232,7241,7258,7271,7274,7276,7282,7288,8070,8089,8091,8095,8105,9091,9107,9109,9113,9116,9122,9155,9161,9193,9207,9214,9217,9257,9260,9299,10445,10451,10453,10459,10471,10571,10590,10601,10610,10612,10616,10620,10623,10676,10709,10712,10714,10720,10725,10728,11636,11639,11720,11722,11726,11732,11755,11758,11765,11782,12113,12126,12140,12142,12146,12149,13621,13623,13627,13630,13636,13803,13814,13816,13820,13824,13831,13834,13862,13865,13867,13875,13880,14366,14372,14528,14541,14543,14547,14550,14744,14758,14761,16576,16589,16591,16595,16599,16602,18651,18653,18657,18660,21676,21678,21682,21685,21818,21820,21824,22477,22479,22483,22625,22628,22662,22664,22680],[3344,3345,3319],"h1",{"id":3346},"темна-тема-та-система-дизайн-токенів-у-tailwind-v4",[3348,3349,3351],"h2",{"id":3350},"вступ-чому-темна-тема-це-не-просто-інвертувати-кольори","Вступ: чому темна тема — це не просто «інвертувати кольори»",[3353,3354,3355,3356,3360],"p",{},"Темна тема стала стандартною вимогою сучасного веб-інтерфейсу. Однак більшість розробників підходять до її реалізації надто спрощено: додають клас ",[3357,3358,3359],"code",{},"dark:"," до кожного кольорового класу і вважають роботу завершеною. Такий підхід, хоча й функціональний у малих масштабах, породжує низку серйозних архітектурних проблем у міру зростання проєкту.",[3353,3362,3363,3364,3368,3369,3372,3373,3376,3377,3380,3381,3383],{},"Справжня темна тема — це ",[3365,3366,3367],"strong",{},"система дизайн-токенів",", де кожне кольорове рішення описане семантично, а не конкретним відтінком. Замість того, щоб думати «цей текст ",[3357,3370,3371],{},"slate-900"," на світлому, а ",[3357,3374,3375],{},"slate-100"," на темному» — ви думаєте «це ",[3357,3378,3379],{},"--color-text-primary",", і він автоматично адаптується до активної теми». Один клас у HTML. Нуль ",[3357,3382,3359],{},"-дублікатів.",[3353,3385,3386],{},"У цій статті ми збудуємо повноцінну систему тем із нуля, пояснюючи кожне рішення з точки зору архітектури та практичного застосування.",[3388,3389,3390,3391,3394],"note",{},"Ця стаття передбачає знайомство з матеріалом попередніх статей, зокрема з директивою ",[3357,3392,3393],{},"@theme"," (стаття 05) та варіантами (стаття 06). Якщо ви ще не читали їх — рекомендуємо зробити це перед тим, як продовжувати.",[3396,3397],"hr",{},[3348,3399,3401],{"id":3400},"частина-і-теоретична-основа","Частина І. Теоретична основа",[3403,3404,3406],"h3",{"id":3405},"_11-css-custom-properties-як-рушій-динамічних-тем","1.1. CSS Custom Properties як рушій динамічних тем",[3353,3408,3409,3410,3413],{},"Перш ніж говорити про Tailwind, необхідно розібратися з механізмом, на якому побудована будь-яка сучасна система тем — ",[3365,3411,3412],{},"CSS Custom Properties"," (або CSS-змінні).",[3353,3415,3416,3417,3420],{},"CSS Custom Properties — це змінні, оголошені у CSS та доступні по всьому дереву DOM. На відміну від препроцесорних змінних (Sass, Less), які розгортаються під час компіляції і є статичними, CSS Custom Properties ",[3365,3418,3419],{},"живуть у браузері"," та можуть змінюватися під час виконання.",[3353,3422,3423],{},"Базовий синтаксис:",[3425,3426,3431],"pre",{"className":3427,"code":3428,"language":3429,"meta":3430,"style":3430},"language-css shiki shiki-themes light-plus dark-plus dark-plus","\u002F* Оголошення — завжди починається з двох дефісів *\u002F\n:root {\n    --color-text: oklch(0.15 0.02 270);\n}\n\n\u002F* Використання — через функцію var() *\u002F\np {\n    color: var(--color-text);\n}\n","css","",[3357,3432,3433,3442,3453,3483,3489,3496,3502,3509,3527],{"__ignoreMap":3430},[3434,3435,3438],"span",{"class":3436,"line":3437},"line",1,[3434,3439,3441],{"class":3440},"spJ8K","\u002F* Оголошення — завжди починається з двох дефісів *\u002F\n",[3434,3443,3445,3449],{"class":3436,"line":3444},2,[3434,3446,3448],{"class":3447},"sqdDX",":root",[3434,3450,3452],{"class":3451},"sHH4Y"," {\n",[3434,3454,3456,3460,3463,3467,3470,3474,3477,3480],{"class":3436,"line":3455},3,[3434,3457,3459],{"class":3458},"sa4r_","    --color-text",[3434,3461,3462],{"class":3451},": ",[3434,3464,3466],{"class":3465},"s8Opu","oklch",[3434,3468,3469],{"class":3451},"(",[3434,3471,3473],{"class":3472},"sJj4R","0.15",[3434,3475,3476],{"class":3472}," 0.02",[3434,3478,3479],{"class":3472}," 270",[3434,3481,3482],{"class":3451},");\n",[3434,3484,3486],{"class":3436,"line":3485},4,[3434,3487,3488],{"class":3451},"}\n",[3434,3490,3492],{"class":3436,"line":3491},5,[3434,3493,3495],{"emptyLinePlaceholder":3494},true,"\n",[3434,3497,3499],{"class":3436,"line":3498},6,[3434,3500,3501],{"class":3440},"\u002F* Використання — через функцію var() *\u002F\n",[3434,3503,3505,3507],{"class":3436,"line":3504},7,[3434,3506,3353],{"class":3447},[3434,3508,3452],{"class":3451},[3434,3510,3512,3515,3517,3520,3522,3525],{"class":3436,"line":3511},8,[3434,3513,3514],{"class":3458},"    color",[3434,3516,3462],{"class":3451},[3434,3518,3519],{"class":3465},"var",[3434,3521,3469],{"class":3451},[3434,3523,3524],{"class":3458},"--color-text",[3434,3526,3482],{"class":3451},[3434,3528,3530],{"class":3436,"line":3529},9,[3434,3531,3488],{"class":3451},[3353,3533,3534,3535,3537,3538,3540,3541,3544,3545,3548],{},"Коли ви змінюєте значення ",[3357,3536,3524],{}," (наприклад, перемикаєте клас на ",[3357,3539,3448],{},"), ",[3365,3542,3543],{},"всі"," елементи, що використовують ",[3357,3546,3547],{},"var(--color-text)",", миттєво оновлюються — без перезавантаження сторінки і без JavaScript-маніпуляцій зі стилями кожного елемента окремо.",[3550,3551,3552],"tip",{},"Саме ця властивість CSS Custom Properties робить їх ідеальним інструментом для тематизації: ви змінюєте одну точку — і вся система реагує автоматично.",[3554,3555,3557],"h4",{"id":3556},"успадкування-та-каскад","Успадкування та каскад",[3353,3559,3560,3561,3564],{},"CSS Custom Properties підпорядковуються ",[3365,3562,3563],{},"каскаду та успадкуванню"," CSS так само, як і звичайні властивості. Це означає:",[3425,3566,3568],{"className":3427,"code":3567,"language":3429,"meta":3430,"style":3430},":root {\n    --color-accent: oklch(0.585 0.233 277); \u002F* індиго *\u002F\n}\n\n.card-promo {\n    \u002F* Локальне перевизначення — впливає тільки на нащадків .card-promo *\u002F\n    --color-accent: oklch(0.72 0.19 50); \u002F* помаранчевий *\u002F\n}\n",[3357,3569,3570,3576,3602,3606,3610,3617,3622,3646],{"__ignoreMap":3430},[3434,3571,3572,3574],{"class":3436,"line":3437},[3434,3573,3448],{"class":3447},[3434,3575,3452],{"class":3451},[3434,3577,3578,3581,3583,3585,3587,3590,3593,3596,3599],{"class":3436,"line":3444},[3434,3579,3580],{"class":3458},"    --color-accent",[3434,3582,3462],{"class":3451},[3434,3584,3466],{"class":3465},[3434,3586,3469],{"class":3451},[3434,3588,3589],{"class":3472},"0.585",[3434,3591,3592],{"class":3472}," 0.233",[3434,3594,3595],{"class":3472}," 277",[3434,3597,3598],{"class":3451},"); ",[3434,3600,3601],{"class":3440},"\u002F* індиго *\u002F\n",[3434,3603,3604],{"class":3436,"line":3455},[3434,3605,3488],{"class":3451},[3434,3607,3608],{"class":3436,"line":3485},[3434,3609,3495],{"emptyLinePlaceholder":3494},[3434,3611,3612,3615],{"class":3436,"line":3491},[3434,3613,3614],{"class":3447},".card-promo",[3434,3616,3452],{"class":3451},[3434,3618,3619],{"class":3436,"line":3498},[3434,3620,3621],{"class":3440},"    \u002F* Локальне перевизначення — впливає тільки на нащадків .card-promo *\u002F\n",[3434,3623,3624,3626,3628,3630,3632,3635,3638,3641,3643],{"class":3436,"line":3504},[3434,3625,3580],{"class":3458},[3434,3627,3462],{"class":3451},[3434,3629,3466],{"class":3465},[3434,3631,3469],{"class":3451},[3434,3633,3634],{"class":3472},"0.72",[3434,3636,3637],{"class":3472}," 0.19",[3434,3639,3640],{"class":3472}," 50",[3434,3642,3598],{"class":3451},[3434,3644,3645],{"class":3440},"\u002F* помаранчевий *\u002F\n",[3434,3647,3648],{"class":3436,"line":3511},[3434,3649,3488],{"class":3451},[3651,3652,3654],"html-preview",{":tailwind":3653},"true",[3425,3655,3659],{"className":3656,"code":3657,"language":3658,"meta":3430,"style":3430},"language-html shiki shiki-themes light-plus dark-plus dark-plus","\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n\u003Cmeta charset=\"UTF-8\">\n\u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\">\u003C\u002Fscript>\n\u003Clink href=\"https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\u003Cstyle>\n    :root {\n        --color-accent: oklch(0.585 0.233 277); \u002F* Indigo *\u002F\n    }\n\n    .card-promo {\n        \u002F* Local variable override *\u002F\n        --color-accent: oklch(0.72 0.19 50); \u002F* Orange *\u002F\n    }\n\n    \u002F* Apply colors dynamically using custom properties *\u002F\n    .dynamic-bg {\n        background-color: var(--color-accent);\n    }\n    .dynamic-text {\n        color: var(--color-accent);\n    }\n    .dynamic-border {\n        border-color: var(--color-accent);\n    }\n\u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"p-6 bg-slate-50\" style=\"font-family: 'Inter', system-ui, sans-serif;\">\n    \u003Cdiv class=\"max-w-2xl mx-auto space-y-6\">\n        \u003Cp class=\"text-xs font-bold text-slate-400 uppercase tracking-widest text-center\">CSS Variables Cascade & Inheritance\u003C\u002Fp>\n        \n        \u003Cdiv class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n            \u003C!-- Card 1: Default (Inherited Root Variables) -->\n            \u003Cdiv class=\"bg-white rounded-2xl border border-slate-200 p-5 shadow-sm space-y-4 relative overflow-hidden\">\n                \u003Cdiv class=\"absolute top-3 right-3 text-[10px] font-bold text-slate-400 bg-slate-100 px-2 py-0.5 rounded\">\n                    Default Card\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"flex items-center gap-3\">\n                    \u003Cdiv class=\"w-10 h-10 rounded-xl dynamic-bg flex items-center justify-center text-white font-bold text-sm\">\n                        ★\n                    \u003C\u002Fdiv>\n                    \u003Cdiv>\n                        \u003Ch4 class=\"text-sm font-bold text-slate-900\">Стандартний тариф\u003C\u002Fh4>\n                        \u003Cp class=\"text-xs text-slate-500\">Використовує акцент з :root\u003C\u002Fp>\n                    \u003C\u002Fdiv>\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"border-t border-slate-100 pt-3\">\n                    \u003Cp class=\"text-xs text-slate-600 leading-normal\">\n                        Ця картка успадковує акцентний колір \u003Cspan class=\"font-bold dynamic-text\">Indigo\u003C\u002Fspan> безпосередньо з кореневого елемента сторінки.\n                    \u003C\u002Fp>\n                \u003C\u002Fdiv>\n                \u003Cbutton class=\"dynamic-bg hover:opacity-90 active:scale-95 text-white font-semibold text-xs py-2 w-full rounded-xl transition-all\">\n                    Вибрати тариф\n                \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n\n            \u003C!-- Card 2: Promo (Overridden Local Variable) -->\n            \u003Cdiv class=\"card-promo bg-white rounded-2xl border-2 dynamic-border p-5 shadow-sm space-y-4 relative overflow-hidden\">\n                \u003Cdiv class=\"absolute top-3 right-3 text-[10px] font-bold text-white dynamic-bg px-2 py-0.5 rounded\">\n                    Promo Card\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"flex items-center gap-3\">\n                    \u003Cdiv class=\"w-10 h-10 rounded-xl dynamic-bg flex items-center justify-center text-white font-bold text-sm\">\n                        🔥\n                    \u003C\u002Fdiv>\n                    \u003Cdiv>\n                        \u003Ch4 class=\"text-sm font-bold text-slate-900\">Промо пропозиція\u003C\u002Fh4>\n                        \u003Cp class=\"text-xs text-slate-500\">Локальне перевизначення\u003C\u002Fp>\n                    \u003C\u002Fdiv>\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"border-t border-slate-100 pt-3\">\n                    \u003Cp class=\"text-xs text-slate-600 leading-normal\">\n                        Ця картка перевизначає акцентний колір на \u003Cspan class=\"font-bold dynamic-text\">Orange\u003C\u002Fspan>. Жоден HTML клас нащадків не мінявся!\n                    \u003C\u002Fp>\n                \u003C\u002Fdiv>\n                \u003Cbutton class=\"dynamic-bg hover:opacity-90 active:scale-95 text-white font-semibold text-xs py-2 w-full rounded-xl transition-all\">\n                    Активувати промо\n                \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[3357,3660,3661,3677,3696,3705,3722,3745,3770,3779,3786,3808,3814,3819,3827,3833,3855,3860,3865,3871,3879,3896,3901,3909,3925,3930,3938,3954,3959,3969,3978,4004,4022,4049,4055,4071,4077,4094,4111,4117,4127,4143,4160,4166,4176,4185,4211,4236,4245,4254,4270,4286,4317,4326,4335,4352,4358,4367,4377,4382,4388,4404,4420,4426,4435,4450,4465,4471,4480,4489,4513,4537,4546,4555,4570,4585,4615,4624,4633,4648,4654,4663,4672,4682,4692,4701],{"__ignoreMap":3430},[3434,3662,3663,3667,3671,3674],{"class":3436,"line":3437},[3434,3664,3666],{"class":3665},"s0P7L","\u003C!",[3434,3668,3670],{"class":3669},"sKtos","DOCTYPE",[3434,3672,3673],{"class":3458}," html",[3434,3675,3676],{"class":3665},">\n",[3434,3678,3679,3682,3684,3687,3690,3694],{"class":3436,"line":3444},[3434,3680,3681],{"class":3665},"\u003C",[3434,3683,3658],{"class":3669},[3434,3685,3686],{"class":3458}," lang",[3434,3688,3689],{"class":3451},"=",[3434,3691,3693],{"class":3692},"su9tN","\"uk\"",[3434,3695,3676],{"class":3665},[3434,3697,3698,3700,3703],{"class":3436,"line":3455},[3434,3699,3681],{"class":3665},[3434,3701,3702],{"class":3669},"head",[3434,3704,3676],{"class":3665},[3434,3706,3707,3709,3712,3715,3717,3720],{"class":3436,"line":3485},[3434,3708,3681],{"class":3665},[3434,3710,3711],{"class":3669},"meta",[3434,3713,3714],{"class":3458}," charset",[3434,3716,3689],{"class":3451},[3434,3718,3719],{"class":3692},"\"UTF-8\"",[3434,3721,3676],{"class":3665},[3434,3723,3724,3726,3729,3732,3735,3738,3741,3743],{"class":3436,"line":3491},[3434,3725,3681],{"class":3665},[3434,3727,3728],{"class":3669},"script",[3434,3730,3731],{"class":3458}," src",[3434,3733,3689],{"class":3734},"sD7JJ",[3434,3736,3737],{"class":3692},"\"https:\u002F\u002Fcdn.tailwindcss.com\"",[3434,3739,3740],{"class":3665},">\u003C\u002F",[3434,3742,3728],{"class":3669},[3434,3744,3676],{"class":3665},[3434,3746,3747,3749,3752,3755,3757,3760,3763,3765,3768],{"class":3436,"line":3498},[3434,3748,3681],{"class":3665},[3434,3750,3751],{"class":3669},"link",[3434,3753,3754],{"class":3458}," href",[3434,3756,3689],{"class":3451},[3434,3758,3759],{"class":3692},"\"https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&display=swap\"",[3434,3761,3762],{"class":3458}," rel",[3434,3764,3689],{"class":3451},[3434,3766,3767],{"class":3692},"\"stylesheet\"",[3434,3769,3676],{"class":3665},[3434,3771,3772,3774,3777],{"class":3436,"line":3504},[3434,3773,3681],{"class":3665},[3434,3775,3776],{"class":3669},"style",[3434,3778,3676],{"class":3665},[3434,3780,3781,3784],{"class":3436,"line":3511},[3434,3782,3783],{"class":3447},"    :root",[3434,3785,3452],{"class":3734},[3434,3787,3788,3791,3793,3795,3797,3799,3801,3803,3805],{"class":3436,"line":3529},[3434,3789,3790],{"class":3458},"        --color-accent",[3434,3792,3462],{"class":3734},[3434,3794,3466],{"class":3465},[3434,3796,3469],{"class":3734},[3434,3798,3589],{"class":3472},[3434,3800,3592],{"class":3472},[3434,3802,3595],{"class":3472},[3434,3804,3598],{"class":3734},[3434,3806,3807],{"class":3440},"\u002F* Indigo *\u002F\n",[3434,3809,3811],{"class":3436,"line":3810},10,[3434,3812,3813],{"class":3734},"    }\n",[3434,3815,3817],{"class":3436,"line":3816},11,[3434,3818,3495],{"emptyLinePlaceholder":3494},[3434,3820,3822,3825],{"class":3436,"line":3821},12,[3434,3823,3824],{"class":3447},"    .card-promo",[3434,3826,3452],{"class":3734},[3434,3828,3830],{"class":3436,"line":3829},13,[3434,3831,3832],{"class":3440},"        \u002F* Local variable override *\u002F\n",[3434,3834,3836,3838,3840,3842,3844,3846,3848,3850,3852],{"class":3436,"line":3835},14,[3434,3837,3790],{"class":3458},[3434,3839,3462],{"class":3734},[3434,3841,3466],{"class":3465},[3434,3843,3469],{"class":3734},[3434,3845,3634],{"class":3472},[3434,3847,3637],{"class":3472},[3434,3849,3640],{"class":3472},[3434,3851,3598],{"class":3734},[3434,3853,3854],{"class":3440},"\u002F* Orange *\u002F\n",[3434,3856,3858],{"class":3436,"line":3857},15,[3434,3859,3813],{"class":3734},[3434,3861,3863],{"class":3436,"line":3862},16,[3434,3864,3495],{"emptyLinePlaceholder":3494},[3434,3866,3868],{"class":3436,"line":3867},17,[3434,3869,3870],{"class":3440},"    \u002F* Apply colors dynamically using custom properties *\u002F\n",[3434,3872,3874,3877],{"class":3436,"line":3873},18,[3434,3875,3876],{"class":3447},"    .dynamic-bg",[3434,3878,3452],{"class":3734},[3434,3880,3882,3885,3887,3889,3891,3894],{"class":3436,"line":3881},19,[3434,3883,3884],{"class":3458},"        background-color",[3434,3886,3462],{"class":3734},[3434,3888,3519],{"class":3465},[3434,3890,3469],{"class":3734},[3434,3892,3893],{"class":3458},"--color-accent",[3434,3895,3482],{"class":3734},[3434,3897,3899],{"class":3436,"line":3898},20,[3434,3900,3813],{"class":3734},[3434,3902,3904,3907],{"class":3436,"line":3903},21,[3434,3905,3906],{"class":3447},"    .dynamic-text",[3434,3908,3452],{"class":3734},[3434,3910,3912,3915,3917,3919,3921,3923],{"class":3436,"line":3911},22,[3434,3913,3914],{"class":3458},"        color",[3434,3916,3462],{"class":3734},[3434,3918,3519],{"class":3465},[3434,3920,3469],{"class":3734},[3434,3922,3893],{"class":3458},[3434,3924,3482],{"class":3734},[3434,3926,3928],{"class":3436,"line":3927},23,[3434,3929,3813],{"class":3734},[3434,3931,3933,3936],{"class":3436,"line":3932},24,[3434,3934,3935],{"class":3447},"    .dynamic-border",[3434,3937,3452],{"class":3734},[3434,3939,3941,3944,3946,3948,3950,3952],{"class":3436,"line":3940},25,[3434,3942,3943],{"class":3458},"        border-color",[3434,3945,3462],{"class":3734},[3434,3947,3519],{"class":3465},[3434,3949,3469],{"class":3734},[3434,3951,3893],{"class":3458},[3434,3953,3482],{"class":3734},[3434,3955,3957],{"class":3436,"line":3956},26,[3434,3958,3813],{"class":3734},[3434,3960,3962,3965,3967],{"class":3436,"line":3961},27,[3434,3963,3964],{"class":3665},"\u003C\u002F",[3434,3966,3776],{"class":3669},[3434,3968,3676],{"class":3665},[3434,3970,3972,3974,3976],{"class":3436,"line":3971},28,[3434,3973,3964],{"class":3665},[3434,3975,3702],{"class":3669},[3434,3977,3676],{"class":3665},[3434,3979,3981,3983,3986,3989,3991,3994,3997,3999,4002],{"class":3436,"line":3980},29,[3434,3982,3681],{"class":3665},[3434,3984,3985],{"class":3669},"body",[3434,3987,3988],{"class":3458}," class",[3434,3990,3689],{"class":3451},[3434,3992,3993],{"class":3692},"\"p-6 bg-slate-50\"",[3434,3995,3996],{"class":3458}," style",[3434,3998,3689],{"class":3451},[3434,4000,4001],{"class":3692},"\"font-family: 'Inter', system-ui, sans-serif;\"",[3434,4003,3676],{"class":3665},[3434,4005,4007,4010,4013,4015,4017,4020],{"class":3436,"line":4006},30,[3434,4008,4009],{"class":3665},"    \u003C",[3434,4011,4012],{"class":3669},"div",[3434,4014,3988],{"class":3458},[3434,4016,3689],{"class":3451},[3434,4018,4019],{"class":3692},"\"max-w-2xl mx-auto space-y-6\"",[3434,4021,3676],{"class":3665},[3434,4023,4025,4028,4030,4032,4034,4037,4040,4043,4045,4047],{"class":3436,"line":4024},31,[3434,4026,4027],{"class":3665},"        \u003C",[3434,4029,3353],{"class":3669},[3434,4031,3988],{"class":3458},[3434,4033,3689],{"class":3451},[3434,4035,4036],{"class":3692},"\"text-xs font-bold text-slate-400 uppercase tracking-widest text-center\"",[3434,4038,4039],{"class":3665},">",[3434,4041,4042],{"class":3451},"CSS Variables Cascade & Inheritance",[3434,4044,3964],{"class":3665},[3434,4046,3353],{"class":3669},[3434,4048,3676],{"class":3665},[3434,4050,4052],{"class":3436,"line":4051},32,[3434,4053,4054],{"class":3451},"        \n",[3434,4056,4058,4060,4062,4064,4066,4069],{"class":3436,"line":4057},33,[3434,4059,4027],{"class":3665},[3434,4061,4012],{"class":3669},[3434,4063,3988],{"class":3458},[3434,4065,3689],{"class":3451},[3434,4067,4068],{"class":3692},"\"grid grid-cols-1 md:grid-cols-2 gap-6\"",[3434,4070,3676],{"class":3665},[3434,4072,4074],{"class":3436,"line":4073},34,[3434,4075,4076],{"class":3440},"            \u003C!-- Card 1: Default (Inherited Root Variables) -->\n",[3434,4078,4080,4083,4085,4087,4089,4092],{"class":3436,"line":4079},35,[3434,4081,4082],{"class":3665},"            \u003C",[3434,4084,4012],{"class":3669},[3434,4086,3988],{"class":3458},[3434,4088,3689],{"class":3451},[3434,4090,4091],{"class":3692},"\"bg-white rounded-2xl border border-slate-200 p-5 shadow-sm space-y-4 relative overflow-hidden\"",[3434,4093,3676],{"class":3665},[3434,4095,4097,4100,4102,4104,4106,4109],{"class":3436,"line":4096},36,[3434,4098,4099],{"class":3665},"                \u003C",[3434,4101,4012],{"class":3669},[3434,4103,3988],{"class":3458},[3434,4105,3689],{"class":3451},[3434,4107,4108],{"class":3692},"\"absolute top-3 right-3 text-[10px] font-bold text-slate-400 bg-slate-100 px-2 py-0.5 rounded\"",[3434,4110,3676],{"class":3665},[3434,4112,4114],{"class":3436,"line":4113},37,[3434,4115,4116],{"class":3451},"                    Default Card\n",[3434,4118,4120,4123,4125],{"class":3436,"line":4119},38,[3434,4121,4122],{"class":3665},"                \u003C\u002F",[3434,4124,4012],{"class":3669},[3434,4126,3676],{"class":3665},[3434,4128,4130,4132,4134,4136,4138,4141],{"class":3436,"line":4129},39,[3434,4131,4099],{"class":3665},[3434,4133,4012],{"class":3669},[3434,4135,3988],{"class":3458},[3434,4137,3689],{"class":3451},[3434,4139,4140],{"class":3692},"\"flex items-center gap-3\"",[3434,4142,3676],{"class":3665},[3434,4144,4146,4149,4151,4153,4155,4158],{"class":3436,"line":4145},40,[3434,4147,4148],{"class":3665},"                    \u003C",[3434,4150,4012],{"class":3669},[3434,4152,3988],{"class":3458},[3434,4154,3689],{"class":3451},[3434,4156,4157],{"class":3692},"\"w-10 h-10 rounded-xl dynamic-bg flex items-center justify-center text-white font-bold text-sm\"",[3434,4159,3676],{"class":3665},[3434,4161,4163],{"class":3436,"line":4162},41,[3434,4164,4165],{"class":3451},"                        ★\n",[3434,4167,4169,4172,4174],{"class":3436,"line":4168},42,[3434,4170,4171],{"class":3665},"                    \u003C\u002F",[3434,4173,4012],{"class":3669},[3434,4175,3676],{"class":3665},[3434,4177,4179,4181,4183],{"class":3436,"line":4178},43,[3434,4180,4148],{"class":3665},[3434,4182,4012],{"class":3669},[3434,4184,3676],{"class":3665},[3434,4186,4188,4191,4193,4195,4197,4200,4202,4205,4207,4209],{"class":3436,"line":4187},44,[3434,4189,4190],{"class":3665},"                        \u003C",[3434,4192,3554],{"class":3669},[3434,4194,3988],{"class":3458},[3434,4196,3689],{"class":3451},[3434,4198,4199],{"class":3692},"\"text-sm font-bold text-slate-900\"",[3434,4201,4039],{"class":3665},[3434,4203,4204],{"class":3451},"Стандартний тариф",[3434,4206,3964],{"class":3665},[3434,4208,3554],{"class":3669},[3434,4210,3676],{"class":3665},[3434,4212,4214,4216,4218,4220,4222,4225,4227,4230,4232,4234],{"class":3436,"line":4213},45,[3434,4215,4190],{"class":3665},[3434,4217,3353],{"class":3669},[3434,4219,3988],{"class":3458},[3434,4221,3689],{"class":3451},[3434,4223,4224],{"class":3692},"\"text-xs text-slate-500\"",[3434,4226,4039],{"class":3665},[3434,4228,4229],{"class":3451},"Використовує акцент з :root",[3434,4231,3964],{"class":3665},[3434,4233,3353],{"class":3669},[3434,4235,3676],{"class":3665},[3434,4237,4239,4241,4243],{"class":3436,"line":4238},46,[3434,4240,4171],{"class":3665},[3434,4242,4012],{"class":3669},[3434,4244,3676],{"class":3665},[3434,4246,4248,4250,4252],{"class":3436,"line":4247},47,[3434,4249,4122],{"class":3665},[3434,4251,4012],{"class":3669},[3434,4253,3676],{"class":3665},[3434,4255,4257,4259,4261,4263,4265,4268],{"class":3436,"line":4256},48,[3434,4258,4099],{"class":3665},[3434,4260,4012],{"class":3669},[3434,4262,3988],{"class":3458},[3434,4264,3689],{"class":3451},[3434,4266,4267],{"class":3692},"\"border-t border-slate-100 pt-3\"",[3434,4269,3676],{"class":3665},[3434,4271,4273,4275,4277,4279,4281,4284],{"class":3436,"line":4272},49,[3434,4274,4148],{"class":3665},[3434,4276,3353],{"class":3669},[3434,4278,3988],{"class":3458},[3434,4280,3689],{"class":3451},[3434,4282,4283],{"class":3692},"\"text-xs text-slate-600 leading-normal\"",[3434,4285,3676],{"class":3665},[3434,4287,4289,4292,4294,4296,4298,4300,4303,4305,4308,4310,4312,4314],{"class":3436,"line":4288},50,[3434,4290,4291],{"class":3451},"                        Ця картка успадковує акцентний колір ",[3434,4293,3681],{"class":3665},[3434,4295,3434],{"class":3669},[3434,4297,3988],{"class":3458},[3434,4299,3689],{"class":3451},[3434,4301,4302],{"class":3692},"\"font-bold dynamic-text\"",[3434,4304,4039],{"class":3665},[3434,4306,4307],{"class":3451},"Indigo",[3434,4309,3964],{"class":3665},[3434,4311,3434],{"class":3669},[3434,4313,4039],{"class":3665},[3434,4315,4316],{"class":3451}," безпосередньо з кореневого елемента сторінки.\n",[3434,4318,4320,4322,4324],{"class":3436,"line":4319},51,[3434,4321,4171],{"class":3665},[3434,4323,3353],{"class":3669},[3434,4325,3676],{"class":3665},[3434,4327,4329,4331,4333],{"class":3436,"line":4328},52,[3434,4330,4122],{"class":3665},[3434,4332,4012],{"class":3669},[3434,4334,3676],{"class":3665},[3434,4336,4338,4340,4343,4345,4347,4350],{"class":3436,"line":4337},53,[3434,4339,4099],{"class":3665},[3434,4341,4342],{"class":3669},"button",[3434,4344,3988],{"class":3458},[3434,4346,3689],{"class":3451},[3434,4348,4349],{"class":3692},"\"dynamic-bg hover:opacity-90 active:scale-95 text-white font-semibold text-xs py-2 w-full rounded-xl transition-all\"",[3434,4351,3676],{"class":3665},[3434,4353,4355],{"class":3436,"line":4354},54,[3434,4356,4357],{"class":3451},"                    Вибрати тариф\n",[3434,4359,4361,4363,4365],{"class":3436,"line":4360},55,[3434,4362,4122],{"class":3665},[3434,4364,4342],{"class":3669},[3434,4366,3676],{"class":3665},[3434,4368,4370,4373,4375],{"class":3436,"line":4369},56,[3434,4371,4372],{"class":3665},"            \u003C\u002F",[3434,4374,4012],{"class":3669},[3434,4376,3676],{"class":3665},[3434,4378,4380],{"class":3436,"line":4379},57,[3434,4381,3495],{"emptyLinePlaceholder":3494},[3434,4383,4385],{"class":3436,"line":4384},58,[3434,4386,4387],{"class":3440},"            \u003C!-- Card 2: Promo (Overridden Local Variable) -->\n",[3434,4389,4391,4393,4395,4397,4399,4402],{"class":3436,"line":4390},59,[3434,4392,4082],{"class":3665},[3434,4394,4012],{"class":3669},[3434,4396,3988],{"class":3458},[3434,4398,3689],{"class":3451},[3434,4400,4401],{"class":3692},"\"card-promo bg-white rounded-2xl border-2 dynamic-border p-5 shadow-sm space-y-4 relative overflow-hidden\"",[3434,4403,3676],{"class":3665},[3434,4405,4407,4409,4411,4413,4415,4418],{"class":3436,"line":4406},60,[3434,4408,4099],{"class":3665},[3434,4410,4012],{"class":3669},[3434,4412,3988],{"class":3458},[3434,4414,3689],{"class":3451},[3434,4416,4417],{"class":3692},"\"absolute top-3 right-3 text-[10px] font-bold text-white dynamic-bg px-2 py-0.5 rounded\"",[3434,4419,3676],{"class":3665},[3434,4421,4423],{"class":3436,"line":4422},61,[3434,4424,4425],{"class":3451},"                    Promo Card\n",[3434,4427,4429,4431,4433],{"class":3436,"line":4428},62,[3434,4430,4122],{"class":3665},[3434,4432,4012],{"class":3669},[3434,4434,3676],{"class":3665},[3434,4436,4438,4440,4442,4444,4446,4448],{"class":3436,"line":4437},63,[3434,4439,4099],{"class":3665},[3434,4441,4012],{"class":3669},[3434,4443,3988],{"class":3458},[3434,4445,3689],{"class":3451},[3434,4447,4140],{"class":3692},[3434,4449,3676],{"class":3665},[3434,4451,4453,4455,4457,4459,4461,4463],{"class":3436,"line":4452},64,[3434,4454,4148],{"class":3665},[3434,4456,4012],{"class":3669},[3434,4458,3988],{"class":3458},[3434,4460,3689],{"class":3451},[3434,4462,4157],{"class":3692},[3434,4464,3676],{"class":3665},[3434,4466,4468],{"class":3436,"line":4467},65,[3434,4469,4470],{"class":3451},"                        🔥\n",[3434,4472,4474,4476,4478],{"class":3436,"line":4473},66,[3434,4475,4171],{"class":3665},[3434,4477,4012],{"class":3669},[3434,4479,3676],{"class":3665},[3434,4481,4483,4485,4487],{"class":3436,"line":4482},67,[3434,4484,4148],{"class":3665},[3434,4486,4012],{"class":3669},[3434,4488,3676],{"class":3665},[3434,4490,4492,4494,4496,4498,4500,4502,4504,4507,4509,4511],{"class":3436,"line":4491},68,[3434,4493,4190],{"class":3665},[3434,4495,3554],{"class":3669},[3434,4497,3988],{"class":3458},[3434,4499,3689],{"class":3451},[3434,4501,4199],{"class":3692},[3434,4503,4039],{"class":3665},[3434,4505,4506],{"class":3451},"Промо пропозиція",[3434,4508,3964],{"class":3665},[3434,4510,3554],{"class":3669},[3434,4512,3676],{"class":3665},[3434,4514,4516,4518,4520,4522,4524,4526,4528,4531,4533,4535],{"class":3436,"line":4515},69,[3434,4517,4190],{"class":3665},[3434,4519,3353],{"class":3669},[3434,4521,3988],{"class":3458},[3434,4523,3689],{"class":3451},[3434,4525,4224],{"class":3692},[3434,4527,4039],{"class":3665},[3434,4529,4530],{"class":3451},"Локальне перевизначення",[3434,4532,3964],{"class":3665},[3434,4534,3353],{"class":3669},[3434,4536,3676],{"class":3665},[3434,4538,4540,4542,4544],{"class":3436,"line":4539},70,[3434,4541,4171],{"class":3665},[3434,4543,4012],{"class":3669},[3434,4545,3676],{"class":3665},[3434,4547,4549,4551,4553],{"class":3436,"line":4548},71,[3434,4550,4122],{"class":3665},[3434,4552,4012],{"class":3669},[3434,4554,3676],{"class":3665},[3434,4556,4558,4560,4562,4564,4566,4568],{"class":3436,"line":4557},72,[3434,4559,4099],{"class":3665},[3434,4561,4012],{"class":3669},[3434,4563,3988],{"class":3458},[3434,4565,3689],{"class":3451},[3434,4567,4267],{"class":3692},[3434,4569,3676],{"class":3665},[3434,4571,4573,4575,4577,4579,4581,4583],{"class":3436,"line":4572},73,[3434,4574,4148],{"class":3665},[3434,4576,3353],{"class":3669},[3434,4578,3988],{"class":3458},[3434,4580,3689],{"class":3451},[3434,4582,4283],{"class":3692},[3434,4584,3676],{"class":3665},[3434,4586,4588,4591,4593,4595,4597,4599,4601,4603,4606,4608,4610,4612],{"class":3436,"line":4587},74,[3434,4589,4590],{"class":3451},"                        Ця картка перевизначає акцентний колір на ",[3434,4592,3681],{"class":3665},[3434,4594,3434],{"class":3669},[3434,4596,3988],{"class":3458},[3434,4598,3689],{"class":3451},[3434,4600,4302],{"class":3692},[3434,4602,4039],{"class":3665},[3434,4604,4605],{"class":3451},"Orange",[3434,4607,3964],{"class":3665},[3434,4609,3434],{"class":3669},[3434,4611,4039],{"class":3665},[3434,4613,4614],{"class":3451},". Жоден HTML клас нащадків не мінявся!\n",[3434,4616,4618,4620,4622],{"class":3436,"line":4617},75,[3434,4619,4171],{"class":3665},[3434,4621,3353],{"class":3669},[3434,4623,3676],{"class":3665},[3434,4625,4627,4629,4631],{"class":3436,"line":4626},76,[3434,4628,4122],{"class":3665},[3434,4630,4012],{"class":3669},[3434,4632,3676],{"class":3665},[3434,4634,4636,4638,4640,4642,4644,4646],{"class":3436,"line":4635},77,[3434,4637,4099],{"class":3665},[3434,4639,4342],{"class":3669},[3434,4641,3988],{"class":3458},[3434,4643,3689],{"class":3451},[3434,4645,4349],{"class":3692},[3434,4647,3676],{"class":3665},[3434,4649,4651],{"class":3436,"line":4650},78,[3434,4652,4653],{"class":3451},"                    Активувати промо\n",[3434,4655,4657,4659,4661],{"class":3436,"line":4656},79,[3434,4658,4122],{"class":3665},[3434,4660,4342],{"class":3669},[3434,4662,3676],{"class":3665},[3434,4664,4666,4668,4670],{"class":3436,"line":4665},80,[3434,4667,4372],{"class":3665},[3434,4669,4012],{"class":3669},[3434,4671,3676],{"class":3665},[3434,4673,4675,4678,4680],{"class":3436,"line":4674},81,[3434,4676,4677],{"class":3665},"        \u003C\u002F",[3434,4679,4012],{"class":3669},[3434,4681,3676],{"class":3665},[3434,4683,4685,4688,4690],{"class":3436,"line":4684},82,[3434,4686,4687],{"class":3665},"    \u003C\u002F",[3434,4689,4012],{"class":3669},[3434,4691,3676],{"class":3665},[3434,4693,4695,4697,4699],{"class":3436,"line":4694},83,[3434,4696,3964],{"class":3665},[3434,4698,3985],{"class":3669},[3434,4700,3676],{"class":3665},[3434,4702,4704,4706,4708],{"class":3436,"line":4703},84,[3434,4705,3964],{"class":3665},[3434,4707,3658],{"class":3669},[3434,4709,3676],{"class":3665},[3353,4711,4712,4713,4715,4716,4719,4720,4722,4723,4726],{},"Елемент всередині ",[3357,4714,3614],{},", що використовує ",[3357,4717,4718],{},"var(--color-accent)",", отримає помаранчевий колір. Елемент поза ",[3357,4721,3614],{}," — індиго. Це фундаментальна поведінка, яку ми пізніше використаємо для ",[3365,4724,4725],{},"multi-theming",".",[3396,4728],{},[3403,4730,4732],{"id":4731},"_12-семантичні-токени-проти-примітивних-токенів","1.2. Семантичні токени проти примітивних токенів",[3353,4734,4735],{},"Будь-яка зріла дизайн-система розрізняє два рівні токенів:",[3353,4737,4738,4741],{},[3365,4739,4740],{},"Примітивні токени"," (primitive tokens) — це конкретні значення кольорів, розмірів, відступів. Вони описують «що є», а не «навіщо»:",[3425,4743,4745],{"className":3427,"code":4744,"language":3429,"meta":3430,"style":3430},"--color-indigo-500: oklch(0.585 0.233 277.117);\n--color-slate-900: oklch(0.129 0.042 264.695);\n--color-slate-50: oklch(0.984 0.003 247.858);\n",[3357,4746,4747,4768,4789],{"__ignoreMap":3430},[3434,4748,4749,4752,4755,4758,4761,4763,4766],{"class":3436,"line":3437},[3434,4750,4751],{"class":3451},"--color-indigo-500: oklch(0",[3434,4753,4754],{"class":3447},".585",[3434,4756,4757],{"class":3451}," 0",[3434,4759,4760],{"class":3447},".233",[3434,4762,3595],{"class":3451},[3434,4764,4765],{"class":3447},".117",[3434,4767,3482],{"class":3451},[3434,4769,4770,4773,4776,4778,4781,4784,4787],{"class":3436,"line":3444},[3434,4771,4772],{"class":3451},"--color-slate-900: oklch(0",[3434,4774,4775],{"class":3447},".129",[3434,4777,4757],{"class":3451},[3434,4779,4780],{"class":3447},".042",[3434,4782,4783],{"class":3451}," 264",[3434,4785,4786],{"class":3447},".695",[3434,4788,3482],{"class":3451},[3434,4790,4791,4794,4797,4799,4802,4805,4808],{"class":3436,"line":3455},[3434,4792,4793],{"class":3451},"--color-slate-50: oklch(0",[3434,4795,4796],{"class":3447},".984",[3434,4798,4757],{"class":3451},[3434,4800,4801],{"class":3447},".003",[3434,4803,4804],{"class":3451}," 247",[3434,4806,4807],{"class":3447},".858",[3434,4809,3482],{"class":3451},[3353,4811,4812,4815],{},[3365,4813,4814],{},"Семантичні токени"," (semantic tokens) — це аліаси, що описують призначення. Вони посилаються на примітивні токени і відповідають на питання «навіщо використовується цей колір»:",[3425,4817,4819],{"className":3427,"code":4818,"language":3429,"meta":3430,"style":3430},"--color-text-primary: var(--color-slate-900);   \u002F* основний текст *\u002F\n--color-text-muted: var(--color-slate-500);     \u002F* другорядний текст *\u002F\n--color-bg-base: var(--color-white);            \u002F* фон сторінки *\u002F\n--color-bg-surface: var(--color-slate-50);      \u002F* фон карток *\u002F\n--color-border: var(--color-slate-200);         \u002F* рамки *\u002F\n--color-accent: var(--color-indigo-500);        \u002F* акцентний колір *\u002F\n",[3357,4820,4821,4829,4837,4845,4853,4861],{"__ignoreMap":3430},[3434,4822,4823,4826],{"class":3436,"line":3437},[3434,4824,4825],{"class":3451},"--color-text-primary: var(--color-slate-900);   ",[3434,4827,4828],{"class":3440},"\u002F* основний текст *\u002F\n",[3434,4830,4831,4834],{"class":3436,"line":3444},[3434,4832,4833],{"class":3451},"--color-text-muted: var(--color-slate-500);     ",[3434,4835,4836],{"class":3440},"\u002F* другорядний текст *\u002F\n",[3434,4838,4839,4842],{"class":3436,"line":3455},[3434,4840,4841],{"class":3451},"--color-bg-base: var(--color-white);            ",[3434,4843,4844],{"class":3440},"\u002F* фон сторінки *\u002F\n",[3434,4846,4847,4850],{"class":3436,"line":3485},[3434,4848,4849],{"class":3451},"--color-bg-surface: var(--color-slate-50);      ",[3434,4851,4852],{"class":3440},"\u002F* фон карток *\u002F\n",[3434,4854,4855,4858],{"class":3436,"line":3491},[3434,4856,4857],{"class":3451},"--color-border: var(--color-slate-200);         ",[3434,4859,4860],{"class":3440},"\u002F* рамки *\u002F\n",[3434,4862,4863,4866],{"class":3436,"line":3498},[3434,4864,4865],{"class":3451},"--color-accent: var(--color-indigo-500);        ",[3434,4867,4868],{"class":3440},"\u002F* акцентний колір *\u002F\n",[3353,4870,4871,4872,4875],{},"Коли перемикається темна тема — змінюються ",[3365,4873,4874],{},"лише семантичні токени",":",[3425,4877,4879],{"className":3427,"code":4878,"language":3429,"meta":3430,"style":3430},".dark {\n    --color-text-primary: var(--color-slate-50);\n    --color-text-muted: var(--color-slate-400);\n    --color-bg-base: oklch(0.13 0.03 270);\n    --color-bg-surface: oklch(0.19 0.03 270);\n    --color-border: oklch(0.28 0.02 270);\n    --color-accent: var(--color-indigo-400); \u002F* трохи яскравіший для темного фону *\u002F\n}\n",[3357,4880,4881,4888,4904,4920,4941,4961,4981,4999],{"__ignoreMap":3430},[3434,4882,4883,4886],{"class":3436,"line":3437},[3434,4884,4885],{"class":3447},".dark",[3434,4887,3452],{"class":3451},[3434,4889,4890,4893,4895,4897,4899,4902],{"class":3436,"line":3444},[3434,4891,4892],{"class":3458},"    --color-text-primary",[3434,4894,3462],{"class":3451},[3434,4896,3519],{"class":3465},[3434,4898,3469],{"class":3451},[3434,4900,4901],{"class":3458},"--color-slate-50",[3434,4903,3482],{"class":3451},[3434,4905,4906,4909,4911,4913,4915,4918],{"class":3436,"line":3455},[3434,4907,4908],{"class":3458},"    --color-text-muted",[3434,4910,3462],{"class":3451},[3434,4912,3519],{"class":3465},[3434,4914,3469],{"class":3451},[3434,4916,4917],{"class":3458},"--color-slate-400",[3434,4919,3482],{"class":3451},[3434,4921,4922,4925,4927,4929,4931,4934,4937,4939],{"class":3436,"line":3485},[3434,4923,4924],{"class":3458},"    --color-bg-base",[3434,4926,3462],{"class":3451},[3434,4928,3466],{"class":3465},[3434,4930,3469],{"class":3451},[3434,4932,4933],{"class":3472},"0.13",[3434,4935,4936],{"class":3472}," 0.03",[3434,4938,3479],{"class":3472},[3434,4940,3482],{"class":3451},[3434,4942,4943,4946,4948,4950,4952,4955,4957,4959],{"class":3436,"line":3491},[3434,4944,4945],{"class":3458},"    --color-bg-surface",[3434,4947,3462],{"class":3451},[3434,4949,3466],{"class":3465},[3434,4951,3469],{"class":3451},[3434,4953,4954],{"class":3472},"0.19",[3434,4956,4936],{"class":3472},[3434,4958,3479],{"class":3472},[3434,4960,3482],{"class":3451},[3434,4962,4963,4966,4968,4970,4972,4975,4977,4979],{"class":3436,"line":3498},[3434,4964,4965],{"class":3458},"    --color-border",[3434,4967,3462],{"class":3451},[3434,4969,3466],{"class":3465},[3434,4971,3469],{"class":3451},[3434,4973,4974],{"class":3472},"0.28",[3434,4976,3476],{"class":3472},[3434,4978,3479],{"class":3472},[3434,4980,3482],{"class":3451},[3434,4982,4983,4985,4987,4989,4991,4994,4996],{"class":3436,"line":3504},[3434,4984,3580],{"class":3458},[3434,4986,3462],{"class":3451},[3434,4988,3519],{"class":3465},[3434,4990,3469],{"class":3451},[3434,4992,4993],{"class":3458},"--color-indigo-400",[3434,4995,3598],{"class":3451},[3434,4997,4998],{"class":3440},"\u002F* трохи яскравіший для темного фону *\u002F\n",[3434,5000,5001],{"class":3436,"line":3511},[3434,5002,3488],{"class":3451},[3353,5004,5005,5006,5009],{},"Компонент у HTML використовує лише семантичні токени — і ",[3365,5007,5008],{},"ніколи"," не знає, яка тема активна:",[3425,5011,5013],{"className":3656,"code":5012,"language":3658,"meta":3430,"style":3430},"\u003Cp class=\"text-[--color-text-primary]\">Це завжди правильний колір\u003C\u002Fp>\n",[3357,5014,5015],{"__ignoreMap":3430},[3434,5016,5017,5019,5021,5023,5025,5028,5030,5033,5035,5037],{"class":3436,"line":3437},[3434,5018,3681],{"class":3665},[3434,5020,3353],{"class":3669},[3434,5022,3988],{"class":3458},[3434,5024,3689],{"class":3451},[3434,5026,5027],{"class":3692},"\"text-[--color-text-primary]\"",[3434,5029,4039],{"class":3665},[3434,5031,5032],{"class":3451},"Це завжди правильний колір",[3434,5034,3964],{"class":3665},[3434,5036,3353],{"class":3669},[3434,5038,3676],{"class":3665},[3388,5040,5041,5042,5045,5046,5049],{},"Цей підхід повністю усуває необхідність писати ",[3357,5043,5044],{},"dark:text-slate-100"," разом з ",[3357,5047,5048],{},"text-slate-900"," для кожного текстового елемента. Один клас із семантичним токеном — і він сам знає, яким бути у будь-якій темі.",[3396,5051],{},[3403,5053,5055],{"id":5054},"_13-три-стратегії-реалізації-темної-теми","1.3. Три стратегії реалізації темної теми",[3353,5057,5058],{},"Перед тим як переходити до коду, важливо визначитися зі стратегією. У Tailwind v4 та сучасному CSS існують три підходи:",[5060,5061,5062,5090,5122],"card-group",{},[5063,5064,5067,5078,5084],"card",{"icon":5065,"title":5066},"i-heroicons-computer-desktop","Стратегія 1: Медіазапит prefers-color-scheme",[3353,5068,5069,5070,5073,5074,5077],{},"Тема визначається ",[3365,5071,5072],{},"системними налаштуваннями"," користувача. CSS-медіазапит ",[3357,5075,5076],{},"@media (prefers-color-scheme: dark)"," автоматично застосовує темні стилі, якщо система налаштована на темний режим.",[3353,5079,5080,5083],{},[3365,5081,5082],{},"Переваги:"," повністю автоматично, не потребує JavaScript, найдоступніший підхід.",[3353,5085,5086,5089],{},[3365,5087,5088],{},"Недоліки:"," користувач не може змінити тему на сайті незалежно від системних налаштувань.",[5063,5091,5094,5108,5117],{"icon":5092,"title":5093},"i-heroicons-code-bracket","Стратегія 2: Клас на кореневому елементі",[3353,5095,5096,5097,5099,5100,5103,5104,5107],{},"Темна тема активується додаванням класу ",[3357,5098,4885],{}," (або атрибута ",[3357,5101,5102],{},"data-theme=\"dark\"",") до елемента ",[3357,5105,5106],{},"\u003Chtml>",". JavaScript перемикає цей клас.",[3353,5109,5110,5112,5113,5116],{},[3365,5111,5082],{}," повний контроль, легко зберігати у ",[3357,5114,5115],{},"localStorage",", підтримка ручного перемикання.",[3353,5118,5119,5121],{},[3365,5120,5088],{}," потребує JavaScript для початкового читання localStorage, можливий «спалах» неправильної теми при завантаженні.",[5063,5123,5126,5138,5143],{"icon":5124,"title":5125},"i-heroicons-sparkles","Стратегія 3: Гібридний підхід (рекомендований)",[3353,5127,5128,5129,5132,5133,5135,5136,4726],{},"Поєднує обидві стратегії: за замовчуванням слухає ",[3357,5130,5131],{},"prefers-color-scheme",", але якщо користувач явно обрав тему — зберігає вибір у ",[3357,5134,5115],{}," та застосовує клас на ",[3357,5137,5106],{},[3353,5139,5140,5142],{},[3365,5141,5082],{}," найкраща UX: поважає системні налаштування, але дає можливість ручного вибору.",[3353,5144,5145,5147],{},[3365,5146,5088],{}," складніша реалізація, але варта зусиль для production.",[3353,5149,5150,5151,5154],{},"У цій статті ми реалізуємо ",[3365,5152,5153],{},"гібридний підхід"," — від простого до складного, пояснюючи кожен крок.",[3396,5156],{},[3348,5158,5160,5161,5163],{"id":5159},"частина-іі-базовий-dark-варіант-у-tailwind-v4","Частина ІІ. Базовий ",[3357,5162,3359],{}," варіант у Tailwind v4",[3403,5165,5167,5168,5170],{"id":5166},"_21-як-працює-dark-у-tailwind","2.1. Як працює ",[3357,5169,3359],{}," у Tailwind",[3353,5172,5173,5174,4726],{},"Перш за все, розберемо найпростіший механізм — вбудований варіант ",[3357,5175,3359],{},[3353,5177,5178,5179,5181,5182,4875],{},"У Tailwind CSS варіант ",[3357,5180,3359],{}," генерує CSS-правило, що застосовується лише за певної умови. За замовчуванням у Tailwind v4 ця умова — ",[3365,5183,5184],{},"CSS медіазапит",[3425,5186,5188],{"className":3427,"code":5187,"language":3429,"meta":3430,"style":3430},"\u002F* Що генерує Tailwind для класу dark:bg-slate-900 *\u002F\n@media (prefers-color-scheme: dark) {\n    .dark\\:bg-slate-900 {\n        background-color: oklch(0.129 0.042 264.695);\n    }\n}\n",[3357,5189,5190,5195,5204,5218,5239,5243],{"__ignoreMap":3430},[3434,5191,5192],{"class":3436,"line":3437},[3434,5193,5194],{"class":3440},"\u002F* Що генерує Tailwind для класу dark:bg-slate-900 *\u002F\n",[3434,5196,5197,5201],{"class":3436,"line":3444},[3434,5198,5200],{"class":5199},"s8xlr","@media",[3434,5202,5203],{"class":3451}," (prefers-color-scheme: dark) {\n",[3434,5205,5206,5209,5213,5216],{"class":3436,"line":3455},[3434,5207,5208],{"class":3447},"    .dark",[3434,5210,5212],{"class":5211},"sjcCO","\\:",[3434,5214,5215],{"class":3447},"bg-slate-900",[3434,5217,3452],{"class":3451},[3434,5219,5220,5222,5224,5226,5228,5231,5234,5237],{"class":3436,"line":3485},[3434,5221,3884],{"class":3458},[3434,5223,3462],{"class":3451},[3434,5225,3466],{"class":3465},[3434,5227,3469],{"class":3451},[3434,5229,5230],{"class":3472},"0.129",[3434,5232,5233],{"class":3472}," 0.042",[3434,5235,5236],{"class":3472}," 264.695",[3434,5238,3482],{"class":3451},[3434,5240,5241],{"class":3436,"line":3491},[3434,5242,3813],{"class":3451},[3434,5244,5245],{"class":3436,"line":3498},[3434,5246,3488],{"class":3451},[3353,5248,5249],{},"Написавши в HTML:",[3425,5251,5253],{"className":3656,"code":5252,"language":3658,"meta":3430,"style":3430},"\u003Cbody class=\"bg-white dark:bg-slate-900\">\n",[3357,5254,5255],{"__ignoreMap":3430},[3434,5256,5257,5259,5261,5263,5265,5268],{"class":3436,"line":3437},[3434,5258,3681],{"class":3665},[3434,5260,3985],{"class":3669},[3434,5262,3988],{"class":3458},[3434,5264,3689],{"class":3451},[3434,5266,5267],{"class":3692},"\"bg-white dark:bg-slate-900\"",[3434,5269,3676],{"class":3665},[3353,5271,5272],{},"Ви отримуєте елемент, що автоматично змінює фон залежно від системних налаштувань користувача. Жодного JavaScript.",[3554,5274,5276,5277,5279],{"id":5275},"стекування-dark-з-іншими-варіантами","Стекування ",[3357,5278,3359],{}," з іншими варіантами",[3353,5281,5282,5283,5285],{},"Варіант ",[3357,5284,3359],{}," вільно комбінується з будь-якими іншими варіантами. Порядок написання — від зовнішнього контексту до конкретної утиліти:",[3425,5287,5289],{"className":3656,"code":5288,"language":3658,"meta":3430,"style":3430},"\u003C!-- dark + hover -->\n\u003Cbutton class=\"bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-400\">\n    Кнопка\n\u003C\u002Fbutton>\n\n\u003C!-- dark + responsive + hover -->\n\u003Cdiv class=\"text-slate-900 md:text-slate-700 dark:text-slate-100 dark:md:text-slate-200\">\n    Текст\n\u003C\u002Fdiv>\n\n\u003C!-- dark + group-hover -->\n\u003Cdiv class=\"group\">\n    \u003Cspan class=\"text-slate-600 group-hover:text-indigo-600 dark:text-slate-400 dark:group-hover:text-indigo-400\">\n        Реакція на hover батька в темній темі\n    \u003C\u002Fspan>\n\u003C\u002Fdiv>\n",[3357,5290,5291,5296,5311,5316,5324,5328,5333,5348,5353,5361,5365,5370,5385,5400,5405,5413],{"__ignoreMap":3430},[3434,5292,5293],{"class":3436,"line":3437},[3434,5294,5295],{"class":3440},"\u003C!-- dark + hover -->\n",[3434,5297,5298,5300,5302,5304,5306,5309],{"class":3436,"line":3444},[3434,5299,3681],{"class":3665},[3434,5301,4342],{"class":3669},[3434,5303,3988],{"class":3458},[3434,5305,3689],{"class":3451},[3434,5307,5308],{"class":3692},"\"bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-400\"",[3434,5310,3676],{"class":3665},[3434,5312,5313],{"class":3436,"line":3455},[3434,5314,5315],{"class":3451},"    Кнопка\n",[3434,5317,5318,5320,5322],{"class":3436,"line":3485},[3434,5319,3964],{"class":3665},[3434,5321,4342],{"class":3669},[3434,5323,3676],{"class":3665},[3434,5325,5326],{"class":3436,"line":3491},[3434,5327,3495],{"emptyLinePlaceholder":3494},[3434,5329,5330],{"class":3436,"line":3498},[3434,5331,5332],{"class":3440},"\u003C!-- dark + responsive + hover -->\n",[3434,5334,5335,5337,5339,5341,5343,5346],{"class":3436,"line":3504},[3434,5336,3681],{"class":3665},[3434,5338,4012],{"class":3669},[3434,5340,3988],{"class":3458},[3434,5342,3689],{"class":3451},[3434,5344,5345],{"class":3692},"\"text-slate-900 md:text-slate-700 dark:text-slate-100 dark:md:text-slate-200\"",[3434,5347,3676],{"class":3665},[3434,5349,5350],{"class":3436,"line":3511},[3434,5351,5352],{"class":3451},"    Текст\n",[3434,5354,5355,5357,5359],{"class":3436,"line":3529},[3434,5356,3964],{"class":3665},[3434,5358,4012],{"class":3669},[3434,5360,3676],{"class":3665},[3434,5362,5363],{"class":3436,"line":3810},[3434,5364,3495],{"emptyLinePlaceholder":3494},[3434,5366,5367],{"class":3436,"line":3816},[3434,5368,5369],{"class":3440},"\u003C!-- dark + group-hover -->\n",[3434,5371,5372,5374,5376,5378,5380,5383],{"class":3436,"line":3821},[3434,5373,3681],{"class":3665},[3434,5375,4012],{"class":3669},[3434,5377,3988],{"class":3458},[3434,5379,3689],{"class":3451},[3434,5381,5382],{"class":3692},"\"group\"",[3434,5384,3676],{"class":3665},[3434,5386,5387,5389,5391,5393,5395,5398],{"class":3436,"line":3829},[3434,5388,4009],{"class":3665},[3434,5390,3434],{"class":3669},[3434,5392,3988],{"class":3458},[3434,5394,3689],{"class":3451},[3434,5396,5397],{"class":3692},"\"text-slate-600 group-hover:text-indigo-600 dark:text-slate-400 dark:group-hover:text-indigo-400\"",[3434,5399,3676],{"class":3665},[3434,5401,5402],{"class":3436,"line":3835},[3434,5403,5404],{"class":3451},"        Реакція на hover батька в темній темі\n",[3434,5406,5407,5409,5411],{"class":3436,"line":3857},[3434,5408,4687],{"class":3665},[3434,5410,3434],{"class":3669},[3434,5412,3676],{"class":3665},[3434,5414,5415,5417,5419],{"class":3436,"line":3862},[3434,5416,3964],{"class":3665},[3434,5418,4012],{"class":3669},[3434,5420,3676],{"class":3665},[3651,5422,5423],{":tailwind":3653},[3425,5424,5426],{"className":3656,"code":5425,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n\u003Cmeta charset=\"UTF-8\">\n\u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\">\u003C\u002Fscript>\n\u003Clink href=\"https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\u003Cstyle>\n    @custom-variant dark (&:is(.dark *));\n\u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"p-6 bg-slate-50\" style=\"font-family: 'Inter', system-ui, sans-serif;\">\n    \u003Cdiv class=\"max-w-md mx-auto bg-white rounded-2xl border border-slate-200 p-6 shadow-sm space-y-6\">\n        \u003Cdiv class=\"flex items-center justify-between border-b border-slate-100 pb-3\">\n            \u003Cp class=\"text-xs font-bold text-slate-400 uppercase tracking-widest\">Stacked Variants Playground\u003C\u002Fp>\n            \n            \u003C!-- Dark Mode Toggle -->\n            \u003Cbutton onclick=\"document.getElementById('playground-wrapper').classList.toggle('dark'); updateToggleBtn(this)\" \n                    class=\"px-3 py-1 bg-slate-100 hover:bg-slate-200 text-slate-700 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700 text-xs font-semibold rounded-lg transition-all\">\n                🌙 Ввімкнути темну\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n\n        \u003C!-- Playground Wrapper -->\n        \u003Cdiv id=\"playground-wrapper\" class=\"space-y-6 p-4 rounded-xl border border-slate-100 bg-slate-50\u002F50 transition-colors duration-300\">\n            \u003C!-- 1. dark + hover button -->\n            \u003Cdiv class=\"space-y-2\">\n                \u003Cp class=\"text-[10px] font-bold text-slate-400 uppercase\">1. dark + hover\u003C\u002Fp>\n                \u003Cbutton class=\"w-full inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-indigo-600 hover:bg-indigo-700 active:scale-95 text-white font-semibold rounded-xl transition-all text-sm shadow-sm dark:bg-indigo-500 dark:hover:bg-indigo-400\">\n                    Інтерактивна кнопка\n                \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n\n            \u003C!-- 2. dark + responsive + hover -->\n            \u003Cdiv class=\"space-y-2\">\n                \u003Cp class=\"text-[10px] font-bold text-slate-400 uppercase\">2. dark + responsive + hover\u003C\u002Fp>\n                \u003Cdiv class=\"text-slate-900 md:text-slate-700 dark:text-slate-100 dark:md:text-slate-200 font-semibold text-center hover:underline cursor-pointer select-none\">\n                    Адаптивний текст (змінює відтінок на md екранах)\n                \u003C\u002Fdiv>\n            \u003C\u002Fdiv>\n\n            \u003C!-- 3. dark + group-hover -->\n            \u003Cdiv class=\"space-y-2\">\n                \u003Cp class=\"text-[10px] font-bold text-slate-400 uppercase\">3. dark + group-hover\u003C\u002Fp>\n                \u003Cdiv class=\"group bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 p-4 rounded-xl cursor-pointer hover:shadow-md transition-all text-center\">\n                    \u003Cspan class=\"text-slate-600 group-hover:text-indigo-600 dark:text-slate-400 dark:group-hover:text-indigo-400 font-medium transition-colors text-sm\">\n                        Реакція на hover батька в темній темі\n                    \u003C\u002Fspan>\n                \u003C\u002Fdiv>\n            \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cscript>\n        function updateToggleBtn(btn) {\n            const isDark = document.getElementById('playground-wrapper').classList.contains('dark');\n            btn.textContent = isDark ? '☀️ Ввімкнути світлу' : '🌙 Ввімкнути темну';\n        }\n    \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,5427,5428,5438,5452,5460,5474,5492,5512,5520,5528,5536,5544,5564,5579,5594,5618,5623,5628,5690,5702,5707,5715,5723,5727,5732,5755,5760,5775,5799,5814,5819,5827,5835,5839,5844,5858,5881,5896,5901,5909,5917,5921,5926,5940,5963,5978,5993,5998,6006,6014,6022,6030,6038,6042,6050,6066,6104,6133,6138,6146,6154],{"__ignoreMap":3430},[3434,5429,5430,5432,5434,5436],{"class":3436,"line":3437},[3434,5431,3666],{"class":3665},[3434,5433,3670],{"class":3669},[3434,5435,3673],{"class":3458},[3434,5437,3676],{"class":3665},[3434,5439,5440,5442,5444,5446,5448,5450],{"class":3436,"line":3444},[3434,5441,3681],{"class":3665},[3434,5443,3658],{"class":3669},[3434,5445,3686],{"class":3458},[3434,5447,3689],{"class":3451},[3434,5449,3693],{"class":3692},[3434,5451,3676],{"class":3665},[3434,5453,5454,5456,5458],{"class":3436,"line":3455},[3434,5455,3681],{"class":3665},[3434,5457,3702],{"class":3669},[3434,5459,3676],{"class":3665},[3434,5461,5462,5464,5466,5468,5470,5472],{"class":3436,"line":3485},[3434,5463,3681],{"class":3665},[3434,5465,3711],{"class":3669},[3434,5467,3714],{"class":3458},[3434,5469,3689],{"class":3451},[3434,5471,3719],{"class":3692},[3434,5473,3676],{"class":3665},[3434,5475,5476,5478,5480,5482,5484,5486,5488,5490],{"class":3436,"line":3491},[3434,5477,3681],{"class":3665},[3434,5479,3728],{"class":3669},[3434,5481,3731],{"class":3458},[3434,5483,3689],{"class":3734},[3434,5485,3737],{"class":3692},[3434,5487,3740],{"class":3665},[3434,5489,3728],{"class":3669},[3434,5491,3676],{"class":3665},[3434,5493,5494,5496,5498,5500,5502,5504,5506,5508,5510],{"class":3436,"line":3498},[3434,5495,3681],{"class":3665},[3434,5497,3751],{"class":3669},[3434,5499,3754],{"class":3458},[3434,5501,3689],{"class":3451},[3434,5503,3759],{"class":3692},[3434,5505,3762],{"class":3458},[3434,5507,3689],{"class":3451},[3434,5509,3767],{"class":3692},[3434,5511,3676],{"class":3665},[3434,5513,5514,5516,5518],{"class":3436,"line":3504},[3434,5515,3681],{"class":3665},[3434,5517,3776],{"class":3669},[3434,5519,3676],{"class":3665},[3434,5521,5522,5525],{"class":3436,"line":3511},[3434,5523,5524],{"class":5199},"    @custom-variant",[3434,5526,5527],{"class":3734}," dark (&:is(.dark *));\n",[3434,5529,5530,5532,5534],{"class":3436,"line":3529},[3434,5531,3964],{"class":3665},[3434,5533,3776],{"class":3669},[3434,5535,3676],{"class":3665},[3434,5537,5538,5540,5542],{"class":3436,"line":3810},[3434,5539,3964],{"class":3665},[3434,5541,3702],{"class":3669},[3434,5543,3676],{"class":3665},[3434,5545,5546,5548,5550,5552,5554,5556,5558,5560,5562],{"class":3436,"line":3816},[3434,5547,3681],{"class":3665},[3434,5549,3985],{"class":3669},[3434,5551,3988],{"class":3458},[3434,5553,3689],{"class":3451},[3434,5555,3993],{"class":3692},[3434,5557,3996],{"class":3458},[3434,5559,3689],{"class":3451},[3434,5561,4001],{"class":3692},[3434,5563,3676],{"class":3665},[3434,5565,5566,5568,5570,5572,5574,5577],{"class":3436,"line":3821},[3434,5567,4009],{"class":3665},[3434,5569,4012],{"class":3669},[3434,5571,3988],{"class":3458},[3434,5573,3689],{"class":3451},[3434,5575,5576],{"class":3692},"\"max-w-md mx-auto bg-white rounded-2xl border border-slate-200 p-6 shadow-sm space-y-6\"",[3434,5578,3676],{"class":3665},[3434,5580,5581,5583,5585,5587,5589,5592],{"class":3436,"line":3829},[3434,5582,4027],{"class":3665},[3434,5584,4012],{"class":3669},[3434,5586,3988],{"class":3458},[3434,5588,3689],{"class":3451},[3434,5590,5591],{"class":3692},"\"flex items-center justify-between border-b border-slate-100 pb-3\"",[3434,5593,3676],{"class":3665},[3434,5595,5596,5598,5600,5602,5604,5607,5609,5612,5614,5616],{"class":3436,"line":3835},[3434,5597,4082],{"class":3665},[3434,5599,3353],{"class":3669},[3434,5601,3988],{"class":3458},[3434,5603,3689],{"class":3451},[3434,5605,5606],{"class":3692},"\"text-xs font-bold text-slate-400 uppercase tracking-widest\"",[3434,5608,4039],{"class":3665},[3434,5610,5611],{"class":3451},"Stacked Variants Playground",[3434,5613,3964],{"class":3665},[3434,5615,3353],{"class":3669},[3434,5617,3676],{"class":3665},[3434,5619,5620],{"class":3436,"line":3857},[3434,5621,5622],{"class":3451},"            \n",[3434,5624,5625],{"class":3436,"line":3862},[3434,5626,5627],{"class":3440},"            \u003C!-- Dark Mode Toggle -->\n",[3434,5629,5630,5632,5634,5637,5639,5642,5646,5648,5651,5653,5657,5660,5663,5665,5668,5670,5673,5675,5678,5680,5684,5687],{"class":3436,"line":3867},[3434,5631,4082],{"class":3665},[3434,5633,4342],{"class":3669},[3434,5635,5636],{"class":3458}," onclick",[3434,5638,3689],{"class":3451},[3434,5640,5641],{"class":3692},"\"",[3434,5643,5645],{"class":5644},"siwwj","document",[3434,5647,4726],{"class":3692},[3434,5649,5650],{"class":3465},"getElementById",[3434,5652,3469],{"class":3692},[3434,5654,5656],{"class":5655},"sbdoH","'playground-wrapper'",[3434,5658,5659],{"class":3692},").",[3434,5661,5662],{"class":5644},"classList",[3434,5664,4726],{"class":3692},[3434,5666,5667],{"class":3465},"toggle",[3434,5669,3469],{"class":3692},[3434,5671,5672],{"class":5655},"'dark'",[3434,5674,3598],{"class":3692},[3434,5676,5677],{"class":3465},"updateToggleBtn",[3434,5679,3469],{"class":3692},[3434,5681,5683],{"class":5682},"su1O8","this",[3434,5685,5686],{"class":3692},")\"",[3434,5688,5689],{"class":3451}," \n",[3434,5691,5692,5695,5697,5700],{"class":3436,"line":3873},[3434,5693,5694],{"class":3458},"                    class",[3434,5696,3689],{"class":3451},[3434,5698,5699],{"class":3692},"\"px-3 py-1 bg-slate-100 hover:bg-slate-200 text-slate-700 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700 text-xs font-semibold rounded-lg transition-all\"",[3434,5701,3676],{"class":3665},[3434,5703,5704],{"class":3436,"line":3881},[3434,5705,5706],{"class":3451},"                🌙 Ввімкнути темну\n",[3434,5708,5709,5711,5713],{"class":3436,"line":3898},[3434,5710,4372],{"class":3665},[3434,5712,4342],{"class":3669},[3434,5714,3676],{"class":3665},[3434,5716,5717,5719,5721],{"class":3436,"line":3903},[3434,5718,4677],{"class":3665},[3434,5720,4012],{"class":3669},[3434,5722,3676],{"class":3665},[3434,5724,5725],{"class":3436,"line":3911},[3434,5726,3495],{"emptyLinePlaceholder":3494},[3434,5728,5729],{"class":3436,"line":3927},[3434,5730,5731],{"class":3440},"        \u003C!-- Playground Wrapper -->\n",[3434,5733,5734,5736,5738,5741,5743,5746,5748,5750,5753],{"class":3436,"line":3932},[3434,5735,4027],{"class":3665},[3434,5737,4012],{"class":3669},[3434,5739,5740],{"class":3458}," id",[3434,5742,3689],{"class":3451},[3434,5744,5745],{"class":3692},"\"playground-wrapper\"",[3434,5747,3988],{"class":3458},[3434,5749,3689],{"class":3451},[3434,5751,5752],{"class":3692},"\"space-y-6 p-4 rounded-xl border border-slate-100 bg-slate-50\u002F50 transition-colors duration-300\"",[3434,5754,3676],{"class":3665},[3434,5756,5757],{"class":3436,"line":3940},[3434,5758,5759],{"class":3440},"            \u003C!-- 1. dark + hover button -->\n",[3434,5761,5762,5764,5766,5768,5770,5773],{"class":3436,"line":3956},[3434,5763,4082],{"class":3665},[3434,5765,4012],{"class":3669},[3434,5767,3988],{"class":3458},[3434,5769,3689],{"class":3451},[3434,5771,5772],{"class":3692},"\"space-y-2\"",[3434,5774,3676],{"class":3665},[3434,5776,5777,5779,5781,5783,5785,5788,5790,5793,5795,5797],{"class":3436,"line":3961},[3434,5778,4099],{"class":3665},[3434,5780,3353],{"class":3669},[3434,5782,3988],{"class":3458},[3434,5784,3689],{"class":3451},[3434,5786,5787],{"class":3692},"\"text-[10px] font-bold text-slate-400 uppercase\"",[3434,5789,4039],{"class":3665},[3434,5791,5792],{"class":3451},"1. dark + hover",[3434,5794,3964],{"class":3665},[3434,5796,3353],{"class":3669},[3434,5798,3676],{"class":3665},[3434,5800,5801,5803,5805,5807,5809,5812],{"class":3436,"line":3971},[3434,5802,4099],{"class":3665},[3434,5804,4342],{"class":3669},[3434,5806,3988],{"class":3458},[3434,5808,3689],{"class":3451},[3434,5810,5811],{"class":3692},"\"w-full inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-indigo-600 hover:bg-indigo-700 active:scale-95 text-white font-semibold rounded-xl transition-all text-sm shadow-sm dark:bg-indigo-500 dark:hover:bg-indigo-400\"",[3434,5813,3676],{"class":3665},[3434,5815,5816],{"class":3436,"line":3980},[3434,5817,5818],{"class":3451},"                    Інтерактивна кнопка\n",[3434,5820,5821,5823,5825],{"class":3436,"line":4006},[3434,5822,4122],{"class":3665},[3434,5824,4342],{"class":3669},[3434,5826,3676],{"class":3665},[3434,5828,5829,5831,5833],{"class":3436,"line":4024},[3434,5830,4372],{"class":3665},[3434,5832,4012],{"class":3669},[3434,5834,3676],{"class":3665},[3434,5836,5837],{"class":3436,"line":4051},[3434,5838,3495],{"emptyLinePlaceholder":3494},[3434,5840,5841],{"class":3436,"line":4057},[3434,5842,5843],{"class":3440},"            \u003C!-- 2. dark + responsive + hover -->\n",[3434,5845,5846,5848,5850,5852,5854,5856],{"class":3436,"line":4073},[3434,5847,4082],{"class":3665},[3434,5849,4012],{"class":3669},[3434,5851,3988],{"class":3458},[3434,5853,3689],{"class":3451},[3434,5855,5772],{"class":3692},[3434,5857,3676],{"class":3665},[3434,5859,5860,5862,5864,5866,5868,5870,5872,5875,5877,5879],{"class":3436,"line":4079},[3434,5861,4099],{"class":3665},[3434,5863,3353],{"class":3669},[3434,5865,3988],{"class":3458},[3434,5867,3689],{"class":3451},[3434,5869,5787],{"class":3692},[3434,5871,4039],{"class":3665},[3434,5873,5874],{"class":3451},"2. dark + responsive + hover",[3434,5876,3964],{"class":3665},[3434,5878,3353],{"class":3669},[3434,5880,3676],{"class":3665},[3434,5882,5883,5885,5887,5889,5891,5894],{"class":3436,"line":4096},[3434,5884,4099],{"class":3665},[3434,5886,4012],{"class":3669},[3434,5888,3988],{"class":3458},[3434,5890,3689],{"class":3451},[3434,5892,5893],{"class":3692},"\"text-slate-900 md:text-slate-700 dark:text-slate-100 dark:md:text-slate-200 font-semibold text-center hover:underline cursor-pointer select-none\"",[3434,5895,3676],{"class":3665},[3434,5897,5898],{"class":3436,"line":4113},[3434,5899,5900],{"class":3451},"                    Адаптивний текст (змінює відтінок на md екранах)\n",[3434,5902,5903,5905,5907],{"class":3436,"line":4119},[3434,5904,4122],{"class":3665},[3434,5906,4012],{"class":3669},[3434,5908,3676],{"class":3665},[3434,5910,5911,5913,5915],{"class":3436,"line":4129},[3434,5912,4372],{"class":3665},[3434,5914,4012],{"class":3669},[3434,5916,3676],{"class":3665},[3434,5918,5919],{"class":3436,"line":4145},[3434,5920,3495],{"emptyLinePlaceholder":3494},[3434,5922,5923],{"class":3436,"line":4162},[3434,5924,5925],{"class":3440},"            \u003C!-- 3. dark + group-hover -->\n",[3434,5927,5928,5930,5932,5934,5936,5938],{"class":3436,"line":4168},[3434,5929,4082],{"class":3665},[3434,5931,4012],{"class":3669},[3434,5933,3988],{"class":3458},[3434,5935,3689],{"class":3451},[3434,5937,5772],{"class":3692},[3434,5939,3676],{"class":3665},[3434,5941,5942,5944,5946,5948,5950,5952,5954,5957,5959,5961],{"class":3436,"line":4178},[3434,5943,4099],{"class":3665},[3434,5945,3353],{"class":3669},[3434,5947,3988],{"class":3458},[3434,5949,3689],{"class":3451},[3434,5951,5787],{"class":3692},[3434,5953,4039],{"class":3665},[3434,5955,5956],{"class":3451},"3. dark + group-hover",[3434,5958,3964],{"class":3665},[3434,5960,3353],{"class":3669},[3434,5962,3676],{"class":3665},[3434,5964,5965,5967,5969,5971,5973,5976],{"class":3436,"line":4187},[3434,5966,4099],{"class":3665},[3434,5968,4012],{"class":3669},[3434,5970,3988],{"class":3458},[3434,5972,3689],{"class":3451},[3434,5974,5975],{"class":3692},"\"group bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 p-4 rounded-xl cursor-pointer hover:shadow-md transition-all text-center\"",[3434,5977,3676],{"class":3665},[3434,5979,5980,5982,5984,5986,5988,5991],{"class":3436,"line":4213},[3434,5981,4148],{"class":3665},[3434,5983,3434],{"class":3669},[3434,5985,3988],{"class":3458},[3434,5987,3689],{"class":3451},[3434,5989,5990],{"class":3692},"\"text-slate-600 group-hover:text-indigo-600 dark:text-slate-400 dark:group-hover:text-indigo-400 font-medium transition-colors text-sm\"",[3434,5992,3676],{"class":3665},[3434,5994,5995],{"class":3436,"line":4238},[3434,5996,5997],{"class":3451},"                        Реакція на hover батька в темній темі\n",[3434,5999,6000,6002,6004],{"class":3436,"line":4247},[3434,6001,4171],{"class":3665},[3434,6003,3434],{"class":3669},[3434,6005,3676],{"class":3665},[3434,6007,6008,6010,6012],{"class":3436,"line":4256},[3434,6009,4122],{"class":3665},[3434,6011,4012],{"class":3669},[3434,6013,3676],{"class":3665},[3434,6015,6016,6018,6020],{"class":3436,"line":4272},[3434,6017,4372],{"class":3665},[3434,6019,4012],{"class":3669},[3434,6021,3676],{"class":3665},[3434,6023,6024,6026,6028],{"class":3436,"line":4288},[3434,6025,4677],{"class":3665},[3434,6027,4012],{"class":3669},[3434,6029,3676],{"class":3665},[3434,6031,6032,6034,6036],{"class":3436,"line":4319},[3434,6033,4687],{"class":3665},[3434,6035,4012],{"class":3669},[3434,6037,3676],{"class":3665},[3434,6039,6040],{"class":3436,"line":4328},[3434,6041,3495],{"emptyLinePlaceholder":3494},[3434,6043,6044,6046,6048],{"class":3436,"line":4337},[3434,6045,4009],{"class":3665},[3434,6047,3728],{"class":3669},[3434,6049,3676],{"class":3665},[3434,6051,6052,6055,6058,6060,6063],{"class":3436,"line":4354},[3434,6053,6054],{"class":5682},"        function",[3434,6056,6057],{"class":3465}," updateToggleBtn",[3434,6059,3469],{"class":3734},[3434,6061,6062],{"class":5644},"btn",[3434,6064,6065],{"class":3734},") {\n",[3434,6067,6068,6071,6075,6078,6081,6083,6085,6087,6089,6091,6093,6095,6098,6100,6102],{"class":3436,"line":4360},[3434,6069,6070],{"class":5682},"            const",[3434,6072,6074],{"class":6073},"s-QsJ"," isDark",[3434,6076,6077],{"class":3451}," =",[3434,6079,6080],{"class":5644}," document",[3434,6082,4726],{"class":3734},[3434,6084,5650],{"class":3465},[3434,6086,3469],{"class":3734},[3434,6088,5656],{"class":5655},[3434,6090,5659],{"class":3734},[3434,6092,5662],{"class":5644},[3434,6094,4726],{"class":3734},[3434,6096,6097],{"class":3465},"contains",[3434,6099,3469],{"class":3734},[3434,6101,5672],{"class":5655},[3434,6103,3482],{"class":3734},[3434,6105,6106,6109,6111,6114,6116,6118,6121,6124,6127,6130],{"class":3436,"line":4369},[3434,6107,6108],{"class":5644},"            btn",[3434,6110,4726],{"class":3734},[3434,6112,6113],{"class":5644},"textContent",[3434,6115,6077],{"class":3451},[3434,6117,6074],{"class":5644},[3434,6119,6120],{"class":3451}," ?",[3434,6122,6123],{"class":5655}," '☀️ Ввімкнути світлу'",[3434,6125,6126],{"class":3451}," :",[3434,6128,6129],{"class":5655}," '🌙 Ввімкнути темну'",[3434,6131,6132],{"class":3734},";\n",[3434,6134,6135],{"class":3436,"line":4379},[3434,6136,6137],{"class":3734},"        }\n",[3434,6139,6140,6142,6144],{"class":3436,"line":4384},[3434,6141,4687],{"class":3665},[3434,6143,3728],{"class":3669},[3434,6145,3676],{"class":3665},[3434,6147,6148,6150,6152],{"class":3436,"line":4390},[3434,6149,3964],{"class":3665},[3434,6151,3985],{"class":3669},[3434,6153,3676],{"class":3665},[3434,6155,6156,6158,6160],{"class":3436,"line":4406},[3434,6157,3964],{"class":3665},[3434,6159,3658],{"class":3669},[3434,6161,3676],{"class":3665},[6163,6164,6165,6166,6169],"warning",{},"Важливо розуміти: кожна пара ",[3357,6167,6168],{},"{клас} dark:{клас}"," подвоює кількість класів у HTML. На великому проєкті це може призвести до надзвичайно довгих рядків класів, що важко читати та підтримувати. Саме тому для серйозних проєктів рекомендується підхід із семантичними токенами, описаний у Частині ІІІ.",[3396,6171],{},[3403,6173,6175,6176],{"id":6174},"_22-перемикання-на-клас-custom-variant-dark","2.2. Перемикання на клас: ",[3357,6177,6178],{},"@custom-variant dark",[3353,6180,6181,6182,6184,6185,4726],{},"Щоб ",[3357,6183,3359],{}," реагував не на медіазапит, а на CSS-клас (необхідно для ручного перемикання теми), у Tailwind v4 використовується директива ",[3357,6186,6187],{},"@custom-variant",[3353,6189,6190,6191,4875],{},"Додайте у ваш головний CSS-файл одразу після ",[3357,6192,6193],{},"@import 'tailwindcss'",[3425,6195,6198],{"className":3427,"code":6196,"filename":6197,"language":3429,"meta":3430,"style":3430},"@import 'tailwindcss';\n\n\u002F* Перевизначення поведінки dark: варіанту *\u002F\n\u002F* Тепер dark: спрацьовує, коли будь-який батьківський елемент має клас .dark *\u002F\n@custom-variant dark (&:is(.dark *));\n","src\u002Fstyles\u002Fmain.css",[3357,6199,6200,6210,6214,6219,6224],{"__ignoreMap":3430},[3434,6201,6202,6205,6208],{"class":3436,"line":3437},[3434,6203,6204],{"class":5199},"@import",[3434,6206,6207],{"class":5655}," 'tailwindcss'",[3434,6209,6132],{"class":3451},[3434,6211,6212],{"class":3436,"line":3444},[3434,6213,3495],{"emptyLinePlaceholder":3494},[3434,6215,6216],{"class":3436,"line":3455},[3434,6217,6218],{"class":3440},"\u002F* Перевизначення поведінки dark: варіанту *\u002F\n",[3434,6220,6221],{"class":3436,"line":3485},[3434,6222,6223],{"class":3440},"\u002F* Тепер dark: спрацьовує, коли будь-який батьківський елемент має клас .dark *\u002F\n",[3434,6225,6226,6228],{"class":3436,"line":3491},[3434,6227,6187],{"class":5199},[3434,6229,5527],{"class":3451},[3353,6231,6232,6233,6236],{},"Тепер ",[3357,6234,6235],{},"dark:bg-slate-900"," генерує:",[3425,6238,6240],{"className":3427,"code":6239,"language":3429,"meta":3430,"style":3430},"\u002F* Замість @media — селектор класу *\u002F\n.dark .dark\\:bg-slate-900 {\n    background-color: oklch(0.129 0.042 264.695);\n}\n",[3357,6241,6242,6247,6260,6279],{"__ignoreMap":3430},[3434,6243,6244],{"class":3436,"line":3437},[3434,6245,6246],{"class":3440},"\u002F* Замість @media — селектор класу *\u002F\n",[3434,6248,6249,6251,6254,6256,6258],{"class":3436,"line":3444},[3434,6250,4885],{"class":3447},[3434,6252,6253],{"class":3447}," .dark",[3434,6255,5212],{"class":5211},[3434,6257,5215],{"class":3447},[3434,6259,3452],{"class":3451},[3434,6261,6262,6265,6267,6269,6271,6273,6275,6277],{"class":3436,"line":3455},[3434,6263,6264],{"class":3458},"    background-color",[3434,6266,3462],{"class":3451},[3434,6268,3466],{"class":3465},[3434,6270,3469],{"class":3451},[3434,6272,5230],{"class":3472},[3434,6274,5233],{"class":3472},[3434,6276,5236],{"class":3472},[3434,6278,3482],{"class":3451},[3434,6280,6281],{"class":3436,"line":3485},[3434,6282,3488],{"class":3451},[3353,6284,6285],{},"А HTML виглядає так:",[3425,6287,6289],{"className":3656,"code":6288,"language":3658,"meta":3430,"style":3430},"\u003Chtml class=\"dark\">\n    \u003Cbody>\n        \u003C!-- dark: класи тепер активні -->\n        \u003Cdiv class=\"bg-white dark:bg-slate-900\">\n            Темний фон завдяки .dark на \u003Chtml>\n        \u003C\u002Fdiv>\n    \u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,6290,6291,6306,6314,6319,6333,6344,6352,6360],{"__ignoreMap":3430},[3434,6292,6293,6295,6297,6299,6301,6304],{"class":3436,"line":3437},[3434,6294,3681],{"class":3665},[3434,6296,3658],{"class":3669},[3434,6298,3988],{"class":3458},[3434,6300,3689],{"class":3451},[3434,6302,6303],{"class":3692},"\"dark\"",[3434,6305,3676],{"class":3665},[3434,6307,6308,6310,6312],{"class":3436,"line":3444},[3434,6309,4009],{"class":3665},[3434,6311,3985],{"class":3669},[3434,6313,3676],{"class":3665},[3434,6315,6316],{"class":3436,"line":3455},[3434,6317,6318],{"class":3440},"        \u003C!-- dark: класи тепер активні -->\n",[3434,6320,6321,6323,6325,6327,6329,6331],{"class":3436,"line":3485},[3434,6322,4027],{"class":3665},[3434,6324,4012],{"class":3669},[3434,6326,3988],{"class":3458},[3434,6328,3689],{"class":3451},[3434,6330,5267],{"class":3692},[3434,6332,3676],{"class":3665},[3434,6334,6335,6338,6340,6342],{"class":3436,"line":3491},[3434,6336,6337],{"class":3451},"            Темний фон завдяки .dark на ",[3434,6339,3681],{"class":3665},[3434,6341,3658],{"class":3669},[3434,6343,3676],{"class":3665},[3434,6345,6346,6348,6350],{"class":3436,"line":3498},[3434,6347,4677],{"class":3665},[3434,6349,4012],{"class":3669},[3434,6351,3676],{"class":3665},[3434,6353,6354,6356,6358],{"class":3436,"line":3504},[3434,6355,4687],{"class":3665},[3434,6357,3985],{"class":3669},[3434,6359,3676],{"class":3665},[3434,6361,6362,6364,6366],{"class":3436,"line":3511},[3434,6363,3964],{"class":3665},[3434,6365,3658],{"class":3669},[3434,6367,3676],{"class":3665},[3353,6369,6370,6371,4875],{},"Для перемикання теми — маніпулюємо класом на ",[3357,6372,5106],{},[3425,6374,6378],{"className":6375,"code":6376,"language":6377,"meta":3430,"style":3430},"language-javascript shiki shiki-themes light-plus dark-plus dark-plus","\u002F\u002F Увімкнути темну тему\ndocument.documentElement.classList.add('dark')\n\n\u002F\u002F Вимкнути темну тему\ndocument.documentElement.classList.remove('dark')\n\n\u002F\u002F Перемикати\ndocument.documentElement.classList.toggle('dark')\n","javascript",[3357,6379,6380,6385,6410,6414,6419,6442,6446,6451],{"__ignoreMap":3430},[3434,6381,6382],{"class":3436,"line":3437},[3434,6383,6384],{"class":3440},"\u002F\u002F Увімкнути темну тему\n",[3434,6386,6387,6389,6391,6394,6396,6398,6400,6403,6405,6407],{"class":3436,"line":3444},[3434,6388,5645],{"class":5644},[3434,6390,4726],{"class":3451},[3434,6392,6393],{"class":5644},"documentElement",[3434,6395,4726],{"class":3451},[3434,6397,5662],{"class":5644},[3434,6399,4726],{"class":3451},[3434,6401,6402],{"class":3465},"add",[3434,6404,3469],{"class":3451},[3434,6406,5672],{"class":5655},[3434,6408,6409],{"class":3451},")\n",[3434,6411,6412],{"class":3436,"line":3455},[3434,6413,3495],{"emptyLinePlaceholder":3494},[3434,6415,6416],{"class":3436,"line":3485},[3434,6417,6418],{"class":3440},"\u002F\u002F Вимкнути темну тему\n",[3434,6420,6421,6423,6425,6427,6429,6431,6433,6436,6438,6440],{"class":3436,"line":3491},[3434,6422,5645],{"class":5644},[3434,6424,4726],{"class":3451},[3434,6426,6393],{"class":5644},[3434,6428,4726],{"class":3451},[3434,6430,5662],{"class":5644},[3434,6432,4726],{"class":3451},[3434,6434,6435],{"class":3465},"remove",[3434,6437,3469],{"class":3451},[3434,6439,5672],{"class":5655},[3434,6441,6409],{"class":3451},[3434,6443,6444],{"class":3436,"line":3498},[3434,6445,3495],{"emptyLinePlaceholder":3494},[3434,6447,6448],{"class":3436,"line":3504},[3434,6449,6450],{"class":3440},"\u002F\u002F Перемикати\n",[3434,6452,6453,6455,6457,6459,6461,6463,6465,6467,6469,6471],{"class":3436,"line":3511},[3434,6454,5645],{"class":5644},[3434,6456,4726],{"class":3451},[3434,6458,6393],{"class":5644},[3434,6460,4726],{"class":3451},[3434,6462,5662],{"class":5644},[3434,6464,4726],{"class":3451},[3434,6466,5667],{"class":3465},[3434,6468,3469],{"class":3451},[3434,6470,5672],{"class":5655},[3434,6472,6409],{"class":3451},[3550,6474,6475,6476,6478,6479,6482,6483,6485,6486,6488],{},"Використання класу на ",[3357,6477,5106],{}," (а не на ",[3357,6480,6481],{},"\u003Cbody>"," чи іншому елементі) є загальноприйнятою практикою. Це дозволяє стилізувати ",[3357,6484,5106],{}," та ",[3357,6487,6481],{}," теж, а також гарантує, що темна тема охоплює абсолютно всі елементи сторінки.",[3396,6490],{},[3403,6492,6494,6495],{"id":6493},"_23-живий-приклад-базова-темна-тема-через-dark","2.3. Живий приклад: базова темна тема через ",[3357,6496,3359],{},[3353,6498,6499],{},"Подивімося на мінімальний повний приклад — проста картка з підтримкою темної теми через клас:",[3651,6501,6502],{":tailwind":3653},[3425,6503,6505],{"className":3656,"code":6504,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\u002F4.0\">\u003C\u002Fscript>\n    \u003Cstyle type=\"text\u002Ftailwindcss\">\n        @custom-variant dark (&:is(.dark *));\n    \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"bg-slate-100 dark:bg-slate-950 min-h-screen flex items-center justify-center p-8 transition-colors duration-300\"\n      style=\"font-family: system-ui, sans-serif;\">\n\n    \u003C!-- Перемикач теми -->\n    \u003Cbutton\n        id=\"theme-toggle\"\n        onclick=\"document.documentElement.classList.toggle('dark')\"\n        class=\"fixed top-4 right-4 size-10 rounded-full bg-white dark:bg-slate-800\n               border border-slate-200 dark:border-slate-700\n               flex items-center justify-center text-lg\n               hover:shadow-md transition-all\"\n        aria-label=\"Перемкнути тему\"\n    >\n        \u003Cspan class=\"dark:hidden\">🌙\u003C\u002Fspan>\n        \u003Cspan class=\"hidden dark:block\">☀️\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n\n    \u003C!-- Картка -->\n    \u003Cdiv class=\"bg-white dark:bg-slate-900 rounded-2xl shadow-lg dark:shadow-slate-900\u002F50\n                border border-slate-100 dark:border-slate-800 p-6 max-w-sm w-full\n                transition-colors duration-300\">\n\n        \u003Cdiv class=\"flex items-center gap-3 mb-4\">\n            \u003Cdiv class=\"size-10 rounded-xl bg-indigo-600 dark:bg-indigo-500\n                        flex items-center justify-center text-white font-bold text-sm\">\n                IK\n            \u003C\u002Fdiv>\n            \u003Cdiv>\n                \u003Cp class=\"text-sm font-bold text-slate-900 dark:text-slate-50\">Іван Кравченко\u003C\u002Fp>\n                \u003Cp class=\"text-xs text-slate-500 dark:text-slate-400\">Frontend Developer\u003C\u002Fp>\n            \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n\n        \u003Cp class=\"text-sm text-slate-600 dark:text-slate-300 leading-relaxed\">\n            Розробляю інтерфейси на React та Tailwind CSS. Захоплений сучасним CSS та дизайн-системами.\n        \u003C\u002Fp>\n\n        \u003Cdiv class=\"flex gap-2 mt-4\">\n            \u003Cspan class=\"px-2 py-0.5 bg-indigo-100 dark:bg-indigo-900\u002F50\n                         text-indigo-700 dark:text-indigo-300\n                         text-xs font-semibold rounded-md\">React\u003C\u002Fspan>\n            \u003Cspan class=\"px-2 py-0.5 bg-violet-100 dark:bg-violet-900\u002F50\n                         text-violet-700 dark:text-violet-300\n                         text-xs font-semibold rounded-md\">Tailwind\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n\n        \u003Cbutton class=\"mt-5 w-full py-2 bg-indigo-600 hover:bg-indigo-700\n                       dark:bg-indigo-500 dark:hover:bg-indigo-400\n                       text-white text-sm font-semibold rounded-xl\n                       transition-colors\">\n            Зв'язатися\n        \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,6506,6507,6517,6531,6539,6553,6572,6588,6595,6603,6611,6624,6636,6640,6645,6652,6662,6692,6702,6707,6712,6717,6727,6732,6756,6780,6788,6792,6797,6810,6815,6822,6826,6841,6854,6861,6866,6874,6882,6906,6930,6938,6946,6950,6965,6970,6978,6982,6997,7010,7015,7030,7043,7048,7062,7070,7074,7087,7092,7097,7104,7109,7117,7125,7129,7137],{"__ignoreMap":3430},[3434,6508,6509,6511,6513,6515],{"class":3436,"line":3437},[3434,6510,3666],{"class":3665},[3434,6512,3670],{"class":3669},[3434,6514,3673],{"class":3458},[3434,6516,3676],{"class":3665},[3434,6518,6519,6521,6523,6525,6527,6529],{"class":3436,"line":3444},[3434,6520,3681],{"class":3665},[3434,6522,3658],{"class":3669},[3434,6524,3686],{"class":3458},[3434,6526,3689],{"class":3451},[3434,6528,3693],{"class":3692},[3434,6530,3676],{"class":3665},[3434,6532,6533,6535,6537],{"class":3436,"line":3455},[3434,6534,3681],{"class":3665},[3434,6536,3702],{"class":3669},[3434,6538,3676],{"class":3665},[3434,6540,6541,6543,6545,6547,6549,6551],{"class":3436,"line":3485},[3434,6542,4009],{"class":3665},[3434,6544,3711],{"class":3669},[3434,6546,3714],{"class":3458},[3434,6548,3689],{"class":3451},[3434,6550,3719],{"class":3692},[3434,6552,3676],{"class":3665},[3434,6554,6555,6557,6559,6561,6563,6566,6568,6570],{"class":3436,"line":3491},[3434,6556,4009],{"class":3665},[3434,6558,3728],{"class":3669},[3434,6560,3731],{"class":3458},[3434,6562,3689],{"class":3734},[3434,6564,6565],{"class":3692},"\"https:\u002F\u002Fcdn.tailwindcss.com\u002F4.0\"",[3434,6567,3740],{"class":3665},[3434,6569,3728],{"class":3669},[3434,6571,3676],{"class":3665},[3434,6573,6574,6576,6578,6581,6583,6586],{"class":3436,"line":3498},[3434,6575,4009],{"class":3665},[3434,6577,3776],{"class":3669},[3434,6579,6580],{"class":3458}," type",[3434,6582,3689],{"class":3734},[3434,6584,6585],{"class":3692},"\"text\u002Ftailwindcss\"",[3434,6587,3676],{"class":3665},[3434,6589,6590,6593],{"class":3436,"line":3504},[3434,6591,6592],{"class":5199},"        @custom-variant",[3434,6594,5527],{"class":3734},[3434,6596,6597,6599,6601],{"class":3436,"line":3511},[3434,6598,4687],{"class":3665},[3434,6600,3776],{"class":3669},[3434,6602,3676],{"class":3665},[3434,6604,6605,6607,6609],{"class":3436,"line":3529},[3434,6606,3964],{"class":3665},[3434,6608,3702],{"class":3669},[3434,6610,3676],{"class":3665},[3434,6612,6613,6615,6617,6619,6621],{"class":3436,"line":3810},[3434,6614,3681],{"class":3665},[3434,6616,3985],{"class":3669},[3434,6618,3988],{"class":3458},[3434,6620,3689],{"class":3451},[3434,6622,6623],{"class":3692},"\"bg-slate-100 dark:bg-slate-950 min-h-screen flex items-center justify-center p-8 transition-colors duration-300\"\n",[3434,6625,6626,6629,6631,6634],{"class":3436,"line":3816},[3434,6627,6628],{"class":3458},"      style",[3434,6630,3689],{"class":3451},[3434,6632,6633],{"class":3692},"\"font-family: system-ui, sans-serif;\"",[3434,6635,3676],{"class":3665},[3434,6637,6638],{"class":3436,"line":3821},[3434,6639,3495],{"emptyLinePlaceholder":3494},[3434,6641,6642],{"class":3436,"line":3829},[3434,6643,6644],{"class":3440},"    \u003C!-- Перемикач теми -->\n",[3434,6646,6647,6649],{"class":3436,"line":3835},[3434,6648,4009],{"class":3665},[3434,6650,6651],{"class":3669},"button\n",[3434,6653,6654,6657,6659],{"class":3436,"line":3857},[3434,6655,6656],{"class":3458},"        id",[3434,6658,3689],{"class":3451},[3434,6660,6661],{"class":3692},"\"theme-toggle\"\n",[3434,6663,6664,6667,6669,6671,6673,6675,6677,6679,6681,6683,6685,6687,6689],{"class":3436,"line":3862},[3434,6665,6666],{"class":3458},"        onclick",[3434,6668,3689],{"class":3451},[3434,6670,5641],{"class":3692},[3434,6672,5645],{"class":5644},[3434,6674,4726],{"class":3692},[3434,6676,6393],{"class":5644},[3434,6678,4726],{"class":3692},[3434,6680,5662],{"class":5644},[3434,6682,4726],{"class":3692},[3434,6684,5667],{"class":3465},[3434,6686,3469],{"class":3692},[3434,6688,5672],{"class":5655},[3434,6690,6691],{"class":3692},")\"\n",[3434,6693,6694,6697,6699],{"class":3436,"line":3867},[3434,6695,6696],{"class":3458},"        class",[3434,6698,3689],{"class":3451},[3434,6700,6701],{"class":3692},"\"fixed top-4 right-4 size-10 rounded-full bg-white dark:bg-slate-800\n",[3434,6703,6704],{"class":3436,"line":3873},[3434,6705,6706],{"class":3692},"               border border-slate-200 dark:border-slate-700\n",[3434,6708,6709],{"class":3436,"line":3881},[3434,6710,6711],{"class":3692},"               flex items-center justify-center text-lg\n",[3434,6713,6714],{"class":3436,"line":3898},[3434,6715,6716],{"class":3692},"               hover:shadow-md transition-all\"\n",[3434,6718,6719,6722,6724],{"class":3436,"line":3903},[3434,6720,6721],{"class":3458},"        aria-label",[3434,6723,3689],{"class":3451},[3434,6725,6726],{"class":3692},"\"Перемкнути тему\"\n",[3434,6728,6729],{"class":3436,"line":3911},[3434,6730,6731],{"class":3665},"    >\n",[3434,6733,6734,6736,6738,6740,6742,6745,6747,6750,6752,6754],{"class":3436,"line":3927},[3434,6735,4027],{"class":3665},[3434,6737,3434],{"class":3669},[3434,6739,3988],{"class":3458},[3434,6741,3689],{"class":3451},[3434,6743,6744],{"class":3692},"\"dark:hidden\"",[3434,6746,4039],{"class":3665},[3434,6748,6749],{"class":3451},"🌙",[3434,6751,3964],{"class":3665},[3434,6753,3434],{"class":3669},[3434,6755,3676],{"class":3665},[3434,6757,6758,6760,6762,6764,6766,6769,6771,6774,6776,6778],{"class":3436,"line":3932},[3434,6759,4027],{"class":3665},[3434,6761,3434],{"class":3669},[3434,6763,3988],{"class":3458},[3434,6765,3689],{"class":3451},[3434,6767,6768],{"class":3692},"\"hidden dark:block\"",[3434,6770,4039],{"class":3665},[3434,6772,6773],{"class":3451},"☀️",[3434,6775,3964],{"class":3665},[3434,6777,3434],{"class":3669},[3434,6779,3676],{"class":3665},[3434,6781,6782,6784,6786],{"class":3436,"line":3940},[3434,6783,4687],{"class":3665},[3434,6785,4342],{"class":3669},[3434,6787,3676],{"class":3665},[3434,6789,6790],{"class":3436,"line":3956},[3434,6791,3495],{"emptyLinePlaceholder":3494},[3434,6793,6794],{"class":3436,"line":3961},[3434,6795,6796],{"class":3440},"    \u003C!-- Картка -->\n",[3434,6798,6799,6801,6803,6805,6807],{"class":3436,"line":3971},[3434,6800,4009],{"class":3665},[3434,6802,4012],{"class":3669},[3434,6804,3988],{"class":3458},[3434,6806,3689],{"class":3451},[3434,6808,6809],{"class":3692},"\"bg-white dark:bg-slate-900 rounded-2xl shadow-lg dark:shadow-slate-900\u002F50\n",[3434,6811,6812],{"class":3436,"line":3980},[3434,6813,6814],{"class":3692},"                border border-slate-100 dark:border-slate-800 p-6 max-w-sm w-full\n",[3434,6816,6817,6820],{"class":3436,"line":4006},[3434,6818,6819],{"class":3692},"                transition-colors duration-300\"",[3434,6821,3676],{"class":3665},[3434,6823,6824],{"class":3436,"line":4024},[3434,6825,3495],{"emptyLinePlaceholder":3494},[3434,6827,6828,6830,6832,6834,6836,6839],{"class":3436,"line":4051},[3434,6829,4027],{"class":3665},[3434,6831,4012],{"class":3669},[3434,6833,3988],{"class":3458},[3434,6835,3689],{"class":3451},[3434,6837,6838],{"class":3692},"\"flex items-center gap-3 mb-4\"",[3434,6840,3676],{"class":3665},[3434,6842,6843,6845,6847,6849,6851],{"class":3436,"line":4057},[3434,6844,4082],{"class":3665},[3434,6846,4012],{"class":3669},[3434,6848,3988],{"class":3458},[3434,6850,3689],{"class":3451},[3434,6852,6853],{"class":3692},"\"size-10 rounded-xl bg-indigo-600 dark:bg-indigo-500\n",[3434,6855,6856,6859],{"class":3436,"line":4073},[3434,6857,6858],{"class":3692},"                        flex items-center justify-center text-white font-bold text-sm\"",[3434,6860,3676],{"class":3665},[3434,6862,6863],{"class":3436,"line":4079},[3434,6864,6865],{"class":3451},"                IK\n",[3434,6867,6868,6870,6872],{"class":3436,"line":4096},[3434,6869,4372],{"class":3665},[3434,6871,4012],{"class":3669},[3434,6873,3676],{"class":3665},[3434,6875,6876,6878,6880],{"class":3436,"line":4113},[3434,6877,4082],{"class":3665},[3434,6879,4012],{"class":3669},[3434,6881,3676],{"class":3665},[3434,6883,6884,6886,6888,6890,6892,6895,6897,6900,6902,6904],{"class":3436,"line":4119},[3434,6885,4099],{"class":3665},[3434,6887,3353],{"class":3669},[3434,6889,3988],{"class":3458},[3434,6891,3689],{"class":3451},[3434,6893,6894],{"class":3692},"\"text-sm font-bold text-slate-900 dark:text-slate-50\"",[3434,6896,4039],{"class":3665},[3434,6898,6899],{"class":3451},"Іван Кравченко",[3434,6901,3964],{"class":3665},[3434,6903,3353],{"class":3669},[3434,6905,3676],{"class":3665},[3434,6907,6908,6910,6912,6914,6916,6919,6921,6924,6926,6928],{"class":3436,"line":4129},[3434,6909,4099],{"class":3665},[3434,6911,3353],{"class":3669},[3434,6913,3988],{"class":3458},[3434,6915,3689],{"class":3451},[3434,6917,6918],{"class":3692},"\"text-xs text-slate-500 dark:text-slate-400\"",[3434,6920,4039],{"class":3665},[3434,6922,6923],{"class":3451},"Frontend Developer",[3434,6925,3964],{"class":3665},[3434,6927,3353],{"class":3669},[3434,6929,3676],{"class":3665},[3434,6931,6932,6934,6936],{"class":3436,"line":4145},[3434,6933,4372],{"class":3665},[3434,6935,4012],{"class":3669},[3434,6937,3676],{"class":3665},[3434,6939,6940,6942,6944],{"class":3436,"line":4162},[3434,6941,4677],{"class":3665},[3434,6943,4012],{"class":3669},[3434,6945,3676],{"class":3665},[3434,6947,6948],{"class":3436,"line":4168},[3434,6949,3495],{"emptyLinePlaceholder":3494},[3434,6951,6952,6954,6956,6958,6960,6963],{"class":3436,"line":4178},[3434,6953,4027],{"class":3665},[3434,6955,3353],{"class":3669},[3434,6957,3988],{"class":3458},[3434,6959,3689],{"class":3451},[3434,6961,6962],{"class":3692},"\"text-sm text-slate-600 dark:text-slate-300 leading-relaxed\"",[3434,6964,3676],{"class":3665},[3434,6966,6967],{"class":3436,"line":4187},[3434,6968,6969],{"class":3451},"            Розробляю інтерфейси на React та Tailwind CSS. Захоплений сучасним CSS та дизайн-системами.\n",[3434,6971,6972,6974,6976],{"class":3436,"line":4213},[3434,6973,4677],{"class":3665},[3434,6975,3353],{"class":3669},[3434,6977,3676],{"class":3665},[3434,6979,6980],{"class":3436,"line":4238},[3434,6981,3495],{"emptyLinePlaceholder":3494},[3434,6983,6984,6986,6988,6990,6992,6995],{"class":3436,"line":4247},[3434,6985,4027],{"class":3665},[3434,6987,4012],{"class":3669},[3434,6989,3988],{"class":3458},[3434,6991,3689],{"class":3451},[3434,6993,6994],{"class":3692},"\"flex gap-2 mt-4\"",[3434,6996,3676],{"class":3665},[3434,6998,6999,7001,7003,7005,7007],{"class":3436,"line":4256},[3434,7000,4082],{"class":3665},[3434,7002,3434],{"class":3669},[3434,7004,3988],{"class":3458},[3434,7006,3689],{"class":3451},[3434,7008,7009],{"class":3692},"\"px-2 py-0.5 bg-indigo-100 dark:bg-indigo-900\u002F50\n",[3434,7011,7012],{"class":3436,"line":4272},[3434,7013,7014],{"class":3692},"                         text-indigo-700 dark:text-indigo-300\n",[3434,7016,7017,7020,7022,7024,7026,7028],{"class":3436,"line":4288},[3434,7018,7019],{"class":3692},"                         text-xs font-semibold rounded-md\"",[3434,7021,4039],{"class":3665},[3434,7023,2013],{"class":3451},[3434,7025,3964],{"class":3665},[3434,7027,3434],{"class":3669},[3434,7029,3676],{"class":3665},[3434,7031,7032,7034,7036,7038,7040],{"class":3436,"line":4319},[3434,7033,4082],{"class":3665},[3434,7035,3434],{"class":3669},[3434,7037,3988],{"class":3458},[3434,7039,3689],{"class":3451},[3434,7041,7042],{"class":3692},"\"px-2 py-0.5 bg-violet-100 dark:bg-violet-900\u002F50\n",[3434,7044,7045],{"class":3436,"line":4328},[3434,7046,7047],{"class":3692},"                         text-violet-700 dark:text-violet-300\n",[3434,7049,7050,7052,7054,7056,7058,7060],{"class":3436,"line":4337},[3434,7051,7019],{"class":3692},[3434,7053,4039],{"class":3665},[3434,7055,3282],{"class":3451},[3434,7057,3964],{"class":3665},[3434,7059,3434],{"class":3669},[3434,7061,3676],{"class":3665},[3434,7063,7064,7066,7068],{"class":3436,"line":4354},[3434,7065,4677],{"class":3665},[3434,7067,4012],{"class":3669},[3434,7069,3676],{"class":3665},[3434,7071,7072],{"class":3436,"line":4360},[3434,7073,3495],{"emptyLinePlaceholder":3494},[3434,7075,7076,7078,7080,7082,7084],{"class":3436,"line":4369},[3434,7077,4027],{"class":3665},[3434,7079,4342],{"class":3669},[3434,7081,3988],{"class":3458},[3434,7083,3689],{"class":3451},[3434,7085,7086],{"class":3692},"\"mt-5 w-full py-2 bg-indigo-600 hover:bg-indigo-700\n",[3434,7088,7089],{"class":3436,"line":4379},[3434,7090,7091],{"class":3692},"                       dark:bg-indigo-500 dark:hover:bg-indigo-400\n",[3434,7093,7094],{"class":3436,"line":4384},[3434,7095,7096],{"class":3692},"                       text-white text-sm font-semibold rounded-xl\n",[3434,7098,7099,7102],{"class":3436,"line":4390},[3434,7100,7101],{"class":3692},"                       transition-colors\"",[3434,7103,3676],{"class":3665},[3434,7105,7106],{"class":3436,"line":4406},[3434,7107,7108],{"class":3451},"            Зв'язатися\n",[3434,7110,7111,7113,7115],{"class":3436,"line":4422},[3434,7112,4677],{"class":3665},[3434,7114,4342],{"class":3669},[3434,7116,3676],{"class":3665},[3434,7118,7119,7121,7123],{"class":3436,"line":4428},[3434,7120,4687],{"class":3665},[3434,7122,4012],{"class":3669},[3434,7124,3676],{"class":3665},[3434,7126,7127],{"class":3436,"line":4437},[3434,7128,3495],{"emptyLinePlaceholder":3494},[3434,7130,7131,7133,7135],{"class":3436,"line":4452},[3434,7132,3964],{"class":3665},[3434,7134,3985],{"class":3669},[3434,7136,3676],{"class":3665},[3434,7138,7139,7141,7143],{"class":3436,"line":4467},[3434,7140,3964],{"class":3665},[3434,7142,3658],{"class":3669},[3434,7144,3676],{"class":3665},[3353,7146,7147,7148,7150,7151,7153,7154,7156],{},"Натиснувши кнопку 🌙, ви перемикаєте клас ",[3357,7149,4885],{}," на ",[3357,7152,5106],{}," — і вся картка змінює зовнішній вигляд. Зверніть увагу, скільки ",[3357,7155,3359],{},"-пар у кожному елементі. Для однієї картки це ще прийнятно, але для цілої сторінки — код стає важко підтримуваним.",[3396,7158],{},[3348,7160,7162],{"id":7161},"частина-ііі-система-семантичних-токенів-правильний-підхід","Частина ІІІ. Система семантичних токенів: правильний підхід",[3403,7164,7166],{"id":7165},"_31-архітектура-токенів","3.1. Архітектура токенів",[3353,7168,7169],{},"Зріла система токенів складається з трьох рівнів:",[7171,7172,7173],"mermaid",{},[3425,7174,7177],{"className":7175,"code":7176,"language":7171,"meta":3430,"style":3430},"language-mermaid shiki shiki-themes light-plus dark-plus dark-plus","graph TD\n    A[\"Рівень 1:\u003Cbr\u002F>Примітивні токени\u003Cbr\u002F>(Palette)\"] --> B[\"Рівень 2:\u003Cbr\u002F>Семантичні токени\u003Cbr\u002F>(Semantic)\"]\n    B --> C[\"Рівень 3:\u003Cbr\u002F>Компонентні токени\u003Cbr\u002F>(Component)\"]\n\n    A1[\"--color-indigo-500\u003Cbr\u002F>--color-slate-900\u003Cbr\u002F>--color-slate-50\"] --> A\n    B1[\"--color-text-primary\u003Cbr\u002F>--color-bg-base\u003Cbr\u002F>--color-accent\"] --> B\n    C1[\"--btn-bg\u003Cbr\u002F>--card-border\u003Cbr\u002F>--input-focus-ring\"] --> C\n\n    style A fill:#3b82f6,color:#fff\n    style B fill:#f59e0b,color:#fff\n    style C fill:#64748b,color:#fff\n",[3357,7178,7179,7184,7189,7194,7198,7203,7208,7213,7217,7222,7227],{"__ignoreMap":3430},[3434,7180,7181],{"class":3436,"line":3437},[3434,7182,7183],{},"graph TD\n",[3434,7185,7186],{"class":3436,"line":3444},[3434,7187,7188],{},"    A[\"Рівень 1:\u003Cbr\u002F>Примітивні токени\u003Cbr\u002F>(Palette)\"] --> B[\"Рівень 2:\u003Cbr\u002F>Семантичні токени\u003Cbr\u002F>(Semantic)\"]\n",[3434,7190,7191],{"class":3436,"line":3455},[3434,7192,7193],{},"    B --> C[\"Рівень 3:\u003Cbr\u002F>Компонентні токени\u003Cbr\u002F>(Component)\"]\n",[3434,7195,7196],{"class":3436,"line":3485},[3434,7197,3495],{"emptyLinePlaceholder":3494},[3434,7199,7200],{"class":3436,"line":3491},[3434,7201,7202],{},"    A1[\"--color-indigo-500\u003Cbr\u002F>--color-slate-900\u003Cbr\u002F>--color-slate-50\"] --> A\n",[3434,7204,7205],{"class":3436,"line":3498},[3434,7206,7207],{},"    B1[\"--color-text-primary\u003Cbr\u002F>--color-bg-base\u003Cbr\u002F>--color-accent\"] --> B\n",[3434,7209,7210],{"class":3436,"line":3504},[3434,7211,7212],{},"    C1[\"--btn-bg\u003Cbr\u002F>--card-border\u003Cbr\u002F>--input-focus-ring\"] --> C\n",[3434,7214,7215],{"class":3436,"line":3511},[3434,7216,3495],{"emptyLinePlaceholder":3494},[3434,7218,7219],{"class":3436,"line":3529},[3434,7220,7221],{},"    style A fill:#3b82f6,color:#fff\n",[3434,7223,7224],{"class":3436,"line":3810},[3434,7225,7226],{},"    style B fill:#f59e0b,color:#fff\n",[3434,7228,7229],{"class":3436,"line":3816},[3434,7230,7231],{},"    style C fill:#64748b,color:#fff\n",[3353,7233,7234,7237,7238,7240],{},[3365,7235,7236],{},"Рівень 1: Примітивна палітра"," — всі доступні кольори у всіх відтінках. Це «словник» кольорів системи. Визначається один раз у ",[3357,7239,3393],{}," і не змінюється між темами.",[3353,7242,7243,7246,7247,7250,7251,7250,7254,7257],{},[3365,7244,7245],{},"Рівень 2: Семантичні токени"," — аліаси з описовими іменами (",[3357,7248,7249],{},"text-primary",", ",[3357,7252,7253],{},"bg-surface",[3357,7255,7256],{},"border-default","). Саме вони змінюються при перемиканні теми.",[3353,7259,7260,7263,7264,7250,7267,7270],{},[3365,7261,7262],{},"Рівень 3: Компонентні токени"," — специфічні для компонентів (",[3357,7265,7266],{},"--btn-primary-bg",[3357,7268,7269],{},"--card-shadow","). Опціональний рівень для складних систем.",[3353,7272,7273],{},"Для більшості проєктів достатньо перших двох рівнів.",[3396,7275],{},[3403,7277,7279,7280],{"id":7278},"_32-визначення-примітивної-палітри-в-theme","3.2. Визначення примітивної палітри в ",[3357,7281,3393],{},[3353,7283,7284,7285,7287],{},"Розпочнемо з побудови примітивної палітри. Всі кольори визначаємо у ",[3357,7286,3393],{}," — так Tailwind автоматично генерує для них utility-класи:",[3425,7289,7292],{"className":3427,"code":7290,"filename":7291,"language":3429,"meta":3430,"style":3430},"@theme {\n    \u002F* ===== ПРИМІТИВНА ПАЛІТРА ===== *\u002F\n\n    \u002F* Нейтральна шкала (основа для тексту, фонів, рамок) *\u002F\n    --color-neutral-50:  oklch(0.984 0.003 247.858);\n    --color-neutral-100: oklch(0.961 0.005 264.531);\n    --color-neutral-200: oklch(0.929 0.008 264.542);\n    --color-neutral-300: oklch(0.872 0.012 264.052);\n    --color-neutral-400: oklch(0.704 0.026 264.436);\n    --color-neutral-500: oklch(0.554 0.034 264.364);\n    --color-neutral-600: oklch(0.446 0.030 264.139);\n    --color-neutral-700: oklch(0.373 0.034 259.733);\n    --color-neutral-800: oklch(0.279 0.029 256.848);\n    --color-neutral-900: oklch(0.208 0.042 265.755);\n    --color-neutral-950: oklch(0.130 0.028 261.692);\n\n    \u002F* Акцентний колір: Indigo (бренд) *\u002F\n    --color-indigo-50:  oklch(0.962 0.018 272.314);\n    --color-indigo-100: oklch(0.930 0.034 272.788);\n    --color-indigo-200: oklch(0.870 0.065 274.039);\n    --color-indigo-300: oklch(0.785 0.115 274.713);\n    --color-indigo-400: oklch(0.673 0.182 276.935);\n    --color-indigo-500: oklch(0.585 0.233 277.117);\n    --color-indigo-600: oklch(0.511 0.262 276.966);\n    --color-indigo-700: oklch(0.457 0.240 277.023);\n    --color-indigo-800: oklch(0.398 0.195 277.366);\n    --color-indigo-900: oklch(0.359 0.144 278.697);\n    --color-indigo-950: oklch(0.257 0.090 281.288);\n\n    \u002F* Допоміжні кольори для статусів *\u002F\n    --color-success-400: oklch(0.748 0.160 145.439);\n    --color-success-500: oklch(0.652 0.168 145.497);\n    --color-success-600: oklch(0.540 0.145 146.748);\n    --color-success-100: oklch(0.962 0.044 156.743);\n    --color-success-900: oklch(0.270 0.085 154.724);\n\n    --color-warning-400: oklch(0.854 0.163 91.936);\n    --color-warning-500: oklch(0.769 0.188 70.080);\n    --color-warning-100: oklch(0.973 0.071 103.193);\n    --color-warning-900: oklch(0.476 0.144 67.110);\n\n    --color-error-400: oklch(0.704 0.191 22.182);\n    --color-error-500: oklch(0.637 0.237 25.331);\n    --color-error-600: oklch(0.577 0.245 27.325);\n    --color-error-100: oklch(0.936 0.032 17.717);\n    --color-error-900: oklch(0.391 0.155 27.518);\n}\n","src\u002Fstyles\u002Ftheme\u002Fcolors.css",[3357,7293,7294,7300,7305,7309,7314,7331,7351,7371,7391,7411,7431,7451,7471,7492,7512,7533,7537,7542,7563,7582,7603,7623,7644,7661,7681,7701,7721,7742,7763,7767,7772,7793,7813,7833,7853,7874,7878,7899,7920,7941,7961,7965,7984,8005,8026,8046,8066],{"__ignoreMap":3430},[3434,7295,7296,7298],{"class":3436,"line":3437},[3434,7297,3393],{"class":5199},[3434,7299,3452],{"class":3451},[3434,7301,7302],{"class":3436,"line":3444},[3434,7303,7304],{"class":3440},"    \u002F* ===== ПРИМІТИВНА ПАЛІТРА ===== *\u002F\n",[3434,7306,7307],{"class":3436,"line":3455},[3434,7308,3495],{"emptyLinePlaceholder":3494},[3434,7310,7311],{"class":3436,"line":3485},[3434,7312,7313],{"class":3440},"    \u002F* Нейтральна шкала (основа для тексту, фонів, рамок) *\u002F\n",[3434,7315,7316,7319,7321,7323,7325,7327,7329],{"class":3436,"line":3491},[3434,7317,7318],{"class":3451},"    --color-neutral-50:  oklch(0",[3434,7320,4796],{"class":3447},[3434,7322,4757],{"class":3451},[3434,7324,4801],{"class":3447},[3434,7326,4804],{"class":3451},[3434,7328,4807],{"class":3447},[3434,7330,3482],{"class":3451},[3434,7332,7333,7336,7339,7341,7344,7346,7349],{"class":3436,"line":3498},[3434,7334,7335],{"class":3451},"    --color-neutral-100: oklch(0",[3434,7337,7338],{"class":3447},".961",[3434,7340,4757],{"class":3451},[3434,7342,7343],{"class":3447},".005",[3434,7345,4783],{"class":3451},[3434,7347,7348],{"class":3447},".531",[3434,7350,3482],{"class":3451},[3434,7352,7353,7356,7359,7361,7364,7366,7369],{"class":3436,"line":3504},[3434,7354,7355],{"class":3451},"    --color-neutral-200: oklch(0",[3434,7357,7358],{"class":3447},".929",[3434,7360,4757],{"class":3451},[3434,7362,7363],{"class":3447},".008",[3434,7365,4783],{"class":3451},[3434,7367,7368],{"class":3447},".542",[3434,7370,3482],{"class":3451},[3434,7372,7373,7376,7379,7381,7384,7386,7389],{"class":3436,"line":3511},[3434,7374,7375],{"class":3451},"    --color-neutral-300: oklch(0",[3434,7377,7378],{"class":3447},".872",[3434,7380,4757],{"class":3451},[3434,7382,7383],{"class":3447},".012",[3434,7385,4783],{"class":3451},[3434,7387,7388],{"class":3447},".052",[3434,7390,3482],{"class":3451},[3434,7392,7393,7396,7399,7401,7404,7406,7409],{"class":3436,"line":3529},[3434,7394,7395],{"class":3451},"    --color-neutral-400: oklch(0",[3434,7397,7398],{"class":3447},".704",[3434,7400,4757],{"class":3451},[3434,7402,7403],{"class":3447},".026",[3434,7405,4783],{"class":3451},[3434,7407,7408],{"class":3447},".436",[3434,7410,3482],{"class":3451},[3434,7412,7413,7416,7419,7421,7424,7426,7429],{"class":3436,"line":3810},[3434,7414,7415],{"class":3451},"    --color-neutral-500: oklch(0",[3434,7417,7418],{"class":3447},".554",[3434,7420,4757],{"class":3451},[3434,7422,7423],{"class":3447},".034",[3434,7425,4783],{"class":3451},[3434,7427,7428],{"class":3447},".364",[3434,7430,3482],{"class":3451},[3434,7432,7433,7436,7439,7441,7444,7446,7449],{"class":3436,"line":3816},[3434,7434,7435],{"class":3451},"    --color-neutral-600: oklch(0",[3434,7437,7438],{"class":3447},".446",[3434,7440,4757],{"class":3451},[3434,7442,7443],{"class":3447},".030",[3434,7445,4783],{"class":3451},[3434,7447,7448],{"class":3447},".139",[3434,7450,3482],{"class":3451},[3434,7452,7453,7456,7459,7461,7463,7466,7469],{"class":3436,"line":3821},[3434,7454,7455],{"class":3451},"    --color-neutral-700: oklch(0",[3434,7457,7458],{"class":3447},".373",[3434,7460,4757],{"class":3451},[3434,7462,7423],{"class":3447},[3434,7464,7465],{"class":3451}," 259",[3434,7467,7468],{"class":3447},".733",[3434,7470,3482],{"class":3451},[3434,7472,7473,7476,7479,7481,7484,7487,7490],{"class":3436,"line":3829},[3434,7474,7475],{"class":3451},"    --color-neutral-800: oklch(0",[3434,7477,7478],{"class":3447},".279",[3434,7480,4757],{"class":3451},[3434,7482,7483],{"class":3447},".029",[3434,7485,7486],{"class":3451}," 256",[3434,7488,7489],{"class":3447},".848",[3434,7491,3482],{"class":3451},[3434,7493,7494,7497,7500,7502,7504,7507,7510],{"class":3436,"line":3835},[3434,7495,7496],{"class":3451},"    --color-neutral-900: oklch(0",[3434,7498,7499],{"class":3447},".208",[3434,7501,4757],{"class":3451},[3434,7503,4780],{"class":3447},[3434,7505,7506],{"class":3451}," 265",[3434,7508,7509],{"class":3447},".755",[3434,7511,3482],{"class":3451},[3434,7513,7514,7517,7520,7522,7525,7528,7531],{"class":3436,"line":3857},[3434,7515,7516],{"class":3451},"    --color-neutral-950: oklch(0",[3434,7518,7519],{"class":3447},".130",[3434,7521,4757],{"class":3451},[3434,7523,7524],{"class":3447},".028",[3434,7526,7527],{"class":3451}," 261",[3434,7529,7530],{"class":3447},".692",[3434,7532,3482],{"class":3451},[3434,7534,7535],{"class":3436,"line":3862},[3434,7536,3495],{"emptyLinePlaceholder":3494},[3434,7538,7539],{"class":3436,"line":3867},[3434,7540,7541],{"class":3440},"    \u002F* Акцентний колір: Indigo (бренд) *\u002F\n",[3434,7543,7544,7547,7550,7552,7555,7558,7561],{"class":3436,"line":3873},[3434,7545,7546],{"class":3451},"    --color-indigo-50:  oklch(0",[3434,7548,7549],{"class":3447},".962",[3434,7551,4757],{"class":3451},[3434,7553,7554],{"class":3447},".018",[3434,7556,7557],{"class":3451}," 272",[3434,7559,7560],{"class":3447},".314",[3434,7562,3482],{"class":3451},[3434,7564,7565,7568,7571,7573,7575,7577,7580],{"class":3436,"line":3881},[3434,7566,7567],{"class":3451},"    --color-indigo-100: oklch(0",[3434,7569,7570],{"class":3447},".930",[3434,7572,4757],{"class":3451},[3434,7574,7423],{"class":3447},[3434,7576,7557],{"class":3451},[3434,7578,7579],{"class":3447},".788",[3434,7581,3482],{"class":3451},[3434,7583,7584,7587,7590,7592,7595,7598,7601],{"class":3436,"line":3898},[3434,7585,7586],{"class":3451},"    --color-indigo-200: oklch(0",[3434,7588,7589],{"class":3447},".870",[3434,7591,4757],{"class":3451},[3434,7593,7594],{"class":3447},".065",[3434,7596,7597],{"class":3451}," 274",[3434,7599,7600],{"class":3447},".039",[3434,7602,3482],{"class":3451},[3434,7604,7605,7608,7611,7613,7616,7618,7621],{"class":3436,"line":3903},[3434,7606,7607],{"class":3451},"    --color-indigo-300: oklch(0",[3434,7609,7610],{"class":3447},".785",[3434,7612,4757],{"class":3451},[3434,7614,7615],{"class":3447},".115",[3434,7617,7597],{"class":3451},[3434,7619,7620],{"class":3447},".713",[3434,7622,3482],{"class":3451},[3434,7624,7625,7628,7631,7633,7636,7639,7642],{"class":3436,"line":3911},[3434,7626,7627],{"class":3451},"    --color-indigo-400: oklch(0",[3434,7629,7630],{"class":3447},".673",[3434,7632,4757],{"class":3451},[3434,7634,7635],{"class":3447},".182",[3434,7637,7638],{"class":3451}," 276",[3434,7640,7641],{"class":3447},".935",[3434,7643,3482],{"class":3451},[3434,7645,7646,7649,7651,7653,7655,7657,7659],{"class":3436,"line":3927},[3434,7647,7648],{"class":3451},"    --color-indigo-500: oklch(0",[3434,7650,4754],{"class":3447},[3434,7652,4757],{"class":3451},[3434,7654,4760],{"class":3447},[3434,7656,3595],{"class":3451},[3434,7658,4765],{"class":3447},[3434,7660,3482],{"class":3451},[3434,7662,7663,7666,7669,7671,7674,7676,7679],{"class":3436,"line":3932},[3434,7664,7665],{"class":3451},"    --color-indigo-600: oklch(0",[3434,7667,7668],{"class":3447},".511",[3434,7670,4757],{"class":3451},[3434,7672,7673],{"class":3447},".262",[3434,7675,7638],{"class":3451},[3434,7677,7678],{"class":3447},".966",[3434,7680,3482],{"class":3451},[3434,7682,7683,7686,7689,7691,7694,7696,7699],{"class":3436,"line":3940},[3434,7684,7685],{"class":3451},"    --color-indigo-700: oklch(0",[3434,7687,7688],{"class":3447},".457",[3434,7690,4757],{"class":3451},[3434,7692,7693],{"class":3447},".240",[3434,7695,3595],{"class":3451},[3434,7697,7698],{"class":3447},".023",[3434,7700,3482],{"class":3451},[3434,7702,7703,7706,7709,7711,7714,7716,7719],{"class":3436,"line":3956},[3434,7704,7705],{"class":3451},"    --color-indigo-800: oklch(0",[3434,7707,7708],{"class":3447},".398",[3434,7710,4757],{"class":3451},[3434,7712,7713],{"class":3447},".195",[3434,7715,3595],{"class":3451},[3434,7717,7718],{"class":3447},".366",[3434,7720,3482],{"class":3451},[3434,7722,7723,7726,7729,7731,7734,7737,7740],{"class":3436,"line":3961},[3434,7724,7725],{"class":3451},"    --color-indigo-900: oklch(0",[3434,7727,7728],{"class":3447},".359",[3434,7730,4757],{"class":3451},[3434,7732,7733],{"class":3447},".144",[3434,7735,7736],{"class":3451}," 278",[3434,7738,7739],{"class":3447},".697",[3434,7741,3482],{"class":3451},[3434,7743,7744,7747,7750,7752,7755,7758,7761],{"class":3436,"line":3971},[3434,7745,7746],{"class":3451},"    --color-indigo-950: oklch(0",[3434,7748,7749],{"class":3447},".257",[3434,7751,4757],{"class":3451},[3434,7753,7754],{"class":3447},".090",[3434,7756,7757],{"class":3451}," 281",[3434,7759,7760],{"class":3447},".288",[3434,7762,3482],{"class":3451},[3434,7764,7765],{"class":3436,"line":3980},[3434,7766,3495],{"emptyLinePlaceholder":3494},[3434,7768,7769],{"class":3436,"line":4006},[3434,7770,7771],{"class":3440},"    \u002F* Допоміжні кольори для статусів *\u002F\n",[3434,7773,7774,7777,7780,7782,7785,7788,7791],{"class":3436,"line":4024},[3434,7775,7776],{"class":3451},"    --color-success-400: oklch(0",[3434,7778,7779],{"class":3447},".748",[3434,7781,4757],{"class":3451},[3434,7783,7784],{"class":3447},".160",[3434,7786,7787],{"class":3451}," 145",[3434,7789,7790],{"class":3447},".439",[3434,7792,3482],{"class":3451},[3434,7794,7795,7798,7801,7803,7806,7808,7811],{"class":3436,"line":4051},[3434,7796,7797],{"class":3451},"    --color-success-500: oklch(0",[3434,7799,7800],{"class":3447},".652",[3434,7802,4757],{"class":3451},[3434,7804,7805],{"class":3447},".168",[3434,7807,7787],{"class":3451},[3434,7809,7810],{"class":3447},".497",[3434,7812,3482],{"class":3451},[3434,7814,7815,7818,7821,7823,7826,7829,7831],{"class":3436,"line":4057},[3434,7816,7817],{"class":3451},"    --color-success-600: oklch(0",[3434,7819,7820],{"class":3447},".540",[3434,7822,4757],{"class":3451},[3434,7824,7825],{"class":3447},".145",[3434,7827,7828],{"class":3451}," 146",[3434,7830,7779],{"class":3447},[3434,7832,3482],{"class":3451},[3434,7834,7835,7838,7840,7842,7845,7848,7851],{"class":3436,"line":4073},[3434,7836,7837],{"class":3451},"    --color-success-100: oklch(0",[3434,7839,7549],{"class":3447},[3434,7841,4757],{"class":3451},[3434,7843,7844],{"class":3447},".044",[3434,7846,7847],{"class":3451}," 156",[3434,7849,7850],{"class":3447},".743",[3434,7852,3482],{"class":3451},[3434,7854,7855,7858,7861,7863,7866,7869,7872],{"class":3436,"line":4079},[3434,7856,7857],{"class":3451},"    --color-success-900: oklch(0",[3434,7859,7860],{"class":3447},".270",[3434,7862,4757],{"class":3451},[3434,7864,7865],{"class":3447},".085",[3434,7867,7868],{"class":3451}," 154",[3434,7870,7871],{"class":3447},".724",[3434,7873,3482],{"class":3451},[3434,7875,7876],{"class":3436,"line":4096},[3434,7877,3495],{"emptyLinePlaceholder":3494},[3434,7879,7880,7883,7886,7888,7891,7894,7897],{"class":3436,"line":4113},[3434,7881,7882],{"class":3451},"    --color-warning-400: oklch(0",[3434,7884,7885],{"class":3447},".854",[3434,7887,4757],{"class":3451},[3434,7889,7890],{"class":3447},".163",[3434,7892,7893],{"class":3451}," 91",[3434,7895,7896],{"class":3447},".936",[3434,7898,3482],{"class":3451},[3434,7900,7901,7904,7907,7909,7912,7915,7918],{"class":3436,"line":4119},[3434,7902,7903],{"class":3451},"    --color-warning-500: oklch(0",[3434,7905,7906],{"class":3447},".769",[3434,7908,4757],{"class":3451},[3434,7910,7911],{"class":3447},".188",[3434,7913,7914],{"class":3451}," 70",[3434,7916,7917],{"class":3447},".080",[3434,7919,3482],{"class":3451},[3434,7921,7922,7925,7928,7930,7933,7936,7939],{"class":3436,"line":4129},[3434,7923,7924],{"class":3451},"    --color-warning-100: oklch(0",[3434,7926,7927],{"class":3447},".973",[3434,7929,4757],{"class":3451},[3434,7931,7932],{"class":3447},".071",[3434,7934,7935],{"class":3451}," 103",[3434,7937,7938],{"class":3447},".193",[3434,7940,3482],{"class":3451},[3434,7942,7943,7946,7949,7951,7953,7956,7959],{"class":3436,"line":4145},[3434,7944,7945],{"class":3451},"    --color-warning-900: oklch(0",[3434,7947,7948],{"class":3447},".476",[3434,7950,4757],{"class":3451},[3434,7952,7733],{"class":3447},[3434,7954,7955],{"class":3451}," 67",[3434,7957,7958],{"class":3447},".110",[3434,7960,3482],{"class":3451},[3434,7962,7963],{"class":3436,"line":4162},[3434,7964,3495],{"emptyLinePlaceholder":3494},[3434,7966,7967,7970,7972,7974,7977,7980,7982],{"class":3436,"line":4168},[3434,7968,7969],{"class":3451},"    --color-error-400: oklch(0",[3434,7971,7398],{"class":3447},[3434,7973,4757],{"class":3451},[3434,7975,7976],{"class":3447},".191",[3434,7978,7979],{"class":3451}," 22",[3434,7981,7635],{"class":3447},[3434,7983,3482],{"class":3451},[3434,7985,7986,7989,7992,7994,7997,8000,8003],{"class":3436,"line":4178},[3434,7987,7988],{"class":3451},"    --color-error-500: oklch(0",[3434,7990,7991],{"class":3447},".637",[3434,7993,4757],{"class":3451},[3434,7995,7996],{"class":3447},".237",[3434,7998,7999],{"class":3451}," 25",[3434,8001,8002],{"class":3447},".331",[3434,8004,3482],{"class":3451},[3434,8006,8007,8010,8013,8015,8018,8021,8024],{"class":3436,"line":4187},[3434,8008,8009],{"class":3451},"    --color-error-600: oklch(0",[3434,8011,8012],{"class":3447},".577",[3434,8014,4757],{"class":3451},[3434,8016,8017],{"class":3447},".245",[3434,8019,8020],{"class":3451}," 27",[3434,8022,8023],{"class":3447},".325",[3434,8025,3482],{"class":3451},[3434,8027,8028,8031,8033,8035,8038,8041,8044],{"class":3436,"line":4213},[3434,8029,8030],{"class":3451},"    --color-error-100: oklch(0",[3434,8032,7896],{"class":3447},[3434,8034,4757],{"class":3451},[3434,8036,8037],{"class":3447},".032",[3434,8039,8040],{"class":3451}," 17",[3434,8042,8043],{"class":3447},".717",[3434,8045,3482],{"class":3451},[3434,8047,8048,8051,8054,8056,8059,8061,8064],{"class":3436,"line":4238},[3434,8049,8050],{"class":3451},"    --color-error-900: oklch(0",[3434,8052,8053],{"class":3447},".391",[3434,8055,4757],{"class":3451},[3434,8057,8058],{"class":3447},".155",[3434,8060,8020],{"class":3451},[3434,8062,8063],{"class":3447},".518",[3434,8065,3482],{"class":3451},[3434,8067,8068],{"class":3436,"line":4247},[3434,8069,3488],{"class":3451},[3388,8071,8072,8073,7250,8076,7250,8079,7250,8082,7250,8085,8088],{},"Значення OKLCH у наведеному прикладі відповідають тим самим кольорам, що використовує Tailwind за замовчуванням (",[3357,8074,8075],{},"slate",[3357,8077,8078],{},"indigo",[3357,8080,8081],{},"emerald",[3357,8083,8084],{},"amber",[3357,8086,8087],{},"red","). Якщо ви хочете повністю власну палітру — визначте свої значення OKLCH. Про те, як підбирати кольори в OKLCH, читайте у статті 07.",[3396,8090],{},[3403,8092,8094],{"id":8093},"_33-семантичні-токени-та-перемикання-теми","3.3. Семантичні токени та перемикання теми",[3353,8096,8097,8098,8101,8102,8104],{},"Тепер визначаємо семантичні токени — окремо для світлої та темної теми. Їх ",[3365,8099,8100],{},"не"," варто класти у ",[3357,8103,3393],{},", оскільки вони не є частиною дизайн-системи як такої — вони змінюються залежно від контексту:",[3425,8106,8109],{"className":3427,"code":8107,"filename":8108,"language":3429,"meta":3430,"style":3430},"\u002F* ===== СЕМАНТИЧНІ ТОКЕНИ: СВІТЛА ТЕМА (за замовчуванням) ===== *\u002F\n:root {\n    \u002F* --- Фони --- *\u002F\n    --color-bg-base:     var(--color-neutral-50);   \u002F* Фон сторінки *\u002F\n    --color-bg-surface:  oklch(1 0 0);               \u002F* Фон карток, панелей *\u002F\n    --color-bg-elevated: oklch(1 0 0);               \u002F* Фон модальних вікон *\u002F\n    --color-bg-inset:    var(--color-neutral-100);   \u002F* Фон вкладених елементів *\u002F\n    --color-bg-muted:    var(--color-neutral-100);   \u002F* Приглушений фон *\u002F\n\n    \u002F* --- Текст --- *\u002F\n    --color-text-primary:   var(--color-neutral-900);  \u002F* Основний текст *\u002F\n    --color-text-secondary: var(--color-neutral-700);  \u002F* Другорядний текст *\u002F\n    --color-text-muted:     var(--color-neutral-500);  \u002F* Приглушений текст *\u002F\n    --color-text-disabled:  var(--color-neutral-400);  \u002F* Неактивний текст *\u002F\n    --color-text-inverse:   oklch(1 0 0);              \u002F* Текст на темному фоні *\u002F\n\n    \u002F* --- Рамки --- *\u002F\n    --color-border-default:  var(--color-neutral-200); \u002F* Стандартна рамка *\u002F\n    --color-border-strong:   var(--color-neutral-300); \u002F* Виражена рамка *\u002F\n    --color-border-focus:    var(--color-indigo-500);  \u002F* Рамка фокусу *\u002F\n\n    \u002F* --- Акцент (бренд) --- *\u002F\n    --color-accent:          var(--color-indigo-500);\n    --color-accent-hover:    var(--color-indigo-600);\n    --color-accent-light:    var(--color-indigo-50);\n    --color-accent-text:     var(--color-indigo-700);\n\n    \u002F* --- Статуси --- *\u002F\n    --color-status-success-bg:   var(--color-success-100);\n    --color-status-success-text: var(--color-success-600);\n    --color-status-warning-bg:   var(--color-warning-100);\n    --color-status-warning-text: var(--color-warning-900);\n    --color-status-error-bg:     var(--color-error-100);\n    --color-status-error-text:   var(--color-error-600);\n}\n\n\u002F* ===== СЕМАНТИЧНІ ТОКЕНИ: ТЕМНА ТЕМА ===== *\u002F\n\u002F* Активується при наявності класу .dark на батьківському елементі *\u002F\n.dark {\n    \u002F* --- Фони --- *\u002F\n    --color-bg-base:     oklch(0.113 0.021 261);   \u002F* Найтемніший — фон сторінки *\u002F\n    --color-bg-surface:  oklch(0.179 0.027 261);   \u002F* Трохи світліший — картки *\u002F\n    --color-bg-elevated: oklch(0.225 0.025 264);   \u002F* Ще світліший — модальні *\u002F\n    --color-bg-inset:    oklch(0.145 0.025 262);   \u002F* Темніший вкладений *\u002F\n    --color-bg-muted:    oklch(0.152 0.022 262);   \u002F* Приглушений *\u002F\n\n    \u002F* --- Текст --- *\u002F\n    --color-text-primary:   var(--color-neutral-50);   \u002F* Майже білий *\u002F\n    --color-text-secondary: var(--color-neutral-200);  \u002F* Світло-сірий *\u002F\n    --color-text-muted:     var(--color-neutral-400);  \u002F* Сірий *\u002F\n    --color-text-disabled:  var(--color-neutral-600);  \u002F* Темніший сірий *\u002F\n    --color-text-inverse:   var(--color-neutral-900);  \u002F* Темний текст *\u002F\n\n    \u002F* --- Рамки --- *\u002F\n    --color-border-default:  oklch(0.300 0.025 264);   \u002F* Темна рамка *\u002F\n    --color-border-strong:   oklch(0.380 0.025 264);   \u002F* Виразніша темна рамка *\u002F\n    --color-border-focus:    var(--color-indigo-400);  \u002F* Яскравіший фокус *\u002F\n\n    \u002F* --- Акцент (бренд) — трохи яскравіший для темного фону --- *\u002F\n    --color-accent:       var(--color-indigo-400);\n    --color-accent-hover: var(--color-indigo-300);\n    --color-accent-light: oklch(0.257 0.090 281) \u002F 0.2; \u002F* приглушений indigo-950 *\u002F\n    --color-accent-text:  var(--color-indigo-300);\n\n    \u002F* --- Статуси --- *\u002F\n    --color-status-success-bg:   var(--color-success-900);\n    --color-status-success-text: var(--color-success-400);\n    --color-status-warning-bg:   oklch(0.476 0.144 67) \u002F 0.2;\n    --color-status-warning-text: var(--color-warning-400);\n    --color-status-error-bg:     oklch(0.391 0.155 27) \u002F 0.2;\n    --color-status-error-text:   var(--color-error-400);\n}\n","src\u002Fstyles\u002Ftheme\u002Fsemantic.css",[3357,8110,8111,8116,8122,8127,8147,8171,8193,8213,8231,8235,8240,8260,8279,8297,8316,8339,8343,8348,8367,8386,8405,8409,8414,8429,8445,8461,8477,8481,8486,8502,8518,8534,8550,8566,8582,8586,8590,8595,8600,8606,8610,8633,8656,8679,8702,8725,8729,8733,8750,8767,8784,8802,8819,8823,8827,8849,8871,8888,8892,8897,8912,8927,8957,8971,8975,8979,8994,9009,9033,9048,9072,9087],{"__ignoreMap":3430},[3434,8112,8113],{"class":3436,"line":3437},[3434,8114,8115],{"class":3440},"\u002F* ===== СЕМАНТИЧНІ ТОКЕНИ: СВІТЛА ТЕМА (за замовчуванням) ===== *\u002F\n",[3434,8117,8118,8120],{"class":3436,"line":3444},[3434,8119,3448],{"class":3447},[3434,8121,3452],{"class":3451},[3434,8123,8124],{"class":3436,"line":3455},[3434,8125,8126],{"class":3440},"    \u002F* --- Фони --- *\u002F\n",[3434,8128,8129,8131,8134,8136,8138,8141,8144],{"class":3436,"line":3485},[3434,8130,4924],{"class":3458},[3434,8132,8133],{"class":3451},":     ",[3434,8135,3519],{"class":3465},[3434,8137,3469],{"class":3451},[3434,8139,8140],{"class":3458},"--color-neutral-50",[3434,8142,8143],{"class":3451},");   ",[3434,8145,8146],{"class":3440},"\u002F* Фон сторінки *\u002F\n",[3434,8148,8149,8151,8154,8156,8158,8161,8163,8165,8168],{"class":3436,"line":3491},[3434,8150,4945],{"class":3458},[3434,8152,8153],{"class":3451},":  ",[3434,8155,3466],{"class":3465},[3434,8157,3469],{"class":3451},[3434,8159,8160],{"class":3472},"1",[3434,8162,4757],{"class":3472},[3434,8164,4757],{"class":3472},[3434,8166,8167],{"class":3451},");               ",[3434,8169,8170],{"class":3440},"\u002F* Фон карток, панелей *\u002F\n",[3434,8172,8173,8176,8178,8180,8182,8184,8186,8188,8190],{"class":3436,"line":3498},[3434,8174,8175],{"class":3458},"    --color-bg-elevated",[3434,8177,3462],{"class":3451},[3434,8179,3466],{"class":3465},[3434,8181,3469],{"class":3451},[3434,8183,8160],{"class":3472},[3434,8185,4757],{"class":3472},[3434,8187,4757],{"class":3472},[3434,8189,8167],{"class":3451},[3434,8191,8192],{"class":3440},"\u002F* Фон модальних вікон *\u002F\n",[3434,8194,8195,8198,8201,8203,8205,8208,8210],{"class":3436,"line":3504},[3434,8196,8197],{"class":3458},"    --color-bg-inset",[3434,8199,8200],{"class":3451},":    ",[3434,8202,3519],{"class":3465},[3434,8204,3469],{"class":3451},[3434,8206,8207],{"class":3458},"--color-neutral-100",[3434,8209,8143],{"class":3451},[3434,8211,8212],{"class":3440},"\u002F* Фон вкладених елементів *\u002F\n",[3434,8214,8215,8218,8220,8222,8224,8226,8228],{"class":3436,"line":3511},[3434,8216,8217],{"class":3458},"    --color-bg-muted",[3434,8219,8200],{"class":3451},[3434,8221,3519],{"class":3465},[3434,8223,3469],{"class":3451},[3434,8225,8207],{"class":3458},[3434,8227,8143],{"class":3451},[3434,8229,8230],{"class":3440},"\u002F* Приглушений фон *\u002F\n",[3434,8232,8233],{"class":3436,"line":3529},[3434,8234,3495],{"emptyLinePlaceholder":3494},[3434,8236,8237],{"class":3436,"line":3810},[3434,8238,8239],{"class":3440},"    \u002F* --- Текст --- *\u002F\n",[3434,8241,8242,8244,8247,8249,8251,8254,8257],{"class":3436,"line":3816},[3434,8243,4892],{"class":3458},[3434,8245,8246],{"class":3451},":   ",[3434,8248,3519],{"class":3465},[3434,8250,3469],{"class":3451},[3434,8252,8253],{"class":3458},"--color-neutral-900",[3434,8255,8256],{"class":3451},");  ",[3434,8258,8259],{"class":3440},"\u002F* Основний текст *\u002F\n",[3434,8261,8262,8265,8267,8269,8271,8274,8276],{"class":3436,"line":3821},[3434,8263,8264],{"class":3458},"    --color-text-secondary",[3434,8266,3462],{"class":3451},[3434,8268,3519],{"class":3465},[3434,8270,3469],{"class":3451},[3434,8272,8273],{"class":3458},"--color-neutral-700",[3434,8275,8256],{"class":3451},[3434,8277,8278],{"class":3440},"\u002F* Другорядний текст *\u002F\n",[3434,8280,8281,8283,8285,8287,8289,8292,8294],{"class":3436,"line":3829},[3434,8282,4908],{"class":3458},[3434,8284,8133],{"class":3451},[3434,8286,3519],{"class":3465},[3434,8288,3469],{"class":3451},[3434,8290,8291],{"class":3458},"--color-neutral-500",[3434,8293,8256],{"class":3451},[3434,8295,8296],{"class":3440},"\u002F* Приглушений текст *\u002F\n",[3434,8298,8299,8302,8304,8306,8308,8311,8313],{"class":3436,"line":3835},[3434,8300,8301],{"class":3458},"    --color-text-disabled",[3434,8303,8153],{"class":3451},[3434,8305,3519],{"class":3465},[3434,8307,3469],{"class":3451},[3434,8309,8310],{"class":3458},"--color-neutral-400",[3434,8312,8256],{"class":3451},[3434,8314,8315],{"class":3440},"\u002F* Неактивний текст *\u002F\n",[3434,8317,8318,8321,8323,8325,8327,8329,8331,8333,8336],{"class":3436,"line":3857},[3434,8319,8320],{"class":3458},"    --color-text-inverse",[3434,8322,8246],{"class":3451},[3434,8324,3466],{"class":3465},[3434,8326,3469],{"class":3451},[3434,8328,8160],{"class":3472},[3434,8330,4757],{"class":3472},[3434,8332,4757],{"class":3472},[3434,8334,8335],{"class":3451},");              ",[3434,8337,8338],{"class":3440},"\u002F* Текст на темному фоні *\u002F\n",[3434,8340,8341],{"class":3436,"line":3862},[3434,8342,3495],{"emptyLinePlaceholder":3494},[3434,8344,8345],{"class":3436,"line":3867},[3434,8346,8347],{"class":3440},"    \u002F* --- Рамки --- *\u002F\n",[3434,8349,8350,8353,8355,8357,8359,8362,8364],{"class":3436,"line":3873},[3434,8351,8352],{"class":3458},"    --color-border-default",[3434,8354,8153],{"class":3451},[3434,8356,3519],{"class":3465},[3434,8358,3469],{"class":3451},[3434,8360,8361],{"class":3458},"--color-neutral-200",[3434,8363,3598],{"class":3451},[3434,8365,8366],{"class":3440},"\u002F* Стандартна рамка *\u002F\n",[3434,8368,8369,8372,8374,8376,8378,8381,8383],{"class":3436,"line":3881},[3434,8370,8371],{"class":3458},"    --color-border-strong",[3434,8373,8246],{"class":3451},[3434,8375,3519],{"class":3465},[3434,8377,3469],{"class":3451},[3434,8379,8380],{"class":3458},"--color-neutral-300",[3434,8382,3598],{"class":3451},[3434,8384,8385],{"class":3440},"\u002F* Виражена рамка *\u002F\n",[3434,8387,8388,8391,8393,8395,8397,8400,8402],{"class":3436,"line":3898},[3434,8389,8390],{"class":3458},"    --color-border-focus",[3434,8392,8200],{"class":3451},[3434,8394,3519],{"class":3465},[3434,8396,3469],{"class":3451},[3434,8398,8399],{"class":3458},"--color-indigo-500",[3434,8401,8256],{"class":3451},[3434,8403,8404],{"class":3440},"\u002F* Рамка фокусу *\u002F\n",[3434,8406,8407],{"class":3436,"line":3903},[3434,8408,3495],{"emptyLinePlaceholder":3494},[3434,8410,8411],{"class":3436,"line":3911},[3434,8412,8413],{"class":3440},"    \u002F* --- Акцент (бренд) --- *\u002F\n",[3434,8415,8416,8418,8421,8423,8425,8427],{"class":3436,"line":3927},[3434,8417,3580],{"class":3458},[3434,8419,8420],{"class":3451},":          ",[3434,8422,3519],{"class":3465},[3434,8424,3469],{"class":3451},[3434,8426,8399],{"class":3458},[3434,8428,3482],{"class":3451},[3434,8430,8431,8434,8436,8438,8440,8443],{"class":3436,"line":3932},[3434,8432,8433],{"class":3458},"    --color-accent-hover",[3434,8435,8200],{"class":3451},[3434,8437,3519],{"class":3465},[3434,8439,3469],{"class":3451},[3434,8441,8442],{"class":3458},"--color-indigo-600",[3434,8444,3482],{"class":3451},[3434,8446,8447,8450,8452,8454,8456,8459],{"class":3436,"line":3940},[3434,8448,8449],{"class":3458},"    --color-accent-light",[3434,8451,8200],{"class":3451},[3434,8453,3519],{"class":3465},[3434,8455,3469],{"class":3451},[3434,8457,8458],{"class":3458},"--color-indigo-50",[3434,8460,3482],{"class":3451},[3434,8462,8463,8466,8468,8470,8472,8475],{"class":3436,"line":3956},[3434,8464,8465],{"class":3458},"    --color-accent-text",[3434,8467,8133],{"class":3451},[3434,8469,3519],{"class":3465},[3434,8471,3469],{"class":3451},[3434,8473,8474],{"class":3458},"--color-indigo-700",[3434,8476,3482],{"class":3451},[3434,8478,8479],{"class":3436,"line":3961},[3434,8480,3495],{"emptyLinePlaceholder":3494},[3434,8482,8483],{"class":3436,"line":3971},[3434,8484,8485],{"class":3440},"    \u002F* --- Статуси --- *\u002F\n",[3434,8487,8488,8491,8493,8495,8497,8500],{"class":3436,"line":3980},[3434,8489,8490],{"class":3458},"    --color-status-success-bg",[3434,8492,8246],{"class":3451},[3434,8494,3519],{"class":3465},[3434,8496,3469],{"class":3451},[3434,8498,8499],{"class":3458},"--color-success-100",[3434,8501,3482],{"class":3451},[3434,8503,8504,8507,8509,8511,8513,8516],{"class":3436,"line":4006},[3434,8505,8506],{"class":3458},"    --color-status-success-text",[3434,8508,3462],{"class":3451},[3434,8510,3519],{"class":3465},[3434,8512,3469],{"class":3451},[3434,8514,8515],{"class":3458},"--color-success-600",[3434,8517,3482],{"class":3451},[3434,8519,8520,8523,8525,8527,8529,8532],{"class":3436,"line":4024},[3434,8521,8522],{"class":3458},"    --color-status-warning-bg",[3434,8524,8246],{"class":3451},[3434,8526,3519],{"class":3465},[3434,8528,3469],{"class":3451},[3434,8530,8531],{"class":3458},"--color-warning-100",[3434,8533,3482],{"class":3451},[3434,8535,8536,8539,8541,8543,8545,8548],{"class":3436,"line":4051},[3434,8537,8538],{"class":3458},"    --color-status-warning-text",[3434,8540,3462],{"class":3451},[3434,8542,3519],{"class":3465},[3434,8544,3469],{"class":3451},[3434,8546,8547],{"class":3458},"--color-warning-900",[3434,8549,3482],{"class":3451},[3434,8551,8552,8555,8557,8559,8561,8564],{"class":3436,"line":4057},[3434,8553,8554],{"class":3458},"    --color-status-error-bg",[3434,8556,8133],{"class":3451},[3434,8558,3519],{"class":3465},[3434,8560,3469],{"class":3451},[3434,8562,8563],{"class":3458},"--color-error-100",[3434,8565,3482],{"class":3451},[3434,8567,8568,8571,8573,8575,8577,8580],{"class":3436,"line":4073},[3434,8569,8570],{"class":3458},"    --color-status-error-text",[3434,8572,8246],{"class":3451},[3434,8574,3519],{"class":3465},[3434,8576,3469],{"class":3451},[3434,8578,8579],{"class":3458},"--color-error-600",[3434,8581,3482],{"class":3451},[3434,8583,8584],{"class":3436,"line":4079},[3434,8585,3488],{"class":3451},[3434,8587,8588],{"class":3436,"line":4096},[3434,8589,3495],{"emptyLinePlaceholder":3494},[3434,8591,8592],{"class":3436,"line":4113},[3434,8593,8594],{"class":3440},"\u002F* ===== СЕМАНТИЧНІ ТОКЕНИ: ТЕМНА ТЕМА ===== *\u002F\n",[3434,8596,8597],{"class":3436,"line":4119},[3434,8598,8599],{"class":3440},"\u002F* Активується при наявності класу .dark на батьківському елементі *\u002F\n",[3434,8601,8602,8604],{"class":3436,"line":4129},[3434,8603,4885],{"class":3447},[3434,8605,3452],{"class":3451},[3434,8607,8608],{"class":3436,"line":4145},[3434,8609,8126],{"class":3440},[3434,8611,8612,8614,8616,8618,8620,8623,8626,8628,8630],{"class":3436,"line":4162},[3434,8613,4924],{"class":3458},[3434,8615,8133],{"class":3451},[3434,8617,3466],{"class":3465},[3434,8619,3469],{"class":3451},[3434,8621,8622],{"class":3472},"0.113",[3434,8624,8625],{"class":3472}," 0.021",[3434,8627,7527],{"class":3472},[3434,8629,8143],{"class":3451},[3434,8631,8632],{"class":3440},"\u002F* Найтемніший — фон сторінки *\u002F\n",[3434,8634,8635,8637,8639,8641,8643,8646,8649,8651,8653],{"class":3436,"line":4168},[3434,8636,4945],{"class":3458},[3434,8638,8153],{"class":3451},[3434,8640,3466],{"class":3465},[3434,8642,3469],{"class":3451},[3434,8644,8645],{"class":3472},"0.179",[3434,8647,8648],{"class":3472}," 0.027",[3434,8650,7527],{"class":3472},[3434,8652,8143],{"class":3451},[3434,8654,8655],{"class":3440},"\u002F* Трохи світліший — картки *\u002F\n",[3434,8657,8658,8660,8662,8664,8666,8669,8672,8674,8676],{"class":3436,"line":4178},[3434,8659,8175],{"class":3458},[3434,8661,3462],{"class":3451},[3434,8663,3466],{"class":3465},[3434,8665,3469],{"class":3451},[3434,8667,8668],{"class":3472},"0.225",[3434,8670,8671],{"class":3472}," 0.025",[3434,8673,4783],{"class":3472},[3434,8675,8143],{"class":3451},[3434,8677,8678],{"class":3440},"\u002F* Ще світліший — модальні *\u002F\n",[3434,8680,8681,8683,8685,8687,8689,8692,8694,8697,8699],{"class":3436,"line":4187},[3434,8682,8197],{"class":3458},[3434,8684,8200],{"class":3451},[3434,8686,3466],{"class":3465},[3434,8688,3469],{"class":3451},[3434,8690,8691],{"class":3472},"0.145",[3434,8693,8671],{"class":3472},[3434,8695,8696],{"class":3472}," 262",[3434,8698,8143],{"class":3451},[3434,8700,8701],{"class":3440},"\u002F* Темніший вкладений *\u002F\n",[3434,8703,8704,8706,8708,8710,8712,8715,8718,8720,8722],{"class":3436,"line":4213},[3434,8705,8217],{"class":3458},[3434,8707,8200],{"class":3451},[3434,8709,3466],{"class":3465},[3434,8711,3469],{"class":3451},[3434,8713,8714],{"class":3472},"0.152",[3434,8716,8717],{"class":3472}," 0.022",[3434,8719,8696],{"class":3472},[3434,8721,8143],{"class":3451},[3434,8723,8724],{"class":3440},"\u002F* Приглушений *\u002F\n",[3434,8726,8727],{"class":3436,"line":4238},[3434,8728,3495],{"emptyLinePlaceholder":3494},[3434,8730,8731],{"class":3436,"line":4247},[3434,8732,8239],{"class":3440},[3434,8734,8735,8737,8739,8741,8743,8745,8747],{"class":3436,"line":4256},[3434,8736,4892],{"class":3458},[3434,8738,8246],{"class":3451},[3434,8740,3519],{"class":3465},[3434,8742,3469],{"class":3451},[3434,8744,8140],{"class":3458},[3434,8746,8143],{"class":3451},[3434,8748,8749],{"class":3440},"\u002F* Майже білий *\u002F\n",[3434,8751,8752,8754,8756,8758,8760,8762,8764],{"class":3436,"line":4272},[3434,8753,8264],{"class":3458},[3434,8755,3462],{"class":3451},[3434,8757,3519],{"class":3465},[3434,8759,3469],{"class":3451},[3434,8761,8361],{"class":3458},[3434,8763,8256],{"class":3451},[3434,8765,8766],{"class":3440},"\u002F* Світло-сірий *\u002F\n",[3434,8768,8769,8771,8773,8775,8777,8779,8781],{"class":3436,"line":4288},[3434,8770,4908],{"class":3458},[3434,8772,8133],{"class":3451},[3434,8774,3519],{"class":3465},[3434,8776,3469],{"class":3451},[3434,8778,8310],{"class":3458},[3434,8780,8256],{"class":3451},[3434,8782,8783],{"class":3440},"\u002F* Сірий *\u002F\n",[3434,8785,8786,8788,8790,8792,8794,8797,8799],{"class":3436,"line":4319},[3434,8787,8301],{"class":3458},[3434,8789,8153],{"class":3451},[3434,8791,3519],{"class":3465},[3434,8793,3469],{"class":3451},[3434,8795,8796],{"class":3458},"--color-neutral-600",[3434,8798,8256],{"class":3451},[3434,8800,8801],{"class":3440},"\u002F* Темніший сірий *\u002F\n",[3434,8803,8804,8806,8808,8810,8812,8814,8816],{"class":3436,"line":4328},[3434,8805,8320],{"class":3458},[3434,8807,8246],{"class":3451},[3434,8809,3519],{"class":3465},[3434,8811,3469],{"class":3451},[3434,8813,8253],{"class":3458},[3434,8815,8256],{"class":3451},[3434,8817,8818],{"class":3440},"\u002F* Темний текст *\u002F\n",[3434,8820,8821],{"class":3436,"line":4337},[3434,8822,3495],{"emptyLinePlaceholder":3494},[3434,8824,8825],{"class":3436,"line":4354},[3434,8826,8347],{"class":3440},[3434,8828,8829,8831,8833,8835,8837,8840,8842,8844,8846],{"class":3436,"line":4360},[3434,8830,8352],{"class":3458},[3434,8832,8153],{"class":3451},[3434,8834,3466],{"class":3465},[3434,8836,3469],{"class":3451},[3434,8838,8839],{"class":3472},"0.300",[3434,8841,8671],{"class":3472},[3434,8843,4783],{"class":3472},[3434,8845,8143],{"class":3451},[3434,8847,8848],{"class":3440},"\u002F* Темна рамка *\u002F\n",[3434,8850,8851,8853,8855,8857,8859,8862,8864,8866,8868],{"class":3436,"line":4369},[3434,8852,8371],{"class":3458},[3434,8854,8246],{"class":3451},[3434,8856,3466],{"class":3465},[3434,8858,3469],{"class":3451},[3434,8860,8861],{"class":3472},"0.380",[3434,8863,8671],{"class":3472},[3434,8865,4783],{"class":3472},[3434,8867,8143],{"class":3451},[3434,8869,8870],{"class":3440},"\u002F* Виразніша темна рамка *\u002F\n",[3434,8872,8873,8875,8877,8879,8881,8883,8885],{"class":3436,"line":4379},[3434,8874,8390],{"class":3458},[3434,8876,8200],{"class":3451},[3434,8878,3519],{"class":3465},[3434,8880,3469],{"class":3451},[3434,8882,4993],{"class":3458},[3434,8884,8256],{"class":3451},[3434,8886,8887],{"class":3440},"\u002F* Яскравіший фокус *\u002F\n",[3434,8889,8890],{"class":3436,"line":4384},[3434,8891,3495],{"emptyLinePlaceholder":3494},[3434,8893,8894],{"class":3436,"line":4390},[3434,8895,8896],{"class":3440},"    \u002F* --- Акцент (бренд) — трохи яскравіший для темного фону --- *\u002F\n",[3434,8898,8899,8901,8904,8906,8908,8910],{"class":3436,"line":4406},[3434,8900,3580],{"class":3458},[3434,8902,8903],{"class":3451},":       ",[3434,8905,3519],{"class":3465},[3434,8907,3469],{"class":3451},[3434,8909,4993],{"class":3458},[3434,8911,3482],{"class":3451},[3434,8913,8914,8916,8918,8920,8922,8925],{"class":3436,"line":4422},[3434,8915,8433],{"class":3458},[3434,8917,3462],{"class":3451},[3434,8919,3519],{"class":3465},[3434,8921,3469],{"class":3451},[3434,8923,8924],{"class":3458},"--color-indigo-300",[3434,8926,3482],{"class":3451},[3434,8928,8929,8931,8933,8935,8937,8940,8943,8945,8948,8951,8954],{"class":3436,"line":4428},[3434,8930,8449],{"class":3458},[3434,8932,3462],{"class":3451},[3434,8934,3466],{"class":3465},[3434,8936,3469],{"class":3451},[3434,8938,8939],{"class":3472},"0.257",[3434,8941,8942],{"class":3472}," 0.090",[3434,8944,7757],{"class":3472},[3434,8946,8947],{"class":3451},") \u002F ",[3434,8949,8950],{"class":3472},"0.2",[3434,8952,8953],{"class":3451},"; ",[3434,8955,8956],{"class":3440},"\u002F* приглушений indigo-950 *\u002F\n",[3434,8958,8959,8961,8963,8965,8967,8969],{"class":3436,"line":4437},[3434,8960,8465],{"class":3458},[3434,8962,8153],{"class":3451},[3434,8964,3519],{"class":3465},[3434,8966,3469],{"class":3451},[3434,8968,8924],{"class":3458},[3434,8970,3482],{"class":3451},[3434,8972,8973],{"class":3436,"line":4452},[3434,8974,3495],{"emptyLinePlaceholder":3494},[3434,8976,8977],{"class":3436,"line":4467},[3434,8978,8485],{"class":3440},[3434,8980,8981,8983,8985,8987,8989,8992],{"class":3436,"line":4473},[3434,8982,8490],{"class":3458},[3434,8984,8246],{"class":3451},[3434,8986,3519],{"class":3465},[3434,8988,3469],{"class":3451},[3434,8990,8991],{"class":3458},"--color-success-900",[3434,8993,3482],{"class":3451},[3434,8995,8996,8998,9000,9002,9004,9007],{"class":3436,"line":4482},[3434,8997,8506],{"class":3458},[3434,8999,3462],{"class":3451},[3434,9001,3519],{"class":3465},[3434,9003,3469],{"class":3451},[3434,9005,9006],{"class":3458},"--color-success-400",[3434,9008,3482],{"class":3451},[3434,9010,9011,9013,9015,9017,9019,9022,9025,9027,9029,9031],{"class":3436,"line":4491},[3434,9012,8522],{"class":3458},[3434,9014,8246],{"class":3451},[3434,9016,3466],{"class":3465},[3434,9018,3469],{"class":3451},[3434,9020,9021],{"class":3472},"0.476",[3434,9023,9024],{"class":3472}," 0.144",[3434,9026,7955],{"class":3472},[3434,9028,8947],{"class":3451},[3434,9030,8950],{"class":3472},[3434,9032,6132],{"class":3451},[3434,9034,9035,9037,9039,9041,9043,9046],{"class":3436,"line":4515},[3434,9036,8538],{"class":3458},[3434,9038,3462],{"class":3451},[3434,9040,3519],{"class":3465},[3434,9042,3469],{"class":3451},[3434,9044,9045],{"class":3458},"--color-warning-400",[3434,9047,3482],{"class":3451},[3434,9049,9050,9052,9054,9056,9058,9061,9064,9066,9068,9070],{"class":3436,"line":4539},[3434,9051,8554],{"class":3458},[3434,9053,8133],{"class":3451},[3434,9055,3466],{"class":3465},[3434,9057,3469],{"class":3451},[3434,9059,9060],{"class":3472},"0.391",[3434,9062,9063],{"class":3472}," 0.155",[3434,9065,8020],{"class":3472},[3434,9067,8947],{"class":3451},[3434,9069,8950],{"class":3472},[3434,9071,6132],{"class":3451},[3434,9073,9074,9076,9078,9080,9082,9085],{"class":3436,"line":4548},[3434,9075,8570],{"class":3458},[3434,9077,8246],{"class":3451},[3434,9079,3519],{"class":3465},[3434,9081,3469],{"class":3451},[3434,9083,9084],{"class":3458},"--color-error-400",[3434,9086,3482],{"class":3451},[3434,9088,9089],{"class":3436,"line":4557},[3434,9090,3488],{"class":3451},[3550,9092,9093,9094,9096,9097,7250,9100,9103,9104,9106],{},"Зверніть увагу на закономірність: у темній темі текст стає світлим, а фони — темними. Але важливо, що ієрархія зберігається: ",[3357,9095,7253],{}," завжди трохи світліший за ",[3357,9098,9099],{},"bg-base",[3357,9101,9102],{},"text-secondary"," завжди менш контрастний за ",[3357,9105,7249],{},". Це забезпечує читабельність та візуальну ієрархію незалежно від теми.",[3396,9108],{},[3403,9110,9112],{"id":9111},"_34-використання-семантичних-токенів-у-tailwind-v4","3.4. Використання семантичних токенів у Tailwind v4",[3353,9114,9115],{},"У Tailwind v4 є два способи використання CSS-змінних у класах.",[3353,9117,9118,9121],{},[3365,9119,9120],{},"Спосіб 1: Синтаксис квадратних дужок"," (arbitrary values):",[3425,9123,9125],{"className":3656,"code":9124,"language":3658,"meta":3430,"style":3430},"\u003Cdiv class=\"bg-[var(--color-bg-surface)] text-[var(--color-text-primary)]\">\n    ...\n\u003C\u002Fdiv>\n",[3357,9126,9127,9142,9147],{"__ignoreMap":3430},[3434,9128,9129,9131,9133,9135,9137,9140],{"class":3436,"line":3437},[3434,9130,3681],{"class":3665},[3434,9132,4012],{"class":3669},[3434,9134,3988],{"class":3458},[3434,9136,3689],{"class":3451},[3434,9138,9139],{"class":3692},"\"bg-[var(--color-bg-surface)] text-[var(--color-text-primary)]\"",[3434,9141,3676],{"class":3665},[3434,9143,9144],{"class":3436,"line":3444},[3434,9145,9146],{"class":3451},"    ...\n",[3434,9148,9149,9151,9153],{"class":3436,"line":3455},[3434,9150,3964],{"class":3665},[3434,9152,4012],{"class":3669},[3434,9154,3676],{"class":3665},[3353,9156,9157,9160],{},[3365,9158,9159],{},"Спосіб 2: Синтаксис круглих дужок з дефісами"," (новинка Tailwind v4):",[3425,9162,9164],{"className":3656,"code":9163,"language":3658,"meta":3430,"style":3430},"\u003Cdiv class=\"bg-(--color-bg-surface) text-(--color-text-primary)\">\n    ...\n\u003C\u002Fdiv>\n",[3357,9165,9166,9181,9185],{"__ignoreMap":3430},[3434,9167,9168,9170,9172,9174,9176,9179],{"class":3436,"line":3437},[3434,9169,3681],{"class":3665},[3434,9171,4012],{"class":3669},[3434,9173,3988],{"class":3458},[3434,9175,3689],{"class":3451},[3434,9177,9178],{"class":3692},"\"bg-(--color-bg-surface) text-(--color-text-primary)\"",[3434,9180,3676],{"class":3665},[3434,9182,9183],{"class":3436,"line":3444},[3434,9184,9146],{"class":3451},[3434,9186,9187,9189,9191],{"class":3436,"line":3455},[3434,9188,3964],{"class":3665},[3434,9190,4012],{"class":3669},[3434,9192,3676],{"class":3665},[3353,9194,9195,9196,9199,9200,9203,9204,4726],{},"Другий синтаксис є ",[3365,9197,9198],{},"скороченням",", введеним у Tailwind v4. Він коротший та читабельніший. ",[3357,9201,9202],{},"bg-(--color-bg-surface)"," еквівалентний ",[3357,9205,9206],{},"bg-[var(--color-bg-surface)]",[3388,9208,9209,9210,9213],{},"Синтаксис ",[3357,9211,9212],{},"(--var-name)"," — це справжня новинка Tailwind v4, яка суттєво спрощує роботу з CSS Custom Properties. Варто запам'ятати цей патерн — він знадобиться вам постійно у production-коді.",[3353,9215,9216],{},"Відтепер компонент картки, що раніше виглядав так:",[3425,9218,9220],{"className":3656,"code":9219,"language":3658,"meta":3430,"style":3430},"\u003C!-- ❌ Підхід dark: — багато класів, важко підтримувати -->\n\u003Cdiv class=\"bg-white dark:bg-slate-900\n            text-slate-900 dark:text-slate-50\n            border border-slate-200 dark:border-slate-800\n            shadow-sm\">\n",[3357,9221,9222,9227,9240,9245,9250],{"__ignoreMap":3430},[3434,9223,9224],{"class":3436,"line":3437},[3434,9225,9226],{"class":3440},"\u003C!-- ❌ Підхід dark: — багато класів, важко підтримувати -->\n",[3434,9228,9229,9231,9233,9235,9237],{"class":3436,"line":3444},[3434,9230,3681],{"class":3665},[3434,9232,4012],{"class":3669},[3434,9234,3988],{"class":3458},[3434,9236,3689],{"class":3451},[3434,9238,9239],{"class":3692},"\"bg-white dark:bg-slate-900\n",[3434,9241,9242],{"class":3436,"line":3455},[3434,9243,9244],{"class":3692},"            text-slate-900 dark:text-slate-50\n",[3434,9246,9247],{"class":3436,"line":3485},[3434,9248,9249],{"class":3692},"            border border-slate-200 dark:border-slate-800\n",[3434,9251,9252,9255],{"class":3436,"line":3491},[3434,9253,9254],{"class":3692},"            shadow-sm\"",[3434,9256,3676],{"class":3665},[3353,9258,9259],{},"Тепер виглядає так:",[3425,9261,9263],{"className":3656,"code":9262,"language":3658,"meta":3430,"style":3430},"\u003C!-- ✅ Підхід семантичних токенів — лаконічно та підтримувано -->\n\u003Cdiv class=\"bg-(--color-bg-surface)\n            text-(--color-text-primary)\n            border border-(--color-border-default)\n            shadow-sm\">\n",[3357,9264,9265,9270,9283,9288,9293],{"__ignoreMap":3430},[3434,9266,9267],{"class":3436,"line":3437},[3434,9268,9269],{"class":3440},"\u003C!-- ✅ Підхід семантичних токенів — лаконічно та підтримувано -->\n",[3434,9271,9272,9274,9276,9278,9280],{"class":3436,"line":3444},[3434,9273,3681],{"class":3665},[3434,9275,4012],{"class":3669},[3434,9277,3988],{"class":3458},[3434,9279,3689],{"class":3451},[3434,9281,9282],{"class":3692},"\"bg-(--color-bg-surface)\n",[3434,9284,9285],{"class":3436,"line":3455},[3434,9286,9287],{"class":3692},"            text-(--color-text-primary)\n",[3434,9289,9290],{"class":3436,"line":3485},[3434,9291,9292],{"class":3692},"            border border-(--color-border-default)\n",[3434,9294,9295,9297],{"class":3436,"line":3491},[3434,9296,9254],{"class":3692},[3434,9298,3676],{"class":3665},[3651,9300,9301],{":tailwind":3653},[3425,9302,9304],{"className":3656,"code":9303,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n\u003Cmeta charset=\"UTF-8\">\n\u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\">\u003C\u002Fscript>\n\u003Clink href=\"https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\u003Cstyle>\n    @custom-variant dark (&:is(.dark *));\n\n    \u002F* Root and dark mode variables mimicking semantic tokens *\u002F\n    :root {\n        --color-bg-base: oklch(0.984 0.003 247.858);\n        --color-bg-surface: oklch(1 0 0);\n        --color-text-primary: oklch(0.208 0.042 265.755);\n        --color-text-muted: oklch(0.554 0.034 264.364);\n        --color-border-default: oklch(0.929 0.008 264.542);\n        --color-accent: oklch(0.585 0.233 277);\n    }\n    .dark {\n        --color-bg-base: oklch(0.113 0.021 261);\n        --color-bg-surface: oklch(0.179 0.027 261);\n        --color-text-primary: oklch(0.984 0.003 247.858);\n        --color-text-muted: oklch(0.704 0.026 264.436);\n        --color-border-default: oklch(0.300 0.025 264);\n        --color-accent: oklch(0.673 0.182 276);\n    }\n\u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"p-6 bg-slate-50\" style=\"font-family: 'Inter', system-ui, sans-serif;\">\n    \u003Cdiv id=\"comparison-wrapper\" class=\"max-w-2xl mx-auto space-y-6\">\n        \u003Cdiv class=\"flex items-center justify-between border-b border-slate-200 pb-3\">\n            \u003Cp class=\"text-xs font-bold text-slate-400 uppercase tracking-widest\">Semantic Tokens vs Raw dark: Classes\u003C\u002Fp>\n            \u003Cbutton onclick=\"document.getElementById('comparison-wrapper').classList.toggle('dark'); updateToggleBtn(this)\" \n                    class=\"px-3 py-1 bg-slate-100 hover:bg-slate-200 text-slate-700 dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700 text-xs font-semibold rounded-lg transition-all\">\n                🌙 Ввімкнути темну\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n\n        \u003Cdiv class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n            \u003C!-- Left Card: Raw dark: classes -->\n            \u003Cdiv class=\"space-y-3\">\n                \u003Cdiv class=\"flex justify-between items-center px-1\">\n                    \u003Cspan class=\"text-xs font-bold text-red-500 flex items-center gap-1\">❌ Підхід dark:\u003C\u002Fspan>\n                    \u003Cspan class=\"text-[10px] text-slate-400 bg-slate-100 px-2 py-0.5 rounded font-mono\">11 класів стилізації теми\u003C\u002Fspan>\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-50 border border-slate-200 dark:border-slate-800 shadow-sm rounded-2xl p-5 space-y-3 transition-colors duration-250\">\n                    \u003Ch4 class=\"font-bold text-sm\">Звичайні класи\u003C\u002Fh4>\n                    \u003Cp class=\"text-xs text-slate-500 dark:text-slate-400 leading-normal\">\n                        Кожен колір дублюється парою класів. Велика кількість коду ускладнює читання структури.\n                    \u003C\u002Fp>\n                    \u003Cdiv class=\"pt-2 border-t border-slate-100 dark:border-slate-800 flex justify-between items-center text-[10px] text-slate-400 dark:text-slate-500 font-mono\">\n                        \u003Cspan>class=\"...\"\u003C\u002Fspan>\n                        \u003Cspan>v3 style\u003C\u002Fspan>\n                    \u003C\u002Fdiv>\n                \u003C\u002Fdiv>\n            \u003C\u002Fdiv>\n\n            \u003C!-- Right Card: Semantic Tokens -->\n            \u003Cdiv class=\"space-y-3\">\n                \u003Cdiv class=\"flex justify-between items-center px-1\">\n                    \u003Cspan class=\"text-xs font-bold text-emerald-600 flex items-center gap-1\">✅ Семантичні токени\u003C\u002Fspan>\n                    \u003Cspan class=\"text-[10px] text-slate-400 bg-slate-100 dark:bg-slate-800 dark:text-slate-400 px-2 py-0.5 rounded font-mono\">4 класи стилізації теми\u003C\u002Fspan>\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"bg-(--color-bg-surface) text-(--color-text-primary) border border-(--color-border-default) shadow-sm rounded-2xl p-5 space-y-3 transition-colors duration-250\">\n                    \u003Ch4 class=\"font-bold text-sm\">Семантичний підхід\u003C\u002Fh4>\n                    \u003Cp class=\"text-xs text-(--color-text-muted) leading-normal\">\n                        Використовуємо змінні. HTML залишається лаконічним, а адаптація відбувається на рівні CSS.\n                    \u003C\u002Fp>\n                    \u003Cdiv class=\"pt-2 border-t border-(--color-border-default) flex justify-between items-center text-[10px] text-(--color-text-muted) font-mono\">\n                        \u003Cspan>class=\"...\"\u003C\u002Fspan>\n                        \u003Cspan>v4 style\u003C\u002Fspan>\n                    \u003C\u002Fdiv>\n                \u003C\u002Fdiv>\n            \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cscript>\n        function updateToggleBtn(btn) {\n            const isDark = document.getElementById('comparison-wrapper').classList.contains('dark');\n            btn.textContent = isDark ? '☀️ Ввімкнути світлу' : '🌙 Ввімкнути темну';\n        }\n    \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,9305,9306,9316,9330,9338,9352,9370,9390,9398,9404,9408,9413,9419,9441,9460,9481,9503,9525,9543,9547,9553,9571,9589,9607,9628,9646,9666,9670,9678,9686,9706,9727,9742,9765,9812,9822,9826,9834,9842,9846,9860,9865,9880,9895,9919,9943,9951,9966,9990,10005,10010,10018,10033,10050,10067,10075,10083,10091,10095,10100,10114,10128,10152,10176,10184,10199,10222,10237,10242,10250,10265,10281,10298,10306,10314,10322,10330,10338,10342,10350,10362,10394,10416,10420,10428,10436],{"__ignoreMap":3430},[3434,9307,9308,9310,9312,9314],{"class":3436,"line":3437},[3434,9309,3666],{"class":3665},[3434,9311,3670],{"class":3669},[3434,9313,3673],{"class":3458},[3434,9315,3676],{"class":3665},[3434,9317,9318,9320,9322,9324,9326,9328],{"class":3436,"line":3444},[3434,9319,3681],{"class":3665},[3434,9321,3658],{"class":3669},[3434,9323,3686],{"class":3458},[3434,9325,3689],{"class":3451},[3434,9327,3693],{"class":3692},[3434,9329,3676],{"class":3665},[3434,9331,9332,9334,9336],{"class":3436,"line":3455},[3434,9333,3681],{"class":3665},[3434,9335,3702],{"class":3669},[3434,9337,3676],{"class":3665},[3434,9339,9340,9342,9344,9346,9348,9350],{"class":3436,"line":3485},[3434,9341,3681],{"class":3665},[3434,9343,3711],{"class":3669},[3434,9345,3714],{"class":3458},[3434,9347,3689],{"class":3451},[3434,9349,3719],{"class":3692},[3434,9351,3676],{"class":3665},[3434,9353,9354,9356,9358,9360,9362,9364,9366,9368],{"class":3436,"line":3491},[3434,9355,3681],{"class":3665},[3434,9357,3728],{"class":3669},[3434,9359,3731],{"class":3458},[3434,9361,3689],{"class":3734},[3434,9363,3737],{"class":3692},[3434,9365,3740],{"class":3665},[3434,9367,3728],{"class":3669},[3434,9369,3676],{"class":3665},[3434,9371,9372,9374,9376,9378,9380,9382,9384,9386,9388],{"class":3436,"line":3498},[3434,9373,3681],{"class":3665},[3434,9375,3751],{"class":3669},[3434,9377,3754],{"class":3458},[3434,9379,3689],{"class":3451},[3434,9381,3759],{"class":3692},[3434,9383,3762],{"class":3458},[3434,9385,3689],{"class":3451},[3434,9387,3767],{"class":3692},[3434,9389,3676],{"class":3665},[3434,9391,9392,9394,9396],{"class":3436,"line":3504},[3434,9393,3681],{"class":3665},[3434,9395,3776],{"class":3669},[3434,9397,3676],{"class":3665},[3434,9399,9400,9402],{"class":3436,"line":3511},[3434,9401,5524],{"class":5199},[3434,9403,5527],{"class":3734},[3434,9405,9406],{"class":3436,"line":3529},[3434,9407,3495],{"emptyLinePlaceholder":3494},[3434,9409,9410],{"class":3436,"line":3810},[3434,9411,9412],{"class":3440},"    \u002F* Root and dark mode variables mimicking semantic tokens *\u002F\n",[3434,9414,9415,9417],{"class":3436,"line":3816},[3434,9416,3783],{"class":3447},[3434,9418,3452],{"class":3734},[3434,9420,9421,9424,9426,9428,9430,9433,9436,9439],{"class":3436,"line":3821},[3434,9422,9423],{"class":3458},"        --color-bg-base",[3434,9425,3462],{"class":3734},[3434,9427,3466],{"class":3465},[3434,9429,3469],{"class":3734},[3434,9431,9432],{"class":3472},"0.984",[3434,9434,9435],{"class":3472}," 0.003",[3434,9437,9438],{"class":3472}," 247.858",[3434,9440,3482],{"class":3734},[3434,9442,9443,9446,9448,9450,9452,9454,9456,9458],{"class":3436,"line":3829},[3434,9444,9445],{"class":3458},"        --color-bg-surface",[3434,9447,3462],{"class":3734},[3434,9449,3466],{"class":3465},[3434,9451,3469],{"class":3734},[3434,9453,8160],{"class":3472},[3434,9455,4757],{"class":3472},[3434,9457,4757],{"class":3472},[3434,9459,3482],{"class":3734},[3434,9461,9462,9465,9467,9469,9471,9474,9476,9479],{"class":3436,"line":3835},[3434,9463,9464],{"class":3458},"        --color-text-primary",[3434,9466,3462],{"class":3734},[3434,9468,3466],{"class":3465},[3434,9470,3469],{"class":3734},[3434,9472,9473],{"class":3472},"0.208",[3434,9475,5233],{"class":3472},[3434,9477,9478],{"class":3472}," 265.755",[3434,9480,3482],{"class":3734},[3434,9482,9483,9486,9488,9490,9492,9495,9498,9501],{"class":3436,"line":3857},[3434,9484,9485],{"class":3458},"        --color-text-muted",[3434,9487,3462],{"class":3734},[3434,9489,3466],{"class":3465},[3434,9491,3469],{"class":3734},[3434,9493,9494],{"class":3472},"0.554",[3434,9496,9497],{"class":3472}," 0.034",[3434,9499,9500],{"class":3472}," 264.364",[3434,9502,3482],{"class":3734},[3434,9504,9505,9508,9510,9512,9514,9517,9520,9523],{"class":3436,"line":3862},[3434,9506,9507],{"class":3458},"        --color-border-default",[3434,9509,3462],{"class":3734},[3434,9511,3466],{"class":3465},[3434,9513,3469],{"class":3734},[3434,9515,9516],{"class":3472},"0.929",[3434,9518,9519],{"class":3472}," 0.008",[3434,9521,9522],{"class":3472}," 264.542",[3434,9524,3482],{"class":3734},[3434,9526,9527,9529,9531,9533,9535,9537,9539,9541],{"class":3436,"line":3867},[3434,9528,3790],{"class":3458},[3434,9530,3462],{"class":3734},[3434,9532,3466],{"class":3465},[3434,9534,3469],{"class":3734},[3434,9536,3589],{"class":3472},[3434,9538,3592],{"class":3472},[3434,9540,3595],{"class":3472},[3434,9542,3482],{"class":3734},[3434,9544,9545],{"class":3436,"line":3873},[3434,9546,3813],{"class":3734},[3434,9548,9549,9551],{"class":3436,"line":3881},[3434,9550,5208],{"class":3447},[3434,9552,3452],{"class":3734},[3434,9554,9555,9557,9559,9561,9563,9565,9567,9569],{"class":3436,"line":3898},[3434,9556,9423],{"class":3458},[3434,9558,3462],{"class":3734},[3434,9560,3466],{"class":3465},[3434,9562,3469],{"class":3734},[3434,9564,8622],{"class":3472},[3434,9566,8625],{"class":3472},[3434,9568,7527],{"class":3472},[3434,9570,3482],{"class":3734},[3434,9572,9573,9575,9577,9579,9581,9583,9585,9587],{"class":3436,"line":3903},[3434,9574,9445],{"class":3458},[3434,9576,3462],{"class":3734},[3434,9578,3466],{"class":3465},[3434,9580,3469],{"class":3734},[3434,9582,8645],{"class":3472},[3434,9584,8648],{"class":3472},[3434,9586,7527],{"class":3472},[3434,9588,3482],{"class":3734},[3434,9590,9591,9593,9595,9597,9599,9601,9603,9605],{"class":3436,"line":3911},[3434,9592,9464],{"class":3458},[3434,9594,3462],{"class":3734},[3434,9596,3466],{"class":3465},[3434,9598,3469],{"class":3734},[3434,9600,9432],{"class":3472},[3434,9602,9435],{"class":3472},[3434,9604,9438],{"class":3472},[3434,9606,3482],{"class":3734},[3434,9608,9609,9611,9613,9615,9617,9620,9623,9626],{"class":3436,"line":3927},[3434,9610,9485],{"class":3458},[3434,9612,3462],{"class":3734},[3434,9614,3466],{"class":3465},[3434,9616,3469],{"class":3734},[3434,9618,9619],{"class":3472},"0.704",[3434,9621,9622],{"class":3472}," 0.026",[3434,9624,9625],{"class":3472}," 264.436",[3434,9627,3482],{"class":3734},[3434,9629,9630,9632,9634,9636,9638,9640,9642,9644],{"class":3436,"line":3932},[3434,9631,9507],{"class":3458},[3434,9633,3462],{"class":3734},[3434,9635,3466],{"class":3465},[3434,9637,3469],{"class":3734},[3434,9639,8839],{"class":3472},[3434,9641,8671],{"class":3472},[3434,9643,4783],{"class":3472},[3434,9645,3482],{"class":3734},[3434,9647,9648,9650,9652,9654,9656,9659,9662,9664],{"class":3436,"line":3940},[3434,9649,3790],{"class":3458},[3434,9651,3462],{"class":3734},[3434,9653,3466],{"class":3465},[3434,9655,3469],{"class":3734},[3434,9657,9658],{"class":3472},"0.673",[3434,9660,9661],{"class":3472}," 0.182",[3434,9663,7638],{"class":3472},[3434,9665,3482],{"class":3734},[3434,9667,9668],{"class":3436,"line":3956},[3434,9669,3813],{"class":3734},[3434,9671,9672,9674,9676],{"class":3436,"line":3961},[3434,9673,3964],{"class":3665},[3434,9675,3776],{"class":3669},[3434,9677,3676],{"class":3665},[3434,9679,9680,9682,9684],{"class":3436,"line":3971},[3434,9681,3964],{"class":3665},[3434,9683,3702],{"class":3669},[3434,9685,3676],{"class":3665},[3434,9687,9688,9690,9692,9694,9696,9698,9700,9702,9704],{"class":3436,"line":3980},[3434,9689,3681],{"class":3665},[3434,9691,3985],{"class":3669},[3434,9693,3988],{"class":3458},[3434,9695,3689],{"class":3451},[3434,9697,3993],{"class":3692},[3434,9699,3996],{"class":3458},[3434,9701,3689],{"class":3451},[3434,9703,4001],{"class":3692},[3434,9705,3676],{"class":3665},[3434,9707,9708,9710,9712,9714,9716,9719,9721,9723,9725],{"class":3436,"line":4006},[3434,9709,4009],{"class":3665},[3434,9711,4012],{"class":3669},[3434,9713,5740],{"class":3458},[3434,9715,3689],{"class":3451},[3434,9717,9718],{"class":3692},"\"comparison-wrapper\"",[3434,9720,3988],{"class":3458},[3434,9722,3689],{"class":3451},[3434,9724,4019],{"class":3692},[3434,9726,3676],{"class":3665},[3434,9728,9729,9731,9733,9735,9737,9740],{"class":3436,"line":4024},[3434,9730,4027],{"class":3665},[3434,9732,4012],{"class":3669},[3434,9734,3988],{"class":3458},[3434,9736,3689],{"class":3451},[3434,9738,9739],{"class":3692},"\"flex items-center justify-between border-b border-slate-200 pb-3\"",[3434,9741,3676],{"class":3665},[3434,9743,9744,9746,9748,9750,9752,9754,9756,9759,9761,9763],{"class":3436,"line":4051},[3434,9745,4082],{"class":3665},[3434,9747,3353],{"class":3669},[3434,9749,3988],{"class":3458},[3434,9751,3689],{"class":3451},[3434,9753,5606],{"class":3692},[3434,9755,4039],{"class":3665},[3434,9757,9758],{"class":3451},"Semantic Tokens vs Raw dark: Classes",[3434,9760,3964],{"class":3665},[3434,9762,3353],{"class":3669},[3434,9764,3676],{"class":3665},[3434,9766,9767,9769,9771,9773,9775,9777,9779,9781,9783,9785,9788,9790,9792,9794,9796,9798,9800,9802,9804,9806,9808,9810],{"class":3436,"line":4057},[3434,9768,4082],{"class":3665},[3434,9770,4342],{"class":3669},[3434,9772,5636],{"class":3458},[3434,9774,3689],{"class":3451},[3434,9776,5641],{"class":3692},[3434,9778,5645],{"class":5644},[3434,9780,4726],{"class":3692},[3434,9782,5650],{"class":3465},[3434,9784,3469],{"class":3692},[3434,9786,9787],{"class":5655},"'comparison-wrapper'",[3434,9789,5659],{"class":3692},[3434,9791,5662],{"class":5644},[3434,9793,4726],{"class":3692},[3434,9795,5667],{"class":3465},[3434,9797,3469],{"class":3692},[3434,9799,5672],{"class":5655},[3434,9801,3598],{"class":3692},[3434,9803,5677],{"class":3465},[3434,9805,3469],{"class":3692},[3434,9807,5683],{"class":5682},[3434,9809,5686],{"class":3692},[3434,9811,5689],{"class":3451},[3434,9813,9814,9816,9818,9820],{"class":3436,"line":4073},[3434,9815,5694],{"class":3458},[3434,9817,3689],{"class":3451},[3434,9819,5699],{"class":3692},[3434,9821,3676],{"class":3665},[3434,9823,9824],{"class":3436,"line":4079},[3434,9825,5706],{"class":3451},[3434,9827,9828,9830,9832],{"class":3436,"line":4096},[3434,9829,4372],{"class":3665},[3434,9831,4342],{"class":3669},[3434,9833,3676],{"class":3665},[3434,9835,9836,9838,9840],{"class":3436,"line":4113},[3434,9837,4677],{"class":3665},[3434,9839,4012],{"class":3669},[3434,9841,3676],{"class":3665},[3434,9843,9844],{"class":3436,"line":4119},[3434,9845,3495],{"emptyLinePlaceholder":3494},[3434,9847,9848,9850,9852,9854,9856,9858],{"class":3436,"line":4129},[3434,9849,4027],{"class":3665},[3434,9851,4012],{"class":3669},[3434,9853,3988],{"class":3458},[3434,9855,3689],{"class":3451},[3434,9857,4068],{"class":3692},[3434,9859,3676],{"class":3665},[3434,9861,9862],{"class":3436,"line":4145},[3434,9863,9864],{"class":3440},"            \u003C!-- Left Card: Raw dark: classes -->\n",[3434,9866,9867,9869,9871,9873,9875,9878],{"class":3436,"line":4162},[3434,9868,4082],{"class":3665},[3434,9870,4012],{"class":3669},[3434,9872,3988],{"class":3458},[3434,9874,3689],{"class":3451},[3434,9876,9877],{"class":3692},"\"space-y-3\"",[3434,9879,3676],{"class":3665},[3434,9881,9882,9884,9886,9888,9890,9893],{"class":3436,"line":4168},[3434,9883,4099],{"class":3665},[3434,9885,4012],{"class":3669},[3434,9887,3988],{"class":3458},[3434,9889,3689],{"class":3451},[3434,9891,9892],{"class":3692},"\"flex justify-between items-center px-1\"",[3434,9894,3676],{"class":3665},[3434,9896,9897,9899,9901,9903,9905,9908,9910,9913,9915,9917],{"class":3436,"line":4178},[3434,9898,4148],{"class":3665},[3434,9900,3434],{"class":3669},[3434,9902,3988],{"class":3458},[3434,9904,3689],{"class":3451},[3434,9906,9907],{"class":3692},"\"text-xs font-bold text-red-500 flex items-center gap-1\"",[3434,9909,4039],{"class":3665},[3434,9911,9912],{"class":3451},"❌ Підхід dark:",[3434,9914,3964],{"class":3665},[3434,9916,3434],{"class":3669},[3434,9918,3676],{"class":3665},[3434,9920,9921,9923,9925,9927,9929,9932,9934,9937,9939,9941],{"class":3436,"line":4187},[3434,9922,4148],{"class":3665},[3434,9924,3434],{"class":3669},[3434,9926,3988],{"class":3458},[3434,9928,3689],{"class":3451},[3434,9930,9931],{"class":3692},"\"text-[10px] text-slate-400 bg-slate-100 px-2 py-0.5 rounded font-mono\"",[3434,9933,4039],{"class":3665},[3434,9935,9936],{"class":3451},"11 класів стилізації теми",[3434,9938,3964],{"class":3665},[3434,9940,3434],{"class":3669},[3434,9942,3676],{"class":3665},[3434,9944,9945,9947,9949],{"class":3436,"line":4213},[3434,9946,4122],{"class":3665},[3434,9948,4012],{"class":3669},[3434,9950,3676],{"class":3665},[3434,9952,9953,9955,9957,9959,9961,9964],{"class":3436,"line":4238},[3434,9954,4099],{"class":3665},[3434,9956,4012],{"class":3669},[3434,9958,3988],{"class":3458},[3434,9960,3689],{"class":3451},[3434,9962,9963],{"class":3692},"\"bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-50 border border-slate-200 dark:border-slate-800 shadow-sm rounded-2xl p-5 space-y-3 transition-colors duration-250\"",[3434,9965,3676],{"class":3665},[3434,9967,9968,9970,9972,9974,9976,9979,9981,9984,9986,9988],{"class":3436,"line":4247},[3434,9969,4148],{"class":3665},[3434,9971,3554],{"class":3669},[3434,9973,3988],{"class":3458},[3434,9975,3689],{"class":3451},[3434,9977,9978],{"class":3692},"\"font-bold text-sm\"",[3434,9980,4039],{"class":3665},[3434,9982,9983],{"class":3451},"Звичайні класи",[3434,9985,3964],{"class":3665},[3434,9987,3554],{"class":3669},[3434,9989,3676],{"class":3665},[3434,9991,9992,9994,9996,9998,10000,10003],{"class":3436,"line":4256},[3434,9993,4148],{"class":3665},[3434,9995,3353],{"class":3669},[3434,9997,3988],{"class":3458},[3434,9999,3689],{"class":3451},[3434,10001,10002],{"class":3692},"\"text-xs text-slate-500 dark:text-slate-400 leading-normal\"",[3434,10004,3676],{"class":3665},[3434,10006,10007],{"class":3436,"line":4272},[3434,10008,10009],{"class":3451},"                        Кожен колір дублюється парою класів. Велика кількість коду ускладнює читання структури.\n",[3434,10011,10012,10014,10016],{"class":3436,"line":4288},[3434,10013,4171],{"class":3665},[3434,10015,3353],{"class":3669},[3434,10017,3676],{"class":3665},[3434,10019,10020,10022,10024,10026,10028,10031],{"class":3436,"line":4319},[3434,10021,4148],{"class":3665},[3434,10023,4012],{"class":3669},[3434,10025,3988],{"class":3458},[3434,10027,3689],{"class":3451},[3434,10029,10030],{"class":3692},"\"pt-2 border-t border-slate-100 dark:border-slate-800 flex justify-between items-center text-[10px] text-slate-400 dark:text-slate-500 font-mono\"",[3434,10032,3676],{"class":3665},[3434,10034,10035,10037,10039,10041,10044,10046,10048],{"class":3436,"line":4328},[3434,10036,4190],{"class":3665},[3434,10038,3434],{"class":3669},[3434,10040,4039],{"class":3665},[3434,10042,10043],{"class":3451},"class=\"...\"",[3434,10045,3964],{"class":3665},[3434,10047,3434],{"class":3669},[3434,10049,3676],{"class":3665},[3434,10051,10052,10054,10056,10058,10061,10063,10065],{"class":3436,"line":4337},[3434,10053,4190],{"class":3665},[3434,10055,3434],{"class":3669},[3434,10057,4039],{"class":3665},[3434,10059,10060],{"class":3451},"v3 style",[3434,10062,3964],{"class":3665},[3434,10064,3434],{"class":3669},[3434,10066,3676],{"class":3665},[3434,10068,10069,10071,10073],{"class":3436,"line":4354},[3434,10070,4171],{"class":3665},[3434,10072,4012],{"class":3669},[3434,10074,3676],{"class":3665},[3434,10076,10077,10079,10081],{"class":3436,"line":4360},[3434,10078,4122],{"class":3665},[3434,10080,4012],{"class":3669},[3434,10082,3676],{"class":3665},[3434,10084,10085,10087,10089],{"class":3436,"line":4369},[3434,10086,4372],{"class":3665},[3434,10088,4012],{"class":3669},[3434,10090,3676],{"class":3665},[3434,10092,10093],{"class":3436,"line":4379},[3434,10094,3495],{"emptyLinePlaceholder":3494},[3434,10096,10097],{"class":3436,"line":4384},[3434,10098,10099],{"class":3440},"            \u003C!-- Right Card: Semantic Tokens -->\n",[3434,10101,10102,10104,10106,10108,10110,10112],{"class":3436,"line":4390},[3434,10103,4082],{"class":3665},[3434,10105,4012],{"class":3669},[3434,10107,3988],{"class":3458},[3434,10109,3689],{"class":3451},[3434,10111,9877],{"class":3692},[3434,10113,3676],{"class":3665},[3434,10115,10116,10118,10120,10122,10124,10126],{"class":3436,"line":4406},[3434,10117,4099],{"class":3665},[3434,10119,4012],{"class":3669},[3434,10121,3988],{"class":3458},[3434,10123,3689],{"class":3451},[3434,10125,9892],{"class":3692},[3434,10127,3676],{"class":3665},[3434,10129,10130,10132,10134,10136,10138,10141,10143,10146,10148,10150],{"class":3436,"line":4422},[3434,10131,4148],{"class":3665},[3434,10133,3434],{"class":3669},[3434,10135,3988],{"class":3458},[3434,10137,3689],{"class":3451},[3434,10139,10140],{"class":3692},"\"text-xs font-bold text-emerald-600 flex items-center gap-1\"",[3434,10142,4039],{"class":3665},[3434,10144,10145],{"class":3451},"✅ Семантичні токени",[3434,10147,3964],{"class":3665},[3434,10149,3434],{"class":3669},[3434,10151,3676],{"class":3665},[3434,10153,10154,10156,10158,10160,10162,10165,10167,10170,10172,10174],{"class":3436,"line":4428},[3434,10155,4148],{"class":3665},[3434,10157,3434],{"class":3669},[3434,10159,3988],{"class":3458},[3434,10161,3689],{"class":3451},[3434,10163,10164],{"class":3692},"\"text-[10px] text-slate-400 bg-slate-100 dark:bg-slate-800 dark:text-slate-400 px-2 py-0.5 rounded font-mono\"",[3434,10166,4039],{"class":3665},[3434,10168,10169],{"class":3451},"4 класи стилізації теми",[3434,10171,3964],{"class":3665},[3434,10173,3434],{"class":3669},[3434,10175,3676],{"class":3665},[3434,10177,10178,10180,10182],{"class":3436,"line":4437},[3434,10179,4122],{"class":3665},[3434,10181,4012],{"class":3669},[3434,10183,3676],{"class":3665},[3434,10185,10186,10188,10190,10192,10194,10197],{"class":3436,"line":4452},[3434,10187,4099],{"class":3665},[3434,10189,4012],{"class":3669},[3434,10191,3988],{"class":3458},[3434,10193,3689],{"class":3451},[3434,10195,10196],{"class":3692},"\"bg-(--color-bg-surface) text-(--color-text-primary) border border-(--color-border-default) shadow-sm rounded-2xl p-5 space-y-3 transition-colors duration-250\"",[3434,10198,3676],{"class":3665},[3434,10200,10201,10203,10205,10207,10209,10211,10213,10216,10218,10220],{"class":3436,"line":4467},[3434,10202,4148],{"class":3665},[3434,10204,3554],{"class":3669},[3434,10206,3988],{"class":3458},[3434,10208,3689],{"class":3451},[3434,10210,9978],{"class":3692},[3434,10212,4039],{"class":3665},[3434,10214,10215],{"class":3451},"Семантичний підхід",[3434,10217,3964],{"class":3665},[3434,10219,3554],{"class":3669},[3434,10221,3676],{"class":3665},[3434,10223,10224,10226,10228,10230,10232,10235],{"class":3436,"line":4473},[3434,10225,4148],{"class":3665},[3434,10227,3353],{"class":3669},[3434,10229,3988],{"class":3458},[3434,10231,3689],{"class":3451},[3434,10233,10234],{"class":3692},"\"text-xs text-(--color-text-muted) leading-normal\"",[3434,10236,3676],{"class":3665},[3434,10238,10239],{"class":3436,"line":4482},[3434,10240,10241],{"class":3451},"                        Використовуємо змінні. HTML залишається лаконічним, а адаптація відбувається на рівні CSS.\n",[3434,10243,10244,10246,10248],{"class":3436,"line":4491},[3434,10245,4171],{"class":3665},[3434,10247,3353],{"class":3669},[3434,10249,3676],{"class":3665},[3434,10251,10252,10254,10256,10258,10260,10263],{"class":3436,"line":4515},[3434,10253,4148],{"class":3665},[3434,10255,4012],{"class":3669},[3434,10257,3988],{"class":3458},[3434,10259,3689],{"class":3451},[3434,10261,10262],{"class":3692},"\"pt-2 border-t border-(--color-border-default) flex justify-between items-center text-[10px] text-(--color-text-muted) font-mono\"",[3434,10264,3676],{"class":3665},[3434,10266,10267,10269,10271,10273,10275,10277,10279],{"class":3436,"line":4539},[3434,10268,4190],{"class":3665},[3434,10270,3434],{"class":3669},[3434,10272,4039],{"class":3665},[3434,10274,10043],{"class":3451},[3434,10276,3964],{"class":3665},[3434,10278,3434],{"class":3669},[3434,10280,3676],{"class":3665},[3434,10282,10283,10285,10287,10289,10292,10294,10296],{"class":3436,"line":4548},[3434,10284,4190],{"class":3665},[3434,10286,3434],{"class":3669},[3434,10288,4039],{"class":3665},[3434,10290,10291],{"class":3451},"v4 style",[3434,10293,3964],{"class":3665},[3434,10295,3434],{"class":3669},[3434,10297,3676],{"class":3665},[3434,10299,10300,10302,10304],{"class":3436,"line":4557},[3434,10301,4171],{"class":3665},[3434,10303,4012],{"class":3669},[3434,10305,3676],{"class":3665},[3434,10307,10308,10310,10312],{"class":3436,"line":4572},[3434,10309,4122],{"class":3665},[3434,10311,4012],{"class":3669},[3434,10313,3676],{"class":3665},[3434,10315,10316,10318,10320],{"class":3436,"line":4587},[3434,10317,4372],{"class":3665},[3434,10319,4012],{"class":3669},[3434,10321,3676],{"class":3665},[3434,10323,10324,10326,10328],{"class":3436,"line":4617},[3434,10325,4677],{"class":3665},[3434,10327,4012],{"class":3669},[3434,10329,3676],{"class":3665},[3434,10331,10332,10334,10336],{"class":3436,"line":4626},[3434,10333,4687],{"class":3665},[3434,10335,4012],{"class":3669},[3434,10337,3676],{"class":3665},[3434,10339,10340],{"class":3436,"line":4635},[3434,10341,3495],{"emptyLinePlaceholder":3494},[3434,10343,10344,10346,10348],{"class":3436,"line":4650},[3434,10345,4009],{"class":3665},[3434,10347,3728],{"class":3669},[3434,10349,3676],{"class":3665},[3434,10351,10352,10354,10356,10358,10360],{"class":3436,"line":4656},[3434,10353,6054],{"class":5682},[3434,10355,6057],{"class":3465},[3434,10357,3469],{"class":3734},[3434,10359,6062],{"class":5644},[3434,10361,6065],{"class":3734},[3434,10363,10364,10366,10368,10370,10372,10374,10376,10378,10380,10382,10384,10386,10388,10390,10392],{"class":3436,"line":4665},[3434,10365,6070],{"class":5682},[3434,10367,6074],{"class":6073},[3434,10369,6077],{"class":3451},[3434,10371,6080],{"class":5644},[3434,10373,4726],{"class":3734},[3434,10375,5650],{"class":3465},[3434,10377,3469],{"class":3734},[3434,10379,9787],{"class":5655},[3434,10381,5659],{"class":3734},[3434,10383,5662],{"class":5644},[3434,10385,4726],{"class":3734},[3434,10387,6097],{"class":3465},[3434,10389,3469],{"class":3734},[3434,10391,5672],{"class":5655},[3434,10393,3482],{"class":3734},[3434,10395,10396,10398,10400,10402,10404,10406,10408,10410,10412,10414],{"class":3436,"line":4674},[3434,10397,6108],{"class":5644},[3434,10399,4726],{"class":3734},[3434,10401,6113],{"class":5644},[3434,10403,6077],{"class":3451},[3434,10405,6074],{"class":5644},[3434,10407,6120],{"class":3451},[3434,10409,6123],{"class":5655},[3434,10411,6126],{"class":3451},[3434,10413,6129],{"class":5655},[3434,10415,6132],{"class":3734},[3434,10417,10418],{"class":3436,"line":4684},[3434,10419,6137],{"class":3734},[3434,10421,10422,10424,10426],{"class":3436,"line":4694},[3434,10423,4687],{"class":3665},[3434,10425,3728],{"class":3669},[3434,10427,3676],{"class":3665},[3434,10429,10430,10432,10434],{"class":3436,"line":4703},[3434,10431,3964],{"class":3665},[3434,10433,3985],{"class":3669},[3434,10435,3676],{"class":3665},[3434,10437,10439,10441,10443],{"class":3436,"line":10438},85,[3434,10440,3964],{"class":3665},[3434,10442,3658],{"class":3669},[3434,10444,3676],{"class":3665},[3353,10446,10447,10448,10450],{},"Один компонент. Жодних ",[3357,10449,3359],{},"-дублікатів. Тема змінюється автоматично через CSS Custom Properties.",[3396,10452],{},[3403,10454,10456,10457],{"id":10455},"_35-реєстрація-семантичних-токенів-у-theme","3.5. Реєстрація семантичних токенів у ",[3357,10458,3393],{},[3353,10460,10461,10462,7250,10465,10468,10469,4875],{},"Якщо ви хочете, щоб семантичні токени також генерували utility-класи Tailwind (наприклад, ",[3357,10463,10464],{},"bg-bg-surface",[3357,10466,10467],{},"text-text-primary","), зареєструйте їх у ",[3357,10470,3393],{},[3425,10472,10474],{"className":3427,"code":10473,"filename":6197,"language":3429,"meta":3430,"style":3430},"@import 'tailwindcss';\n\n@theme {\n    \u002F* Реєстрація семантичних токенів як Tailwind-утиліт *\u002F\n    \u002F* Тепер генеруються: bg-bg-base, bg-bg-surface, text-text-primary, тощо *\u002F\n    --color-bg-base:          initial; \u002F* Tailwind побачить цей токен *\u002F\n    --color-bg-surface:       initial;\n    --color-bg-elevated:      initial;\n    --color-bg-inset:         initial;\n    --color-text-primary:     initial;\n    --color-text-secondary:   initial;\n    --color-text-muted:       initial;\n    --color-border-default:   initial;\n    --color-border-focus:     initial;\n    --color-accent:           initial;\n    --color-accent-hover:     initial;\n    --color-status-success-bg: initial;\n}\n",[3357,10475,10476,10484,10488,10494,10499,10504,10512,10517,10522,10527,10532,10537,10542,10547,10552,10557,10562,10567],{"__ignoreMap":3430},[3434,10477,10478,10480,10482],{"class":3436,"line":3437},[3434,10479,6204],{"class":5199},[3434,10481,6207],{"class":5655},[3434,10483,6132],{"class":3451},[3434,10485,10486],{"class":3436,"line":3444},[3434,10487,3495],{"emptyLinePlaceholder":3494},[3434,10489,10490,10492],{"class":3436,"line":3455},[3434,10491,3393],{"class":5199},[3434,10493,3452],{"class":3451},[3434,10495,10496],{"class":3436,"line":3485},[3434,10497,10498],{"class":3440},"    \u002F* Реєстрація семантичних токенів як Tailwind-утиліт *\u002F\n",[3434,10500,10501],{"class":3436,"line":3491},[3434,10502,10503],{"class":3440},"    \u002F* Тепер генеруються: bg-bg-base, bg-bg-surface, text-text-primary, тощо *\u002F\n",[3434,10505,10506,10509],{"class":3436,"line":3498},[3434,10507,10508],{"class":3451},"    --color-bg-base:          initial; ",[3434,10510,10511],{"class":3440},"\u002F* Tailwind побачить цей токен *\u002F\n",[3434,10513,10514],{"class":3436,"line":3504},[3434,10515,10516],{"class":3451},"    --color-bg-surface:       initial;\n",[3434,10518,10519],{"class":3436,"line":3511},[3434,10520,10521],{"class":3451},"    --color-bg-elevated:      initial;\n",[3434,10523,10524],{"class":3436,"line":3529},[3434,10525,10526],{"class":3451},"    --color-bg-inset:         initial;\n",[3434,10528,10529],{"class":3436,"line":3810},[3434,10530,10531],{"class":3451},"    --color-text-primary:     initial;\n",[3434,10533,10534],{"class":3436,"line":3816},[3434,10535,10536],{"class":3451},"    --color-text-secondary:   initial;\n",[3434,10538,10539],{"class":3436,"line":3821},[3434,10540,10541],{"class":3451},"    --color-text-muted:       initial;\n",[3434,10543,10544],{"class":3436,"line":3829},[3434,10545,10546],{"class":3451},"    --color-border-default:   initial;\n",[3434,10548,10549],{"class":3436,"line":3835},[3434,10550,10551],{"class":3451},"    --color-border-focus:     initial;\n",[3434,10553,10554],{"class":3436,"line":3857},[3434,10555,10556],{"class":3451},"    --color-accent:           initial;\n",[3434,10558,10559],{"class":3436,"line":3862},[3434,10560,10561],{"class":3451},"    --color-accent-hover:     initial;\n",[3434,10563,10564],{"class":3436,"line":3867},[3434,10565,10566],{"class":3451},"    --color-status-success-bg: initial;\n",[3434,10568,10569],{"class":3436,"line":3873},[3434,10570,3488],{"class":3451},[3353,10572,10573,10574,10576,10577,10580,10581,10584,10585,6485,10587,10589],{},"Але зачекайте — тут є тонкість. ",[3357,10575,3393],{}," з ",[3357,10578,10579],{},"initial"," лише ",[3365,10582,10583],{},"реєструє"," назву токену, але не дає йому значення. Справжні значення визначаються у ",[3357,10586,3448],{},[3357,10588,4885],{}," через звичайні CSS-правила (як у попередньому розділі).",[3353,10591,10592,10593,10595,10596,10598,10599,4726],{},"Альтернативно, можна взагалі відмовитися від ",[3357,10594,3393],{}," для семантичних токенів і просто використовувати синтаксис ",[3357,10597,9202],{}," — він працює з будь-якими CSS-змінними без реєстрації в ",[3357,10600,3393],{},[3550,10602,10603,10604,10606,10607,10609],{},"На практиці для невеликих команд часто зручніше використовувати ",[3357,10605,9202],{}," напряму. Для великих команд — реєстрація у ",[3357,10608,3393],{}," дає автодоповнення в IntelliSense: редактор бачить усі токени та підказує їх.",[3396,10611],{},[3348,10613,10615],{"id":10614},"частина-iv-javascript-для-керування-темою","Частина IV. JavaScript для керування темою",[3403,10617,10619],{"id":10618},"_41-мінімальний-перемикач-теми","4.1. Мінімальний перемикач теми",[3353,10621,10622],{},"Перш ніж реалізовувати складну систему, розберемо найпростіший варіант — перемикач без збереження стану. Він підходить для демонстрацій та прототипів:",[3425,10624,10626],{"className":6375,"code":10625,"language":6377,"meta":3430,"style":3430},"\u002F\u002F theme-toggle.js — мінімальний перемикач\nconst toggle = () => {\n    document.documentElement.classList.toggle('dark')\n}\n",[3357,10627,10628,10633,10649,10672],{"__ignoreMap":3430},[3434,10629,10630],{"class":3436,"line":3437},[3434,10631,10632],{"class":3440},"\u002F\u002F theme-toggle.js — мінімальний перемикач\n",[3434,10634,10635,10638,10641,10644,10647],{"class":3436,"line":3444},[3434,10636,10637],{"class":5682},"const",[3434,10639,10640],{"class":3465}," toggle",[3434,10642,10643],{"class":3451}," = () ",[3434,10645,10646],{"class":5682},"=>",[3434,10648,3452],{"class":3451},[3434,10650,10651,10654,10656,10658,10660,10662,10664,10666,10668,10670],{"class":3436,"line":3455},[3434,10652,10653],{"class":5644},"    document",[3434,10655,4726],{"class":3451},[3434,10657,6393],{"class":5644},[3434,10659,4726],{"class":3451},[3434,10661,5662],{"class":5644},[3434,10663,4726],{"class":3451},[3434,10665,5667],{"class":3465},[3434,10667,3469],{"class":3451},[3434,10669,5672],{"class":5655},[3434,10671,6409],{"class":3451},[3434,10673,10674],{"class":3436,"line":3485},[3434,10675,3488],{"class":3451},[3425,10677,10679],{"className":3656,"code":10678,"language":3658,"meta":3430,"style":3430},"\u003Cbutton onclick=\"toggle()\">Перемкнути тему\u003C\u002Fbutton>\n",[3357,10680,10681],{"__ignoreMap":3430},[3434,10682,10683,10685,10687,10689,10691,10693,10695,10698,10700,10703,10705,10707],{"class":3436,"line":3437},[3434,10684,3681],{"class":3665},[3434,10686,4342],{"class":3669},[3434,10688,5636],{"class":3458},[3434,10690,3689],{"class":3451},[3434,10692,5641],{"class":3692},[3434,10694,5667],{"class":3465},[3434,10696,10697],{"class":3692},"()\"",[3434,10699,4039],{"class":3665},[3434,10701,10702],{"class":3451},"Перемкнути тему",[3434,10704,3964],{"class":3665},[3434,10706,4342],{"class":3669},[3434,10708,3676],{"class":3665},[3353,10710,10711],{},"Цей підхід має критичний недолік: при перезавантаженні сторінки тема скидається до системної. Для реального застосунку необхідне збереження вибору користувача.",[3396,10713],{},[3403,10715,10717,10718],{"id":10716},"_42-зберігання-вибору-у-localstorage","4.2. Зберігання вибору у ",[3357,10719,5115],{},[3353,10721,10722,10724],{},[3357,10723,5115],{}," — це браузерне сховище типу «ключ-значення», що зберігає дані між сесіями. Запис і читання з нього є синхронними операціями та виконуються миттєво.",[3353,10726,10727],{},"Реалізуємо повноцінний модуль керування темою:",[3425,10729,10732],{"className":6375,"code":10730,"filename":10731,"language":6377,"meta":3430,"style":3430},"\u002F**\n * Модуль керування темою.\n *\n * Підтримує три стани:\n *   'light'  — примусово світла тема\n *   'dark'   — примусово темна тема\n *   'system' — відповідає системним налаштуванням (за замовчуванням)\n *\u002F\n\nconst STORAGE_KEY = 'app-theme'\nconst ROOT = document.documentElement\n\n\u002F\u002F --- Читання ---\n\n\u002F**\n * Повертає явний вибір користувача або null, якщо вибору не було.\n * @returns {'light' | 'dark' | null}\n *\u002F\nfunction getSavedTheme() {\n    return localStorage.getItem(STORAGE_KEY)\n}\n\n\u002F**\n * Перевіряє, чи системна тема є темною.\n * @returns {boolean}\n *\u002F\nfunction systemPrefersDark() {\n    return window.matchMedia('(prefers-color-scheme: dark)').matches\n}\n\n\u002F**\n * Визначає, яка тема має бути активна зараз.\n * Явний вибір користувача має пріоритет над системними налаштуваннями.\n * @returns {'light' | 'dark'}\n *\u002F\nfunction getEffectiveTheme() {\n    const saved = getSavedTheme()\n    if (saved === 'light' || saved === 'dark') return saved\n    return systemPrefersDark() ? 'dark' : 'light'\n}\n\n\u002F\u002F --- Застосування ---\n\n\u002F**\n * Застосовує тему до DOM.\n * Клас .dark на \u003Chtml> вмикає темну тему через @custom-variant dark.\n *\u002F\nfunction applyTheme(theme) {\n    if (theme === 'dark') {\n        ROOT.classList.add('dark')\n    } else {\n        ROOT.classList.remove('dark')\n    }\n\n    \u002F\u002F Зберігаємо в data-атрибуті для CSS та JS\n    ROOT.setAttribute('data-theme', theme)\n}\n\n\u002F\u002F --- Збереження ---\n\n\u002F**\n * Встановлює тему вручну та зберігає вибір у localStorage.\n * @param {'light' | 'dark' | 'system'} theme\n *\u002F\nfunction setTheme(theme) {\n    if (theme === 'system') {\n        localStorage.removeItem(STORAGE_KEY)\n        applyTheme(systemPrefersDark() ? 'dark' : 'light')\n    } else {\n        localStorage.setItem(STORAGE_KEY, theme)\n        applyTheme(theme)\n    }\n}\n\n\u002F**\n * Перемикає між світлою та темною темою.\n * Якщо активна темна — переходить на світлу, і навпаки.\n *\u002F\nfunction toggleTheme() {\n    const current = getEffectiveTheme()\n    setTheme(current === 'dark' ? 'light' : 'dark')\n}\n\n\u002F\u002F --- Ініціалізація ---\n\n\u002F**\n * Ініціалізує систему тем.\n * Має викликатися якомога раніше, бажано в \u003Chead>.\n *\u002F\nfunction initTheme() {\n    applyTheme(getEffectiveTheme())\n\n    \u002F\u002F Слухаємо зміну системної теми\n    \u002F\u002F Якщо користувач не зробив явного вибору — реагуємо автоматично\n    window.matchMedia('(prefers-color-scheme: dark)')\n        .addEventListener('change', (e) => {\n            if (!getSavedTheme()) {\n                applyTheme(e.matches ? 'dark' : 'light')\n            }\n        })\n}\n\n\u002F\u002F Публічний API\nexport { initTheme, setTheme, toggleTheme, getEffectiveTheme, getSavedTheme }\n","src\u002Ftheme.js",[3357,10733,10734,10739,10744,10749,10754,10759,10764,10769,10774,10778,10791,10807,10811,10816,10820,10824,10829,10841,10845,10856,10876,10880,10884,10888,10893,10902,10906,10915,10937,10941,10945,10949,10954,10959,10968,10972,10981,10997,11032,11049,11053,11057,11062,11066,11070,11075,11080,11084,11098,11112,11131,11141,11159,11163,11167,11172,11193,11197,11201,11206,11210,11214,11219,11232,11236,11249,11264,11280,11300,11308,11327,11337,11341,11345,11349,11353,11358,11363,11367,11376,11390,11415,11419,11423,11428,11432,11437,11443,11449,11454,11464,11477,11482,11488,11494,11510,11536,11550,11575,11581,11587,11592,11597,11603],{"__ignoreMap":3430},[3434,10735,10736],{"class":3436,"line":3437},[3434,10737,10738],{"class":3440},"\u002F**\n",[3434,10740,10741],{"class":3436,"line":3444},[3434,10742,10743],{"class":3440}," * Модуль керування темою.\n",[3434,10745,10746],{"class":3436,"line":3455},[3434,10747,10748],{"class":3440}," *\n",[3434,10750,10751],{"class":3436,"line":3485},[3434,10752,10753],{"class":3440}," * Підтримує три стани:\n",[3434,10755,10756],{"class":3436,"line":3491},[3434,10757,10758],{"class":3440}," *   'light'  — примусово світла тема\n",[3434,10760,10761],{"class":3436,"line":3498},[3434,10762,10763],{"class":3440}," *   'dark'   — примусово темна тема\n",[3434,10765,10766],{"class":3436,"line":3504},[3434,10767,10768],{"class":3440}," *   'system' — відповідає системним налаштуванням (за замовчуванням)\n",[3434,10770,10771],{"class":3436,"line":3511},[3434,10772,10773],{"class":3440}," *\u002F\n",[3434,10775,10776],{"class":3436,"line":3529},[3434,10777,3495],{"emptyLinePlaceholder":3494},[3434,10779,10780,10782,10785,10788],{"class":3436,"line":3810},[3434,10781,10637],{"class":5682},[3434,10783,10784],{"class":6073}," STORAGE_KEY",[3434,10786,10787],{"class":3451}," = ",[3434,10789,10790],{"class":5655},"'app-theme'\n",[3434,10792,10793,10795,10798,10800,10802,10804],{"class":3436,"line":3816},[3434,10794,10637],{"class":5682},[3434,10796,10797],{"class":6073}," ROOT",[3434,10799,10787],{"class":3451},[3434,10801,5645],{"class":5644},[3434,10803,4726],{"class":3451},[3434,10805,10806],{"class":5644},"documentElement\n",[3434,10808,10809],{"class":3436,"line":3821},[3434,10810,3495],{"emptyLinePlaceholder":3494},[3434,10812,10813],{"class":3436,"line":3829},[3434,10814,10815],{"class":3440},"\u002F\u002F --- Читання ---\n",[3434,10817,10818],{"class":3436,"line":3835},[3434,10819,3495],{"emptyLinePlaceholder":3494},[3434,10821,10822],{"class":3436,"line":3857},[3434,10823,10738],{"class":3440},[3434,10825,10826],{"class":3436,"line":3862},[3434,10827,10828],{"class":3440}," * Повертає явний вибір користувача або null, якщо вибору не було.\n",[3434,10830,10831,10834,10837],{"class":3436,"line":3867},[3434,10832,10833],{"class":3440}," * ",[3434,10835,10836],{"class":5682},"@returns",[3434,10838,10840],{"class":10839},"sN1BT"," {'light' | 'dark' | null}\n",[3434,10842,10843],{"class":3436,"line":3873},[3434,10844,10773],{"class":3440},[3434,10846,10847,10850,10853],{"class":3436,"line":3881},[3434,10848,10849],{"class":5682},"function",[3434,10851,10852],{"class":3465}," getSavedTheme",[3434,10854,10855],{"class":3451},"() {\n",[3434,10857,10858,10861,10864,10866,10869,10871,10874],{"class":3436,"line":3898},[3434,10859,10860],{"class":5199},"    return",[3434,10862,10863],{"class":5644}," localStorage",[3434,10865,4726],{"class":3451},[3434,10867,10868],{"class":3465},"getItem",[3434,10870,3469],{"class":3451},[3434,10872,10873],{"class":6073},"STORAGE_KEY",[3434,10875,6409],{"class":3451},[3434,10877,10878],{"class":3436,"line":3903},[3434,10879,3488],{"class":3451},[3434,10881,10882],{"class":3436,"line":3911},[3434,10883,3495],{"emptyLinePlaceholder":3494},[3434,10885,10886],{"class":3436,"line":3927},[3434,10887,10738],{"class":3440},[3434,10889,10890],{"class":3436,"line":3932},[3434,10891,10892],{"class":3440}," * Перевіряє, чи системна тема є темною.\n",[3434,10894,10895,10897,10899],{"class":3436,"line":3940},[3434,10896,10833],{"class":3440},[3434,10898,10836],{"class":5682},[3434,10900,10901],{"class":10839}," {boolean}\n",[3434,10903,10904],{"class":3436,"line":3956},[3434,10905,10773],{"class":3440},[3434,10907,10908,10910,10913],{"class":3436,"line":3961},[3434,10909,10849],{"class":5682},[3434,10911,10912],{"class":3465}," systemPrefersDark",[3434,10914,10855],{"class":3451},[3434,10916,10917,10919,10922,10924,10927,10929,10932,10934],{"class":3436,"line":3971},[3434,10918,10860],{"class":5199},[3434,10920,10921],{"class":5644}," window",[3434,10923,4726],{"class":3451},[3434,10925,10926],{"class":3465},"matchMedia",[3434,10928,3469],{"class":3451},[3434,10930,10931],{"class":5655},"'(prefers-color-scheme: dark)'",[3434,10933,5659],{"class":3451},[3434,10935,10936],{"class":5644},"matches\n",[3434,10938,10939],{"class":3436,"line":3980},[3434,10940,3488],{"class":3451},[3434,10942,10943],{"class":3436,"line":4006},[3434,10944,3495],{"emptyLinePlaceholder":3494},[3434,10946,10947],{"class":3436,"line":4024},[3434,10948,10738],{"class":3440},[3434,10950,10951],{"class":3436,"line":4051},[3434,10952,10953],{"class":3440}," * Визначає, яка тема має бути активна зараз.\n",[3434,10955,10956],{"class":3436,"line":4057},[3434,10957,10958],{"class":3440}," * Явний вибір користувача має пріоритет над системними налаштуваннями.\n",[3434,10960,10961,10963,10965],{"class":3436,"line":4073},[3434,10962,10833],{"class":3440},[3434,10964,10836],{"class":5682},[3434,10966,10967],{"class":10839}," {'light' | 'dark'}\n",[3434,10969,10970],{"class":3436,"line":4079},[3434,10971,10773],{"class":3440},[3434,10973,10974,10976,10979],{"class":3436,"line":4096},[3434,10975,10849],{"class":5682},[3434,10977,10978],{"class":3465}," getEffectiveTheme",[3434,10980,10855],{"class":3451},[3434,10982,10983,10986,10989,10991,10994],{"class":3436,"line":4113},[3434,10984,10985],{"class":5682},"    const",[3434,10987,10988],{"class":6073}," saved",[3434,10990,10787],{"class":3451},[3434,10992,10993],{"class":3465},"getSavedTheme",[3434,10995,10996],{"class":3451},"()\n",[3434,10998,10999,11002,11005,11008,11011,11014,11017,11019,11021,11023,11026,11029],{"class":3436,"line":4119},[3434,11000,11001],{"class":5199},"    if",[3434,11003,11004],{"class":3451}," (",[3434,11006,11007],{"class":5644},"saved",[3434,11009,11010],{"class":3451}," === ",[3434,11012,11013],{"class":5655},"'light'",[3434,11015,11016],{"class":3451}," || ",[3434,11018,11007],{"class":5644},[3434,11020,11010],{"class":3451},[3434,11022,5672],{"class":5655},[3434,11024,11025],{"class":3451},") ",[3434,11027,11028],{"class":5199},"return",[3434,11030,11031],{"class":5644}," saved\n",[3434,11033,11034,11036,11038,11041,11043,11046],{"class":3436,"line":4129},[3434,11035,10860],{"class":5199},[3434,11037,10912],{"class":3465},[3434,11039,11040],{"class":3451},"() ? ",[3434,11042,5672],{"class":5655},[3434,11044,11045],{"class":3451}," : ",[3434,11047,11048],{"class":5655},"'light'\n",[3434,11050,11051],{"class":3436,"line":4145},[3434,11052,3488],{"class":3451},[3434,11054,11055],{"class":3436,"line":4162},[3434,11056,3495],{"emptyLinePlaceholder":3494},[3434,11058,11059],{"class":3436,"line":4168},[3434,11060,11061],{"class":3440},"\u002F\u002F --- Застосування ---\n",[3434,11063,11064],{"class":3436,"line":4178},[3434,11065,3495],{"emptyLinePlaceholder":3494},[3434,11067,11068],{"class":3436,"line":4187},[3434,11069,10738],{"class":3440},[3434,11071,11072],{"class":3436,"line":4213},[3434,11073,11074],{"class":3440}," * Застосовує тему до DOM.\n",[3434,11076,11077],{"class":3436,"line":4238},[3434,11078,11079],{"class":3440}," * Клас .dark на \u003Chtml> вмикає темну тему через @custom-variant dark.\n",[3434,11081,11082],{"class":3436,"line":4247},[3434,11083,10773],{"class":3440},[3434,11085,11086,11088,11091,11093,11096],{"class":3436,"line":4256},[3434,11087,10849],{"class":5682},[3434,11089,11090],{"class":3465}," applyTheme",[3434,11092,3469],{"class":3451},[3434,11094,11095],{"class":5644},"theme",[3434,11097,6065],{"class":3451},[3434,11099,11100,11102,11104,11106,11108,11110],{"class":3436,"line":4272},[3434,11101,11001],{"class":5199},[3434,11103,11004],{"class":3451},[3434,11105,11095],{"class":5644},[3434,11107,11010],{"class":3451},[3434,11109,5672],{"class":5655},[3434,11111,6065],{"class":3451},[3434,11113,11114,11117,11119,11121,11123,11125,11127,11129],{"class":3436,"line":4288},[3434,11115,11116],{"class":6073},"        ROOT",[3434,11118,4726],{"class":3451},[3434,11120,5662],{"class":5644},[3434,11122,4726],{"class":3451},[3434,11124,6402],{"class":3465},[3434,11126,3469],{"class":3451},[3434,11128,5672],{"class":5655},[3434,11130,6409],{"class":3451},[3434,11132,11133,11136,11139],{"class":3436,"line":4319},[3434,11134,11135],{"class":3451},"    } ",[3434,11137,11138],{"class":5199},"else",[3434,11140,3452],{"class":3451},[3434,11142,11143,11145,11147,11149,11151,11153,11155,11157],{"class":3436,"line":4328},[3434,11144,11116],{"class":6073},[3434,11146,4726],{"class":3451},[3434,11148,5662],{"class":5644},[3434,11150,4726],{"class":3451},[3434,11152,6435],{"class":3465},[3434,11154,3469],{"class":3451},[3434,11156,5672],{"class":5655},[3434,11158,6409],{"class":3451},[3434,11160,11161],{"class":3436,"line":4337},[3434,11162,3813],{"class":3451},[3434,11164,11165],{"class":3436,"line":4354},[3434,11166,3495],{"emptyLinePlaceholder":3494},[3434,11168,11169],{"class":3436,"line":4360},[3434,11170,11171],{"class":3440},"    \u002F\u002F Зберігаємо в data-атрибуті для CSS та JS\n",[3434,11173,11174,11177,11179,11182,11184,11187,11189,11191],{"class":3436,"line":4369},[3434,11175,11176],{"class":6073},"    ROOT",[3434,11178,4726],{"class":3451},[3434,11180,11181],{"class":3465},"setAttribute",[3434,11183,3469],{"class":3451},[3434,11185,11186],{"class":5655},"'data-theme'",[3434,11188,7250],{"class":3451},[3434,11190,11095],{"class":5644},[3434,11192,6409],{"class":3451},[3434,11194,11195],{"class":3436,"line":4379},[3434,11196,3488],{"class":3451},[3434,11198,11199],{"class":3436,"line":4384},[3434,11200,3495],{"emptyLinePlaceholder":3494},[3434,11202,11203],{"class":3436,"line":4390},[3434,11204,11205],{"class":3440},"\u002F\u002F --- Збереження ---\n",[3434,11207,11208],{"class":3436,"line":4406},[3434,11209,3495],{"emptyLinePlaceholder":3494},[3434,11211,11212],{"class":3436,"line":4422},[3434,11213,10738],{"class":3440},[3434,11215,11216],{"class":3436,"line":4428},[3434,11217,11218],{"class":3440}," * Встановлює тему вручну та зберігає вибір у localStorage.\n",[3434,11220,11221,11223,11226,11229],{"class":3436,"line":4437},[3434,11222,10833],{"class":3440},[3434,11224,11225],{"class":5682},"@param",[3434,11227,11228],{"class":10839}," {'light' | 'dark' | 'system'}",[3434,11230,11231],{"class":5644}," theme\n",[3434,11233,11234],{"class":3436,"line":4452},[3434,11235,10773],{"class":3440},[3434,11237,11238,11240,11243,11245,11247],{"class":3436,"line":4467},[3434,11239,10849],{"class":5682},[3434,11241,11242],{"class":3465}," setTheme",[3434,11244,3469],{"class":3451},[3434,11246,11095],{"class":5644},[3434,11248,6065],{"class":3451},[3434,11250,11251,11253,11255,11257,11259,11262],{"class":3436,"line":4473},[3434,11252,11001],{"class":5199},[3434,11254,11004],{"class":3451},[3434,11256,11095],{"class":5644},[3434,11258,11010],{"class":3451},[3434,11260,11261],{"class":5655},"'system'",[3434,11263,6065],{"class":3451},[3434,11265,11266,11269,11271,11274,11276,11278],{"class":3436,"line":4482},[3434,11267,11268],{"class":5644},"        localStorage",[3434,11270,4726],{"class":3451},[3434,11272,11273],{"class":3465},"removeItem",[3434,11275,3469],{"class":3451},[3434,11277,10873],{"class":6073},[3434,11279,6409],{"class":3451},[3434,11281,11282,11285,11287,11290,11292,11294,11296,11298],{"class":3436,"line":4491},[3434,11283,11284],{"class":3465},"        applyTheme",[3434,11286,3469],{"class":3451},[3434,11288,11289],{"class":3465},"systemPrefersDark",[3434,11291,11040],{"class":3451},[3434,11293,5672],{"class":5655},[3434,11295,11045],{"class":3451},[3434,11297,11013],{"class":5655},[3434,11299,6409],{"class":3451},[3434,11301,11302,11304,11306],{"class":3436,"line":4515},[3434,11303,11135],{"class":3451},[3434,11305,11138],{"class":5199},[3434,11307,3452],{"class":3451},[3434,11309,11310,11312,11314,11317,11319,11321,11323,11325],{"class":3436,"line":4539},[3434,11311,11268],{"class":5644},[3434,11313,4726],{"class":3451},[3434,11315,11316],{"class":3465},"setItem",[3434,11318,3469],{"class":3451},[3434,11320,10873],{"class":6073},[3434,11322,7250],{"class":3451},[3434,11324,11095],{"class":5644},[3434,11326,6409],{"class":3451},[3434,11328,11329,11331,11333,11335],{"class":3436,"line":4548},[3434,11330,11284],{"class":3465},[3434,11332,3469],{"class":3451},[3434,11334,11095],{"class":5644},[3434,11336,6409],{"class":3451},[3434,11338,11339],{"class":3436,"line":4557},[3434,11340,3813],{"class":3451},[3434,11342,11343],{"class":3436,"line":4572},[3434,11344,3488],{"class":3451},[3434,11346,11347],{"class":3436,"line":4587},[3434,11348,3495],{"emptyLinePlaceholder":3494},[3434,11350,11351],{"class":3436,"line":4617},[3434,11352,10738],{"class":3440},[3434,11354,11355],{"class":3436,"line":4626},[3434,11356,11357],{"class":3440}," * Перемикає між світлою та темною темою.\n",[3434,11359,11360],{"class":3436,"line":4635},[3434,11361,11362],{"class":3440}," * Якщо активна темна — переходить на світлу, і навпаки.\n",[3434,11364,11365],{"class":3436,"line":4650},[3434,11366,10773],{"class":3440},[3434,11368,11369,11371,11374],{"class":3436,"line":4656},[3434,11370,10849],{"class":5682},[3434,11372,11373],{"class":3465}," toggleTheme",[3434,11375,10855],{"class":3451},[3434,11377,11378,11380,11383,11385,11388],{"class":3436,"line":4665},[3434,11379,10985],{"class":5682},[3434,11381,11382],{"class":6073}," current",[3434,11384,10787],{"class":3451},[3434,11386,11387],{"class":3465},"getEffectiveTheme",[3434,11389,10996],{"class":3451},[3434,11391,11392,11395,11397,11400,11402,11404,11407,11409,11411,11413],{"class":3436,"line":4674},[3434,11393,11394],{"class":3465},"    setTheme",[3434,11396,3469],{"class":3451},[3434,11398,11399],{"class":5644},"current",[3434,11401,11010],{"class":3451},[3434,11403,5672],{"class":5655},[3434,11405,11406],{"class":3451}," ? ",[3434,11408,11013],{"class":5655},[3434,11410,11045],{"class":3451},[3434,11412,5672],{"class":5655},[3434,11414,6409],{"class":3451},[3434,11416,11417],{"class":3436,"line":4684},[3434,11418,3488],{"class":3451},[3434,11420,11421],{"class":3436,"line":4694},[3434,11422,3495],{"emptyLinePlaceholder":3494},[3434,11424,11425],{"class":3436,"line":4703},[3434,11426,11427],{"class":3440},"\u002F\u002F --- Ініціалізація ---\n",[3434,11429,11430],{"class":3436,"line":10438},[3434,11431,3495],{"emptyLinePlaceholder":3494},[3434,11433,11435],{"class":3436,"line":11434},86,[3434,11436,10738],{"class":3440},[3434,11438,11440],{"class":3436,"line":11439},87,[3434,11441,11442],{"class":3440}," * Ініціалізує систему тем.\n",[3434,11444,11446],{"class":3436,"line":11445},88,[3434,11447,11448],{"class":3440}," * Має викликатися якомога раніше, бажано в \u003Chead>.\n",[3434,11450,11452],{"class":3436,"line":11451},89,[3434,11453,10773],{"class":3440},[3434,11455,11457,11459,11462],{"class":3436,"line":11456},90,[3434,11458,10849],{"class":5682},[3434,11460,11461],{"class":3465}," initTheme",[3434,11463,10855],{"class":3451},[3434,11465,11467,11470,11472,11474],{"class":3436,"line":11466},91,[3434,11468,11469],{"class":3465},"    applyTheme",[3434,11471,3469],{"class":3451},[3434,11473,11387],{"class":3465},[3434,11475,11476],{"class":3451},"())\n",[3434,11478,11480],{"class":3436,"line":11479},92,[3434,11481,3495],{"emptyLinePlaceholder":3494},[3434,11483,11485],{"class":3436,"line":11484},93,[3434,11486,11487],{"class":3440},"    \u002F\u002F Слухаємо зміну системної теми\n",[3434,11489,11491],{"class":3436,"line":11490},94,[3434,11492,11493],{"class":3440},"    \u002F\u002F Якщо користувач не зробив явного вибору — реагуємо автоматично\n",[3434,11495,11497,11500,11502,11504,11506,11508],{"class":3436,"line":11496},95,[3434,11498,11499],{"class":5644},"    window",[3434,11501,4726],{"class":3451},[3434,11503,10926],{"class":3465},[3434,11505,3469],{"class":3451},[3434,11507,10931],{"class":5655},[3434,11509,6409],{"class":3451},[3434,11511,11513,11516,11519,11521,11524,11527,11530,11532,11534],{"class":3436,"line":11512},96,[3434,11514,11515],{"class":3451},"        .",[3434,11517,11518],{"class":3465},"addEventListener",[3434,11520,3469],{"class":3451},[3434,11522,11523],{"class":5655},"'change'",[3434,11525,11526],{"class":3451},", (",[3434,11528,11529],{"class":5644},"e",[3434,11531,11025],{"class":3451},[3434,11533,10646],{"class":5682},[3434,11535,3452],{"class":3451},[3434,11537,11539,11542,11545,11547],{"class":3436,"line":11538},97,[3434,11540,11541],{"class":5199},"            if",[3434,11543,11544],{"class":3451}," (!",[3434,11546,10993],{"class":3465},[3434,11548,11549],{"class":3451},"()) {\n",[3434,11551,11553,11556,11558,11560,11562,11565,11567,11569,11571,11573],{"class":3436,"line":11552},98,[3434,11554,11555],{"class":3465},"                applyTheme",[3434,11557,3469],{"class":3451},[3434,11559,11529],{"class":5644},[3434,11561,4726],{"class":3451},[3434,11563,11564],{"class":5644},"matches",[3434,11566,11406],{"class":3451},[3434,11568,5672],{"class":5655},[3434,11570,11045],{"class":3451},[3434,11572,11013],{"class":5655},[3434,11574,6409],{"class":3451},[3434,11576,11578],{"class":3436,"line":11577},99,[3434,11579,11580],{"class":3451},"            }\n",[3434,11582,11584],{"class":3436,"line":11583},100,[3434,11585,11586],{"class":3451},"        })\n",[3434,11588,11590],{"class":3436,"line":11589},101,[3434,11591,3488],{"class":3451},[3434,11593,11595],{"class":3436,"line":11594},102,[3434,11596,3495],{"emptyLinePlaceholder":3494},[3434,11598,11600],{"class":3436,"line":11599},103,[3434,11601,11602],{"class":3440},"\u002F\u002F Публічний API\n",[3434,11604,11606,11609,11612,11615,11617,11620,11622,11625,11627,11629,11631,11633],{"class":3436,"line":11605},104,[3434,11607,11608],{"class":5199},"export",[3434,11610,11611],{"class":3451}," { ",[3434,11613,11614],{"class":5644},"initTheme",[3434,11616,7250],{"class":3451},[3434,11618,11619],{"class":5644},"setTheme",[3434,11621,7250],{"class":3451},[3434,11623,11624],{"class":5644},"toggleTheme",[3434,11626,7250],{"class":3451},[3434,11628,11387],{"class":5644},[3434,11630,7250],{"class":3451},[3434,11632,10993],{"class":5644},[3434,11634,11635],{"class":3451}," }\n",[3353,11637,11638],{},"Використання у головному файлі:",[3425,11640,11643],{"className":6375,"code":11641,"filename":11642,"language":6377,"meta":3430,"style":3430},"import { initTheme, toggleTheme } from '.\u002Ftheme.js'\n\n\u002F\u002F Ініціалізація якомога раніше\ninitTheme()\n\n\u002F\u002F Підключення перемикача\ndocument.getElementById('theme-toggle')?.addEventListener('click', toggleTheme)\n","src\u002Fmain.js",[3357,11644,11645,11667,11671,11676,11682,11686,11691],{"__ignoreMap":3430},[3434,11646,11647,11650,11652,11654,11656,11658,11661,11664],{"class":3436,"line":3437},[3434,11648,11649],{"class":5199},"import",[3434,11651,11611],{"class":3451},[3434,11653,11614],{"class":5644},[3434,11655,7250],{"class":3451},[3434,11657,11624],{"class":5644},[3434,11659,11660],{"class":3451}," } ",[3434,11662,11663],{"class":5199},"from",[3434,11665,11666],{"class":5655}," '.\u002Ftheme.js'\n",[3434,11668,11669],{"class":3436,"line":3444},[3434,11670,3495],{"emptyLinePlaceholder":3494},[3434,11672,11673],{"class":3436,"line":3455},[3434,11674,11675],{"class":3440},"\u002F\u002F Ініціалізація якомога раніше\n",[3434,11677,11678,11680],{"class":3436,"line":3485},[3434,11679,11614],{"class":3465},[3434,11681,10996],{"class":3451},[3434,11683,11684],{"class":3436,"line":3491},[3434,11685,3495],{"emptyLinePlaceholder":3494},[3434,11687,11688],{"class":3436,"line":3498},[3434,11689,11690],{"class":3440},"\u002F\u002F Підключення перемикача\n",[3434,11692,11693,11695,11697,11699,11701,11704,11707,11709,11711,11714,11716,11718],{"class":3436,"line":3504},[3434,11694,5645],{"class":5644},[3434,11696,4726],{"class":3451},[3434,11698,5650],{"class":3465},[3434,11700,3469],{"class":3451},[3434,11702,11703],{"class":5655},"'theme-toggle'",[3434,11705,11706],{"class":3451},")?.",[3434,11708,11518],{"class":3465},[3434,11710,3469],{"class":3451},[3434,11712,11713],{"class":5655},"'click'",[3434,11715,7250],{"class":3451},[3434,11717,11624],{"class":5644},[3434,11719,6409],{"class":3451},[3396,11721],{},[3403,11723,11725],{"id":11724},"_43-проблема-спалаху-теми-flash-of-incorrect-theme","4.3. Проблема «спалаху» теми (Flash of Incorrect Theme)",[3353,11727,11728,11731],{},[3365,11729,11730],{},"FOIT"," (Flash of Incorrect Theme) — один із найнеприємніших артефактів при роботі з темами. Він виникає, коли:",[11733,11734,11735,11739,11742,11748],"ol",{},[11736,11737,11738],"li",{},"Браузер починає відображати сторінку зі стандартними стилями (як правило, світла тема)",[11736,11740,11741],{},"Завантажується JavaScript",[11736,11743,11744,11745,11747],{},"JavaScript читає ",[3357,11746,5115],{}," та застосовує темну тему",[11736,11749,11750,11751,11754],{},"Відбувається ",[3365,11752,11753],{},"помітний стрибок"," від світлого до темного",[3353,11756,11757],{},"Цей стрибок відбувається лише на долі секунди, але помітний ока та дратує користувачів.",[3554,11759,11761,11762],{"id":11760},"вирішення-блокуючий-скрипт-у-head","Вирішення: блокуючий скрипт у ",[3357,11763,11764],{},"\u003Chead>",[3353,11766,11767,11768,11771,11772,11774,11775,11778,11779,11781],{},"Єдиний надійний спосіб уникнути FOIT — виконати ",[3365,11769,11770],{},"синхронний"," JavaScript у ",[3357,11773,11764],{}," ",[3365,11776,11777],{},"до"," того, як браузер почне рендерити ",[3357,11780,6481],{},". Такий скрипт блокує рендеринг, тому він має бути мінімальним та швидким:",[3425,11783,11786],{"className":3656,"code":11784,"filename":11785,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Ctitle>Мій застосунок\u003C\u002Ftitle>\n\n    \u003C!--\n        КРИТИЧНО: Цей скрипт виконується синхронно, до рендеру body.\n        Він не повинен мати defer, async або type=\"module\".\n        Розмір: ~200 байт — практично не впливає на продуктивність.\n    -->\n    \u003Cscript>\n        (function() {\n            var saved = localStorage.getItem('app-theme')\n            var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n            var isDark = saved === 'dark' || (!saved && prefersDark)\n            if (isDark) document.documentElement.classList.add('dark')\n        })()\n    \u003C\u002Fscript>\n\n    \u003Clink rel=\"stylesheet\" href=\"\u002Fsrc\u002Fstyles\u002Fmain.css\">\n\u003C\u002Fhead>\n\u003Cbody class=\"bg-(--color-bg-base) text-(--color-text-primary)\">\n    \u003C!-- Сторінка рендериться вже з правильною темою -->\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","index.html",[3357,11787,11788,11798,11812,11820,11834,11858,11876,11880,11885,11890,11895,11900,11905,11913,11922,11944,11967,12000,12031,12036,12044,12048,12069,12077,12092,12097,12105],{"__ignoreMap":3430},[3434,11789,11790,11792,11794,11796],{"class":3436,"line":3437},[3434,11791,3666],{"class":3665},[3434,11793,3670],{"class":3669},[3434,11795,3673],{"class":3458},[3434,11797,3676],{"class":3665},[3434,11799,11800,11802,11804,11806,11808,11810],{"class":3436,"line":3444},[3434,11801,3681],{"class":3665},[3434,11803,3658],{"class":3669},[3434,11805,3686],{"class":3458},[3434,11807,3689],{"class":3451},[3434,11809,3693],{"class":3692},[3434,11811,3676],{"class":3665},[3434,11813,11814,11816,11818],{"class":3436,"line":3455},[3434,11815,3681],{"class":3665},[3434,11817,3702],{"class":3669},[3434,11819,3676],{"class":3665},[3434,11821,11822,11824,11826,11828,11830,11832],{"class":3436,"line":3485},[3434,11823,4009],{"class":3665},[3434,11825,3711],{"class":3669},[3434,11827,3714],{"class":3458},[3434,11829,3689],{"class":3451},[3434,11831,3719],{"class":3692},[3434,11833,3676],{"class":3665},[3434,11835,11836,11838,11840,11843,11845,11848,11851,11853,11856],{"class":3436,"line":3491},[3434,11837,4009],{"class":3665},[3434,11839,3711],{"class":3669},[3434,11841,11842],{"class":3458}," name",[3434,11844,3689],{"class":3451},[3434,11846,11847],{"class":3692},"\"viewport\"",[3434,11849,11850],{"class":3458}," content",[3434,11852,3689],{"class":3451},[3434,11854,11855],{"class":3692},"\"width=device-width, initial-scale=1.0\"",[3434,11857,3676],{"class":3665},[3434,11859,11860,11862,11865,11867,11870,11872,11874],{"class":3436,"line":3498},[3434,11861,4009],{"class":3665},[3434,11863,11864],{"class":3669},"title",[3434,11866,4039],{"class":3665},[3434,11868,11869],{"class":3451},"Мій застосунок",[3434,11871,3964],{"class":3665},[3434,11873,11864],{"class":3669},[3434,11875,3676],{"class":3665},[3434,11877,11878],{"class":3436,"line":3504},[3434,11879,3495],{"emptyLinePlaceholder":3494},[3434,11881,11882],{"class":3436,"line":3511},[3434,11883,11884],{"class":3440},"    \u003C!--\n",[3434,11886,11887],{"class":3436,"line":3529},[3434,11888,11889],{"class":3440},"        КРИТИЧНО: Цей скрипт виконується синхронно, до рендеру body.\n",[3434,11891,11892],{"class":3436,"line":3810},[3434,11893,11894],{"class":3440},"        Він не повинен мати defer, async або type=\"module\".\n",[3434,11896,11897],{"class":3436,"line":3816},[3434,11898,11899],{"class":3440},"        Розмір: ~200 байт — практично не впливає на продуктивність.\n",[3434,11901,11902],{"class":3436,"line":3821},[3434,11903,11904],{"class":3440},"    -->\n",[3434,11906,11907,11909,11911],{"class":3436,"line":3829},[3434,11908,4009],{"class":3665},[3434,11910,3728],{"class":3669},[3434,11912,3676],{"class":3665},[3434,11914,11915,11918,11920],{"class":3436,"line":3835},[3434,11916,11917],{"class":3734},"        (",[3434,11919,10849],{"class":5682},[3434,11921,10855],{"class":3734},[3434,11923,11924,11927,11929,11931,11933,11935,11937,11939,11942],{"class":3436,"line":3857},[3434,11925,11926],{"class":5682},"            var",[3434,11928,10988],{"class":5644},[3434,11930,6077],{"class":3451},[3434,11932,10863],{"class":5644},[3434,11934,4726],{"class":3734},[3434,11936,10868],{"class":3465},[3434,11938,3469],{"class":3734},[3434,11940,11941],{"class":5655},"'app-theme'",[3434,11943,6409],{"class":3734},[3434,11945,11946,11948,11951,11953,11955,11957,11959,11961,11963,11965],{"class":3436,"line":3862},[3434,11947,11926],{"class":5682},[3434,11949,11950],{"class":5644}," prefersDark",[3434,11952,6077],{"class":3451},[3434,11954,10921],{"class":5644},[3434,11956,4726],{"class":3734},[3434,11958,10926],{"class":3465},[3434,11960,3469],{"class":3734},[3434,11962,10931],{"class":5655},[3434,11964,5659],{"class":3734},[3434,11966,10936],{"class":5644},[3434,11968,11969,11971,11973,11975,11977,11980,11983,11986,11988,11991,11993,11996,11998],{"class":3436,"line":3867},[3434,11970,11926],{"class":5682},[3434,11972,6074],{"class":5644},[3434,11974,6077],{"class":3451},[3434,11976,10988],{"class":5644},[3434,11978,11979],{"class":3451}," ===",[3434,11981,11982],{"class":5655}," 'dark'",[3434,11984,11985],{"class":3451}," ||",[3434,11987,11004],{"class":3734},[3434,11989,11990],{"class":3451},"!",[3434,11992,11007],{"class":5644},[3434,11994,11995],{"class":3451}," &&",[3434,11997,11950],{"class":5644},[3434,11999,6409],{"class":3734},[3434,12001,12002,12004,12006,12009,12011,12013,12015,12017,12019,12021,12023,12025,12027,12029],{"class":3436,"line":3873},[3434,12003,11541],{"class":5199},[3434,12005,11004],{"class":3734},[3434,12007,12008],{"class":5644},"isDark",[3434,12010,11025],{"class":3734},[3434,12012,5645],{"class":5644},[3434,12014,4726],{"class":3734},[3434,12016,6393],{"class":5644},[3434,12018,4726],{"class":3734},[3434,12020,5662],{"class":5644},[3434,12022,4726],{"class":3734},[3434,12024,6402],{"class":3465},[3434,12026,3469],{"class":3734},[3434,12028,5672],{"class":5655},[3434,12030,6409],{"class":3734},[3434,12032,12033],{"class":3436,"line":3881},[3434,12034,12035],{"class":3734},"        })()\n",[3434,12037,12038,12040,12042],{"class":3436,"line":3898},[3434,12039,4687],{"class":3665},[3434,12041,3728],{"class":3669},[3434,12043,3676],{"class":3665},[3434,12045,12046],{"class":3436,"line":3903},[3434,12047,3495],{"emptyLinePlaceholder":3494},[3434,12049,12050,12052,12054,12056,12058,12060,12062,12064,12067],{"class":3436,"line":3911},[3434,12051,4009],{"class":3665},[3434,12053,3751],{"class":3669},[3434,12055,3762],{"class":3458},[3434,12057,3689],{"class":3451},[3434,12059,3767],{"class":3692},[3434,12061,3754],{"class":3458},[3434,12063,3689],{"class":3451},[3434,12065,12066],{"class":3692},"\"\u002Fsrc\u002Fstyles\u002Fmain.css\"",[3434,12068,3676],{"class":3665},[3434,12070,12071,12073,12075],{"class":3436,"line":3927},[3434,12072,3964],{"class":3665},[3434,12074,3702],{"class":3669},[3434,12076,3676],{"class":3665},[3434,12078,12079,12081,12083,12085,12087,12090],{"class":3436,"line":3932},[3434,12080,3681],{"class":3665},[3434,12082,3985],{"class":3669},[3434,12084,3988],{"class":3458},[3434,12086,3689],{"class":3451},[3434,12088,12089],{"class":3692},"\"bg-(--color-bg-base) text-(--color-text-primary)\"",[3434,12091,3676],{"class":3665},[3434,12093,12094],{"class":3436,"line":3940},[3434,12095,12096],{"class":3440},"    \u003C!-- Сторінка рендериться вже з правильною темою -->\n",[3434,12098,12099,12101,12103],{"class":3436,"line":3956},[3434,12100,3964],{"class":3665},[3434,12102,3985],{"class":3669},[3434,12104,3676],{"class":3665},[3434,12106,12107,12109,12111],{"class":3436,"line":3961},[3434,12108,3964],{"class":3665},[3434,12110,3658],{"class":3669},[3434,12112,3676],{"class":3665},[6163,12114,12115,12116,12118,12119,12121,12122,12125],{},"Скрипт навмисно написаний у форматі ",[3357,12117,3519],{}," та IIFE (Immediately Invoked Function Expression), а не ",[3357,12120,10637],{},"\u002F",[3357,12123,12124],{},"let"," та стрілочних функцій. Це забезпечує сумісність зі старими браузерами, де цей скрипт може виконуватися до будь-яких поліфілів.",[3388,12127,12128,12129,12132,12133,10576,12136,12139],{},"У фреймворках на кшталт Nuxt або Next.js є власні механізми для вирішення FOIT. У Next.js це ",[3357,12130,12131],{},"next-themes",", у Nuxt — ",[3357,12134,12135],{},"useColorMode",[3357,12137,12138],{},"@nuxtjs\u002Fcolor-mode",". Якщо ви використовуєте ці фреймворки — зверніться до їхньої документації замість реалізації власного рішення.",[3396,12141],{},[3403,12143,12145],{"id":12144},"_44-компонент-перемикача-теми","4.4. Компонент перемикача теми",[3353,12147,12148],{},"Реалізуємо повноцінний UI-компонент перемикача з трьома станами: «Світла», «Темна», «Система»:",[3651,12150,12151],{":tailwind":3653},[3425,12152,12154],{"className":3656,"code":12153,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cscript>\n        (function() {\n            var saved = localStorage.getItem('app-theme')\n            var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n            if (saved === 'dark' || (!saved && prefersDark)) {\n                document.documentElement.classList.add('dark')\n            }\n        })()\n    \u003C\u002Fscript>\n    \u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\u002F4.0\">\u003C\u002Fscript>\n    \u003Cstyle type=\"text\u002Ftailwindcss\">\n        @custom-variant dark (&:is(.dark *));\n\n        :root {\n            --color-bg-base: oklch(0.984 0.003 247.858);\n            --color-bg-surface: oklch(1 0 0);\n            --color-text-primary: oklch(0.208 0.042 265.755);\n            --color-text-muted: oklch(0.554 0.034 264.364);\n            --color-border: oklch(0.929 0.008 264.542);\n        }\n\n        .dark {\n            --color-bg-base: oklch(0.113 0.021 261);\n            --color-bg-surface: oklch(0.179 0.027 261);\n            --color-text-primary: oklch(0.984 0.003 247.858);\n            --color-text-muted: oklch(0.704 0.026 264.436);\n            --color-border: oklch(0.300 0.025 264);\n        }\n    \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"bg-[--color-bg-base] min-h-screen flex items-center justify-center p-8 transition-colors duration-300\"\n      style=\"font-family: system-ui, sans-serif;\">\n\n\u003Cdiv class=\"flex flex-col items-center gap-6\">\n    \u003C!-- Перемикач теми: три варіанти -->\n    \u003Cdiv class=\"flex bg-[--color-bg-surface] border border-[--color-border] rounded-full p-1 gap-0.5\"\n         id=\"theme-switcher\">\n        \u003Cbutton data-theme-value=\"light\"\n                class=\"theme-btn px-4 py-1.5 rounded-full text-sm font-medium transition-all\n                       text-[--color-text-muted]\"\n                onclick=\"selectTheme('light')\">\n            ☀️ Світла\n        \u003C\u002Fbutton>\n        \u003Cbutton data-theme-value=\"system\"\n                class=\"theme-btn px-4 py-1.5 rounded-full text-sm font-medium transition-all\n                       text-[--color-text-muted]\"\n                onclick=\"selectTheme('system')\">\n            💻 Системна\n        \u003C\u002Fbutton>\n        \u003Cbutton data-theme-value=\"dark\"\n                class=\"theme-btn px-4 py-1.5 rounded-full text-sm font-medium transition-all\n                       text-[--color-text-muted]\"\n                onclick=\"selectTheme('dark')\">\n            🌙 Темна\n        \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Демонстраційна картка -->\n    \u003Cdiv class=\"bg-[--color-bg-surface] border border-[--color-border] rounded-2xl p-6 max-w-xs w-full shadow-sm transition-colors duration-300\">\n        \u003Cp class=\"text-xs font-bold uppercase tracking-widest text-[--color-text-muted] mb-3\">\n            Поточна тема\n        \u003C\u002Fp>\n        \u003Cp class=\"text-2xl font-black text-[--color-text-primary]\" id=\"current-theme-label\">\n            Визначається...\n        \u003C\u002Fp>\n        \u003Cp class=\"text-sm text-[--color-text-muted] mt-2 leading-relaxed\">\n            Цей текст та фон автоматично адаптуються до обраної теми через CSS Custom Properties.\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003Cscript>\n    const STORAGE_KEY = 'app-theme'\n    const ROOT = document.documentElement\n\n    function getEffectiveTheme() {\n        const saved = localStorage.getItem(STORAGE_KEY)\n        if (saved === 'light' || saved === 'dark') return saved\n        return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n    }\n\n    function selectTheme(theme) {\n        if (theme === 'system') {\n            localStorage.removeItem(STORAGE_KEY)\n        } else {\n            localStorage.setItem(STORAGE_KEY, theme)\n        }\n\n        const effective = getEffectiveTheme()\n        ROOT.classList.toggle('dark', effective === 'dark')\n        updateUI(theme)\n    }\n\n    function updateUI(activeValue) {\n        const effective = getEffectiveTheme()\n        const labels = { light: '☀️ Світла', dark: '🌙 Темна', system: '💻 Системна' }\n\n        document.getElementById('current-theme-label').textContent = labels[activeValue]\n            + (activeValue === 'system' ? ` → ${effective === 'dark' ? '🌙' : '☀️'}` : '')\n\n        document.querySelectorAll('.theme-btn').forEach(btn => {\n            const isActive = btn.dataset.themeValue === activeValue\n            btn.style.background = isActive ? (effective === 'dark' ? '#4338ca' : '#4f46e5') : ''\n            btn.style.color = isActive ? '#ffffff' : ''\n        })\n    }\n\n    \u002F\u002F Ініціалізація\n    const saved = localStorage.getItem(STORAGE_KEY) || 'system'\n    updateUI(saved)\n\u003C\u002Fscript>\n\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,12155,12156,12166,12180,12188,12202,12210,12218,12238,12260,12287,12310,12314,12318,12326,12344,12358,12364,12368,12375,12394,12413,12432,12451,12470,12474,12478,12485,12503,12521,12539,12557,12575,12579,12587,12595,12608,12618,12622,12637,12642,12655,12667,12681,12691,12696,12716,12721,12729,12742,12750,12754,12772,12777,12785,12798,12806,12810,12828,12833,12841,12849,12853,12858,12873,12888,12893,12901,12923,12928,12936,12951,12956,12964,12972,12980,12984,12992,13003,13017,13021,13030,13051,13079,13107,13111,13115,13128,13143,13158,13167,13185,13189,13193,13206,13233,13244,13248,13252,13266,13278,13312,13316,13346,13396,13400,13429,13457,13502,13529,13534,13539,13544,13550,13577,13589,13598,13603,13612],{"__ignoreMap":3430},[3434,12157,12158,12160,12162,12164],{"class":3436,"line":3437},[3434,12159,3666],{"class":3665},[3434,12161,3670],{"class":3669},[3434,12163,3673],{"class":3458},[3434,12165,3676],{"class":3665},[3434,12167,12168,12170,12172,12174,12176,12178],{"class":3436,"line":3444},[3434,12169,3681],{"class":3665},[3434,12171,3658],{"class":3669},[3434,12173,3686],{"class":3458},[3434,12175,3689],{"class":3451},[3434,12177,3693],{"class":3692},[3434,12179,3676],{"class":3665},[3434,12181,12182,12184,12186],{"class":3436,"line":3455},[3434,12183,3681],{"class":3665},[3434,12185,3702],{"class":3669},[3434,12187,3676],{"class":3665},[3434,12189,12190,12192,12194,12196,12198,12200],{"class":3436,"line":3485},[3434,12191,4009],{"class":3665},[3434,12193,3711],{"class":3669},[3434,12195,3714],{"class":3458},[3434,12197,3689],{"class":3451},[3434,12199,3719],{"class":3692},[3434,12201,3676],{"class":3665},[3434,12203,12204,12206,12208],{"class":3436,"line":3491},[3434,12205,4009],{"class":3665},[3434,12207,3728],{"class":3669},[3434,12209,3676],{"class":3665},[3434,12211,12212,12214,12216],{"class":3436,"line":3498},[3434,12213,11917],{"class":3734},[3434,12215,10849],{"class":5682},[3434,12217,10855],{"class":3734},[3434,12219,12220,12222,12224,12226,12228,12230,12232,12234,12236],{"class":3436,"line":3504},[3434,12221,11926],{"class":5682},[3434,12223,10988],{"class":5644},[3434,12225,6077],{"class":3451},[3434,12227,10863],{"class":5644},[3434,12229,4726],{"class":3734},[3434,12231,10868],{"class":3465},[3434,12233,3469],{"class":3734},[3434,12235,11941],{"class":5655},[3434,12237,6409],{"class":3734},[3434,12239,12240,12242,12244,12246,12248,12250,12252,12254,12256,12258],{"class":3436,"line":3511},[3434,12241,11926],{"class":5682},[3434,12243,11950],{"class":5644},[3434,12245,6077],{"class":3451},[3434,12247,10921],{"class":5644},[3434,12249,4726],{"class":3734},[3434,12251,10926],{"class":3465},[3434,12253,3469],{"class":3734},[3434,12255,10931],{"class":5655},[3434,12257,5659],{"class":3734},[3434,12259,10936],{"class":5644},[3434,12261,12262,12264,12266,12268,12270,12272,12274,12276,12278,12280,12282,12284],{"class":3436,"line":3529},[3434,12263,11541],{"class":5199},[3434,12265,11004],{"class":3734},[3434,12267,11007],{"class":5644},[3434,12269,11979],{"class":3451},[3434,12271,11982],{"class":5655},[3434,12273,11985],{"class":3451},[3434,12275,11004],{"class":3734},[3434,12277,11990],{"class":3451},[3434,12279,11007],{"class":5644},[3434,12281,11995],{"class":3451},[3434,12283,11950],{"class":5644},[3434,12285,12286],{"class":3734},")) {\n",[3434,12288,12289,12292,12294,12296,12298,12300,12302,12304,12306,12308],{"class":3436,"line":3810},[3434,12290,12291],{"class":5644},"                document",[3434,12293,4726],{"class":3734},[3434,12295,6393],{"class":5644},[3434,12297,4726],{"class":3734},[3434,12299,5662],{"class":5644},[3434,12301,4726],{"class":3734},[3434,12303,6402],{"class":3465},[3434,12305,3469],{"class":3734},[3434,12307,5672],{"class":5655},[3434,12309,6409],{"class":3734},[3434,12311,12312],{"class":3436,"line":3816},[3434,12313,11580],{"class":3734},[3434,12315,12316],{"class":3436,"line":3821},[3434,12317,12035],{"class":3734},[3434,12319,12320,12322,12324],{"class":3436,"line":3829},[3434,12321,4687],{"class":3665},[3434,12323,3728],{"class":3669},[3434,12325,3676],{"class":3665},[3434,12327,12328,12330,12332,12334,12336,12338,12340,12342],{"class":3436,"line":3835},[3434,12329,4009],{"class":3665},[3434,12331,3728],{"class":3669},[3434,12333,3731],{"class":3458},[3434,12335,3689],{"class":3734},[3434,12337,6565],{"class":3692},[3434,12339,3740],{"class":3665},[3434,12341,3728],{"class":3669},[3434,12343,3676],{"class":3665},[3434,12345,12346,12348,12350,12352,12354,12356],{"class":3436,"line":3857},[3434,12347,4009],{"class":3665},[3434,12349,3776],{"class":3669},[3434,12351,6580],{"class":3458},[3434,12353,3689],{"class":3734},[3434,12355,6585],{"class":3692},[3434,12357,3676],{"class":3665},[3434,12359,12360,12362],{"class":3436,"line":3862},[3434,12361,6592],{"class":5199},[3434,12363,5527],{"class":3734},[3434,12365,12366],{"class":3436,"line":3867},[3434,12367,3495],{"emptyLinePlaceholder":3494},[3434,12369,12370,12373],{"class":3436,"line":3873},[3434,12371,12372],{"class":3447},"        :root",[3434,12374,3452],{"class":3734},[3434,12376,12377,12380,12382,12384,12386,12388,12390,12392],{"class":3436,"line":3881},[3434,12378,12379],{"class":3458},"            --color-bg-base",[3434,12381,3462],{"class":3734},[3434,12383,3466],{"class":3465},[3434,12385,3469],{"class":3734},[3434,12387,9432],{"class":3472},[3434,12389,9435],{"class":3472},[3434,12391,9438],{"class":3472},[3434,12393,3482],{"class":3734},[3434,12395,12396,12399,12401,12403,12405,12407,12409,12411],{"class":3436,"line":3898},[3434,12397,12398],{"class":3458},"            --color-bg-surface",[3434,12400,3462],{"class":3734},[3434,12402,3466],{"class":3465},[3434,12404,3469],{"class":3734},[3434,12406,8160],{"class":3472},[3434,12408,4757],{"class":3472},[3434,12410,4757],{"class":3472},[3434,12412,3482],{"class":3734},[3434,12414,12415,12418,12420,12422,12424,12426,12428,12430],{"class":3436,"line":3903},[3434,12416,12417],{"class":3458},"            --color-text-primary",[3434,12419,3462],{"class":3734},[3434,12421,3466],{"class":3465},[3434,12423,3469],{"class":3734},[3434,12425,9473],{"class":3472},[3434,12427,5233],{"class":3472},[3434,12429,9478],{"class":3472},[3434,12431,3482],{"class":3734},[3434,12433,12434,12437,12439,12441,12443,12445,12447,12449],{"class":3436,"line":3911},[3434,12435,12436],{"class":3458},"            --color-text-muted",[3434,12438,3462],{"class":3734},[3434,12440,3466],{"class":3465},[3434,12442,3469],{"class":3734},[3434,12444,9494],{"class":3472},[3434,12446,9497],{"class":3472},[3434,12448,9500],{"class":3472},[3434,12450,3482],{"class":3734},[3434,12452,12453,12456,12458,12460,12462,12464,12466,12468],{"class":3436,"line":3927},[3434,12454,12455],{"class":3458},"            --color-border",[3434,12457,3462],{"class":3734},[3434,12459,3466],{"class":3465},[3434,12461,3469],{"class":3734},[3434,12463,9516],{"class":3472},[3434,12465,9519],{"class":3472},[3434,12467,9522],{"class":3472},[3434,12469,3482],{"class":3734},[3434,12471,12472],{"class":3436,"line":3932},[3434,12473,6137],{"class":3734},[3434,12475,12476],{"class":3436,"line":3940},[3434,12477,3495],{"emptyLinePlaceholder":3494},[3434,12479,12480,12483],{"class":3436,"line":3956},[3434,12481,12482],{"class":3447},"        .dark",[3434,12484,3452],{"class":3734},[3434,12486,12487,12489,12491,12493,12495,12497,12499,12501],{"class":3436,"line":3961},[3434,12488,12379],{"class":3458},[3434,12490,3462],{"class":3734},[3434,12492,3466],{"class":3465},[3434,12494,3469],{"class":3734},[3434,12496,8622],{"class":3472},[3434,12498,8625],{"class":3472},[3434,12500,7527],{"class":3472},[3434,12502,3482],{"class":3734},[3434,12504,12505,12507,12509,12511,12513,12515,12517,12519],{"class":3436,"line":3971},[3434,12506,12398],{"class":3458},[3434,12508,3462],{"class":3734},[3434,12510,3466],{"class":3465},[3434,12512,3469],{"class":3734},[3434,12514,8645],{"class":3472},[3434,12516,8648],{"class":3472},[3434,12518,7527],{"class":3472},[3434,12520,3482],{"class":3734},[3434,12522,12523,12525,12527,12529,12531,12533,12535,12537],{"class":3436,"line":3980},[3434,12524,12417],{"class":3458},[3434,12526,3462],{"class":3734},[3434,12528,3466],{"class":3465},[3434,12530,3469],{"class":3734},[3434,12532,9432],{"class":3472},[3434,12534,9435],{"class":3472},[3434,12536,9438],{"class":3472},[3434,12538,3482],{"class":3734},[3434,12540,12541,12543,12545,12547,12549,12551,12553,12555],{"class":3436,"line":4006},[3434,12542,12436],{"class":3458},[3434,12544,3462],{"class":3734},[3434,12546,3466],{"class":3465},[3434,12548,3469],{"class":3734},[3434,12550,9619],{"class":3472},[3434,12552,9622],{"class":3472},[3434,12554,9625],{"class":3472},[3434,12556,3482],{"class":3734},[3434,12558,12559,12561,12563,12565,12567,12569,12571,12573],{"class":3436,"line":4024},[3434,12560,12455],{"class":3458},[3434,12562,3462],{"class":3734},[3434,12564,3466],{"class":3465},[3434,12566,3469],{"class":3734},[3434,12568,8839],{"class":3472},[3434,12570,8671],{"class":3472},[3434,12572,4783],{"class":3472},[3434,12574,3482],{"class":3734},[3434,12576,12577],{"class":3436,"line":4051},[3434,12578,6137],{"class":3734},[3434,12580,12581,12583,12585],{"class":3436,"line":4057},[3434,12582,4687],{"class":3665},[3434,12584,3776],{"class":3669},[3434,12586,3676],{"class":3665},[3434,12588,12589,12591,12593],{"class":3436,"line":4073},[3434,12590,3964],{"class":3665},[3434,12592,3702],{"class":3669},[3434,12594,3676],{"class":3665},[3434,12596,12597,12599,12601,12603,12605],{"class":3436,"line":4079},[3434,12598,3681],{"class":3665},[3434,12600,3985],{"class":3669},[3434,12602,3988],{"class":3458},[3434,12604,3689],{"class":3451},[3434,12606,12607],{"class":3692},"\"bg-[--color-bg-base] min-h-screen flex items-center justify-center p-8 transition-colors duration-300\"\n",[3434,12609,12610,12612,12614,12616],{"class":3436,"line":4096},[3434,12611,6628],{"class":3458},[3434,12613,3689],{"class":3451},[3434,12615,6633],{"class":3692},[3434,12617,3676],{"class":3665},[3434,12619,12620],{"class":3436,"line":4113},[3434,12621,3495],{"emptyLinePlaceholder":3494},[3434,12623,12624,12626,12628,12630,12632,12635],{"class":3436,"line":4119},[3434,12625,3681],{"class":3665},[3434,12627,4012],{"class":3669},[3434,12629,3988],{"class":3458},[3434,12631,3689],{"class":3451},[3434,12633,12634],{"class":3692},"\"flex flex-col items-center gap-6\"",[3434,12636,3676],{"class":3665},[3434,12638,12639],{"class":3436,"line":4129},[3434,12640,12641],{"class":3440},"    \u003C!-- Перемикач теми: три варіанти -->\n",[3434,12643,12644,12646,12648,12650,12652],{"class":3436,"line":4145},[3434,12645,4009],{"class":3665},[3434,12647,4012],{"class":3669},[3434,12649,3988],{"class":3458},[3434,12651,3689],{"class":3451},[3434,12653,12654],{"class":3692},"\"flex bg-[--color-bg-surface] border border-[--color-border] rounded-full p-1 gap-0.5\"\n",[3434,12656,12657,12660,12662,12665],{"class":3436,"line":4162},[3434,12658,12659],{"class":3458},"         id",[3434,12661,3689],{"class":3451},[3434,12663,12664],{"class":3692},"\"theme-switcher\"",[3434,12666,3676],{"class":3665},[3434,12668,12669,12671,12673,12676,12678],{"class":3436,"line":4168},[3434,12670,4027],{"class":3665},[3434,12672,4342],{"class":3669},[3434,12674,12675],{"class":3458}," data-theme-value",[3434,12677,3689],{"class":3451},[3434,12679,12680],{"class":3692},"\"light\"\n",[3434,12682,12683,12686,12688],{"class":3436,"line":4178},[3434,12684,12685],{"class":3458},"                class",[3434,12687,3689],{"class":3451},[3434,12689,12690],{"class":3692},"\"theme-btn px-4 py-1.5 rounded-full text-sm font-medium transition-all\n",[3434,12692,12693],{"class":3436,"line":4187},[3434,12694,12695],{"class":3692},"                       text-[--color-text-muted]\"\n",[3434,12697,12698,12701,12703,12705,12708,12710,12712,12714],{"class":3436,"line":4213},[3434,12699,12700],{"class":3458},"                onclick",[3434,12702,3689],{"class":3451},[3434,12704,5641],{"class":3692},[3434,12706,12707],{"class":3465},"selectTheme",[3434,12709,3469],{"class":3692},[3434,12711,11013],{"class":5655},[3434,12713,5686],{"class":3692},[3434,12715,3676],{"class":3665},[3434,12717,12718],{"class":3436,"line":4238},[3434,12719,12720],{"class":3451},"            ☀️ Світла\n",[3434,12722,12723,12725,12727],{"class":3436,"line":4247},[3434,12724,4677],{"class":3665},[3434,12726,4342],{"class":3669},[3434,12728,3676],{"class":3665},[3434,12730,12731,12733,12735,12737,12739],{"class":3436,"line":4256},[3434,12732,4027],{"class":3665},[3434,12734,4342],{"class":3669},[3434,12736,12675],{"class":3458},[3434,12738,3689],{"class":3451},[3434,12740,12741],{"class":3692},"\"system\"\n",[3434,12743,12744,12746,12748],{"class":3436,"line":4272},[3434,12745,12685],{"class":3458},[3434,12747,3689],{"class":3451},[3434,12749,12690],{"class":3692},[3434,12751,12752],{"class":3436,"line":4288},[3434,12753,12695],{"class":3692},[3434,12755,12756,12758,12760,12762,12764,12766,12768,12770],{"class":3436,"line":4319},[3434,12757,12700],{"class":3458},[3434,12759,3689],{"class":3451},[3434,12761,5641],{"class":3692},[3434,12763,12707],{"class":3465},[3434,12765,3469],{"class":3692},[3434,12767,11261],{"class":5655},[3434,12769,5686],{"class":3692},[3434,12771,3676],{"class":3665},[3434,12773,12774],{"class":3436,"line":4328},[3434,12775,12776],{"class":3451},"            💻 Системна\n",[3434,12778,12779,12781,12783],{"class":3436,"line":4337},[3434,12780,4677],{"class":3665},[3434,12782,4342],{"class":3669},[3434,12784,3676],{"class":3665},[3434,12786,12787,12789,12791,12793,12795],{"class":3436,"line":4354},[3434,12788,4027],{"class":3665},[3434,12790,4342],{"class":3669},[3434,12792,12675],{"class":3458},[3434,12794,3689],{"class":3451},[3434,12796,12797],{"class":3692},"\"dark\"\n",[3434,12799,12800,12802,12804],{"class":3436,"line":4360},[3434,12801,12685],{"class":3458},[3434,12803,3689],{"class":3451},[3434,12805,12690],{"class":3692},[3434,12807,12808],{"class":3436,"line":4369},[3434,12809,12695],{"class":3692},[3434,12811,12812,12814,12816,12818,12820,12822,12824,12826],{"class":3436,"line":4379},[3434,12813,12700],{"class":3458},[3434,12815,3689],{"class":3451},[3434,12817,5641],{"class":3692},[3434,12819,12707],{"class":3465},[3434,12821,3469],{"class":3692},[3434,12823,5672],{"class":5655},[3434,12825,5686],{"class":3692},[3434,12827,3676],{"class":3665},[3434,12829,12830],{"class":3436,"line":4384},[3434,12831,12832],{"class":3451},"            🌙 Темна\n",[3434,12834,12835,12837,12839],{"class":3436,"line":4390},[3434,12836,4677],{"class":3665},[3434,12838,4342],{"class":3669},[3434,12840,3676],{"class":3665},[3434,12842,12843,12845,12847],{"class":3436,"line":4406},[3434,12844,4687],{"class":3665},[3434,12846,4012],{"class":3669},[3434,12848,3676],{"class":3665},[3434,12850,12851],{"class":3436,"line":4422},[3434,12852,3495],{"emptyLinePlaceholder":3494},[3434,12854,12855],{"class":3436,"line":4428},[3434,12856,12857],{"class":3440},"    \u003C!-- Демонстраційна картка -->\n",[3434,12859,12860,12862,12864,12866,12868,12871],{"class":3436,"line":4437},[3434,12861,4009],{"class":3665},[3434,12863,4012],{"class":3669},[3434,12865,3988],{"class":3458},[3434,12867,3689],{"class":3451},[3434,12869,12870],{"class":3692},"\"bg-[--color-bg-surface] border border-[--color-border] rounded-2xl p-6 max-w-xs w-full shadow-sm transition-colors duration-300\"",[3434,12872,3676],{"class":3665},[3434,12874,12875,12877,12879,12881,12883,12886],{"class":3436,"line":4452},[3434,12876,4027],{"class":3665},[3434,12878,3353],{"class":3669},[3434,12880,3988],{"class":3458},[3434,12882,3689],{"class":3451},[3434,12884,12885],{"class":3692},"\"text-xs font-bold uppercase tracking-widest text-[--color-text-muted] mb-3\"",[3434,12887,3676],{"class":3665},[3434,12889,12890],{"class":3436,"line":4467},[3434,12891,12892],{"class":3451},"            Поточна тема\n",[3434,12894,12895,12897,12899],{"class":3436,"line":4473},[3434,12896,4677],{"class":3665},[3434,12898,3353],{"class":3669},[3434,12900,3676],{"class":3665},[3434,12902,12903,12905,12907,12909,12911,12914,12916,12918,12921],{"class":3436,"line":4482},[3434,12904,4027],{"class":3665},[3434,12906,3353],{"class":3669},[3434,12908,3988],{"class":3458},[3434,12910,3689],{"class":3451},[3434,12912,12913],{"class":3692},"\"text-2xl font-black text-[--color-text-primary]\"",[3434,12915,5740],{"class":3458},[3434,12917,3689],{"class":3451},[3434,12919,12920],{"class":3692},"\"current-theme-label\"",[3434,12922,3676],{"class":3665},[3434,12924,12925],{"class":3436,"line":4491},[3434,12926,12927],{"class":3451},"            Визначається...\n",[3434,12929,12930,12932,12934],{"class":3436,"line":4515},[3434,12931,4677],{"class":3665},[3434,12933,3353],{"class":3669},[3434,12935,3676],{"class":3665},[3434,12937,12938,12940,12942,12944,12946,12949],{"class":3436,"line":4539},[3434,12939,4027],{"class":3665},[3434,12941,3353],{"class":3669},[3434,12943,3988],{"class":3458},[3434,12945,3689],{"class":3451},[3434,12947,12948],{"class":3692},"\"text-sm text-[--color-text-muted] mt-2 leading-relaxed\"",[3434,12950,3676],{"class":3665},[3434,12952,12953],{"class":3436,"line":4548},[3434,12954,12955],{"class":3451},"            Цей текст та фон автоматично адаптуються до обраної теми через CSS Custom Properties.\n",[3434,12957,12958,12960,12962],{"class":3436,"line":4557},[3434,12959,4677],{"class":3665},[3434,12961,3353],{"class":3669},[3434,12963,3676],{"class":3665},[3434,12965,12966,12968,12970],{"class":3436,"line":4572},[3434,12967,4687],{"class":3665},[3434,12969,4012],{"class":3669},[3434,12971,3676],{"class":3665},[3434,12973,12974,12976,12978],{"class":3436,"line":4587},[3434,12975,3964],{"class":3665},[3434,12977,4012],{"class":3669},[3434,12979,3676],{"class":3665},[3434,12981,12982],{"class":3436,"line":4617},[3434,12983,3495],{"emptyLinePlaceholder":3494},[3434,12985,12986,12988,12990],{"class":3436,"line":4626},[3434,12987,3681],{"class":3665},[3434,12989,3728],{"class":3669},[3434,12991,3676],{"class":3665},[3434,12993,12994,12996,12998,13000],{"class":3436,"line":4635},[3434,12995,10985],{"class":5682},[3434,12997,10784],{"class":6073},[3434,12999,6077],{"class":3451},[3434,13001,13002],{"class":5655}," 'app-theme'\n",[3434,13004,13005,13007,13009,13011,13013,13015],{"class":3436,"line":4650},[3434,13006,10985],{"class":5682},[3434,13008,10797],{"class":6073},[3434,13010,6077],{"class":3451},[3434,13012,6080],{"class":5644},[3434,13014,4726],{"class":3734},[3434,13016,10806],{"class":5644},[3434,13018,13019],{"class":3436,"line":4656},[3434,13020,3495],{"emptyLinePlaceholder":3494},[3434,13022,13023,13026,13028],{"class":3436,"line":4665},[3434,13024,13025],{"class":5682},"    function",[3434,13027,10978],{"class":3465},[3434,13029,10855],{"class":3734},[3434,13031,13032,13035,13037,13039,13041,13043,13045,13047,13049],{"class":3436,"line":4674},[3434,13033,13034],{"class":5682},"        const",[3434,13036,10988],{"class":6073},[3434,13038,6077],{"class":3451},[3434,13040,10863],{"class":5644},[3434,13042,4726],{"class":3734},[3434,13044,10868],{"class":3465},[3434,13046,3469],{"class":3734},[3434,13048,10873],{"class":6073},[3434,13050,6409],{"class":3734},[3434,13052,13053,13056,13058,13060,13062,13065,13067,13069,13071,13073,13075,13077],{"class":3436,"line":4684},[3434,13054,13055],{"class":5199},"        if",[3434,13057,11004],{"class":3734},[3434,13059,11007],{"class":5644},[3434,13061,11979],{"class":3451},[3434,13063,13064],{"class":5655}," 'light'",[3434,13066,11985],{"class":3451},[3434,13068,10988],{"class":5644},[3434,13070,11979],{"class":3451},[3434,13072,11982],{"class":5655},[3434,13074,11025],{"class":3734},[3434,13076,11028],{"class":5199},[3434,13078,11031],{"class":5644},[3434,13080,13081,13084,13086,13088,13090,13092,13094,13096,13098,13100,13102,13104],{"class":3436,"line":4694},[3434,13082,13083],{"class":5199},"        return",[3434,13085,10921],{"class":5644},[3434,13087,4726],{"class":3734},[3434,13089,10926],{"class":3465},[3434,13091,3469],{"class":3734},[3434,13093,10931],{"class":5655},[3434,13095,5659],{"class":3734},[3434,13097,11564],{"class":5644},[3434,13099,6120],{"class":3451},[3434,13101,11982],{"class":5655},[3434,13103,6126],{"class":3451},[3434,13105,13106],{"class":5655}," 'light'\n",[3434,13108,13109],{"class":3436,"line":4703},[3434,13110,3813],{"class":3734},[3434,13112,13113],{"class":3436,"line":10438},[3434,13114,3495],{"emptyLinePlaceholder":3494},[3434,13116,13117,13119,13122,13124,13126],{"class":3436,"line":11434},[3434,13118,13025],{"class":5682},[3434,13120,13121],{"class":3465}," selectTheme",[3434,13123,3469],{"class":3734},[3434,13125,11095],{"class":5644},[3434,13127,6065],{"class":3734},[3434,13129,13130,13132,13134,13136,13138,13141],{"class":3436,"line":11439},[3434,13131,13055],{"class":5199},[3434,13133,11004],{"class":3734},[3434,13135,11095],{"class":5644},[3434,13137,11979],{"class":3451},[3434,13139,13140],{"class":5655}," 'system'",[3434,13142,6065],{"class":3734},[3434,13144,13145,13148,13150,13152,13154,13156],{"class":3436,"line":11445},[3434,13146,13147],{"class":5644},"            localStorage",[3434,13149,4726],{"class":3734},[3434,13151,11273],{"class":3465},[3434,13153,3469],{"class":3734},[3434,13155,10873],{"class":6073},[3434,13157,6409],{"class":3734},[3434,13159,13160,13163,13165],{"class":3436,"line":11451},[3434,13161,13162],{"class":3734},"        } ",[3434,13164,11138],{"class":5199},[3434,13166,3452],{"class":3734},[3434,13168,13169,13171,13173,13175,13177,13179,13181,13183],{"class":3436,"line":11456},[3434,13170,13147],{"class":5644},[3434,13172,4726],{"class":3734},[3434,13174,11316],{"class":3465},[3434,13176,3469],{"class":3734},[3434,13178,10873],{"class":6073},[3434,13180,7250],{"class":3734},[3434,13182,11095],{"class":5644},[3434,13184,6409],{"class":3734},[3434,13186,13187],{"class":3436,"line":11466},[3434,13188,6137],{"class":3734},[3434,13190,13191],{"class":3436,"line":11479},[3434,13192,3495],{"emptyLinePlaceholder":3494},[3434,13194,13195,13197,13200,13202,13204],{"class":3436,"line":11484},[3434,13196,13034],{"class":5682},[3434,13198,13199],{"class":6073}," effective",[3434,13201,6077],{"class":3451},[3434,13203,10978],{"class":3465},[3434,13205,10996],{"class":3734},[3434,13207,13208,13210,13212,13214,13216,13218,13220,13222,13224,13227,13229,13231],{"class":3436,"line":11490},[3434,13209,11116],{"class":6073},[3434,13211,4726],{"class":3734},[3434,13213,5662],{"class":5644},[3434,13215,4726],{"class":3734},[3434,13217,5667],{"class":3465},[3434,13219,3469],{"class":3734},[3434,13221,5672],{"class":5655},[3434,13223,7250],{"class":3734},[3434,13225,13226],{"class":5644},"effective",[3434,13228,11979],{"class":3451},[3434,13230,11982],{"class":5655},[3434,13232,6409],{"class":3734},[3434,13234,13235,13238,13240,13242],{"class":3436,"line":11496},[3434,13236,13237],{"class":3465},"        updateUI",[3434,13239,3469],{"class":3734},[3434,13241,11095],{"class":5644},[3434,13243,6409],{"class":3734},[3434,13245,13246],{"class":3436,"line":11512},[3434,13247,3813],{"class":3734},[3434,13249,13250],{"class":3436,"line":11538},[3434,13251,3495],{"emptyLinePlaceholder":3494},[3434,13253,13254,13256,13259,13261,13264],{"class":3436,"line":11552},[3434,13255,13025],{"class":5682},[3434,13257,13258],{"class":3465}," updateUI",[3434,13260,3469],{"class":3734},[3434,13262,13263],{"class":5644},"activeValue",[3434,13265,6065],{"class":3734},[3434,13267,13268,13270,13272,13274,13276],{"class":3436,"line":11577},[3434,13269,13034],{"class":5682},[3434,13271,13199],{"class":6073},[3434,13273,6077],{"class":3451},[3434,13275,10978],{"class":3465},[3434,13277,10996],{"class":3734},[3434,13279,13280,13282,13285,13287,13289,13292,13295,13297,13299,13302,13304,13307,13310],{"class":3436,"line":11583},[3434,13281,13034],{"class":5682},[3434,13283,13284],{"class":6073}," labels",[3434,13286,6077],{"class":3451},[3434,13288,11611],{"class":3734},[3434,13290,13291],{"class":5644},"light:",[3434,13293,13294],{"class":5655}," '☀️ Світла'",[3434,13296,7250],{"class":3734},[3434,13298,3359],{"class":5644},[3434,13300,13301],{"class":5655}," '🌙 Темна'",[3434,13303,7250],{"class":3734},[3434,13305,13306],{"class":5644},"system:",[3434,13308,13309],{"class":5655}," '💻 Системна'",[3434,13311,11635],{"class":3734},[3434,13313,13314],{"class":3436,"line":11589},[3434,13315,3495],{"emptyLinePlaceholder":3494},[3434,13317,13318,13321,13323,13325,13327,13330,13332,13334,13336,13338,13341,13343],{"class":3436,"line":11594},[3434,13319,13320],{"class":5644},"        document",[3434,13322,4726],{"class":3734},[3434,13324,5650],{"class":3465},[3434,13326,3469],{"class":3734},[3434,13328,13329],{"class":5655},"'current-theme-label'",[3434,13331,5659],{"class":3734},[3434,13333,6113],{"class":5644},[3434,13335,6077],{"class":3451},[3434,13337,13284],{"class":5644},[3434,13339,13340],{"class":3734},"[",[3434,13342,13263],{"class":5644},[3434,13344,13345],{"class":3734},"]\n",[3434,13347,13348,13351,13353,13355,13357,13359,13361,13364,13367,13369,13371,13373,13375,13378,13380,13383,13386,13389,13391,13394],{"class":3436,"line":11599},[3434,13349,13350],{"class":3451},"            +",[3434,13352,11004],{"class":3734},[3434,13354,13263],{"class":5644},[3434,13356,11979],{"class":3451},[3434,13358,13140],{"class":5655},[3434,13360,6120],{"class":3451},[3434,13362,13363],{"class":5655}," ` → ",[3434,13365,13366],{"class":5682},"${",[3434,13368,13226],{"class":5644},[3434,13370,11979],{"class":3451},[3434,13372,11982],{"class":5655},[3434,13374,6120],{"class":3451},[3434,13376,13377],{"class":5655}," '🌙'",[3434,13379,6126],{"class":3451},[3434,13381,13382],{"class":5655}," '☀️'",[3434,13384,13385],{"class":5682},"}",[3434,13387,13388],{"class":5655},"`",[3434,13390,6126],{"class":3451},[3434,13392,13393],{"class":5655}," ''",[3434,13395,6409],{"class":3734},[3434,13397,13398],{"class":3436,"line":11605},[3434,13399,3495],{"emptyLinePlaceholder":3494},[3434,13401,13403,13405,13407,13410,13412,13415,13417,13420,13422,13424,13427],{"class":3436,"line":13402},105,[3434,13404,13320],{"class":5644},[3434,13406,4726],{"class":3734},[3434,13408,13409],{"class":3465},"querySelectorAll",[3434,13411,3469],{"class":3734},[3434,13413,13414],{"class":5655},"'.theme-btn'",[3434,13416,5659],{"class":3734},[3434,13418,13419],{"class":3465},"forEach",[3434,13421,3469],{"class":3734},[3434,13423,6062],{"class":5644},[3434,13425,13426],{"class":5682}," =>",[3434,13428,3452],{"class":3734},[3434,13430,13432,13434,13437,13439,13442,13444,13447,13449,13452,13454],{"class":3436,"line":13431},106,[3434,13433,6070],{"class":5682},[3434,13435,13436],{"class":6073}," isActive",[3434,13438,6077],{"class":3451},[3434,13440,13441],{"class":5644}," btn",[3434,13443,4726],{"class":3734},[3434,13445,13446],{"class":5644},"dataset",[3434,13448,4726],{"class":3734},[3434,13450,13451],{"class":5644},"themeValue",[3434,13453,11979],{"class":3451},[3434,13455,13456],{"class":5644}," activeValue\n",[3434,13458,13460,13462,13464,13466,13468,13471,13473,13475,13477,13479,13481,13483,13485,13487,13490,13492,13495,13497,13499],{"class":3436,"line":13459},107,[3434,13461,6108],{"class":5644},[3434,13463,4726],{"class":3734},[3434,13465,3776],{"class":5644},[3434,13467,4726],{"class":3734},[3434,13469,13470],{"class":5644},"background",[3434,13472,6077],{"class":3451},[3434,13474,13436],{"class":5644},[3434,13476,6120],{"class":3451},[3434,13478,11004],{"class":3734},[3434,13480,13226],{"class":5644},[3434,13482,11979],{"class":3451},[3434,13484,11982],{"class":5655},[3434,13486,6120],{"class":3451},[3434,13488,13489],{"class":5655}," '#4338ca'",[3434,13491,6126],{"class":3451},[3434,13493,13494],{"class":5655}," '#4f46e5'",[3434,13496,11025],{"class":3734},[3434,13498,4875],{"class":3451},[3434,13500,13501],{"class":5655}," ''\n",[3434,13503,13505,13507,13509,13511,13513,13516,13518,13520,13522,13525,13527],{"class":3436,"line":13504},108,[3434,13506,6108],{"class":5644},[3434,13508,4726],{"class":3734},[3434,13510,3776],{"class":5644},[3434,13512,4726],{"class":3734},[3434,13514,13515],{"class":5644},"color",[3434,13517,6077],{"class":3451},[3434,13519,13436],{"class":5644},[3434,13521,6120],{"class":3451},[3434,13523,13524],{"class":5655}," '#ffffff'",[3434,13526,6126],{"class":3451},[3434,13528,13501],{"class":5655},[3434,13530,13532],{"class":3436,"line":13531},109,[3434,13533,11586],{"class":3734},[3434,13535,13537],{"class":3436,"line":13536},110,[3434,13538,3813],{"class":3734},[3434,13540,13542],{"class":3436,"line":13541},111,[3434,13543,3495],{"emptyLinePlaceholder":3494},[3434,13545,13547],{"class":3436,"line":13546},112,[3434,13548,13549],{"class":3440},"    \u002F\u002F Ініціалізація\n",[3434,13551,13553,13555,13557,13559,13561,13563,13565,13567,13569,13571,13574],{"class":3436,"line":13552},113,[3434,13554,10985],{"class":5682},[3434,13556,10988],{"class":6073},[3434,13558,6077],{"class":3451},[3434,13560,10863],{"class":5644},[3434,13562,4726],{"class":3734},[3434,13564,10868],{"class":3465},[3434,13566,3469],{"class":3734},[3434,13568,10873],{"class":6073},[3434,13570,11025],{"class":3734},[3434,13572,13573],{"class":3451},"||",[3434,13575,13576],{"class":5655}," 'system'\n",[3434,13578,13580,13583,13585,13587],{"class":3436,"line":13579},114,[3434,13581,13582],{"class":3465},"    updateUI",[3434,13584,3469],{"class":3734},[3434,13586,11007],{"class":5644},[3434,13588,6409],{"class":3734},[3434,13590,13592,13594,13596],{"class":3436,"line":13591},115,[3434,13593,3964],{"class":3665},[3434,13595,3728],{"class":3669},[3434,13597,3676],{"class":3665},[3434,13599,13601],{"class":3436,"line":13600},116,[3434,13602,3495],{"emptyLinePlaceholder":3494},[3434,13604,13606,13608,13610],{"class":3436,"line":13605},117,[3434,13607,3964],{"class":3665},[3434,13609,3985],{"class":3669},[3434,13611,3676],{"class":3665},[3434,13613,13615,13617,13619],{"class":3436,"line":13614},118,[3434,13616,3964],{"class":3665},[3434,13618,3658],{"class":3669},[3434,13620,3676],{"class":3665},[3396,13622],{},[3403,13624,13626],{"id":13625},"_45-слухання-системної-зміни-теми","4.5. Слухання системної зміни теми",[3353,13628,13629],{},"Важливий нюанс: якщо користувач обрав режим «Система», а потім змінив системну тему (наприклад, о 20:00 система автоматично перейшла у темний режим) — ваш застосунок має відреагувати без перезавантаження.",[3353,13631,13632,13633,4875],{},"Для цього використовується ",[3357,13634,13635],{},"MediaQueryList.addEventListener",[3425,13637,13639],{"className":6375,"code":13638,"language":6377,"meta":3430,"style":3430},"\u002F\u002F Відповідь на зміну системної теми\nwindow.matchMedia('(prefers-color-scheme: dark)')\n    .addEventListener('change', (event) => {\n        \u002F\u002F Реагуємо тільки якщо користувач не зробив явного вибору\n        const saved = localStorage.getItem('app-theme')\n        if (!saved) {\n            const isDark = event.matches\n            document.documentElement.classList.toggle('dark', isDark)\n            console.log(`Системна тема змінилась на: ${isDark ? 'темна' : 'світла'}`)\n        }\n    })\n",[3357,13640,13641,13646,13661,13683,13688,13708,13718,13732,13759,13794,13798],{"__ignoreMap":3430},[3434,13642,13643],{"class":3436,"line":3437},[3434,13644,13645],{"class":3440},"\u002F\u002F Відповідь на зміну системної теми\n",[3434,13647,13648,13651,13653,13655,13657,13659],{"class":3436,"line":3444},[3434,13649,13650],{"class":5644},"window",[3434,13652,4726],{"class":3451},[3434,13654,10926],{"class":3465},[3434,13656,3469],{"class":3451},[3434,13658,10931],{"class":5655},[3434,13660,6409],{"class":3451},[3434,13662,13663,13666,13668,13670,13672,13674,13677,13679,13681],{"class":3436,"line":3455},[3434,13664,13665],{"class":3451},"    .",[3434,13667,11518],{"class":3465},[3434,13669,3469],{"class":3451},[3434,13671,11523],{"class":5655},[3434,13673,11526],{"class":3451},[3434,13675,13676],{"class":5644},"event",[3434,13678,11025],{"class":3451},[3434,13680,10646],{"class":5682},[3434,13682,3452],{"class":3451},[3434,13684,13685],{"class":3436,"line":3485},[3434,13686,13687],{"class":3440},"        \u002F\u002F Реагуємо тільки якщо користувач не зробив явного вибору\n",[3434,13689,13690,13692,13694,13696,13698,13700,13702,13704,13706],{"class":3436,"line":3491},[3434,13691,13034],{"class":5682},[3434,13693,10988],{"class":6073},[3434,13695,10787],{"class":3451},[3434,13697,5115],{"class":5644},[3434,13699,4726],{"class":3451},[3434,13701,10868],{"class":3465},[3434,13703,3469],{"class":3451},[3434,13705,11941],{"class":5655},[3434,13707,6409],{"class":3451},[3434,13709,13710,13712,13714,13716],{"class":3436,"line":3498},[3434,13711,13055],{"class":5199},[3434,13713,11544],{"class":3451},[3434,13715,11007],{"class":5644},[3434,13717,6065],{"class":3451},[3434,13719,13720,13722,13724,13726,13728,13730],{"class":3436,"line":3504},[3434,13721,6070],{"class":5682},[3434,13723,6074],{"class":6073},[3434,13725,10787],{"class":3451},[3434,13727,13676],{"class":5644},[3434,13729,4726],{"class":3451},[3434,13731,10936],{"class":5644},[3434,13733,13734,13737,13739,13741,13743,13745,13747,13749,13751,13753,13755,13757],{"class":3436,"line":3511},[3434,13735,13736],{"class":5644},"            document",[3434,13738,4726],{"class":3451},[3434,13740,6393],{"class":5644},[3434,13742,4726],{"class":3451},[3434,13744,5662],{"class":5644},[3434,13746,4726],{"class":3451},[3434,13748,5667],{"class":3465},[3434,13750,3469],{"class":3451},[3434,13752,5672],{"class":5655},[3434,13754,7250],{"class":3451},[3434,13756,12008],{"class":5644},[3434,13758,6409],{"class":3451},[3434,13760,13761,13764,13766,13769,13771,13774,13776,13778,13780,13783,13785,13788,13790,13792],{"class":3436,"line":3529},[3434,13762,13763],{"class":5644},"            console",[3434,13765,4726],{"class":3451},[3434,13767,13768],{"class":3465},"log",[3434,13770,3469],{"class":3451},[3434,13772,13773],{"class":5655},"`Системна тема змінилась на: ",[3434,13775,13366],{"class":5682},[3434,13777,12008],{"class":5644},[3434,13779,6120],{"class":3451},[3434,13781,13782],{"class":5655}," 'темна'",[3434,13784,6126],{"class":3451},[3434,13786,13787],{"class":5655}," 'світла'",[3434,13789,13385],{"class":5682},[3434,13791,13388],{"class":5655},[3434,13793,6409],{"class":3451},[3434,13795,13796],{"class":3436,"line":3810},[3434,13797,6137],{"class":3451},[3434,13799,13800],{"class":3436,"line":3816},[3434,13801,13802],{"class":3451},"    })\n",[3550,13804,13805,13806,13809,13810,13813],{},"Цей обробник варто додати під час ",[3357,13807,13808],{},"initTheme()"," і зберегти посилання на нього, якщо вам колись знадобиться його видалити (",[3357,13811,13812],{},"removeEventListener","). На практиці в більшості застосунків він живе протягом усієї сесії — видаляти не потрібно.",[3396,13815],{},[3348,13817,13819],{"id":13818},"частина-v-складне-multi-theming-та-компонентна-ізоляція","Частина V. Складне: Multi-theming та компонентна ізоляція",[3403,13821,13823],{"id":13822},"_51-що-таке-multi-theming-і-коли-він-потрібен","5.1. Що таке multi-theming і коли він потрібен",[3353,13825,13826,13827,13830],{},"Multi-theming (багатотемність) — це здатність застосунку підтримувати ",[3365,13828,13829],{},"більше двох тем"," одночасно, або застосовувати різні теми до різних секцій сторінки незалежно.",[3353,13832,13833],{},"Типові сценарії:",[13835,13836,13837,13843,13849],"ul",{},[11736,13838,13839,13842],{},[3365,13840,13841],{},"SaaS-платформа"," з можливістю white-labeling: кожен клієнт має власну кольорову схему",[11736,13844,13845,13848],{},[3365,13846,13847],{},"Маркетинговий сайт"," із різними кольоровими секціями (hero — темна, features — світла, pricing — brand-color)",[11736,13850,13851,13854,13855,7250,13858,13861],{},[3365,13852,13853],{},"Компонентна бібліотека"," де кожен компонент має варіанти кольорів (",[3357,13856,13857],{},"variant=\"primary\"",[3357,13859,13860],{},"variant=\"danger\"",")",[3353,13863,13864],{},"Механізм multi-theming заснований на тій самій поведінці CSS Custom Properties, що ми вже розглядали: значення змінних успадковуються від найближчого батька, де вони визначені.",[3396,13866],{},[3403,13868,13870,13871,13874],{"id":13869},"_52-теми-через-data-theme-атрибут","5.2. Теми через ",[3357,13872,13873],{},"data-theme"," атрибут",[3353,13876,13877,13878,4875],{},"Найелегантніший підхід до multi-theming — використання атрибута ",[3357,13879,13873],{},[3425,13881,13884],{"className":3427,"code":13882,"filename":13883,"language":3429,"meta":3430,"style":3430},"\u002F* Тема: Ocean (синьо-бірюзова) *\u002F\n[data-theme=\"ocean\"] {\n    --color-accent:       oklch(0.591 0.221 228); \u002F* cyan-600 *\u002F\n    --color-accent-hover: oklch(0.520 0.225 232); \u002F* cyan-700 *\u002F\n    --color-accent-light: oklch(0.951 0.052 240); \u002F* cyan-50 *\u002F\n    --color-accent-text:  oklch(0.398 0.170 241); \u002F* cyan-800 *\u002F\n}\n\n\u002F* Тема: Forest (зелена) *\u002F\n[data-theme=\"forest\"] {\n    --color-accent:       oklch(0.527 0.154 150); \u002F* emerald-700 *\u002F\n    --color-accent-hover: oklch(0.446 0.130 150); \u002F* emerald-800 *\u002F\n    --color-accent-light: oklch(0.951 0.052 163); \u002F* emerald-50 *\u002F\n    --color-accent-text:  oklch(0.296 0.066 143); \u002F* emerald-900 *\u002F\n}\n\n\u002F* Тема: Sunset (помаранчева) *\u002F\n[data-theme=\"sunset\"] {\n    --color-accent:       oklch(0.646 0.222 41);  \u002F* orange-500 *\u002F\n    --color-accent-hover: oklch(0.553 0.195 38);  \u002F* orange-600 *\u002F\n    --color-accent-light: oklch(0.980 0.016 73);  \u002F* orange-50 *\u002F\n    --color-accent-text:  oklch(0.408 0.153 38);  \u002F* orange-800 *\u002F\n}\n\n\u002F* Тема: Rose (рожева) *\u002F\n[data-theme=\"rose\"] {\n    --color-accent:       oklch(0.645 0.246 16);  \u002F* rose-500 *\u002F\n    --color-accent-hover: oklch(0.586 0.253 17);  \u002F* rose-600 *\u002F\n    --color-accent-light: oklch(0.969 0.015 12);  \u002F* rose-50 *\u002F\n    --color-accent-text:  oklch(0.455 0.188 13);  \u002F* rose-800 *\u002F\n}\n","src\u002Fstyles\u002Fthemes\u002Fbrands.css",[3357,13885,13886,13891,13905,13929,13953,13977,14001,14005,14009,14014,14027,14051,14074,14096,14120,14124,14128,14133,14146,14170,14194,14218,14241,14245,14249,14254,14267,14291,14314,14338,14362],{"__ignoreMap":3430},[3434,13887,13888],{"class":3436,"line":3437},[3434,13889,13890],{"class":3440},"\u002F* Тема: Ocean (синьо-бірюзова) *\u002F\n",[3434,13892,13893,13895,13897,13899,13902],{"class":3436,"line":3444},[3434,13894,13340],{"class":3451},[3434,13896,13873],{"class":3458},[3434,13898,3689],{"class":3451},[3434,13900,13901],{"class":5655},"\"ocean\"",[3434,13903,13904],{"class":3451},"] {\n",[3434,13906,13907,13909,13911,13913,13915,13918,13921,13924,13926],{"class":3436,"line":3455},[3434,13908,3580],{"class":3458},[3434,13910,8903],{"class":3451},[3434,13912,3466],{"class":3465},[3434,13914,3469],{"class":3451},[3434,13916,13917],{"class":3472},"0.591",[3434,13919,13920],{"class":3472}," 0.221",[3434,13922,13923],{"class":3472}," 228",[3434,13925,3598],{"class":3451},[3434,13927,13928],{"class":3440},"\u002F* cyan-600 *\u002F\n",[3434,13930,13931,13933,13935,13937,13939,13942,13945,13948,13950],{"class":3436,"line":3485},[3434,13932,8433],{"class":3458},[3434,13934,3462],{"class":3451},[3434,13936,3466],{"class":3465},[3434,13938,3469],{"class":3451},[3434,13940,13941],{"class":3472},"0.520",[3434,13943,13944],{"class":3472}," 0.225",[3434,13946,13947],{"class":3472}," 232",[3434,13949,3598],{"class":3451},[3434,13951,13952],{"class":3440},"\u002F* cyan-700 *\u002F\n",[3434,13954,13955,13957,13959,13961,13963,13966,13969,13972,13974],{"class":3436,"line":3491},[3434,13956,8449],{"class":3458},[3434,13958,3462],{"class":3451},[3434,13960,3466],{"class":3465},[3434,13962,3469],{"class":3451},[3434,13964,13965],{"class":3472},"0.951",[3434,13967,13968],{"class":3472}," 0.052",[3434,13970,13971],{"class":3472}," 240",[3434,13973,3598],{"class":3451},[3434,13975,13976],{"class":3440},"\u002F* cyan-50 *\u002F\n",[3434,13978,13979,13981,13983,13985,13987,13990,13993,13996,13998],{"class":3436,"line":3498},[3434,13980,8465],{"class":3458},[3434,13982,8153],{"class":3451},[3434,13984,3466],{"class":3465},[3434,13986,3469],{"class":3451},[3434,13988,13989],{"class":3472},"0.398",[3434,13991,13992],{"class":3472}," 0.170",[3434,13994,13995],{"class":3472}," 241",[3434,13997,3598],{"class":3451},[3434,13999,14000],{"class":3440},"\u002F* cyan-800 *\u002F\n",[3434,14002,14003],{"class":3436,"line":3504},[3434,14004,3488],{"class":3451},[3434,14006,14007],{"class":3436,"line":3511},[3434,14008,3495],{"emptyLinePlaceholder":3494},[3434,14010,14011],{"class":3436,"line":3529},[3434,14012,14013],{"class":3440},"\u002F* Тема: Forest (зелена) *\u002F\n",[3434,14015,14016,14018,14020,14022,14025],{"class":3436,"line":3810},[3434,14017,13340],{"class":3451},[3434,14019,13873],{"class":3458},[3434,14021,3689],{"class":3451},[3434,14023,14024],{"class":5655},"\"forest\"",[3434,14026,13904],{"class":3451},[3434,14028,14029,14031,14033,14035,14037,14040,14043,14046,14048],{"class":3436,"line":3816},[3434,14030,3580],{"class":3458},[3434,14032,8903],{"class":3451},[3434,14034,3466],{"class":3465},[3434,14036,3469],{"class":3451},[3434,14038,14039],{"class":3472},"0.527",[3434,14041,14042],{"class":3472}," 0.154",[3434,14044,14045],{"class":3472}," 150",[3434,14047,3598],{"class":3451},[3434,14049,14050],{"class":3440},"\u002F* emerald-700 *\u002F\n",[3434,14052,14053,14055,14057,14059,14061,14064,14067,14069,14071],{"class":3436,"line":3821},[3434,14054,8433],{"class":3458},[3434,14056,3462],{"class":3451},[3434,14058,3466],{"class":3465},[3434,14060,3469],{"class":3451},[3434,14062,14063],{"class":3472},"0.446",[3434,14065,14066],{"class":3472}," 0.130",[3434,14068,14045],{"class":3472},[3434,14070,3598],{"class":3451},[3434,14072,14073],{"class":3440},"\u002F* emerald-800 *\u002F\n",[3434,14075,14076,14078,14080,14082,14084,14086,14088,14091,14093],{"class":3436,"line":3829},[3434,14077,8449],{"class":3458},[3434,14079,3462],{"class":3451},[3434,14081,3466],{"class":3465},[3434,14083,3469],{"class":3451},[3434,14085,13965],{"class":3472},[3434,14087,13968],{"class":3472},[3434,14089,14090],{"class":3472}," 163",[3434,14092,3598],{"class":3451},[3434,14094,14095],{"class":3440},"\u002F* emerald-50 *\u002F\n",[3434,14097,14098,14100,14102,14104,14106,14109,14112,14115,14117],{"class":3436,"line":3835},[3434,14099,8465],{"class":3458},[3434,14101,8153],{"class":3451},[3434,14103,3466],{"class":3465},[3434,14105,3469],{"class":3451},[3434,14107,14108],{"class":3472},"0.296",[3434,14110,14111],{"class":3472}," 0.066",[3434,14113,14114],{"class":3472}," 143",[3434,14116,3598],{"class":3451},[3434,14118,14119],{"class":3440},"\u002F* emerald-900 *\u002F\n",[3434,14121,14122],{"class":3436,"line":3857},[3434,14123,3488],{"class":3451},[3434,14125,14126],{"class":3436,"line":3862},[3434,14127,3495],{"emptyLinePlaceholder":3494},[3434,14129,14130],{"class":3436,"line":3867},[3434,14131,14132],{"class":3440},"\u002F* Тема: Sunset (помаранчева) *\u002F\n",[3434,14134,14135,14137,14139,14141,14144],{"class":3436,"line":3873},[3434,14136,13340],{"class":3451},[3434,14138,13873],{"class":3458},[3434,14140,3689],{"class":3451},[3434,14142,14143],{"class":5655},"\"sunset\"",[3434,14145,13904],{"class":3451},[3434,14147,14148,14150,14152,14154,14156,14159,14162,14165,14167],{"class":3436,"line":3881},[3434,14149,3580],{"class":3458},[3434,14151,8903],{"class":3451},[3434,14153,3466],{"class":3465},[3434,14155,3469],{"class":3451},[3434,14157,14158],{"class":3472},"0.646",[3434,14160,14161],{"class":3472}," 0.222",[3434,14163,14164],{"class":3472}," 41",[3434,14166,8256],{"class":3451},[3434,14168,14169],{"class":3440},"\u002F* orange-500 *\u002F\n",[3434,14171,14172,14174,14176,14178,14180,14183,14186,14189,14191],{"class":3436,"line":3898},[3434,14173,8433],{"class":3458},[3434,14175,3462],{"class":3451},[3434,14177,3466],{"class":3465},[3434,14179,3469],{"class":3451},[3434,14181,14182],{"class":3472},"0.553",[3434,14184,14185],{"class":3472}," 0.195",[3434,14187,14188],{"class":3472}," 38",[3434,14190,8256],{"class":3451},[3434,14192,14193],{"class":3440},"\u002F* orange-600 *\u002F\n",[3434,14195,14196,14198,14200,14202,14204,14207,14210,14213,14215],{"class":3436,"line":3903},[3434,14197,8449],{"class":3458},[3434,14199,3462],{"class":3451},[3434,14201,3466],{"class":3465},[3434,14203,3469],{"class":3451},[3434,14205,14206],{"class":3472},"0.980",[3434,14208,14209],{"class":3472}," 0.016",[3434,14211,14212],{"class":3472}," 73",[3434,14214,8256],{"class":3451},[3434,14216,14217],{"class":3440},"\u002F* orange-50 *\u002F\n",[3434,14219,14220,14222,14224,14226,14228,14231,14234,14236,14238],{"class":3436,"line":3911},[3434,14221,8465],{"class":3458},[3434,14223,8153],{"class":3451},[3434,14225,3466],{"class":3465},[3434,14227,3469],{"class":3451},[3434,14229,14230],{"class":3472},"0.408",[3434,14232,14233],{"class":3472}," 0.153",[3434,14235,14188],{"class":3472},[3434,14237,8256],{"class":3451},[3434,14239,14240],{"class":3440},"\u002F* orange-800 *\u002F\n",[3434,14242,14243],{"class":3436,"line":3927},[3434,14244,3488],{"class":3451},[3434,14246,14247],{"class":3436,"line":3932},[3434,14248,3495],{"emptyLinePlaceholder":3494},[3434,14250,14251],{"class":3436,"line":3940},[3434,14252,14253],{"class":3440},"\u002F* Тема: Rose (рожева) *\u002F\n",[3434,14255,14256,14258,14260,14262,14265],{"class":3436,"line":3956},[3434,14257,13340],{"class":3451},[3434,14259,13873],{"class":3458},[3434,14261,3689],{"class":3451},[3434,14263,14264],{"class":5655},"\"rose\"",[3434,14266,13904],{"class":3451},[3434,14268,14269,14271,14273,14275,14277,14280,14283,14286,14288],{"class":3436,"line":3961},[3434,14270,3580],{"class":3458},[3434,14272,8903],{"class":3451},[3434,14274,3466],{"class":3465},[3434,14276,3469],{"class":3451},[3434,14278,14279],{"class":3472},"0.645",[3434,14281,14282],{"class":3472}," 0.246",[3434,14284,14285],{"class":3472}," 16",[3434,14287,8256],{"class":3451},[3434,14289,14290],{"class":3440},"\u002F* rose-500 *\u002F\n",[3434,14292,14293,14295,14297,14299,14301,14304,14307,14309,14311],{"class":3436,"line":3971},[3434,14294,8433],{"class":3458},[3434,14296,3462],{"class":3451},[3434,14298,3466],{"class":3465},[3434,14300,3469],{"class":3451},[3434,14302,14303],{"class":3472},"0.586",[3434,14305,14306],{"class":3472}," 0.253",[3434,14308,8040],{"class":3472},[3434,14310,8256],{"class":3451},[3434,14312,14313],{"class":3440},"\u002F* rose-600 *\u002F\n",[3434,14315,14316,14318,14320,14322,14324,14327,14330,14333,14335],{"class":3436,"line":3980},[3434,14317,8449],{"class":3458},[3434,14319,3462],{"class":3451},[3434,14321,3466],{"class":3465},[3434,14323,3469],{"class":3451},[3434,14325,14326],{"class":3472},"0.969",[3434,14328,14329],{"class":3472}," 0.015",[3434,14331,14332],{"class":3472}," 12",[3434,14334,8256],{"class":3451},[3434,14336,14337],{"class":3440},"\u002F* rose-50 *\u002F\n",[3434,14339,14340,14342,14344,14346,14348,14351,14354,14357,14359],{"class":3436,"line":4006},[3434,14341,8465],{"class":3458},[3434,14343,8153],{"class":3451},[3434,14345,3466],{"class":3465},[3434,14347,3469],{"class":3451},[3434,14349,14350],{"class":3472},"0.455",[3434,14352,14353],{"class":3472}," 0.188",[3434,14355,14356],{"class":3472}," 13",[3434,14358,8256],{"class":3451},[3434,14360,14361],{"class":3440},"\u002F* rose-800 *\u002F\n",[3434,14363,14364],{"class":3436,"line":4024},[3434,14365,3488],{"class":3451},[3353,14367,14368,14369,14371],{},"Використання: атрибут ",[3357,14370,13873],{}," застосовується до будь-якого контейнера:",[3425,14373,14375],{"className":3656,"code":14374,"language":3658,"meta":3430,"style":3430},"\u003C!-- Вся сторінка у темі \"ocean\" -->\n\u003Chtml data-theme=\"ocean\">\n\n\u003C!-- Або тільки одна секція у темі \"sunset\" -->\n\u003Csection data-theme=\"sunset\" class=\"py-24\">\n    \u003Cbutton class=\"bg-(--color-accent) hover:bg-(--color-accent-hover) text-white px-6 py-3 rounded-xl\">\n        Ця кнопка помаранчева\n    \u003C\u002Fbutton>\n\u003C\u002Fsection>\n\n\u003C!-- Рядом інша секція у темі \"forest\" -->\n\u003Csection data-theme=\"forest\" class=\"py-24\">\n    \u003Cbutton class=\"bg-(--color-accent) hover:bg-(--color-accent-hover) text-white px-6 py-3 rounded-xl\">\n        А ця — зелена\n    \u003C\u002Fbutton>\n\u003C\u002Fsection>\n",[3357,14376,14377,14382,14397,14401,14406,14428,14443,14448,14456,14464,14468,14473,14493,14507,14512,14520],{"__ignoreMap":3430},[3434,14378,14379],{"class":3436,"line":3437},[3434,14380,14381],{"class":3440},"\u003C!-- Вся сторінка у темі \"ocean\" -->\n",[3434,14383,14384,14386,14388,14391,14393,14395],{"class":3436,"line":3444},[3434,14385,3681],{"class":3665},[3434,14387,3658],{"class":3669},[3434,14389,14390],{"class":3458}," data-theme",[3434,14392,3689],{"class":3451},[3434,14394,13901],{"class":3692},[3434,14396,3676],{"class":3665},[3434,14398,14399],{"class":3436,"line":3455},[3434,14400,3495],{"emptyLinePlaceholder":3494},[3434,14402,14403],{"class":3436,"line":3485},[3434,14404,14405],{"class":3440},"\u003C!-- Або тільки одна секція у темі \"sunset\" -->\n",[3434,14407,14408,14410,14413,14415,14417,14419,14421,14423,14426],{"class":3436,"line":3491},[3434,14409,3681],{"class":3665},[3434,14411,14412],{"class":3669},"section",[3434,14414,14390],{"class":3458},[3434,14416,3689],{"class":3451},[3434,14418,14143],{"class":3692},[3434,14420,3988],{"class":3458},[3434,14422,3689],{"class":3451},[3434,14424,14425],{"class":3692},"\"py-24\"",[3434,14427,3676],{"class":3665},[3434,14429,14430,14432,14434,14436,14438,14441],{"class":3436,"line":3498},[3434,14431,4009],{"class":3665},[3434,14433,4342],{"class":3669},[3434,14435,3988],{"class":3458},[3434,14437,3689],{"class":3451},[3434,14439,14440],{"class":3692},"\"bg-(--color-accent) hover:bg-(--color-accent-hover) text-white px-6 py-3 rounded-xl\"",[3434,14442,3676],{"class":3665},[3434,14444,14445],{"class":3436,"line":3504},[3434,14446,14447],{"class":3451},"        Ця кнопка помаранчева\n",[3434,14449,14450,14452,14454],{"class":3436,"line":3511},[3434,14451,4687],{"class":3665},[3434,14453,4342],{"class":3669},[3434,14455,3676],{"class":3665},[3434,14457,14458,14460,14462],{"class":3436,"line":3529},[3434,14459,3964],{"class":3665},[3434,14461,14412],{"class":3669},[3434,14463,3676],{"class":3665},[3434,14465,14466],{"class":3436,"line":3810},[3434,14467,3495],{"emptyLinePlaceholder":3494},[3434,14469,14470],{"class":3436,"line":3816},[3434,14471,14472],{"class":3440},"\u003C!-- Рядом інша секція у темі \"forest\" -->\n",[3434,14474,14475,14477,14479,14481,14483,14485,14487,14489,14491],{"class":3436,"line":3821},[3434,14476,3681],{"class":3665},[3434,14478,14412],{"class":3669},[3434,14480,14390],{"class":3458},[3434,14482,3689],{"class":3451},[3434,14484,14024],{"class":3692},[3434,14486,3988],{"class":3458},[3434,14488,3689],{"class":3451},[3434,14490,14425],{"class":3692},[3434,14492,3676],{"class":3665},[3434,14494,14495,14497,14499,14501,14503,14505],{"class":3436,"line":3829},[3434,14496,4009],{"class":3665},[3434,14498,4342],{"class":3669},[3434,14500,3988],{"class":3458},[3434,14502,3689],{"class":3451},[3434,14504,14440],{"class":3692},[3434,14506,3676],{"class":3665},[3434,14508,14509],{"class":3436,"line":3835},[3434,14510,14511],{"class":3451},"        А ця — зелена\n",[3434,14513,14514,14516,14518],{"class":3436,"line":3857},[3434,14515,4687],{"class":3665},[3434,14517,4342],{"class":3669},[3434,14519,3676],{"class":3665},[3434,14521,14522,14524,14526],{"class":3436,"line":3862},[3434,14523,3964],{"class":3665},[3434,14525,14412],{"class":3669},[3434,14527,3676],{"class":3665},[3353,14529,14530,14531,14534,14535,14537,14538],{},"Той самий клас ",[3357,14532,14533],{},"bg-(--color-accent)"," — різні кольори залежно від ",[3357,14536,13873],{}," батька. ",[3365,14539,14540],{},"Жодних умовних класів у HTML компонента.",[3396,14542],{},[3403,14544,14546],{"id":14545},"_53-поєднання-dark-mode-та-multi-theming","5.3. Поєднання dark mode та multi-theming",[3353,14548,14549],{},"Що якщо потрібно поєднати довільні бренд-теми з підтримкою темного режиму? Кожна тема має мати варіант для темного режиму:",[3425,14551,14553],{"className":3427,"code":14552,"filename":13883,"language":3429,"meta":3430,"style":3430},"\u002F* Ocean — світла *\u002F\n[data-theme=\"ocean\"] {\n    --color-accent:       oklch(0.591 0.221 228);\n    --color-accent-light: oklch(0.951 0.052 240);\n    --color-accent-text:  oklch(0.398 0.170 241);\n}\n\n\u002F* Ocean — темна (через поєднання .dark та [data-theme]) *\u002F\n.dark [data-theme=\"ocean\"],\n[data-theme=\"ocean\"].dark {\n    --color-accent:       oklch(0.706 0.165 228); \u002F* яскравіший для темного фону *\u002F\n    --color-accent-light: oklch(0.257 0.090 232); \u002F* дуже темний cyan для фону *\u002F\n    --color-accent-text:  oklch(0.823 0.120 235); \u002F* світлий для темного фону *\u002F\n}\n",[3357,14554,14555,14560,14572,14590,14608,14626,14630,14634,14639,14655,14672,14695,14716,14740],{"__ignoreMap":3430},[3434,14556,14557],{"class":3436,"line":3437},[3434,14558,14559],{"class":3440},"\u002F* Ocean — світла *\u002F\n",[3434,14561,14562,14564,14566,14568,14570],{"class":3436,"line":3444},[3434,14563,13340],{"class":3451},[3434,14565,13873],{"class":3458},[3434,14567,3689],{"class":3451},[3434,14569,13901],{"class":5655},[3434,14571,13904],{"class":3451},[3434,14573,14574,14576,14578,14580,14582,14584,14586,14588],{"class":3436,"line":3455},[3434,14575,3580],{"class":3458},[3434,14577,8903],{"class":3451},[3434,14579,3466],{"class":3465},[3434,14581,3469],{"class":3451},[3434,14583,13917],{"class":3472},[3434,14585,13920],{"class":3472},[3434,14587,13923],{"class":3472},[3434,14589,3482],{"class":3451},[3434,14591,14592,14594,14596,14598,14600,14602,14604,14606],{"class":3436,"line":3485},[3434,14593,8449],{"class":3458},[3434,14595,3462],{"class":3451},[3434,14597,3466],{"class":3465},[3434,14599,3469],{"class":3451},[3434,14601,13965],{"class":3472},[3434,14603,13968],{"class":3472},[3434,14605,13971],{"class":3472},[3434,14607,3482],{"class":3451},[3434,14609,14610,14612,14614,14616,14618,14620,14622,14624],{"class":3436,"line":3491},[3434,14611,8465],{"class":3458},[3434,14613,8153],{"class":3451},[3434,14615,3466],{"class":3465},[3434,14617,3469],{"class":3451},[3434,14619,13989],{"class":3472},[3434,14621,13992],{"class":3472},[3434,14623,13995],{"class":3472},[3434,14625,3482],{"class":3451},[3434,14627,14628],{"class":3436,"line":3498},[3434,14629,3488],{"class":3451},[3434,14631,14632],{"class":3436,"line":3504},[3434,14633,3495],{"emptyLinePlaceholder":3494},[3434,14635,14636],{"class":3436,"line":3511},[3434,14637,14638],{"class":3440},"\u002F* Ocean — темна (через поєднання .dark та [data-theme]) *\u002F\n",[3434,14640,14641,14643,14646,14648,14650,14652],{"class":3436,"line":3529},[3434,14642,4885],{"class":3447},[3434,14644,14645],{"class":3451}," [",[3434,14647,13873],{"class":3458},[3434,14649,3689],{"class":3451},[3434,14651,13901],{"class":5655},[3434,14653,14654],{"class":3451},"],\n",[3434,14656,14657,14659,14661,14663,14665,14668,14670],{"class":3436,"line":3810},[3434,14658,13340],{"class":3451},[3434,14660,13873],{"class":3458},[3434,14662,3689],{"class":3451},[3434,14664,13901],{"class":5655},[3434,14666,14667],{"class":3451},"]",[3434,14669,4885],{"class":3447},[3434,14671,3452],{"class":3451},[3434,14673,14674,14676,14678,14680,14682,14685,14688,14690,14692],{"class":3436,"line":3816},[3434,14675,3580],{"class":3458},[3434,14677,8903],{"class":3451},[3434,14679,3466],{"class":3465},[3434,14681,3469],{"class":3451},[3434,14683,14684],{"class":3472},"0.706",[3434,14686,14687],{"class":3472}," 0.165",[3434,14689,13923],{"class":3472},[3434,14691,3598],{"class":3451},[3434,14693,14694],{"class":3440},"\u002F* яскравіший для темного фону *\u002F\n",[3434,14696,14697,14699,14701,14703,14705,14707,14709,14711,14713],{"class":3436,"line":3821},[3434,14698,8449],{"class":3458},[3434,14700,3462],{"class":3451},[3434,14702,3466],{"class":3465},[3434,14704,3469],{"class":3451},[3434,14706,8939],{"class":3472},[3434,14708,8942],{"class":3472},[3434,14710,13947],{"class":3472},[3434,14712,3598],{"class":3451},[3434,14714,14715],{"class":3440},"\u002F* дуже темний cyan для фону *\u002F\n",[3434,14717,14718,14720,14722,14724,14726,14729,14732,14735,14737],{"class":3436,"line":3829},[3434,14719,8465],{"class":3458},[3434,14721,8153],{"class":3451},[3434,14723,3466],{"class":3465},[3434,14725,3469],{"class":3451},[3434,14727,14728],{"class":3472},"0.823",[3434,14730,14731],{"class":3472}," 0.120",[3434,14733,14734],{"class":3472}," 235",[3434,14736,3598],{"class":3451},[3434,14738,14739],{"class":3440},"\u002F* світлий для темного фону *\u002F\n",[3434,14741,14742],{"class":3436,"line":3835},[3434,14743,3488],{"class":3451},[3388,14745,14746,14747,14750,14751,14754,14755,14757],{},"Специфічність CSS-правила ",[3357,14748,14749],{},".dark [data-theme=\"ocean\"]"," вища за ",[3357,14752,14753],{},"[data-theme=\"ocean\"]",", тому при наявності класу ",[3357,14756,4885],{}," темна версія акценту автоматично перемагає.",[3353,14759,14760],{},"Живий приклад багатотемного підходу:",[3651,14762,14763],{":tailwind":3653},[3425,14764,14766],{"className":3656,"code":14765,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cscript>\n        (function() {\n            var saved = localStorage.getItem('app-theme')\n            var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n            if (saved === 'dark' || (!saved && prefersDark)) {\n                document.documentElement.classList.add('dark')\n            }\n        })()\n    \u003C\u002Fscript>\n    \u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\u002F4.0\">\u003C\u002Fscript>\n    \u003Cstyle type=\"text\u002Ftailwindcss\">\n        @custom-variant dark (&:is(.dark *));\n\n        :root {\n            --color-bg-base: oklch(0.961 0.005 264.531);\n            --color-bg-surface: oklch(1 0 0);\n            --color-text-primary: oklch(0.208 0.042 265.755);\n            --color-text-muted: oklch(0.554 0.034 264.364);\n            --color-border: oklch(0.929 0.008 264.542);\n            --color-accent: oklch(0.585 0.233 277.117);\n            --color-accent-hover: oklch(0.511 0.262 276.966);\n            --color-accent-light: oklch(0.962 0.018 272.314);\n        }\n\n        .dark {\n            --color-bg-base: oklch(0.113 0.021 261);\n            --color-bg-surface: oklch(0.179 0.027 261);\n            --color-text-primary: oklch(0.984 0.003 247.858);\n            --color-text-muted: oklch(0.704 0.026 264.436);\n            --color-border: oklch(0.300 0.025 264);\n        }\n\n        [data-theme=\"ocean\"] {\n            --color-accent: oklch(0.591 0.221 228);\n            --color-accent-hover: oklch(0.520 0.225 232);\n            --color-accent-light: oklch(0.951 0.052 240);\n        }\n        [data-theme=\"forest\"] {\n            --color-accent: oklch(0.527 0.154 150);\n            --color-accent-hover: oklch(0.446 0.130 150);\n            --color-accent-light: oklch(0.951 0.052 163);\n        }\n        [data-theme=\"sunset\"] {\n            --color-accent: oklch(0.646 0.222 41);\n            --color-accent-hover: oklch(0.553 0.195 38);\n            --color-accent-light: oklch(0.980 0.016 73);\n        }\n        [data-theme=\"rose\"] {\n            --color-accent: oklch(0.645 0.246 16);\n            --color-accent-hover: oklch(0.586 0.253 17);\n            --color-accent-light: oklch(0.969 0.015 12);\n        }\n    \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody class=\"bg-[--color-bg-base] p-6 transition-colors duration-300 min-h-screen\"\n      style=\"font-family: system-ui, sans-serif;\">\n\n    \u003C!-- Заголовок із перемикачами -->\n    \u003Cdiv class=\"flex flex-wrap items-center justify-between gap-3 mb-6\">\n        \u003Cp class=\"text-xs font-bold uppercase tracking-widest text-[--color-text-muted]\">\n            Оберіть тему\n        \u003C\u002Fp>\n        \u003Cdiv class=\"flex items-center gap-2\">\n            \u003C!-- Бренд-теми -->\n            \u003Cdiv class=\"flex gap-1\">\n                \u003Cbutton onclick=\"setTheme('default')\" data-brand=\"default\"\n                        class=\"size-6 rounded-full bg-indigo-500 ring-offset-2 ring-offset-[--color-bg-base] hover:ring-2 ring-indigo-500 transition-all\">\u003C\u002Fbutton>\n                \u003Cbutton onclick=\"setTheme('ocean')\" data-brand=\"ocean\"\n                        class=\"size-6 rounded-full bg-cyan-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-cyan-500 transition-all\">\u003C\u002Fbutton>\n                \u003Cbutton onclick=\"setTheme('forest')\" data-brand=\"forest\"\n                        class=\"size-6 rounded-full bg-emerald-600 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-emerald-600 transition-all\">\u003C\u002Fbutton>\n                \u003Cbutton onclick=\"setTheme('sunset')\" data-brand=\"sunset\"\n                        class=\"size-6 rounded-full bg-orange-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-orange-500 transition-all\">\u003C\u002Fbutton>\n                \u003Cbutton onclick=\"setTheme('rose')\" data-brand=\"rose\"\n                        class=\"size-6 rounded-full bg-rose-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-rose-500 transition-all\">\u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003C!-- Dark mode -->\n            \u003Cdiv class=\"w-px h-5 bg-[--color-border] mx-1\">\u003C\u002Fdiv>\n            \u003Cbutton onclick=\"document.documentElement.classList.toggle('dark')\"\n                    class=\"size-7 rounded-full flex items-center justify-center text-sm\n                           bg-[--color-bg-surface] border border-[--color-border]\n                           hover:border-[--color-accent] transition-all\">\n                \u003Cspan class=\"dark:hidden\">🌙\u003C\u002Fspan>\n                \u003Cspan class=\"hidden dark:block\">☀️\u003C\u002Fspan>\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Картки — той самий компонент, різні теми -->\n    \u003Cdiv class=\"grid grid-cols-1 sm:grid-cols-3 gap-4\" id=\"theme-container\">\n        \u003Cdiv class=\"bg-[--color-bg-surface] border border-[--color-border] rounded-xl p-4\">\n            \u003Cdiv class=\"size-8 rounded-lg bg-[--color-accent-light] flex items-center justify-center mb-3 text-base\">✨\u003C\u002Fdiv>\n            \u003Ch3 class=\"font-bold text-[--color-text-primary] text-sm\">Один компонент\u003C\u002Fh3>\n            \u003Cp class=\"text-xs text-[--color-text-muted] mt-1 leading-relaxed\">Жодних умовних класів. Тема змінює CSS-змінні.\u003C\u002Fp>\n            \u003Cbutton class=\"mt-3 w-full py-1.5 bg-[--color-accent] hover:bg-[--color-accent-hover] text-white text-xs font-semibold rounded-lg transition-colors\">\n                Кнопка\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"bg-[--color-bg-surface] border border-[--color-border] rounded-xl p-4\">\n            \u003Cdiv class=\"size-8 rounded-lg bg-[--color-accent-light] flex items-center justify-center mb-3 text-base\">🎨\u003C\u002Fdiv>\n            \u003Ch3 class=\"font-bold text-[--color-text-primary] text-sm\">Той самий клас\u003C\u002Fh3>\n            \u003Cp class=\"text-xs text-[--color-text-muted] mt-1 leading-relaxed\">bg-(--color-accent) завжди правильний колір.\u003C\u002Fp>\n            \u003Cbutton class=\"mt-3 w-full py-1.5 bg-[--color-accent] hover:bg-[--color-accent-hover] text-white text-xs font-semibold rounded-lg transition-colors\">\n                Кнопка\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"bg-[--color-bg-surface] border border-[--color-border] rounded-xl p-4\">\n            \u003Cdiv class=\"size-8 rounded-lg bg-[--color-accent-light] flex items-center justify-center mb-3 text-base\">⚡\u003C\u002Fdiv>\n            \u003Ch3 class=\"font-bold text-[--color-text-primary] text-sm\">Нескінченно гнучко\u003C\u002Fh3>\n            \u003Cp class=\"text-xs text-[--color-text-muted] mt-1 leading-relaxed\">Додайте нову тему — HTML не чіпаєте.\u003C\u002Fp>\n            \u003Cbutton class=\"mt-3 w-full py-1.5 bg-[--color-accent] hover:bg-[--color-accent-hover] text-white text-xs font-semibold rounded-lg transition-colors\">\n                Кнопка\n            \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n\u003Cscript>\n    function setTheme(brand) {\n        const container = document.getElementById('theme-container')\n        if (brand === 'default') {\n            container.removeAttribute('data-theme')\n        } else {\n            container.setAttribute('data-theme', brand)\n        }\n    }\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,14767,14768,14778,14792,14800,14814,14822,14830,14850,14872,14898,14920,14924,14928,14936,14954,14968,14974,14978,14984,15005,15023,15041,15059,15077,15097,15119,15141,15145,15149,15155,15173,15191,15209,15227,15245,15249,15253,15266,15284,15302,15320,15324,15336,15354,15372,15390,15394,15406,15424,15442,15460,15464,15476,15494,15512,15530,15534,15542,15550,15563,15573,15577,15582,15597,15612,15617,15625,15640,15645,15660,15689,15705,15733,15748,15776,15791,15819,15834,15862,15877,15885,15890,15909,15941,15950,15955,15962,15984,16006,16014,16022,16030,16034,16039,16061,16076,16100,16124,16148,16163,16168,16176,16184,16198,16221,16244,16267,16281,16285,16293,16301,16315,16338,16361,16384,16398,16402,16410,16418,16427,16432,16441,16455,16478,16494,16511,16520,16539,16544,16549,16558,16567],{"__ignoreMap":3430},[3434,14769,14770,14772,14774,14776],{"class":3436,"line":3437},[3434,14771,3666],{"class":3665},[3434,14773,3670],{"class":3669},[3434,14775,3673],{"class":3458},[3434,14777,3676],{"class":3665},[3434,14779,14780,14782,14784,14786,14788,14790],{"class":3436,"line":3444},[3434,14781,3681],{"class":3665},[3434,14783,3658],{"class":3669},[3434,14785,3686],{"class":3458},[3434,14787,3689],{"class":3451},[3434,14789,3693],{"class":3692},[3434,14791,3676],{"class":3665},[3434,14793,14794,14796,14798],{"class":3436,"line":3455},[3434,14795,3681],{"class":3665},[3434,14797,3702],{"class":3669},[3434,14799,3676],{"class":3665},[3434,14801,14802,14804,14806,14808,14810,14812],{"class":3436,"line":3485},[3434,14803,4009],{"class":3665},[3434,14805,3711],{"class":3669},[3434,14807,3714],{"class":3458},[3434,14809,3689],{"class":3451},[3434,14811,3719],{"class":3692},[3434,14813,3676],{"class":3665},[3434,14815,14816,14818,14820],{"class":3436,"line":3491},[3434,14817,4009],{"class":3665},[3434,14819,3728],{"class":3669},[3434,14821,3676],{"class":3665},[3434,14823,14824,14826,14828],{"class":3436,"line":3498},[3434,14825,11917],{"class":3734},[3434,14827,10849],{"class":5682},[3434,14829,10855],{"class":3734},[3434,14831,14832,14834,14836,14838,14840,14842,14844,14846,14848],{"class":3436,"line":3504},[3434,14833,11926],{"class":5682},[3434,14835,10988],{"class":5644},[3434,14837,6077],{"class":3451},[3434,14839,10863],{"class":5644},[3434,14841,4726],{"class":3734},[3434,14843,10868],{"class":3465},[3434,14845,3469],{"class":3734},[3434,14847,11941],{"class":5655},[3434,14849,6409],{"class":3734},[3434,14851,14852,14854,14856,14858,14860,14862,14864,14866,14868,14870],{"class":3436,"line":3511},[3434,14853,11926],{"class":5682},[3434,14855,11950],{"class":5644},[3434,14857,6077],{"class":3451},[3434,14859,10921],{"class":5644},[3434,14861,4726],{"class":3734},[3434,14863,10926],{"class":3465},[3434,14865,3469],{"class":3734},[3434,14867,10931],{"class":5655},[3434,14869,5659],{"class":3734},[3434,14871,10936],{"class":5644},[3434,14873,14874,14876,14878,14880,14882,14884,14886,14888,14890,14892,14894,14896],{"class":3436,"line":3529},[3434,14875,11541],{"class":5199},[3434,14877,11004],{"class":3734},[3434,14879,11007],{"class":5644},[3434,14881,11979],{"class":3451},[3434,14883,11982],{"class":5655},[3434,14885,11985],{"class":3451},[3434,14887,11004],{"class":3734},[3434,14889,11990],{"class":3451},[3434,14891,11007],{"class":5644},[3434,14893,11995],{"class":3451},[3434,14895,11950],{"class":5644},[3434,14897,12286],{"class":3734},[3434,14899,14900,14902,14904,14906,14908,14910,14912,14914,14916,14918],{"class":3436,"line":3810},[3434,14901,12291],{"class":5644},[3434,14903,4726],{"class":3734},[3434,14905,6393],{"class":5644},[3434,14907,4726],{"class":3734},[3434,14909,5662],{"class":5644},[3434,14911,4726],{"class":3734},[3434,14913,6402],{"class":3465},[3434,14915,3469],{"class":3734},[3434,14917,5672],{"class":5655},[3434,14919,6409],{"class":3734},[3434,14921,14922],{"class":3436,"line":3816},[3434,14923,11580],{"class":3734},[3434,14925,14926],{"class":3436,"line":3821},[3434,14927,12035],{"class":3734},[3434,14929,14930,14932,14934],{"class":3436,"line":3829},[3434,14931,4687],{"class":3665},[3434,14933,3728],{"class":3669},[3434,14935,3676],{"class":3665},[3434,14937,14938,14940,14942,14944,14946,14948,14950,14952],{"class":3436,"line":3835},[3434,14939,4009],{"class":3665},[3434,14941,3728],{"class":3669},[3434,14943,3731],{"class":3458},[3434,14945,3689],{"class":3734},[3434,14947,6565],{"class":3692},[3434,14949,3740],{"class":3665},[3434,14951,3728],{"class":3669},[3434,14953,3676],{"class":3665},[3434,14955,14956,14958,14960,14962,14964,14966],{"class":3436,"line":3857},[3434,14957,4009],{"class":3665},[3434,14959,3776],{"class":3669},[3434,14961,6580],{"class":3458},[3434,14963,3689],{"class":3734},[3434,14965,6585],{"class":3692},[3434,14967,3676],{"class":3665},[3434,14969,14970,14972],{"class":3436,"line":3862},[3434,14971,6592],{"class":5199},[3434,14973,5527],{"class":3734},[3434,14975,14976],{"class":3436,"line":3867},[3434,14977,3495],{"emptyLinePlaceholder":3494},[3434,14979,14980,14982],{"class":3436,"line":3873},[3434,14981,12372],{"class":3447},[3434,14983,3452],{"class":3734},[3434,14985,14986,14988,14990,14992,14994,14997,15000,15003],{"class":3436,"line":3881},[3434,14987,12379],{"class":3458},[3434,14989,3462],{"class":3734},[3434,14991,3466],{"class":3465},[3434,14993,3469],{"class":3734},[3434,14995,14996],{"class":3472},"0.961",[3434,14998,14999],{"class":3472}," 0.005",[3434,15001,15002],{"class":3472}," 264.531",[3434,15004,3482],{"class":3734},[3434,15006,15007,15009,15011,15013,15015,15017,15019,15021],{"class":3436,"line":3898},[3434,15008,12398],{"class":3458},[3434,15010,3462],{"class":3734},[3434,15012,3466],{"class":3465},[3434,15014,3469],{"class":3734},[3434,15016,8160],{"class":3472},[3434,15018,4757],{"class":3472},[3434,15020,4757],{"class":3472},[3434,15022,3482],{"class":3734},[3434,15024,15025,15027,15029,15031,15033,15035,15037,15039],{"class":3436,"line":3903},[3434,15026,12417],{"class":3458},[3434,15028,3462],{"class":3734},[3434,15030,3466],{"class":3465},[3434,15032,3469],{"class":3734},[3434,15034,9473],{"class":3472},[3434,15036,5233],{"class":3472},[3434,15038,9478],{"class":3472},[3434,15040,3482],{"class":3734},[3434,15042,15043,15045,15047,15049,15051,15053,15055,15057],{"class":3436,"line":3911},[3434,15044,12436],{"class":3458},[3434,15046,3462],{"class":3734},[3434,15048,3466],{"class":3465},[3434,15050,3469],{"class":3734},[3434,15052,9494],{"class":3472},[3434,15054,9497],{"class":3472},[3434,15056,9500],{"class":3472},[3434,15058,3482],{"class":3734},[3434,15060,15061,15063,15065,15067,15069,15071,15073,15075],{"class":3436,"line":3927},[3434,15062,12455],{"class":3458},[3434,15064,3462],{"class":3734},[3434,15066,3466],{"class":3465},[3434,15068,3469],{"class":3734},[3434,15070,9516],{"class":3472},[3434,15072,9519],{"class":3472},[3434,15074,9522],{"class":3472},[3434,15076,3482],{"class":3734},[3434,15078,15079,15082,15084,15086,15088,15090,15092,15095],{"class":3436,"line":3932},[3434,15080,15081],{"class":3458},"            --color-accent",[3434,15083,3462],{"class":3734},[3434,15085,3466],{"class":3465},[3434,15087,3469],{"class":3734},[3434,15089,3589],{"class":3472},[3434,15091,3592],{"class":3472},[3434,15093,15094],{"class":3472}," 277.117",[3434,15096,3482],{"class":3734},[3434,15098,15099,15102,15104,15106,15108,15111,15114,15117],{"class":3436,"line":3940},[3434,15100,15101],{"class":3458},"            --color-accent-hover",[3434,15103,3462],{"class":3734},[3434,15105,3466],{"class":3465},[3434,15107,3469],{"class":3734},[3434,15109,15110],{"class":3472},"0.511",[3434,15112,15113],{"class":3472}," 0.262",[3434,15115,15116],{"class":3472}," 276.966",[3434,15118,3482],{"class":3734},[3434,15120,15121,15124,15126,15128,15130,15133,15136,15139],{"class":3436,"line":3956},[3434,15122,15123],{"class":3458},"            --color-accent-light",[3434,15125,3462],{"class":3734},[3434,15127,3466],{"class":3465},[3434,15129,3469],{"class":3734},[3434,15131,15132],{"class":3472},"0.962",[3434,15134,15135],{"class":3472}," 0.018",[3434,15137,15138],{"class":3472}," 272.314",[3434,15140,3482],{"class":3734},[3434,15142,15143],{"class":3436,"line":3961},[3434,15144,6137],{"class":3734},[3434,15146,15147],{"class":3436,"line":3971},[3434,15148,3495],{"emptyLinePlaceholder":3494},[3434,15150,15151,15153],{"class":3436,"line":3980},[3434,15152,12482],{"class":3447},[3434,15154,3452],{"class":3734},[3434,15156,15157,15159,15161,15163,15165,15167,15169,15171],{"class":3436,"line":4006},[3434,15158,12379],{"class":3458},[3434,15160,3462],{"class":3734},[3434,15162,3466],{"class":3465},[3434,15164,3469],{"class":3734},[3434,15166,8622],{"class":3472},[3434,15168,8625],{"class":3472},[3434,15170,7527],{"class":3472},[3434,15172,3482],{"class":3734},[3434,15174,15175,15177,15179,15181,15183,15185,15187,15189],{"class":3436,"line":4024},[3434,15176,12398],{"class":3458},[3434,15178,3462],{"class":3734},[3434,15180,3466],{"class":3465},[3434,15182,3469],{"class":3734},[3434,15184,8645],{"class":3472},[3434,15186,8648],{"class":3472},[3434,15188,7527],{"class":3472},[3434,15190,3482],{"class":3734},[3434,15192,15193,15195,15197,15199,15201,15203,15205,15207],{"class":3436,"line":4051},[3434,15194,12417],{"class":3458},[3434,15196,3462],{"class":3734},[3434,15198,3466],{"class":3465},[3434,15200,3469],{"class":3734},[3434,15202,9432],{"class":3472},[3434,15204,9435],{"class":3472},[3434,15206,9438],{"class":3472},[3434,15208,3482],{"class":3734},[3434,15210,15211,15213,15215,15217,15219,15221,15223,15225],{"class":3436,"line":4057},[3434,15212,12436],{"class":3458},[3434,15214,3462],{"class":3734},[3434,15216,3466],{"class":3465},[3434,15218,3469],{"class":3734},[3434,15220,9619],{"class":3472},[3434,15222,9622],{"class":3472},[3434,15224,9625],{"class":3472},[3434,15226,3482],{"class":3734},[3434,15228,15229,15231,15233,15235,15237,15239,15241,15243],{"class":3436,"line":4073},[3434,15230,12455],{"class":3458},[3434,15232,3462],{"class":3734},[3434,15234,3466],{"class":3465},[3434,15236,3469],{"class":3734},[3434,15238,8839],{"class":3472},[3434,15240,8671],{"class":3472},[3434,15242,4783],{"class":3472},[3434,15244,3482],{"class":3734},[3434,15246,15247],{"class":3436,"line":4079},[3434,15248,6137],{"class":3734},[3434,15250,15251],{"class":3436,"line":4096},[3434,15252,3495],{"emptyLinePlaceholder":3494},[3434,15254,15255,15258,15260,15262,15264],{"class":3436,"line":4113},[3434,15256,15257],{"class":3734},"        [",[3434,15259,13873],{"class":3458},[3434,15261,3689],{"class":3451},[3434,15263,13901],{"class":5655},[3434,15265,13904],{"class":3734},[3434,15267,15268,15270,15272,15274,15276,15278,15280,15282],{"class":3436,"line":4119},[3434,15269,15081],{"class":3458},[3434,15271,3462],{"class":3734},[3434,15273,3466],{"class":3465},[3434,15275,3469],{"class":3734},[3434,15277,13917],{"class":3472},[3434,15279,13920],{"class":3472},[3434,15281,13923],{"class":3472},[3434,15283,3482],{"class":3734},[3434,15285,15286,15288,15290,15292,15294,15296,15298,15300],{"class":3436,"line":4129},[3434,15287,15101],{"class":3458},[3434,15289,3462],{"class":3734},[3434,15291,3466],{"class":3465},[3434,15293,3469],{"class":3734},[3434,15295,13941],{"class":3472},[3434,15297,13944],{"class":3472},[3434,15299,13947],{"class":3472},[3434,15301,3482],{"class":3734},[3434,15303,15304,15306,15308,15310,15312,15314,15316,15318],{"class":3436,"line":4145},[3434,15305,15123],{"class":3458},[3434,15307,3462],{"class":3734},[3434,15309,3466],{"class":3465},[3434,15311,3469],{"class":3734},[3434,15313,13965],{"class":3472},[3434,15315,13968],{"class":3472},[3434,15317,13971],{"class":3472},[3434,15319,3482],{"class":3734},[3434,15321,15322],{"class":3436,"line":4162},[3434,15323,6137],{"class":3734},[3434,15325,15326,15328,15330,15332,15334],{"class":3436,"line":4168},[3434,15327,15257],{"class":3734},[3434,15329,13873],{"class":3458},[3434,15331,3689],{"class":3451},[3434,15333,14024],{"class":5655},[3434,15335,13904],{"class":3734},[3434,15337,15338,15340,15342,15344,15346,15348,15350,15352],{"class":3436,"line":4178},[3434,15339,15081],{"class":3458},[3434,15341,3462],{"class":3734},[3434,15343,3466],{"class":3465},[3434,15345,3469],{"class":3734},[3434,15347,14039],{"class":3472},[3434,15349,14042],{"class":3472},[3434,15351,14045],{"class":3472},[3434,15353,3482],{"class":3734},[3434,15355,15356,15358,15360,15362,15364,15366,15368,15370],{"class":3436,"line":4187},[3434,15357,15101],{"class":3458},[3434,15359,3462],{"class":3734},[3434,15361,3466],{"class":3465},[3434,15363,3469],{"class":3734},[3434,15365,14063],{"class":3472},[3434,15367,14066],{"class":3472},[3434,15369,14045],{"class":3472},[3434,15371,3482],{"class":3734},[3434,15373,15374,15376,15378,15380,15382,15384,15386,15388],{"class":3436,"line":4213},[3434,15375,15123],{"class":3458},[3434,15377,3462],{"class":3734},[3434,15379,3466],{"class":3465},[3434,15381,3469],{"class":3734},[3434,15383,13965],{"class":3472},[3434,15385,13968],{"class":3472},[3434,15387,14090],{"class":3472},[3434,15389,3482],{"class":3734},[3434,15391,15392],{"class":3436,"line":4238},[3434,15393,6137],{"class":3734},[3434,15395,15396,15398,15400,15402,15404],{"class":3436,"line":4247},[3434,15397,15257],{"class":3734},[3434,15399,13873],{"class":3458},[3434,15401,3689],{"class":3451},[3434,15403,14143],{"class":5655},[3434,15405,13904],{"class":3734},[3434,15407,15408,15410,15412,15414,15416,15418,15420,15422],{"class":3436,"line":4256},[3434,15409,15081],{"class":3458},[3434,15411,3462],{"class":3734},[3434,15413,3466],{"class":3465},[3434,15415,3469],{"class":3734},[3434,15417,14158],{"class":3472},[3434,15419,14161],{"class":3472},[3434,15421,14164],{"class":3472},[3434,15423,3482],{"class":3734},[3434,15425,15426,15428,15430,15432,15434,15436,15438,15440],{"class":3436,"line":4272},[3434,15427,15101],{"class":3458},[3434,15429,3462],{"class":3734},[3434,15431,3466],{"class":3465},[3434,15433,3469],{"class":3734},[3434,15435,14182],{"class":3472},[3434,15437,14185],{"class":3472},[3434,15439,14188],{"class":3472},[3434,15441,3482],{"class":3734},[3434,15443,15444,15446,15448,15450,15452,15454,15456,15458],{"class":3436,"line":4288},[3434,15445,15123],{"class":3458},[3434,15447,3462],{"class":3734},[3434,15449,3466],{"class":3465},[3434,15451,3469],{"class":3734},[3434,15453,14206],{"class":3472},[3434,15455,14209],{"class":3472},[3434,15457,14212],{"class":3472},[3434,15459,3482],{"class":3734},[3434,15461,15462],{"class":3436,"line":4319},[3434,15463,6137],{"class":3734},[3434,15465,15466,15468,15470,15472,15474],{"class":3436,"line":4328},[3434,15467,15257],{"class":3734},[3434,15469,13873],{"class":3458},[3434,15471,3689],{"class":3451},[3434,15473,14264],{"class":5655},[3434,15475,13904],{"class":3734},[3434,15477,15478,15480,15482,15484,15486,15488,15490,15492],{"class":3436,"line":4337},[3434,15479,15081],{"class":3458},[3434,15481,3462],{"class":3734},[3434,15483,3466],{"class":3465},[3434,15485,3469],{"class":3734},[3434,15487,14279],{"class":3472},[3434,15489,14282],{"class":3472},[3434,15491,14285],{"class":3472},[3434,15493,3482],{"class":3734},[3434,15495,15496,15498,15500,15502,15504,15506,15508,15510],{"class":3436,"line":4354},[3434,15497,15101],{"class":3458},[3434,15499,3462],{"class":3734},[3434,15501,3466],{"class":3465},[3434,15503,3469],{"class":3734},[3434,15505,14303],{"class":3472},[3434,15507,14306],{"class":3472},[3434,15509,8040],{"class":3472},[3434,15511,3482],{"class":3734},[3434,15513,15514,15516,15518,15520,15522,15524,15526,15528],{"class":3436,"line":4360},[3434,15515,15123],{"class":3458},[3434,15517,3462],{"class":3734},[3434,15519,3466],{"class":3465},[3434,15521,3469],{"class":3734},[3434,15523,14326],{"class":3472},[3434,15525,14329],{"class":3472},[3434,15527,14332],{"class":3472},[3434,15529,3482],{"class":3734},[3434,15531,15532],{"class":3436,"line":4369},[3434,15533,6137],{"class":3734},[3434,15535,15536,15538,15540],{"class":3436,"line":4379},[3434,15537,4687],{"class":3665},[3434,15539,3776],{"class":3669},[3434,15541,3676],{"class":3665},[3434,15543,15544,15546,15548],{"class":3436,"line":4384},[3434,15545,3964],{"class":3665},[3434,15547,3702],{"class":3669},[3434,15549,3676],{"class":3665},[3434,15551,15552,15554,15556,15558,15560],{"class":3436,"line":4390},[3434,15553,3681],{"class":3665},[3434,15555,3985],{"class":3669},[3434,15557,3988],{"class":3458},[3434,15559,3689],{"class":3451},[3434,15561,15562],{"class":3692},"\"bg-[--color-bg-base] p-6 transition-colors duration-300 min-h-screen\"\n",[3434,15564,15565,15567,15569,15571],{"class":3436,"line":4406},[3434,15566,6628],{"class":3458},[3434,15568,3689],{"class":3451},[3434,15570,6633],{"class":3692},[3434,15572,3676],{"class":3665},[3434,15574,15575],{"class":3436,"line":4422},[3434,15576,3495],{"emptyLinePlaceholder":3494},[3434,15578,15579],{"class":3436,"line":4428},[3434,15580,15581],{"class":3440},"    \u003C!-- Заголовок із перемикачами -->\n",[3434,15583,15584,15586,15588,15590,15592,15595],{"class":3436,"line":4437},[3434,15585,4009],{"class":3665},[3434,15587,4012],{"class":3669},[3434,15589,3988],{"class":3458},[3434,15591,3689],{"class":3451},[3434,15593,15594],{"class":3692},"\"flex flex-wrap items-center justify-between gap-3 mb-6\"",[3434,15596,3676],{"class":3665},[3434,15598,15599,15601,15603,15605,15607,15610],{"class":3436,"line":4452},[3434,15600,4027],{"class":3665},[3434,15602,3353],{"class":3669},[3434,15604,3988],{"class":3458},[3434,15606,3689],{"class":3451},[3434,15608,15609],{"class":3692},"\"text-xs font-bold uppercase tracking-widest text-[--color-text-muted]\"",[3434,15611,3676],{"class":3665},[3434,15613,15614],{"class":3436,"line":4467},[3434,15615,15616],{"class":3451},"            Оберіть тему\n",[3434,15618,15619,15621,15623],{"class":3436,"line":4473},[3434,15620,4677],{"class":3665},[3434,15622,3353],{"class":3669},[3434,15624,3676],{"class":3665},[3434,15626,15627,15629,15631,15633,15635,15638],{"class":3436,"line":4482},[3434,15628,4027],{"class":3665},[3434,15630,4012],{"class":3669},[3434,15632,3988],{"class":3458},[3434,15634,3689],{"class":3451},[3434,15636,15637],{"class":3692},"\"flex items-center gap-2\"",[3434,15639,3676],{"class":3665},[3434,15641,15642],{"class":3436,"line":4491},[3434,15643,15644],{"class":3440},"            \u003C!-- Бренд-теми -->\n",[3434,15646,15647,15649,15651,15653,15655,15658],{"class":3436,"line":4515},[3434,15648,4082],{"class":3665},[3434,15650,4012],{"class":3669},[3434,15652,3988],{"class":3458},[3434,15654,3689],{"class":3451},[3434,15656,15657],{"class":3692},"\"flex gap-1\"",[3434,15659,3676],{"class":3665},[3434,15661,15662,15664,15666,15668,15670,15672,15674,15676,15679,15681,15684,15686],{"class":3436,"line":4539},[3434,15663,4099],{"class":3665},[3434,15665,4342],{"class":3669},[3434,15667,5636],{"class":3458},[3434,15669,3689],{"class":3451},[3434,15671,5641],{"class":3692},[3434,15673,11619],{"class":3465},[3434,15675,3469],{"class":3692},[3434,15677,15678],{"class":5655},"'default'",[3434,15680,5686],{"class":3692},[3434,15682,15683],{"class":3458}," data-brand",[3434,15685,3689],{"class":3451},[3434,15687,15688],{"class":3692},"\"default\"\n",[3434,15690,15691,15694,15696,15699,15701,15703],{"class":3436,"line":4548},[3434,15692,15693],{"class":3458},"                        class",[3434,15695,3689],{"class":3451},[3434,15697,15698],{"class":3692},"\"size-6 rounded-full bg-indigo-500 ring-offset-2 ring-offset-[--color-bg-base] hover:ring-2 ring-indigo-500 transition-all\"",[3434,15700,3740],{"class":3665},[3434,15702,4342],{"class":3669},[3434,15704,3676],{"class":3665},[3434,15706,15707,15709,15711,15713,15715,15717,15719,15721,15724,15726,15728,15730],{"class":3436,"line":4557},[3434,15708,4099],{"class":3665},[3434,15710,4342],{"class":3669},[3434,15712,5636],{"class":3458},[3434,15714,3689],{"class":3451},[3434,15716,5641],{"class":3692},[3434,15718,11619],{"class":3465},[3434,15720,3469],{"class":3692},[3434,15722,15723],{"class":5655},"'ocean'",[3434,15725,5686],{"class":3692},[3434,15727,15683],{"class":3458},[3434,15729,3689],{"class":3451},[3434,15731,15732],{"class":3692},"\"ocean\"\n",[3434,15734,15735,15737,15739,15742,15744,15746],{"class":3436,"line":4572},[3434,15736,15693],{"class":3458},[3434,15738,3689],{"class":3451},[3434,15740,15741],{"class":3692},"\"size-6 rounded-full bg-cyan-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-cyan-500 transition-all\"",[3434,15743,3740],{"class":3665},[3434,15745,4342],{"class":3669},[3434,15747,3676],{"class":3665},[3434,15749,15750,15752,15754,15756,15758,15760,15762,15764,15767,15769,15771,15773],{"class":3436,"line":4587},[3434,15751,4099],{"class":3665},[3434,15753,4342],{"class":3669},[3434,15755,5636],{"class":3458},[3434,15757,3689],{"class":3451},[3434,15759,5641],{"class":3692},[3434,15761,11619],{"class":3465},[3434,15763,3469],{"class":3692},[3434,15765,15766],{"class":5655},"'forest'",[3434,15768,5686],{"class":3692},[3434,15770,15683],{"class":3458},[3434,15772,3689],{"class":3451},[3434,15774,15775],{"class":3692},"\"forest\"\n",[3434,15777,15778,15780,15782,15785,15787,15789],{"class":3436,"line":4617},[3434,15779,15693],{"class":3458},[3434,15781,3689],{"class":3451},[3434,15783,15784],{"class":3692},"\"size-6 rounded-full bg-emerald-600 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-emerald-600 transition-all\"",[3434,15786,3740],{"class":3665},[3434,15788,4342],{"class":3669},[3434,15790,3676],{"class":3665},[3434,15792,15793,15795,15797,15799,15801,15803,15805,15807,15810,15812,15814,15816],{"class":3436,"line":4626},[3434,15794,4099],{"class":3665},[3434,15796,4342],{"class":3669},[3434,15798,5636],{"class":3458},[3434,15800,3689],{"class":3451},[3434,15802,5641],{"class":3692},[3434,15804,11619],{"class":3465},[3434,15806,3469],{"class":3692},[3434,15808,15809],{"class":5655},"'sunset'",[3434,15811,5686],{"class":3692},[3434,15813,15683],{"class":3458},[3434,15815,3689],{"class":3451},[3434,15817,15818],{"class":3692},"\"sunset\"\n",[3434,15820,15821,15823,15825,15828,15830,15832],{"class":3436,"line":4635},[3434,15822,15693],{"class":3458},[3434,15824,3689],{"class":3451},[3434,15826,15827],{"class":3692},"\"size-6 rounded-full bg-orange-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-orange-500 transition-all\"",[3434,15829,3740],{"class":3665},[3434,15831,4342],{"class":3669},[3434,15833,3676],{"class":3665},[3434,15835,15836,15838,15840,15842,15844,15846,15848,15850,15853,15855,15857,15859],{"class":3436,"line":4650},[3434,15837,4099],{"class":3665},[3434,15839,4342],{"class":3669},[3434,15841,5636],{"class":3458},[3434,15843,3689],{"class":3451},[3434,15845,5641],{"class":3692},[3434,15847,11619],{"class":3465},[3434,15849,3469],{"class":3692},[3434,15851,15852],{"class":5655},"'rose'",[3434,15854,5686],{"class":3692},[3434,15856,15683],{"class":3458},[3434,15858,3689],{"class":3451},[3434,15860,15861],{"class":3692},"\"rose\"\n",[3434,15863,15864,15866,15868,15871,15873,15875],{"class":3436,"line":4656},[3434,15865,15693],{"class":3458},[3434,15867,3689],{"class":3451},[3434,15869,15870],{"class":3692},"\"size-6 rounded-full bg-rose-500 hover:ring-2 ring-offset-2 ring-offset-[--color-bg-base] ring-rose-500 transition-all\"",[3434,15872,3740],{"class":3665},[3434,15874,4342],{"class":3669},[3434,15876,3676],{"class":3665},[3434,15878,15879,15881,15883],{"class":3436,"line":4665},[3434,15880,4372],{"class":3665},[3434,15882,4012],{"class":3669},[3434,15884,3676],{"class":3665},[3434,15886,15887],{"class":3436,"line":4674},[3434,15888,15889],{"class":3440},"            \u003C!-- Dark mode -->\n",[3434,15891,15892,15894,15896,15898,15900,15903,15905,15907],{"class":3436,"line":4684},[3434,15893,4082],{"class":3665},[3434,15895,4012],{"class":3669},[3434,15897,3988],{"class":3458},[3434,15899,3689],{"class":3451},[3434,15901,15902],{"class":3692},"\"w-px h-5 bg-[--color-border] mx-1\"",[3434,15904,3740],{"class":3665},[3434,15906,4012],{"class":3669},[3434,15908,3676],{"class":3665},[3434,15910,15911,15913,15915,15917,15919,15921,15923,15925,15927,15929,15931,15933,15935,15937,15939],{"class":3436,"line":4694},[3434,15912,4082],{"class":3665},[3434,15914,4342],{"class":3669},[3434,15916,5636],{"class":3458},[3434,15918,3689],{"class":3451},[3434,15920,5641],{"class":3692},[3434,15922,5645],{"class":5644},[3434,15924,4726],{"class":3692},[3434,15926,6393],{"class":5644},[3434,15928,4726],{"class":3692},[3434,15930,5662],{"class":5644},[3434,15932,4726],{"class":3692},[3434,15934,5667],{"class":3465},[3434,15936,3469],{"class":3692},[3434,15938,5672],{"class":5655},[3434,15940,6691],{"class":3692},[3434,15942,15943,15945,15947],{"class":3436,"line":4703},[3434,15944,5694],{"class":3458},[3434,15946,3689],{"class":3451},[3434,15948,15949],{"class":3692},"\"size-7 rounded-full flex items-center justify-center text-sm\n",[3434,15951,15952],{"class":3436,"line":10438},[3434,15953,15954],{"class":3692},"                           bg-[--color-bg-surface] border border-[--color-border]\n",[3434,15956,15957,15960],{"class":3436,"line":11434},[3434,15958,15959],{"class":3692},"                           hover:border-[--color-accent] transition-all\"",[3434,15961,3676],{"class":3665},[3434,15963,15964,15966,15968,15970,15972,15974,15976,15978,15980,15982],{"class":3436,"line":11439},[3434,15965,4099],{"class":3665},[3434,15967,3434],{"class":3669},[3434,15969,3988],{"class":3458},[3434,15971,3689],{"class":3451},[3434,15973,6744],{"class":3692},[3434,15975,4039],{"class":3665},[3434,15977,6749],{"class":3451},[3434,15979,3964],{"class":3665},[3434,15981,3434],{"class":3669},[3434,15983,3676],{"class":3665},[3434,15985,15986,15988,15990,15992,15994,15996,15998,16000,16002,16004],{"class":3436,"line":11445},[3434,15987,4099],{"class":3665},[3434,15989,3434],{"class":3669},[3434,15991,3988],{"class":3458},[3434,15993,3689],{"class":3451},[3434,15995,6768],{"class":3692},[3434,15997,4039],{"class":3665},[3434,15999,6773],{"class":3451},[3434,16001,3964],{"class":3665},[3434,16003,3434],{"class":3669},[3434,16005,3676],{"class":3665},[3434,16007,16008,16010,16012],{"class":3436,"line":11451},[3434,16009,4372],{"class":3665},[3434,16011,4342],{"class":3669},[3434,16013,3676],{"class":3665},[3434,16015,16016,16018,16020],{"class":3436,"line":11456},[3434,16017,4677],{"class":3665},[3434,16019,4012],{"class":3669},[3434,16021,3676],{"class":3665},[3434,16023,16024,16026,16028],{"class":3436,"line":11466},[3434,16025,4687],{"class":3665},[3434,16027,4012],{"class":3669},[3434,16029,3676],{"class":3665},[3434,16031,16032],{"class":3436,"line":11479},[3434,16033,3495],{"emptyLinePlaceholder":3494},[3434,16035,16036],{"class":3436,"line":11484},[3434,16037,16038],{"class":3440},"    \u003C!-- Картки — той самий компонент, різні теми -->\n",[3434,16040,16041,16043,16045,16047,16049,16052,16054,16056,16059],{"class":3436,"line":11490},[3434,16042,4009],{"class":3665},[3434,16044,4012],{"class":3669},[3434,16046,3988],{"class":3458},[3434,16048,3689],{"class":3451},[3434,16050,16051],{"class":3692},"\"grid grid-cols-1 sm:grid-cols-3 gap-4\"",[3434,16053,5740],{"class":3458},[3434,16055,3689],{"class":3451},[3434,16057,16058],{"class":3692},"\"theme-container\"",[3434,16060,3676],{"class":3665},[3434,16062,16063,16065,16067,16069,16071,16074],{"class":3436,"line":11496},[3434,16064,4027],{"class":3665},[3434,16066,4012],{"class":3669},[3434,16068,3988],{"class":3458},[3434,16070,3689],{"class":3451},[3434,16072,16073],{"class":3692},"\"bg-[--color-bg-surface] border border-[--color-border] rounded-xl p-4\"",[3434,16075,3676],{"class":3665},[3434,16077,16078,16080,16082,16084,16086,16089,16091,16094,16096,16098],{"class":3436,"line":11512},[3434,16079,4082],{"class":3665},[3434,16081,4012],{"class":3669},[3434,16083,3988],{"class":3458},[3434,16085,3689],{"class":3451},[3434,16087,16088],{"class":3692},"\"size-8 rounded-lg bg-[--color-accent-light] flex items-center justify-center mb-3 text-base\"",[3434,16090,4039],{"class":3665},[3434,16092,16093],{"class":3451},"✨",[3434,16095,3964],{"class":3665},[3434,16097,4012],{"class":3669},[3434,16099,3676],{"class":3665},[3434,16101,16102,16104,16106,16108,16110,16113,16115,16118,16120,16122],{"class":3436,"line":11538},[3434,16103,4082],{"class":3665},[3434,16105,3403],{"class":3669},[3434,16107,3988],{"class":3458},[3434,16109,3689],{"class":3451},[3434,16111,16112],{"class":3692},"\"font-bold text-[--color-text-primary] text-sm\"",[3434,16114,4039],{"class":3665},[3434,16116,16117],{"class":3451},"Один компонент",[3434,16119,3964],{"class":3665},[3434,16121,3403],{"class":3669},[3434,16123,3676],{"class":3665},[3434,16125,16126,16128,16130,16132,16134,16137,16139,16142,16144,16146],{"class":3436,"line":11552},[3434,16127,4082],{"class":3665},[3434,16129,3353],{"class":3669},[3434,16131,3988],{"class":3458},[3434,16133,3689],{"class":3451},[3434,16135,16136],{"class":3692},"\"text-xs text-[--color-text-muted] mt-1 leading-relaxed\"",[3434,16138,4039],{"class":3665},[3434,16140,16141],{"class":3451},"Жодних умовних класів. Тема змінює CSS-змінні.",[3434,16143,3964],{"class":3665},[3434,16145,3353],{"class":3669},[3434,16147,3676],{"class":3665},[3434,16149,16150,16152,16154,16156,16158,16161],{"class":3436,"line":11577},[3434,16151,4082],{"class":3665},[3434,16153,4342],{"class":3669},[3434,16155,3988],{"class":3458},[3434,16157,3689],{"class":3451},[3434,16159,16160],{"class":3692},"\"mt-3 w-full py-1.5 bg-[--color-accent] hover:bg-[--color-accent-hover] text-white text-xs font-semibold rounded-lg transition-colors\"",[3434,16162,3676],{"class":3665},[3434,16164,16165],{"class":3436,"line":11583},[3434,16166,16167],{"class":3451},"                Кнопка\n",[3434,16169,16170,16172,16174],{"class":3436,"line":11589},[3434,16171,4372],{"class":3665},[3434,16173,4342],{"class":3669},[3434,16175,3676],{"class":3665},[3434,16177,16178,16180,16182],{"class":3436,"line":11594},[3434,16179,4677],{"class":3665},[3434,16181,4012],{"class":3669},[3434,16183,3676],{"class":3665},[3434,16185,16186,16188,16190,16192,16194,16196],{"class":3436,"line":11599},[3434,16187,4027],{"class":3665},[3434,16189,4012],{"class":3669},[3434,16191,3988],{"class":3458},[3434,16193,3689],{"class":3451},[3434,16195,16073],{"class":3692},[3434,16197,3676],{"class":3665},[3434,16199,16200,16202,16204,16206,16208,16210,16212,16215,16217,16219],{"class":3436,"line":11605},[3434,16201,4082],{"class":3665},[3434,16203,4012],{"class":3669},[3434,16205,3988],{"class":3458},[3434,16207,3689],{"class":3451},[3434,16209,16088],{"class":3692},[3434,16211,4039],{"class":3665},[3434,16213,16214],{"class":3451},"🎨",[3434,16216,3964],{"class":3665},[3434,16218,4012],{"class":3669},[3434,16220,3676],{"class":3665},[3434,16222,16223,16225,16227,16229,16231,16233,16235,16238,16240,16242],{"class":3436,"line":13402},[3434,16224,4082],{"class":3665},[3434,16226,3403],{"class":3669},[3434,16228,3988],{"class":3458},[3434,16230,3689],{"class":3451},[3434,16232,16112],{"class":3692},[3434,16234,4039],{"class":3665},[3434,16236,16237],{"class":3451},"Той самий клас",[3434,16239,3964],{"class":3665},[3434,16241,3403],{"class":3669},[3434,16243,3676],{"class":3665},[3434,16245,16246,16248,16250,16252,16254,16256,16258,16261,16263,16265],{"class":3436,"line":13431},[3434,16247,4082],{"class":3665},[3434,16249,3353],{"class":3669},[3434,16251,3988],{"class":3458},[3434,16253,3689],{"class":3451},[3434,16255,16136],{"class":3692},[3434,16257,4039],{"class":3665},[3434,16259,16260],{"class":3451},"bg-(--color-accent) завжди правильний колір.",[3434,16262,3964],{"class":3665},[3434,16264,3353],{"class":3669},[3434,16266,3676],{"class":3665},[3434,16268,16269,16271,16273,16275,16277,16279],{"class":3436,"line":13459},[3434,16270,4082],{"class":3665},[3434,16272,4342],{"class":3669},[3434,16274,3988],{"class":3458},[3434,16276,3689],{"class":3451},[3434,16278,16160],{"class":3692},[3434,16280,3676],{"class":3665},[3434,16282,16283],{"class":3436,"line":13504},[3434,16284,16167],{"class":3451},[3434,16286,16287,16289,16291],{"class":3436,"line":13531},[3434,16288,4372],{"class":3665},[3434,16290,4342],{"class":3669},[3434,16292,3676],{"class":3665},[3434,16294,16295,16297,16299],{"class":3436,"line":13536},[3434,16296,4677],{"class":3665},[3434,16298,4012],{"class":3669},[3434,16300,3676],{"class":3665},[3434,16302,16303,16305,16307,16309,16311,16313],{"class":3436,"line":13541},[3434,16304,4027],{"class":3665},[3434,16306,4012],{"class":3669},[3434,16308,3988],{"class":3458},[3434,16310,3689],{"class":3451},[3434,16312,16073],{"class":3692},[3434,16314,3676],{"class":3665},[3434,16316,16317,16319,16321,16323,16325,16327,16329,16332,16334,16336],{"class":3436,"line":13546},[3434,16318,4082],{"class":3665},[3434,16320,4012],{"class":3669},[3434,16322,3988],{"class":3458},[3434,16324,3689],{"class":3451},[3434,16326,16088],{"class":3692},[3434,16328,4039],{"class":3665},[3434,16330,16331],{"class":3451},"⚡",[3434,16333,3964],{"class":3665},[3434,16335,4012],{"class":3669},[3434,16337,3676],{"class":3665},[3434,16339,16340,16342,16344,16346,16348,16350,16352,16355,16357,16359],{"class":3436,"line":13552},[3434,16341,4082],{"class":3665},[3434,16343,3403],{"class":3669},[3434,16345,3988],{"class":3458},[3434,16347,3689],{"class":3451},[3434,16349,16112],{"class":3692},[3434,16351,4039],{"class":3665},[3434,16353,16354],{"class":3451},"Нескінченно гнучко",[3434,16356,3964],{"class":3665},[3434,16358,3403],{"class":3669},[3434,16360,3676],{"class":3665},[3434,16362,16363,16365,16367,16369,16371,16373,16375,16378,16380,16382],{"class":3436,"line":13579},[3434,16364,4082],{"class":3665},[3434,16366,3353],{"class":3669},[3434,16368,3988],{"class":3458},[3434,16370,3689],{"class":3451},[3434,16372,16136],{"class":3692},[3434,16374,4039],{"class":3665},[3434,16376,16377],{"class":3451},"Додайте нову тему — HTML не чіпаєте.",[3434,16379,3964],{"class":3665},[3434,16381,3353],{"class":3669},[3434,16383,3676],{"class":3665},[3434,16385,16386,16388,16390,16392,16394,16396],{"class":3436,"line":13591},[3434,16387,4082],{"class":3665},[3434,16389,4342],{"class":3669},[3434,16391,3988],{"class":3458},[3434,16393,3689],{"class":3451},[3434,16395,16160],{"class":3692},[3434,16397,3676],{"class":3665},[3434,16399,16400],{"class":3436,"line":13600},[3434,16401,16167],{"class":3451},[3434,16403,16404,16406,16408],{"class":3436,"line":13605},[3434,16405,4372],{"class":3665},[3434,16407,4342],{"class":3669},[3434,16409,3676],{"class":3665},[3434,16411,16412,16414,16416],{"class":3436,"line":13614},[3434,16413,4677],{"class":3665},[3434,16415,4012],{"class":3669},[3434,16417,3676],{"class":3665},[3434,16419,16421,16423,16425],{"class":3436,"line":16420},119,[3434,16422,4687],{"class":3665},[3434,16424,4012],{"class":3669},[3434,16426,3676],{"class":3665},[3434,16428,16430],{"class":3436,"line":16429},120,[3434,16431,3495],{"emptyLinePlaceholder":3494},[3434,16433,16435,16437,16439],{"class":3436,"line":16434},121,[3434,16436,3681],{"class":3665},[3434,16438,3728],{"class":3669},[3434,16440,3676],{"class":3665},[3434,16442,16444,16446,16448,16450,16453],{"class":3436,"line":16443},122,[3434,16445,13025],{"class":5682},[3434,16447,11242],{"class":3465},[3434,16449,3469],{"class":3734},[3434,16451,16452],{"class":5644},"brand",[3434,16454,6065],{"class":3734},[3434,16456,16458,16460,16463,16465,16467,16469,16471,16473,16476],{"class":3436,"line":16457},123,[3434,16459,13034],{"class":5682},[3434,16461,16462],{"class":6073}," container",[3434,16464,6077],{"class":3451},[3434,16466,6080],{"class":5644},[3434,16468,4726],{"class":3734},[3434,16470,5650],{"class":3465},[3434,16472,3469],{"class":3734},[3434,16474,16475],{"class":5655},"'theme-container'",[3434,16477,6409],{"class":3734},[3434,16479,16481,16483,16485,16487,16489,16492],{"class":3436,"line":16480},124,[3434,16482,13055],{"class":5199},[3434,16484,11004],{"class":3734},[3434,16486,16452],{"class":5644},[3434,16488,11979],{"class":3451},[3434,16490,16491],{"class":5655}," 'default'",[3434,16493,6065],{"class":3734},[3434,16495,16497,16500,16502,16505,16507,16509],{"class":3436,"line":16496},125,[3434,16498,16499],{"class":5644},"            container",[3434,16501,4726],{"class":3734},[3434,16503,16504],{"class":3465},"removeAttribute",[3434,16506,3469],{"class":3734},[3434,16508,11186],{"class":5655},[3434,16510,6409],{"class":3734},[3434,16512,16514,16516,16518],{"class":3436,"line":16513},126,[3434,16515,13162],{"class":3734},[3434,16517,11138],{"class":5199},[3434,16519,3452],{"class":3734},[3434,16521,16523,16525,16527,16529,16531,16533,16535,16537],{"class":3436,"line":16522},127,[3434,16524,16499],{"class":5644},[3434,16526,4726],{"class":3734},[3434,16528,11181],{"class":3465},[3434,16530,3469],{"class":3734},[3434,16532,11186],{"class":5655},[3434,16534,7250],{"class":3734},[3434,16536,16452],{"class":5644},[3434,16538,6409],{"class":3734},[3434,16540,16542],{"class":3436,"line":16541},128,[3434,16543,6137],{"class":3734},[3434,16545,16547],{"class":3436,"line":16546},129,[3434,16548,3813],{"class":3734},[3434,16550,16552,16554,16556],{"class":3436,"line":16551},130,[3434,16553,3964],{"class":3665},[3434,16555,3728],{"class":3669},[3434,16557,3676],{"class":3665},[3434,16559,16561,16563,16565],{"class":3436,"line":16560},131,[3434,16562,3964],{"class":3665},[3434,16564,3985],{"class":3669},[3434,16566,3676],{"class":3665},[3434,16568,16570,16572,16574],{"class":3436,"line":16569},132,[3434,16571,3964],{"class":3665},[3434,16573,3658],{"class":3669},[3434,16575,3676],{"class":3665},[3353,16577,16578,16579,11774,16582,16585,16586,16588],{},"Зверніть: кнопка у всіх трьох картках має ",[3365,16580,16581],{},"ідентичний клас",[3357,16583,16584],{},"bg-[--color-accent]",". Зміна теми відбувається виключно через ",[3357,16587,13873],{}," на батьківському контейнері — HTML компонентів не торкається.",[3396,16590],{},[3348,16592,16594],{"id":16593},"частина-vi-структура-файлів-production-ready-проєкт","Частина VI. Структура файлів: production-ready проєкт",[3403,16596,16598],{"id":16597},"_61-рекомендована-організація-css","6.1. Рекомендована організація CSS",[3353,16600,16601],{},"У реальному проєкті система токенів розподіляється по окремих файлах. Це спрощує підтримку: дизайнер або автор теми знає, де саме шукати потрібне значення.",[16603,16604,16605,16684,16798,17264,17455,17701,17835,18167],"code-tree",{},[3425,16606,16609],{"className":3427,"code":16607,"filename":16608,"language":3429,"meta":3430,"style":3430},"\u002F* Точка входу — тільки імпорти *\u002F\n@import 'tailwindcss';\n@import '.\u002Ftheme\u002Fprimitives.css';\n@import '.\u002Ftheme\u002Fsemantic.css';\n@import '.\u002Ftheme\u002Fbrands.css';\n@import '.\u002Fbase.css';\n@import '.\u002Fcomponents.css';\n\n\u002F* Перевизначення dark: варіанту *\u002F\n@custom-variant dark (&:is(.dark *));\n","styles\u002Fmain.css",[3357,16610,16611,16616,16624,16633,16642,16651,16660,16669,16673,16678],{"__ignoreMap":3430},[3434,16612,16613],{"class":3436,"line":3437},[3434,16614,16615],{"class":3440},"\u002F* Точка входу — тільки імпорти *\u002F\n",[3434,16617,16618,16620,16622],{"class":3436,"line":3444},[3434,16619,6204],{"class":5199},[3434,16621,6207],{"class":5655},[3434,16623,6132],{"class":3451},[3434,16625,16626,16628,16631],{"class":3436,"line":3455},[3434,16627,6204],{"class":5199},[3434,16629,16630],{"class":5655}," '.\u002Ftheme\u002Fprimitives.css'",[3434,16632,6132],{"class":3451},[3434,16634,16635,16637,16640],{"class":3436,"line":3485},[3434,16636,6204],{"class":5199},[3434,16638,16639],{"class":5655}," '.\u002Ftheme\u002Fsemantic.css'",[3434,16641,6132],{"class":3451},[3434,16643,16644,16646,16649],{"class":3436,"line":3491},[3434,16645,6204],{"class":5199},[3434,16647,16648],{"class":5655}," '.\u002Ftheme\u002Fbrands.css'",[3434,16650,6132],{"class":3451},[3434,16652,16653,16655,16658],{"class":3436,"line":3498},[3434,16654,6204],{"class":5199},[3434,16656,16657],{"class":5655}," '.\u002Fbase.css'",[3434,16659,6132],{"class":3451},[3434,16661,16662,16664,16667],{"class":3436,"line":3504},[3434,16663,6204],{"class":5199},[3434,16665,16666],{"class":5655}," '.\u002Fcomponents.css'",[3434,16668,6132],{"class":3451},[3434,16670,16671],{"class":3436,"line":3511},[3434,16672,3495],{"emptyLinePlaceholder":3494},[3434,16674,16675],{"class":3436,"line":3529},[3434,16676,16677],{"class":3440},"\u002F* Перевизначення dark: варіанту *\u002F\n",[3434,16679,16680,16682],{"class":3436,"line":3810},[3434,16681,6187],{"class":5199},[3434,16683,5527],{"class":3451},[3425,16685,16688],{"className":3427,"code":16686,"filename":16687,"language":3429,"meta":3430,"style":3430},"\u002F* Рівень 1: Примітивна палітра — всі конкретні кольори *\u002F\n@theme {\n    --color-neutral-50:  oklch(0.984 0.003 247.858);\n    --color-neutral-100: oklch(0.961 0.005 264.531);\n    \u002F* ... решта відтінків ... *\u002F\n    --color-indigo-400:  oklch(0.673 0.182 276.935);\n    --color-indigo-500:  oklch(0.585 0.233 277.117);\n    --color-indigo-600:  oklch(0.511 0.262 276.966);\n    \u002F* ... *\u002F\n}\n","styles\u002Ftheme\u002Fprimitives.css",[3357,16689,16690,16695,16701,16717,16733,16738,16755,16772,16789,16794],{"__ignoreMap":3430},[3434,16691,16692],{"class":3436,"line":3437},[3434,16693,16694],{"class":3440},"\u002F* Рівень 1: Примітивна палітра — всі конкретні кольори *\u002F\n",[3434,16696,16697,16699],{"class":3436,"line":3444},[3434,16698,3393],{"class":5199},[3434,16700,3452],{"class":3451},[3434,16702,16703,16705,16707,16709,16711,16713,16715],{"class":3436,"line":3455},[3434,16704,7318],{"class":3451},[3434,16706,4796],{"class":3447},[3434,16708,4757],{"class":3451},[3434,16710,4801],{"class":3447},[3434,16712,4804],{"class":3451},[3434,16714,4807],{"class":3447},[3434,16716,3482],{"class":3451},[3434,16718,16719,16721,16723,16725,16727,16729,16731],{"class":3436,"line":3485},[3434,16720,7335],{"class":3451},[3434,16722,7338],{"class":3447},[3434,16724,4757],{"class":3451},[3434,16726,7343],{"class":3447},[3434,16728,4783],{"class":3451},[3434,16730,7348],{"class":3447},[3434,16732,3482],{"class":3451},[3434,16734,16735],{"class":3436,"line":3491},[3434,16736,16737],{"class":3440},"    \u002F* ... решта відтінків ... *\u002F\n",[3434,16739,16740,16743,16745,16747,16749,16751,16753],{"class":3436,"line":3498},[3434,16741,16742],{"class":3451},"    --color-indigo-400:  oklch(0",[3434,16744,7630],{"class":3447},[3434,16746,4757],{"class":3451},[3434,16748,7635],{"class":3447},[3434,16750,7638],{"class":3451},[3434,16752,7641],{"class":3447},[3434,16754,3482],{"class":3451},[3434,16756,16757,16760,16762,16764,16766,16768,16770],{"class":3436,"line":3504},[3434,16758,16759],{"class":3451},"    --color-indigo-500:  oklch(0",[3434,16761,4754],{"class":3447},[3434,16763,4757],{"class":3451},[3434,16765,4760],{"class":3447},[3434,16767,3595],{"class":3451},[3434,16769,4765],{"class":3447},[3434,16771,3482],{"class":3451},[3434,16773,16774,16777,16779,16781,16783,16785,16787],{"class":3436,"line":3511},[3434,16775,16776],{"class":3451},"    --color-indigo-600:  oklch(0",[3434,16778,7668],{"class":3447},[3434,16780,4757],{"class":3451},[3434,16782,7673],{"class":3447},[3434,16784,7638],{"class":3451},[3434,16786,7678],{"class":3447},[3434,16788,3482],{"class":3451},[3434,16790,16791],{"class":3436,"line":3529},[3434,16792,16793],{"class":3440},"    \u002F* ... *\u002F\n",[3434,16795,16796],{"class":3436,"line":3810},[3434,16797,3488],{"class":3451},[3425,16799,16802],{"className":3427,"code":16800,"filename":16801,"language":3429,"meta":3430,"style":3430},"\u002F* Рівень 2: Семантичні токени — світла тема *\u002F\n:root {\n    --color-bg-base:          oklch(0.984 0.003 247.858);\n    --color-bg-surface:       oklch(1 0 0);\n    --color-bg-elevated:      oklch(1 0 0);\n    --color-text-primary:     oklch(0.208 0.042 265.755);\n    --color-text-secondary:   oklch(0.373 0.034 259.733);\n    --color-text-muted:       oklch(0.554 0.034 264.364);\n    --color-border-default:   oklch(0.929 0.008 264.542);\n    --color-border-focus:     var(--color-indigo-500);\n    --color-accent:           var(--color-indigo-500);\n    --color-accent-hover:     var(--color-indigo-600);\n    --color-accent-light:     oklch(0.962 0.018 272.314);\n    --color-accent-text:      oklch(0.457 0.240 277.023);\n}\n\n\u002F* Семантичні токени — темна тема *\u002F\n.dark {\n    --color-bg-base:          oklch(0.113 0.021 261);\n    --color-bg-surface:       oklch(0.179 0.027 261);\n    --color-bg-elevated:      oklch(0.225 0.025 264);\n    --color-text-primary:     oklch(0.984 0.003 247.858);\n    --color-text-secondary:   oklch(0.872 0.012 264.052);\n    --color-text-muted:       oklch(0.704 0.026 264.436);\n    --color-border-default:   oklch(0.300 0.025 264);\n    --color-border-focus:     var(--color-indigo-400);\n    --color-accent:           var(--color-indigo-400);\n    --color-accent-hover:     oklch(0.785 0.115 274.713);\n    --color-accent-light:     oklch(0.257 0.090 281.288);\n    --color-accent-text:      oklch(0.785 0.115 274.713);\n}\n","styles\u002Ftheme\u002Fsemantic.css",[3357,16803,16804,16809,16815,16833,16851,16870,16888,16908,16926,16944,16958,16973,16987,17005,17026,17030,17034,17039,17045,17063,17081,17099,17117,17138,17156,17174,17188,17202,17223,17242,17260],{"__ignoreMap":3430},[3434,16805,16806],{"class":3436,"line":3437},[3434,16807,16808],{"class":3440},"\u002F* Рівень 2: Семантичні токени — світла тема *\u002F\n",[3434,16810,16811,16813],{"class":3436,"line":3444},[3434,16812,3448],{"class":3447},[3434,16814,3452],{"class":3451},[3434,16816,16817,16819,16821,16823,16825,16827,16829,16831],{"class":3436,"line":3455},[3434,16818,4924],{"class":3458},[3434,16820,8420],{"class":3451},[3434,16822,3466],{"class":3465},[3434,16824,3469],{"class":3451},[3434,16826,9432],{"class":3472},[3434,16828,9435],{"class":3472},[3434,16830,9438],{"class":3472},[3434,16832,3482],{"class":3451},[3434,16834,16835,16837,16839,16841,16843,16845,16847,16849],{"class":3436,"line":3485},[3434,16836,4945],{"class":3458},[3434,16838,8903],{"class":3451},[3434,16840,3466],{"class":3465},[3434,16842,3469],{"class":3451},[3434,16844,8160],{"class":3472},[3434,16846,4757],{"class":3472},[3434,16848,4757],{"class":3472},[3434,16850,3482],{"class":3451},[3434,16852,16853,16855,16858,16860,16862,16864,16866,16868],{"class":3436,"line":3491},[3434,16854,8175],{"class":3458},[3434,16856,16857],{"class":3451},":      ",[3434,16859,3466],{"class":3465},[3434,16861,3469],{"class":3451},[3434,16863,8160],{"class":3472},[3434,16865,4757],{"class":3472},[3434,16867,4757],{"class":3472},[3434,16869,3482],{"class":3451},[3434,16871,16872,16874,16876,16878,16880,16882,16884,16886],{"class":3436,"line":3498},[3434,16873,4892],{"class":3458},[3434,16875,8133],{"class":3451},[3434,16877,3466],{"class":3465},[3434,16879,3469],{"class":3451},[3434,16881,9473],{"class":3472},[3434,16883,5233],{"class":3472},[3434,16885,9478],{"class":3472},[3434,16887,3482],{"class":3451},[3434,16889,16890,16892,16894,16896,16898,16901,16903,16906],{"class":3436,"line":3504},[3434,16891,8264],{"class":3458},[3434,16893,8246],{"class":3451},[3434,16895,3466],{"class":3465},[3434,16897,3469],{"class":3451},[3434,16899,16900],{"class":3472},"0.373",[3434,16902,9497],{"class":3472},[3434,16904,16905],{"class":3472}," 259.733",[3434,16907,3482],{"class":3451},[3434,16909,16910,16912,16914,16916,16918,16920,16922,16924],{"class":3436,"line":3511},[3434,16911,4908],{"class":3458},[3434,16913,8903],{"class":3451},[3434,16915,3466],{"class":3465},[3434,16917,3469],{"class":3451},[3434,16919,9494],{"class":3472},[3434,16921,9497],{"class":3472},[3434,16923,9500],{"class":3472},[3434,16925,3482],{"class":3451},[3434,16927,16928,16930,16932,16934,16936,16938,16940,16942],{"class":3436,"line":3529},[3434,16929,8352],{"class":3458},[3434,16931,8246],{"class":3451},[3434,16933,3466],{"class":3465},[3434,16935,3469],{"class":3451},[3434,16937,9516],{"class":3472},[3434,16939,9519],{"class":3472},[3434,16941,9522],{"class":3472},[3434,16943,3482],{"class":3451},[3434,16945,16946,16948,16950,16952,16954,16956],{"class":3436,"line":3810},[3434,16947,8390],{"class":3458},[3434,16949,8133],{"class":3451},[3434,16951,3519],{"class":3465},[3434,16953,3469],{"class":3451},[3434,16955,8399],{"class":3458},[3434,16957,3482],{"class":3451},[3434,16959,16960,16962,16965,16967,16969,16971],{"class":3436,"line":3816},[3434,16961,3580],{"class":3458},[3434,16963,16964],{"class":3451},":           ",[3434,16966,3519],{"class":3465},[3434,16968,3469],{"class":3451},[3434,16970,8399],{"class":3458},[3434,16972,3482],{"class":3451},[3434,16974,16975,16977,16979,16981,16983,16985],{"class":3436,"line":3821},[3434,16976,8433],{"class":3458},[3434,16978,8133],{"class":3451},[3434,16980,3519],{"class":3465},[3434,16982,3469],{"class":3451},[3434,16984,8442],{"class":3458},[3434,16986,3482],{"class":3451},[3434,16988,16989,16991,16993,16995,16997,16999,17001,17003],{"class":3436,"line":3829},[3434,16990,8449],{"class":3458},[3434,16992,8133],{"class":3451},[3434,16994,3466],{"class":3465},[3434,16996,3469],{"class":3451},[3434,16998,15132],{"class":3472},[3434,17000,15135],{"class":3472},[3434,17002,15138],{"class":3472},[3434,17004,3482],{"class":3451},[3434,17006,17007,17009,17011,17013,17015,17018,17021,17024],{"class":3436,"line":3835},[3434,17008,8465],{"class":3458},[3434,17010,16857],{"class":3451},[3434,17012,3466],{"class":3465},[3434,17014,3469],{"class":3451},[3434,17016,17017],{"class":3472},"0.457",[3434,17019,17020],{"class":3472}," 0.240",[3434,17022,17023],{"class":3472}," 277.023",[3434,17025,3482],{"class":3451},[3434,17027,17028],{"class":3436,"line":3857},[3434,17029,3488],{"class":3451},[3434,17031,17032],{"class":3436,"line":3862},[3434,17033,3495],{"emptyLinePlaceholder":3494},[3434,17035,17036],{"class":3436,"line":3867},[3434,17037,17038],{"class":3440},"\u002F* Семантичні токени — темна тема *\u002F\n",[3434,17040,17041,17043],{"class":3436,"line":3873},[3434,17042,4885],{"class":3447},[3434,17044,3452],{"class":3451},[3434,17046,17047,17049,17051,17053,17055,17057,17059,17061],{"class":3436,"line":3881},[3434,17048,4924],{"class":3458},[3434,17050,8420],{"class":3451},[3434,17052,3466],{"class":3465},[3434,17054,3469],{"class":3451},[3434,17056,8622],{"class":3472},[3434,17058,8625],{"class":3472},[3434,17060,7527],{"class":3472},[3434,17062,3482],{"class":3451},[3434,17064,17065,17067,17069,17071,17073,17075,17077,17079],{"class":3436,"line":3898},[3434,17066,4945],{"class":3458},[3434,17068,8903],{"class":3451},[3434,17070,3466],{"class":3465},[3434,17072,3469],{"class":3451},[3434,17074,8645],{"class":3472},[3434,17076,8648],{"class":3472},[3434,17078,7527],{"class":3472},[3434,17080,3482],{"class":3451},[3434,17082,17083,17085,17087,17089,17091,17093,17095,17097],{"class":3436,"line":3903},[3434,17084,8175],{"class":3458},[3434,17086,16857],{"class":3451},[3434,17088,3466],{"class":3465},[3434,17090,3469],{"class":3451},[3434,17092,8668],{"class":3472},[3434,17094,8671],{"class":3472},[3434,17096,4783],{"class":3472},[3434,17098,3482],{"class":3451},[3434,17100,17101,17103,17105,17107,17109,17111,17113,17115],{"class":3436,"line":3911},[3434,17102,4892],{"class":3458},[3434,17104,8133],{"class":3451},[3434,17106,3466],{"class":3465},[3434,17108,3469],{"class":3451},[3434,17110,9432],{"class":3472},[3434,17112,9435],{"class":3472},[3434,17114,9438],{"class":3472},[3434,17116,3482],{"class":3451},[3434,17118,17119,17121,17123,17125,17127,17130,17133,17136],{"class":3436,"line":3927},[3434,17120,8264],{"class":3458},[3434,17122,8246],{"class":3451},[3434,17124,3466],{"class":3465},[3434,17126,3469],{"class":3451},[3434,17128,17129],{"class":3472},"0.872",[3434,17131,17132],{"class":3472}," 0.012",[3434,17134,17135],{"class":3472}," 264.052",[3434,17137,3482],{"class":3451},[3434,17139,17140,17142,17144,17146,17148,17150,17152,17154],{"class":3436,"line":3932},[3434,17141,4908],{"class":3458},[3434,17143,8903],{"class":3451},[3434,17145,3466],{"class":3465},[3434,17147,3469],{"class":3451},[3434,17149,9619],{"class":3472},[3434,17151,9622],{"class":3472},[3434,17153,9625],{"class":3472},[3434,17155,3482],{"class":3451},[3434,17157,17158,17160,17162,17164,17166,17168,17170,17172],{"class":3436,"line":3940},[3434,17159,8352],{"class":3458},[3434,17161,8246],{"class":3451},[3434,17163,3466],{"class":3465},[3434,17165,3469],{"class":3451},[3434,17167,8839],{"class":3472},[3434,17169,8671],{"class":3472},[3434,17171,4783],{"class":3472},[3434,17173,3482],{"class":3451},[3434,17175,17176,17178,17180,17182,17184,17186],{"class":3436,"line":3956},[3434,17177,8390],{"class":3458},[3434,17179,8133],{"class":3451},[3434,17181,3519],{"class":3465},[3434,17183,3469],{"class":3451},[3434,17185,4993],{"class":3458},[3434,17187,3482],{"class":3451},[3434,17189,17190,17192,17194,17196,17198,17200],{"class":3436,"line":3961},[3434,17191,3580],{"class":3458},[3434,17193,16964],{"class":3451},[3434,17195,3519],{"class":3465},[3434,17197,3469],{"class":3451},[3434,17199,4993],{"class":3458},[3434,17201,3482],{"class":3451},[3434,17203,17204,17206,17208,17210,17212,17215,17218,17221],{"class":3436,"line":3971},[3434,17205,8433],{"class":3458},[3434,17207,8133],{"class":3451},[3434,17209,3466],{"class":3465},[3434,17211,3469],{"class":3451},[3434,17213,17214],{"class":3472},"0.785",[3434,17216,17217],{"class":3472}," 0.115",[3434,17219,17220],{"class":3472}," 274.713",[3434,17222,3482],{"class":3451},[3434,17224,17225,17227,17229,17231,17233,17235,17237,17240],{"class":3436,"line":3980},[3434,17226,8449],{"class":3458},[3434,17228,8133],{"class":3451},[3434,17230,3466],{"class":3465},[3434,17232,3469],{"class":3451},[3434,17234,8939],{"class":3472},[3434,17236,8942],{"class":3472},[3434,17238,17239],{"class":3472}," 281.288",[3434,17241,3482],{"class":3451},[3434,17243,17244,17246,17248,17250,17252,17254,17256,17258],{"class":3436,"line":4006},[3434,17245,8465],{"class":3458},[3434,17247,16857],{"class":3451},[3434,17249,3466],{"class":3465},[3434,17251,3469],{"class":3451},[3434,17253,17214],{"class":3472},[3434,17255,17217],{"class":3472},[3434,17257,17220],{"class":3472},[3434,17259,3482],{"class":3451},[3434,17261,17262],{"class":3436,"line":4024},[3434,17263,3488],{"class":3451},[3425,17265,17268],{"className":3427,"code":17266,"filename":17267,"language":3429,"meta":3430,"style":3430},"\u002F* Рівень 3: Бренд-теми через data-theme *\u002F\n[data-theme=\"ocean\"] {\n    --color-accent:       oklch(0.591 0.221 228);\n    --color-accent-hover: oklch(0.520 0.225 232);\n    --color-accent-light: oklch(0.951 0.052 240);\n    --color-accent-text:  oklch(0.398 0.170 241);\n}\n\n[data-theme=\"forest\"] {\n    --color-accent:       oklch(0.527 0.154 150);\n    --color-accent-hover: oklch(0.446 0.130 150);\n    --color-accent-light: oklch(0.951 0.052 163);\n    --color-accent-text:  oklch(0.296 0.066 143);\n}\n","styles\u002Ftheme\u002Fbrands.css",[3357,17269,17270,17275,17287,17305,17323,17341,17359,17363,17367,17379,17397,17415,17433,17451],{"__ignoreMap":3430},[3434,17271,17272],{"class":3436,"line":3437},[3434,17273,17274],{"class":3440},"\u002F* Рівень 3: Бренд-теми через data-theme *\u002F\n",[3434,17276,17277,17279,17281,17283,17285],{"class":3436,"line":3444},[3434,17278,13340],{"class":3451},[3434,17280,13873],{"class":3458},[3434,17282,3689],{"class":3451},[3434,17284,13901],{"class":5655},[3434,17286,13904],{"class":3451},[3434,17288,17289,17291,17293,17295,17297,17299,17301,17303],{"class":3436,"line":3455},[3434,17290,3580],{"class":3458},[3434,17292,8903],{"class":3451},[3434,17294,3466],{"class":3465},[3434,17296,3469],{"class":3451},[3434,17298,13917],{"class":3472},[3434,17300,13920],{"class":3472},[3434,17302,13923],{"class":3472},[3434,17304,3482],{"class":3451},[3434,17306,17307,17309,17311,17313,17315,17317,17319,17321],{"class":3436,"line":3485},[3434,17308,8433],{"class":3458},[3434,17310,3462],{"class":3451},[3434,17312,3466],{"class":3465},[3434,17314,3469],{"class":3451},[3434,17316,13941],{"class":3472},[3434,17318,13944],{"class":3472},[3434,17320,13947],{"class":3472},[3434,17322,3482],{"class":3451},[3434,17324,17325,17327,17329,17331,17333,17335,17337,17339],{"class":3436,"line":3491},[3434,17326,8449],{"class":3458},[3434,17328,3462],{"class":3451},[3434,17330,3466],{"class":3465},[3434,17332,3469],{"class":3451},[3434,17334,13965],{"class":3472},[3434,17336,13968],{"class":3472},[3434,17338,13971],{"class":3472},[3434,17340,3482],{"class":3451},[3434,17342,17343,17345,17347,17349,17351,17353,17355,17357],{"class":3436,"line":3498},[3434,17344,8465],{"class":3458},[3434,17346,8153],{"class":3451},[3434,17348,3466],{"class":3465},[3434,17350,3469],{"class":3451},[3434,17352,13989],{"class":3472},[3434,17354,13992],{"class":3472},[3434,17356,13995],{"class":3472},[3434,17358,3482],{"class":3451},[3434,17360,17361],{"class":3436,"line":3504},[3434,17362,3488],{"class":3451},[3434,17364,17365],{"class":3436,"line":3511},[3434,17366,3495],{"emptyLinePlaceholder":3494},[3434,17368,17369,17371,17373,17375,17377],{"class":3436,"line":3529},[3434,17370,13340],{"class":3451},[3434,17372,13873],{"class":3458},[3434,17374,3689],{"class":3451},[3434,17376,14024],{"class":5655},[3434,17378,13904],{"class":3451},[3434,17380,17381,17383,17385,17387,17389,17391,17393,17395],{"class":3436,"line":3810},[3434,17382,3580],{"class":3458},[3434,17384,8903],{"class":3451},[3434,17386,3466],{"class":3465},[3434,17388,3469],{"class":3451},[3434,17390,14039],{"class":3472},[3434,17392,14042],{"class":3472},[3434,17394,14045],{"class":3472},[3434,17396,3482],{"class":3451},[3434,17398,17399,17401,17403,17405,17407,17409,17411,17413],{"class":3436,"line":3816},[3434,17400,8433],{"class":3458},[3434,17402,3462],{"class":3451},[3434,17404,3466],{"class":3465},[3434,17406,3469],{"class":3451},[3434,17408,14063],{"class":3472},[3434,17410,14066],{"class":3472},[3434,17412,14045],{"class":3472},[3434,17414,3482],{"class":3451},[3434,17416,17417,17419,17421,17423,17425,17427,17429,17431],{"class":3436,"line":3821},[3434,17418,8449],{"class":3458},[3434,17420,3462],{"class":3451},[3434,17422,3466],{"class":3465},[3434,17424,3469],{"class":3451},[3434,17426,13965],{"class":3472},[3434,17428,13968],{"class":3472},[3434,17430,14090],{"class":3472},[3434,17432,3482],{"class":3451},[3434,17434,17435,17437,17439,17441,17443,17445,17447,17449],{"class":3436,"line":3829},[3434,17436,8465],{"class":3458},[3434,17438,8153],{"class":3451},[3434,17440,3466],{"class":3465},[3434,17442,3469],{"class":3451},[3434,17444,14108],{"class":3472},[3434,17446,14111],{"class":3472},[3434,17448,14114],{"class":3472},[3434,17450,3482],{"class":3451},[3434,17452,17453],{"class":3436,"line":3835},[3434,17454,3488],{"class":3451},[3425,17456,17459],{"className":3427,"code":17457,"filename":17458,"language":3429,"meta":3430,"style":3430},"\u002F* Глобальні стилі: reset, типографіка, посилання *\u002F\n@layer base {\n    *, *::before, *::after { box-sizing: border-box; }\n\n    html { scroll-behavior: smooth; }\n\n    body {\n        background-color: var(--color-bg-base);\n        color: var(--color-text-primary);\n        font-family: var(--font-sans, system-ui, sans-serif);\n        line-height: 1.6;\n        transition: background-color 300ms ease, color 300ms ease;\n    }\n\n    :focus-visible {\n        outline: 2px solid var(--color-border-focus);\n        outline-offset: 2px;\n        border-radius: 4px;\n    }\n}\n","styles\u002Fbase.css",[3357,17460,17461,17466,17474,17508,17512,17529,17533,17540,17555,17569,17595,17607,17632,17636,17640,17647,17670,17681,17693,17697],{"__ignoreMap":3430},[3434,17462,17463],{"class":3436,"line":3437},[3434,17464,17465],{"class":3440},"\u002F* Глобальні стилі: reset, типографіка, посилання *\u002F\n",[3434,17467,17468,17471],{"class":3436,"line":3444},[3434,17469,17470],{"class":5199},"@layer",[3434,17472,17473],{"class":3451}," base {\n",[3434,17475,17476,17479,17481,17484,17487,17489,17491,17494,17496,17499,17501,17505],{"class":3436,"line":3455},[3434,17477,17478],{"class":3669},"    *",[3434,17480,7250],{"class":3451},[3434,17482,17483],{"class":3669},"*",[3434,17485,17486],{"class":3447},"::before",[3434,17488,7250],{"class":3451},[3434,17490,17483],{"class":3669},[3434,17492,17493],{"class":3447},"::after",[3434,17495,11611],{"class":3451},[3434,17497,17498],{"class":3458},"box-sizing",[3434,17500,3462],{"class":3451},[3434,17502,17504],{"class":17503},"sDUd3","border-box",[3434,17506,17507],{"class":3451},"; }\n",[3434,17509,17510],{"class":3436,"line":3485},[3434,17511,3495],{"emptyLinePlaceholder":3494},[3434,17513,17514,17517,17519,17522,17524,17527],{"class":3436,"line":3491},[3434,17515,17516],{"class":3447},"    html",[3434,17518,11611],{"class":3451},[3434,17520,17521],{"class":3458},"scroll-behavior",[3434,17523,3462],{"class":3451},[3434,17525,17526],{"class":17503},"smooth",[3434,17528,17507],{"class":3451},[3434,17530,17531],{"class":3436,"line":3498},[3434,17532,3495],{"emptyLinePlaceholder":3494},[3434,17534,17535,17538],{"class":3436,"line":3504},[3434,17536,17537],{"class":3447},"    body",[3434,17539,3452],{"class":3451},[3434,17541,17542,17544,17546,17548,17550,17553],{"class":3436,"line":3511},[3434,17543,3884],{"class":3458},[3434,17545,3462],{"class":3451},[3434,17547,3519],{"class":3465},[3434,17549,3469],{"class":3451},[3434,17551,17552],{"class":3458},"--color-bg-base",[3434,17554,3482],{"class":3451},[3434,17556,17557,17559,17561,17563,17565,17567],{"class":3436,"line":3529},[3434,17558,3914],{"class":3458},[3434,17560,3462],{"class":3451},[3434,17562,3519],{"class":3465},[3434,17564,3469],{"class":3451},[3434,17566,3379],{"class":3458},[3434,17568,3482],{"class":3451},[3434,17570,17571,17574,17576,17578,17580,17583,17585,17588,17590,17593],{"class":3436,"line":3810},[3434,17572,17573],{"class":3458},"        font-family",[3434,17575,3462],{"class":3451},[3434,17577,3519],{"class":3465},[3434,17579,3469],{"class":3451},[3434,17581,17582],{"class":3458},"--font-sans",[3434,17584,7250],{"class":3451},[3434,17586,17587],{"class":17503},"system-ui",[3434,17589,7250],{"class":3451},[3434,17591,17592],{"class":17503},"sans-serif",[3434,17594,3482],{"class":3451},[3434,17596,17597,17600,17602,17605],{"class":3436,"line":3816},[3434,17598,17599],{"class":3458},"        line-height",[3434,17601,3462],{"class":3451},[3434,17603,17604],{"class":3472},"1.6",[3434,17606,6132],{"class":3451},[3434,17608,17609,17612,17615,17618,17621,17623,17625,17628,17630],{"class":3436,"line":3821},[3434,17610,17611],{"class":3458},"        transition",[3434,17613,17614],{"class":3451},": background-color ",[3434,17616,17617],{"class":3472},"300ms",[3434,17619,17620],{"class":17503}," ease",[3434,17622,7250],{"class":3451},[3434,17624,13515],{"class":17503},[3434,17626,17627],{"class":3472}," 300ms",[3434,17629,17620],{"class":17503},[3434,17631,6132],{"class":3451},[3434,17633,17634],{"class":3436,"line":3829},[3434,17635,3813],{"class":3451},[3434,17637,17638],{"class":3436,"line":3835},[3434,17639,3495],{"emptyLinePlaceholder":3494},[3434,17641,17642,17645],{"class":3436,"line":3857},[3434,17643,17644],{"class":3447},"    :focus-visible",[3434,17646,3452],{"class":3451},[3434,17648,17649,17652,17654,17657,17660,17663,17665,17668],{"class":3436,"line":3862},[3434,17650,17651],{"class":3458},"        outline",[3434,17653,3462],{"class":3451},[3434,17655,17656],{"class":3472},"2px",[3434,17658,17659],{"class":17503}," solid",[3434,17661,17662],{"class":3465}," var",[3434,17664,3469],{"class":3451},[3434,17666,17667],{"class":3458},"--color-border-focus",[3434,17669,3482],{"class":3451},[3434,17671,17672,17675,17677,17679],{"class":3436,"line":3867},[3434,17673,17674],{"class":3458},"        outline-offset",[3434,17676,3462],{"class":3451},[3434,17678,17656],{"class":3472},[3434,17680,6132],{"class":3451},[3434,17682,17683,17686,17688,17691],{"class":3436,"line":3873},[3434,17684,17685],{"class":3458},"        border-radius",[3434,17687,3462],{"class":3451},[3434,17689,17690],{"class":3472},"4px",[3434,17692,6132],{"class":3451},[3434,17694,17695],{"class":3436,"line":3881},[3434,17696,3813],{"class":3451},[3434,17698,17699],{"class":3436,"line":3898},[3434,17700,3488],{"class":3451},[3425,17702,17705],{"className":3427,"code":17703,"filename":17704,"language":3429,"meta":3430,"style":3430},"\u002F* Компонентні класи через @utility та @layer components *\u002F\n@utility card {\n    background-color: var(--color-bg-surface);\n    border: 1px solid var(--color-border-default);\n    border-radius: 0.75rem;\n    padding: 1.5rem;\n}\n\n@utility btn-accent {\n    background-color: var(--color-accent);\n    color: white;\n    font-weight: 600;\n    padding: 0.5rem 1.25rem;\n    border-radius: 0.5rem;\n    transition: background-color 150ms ease;\n}\n\n@utility btn-accent:hover {\n    background-color: var(--color-accent-hover);\n}\n","styles\u002Fcomponents.css",[3357,17706,17707,17712,17720,17727,17732,17740,17745,17749,17753,17760,17767,17772,17780,17791,17798,17809,17813,17817,17824,17831],{"__ignoreMap":3430},[3434,17708,17709],{"class":3436,"line":3437},[3434,17710,17711],{"class":3440},"\u002F* Компонентні класи через @utility та @layer components *\u002F\n",[3434,17713,17714,17717],{"class":3436,"line":3444},[3434,17715,17716],{"class":5199},"@utility",[3434,17718,17719],{"class":3451}," card {\n",[3434,17721,17722,17724],{"class":3436,"line":3455},[3434,17723,6264],{"class":3669},[3434,17725,17726],{"class":3451},": var(--color-bg-surface);\n",[3434,17728,17729],{"class":3436,"line":3485},[3434,17730,17731],{"class":3451},"    border: 1px solid var(--color-border-default);\n",[3434,17733,17734,17737],{"class":3436,"line":3491},[3434,17735,17736],{"class":3669},"    border-radius",[3434,17738,17739],{"class":3451},": 0.75rem;\n",[3434,17741,17742],{"class":3436,"line":3498},[3434,17743,17744],{"class":3451},"    padding: 1.5rem;\n",[3434,17746,17747],{"class":3436,"line":3504},[3434,17748,3488],{"class":3451},[3434,17750,17751],{"class":3436,"line":3511},[3434,17752,3495],{"emptyLinePlaceholder":3494},[3434,17754,17755,17757],{"class":3436,"line":3529},[3434,17756,17716],{"class":5199},[3434,17758,17759],{"class":3451}," btn-accent {\n",[3434,17761,17762,17764],{"class":3436,"line":3810},[3434,17763,6264],{"class":3669},[3434,17765,17766],{"class":3451},": var(--color-accent);\n",[3434,17768,17769],{"class":3436,"line":3816},[3434,17770,17771],{"class":3451},"    color: white;\n",[3434,17773,17774,17777],{"class":3436,"line":3821},[3434,17775,17776],{"class":3669},"    font-weight",[3434,17778,17779],{"class":3451},": 600;\n",[3434,17781,17782,17785,17788],{"class":3436,"line":3829},[3434,17783,17784],{"class":3451},"    padding: 0",[3434,17786,17787],{"class":3447},".5rem",[3434,17789,17790],{"class":3451}," 1.25rem;\n",[3434,17792,17793,17795],{"class":3436,"line":3835},[3434,17794,17736],{"class":3669},[3434,17796,17797],{"class":3451},": 0.5rem;\n",[3434,17799,17800,17803,17806],{"class":3436,"line":3857},[3434,17801,17802],{"class":3451},"    transition: ",[3434,17804,17805],{"class":3669},"background-color",[3434,17807,17808],{"class":3451}," 150ms ease;\n",[3434,17810,17811],{"class":3436,"line":3862},[3434,17812,3488],{"class":3451},[3434,17814,17815],{"class":3436,"line":3867},[3434,17816,3495],{"emptyLinePlaceholder":3494},[3434,17818,17819,17821],{"class":3436,"line":3873},[3434,17820,17716],{"class":5199},[3434,17822,17823],{"class":3451}," btn-accent:hover {\n",[3434,17825,17826,17828],{"class":3436,"line":3881},[3434,17827,6264],{"class":3669},[3434,17829,17830],{"class":3451},": var(--color-accent-hover);\n",[3434,17832,17833],{"class":3436,"line":3898},[3434,17834,3488],{"class":3451},[3425,17836,17838],{"className":3656,"code":17837,"filename":11785,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Ctitle>Production App\u003C\u002Ftitle>\n\n    \u003C!-- Anti-FOIT: синхронний скрипт визначення теми -->\n    \u003Cscript>\n        (function() {\n            var s = localStorage.getItem('app-theme')\n            var d = window.matchMedia('(prefers-color-scheme: dark)').matches\n            if (s === 'dark' || (!s && d)) document.documentElement.classList.add('dark')\n            var b = localStorage.getItem('app-brand')\n            if (b) document.documentElement.setAttribute('data-theme', b)\n        })()\n    \u003C\u002Fscript>\n\n    \u003Clink rel=\"stylesheet\" href=\"\u002Fstyles\u002Fmain.css\">\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003C!-- Вміст сторінки -->\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,17839,17840,17850,17864,17872,17886,17906,17923,17927,17932,17940,17948,17969,17992,18040,18062,18093,18097,18105,18109,18130,18138,18146,18151,18159],{"__ignoreMap":3430},[3434,17841,17842,17844,17846,17848],{"class":3436,"line":3437},[3434,17843,3666],{"class":3665},[3434,17845,3670],{"class":3669},[3434,17847,3673],{"class":3458},[3434,17849,3676],{"class":3665},[3434,17851,17852,17854,17856,17858,17860,17862],{"class":3436,"line":3444},[3434,17853,3681],{"class":3665},[3434,17855,3658],{"class":3669},[3434,17857,3686],{"class":3458},[3434,17859,3689],{"class":3451},[3434,17861,3693],{"class":3692},[3434,17863,3676],{"class":3665},[3434,17865,17866,17868,17870],{"class":3436,"line":3455},[3434,17867,3681],{"class":3665},[3434,17869,3702],{"class":3669},[3434,17871,3676],{"class":3665},[3434,17873,17874,17876,17878,17880,17882,17884],{"class":3436,"line":3485},[3434,17875,4009],{"class":3665},[3434,17877,3711],{"class":3669},[3434,17879,3714],{"class":3458},[3434,17881,3689],{"class":3451},[3434,17883,3719],{"class":3692},[3434,17885,3676],{"class":3665},[3434,17887,17888,17890,17892,17894,17896,17898,17900,17902,17904],{"class":3436,"line":3491},[3434,17889,4009],{"class":3665},[3434,17891,3711],{"class":3669},[3434,17893,11842],{"class":3458},[3434,17895,3689],{"class":3451},[3434,17897,11847],{"class":3692},[3434,17899,11850],{"class":3458},[3434,17901,3689],{"class":3451},[3434,17903,11855],{"class":3692},[3434,17905,3676],{"class":3665},[3434,17907,17908,17910,17912,17914,17917,17919,17921],{"class":3436,"line":3498},[3434,17909,4009],{"class":3665},[3434,17911,11864],{"class":3669},[3434,17913,4039],{"class":3665},[3434,17915,17916],{"class":3451},"Production App",[3434,17918,3964],{"class":3665},[3434,17920,11864],{"class":3669},[3434,17922,3676],{"class":3665},[3434,17924,17925],{"class":3436,"line":3504},[3434,17926,3495],{"emptyLinePlaceholder":3494},[3434,17928,17929],{"class":3436,"line":3511},[3434,17930,17931],{"class":3440},"    \u003C!-- Anti-FOIT: синхронний скрипт визначення теми -->\n",[3434,17933,17934,17936,17938],{"class":3436,"line":3529},[3434,17935,4009],{"class":3665},[3434,17937,3728],{"class":3669},[3434,17939,3676],{"class":3665},[3434,17941,17942,17944,17946],{"class":3436,"line":3810},[3434,17943,11917],{"class":3734},[3434,17945,10849],{"class":5682},[3434,17947,10855],{"class":3734},[3434,17949,17950,17952,17955,17957,17959,17961,17963,17965,17967],{"class":3436,"line":3816},[3434,17951,11926],{"class":5682},[3434,17953,17954],{"class":5644}," s",[3434,17956,6077],{"class":3451},[3434,17958,10863],{"class":5644},[3434,17960,4726],{"class":3734},[3434,17962,10868],{"class":3465},[3434,17964,3469],{"class":3734},[3434,17966,11941],{"class":5655},[3434,17968,6409],{"class":3734},[3434,17970,17971,17973,17976,17978,17980,17982,17984,17986,17988,17990],{"class":3436,"line":3821},[3434,17972,11926],{"class":5682},[3434,17974,17975],{"class":5644}," d",[3434,17977,6077],{"class":3451},[3434,17979,10921],{"class":5644},[3434,17981,4726],{"class":3734},[3434,17983,10926],{"class":3465},[3434,17985,3469],{"class":3734},[3434,17987,10931],{"class":5655},[3434,17989,5659],{"class":3734},[3434,17991,10936],{"class":5644},[3434,17993,17994,17996,17998,18001,18003,18005,18007,18009,18011,18013,18015,18017,18020,18022,18024,18026,18028,18030,18032,18034,18036,18038],{"class":3436,"line":3829},[3434,17995,11541],{"class":5199},[3434,17997,11004],{"class":3734},[3434,17999,18000],{"class":5644},"s",[3434,18002,11979],{"class":3451},[3434,18004,11982],{"class":5655},[3434,18006,11985],{"class":3451},[3434,18008,11004],{"class":3734},[3434,18010,11990],{"class":3451},[3434,18012,18000],{"class":5644},[3434,18014,11995],{"class":3451},[3434,18016,17975],{"class":5644},[3434,18018,18019],{"class":3734},")) ",[3434,18021,5645],{"class":5644},[3434,18023,4726],{"class":3734},[3434,18025,6393],{"class":5644},[3434,18027,4726],{"class":3734},[3434,18029,5662],{"class":5644},[3434,18031,4726],{"class":3734},[3434,18033,6402],{"class":3465},[3434,18035,3469],{"class":3734},[3434,18037,5672],{"class":5655},[3434,18039,6409],{"class":3734},[3434,18041,18042,18044,18047,18049,18051,18053,18055,18057,18060],{"class":3436,"line":3835},[3434,18043,11926],{"class":5682},[3434,18045,18046],{"class":5644}," b",[3434,18048,6077],{"class":3451},[3434,18050,10863],{"class":5644},[3434,18052,4726],{"class":3734},[3434,18054,10868],{"class":3465},[3434,18056,3469],{"class":3734},[3434,18058,18059],{"class":5655},"'app-brand'",[3434,18061,6409],{"class":3734},[3434,18063,18064,18066,18068,18071,18073,18075,18077,18079,18081,18083,18085,18087,18089,18091],{"class":3436,"line":3857},[3434,18065,11541],{"class":5199},[3434,18067,11004],{"class":3734},[3434,18069,18070],{"class":5644},"b",[3434,18072,11025],{"class":3734},[3434,18074,5645],{"class":5644},[3434,18076,4726],{"class":3734},[3434,18078,6393],{"class":5644},[3434,18080,4726],{"class":3734},[3434,18082,11181],{"class":3465},[3434,18084,3469],{"class":3734},[3434,18086,11186],{"class":5655},[3434,18088,7250],{"class":3734},[3434,18090,18070],{"class":5644},[3434,18092,6409],{"class":3734},[3434,18094,18095],{"class":3436,"line":3862},[3434,18096,12035],{"class":3734},[3434,18098,18099,18101,18103],{"class":3436,"line":3867},[3434,18100,4687],{"class":3665},[3434,18102,3728],{"class":3669},[3434,18104,3676],{"class":3665},[3434,18106,18107],{"class":3436,"line":3873},[3434,18108,3495],{"emptyLinePlaceholder":3494},[3434,18110,18111,18113,18115,18117,18119,18121,18123,18125,18128],{"class":3436,"line":3881},[3434,18112,4009],{"class":3665},[3434,18114,3751],{"class":3669},[3434,18116,3762],{"class":3458},[3434,18118,3689],{"class":3451},[3434,18120,3767],{"class":3692},[3434,18122,3754],{"class":3458},[3434,18124,3689],{"class":3451},[3434,18126,18127],{"class":3692},"\"\u002Fstyles\u002Fmain.css\"",[3434,18129,3676],{"class":3665},[3434,18131,18132,18134,18136],{"class":3436,"line":3898},[3434,18133,3964],{"class":3665},[3434,18135,3702],{"class":3669},[3434,18137,3676],{"class":3665},[3434,18139,18140,18142,18144],{"class":3436,"line":3903},[3434,18141,3681],{"class":3665},[3434,18143,3985],{"class":3669},[3434,18145,3676],{"class":3665},[3434,18147,18148],{"class":3436,"line":3911},[3434,18149,18150],{"class":3440},"    \u003C!-- Вміст сторінки -->\n",[3434,18152,18153,18155,18157],{"class":3436,"line":3927},[3434,18154,3964],{"class":3665},[3434,18156,3985],{"class":3669},[3434,18158,3676],{"class":3665},[3434,18160,18161,18163,18165],{"class":3436,"line":3932},[3434,18162,3964],{"class":3665},[3434,18164,3658],{"class":3669},[3434,18166,3676],{"class":3665},[3425,18168,18170],{"className":6375,"code":18169,"filename":10731,"language":6377,"meta":3430,"style":3430},"const THEME_KEY = 'app-theme'\nconst BRAND_KEY = 'app-brand'\nconst ROOT = document.documentElement\n\nexport function initTheme() {\n    const effective = getEffectiveTheme()\n    ROOT.classList.toggle('dark', effective === 'dark')\n\n    window.matchMedia('(prefers-color-scheme: dark)')\n        .addEventListener('change', e => {\n            if (!localStorage.getItem(THEME_KEY)) {\n                ROOT.classList.toggle('dark', e.matches)\n            }\n        })\n}\n\nexport function getEffectiveTheme() {\n    const saved = localStorage.getItem(THEME_KEY)\n    if (saved) return saved\n    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nexport function setTheme(theme) {\n    if (theme === 'system') {\n        localStorage.removeItem(THEME_KEY)\n    } else {\n        localStorage.setItem(THEME_KEY, theme)\n    }\n    ROOT.classList.toggle('dark', getEffectiveTheme() === 'dark')\n}\n\nexport function setBrand(brand) {\n    if (brand) {\n        localStorage.setItem(BRAND_KEY, brand)\n        ROOT.setAttribute('data-theme', brand)\n    } else {\n        localStorage.removeItem(BRAND_KEY)\n        ROOT.removeAttribute('data-theme')\n    }\n}\n",[3357,18171,18172,18183,18195,18209,18213,18224,18236,18262,18266,18280,18298,18317,18344,18348,18352,18356,18360,18370,18390,18404,18430,18434,18438,18452,18466,18480,18488,18506,18510,18537,18541,18545,18560,18570,18589,18607,18615,18629,18643,18647],{"__ignoreMap":3430},[3434,18173,18174,18176,18179,18181],{"class":3436,"line":3437},[3434,18175,10637],{"class":5682},[3434,18177,18178],{"class":6073}," THEME_KEY",[3434,18180,10787],{"class":3451},[3434,18182,10790],{"class":5655},[3434,18184,18185,18187,18190,18192],{"class":3436,"line":3444},[3434,18186,10637],{"class":5682},[3434,18188,18189],{"class":6073}," BRAND_KEY",[3434,18191,10787],{"class":3451},[3434,18193,18194],{"class":5655},"'app-brand'\n",[3434,18196,18197,18199,18201,18203,18205,18207],{"class":3436,"line":3455},[3434,18198,10637],{"class":5682},[3434,18200,10797],{"class":6073},[3434,18202,10787],{"class":3451},[3434,18204,5645],{"class":5644},[3434,18206,4726],{"class":3451},[3434,18208,10806],{"class":5644},[3434,18210,18211],{"class":3436,"line":3485},[3434,18212,3495],{"emptyLinePlaceholder":3494},[3434,18214,18215,18217,18220,18222],{"class":3436,"line":3491},[3434,18216,11608],{"class":5199},[3434,18218,18219],{"class":5682}," function",[3434,18221,11461],{"class":3465},[3434,18223,10855],{"class":3451},[3434,18225,18226,18228,18230,18232,18234],{"class":3436,"line":3498},[3434,18227,10985],{"class":5682},[3434,18229,13199],{"class":6073},[3434,18231,10787],{"class":3451},[3434,18233,11387],{"class":3465},[3434,18235,10996],{"class":3451},[3434,18237,18238,18240,18242,18244,18246,18248,18250,18252,18254,18256,18258,18260],{"class":3436,"line":3504},[3434,18239,11176],{"class":6073},[3434,18241,4726],{"class":3451},[3434,18243,5662],{"class":5644},[3434,18245,4726],{"class":3451},[3434,18247,5667],{"class":3465},[3434,18249,3469],{"class":3451},[3434,18251,5672],{"class":5655},[3434,18253,7250],{"class":3451},[3434,18255,13226],{"class":5644},[3434,18257,11010],{"class":3451},[3434,18259,5672],{"class":5655},[3434,18261,6409],{"class":3451},[3434,18263,18264],{"class":3436,"line":3511},[3434,18265,3495],{"emptyLinePlaceholder":3494},[3434,18267,18268,18270,18272,18274,18276,18278],{"class":3436,"line":3529},[3434,18269,11499],{"class":5644},[3434,18271,4726],{"class":3451},[3434,18273,10926],{"class":3465},[3434,18275,3469],{"class":3451},[3434,18277,10931],{"class":5655},[3434,18279,6409],{"class":3451},[3434,18281,18282,18284,18286,18288,18290,18292,18294,18296],{"class":3436,"line":3810},[3434,18283,11515],{"class":3451},[3434,18285,11518],{"class":3465},[3434,18287,3469],{"class":3451},[3434,18289,11523],{"class":5655},[3434,18291,7250],{"class":3451},[3434,18293,11529],{"class":5644},[3434,18295,13426],{"class":5682},[3434,18297,3452],{"class":3451},[3434,18299,18300,18302,18304,18306,18308,18310,18312,18315],{"class":3436,"line":3816},[3434,18301,11541],{"class":5199},[3434,18303,11544],{"class":3451},[3434,18305,5115],{"class":5644},[3434,18307,4726],{"class":3451},[3434,18309,10868],{"class":3465},[3434,18311,3469],{"class":3451},[3434,18313,18314],{"class":6073},"THEME_KEY",[3434,18316,12286],{"class":3451},[3434,18318,18319,18322,18324,18326,18328,18330,18332,18334,18336,18338,18340,18342],{"class":3436,"line":3821},[3434,18320,18321],{"class":6073},"                ROOT",[3434,18323,4726],{"class":3451},[3434,18325,5662],{"class":5644},[3434,18327,4726],{"class":3451},[3434,18329,5667],{"class":3465},[3434,18331,3469],{"class":3451},[3434,18333,5672],{"class":5655},[3434,18335,7250],{"class":3451},[3434,18337,11529],{"class":5644},[3434,18339,4726],{"class":3451},[3434,18341,11564],{"class":5644},[3434,18343,6409],{"class":3451},[3434,18345,18346],{"class":3436,"line":3829},[3434,18347,11580],{"class":3451},[3434,18349,18350],{"class":3436,"line":3835},[3434,18351,11586],{"class":3451},[3434,18353,18354],{"class":3436,"line":3857},[3434,18355,3488],{"class":3451},[3434,18357,18358],{"class":3436,"line":3862},[3434,18359,3495],{"emptyLinePlaceholder":3494},[3434,18361,18362,18364,18366,18368],{"class":3436,"line":3867},[3434,18363,11608],{"class":5199},[3434,18365,18219],{"class":5682},[3434,18367,10978],{"class":3465},[3434,18369,10855],{"class":3451},[3434,18371,18372,18374,18376,18378,18380,18382,18384,18386,18388],{"class":3436,"line":3873},[3434,18373,10985],{"class":5682},[3434,18375,10988],{"class":6073},[3434,18377,10787],{"class":3451},[3434,18379,5115],{"class":5644},[3434,18381,4726],{"class":3451},[3434,18383,10868],{"class":3465},[3434,18385,3469],{"class":3451},[3434,18387,18314],{"class":6073},[3434,18389,6409],{"class":3451},[3434,18391,18392,18394,18396,18398,18400,18402],{"class":3436,"line":3881},[3434,18393,11001],{"class":5199},[3434,18395,11004],{"class":3451},[3434,18397,11007],{"class":5644},[3434,18399,11025],{"class":3451},[3434,18401,11028],{"class":5199},[3434,18403,11031],{"class":5644},[3434,18405,18406,18408,18410,18412,18414,18416,18418,18420,18422,18424,18426,18428],{"class":3436,"line":3898},[3434,18407,10860],{"class":5199},[3434,18409,10921],{"class":5644},[3434,18411,4726],{"class":3451},[3434,18413,10926],{"class":3465},[3434,18415,3469],{"class":3451},[3434,18417,10931],{"class":5655},[3434,18419,5659],{"class":3451},[3434,18421,11564],{"class":5644},[3434,18423,11406],{"class":3451},[3434,18425,5672],{"class":5655},[3434,18427,11045],{"class":3451},[3434,18429,11048],{"class":5655},[3434,18431,18432],{"class":3436,"line":3903},[3434,18433,3488],{"class":3451},[3434,18435,18436],{"class":3436,"line":3911},[3434,18437,3495],{"emptyLinePlaceholder":3494},[3434,18439,18440,18442,18444,18446,18448,18450],{"class":3436,"line":3927},[3434,18441,11608],{"class":5199},[3434,18443,18219],{"class":5682},[3434,18445,11242],{"class":3465},[3434,18447,3469],{"class":3451},[3434,18449,11095],{"class":5644},[3434,18451,6065],{"class":3451},[3434,18453,18454,18456,18458,18460,18462,18464],{"class":3436,"line":3932},[3434,18455,11001],{"class":5199},[3434,18457,11004],{"class":3451},[3434,18459,11095],{"class":5644},[3434,18461,11010],{"class":3451},[3434,18463,11261],{"class":5655},[3434,18465,6065],{"class":3451},[3434,18467,18468,18470,18472,18474,18476,18478],{"class":3436,"line":3940},[3434,18469,11268],{"class":5644},[3434,18471,4726],{"class":3451},[3434,18473,11273],{"class":3465},[3434,18475,3469],{"class":3451},[3434,18477,18314],{"class":6073},[3434,18479,6409],{"class":3451},[3434,18481,18482,18484,18486],{"class":3436,"line":3956},[3434,18483,11135],{"class":3451},[3434,18485,11138],{"class":5199},[3434,18487,3452],{"class":3451},[3434,18489,18490,18492,18494,18496,18498,18500,18502,18504],{"class":3436,"line":3961},[3434,18491,11268],{"class":5644},[3434,18493,4726],{"class":3451},[3434,18495,11316],{"class":3465},[3434,18497,3469],{"class":3451},[3434,18499,18314],{"class":6073},[3434,18501,7250],{"class":3451},[3434,18503,11095],{"class":5644},[3434,18505,6409],{"class":3451},[3434,18507,18508],{"class":3436,"line":3971},[3434,18509,3813],{"class":3451},[3434,18511,18512,18514,18516,18518,18520,18522,18524,18526,18528,18530,18533,18535],{"class":3436,"line":3980},[3434,18513,11176],{"class":6073},[3434,18515,4726],{"class":3451},[3434,18517,5662],{"class":5644},[3434,18519,4726],{"class":3451},[3434,18521,5667],{"class":3465},[3434,18523,3469],{"class":3451},[3434,18525,5672],{"class":5655},[3434,18527,7250],{"class":3451},[3434,18529,11387],{"class":3465},[3434,18531,18532],{"class":3451},"() === ",[3434,18534,5672],{"class":5655},[3434,18536,6409],{"class":3451},[3434,18538,18539],{"class":3436,"line":4006},[3434,18540,3488],{"class":3451},[3434,18542,18543],{"class":3436,"line":4024},[3434,18544,3495],{"emptyLinePlaceholder":3494},[3434,18546,18547,18549,18551,18554,18556,18558],{"class":3436,"line":4051},[3434,18548,11608],{"class":5199},[3434,18550,18219],{"class":5682},[3434,18552,18553],{"class":3465}," setBrand",[3434,18555,3469],{"class":3451},[3434,18557,16452],{"class":5644},[3434,18559,6065],{"class":3451},[3434,18561,18562,18564,18566,18568],{"class":3436,"line":4057},[3434,18563,11001],{"class":5199},[3434,18565,11004],{"class":3451},[3434,18567,16452],{"class":5644},[3434,18569,6065],{"class":3451},[3434,18571,18572,18574,18576,18578,18580,18583,18585,18587],{"class":3436,"line":4073},[3434,18573,11268],{"class":5644},[3434,18575,4726],{"class":3451},[3434,18577,11316],{"class":3465},[3434,18579,3469],{"class":3451},[3434,18581,18582],{"class":6073},"BRAND_KEY",[3434,18584,7250],{"class":3451},[3434,18586,16452],{"class":5644},[3434,18588,6409],{"class":3451},[3434,18590,18591,18593,18595,18597,18599,18601,18603,18605],{"class":3436,"line":4079},[3434,18592,11116],{"class":6073},[3434,18594,4726],{"class":3451},[3434,18596,11181],{"class":3465},[3434,18598,3469],{"class":3451},[3434,18600,11186],{"class":5655},[3434,18602,7250],{"class":3451},[3434,18604,16452],{"class":5644},[3434,18606,6409],{"class":3451},[3434,18608,18609,18611,18613],{"class":3436,"line":4096},[3434,18610,11135],{"class":3451},[3434,18612,11138],{"class":5199},[3434,18614,3452],{"class":3451},[3434,18616,18617,18619,18621,18623,18625,18627],{"class":3436,"line":4113},[3434,18618,11268],{"class":5644},[3434,18620,4726],{"class":3451},[3434,18622,11273],{"class":3465},[3434,18624,3469],{"class":3451},[3434,18626,18582],{"class":6073},[3434,18628,6409],{"class":3451},[3434,18630,18631,18633,18635,18637,18639,18641],{"class":3436,"line":4119},[3434,18632,11116],{"class":6073},[3434,18634,4726],{"class":3451},[3434,18636,16504],{"class":3465},[3434,18638,3469],{"class":3451},[3434,18640,11186],{"class":5655},[3434,18642,6409],{"class":3451},[3434,18644,18645],{"class":3436,"line":4129},[3434,18646,3813],{"class":3451},[3434,18648,18649],{"class":3436,"line":4145},[3434,18650,3488],{"class":3451},[3396,18652],{},[3403,18654,18656],{"id":18655},"_62-повна-демонстраційна-сторінка","6.2. Повна демонстраційна сторінка",[3353,18658,18659],{},"Зберемо все воєдино: повноцінна сторінка зі стійкою системою токенів, перемикачем теми, перемикачем бренду та набором UI-компонентів.",[3651,18661,18662],{":tailwind":3653},[3425,18663,18665],{"className":3656,"code":18664,"language":3658,"meta":3430,"style":3430},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"uk\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cscript>\n        (function() {\n            var s = localStorage.getItem('app-theme')\n            var d = window.matchMedia('(prefers-color-scheme: dark)').matches\n            if (s === 'dark' || (!s && d)) document.documentElement.classList.add('dark')\n        })()\n    \u003C\u002Fscript>\n    \u003Cscript src=\"https:\u002F\u002Fcdn.tailwindcss.com\u002F4.0\">\u003C\u002Fscript>\n    \u003Cstyle type=\"text\u002Ftailwindcss\">\n        @custom-variant dark (&:is(.dark *));\n\n        :root {\n            --c-bg:       oklch(0.961 0.005 264);\n            --c-surface:  oklch(1 0 0);\n            --c-text:     oklch(0.208 0.042 265);\n            --c-muted:    oklch(0.554 0.034 264);\n            --c-border:   oklch(0.929 0.008 264);\n            --c-accent:   oklch(0.585 0.233 277);\n            --c-accent-h: oklch(0.511 0.262 276);\n            --c-accent-l: oklch(0.962 0.018 272);\n        }\n        .dark {\n            --c-bg:       oklch(0.113 0.021 261);\n            --c-surface:  oklch(0.179 0.027 261);\n            --c-text:     oklch(0.984 0.003 247);\n            --c-muted:    oklch(0.704 0.026 264);\n            --c-border:   oklch(0.300 0.025 264);\n            --c-accent:   oklch(0.673 0.182 276);\n            --c-accent-h: oklch(0.785 0.115 274);\n            --c-accent-l: oklch(0.257 0.090 281);\n        }\n        [data-brand=\"teal\"] {\n            --c-accent:   oklch(0.600 0.168 194);\n            --c-accent-h: oklch(0.511 0.158 196);\n            --c-accent-l: oklch(0.953 0.051 193);\n        }\n        [data-brand=\"amber\"] {\n            --c-accent:   oklch(0.769 0.188 70);\n            --c-accent-h: oklch(0.666 0.179 58);\n            --c-accent-l: oklch(0.987 0.022 95);\n        }\n        [data-brand=\"rose\"] {\n            --c-accent:   oklch(0.645 0.246 16);\n            --c-accent-h: oklch(0.586 0.253 17);\n            --c-accent-l: oklch(0.969 0.015 12);\n        }\n        body {\n            background-color: var(--c-bg);\n            color: var(--c-text);\n            transition: background-color .25s, color .25s;\n        }\n    \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody style=\"font-family: system-ui, sans-serif; min-height: 100vh; padding: 1.5rem;\">\n\n\u003C!-- ===== NAVBAR ===== -->\n\u003Cnav style=\"display:flex; align-items:center; justify-content:space-between; margin-bottom:2rem;\n            background:var(--c-surface); border:1px solid var(--c-border);\n            border-radius:.875rem; padding:.75rem 1.25rem;\">\n    \u003C!-- Лого -->\n    \u003Cdiv style=\"display:flex; align-items:center; gap:.625rem;\">\n        \u003Cdiv style=\"width:2rem; height:2rem; background:var(--c-accent); border-radius:.5rem;\n                    display:flex; align-items:center; justify-content:center; color:white;\n                    font-size:.75rem; font-weight:800;\">K\u003C\u002Fdiv>\n        \u003Cspan style=\"font-weight:800; font-size:.9rem; color:var(--c-text);\">kostyl.dev\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Панель керування темою -->\n    \u003Cdiv style=\"display:flex; align-items:center; gap:.5rem;\">\n        \u003C!-- Вибір бренду -->\n        \u003Cdiv style=\"display:flex; gap:.25rem; padding:.2rem; background:var(--c-bg); border-radius:999px;\">\n            \u003Cbutton onclick=\"setBrand(null)\" title=\"Indigo (default)\"\n                    style=\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.585 0.233 277);\n                           border:2px solid transparent; cursor:pointer; transition:all .15s;\"\n                    onmouseover=\"this.style.borderColor='white'\" onmouseout=\"this.style.borderColor='transparent'\">\u003C\u002Fbutton>\n            \u003Cbutton onclick=\"setBrand('teal')\" title=\"Teal\"\n                    style=\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.600 0.168 194);\n                           border:2px solid transparent; cursor:pointer; transition:all .15s;\"\n                    onmouseover=\"this.style.borderColor='white'\" onmouseout=\"this.style.borderColor='transparent'\">\u003C\u002Fbutton>\n            \u003Cbutton onclick=\"setBrand('amber')\" title=\"Amber\"\n                    style=\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.769 0.188 70);\n                           border:2px solid transparent; cursor:pointer; transition:all .15s;\"\n                    onmouseover=\"this.style.borderColor='white'\" onmouseout=\"this.style.borderColor='transparent'\">\u003C\u002Fbutton>\n            \u003Cbutton onclick=\"setBrand('rose')\" title=\"Rose\"\n                    style=\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.645 0.246 16);\n                           border:2px solid transparent; cursor:pointer; transition:all .15s;\"\n                    onmouseover=\"this.style.borderColor='white'\" onmouseout=\"this.style.borderColor='transparent'\">\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n\n        \u003C!-- Роздільник -->\n        \u003Cdiv style=\"width:1px; height:1.25rem; background:var(--c-border);\">\u003C\u002Fdiv>\n\n        \u003C!-- Перемикач dark\u002Flight -->\n        \u003Cbutton id=\"dark-btn\" onclick=\"toggleDark()\"\n                style=\"width:2rem; height:2rem; border-radius:50%; background:var(--c-bg);\n                       border:1px solid var(--c-border); cursor:pointer; font-size:.875rem;\n                       display:flex; align-items:center; justify-content:center; transition:all .15s;\">\n        \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\u003C\u002Fnav>\n\n\u003C!-- ===== HERO ===== -->\n\u003Cheader style=\"text-align:center; padding:2rem 1rem 2.5rem; max-width:36rem; margin:0 auto 2.5rem;\">\n    \u003Cp style=\"font-size:.75rem; font-weight:700; text-transform:uppercase; letter-spacing:.1em;\n              color:var(--c-accent); margin-bottom:.75rem;\">Tailwind CSS v4\u003C\u002Fp>\n    \u003Ch1 style=\"font-size:2rem; font-weight:900; line-height:1.15; letter-spacing:-.03em;\n               color:var(--c-text); margin-bottom:1rem; text-wrap:balance;\">\n        Система дизайн-токенів та темна тема\n    \u003C\u002Fh1>\n    \u003Cp style=\"font-size:.9rem; color:var(--c-muted); line-height:1.65; margin-bottom:1.5rem;\">\n        Одна палітра CSS Custom Properties. Нескінченна кількість тем.\n        Нуль дублювання класів у HTML.\n    \u003C\u002Fp>\n    \u003Cdiv style=\"display:flex; gap:.625rem; justify-content:center; flex-wrap:wrap;\">\n        \u003Cbutton style=\"background:var(--c-accent); color:white; font-weight:600;\n                       padding:.6rem 1.5rem; border-radius:.625rem; border:none; cursor:pointer;\n                       font-size:.875rem; transition:background .15s;\"\n                onmouseover=\"this.style.background='var(--c-accent-h)'\"\n                onmouseout=\"this.style.background='var(--c-accent)'\">\n            Читати далі\n        \u003C\u002Fbutton>\n        \u003Cbutton style=\"background:var(--c-accent-l); color:var(--c-accent); font-weight:600;\n                       padding:.6rem 1.5rem; border-radius:.625rem; border:1px solid var(--c-border);\n                       cursor:pointer; font-size:.875rem; transition:all .15s;\">\n            Документація\n        \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\u003C\u002Fheader>\n\n\u003C!-- ===== FEATURE GRID ===== -->\n\u003Cdiv style=\"display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr));\n            gap:1rem; margin-bottom:2rem;\">\n    \u003Cdiv style=\"background:var(--c-surface); border:1px solid var(--c-border);\n                border-radius:.875rem; padding:1.25rem; transition:all .2s;\"\n         onmouseover=\"this.style.borderColor='var(--c-accent)'; this.style.boxShadow='0 4px 20px oklch(from var(--c-accent) l c h \u002F .15)'\"\n         onmouseout=\"this.style.borderColor='var(--c-border)'; this.style.boxShadow='none'\">\n        \u003Cdiv style=\"width:2.5rem; height:2.5rem; background:var(--c-accent-l); border-radius:.625rem;\n                    display:flex; align-items:center; justify-content:center; font-size:1.1rem;\n                    margin-bottom:.875rem;\">🎨\u003C\u002Fdiv>\n        \u003Ch3 style=\"font-weight:700; font-size:.875rem; color:var(--c-text); margin-bottom:.375rem;\">\n            Semantic Tokens\n        \u003C\u002Fh3>\n        \u003Cp style=\"font-size:.8rem; color:var(--c-muted); line-height:1.55;\">\n            Кольори описані за призначенням, а не конкретним відтінком.\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"background:var(--c-surface); border:1px solid var(--c-border);\n                border-radius:.875rem; padding:1.25rem; transition:all .2s;\"\n         onmouseover=\"this.style.borderColor='var(--c-accent)'; this.style.boxShadow='0 4px 20px oklch(from var(--c-accent) l c h \u002F .15)'\"\n         onmouseout=\"this.style.borderColor='var(--c-border)'; this.style.boxShadow='none'\">\n        \u003Cdiv style=\"width:2.5rem; height:2.5rem; background:var(--c-accent-l); border-radius:.625rem;\n                    display:flex; align-items:center; justify-content:center; font-size:1.1rem;\n                    margin-bottom:.875rem;\">⚡\u003C\u002Fdiv>\n        \u003Ch3 style=\"font-weight:700; font-size:.875rem; color:var(--c-text); margin-bottom:.375rem;\">\n            Zero dark: Classes\n        \u003C\u002Fh3>\n        \u003Cp style=\"font-size:.8rem; color:var(--c-muted); line-height:1.55;\">\n            HTML не містить жодного dark:-класу. CSS-змінні роблять всю роботу.\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"background:var(--c-surface); border:1px solid var(--c-border);\n                border-radius:.875rem; padding:1.25rem; transition:all .2s;\"\n         onmouseover=\"this.style.borderColor='var(--c-accent)'; this.style.boxShadow='0 4px 20px oklch(from var(--c-accent) l c h \u002F .15)'\"\n         onmouseout=\"this.style.borderColor='var(--c-border)'; this.style.boxShadow='none'\">\n        \u003Cdiv style=\"width:2.5rem; height:2.5rem; background:var(--c-accent-l); border-radius:.625rem;\n                    display:flex; align-items:center; justify-content:center; font-size:1.1rem;\n                    margin-bottom:.875rem;\">🌈\u003C\u002Fdiv>\n        \u003Ch3 style=\"font-weight:700; font-size:.875rem; color:var(--c-text); margin-bottom:.375rem;\">\n            Multi-theming\n        \u003C\u002Fh3>\n        \u003Cp style=\"font-size:.8rem; color:var(--c-muted); line-height:1.55;\">\n            Нескінченна кількість бренд-тем через data-theme. Без дублювання.\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003C!-- ===== STATUS BADGES ===== -->\n\u003Cdiv style=\"background:var(--c-surface); border:1px solid var(--c-border);\n            border-radius:.875rem; padding:1.25rem; margin-bottom:1rem;\">\n    \u003Cp style=\"font-size:.7rem; font-weight:700; text-transform:uppercase; letter-spacing:.08em;\n              color:var(--c-muted); margin-bottom:.75rem;\">Статусні компоненти через семантичні токени\u003C\u002Fp>\n    \u003Cdiv style=\"display:flex; gap:.5rem; flex-wrap:wrap;\">\n        \u003Cspan style=\"padding:.25rem .75rem; background:oklch(0.962 0.044 156); color:oklch(0.540 0.145 146);\n                     font-size:.75rem; font-weight:700; border-radius:999px;\">● Активний\u003C\u002Fspan>\n        \u003Cspan style=\"padding:.25rem .75rem; background:oklch(0.973 0.071 103); color:oklch(0.476 0.144 67);\n                     font-size:.75rem; font-weight:700; border-radius:999px;\">⚠ Очікує\u003C\u002Fspan>\n        \u003Cspan style=\"padding:.25rem .75rem; background:oklch(0.936 0.032 17); color:oklch(0.577 0.245 27);\n                     font-size:.75rem; font-weight:700; border-radius:999px;\">✖ Помилка\u003C\u002Fspan>\n        \u003Cspan style=\"padding:.25rem .75rem; background:var(--c-accent-l); color:var(--c-accent);\n                     font-size:.75rem; font-weight:700; border-radius:999px;\">★ Featured\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003Cscript>\n    function isDark() { return document.documentElement.classList.contains('dark') }\n\n    function toggleDark() {\n        const dark = !isDark()\n        document.documentElement.classList.toggle('dark', dark)\n        localStorage.setItem('app-theme', dark ? 'dark' : 'light')\n        updateDarkBtn()\n    }\n\n    function setBrand(brand) {\n        if (brand) {\n            document.documentElement.setAttribute('data-theme', brand)\n        } else {\n            document.documentElement.removeAttribute('data-theme')\n        }\n    }\n\n    function updateDarkBtn() {\n        document.getElementById('dark-btn').textContent = isDark() ? '☀️' : '🌙'\n    }\n\n    updateDarkBtn()\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[3357,18666,18667,18677,18691,18699,18713,18721,18729,18749,18771,18817,18821,18829,18847,18861,18867,18871,18877,18896,18915,18934,18953,18972,18991,19010,19029,19033,19039,19057,19075,19093,19111,19129,19147,19165,19183,19187,19201,19222,19242,19263,19267,19280,19299,19320,19340,19344,19356,19374,19392,19410,19414,19421,19437,19453,19472,19476,19484,19492,19507,19511,19516,19530,19535,19542,19547,19562,19575,19580,19596,19620,19628,19632,19637,19652,19657,19672,19702,19712,19717,19774,19802,19811,19815,19867,19895,19904,19908,19960,19987,19996,20000,20052,20060,20064,20069,20088,20092,20097,20122,20132,20137,20144,20152,20160,20168,20172,20177,20193,20206,20222,20235,20242,20247,20255,20270,20275,20280,20288,20303,20316,20321,20326,20353,20381,20386,20394,20407,20412,20419,20424,20432,20440,20448,20453,20459,20473,20481,20495,20501,20545,20591,20605,20611,20627,20643,20649,20658,20674,20680,20689,20698,20703,20716,20721,20762,20805,20818,20823,20838,20853,20859,20868,20883,20889,20898,20907,20912,20925,20930,20971,21014,21027,21032,21048,21063,21069,21078,21093,21099,21108,21117,21126,21131,21137,21150,21158,21172,21189,21205,21219,21236,21250,21266,21280,21296,21310,21326,21335,21344,21349,21358,21391,21396,21406,21423,21451,21478,21486,21491,21496,21509,21520,21543,21552,21571,21576,21581,21586,21596,21631,21636,21641,21649,21658,21667],{"__ignoreMap":3430},[3434,18668,18669,18671,18673,18675],{"class":3436,"line":3437},[3434,18670,3666],{"class":3665},[3434,18672,3670],{"class":3669},[3434,18674,3673],{"class":3458},[3434,18676,3676],{"class":3665},[3434,18678,18679,18681,18683,18685,18687,18689],{"class":3436,"line":3444},[3434,18680,3681],{"class":3665},[3434,18682,3658],{"class":3669},[3434,18684,3686],{"class":3458},[3434,18686,3689],{"class":3451},[3434,18688,3693],{"class":3692},[3434,18690,3676],{"class":3665},[3434,18692,18693,18695,18697],{"class":3436,"line":3455},[3434,18694,3681],{"class":3665},[3434,18696,3702],{"class":3669},[3434,18698,3676],{"class":3665},[3434,18700,18701,18703,18705,18707,18709,18711],{"class":3436,"line":3485},[3434,18702,4009],{"class":3665},[3434,18704,3711],{"class":3669},[3434,18706,3714],{"class":3458},[3434,18708,3689],{"class":3451},[3434,18710,3719],{"class":3692},[3434,18712,3676],{"class":3665},[3434,18714,18715,18717,18719],{"class":3436,"line":3491},[3434,18716,4009],{"class":3665},[3434,18718,3728],{"class":3669},[3434,18720,3676],{"class":3665},[3434,18722,18723,18725,18727],{"class":3436,"line":3498},[3434,18724,11917],{"class":3734},[3434,18726,10849],{"class":5682},[3434,18728,10855],{"class":3734},[3434,18730,18731,18733,18735,18737,18739,18741,18743,18745,18747],{"class":3436,"line":3504},[3434,18732,11926],{"class":5682},[3434,18734,17954],{"class":5644},[3434,18736,6077],{"class":3451},[3434,18738,10863],{"class":5644},[3434,18740,4726],{"class":3734},[3434,18742,10868],{"class":3465},[3434,18744,3469],{"class":3734},[3434,18746,11941],{"class":5655},[3434,18748,6409],{"class":3734},[3434,18750,18751,18753,18755,18757,18759,18761,18763,18765,18767,18769],{"class":3436,"line":3511},[3434,18752,11926],{"class":5682},[3434,18754,17975],{"class":5644},[3434,18756,6077],{"class":3451},[3434,18758,10921],{"class":5644},[3434,18760,4726],{"class":3734},[3434,18762,10926],{"class":3465},[3434,18764,3469],{"class":3734},[3434,18766,10931],{"class":5655},[3434,18768,5659],{"class":3734},[3434,18770,10936],{"class":5644},[3434,18772,18773,18775,18777,18779,18781,18783,18785,18787,18789,18791,18793,18795,18797,18799,18801,18803,18805,18807,18809,18811,18813,18815],{"class":3436,"line":3529},[3434,18774,11541],{"class":5199},[3434,18776,11004],{"class":3734},[3434,18778,18000],{"class":5644},[3434,18780,11979],{"class":3451},[3434,18782,11982],{"class":5655},[3434,18784,11985],{"class":3451},[3434,18786,11004],{"class":3734},[3434,18788,11990],{"class":3451},[3434,18790,18000],{"class":5644},[3434,18792,11995],{"class":3451},[3434,18794,17975],{"class":5644},[3434,18796,18019],{"class":3734},[3434,18798,5645],{"class":5644},[3434,18800,4726],{"class":3734},[3434,18802,6393],{"class":5644},[3434,18804,4726],{"class":3734},[3434,18806,5662],{"class":5644},[3434,18808,4726],{"class":3734},[3434,18810,6402],{"class":3465},[3434,18812,3469],{"class":3734},[3434,18814,5672],{"class":5655},[3434,18816,6409],{"class":3734},[3434,18818,18819],{"class":3436,"line":3810},[3434,18820,12035],{"class":3734},[3434,18822,18823,18825,18827],{"class":3436,"line":3816},[3434,18824,4687],{"class":3665},[3434,18826,3728],{"class":3669},[3434,18828,3676],{"class":3665},[3434,18830,18831,18833,18835,18837,18839,18841,18843,18845],{"class":3436,"line":3821},[3434,18832,4009],{"class":3665},[3434,18834,3728],{"class":3669},[3434,18836,3731],{"class":3458},[3434,18838,3689],{"class":3734},[3434,18840,6565],{"class":3692},[3434,18842,3740],{"class":3665},[3434,18844,3728],{"class":3669},[3434,18846,3676],{"class":3665},[3434,18848,18849,18851,18853,18855,18857,18859],{"class":3436,"line":3829},[3434,18850,4009],{"class":3665},[3434,18852,3776],{"class":3669},[3434,18854,6580],{"class":3458},[3434,18856,3689],{"class":3734},[3434,18858,6585],{"class":3692},[3434,18860,3676],{"class":3665},[3434,18862,18863,18865],{"class":3436,"line":3835},[3434,18864,6592],{"class":5199},[3434,18866,5527],{"class":3734},[3434,18868,18869],{"class":3436,"line":3857},[3434,18870,3495],{"emptyLinePlaceholder":3494},[3434,18872,18873,18875],{"class":3436,"line":3862},[3434,18874,12372],{"class":3447},[3434,18876,3452],{"class":3734},[3434,18878,18879,18882,18884,18886,18888,18890,18892,18894],{"class":3436,"line":3867},[3434,18880,18881],{"class":3458},"            --c-bg",[3434,18883,8903],{"class":3734},[3434,18885,3466],{"class":3465},[3434,18887,3469],{"class":3734},[3434,18889,14996],{"class":3472},[3434,18891,14999],{"class":3472},[3434,18893,4783],{"class":3472},[3434,18895,3482],{"class":3734},[3434,18897,18898,18901,18903,18905,18907,18909,18911,18913],{"class":3436,"line":3873},[3434,18899,18900],{"class":3458},"            --c-surface",[3434,18902,8153],{"class":3734},[3434,18904,3466],{"class":3465},[3434,18906,3469],{"class":3734},[3434,18908,8160],{"class":3472},[3434,18910,4757],{"class":3472},[3434,18912,4757],{"class":3472},[3434,18914,3482],{"class":3734},[3434,18916,18917,18920,18922,18924,18926,18928,18930,18932],{"class":3436,"line":3881},[3434,18918,18919],{"class":3458},"            --c-text",[3434,18921,8133],{"class":3734},[3434,18923,3466],{"class":3465},[3434,18925,3469],{"class":3734},[3434,18927,9473],{"class":3472},[3434,18929,5233],{"class":3472},[3434,18931,7506],{"class":3472},[3434,18933,3482],{"class":3734},[3434,18935,18936,18939,18941,18943,18945,18947,18949,18951],{"class":3436,"line":3898},[3434,18937,18938],{"class":3458},"            --c-muted",[3434,18940,8200],{"class":3734},[3434,18942,3466],{"class":3465},[3434,18944,3469],{"class":3734},[3434,18946,9494],{"class":3472},[3434,18948,9497],{"class":3472},[3434,18950,4783],{"class":3472},[3434,18952,3482],{"class":3734},[3434,18954,18955,18958,18960,18962,18964,18966,18968,18970],{"class":3436,"line":3903},[3434,18956,18957],{"class":3458},"            --c-border",[3434,18959,8246],{"class":3734},[3434,18961,3466],{"class":3465},[3434,18963,3469],{"class":3734},[3434,18965,9516],{"class":3472},[3434,18967,9519],{"class":3472},[3434,18969,4783],{"class":3472},[3434,18971,3482],{"class":3734},[3434,18973,18974,18977,18979,18981,18983,18985,18987,18989],{"class":3436,"line":3911},[3434,18975,18976],{"class":3458},"            --c-accent",[3434,18978,8246],{"class":3734},[3434,18980,3466],{"class":3465},[3434,18982,3469],{"class":3734},[3434,18984,3589],{"class":3472},[3434,18986,3592],{"class":3472},[3434,18988,3595],{"class":3472},[3434,18990,3482],{"class":3734},[3434,18992,18993,18996,18998,19000,19002,19004,19006,19008],{"class":3436,"line":3927},[3434,18994,18995],{"class":3458},"            --c-accent-h",[3434,18997,3462],{"class":3734},[3434,18999,3466],{"class":3465},[3434,19001,3469],{"class":3734},[3434,19003,15110],{"class":3472},[3434,19005,15113],{"class":3472},[3434,19007,7638],{"class":3472},[3434,19009,3482],{"class":3734},[3434,19011,19012,19015,19017,19019,19021,19023,19025,19027],{"class":3436,"line":3932},[3434,19013,19014],{"class":3458},"            --c-accent-l",[3434,19016,3462],{"class":3734},[3434,19018,3466],{"class":3465},[3434,19020,3469],{"class":3734},[3434,19022,15132],{"class":3472},[3434,19024,15135],{"class":3472},[3434,19026,7557],{"class":3472},[3434,19028,3482],{"class":3734},[3434,19030,19031],{"class":3436,"line":3940},[3434,19032,6137],{"class":3734},[3434,19034,19035,19037],{"class":3436,"line":3956},[3434,19036,12482],{"class":3447},[3434,19038,3452],{"class":3734},[3434,19040,19041,19043,19045,19047,19049,19051,19053,19055],{"class":3436,"line":3961},[3434,19042,18881],{"class":3458},[3434,19044,8903],{"class":3734},[3434,19046,3466],{"class":3465},[3434,19048,3469],{"class":3734},[3434,19050,8622],{"class":3472},[3434,19052,8625],{"class":3472},[3434,19054,7527],{"class":3472},[3434,19056,3482],{"class":3734},[3434,19058,19059,19061,19063,19065,19067,19069,19071,19073],{"class":3436,"line":3971},[3434,19060,18900],{"class":3458},[3434,19062,8153],{"class":3734},[3434,19064,3466],{"class":3465},[3434,19066,3469],{"class":3734},[3434,19068,8645],{"class":3472},[3434,19070,8648],{"class":3472},[3434,19072,7527],{"class":3472},[3434,19074,3482],{"class":3734},[3434,19076,19077,19079,19081,19083,19085,19087,19089,19091],{"class":3436,"line":3980},[3434,19078,18919],{"class":3458},[3434,19080,8133],{"class":3734},[3434,19082,3466],{"class":3465},[3434,19084,3469],{"class":3734},[3434,19086,9432],{"class":3472},[3434,19088,9435],{"class":3472},[3434,19090,4804],{"class":3472},[3434,19092,3482],{"class":3734},[3434,19094,19095,19097,19099,19101,19103,19105,19107,19109],{"class":3436,"line":4006},[3434,19096,18938],{"class":3458},[3434,19098,8200],{"class":3734},[3434,19100,3466],{"class":3465},[3434,19102,3469],{"class":3734},[3434,19104,9619],{"class":3472},[3434,19106,9622],{"class":3472},[3434,19108,4783],{"class":3472},[3434,19110,3482],{"class":3734},[3434,19112,19113,19115,19117,19119,19121,19123,19125,19127],{"class":3436,"line":4024},[3434,19114,18957],{"class":3458},[3434,19116,8246],{"class":3734},[3434,19118,3466],{"class":3465},[3434,19120,3469],{"class":3734},[3434,19122,8839],{"class":3472},[3434,19124,8671],{"class":3472},[3434,19126,4783],{"class":3472},[3434,19128,3482],{"class":3734},[3434,19130,19131,19133,19135,19137,19139,19141,19143,19145],{"class":3436,"line":4051},[3434,19132,18976],{"class":3458},[3434,19134,8246],{"class":3734},[3434,19136,3466],{"class":3465},[3434,19138,3469],{"class":3734},[3434,19140,9658],{"class":3472},[3434,19142,9661],{"class":3472},[3434,19144,7638],{"class":3472},[3434,19146,3482],{"class":3734},[3434,19148,19149,19151,19153,19155,19157,19159,19161,19163],{"class":3436,"line":4057},[3434,19150,18995],{"class":3458},[3434,19152,3462],{"class":3734},[3434,19154,3466],{"class":3465},[3434,19156,3469],{"class":3734},[3434,19158,17214],{"class":3472},[3434,19160,17217],{"class":3472},[3434,19162,7597],{"class":3472},[3434,19164,3482],{"class":3734},[3434,19166,19167,19169,19171,19173,19175,19177,19179,19181],{"class":3436,"line":4073},[3434,19168,19014],{"class":3458},[3434,19170,3462],{"class":3734},[3434,19172,3466],{"class":3465},[3434,19174,3469],{"class":3734},[3434,19176,8939],{"class":3472},[3434,19178,8942],{"class":3472},[3434,19180,7757],{"class":3472},[3434,19182,3482],{"class":3734},[3434,19184,19185],{"class":3436,"line":4079},[3434,19186,6137],{"class":3734},[3434,19188,19189,19191,19194,19196,19199],{"class":3436,"line":4096},[3434,19190,15257],{"class":3734},[3434,19192,19193],{"class":3458},"data-brand",[3434,19195,3689],{"class":3451},[3434,19197,19198],{"class":5655},"\"teal\"",[3434,19200,13904],{"class":3734},[3434,19202,19203,19205,19207,19209,19211,19214,19217,19220],{"class":3436,"line":4113},[3434,19204,18976],{"class":3458},[3434,19206,8246],{"class":3734},[3434,19208,3466],{"class":3465},[3434,19210,3469],{"class":3734},[3434,19212,19213],{"class":3472},"0.600",[3434,19215,19216],{"class":3472}," 0.168",[3434,19218,19219],{"class":3472}," 194",[3434,19221,3482],{"class":3734},[3434,19223,19224,19226,19228,19230,19232,19234,19237,19240],{"class":3436,"line":4119},[3434,19225,18995],{"class":3458},[3434,19227,3462],{"class":3734},[3434,19229,3466],{"class":3465},[3434,19231,3469],{"class":3734},[3434,19233,15110],{"class":3472},[3434,19235,19236],{"class":3472}," 0.158",[3434,19238,19239],{"class":3472}," 196",[3434,19241,3482],{"class":3734},[3434,19243,19244,19246,19248,19250,19252,19255,19258,19261],{"class":3436,"line":4129},[3434,19245,19014],{"class":3458},[3434,19247,3462],{"class":3734},[3434,19249,3466],{"class":3465},[3434,19251,3469],{"class":3734},[3434,19253,19254],{"class":3472},"0.953",[3434,19256,19257],{"class":3472}," 0.051",[3434,19259,19260],{"class":3472}," 193",[3434,19262,3482],{"class":3734},[3434,19264,19265],{"class":3436,"line":4145},[3434,19266,6137],{"class":3734},[3434,19268,19269,19271,19273,19275,19278],{"class":3436,"line":4162},[3434,19270,15257],{"class":3734},[3434,19272,19193],{"class":3458},[3434,19274,3689],{"class":3451},[3434,19276,19277],{"class":5655},"\"amber\"",[3434,19279,13904],{"class":3734},[3434,19281,19282,19284,19286,19288,19290,19293,19295,19297],{"class":3436,"line":4168},[3434,19283,18976],{"class":3458},[3434,19285,8246],{"class":3734},[3434,19287,3466],{"class":3465},[3434,19289,3469],{"class":3734},[3434,19291,19292],{"class":3472},"0.769",[3434,19294,14353],{"class":3472},[3434,19296,7914],{"class":3472},[3434,19298,3482],{"class":3734},[3434,19300,19301,19303,19305,19307,19309,19312,19315,19318],{"class":3436,"line":4178},[3434,19302,18995],{"class":3458},[3434,19304,3462],{"class":3734},[3434,19306,3466],{"class":3465},[3434,19308,3469],{"class":3734},[3434,19310,19311],{"class":3472},"0.666",[3434,19313,19314],{"class":3472}," 0.179",[3434,19316,19317],{"class":3472}," 58",[3434,19319,3482],{"class":3734},[3434,19321,19322,19324,19326,19328,19330,19333,19335,19338],{"class":3436,"line":4187},[3434,19323,19014],{"class":3458},[3434,19325,3462],{"class":3734},[3434,19327,3466],{"class":3465},[3434,19329,3469],{"class":3734},[3434,19331,19332],{"class":3472},"0.987",[3434,19334,8717],{"class":3472},[3434,19336,19337],{"class":3472}," 95",[3434,19339,3482],{"class":3734},[3434,19341,19342],{"class":3436,"line":4213},[3434,19343,6137],{"class":3734},[3434,19345,19346,19348,19350,19352,19354],{"class":3436,"line":4238},[3434,19347,15257],{"class":3734},[3434,19349,19193],{"class":3458},[3434,19351,3689],{"class":3451},[3434,19353,14264],{"class":5655},[3434,19355,13904],{"class":3734},[3434,19357,19358,19360,19362,19364,19366,19368,19370,19372],{"class":3436,"line":4247},[3434,19359,18976],{"class":3458},[3434,19361,8246],{"class":3734},[3434,19363,3466],{"class":3465},[3434,19365,3469],{"class":3734},[3434,19367,14279],{"class":3472},[3434,19369,14282],{"class":3472},[3434,19371,14285],{"class":3472},[3434,19373,3482],{"class":3734},[3434,19375,19376,19378,19380,19382,19384,19386,19388,19390],{"class":3436,"line":4256},[3434,19377,18995],{"class":3458},[3434,19379,3462],{"class":3734},[3434,19381,3466],{"class":3465},[3434,19383,3469],{"class":3734},[3434,19385,14303],{"class":3472},[3434,19387,14306],{"class":3472},[3434,19389,8040],{"class":3472},[3434,19391,3482],{"class":3734},[3434,19393,19394,19396,19398,19400,19402,19404,19406,19408],{"class":3436,"line":4272},[3434,19395,19014],{"class":3458},[3434,19397,3462],{"class":3734},[3434,19399,3466],{"class":3465},[3434,19401,3469],{"class":3734},[3434,19403,14326],{"class":3472},[3434,19405,14329],{"class":3472},[3434,19407,14332],{"class":3472},[3434,19409,3482],{"class":3734},[3434,19411,19412],{"class":3436,"line":4288},[3434,19413,6137],{"class":3734},[3434,19415,19416,19419],{"class":3436,"line":4319},[3434,19417,19418],{"class":3447},"        body",[3434,19420,3452],{"class":3734},[3434,19422,19423,19426,19428,19430,19432,19435],{"class":3436,"line":4328},[3434,19424,19425],{"class":3458},"            background-color",[3434,19427,3462],{"class":3734},[3434,19429,3519],{"class":3465},[3434,19431,3469],{"class":3734},[3434,19433,19434],{"class":3458},"--c-bg",[3434,19436,3482],{"class":3734},[3434,19438,19439,19442,19444,19446,19448,19451],{"class":3436,"line":4337},[3434,19440,19441],{"class":3458},"            color",[3434,19443,3462],{"class":3734},[3434,19445,3519],{"class":3465},[3434,19447,3469],{"class":3734},[3434,19449,19450],{"class":3458},"--c-text",[3434,19452,3482],{"class":3734},[3434,19454,19455,19458,19460,19463,19465,19467,19470],{"class":3436,"line":4354},[3434,19456,19457],{"class":3458},"            transition",[3434,19459,17614],{"class":3734},[3434,19461,19462],{"class":3472},".25s",[3434,19464,7250],{"class":3734},[3434,19466,13515],{"class":17503},[3434,19468,19469],{"class":3472}," .25s",[3434,19471,6132],{"class":3734},[3434,19473,19474],{"class":3436,"line":4360},[3434,19475,6137],{"class":3734},[3434,19477,19478,19480,19482],{"class":3436,"line":4369},[3434,19479,4687],{"class":3665},[3434,19481,3776],{"class":3669},[3434,19483,3676],{"class":3665},[3434,19485,19486,19488,19490],{"class":3436,"line":4379},[3434,19487,3964],{"class":3665},[3434,19489,3702],{"class":3669},[3434,19491,3676],{"class":3665},[3434,19493,19494,19496,19498,19500,19502,19505],{"class":3436,"line":4384},[3434,19495,3681],{"class":3665},[3434,19497,3985],{"class":3669},[3434,19499,3996],{"class":3458},[3434,19501,3689],{"class":3451},[3434,19503,19504],{"class":3692},"\"font-family: system-ui, sans-serif; min-height: 100vh; padding: 1.5rem;\"",[3434,19506,3676],{"class":3665},[3434,19508,19509],{"class":3436,"line":4390},[3434,19510,3495],{"emptyLinePlaceholder":3494},[3434,19512,19513],{"class":3436,"line":4406},[3434,19514,19515],{"class":3440},"\u003C!-- ===== NAVBAR ===== -->\n",[3434,19517,19518,19520,19523,19525,19527],{"class":3436,"line":4422},[3434,19519,3681],{"class":3665},[3434,19521,19522],{"class":3669},"nav",[3434,19524,3996],{"class":3458},[3434,19526,3689],{"class":3451},[3434,19528,19529],{"class":3692},"\"display:flex; align-items:center; justify-content:space-between; margin-bottom:2rem;\n",[3434,19531,19532],{"class":3436,"line":4428},[3434,19533,19534],{"class":3692},"            background:var(--c-surface); border:1px solid var(--c-border);\n",[3434,19536,19537,19540],{"class":3436,"line":4437},[3434,19538,19539],{"class":3692},"            border-radius:.875rem; padding:.75rem 1.25rem;\"",[3434,19541,3676],{"class":3665},[3434,19543,19544],{"class":3436,"line":4452},[3434,19545,19546],{"class":3440},"    \u003C!-- Лого -->\n",[3434,19548,19549,19551,19553,19555,19557,19560],{"class":3436,"line":4467},[3434,19550,4009],{"class":3665},[3434,19552,4012],{"class":3669},[3434,19554,3996],{"class":3458},[3434,19556,3689],{"class":3451},[3434,19558,19559],{"class":3692},"\"display:flex; align-items:center; gap:.625rem;\"",[3434,19561,3676],{"class":3665},[3434,19563,19564,19566,19568,19570,19572],{"class":3436,"line":4473},[3434,19565,4027],{"class":3665},[3434,19567,4012],{"class":3669},[3434,19569,3996],{"class":3458},[3434,19571,3689],{"class":3451},[3434,19573,19574],{"class":3692},"\"width:2rem; height:2rem; background:var(--c-accent); border-radius:.5rem;\n",[3434,19576,19577],{"class":3436,"line":4482},[3434,19578,19579],{"class":3692},"                    display:flex; align-items:center; justify-content:center; color:white;\n",[3434,19581,19582,19585,19587,19590,19592,19594],{"class":3436,"line":4491},[3434,19583,19584],{"class":3692},"                    font-size:.75rem; font-weight:800;\"",[3434,19586,4039],{"class":3665},[3434,19588,19589],{"class":3451},"K",[3434,19591,3964],{"class":3665},[3434,19593,4012],{"class":3669},[3434,19595,3676],{"class":3665},[3434,19597,19598,19600,19602,19604,19606,19609,19611,19614,19616,19618],{"class":3436,"line":4515},[3434,19599,4027],{"class":3665},[3434,19601,3434],{"class":3669},[3434,19603,3996],{"class":3458},[3434,19605,3689],{"class":3451},[3434,19607,19608],{"class":3692},"\"font-weight:800; font-size:.9rem; color:var(--c-text);\"",[3434,19610,4039],{"class":3665},[3434,19612,19613],{"class":3451},"kostyl.dev",[3434,19615,3964],{"class":3665},[3434,19617,3434],{"class":3669},[3434,19619,3676],{"class":3665},[3434,19621,19622,19624,19626],{"class":3436,"line":4539},[3434,19623,4687],{"class":3665},[3434,19625,4012],{"class":3669},[3434,19627,3676],{"class":3665},[3434,19629,19630],{"class":3436,"line":4548},[3434,19631,3495],{"emptyLinePlaceholder":3494},[3434,19633,19634],{"class":3436,"line":4557},[3434,19635,19636],{"class":3440},"    \u003C!-- Панель керування темою -->\n",[3434,19638,19639,19641,19643,19645,19647,19650],{"class":3436,"line":4572},[3434,19640,4009],{"class":3665},[3434,19642,4012],{"class":3669},[3434,19644,3996],{"class":3458},[3434,19646,3689],{"class":3451},[3434,19648,19649],{"class":3692},"\"display:flex; align-items:center; gap:.5rem;\"",[3434,19651,3676],{"class":3665},[3434,19653,19654],{"class":3436,"line":4587},[3434,19655,19656],{"class":3440},"        \u003C!-- Вибір бренду -->\n",[3434,19658,19659,19661,19663,19665,19667,19670],{"class":3436,"line":4617},[3434,19660,4027],{"class":3665},[3434,19662,4012],{"class":3669},[3434,19664,3996],{"class":3458},[3434,19666,3689],{"class":3451},[3434,19668,19669],{"class":3692},"\"display:flex; gap:.25rem; padding:.2rem; background:var(--c-bg); border-radius:999px;\"",[3434,19671,3676],{"class":3665},[3434,19673,19674,19676,19678,19680,19682,19684,19687,19689,19692,19694,19697,19699],{"class":3436,"line":4626},[3434,19675,4082],{"class":3665},[3434,19677,4342],{"class":3669},[3434,19679,5636],{"class":3458},[3434,19681,3689],{"class":3451},[3434,19683,5641],{"class":3692},[3434,19685,19686],{"class":3465},"setBrand",[3434,19688,3469],{"class":3692},[3434,19690,19691],{"class":5682},"null",[3434,19693,5686],{"class":3692},[3434,19695,19696],{"class":3458}," title",[3434,19698,3689],{"class":3451},[3434,19700,19701],{"class":3692},"\"Indigo (default)\"\n",[3434,19703,19704,19707,19709],{"class":3436,"line":4635},[3434,19705,19706],{"class":3458},"                    style",[3434,19708,3689],{"class":3451},[3434,19710,19711],{"class":3692},"\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.585 0.233 277);\n",[3434,19713,19714],{"class":3436,"line":4650},[3434,19715,19716],{"class":3692},"                           border:2px solid transparent; cursor:pointer; transition:all .15s;\"\n",[3434,19718,19719,19722,19724,19726,19728,19730,19732,19734,19737,19739,19742,19744,19747,19749,19751,19753,19755,19757,19759,19761,19763,19766,19768,19770,19772],{"class":3436,"line":4656},[3434,19720,19721],{"class":3458},"                    onmouseover",[3434,19723,3689],{"class":3451},[3434,19725,5641],{"class":3692},[3434,19727,5683],{"class":5682},[3434,19729,4726],{"class":3692},[3434,19731,3776],{"class":5644},[3434,19733,4726],{"class":3692},[3434,19735,19736],{"class":5644},"borderColor",[3434,19738,3689],{"class":3451},[3434,19740,19741],{"class":5655},"'white'",[3434,19743,5641],{"class":3692},[3434,19745,19746],{"class":3458}," onmouseout",[3434,19748,3689],{"class":3451},[3434,19750,5641],{"class":3692},[3434,19752,5683],{"class":5682},[3434,19754,4726],{"class":3692},[3434,19756,3776],{"class":5644},[3434,19758,4726],{"class":3692},[3434,19760,19736],{"class":5644},[3434,19762,3689],{"class":3451},[3434,19764,19765],{"class":5655},"'transparent'",[3434,19767,5641],{"class":3692},[3434,19769,3740],{"class":3665},[3434,19771,4342],{"class":3669},[3434,19773,3676],{"class":3665},[3434,19775,19776,19778,19780,19782,19784,19786,19788,19790,19793,19795,19797,19799],{"class":3436,"line":4665},[3434,19777,4082],{"class":3665},[3434,19779,4342],{"class":3669},[3434,19781,5636],{"class":3458},[3434,19783,3689],{"class":3451},[3434,19785,5641],{"class":3692},[3434,19787,19686],{"class":3465},[3434,19789,3469],{"class":3692},[3434,19791,19792],{"class":5655},"'teal'",[3434,19794,5686],{"class":3692},[3434,19796,19696],{"class":3458},[3434,19798,3689],{"class":3451},[3434,19800,19801],{"class":3692},"\"Teal\"\n",[3434,19803,19804,19806,19808],{"class":3436,"line":4674},[3434,19805,19706],{"class":3458},[3434,19807,3689],{"class":3451},[3434,19809,19810],{"class":3692},"\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.600 0.168 194);\n",[3434,19812,19813],{"class":3436,"line":4684},[3434,19814,19716],{"class":3692},[3434,19816,19817,19819,19821,19823,19825,19827,19829,19831,19833,19835,19837,19839,19841,19843,19845,19847,19849,19851,19853,19855,19857,19859,19861,19863,19865],{"class":3436,"line":4694},[3434,19818,19721],{"class":3458},[3434,19820,3689],{"class":3451},[3434,19822,5641],{"class":3692},[3434,19824,5683],{"class":5682},[3434,19826,4726],{"class":3692},[3434,19828,3776],{"class":5644},[3434,19830,4726],{"class":3692},[3434,19832,19736],{"class":5644},[3434,19834,3689],{"class":3451},[3434,19836,19741],{"class":5655},[3434,19838,5641],{"class":3692},[3434,19840,19746],{"class":3458},[3434,19842,3689],{"class":3451},[3434,19844,5641],{"class":3692},[3434,19846,5683],{"class":5682},[3434,19848,4726],{"class":3692},[3434,19850,3776],{"class":5644},[3434,19852,4726],{"class":3692},[3434,19854,19736],{"class":5644},[3434,19856,3689],{"class":3451},[3434,19858,19765],{"class":5655},[3434,19860,5641],{"class":3692},[3434,19862,3740],{"class":3665},[3434,19864,4342],{"class":3669},[3434,19866,3676],{"class":3665},[3434,19868,19869,19871,19873,19875,19877,19879,19881,19883,19886,19888,19890,19892],{"class":3436,"line":4703},[3434,19870,4082],{"class":3665},[3434,19872,4342],{"class":3669},[3434,19874,5636],{"class":3458},[3434,19876,3689],{"class":3451},[3434,19878,5641],{"class":3692},[3434,19880,19686],{"class":3465},[3434,19882,3469],{"class":3692},[3434,19884,19885],{"class":5655},"'amber'",[3434,19887,5686],{"class":3692},[3434,19889,19696],{"class":3458},[3434,19891,3689],{"class":3451},[3434,19893,19894],{"class":3692},"\"Amber\"\n",[3434,19896,19897,19899,19901],{"class":3436,"line":10438},[3434,19898,19706],{"class":3458},[3434,19900,3689],{"class":3451},[3434,19902,19903],{"class":3692},"\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.769 0.188 70);\n",[3434,19905,19906],{"class":3436,"line":11434},[3434,19907,19716],{"class":3692},[3434,19909,19910,19912,19914,19916,19918,19920,19922,19924,19926,19928,19930,19932,19934,19936,19938,19940,19942,19944,19946,19948,19950,19952,19954,19956,19958],{"class":3436,"line":11439},[3434,19911,19721],{"class":3458},[3434,19913,3689],{"class":3451},[3434,19915,5641],{"class":3692},[3434,19917,5683],{"class":5682},[3434,19919,4726],{"class":3692},[3434,19921,3776],{"class":5644},[3434,19923,4726],{"class":3692},[3434,19925,19736],{"class":5644},[3434,19927,3689],{"class":3451},[3434,19929,19741],{"class":5655},[3434,19931,5641],{"class":3692},[3434,19933,19746],{"class":3458},[3434,19935,3689],{"class":3451},[3434,19937,5641],{"class":3692},[3434,19939,5683],{"class":5682},[3434,19941,4726],{"class":3692},[3434,19943,3776],{"class":5644},[3434,19945,4726],{"class":3692},[3434,19947,19736],{"class":5644},[3434,19949,3689],{"class":3451},[3434,19951,19765],{"class":5655},[3434,19953,5641],{"class":3692},[3434,19955,3740],{"class":3665},[3434,19957,4342],{"class":3669},[3434,19959,3676],{"class":3665},[3434,19961,19962,19964,19966,19968,19970,19972,19974,19976,19978,19980,19982,19984],{"class":3436,"line":11445},[3434,19963,4082],{"class":3665},[3434,19965,4342],{"class":3669},[3434,19967,5636],{"class":3458},[3434,19969,3689],{"class":3451},[3434,19971,5641],{"class":3692},[3434,19973,19686],{"class":3465},[3434,19975,3469],{"class":3692},[3434,19977,15852],{"class":5655},[3434,19979,5686],{"class":3692},[3434,19981,19696],{"class":3458},[3434,19983,3689],{"class":3451},[3434,19985,19986],{"class":3692},"\"Rose\"\n",[3434,19988,19989,19991,19993],{"class":3436,"line":11451},[3434,19990,19706],{"class":3458},[3434,19992,3689],{"class":3451},[3434,19994,19995],{"class":3692},"\"width:1.25rem; height:1.25rem; border-radius:50%; background:oklch(0.645 0.246 16);\n",[3434,19997,19998],{"class":3436,"line":11456},[3434,19999,19716],{"class":3692},[3434,20001,20002,20004,20006,20008,20010,20012,20014,20016,20018,20020,20022,20024,20026,20028,20030,20032,20034,20036,20038,20040,20042,20044,20046,20048,20050],{"class":3436,"line":11466},[3434,20003,19721],{"class":3458},[3434,20005,3689],{"class":3451},[3434,20007,5641],{"class":3692},[3434,20009,5683],{"class":5682},[3434,20011,4726],{"class":3692},[3434,20013,3776],{"class":5644},[3434,20015,4726],{"class":3692},[3434,20017,19736],{"class":5644},[3434,20019,3689],{"class":3451},[3434,20021,19741],{"class":5655},[3434,20023,5641],{"class":3692},[3434,20025,19746],{"class":3458},[3434,20027,3689],{"class":3451},[3434,20029,5641],{"class":3692},[3434,20031,5683],{"class":5682},[3434,20033,4726],{"class":3692},[3434,20035,3776],{"class":5644},[3434,20037,4726],{"class":3692},[3434,20039,19736],{"class":5644},[3434,20041,3689],{"class":3451},[3434,20043,19765],{"class":5655},[3434,20045,5641],{"class":3692},[3434,20047,3740],{"class":3665},[3434,20049,4342],{"class":3669},[3434,20051,3676],{"class":3665},[3434,20053,20054,20056,20058],{"class":3436,"line":11479},[3434,20055,4677],{"class":3665},[3434,20057,4012],{"class":3669},[3434,20059,3676],{"class":3665},[3434,20061,20062],{"class":3436,"line":11484},[3434,20063,3495],{"emptyLinePlaceholder":3494},[3434,20065,20066],{"class":3436,"line":11490},[3434,20067,20068],{"class":3440},"        \u003C!-- Роздільник -->\n",[3434,20070,20071,20073,20075,20077,20079,20082,20084,20086],{"class":3436,"line":11496},[3434,20072,4027],{"class":3665},[3434,20074,4012],{"class":3669},[3434,20076,3996],{"class":3458},[3434,20078,3689],{"class":3451},[3434,20080,20081],{"class":3692},"\"width:1px; height:1.25rem; background:var(--c-border);\"",[3434,20083,3740],{"class":3665},[3434,20085,4012],{"class":3669},[3434,20087,3676],{"class":3665},[3434,20089,20090],{"class":3436,"line":11512},[3434,20091,3495],{"emptyLinePlaceholder":3494},[3434,20093,20094],{"class":3436,"line":11538},[3434,20095,20096],{"class":3440},"        \u003C!-- Перемикач dark\u002Flight -->\n",[3434,20098,20099,20101,20103,20105,20107,20110,20112,20114,20116,20119],{"class":3436,"line":11552},[3434,20100,4027],{"class":3665},[3434,20102,4342],{"class":3669},[3434,20104,5740],{"class":3458},[3434,20106,3689],{"class":3451},[3434,20108,20109],{"class":3692},"\"dark-btn\"",[3434,20111,5636],{"class":3458},[3434,20113,3689],{"class":3451},[3434,20115,5641],{"class":3692},[3434,20117,20118],{"class":3465},"toggleDark",[3434,20120,20121],{"class":3692},"()\"\n",[3434,20123,20124,20127,20129],{"class":3436,"line":11577},[3434,20125,20126],{"class":3458},"                style",[3434,20128,3689],{"class":3451},[3434,20130,20131],{"class":3692},"\"width:2rem; height:2rem; border-radius:50%; background:var(--c-bg);\n",[3434,20133,20134],{"class":3436,"line":11583},[3434,20135,20136],{"class":3692},"                       border:1px solid var(--c-border); cursor:pointer; font-size:.875rem;\n",[3434,20138,20139,20142],{"class":3436,"line":11589},[3434,20140,20141],{"class":3692},"                       display:flex; align-items:center; justify-content:center; transition:all .15s;\"",[3434,20143,3676],{"class":3665},[3434,20145,20146,20148,20150],{"class":3436,"line":11594},[3434,20147,4677],{"class":3665},[3434,20149,4342],{"class":3669},[3434,20151,3676],{"class":3665},[3434,20153,20154,20156,20158],{"class":3436,"line":11599},[3434,20155,4687],{"class":3665},[3434,20157,4012],{"class":3669},[3434,20159,3676],{"class":3665},[3434,20161,20162,20164,20166],{"class":3436,"line":11605},[3434,20163,3964],{"class":3665},[3434,20165,19522],{"class":3669},[3434,20167,3676],{"class":3665},[3434,20169,20170],{"class":3436,"line":13402},[3434,20171,3495],{"emptyLinePlaceholder":3494},[3434,20173,20174],{"class":3436,"line":13431},[3434,20175,20176],{"class":3440},"\u003C!-- ===== HERO ===== -->\n",[3434,20178,20179,20181,20184,20186,20188,20191],{"class":3436,"line":13459},[3434,20180,3681],{"class":3665},[3434,20182,20183],{"class":3669},"header",[3434,20185,3996],{"class":3458},[3434,20187,3689],{"class":3451},[3434,20189,20190],{"class":3692},"\"text-align:center; padding:2rem 1rem 2.5rem; max-width:36rem; margin:0 auto 2.5rem;\"",[3434,20192,3676],{"class":3665},[3434,20194,20195,20197,20199,20201,20203],{"class":3436,"line":13504},[3434,20196,4009],{"class":3665},[3434,20198,3353],{"class":3669},[3434,20200,3996],{"class":3458},[3434,20202,3689],{"class":3451},[3434,20204,20205],{"class":3692},"\"font-size:.75rem; font-weight:700; text-transform:uppercase; letter-spacing:.1em;\n",[3434,20207,20208,20211,20213,20216,20218,20220],{"class":3436,"line":13531},[3434,20209,20210],{"class":3692},"              color:var(--c-accent); margin-bottom:.75rem;\"",[3434,20212,4039],{"class":3665},[3434,20214,20215],{"class":3451},"Tailwind CSS v4",[3434,20217,3964],{"class":3665},[3434,20219,3353],{"class":3669},[3434,20221,3676],{"class":3665},[3434,20223,20224,20226,20228,20230,20232],{"class":3436,"line":13536},[3434,20225,4009],{"class":3665},[3434,20227,3344],{"class":3669},[3434,20229,3996],{"class":3458},[3434,20231,3689],{"class":3451},[3434,20233,20234],{"class":3692},"\"font-size:2rem; font-weight:900; line-height:1.15; letter-spacing:-.03em;\n",[3434,20236,20237,20240],{"class":3436,"line":13541},[3434,20238,20239],{"class":3692},"               color:var(--c-text); margin-bottom:1rem; text-wrap:balance;\"",[3434,20241,3676],{"class":3665},[3434,20243,20244],{"class":3436,"line":13546},[3434,20245,20246],{"class":3451},"        Система дизайн-токенів та темна тема\n",[3434,20248,20249,20251,20253],{"class":3436,"line":13552},[3434,20250,4687],{"class":3665},[3434,20252,3344],{"class":3669},[3434,20254,3676],{"class":3665},[3434,20256,20257,20259,20261,20263,20265,20268],{"class":3436,"line":13579},[3434,20258,4009],{"class":3665},[3434,20260,3353],{"class":3669},[3434,20262,3996],{"class":3458},[3434,20264,3689],{"class":3451},[3434,20266,20267],{"class":3692},"\"font-size:.9rem; color:var(--c-muted); line-height:1.65; margin-bottom:1.5rem;\"",[3434,20269,3676],{"class":3665},[3434,20271,20272],{"class":3436,"line":13591},[3434,20273,20274],{"class":3451},"        Одна палітра CSS Custom Properties. Нескінченна кількість тем.\n",[3434,20276,20277],{"class":3436,"line":13600},[3434,20278,20279],{"class":3451},"        Нуль дублювання класів у HTML.\n",[3434,20281,20282,20284,20286],{"class":3436,"line":13605},[3434,20283,4687],{"class":3665},[3434,20285,3353],{"class":3669},[3434,20287,3676],{"class":3665},[3434,20289,20290,20292,20294,20296,20298,20301],{"class":3436,"line":13614},[3434,20291,4009],{"class":3665},[3434,20293,4012],{"class":3669},[3434,20295,3996],{"class":3458},[3434,20297,3689],{"class":3451},[3434,20299,20300],{"class":3692},"\"display:flex; gap:.625rem; justify-content:center; flex-wrap:wrap;\"",[3434,20302,3676],{"class":3665},[3434,20304,20305,20307,20309,20311,20313],{"class":3436,"line":16420},[3434,20306,4027],{"class":3665},[3434,20308,4342],{"class":3669},[3434,20310,3996],{"class":3458},[3434,20312,3689],{"class":3451},[3434,20314,20315],{"class":3692},"\"background:var(--c-accent); color:white; font-weight:600;\n",[3434,20317,20318],{"class":3436,"line":16429},[3434,20319,20320],{"class":3692},"                       padding:.6rem 1.5rem; border-radius:.625rem; border:none; cursor:pointer;\n",[3434,20322,20323],{"class":3436,"line":16434},[3434,20324,20325],{"class":3692},"                       font-size:.875rem; transition:background .15s;\"\n",[3434,20327,20328,20331,20333,20335,20337,20339,20341,20343,20345,20347,20350],{"class":3436,"line":16443},[3434,20329,20330],{"class":3458},"                onmouseover",[3434,20332,3689],{"class":3451},[3434,20334,5641],{"class":3692},[3434,20336,5683],{"class":5682},[3434,20338,4726],{"class":3692},[3434,20340,3776],{"class":5644},[3434,20342,4726],{"class":3692},[3434,20344,13470],{"class":5644},[3434,20346,3689],{"class":3451},[3434,20348,20349],{"class":5655},"'var(--c-accent-h)'",[3434,20351,20352],{"class":3692},"\"\n",[3434,20354,20355,20358,20360,20362,20364,20366,20368,20370,20372,20374,20377,20379],{"class":3436,"line":16457},[3434,20356,20357],{"class":3458},"                onmouseout",[3434,20359,3689],{"class":3451},[3434,20361,5641],{"class":3692},[3434,20363,5683],{"class":5682},[3434,20365,4726],{"class":3692},[3434,20367,3776],{"class":5644},[3434,20369,4726],{"class":3692},[3434,20371,13470],{"class":5644},[3434,20373,3689],{"class":3451},[3434,20375,20376],{"class":5655},"'var(--c-accent)'",[3434,20378,5641],{"class":3692},[3434,20380,3676],{"class":3665},[3434,20382,20383],{"class":3436,"line":16480},[3434,20384,20385],{"class":3451},"            Читати далі\n",[3434,20387,20388,20390,20392],{"class":3436,"line":16496},[3434,20389,4677],{"class":3665},[3434,20391,4342],{"class":3669},[3434,20393,3676],{"class":3665},[3434,20395,20396,20398,20400,20402,20404],{"class":3436,"line":16513},[3434,20397,4027],{"class":3665},[3434,20399,4342],{"class":3669},[3434,20401,3996],{"class":3458},[3434,20403,3689],{"class":3451},[3434,20405,20406],{"class":3692},"\"background:var(--c-accent-l); color:var(--c-accent); font-weight:600;\n",[3434,20408,20409],{"class":3436,"line":16522},[3434,20410,20411],{"class":3692},"                       padding:.6rem 1.5rem; border-radius:.625rem; border:1px solid var(--c-border);\n",[3434,20413,20414,20417],{"class":3436,"line":16541},[3434,20415,20416],{"class":3692},"                       cursor:pointer; font-size:.875rem; transition:all .15s;\"",[3434,20418,3676],{"class":3665},[3434,20420,20421],{"class":3436,"line":16546},[3434,20422,20423],{"class":3451},"            Документація\n",[3434,20425,20426,20428,20430],{"class":3436,"line":16551},[3434,20427,4677],{"class":3665},[3434,20429,4342],{"class":3669},[3434,20431,3676],{"class":3665},[3434,20433,20434,20436,20438],{"class":3436,"line":16560},[3434,20435,4687],{"class":3665},[3434,20437,4012],{"class":3669},[3434,20439,3676],{"class":3665},[3434,20441,20442,20444,20446],{"class":3436,"line":16569},[3434,20443,3964],{"class":3665},[3434,20445,20183],{"class":3669},[3434,20447,3676],{"class":3665},[3434,20449,20451],{"class":3436,"line":20450},133,[3434,20452,3495],{"emptyLinePlaceholder":3494},[3434,20454,20456],{"class":3436,"line":20455},134,[3434,20457,20458],{"class":3440},"\u003C!-- ===== FEATURE GRID ===== -->\n",[3434,20460,20462,20464,20466,20468,20470],{"class":3436,"line":20461},135,[3434,20463,3681],{"class":3665},[3434,20465,4012],{"class":3669},[3434,20467,3996],{"class":3458},[3434,20469,3689],{"class":3451},[3434,20471,20472],{"class":3692},"\"display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr));\n",[3434,20474,20476,20479],{"class":3436,"line":20475},136,[3434,20477,20478],{"class":3692},"            gap:1rem; margin-bottom:2rem;\"",[3434,20480,3676],{"class":3665},[3434,20482,20484,20486,20488,20490,20492],{"class":3436,"line":20483},137,[3434,20485,4009],{"class":3665},[3434,20487,4012],{"class":3669},[3434,20489,3996],{"class":3458},[3434,20491,3689],{"class":3451},[3434,20493,20494],{"class":3692},"\"background:var(--c-surface); border:1px solid var(--c-border);\n",[3434,20496,20498],{"class":3436,"line":20497},138,[3434,20499,20500],{"class":3692},"                border-radius:.875rem; padding:1.25rem; transition:all .2s;\"\n",[3434,20502,20504,20507,20509,20511,20513,20515,20517,20519,20521,20523,20525,20527,20529,20531,20533,20535,20538,20540,20543],{"class":3436,"line":20503},139,[3434,20505,20506],{"class":3458},"         onmouseover",[3434,20508,3689],{"class":3451},[3434,20510,5641],{"class":3692},[3434,20512,5683],{"class":5682},[3434,20514,4726],{"class":3692},[3434,20516,3776],{"class":5644},[3434,20518,4726],{"class":3692},[3434,20520,19736],{"class":5644},[3434,20522,3689],{"class":3451},[3434,20524,20376],{"class":5655},[3434,20526,8953],{"class":3692},[3434,20528,5683],{"class":5682},[3434,20530,4726],{"class":3692},[3434,20532,3776],{"class":5644},[3434,20534,4726],{"class":3692},[3434,20536,20537],{"class":5644},"boxShadow",[3434,20539,3689],{"class":3451},[3434,20541,20542],{"class":5655},"'0 4px 20px oklch(from var(--c-accent) l c h \u002F .15)'",[3434,20544,20352],{"class":3692},[3434,20546,20548,20551,20553,20555,20557,20559,20561,20563,20565,20567,20570,20572,20574,20576,20578,20580,20582,20584,20587,20589],{"class":3436,"line":20547},140,[3434,20549,20550],{"class":3458},"         onmouseout",[3434,20552,3689],{"class":3451},[3434,20554,5641],{"class":3692},[3434,20556,5683],{"class":5682},[3434,20558,4726],{"class":3692},[3434,20560,3776],{"class":5644},[3434,20562,4726],{"class":3692},[3434,20564,19736],{"class":5644},[3434,20566,3689],{"class":3451},[3434,20568,20569],{"class":5655},"'var(--c-border)'",[3434,20571,8953],{"class":3692},[3434,20573,5683],{"class":5682},[3434,20575,4726],{"class":3692},[3434,20577,3776],{"class":5644},[3434,20579,4726],{"class":3692},[3434,20581,20537],{"class":5644},[3434,20583,3689],{"class":3451},[3434,20585,20586],{"class":5655},"'none'",[3434,20588,5641],{"class":3692},[3434,20590,3676],{"class":3665},[3434,20592,20594,20596,20598,20600,20602],{"class":3436,"line":20593},141,[3434,20595,4027],{"class":3665},[3434,20597,4012],{"class":3669},[3434,20599,3996],{"class":3458},[3434,20601,3689],{"class":3451},[3434,20603,20604],{"class":3692},"\"width:2.5rem; height:2.5rem; background:var(--c-accent-l); border-radius:.625rem;\n",[3434,20606,20608],{"class":3436,"line":20607},142,[3434,20609,20610],{"class":3692},"                    display:flex; align-items:center; justify-content:center; font-size:1.1rem;\n",[3434,20612,20614,20617,20619,20621,20623,20625],{"class":3436,"line":20613},143,[3434,20615,20616],{"class":3692},"                    margin-bottom:.875rem;\"",[3434,20618,4039],{"class":3665},[3434,20620,16214],{"class":3451},[3434,20622,3964],{"class":3665},[3434,20624,4012],{"class":3669},[3434,20626,3676],{"class":3665},[3434,20628,20630,20632,20634,20636,20638,20641],{"class":3436,"line":20629},144,[3434,20631,4027],{"class":3665},[3434,20633,3403],{"class":3669},[3434,20635,3996],{"class":3458},[3434,20637,3689],{"class":3451},[3434,20639,20640],{"class":3692},"\"font-weight:700; font-size:.875rem; color:var(--c-text); margin-bottom:.375rem;\"",[3434,20642,3676],{"class":3665},[3434,20644,20646],{"class":3436,"line":20645},145,[3434,20647,20648],{"class":3451},"            Semantic Tokens\n",[3434,20650,20652,20654,20656],{"class":3436,"line":20651},146,[3434,20653,4677],{"class":3665},[3434,20655,3403],{"class":3669},[3434,20657,3676],{"class":3665},[3434,20659,20661,20663,20665,20667,20669,20672],{"class":3436,"line":20660},147,[3434,20662,4027],{"class":3665},[3434,20664,3353],{"class":3669},[3434,20666,3996],{"class":3458},[3434,20668,3689],{"class":3451},[3434,20670,20671],{"class":3692},"\"font-size:.8rem; color:var(--c-muted); line-height:1.55;\"",[3434,20673,3676],{"class":3665},[3434,20675,20677],{"class":3436,"line":20676},148,[3434,20678,20679],{"class":3451},"            Кольори описані за призначенням, а не конкретним відтінком.\n",[3434,20681,20683,20685,20687],{"class":3436,"line":20682},149,[3434,20684,4677],{"class":3665},[3434,20686,3353],{"class":3669},[3434,20688,3676],{"class":3665},[3434,20690,20692,20694,20696],{"class":3436,"line":20691},150,[3434,20693,4687],{"class":3665},[3434,20695,4012],{"class":3669},[3434,20697,3676],{"class":3665},[3434,20699,20701],{"class":3436,"line":20700},151,[3434,20702,3495],{"emptyLinePlaceholder":3494},[3434,20704,20706,20708,20710,20712,20714],{"class":3436,"line":20705},152,[3434,20707,4009],{"class":3665},[3434,20709,4012],{"class":3669},[3434,20711,3996],{"class":3458},[3434,20713,3689],{"class":3451},[3434,20715,20494],{"class":3692},[3434,20717,20719],{"class":3436,"line":20718},153,[3434,20720,20500],{"class":3692},[3434,20722,20724,20726,20728,20730,20732,20734,20736,20738,20740,20742,20744,20746,20748,20750,20752,20754,20756,20758,20760],{"class":3436,"line":20723},154,[3434,20725,20506],{"class":3458},[3434,20727,3689],{"class":3451},[3434,20729,5641],{"class":3692},[3434,20731,5683],{"class":5682},[3434,20733,4726],{"class":3692},[3434,20735,3776],{"class":5644},[3434,20737,4726],{"class":3692},[3434,20739,19736],{"class":5644},[3434,20741,3689],{"class":3451},[3434,20743,20376],{"class":5655},[3434,20745,8953],{"class":3692},[3434,20747,5683],{"class":5682},[3434,20749,4726],{"class":3692},[3434,20751,3776],{"class":5644},[3434,20753,4726],{"class":3692},[3434,20755,20537],{"class":5644},[3434,20757,3689],{"class":3451},[3434,20759,20542],{"class":5655},[3434,20761,20352],{"class":3692},[3434,20763,20765,20767,20769,20771,20773,20775,20777,20779,20781,20783,20785,20787,20789,20791,20793,20795,20797,20799,20801,20803],{"class":3436,"line":20764},155,[3434,20766,20550],{"class":3458},[3434,20768,3689],{"class":3451},[3434,20770,5641],{"class":3692},[3434,20772,5683],{"class":5682},[3434,20774,4726],{"class":3692},[3434,20776,3776],{"class":5644},[3434,20778,4726],{"class":3692},[3434,20780,19736],{"class":5644},[3434,20782,3689],{"class":3451},[3434,20784,20569],{"class":5655},[3434,20786,8953],{"class":3692},[3434,20788,5683],{"class":5682},[3434,20790,4726],{"class":3692},[3434,20792,3776],{"class":5644},[3434,20794,4726],{"class":3692},[3434,20796,20537],{"class":5644},[3434,20798,3689],{"class":3451},[3434,20800,20586],{"class":5655},[3434,20802,5641],{"class":3692},[3434,20804,3676],{"class":3665},[3434,20806,20808,20810,20812,20814,20816],{"class":3436,"line":20807},156,[3434,20809,4027],{"class":3665},[3434,20811,4012],{"class":3669},[3434,20813,3996],{"class":3458},[3434,20815,3689],{"class":3451},[3434,20817,20604],{"class":3692},[3434,20819,20821],{"class":3436,"line":20820},157,[3434,20822,20610],{"class":3692},[3434,20824,20826,20828,20830,20832,20834,20836],{"class":3436,"line":20825},158,[3434,20827,20616],{"class":3692},[3434,20829,4039],{"class":3665},[3434,20831,16331],{"class":3451},[3434,20833,3964],{"class":3665},[3434,20835,4012],{"class":3669},[3434,20837,3676],{"class":3665},[3434,20839,20841,20843,20845,20847,20849,20851],{"class":3436,"line":20840},159,[3434,20842,4027],{"class":3665},[3434,20844,3403],{"class":3669},[3434,20846,3996],{"class":3458},[3434,20848,3689],{"class":3451},[3434,20850,20640],{"class":3692},[3434,20852,3676],{"class":3665},[3434,20854,20856],{"class":3436,"line":20855},160,[3434,20857,20858],{"class":3451},"            Zero dark: Classes\n",[3434,20860,20862,20864,20866],{"class":3436,"line":20861},161,[3434,20863,4677],{"class":3665},[3434,20865,3403],{"class":3669},[3434,20867,3676],{"class":3665},[3434,20869,20871,20873,20875,20877,20879,20881],{"class":3436,"line":20870},162,[3434,20872,4027],{"class":3665},[3434,20874,3353],{"class":3669},[3434,20876,3996],{"class":3458},[3434,20878,3689],{"class":3451},[3434,20880,20671],{"class":3692},[3434,20882,3676],{"class":3665},[3434,20884,20886],{"class":3436,"line":20885},163,[3434,20887,20888],{"class":3451},"            HTML не містить жодного dark:-класу. CSS-змінні роблять всю роботу.\n",[3434,20890,20892,20894,20896],{"class":3436,"line":20891},164,[3434,20893,4677],{"class":3665},[3434,20895,3353],{"class":3669},[3434,20897,3676],{"class":3665},[3434,20899,20901,20903,20905],{"class":3436,"line":20900},165,[3434,20902,4687],{"class":3665},[3434,20904,4012],{"class":3669},[3434,20906,3676],{"class":3665},[3434,20908,20910],{"class":3436,"line":20909},166,[3434,20911,3495],{"emptyLinePlaceholder":3494},[3434,20913,20915,20917,20919,20921,20923],{"class":3436,"line":20914},167,[3434,20916,4009],{"class":3665},[3434,20918,4012],{"class":3669},[3434,20920,3996],{"class":3458},[3434,20922,3689],{"class":3451},[3434,20924,20494],{"class":3692},[3434,20926,20928],{"class":3436,"line":20927},168,[3434,20929,20500],{"class":3692},[3434,20931,20933,20935,20937,20939,20941,20943,20945,20947,20949,20951,20953,20955,20957,20959,20961,20963,20965,20967,20969],{"class":3436,"line":20932},169,[3434,20934,20506],{"class":3458},[3434,20936,3689],{"class":3451},[3434,20938,5641],{"class":3692},[3434,20940,5683],{"class":5682},[3434,20942,4726],{"class":3692},[3434,20944,3776],{"class":5644},[3434,20946,4726],{"class":3692},[3434,20948,19736],{"class":5644},[3434,20950,3689],{"class":3451},[3434,20952,20376],{"class":5655},[3434,20954,8953],{"class":3692},[3434,20956,5683],{"class":5682},[3434,20958,4726],{"class":3692},[3434,20960,3776],{"class":5644},[3434,20962,4726],{"class":3692},[3434,20964,20537],{"class":5644},[3434,20966,3689],{"class":3451},[3434,20968,20542],{"class":5655},[3434,20970,20352],{"class":3692},[3434,20972,20974,20976,20978,20980,20982,20984,20986,20988,20990,20992,20994,20996,20998,21000,21002,21004,21006,21008,21010,21012],{"class":3436,"line":20973},170,[3434,20975,20550],{"class":3458},[3434,20977,3689],{"class":3451},[3434,20979,5641],{"class":3692},[3434,20981,5683],{"class":5682},[3434,20983,4726],{"class":3692},[3434,20985,3776],{"class":5644},[3434,20987,4726],{"class":3692},[3434,20989,19736],{"class":5644},[3434,20991,3689],{"class":3451},[3434,20993,20569],{"class":5655},[3434,20995,8953],{"class":3692},[3434,20997,5683],{"class":5682},[3434,20999,4726],{"class":3692},[3434,21001,3776],{"class":5644},[3434,21003,4726],{"class":3692},[3434,21005,20537],{"class":5644},[3434,21007,3689],{"class":3451},[3434,21009,20586],{"class":5655},[3434,21011,5641],{"class":3692},[3434,21013,3676],{"class":3665},[3434,21015,21017,21019,21021,21023,21025],{"class":3436,"line":21016},171,[3434,21018,4027],{"class":3665},[3434,21020,4012],{"class":3669},[3434,21022,3996],{"class":3458},[3434,21024,3689],{"class":3451},[3434,21026,20604],{"class":3692},[3434,21028,21030],{"class":3436,"line":21029},172,[3434,21031,20610],{"class":3692},[3434,21033,21035,21037,21039,21042,21044,21046],{"class":3436,"line":21034},173,[3434,21036,20616],{"class":3692},[3434,21038,4039],{"class":3665},[3434,21040,21041],{"class":3451},"🌈",[3434,21043,3964],{"class":3665},[3434,21045,4012],{"class":3669},[3434,21047,3676],{"class":3665},[3434,21049,21051,21053,21055,21057,21059,21061],{"class":3436,"line":21050},174,[3434,21052,4027],{"class":3665},[3434,21054,3403],{"class":3669},[3434,21056,3996],{"class":3458},[3434,21058,3689],{"class":3451},[3434,21060,20640],{"class":3692},[3434,21062,3676],{"class":3665},[3434,21064,21066],{"class":3436,"line":21065},175,[3434,21067,21068],{"class":3451},"            Multi-theming\n",[3434,21070,21072,21074,21076],{"class":3436,"line":21071},176,[3434,21073,4677],{"class":3665},[3434,21075,3403],{"class":3669},[3434,21077,3676],{"class":3665},[3434,21079,21081,21083,21085,21087,21089,21091],{"class":3436,"line":21080},177,[3434,21082,4027],{"class":3665},[3434,21084,3353],{"class":3669},[3434,21086,3996],{"class":3458},[3434,21088,3689],{"class":3451},[3434,21090,20671],{"class":3692},[3434,21092,3676],{"class":3665},[3434,21094,21096],{"class":3436,"line":21095},178,[3434,21097,21098],{"class":3451},"            Нескінченна кількість бренд-тем через data-theme. Без дублювання.\n",[3434,21100,21102,21104,21106],{"class":3436,"line":21101},179,[3434,21103,4677],{"class":3665},[3434,21105,3353],{"class":3669},[3434,21107,3676],{"class":3665},[3434,21109,21111,21113,21115],{"class":3436,"line":21110},180,[3434,21112,4687],{"class":3665},[3434,21114,4012],{"class":3669},[3434,21116,3676],{"class":3665},[3434,21118,21120,21122,21124],{"class":3436,"line":21119},181,[3434,21121,3964],{"class":3665},[3434,21123,4012],{"class":3669},[3434,21125,3676],{"class":3665},[3434,21127,21129],{"class":3436,"line":21128},182,[3434,21130,3495],{"emptyLinePlaceholder":3494},[3434,21132,21134],{"class":3436,"line":21133},183,[3434,21135,21136],{"class":3440},"\u003C!-- ===== STATUS BADGES ===== -->\n",[3434,21138,21140,21142,21144,21146,21148],{"class":3436,"line":21139},184,[3434,21141,3681],{"class":3665},[3434,21143,4012],{"class":3669},[3434,21145,3996],{"class":3458},[3434,21147,3689],{"class":3451},[3434,21149,20494],{"class":3692},[3434,21151,21153,21156],{"class":3436,"line":21152},185,[3434,21154,21155],{"class":3692},"            border-radius:.875rem; padding:1.25rem; margin-bottom:1rem;\"",[3434,21157,3676],{"class":3665},[3434,21159,21161,21163,21165,21167,21169],{"class":3436,"line":21160},186,[3434,21162,4009],{"class":3665},[3434,21164,3353],{"class":3669},[3434,21166,3996],{"class":3458},[3434,21168,3689],{"class":3451},[3434,21170,21171],{"class":3692},"\"font-size:.7rem; font-weight:700; text-transform:uppercase; letter-spacing:.08em;\n",[3434,21173,21175,21178,21180,21183,21185,21187],{"class":3436,"line":21174},187,[3434,21176,21177],{"class":3692},"              color:var(--c-muted); margin-bottom:.75rem;\"",[3434,21179,4039],{"class":3665},[3434,21181,21182],{"class":3451},"Статусні компоненти через семантичні токени",[3434,21184,3964],{"class":3665},[3434,21186,3353],{"class":3669},[3434,21188,3676],{"class":3665},[3434,21190,21192,21194,21196,21198,21200,21203],{"class":3436,"line":21191},188,[3434,21193,4009],{"class":3665},[3434,21195,4012],{"class":3669},[3434,21197,3996],{"class":3458},[3434,21199,3689],{"class":3451},[3434,21201,21202],{"class":3692},"\"display:flex; gap:.5rem; flex-wrap:wrap;\"",[3434,21204,3676],{"class":3665},[3434,21206,21208,21210,21212,21214,21216],{"class":3436,"line":21207},189,[3434,21209,4027],{"class":3665},[3434,21211,3434],{"class":3669},[3434,21213,3996],{"class":3458},[3434,21215,3689],{"class":3451},[3434,21217,21218],{"class":3692},"\"padding:.25rem .75rem; background:oklch(0.962 0.044 156); color:oklch(0.540 0.145 146);\n",[3434,21220,21222,21225,21227,21230,21232,21234],{"class":3436,"line":21221},190,[3434,21223,21224],{"class":3692},"                     font-size:.75rem; font-weight:700; border-radius:999px;\"",[3434,21226,4039],{"class":3665},[3434,21228,21229],{"class":3451},"● Активний",[3434,21231,3964],{"class":3665},[3434,21233,3434],{"class":3669},[3434,21235,3676],{"class":3665},[3434,21237,21239,21241,21243,21245,21247],{"class":3436,"line":21238},191,[3434,21240,4027],{"class":3665},[3434,21242,3434],{"class":3669},[3434,21244,3996],{"class":3458},[3434,21246,3689],{"class":3451},[3434,21248,21249],{"class":3692},"\"padding:.25rem .75rem; background:oklch(0.973 0.071 103); color:oklch(0.476 0.144 67);\n",[3434,21251,21253,21255,21257,21260,21262,21264],{"class":3436,"line":21252},192,[3434,21254,21224],{"class":3692},[3434,21256,4039],{"class":3665},[3434,21258,21259],{"class":3451},"⚠ Очікує",[3434,21261,3964],{"class":3665},[3434,21263,3434],{"class":3669},[3434,21265,3676],{"class":3665},[3434,21267,21269,21271,21273,21275,21277],{"class":3436,"line":21268},193,[3434,21270,4027],{"class":3665},[3434,21272,3434],{"class":3669},[3434,21274,3996],{"class":3458},[3434,21276,3689],{"class":3451},[3434,21278,21279],{"class":3692},"\"padding:.25rem .75rem; background:oklch(0.936 0.032 17); color:oklch(0.577 0.245 27);\n",[3434,21281,21283,21285,21287,21290,21292,21294],{"class":3436,"line":21282},194,[3434,21284,21224],{"class":3692},[3434,21286,4039],{"class":3665},[3434,21288,21289],{"class":3451},"✖ Помилка",[3434,21291,3964],{"class":3665},[3434,21293,3434],{"class":3669},[3434,21295,3676],{"class":3665},[3434,21297,21299,21301,21303,21305,21307],{"class":3436,"line":21298},195,[3434,21300,4027],{"class":3665},[3434,21302,3434],{"class":3669},[3434,21304,3996],{"class":3458},[3434,21306,3689],{"class":3451},[3434,21308,21309],{"class":3692},"\"padding:.25rem .75rem; background:var(--c-accent-l); color:var(--c-accent);\n",[3434,21311,21313,21315,21317,21320,21322,21324],{"class":3436,"line":21312},196,[3434,21314,21224],{"class":3692},[3434,21316,4039],{"class":3665},[3434,21318,21319],{"class":3451},"★ Featured",[3434,21321,3964],{"class":3665},[3434,21323,3434],{"class":3669},[3434,21325,3676],{"class":3665},[3434,21327,21329,21331,21333],{"class":3436,"line":21328},197,[3434,21330,4687],{"class":3665},[3434,21332,4012],{"class":3669},[3434,21334,3676],{"class":3665},[3434,21336,21338,21340,21342],{"class":3436,"line":21337},198,[3434,21339,3964],{"class":3665},[3434,21341,4012],{"class":3669},[3434,21343,3676],{"class":3665},[3434,21345,21347],{"class":3436,"line":21346},199,[3434,21348,3495],{"emptyLinePlaceholder":3494},[3434,21350,21352,21354,21356],{"class":3436,"line":21351},200,[3434,21353,3681],{"class":3665},[3434,21355,3728],{"class":3669},[3434,21357,3676],{"class":3665},[3434,21359,21361,21363,21365,21368,21370,21372,21374,21376,21378,21380,21382,21384,21386,21388],{"class":3436,"line":21360},201,[3434,21362,13025],{"class":5682},[3434,21364,6074],{"class":3465},[3434,21366,21367],{"class":3734},"() { ",[3434,21369,11028],{"class":5199},[3434,21371,6080],{"class":5644},[3434,21373,4726],{"class":3734},[3434,21375,6393],{"class":5644},[3434,21377,4726],{"class":3734},[3434,21379,5662],{"class":5644},[3434,21381,4726],{"class":3734},[3434,21383,6097],{"class":3465},[3434,21385,3469],{"class":3734},[3434,21387,5672],{"class":5655},[3434,21389,21390],{"class":3734},") }\n",[3434,21392,21394],{"class":3436,"line":21393},202,[3434,21395,3495],{"emptyLinePlaceholder":3494},[3434,21397,21399,21401,21404],{"class":3436,"line":21398},203,[3434,21400,13025],{"class":5682},[3434,21402,21403],{"class":3465}," toggleDark",[3434,21405,10855],{"class":3734},[3434,21407,21409,21411,21414,21416,21419,21421],{"class":3436,"line":21408},204,[3434,21410,13034],{"class":5682},[3434,21412,21413],{"class":6073}," dark",[3434,21415,6077],{"class":3451},[3434,21417,21418],{"class":3451}," !",[3434,21420,12008],{"class":3465},[3434,21422,10996],{"class":3734},[3434,21424,21426,21428,21430,21432,21434,21436,21438,21440,21442,21444,21446,21449],{"class":3436,"line":21425},205,[3434,21427,13320],{"class":5644},[3434,21429,4726],{"class":3734},[3434,21431,6393],{"class":5644},[3434,21433,4726],{"class":3734},[3434,21435,5662],{"class":5644},[3434,21437,4726],{"class":3734},[3434,21439,5667],{"class":3465},[3434,21441,3469],{"class":3734},[3434,21443,5672],{"class":5655},[3434,21445,7250],{"class":3734},[3434,21447,21448],{"class":5644},"dark",[3434,21450,6409],{"class":3734},[3434,21452,21454,21456,21458,21460,21462,21464,21466,21468,21470,21472,21474,21476],{"class":3436,"line":21453},206,[3434,21455,11268],{"class":5644},[3434,21457,4726],{"class":3734},[3434,21459,11316],{"class":3465},[3434,21461,3469],{"class":3734},[3434,21463,11941],{"class":5655},[3434,21465,7250],{"class":3734},[3434,21467,21448],{"class":5644},[3434,21469,6120],{"class":3451},[3434,21471,11982],{"class":5655},[3434,21473,6126],{"class":3451},[3434,21475,13064],{"class":5655},[3434,21477,6409],{"class":3734},[3434,21479,21481,21484],{"class":3436,"line":21480},207,[3434,21482,21483],{"class":3465},"        updateDarkBtn",[3434,21485,10996],{"class":3734},[3434,21487,21489],{"class":3436,"line":21488},208,[3434,21490,3813],{"class":3734},[3434,21492,21494],{"class":3436,"line":21493},209,[3434,21495,3495],{"emptyLinePlaceholder":3494},[3434,21497,21499,21501,21503,21505,21507],{"class":3436,"line":21498},210,[3434,21500,13025],{"class":5682},[3434,21502,18553],{"class":3465},[3434,21504,3469],{"class":3734},[3434,21506,16452],{"class":5644},[3434,21508,6065],{"class":3734},[3434,21510,21512,21514,21516,21518],{"class":3436,"line":21511},211,[3434,21513,13055],{"class":5199},[3434,21515,11004],{"class":3734},[3434,21517,16452],{"class":5644},[3434,21519,6065],{"class":3734},[3434,21521,21523,21525,21527,21529,21531,21533,21535,21537,21539,21541],{"class":3436,"line":21522},212,[3434,21524,13736],{"class":5644},[3434,21526,4726],{"class":3734},[3434,21528,6393],{"class":5644},[3434,21530,4726],{"class":3734},[3434,21532,11181],{"class":3465},[3434,21534,3469],{"class":3734},[3434,21536,11186],{"class":5655},[3434,21538,7250],{"class":3734},[3434,21540,16452],{"class":5644},[3434,21542,6409],{"class":3734},[3434,21544,21546,21548,21550],{"class":3436,"line":21545},213,[3434,21547,13162],{"class":3734},[3434,21549,11138],{"class":5199},[3434,21551,3452],{"class":3734},[3434,21553,21555,21557,21559,21561,21563,21565,21567,21569],{"class":3436,"line":21554},214,[3434,21556,13736],{"class":5644},[3434,21558,4726],{"class":3734},[3434,21560,6393],{"class":5644},[3434,21562,4726],{"class":3734},[3434,21564,16504],{"class":3465},[3434,21566,3469],{"class":3734},[3434,21568,11186],{"class":5655},[3434,21570,6409],{"class":3734},[3434,21572,21574],{"class":3436,"line":21573},215,[3434,21575,6137],{"class":3734},[3434,21577,21579],{"class":3436,"line":21578},216,[3434,21580,3813],{"class":3734},[3434,21582,21584],{"class":3436,"line":21583},217,[3434,21585,3495],{"emptyLinePlaceholder":3494},[3434,21587,21589,21591,21594],{"class":3436,"line":21588},218,[3434,21590,13025],{"class":5682},[3434,21592,21593],{"class":3465}," updateDarkBtn",[3434,21595,10855],{"class":3734},[3434,21597,21599,21601,21603,21605,21607,21610,21612,21614,21616,21618,21621,21624,21626,21628],{"class":3436,"line":21598},219,[3434,21600,13320],{"class":5644},[3434,21602,4726],{"class":3734},[3434,21604,5650],{"class":3465},[3434,21606,3469],{"class":3734},[3434,21608,21609],{"class":5655},"'dark-btn'",[3434,21611,5659],{"class":3734},[3434,21613,6113],{"class":5644},[3434,21615,6077],{"class":3451},[3434,21617,6074],{"class":3465},[3434,21619,21620],{"class":3734},"() ",[3434,21622,21623],{"class":3451},"?",[3434,21625,13382],{"class":5655},[3434,21627,6126],{"class":3451},[3434,21629,21630],{"class":5655}," '🌙'\n",[3434,21632,21634],{"class":3436,"line":21633},220,[3434,21635,3813],{"class":3734},[3434,21637,21639],{"class":3436,"line":21638},221,[3434,21640,3495],{"emptyLinePlaceholder":3494},[3434,21642,21644,21647],{"class":3436,"line":21643},222,[3434,21645,21646],{"class":3465},"    updateDarkBtn",[3434,21648,10996],{"class":3734},[3434,21650,21652,21654,21656],{"class":3436,"line":21651},223,[3434,21653,3964],{"class":3665},[3434,21655,3728],{"class":3669},[3434,21657,3676],{"class":3665},[3434,21659,21661,21663,21665],{"class":3436,"line":21660},224,[3434,21662,3964],{"class":3665},[3434,21664,3985],{"class":3669},[3434,21666,3676],{"class":3665},[3434,21668,21670,21672,21674],{"class":3436,"line":21669},225,[3434,21671,3964],{"class":3665},[3434,21673,3658],{"class":3669},[3434,21675,3676],{"class":3665},[3396,21677],{},[3403,21679,21681],{"id":21680},"_63-порівняльна-таблиця-підходів","6.3. Порівняльна таблиця підходів",[3353,21683,21684],{},"Підсумуємо три підходи до реалізації темної теми, розглянуті у цій статті:",[21686,21687,21688,21708],"table",{},[21689,21690,21691],"thead",{},[21692,21693,21694,21698,21703,21705],"tr",{},[21695,21696,21697],"th",{},"Критерій",[21695,21699,21700,21702],{},[3357,21701,3359],{}," класи",[21695,21704,4814],{},[21695,21706,21707],{},"Multi-theme",[21709,21710,21711,21726,21739,21752,21765,21778,21792,21805],"tbody",{},[21692,21712,21713,21717,21720,21723],{},[21714,21715,21716],"td",{},"Складність реалізації",[21714,21718,21719],{},"Низька",[21714,21721,21722],{},"Середня",[21714,21724,21725],{},"Висока",[21692,21727,21728,21731,21734,21737],{},[21714,21729,21730],{},"Кількість класів у HTML",[21714,21732,21733],{},"Подвоєна",[21714,21735,21736],{},"Звичайна",[21714,21738,21736],{},[21692,21740,21741,21744,21747,21750],{},[21714,21742,21743],{},"Підтримуваність",[21714,21745,21746],{},"Слабка",[21714,21748,21749],{},"Відмінна",[21714,21751,21749],{},[21692,21753,21754,21757,21760,21762],{},[21714,21755,21756],{},"Кількість тем",[21714,21758,21759],{},"2",[21714,21761,21759],{},[21714,21763,21764],{},"Необмежена",[21692,21766,21767,21770,21773,21776],{},[21714,21768,21769],{},"Автодоповнення IDE",[21714,21771,21772],{},"Повне",[21714,21774,21775],{},"Потребує реєстрації",[21714,21777,21775],{},[21692,21779,21780,21783,21786,21789],{},[21714,21781,21782],{},"Підходить для",[21714,21784,21785],{},"Прототипів, MVP",[21714,21787,21788],{},"Production",[21714,21790,21791],{},"Enterprise, white-label",[21692,21793,21794,21797,21800,21803],{},[21714,21795,21796],{},"Потребує JavaScript",[21714,21798,21799],{},"Ні (media) \u002F Так (клас)",[21714,21801,21802],{},"Так",[21714,21804,21802],{},[21692,21806,21807,21810,21813,21816],{},[21714,21808,21809],{},"Анти-FOIT скрипт",[21714,21811,21812],{},"Рекомендований",[21714,21814,21815],{},"Обов'язковий",[21714,21817,21815],{},[3396,21819],{},[3348,21821,21823],{"id":21822},"частина-vii-завдання-для-самоперевірки","Частина VII. Завдання для самоперевірки",[21825,21826,21827,21961,22204],"accordion",{},[21828,21829,21831,21836,21839,21887,21890,21892,21897,21900,21916,21923,21925,21930,21933],"accordion-item",{"label":21830},"Рівень 1: Базовий — розуміння механізмів",[3353,21832,21833],{},[3365,21834,21835],{},"Завдання 1.1. Концептуальне.",[3353,21837,21838],{},"Поясніть своїми словами різницю між цими двома підходами:",[3425,21840,21842],{"className":3656,"code":21841,"language":3658,"meta":3430,"style":3430},"\u003C!-- Підхід A -->\n\u003Cdiv class=\"bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-50\">\n\n\u003C!-- Підхід B -->\n\u003Cdiv class=\"bg-(--color-bg-surface) text-(--color-text-primary)\">\n",[3357,21843,21844,21849,21864,21868,21873],{"__ignoreMap":3430},[3434,21845,21846],{"class":3436,"line":3437},[3434,21847,21848],{"class":3440},"\u003C!-- Підхід A -->\n",[3434,21850,21851,21853,21855,21857,21859,21862],{"class":3436,"line":3444},[3434,21852,3681],{"class":3665},[3434,21854,4012],{"class":3669},[3434,21856,3988],{"class":3458},[3434,21858,3689],{"class":3451},[3434,21860,21861],{"class":3692},"\"bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-50\"",[3434,21863,3676],{"class":3665},[3434,21865,21866],{"class":3436,"line":3455},[3434,21867,3495],{"emptyLinePlaceholder":3494},[3434,21869,21870],{"class":3436,"line":3485},[3434,21871,21872],{"class":3440},"\u003C!-- Підхід B -->\n",[3434,21874,21875,21877,21879,21881,21883,21885],{"class":3436,"line":3491},[3434,21876,3681],{"class":3665},[3434,21878,4012],{"class":3669},[3434,21880,3988],{"class":3458},[3434,21882,3689],{"class":3451},[3434,21884,9178],{"class":3692},[3434,21886,3676],{"class":3665},[3353,21888,21889],{},"Яка тема активна у кожному з них? Як перемикається? Де визначаються значення кольорів у підході B?",[3396,21891],{},[3353,21893,21894],{},[3365,21895,21896],{},"Завдання 1.2. CSS Custom Properties.",[3353,21898,21899],{},"Не використовуючи Tailwind — напишіть чистий CSS, який:",[13835,21901,21902,21908,21913],{},[11736,21903,21904,21905,21907],{},"Визначає у ",[3357,21906,3448],{}," три семантичних токени: фон, основний текст, акцентний колір",[11736,21909,21910,21911],{},"Перевизначає їх у ",[3357,21912,4885],{},[11736,21914,21915],{},"Застосовує до простого HTML з заголовком, параграфом і кнопкою",[3353,21917,21918,21919,7150,21921,4726],{},"Додайте JavaScript-кнопку для перемикання класу ",[3357,21920,4885],{},[3357,21922,5106],{},[3396,21924],{},[3353,21926,21927],{},[3365,21928,21929],{},"Завдання 1.3. Flash of Incorrect Theme.",[3353,21931,21932],{},"Поясніть:",[11733,21934,21935,21946,21958],{},[11736,21936,21937,21938,21941,21942,21945],{},"Чому FOIT виникає при використанні ",[3357,21939,21940],{},"type=\"module\""," або ",[3357,21943,21944],{},"defer"," на скрипті ініціалізації теми?",[11736,21947,21948,21949,21951,21952,12121,21954,21957],{},"Чому скрипт у ",[3357,21950,11764],{}," без ",[3357,21953,21944],{},[3357,21955,21956],{},"async"," вирішує цю проблему, хоча «блокує рендеринг»?",[11736,21959,21960],{},"Яке максимально допустиме розмір такого скрипту, щоб він не відчутно сповільнював LCP?",[21828,21962,21964,21969,21976,21982,21988,21994,22000,22006,22009,22020,22022,22027,22030,22061,22064,22066,22074,22080,22129,22132],{"label":21963},"Рівень 2: Практика — власна система токенів",[3353,21965,21966],{},[3365,21967,21968],{},"Завдання 2.1. Система токенів для блогу.",[3353,21970,21971,21972,21975],{},"Побудуйте повну систему семантичних токенів для блог-платформи. Файл ",[3357,21973,21974],{},"semantic.css"," має містити:",[3353,21977,21978,21981],{},[3365,21979,21980],{},"Фони (4 рівні):"," base → surface → elevated → inset",[3353,21983,21984,21987],{},[3365,21985,21986],{},"Текст (4 ролі):"," primary → secondary → muted → disabled",[3353,21989,21990,21993],{},[3365,21991,21992],{},"Рамки (2 варіанти):"," default → strong",[3353,21995,21996,21999],{},[3365,21997,21998],{},"Акцент:"," основний колір бренду + hover + light + text",[3353,22001,22002,22005],{},[3365,22003,22004],{},"Статуси:"," success, warning, error — кожен із двома варіантами: bg та text",[3353,22007,22008],{},"Визначте усі токени для світлої та темної теми. Потім використайте їх у компонентах:",[13835,22010,22011,22014,22017],{},[11736,22012,22013],{},"Navbar із лого та кнопкою",[11736,22015,22016],{},"Картка статті (обкладинка, тег, заголовок, excerpt, автор)",[11736,22018,22019],{},"Alert з трьома статусами",[3396,22021],{},[3353,22023,22024],{},[3365,22025,22026],{},"Завдання 2.2. Анти-FOIT у реальному проєкті.",[3353,22028,22029],{},"Додайте до Vite-проєкту (або будь-якого HTML-файлу) повну систему запобігання FOIT:",[11733,22031,22032,22038,22053,22056],{},[11736,22033,22034,22035,22037],{},"Мінімальний синхронний скрипт у ",[3357,22036,11764],{}," — визначення та застосування теми без JavaScript-модулів",[11736,22039,22040,22041,22044,22045,7250,22047,7250,22049,7250,22051],{},"Окремий модуль ",[3357,22042,22043],{},"theme.js"," із повним API: ",[3357,22046,11614],{},[3357,22048,11619],{},[3357,22050,11624],{},[3357,22052,10993],{},[11736,22054,22055],{},"UI-компонент перемикача: три стани (☀️ Світла \u002F 💻 Системна \u002F 🌙 Темна), активний стан підсвічений",[11736,22057,22058,22059],{},"Слухач системної зміни ",[3357,22060,5131],{},[3353,22062,22063],{},"Перевірте: відкрийте сторінку у темному режимі, перезавантажте — тема не повинна мигати.",[3396,22065],{},[3353,22067,22068],{},[3365,22069,22070,22071,22073],{},"Завдання 2.3. ",[3357,22072,6187],{}," для додаткових контекстів.",[3353,22075,22076,22077,22079],{},"Tailwind v4 дозволяє визначати власні варіанти через ",[3357,22078,6187],{},". Реалізуйте такі варіанти:",[3425,22081,22083],{"className":3427,"code":22082,"language":3429,"meta":3430,"style":3430},"\u002F* Варіант для touch-пристроїв *\u002F\n@custom-variant touch (@media (hover: none) and (pointer: coarse));\n\n\u002F* Варіант для high-contrast режиму (accessibility) *\u002F\n@custom-variant contrast (@media (forced-colors: active));\n\n\u002F* Варіант для друку *\u002F\n@custom-variant print (@media print);\n",[3357,22084,22085,22090,22097,22101,22106,22113,22117,22122],{"__ignoreMap":3430},[3434,22086,22087],{"class":3436,"line":3437},[3434,22088,22089],{"class":3440},"\u002F* Варіант для touch-пристроїв *\u002F\n",[3434,22091,22092,22094],{"class":3436,"line":3444},[3434,22093,6187],{"class":5199},[3434,22095,22096],{"class":3451}," touch (@media (hover: none) and (pointer: coarse));\n",[3434,22098,22099],{"class":3436,"line":3455},[3434,22100,3495],{"emptyLinePlaceholder":3494},[3434,22102,22103],{"class":3436,"line":3485},[3434,22104,22105],{"class":3440},"\u002F* Варіант для high-contrast режиму (accessibility) *\u002F\n",[3434,22107,22108,22110],{"class":3436,"line":3491},[3434,22109,6187],{"class":5199},[3434,22111,22112],{"class":3451}," contrast (@media (forced-colors: active));\n",[3434,22114,22115],{"class":3436,"line":3498},[3434,22116,3495],{"emptyLinePlaceholder":3494},[3434,22118,22119],{"class":3436,"line":3504},[3434,22120,22121],{"class":3440},"\u002F* Варіант для друку *\u002F\n",[3434,22123,22124,22126],{"class":3436,"line":3511},[3434,22125,6187],{"class":5199},[3434,22127,22128],{"class":3451}," print (@media print);\n",[3353,22130,22131],{},"Використайте їх у компонентах:",[3425,22133,22135],{"className":3656,"code":22134,"language":3658,"meta":3430,"style":3430},"\u003C!-- Кнопка: більший розмір на touch, чорно-білий у high-contrast -->\n\u003Cbutton class=\"px-4 py-2 touch:px-6 touch:py-3 bg-indigo-600 contrast:bg-black contrast:text-white\">\n    Натиснути\n\u003C\u002Fbutton>\n\n\u003C!-- Сайдбар: прихований при друку -->\n\u003Caside class=\"block print:hidden\">...\u003C\u002Faside>\n",[3357,22136,22137,22142,22157,22162,22170,22174,22179],{"__ignoreMap":3430},[3434,22138,22139],{"class":3436,"line":3437},[3434,22140,22141],{"class":3440},"\u003C!-- Кнопка: більший розмір на touch, чорно-білий у high-contrast -->\n",[3434,22143,22144,22146,22148,22150,22152,22155],{"class":3436,"line":3444},[3434,22145,3681],{"class":3665},[3434,22147,4342],{"class":3669},[3434,22149,3988],{"class":3458},[3434,22151,3689],{"class":3451},[3434,22153,22154],{"class":3692},"\"px-4 py-2 touch:px-6 touch:py-3 bg-indigo-600 contrast:bg-black contrast:text-white\"",[3434,22156,3676],{"class":3665},[3434,22158,22159],{"class":3436,"line":3455},[3434,22160,22161],{"class":3451},"    Натиснути\n",[3434,22163,22164,22166,22168],{"class":3436,"line":3485},[3434,22165,3964],{"class":3665},[3434,22167,4342],{"class":3669},[3434,22169,3676],{"class":3665},[3434,22171,22172],{"class":3436,"line":3491},[3434,22173,3495],{"emptyLinePlaceholder":3494},[3434,22175,22176],{"class":3436,"line":3498},[3434,22177,22178],{"class":3440},"\u003C!-- Сайдбар: прихований при друку -->\n",[3434,22180,22181,22183,22186,22188,22190,22193,22195,22198,22200,22202],{"class":3436,"line":3504},[3434,22182,3681],{"class":3665},[3434,22184,22185],{"class":3669},"aside",[3434,22187,3988],{"class":3458},[3434,22189,3689],{"class":3451},[3434,22191,22192],{"class":3692},"\"block print:hidden\"",[3434,22194,4039],{"class":3665},[3434,22196,22197],{"class":3451},"...",[3434,22199,3964],{"class":3665},[3434,22201,22185],{"class":3669},[3434,22203,3676],{"class":3665},[21828,22205,22207,22212,22215,22220,22254,22259,22396,22405,22407,22412,22423,22426,22466],{"label":22206},"Рівень 3: Архітектура — Enterprise-рівень",[3353,22208,22209],{},[3365,22210,22211],{},"Завдання 3.1. White-label система для SaaS.",[3353,22213,22214],{},"Уявіть SaaS-платформу, де кожен корпоративний клієнт має свою кольорову схему. Побудуйте систему, що:",[3353,22216,22217],{},[3365,22218,22219],{},"CSS-частина:",[13835,22221,22222,22229,22241,22247],{},[11736,22223,22224,22225,6485,22227],{},"Базова система семантичних токенів у ",[3357,22226,3448],{},[3357,22228,4885],{},[11736,22230,22231,22232,7250,22235,7250,22238],{},"Окремі файли для кожного клієнта: ",[3357,22233,22234],{},"themes\u002Fclient-a.css",[3357,22236,22237],{},"themes\u002Fclient-b.css",[3357,22239,22240],{},"themes\u002Fclient-c.css",[11736,22242,22243,22244],{},"Кожен клієнтський файл визначає лише акцентні токени через ",[3357,22245,22246],{},"[data-theme=\"client-a\"]",[11736,22248,22249,22250,22253],{},"Комбінація ",[3357,22251,22252],{},".dark [data-theme=\"client-a\"]"," для темної версії клієнтської теми",[3353,22255,22256],{},[3365,22257,22258],{},"JavaScript-частина:",[3425,22260,22262],{"className":6375,"code":22261,"language":6377,"meta":3430,"style":3430},"\u002F\u002F Повне API системи тем\nconst ThemeSystem = {\n    \u002F\u002F Поточний стан\n    colorTheme: null,   \u002F\u002F 'light' | 'dark'\n    brandTheme: null,   \u002F\u002F 'client-a' | 'client-b' | null\n\n    \u002F\u002F Методи\n    init()           { \u002F* читати localStorage, застосувати, слухати OS *\u002F },\n    setColor(theme)  { \u002F* 'light' | 'dark' | 'system' *\u002F },\n    setBrand(brand)  { \u002F* 'client-a' | null *\u002F },\n    getState()       { \u002F* повернути поточний стан *\u002F },\n    reset()          { \u002F* скинути до системних налаштувань *\u002F }\n}\n",[3357,22263,22264,22269,22279,22284,22298,22310,22314,22319,22333,22350,22366,22379,22392],{"__ignoreMap":3430},[3434,22265,22266],{"class":3436,"line":3437},[3434,22267,22268],{"class":3440},"\u002F\u002F Повне API системи тем\n",[3434,22270,22271,22273,22276],{"class":3436,"line":3444},[3434,22272,10637],{"class":5682},[3434,22274,22275],{"class":6073}," ThemeSystem",[3434,22277,22278],{"class":3451}," = {\n",[3434,22280,22281],{"class":3436,"line":3455},[3434,22282,22283],{"class":3440},"    \u002F\u002F Поточний стан\n",[3434,22285,22286,22289,22292,22295],{"class":3436,"line":3485},[3434,22287,22288],{"class":5644},"    colorTheme:",[3434,22290,22291],{"class":5682}," null",[3434,22293,22294],{"class":3451},",   ",[3434,22296,22297],{"class":3440},"\u002F\u002F 'light' | 'dark'\n",[3434,22299,22300,22303,22305,22307],{"class":3436,"line":3491},[3434,22301,22302],{"class":5644},"    brandTheme:",[3434,22304,22291],{"class":5682},[3434,22306,22294],{"class":3451},[3434,22308,22309],{"class":3440},"\u002F\u002F 'client-a' | 'client-b' | null\n",[3434,22311,22312],{"class":3436,"line":3498},[3434,22313,3495],{"emptyLinePlaceholder":3494},[3434,22315,22316],{"class":3436,"line":3504},[3434,22317,22318],{"class":3440},"    \u002F\u002F Методи\n",[3434,22320,22321,22324,22327,22330],{"class":3436,"line":3511},[3434,22322,22323],{"class":3465},"    init",[3434,22325,22326],{"class":3451},"()           { ",[3434,22328,22329],{"class":3440},"\u002F* читати localStorage, застосувати, слухати OS *\u002F",[3434,22331,22332],{"class":3451}," },\n",[3434,22334,22335,22338,22340,22342,22345,22348],{"class":3436,"line":3529},[3434,22336,22337],{"class":3465},"    setColor",[3434,22339,3469],{"class":3451},[3434,22341,11095],{"class":5644},[3434,22343,22344],{"class":3451},")  { ",[3434,22346,22347],{"class":3440},"\u002F* 'light' | 'dark' | 'system' *\u002F",[3434,22349,22332],{"class":3451},[3434,22351,22352,22355,22357,22359,22361,22364],{"class":3436,"line":3810},[3434,22353,22354],{"class":3465},"    setBrand",[3434,22356,3469],{"class":3451},[3434,22358,16452],{"class":5644},[3434,22360,22344],{"class":3451},[3434,22362,22363],{"class":3440},"\u002F* 'client-a' | null *\u002F",[3434,22365,22332],{"class":3451},[3434,22367,22368,22371,22374,22377],{"class":3436,"line":3816},[3434,22369,22370],{"class":3465},"    getState",[3434,22372,22373],{"class":3451},"()       { ",[3434,22375,22376],{"class":3440},"\u002F* повернути поточний стан *\u002F",[3434,22378,22332],{"class":3451},[3434,22380,22381,22384,22387,22390],{"class":3436,"line":3821},[3434,22382,22383],{"class":3465},"    reset",[3434,22385,22386],{"class":3451},"()          { ",[3434,22388,22389],{"class":3440},"\u002F* скинути до системних налаштувань *\u002F",[3434,22391,11635],{"class":3451},[3434,22393,22394],{"class":3436,"line":3829},[3434,22395,3488],{"class":3451},[3353,22397,22398,22401,22402,22404],{},[3365,22399,22400],{},"HTML-верстка:"," компонент картки, що однаково виглядає у будь-якій темі, використовуючи виключно семантичні токени. Жодного ",[3357,22403,3359],{},", жодного умовного рендеру у JavaScript.",[3396,22406],{},[3353,22408,22409],{},[3365,22410,22411],{},"Завдання 3.2. Тест на WCAG AA контраст.",[3353,22413,22414,22415,22418,22419,22422],{},"WCAG 2.1 вимагає мінімальний коефіцієнт контрасту ",[3365,22416,22417],{},"4.5:1"," між текстом та фоном для нормального тексту та ",[3365,22420,22421],{},"3:1"," для великого тексту (18px+).",[3353,22424,22425],{},"Для вашої системи токенів:",[11733,22427,22428,22460,22463],{},[11736,22429,22430,22431,22434,22435],{},"Перевірте кожну пару ",[3357,22432,22433],{},"text + bg"," у світлій темі на відповідність WCAG AA:",[13835,22436,22437,22443,22450,22457],{},[11736,22438,22439,7150,22441],{},[3357,22440,3379],{},[3357,22442,17552],{},[11736,22444,22445,7150,22447],{},[3357,22446,3379],{},[3357,22448,22449],{},"--color-bg-surface",[11736,22451,22452,7150,22455],{},[3357,22453,22454],{},"--color-text-muted",[3357,22456,22449],{},[11736,22458,22459],{},"Акцентний текст на акцентному фоні",[11736,22461,22462],{},"Повторіть для темної теми.",[11736,22464,22465],{},"Якщо якась пара не відповідає — виправте значення OKLCH, зберігаючи візуальний характер кольору.",[3353,22467,22468,22469,22476],{},"Для перевірки використовуйте ",[22470,22471,22475],"a",{"href":22472,"rel":22473},"https:\u002F\u002Foklch.com",[22474],"nofollow","oklch.com"," або Chrome DevTools (F12 → CSS → color swatch → contrast ratio).",[3396,22478],{},[3348,22480,22482],{"id":22481},"підсумок-що-ми-побудували","Підсумок: що ми побудували",[7171,22484,22485],{},[3425,22486,22488],{"className":7175,"code":22487,"language":7171,"meta":3430,"style":3430},"mindmap\n    root((Темна тема\u003Cbr\u002F>Tailwind v4))\n        Теорія\n            CSS Custom Properties\n            Рівні токенів\n            Три стратегії\n        Базовий рівень\n            dark варіант\n            custom-variant dark\n            Стекування варіантів\n        Токени\n            Примітивна палітра\n            Семантичні токени\n            Синтаксис bg--var-name\n        JavaScript\n            theme.js модуль\n            localStorage\n            Anti-FOIT скрипт\n            OS change listener\n        Multi-theming\n            data-theme атрибут\n            Бренд-теми\n            dark + data-theme\n        Архітектура\n            Структура файлів\n            Production приклад\n            WCAG контраст\n",[3357,22489,22490,22495,22500,22505,22510,22515,22520,22525,22530,22535,22540,22545,22550,22555,22560,22565,22570,22575,22580,22585,22590,22595,22600,22605,22610,22615,22620],{"__ignoreMap":3430},[3434,22491,22492],{"class":3436,"line":3437},[3434,22493,22494],{},"mindmap\n",[3434,22496,22497],{"class":3436,"line":3444},[3434,22498,22499],{},"    root((Темна тема\u003Cbr\u002F>Tailwind v4))\n",[3434,22501,22502],{"class":3436,"line":3455},[3434,22503,22504],{},"        Теорія\n",[3434,22506,22507],{"class":3436,"line":3485},[3434,22508,22509],{},"            CSS Custom Properties\n",[3434,22511,22512],{"class":3436,"line":3491},[3434,22513,22514],{},"            Рівні токенів\n",[3434,22516,22517],{"class":3436,"line":3498},[3434,22518,22519],{},"            Три стратегії\n",[3434,22521,22522],{"class":3436,"line":3504},[3434,22523,22524],{},"        Базовий рівень\n",[3434,22526,22527],{"class":3436,"line":3511},[3434,22528,22529],{},"            dark варіант\n",[3434,22531,22532],{"class":3436,"line":3529},[3434,22533,22534],{},"            custom-variant dark\n",[3434,22536,22537],{"class":3436,"line":3810},[3434,22538,22539],{},"            Стекування варіантів\n",[3434,22541,22542],{"class":3436,"line":3816},[3434,22543,22544],{},"        Токени\n",[3434,22546,22547],{"class":3436,"line":3821},[3434,22548,22549],{},"            Примітивна палітра\n",[3434,22551,22552],{"class":3436,"line":3829},[3434,22553,22554],{},"            Семантичні токени\n",[3434,22556,22557],{"class":3436,"line":3835},[3434,22558,22559],{},"            Синтаксис bg--var-name\n",[3434,22561,22562],{"class":3436,"line":3857},[3434,22563,22564],{},"        JavaScript\n",[3434,22566,22567],{"class":3436,"line":3862},[3434,22568,22569],{},"            theme.js модуль\n",[3434,22571,22572],{"class":3436,"line":3867},[3434,22573,22574],{},"            localStorage\n",[3434,22576,22577],{"class":3436,"line":3873},[3434,22578,22579],{},"            Anti-FOIT скрипт\n",[3434,22581,22582],{"class":3436,"line":3881},[3434,22583,22584],{},"            OS change listener\n",[3434,22586,22587],{"class":3436,"line":3898},[3434,22588,22589],{},"        Multi-theming\n",[3434,22591,22592],{"class":3436,"line":3903},[3434,22593,22594],{},"            data-theme атрибут\n",[3434,22596,22597],{"class":3436,"line":3911},[3434,22598,22599],{},"            Бренд-теми\n",[3434,22601,22602],{"class":3436,"line":3927},[3434,22603,22604],{},"            dark + data-theme\n",[3434,22606,22607],{"class":3436,"line":3932},[3434,22608,22609],{},"        Архітектура\n",[3434,22611,22612],{"class":3436,"line":3940},[3434,22613,22614],{},"            Структура файлів\n",[3434,22616,22617],{"class":3436,"line":3956},[3434,22618,22619],{},"            Production приклад\n",[3434,22621,22622],{"class":3436,"line":3961},[3434,22623,22624],{},"            WCAG контраст\n",[3353,22626,22627],{},"Ключові принципи, які варто засвоїти з цієї статті:",[5060,22629,22630,22642,22646,22654],{},[5063,22631,22634,22635,22638,22639,22641],{"icon":22632,"title":22633},"i-heroicons-swatch","Токени > Кольори","Ніколи не прив'язуйте UI до конкретного відтінку. ",[3357,22636,22637],{},"text-(--color-text-primary)"," — завжди правильний вибір. ",[3357,22640,5048],{}," — лише у примітивній палітрі.",[5063,22643,22645],{"icon":5092,"title":22644},"CSS робить роботу","JavaScript перемикає клас або атрибут. Все інше — CSS Custom Properties. Чим менше JS у темній темі — тим краще.",[5063,22647,22650,22651,22653],{"icon":22648,"title":22649},"i-heroicons-bolt","Anti-FOIT обов'язковий","Синхронний скрипт у ",[3357,22652,11764],{}," — не опція, а вимога для production. Без нього користувачі в темній темі побачать миготіння при кожному завантаженні.",[5063,22655,22658,22659,22661],{"icon":22656,"title":22657},"i-heroicons-arrow-down-tray","Ієрархія успадкування","CSS Custom Properties успадковуються у дереві DOM. ",[3357,22660,13873],{}," на контейнері — елегантний спосіб ізолювати теми без умовних класів у компонентах.",[3396,22663],{},[3353,22665,22666,22673],{},[22667,22668,22669,22670],"em",{},"Попередня стаття: ",[22470,22671,3315],{"href":22672},"\u002F21.tailwind\u002F08.tailwind-components-patterns",[22667,22674,22675,22676],{},"Наступна стаття: ",[22470,22677,22679],{"href":22678},"\u002F21.tailwind\u002F10.tailwind-arbitrary-container-queries","Довільні значення та контейнерні запити",[3776,22681,22682],{},"html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sqdDX, html code.shiki .sqdDX{--shiki-light:#800000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .sa4r_, html code.shiki .sa4r_{--shiki-light:#E50000;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s0P7L, html code.shiki .s0P7L{--shiki-light:#800000;--shiki-default:#808080;--shiki-dark:#808080}html pre.shiki code .sKtos, html code.shiki .sKtos{--shiki-light:#800000;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .su9tN, html code.shiki .su9tN{--shiki-light:#0000FF;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .sD7JJ, html code.shiki .sD7JJ{--shiki-light:#000000FF;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .s-QsJ, html code.shiki .s-QsJ{--shiki-light:#0070C1;--shiki-default:#4FC1FF;--shiki-dark:#4FC1FF}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .sDUd3, html code.shiki .sDUd3{--shiki-light:#0451A5;--shiki-default:#CE9178;--shiki-dark:#CE9178}",{"title":3430,"searchDepth":3444,"depth":3444,"links":22684},[22685,22686,22691,22700,22709,22717,22723,22728,22729],{"id":3350,"depth":3444,"text":3351},{"id":3400,"depth":3444,"text":3401,"children":22687},[22688,22689,22690],{"id":3405,"depth":3455,"text":3406},{"id":4731,"depth":3455,"text":4732},{"id":5054,"depth":3455,"text":5055},{"id":5159,"depth":3444,"text":22692,"children":22693},"Частина ІІ. Базовий dark: варіант у Tailwind v4",[22694,22696,22698],{"id":5166,"depth":3455,"text":22695},"2.1. Як працює dark: у Tailwind",{"id":6174,"depth":3455,"text":22697},"2.2. Перемикання на клас: @custom-variant dark",{"id":6493,"depth":3455,"text":22699},"2.3. Живий приклад: базова темна тема через dark:",{"id":7161,"depth":3444,"text":7162,"children":22701},[22702,22703,22705,22706,22707],{"id":7165,"depth":3455,"text":7166},{"id":7278,"depth":3455,"text":22704},"3.2. Визначення примітивної палітри в @theme",{"id":8093,"depth":3455,"text":8094},{"id":9111,"depth":3455,"text":9112},{"id":10455,"depth":3455,"text":22708},"3.5. Реєстрація семантичних токенів у @theme",{"id":10614,"depth":3444,"text":10615,"children":22710},[22711,22712,22714,22715,22716],{"id":10618,"depth":3455,"text":10619},{"id":10716,"depth":3455,"text":22713},"4.2. Зберігання вибору у localStorage",{"id":11724,"depth":3455,"text":11725},{"id":12144,"depth":3455,"text":12145},{"id":13625,"depth":3455,"text":13626},{"id":13818,"depth":3444,"text":13819,"children":22718},[22719,22720,22722],{"id":13822,"depth":3455,"text":13823},{"id":13869,"depth":3455,"text":22721},"5.2. Теми через data-theme атрибут",{"id":14545,"depth":3455,"text":14546},{"id":16593,"depth":3444,"text":16594,"children":22724},[22725,22726,22727],{"id":16597,"depth":3455,"text":16598},{"id":18655,"depth":3455,"text":18656},{"id":21680,"depth":3455,"text":21681},{"id":21822,"depth":3444,"text":21823},{"id":22481,"depth":3444,"text":22482},"Вичерпний посібник з реалізації темної теми у Tailwind CSS v4: від теорії CSS Custom Properties до production-ready системи токенів. Стратегії перемикання теми, semantic tokens, multi-theming, збереження вибору у localStorage та підтримка системних налаштувань.","md",null,{},{"title":3319,"description":22730},"o1-2pKiGmwF7kNHTBc6JHV4wjOvCddY5056OaYN_oxU",[22737,22739],{"title":3315,"path":3316,"stem":3317,"description":22738,"children":-1},"Академічний розбір вирішення проблеми повторюваності у Tailwind CSS v4: компонентний підхід, @apply для виняткових випадків, @utility для кастомних утиліт, @layer base\u002Fcomponents, @custom-variant та @plugin. Повний набір реальних компонентів із живими прикладами.",{"title":3323,"path":3324,"stem":3325,"description":22740,"children":-1},"Вичерпний посібник з довільних значень у Tailwind v4: синтаксис квадратних дужок [], нові круглі дужки (--var), довільні властивості, calc() та CSS-функції. Контейнерні запити @container: вбудована підтримка v4, варіанти @min-*, @max-*, компонентно-орієнтована адаптивність.",1782371239874]