[{"data":1,"prerenderedAt":11666},["ShallowReactive",2],{"navigation_docs":3,"-java-pr2-atlantafx-modern-themes":3135,"-java-pr2-atlantafx-modern-themes-surround":11661},[4,1669,1826,2280,2461,2668,2790,2840,2897,2931,3057,3094,3131],{"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,1346,1636,1665],{"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],{"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},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1352,1356,1360,1364,1368,1372,1376,1380,1384,1388,1392,1396,1400,1404,1408,1412,1416,1420,1424,1428,1432,1436,1440,1444,1448,1452,1456,1460,1464,1468,1472,1476,1480,1484,1488,1492,1496,1500,1504,1508,1512,1516,1520,1524,1528,1532,1536,1540,1544,1548,1552,1556,1560,1564,1568,1572,1576,1580,1584,1588,1592,1596,1600,1604,1608,1612,1616,1620,1624,1628,1632],{"title":1353,"path":1354,"stem":1355},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1357,"path":1358,"stem":1359},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1361,"path":1362,"stem":1363},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1365,"path":1366,"stem":1367},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1369,"path":1370,"stem":1371},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1373,"path":1374,"stem":1375},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1377,"path":1378,"stem":1379},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1381,"path":1382,"stem":1383},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1385,"path":1386,"stem":1387},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1389,"path":1390,"stem":1391},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1393,"path":1394,"stem":1395},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1397,"path":1398,"stem":1399},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1401,"path":1402,"stem":1403},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1405,"path":1406,"stem":1407},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1409,"path":1410,"stem":1411},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1413,"path":1414,"stem":1415},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1417,"path":1418,"stem":1419},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1421,"path":1422,"stem":1423},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1425,"path":1426,"stem":1427},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1429,"path":1430,"stem":1431},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1433,"path":1434,"stem":1435},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1437,"path":1438,"stem":1439},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1441,"path":1442,"stem":1443},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1445,"path":1446,"stem":1447},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1449,"path":1450,"stem":1451},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1453,"path":1454,"stem":1455},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1457,"path":1458,"stem":1459},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1461,"path":1462,"stem":1463},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1465,"path":1466,"stem":1467},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1469,"path":1470,"stem":1471},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1473,"path":1474,"stem":1475},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1477,"path":1478,"stem":1479},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1481,"path":1482,"stem":1483},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1485,"path":1486,"stem":1487},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1489,"path":1490,"stem":1491},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1493,"path":1494,"stem":1495},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1497,"path":1498,"stem":1499},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1501,"path":1502,"stem":1503},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1505,"path":1506,"stem":1507},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1509,"path":1510,"stem":1511},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1513,"path":1514,"stem":1515},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1517,"path":1518,"stem":1519},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1521,"path":1522,"stem":1523},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1525,"path":1526,"stem":1527},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1529,"path":1530,"stem":1531},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1533,"path":1534,"stem":1535},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1537,"path":1538,"stem":1539},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1541,"path":1542,"stem":1543},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1545,"path":1546,"stem":1547},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1549,"path":1550,"stem":1551},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1553,"path":1554,"stem":1555},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1557,"path":1558,"stem":1559},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1561,"path":1562,"stem":1563},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1565,"path":1566,"stem":1567},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1569,"path":1570,"stem":1571},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1573,"path":1574,"stem":1575},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1577,"path":1578,"stem":1579},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1581,"path":1582,"stem":1583},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1585,"path":1586,"stem":1587},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1589,"path":1590,"stem":1591},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1593,"path":1594,"stem":1595},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1597,"path":1598,"stem":1599},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1601,"path":1602,"stem":1603},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1605,"path":1606,"stem":1607},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1609,"path":1610,"stem":1611},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1613,"path":1614,"stem":1615},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1617,"path":1618,"stem":1619},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1621,"path":1622,"stem":1623},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1625,"path":1626,"stem":1627},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1629,"path":1630,"stem":1631},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1633,"path":1634,"stem":1635},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1637,"icon":658,"path":1638,"stem":1639,"children":1640,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1641,1645,1649,1653,1657,1661],{"title":1642,"path":1643,"stem":1644},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1646,"path":1647,"stem":1648},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1650,"path":1651,"stem":1652},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1654,"path":1655,"stem":1656},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1658,"path":1659,"stem":1660},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1662,"path":1663,"stem":1664},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1666,"path":1667,"stem":1668},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1670,"icon":1671,"path":1672,"stem":1673,"children":1674,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1675,1679,1683,1687,1691,1695,1699,1703,1707,1710,1714,1718,1722,1726,1730,1734,1738,1742,1746,1750,1754,1758,1762,1766,1770,1774,1778,1782,1786,1790,1794,1798,1802,1806,1810,1814,1818,1822],{"title":1676,"path":1677,"stem":1678},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1680,"path":1681,"stem":1682},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1684,"path":1685,"stem":1686},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1688,"path":1689,"stem":1690},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1692,"path":1693,"stem":1694},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1696,"path":1697,"stem":1698},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1700,"path":1701,"stem":1702},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1704,"path":1705,"stem":1706},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1708,"stem":1709},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1711,"path":1712,"stem":1713},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1715,"path":1716,"stem":1717},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1719,"path":1720,"stem":1721},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1723,"path":1724,"stem":1725},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1727,"path":1728,"stem":1729},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1731,"path":1732,"stem":1733},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1735,"path":1736,"stem":1737},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1739,"path":1740,"stem":1741},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1743,"path":1744,"stem":1745},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1747,"path":1748,"stem":1749},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1751,"path":1752,"stem":1753},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1755,"path":1756,"stem":1757},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1759,"path":1760,"stem":1761},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1763,"path":1764,"stem":1765},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1767,"path":1768,"stem":1769},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1771,"path":1772,"stem":1773},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1775,"path":1776,"stem":1777},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1779,"path":1780,"stem":1781},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1783,"path":1784,"stem":1785},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1787,"path":1788,"stem":1789},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1791,"path":1792,"stem":1793},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1795,"path":1796,"stem":1797},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1799,"path":1800,"stem":1801},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1803,"path":1804,"stem":1805},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1807,"path":1808,"stem":1809},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1811,"path":1812,"stem":1813},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1815,"path":1816,"stem":1817},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1819,"path":1820,"stem":1821},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1823,"path":1824,"stem":1825},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1827,"icon":1828,"path":1829,"stem":1830,"children":1831,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1832,1858,1912,1934,2238,2276],{"title":1833,"icon":1834,"path":1835,"stem":1836,"children":1837,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1838,1842,1846,1850,1854],{"title":1839,"path":1840,"stem":1841},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1843,"path":1844,"stem":1845},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1847,"path":1848,"stem":1849},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1851,"path":1852,"stem":1853},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1855,"path":1856,"stem":1857},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1859,"icon":1860,"path":1861,"stem":1862,"children":1863,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"title":1865,"path":1866,"stem":1867},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1869,"path":1870,"stem":1871},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1873,"path":1874,"stem":1875},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1877,"path":1878,"stem":1879},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1881,"path":1882,"stem":1883},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1885,"path":1886,"stem":1887},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1889,"path":1890,"stem":1891},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1893,"path":1894,"stem":1895},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1897,"path":1898,"stem":1899},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1901,"path":1902,"stem":1903},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1905,"path":1906,"stem":1907},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1909,"path":1910,"stem":1911},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1913,"icon":1914,"path":1915,"stem":1916,"children":1917,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[1918,1922,1926,1930],{"title":1919,"path":1920,"stem":1921},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":1923,"path":1924,"stem":1925},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":1927,"path":1928,"stem":1929},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":1931,"path":1932,"stem":1933},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":1935,"icon":1936,"path":1937,"stem":1938,"children":1939},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[1940,1941,1945,1949,1953,1957,2020,2055,2207],{"title":1935,"path":1937,"stem":1938},{"title":1942,"path":1943,"stem":1944},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":1946,"path":1947,"stem":1948},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":1950,"path":1951,"stem":1952},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":1954,"path":1955,"stem":1956},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":1958,"icon":132,"path":1959,"stem":1960,"children":1961},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[1962,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016],{"title":1963,"path":1959,"stem":1960},"TanStack Query: Майстерність Керування Станом Сервера",{"title":1965,"path":1966,"stem":1967},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":1969,"path":1970,"stem":1971},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":1973,"path":1974,"stem":1975},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":1977,"path":1978,"stem":1979},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":1981,"path":1982,"stem":1983},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":1985,"path":1986,"stem":1987},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":1989,"path":1990,"stem":1991},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":1993,"path":1994,"stem":1995},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":1997,"path":1998,"stem":1999},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2001,"path":2002,"stem":2003},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2005,"path":2006,"stem":2007},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2009,"path":2010,"stem":2011},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2013,"path":2014,"stem":2015},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2017,"path":2018,"stem":2019},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2021,"icon":1936,"path":2022,"stem":2023,"children":2024},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2025,2027,2031,2035,2039,2043,2047,2051],{"title":2026,"path":2022,"stem":2023},"React Router: Навігаційна система сучасного вебу",{"title":2028,"path":2029,"stem":2030},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2032,"path":2033,"stem":2034},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2036,"path":2037,"stem":2038},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2040,"path":2041,"stem":2042},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2044,"path":2045,"stem":2046},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2048,"path":2049,"stem":2050},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2052,"path":2053,"stem":2054},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2056,"icon":132,"path":2057,"stem":2058,"children":2059},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2060,2062,2078,2107,2116,2137,2153,2182],{"title":2061,"path":2057,"stem":2058},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2063,"stem":2064,"children":2065,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2066,2070,2074],{"title":2067,"path":2068,"stem":2069},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2071,"path":2072,"stem":2073},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2075,"path":2076,"stem":2077},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2079,"icon":132,"path":2080,"stem":2081,"children":2082,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2083,2087,2091,2095,2099,2103],{"title":2084,"path":2085,"stem":2086},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2088,"path":2089,"stem":2090},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2092,"path":2093,"stem":2094},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2096,"path":2097,"stem":2098},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2100,"path":2101,"stem":2102},"Підключення до 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":2104,"path":2105,"stem":2106},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2108,"icon":132,"path":2109,"stem":2110,"children":2111,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2112],{"title":2113,"path":2114,"stem":2115},"Проблеми класичного 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":2117,"icon":132,"path":2118,"stem":2119,"children":2120,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2121,2125,2129,2133],{"title":2122,"path":2123,"stem":2124},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2126,"path":2127,"stem":2128},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2130,"path":2131,"stem":2132},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2134,"path":2135,"stem":2136},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2138,"icon":92,"path":2139,"stem":2140,"children":2141,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2142,2146,2150],{"title":2143,"path":2144,"stem":2145},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2147,"path":2148,"stem":2149},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":1997,"path":2151,"stem":2152},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2154,"icon":132,"path":2155,"stem":2156,"children":2157,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2158,2162,2166,2170,2174,2178],{"title":2159,"path":2160,"stem":2161},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2163,"path":2164,"stem":2165},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2167,"path":2168,"stem":2169},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2171,"path":2172,"stem":2173},"Логіка 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":2175,"path":2176,"stem":2177},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2179,"path":2180,"stem":2181},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2183,"icon":132,"path":2184,"stem":2185,"children":2186,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2187,2191,2195,2199,2203],{"title":2188,"path":2189,"stem":2190},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2192,"path":2193,"stem":2194},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2196,"path":2197,"stem":2198},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2200,"path":2201,"stem":2202},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2204,"path":2205,"stem":2206},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2208,"icon":132,"path":2209,"stem":2210,"children":2211},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2212,2214,2218,2222,2226,2230,2234],{"title":2213,"path":2209,"stem":2210},"UI Бібліотеки в React",{"title":2215,"path":2216,"stem":2217},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2219,"path":2220,"stem":2221},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2223,"path":2224,"stem":2225},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2227,"path":2228,"stem":2229},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2231,"path":2232,"stem":2233},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2235,"path":2236,"stem":2237},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2239,"icon":2240,"path":2241,"stem":2242,"children":2243,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2244,2248,2252,2256,2260,2264,2268,2272],{"title":2245,"path":2246,"stem":2247},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2249,"path":2250,"stem":2251},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2253,"path":2254,"stem":2255},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2257,"path":2258,"stem":2259},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2261,"path":2262,"stem":2263},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2265,"path":2266,"stem":2267},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2269,"path":2270,"stem":2271},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2273,"path":2274,"stem":2275},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2277,"path":2278,"stem":2279},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2281,"icon":2282,"path":2283,"stem":2284,"children":2285,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2286,2289,2292,2296,2300,2304,2308],{"title":162,"path":2287,"stem":2288},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2290,"stem":2291},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2293,"path":2294,"stem":2295},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2297,"path":2298,"stem":2299},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2301,"path":2302,"stem":2303},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2305,"path":2306,"stem":2307},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2309,"path":2310,"stem":2311,"children":2312,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2313,2317,2321,2325,2329,2333,2337,2341,2345,2349,2353,2357,2361,2365,2369,2373,2377,2381,2385,2389,2393,2397,2401,2405,2409,2413,2417,2421,2425,2429,2433,2437,2441,2445,2449,2453,2457],{"title":2314,"path":2315,"stem":2316},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2318,"path":2319,"stem":2320},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2322,"path":2323,"stem":2324},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2326,"path":2327,"stem":2328},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2330,"path":2331,"stem":2332},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2334,"path":2335,"stem":2336},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2338,"path":2339,"stem":2340},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2342,"path":2343,"stem":2344},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2346,"path":2347,"stem":2348},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2350,"path":2351,"stem":2352},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2354,"path":2355,"stem":2356},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2358,"path":2359,"stem":2360},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2362,"path":2363,"stem":2364},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2366,"path":2367,"stem":2368},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2370,"path":2371,"stem":2372},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2374,"path":2375,"stem":2376},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2378,"path":2379,"stem":2380},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2382,"path":2383,"stem":2384},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2386,"path":2387,"stem":2388},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2390,"path":2391,"stem":2392},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2394,"path":2395,"stem":2396},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2398,"path":2399,"stem":2400},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2402,"path":2403,"stem":2404},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2406,"path":2407,"stem":2408},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2410,"path":2411,"stem":2412},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2414,"path":2415,"stem":2416},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2418,"path":2419,"stem":2420},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2422,"path":2423,"stem":2424},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2426,"path":2427,"stem":2428},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2430,"path":2431,"stem":2432},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2434,"path":2435,"stem":2436},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2438,"path":2439,"stem":2440},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2442,"path":2443,"stem":2444},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2446,"path":2447,"stem":2448},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2450,"path":2451,"stem":2452},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2454,"path":2455,"stem":2456},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2458,"path":2459,"stem":2460},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2462,"icon":2463,"path":2464,"stem":2465,"children":2466,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2467,2497,2520,2557,2586,2604,2638,2650,2659],{"title":2468,"icon":2469,"path":2470,"stem":2471,"children":2472,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2473,2477,2481,2485,2489,2493],{"title":2474,"path":2475,"stem":2476},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2478,"path":2479,"stem":2480},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2482,"path":2483,"stem":2484},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2486,"path":2487,"stem":2488},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2490,"path":2491,"stem":2492},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2494,"path":2495,"stem":2496},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2498,"icon":2463,"path":2499,"stem":2500,"children":2501,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2502,2506,2512,2516],{"title":2503,"path":2504,"stem":2505},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2507,"path":2508,"stem":2509,"children":2510},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2511],{"title":2507,"path":2508,"stem":2509},{"title":2513,"path":2514,"stem":2515},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2517,"path":2518,"stem":2519},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2521,"icon":2463,"path":2522,"stem":2523,"children":2524,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2525,2529,2533,2537,2541,2545,2549,2553],{"title":2526,"path":2527,"stem":2528},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2530,"path":2531,"stem":2532},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2534,"path":2535,"stem":2536},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2538,"path":2539,"stem":2540},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2542,"path":2543,"stem":2544},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2546,"path":2547,"stem":2548},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2550,"path":2551,"stem":2552},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2554,"path":2555,"stem":2556},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2558,"icon":2463,"path":2559,"stem":2560,"children":2561,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2562,2566,2570,2574,2578,2582],{"title":2563,"path":2564,"stem":2565},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2567,"path":2568,"stem":2569},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2571,"path":2572,"stem":2573},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2575,"path":2576,"stem":2577},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2579,"path":2580,"stem":2581},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2583,"path":2584,"stem":2585},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2587,"icon":2588,"path":2589,"stem":2590,"children":2591,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2592,2596,2600],{"title":2593,"path":2594,"stem":2595},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2597,"path":2598,"stem":2599},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2601,"path":2602,"stem":2603},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2605,"icon":2606,"path":2607,"stem":2608,"children":2609,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2610,2614,2618,2622,2626,2630,2634],{"title":2611,"path":2612,"stem":2613},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2615,"path":2616,"stem":2617},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2619,"path":2620,"stem":2621},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2623,"path":2624,"stem":2625},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2627,"path":2628,"stem":2629},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2631,"path":2632,"stem":2633},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2635,"path":2636,"stem":2637},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2635,"icon":793,"path":2639,"stem":2640,"children":2641,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2642,2646],{"title":2643,"path":2644,"stem":2645},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2647,"path":2648,"stem":2649},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2651,"icon":2652,"path":2653,"stem":2654,"children":2655,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2656],{"title":2651,"path":2657,"stem":2658},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2660,"icon":2661,"path":2662,"stem":2663,"children":2664,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2665],{"title":2660,"path":2666,"stem":2667},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2669,"icon":2670,"path":2671,"stem":2672,"children":2673,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2674,2750],{"title":2675,"icon":2676,"path":2677,"stem":2678,"children":2679},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2680,2682,2686,2690,2694,2698,2702,2706,2710,2714,2718,2722,2726,2730,2734,2738,2742,2746],{"title":2681,"path":2677,"stem":2678},"Docker: від нуля до production",{"title":2683,"path":2684,"stem":2685},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2687,"path":2688,"stem":2689},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2691,"path":2692,"stem":2693},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2695,"path":2696,"stem":2697},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2699,"path":2700,"stem":2701},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2703,"path":2704,"stem":2705},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2707,"path":2708,"stem":2709},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2711,"path":2712,"stem":2713},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2715,"path":2716,"stem":2717},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2719,"path":2720,"stem":2721},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2723,"path":2724,"stem":2725},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2727,"path":2728,"stem":2729},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2731,"path":2732,"stem":2733},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2735,"path":2736,"stem":2737},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2739,"path":2740,"stem":2741},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2743,"path":2744,"stem":2745},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2747,"path":2748,"stem":2749},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2751,"icon":2752,"path":2753,"stem":2754,"children":2755},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2756,2758,2762,2766,2770,2774,2778,2782,2786],{"title":2757,"path":2753,"stem":2754},"Kubernetes: від розробки до production",{"title":2759,"path":2760,"stem":2761},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2763,"path":2764,"stem":2765},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2767,"path":2768,"stem":2769},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2771,"path":2772,"stem":2773},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2775,"path":2776,"stem":2777},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2779,"path":2780,"stem":2781},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2783,"path":2784,"stem":2785},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2787,"path":2788,"stem":2789},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":2791,"icon":2792,"path":2793,"stem":2794,"children":2795,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[2796,2800,2804,2808,2812,2816,2820,2824,2828,2832,2836],{"title":2797,"path":2798,"stem":2799},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":2801,"path":2802,"stem":2803},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":2805,"path":2806,"stem":2807},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":2809,"path":2810,"stem":2811},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":2813,"path":2814,"stem":2815},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":2817,"path":2818,"stem":2819},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":2821,"path":2822,"stem":2823},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":2825,"path":2826,"stem":2827},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":2829,"path":2830,"stem":2831},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":2833,"path":2834,"stem":2835},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":2837,"path":2838,"stem":2839},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":2841,"icon":943,"path":2842,"stem":2843,"children":2844,"page":59},"DDD","\u002Fddd","10.ddd",[2845,2849,2853,2857,2861,2865,2869,2873,2877,2881,2885,2889,2893],{"title":2846,"path":2847,"stem":2848},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":2850,"path":2851,"stem":2852},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":2854,"path":2855,"stem":2856},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":2858,"path":2859,"stem":2860},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":2862,"path":2863,"stem":2864},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":2866,"path":2867,"stem":2868},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":2870,"path":2871,"stem":2872},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":2874,"path":2875,"stem":2876},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":2878,"path":2879,"stem":2880},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":2882,"path":2883,"stem":2884},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":2886,"path":2887,"stem":2888},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":2890,"path":2891,"stem":2892},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":2894,"path":2895,"stem":2896},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":2898,"icon":2899,"path":2900,"stem":2901,"children":2902,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[2903,2907,2911,2915,2919,2923,2927],{"title":2904,"path":2905,"stem":2906},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":2908,"path":2909,"stem":2910},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":2912,"path":2913,"stem":2914},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":2916,"path":2917,"stem":2918},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":2920,"path":2921,"stem":2922},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":2924,"path":2925,"stem":2926},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":2928,"path":2929,"stem":2930},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":2932,"icon":2933,"path":2934,"stem":2935,"children":2936,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[2937,2941,2945,2949,2953,2957,2961,2965,2969,2973,2977,2981,2985,2989,2993,2997,3001,3005,3009,3013,3017,3021,3025,3029,3033,3037,3041,3045,3049,3053],{"title":2938,"path":2939,"stem":2940},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":2942,"path":2943,"stem":2944},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":2946,"path":2947,"stem":2948},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":2950,"path":2951,"stem":2952},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":2954,"path":2955,"stem":2956},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":2958,"path":2959,"stem":2960},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":2962,"path":2963,"stem":2964},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":2966,"path":2967,"stem":2968},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":2970,"path":2971,"stem":2972},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":2974,"path":2975,"stem":2976},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":2978,"path":2979,"stem":2980},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":2982,"path":2983,"stem":2984},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":2986,"path":2987,"stem":2988},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":2990,"path":2991,"stem":2992},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":2994,"path":2995,"stem":2996},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":2998,"path":2999,"stem":3000},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3002,"path":3003,"stem":3004},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3006,"path":3007,"stem":3008},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3010,"path":3011,"stem":3012},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3014,"path":3015,"stem":3016},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3018,"path":3019,"stem":3020},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3022,"path":3023,"stem":3024},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3026,"path":3027,"stem":3028},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3030,"path":3031,"stem":3032},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3034,"path":3035,"stem":3036},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3038,"path":3039,"stem":3040},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3042,"path":3043,"stem":3044},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3046,"path":3047,"stem":3048},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3050,"path":3051,"stem":3052},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3054,"path":3055,"stem":3056},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3058,"path":3059,"stem":3060,"children":3061,"page":59},"AWS","\u002Faws","13.aws",[3062,3066,3070,3074,3078,3082,3086,3090],{"title":3063,"path":3064,"stem":3065},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3067,"path":3068,"stem":3069},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3071,"path":3072,"stem":3073},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3075,"path":3076,"stem":3077},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3079,"path":3080,"stem":3081},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3083,"path":3084,"stem":3085},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3087,"path":3088,"stem":3089},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3091,"path":3092,"stem":3093},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3095,"path":3096,"stem":3097,"children":3098,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3099,3103,3107,3111,3115,3119,3123,3127],{"title":3100,"path":3101,"stem":3102},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3104,"path":3105,"stem":3106},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3108,"path":3109,"stem":3110},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3112,"path":3113,"stem":3114},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3116,"path":3117,"stem":3118},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3120,"path":3121,"stem":3122},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3124,"path":3125,"stem":3126},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3128,"path":3129,"stem":3130},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3132,"path":3133,"stem":3134},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3136,"title":2454,"body":3137,"description":11655,"extension":11656,"links":11657,"meta":11658,"navigation":3400,"path":2455,"seo":11659,"stem":2456,"__hash__":11660},"docs\u002F04.java\u002Fpr2\u002F35.atlantafx-modern-themes.md",{"type":3138,"value":3139,"toc":11603},"minimark",[3140,3144,3149,3158,3164,3170,3216,3219,3245,3252,3255,3259,3270,3275,3370,3374,3418,3432,3436,3443,3803,3812,3820,3834,3838,3841,3896,3899,3901,3905,3908,3912,3918,3924,3930,3991,3996,4007,4011,4016,4021,4026,4085,4089,4100,4104,4109,4114,4119,4178,4182,4193,4197,4202,4207,4212,4238,4242,4253,4257,4360,4362,4366,4369,4373,4917,4921,5235,5239,5246,5550,5553,5555,5559,5562,5566,5572,5722,5727,5771,5775,5781,5862,5866,5884,5888,5894,6051,6056,6094,6099,6375,6379,6385,6597,6602,6628,6632,6638,6804,6808,6814,6974,6976,6980,6983,6987,6992,7029,7034,7071,7076,7105,7110,7147,7152,7276,7280,7283,7452,7455,7514,7521,7523,7527,7530,7534,7973,7977,8240,8244,8539,8543,8900,8903,8905,8909,8912,8916,9696,9700,9770,9774,10453,10457,11099,11103,11404,11406,11410,11508,11510,11514,11517,11523,11537,11543,11549,11561,11583,11590,11596,11599],[3141,3142,2454],"h1",{"id":3143},"atlantafx-сучасні-теми-для-javafx-додатків",[3145,3146,3148],"h2",{"id":3147},"вступ-проблема-стандартного-вигляду-javafx","Вступ: Проблема стандартного вигляду JavaFX",[3150,3151,3152,3153,3157],"p",{},"JavaFX постачається зі стандартною темою ",[3154,3155,3156],"strong",{},"Modena"," — це тема, що використовується за замовчуванням з JavaFX 8. Вона функціональна, але виглядає застаріло порівняно з сучасними веб-додатками та desktop-додатками (Electron, Flutter). Сірі кнопки, стандартні шрифти, відсутність темної теми — все це робить JavaFX-додатки схожими на програми з 2010-х років.",[3150,3159,3160,3163],{},[3154,3161,3162],{},"Створення власної теми з нуля — це складно."," Потрібно стилізувати десятки компонентів (Button, TextField, TableView, ComboBox, DatePicker), підтримувати світлу та темну теми, забезпечити консистентність кольорів, відступів, шрифтів. Це сотні рядків CSS-коду та тижні роботи.",[3150,3165,3166,3169],{},[3154,3167,3168],{},"AtlantaFX вирішує цю проблему."," Це колекція готових, професійно виглядаючих тем для JavaFX, натхненних сучасними веб-фреймворками та дизайн-системами (GitHub Primer, Nord, Dracula). AtlantaFX надає:",[3171,3172,3173,3180,3186,3192,3210],"ul",{},[3174,3175,3176,3179],"li",{},[3154,3177,3178],{},"7 готових тем"," (Primer Light\u002FDark, Nord Light\u002FDark, Cupertino Light\u002FDark, Dracula).",[3174,3181,3182,3185],{},[3154,3183,3184],{},"Додаткові контроли"," (ToggleSwitch, PasswordTextField, Popover, Notification, Message, Tile).",[3174,3187,3188,3191],{},[3154,3189,3190],{},"CSS Variables"," для легкої кастомізації кольорів.",[3174,3193,3194,3197,3198,3202,3203,3202,3206,3209],{},[3154,3195,3196],{},"Utility classes"," для швидкої стилізації (",[3199,3200,3201],"code",{},".text-bold",", ",[3199,3204,3205],{},".bg-success",[3199,3207,3208],{},".rounded",").",[3174,3211,3212,3215],{},[3154,3213,3214],{},"Сумісність з JavaFX 11+"," та модульною системою Java.",[3150,3217,3218],{},"Ця стаття — це повний гід по AtlantaFX: від встановлення до глибокої кастомізації. Ми розглянемо:",[3171,3220,3221,3224,3227,3230,3233,3236,3239,3242],{},[3174,3222,3223],{},"Встановлення та базове налаштування.",[3174,3225,3226],{},"Огляд всіх доступних тем.",[3174,3228,3229],{},"Перемикання тем у runtime.",[3174,3231,3232],{},"Додаткові контроли та їхнє використання.",[3174,3234,3235],{},"CSS Variables для кастомізації кольорів.",[3174,3237,3238],{},"Utility classes для швидкої стилізації.",[3174,3240,3241],{},"Інтеграцію з MVVM-додатками.",[3174,3243,3244],{},"Створення власної теми на базі AtlantaFX.",[3246,3247,3248,3251],"note",{},[3154,3249,3250],{},"AtlantaFX vs власний CSS:"," AtlantaFX — це не заміна CSS, а доповнення. Ви можете використовувати AtlantaFX як базову тему та додавати власні стилі поверх неї. Це економить час на стилізації стандартних компонентів та дозволяє зосередитися на унікальних елементах вашого додатку.",[3253,3254],"hr",{},[3145,3256,3258],{"id":3257},"встановлення-та-базове-налаштування","Встановлення та базове налаштування",[3150,3260,3261,3262,3265,3266,3269],{},"AtlantaFX доступний через Maven Central, тому встановлення зводиться до додавання залежності у ",[3199,3263,3264],{},"pom.xml"," або ",[3199,3267,3268],{},"build.gradle",".",[3271,3272,3274],"h3",{"id":3273},"maven","Maven",[3276,3277,3282],"pre",{"className":3278,"code":3279,"language":3280,"meta":3281,"style":3281},"language-xml shiki shiki-themes light-plus dark-plus dark-plus","\u003Cdependency>\n    \u003CgroupId>io.github.mkpaz\u003C\u002FgroupId>\n    \u003CartifactId>atlantafx-base\u003C\u002FartifactId>\n    \u003Cversion>2.1.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n","xml","",[3199,3283,3284,3300,3323,3342,3361],{"__ignoreMap":3281},[3285,3286,3289,3293,3297],"span",{"class":3287,"line":3288},"line",1,[3285,3290,3292],{"class":3291},"s0P7L","\u003C",[3285,3294,3296],{"class":3295},"sKtos","dependency",[3285,3298,3299],{"class":3291},">\n",[3285,3301,3303,3306,3309,3312,3316,3319,3321],{"class":3287,"line":3302},2,[3285,3304,3305],{"class":3291},"    \u003C",[3285,3307,3308],{"class":3295},"groupId",[3285,3310,3311],{"class":3291},">",[3285,3313,3315],{"class":3314},"sHH4Y","io.github.mkpaz",[3285,3317,3318],{"class":3291},"\u003C\u002F",[3285,3320,3308],{"class":3295},[3285,3322,3299],{"class":3291},[3285,3324,3326,3328,3331,3333,3336,3338,3340],{"class":3287,"line":3325},3,[3285,3327,3305],{"class":3291},[3285,3329,3330],{"class":3295},"artifactId",[3285,3332,3311],{"class":3291},[3285,3334,3335],{"class":3314},"atlantafx-base",[3285,3337,3318],{"class":3291},[3285,3339,3330],{"class":3295},[3285,3341,3299],{"class":3291},[3285,3343,3345,3347,3350,3352,3355,3357,3359],{"class":3287,"line":3344},4,[3285,3346,3305],{"class":3291},[3285,3348,3349],{"class":3295},"version",[3285,3351,3311],{"class":3291},[3285,3353,3354],{"class":3314},"2.1.0",[3285,3356,3318],{"class":3291},[3285,3358,3349],{"class":3295},[3285,3360,3299],{"class":3291},[3285,3362,3364,3366,3368],{"class":3287,"line":3363},5,[3285,3365,3318],{"class":3291},[3285,3367,3296],{"class":3295},[3285,3369,3299],{"class":3291},[3271,3371,3373],{"id":3372},"gradle","Gradle",[3276,3375,3379],{"className":3376,"code":3377,"language":3378,"meta":3281,"style":3281},"language-groovy shiki shiki-themes light-plus dark-plus dark-plus","repositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation 'io.github.mkpaz:atlantafx-base:2.1.0'\n}\n","groovy",[3199,3380,3381,3386,3391,3396,3402,3407,3413],{"__ignoreMap":3281},[3285,3382,3383],{"class":3287,"line":3288},[3285,3384,3385],{},"repositories {\n",[3285,3387,3388],{"class":3287,"line":3302},[3285,3389,3390],{},"    mavenCentral()\n",[3285,3392,3393],{"class":3287,"line":3325},[3285,3394,3395],{},"}\n",[3285,3397,3398],{"class":3287,"line":3344},[3285,3399,3401],{"emptyLinePlaceholder":3400},true,"\n",[3285,3403,3404],{"class":3287,"line":3363},[3285,3405,3406],{},"dependencies {\n",[3285,3408,3410],{"class":3287,"line":3409},6,[3285,3411,3412],{},"    implementation 'io.github.mkpaz:atlantafx-base:2.1.0'\n",[3285,3414,3416],{"class":3287,"line":3415},7,[3285,3417,3395],{},[3150,3419,3420,3423,3424,3431],{},[3154,3421,3422],{},"Версія 2.1.0"," — остання стабільна версія на момент написання статті (травень 2026). Перевірте ",[3425,3426,3430],"a",{"href":3427,"rel":3428},"https:\u002F\u002Fgithub.com\u002Fmkpaz\u002Fatlantafx\u002Freleases",[3429],"nofollow","GitHub Releases"," для актуальної версії.",[3271,3433,3435],{"id":3434},"застосування-теми-у-додатку","Застосування теми у додатку",[3150,3437,3438,3439,3442],{},"Після додавання залежності застосуйте тему у методі ",[3199,3440,3441],{},"Application.start()",":",[3276,3444,3448],{"className":3445,"code":3446,"language":3447,"meta":3281,"style":3281},"language-java shiki shiki-themes light-plus dark-plus dark-plus","package dev.kostyl.audiobook;\n\nimport atlantafx.base.theme.PrimerLight;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.layout.StackPane;\nimport javafx.stage.Stage;\n\npublic class AudiobookApp extends Application {\n    \n    @Override\n    public void start(Stage primaryStage) {\n        \u002F\u002F Застосування теми AtlantaFX\n        Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());\n        \n        \u002F\u002F Створення UI\n        Button button = new Button(\"Hello AtlantaFX!\");\n        StackPane root = new StackPane(button);\n        Scene scene = new Scene(root, 400, 300);\n        \n        primaryStage.setTitle(\"AtlantaFX Demo\");\n        primaryStage.setScene(scene);\n        primaryStage.show();\n    }\n    \n    public static void main(String[] args) {\n        launch(args);\n    }\n}\n","java",[3199,3449,3450,3459,3463,3471,3478,3485,3492,3499,3507,3512,3534,3540,3549,3575,3582,3611,3617,3623,3649,3668,3698,3703,3721,3734,3747,3753,3758,3784,3793,3798],{"__ignoreMap":3281},[3285,3451,3452,3456],{"class":3287,"line":3288},[3285,3453,3455],{"class":3454},"su1O8","package",[3285,3457,3458],{"class":3314}," dev.kostyl.audiobook;\n",[3285,3460,3461],{"class":3287,"line":3302},[3285,3462,3401],{"emptyLinePlaceholder":3400},[3285,3464,3465,3468],{"class":3287,"line":3325},[3285,3466,3467],{"class":3454},"import",[3285,3469,3470],{"class":3314}," atlantafx.base.theme.PrimerLight;\n",[3285,3472,3473,3475],{"class":3287,"line":3344},[3285,3474,3467],{"class":3454},[3285,3476,3477],{"class":3314}," javafx.application.Application;\n",[3285,3479,3480,3482],{"class":3287,"line":3363},[3285,3481,3467],{"class":3454},[3285,3483,3484],{"class":3314}," javafx.scene.Scene;\n",[3285,3486,3487,3489],{"class":3287,"line":3409},[3285,3488,3467],{"class":3454},[3285,3490,3491],{"class":3314}," javafx.scene.control.Button;\n",[3285,3493,3494,3496],{"class":3287,"line":3415},[3285,3495,3467],{"class":3454},[3285,3497,3498],{"class":3314}," javafx.scene.layout.StackPane;\n",[3285,3500,3502,3504],{"class":3287,"line":3501},8,[3285,3503,3467],{"class":3454},[3285,3505,3506],{"class":3314}," javafx.stage.Stage;\n",[3285,3508,3510],{"class":3287,"line":3509},9,[3285,3511,3401],{"emptyLinePlaceholder":3400},[3285,3513,3515,3518,3521,3525,3528,3531],{"class":3287,"line":3514},10,[3285,3516,3517],{"class":3454},"public",[3285,3519,3520],{"class":3454}," class",[3285,3522,3524],{"class":3523},"sN1BT"," AudiobookApp",[3285,3526,3527],{"class":3454}," extends",[3285,3529,3530],{"class":3523}," Application",[3285,3532,3533],{"class":3314}," {\n",[3285,3535,3537],{"class":3287,"line":3536},11,[3285,3538,3539],{"class":3314},"    \n",[3285,3541,3543,3546],{"class":3287,"line":3542},12,[3285,3544,3545],{"class":3314},"    @",[3285,3547,3548],{"class":3523},"Override\n",[3285,3550,3552,3555,3558,3562,3565,3568,3572],{"class":3287,"line":3551},13,[3285,3553,3554],{"class":3454},"    public",[3285,3556,3557],{"class":3523}," void",[3285,3559,3561],{"class":3560},"s8Opu"," start",[3285,3563,3564],{"class":3314},"(",[3285,3566,3567],{"class":3523},"Stage",[3285,3569,3571],{"class":3570},"siwwj"," primaryStage",[3285,3573,3574],{"class":3314},") {\n",[3285,3576,3578],{"class":3287,"line":3577},14,[3285,3579,3581],{"class":3580},"spJ8K","        \u002F\u002F Застосування теми AtlantaFX\n",[3285,3583,3585,3588,3590,3593,3595,3599,3602,3605,3608],{"class":3287,"line":3584},15,[3285,3586,3587],{"class":3570},"        Application",[3285,3589,3269],{"class":3314},[3285,3591,3592],{"class":3560},"setUserAgentStylesheet",[3285,3594,3564],{"class":3314},[3285,3596,3598],{"class":3597},"s8xlr","new",[3285,3600,3601],{"class":3560}," PrimerLight",[3285,3603,3604],{"class":3314},"().",[3285,3606,3607],{"class":3560},"getUserAgentStylesheet",[3285,3609,3610],{"class":3314},"());\n",[3285,3612,3614],{"class":3287,"line":3613},16,[3285,3615,3616],{"class":3314},"        \n",[3285,3618,3620],{"class":3287,"line":3619},17,[3285,3621,3622],{"class":3580},"        \u002F\u002F Створення UI\n",[3285,3624,3626,3629,3632,3635,3637,3640,3642,3646],{"class":3287,"line":3625},18,[3285,3627,3628],{"class":3523},"        Button",[3285,3630,3631],{"class":3570}," button",[3285,3633,3634],{"class":3314}," = ",[3285,3636,3598],{"class":3597},[3285,3638,3639],{"class":3560}," Button",[3285,3641,3564],{"class":3314},[3285,3643,3645],{"class":3644},"sbdoH","\"Hello AtlantaFX!\"",[3285,3647,3648],{"class":3314},");\n",[3285,3650,3652,3655,3658,3660,3662,3665],{"class":3287,"line":3651},19,[3285,3653,3654],{"class":3523},"        StackPane",[3285,3656,3657],{"class":3570}," root",[3285,3659,3634],{"class":3314},[3285,3661,3598],{"class":3597},[3285,3663,3664],{"class":3560}," StackPane",[3285,3666,3667],{"class":3314},"(button);\n",[3285,3669,3671,3674,3677,3679,3681,3684,3687,3691,3693,3696],{"class":3287,"line":3670},20,[3285,3672,3673],{"class":3523},"        Scene",[3285,3675,3676],{"class":3570}," scene",[3285,3678,3634],{"class":3314},[3285,3680,3598],{"class":3597},[3285,3682,3683],{"class":3560}," Scene",[3285,3685,3686],{"class":3314},"(root, ",[3285,3688,3690],{"class":3689},"sJj4R","400",[3285,3692,3202],{"class":3314},[3285,3694,3695],{"class":3689},"300",[3285,3697,3648],{"class":3314},[3285,3699,3701],{"class":3287,"line":3700},21,[3285,3702,3616],{"class":3314},[3285,3704,3706,3709,3711,3714,3716,3719],{"class":3287,"line":3705},22,[3285,3707,3708],{"class":3570},"        primaryStage",[3285,3710,3269],{"class":3314},[3285,3712,3713],{"class":3560},"setTitle",[3285,3715,3564],{"class":3314},[3285,3717,3718],{"class":3644},"\"AtlantaFX Demo\"",[3285,3720,3648],{"class":3314},[3285,3722,3724,3726,3728,3731],{"class":3287,"line":3723},23,[3285,3725,3708],{"class":3570},[3285,3727,3269],{"class":3314},[3285,3729,3730],{"class":3560},"setScene",[3285,3732,3733],{"class":3314},"(scene);\n",[3285,3735,3737,3739,3741,3744],{"class":3287,"line":3736},24,[3285,3738,3708],{"class":3570},[3285,3740,3269],{"class":3314},[3285,3742,3743],{"class":3560},"show",[3285,3745,3746],{"class":3314},"();\n",[3285,3748,3750],{"class":3287,"line":3749},25,[3285,3751,3752],{"class":3314},"    }\n",[3285,3754,3756],{"class":3287,"line":3755},26,[3285,3757,3539],{"class":3314},[3285,3759,3761,3763,3766,3768,3771,3773,3776,3779,3782],{"class":3287,"line":3760},27,[3285,3762,3554],{"class":3454},[3285,3764,3765],{"class":3454}," static",[3285,3767,3557],{"class":3523},[3285,3769,3770],{"class":3560}," main",[3285,3772,3564],{"class":3314},[3285,3774,3775],{"class":3523},"String",[3285,3777,3778],{"class":3314},"[] ",[3285,3780,3781],{"class":3570},"args",[3285,3783,3574],{"class":3314},[3285,3785,3787,3790],{"class":3287,"line":3786},28,[3285,3788,3789],{"class":3560},"        launch",[3285,3791,3792],{"class":3314},"(args);\n",[3285,3794,3796],{"class":3287,"line":3795},29,[3285,3797,3752],{"class":3314},[3285,3799,3801],{"class":3287,"line":3800},30,[3285,3802,3395],{"class":3314},[3150,3804,3805,3811],{},[3154,3806,3807,3808],{},"Рядок 14: ",[3199,3809,3810],{},"Application.setUserAgentStylesheet()"," — це метод JavaFX, що встановлює глобальну тему для всього додатку. Він замінює стандартну тему Modena на AtlantaFX.",[3150,3813,3814,3819],{},[3154,3815,3807,3816],{},[3199,3817,3818],{},"new PrimerLight().getUserAgentStylesheet()"," — створює екземпляр теми Primer Light та повертає шлях до її CSS-файлу.",[3150,3821,3822,3825,3826,3829,3830,3833],{},[3154,3823,3824],{},"Важливо:"," ",[3199,3827,3828],{},"setUserAgentStylesheet()"," має викликатися ",[3154,3831,3832],{},"до"," створення Scene. Якщо викликати після, тема не застосується до вже створених компонентів.",[3271,3835,3837],{"id":3836},"альтернативний-спосіб-через-scene","Альтернативний спосіб: Через Scene",[3150,3839,3840],{},"Якщо потрібно застосувати тему лише до конкретної Scene (а не глобально):",[3276,3842,3844],{"className":3445,"code":3843,"language":3447,"meta":3281,"style":3281},"Scene scene = new Scene(root, 400, 300);\nscene.getStylesheets().add(new PrimerLight().getUserAgentStylesheet());\n",[3199,3845,3846,3869],{"__ignoreMap":3281},[3285,3847,3848,3851,3853,3855,3857,3859,3861,3863,3865,3867],{"class":3287,"line":3288},[3285,3849,3850],{"class":3523},"Scene",[3285,3852,3676],{"class":3570},[3285,3854,3634],{"class":3314},[3285,3856,3598],{"class":3597},[3285,3858,3683],{"class":3560},[3285,3860,3686],{"class":3314},[3285,3862,3690],{"class":3689},[3285,3864,3202],{"class":3314},[3285,3866,3695],{"class":3689},[3285,3868,3648],{"class":3314},[3285,3870,3871,3874,3876,3879,3881,3884,3886,3888,3890,3892,3894],{"class":3287,"line":3302},[3285,3872,3873],{"class":3570},"scene",[3285,3875,3269],{"class":3314},[3285,3877,3878],{"class":3560},"getStylesheets",[3285,3880,3604],{"class":3314},[3285,3882,3883],{"class":3560},"add",[3285,3885,3564],{"class":3314},[3285,3887,3598],{"class":3597},[3285,3889,3601],{"class":3560},[3285,3891,3604],{"class":3314},[3285,3893,3607],{"class":3560},[3285,3895,3610],{"class":3314},[3150,3897,3898],{},"Цей підхід корисний, якщо у додатку кілька вікон з різними темами.",[3253,3900],{},[3145,3902,3904],{"id":3903},"огляд-доступних-тем","Огляд доступних тем",[3150,3906,3907],{},"AtlantaFX постачається з 7 готовими темами, кожна з яких має унікальну колірну палітру та стиль.",[3271,3909,3911],{"id":3910},"_1-primer-light-primer-dark","1. Primer Light \u002F Primer Dark",[3150,3913,3914,3917],{},[3154,3915,3916],{},"Натхнення:"," GitHub Primer Design System.",[3150,3919,3920,3923],{},[3154,3921,3922],{},"Колірна палітра:"," Нейтральні сірі тони з синім акцентом.",[3150,3925,3926,3929],{},[3154,3927,3928],{},"Коли використовувати:"," Універсальна тема для бізнес-додатків, інструментів розробника, адміністративних панелей.",[3276,3931,3933],{"className":3445,"code":3932,"language":3447,"meta":3281,"style":3281},"\u002F\u002F Light\nApplication.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());\n\n\u002F\u002F Dark\nApplication.setUserAgentStylesheet(new PrimerDark().getUserAgentStylesheet());\n",[3199,3934,3935,3940,3961,3965,3970],{"__ignoreMap":3281},[3285,3936,3937],{"class":3287,"line":3288},[3285,3938,3939],{"class":3580},"\u002F\u002F Light\n",[3285,3941,3942,3945,3947,3949,3951,3953,3955,3957,3959],{"class":3287,"line":3302},[3285,3943,3944],{"class":3570},"Application",[3285,3946,3269],{"class":3314},[3285,3948,3592],{"class":3560},[3285,3950,3564],{"class":3314},[3285,3952,3598],{"class":3597},[3285,3954,3601],{"class":3560},[3285,3956,3604],{"class":3314},[3285,3958,3607],{"class":3560},[3285,3960,3610],{"class":3314},[3285,3962,3963],{"class":3287,"line":3325},[3285,3964,3401],{"emptyLinePlaceholder":3400},[3285,3966,3967],{"class":3287,"line":3344},[3285,3968,3969],{"class":3580},"\u002F\u002F Dark\n",[3285,3971,3972,3974,3976,3978,3980,3982,3985,3987,3989],{"class":3287,"line":3363},[3285,3973,3944],{"class":3570},[3285,3975,3269],{"class":3314},[3285,3977,3592],{"class":3560},[3285,3979,3564],{"class":3314},[3285,3981,3598],{"class":3597},[3285,3983,3984],{"class":3560}," PrimerDark",[3285,3986,3604],{"class":3314},[3285,3988,3607],{"class":3560},[3285,3990,3610],{"class":3314},[3150,3992,3993],{},[3154,3994,3995],{},"Особливості:",[3171,3997,3998,4001,4004],{},[3174,3999,4000],{},"Високий контраст для читабельності.",[3174,4002,4003],{},"Мінімалістичний дизайн без зайвих деталей.",[3174,4005,4006],{},"Синій акцент (#0969da) для кнопок та посилань.",[3271,4008,4010],{"id":4009},"_2-nord-light-nord-dark","2. Nord Light \u002F Nord Dark",[3150,4012,4013,4015],{},[3154,4014,3916],{}," Nord Color Palette — арктична, холодна колірна схема.",[3150,4017,4018,4020],{},[3154,4019,3922],{}," Холодні сині та сірі тони.",[3150,4022,4023,4025],{},[3154,4024,3928],{}," Додатки для розробників (IDE, редактори коду), творчі інструменти.",[3276,4027,4029],{"className":3445,"code":4028,"language":3447,"meta":3281,"style":3281},"\u002F\u002F Light\nApplication.setUserAgentStylesheet(new NordLight().getUserAgentStylesheet());\n\n\u002F\u002F Dark\nApplication.setUserAgentStylesheet(new NordDark().getUserAgentStylesheet());\n",[3199,4030,4031,4035,4056,4060,4064],{"__ignoreMap":3281},[3285,4032,4033],{"class":3287,"line":3288},[3285,4034,3939],{"class":3580},[3285,4036,4037,4039,4041,4043,4045,4047,4050,4052,4054],{"class":3287,"line":3302},[3285,4038,3944],{"class":3570},[3285,4040,3269],{"class":3314},[3285,4042,3592],{"class":3560},[3285,4044,3564],{"class":3314},[3285,4046,3598],{"class":3597},[3285,4048,4049],{"class":3560}," NordLight",[3285,4051,3604],{"class":3314},[3285,4053,3607],{"class":3560},[3285,4055,3610],{"class":3314},[3285,4057,4058],{"class":3287,"line":3325},[3285,4059,3401],{"emptyLinePlaceholder":3400},[3285,4061,4062],{"class":3287,"line":3344},[3285,4063,3969],{"class":3580},[3285,4065,4066,4068,4070,4072,4074,4076,4079,4081,4083],{"class":3287,"line":3363},[3285,4067,3944],{"class":3570},[3285,4069,3269],{"class":3314},[3285,4071,3592],{"class":3560},[3285,4073,3564],{"class":3314},[3285,4075,3598],{"class":3597},[3285,4077,4078],{"class":3560}," NordDark",[3285,4080,3604],{"class":3314},[3285,4082,3607],{"class":3560},[3285,4084,3610],{"class":3314},[3150,4086,4087],{},[3154,4088,3995],{},[3171,4090,4091,4094,4097],{},[3174,4092,4093],{},"М'які, приглушені кольори (не яскраві).",[3174,4095,4096],{},"Популярна серед розробників (Nord — одна з найпопулярніших тем для VS Code, Vim).",[3174,4098,4099],{},"Темна тема має глибокий синьо-сірий фон (#2e3440).",[3271,4101,4103],{"id":4102},"_3-cupertino-light-cupertino-dark","3. Cupertino Light \u002F Cupertino Dark",[3150,4105,4106,4108],{},[3154,4107,3916],{}," macOS та iOS дизайн (Apple Human Interface Guidelines).",[3150,4110,4111,4113],{},[3154,4112,3922],{}," Світлі сірі тони з синім акцентом (#007aff).",[3150,4115,4116,4118],{},[3154,4117,3928],{}," Додатки для macOS, додатки з Apple-подібним дизайном.",[3276,4120,4122],{"className":3445,"code":4121,"language":3447,"meta":3281,"style":3281},"\u002F\u002F Light\nApplication.setUserAgentStylesheet(new CupertinoLight().getUserAgentStylesheet());\n\n\u002F\u002F Dark\nApplication.setUserAgentStylesheet(new CupertinoDark().getUserAgentStylesheet());\n",[3199,4123,4124,4128,4149,4153,4157],{"__ignoreMap":3281},[3285,4125,4126],{"class":3287,"line":3288},[3285,4127,3939],{"class":3580},[3285,4129,4130,4132,4134,4136,4138,4140,4143,4145,4147],{"class":3287,"line":3302},[3285,4131,3944],{"class":3570},[3285,4133,3269],{"class":3314},[3285,4135,3592],{"class":3560},[3285,4137,3564],{"class":3314},[3285,4139,3598],{"class":3597},[3285,4141,4142],{"class":3560}," CupertinoLight",[3285,4144,3604],{"class":3314},[3285,4146,3607],{"class":3560},[3285,4148,3610],{"class":3314},[3285,4150,4151],{"class":3287,"line":3325},[3285,4152,3401],{"emptyLinePlaceholder":3400},[3285,4154,4155],{"class":3287,"line":3344},[3285,4156,3969],{"class":3580},[3285,4158,4159,4161,4163,4165,4167,4169,4172,4174,4176],{"class":3287,"line":3363},[3285,4160,3944],{"class":3570},[3285,4162,3269],{"class":3314},[3285,4164,3592],{"class":3560},[3285,4166,3564],{"class":3314},[3285,4168,3598],{"class":3597},[3285,4170,4171],{"class":3560}," CupertinoDark",[3285,4173,3604],{"class":3314},[3285,4175,3607],{"class":3560},[3285,4177,3610],{"class":3314},[3150,4179,4180],{},[3154,4181,3995],{},[3171,4183,4184,4187,4190],{},[3174,4185,4186],{},"Заокруглені кути (більш округлі, ніж у Primer).",[3174,4188,4189],{},"Світлі тіні та м'які переходи.",[3174,4191,4192],{},"Синій акцент (#007aff) — фірмовий колір Apple.",[3271,4194,4196],{"id":4195},"_4-dracula","4. Dracula",[3150,4198,4199,4201],{},[3154,4200,3916],{}," Dracula Theme — популярна темна тема для редакторів коду.",[3150,4203,4204,4206],{},[3154,4205,3922],{}," Темний фіолетовий фон (#282a36) з яскравими акцентами (рожевий, зелений, жовтий).",[3150,4208,4209,4211],{},[3154,4210,3928],{}," Додатки для розробників, творчі інструменти, нічний режим.",[3276,4213,4215],{"className":3445,"code":4214,"language":3447,"meta":3281,"style":3281},"Application.setUserAgentStylesheet(new Dracula().getUserAgentStylesheet());\n",[3199,4216,4217],{"__ignoreMap":3281},[3285,4218,4219,4221,4223,4225,4227,4229,4232,4234,4236],{"class":3287,"line":3288},[3285,4220,3944],{"class":3570},[3285,4222,3269],{"class":3314},[3285,4224,3592],{"class":3560},[3285,4226,3564],{"class":3314},[3285,4228,3598],{"class":3597},[3285,4230,4231],{"class":3560}," Dracula",[3285,4233,3604],{"class":3314},[3285,4235,3607],{"class":3560},[3285,4237,3610],{"class":3314},[3150,4239,4240],{},[3154,4241,3995],{},[3171,4243,4244,4247,4250],{},[3174,4245,4246],{},"Висока контрастність між фоном та текстом.",[3174,4248,4249],{},"Яскраві акцентні кольори (рожевий #ff79c6, зелений #50fa7b).",[3174,4251,4252],{},"Популярна серед розробників (Dracula — одна з найпопулярніших тем для терміналів та редакторів).",[3271,4254,4256],{"id":4255},"порівняння-тем","Порівняння тем",[4258,4259,4260,4288,4312,4336],"card-group",{},[4261,4262,4265,4271,4277,4283],"card",{"icon":4263,"title":4264},"i-heroicons-document-text","Primer",[3150,4266,4267,4270],{},[3154,4268,4269],{},"Стиль:"," Мінімалістичний, бізнесовий",[3150,4272,4273,4276],{},[3154,4274,4275],{},"Акцент:"," Синій (#0969da)",[3150,4278,4279,4282],{},[3154,4280,4281],{},"Використання:"," Бізнес-додатки, інструменти розробника",[3150,4284,4285,4287],{},[3154,4286,3995],{}," Високий контраст, чіткі лінії",[4261,4289,4292,4297,4302,4307],{"icon":4290,"title":4291},"i-heroicons-sparkles","Nord",[3150,4293,4294,4296],{},[3154,4295,4269],{}," Арктичний, холодний",[3150,4298,4299,4301],{},[3154,4300,4275],{}," Блакитний (#88c0d0)",[3150,4303,4304,4306],{},[3154,4305,4281],{}," IDE, редактори коду",[3150,4308,4309,4311],{},[3154,4310,3995],{}," М'які кольори, популярна серед розробників",[4261,4313,4316,4321,4326,4331],{"icon":4314,"title":4315},"i-heroicons-device-phone-mobile","Cupertino",[3150,4317,4318,4320],{},[3154,4319,4269],{}," Apple-подібний",[3150,4322,4323,4325],{},[3154,4324,4275],{}," Синій (#007aff)",[3150,4327,4328,4330],{},[3154,4329,4281],{}," macOS додатки",[3150,4332,4333,4335],{},[3154,4334,3995],{}," Заокруглені кути, світлі тіні",[4261,4337,4340,4345,4350,4355],{"icon":4338,"title":4339},"i-heroicons-moon","Dracula",[3150,4341,4342,4344],{},[3154,4343,4269],{}," Темний, яскравий",[3150,4346,4347,4349],{},[3154,4348,4275],{}," Рожевий (#ff79c6)",[3150,4351,4352,4354],{},[3154,4353,4281],{}," Нічний режим, творчі інструменти",[3150,4356,4357,4359],{},[3154,4358,3995],{}," Висока контрастність, яскраві акценти",[3253,4361],{},[3145,4363,4365],{"id":4364},"перемикання-тем-у-runtime","Перемикання тем у runtime",[3150,4367,4368],{},"Користувачі очікують можливість змінювати тему без перезапуску додатку. AtlantaFX підтримує динамічну зміну тем.",[3271,4370,4372],{"id":4371},"простий-спосіб-зміна-user-agent-stylesheet","Простий спосіб: Зміна User Agent Stylesheet",[3276,4374,4376],{"className":3445,"code":4375,"language":3447,"meta":3281,"style":3281},"public class ThemeManager {\n    \n    public enum Theme {\n        PRIMER_LIGHT(new PrimerLight()),\n        PRIMER_DARK(new PrimerDark()),\n        NORD_LIGHT(new NordLight()),\n        NORD_DARK(new NordDark()),\n        CUPERTINO_LIGHT(new CupertinoLight()),\n        CUPERTINO_DARK(new CupertinoDark()),\n        DRACULA(new Dracula());\n        \n        private final atlantafx.base.theme.Theme theme;\n        \n        Theme(atlantafx.base.theme.Theme theme) {\n            this.theme = theme;\n        }\n        \n        public String getStylesheet() {\n            return theme.getUserAgentStylesheet();\n        }\n    }\n    \n    private Theme currentTheme = Theme.PRIMER_LIGHT;\n    \n    public void setTheme(Theme theme) {\n        this.currentTheme = theme;\n        Application.setUserAgentStylesheet(theme.getStylesheet());\n    }\n    \n    public Theme getCurrentTheme() {\n        return currentTheme;\n    }\n    \n    public void toggleDarkMode() {\n        switch (currentTheme) {\n            case PRIMER_LIGHT -> setTheme(Theme.PRIMER_DARK);\n            case PRIMER_DARK -> setTheme(Theme.PRIMER_LIGHT);\n            case NORD_LIGHT -> setTheme(Theme.NORD_DARK);\n            case NORD_DARK -> setTheme(Theme.NORD_LIGHT);\n            case CUPERTINO_LIGHT -> setTheme(Theme.CUPERTINO_DARK);\n            case CUPERTINO_DARK -> setTheme(Theme.CUPERTINO_LIGHT);\n            case DRACULA -> setTheme(Theme.PRIMER_LIGHT);\n        }\n    }\n}\n",[3199,4377,4378,4389,4393,4405,4417,4428,4439,4450,4461,4472,4483,4487,4519,4523,4549,4561,4566,4570,4584,4597,4601,4605,4609,4630,4634,4651,4663,4682,4686,4690,4701,4710,4715,4720,4732,4741,4766,4788,4811,4834,4857,4880,4902,4907,4912],{"__ignoreMap":3281},[3285,4379,4380,4382,4384,4387],{"class":3287,"line":3288},[3285,4381,3517],{"class":3454},[3285,4383,3520],{"class":3454},[3285,4385,4386],{"class":3523}," ThemeManager",[3285,4388,3533],{"class":3314},[3285,4390,4391],{"class":3287,"line":3302},[3285,4392,3539],{"class":3314},[3285,4394,4395,4397,4400,4403],{"class":3287,"line":3325},[3285,4396,3554],{"class":3454},[3285,4398,4399],{"class":3454}," enum",[3285,4401,4402],{"class":3523}," Theme",[3285,4404,3533],{"class":3314},[3285,4406,4407,4410,4412,4414],{"class":3287,"line":3344},[3285,4408,4409],{"class":3314},"        PRIMER_LIGHT(",[3285,4411,3598],{"class":3597},[3285,4413,3601],{"class":3560},[3285,4415,4416],{"class":3314},"()),\n",[3285,4418,4419,4422,4424,4426],{"class":3287,"line":3363},[3285,4420,4421],{"class":3314},"        PRIMER_DARK(",[3285,4423,3598],{"class":3597},[3285,4425,3984],{"class":3560},[3285,4427,4416],{"class":3314},[3285,4429,4430,4433,4435,4437],{"class":3287,"line":3409},[3285,4431,4432],{"class":3314},"        NORD_LIGHT(",[3285,4434,3598],{"class":3597},[3285,4436,4049],{"class":3560},[3285,4438,4416],{"class":3314},[3285,4440,4441,4444,4446,4448],{"class":3287,"line":3415},[3285,4442,4443],{"class":3314},"        NORD_DARK(",[3285,4445,3598],{"class":3597},[3285,4447,4078],{"class":3560},[3285,4449,4416],{"class":3314},[3285,4451,4452,4455,4457,4459],{"class":3287,"line":3501},[3285,4453,4454],{"class":3314},"        CUPERTINO_LIGHT(",[3285,4456,3598],{"class":3597},[3285,4458,4142],{"class":3560},[3285,4460,4416],{"class":3314},[3285,4462,4463,4466,4468,4470],{"class":3287,"line":3509},[3285,4464,4465],{"class":3314},"        CUPERTINO_DARK(",[3285,4467,3598],{"class":3597},[3285,4469,4171],{"class":3560},[3285,4471,4416],{"class":3314},[3285,4473,4474,4477,4479,4481],{"class":3287,"line":3514},[3285,4475,4476],{"class":3314},"        DRACULA(",[3285,4478,3598],{"class":3597},[3285,4480,4231],{"class":3560},[3285,4482,3610],{"class":3314},[3285,4484,4485],{"class":3287,"line":3536},[3285,4486,3616],{"class":3314},[3285,4488,4489,4492,4495,4498,4500,4503,4505,4508,4510,4513,4516],{"class":3287,"line":3542},[3285,4490,4491],{"class":3454},"        private",[3285,4493,4494],{"class":3454}," final",[3285,4496,4497],{"class":3523}," atlantafx",[3285,4499,3269],{"class":3314},[3285,4501,4502],{"class":3523},"base",[3285,4504,3269],{"class":3314},[3285,4506,4507],{"class":3523},"theme",[3285,4509,3269],{"class":3314},[3285,4511,4512],{"class":3523},"Theme",[3285,4514,4515],{"class":3570}," theme",[3285,4517,4518],{"class":3314},";\n",[3285,4520,4521],{"class":3287,"line":3551},[3285,4522,3616],{"class":3314},[3285,4524,4525,4528,4530,4533,4535,4537,4539,4541,4543,4545,4547],{"class":3287,"line":3577},[3285,4526,4527],{"class":3560},"        Theme",[3285,4529,3564],{"class":3314},[3285,4531,4532],{"class":3523},"atlantafx",[3285,4534,3269],{"class":3314},[3285,4536,4502],{"class":3523},[3285,4538,3269],{"class":3314},[3285,4540,4507],{"class":3523},[3285,4542,3269],{"class":3314},[3285,4544,4512],{"class":3523},[3285,4546,4515],{"class":3570},[3285,4548,3574],{"class":3314},[3285,4550,4551,4554,4556,4558],{"class":3287,"line":3584},[3285,4552,4553],{"class":3454},"            this",[3285,4555,3269],{"class":3314},[3285,4557,4507],{"class":3570},[3285,4559,4560],{"class":3314}," = theme;\n",[3285,4562,4563],{"class":3287,"line":3613},[3285,4564,4565],{"class":3314},"        }\n",[3285,4567,4568],{"class":3287,"line":3619},[3285,4569,3616],{"class":3314},[3285,4571,4572,4575,4578,4581],{"class":3287,"line":3625},[3285,4573,4574],{"class":3454},"        public",[3285,4576,4577],{"class":3523}," String",[3285,4579,4580],{"class":3560}," getStylesheet",[3285,4582,4583],{"class":3314},"() {\n",[3285,4585,4586,4589,4591,4593,4595],{"class":3287,"line":3651},[3285,4587,4588],{"class":3597},"            return",[3285,4590,4515],{"class":3570},[3285,4592,3269],{"class":3314},[3285,4594,3607],{"class":3560},[3285,4596,3746],{"class":3314},[3285,4598,4599],{"class":3287,"line":3670},[3285,4600,4565],{"class":3314},[3285,4602,4603],{"class":3287,"line":3700},[3285,4604,3752],{"class":3314},[3285,4606,4607],{"class":3287,"line":3705},[3285,4608,3539],{"class":3314},[3285,4610,4611,4614,4616,4619,4621,4623,4625,4628],{"class":3287,"line":3723},[3285,4612,4613],{"class":3454},"    private",[3285,4615,4402],{"class":3523},[3285,4617,4618],{"class":3570}," currentTheme",[3285,4620,3634],{"class":3314},[3285,4622,4512],{"class":3570},[3285,4624,3269],{"class":3314},[3285,4626,4627],{"class":3570},"PRIMER_LIGHT",[3285,4629,4518],{"class":3314},[3285,4631,4632],{"class":3287,"line":3736},[3285,4633,3539],{"class":3314},[3285,4635,4636,4638,4640,4643,4645,4647,4649],{"class":3287,"line":3749},[3285,4637,3554],{"class":3454},[3285,4639,3557],{"class":3523},[3285,4641,4642],{"class":3560}," setTheme",[3285,4644,3564],{"class":3314},[3285,4646,4512],{"class":3523},[3285,4648,4515],{"class":3570},[3285,4650,3574],{"class":3314},[3285,4652,4653,4656,4658,4661],{"class":3287,"line":3755},[3285,4654,4655],{"class":3454},"        this",[3285,4657,3269],{"class":3314},[3285,4659,4660],{"class":3570},"currentTheme",[3285,4662,4560],{"class":3314},[3285,4664,4665,4667,4669,4671,4673,4675,4677,4680],{"class":3287,"line":3760},[3285,4666,3587],{"class":3570},[3285,4668,3269],{"class":3314},[3285,4670,3592],{"class":3560},[3285,4672,3564],{"class":3314},[3285,4674,4507],{"class":3570},[3285,4676,3269],{"class":3314},[3285,4678,4679],{"class":3560},"getStylesheet",[3285,4681,3610],{"class":3314},[3285,4683,4684],{"class":3287,"line":3786},[3285,4685,3752],{"class":3314},[3285,4687,4688],{"class":3287,"line":3795},[3285,4689,3539],{"class":3314},[3285,4691,4692,4694,4696,4699],{"class":3287,"line":3800},[3285,4693,3554],{"class":3454},[3285,4695,4402],{"class":3523},[3285,4697,4698],{"class":3560}," getCurrentTheme",[3285,4700,4583],{"class":3314},[3285,4702,4704,4707],{"class":3287,"line":4703},31,[3285,4705,4706],{"class":3597},"        return",[3285,4708,4709],{"class":3314}," currentTheme;\n",[3285,4711,4713],{"class":3287,"line":4712},32,[3285,4714,3752],{"class":3314},[3285,4716,4718],{"class":3287,"line":4717},33,[3285,4719,3539],{"class":3314},[3285,4721,4723,4725,4727,4730],{"class":3287,"line":4722},34,[3285,4724,3554],{"class":3454},[3285,4726,3557],{"class":3523},[3285,4728,4729],{"class":3560}," toggleDarkMode",[3285,4731,4583],{"class":3314},[3285,4733,4735,4738],{"class":3287,"line":4734},35,[3285,4736,4737],{"class":3597},"        switch",[3285,4739,4740],{"class":3314}," (currentTheme) {\n",[3285,4742,4744,4747,4750,4753,4755,4757,4759,4761,4764],{"class":3287,"line":4743},36,[3285,4745,4746],{"class":3597},"            case",[3285,4748,4749],{"class":3314}," PRIMER_LIGHT ",[3285,4751,4752],{"class":3454},"->",[3285,4754,4642],{"class":3560},[3285,4756,3564],{"class":3314},[3285,4758,4512],{"class":3570},[3285,4760,3269],{"class":3314},[3285,4762,4763],{"class":3570},"PRIMER_DARK",[3285,4765,3648],{"class":3314},[3285,4767,4769,4771,4774,4776,4778,4780,4782,4784,4786],{"class":3287,"line":4768},37,[3285,4770,4746],{"class":3597},[3285,4772,4773],{"class":3314}," PRIMER_DARK ",[3285,4775,4752],{"class":3454},[3285,4777,4642],{"class":3560},[3285,4779,3564],{"class":3314},[3285,4781,4512],{"class":3570},[3285,4783,3269],{"class":3314},[3285,4785,4627],{"class":3570},[3285,4787,3648],{"class":3314},[3285,4789,4791,4793,4796,4798,4800,4802,4804,4806,4809],{"class":3287,"line":4790},38,[3285,4792,4746],{"class":3597},[3285,4794,4795],{"class":3314}," NORD_LIGHT ",[3285,4797,4752],{"class":3454},[3285,4799,4642],{"class":3560},[3285,4801,3564],{"class":3314},[3285,4803,4512],{"class":3570},[3285,4805,3269],{"class":3314},[3285,4807,4808],{"class":3570},"NORD_DARK",[3285,4810,3648],{"class":3314},[3285,4812,4814,4816,4819,4821,4823,4825,4827,4829,4832],{"class":3287,"line":4813},39,[3285,4815,4746],{"class":3597},[3285,4817,4818],{"class":3314}," NORD_DARK ",[3285,4820,4752],{"class":3454},[3285,4822,4642],{"class":3560},[3285,4824,3564],{"class":3314},[3285,4826,4512],{"class":3570},[3285,4828,3269],{"class":3314},[3285,4830,4831],{"class":3570},"NORD_LIGHT",[3285,4833,3648],{"class":3314},[3285,4835,4837,4839,4842,4844,4846,4848,4850,4852,4855],{"class":3287,"line":4836},40,[3285,4838,4746],{"class":3597},[3285,4840,4841],{"class":3314}," CUPERTINO_LIGHT ",[3285,4843,4752],{"class":3454},[3285,4845,4642],{"class":3560},[3285,4847,3564],{"class":3314},[3285,4849,4512],{"class":3570},[3285,4851,3269],{"class":3314},[3285,4853,4854],{"class":3570},"CUPERTINO_DARK",[3285,4856,3648],{"class":3314},[3285,4858,4860,4862,4865,4867,4869,4871,4873,4875,4878],{"class":3287,"line":4859},41,[3285,4861,4746],{"class":3597},[3285,4863,4864],{"class":3314}," CUPERTINO_DARK ",[3285,4866,4752],{"class":3454},[3285,4868,4642],{"class":3560},[3285,4870,3564],{"class":3314},[3285,4872,4512],{"class":3570},[3285,4874,3269],{"class":3314},[3285,4876,4877],{"class":3570},"CUPERTINO_LIGHT",[3285,4879,3648],{"class":3314},[3285,4881,4883,4885,4888,4890,4892,4894,4896,4898,4900],{"class":3287,"line":4882},42,[3285,4884,4746],{"class":3597},[3285,4886,4887],{"class":3314}," DRACULA ",[3285,4889,4752],{"class":3454},[3285,4891,4642],{"class":3560},[3285,4893,3564],{"class":3314},[3285,4895,4512],{"class":3570},[3285,4897,3269],{"class":3314},[3285,4899,4627],{"class":3570},[3285,4901,3648],{"class":3314},[3285,4903,4905],{"class":3287,"line":4904},43,[3285,4906,4565],{"class":3314},[3285,4908,4910],{"class":3287,"line":4909},44,[3285,4911,3752],{"class":3314},[3285,4913,4915],{"class":3287,"line":4914},45,[3285,4916,3395],{"class":3314},[3271,4918,4920],{"id":4919},"використання-у-controller","Використання у Controller",[3276,4922,4924],{"className":3445,"code":4923,"language":3447,"meta":3281,"style":3281},"public class SettingsController {\n    \n    private final ThemeManager themeManager;\n    \n    @FXML private ComboBox\u003CThemeManager.Theme> themeComboBox;\n    @FXML private ToggleSwitch darkModeToggle;\n    \n    @Inject\n    public SettingsController(ThemeManager themeManager) {\n        this.themeManager = themeManager;\n    }\n    \n    @FXML\n    public void initialize() {\n        \u002F\u002F Заповнення ComboBox темами\n        themeComboBox.getItems().addAll(ThemeManager.Theme.values());\n        themeComboBox.setValue(themeManager.getCurrentTheme());\n        \n        \u002F\u002F Обробка зміни теми\n        themeComboBox.setOnAction(e -> {\n            ThemeManager.Theme selected = themeComboBox.getValue();\n            themeManager.setTheme(selected);\n        });\n        \n        \u002F\u002F Обробка перемикання Dark Mode\n        darkModeToggle.setOnAction(e -> {\n            themeManager.toggleDarkMode();\n        });\n    }\n}\n",[3199,4925,4926,4937,4941,4954,4958,4988,5004,5008,5015,5029,5041,5045,5049,5056,5067,5072,5102,5122,5126,5131,5147,5170,5183,5188,5192,5197,5212,5223,5227,5231],{"__ignoreMap":3281},[3285,4927,4928,4930,4932,4935],{"class":3287,"line":3288},[3285,4929,3517],{"class":3454},[3285,4931,3520],{"class":3454},[3285,4933,4934],{"class":3523}," SettingsController",[3285,4936,3533],{"class":3314},[3285,4938,4939],{"class":3287,"line":3302},[3285,4940,3539],{"class":3314},[3285,4942,4943,4945,4947,4949,4952],{"class":3287,"line":3325},[3285,4944,4613],{"class":3454},[3285,4946,4494],{"class":3454},[3285,4948,4386],{"class":3523},[3285,4950,4951],{"class":3570}," themeManager",[3285,4953,4518],{"class":3314},[3285,4955,4956],{"class":3287,"line":3344},[3285,4957,3539],{"class":3314},[3285,4959,4960,4962,4965,4968,4971,4973,4976,4978,4980,4983,4986],{"class":3287,"line":3363},[3285,4961,3545],{"class":3314},[3285,4963,4964],{"class":3523},"FXML",[3285,4966,4967],{"class":3454}," private",[3285,4969,4970],{"class":3523}," ComboBox",[3285,4972,3292],{"class":3314},[3285,4974,4975],{"class":3523},"ThemeManager",[3285,4977,3269],{"class":3314},[3285,4979,4512],{"class":3523},[3285,4981,4982],{"class":3314},"> ",[3285,4984,4985],{"class":3570},"themeComboBox",[3285,4987,4518],{"class":3314},[3285,4989,4990,4992,4994,4996,4999,5002],{"class":3287,"line":3409},[3285,4991,3545],{"class":3314},[3285,4993,4964],{"class":3523},[3285,4995,4967],{"class":3454},[3285,4997,4998],{"class":3523}," ToggleSwitch",[3285,5000,5001],{"class":3570}," darkModeToggle",[3285,5003,4518],{"class":3314},[3285,5005,5006],{"class":3287,"line":3415},[3285,5007,3539],{"class":3314},[3285,5009,5010,5012],{"class":3287,"line":3501},[3285,5011,3545],{"class":3314},[3285,5013,5014],{"class":3523},"Inject\n",[3285,5016,5017,5019,5021,5023,5025,5027],{"class":3287,"line":3509},[3285,5018,3554],{"class":3454},[3285,5020,4934],{"class":3560},[3285,5022,3564],{"class":3314},[3285,5024,4975],{"class":3523},[3285,5026,4951],{"class":3570},[3285,5028,3574],{"class":3314},[3285,5030,5031,5033,5035,5038],{"class":3287,"line":3514},[3285,5032,4655],{"class":3454},[3285,5034,3269],{"class":3314},[3285,5036,5037],{"class":3570},"themeManager",[3285,5039,5040],{"class":3314}," = themeManager;\n",[3285,5042,5043],{"class":3287,"line":3536},[3285,5044,3752],{"class":3314},[3285,5046,5047],{"class":3287,"line":3542},[3285,5048,3539],{"class":3314},[3285,5050,5051,5053],{"class":3287,"line":3551},[3285,5052,3545],{"class":3314},[3285,5054,5055],{"class":3523},"FXML\n",[3285,5057,5058,5060,5062,5065],{"class":3287,"line":3577},[3285,5059,3554],{"class":3454},[3285,5061,3557],{"class":3523},[3285,5063,5064],{"class":3560}," initialize",[3285,5066,4583],{"class":3314},[3285,5068,5069],{"class":3287,"line":3584},[3285,5070,5071],{"class":3580},"        \u002F\u002F Заповнення ComboBox темами\n",[3285,5073,5074,5077,5079,5082,5084,5087,5089,5091,5093,5095,5097,5100],{"class":3287,"line":3613},[3285,5075,5076],{"class":3570},"        themeComboBox",[3285,5078,3269],{"class":3314},[3285,5080,5081],{"class":3560},"getItems",[3285,5083,3604],{"class":3314},[3285,5085,5086],{"class":3560},"addAll",[3285,5088,3564],{"class":3314},[3285,5090,4975],{"class":3570},[3285,5092,3269],{"class":3314},[3285,5094,4512],{"class":3570},[3285,5096,3269],{"class":3314},[3285,5098,5099],{"class":3560},"values",[3285,5101,3610],{"class":3314},[3285,5103,5104,5106,5108,5111,5113,5115,5117,5120],{"class":3287,"line":3619},[3285,5105,5076],{"class":3570},[3285,5107,3269],{"class":3314},[3285,5109,5110],{"class":3560},"setValue",[3285,5112,3564],{"class":3314},[3285,5114,5037],{"class":3570},[3285,5116,3269],{"class":3314},[3285,5118,5119],{"class":3560},"getCurrentTheme",[3285,5121,3610],{"class":3314},[3285,5123,5124],{"class":3287,"line":3625},[3285,5125,3616],{"class":3314},[3285,5127,5128],{"class":3287,"line":3651},[3285,5129,5130],{"class":3580},"        \u002F\u002F Обробка зміни теми\n",[3285,5132,5133,5135,5137,5140,5143,5145],{"class":3287,"line":3670},[3285,5134,5076],{"class":3570},[3285,5136,3269],{"class":3314},[3285,5138,5139],{"class":3560},"setOnAction",[3285,5141,5142],{"class":3314},"(e ",[3285,5144,4752],{"class":3454},[3285,5146,3533],{"class":3314},[3285,5148,5149,5152,5154,5156,5159,5161,5163,5165,5168],{"class":3287,"line":3700},[3285,5150,5151],{"class":3523},"            ThemeManager",[3285,5153,3269],{"class":3314},[3285,5155,4512],{"class":3523},[3285,5157,5158],{"class":3570}," selected",[3285,5160,3634],{"class":3314},[3285,5162,4985],{"class":3570},[3285,5164,3269],{"class":3314},[3285,5166,5167],{"class":3560},"getValue",[3285,5169,3746],{"class":3314},[3285,5171,5172,5175,5177,5180],{"class":3287,"line":3705},[3285,5173,5174],{"class":3570},"            themeManager",[3285,5176,3269],{"class":3314},[3285,5178,5179],{"class":3560},"setTheme",[3285,5181,5182],{"class":3314},"(selected);\n",[3285,5184,5185],{"class":3287,"line":3723},[3285,5186,5187],{"class":3314},"        });\n",[3285,5189,5190],{"class":3287,"line":3736},[3285,5191,3616],{"class":3314},[3285,5193,5194],{"class":3287,"line":3749},[3285,5195,5196],{"class":3580},"        \u002F\u002F Обробка перемикання Dark Mode\n",[3285,5198,5199,5202,5204,5206,5208,5210],{"class":3287,"line":3755},[3285,5200,5201],{"class":3570},"        darkModeToggle",[3285,5203,3269],{"class":3314},[3285,5205,5139],{"class":3560},[3285,5207,5142],{"class":3314},[3285,5209,4752],{"class":3454},[3285,5211,3533],{"class":3314},[3285,5213,5214,5216,5218,5221],{"class":3287,"line":3760},[3285,5215,5174],{"class":3570},[3285,5217,3269],{"class":3314},[3285,5219,5220],{"class":3560},"toggleDarkMode",[3285,5222,3746],{"class":3314},[3285,5224,5225],{"class":3287,"line":3786},[3285,5226,5187],{"class":3314},[3285,5228,5229],{"class":3287,"line":3795},[3285,5230,3752],{"class":3314},[3285,5232,5233],{"class":3287,"line":3800},[3285,5234,3395],{"class":3314},[3271,5236,5238],{"id":5237},"збереження-вибраної-теми","Збереження вибраної теми",[3150,5240,5241,5242,5245],{},"Використовуємо ",[3199,5243,5244],{},"Preferences"," API для збереження вибраної теми між запусками:",[3276,5247,5249],{"className":3445,"code":5248,"language":3447,"meta":3281,"style":3281},"public class ThemeManager {\n    \n    private static final String PREFS_KEY_THEME = \"theme\";\n    private final Preferences prefs;\n    \n    public ThemeManager() {\n        this.prefs = Preferences.userNodeForPackage(ThemeManager.class);\n        loadSavedTheme();\n    }\n    \n    private void loadSavedTheme() {\n        String savedTheme = prefs.get(PREFS_KEY_THEME, Theme.PRIMER_LIGHT.name());\n        try {\n            Theme theme = Theme.valueOf(savedTheme);\n            setTheme(theme);\n        } catch (IllegalArgumentException e) {\n            setTheme(Theme.PRIMER_LIGHT);\n        }\n    }\n    \n    public void setTheme(Theme theme) {\n        this.currentTheme = theme;\n        Application.setUserAgentStylesheet(theme.getStylesheet());\n        prefs.put(PREFS_KEY_THEME, theme.name());\n    }\n}\n",[3199,5250,5251,5261,5265,5285,5299,5303,5311,5340,5347,5351,5355,5366,5399,5406,5425,5433,5452,5466,5470,5474,5478,5494,5504,5522,5542,5546],{"__ignoreMap":3281},[3285,5252,5253,5255,5257,5259],{"class":3287,"line":3288},[3285,5254,3517],{"class":3454},[3285,5256,3520],{"class":3454},[3285,5258,4386],{"class":3523},[3285,5260,3533],{"class":3314},[3285,5262,5263],{"class":3287,"line":3302},[3285,5264,3539],{"class":3314},[3285,5266,5267,5269,5271,5273,5275,5278,5280,5283],{"class":3287,"line":3325},[3285,5268,4613],{"class":3454},[3285,5270,3765],{"class":3454},[3285,5272,4494],{"class":3454},[3285,5274,4577],{"class":3523},[3285,5276,5277],{"class":3570}," PREFS_KEY_THEME",[3285,5279,3634],{"class":3314},[3285,5281,5282],{"class":3644},"\"theme\"",[3285,5284,4518],{"class":3314},[3285,5286,5287,5289,5291,5294,5297],{"class":3287,"line":3344},[3285,5288,4613],{"class":3454},[3285,5290,4494],{"class":3454},[3285,5292,5293],{"class":3523}," Preferences",[3285,5295,5296],{"class":3570}," prefs",[3285,5298,4518],{"class":3314},[3285,5300,5301],{"class":3287,"line":3363},[3285,5302,3539],{"class":3314},[3285,5304,5305,5307,5309],{"class":3287,"line":3409},[3285,5306,3554],{"class":3454},[3285,5308,4386],{"class":3560},[3285,5310,4583],{"class":3314},[3285,5312,5313,5315,5317,5320,5322,5324,5326,5329,5331,5333,5335,5338],{"class":3287,"line":3415},[3285,5314,4655],{"class":3454},[3285,5316,3269],{"class":3314},[3285,5318,5319],{"class":3570},"prefs",[3285,5321,3634],{"class":3314},[3285,5323,5244],{"class":3570},[3285,5325,3269],{"class":3314},[3285,5327,5328],{"class":3560},"userNodeForPackage",[3285,5330,3564],{"class":3314},[3285,5332,4975],{"class":3570},[3285,5334,3269],{"class":3314},[3285,5336,5337],{"class":3570},"class",[3285,5339,3648],{"class":3314},[3285,5341,5342,5345],{"class":3287,"line":3501},[3285,5343,5344],{"class":3560},"        loadSavedTheme",[3285,5346,3746],{"class":3314},[3285,5348,5349],{"class":3287,"line":3509},[3285,5350,3752],{"class":3314},[3285,5352,5353],{"class":3287,"line":3514},[3285,5354,3539],{"class":3314},[3285,5356,5357,5359,5361,5364],{"class":3287,"line":3536},[3285,5358,4613],{"class":3454},[3285,5360,3557],{"class":3523},[3285,5362,5363],{"class":3560}," loadSavedTheme",[3285,5365,4583],{"class":3314},[3285,5367,5368,5371,5374,5376,5378,5380,5383,5386,5388,5390,5392,5394,5397],{"class":3287,"line":3542},[3285,5369,5370],{"class":3523},"        String",[3285,5372,5373],{"class":3570}," savedTheme",[3285,5375,3634],{"class":3314},[3285,5377,5319],{"class":3570},[3285,5379,3269],{"class":3314},[3285,5381,5382],{"class":3560},"get",[3285,5384,5385],{"class":3314},"(PREFS_KEY_THEME, ",[3285,5387,4512],{"class":3570},[3285,5389,3269],{"class":3314},[3285,5391,4627],{"class":3570},[3285,5393,3269],{"class":3314},[3285,5395,5396],{"class":3560},"name",[3285,5398,3610],{"class":3314},[3285,5400,5401,5404],{"class":3287,"line":3551},[3285,5402,5403],{"class":3597},"        try",[3285,5405,3533],{"class":3314},[3285,5407,5408,5411,5413,5415,5417,5419,5422],{"class":3287,"line":3577},[3285,5409,5410],{"class":3523},"            Theme",[3285,5412,4515],{"class":3570},[3285,5414,3634],{"class":3314},[3285,5416,4512],{"class":3570},[3285,5418,3269],{"class":3314},[3285,5420,5421],{"class":3560},"valueOf",[3285,5423,5424],{"class":3314},"(savedTheme);\n",[3285,5426,5427,5430],{"class":3287,"line":3584},[3285,5428,5429],{"class":3560},"            setTheme",[3285,5431,5432],{"class":3314},"(theme);\n",[3285,5434,5435,5438,5441,5444,5447,5450],{"class":3287,"line":3613},[3285,5436,5437],{"class":3314},"        } ",[3285,5439,5440],{"class":3597},"catch",[3285,5442,5443],{"class":3314}," (",[3285,5445,5446],{"class":3523},"IllegalArgumentException",[3285,5448,5449],{"class":3570}," e",[3285,5451,3574],{"class":3314},[3285,5453,5454,5456,5458,5460,5462,5464],{"class":3287,"line":3619},[3285,5455,5429],{"class":3560},[3285,5457,3564],{"class":3314},[3285,5459,4512],{"class":3570},[3285,5461,3269],{"class":3314},[3285,5463,4627],{"class":3570},[3285,5465,3648],{"class":3314},[3285,5467,5468],{"class":3287,"line":3625},[3285,5469,4565],{"class":3314},[3285,5471,5472],{"class":3287,"line":3651},[3285,5473,3752],{"class":3314},[3285,5475,5476],{"class":3287,"line":3670},[3285,5477,3539],{"class":3314},[3285,5479,5480,5482,5484,5486,5488,5490,5492],{"class":3287,"line":3700},[3285,5481,3554],{"class":3454},[3285,5483,3557],{"class":3523},[3285,5485,4642],{"class":3560},[3285,5487,3564],{"class":3314},[3285,5489,4512],{"class":3523},[3285,5491,4515],{"class":3570},[3285,5493,3574],{"class":3314},[3285,5495,5496,5498,5500,5502],{"class":3287,"line":3705},[3285,5497,4655],{"class":3454},[3285,5499,3269],{"class":3314},[3285,5501,4660],{"class":3570},[3285,5503,4560],{"class":3314},[3285,5505,5506,5508,5510,5512,5514,5516,5518,5520],{"class":3287,"line":3723},[3285,5507,3587],{"class":3570},[3285,5509,3269],{"class":3314},[3285,5511,3592],{"class":3560},[3285,5513,3564],{"class":3314},[3285,5515,4507],{"class":3570},[3285,5517,3269],{"class":3314},[3285,5519,4679],{"class":3560},[3285,5521,3610],{"class":3314},[3285,5523,5524,5527,5529,5532,5534,5536,5538,5540],{"class":3287,"line":3736},[3285,5525,5526],{"class":3570},"        prefs",[3285,5528,3269],{"class":3314},[3285,5530,5531],{"class":3560},"put",[3285,5533,5385],{"class":3314},[3285,5535,4507],{"class":3570},[3285,5537,3269],{"class":3314},[3285,5539,5396],{"class":3560},[3285,5541,3610],{"class":3314},[3285,5543,5544],{"class":3287,"line":3749},[3285,5545,3752],{"class":3314},[3285,5547,5548],{"class":3287,"line":3755},[3285,5549,3395],{"class":3314},[3150,5551,5552],{},"Тепер при запуску додатку автоматично завантажується остання вибрана тема.",[3253,5554],{},[3145,5556,5558],{"id":5557},"додаткові-контроли-atlantafx","Додаткові контроли AtlantaFX",[3150,5560,5561],{},"AtlantaFX надає додаткові контроли, яких немає у стандартному JavaFX.",[3271,5563,5565],{"id":5564},"toggleswitch-перемикач-ios-стилю","ToggleSwitch: Перемикач iOS-стилю",[3150,5567,5568,5571],{},[3154,5569,5570],{},"ToggleSwitch"," — це сучасна альтернатива CheckBox, що виглядає як перемикач у мобільних додатках.",[3276,5573,5575],{"className":3445,"code":5574,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.ToggleSwitch;\n\nToggleSwitch darkModeSwitch = new ToggleSwitch(\"Dark Mode\");\ndarkModeSwitch.setSelected(false);\n\ndarkModeSwitch.selectedProperty().addListener((obs, oldVal, newVal) -> {\n    if (newVal) {\n        themeManager.setTheme(ThemeManager.Theme.PRIMER_DARK);\n    } else {\n        themeManager.setTheme(ThemeManager.Theme.PRIMER_LIGHT);\n    }\n});\n",[3199,5576,5577,5584,5588,5608,5625,5629,5650,5658,5681,5691,5713,5717],{"__ignoreMap":3281},[3285,5578,5579,5581],{"class":3287,"line":3288},[3285,5580,3467],{"class":3454},[3285,5582,5583],{"class":3314}," atlantafx.base.controls.ToggleSwitch;\n",[3285,5585,5586],{"class":3287,"line":3302},[3285,5587,3401],{"emptyLinePlaceholder":3400},[3285,5589,5590,5592,5595,5597,5599,5601,5603,5606],{"class":3287,"line":3325},[3285,5591,5570],{"class":3523},[3285,5593,5594],{"class":3570}," darkModeSwitch",[3285,5596,3634],{"class":3314},[3285,5598,3598],{"class":3597},[3285,5600,4998],{"class":3560},[3285,5602,3564],{"class":3314},[3285,5604,5605],{"class":3644},"\"Dark Mode\"",[3285,5607,3648],{"class":3314},[3285,5609,5610,5613,5615,5618,5620,5623],{"class":3287,"line":3344},[3285,5611,5612],{"class":3570},"darkModeSwitch",[3285,5614,3269],{"class":3314},[3285,5616,5617],{"class":3560},"setSelected",[3285,5619,3564],{"class":3314},[3285,5621,5622],{"class":3454},"false",[3285,5624,3648],{"class":3314},[3285,5626,5627],{"class":3287,"line":3363},[3285,5628,3401],{"emptyLinePlaceholder":3400},[3285,5630,5631,5633,5635,5638,5640,5643,5646,5648],{"class":3287,"line":3409},[3285,5632,5612],{"class":3570},[3285,5634,3269],{"class":3314},[3285,5636,5637],{"class":3560},"selectedProperty",[3285,5639,3604],{"class":3314},[3285,5641,5642],{"class":3560},"addListener",[3285,5644,5645],{"class":3314},"((obs, oldVal, newVal) ",[3285,5647,4752],{"class":3454},[3285,5649,3533],{"class":3314},[3285,5651,5652,5655],{"class":3287,"line":3415},[3285,5653,5654],{"class":3597},"    if",[3285,5656,5657],{"class":3314}," (newVal) {\n",[3285,5659,5660,5663,5665,5667,5669,5671,5673,5675,5677,5679],{"class":3287,"line":3501},[3285,5661,5662],{"class":3570},"        themeManager",[3285,5664,3269],{"class":3314},[3285,5666,5179],{"class":3560},[3285,5668,3564],{"class":3314},[3285,5670,4975],{"class":3570},[3285,5672,3269],{"class":3314},[3285,5674,4512],{"class":3570},[3285,5676,3269],{"class":3314},[3285,5678,4763],{"class":3570},[3285,5680,3648],{"class":3314},[3285,5682,5683,5686,5689],{"class":3287,"line":3509},[3285,5684,5685],{"class":3314},"    } ",[3285,5687,5688],{"class":3597},"else",[3285,5690,3533],{"class":3314},[3285,5692,5693,5695,5697,5699,5701,5703,5705,5707,5709,5711],{"class":3287,"line":3514},[3285,5694,5662],{"class":3570},[3285,5696,3269],{"class":3314},[3285,5698,5179],{"class":3560},[3285,5700,3564],{"class":3314},[3285,5702,4975],{"class":3570},[3285,5704,3269],{"class":3314},[3285,5706,4512],{"class":3570},[3285,5708,3269],{"class":3314},[3285,5710,4627],{"class":3570},[3285,5712,3648],{"class":3314},[3285,5714,5715],{"class":3287,"line":3536},[3285,5716,3752],{"class":3314},[3285,5718,5719],{"class":3287,"line":3542},[3285,5720,5721],{"class":3314},"});\n",[3150,5723,5724],{},[3154,5725,5726],{},"Стилізація:",[3276,5728,5732],{"className":5729,"code":5730,"language":5731,"meta":3281,"style":3281},"language-css shiki shiki-themes light-plus dark-plus dark-plus",".toggle-switch {\n    -fx-background-color: -color-bg-subtle;\n}\n\n.toggle-switch:selected {\n    -fx-background-color: -color-accent-emphasis;\n}\n","css",[3199,5733,5734,5742,5747,5751,5755,5762,5767],{"__ignoreMap":3281},[3285,5735,5736,5740],{"class":3287,"line":3288},[3285,5737,5739],{"class":5738},"sqdDX",".toggle-switch",[3285,5741,3533],{"class":3314},[3285,5743,5744],{"class":3287,"line":3302},[3285,5745,5746],{"class":3314},"    -fx-background-color: -color-bg-subtle;\n",[3285,5748,5749],{"class":3287,"line":3325},[3285,5750,3395],{"class":3314},[3285,5752,5753],{"class":3287,"line":3344},[3285,5754,3401],{"emptyLinePlaceholder":3400},[3285,5756,5757,5759],{"class":3287,"line":3363},[3285,5758,5739],{"class":5738},[3285,5760,5761],{"class":3314},":selected {\n",[3285,5763,5764],{"class":3287,"line":3409},[3285,5765,5766],{"class":3314},"    -fx-background-color: -color-accent-emphasis;\n",[3285,5768,5769],{"class":3287,"line":3415},[3285,5770,3395],{"class":3314},[3271,5772,5774],{"id":5773},"passwordtextfield-поле-пароля-з-кнопкою-показу","PasswordTextField: Поле пароля з кнопкою показу",[3150,5776,5777,5780],{},[3154,5778,5779],{},"PasswordTextField"," — це розширення стандартного PasswordField з кнопкою для показу\u002Fприховування пароля.",[3276,5782,5784],{"className":3445,"code":5783,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.PasswordTextField;\n\nPasswordTextField passwordField = new PasswordTextField();\npasswordField.setPromptText(\"Enter password\");\npasswordField.setLeft(new FontIcon(Material2AL.LOCK)); \u002F\u002F Іконка зліва\n",[3199,5785,5786,5793,5797,5813,5830],{"__ignoreMap":3281},[3285,5787,5788,5790],{"class":3287,"line":3288},[3285,5789,3467],{"class":3454},[3285,5791,5792],{"class":3314}," atlantafx.base.controls.PasswordTextField;\n",[3285,5794,5795],{"class":3287,"line":3302},[3285,5796,3401],{"emptyLinePlaceholder":3400},[3285,5798,5799,5801,5804,5806,5808,5811],{"class":3287,"line":3325},[3285,5800,5779],{"class":3523},[3285,5802,5803],{"class":3570}," passwordField",[3285,5805,3634],{"class":3314},[3285,5807,3598],{"class":3597},[3285,5809,5810],{"class":3560}," PasswordTextField",[3285,5812,3746],{"class":3314},[3285,5814,5815,5818,5820,5823,5825,5828],{"class":3287,"line":3344},[3285,5816,5817],{"class":3570},"passwordField",[3285,5819,3269],{"class":3314},[3285,5821,5822],{"class":3560},"setPromptText",[3285,5824,3564],{"class":3314},[3285,5826,5827],{"class":3644},"\"Enter password\"",[3285,5829,3648],{"class":3314},[3285,5831,5832,5834,5836,5839,5841,5843,5846,5848,5851,5853,5856,5859],{"class":3287,"line":3363},[3285,5833,5817],{"class":3570},[3285,5835,3269],{"class":3314},[3285,5837,5838],{"class":3560},"setLeft",[3285,5840,3564],{"class":3314},[3285,5842,3598],{"class":3597},[3285,5844,5845],{"class":3560}," FontIcon",[3285,5847,3564],{"class":3314},[3285,5849,5850],{"class":3570},"Material2AL",[3285,5852,3269],{"class":3314},[3285,5854,5855],{"class":3570},"LOCK",[3285,5857,5858],{"class":3314},")); ",[3285,5860,5861],{"class":3580},"\u002F\u002F Іконка зліва\n",[3150,5863,5864],{},[3154,5865,3995],{},[3171,5867,5868,5871,5881],{},[3174,5869,5870],{},"Кнопка \"показати пароль\" (іконка ока) справа.",[3174,5872,5873,5874,5877,5878,3269],{},"Підтримка іконок зліва та справа через ",[3199,5875,5876],{},"setLeft()"," та ",[3199,5879,5880],{},"setRight()",[3174,5882,5883],{},"Автоматична стилізація під поточну тему.",[3271,5885,5887],{"id":5886},"popover-спливаюче-вікно","Popover: Спливаюче вікно",[3150,5889,5890,5893],{},[3154,5891,5892],{},"Popover"," — це спливаюче вікно, що прикріплюється до елемента (як tooltip, але з довільним вмістом).",[3276,5895,5897],{"className":3445,"code":5896,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.Popover;\n\nButton infoButton = new Button(\"Info\");\n\nPopover popover = new Popover();\npopover.setTitle(\"Information\");\npopover.setContentNode(new Label(\"This is additional information about the feature.\"));\npopover.setArrowLocation(Popover.ArrowLocation.TOP_CENTER);\n\ninfoButton.setOnAction(e -> {\n    popover.show(infoButton);\n});\n",[3199,5898,5899,5906,5910,5931,5935,5951,5967,5991,6016,6020,6035,6047],{"__ignoreMap":3281},[3285,5900,5901,5903],{"class":3287,"line":3288},[3285,5902,3467],{"class":3454},[3285,5904,5905],{"class":3314}," atlantafx.base.controls.Popover;\n",[3285,5907,5908],{"class":3287,"line":3302},[3285,5909,3401],{"emptyLinePlaceholder":3400},[3285,5911,5912,5915,5918,5920,5922,5924,5926,5929],{"class":3287,"line":3325},[3285,5913,5914],{"class":3523},"Button",[3285,5916,5917],{"class":3570}," infoButton",[3285,5919,3634],{"class":3314},[3285,5921,3598],{"class":3597},[3285,5923,3639],{"class":3560},[3285,5925,3564],{"class":3314},[3285,5927,5928],{"class":3644},"\"Info\"",[3285,5930,3648],{"class":3314},[3285,5932,5933],{"class":3287,"line":3344},[3285,5934,3401],{"emptyLinePlaceholder":3400},[3285,5936,5937,5939,5942,5944,5946,5949],{"class":3287,"line":3363},[3285,5938,5892],{"class":3523},[3285,5940,5941],{"class":3570}," popover",[3285,5943,3634],{"class":3314},[3285,5945,3598],{"class":3597},[3285,5947,5948],{"class":3560}," Popover",[3285,5950,3746],{"class":3314},[3285,5952,5953,5956,5958,5960,5962,5965],{"class":3287,"line":3409},[3285,5954,5955],{"class":3570},"popover",[3285,5957,3269],{"class":3314},[3285,5959,3713],{"class":3560},[3285,5961,3564],{"class":3314},[3285,5963,5964],{"class":3644},"\"Information\"",[3285,5966,3648],{"class":3314},[3285,5968,5969,5971,5973,5976,5978,5980,5983,5985,5988],{"class":3287,"line":3415},[3285,5970,5955],{"class":3570},[3285,5972,3269],{"class":3314},[3285,5974,5975],{"class":3560},"setContentNode",[3285,5977,3564],{"class":3314},[3285,5979,3598],{"class":3597},[3285,5981,5982],{"class":3560}," Label",[3285,5984,3564],{"class":3314},[3285,5986,5987],{"class":3644},"\"This is additional information about the feature.\"",[3285,5989,5990],{"class":3314},"));\n",[3285,5992,5993,5995,5997,6000,6002,6004,6006,6009,6011,6014],{"class":3287,"line":3501},[3285,5994,5955],{"class":3570},[3285,5996,3269],{"class":3314},[3285,5998,5999],{"class":3560},"setArrowLocation",[3285,6001,3564],{"class":3314},[3285,6003,5892],{"class":3570},[3285,6005,3269],{"class":3314},[3285,6007,6008],{"class":3570},"ArrowLocation",[3285,6010,3269],{"class":3314},[3285,6012,6013],{"class":3570},"TOP_CENTER",[3285,6015,3648],{"class":3314},[3285,6017,6018],{"class":3287,"line":3509},[3285,6019,3401],{"emptyLinePlaceholder":3400},[3285,6021,6022,6025,6027,6029,6031,6033],{"class":3287,"line":3514},[3285,6023,6024],{"class":3570},"infoButton",[3285,6026,3269],{"class":3314},[3285,6028,5139],{"class":3560},[3285,6030,5142],{"class":3314},[3285,6032,4752],{"class":3454},[3285,6034,3533],{"class":3314},[3285,6036,6037,6040,6042,6044],{"class":3287,"line":3536},[3285,6038,6039],{"class":3570},"    popover",[3285,6041,3269],{"class":3314},[3285,6043,3743],{"class":3560},[3285,6045,6046],{"class":3314},"(infoButton);\n",[3285,6048,6049],{"class":3287,"line":3542},[3285,6050,5721],{"class":3314},[3150,6052,6053],{},[3154,6054,6055],{},"Властивості Popover:",[3171,6057,6058,6064,6070,6076,6082,6088],{},[3174,6059,6060,6063],{},[3199,6061,6062],{},"setTitle(String)"," — заголовок у header.",[3174,6065,6066,6069],{},[3199,6067,6068],{},"setContentNode(Node)"," — довільний вміст (Label, VBox, форма).",[3174,6071,6072,6075],{},[3199,6073,6074],{},"setArrowLocation(ArrowLocation)"," — позиція стрілки (TOP, BOTTOM, LEFT, RIGHT).",[3174,6077,6078,6081],{},[3199,6079,6080],{},"setDetachable(boolean)"," — чи можна відкріпити Popover від елемента.",[3174,6083,6084,6087],{},[3199,6085,6086],{},"setAnimated(boolean)"," — анімація появи\u002Fзникнення.",[3174,6089,6090,6093],{},[3199,6091,6092],{},"setFadeInDuration(Duration)"," — тривалість анімації появи.",[3150,6095,6096],{},[3154,6097,6098],{},"Приклад: Popover з формою:",[3276,6100,6102],{"className":3445,"code":6101,"language":3447,"meta":3281,"style":3281},"VBox content = new VBox(10);\ncontent.setPadding(new Insets(10));\n\nTextField nameField = new TextField();\nnameField.setPromptText(\"Name\");\n\nTextField emailField = new TextField();\nemailField.setPromptText(\"Email\");\n\nButton submitButton = new Button(\"Submit\");\nsubmitButton.getStyleClass().add(Styles.ACCENT);\n\ncontent.getChildren().addAll(\n    new Label(\"Contact Form\"),\n    nameField,\n    emailField,\n    submitButton\n);\n\nPopover popover = new Popover(content);\npopover.setTitle(\"Contact Us\");\npopover.setDetachable(true);\n",[3199,6103,6104,6126,6149,6153,6170,6186,6190,6205,6221,6225,6245,6271,6275,6291,6306,6311,6316,6321,6325,6329,6344,6359],{"__ignoreMap":3281},[3285,6105,6106,6109,6112,6114,6116,6119,6121,6124],{"class":3287,"line":3288},[3285,6107,6108],{"class":3523},"VBox",[3285,6110,6111],{"class":3570}," content",[3285,6113,3634],{"class":3314},[3285,6115,3598],{"class":3597},[3285,6117,6118],{"class":3560}," VBox",[3285,6120,3564],{"class":3314},[3285,6122,6123],{"class":3689},"10",[3285,6125,3648],{"class":3314},[3285,6127,6128,6131,6133,6136,6138,6140,6143,6145,6147],{"class":3287,"line":3302},[3285,6129,6130],{"class":3570},"content",[3285,6132,3269],{"class":3314},[3285,6134,6135],{"class":3560},"setPadding",[3285,6137,3564],{"class":3314},[3285,6139,3598],{"class":3597},[3285,6141,6142],{"class":3560}," Insets",[3285,6144,3564],{"class":3314},[3285,6146,6123],{"class":3689},[3285,6148,5990],{"class":3314},[3285,6150,6151],{"class":3287,"line":3325},[3285,6152,3401],{"emptyLinePlaceholder":3400},[3285,6154,6155,6158,6161,6163,6165,6168],{"class":3287,"line":3344},[3285,6156,6157],{"class":3523},"TextField",[3285,6159,6160],{"class":3570}," nameField",[3285,6162,3634],{"class":3314},[3285,6164,3598],{"class":3597},[3285,6166,6167],{"class":3560}," TextField",[3285,6169,3746],{"class":3314},[3285,6171,6172,6175,6177,6179,6181,6184],{"class":3287,"line":3363},[3285,6173,6174],{"class":3570},"nameField",[3285,6176,3269],{"class":3314},[3285,6178,5822],{"class":3560},[3285,6180,3564],{"class":3314},[3285,6182,6183],{"class":3644},"\"Name\"",[3285,6185,3648],{"class":3314},[3285,6187,6188],{"class":3287,"line":3409},[3285,6189,3401],{"emptyLinePlaceholder":3400},[3285,6191,6192,6194,6197,6199,6201,6203],{"class":3287,"line":3415},[3285,6193,6157],{"class":3523},[3285,6195,6196],{"class":3570}," emailField",[3285,6198,3634],{"class":3314},[3285,6200,3598],{"class":3597},[3285,6202,6167],{"class":3560},[3285,6204,3746],{"class":3314},[3285,6206,6207,6210,6212,6214,6216,6219],{"class":3287,"line":3501},[3285,6208,6209],{"class":3570},"emailField",[3285,6211,3269],{"class":3314},[3285,6213,5822],{"class":3560},[3285,6215,3564],{"class":3314},[3285,6217,6218],{"class":3644},"\"Email\"",[3285,6220,3648],{"class":3314},[3285,6222,6223],{"class":3287,"line":3509},[3285,6224,3401],{"emptyLinePlaceholder":3400},[3285,6226,6227,6229,6232,6234,6236,6238,6240,6243],{"class":3287,"line":3514},[3285,6228,5914],{"class":3523},[3285,6230,6231],{"class":3570}," submitButton",[3285,6233,3634],{"class":3314},[3285,6235,3598],{"class":3597},[3285,6237,3639],{"class":3560},[3285,6239,3564],{"class":3314},[3285,6241,6242],{"class":3644},"\"Submit\"",[3285,6244,3648],{"class":3314},[3285,6246,6247,6250,6252,6255,6257,6259,6261,6264,6266,6269],{"class":3287,"line":3536},[3285,6248,6249],{"class":3570},"submitButton",[3285,6251,3269],{"class":3314},[3285,6253,6254],{"class":3560},"getStyleClass",[3285,6256,3604],{"class":3314},[3285,6258,3883],{"class":3560},[3285,6260,3564],{"class":3314},[3285,6262,6263],{"class":3570},"Styles",[3285,6265,3269],{"class":3314},[3285,6267,6268],{"class":3570},"ACCENT",[3285,6270,3648],{"class":3314},[3285,6272,6273],{"class":3287,"line":3542},[3285,6274,3401],{"emptyLinePlaceholder":3400},[3285,6276,6277,6279,6281,6284,6286,6288],{"class":3287,"line":3551},[3285,6278,6130],{"class":3570},[3285,6280,3269],{"class":3314},[3285,6282,6283],{"class":3560},"getChildren",[3285,6285,3604],{"class":3314},[3285,6287,5086],{"class":3560},[3285,6289,6290],{"class":3314},"(\n",[3285,6292,6293,6296,6298,6300,6303],{"class":3287,"line":3577},[3285,6294,6295],{"class":3597},"    new",[3285,6297,5982],{"class":3560},[3285,6299,3564],{"class":3314},[3285,6301,6302],{"class":3644},"\"Contact Form\"",[3285,6304,6305],{"class":3314},"),\n",[3285,6307,6308],{"class":3287,"line":3584},[3285,6309,6310],{"class":3314},"    nameField,\n",[3285,6312,6313],{"class":3287,"line":3613},[3285,6314,6315],{"class":3314},"    emailField,\n",[3285,6317,6318],{"class":3287,"line":3619},[3285,6319,6320],{"class":3314},"    submitButton\n",[3285,6322,6323],{"class":3287,"line":3625},[3285,6324,3648],{"class":3314},[3285,6326,6327],{"class":3287,"line":3651},[3285,6328,3401],{"emptyLinePlaceholder":3400},[3285,6330,6331,6333,6335,6337,6339,6341],{"class":3287,"line":3670},[3285,6332,5892],{"class":3523},[3285,6334,5941],{"class":3570},[3285,6336,3634],{"class":3314},[3285,6338,3598],{"class":3597},[3285,6340,5948],{"class":3560},[3285,6342,6343],{"class":3314},"(content);\n",[3285,6345,6346,6348,6350,6352,6354,6357],{"class":3287,"line":3700},[3285,6347,5955],{"class":3570},[3285,6349,3269],{"class":3314},[3285,6351,3713],{"class":3560},[3285,6353,3564],{"class":3314},[3285,6355,6356],{"class":3644},"\"Contact Us\"",[3285,6358,3648],{"class":3314},[3285,6360,6361,6363,6365,6368,6370,6373],{"class":3287,"line":3705},[3285,6362,5955],{"class":3570},[3285,6364,3269],{"class":3314},[3285,6366,6367],{"class":3560},"setDetachable",[3285,6369,3564],{"class":3314},[3285,6371,6372],{"class":3454},"true",[3285,6374,3648],{"class":3314},[3271,6376,6378],{"id":6377},"message-повідомлення-з-іконкою","Message: Повідомлення з іконкою",[3150,6380,6381,6384],{},[3154,6382,6383],{},"Message"," — це компонент для відображення повідомлень (інформація, попередження, помилка).",[3276,6386,6388],{"className":3445,"code":6387,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.Message;\nimport atlantafx.base.theme.Styles;\n\n\u002F\u002F Інформаційне повідомлення\nMessage infoMessage = new Message(\n    \"Information\",\n    \"Your changes have been saved successfully.\"\n);\ninfoMessage.getStyleClass().add(Styles.ACCENT);\n\n\u002F\u002F Попередження\nMessage warningMessage = new Message(\n    \"Warning\",\n    \"This action cannot be undone.\"\n);\nwarningMessage.getStyleClass().add(Styles.WARNING);\n\n\u002F\u002F Помилка\nMessage errorMessage = new Message(\n    \"Error\",\n    \"Failed to connect to the server.\"\n);\nerrorMessage.getStyleClass().add(Styles.DANGER);\n",[3199,6389,6390,6397,6404,6408,6413,6429,6437,6442,6446,6469,6473,6478,6493,6500,6505,6509,6533,6537,6542,6557,6564,6569,6573],{"__ignoreMap":3281},[3285,6391,6392,6394],{"class":3287,"line":3288},[3285,6393,3467],{"class":3454},[3285,6395,6396],{"class":3314}," atlantafx.base.controls.Message;\n",[3285,6398,6399,6401],{"class":3287,"line":3302},[3285,6400,3467],{"class":3454},[3285,6402,6403],{"class":3314}," atlantafx.base.theme.Styles;\n",[3285,6405,6406],{"class":3287,"line":3325},[3285,6407,3401],{"emptyLinePlaceholder":3400},[3285,6409,6410],{"class":3287,"line":3344},[3285,6411,6412],{"class":3580},"\u002F\u002F Інформаційне повідомлення\n",[3285,6414,6415,6417,6420,6422,6424,6427],{"class":3287,"line":3363},[3285,6416,6383],{"class":3523},[3285,6418,6419],{"class":3570}," infoMessage",[3285,6421,3634],{"class":3314},[3285,6423,3598],{"class":3597},[3285,6425,6426],{"class":3560}," Message",[3285,6428,6290],{"class":3314},[3285,6430,6431,6434],{"class":3287,"line":3409},[3285,6432,6433],{"class":3644},"    \"Information\"",[3285,6435,6436],{"class":3314},",\n",[3285,6438,6439],{"class":3287,"line":3415},[3285,6440,6441],{"class":3644},"    \"Your changes have been saved successfully.\"\n",[3285,6443,6444],{"class":3287,"line":3501},[3285,6445,3648],{"class":3314},[3285,6447,6448,6451,6453,6455,6457,6459,6461,6463,6465,6467],{"class":3287,"line":3509},[3285,6449,6450],{"class":3570},"infoMessage",[3285,6452,3269],{"class":3314},[3285,6454,6254],{"class":3560},[3285,6456,3604],{"class":3314},[3285,6458,3883],{"class":3560},[3285,6460,3564],{"class":3314},[3285,6462,6263],{"class":3570},[3285,6464,3269],{"class":3314},[3285,6466,6268],{"class":3570},[3285,6468,3648],{"class":3314},[3285,6470,6471],{"class":3287,"line":3514},[3285,6472,3401],{"emptyLinePlaceholder":3400},[3285,6474,6475],{"class":3287,"line":3536},[3285,6476,6477],{"class":3580},"\u002F\u002F Попередження\n",[3285,6479,6480,6482,6485,6487,6489,6491],{"class":3287,"line":3542},[3285,6481,6383],{"class":3523},[3285,6483,6484],{"class":3570}," warningMessage",[3285,6486,3634],{"class":3314},[3285,6488,3598],{"class":3597},[3285,6490,6426],{"class":3560},[3285,6492,6290],{"class":3314},[3285,6494,6495,6498],{"class":3287,"line":3551},[3285,6496,6497],{"class":3644},"    \"Warning\"",[3285,6499,6436],{"class":3314},[3285,6501,6502],{"class":3287,"line":3577},[3285,6503,6504],{"class":3644},"    \"This action cannot be undone.\"\n",[3285,6506,6507],{"class":3287,"line":3584},[3285,6508,3648],{"class":3314},[3285,6510,6511,6514,6516,6518,6520,6522,6524,6526,6528,6531],{"class":3287,"line":3613},[3285,6512,6513],{"class":3570},"warningMessage",[3285,6515,3269],{"class":3314},[3285,6517,6254],{"class":3560},[3285,6519,3604],{"class":3314},[3285,6521,3883],{"class":3560},[3285,6523,3564],{"class":3314},[3285,6525,6263],{"class":3570},[3285,6527,3269],{"class":3314},[3285,6529,6530],{"class":3570},"WARNING",[3285,6532,3648],{"class":3314},[3285,6534,6535],{"class":3287,"line":3619},[3285,6536,3401],{"emptyLinePlaceholder":3400},[3285,6538,6539],{"class":3287,"line":3625},[3285,6540,6541],{"class":3580},"\u002F\u002F Помилка\n",[3285,6543,6544,6546,6549,6551,6553,6555],{"class":3287,"line":3651},[3285,6545,6383],{"class":3523},[3285,6547,6548],{"class":3570}," errorMessage",[3285,6550,3634],{"class":3314},[3285,6552,3598],{"class":3597},[3285,6554,6426],{"class":3560},[3285,6556,6290],{"class":3314},[3285,6558,6559,6562],{"class":3287,"line":3670},[3285,6560,6561],{"class":3644},"    \"Error\"",[3285,6563,6436],{"class":3314},[3285,6565,6566],{"class":3287,"line":3700},[3285,6567,6568],{"class":3644},"    \"Failed to connect to the server.\"\n",[3285,6570,6571],{"class":3287,"line":3705},[3285,6572,3648],{"class":3314},[3285,6574,6575,6578,6580,6582,6584,6586,6588,6590,6592,6595],{"class":3287,"line":3723},[3285,6576,6577],{"class":3570},"errorMessage",[3285,6579,3269],{"class":3314},[3285,6581,6254],{"class":3560},[3285,6583,3604],{"class":3314},[3285,6585,3883],{"class":3560},[3285,6587,3564],{"class":3314},[3285,6589,6263],{"class":3570},[3285,6591,3269],{"class":3314},[3285,6593,6594],{"class":3570},"DANGER",[3285,6596,3648],{"class":3314},[3150,6598,6599],{},[3154,6600,6601],{},"Стилі для Message:",[3171,6603,6604,6610,6616,6622],{},[3174,6605,6606,6609],{},[3199,6607,6608],{},"Styles.ACCENT"," — синє повідомлення (інформація).",[3174,6611,6612,6615],{},[3199,6613,6614],{},"Styles.SUCCESS"," — зелене повідомлення (успіх).",[3174,6617,6618,6621],{},[3199,6619,6620],{},"Styles.WARNING"," — жовте повідомлення (попередження).",[3174,6623,6624,6627],{},[3199,6625,6626],{},"Styles.DANGER"," — червоне повідомлення (помилка).",[3271,6629,6631],{"id":6630},"notification-тимчасове-повідомлення","Notification: Тимчасове повідомлення",[3150,6633,6634,6637],{},[3154,6635,6636],{},"Notification"," — це toast-повідомлення, що з'являється у куті екрану та автоматично зникає.",[3276,6639,6641],{"className":3445,"code":6640,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.Notification;\n\nNotification notification = new Notification(\n    \"Success\",\n    \"Audiobook added successfully!\"\n);\nnotification.getStyleClass().add(Styles.SUCCESS);\n\n\u002F\u002F Показ notification у правому верхньому куті\nnotification.show(scene);\n\n\u002F\u002F Автоматичне закриття через 3 секунди\nPauseTransition delay = new PauseTransition(Duration.seconds(3));\ndelay.setOnFinished(e -> notification.hide());\ndelay.play();\n",[3199,6642,6643,6650,6654,6670,6677,6682,6686,6710,6714,6719,6729,6733,6738,6770,6793],{"__ignoreMap":3281},[3285,6644,6645,6647],{"class":3287,"line":3288},[3285,6646,3467],{"class":3454},[3285,6648,6649],{"class":3314}," atlantafx.base.controls.Notification;\n",[3285,6651,6652],{"class":3287,"line":3302},[3285,6653,3401],{"emptyLinePlaceholder":3400},[3285,6655,6656,6658,6661,6663,6665,6668],{"class":3287,"line":3325},[3285,6657,6636],{"class":3523},[3285,6659,6660],{"class":3570}," notification",[3285,6662,3634],{"class":3314},[3285,6664,3598],{"class":3597},[3285,6666,6667],{"class":3560}," Notification",[3285,6669,6290],{"class":3314},[3285,6671,6672,6675],{"class":3287,"line":3344},[3285,6673,6674],{"class":3644},"    \"Success\"",[3285,6676,6436],{"class":3314},[3285,6678,6679],{"class":3287,"line":3363},[3285,6680,6681],{"class":3644},"    \"Audiobook added successfully!\"\n",[3285,6683,6684],{"class":3287,"line":3409},[3285,6685,3648],{"class":3314},[3285,6687,6688,6691,6693,6695,6697,6699,6701,6703,6705,6708],{"class":3287,"line":3415},[3285,6689,6690],{"class":3570},"notification",[3285,6692,3269],{"class":3314},[3285,6694,6254],{"class":3560},[3285,6696,3604],{"class":3314},[3285,6698,3883],{"class":3560},[3285,6700,3564],{"class":3314},[3285,6702,6263],{"class":3570},[3285,6704,3269],{"class":3314},[3285,6706,6707],{"class":3570},"SUCCESS",[3285,6709,3648],{"class":3314},[3285,6711,6712],{"class":3287,"line":3501},[3285,6713,3401],{"emptyLinePlaceholder":3400},[3285,6715,6716],{"class":3287,"line":3509},[3285,6717,6718],{"class":3580},"\u002F\u002F Показ notification у правому верхньому куті\n",[3285,6720,6721,6723,6725,6727],{"class":3287,"line":3514},[3285,6722,6690],{"class":3570},[3285,6724,3269],{"class":3314},[3285,6726,3743],{"class":3560},[3285,6728,3733],{"class":3314},[3285,6730,6731],{"class":3287,"line":3536},[3285,6732,3401],{"emptyLinePlaceholder":3400},[3285,6734,6735],{"class":3287,"line":3542},[3285,6736,6737],{"class":3580},"\u002F\u002F Автоматичне закриття через 3 секунди\n",[3285,6739,6740,6743,6746,6748,6750,6753,6755,6758,6760,6763,6765,6768],{"class":3287,"line":3551},[3285,6741,6742],{"class":3523},"PauseTransition",[3285,6744,6745],{"class":3570}," delay",[3285,6747,3634],{"class":3314},[3285,6749,3598],{"class":3597},[3285,6751,6752],{"class":3560}," PauseTransition",[3285,6754,3564],{"class":3314},[3285,6756,6757],{"class":3570},"Duration",[3285,6759,3269],{"class":3314},[3285,6761,6762],{"class":3560},"seconds",[3285,6764,3564],{"class":3314},[3285,6766,6767],{"class":3689},"3",[3285,6769,5990],{"class":3314},[3285,6771,6772,6775,6777,6780,6782,6784,6786,6788,6791],{"class":3287,"line":3577},[3285,6773,6774],{"class":3570},"delay",[3285,6776,3269],{"class":3314},[3285,6778,6779],{"class":3560},"setOnFinished",[3285,6781,5142],{"class":3314},[3285,6783,4752],{"class":3454},[3285,6785,6660],{"class":3570},[3285,6787,3269],{"class":3314},[3285,6789,6790],{"class":3560},"hide",[3285,6792,3610],{"class":3314},[3285,6794,6795,6797,6799,6802],{"class":3287,"line":3584},[3285,6796,6774],{"class":3570},[3285,6798,3269],{"class":3314},[3285,6800,6801],{"class":3560},"play",[3285,6803,3746],{"class":3314},[3271,6805,6807],{"id":6806},"tile-інформаційна-плитка","Tile: Інформаційна плитка",[3150,6809,6810,6813],{},[3154,6811,6812],{},"Tile"," — це компонент для відображення інформації у вигляді плитки (як у dashboard).",[3276,6815,6817],{"className":3445,"code":6816,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.controls.Tile;\n\nTile audioBooksTile = new Tile(\n    \"Total Audiobooks\",\n    \"1,234\"\n);\naudioBooksTile.setDescription(\"↑ 12% from last month\");\naudioBooksTile.getStyleClass().add(Styles.ACCENT);\n\nTile usersTile = new Tile(\n    \"Active Users\",\n    \"567\"\n);\nusersTile.setDescription(\"↑ 8% from last month\");\nusersTile.getStyleClass().add(Styles.SUCCESS);\n",[3199,6818,6819,6826,6830,6846,6853,6858,6862,6879,6901,6905,6920,6927,6932,6936,6952],{"__ignoreMap":3281},[3285,6820,6821,6823],{"class":3287,"line":3288},[3285,6822,3467],{"class":3454},[3285,6824,6825],{"class":3314}," atlantafx.base.controls.Tile;\n",[3285,6827,6828],{"class":3287,"line":3302},[3285,6829,3401],{"emptyLinePlaceholder":3400},[3285,6831,6832,6834,6837,6839,6841,6844],{"class":3287,"line":3325},[3285,6833,6812],{"class":3523},[3285,6835,6836],{"class":3570}," audioBooksTile",[3285,6838,3634],{"class":3314},[3285,6840,3598],{"class":3597},[3285,6842,6843],{"class":3560}," Tile",[3285,6845,6290],{"class":3314},[3285,6847,6848,6851],{"class":3287,"line":3344},[3285,6849,6850],{"class":3644},"    \"Total Audiobooks\"",[3285,6852,6436],{"class":3314},[3285,6854,6855],{"class":3287,"line":3363},[3285,6856,6857],{"class":3644},"    \"1,234\"\n",[3285,6859,6860],{"class":3287,"line":3409},[3285,6861,3648],{"class":3314},[3285,6863,6864,6867,6869,6872,6874,6877],{"class":3287,"line":3415},[3285,6865,6866],{"class":3570},"audioBooksTile",[3285,6868,3269],{"class":3314},[3285,6870,6871],{"class":3560},"setDescription",[3285,6873,3564],{"class":3314},[3285,6875,6876],{"class":3644},"\"↑ 12% from last month\"",[3285,6878,3648],{"class":3314},[3285,6880,6881,6883,6885,6887,6889,6891,6893,6895,6897,6899],{"class":3287,"line":3501},[3285,6882,6866],{"class":3570},[3285,6884,3269],{"class":3314},[3285,6886,6254],{"class":3560},[3285,6888,3604],{"class":3314},[3285,6890,3883],{"class":3560},[3285,6892,3564],{"class":3314},[3285,6894,6263],{"class":3570},[3285,6896,3269],{"class":3314},[3285,6898,6268],{"class":3570},[3285,6900,3648],{"class":3314},[3285,6902,6903],{"class":3287,"line":3509},[3285,6904,3401],{"emptyLinePlaceholder":3400},[3285,6906,6907,6909,6912,6914,6916,6918],{"class":3287,"line":3514},[3285,6908,6812],{"class":3523},[3285,6910,6911],{"class":3570}," usersTile",[3285,6913,3634],{"class":3314},[3285,6915,3598],{"class":3597},[3285,6917,6843],{"class":3560},[3285,6919,6290],{"class":3314},[3285,6921,6922,6925],{"class":3287,"line":3536},[3285,6923,6924],{"class":3644},"    \"Active Users\"",[3285,6926,6436],{"class":3314},[3285,6928,6929],{"class":3287,"line":3542},[3285,6930,6931],{"class":3644},"    \"567\"\n",[3285,6933,6934],{"class":3287,"line":3551},[3285,6935,3648],{"class":3314},[3285,6937,6938,6941,6943,6945,6947,6950],{"class":3287,"line":3577},[3285,6939,6940],{"class":3570},"usersTile",[3285,6942,3269],{"class":3314},[3285,6944,6871],{"class":3560},[3285,6946,3564],{"class":3314},[3285,6948,6949],{"class":3644},"\"↑ 8% from last month\"",[3285,6951,3648],{"class":3314},[3285,6953,6954,6956,6958,6960,6962,6964,6966,6968,6970,6972],{"class":3287,"line":3584},[3285,6955,6940],{"class":3570},[3285,6957,3269],{"class":3314},[3285,6959,6254],{"class":3560},[3285,6961,3604],{"class":3314},[3285,6963,3883],{"class":3560},[3285,6965,3564],{"class":3314},[3285,6967,6263],{"class":3570},[3285,6969,3269],{"class":3314},[3285,6971,6707],{"class":3570},[3285,6973,3648],{"class":3314},[3253,6975],{},[3145,6977,6979],{"id":6978},"css-variables-кастомізація-кольорів","CSS Variables: Кастомізація кольорів",[3150,6981,6982],{},"AtlantaFX використовує CSS Variables для всіх кольорів, що дозволяє легко кастомізувати тему.",[3271,6984,6986],{"id":6985},"основні-змінні-кольорів","Основні змінні кольорів",[3150,6988,6989],{},[3154,6990,6991],{},"Foreground (текст):",[3276,6993,6995],{"className":5729,"code":6994,"language":5731,"meta":3281,"style":3281},"--color-fg-default: \u002F* Основний текст *\u002F\n--color-fg-muted: \u002F* Приглушений текст (вторинний) *\u002F\n--color-fg-subtle: \u002F* Ледь помітний текст (placeholder) *\u002F\n--color-fg-emphasis: \u002F* Акцентований текст (заголовки) *\u002F\n",[3199,6996,6997,7005,7013,7021],{"__ignoreMap":3281},[3285,6998,6999,7002],{"class":3287,"line":3288},[3285,7000,7001],{"class":3314},"--color-fg-default: ",[3285,7003,7004],{"class":3580},"\u002F* Основний текст *\u002F\n",[3285,7006,7007,7010],{"class":3287,"line":3302},[3285,7008,7009],{"class":3314},"--color-fg-muted: ",[3285,7011,7012],{"class":3580},"\u002F* Приглушений текст (вторинний) *\u002F\n",[3285,7014,7015,7018],{"class":3287,"line":3325},[3285,7016,7017],{"class":3314},"--color-fg-subtle: ",[3285,7019,7020],{"class":3580},"\u002F* Ледь помітний текст (placeholder) *\u002F\n",[3285,7022,7023,7026],{"class":3287,"line":3344},[3285,7024,7025],{"class":3314},"--color-fg-emphasis: ",[3285,7027,7028],{"class":3580},"\u002F* Акцентований текст (заголовки) *\u002F\n",[3150,7030,7031],{},[3154,7032,7033],{},"Background (фон):",[3276,7035,7037],{"className":5729,"code":7036,"language":5731,"meta":3281,"style":3281},"--color-bg-default: \u002F* Основний фон *\u002F\n--color-bg-overlay: \u002F* Фон для модальних вікон *\u002F\n--color-bg-subtle: \u002F* Світліший фон (панелі) *\u002F\n--color-bg-inset: \u002F* Темніший фон (input fields) *\u002F\n",[3199,7038,7039,7047,7055,7063],{"__ignoreMap":3281},[3285,7040,7041,7044],{"class":3287,"line":3288},[3285,7042,7043],{"class":3314},"--color-bg-default: ",[3285,7045,7046],{"class":3580},"\u002F* Основний фон *\u002F\n",[3285,7048,7049,7052],{"class":3287,"line":3302},[3285,7050,7051],{"class":3314},"--color-bg-overlay: ",[3285,7053,7054],{"class":3580},"\u002F* Фон для модальних вікон *\u002F\n",[3285,7056,7057,7060],{"class":3287,"line":3325},[3285,7058,7059],{"class":3314},"--color-bg-subtle: ",[3285,7061,7062],{"class":3580},"\u002F* Світліший фон (панелі) *\u002F\n",[3285,7064,7065,7068],{"class":3287,"line":3344},[3285,7066,7067],{"class":3314},"--color-bg-inset: ",[3285,7069,7070],{"class":3580},"\u002F* Темніший фон (input fields) *\u002F\n",[3150,7072,7073],{},[3154,7074,7075],{},"Border (рамки):",[3276,7077,7079],{"className":5729,"code":7078,"language":5731,"meta":3281,"style":3281},"--color-border-default: \u002F* Основні рамки *\u002F\n--color-border-muted: \u002F* Приглушені рамки *\u002F\n--color-border-subtle: \u002F* Ледь помітні рамки *\u002F\n",[3199,7080,7081,7089,7097],{"__ignoreMap":3281},[3285,7082,7083,7086],{"class":3287,"line":3288},[3285,7084,7085],{"class":3314},"--color-border-default: ",[3285,7087,7088],{"class":3580},"\u002F* Основні рамки *\u002F\n",[3285,7090,7091,7094],{"class":3287,"line":3302},[3285,7092,7093],{"class":3314},"--color-border-muted: ",[3285,7095,7096],{"class":3580},"\u002F* Приглушені рамки *\u002F\n",[3285,7098,7099,7102],{"class":3287,"line":3325},[3285,7100,7101],{"class":3314},"--color-border-subtle: ",[3285,7103,7104],{"class":3580},"\u002F* Ледь помітні рамки *\u002F\n",[3150,7106,7107],{},[3154,7108,7109],{},"Accent (акцентні кольори):",[3276,7111,7113],{"className":5729,"code":7112,"language":5731,"meta":3281,"style":3281},"--color-accent-fg: \u002F* Акцентний текст *\u002F\n--color-accent-emphasis: \u002F* Акцентний фон (кнопки) *\u002F\n--color-accent-muted: \u002F* Приглушений акцент *\u002F\n--color-accent-subtle: \u002F* Ледь помітний акцент *\u002F\n",[3199,7114,7115,7123,7131,7139],{"__ignoreMap":3281},[3285,7116,7117,7120],{"class":3287,"line":3288},[3285,7118,7119],{"class":3314},"--color-accent-fg: ",[3285,7121,7122],{"class":3580},"\u002F* Акцентний текст *\u002F\n",[3285,7124,7125,7128],{"class":3287,"line":3302},[3285,7126,7127],{"class":3314},"--color-accent-emphasis: ",[3285,7129,7130],{"class":3580},"\u002F* Акцентний фон (кнопки) *\u002F\n",[3285,7132,7133,7136],{"class":3287,"line":3325},[3285,7134,7135],{"class":3314},"--color-accent-muted: ",[3285,7137,7138],{"class":3580},"\u002F* Приглушений акцент *\u002F\n",[3285,7140,7141,7144],{"class":3287,"line":3344},[3285,7142,7143],{"class":3314},"--color-accent-subtle: ",[3285,7145,7146],{"class":3580},"\u002F* Ледь помітний акцент *\u002F\n",[3150,7148,7149],{},[3154,7150,7151],{},"Status (статусні кольори):",[3276,7153,7155],{"className":5729,"code":7154,"language":5731,"meta":3281,"style":3281},"\u002F* Success (зелений) *\u002F\n--color-success-fg: \u002F* Текст успіху *\u002F\n--color-success-emphasis: \u002F* Фон успіху *\u002F\n--color-success-muted: \u002F* Приглушений успіх *\u002F\n--color-success-subtle: \u002F* Ледь помітний успіх *\u002F\n\n\u002F* Warning (жовтий) *\u002F\n--color-warning-fg: \u002F* Текст попередження *\u002F\n--color-warning-emphasis: \u002F* Фон попередження *\u002F\n--color-warning-muted: \u002F* Приглушене попередження *\u002F\n--color-warning-subtle: \u002F* Ледь помітне попередження *\u002F\n\n\u002F* Danger (червоний) *\u002F\n--color-danger-fg: \u002F* Текст помилки *\u002F\n--color-danger-emphasis: \u002F* Фон помилки *\u002F\n--color-danger-muted: \u002F* Приглушена помилка *\u002F\n--color-danger-subtle: \u002F* Ледь помітна помилка *\u002F\n",[3199,7156,7157,7162,7170,7178,7186,7194,7198,7203,7211,7219,7227,7235,7239,7244,7252,7260,7268],{"__ignoreMap":3281},[3285,7158,7159],{"class":3287,"line":3288},[3285,7160,7161],{"class":3580},"\u002F* Success (зелений) *\u002F\n",[3285,7163,7164,7167],{"class":3287,"line":3302},[3285,7165,7166],{"class":3314},"--color-success-fg: ",[3285,7168,7169],{"class":3580},"\u002F* Текст успіху *\u002F\n",[3285,7171,7172,7175],{"class":3287,"line":3325},[3285,7173,7174],{"class":3314},"--color-success-emphasis: ",[3285,7176,7177],{"class":3580},"\u002F* Фон успіху *\u002F\n",[3285,7179,7180,7183],{"class":3287,"line":3344},[3285,7181,7182],{"class":3314},"--color-success-muted: ",[3285,7184,7185],{"class":3580},"\u002F* Приглушений успіх *\u002F\n",[3285,7187,7188,7191],{"class":3287,"line":3363},[3285,7189,7190],{"class":3314},"--color-success-subtle: ",[3285,7192,7193],{"class":3580},"\u002F* Ледь помітний успіх *\u002F\n",[3285,7195,7196],{"class":3287,"line":3409},[3285,7197,3401],{"emptyLinePlaceholder":3400},[3285,7199,7200],{"class":3287,"line":3415},[3285,7201,7202],{"class":3580},"\u002F* Warning (жовтий) *\u002F\n",[3285,7204,7205,7208],{"class":3287,"line":3501},[3285,7206,7207],{"class":3314},"--color-warning-fg: ",[3285,7209,7210],{"class":3580},"\u002F* Текст попередження *\u002F\n",[3285,7212,7213,7216],{"class":3287,"line":3509},[3285,7214,7215],{"class":3314},"--color-warning-emphasis: ",[3285,7217,7218],{"class":3580},"\u002F* Фон попередження *\u002F\n",[3285,7220,7221,7224],{"class":3287,"line":3514},[3285,7222,7223],{"class":3314},"--color-warning-muted: ",[3285,7225,7226],{"class":3580},"\u002F* Приглушене попередження *\u002F\n",[3285,7228,7229,7232],{"class":3287,"line":3536},[3285,7230,7231],{"class":3314},"--color-warning-subtle: ",[3285,7233,7234],{"class":3580},"\u002F* Ледь помітне попередження *\u002F\n",[3285,7236,7237],{"class":3287,"line":3542},[3285,7238,3401],{"emptyLinePlaceholder":3400},[3285,7240,7241],{"class":3287,"line":3551},[3285,7242,7243],{"class":3580},"\u002F* Danger (червоний) *\u002F\n",[3285,7245,7246,7249],{"class":3287,"line":3577},[3285,7247,7248],{"class":3314},"--color-danger-fg: ",[3285,7250,7251],{"class":3580},"\u002F* Текст помилки *\u002F\n",[3285,7253,7254,7257],{"class":3287,"line":3584},[3285,7255,7256],{"class":3314},"--color-danger-emphasis: ",[3285,7258,7259],{"class":3580},"\u002F* Фон помилки *\u002F\n",[3285,7261,7262,7265],{"class":3287,"line":3613},[3285,7263,7264],{"class":3314},"--color-danger-muted: ",[3285,7266,7267],{"class":3580},"\u002F* Приглушена помилка *\u002F\n",[3285,7269,7270,7273],{"class":3287,"line":3619},[3285,7271,7272],{"class":3314},"--color-danger-subtle: ",[3285,7274,7275],{"class":3580},"\u002F* Ледь помітна помилка *\u002F\n",[3271,7277,7279],{"id":7278},"перевизначення-змінних","Перевизначення змінних",[3150,7281,7282],{},"Створіть власний CSS-файл та перевизначте змінні:",[3276,7284,7286],{"className":5729,"code":7285,"language":5731,"meta":3281,"style":3281},"\u002F* custom-theme.css *\u002F\n\n.root {\n    \u002F* Зміна акцентного кольору на фіолетовий *\u002F\n    --color-accent-emphasis: #9b59b6;\n    --color-accent-fg: #9b59b6;\n    --color-accent-muted: rgba(155, 89, 182, 0.4);\n    --color-accent-subtle: rgba(155, 89, 182, 0.1);\n    \n    \u002F* Зміна кольору успіху на бірюзовий *\u002F\n    --color-success-emphasis: #1abc9c;\n    --color-success-fg: #1abc9c;\n    \n    \u002F* Зміна фону *\u002F\n    --color-bg-default: #fafafa;\n}\n",[3199,7287,7288,7293,7297,7304,7309,7324,7335,7367,7395,7399,7404,7416,7427,7431,7436,7448],{"__ignoreMap":3281},[3285,7289,7290],{"class":3287,"line":3288},[3285,7291,7292],{"class":3580},"\u002F* custom-theme.css *\u002F\n",[3285,7294,7295],{"class":3287,"line":3302},[3285,7296,3401],{"emptyLinePlaceholder":3400},[3285,7298,7299,7302],{"class":3287,"line":3325},[3285,7300,7301],{"class":5738},".root",[3285,7303,3533],{"class":3314},[3285,7305,7306],{"class":3287,"line":3344},[3285,7307,7308],{"class":3580},"    \u002F* Зміна акцентного кольору на фіолетовий *\u002F\n",[3285,7310,7311,7315,7318,7322],{"class":3287,"line":3363},[3285,7312,7314],{"class":7313},"sa4r_","    --color-accent-emphasis",[3285,7316,7317],{"class":3314},": ",[3285,7319,7321],{"class":7320},"sDUd3","#9b59b6",[3285,7323,4518],{"class":3314},[3285,7325,7326,7329,7331,7333],{"class":3287,"line":3409},[3285,7327,7328],{"class":7313},"    --color-accent-fg",[3285,7330,7317],{"class":3314},[3285,7332,7321],{"class":7320},[3285,7334,4518],{"class":3314},[3285,7336,7337,7340,7342,7345,7347,7350,7352,7355,7357,7360,7362,7365],{"class":3287,"line":3415},[3285,7338,7339],{"class":7313},"    --color-accent-muted",[3285,7341,7317],{"class":3314},[3285,7343,7344],{"class":3560},"rgba",[3285,7346,3564],{"class":3314},[3285,7348,7349],{"class":3689},"155",[3285,7351,3202],{"class":3314},[3285,7353,7354],{"class":3689},"89",[3285,7356,3202],{"class":3314},[3285,7358,7359],{"class":3689},"182",[3285,7361,3202],{"class":3314},[3285,7363,7364],{"class":3689},"0.4",[3285,7366,3648],{"class":3314},[3285,7368,7369,7372,7374,7376,7378,7380,7382,7384,7386,7388,7390,7393],{"class":3287,"line":3501},[3285,7370,7371],{"class":7313},"    --color-accent-subtle",[3285,7373,7317],{"class":3314},[3285,7375,7344],{"class":3560},[3285,7377,3564],{"class":3314},[3285,7379,7349],{"class":3689},[3285,7381,3202],{"class":3314},[3285,7383,7354],{"class":3689},[3285,7385,3202],{"class":3314},[3285,7387,7359],{"class":3689},[3285,7389,3202],{"class":3314},[3285,7391,7392],{"class":3689},"0.1",[3285,7394,3648],{"class":3314},[3285,7396,7397],{"class":3287,"line":3509},[3285,7398,3539],{"class":3314},[3285,7400,7401],{"class":3287,"line":3514},[3285,7402,7403],{"class":3580},"    \u002F* Зміна кольору успіху на бірюзовий *\u002F\n",[3285,7405,7406,7409,7411,7414],{"class":3287,"line":3536},[3285,7407,7408],{"class":7313},"    --color-success-emphasis",[3285,7410,7317],{"class":3314},[3285,7412,7413],{"class":7320},"#1abc9c",[3285,7415,4518],{"class":3314},[3285,7417,7418,7421,7423,7425],{"class":3287,"line":3542},[3285,7419,7420],{"class":7313},"    --color-success-fg",[3285,7422,7317],{"class":3314},[3285,7424,7413],{"class":7320},[3285,7426,4518],{"class":3314},[3285,7428,7429],{"class":3287,"line":3551},[3285,7430,3539],{"class":3314},[3285,7432,7433],{"class":3287,"line":3577},[3285,7434,7435],{"class":3580},"    \u002F* Зміна фону *\u002F\n",[3285,7437,7438,7441,7443,7446],{"class":3287,"line":3584},[3285,7439,7440],{"class":7313},"    --color-bg-default",[3285,7442,7317],{"class":3314},[3285,7444,7445],{"class":7320},"#fafafa",[3285,7447,4518],{"class":3314},[3285,7449,7450],{"class":3287,"line":3613},[3285,7451,3395],{"class":3314},[3150,7453,7454],{},"Підключення:",[3276,7456,7458],{"className":3445,"code":7457,"language":3447,"meta":3281,"style":3281},"Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());\nscene.getStylesheets().add(getClass().getResource(\"\u002Fcss\u002Fcustom-theme.css\").toExternalForm());\n",[3199,7459,7460,7480],{"__ignoreMap":3281},[3285,7461,7462,7464,7466,7468,7470,7472,7474,7476,7478],{"class":3287,"line":3288},[3285,7463,3944],{"class":3570},[3285,7465,3269],{"class":3314},[3285,7467,3592],{"class":3560},[3285,7469,3564],{"class":3314},[3285,7471,3598],{"class":3597},[3285,7473,3601],{"class":3560},[3285,7475,3604],{"class":3314},[3285,7477,3607],{"class":3560},[3285,7479,3610],{"class":3314},[3285,7481,7482,7484,7486,7488,7490,7492,7494,7497,7499,7502,7504,7507,7509,7512],{"class":3287,"line":3302},[3285,7483,3873],{"class":3570},[3285,7485,3269],{"class":3314},[3285,7487,3878],{"class":3560},[3285,7489,3604],{"class":3314},[3285,7491,3883],{"class":3560},[3285,7493,3564],{"class":3314},[3285,7495,7496],{"class":3560},"getClass",[3285,7498,3604],{"class":3314},[3285,7500,7501],{"class":3560},"getResource",[3285,7503,3564],{"class":3314},[3285,7505,7506],{"class":3644},"\"\u002Fcss\u002Fcustom-theme.css\"",[3285,7508,3209],{"class":3314},[3285,7510,7511],{"class":3560},"toExternalForm",[3285,7513,3610],{"class":3314},[3150,7515,7516,7517,7520],{},"Тепер всі компоненти, що використовують ",[3199,7518,7519],{},"--color-accent-emphasis",", матимуть фіолетовий колір.",[3253,7522],{},[3145,7524,7526],{"id":7525},"utility-classes-швидка-стилізація","Utility Classes: Швидка стилізація",[3150,7528,7529],{},"AtlantaFX надає utility classes для швидкої стилізації без написання CSS.",[3271,7531,7533],{"id":7532},"текстові-стилі","Текстові стилі",[3276,7535,7537],{"className":3445,"code":7536,"language":3447,"meta":3281,"style":3281},"import atlantafx.base.theme.Styles;\n\n\u002F\u002F Розмір тексту\nlabel.getStyleClass().add(Styles.TEXT_SMALL); \u002F\u002F Малий текст\nlabel.getStyleClass().add(Styles.TITLE_1); \u002F\u002F Великий заголовок\nlabel.getStyleClass().add(Styles.TITLE_2); \u002F\u002F Середній заголовок\nlabel.getStyleClass().add(Styles.TITLE_3); \u002F\u002F Малий заголовок\nlabel.getStyleClass().add(Styles.TITLE_4); \u002F\u002F Найменший заголовок\n\n\u002F\u002F Вага шрифту\nlabel.getStyleClass().add(Styles.TEXT_BOLD); \u002F\u002F Жирний\nlabel.getStyleClass().add(Styles.TEXT_BOLDER); \u002F\u002F Дуже жирний\nlabel.getStyleClass().add(Styles.TEXT_NORMAL); \u002F\u002F Звичайний\nlabel.getStyleClass().add(Styles.TEXT_LIGHTER); \u002F\u002F Тонкий\n\n\u002F\u002F Стиль шрифту\nlabel.getStyleClass().add(Styles.TEXT_ITALIC); \u002F\u002F Курсив\nlabel.getStyleClass().add(Styles.TEXT_OBLIQUE); \u002F\u002F Похилий\nlabel.getStyleClass().add(Styles.TEXT_UNDERLINED); \u002F\u002F Підкреслений\nlabel.getStyleClass().add(Styles.TEXT_STRIKETHROUGH); \u002F\u002F Закреслений\n\n\u002F\u002F Колір тексту\nlabel.getStyleClass().add(Styles.TEXT_MUTED); \u002F\u002F Приглушений\nlabel.getStyleClass().add(Styles.TEXT_SUBTLE); \u002F\u002F Ледь помітний\n",[3199,7538,7539,7545,7549,7554,7582,7608,7634,7660,7686,7690,7695,7721,7747,7773,7799,7803,7808,7834,7860,7886,7912,7916,7921,7947],{"__ignoreMap":3281},[3285,7540,7541,7543],{"class":3287,"line":3288},[3285,7542,3467],{"class":3454},[3285,7544,6403],{"class":3314},[3285,7546,7547],{"class":3287,"line":3302},[3285,7548,3401],{"emptyLinePlaceholder":3400},[3285,7550,7551],{"class":3287,"line":3325},[3285,7552,7553],{"class":3580},"\u002F\u002F Розмір тексту\n",[3285,7555,7556,7559,7561,7563,7565,7567,7569,7571,7573,7576,7579],{"class":3287,"line":3344},[3285,7557,7558],{"class":3570},"label",[3285,7560,3269],{"class":3314},[3285,7562,6254],{"class":3560},[3285,7564,3604],{"class":3314},[3285,7566,3883],{"class":3560},[3285,7568,3564],{"class":3314},[3285,7570,6263],{"class":3570},[3285,7572,3269],{"class":3314},[3285,7574,7575],{"class":3570},"TEXT_SMALL",[3285,7577,7578],{"class":3314},"); ",[3285,7580,7581],{"class":3580},"\u002F\u002F Малий текст\n",[3285,7583,7584,7586,7588,7590,7592,7594,7596,7598,7600,7603,7605],{"class":3287,"line":3363},[3285,7585,7558],{"class":3570},[3285,7587,3269],{"class":3314},[3285,7589,6254],{"class":3560},[3285,7591,3604],{"class":3314},[3285,7593,3883],{"class":3560},[3285,7595,3564],{"class":3314},[3285,7597,6263],{"class":3570},[3285,7599,3269],{"class":3314},[3285,7601,7602],{"class":3570},"TITLE_1",[3285,7604,7578],{"class":3314},[3285,7606,7607],{"class":3580},"\u002F\u002F Великий заголовок\n",[3285,7609,7610,7612,7614,7616,7618,7620,7622,7624,7626,7629,7631],{"class":3287,"line":3409},[3285,7611,7558],{"class":3570},[3285,7613,3269],{"class":3314},[3285,7615,6254],{"class":3560},[3285,7617,3604],{"class":3314},[3285,7619,3883],{"class":3560},[3285,7621,3564],{"class":3314},[3285,7623,6263],{"class":3570},[3285,7625,3269],{"class":3314},[3285,7627,7628],{"class":3570},"TITLE_2",[3285,7630,7578],{"class":3314},[3285,7632,7633],{"class":3580},"\u002F\u002F Середній заголовок\n",[3285,7635,7636,7638,7640,7642,7644,7646,7648,7650,7652,7655,7657],{"class":3287,"line":3415},[3285,7637,7558],{"class":3570},[3285,7639,3269],{"class":3314},[3285,7641,6254],{"class":3560},[3285,7643,3604],{"class":3314},[3285,7645,3883],{"class":3560},[3285,7647,3564],{"class":3314},[3285,7649,6263],{"class":3570},[3285,7651,3269],{"class":3314},[3285,7653,7654],{"class":3570},"TITLE_3",[3285,7656,7578],{"class":3314},[3285,7658,7659],{"class":3580},"\u002F\u002F Малий заголовок\n",[3285,7661,7662,7664,7666,7668,7670,7672,7674,7676,7678,7681,7683],{"class":3287,"line":3501},[3285,7663,7558],{"class":3570},[3285,7665,3269],{"class":3314},[3285,7667,6254],{"class":3560},[3285,7669,3604],{"class":3314},[3285,7671,3883],{"class":3560},[3285,7673,3564],{"class":3314},[3285,7675,6263],{"class":3570},[3285,7677,3269],{"class":3314},[3285,7679,7680],{"class":3570},"TITLE_4",[3285,7682,7578],{"class":3314},[3285,7684,7685],{"class":3580},"\u002F\u002F Найменший заголовок\n",[3285,7687,7688],{"class":3287,"line":3509},[3285,7689,3401],{"emptyLinePlaceholder":3400},[3285,7691,7692],{"class":3287,"line":3514},[3285,7693,7694],{"class":3580},"\u002F\u002F Вага шрифту\n",[3285,7696,7697,7699,7701,7703,7705,7707,7709,7711,7713,7716,7718],{"class":3287,"line":3536},[3285,7698,7558],{"class":3570},[3285,7700,3269],{"class":3314},[3285,7702,6254],{"class":3560},[3285,7704,3604],{"class":3314},[3285,7706,3883],{"class":3560},[3285,7708,3564],{"class":3314},[3285,7710,6263],{"class":3570},[3285,7712,3269],{"class":3314},[3285,7714,7715],{"class":3570},"TEXT_BOLD",[3285,7717,7578],{"class":3314},[3285,7719,7720],{"class":3580},"\u002F\u002F Жирний\n",[3285,7722,7723,7725,7727,7729,7731,7733,7735,7737,7739,7742,7744],{"class":3287,"line":3542},[3285,7724,7558],{"class":3570},[3285,7726,3269],{"class":3314},[3285,7728,6254],{"class":3560},[3285,7730,3604],{"class":3314},[3285,7732,3883],{"class":3560},[3285,7734,3564],{"class":3314},[3285,7736,6263],{"class":3570},[3285,7738,3269],{"class":3314},[3285,7740,7741],{"class":3570},"TEXT_BOLDER",[3285,7743,7578],{"class":3314},[3285,7745,7746],{"class":3580},"\u002F\u002F Дуже жирний\n",[3285,7748,7749,7751,7753,7755,7757,7759,7761,7763,7765,7768,7770],{"class":3287,"line":3551},[3285,7750,7558],{"class":3570},[3285,7752,3269],{"class":3314},[3285,7754,6254],{"class":3560},[3285,7756,3604],{"class":3314},[3285,7758,3883],{"class":3560},[3285,7760,3564],{"class":3314},[3285,7762,6263],{"class":3570},[3285,7764,3269],{"class":3314},[3285,7766,7767],{"class":3570},"TEXT_NORMAL",[3285,7769,7578],{"class":3314},[3285,7771,7772],{"class":3580},"\u002F\u002F Звичайний\n",[3285,7774,7775,7777,7779,7781,7783,7785,7787,7789,7791,7794,7796],{"class":3287,"line":3577},[3285,7776,7558],{"class":3570},[3285,7778,3269],{"class":3314},[3285,7780,6254],{"class":3560},[3285,7782,3604],{"class":3314},[3285,7784,3883],{"class":3560},[3285,7786,3564],{"class":3314},[3285,7788,6263],{"class":3570},[3285,7790,3269],{"class":3314},[3285,7792,7793],{"class":3570},"TEXT_LIGHTER",[3285,7795,7578],{"class":3314},[3285,7797,7798],{"class":3580},"\u002F\u002F Тонкий\n",[3285,7800,7801],{"class":3287,"line":3584},[3285,7802,3401],{"emptyLinePlaceholder":3400},[3285,7804,7805],{"class":3287,"line":3613},[3285,7806,7807],{"class":3580},"\u002F\u002F Стиль шрифту\n",[3285,7809,7810,7812,7814,7816,7818,7820,7822,7824,7826,7829,7831],{"class":3287,"line":3619},[3285,7811,7558],{"class":3570},[3285,7813,3269],{"class":3314},[3285,7815,6254],{"class":3560},[3285,7817,3604],{"class":3314},[3285,7819,3883],{"class":3560},[3285,7821,3564],{"class":3314},[3285,7823,6263],{"class":3570},[3285,7825,3269],{"class":3314},[3285,7827,7828],{"class":3570},"TEXT_ITALIC",[3285,7830,7578],{"class":3314},[3285,7832,7833],{"class":3580},"\u002F\u002F Курсив\n",[3285,7835,7836,7838,7840,7842,7844,7846,7848,7850,7852,7855,7857],{"class":3287,"line":3625},[3285,7837,7558],{"class":3570},[3285,7839,3269],{"class":3314},[3285,7841,6254],{"class":3560},[3285,7843,3604],{"class":3314},[3285,7845,3883],{"class":3560},[3285,7847,3564],{"class":3314},[3285,7849,6263],{"class":3570},[3285,7851,3269],{"class":3314},[3285,7853,7854],{"class":3570},"TEXT_OBLIQUE",[3285,7856,7578],{"class":3314},[3285,7858,7859],{"class":3580},"\u002F\u002F Похилий\n",[3285,7861,7862,7864,7866,7868,7870,7872,7874,7876,7878,7881,7883],{"class":3287,"line":3651},[3285,7863,7558],{"class":3570},[3285,7865,3269],{"class":3314},[3285,7867,6254],{"class":3560},[3285,7869,3604],{"class":3314},[3285,7871,3883],{"class":3560},[3285,7873,3564],{"class":3314},[3285,7875,6263],{"class":3570},[3285,7877,3269],{"class":3314},[3285,7879,7880],{"class":3570},"TEXT_UNDERLINED",[3285,7882,7578],{"class":3314},[3285,7884,7885],{"class":3580},"\u002F\u002F Підкреслений\n",[3285,7887,7888,7890,7892,7894,7896,7898,7900,7902,7904,7907,7909],{"class":3287,"line":3670},[3285,7889,7558],{"class":3570},[3285,7891,3269],{"class":3314},[3285,7893,6254],{"class":3560},[3285,7895,3604],{"class":3314},[3285,7897,3883],{"class":3560},[3285,7899,3564],{"class":3314},[3285,7901,6263],{"class":3570},[3285,7903,3269],{"class":3314},[3285,7905,7906],{"class":3570},"TEXT_STRIKETHROUGH",[3285,7908,7578],{"class":3314},[3285,7910,7911],{"class":3580},"\u002F\u002F Закреслений\n",[3285,7913,7914],{"class":3287,"line":3700},[3285,7915,3401],{"emptyLinePlaceholder":3400},[3285,7917,7918],{"class":3287,"line":3705},[3285,7919,7920],{"class":3580},"\u002F\u002F Колір тексту\n",[3285,7922,7923,7925,7927,7929,7931,7933,7935,7937,7939,7942,7944],{"class":3287,"line":3723},[3285,7924,7558],{"class":3570},[3285,7926,3269],{"class":3314},[3285,7928,6254],{"class":3560},[3285,7930,3604],{"class":3314},[3285,7932,3883],{"class":3560},[3285,7934,3564],{"class":3314},[3285,7936,6263],{"class":3570},[3285,7938,3269],{"class":3314},[3285,7940,7941],{"class":3570},"TEXT_MUTED",[3285,7943,7578],{"class":3314},[3285,7945,7946],{"class":3580},"\u002F\u002F Приглушений\n",[3285,7948,7949,7951,7953,7955,7957,7959,7961,7963,7965,7968,7970],{"class":3287,"line":3736},[3285,7950,7558],{"class":3570},[3285,7952,3269],{"class":3314},[3285,7954,6254],{"class":3560},[3285,7956,3604],{"class":3314},[3285,7958,3883],{"class":3560},[3285,7960,3564],{"class":3314},[3285,7962,6263],{"class":3570},[3285,7964,3269],{"class":3314},[3285,7966,7967],{"class":3570},"TEXT_SUBTLE",[3285,7969,7578],{"class":3314},[3285,7971,7972],{"class":3580},"\u002F\u002F Ледь помітний\n",[3271,7974,7976],{"id":7975},"фонові-кольори","Фонові кольори",[3276,7978,7980],{"className":3445,"code":7979,"language":3447,"meta":3281,"style":3281},"\u002F\u002F Акцентні фони\npane.getStyleClass().add(Styles.BG_ACCENT_EMPHASIS); \u002F\u002F Яскравий акцент\npane.getStyleClass().add(Styles.BG_ACCENT_MUTED); \u002F\u002F Приглушений акцент\npane.getStyleClass().add(Styles.BG_ACCENT_SUBTLE); \u002F\u002F Ледь помітний акцент\n\n\u002F\u002F Статусні фони\npane.getStyleClass().add(Styles.BG_SUCCESS_EMPHASIS); \u002F\u002F Зелений\npane.getStyleClass().add(Styles.BG_WARNING_EMPHASIS); \u002F\u002F Жовтий\npane.getStyleClass().add(Styles.BG_DANGER_EMPHASIS); \u002F\u002F Червоний\n\n\u002F\u002F Нейтральні фони\npane.getStyleClass().add(Styles.BG_DEFAULT); \u002F\u002F Основний фон\npane.getStyleClass().add(Styles.BG_SUBTLE); \u002F\u002F Світліший фон\npane.getStyleClass().add(Styles.BG_INSET); \u002F\u002F Темніший фон\n",[3199,7981,7982,7987,8014,8040,8066,8070,8075,8101,8127,8153,8157,8162,8188,8214],{"__ignoreMap":3281},[3285,7983,7984],{"class":3287,"line":3288},[3285,7985,7986],{"class":3580},"\u002F\u002F Акцентні фони\n",[3285,7988,7989,7992,7994,7996,7998,8000,8002,8004,8006,8009,8011],{"class":3287,"line":3302},[3285,7990,7991],{"class":3570},"pane",[3285,7993,3269],{"class":3314},[3285,7995,6254],{"class":3560},[3285,7997,3604],{"class":3314},[3285,7999,3883],{"class":3560},[3285,8001,3564],{"class":3314},[3285,8003,6263],{"class":3570},[3285,8005,3269],{"class":3314},[3285,8007,8008],{"class":3570},"BG_ACCENT_EMPHASIS",[3285,8010,7578],{"class":3314},[3285,8012,8013],{"class":3580},"\u002F\u002F Яскравий акцент\n",[3285,8015,8016,8018,8020,8022,8024,8026,8028,8030,8032,8035,8037],{"class":3287,"line":3325},[3285,8017,7991],{"class":3570},[3285,8019,3269],{"class":3314},[3285,8021,6254],{"class":3560},[3285,8023,3604],{"class":3314},[3285,8025,3883],{"class":3560},[3285,8027,3564],{"class":3314},[3285,8029,6263],{"class":3570},[3285,8031,3269],{"class":3314},[3285,8033,8034],{"class":3570},"BG_ACCENT_MUTED",[3285,8036,7578],{"class":3314},[3285,8038,8039],{"class":3580},"\u002F\u002F Приглушений акцент\n",[3285,8041,8042,8044,8046,8048,8050,8052,8054,8056,8058,8061,8063],{"class":3287,"line":3344},[3285,8043,7991],{"class":3570},[3285,8045,3269],{"class":3314},[3285,8047,6254],{"class":3560},[3285,8049,3604],{"class":3314},[3285,8051,3883],{"class":3560},[3285,8053,3564],{"class":3314},[3285,8055,6263],{"class":3570},[3285,8057,3269],{"class":3314},[3285,8059,8060],{"class":3570},"BG_ACCENT_SUBTLE",[3285,8062,7578],{"class":3314},[3285,8064,8065],{"class":3580},"\u002F\u002F Ледь помітний акцент\n",[3285,8067,8068],{"class":3287,"line":3363},[3285,8069,3401],{"emptyLinePlaceholder":3400},[3285,8071,8072],{"class":3287,"line":3409},[3285,8073,8074],{"class":3580},"\u002F\u002F Статусні фони\n",[3285,8076,8077,8079,8081,8083,8085,8087,8089,8091,8093,8096,8098],{"class":3287,"line":3415},[3285,8078,7991],{"class":3570},[3285,8080,3269],{"class":3314},[3285,8082,6254],{"class":3560},[3285,8084,3604],{"class":3314},[3285,8086,3883],{"class":3560},[3285,8088,3564],{"class":3314},[3285,8090,6263],{"class":3570},[3285,8092,3269],{"class":3314},[3285,8094,8095],{"class":3570},"BG_SUCCESS_EMPHASIS",[3285,8097,7578],{"class":3314},[3285,8099,8100],{"class":3580},"\u002F\u002F Зелений\n",[3285,8102,8103,8105,8107,8109,8111,8113,8115,8117,8119,8122,8124],{"class":3287,"line":3501},[3285,8104,7991],{"class":3570},[3285,8106,3269],{"class":3314},[3285,8108,6254],{"class":3560},[3285,8110,3604],{"class":3314},[3285,8112,3883],{"class":3560},[3285,8114,3564],{"class":3314},[3285,8116,6263],{"class":3570},[3285,8118,3269],{"class":3314},[3285,8120,8121],{"class":3570},"BG_WARNING_EMPHASIS",[3285,8123,7578],{"class":3314},[3285,8125,8126],{"class":3580},"\u002F\u002F Жовтий\n",[3285,8128,8129,8131,8133,8135,8137,8139,8141,8143,8145,8148,8150],{"class":3287,"line":3509},[3285,8130,7991],{"class":3570},[3285,8132,3269],{"class":3314},[3285,8134,6254],{"class":3560},[3285,8136,3604],{"class":3314},[3285,8138,3883],{"class":3560},[3285,8140,3564],{"class":3314},[3285,8142,6263],{"class":3570},[3285,8144,3269],{"class":3314},[3285,8146,8147],{"class":3570},"BG_DANGER_EMPHASIS",[3285,8149,7578],{"class":3314},[3285,8151,8152],{"class":3580},"\u002F\u002F Червоний\n",[3285,8154,8155],{"class":3287,"line":3514},[3285,8156,3401],{"emptyLinePlaceholder":3400},[3285,8158,8159],{"class":3287,"line":3536},[3285,8160,8161],{"class":3580},"\u002F\u002F Нейтральні фони\n",[3285,8163,8164,8166,8168,8170,8172,8174,8176,8178,8180,8183,8185],{"class":3287,"line":3542},[3285,8165,7991],{"class":3570},[3285,8167,3269],{"class":3314},[3285,8169,6254],{"class":3560},[3285,8171,3604],{"class":3314},[3285,8173,3883],{"class":3560},[3285,8175,3564],{"class":3314},[3285,8177,6263],{"class":3570},[3285,8179,3269],{"class":3314},[3285,8181,8182],{"class":3570},"BG_DEFAULT",[3285,8184,7578],{"class":3314},[3285,8186,8187],{"class":3580},"\u002F\u002F Основний фон\n",[3285,8189,8190,8192,8194,8196,8198,8200,8202,8204,8206,8209,8211],{"class":3287,"line":3551},[3285,8191,7991],{"class":3570},[3285,8193,3269],{"class":3314},[3285,8195,6254],{"class":3560},[3285,8197,3604],{"class":3314},[3285,8199,3883],{"class":3560},[3285,8201,3564],{"class":3314},[3285,8203,6263],{"class":3570},[3285,8205,3269],{"class":3314},[3285,8207,8208],{"class":3570},"BG_SUBTLE",[3285,8210,7578],{"class":3314},[3285,8212,8213],{"class":3580},"\u002F\u002F Світліший фон\n",[3285,8215,8216,8218,8220,8222,8224,8226,8228,8230,8232,8235,8237],{"class":3287,"line":3577},[3285,8217,7991],{"class":3570},[3285,8219,3269],{"class":3314},[3285,8221,6254],{"class":3560},[3285,8223,3604],{"class":3314},[3285,8225,3883],{"class":3560},[3285,8227,3564],{"class":3314},[3285,8229,6263],{"class":3570},[3285,8231,3269],{"class":3314},[3285,8233,8234],{"class":3570},"BG_INSET",[3285,8236,7578],{"class":3314},[3285,8238,8239],{"class":3580},"\u002F\u002F Темніший фон\n",[3271,8241,8243],{"id":8242},"стилі-кнопок","Стилі кнопок",[3276,8245,8247],{"className":3445,"code":8246,"language":3447,"meta":3281,"style":3281},"\u002F\u002F Акцентні кнопки\nbutton.getStyleClass().add(Styles.ACCENT); \u002F\u002F Синя кнопка\nbutton.getStyleClass().add(Styles.SUCCESS); \u002F\u002F Зелена кнопка\nbutton.getStyleClass().add(Styles.DANGER); \u002F\u002F Червона кнопка\n\n\u002F\u002F Варіанти кнопок\nbutton.getStyleClass().add(Styles.BUTTON_OUTLINED); \u002F\u002F Контурна кнопка\nbutton.getStyleClass().add(Styles.FLAT); \u002F\u002F Плоска кнопка (без фону)\n\n\u002F\u002F Розміри кнопок\nbutton.getStyleClass().add(Styles.SMALL); \u002F\u002F Маленька кнопка\nbutton.getStyleClass().add(Styles.LARGE); \u002F\u002F Велика кнопка\n\n\u002F\u002F Форми кнопок\nbutton.getStyleClass().add(Styles.ROUNDED); \u002F\u002F Заокруглена кнопка\nbutton.getStyleClass().add(Styles.BUTTON_CIRCLE); \u002F\u002F Кругла кнопка\nbutton.getStyleClass().add(Styles.BUTTON_ICON); \u002F\u002F Іконка-кнопка (без тексту)\n",[3199,8248,8249,8254,8280,8305,8330,8334,8339,8365,8391,8395,8400,8426,8452,8456,8461,8487,8513],{"__ignoreMap":3281},[3285,8250,8251],{"class":3287,"line":3288},[3285,8252,8253],{"class":3580},"\u002F\u002F Акцентні кнопки\n",[3285,8255,8256,8259,8261,8263,8265,8267,8269,8271,8273,8275,8277],{"class":3287,"line":3302},[3285,8257,8258],{"class":3570},"button",[3285,8260,3269],{"class":3314},[3285,8262,6254],{"class":3560},[3285,8264,3604],{"class":3314},[3285,8266,3883],{"class":3560},[3285,8268,3564],{"class":3314},[3285,8270,6263],{"class":3570},[3285,8272,3269],{"class":3314},[3285,8274,6268],{"class":3570},[3285,8276,7578],{"class":3314},[3285,8278,8279],{"class":3580},"\u002F\u002F Синя кнопка\n",[3285,8281,8282,8284,8286,8288,8290,8292,8294,8296,8298,8300,8302],{"class":3287,"line":3325},[3285,8283,8258],{"class":3570},[3285,8285,3269],{"class":3314},[3285,8287,6254],{"class":3560},[3285,8289,3604],{"class":3314},[3285,8291,3883],{"class":3560},[3285,8293,3564],{"class":3314},[3285,8295,6263],{"class":3570},[3285,8297,3269],{"class":3314},[3285,8299,6707],{"class":3570},[3285,8301,7578],{"class":3314},[3285,8303,8304],{"class":3580},"\u002F\u002F Зелена кнопка\n",[3285,8306,8307,8309,8311,8313,8315,8317,8319,8321,8323,8325,8327],{"class":3287,"line":3344},[3285,8308,8258],{"class":3570},[3285,8310,3269],{"class":3314},[3285,8312,6254],{"class":3560},[3285,8314,3604],{"class":3314},[3285,8316,3883],{"class":3560},[3285,8318,3564],{"class":3314},[3285,8320,6263],{"class":3570},[3285,8322,3269],{"class":3314},[3285,8324,6594],{"class":3570},[3285,8326,7578],{"class":3314},[3285,8328,8329],{"class":3580},"\u002F\u002F Червона кнопка\n",[3285,8331,8332],{"class":3287,"line":3363},[3285,8333,3401],{"emptyLinePlaceholder":3400},[3285,8335,8336],{"class":3287,"line":3409},[3285,8337,8338],{"class":3580},"\u002F\u002F Варіанти кнопок\n",[3285,8340,8341,8343,8345,8347,8349,8351,8353,8355,8357,8360,8362],{"class":3287,"line":3415},[3285,8342,8258],{"class":3570},[3285,8344,3269],{"class":3314},[3285,8346,6254],{"class":3560},[3285,8348,3604],{"class":3314},[3285,8350,3883],{"class":3560},[3285,8352,3564],{"class":3314},[3285,8354,6263],{"class":3570},[3285,8356,3269],{"class":3314},[3285,8358,8359],{"class":3570},"BUTTON_OUTLINED",[3285,8361,7578],{"class":3314},[3285,8363,8364],{"class":3580},"\u002F\u002F Контурна кнопка\n",[3285,8366,8367,8369,8371,8373,8375,8377,8379,8381,8383,8386,8388],{"class":3287,"line":3501},[3285,8368,8258],{"class":3570},[3285,8370,3269],{"class":3314},[3285,8372,6254],{"class":3560},[3285,8374,3604],{"class":3314},[3285,8376,3883],{"class":3560},[3285,8378,3564],{"class":3314},[3285,8380,6263],{"class":3570},[3285,8382,3269],{"class":3314},[3285,8384,8385],{"class":3570},"FLAT",[3285,8387,7578],{"class":3314},[3285,8389,8390],{"class":3580},"\u002F\u002F Плоска кнопка (без фону)\n",[3285,8392,8393],{"class":3287,"line":3509},[3285,8394,3401],{"emptyLinePlaceholder":3400},[3285,8396,8397],{"class":3287,"line":3514},[3285,8398,8399],{"class":3580},"\u002F\u002F Розміри кнопок\n",[3285,8401,8402,8404,8406,8408,8410,8412,8414,8416,8418,8421,8423],{"class":3287,"line":3536},[3285,8403,8258],{"class":3570},[3285,8405,3269],{"class":3314},[3285,8407,6254],{"class":3560},[3285,8409,3604],{"class":3314},[3285,8411,3883],{"class":3560},[3285,8413,3564],{"class":3314},[3285,8415,6263],{"class":3570},[3285,8417,3269],{"class":3314},[3285,8419,8420],{"class":3570},"SMALL",[3285,8422,7578],{"class":3314},[3285,8424,8425],{"class":3580},"\u002F\u002F Маленька кнопка\n",[3285,8427,8428,8430,8432,8434,8436,8438,8440,8442,8444,8447,8449],{"class":3287,"line":3542},[3285,8429,8258],{"class":3570},[3285,8431,3269],{"class":3314},[3285,8433,6254],{"class":3560},[3285,8435,3604],{"class":3314},[3285,8437,3883],{"class":3560},[3285,8439,3564],{"class":3314},[3285,8441,6263],{"class":3570},[3285,8443,3269],{"class":3314},[3285,8445,8446],{"class":3570},"LARGE",[3285,8448,7578],{"class":3314},[3285,8450,8451],{"class":3580},"\u002F\u002F Велика кнопка\n",[3285,8453,8454],{"class":3287,"line":3551},[3285,8455,3401],{"emptyLinePlaceholder":3400},[3285,8457,8458],{"class":3287,"line":3577},[3285,8459,8460],{"class":3580},"\u002F\u002F Форми кнопок\n",[3285,8462,8463,8465,8467,8469,8471,8473,8475,8477,8479,8482,8484],{"class":3287,"line":3584},[3285,8464,8258],{"class":3570},[3285,8466,3269],{"class":3314},[3285,8468,6254],{"class":3560},[3285,8470,3604],{"class":3314},[3285,8472,3883],{"class":3560},[3285,8474,3564],{"class":3314},[3285,8476,6263],{"class":3570},[3285,8478,3269],{"class":3314},[3285,8480,8481],{"class":3570},"ROUNDED",[3285,8483,7578],{"class":3314},[3285,8485,8486],{"class":3580},"\u002F\u002F Заокруглена кнопка\n",[3285,8488,8489,8491,8493,8495,8497,8499,8501,8503,8505,8508,8510],{"class":3287,"line":3613},[3285,8490,8258],{"class":3570},[3285,8492,3269],{"class":3314},[3285,8494,6254],{"class":3560},[3285,8496,3604],{"class":3314},[3285,8498,3883],{"class":3560},[3285,8500,3564],{"class":3314},[3285,8502,6263],{"class":3570},[3285,8504,3269],{"class":3314},[3285,8506,8507],{"class":3570},"BUTTON_CIRCLE",[3285,8509,7578],{"class":3314},[3285,8511,8512],{"class":3580},"\u002F\u002F Кругла кнопка\n",[3285,8514,8515,8517,8519,8521,8523,8525,8527,8529,8531,8534,8536],{"class":3287,"line":3619},[3285,8516,8258],{"class":3570},[3285,8518,3269],{"class":3314},[3285,8520,6254],{"class":3560},[3285,8522,3604],{"class":3314},[3285,8524,3883],{"class":3560},[3285,8526,3564],{"class":3314},[3285,8528,6263],{"class":3570},[3285,8530,3269],{"class":3314},[3285,8532,8533],{"class":3570},"BUTTON_ICON",[3285,8535,7578],{"class":3314},[3285,8537,8538],{"class":3580},"\u002F\u002F Іконка-кнопка (без тексту)\n",[3271,8540,8542],{"id":8541},"приклад-форма-з-utility-classes","Приклад: Форма з utility classes",[3276,8544,8546],{"className":3445,"code":8545,"language":3447,"meta":3281,"style":3281},"VBox form = new VBox(15);\nform.setPadding(new Insets(20));\nform.getStyleClass().add(Styles.BG_DEFAULT);\n\nLabel titleLabel = new Label(\"Add Audiobook\");\ntitleLabel.getStyleClass().addAll(Styles.TITLE_2, Styles.TEXT_BOLD);\n\nTextField titleField = new TextField();\ntitleField.setPromptText(\"Title\");\n\nTextField authorField = new TextField();\nauthorField.setPromptText(\"Author\");\n\nHBox buttons = new HBox(10);\nButton saveButton = new Button(\"Save\");\nsaveButton.getStyleClass().addAll(Styles.ACCENT, Styles.LARGE);\n\nButton cancelButton = new Button(\"Cancel\");\ncancelButton.getStyleClass().add(Styles.FLAT);\n\nbuttons.getChildren().addAll(saveButton, cancelButton);\n\nform.getChildren().addAll(titleLabel, titleField, authorField, buttons);\n",[3199,8547,8548,8568,8590,8612,8616,8637,8668,8672,8687,8703,8707,8722,8738,8742,8763,8783,8814,8818,8838,8861,8865,8881,8885],{"__ignoreMap":3281},[3285,8549,8550,8552,8555,8557,8559,8561,8563,8566],{"class":3287,"line":3288},[3285,8551,6108],{"class":3523},[3285,8553,8554],{"class":3570}," form",[3285,8556,3634],{"class":3314},[3285,8558,3598],{"class":3597},[3285,8560,6118],{"class":3560},[3285,8562,3564],{"class":3314},[3285,8564,8565],{"class":3689},"15",[3285,8567,3648],{"class":3314},[3285,8569,8570,8573,8575,8577,8579,8581,8583,8585,8588],{"class":3287,"line":3302},[3285,8571,8572],{"class":3570},"form",[3285,8574,3269],{"class":3314},[3285,8576,6135],{"class":3560},[3285,8578,3564],{"class":3314},[3285,8580,3598],{"class":3597},[3285,8582,6142],{"class":3560},[3285,8584,3564],{"class":3314},[3285,8586,8587],{"class":3689},"20",[3285,8589,5990],{"class":3314},[3285,8591,8592,8594,8596,8598,8600,8602,8604,8606,8608,8610],{"class":3287,"line":3325},[3285,8593,8572],{"class":3570},[3285,8595,3269],{"class":3314},[3285,8597,6254],{"class":3560},[3285,8599,3604],{"class":3314},[3285,8601,3883],{"class":3560},[3285,8603,3564],{"class":3314},[3285,8605,6263],{"class":3570},[3285,8607,3269],{"class":3314},[3285,8609,8182],{"class":3570},[3285,8611,3648],{"class":3314},[3285,8613,8614],{"class":3287,"line":3344},[3285,8615,3401],{"emptyLinePlaceholder":3400},[3285,8617,8618,8621,8624,8626,8628,8630,8632,8635],{"class":3287,"line":3363},[3285,8619,8620],{"class":3523},"Label",[3285,8622,8623],{"class":3570}," titleLabel",[3285,8625,3634],{"class":3314},[3285,8627,3598],{"class":3597},[3285,8629,5982],{"class":3560},[3285,8631,3564],{"class":3314},[3285,8633,8634],{"class":3644},"\"Add Audiobook\"",[3285,8636,3648],{"class":3314},[3285,8638,8639,8642,8644,8646,8648,8650,8652,8654,8656,8658,8660,8662,8664,8666],{"class":3287,"line":3409},[3285,8640,8641],{"class":3570},"titleLabel",[3285,8643,3269],{"class":3314},[3285,8645,6254],{"class":3560},[3285,8647,3604],{"class":3314},[3285,8649,5086],{"class":3560},[3285,8651,3564],{"class":3314},[3285,8653,6263],{"class":3570},[3285,8655,3269],{"class":3314},[3285,8657,7628],{"class":3570},[3285,8659,3202],{"class":3314},[3285,8661,6263],{"class":3570},[3285,8663,3269],{"class":3314},[3285,8665,7715],{"class":3570},[3285,8667,3648],{"class":3314},[3285,8669,8670],{"class":3287,"line":3415},[3285,8671,3401],{"emptyLinePlaceholder":3400},[3285,8673,8674,8676,8679,8681,8683,8685],{"class":3287,"line":3501},[3285,8675,6157],{"class":3523},[3285,8677,8678],{"class":3570}," titleField",[3285,8680,3634],{"class":3314},[3285,8682,3598],{"class":3597},[3285,8684,6167],{"class":3560},[3285,8686,3746],{"class":3314},[3285,8688,8689,8692,8694,8696,8698,8701],{"class":3287,"line":3509},[3285,8690,8691],{"class":3570},"titleField",[3285,8693,3269],{"class":3314},[3285,8695,5822],{"class":3560},[3285,8697,3564],{"class":3314},[3285,8699,8700],{"class":3644},"\"Title\"",[3285,8702,3648],{"class":3314},[3285,8704,8705],{"class":3287,"line":3514},[3285,8706,3401],{"emptyLinePlaceholder":3400},[3285,8708,8709,8711,8714,8716,8718,8720],{"class":3287,"line":3536},[3285,8710,6157],{"class":3523},[3285,8712,8713],{"class":3570}," authorField",[3285,8715,3634],{"class":3314},[3285,8717,3598],{"class":3597},[3285,8719,6167],{"class":3560},[3285,8721,3746],{"class":3314},[3285,8723,8724,8727,8729,8731,8733,8736],{"class":3287,"line":3542},[3285,8725,8726],{"class":3570},"authorField",[3285,8728,3269],{"class":3314},[3285,8730,5822],{"class":3560},[3285,8732,3564],{"class":3314},[3285,8734,8735],{"class":3644},"\"Author\"",[3285,8737,3648],{"class":3314},[3285,8739,8740],{"class":3287,"line":3551},[3285,8741,3401],{"emptyLinePlaceholder":3400},[3285,8743,8744,8747,8750,8752,8754,8757,8759,8761],{"class":3287,"line":3577},[3285,8745,8746],{"class":3523},"HBox",[3285,8748,8749],{"class":3570}," buttons",[3285,8751,3634],{"class":3314},[3285,8753,3598],{"class":3597},[3285,8755,8756],{"class":3560}," HBox",[3285,8758,3564],{"class":3314},[3285,8760,6123],{"class":3689},[3285,8762,3648],{"class":3314},[3285,8764,8765,8767,8770,8772,8774,8776,8778,8781],{"class":3287,"line":3584},[3285,8766,5914],{"class":3523},[3285,8768,8769],{"class":3570}," saveButton",[3285,8771,3634],{"class":3314},[3285,8773,3598],{"class":3597},[3285,8775,3639],{"class":3560},[3285,8777,3564],{"class":3314},[3285,8779,8780],{"class":3644},"\"Save\"",[3285,8782,3648],{"class":3314},[3285,8784,8785,8788,8790,8792,8794,8796,8798,8800,8802,8804,8806,8808,8810,8812],{"class":3287,"line":3613},[3285,8786,8787],{"class":3570},"saveButton",[3285,8789,3269],{"class":3314},[3285,8791,6254],{"class":3560},[3285,8793,3604],{"class":3314},[3285,8795,5086],{"class":3560},[3285,8797,3564],{"class":3314},[3285,8799,6263],{"class":3570},[3285,8801,3269],{"class":3314},[3285,8803,6268],{"class":3570},[3285,8805,3202],{"class":3314},[3285,8807,6263],{"class":3570},[3285,8809,3269],{"class":3314},[3285,8811,8446],{"class":3570},[3285,8813,3648],{"class":3314},[3285,8815,8816],{"class":3287,"line":3619},[3285,8817,3401],{"emptyLinePlaceholder":3400},[3285,8819,8820,8822,8825,8827,8829,8831,8833,8836],{"class":3287,"line":3625},[3285,8821,5914],{"class":3523},[3285,8823,8824],{"class":3570}," cancelButton",[3285,8826,3634],{"class":3314},[3285,8828,3598],{"class":3597},[3285,8830,3639],{"class":3560},[3285,8832,3564],{"class":3314},[3285,8834,8835],{"class":3644},"\"Cancel\"",[3285,8837,3648],{"class":3314},[3285,8839,8840,8843,8845,8847,8849,8851,8853,8855,8857,8859],{"class":3287,"line":3651},[3285,8841,8842],{"class":3570},"cancelButton",[3285,8844,3269],{"class":3314},[3285,8846,6254],{"class":3560},[3285,8848,3604],{"class":3314},[3285,8850,3883],{"class":3560},[3285,8852,3564],{"class":3314},[3285,8854,6263],{"class":3570},[3285,8856,3269],{"class":3314},[3285,8858,8385],{"class":3570},[3285,8860,3648],{"class":3314},[3285,8862,8863],{"class":3287,"line":3670},[3285,8864,3401],{"emptyLinePlaceholder":3400},[3285,8866,8867,8870,8872,8874,8876,8878],{"class":3287,"line":3700},[3285,8868,8869],{"class":3570},"buttons",[3285,8871,3269],{"class":3314},[3285,8873,6283],{"class":3560},[3285,8875,3604],{"class":3314},[3285,8877,5086],{"class":3560},[3285,8879,8880],{"class":3314},"(saveButton, cancelButton);\n",[3285,8882,8883],{"class":3287,"line":3705},[3285,8884,3401],{"emptyLinePlaceholder":3400},[3285,8886,8887,8889,8891,8893,8895,8897],{"class":3287,"line":3723},[3285,8888,8572],{"class":3570},[3285,8890,3269],{"class":3314},[3285,8892,6283],{"class":3560},[3285,8894,3604],{"class":3314},[3285,8896,5086],{"class":3560},[3285,8898,8899],{"class":3314},"(titleLabel, titleField, authorField, buttons);\n",[3150,8901,8902],{},"Результат: професійно виглядаюча форма без написання жодного рядка CSS.",[3253,8904],{},[3145,8906,8908],{"id":8907},"інтеграція-з-mvvm-додатками","Інтеграція з MVVM-додатками",[3150,8910,8911],{},"AtlantaFX легко інтегрується з MVVM-архітектурою, яку ми розглядали у попередніх статтях.",[3271,8913,8915],{"id":8914},"thememanager-як-singleton-через-guice","ThemeManager як Singleton через Guice",[3276,8917,8919],{"className":3445,"code":8918,"language":3447,"meta":3281,"style":3281},"package dev.kostyl.audiobook.infrastructure;\n\nimport atlantafx.base.theme.*;\nimport com.google.inject.Singleton;\nimport javafx.application.Application;\n\nimport java.util.prefs.Preferences;\n\n@Singleton\npublic class ThemeManager {\n    \n    public enum Theme {\n        PRIMER_LIGHT(\"Primer Light\", new PrimerLight()),\n        PRIMER_DARK(\"Primer Dark\", new PrimerDark()),\n        NORD_LIGHT(\"Nord Light\", new NordLight()),\n        NORD_DARK(\"Nord Dark\", new NordDark()),\n        CUPERTINO_LIGHT(\"Cupertino Light\", new CupertinoLight()),\n        CUPERTINO_DARK(\"Cupertino Dark\", new CupertinoDark()),\n        DRACULA(\"Dracula\", new Dracula());\n        \n        private final String displayName;\n        private final atlantafx.base.theme.Theme theme;\n        \n        Theme(String displayName, atlantafx.base.theme.Theme theme) {\n            this.displayName = displayName;\n            this.theme = theme;\n        }\n        \n        public String getDisplayName() {\n            return displayName;\n        }\n        \n        public String getStylesheet() {\n            return theme.getUserAgentStylesheet();\n        }\n        \n        public boolean isDark() {\n            return theme.isDarkMode();\n        }\n    }\n    \n    private static final String PREFS_KEY_THEME = \"atlantafx.theme\";\n    private final Preferences prefs;\n    private Theme currentTheme;\n    \n    public ThemeManager() {\n        this.prefs = Preferences.userNodeForPackage(ThemeManager.class);\n        this.currentTheme = loadSavedTheme();\n        applyTheme(currentTheme);\n    }\n    \n    private Theme loadSavedTheme() {\n        String savedTheme = prefs.get(PREFS_KEY_THEME, Theme.PRIMER_LIGHT.name());\n        try {\n            return Theme.valueOf(savedTheme);\n        } catch (IllegalArgumentException e) {\n            return Theme.PRIMER_LIGHT;\n        }\n    }\n    \n    public void setTheme(Theme theme) {\n        this.currentTheme = theme;\n        applyTheme(theme);\n        prefs.put(PREFS_KEY_THEME, theme.name());\n    }\n    \n    private void applyTheme(Theme theme) {\n        Application.setUserAgentStylesheet(theme.getStylesheet());\n    }\n    \n    public Theme getCurrentTheme() {\n        return currentTheme;\n    }\n    \n    public boolean isDarkMode() {\n        return currentTheme.isDark();\n    }\n}\n",[3199,8920,8921,8928,8932,8939,8946,8952,8956,8963,8967,8975,8985,8989,8999,9014,9029,9044,9059,9074,9089,9104,9108,9121,9145,9149,9179,9191,9201,9205,9209,9220,9227,9231,9235,9245,9257,9261,9265,9277,9290,9294,9298,9302,9321,9333,9343,9347,9356,9383,9399,9408,9413,9418,9429,9458,9465,9478,9493,9506,9511,9516,9521,9538,9549,9556,9575,9580,9585,9603,9622,9627,9632,9643,9650,9655,9660,9672,9686,9691],{"__ignoreMap":3281},[3285,8922,8923,8925],{"class":3287,"line":3288},[3285,8924,3455],{"class":3454},[3285,8926,8927],{"class":3314}," dev.kostyl.audiobook.infrastructure;\n",[3285,8929,8930],{"class":3287,"line":3302},[3285,8931,3401],{"emptyLinePlaceholder":3400},[3285,8933,8934,8936],{"class":3287,"line":3325},[3285,8935,3467],{"class":3454},[3285,8937,8938],{"class":3314}," atlantafx.base.theme.*;\n",[3285,8940,8941,8943],{"class":3287,"line":3344},[3285,8942,3467],{"class":3454},[3285,8944,8945],{"class":3314}," com.google.inject.Singleton;\n",[3285,8947,8948,8950],{"class":3287,"line":3363},[3285,8949,3467],{"class":3454},[3285,8951,3477],{"class":3314},[3285,8953,8954],{"class":3287,"line":3409},[3285,8955,3401],{"emptyLinePlaceholder":3400},[3285,8957,8958,8960],{"class":3287,"line":3415},[3285,8959,3467],{"class":3454},[3285,8961,8962],{"class":3314}," java.util.prefs.Preferences;\n",[3285,8964,8965],{"class":3287,"line":3501},[3285,8966,3401],{"emptyLinePlaceholder":3400},[3285,8968,8969,8972],{"class":3287,"line":3509},[3285,8970,8971],{"class":3314},"@",[3285,8973,8974],{"class":3523},"Singleton\n",[3285,8976,8977,8979,8981,8983],{"class":3287,"line":3514},[3285,8978,3517],{"class":3454},[3285,8980,3520],{"class":3454},[3285,8982,4386],{"class":3523},[3285,8984,3533],{"class":3314},[3285,8986,8987],{"class":3287,"line":3536},[3285,8988,3539],{"class":3314},[3285,8990,8991,8993,8995,8997],{"class":3287,"line":3542},[3285,8992,3554],{"class":3454},[3285,8994,4399],{"class":3454},[3285,8996,4402],{"class":3523},[3285,8998,3533],{"class":3314},[3285,9000,9001,9003,9006,9008,9010,9012],{"class":3287,"line":3551},[3285,9002,4409],{"class":3314},[3285,9004,9005],{"class":3644},"\"Primer Light\"",[3285,9007,3202],{"class":3314},[3285,9009,3598],{"class":3597},[3285,9011,3601],{"class":3560},[3285,9013,4416],{"class":3314},[3285,9015,9016,9018,9021,9023,9025,9027],{"class":3287,"line":3577},[3285,9017,4421],{"class":3314},[3285,9019,9020],{"class":3644},"\"Primer Dark\"",[3285,9022,3202],{"class":3314},[3285,9024,3598],{"class":3597},[3285,9026,3984],{"class":3560},[3285,9028,4416],{"class":3314},[3285,9030,9031,9033,9036,9038,9040,9042],{"class":3287,"line":3584},[3285,9032,4432],{"class":3314},[3285,9034,9035],{"class":3644},"\"Nord Light\"",[3285,9037,3202],{"class":3314},[3285,9039,3598],{"class":3597},[3285,9041,4049],{"class":3560},[3285,9043,4416],{"class":3314},[3285,9045,9046,9048,9051,9053,9055,9057],{"class":3287,"line":3613},[3285,9047,4443],{"class":3314},[3285,9049,9050],{"class":3644},"\"Nord Dark\"",[3285,9052,3202],{"class":3314},[3285,9054,3598],{"class":3597},[3285,9056,4078],{"class":3560},[3285,9058,4416],{"class":3314},[3285,9060,9061,9063,9066,9068,9070,9072],{"class":3287,"line":3619},[3285,9062,4454],{"class":3314},[3285,9064,9065],{"class":3644},"\"Cupertino Light\"",[3285,9067,3202],{"class":3314},[3285,9069,3598],{"class":3597},[3285,9071,4142],{"class":3560},[3285,9073,4416],{"class":3314},[3285,9075,9076,9078,9081,9083,9085,9087],{"class":3287,"line":3625},[3285,9077,4465],{"class":3314},[3285,9079,9080],{"class":3644},"\"Cupertino Dark\"",[3285,9082,3202],{"class":3314},[3285,9084,3598],{"class":3597},[3285,9086,4171],{"class":3560},[3285,9088,4416],{"class":3314},[3285,9090,9091,9093,9096,9098,9100,9102],{"class":3287,"line":3651},[3285,9092,4476],{"class":3314},[3285,9094,9095],{"class":3644},"\"Dracula\"",[3285,9097,3202],{"class":3314},[3285,9099,3598],{"class":3597},[3285,9101,4231],{"class":3560},[3285,9103,3610],{"class":3314},[3285,9105,9106],{"class":3287,"line":3670},[3285,9107,3616],{"class":3314},[3285,9109,9110,9112,9114,9116,9119],{"class":3287,"line":3700},[3285,9111,4491],{"class":3454},[3285,9113,4494],{"class":3454},[3285,9115,4577],{"class":3523},[3285,9117,9118],{"class":3570}," displayName",[3285,9120,4518],{"class":3314},[3285,9122,9123,9125,9127,9129,9131,9133,9135,9137,9139,9141,9143],{"class":3287,"line":3705},[3285,9124,4491],{"class":3454},[3285,9126,4494],{"class":3454},[3285,9128,4497],{"class":3523},[3285,9130,3269],{"class":3314},[3285,9132,4502],{"class":3523},[3285,9134,3269],{"class":3314},[3285,9136,4507],{"class":3523},[3285,9138,3269],{"class":3314},[3285,9140,4512],{"class":3523},[3285,9142,4515],{"class":3570},[3285,9144,4518],{"class":3314},[3285,9146,9147],{"class":3287,"line":3723},[3285,9148,3616],{"class":3314},[3285,9150,9151,9153,9155,9157,9159,9161,9163,9165,9167,9169,9171,9173,9175,9177],{"class":3287,"line":3736},[3285,9152,4527],{"class":3560},[3285,9154,3564],{"class":3314},[3285,9156,3775],{"class":3523},[3285,9158,9118],{"class":3570},[3285,9160,3202],{"class":3314},[3285,9162,4532],{"class":3523},[3285,9164,3269],{"class":3314},[3285,9166,4502],{"class":3523},[3285,9168,3269],{"class":3314},[3285,9170,4507],{"class":3523},[3285,9172,3269],{"class":3314},[3285,9174,4512],{"class":3523},[3285,9176,4515],{"class":3570},[3285,9178,3574],{"class":3314},[3285,9180,9181,9183,9185,9188],{"class":3287,"line":3749},[3285,9182,4553],{"class":3454},[3285,9184,3269],{"class":3314},[3285,9186,9187],{"class":3570},"displayName",[3285,9189,9190],{"class":3314}," = displayName;\n",[3285,9192,9193,9195,9197,9199],{"class":3287,"line":3755},[3285,9194,4553],{"class":3454},[3285,9196,3269],{"class":3314},[3285,9198,4507],{"class":3570},[3285,9200,4560],{"class":3314},[3285,9202,9203],{"class":3287,"line":3760},[3285,9204,4565],{"class":3314},[3285,9206,9207],{"class":3287,"line":3786},[3285,9208,3616],{"class":3314},[3285,9210,9211,9213,9215,9218],{"class":3287,"line":3795},[3285,9212,4574],{"class":3454},[3285,9214,4577],{"class":3523},[3285,9216,9217],{"class":3560}," getDisplayName",[3285,9219,4583],{"class":3314},[3285,9221,9222,9224],{"class":3287,"line":3800},[3285,9223,4588],{"class":3597},[3285,9225,9226],{"class":3314}," displayName;\n",[3285,9228,9229],{"class":3287,"line":4703},[3285,9230,4565],{"class":3314},[3285,9232,9233],{"class":3287,"line":4712},[3285,9234,3616],{"class":3314},[3285,9236,9237,9239,9241,9243],{"class":3287,"line":4717},[3285,9238,4574],{"class":3454},[3285,9240,4577],{"class":3523},[3285,9242,4580],{"class":3560},[3285,9244,4583],{"class":3314},[3285,9246,9247,9249,9251,9253,9255],{"class":3287,"line":4722},[3285,9248,4588],{"class":3597},[3285,9250,4515],{"class":3570},[3285,9252,3269],{"class":3314},[3285,9254,3607],{"class":3560},[3285,9256,3746],{"class":3314},[3285,9258,9259],{"class":3287,"line":4734},[3285,9260,4565],{"class":3314},[3285,9262,9263],{"class":3287,"line":4743},[3285,9264,3616],{"class":3314},[3285,9266,9267,9269,9272,9275],{"class":3287,"line":4768},[3285,9268,4574],{"class":3454},[3285,9270,9271],{"class":3523}," boolean",[3285,9273,9274],{"class":3560}," isDark",[3285,9276,4583],{"class":3314},[3285,9278,9279,9281,9283,9285,9288],{"class":3287,"line":4790},[3285,9280,4588],{"class":3597},[3285,9282,4515],{"class":3570},[3285,9284,3269],{"class":3314},[3285,9286,9287],{"class":3560},"isDarkMode",[3285,9289,3746],{"class":3314},[3285,9291,9292],{"class":3287,"line":4813},[3285,9293,4565],{"class":3314},[3285,9295,9296],{"class":3287,"line":4836},[3285,9297,3752],{"class":3314},[3285,9299,9300],{"class":3287,"line":4859},[3285,9301,3539],{"class":3314},[3285,9303,9304,9306,9308,9310,9312,9314,9316,9319],{"class":3287,"line":4882},[3285,9305,4613],{"class":3454},[3285,9307,3765],{"class":3454},[3285,9309,4494],{"class":3454},[3285,9311,4577],{"class":3523},[3285,9313,5277],{"class":3570},[3285,9315,3634],{"class":3314},[3285,9317,9318],{"class":3644},"\"atlantafx.theme\"",[3285,9320,4518],{"class":3314},[3285,9322,9323,9325,9327,9329,9331],{"class":3287,"line":4904},[3285,9324,4613],{"class":3454},[3285,9326,4494],{"class":3454},[3285,9328,5293],{"class":3523},[3285,9330,5296],{"class":3570},[3285,9332,4518],{"class":3314},[3285,9334,9335,9337,9339,9341],{"class":3287,"line":4909},[3285,9336,4613],{"class":3454},[3285,9338,4402],{"class":3523},[3285,9340,4618],{"class":3570},[3285,9342,4518],{"class":3314},[3285,9344,9345],{"class":3287,"line":4914},[3285,9346,3539],{"class":3314},[3285,9348,9350,9352,9354],{"class":3287,"line":9349},46,[3285,9351,3554],{"class":3454},[3285,9353,4386],{"class":3560},[3285,9355,4583],{"class":3314},[3285,9357,9359,9361,9363,9365,9367,9369,9371,9373,9375,9377,9379,9381],{"class":3287,"line":9358},47,[3285,9360,4655],{"class":3454},[3285,9362,3269],{"class":3314},[3285,9364,5319],{"class":3570},[3285,9366,3634],{"class":3314},[3285,9368,5244],{"class":3570},[3285,9370,3269],{"class":3314},[3285,9372,5328],{"class":3560},[3285,9374,3564],{"class":3314},[3285,9376,4975],{"class":3570},[3285,9378,3269],{"class":3314},[3285,9380,5337],{"class":3570},[3285,9382,3648],{"class":3314},[3285,9384,9386,9388,9390,9392,9394,9397],{"class":3287,"line":9385},48,[3285,9387,4655],{"class":3454},[3285,9389,3269],{"class":3314},[3285,9391,4660],{"class":3570},[3285,9393,3634],{"class":3314},[3285,9395,9396],{"class":3560},"loadSavedTheme",[3285,9398,3746],{"class":3314},[3285,9400,9402,9405],{"class":3287,"line":9401},49,[3285,9403,9404],{"class":3560},"        applyTheme",[3285,9406,9407],{"class":3314},"(currentTheme);\n",[3285,9409,9411],{"class":3287,"line":9410},50,[3285,9412,3752],{"class":3314},[3285,9414,9416],{"class":3287,"line":9415},51,[3285,9417,3539],{"class":3314},[3285,9419,9421,9423,9425,9427],{"class":3287,"line":9420},52,[3285,9422,4613],{"class":3454},[3285,9424,4402],{"class":3523},[3285,9426,5363],{"class":3560},[3285,9428,4583],{"class":3314},[3285,9430,9432,9434,9436,9438,9440,9442,9444,9446,9448,9450,9452,9454,9456],{"class":3287,"line":9431},53,[3285,9433,5370],{"class":3523},[3285,9435,5373],{"class":3570},[3285,9437,3634],{"class":3314},[3285,9439,5319],{"class":3570},[3285,9441,3269],{"class":3314},[3285,9443,5382],{"class":3560},[3285,9445,5385],{"class":3314},[3285,9447,4512],{"class":3570},[3285,9449,3269],{"class":3314},[3285,9451,4627],{"class":3570},[3285,9453,3269],{"class":3314},[3285,9455,5396],{"class":3560},[3285,9457,3610],{"class":3314},[3285,9459,9461,9463],{"class":3287,"line":9460},54,[3285,9462,5403],{"class":3597},[3285,9464,3533],{"class":3314},[3285,9466,9468,9470,9472,9474,9476],{"class":3287,"line":9467},55,[3285,9469,4588],{"class":3597},[3285,9471,4402],{"class":3570},[3285,9473,3269],{"class":3314},[3285,9475,5421],{"class":3560},[3285,9477,5424],{"class":3314},[3285,9479,9481,9483,9485,9487,9489,9491],{"class":3287,"line":9480},56,[3285,9482,5437],{"class":3314},[3285,9484,5440],{"class":3597},[3285,9486,5443],{"class":3314},[3285,9488,5446],{"class":3523},[3285,9490,5449],{"class":3570},[3285,9492,3574],{"class":3314},[3285,9494,9496,9498,9500,9502,9504],{"class":3287,"line":9495},57,[3285,9497,4588],{"class":3597},[3285,9499,4402],{"class":3570},[3285,9501,3269],{"class":3314},[3285,9503,4627],{"class":3570},[3285,9505,4518],{"class":3314},[3285,9507,9509],{"class":3287,"line":9508},58,[3285,9510,4565],{"class":3314},[3285,9512,9514],{"class":3287,"line":9513},59,[3285,9515,3752],{"class":3314},[3285,9517,9519],{"class":3287,"line":9518},60,[3285,9520,3539],{"class":3314},[3285,9522,9524,9526,9528,9530,9532,9534,9536],{"class":3287,"line":9523},61,[3285,9525,3554],{"class":3454},[3285,9527,3557],{"class":3523},[3285,9529,4642],{"class":3560},[3285,9531,3564],{"class":3314},[3285,9533,4512],{"class":3523},[3285,9535,4515],{"class":3570},[3285,9537,3574],{"class":3314},[3285,9539,9541,9543,9545,9547],{"class":3287,"line":9540},62,[3285,9542,4655],{"class":3454},[3285,9544,3269],{"class":3314},[3285,9546,4660],{"class":3570},[3285,9548,4560],{"class":3314},[3285,9550,9552,9554],{"class":3287,"line":9551},63,[3285,9553,9404],{"class":3560},[3285,9555,5432],{"class":3314},[3285,9557,9559,9561,9563,9565,9567,9569,9571,9573],{"class":3287,"line":9558},64,[3285,9560,5526],{"class":3570},[3285,9562,3269],{"class":3314},[3285,9564,5531],{"class":3560},[3285,9566,5385],{"class":3314},[3285,9568,4507],{"class":3570},[3285,9570,3269],{"class":3314},[3285,9572,5396],{"class":3560},[3285,9574,3610],{"class":3314},[3285,9576,9578],{"class":3287,"line":9577},65,[3285,9579,3752],{"class":3314},[3285,9581,9583],{"class":3287,"line":9582},66,[3285,9584,3539],{"class":3314},[3285,9586,9588,9590,9592,9595,9597,9599,9601],{"class":3287,"line":9587},67,[3285,9589,4613],{"class":3454},[3285,9591,3557],{"class":3523},[3285,9593,9594],{"class":3560}," applyTheme",[3285,9596,3564],{"class":3314},[3285,9598,4512],{"class":3523},[3285,9600,4515],{"class":3570},[3285,9602,3574],{"class":3314},[3285,9604,9606,9608,9610,9612,9614,9616,9618,9620],{"class":3287,"line":9605},68,[3285,9607,3587],{"class":3570},[3285,9609,3269],{"class":3314},[3285,9611,3592],{"class":3560},[3285,9613,3564],{"class":3314},[3285,9615,4507],{"class":3570},[3285,9617,3269],{"class":3314},[3285,9619,4679],{"class":3560},[3285,9621,3610],{"class":3314},[3285,9623,9625],{"class":3287,"line":9624},69,[3285,9626,3752],{"class":3314},[3285,9628,9630],{"class":3287,"line":9629},70,[3285,9631,3539],{"class":3314},[3285,9633,9635,9637,9639,9641],{"class":3287,"line":9634},71,[3285,9636,3554],{"class":3454},[3285,9638,4402],{"class":3523},[3285,9640,4698],{"class":3560},[3285,9642,4583],{"class":3314},[3285,9644,9646,9648],{"class":3287,"line":9645},72,[3285,9647,4706],{"class":3597},[3285,9649,4709],{"class":3314},[3285,9651,9653],{"class":3287,"line":9652},73,[3285,9654,3752],{"class":3314},[3285,9656,9658],{"class":3287,"line":9657},74,[3285,9659,3539],{"class":3314},[3285,9661,9663,9665,9667,9670],{"class":3287,"line":9662},75,[3285,9664,3554],{"class":3454},[3285,9666,9271],{"class":3523},[3285,9668,9669],{"class":3560}," isDarkMode",[3285,9671,4583],{"class":3314},[3285,9673,9675,9677,9679,9681,9684],{"class":3287,"line":9674},76,[3285,9676,4706],{"class":3597},[3285,9678,4618],{"class":3570},[3285,9680,3269],{"class":3314},[3285,9682,9683],{"class":3560},"isDark",[3285,9685,3746],{"class":3314},[3285,9687,9689],{"class":3287,"line":9688},77,[3285,9690,3752],{"class":3314},[3285,9692,9694],{"class":3287,"line":9693},78,[3285,9695,3395],{"class":3314},[3271,9697,9699],{"id":9698},"реєстрація-у-guice-module","Реєстрація у Guice Module",[3276,9701,9703],{"className":3445,"code":9702,"language":3447,"meta":3281,"style":3281},"@Override\nprotected void configure() {\n    \u002F\u002F Infrastructure\n    bind(ThemeManager.class).in(Singleton.class);\n    \n    \u002F\u002F ... інші bindings\n}\n",[3199,9704,9705,9711,9723,9728,9757,9761,9766],{"__ignoreMap":3281},[3285,9706,9707,9709],{"class":3287,"line":3288},[3285,9708,8971],{"class":3314},[3285,9710,3548],{"class":3523},[3285,9712,9713,9716,9718,9721],{"class":3287,"line":3302},[3285,9714,9715],{"class":3454},"protected",[3285,9717,3557],{"class":3523},[3285,9719,9720],{"class":3560}," configure",[3285,9722,4583],{"class":3314},[3285,9724,9725],{"class":3287,"line":3325},[3285,9726,9727],{"class":3580},"    \u002F\u002F Infrastructure\n",[3285,9729,9730,9733,9735,9737,9739,9741,9743,9746,9748,9751,9753,9755],{"class":3287,"line":3344},[3285,9731,9732],{"class":3560},"    bind",[3285,9734,3564],{"class":3314},[3285,9736,4975],{"class":3570},[3285,9738,3269],{"class":3314},[3285,9740,5337],{"class":3570},[3285,9742,3209],{"class":3314},[3285,9744,9745],{"class":3560},"in",[3285,9747,3564],{"class":3314},[3285,9749,9750],{"class":3570},"Singleton",[3285,9752,3269],{"class":3314},[3285,9754,5337],{"class":3570},[3285,9756,3648],{"class":3314},[3285,9758,9759],{"class":3287,"line":3363},[3285,9760,3539],{"class":3314},[3285,9762,9763],{"class":3287,"line":3409},[3285,9764,9765],{"class":3580},"    \u002F\u002F ... інші bindings\n",[3285,9767,9768],{"class":3287,"line":3415},[3285,9769,3395],{"class":3314},[3271,9771,9773],{"id":9772},"viewmodel-для-налаштувань-теми","ViewModel для налаштувань теми",[3276,9775,9777],{"className":3445,"code":9776,"language":3447,"meta":3281,"style":3281},"package dev.kostyl.audiobook.viewmodel;\n\nimport com.google.inject.Inject;\nimport dev.kostyl.audiobook.infrastructure.ThemeManager;\nimport javafx.beans.property.*;\nimport javafx.collections.FXCollections;\nimport javafx.collections.ObservableList;\n\npublic class SettingsViewModel {\n    \n    private final ThemeManager themeManager;\n    \n    private final ObservableList\u003CThemeManager.Theme> availableThemes = \n        FXCollections.observableArrayList(ThemeManager.Theme.values());\n    \n    private final ObjectProperty\u003CThemeManager.Theme> selectedTheme = \n        new SimpleObjectProperty\u003C>();\n    \n    private final BooleanProperty darkMode = new SimpleBooleanProperty();\n    \n    @Inject\n    public SettingsViewModel(ThemeManager themeManager) {\n        this.themeManager = themeManager;\n        \n        \u002F\u002F Ініціалізація поточної теми\n        selectedTheme.set(themeManager.getCurrentTheme());\n        darkMode.set(themeManager.isDarkMode());\n        \n        \u002F\u002F Listener для зміни теми\n        selectedTheme.addListener((obs, oldTheme, newTheme) -> {\n            if (newTheme != null) {\n                themeManager.setTheme(newTheme);\n                darkMode.set(newTheme.isDark());\n            }\n        });\n    }\n    \n    public ObservableList\u003CThemeManager.Theme> getAvailableThemes() {\n        return availableThemes;\n    }\n    \n    public ObjectProperty\u003CThemeManager.Theme> selectedThemeProperty() {\n        return selectedTheme;\n    }\n    \n    public BooleanProperty darkModeProperty() {\n        return darkMode;\n    }\n    \n    public void toggleDarkMode() {\n        ThemeManager.Theme current = selectedTheme.get();\n        ThemeManager.Theme newTheme = switch (current) {\n            case PRIMER_LIGHT -> ThemeManager.Theme.PRIMER_DARK;\n            case PRIMER_DARK -> ThemeManager.Theme.PRIMER_LIGHT;\n            case NORD_LIGHT -> ThemeManager.Theme.NORD_DARK;\n            case NORD_DARK -> ThemeManager.Theme.NORD_LIGHT;\n            case CUPERTINO_LIGHT -> ThemeManager.Theme.CUPERTINO_DARK;\n            case CUPERTINO_DARK -> ThemeManager.Theme.CUPERTINO_LIGHT;\n            case DRACULA -> ThemeManager.Theme.PRIMER_LIGHT;\n        };\n        selectedTheme.set(newTheme);\n    }\n}\n",[3199,9778,9779,9786,9790,9797,9804,9811,9818,9825,9829,9840,9844,9856,9860,9885,9909,9913,9937,9948,9952,9973,9977,9983,9997,10007,10011,10016,10036,10055,10059,10064,10079,10092,10104,10124,10129,10133,10137,10141,10162,10169,10173,10177,10198,10205,10209,10213,10224,10231,10235,10239,10249,10271,10290,10310,10330,10350,10370,10390,10410,10430,10435,10445,10449],{"__ignoreMap":3281},[3285,9780,9781,9783],{"class":3287,"line":3288},[3285,9782,3455],{"class":3454},[3285,9784,9785],{"class":3314}," dev.kostyl.audiobook.viewmodel;\n",[3285,9787,9788],{"class":3287,"line":3302},[3285,9789,3401],{"emptyLinePlaceholder":3400},[3285,9791,9792,9794],{"class":3287,"line":3325},[3285,9793,3467],{"class":3454},[3285,9795,9796],{"class":3314}," com.google.inject.Inject;\n",[3285,9798,9799,9801],{"class":3287,"line":3344},[3285,9800,3467],{"class":3454},[3285,9802,9803],{"class":3314}," dev.kostyl.audiobook.infrastructure.ThemeManager;\n",[3285,9805,9806,9808],{"class":3287,"line":3363},[3285,9807,3467],{"class":3454},[3285,9809,9810],{"class":3314}," javafx.beans.property.*;\n",[3285,9812,9813,9815],{"class":3287,"line":3409},[3285,9814,3467],{"class":3454},[3285,9816,9817],{"class":3314}," javafx.collections.FXCollections;\n",[3285,9819,9820,9822],{"class":3287,"line":3415},[3285,9821,3467],{"class":3454},[3285,9823,9824],{"class":3314}," javafx.collections.ObservableList;\n",[3285,9826,9827],{"class":3287,"line":3501},[3285,9828,3401],{"emptyLinePlaceholder":3400},[3285,9830,9831,9833,9835,9838],{"class":3287,"line":3509},[3285,9832,3517],{"class":3454},[3285,9834,3520],{"class":3454},[3285,9836,9837],{"class":3523}," SettingsViewModel",[3285,9839,3533],{"class":3314},[3285,9841,9842],{"class":3287,"line":3514},[3285,9843,3539],{"class":3314},[3285,9845,9846,9848,9850,9852,9854],{"class":3287,"line":3536},[3285,9847,4613],{"class":3454},[3285,9849,4494],{"class":3454},[3285,9851,4386],{"class":3523},[3285,9853,4951],{"class":3570},[3285,9855,4518],{"class":3314},[3285,9857,9858],{"class":3287,"line":3542},[3285,9859,3539],{"class":3314},[3285,9861,9862,9864,9866,9869,9871,9873,9875,9877,9879,9882],{"class":3287,"line":3551},[3285,9863,4613],{"class":3454},[3285,9865,4494],{"class":3454},[3285,9867,9868],{"class":3523}," ObservableList",[3285,9870,3292],{"class":3314},[3285,9872,4975],{"class":3523},[3285,9874,3269],{"class":3314},[3285,9876,4512],{"class":3523},[3285,9878,4982],{"class":3314},[3285,9880,9881],{"class":3570},"availableThemes",[3285,9883,9884],{"class":3314}," = \n",[3285,9886,9887,9890,9892,9895,9897,9899,9901,9903,9905,9907],{"class":3287,"line":3577},[3285,9888,9889],{"class":3570},"        FXCollections",[3285,9891,3269],{"class":3314},[3285,9893,9894],{"class":3560},"observableArrayList",[3285,9896,3564],{"class":3314},[3285,9898,4975],{"class":3570},[3285,9900,3269],{"class":3314},[3285,9902,4512],{"class":3570},[3285,9904,3269],{"class":3314},[3285,9906,5099],{"class":3560},[3285,9908,3610],{"class":3314},[3285,9910,9911],{"class":3287,"line":3584},[3285,9912,3539],{"class":3314},[3285,9914,9915,9917,9919,9922,9924,9926,9928,9930,9932,9935],{"class":3287,"line":3613},[3285,9916,4613],{"class":3454},[3285,9918,4494],{"class":3454},[3285,9920,9921],{"class":3523}," ObjectProperty",[3285,9923,3292],{"class":3314},[3285,9925,4975],{"class":3523},[3285,9927,3269],{"class":3314},[3285,9929,4512],{"class":3523},[3285,9931,4982],{"class":3314},[3285,9933,9934],{"class":3570},"selectedTheme",[3285,9936,9884],{"class":3314},[3285,9938,9939,9942,9945],{"class":3287,"line":3619},[3285,9940,9941],{"class":3597},"        new",[3285,9943,9944],{"class":3523}," SimpleObjectProperty",[3285,9946,9947],{"class":3314},"\u003C>();\n",[3285,9949,9950],{"class":3287,"line":3625},[3285,9951,3539],{"class":3314},[3285,9953,9954,9956,9958,9961,9964,9966,9968,9971],{"class":3287,"line":3651},[3285,9955,4613],{"class":3454},[3285,9957,4494],{"class":3454},[3285,9959,9960],{"class":3523}," BooleanProperty",[3285,9962,9963],{"class":3570}," darkMode",[3285,9965,3634],{"class":3314},[3285,9967,3598],{"class":3597},[3285,9969,9970],{"class":3560}," SimpleBooleanProperty",[3285,9972,3746],{"class":3314},[3285,9974,9975],{"class":3287,"line":3670},[3285,9976,3539],{"class":3314},[3285,9978,9979,9981],{"class":3287,"line":3700},[3285,9980,3545],{"class":3314},[3285,9982,5014],{"class":3523},[3285,9984,9985,9987,9989,9991,9993,9995],{"class":3287,"line":3705},[3285,9986,3554],{"class":3454},[3285,9988,9837],{"class":3560},[3285,9990,3564],{"class":3314},[3285,9992,4975],{"class":3523},[3285,9994,4951],{"class":3570},[3285,9996,3574],{"class":3314},[3285,9998,9999,10001,10003,10005],{"class":3287,"line":3723},[3285,10000,4655],{"class":3454},[3285,10002,3269],{"class":3314},[3285,10004,5037],{"class":3570},[3285,10006,5040],{"class":3314},[3285,10008,10009],{"class":3287,"line":3736},[3285,10010,3616],{"class":3314},[3285,10012,10013],{"class":3287,"line":3749},[3285,10014,10015],{"class":3580},"        \u002F\u002F Ініціалізація поточної теми\n",[3285,10017,10018,10021,10023,10026,10028,10030,10032,10034],{"class":3287,"line":3755},[3285,10019,10020],{"class":3570},"        selectedTheme",[3285,10022,3269],{"class":3314},[3285,10024,10025],{"class":3560},"set",[3285,10027,3564],{"class":3314},[3285,10029,5037],{"class":3570},[3285,10031,3269],{"class":3314},[3285,10033,5119],{"class":3560},[3285,10035,3610],{"class":3314},[3285,10037,10038,10041,10043,10045,10047,10049,10051,10053],{"class":3287,"line":3760},[3285,10039,10040],{"class":3570},"        darkMode",[3285,10042,3269],{"class":3314},[3285,10044,10025],{"class":3560},[3285,10046,3564],{"class":3314},[3285,10048,5037],{"class":3570},[3285,10050,3269],{"class":3314},[3285,10052,9287],{"class":3560},[3285,10054,3610],{"class":3314},[3285,10056,10057],{"class":3287,"line":3786},[3285,10058,3616],{"class":3314},[3285,10060,10061],{"class":3287,"line":3795},[3285,10062,10063],{"class":3580},"        \u002F\u002F Listener для зміни теми\n",[3285,10065,10066,10068,10070,10072,10075,10077],{"class":3287,"line":3800},[3285,10067,10020],{"class":3570},[3285,10069,3269],{"class":3314},[3285,10071,5642],{"class":3560},[3285,10073,10074],{"class":3314},"((obs, oldTheme, newTheme) ",[3285,10076,4752],{"class":3454},[3285,10078,3533],{"class":3314},[3285,10080,10081,10084,10087,10090],{"class":3287,"line":4703},[3285,10082,10083],{"class":3597},"            if",[3285,10085,10086],{"class":3314}," (newTheme != ",[3285,10088,10089],{"class":3454},"null",[3285,10091,3574],{"class":3314},[3285,10093,10094,10097,10099,10101],{"class":3287,"line":4712},[3285,10095,10096],{"class":3570},"                themeManager",[3285,10098,3269],{"class":3314},[3285,10100,5179],{"class":3560},[3285,10102,10103],{"class":3314},"(newTheme);\n",[3285,10105,10106,10109,10111,10113,10115,10118,10120,10122],{"class":3287,"line":4717},[3285,10107,10108],{"class":3570},"                darkMode",[3285,10110,3269],{"class":3314},[3285,10112,10025],{"class":3560},[3285,10114,3564],{"class":3314},[3285,10116,10117],{"class":3570},"newTheme",[3285,10119,3269],{"class":3314},[3285,10121,9683],{"class":3560},[3285,10123,3610],{"class":3314},[3285,10125,10126],{"class":3287,"line":4722},[3285,10127,10128],{"class":3314},"            }\n",[3285,10130,10131],{"class":3287,"line":4734},[3285,10132,5187],{"class":3314},[3285,10134,10135],{"class":3287,"line":4743},[3285,10136,3752],{"class":3314},[3285,10138,10139],{"class":3287,"line":4768},[3285,10140,3539],{"class":3314},[3285,10142,10143,10145,10147,10149,10151,10153,10155,10157,10160],{"class":3287,"line":4790},[3285,10144,3554],{"class":3454},[3285,10146,9868],{"class":3523},[3285,10148,3292],{"class":3314},[3285,10150,4975],{"class":3523},[3285,10152,3269],{"class":3314},[3285,10154,4512],{"class":3523},[3285,10156,4982],{"class":3314},[3285,10158,10159],{"class":3560},"getAvailableThemes",[3285,10161,4583],{"class":3314},[3285,10163,10164,10166],{"class":3287,"line":4813},[3285,10165,4706],{"class":3597},[3285,10167,10168],{"class":3314}," availableThemes;\n",[3285,10170,10171],{"class":3287,"line":4836},[3285,10172,3752],{"class":3314},[3285,10174,10175],{"class":3287,"line":4859},[3285,10176,3539],{"class":3314},[3285,10178,10179,10181,10183,10185,10187,10189,10191,10193,10196],{"class":3287,"line":4882},[3285,10180,3554],{"class":3454},[3285,10182,9921],{"class":3523},[3285,10184,3292],{"class":3314},[3285,10186,4975],{"class":3523},[3285,10188,3269],{"class":3314},[3285,10190,4512],{"class":3523},[3285,10192,4982],{"class":3314},[3285,10194,10195],{"class":3560},"selectedThemeProperty",[3285,10197,4583],{"class":3314},[3285,10199,10200,10202],{"class":3287,"line":4904},[3285,10201,4706],{"class":3597},[3285,10203,10204],{"class":3314}," selectedTheme;\n",[3285,10206,10207],{"class":3287,"line":4909},[3285,10208,3752],{"class":3314},[3285,10210,10211],{"class":3287,"line":4914},[3285,10212,3539],{"class":3314},[3285,10214,10215,10217,10219,10222],{"class":3287,"line":9349},[3285,10216,3554],{"class":3454},[3285,10218,9960],{"class":3523},[3285,10220,10221],{"class":3560}," darkModeProperty",[3285,10223,4583],{"class":3314},[3285,10225,10226,10228],{"class":3287,"line":9358},[3285,10227,4706],{"class":3597},[3285,10229,10230],{"class":3314}," darkMode;\n",[3285,10232,10233],{"class":3287,"line":9385},[3285,10234,3752],{"class":3314},[3285,10236,10237],{"class":3287,"line":9401},[3285,10238,3539],{"class":3314},[3285,10240,10241,10243,10245,10247],{"class":3287,"line":9410},[3285,10242,3554],{"class":3454},[3285,10244,3557],{"class":3523},[3285,10246,4729],{"class":3560},[3285,10248,4583],{"class":3314},[3285,10250,10251,10254,10256,10258,10261,10263,10265,10267,10269],{"class":3287,"line":9415},[3285,10252,10253],{"class":3523},"        ThemeManager",[3285,10255,3269],{"class":3314},[3285,10257,4512],{"class":3523},[3285,10259,10260],{"class":3570}," current",[3285,10262,3634],{"class":3314},[3285,10264,9934],{"class":3570},[3285,10266,3269],{"class":3314},[3285,10268,5382],{"class":3560},[3285,10270,3746],{"class":3314},[3285,10272,10273,10275,10277,10279,10282,10284,10287],{"class":3287,"line":9420},[3285,10274,10253],{"class":3523},[3285,10276,3269],{"class":3314},[3285,10278,4512],{"class":3523},[3285,10280,10281],{"class":3570}," newTheme",[3285,10283,3634],{"class":3314},[3285,10285,10286],{"class":3597},"switch",[3285,10288,10289],{"class":3314}," (current) {\n",[3285,10291,10292,10294,10296,10298,10300,10302,10304,10306,10308],{"class":3287,"line":9431},[3285,10293,4746],{"class":3597},[3285,10295,4749],{"class":3314},[3285,10297,4752],{"class":3454},[3285,10299,4386],{"class":3570},[3285,10301,3269],{"class":3314},[3285,10303,4512],{"class":3570},[3285,10305,3269],{"class":3314},[3285,10307,4763],{"class":3570},[3285,10309,4518],{"class":3314},[3285,10311,10312,10314,10316,10318,10320,10322,10324,10326,10328],{"class":3287,"line":9460},[3285,10313,4746],{"class":3597},[3285,10315,4773],{"class":3314},[3285,10317,4752],{"class":3454},[3285,10319,4386],{"class":3570},[3285,10321,3269],{"class":3314},[3285,10323,4512],{"class":3570},[3285,10325,3269],{"class":3314},[3285,10327,4627],{"class":3570},[3285,10329,4518],{"class":3314},[3285,10331,10332,10334,10336,10338,10340,10342,10344,10346,10348],{"class":3287,"line":9467},[3285,10333,4746],{"class":3597},[3285,10335,4795],{"class":3314},[3285,10337,4752],{"class":3454},[3285,10339,4386],{"class":3570},[3285,10341,3269],{"class":3314},[3285,10343,4512],{"class":3570},[3285,10345,3269],{"class":3314},[3285,10347,4808],{"class":3570},[3285,10349,4518],{"class":3314},[3285,10351,10352,10354,10356,10358,10360,10362,10364,10366,10368],{"class":3287,"line":9480},[3285,10353,4746],{"class":3597},[3285,10355,4818],{"class":3314},[3285,10357,4752],{"class":3454},[3285,10359,4386],{"class":3570},[3285,10361,3269],{"class":3314},[3285,10363,4512],{"class":3570},[3285,10365,3269],{"class":3314},[3285,10367,4831],{"class":3570},[3285,10369,4518],{"class":3314},[3285,10371,10372,10374,10376,10378,10380,10382,10384,10386,10388],{"class":3287,"line":9495},[3285,10373,4746],{"class":3597},[3285,10375,4841],{"class":3314},[3285,10377,4752],{"class":3454},[3285,10379,4386],{"class":3570},[3285,10381,3269],{"class":3314},[3285,10383,4512],{"class":3570},[3285,10385,3269],{"class":3314},[3285,10387,4854],{"class":3570},[3285,10389,4518],{"class":3314},[3285,10391,10392,10394,10396,10398,10400,10402,10404,10406,10408],{"class":3287,"line":9508},[3285,10393,4746],{"class":3597},[3285,10395,4864],{"class":3314},[3285,10397,4752],{"class":3454},[3285,10399,4386],{"class":3570},[3285,10401,3269],{"class":3314},[3285,10403,4512],{"class":3570},[3285,10405,3269],{"class":3314},[3285,10407,4877],{"class":3570},[3285,10409,4518],{"class":3314},[3285,10411,10412,10414,10416,10418,10420,10422,10424,10426,10428],{"class":3287,"line":9513},[3285,10413,4746],{"class":3597},[3285,10415,4887],{"class":3314},[3285,10417,4752],{"class":3454},[3285,10419,4386],{"class":3570},[3285,10421,3269],{"class":3314},[3285,10423,4512],{"class":3570},[3285,10425,3269],{"class":3314},[3285,10427,4627],{"class":3570},[3285,10429,4518],{"class":3314},[3285,10431,10432],{"class":3287,"line":9518},[3285,10433,10434],{"class":3314},"        };\n",[3285,10436,10437,10439,10441,10443],{"class":3287,"line":9523},[3285,10438,10020],{"class":3570},[3285,10440,3269],{"class":3314},[3285,10442,10025],{"class":3560},[3285,10444,10103],{"class":3314},[3285,10446,10447],{"class":3287,"line":9540},[3285,10448,3752],{"class":3314},[3285,10450,10451],{"class":3287,"line":9551},[3285,10452,3395],{"class":3314},[3271,10454,10456],{"id":10455},"controller-з-bindings","Controller з Bindings",[3276,10458,10460],{"className":3445,"code":10459,"language":3447,"meta":3281,"style":3281},"package dev.kostyl.audiobook.controller;\n\nimport atlantafx.base.controls.ToggleSwitch;\nimport atlantafx.base.theme.Styles;\nimport com.google.inject.Inject;\nimport dev.kostyl.audiobook.infrastructure.ThemeManager;\nimport dev.kostyl.audiobook.viewmodel.SettingsViewModel;\nimport javafx.fxml.FXML;\nimport javafx.scene.control.ComboBox;\nimport javafx.scene.control.Label;\nimport javafx.util.StringConverter;\n\npublic class SettingsController {\n    \n    @FXML private ComboBox\u003CThemeManager.Theme> themeComboBox;\n    @FXML private ToggleSwitch darkModeToggle;\n    @FXML private Label currentThemeLabel;\n    \n    private final SettingsViewModel viewModel;\n    \n    @Inject\n    public SettingsController(SettingsViewModel viewModel) {\n        this.viewModel = viewModel;\n    }\n    \n    @FXML\n    public void initialize() {\n        setupThemeComboBox();\n        setupDarkModeToggle();\n        setupBindings();\n    }\n    \n    private void setupThemeComboBox() {\n        themeComboBox.setItems(viewModel.getAvailableThemes());\n        \n        \u002F\u002F Converter для відображення назв тем\n        themeComboBox.setConverter(new StringConverter\u003C>() {\n            @Override\n            public String toString(ThemeManager.Theme theme) {\n                return theme != null ? theme.getDisplayName() : \"\";\n            }\n            \n            @Override\n            public ThemeManager.Theme fromString(String string) {\n                return null;\n            }\n        });\n    }\n    \n    private void setupDarkModeToggle() {\n        darkModeToggle.setText(\"Dark Mode\");\n    }\n    \n    private void setupBindings() {\n        \u002F\u002F Bidirectional binding для вибраної теми\n        themeComboBox.valueProperty().bindBidirectional(\n            viewModel.selectedThemeProperty()\n        );\n        \n        \u002F\u002F Bidirectional binding для dark mode toggle\n        darkModeToggle.selectedProperty().bindBidirectional(\n            viewModel.darkModeProperty()\n        );\n        \n        \u002F\u002F Unidirectional binding для відображення поточної теми\n        currentThemeLabel.textProperty().bind(\n            viewModel.selectedThemeProperty().asString()\n        );\n    }\n    \n    @FXML\n    private void onToggleDarkMode() {\n        viewModel.toggleDarkMode();\n    }\n}\n",[3199,10461,10462,10469,10473,10479,10485,10491,10497,10504,10511,10518,10525,10532,10536,10546,10550,10574,10588,10603,10607,10620,10624,10630,10645,10657,10661,10665,10671,10681,10688,10695,10702,10706,10710,10721,10740,10744,10749,10768,10775,10797,10827,10831,10836,10842,10864,10873,10877,10881,10885,10889,10900,10915,10919,10923,10934,10939,10955,10967,10972,10976,10981,10995,11006,11010,11014,11019,11036,11051,11055,11059,11063,11069,11080,11091,11095],{"__ignoreMap":3281},[3285,10463,10464,10466],{"class":3287,"line":3288},[3285,10465,3455],{"class":3454},[3285,10467,10468],{"class":3314}," dev.kostyl.audiobook.controller;\n",[3285,10470,10471],{"class":3287,"line":3302},[3285,10472,3401],{"emptyLinePlaceholder":3400},[3285,10474,10475,10477],{"class":3287,"line":3325},[3285,10476,3467],{"class":3454},[3285,10478,5583],{"class":3314},[3285,10480,10481,10483],{"class":3287,"line":3344},[3285,10482,3467],{"class":3454},[3285,10484,6403],{"class":3314},[3285,10486,10487,10489],{"class":3287,"line":3363},[3285,10488,3467],{"class":3454},[3285,10490,9796],{"class":3314},[3285,10492,10493,10495],{"class":3287,"line":3409},[3285,10494,3467],{"class":3454},[3285,10496,9803],{"class":3314},[3285,10498,10499,10501],{"class":3287,"line":3415},[3285,10500,3467],{"class":3454},[3285,10502,10503],{"class":3314}," dev.kostyl.audiobook.viewmodel.SettingsViewModel;\n",[3285,10505,10506,10508],{"class":3287,"line":3501},[3285,10507,3467],{"class":3454},[3285,10509,10510],{"class":3314}," javafx.fxml.FXML;\n",[3285,10512,10513,10515],{"class":3287,"line":3509},[3285,10514,3467],{"class":3454},[3285,10516,10517],{"class":3314}," javafx.scene.control.ComboBox;\n",[3285,10519,10520,10522],{"class":3287,"line":3514},[3285,10521,3467],{"class":3454},[3285,10523,10524],{"class":3314}," javafx.scene.control.Label;\n",[3285,10526,10527,10529],{"class":3287,"line":3536},[3285,10528,3467],{"class":3454},[3285,10530,10531],{"class":3314}," javafx.util.StringConverter;\n",[3285,10533,10534],{"class":3287,"line":3542},[3285,10535,3401],{"emptyLinePlaceholder":3400},[3285,10537,10538,10540,10542,10544],{"class":3287,"line":3551},[3285,10539,3517],{"class":3454},[3285,10541,3520],{"class":3454},[3285,10543,4934],{"class":3523},[3285,10545,3533],{"class":3314},[3285,10547,10548],{"class":3287,"line":3577},[3285,10549,3539],{"class":3314},[3285,10551,10552,10554,10556,10558,10560,10562,10564,10566,10568,10570,10572],{"class":3287,"line":3584},[3285,10553,3545],{"class":3314},[3285,10555,4964],{"class":3523},[3285,10557,4967],{"class":3454},[3285,10559,4970],{"class":3523},[3285,10561,3292],{"class":3314},[3285,10563,4975],{"class":3523},[3285,10565,3269],{"class":3314},[3285,10567,4512],{"class":3523},[3285,10569,4982],{"class":3314},[3285,10571,4985],{"class":3570},[3285,10573,4518],{"class":3314},[3285,10575,10576,10578,10580,10582,10584,10586],{"class":3287,"line":3613},[3285,10577,3545],{"class":3314},[3285,10579,4964],{"class":3523},[3285,10581,4967],{"class":3454},[3285,10583,4998],{"class":3523},[3285,10585,5001],{"class":3570},[3285,10587,4518],{"class":3314},[3285,10589,10590,10592,10594,10596,10598,10601],{"class":3287,"line":3619},[3285,10591,3545],{"class":3314},[3285,10593,4964],{"class":3523},[3285,10595,4967],{"class":3454},[3285,10597,5982],{"class":3523},[3285,10599,10600],{"class":3570}," currentThemeLabel",[3285,10602,4518],{"class":3314},[3285,10604,10605],{"class":3287,"line":3625},[3285,10606,3539],{"class":3314},[3285,10608,10609,10611,10613,10615,10618],{"class":3287,"line":3651},[3285,10610,4613],{"class":3454},[3285,10612,4494],{"class":3454},[3285,10614,9837],{"class":3523},[3285,10616,10617],{"class":3570}," viewModel",[3285,10619,4518],{"class":3314},[3285,10621,10622],{"class":3287,"line":3670},[3285,10623,3539],{"class":3314},[3285,10625,10626,10628],{"class":3287,"line":3700},[3285,10627,3545],{"class":3314},[3285,10629,5014],{"class":3523},[3285,10631,10632,10634,10636,10638,10641,10643],{"class":3287,"line":3705},[3285,10633,3554],{"class":3454},[3285,10635,4934],{"class":3560},[3285,10637,3564],{"class":3314},[3285,10639,10640],{"class":3523},"SettingsViewModel",[3285,10642,10617],{"class":3570},[3285,10644,3574],{"class":3314},[3285,10646,10647,10649,10651,10654],{"class":3287,"line":3723},[3285,10648,4655],{"class":3454},[3285,10650,3269],{"class":3314},[3285,10652,10653],{"class":3570},"viewModel",[3285,10655,10656],{"class":3314}," = viewModel;\n",[3285,10658,10659],{"class":3287,"line":3736},[3285,10660,3752],{"class":3314},[3285,10662,10663],{"class":3287,"line":3749},[3285,10664,3539],{"class":3314},[3285,10666,10667,10669],{"class":3287,"line":3755},[3285,10668,3545],{"class":3314},[3285,10670,5055],{"class":3523},[3285,10672,10673,10675,10677,10679],{"class":3287,"line":3760},[3285,10674,3554],{"class":3454},[3285,10676,3557],{"class":3523},[3285,10678,5064],{"class":3560},[3285,10680,4583],{"class":3314},[3285,10682,10683,10686],{"class":3287,"line":3786},[3285,10684,10685],{"class":3560},"        setupThemeComboBox",[3285,10687,3746],{"class":3314},[3285,10689,10690,10693],{"class":3287,"line":3795},[3285,10691,10692],{"class":3560},"        setupDarkModeToggle",[3285,10694,3746],{"class":3314},[3285,10696,10697,10700],{"class":3287,"line":3800},[3285,10698,10699],{"class":3560},"        setupBindings",[3285,10701,3746],{"class":3314},[3285,10703,10704],{"class":3287,"line":4703},[3285,10705,3752],{"class":3314},[3285,10707,10708],{"class":3287,"line":4712},[3285,10709,3539],{"class":3314},[3285,10711,10712,10714,10716,10719],{"class":3287,"line":4717},[3285,10713,4613],{"class":3454},[3285,10715,3557],{"class":3523},[3285,10717,10718],{"class":3560}," setupThemeComboBox",[3285,10720,4583],{"class":3314},[3285,10722,10723,10725,10727,10730,10732,10734,10736,10738],{"class":3287,"line":4722},[3285,10724,5076],{"class":3570},[3285,10726,3269],{"class":3314},[3285,10728,10729],{"class":3560},"setItems",[3285,10731,3564],{"class":3314},[3285,10733,10653],{"class":3570},[3285,10735,3269],{"class":3314},[3285,10737,10159],{"class":3560},[3285,10739,3610],{"class":3314},[3285,10741,10742],{"class":3287,"line":4734},[3285,10743,3616],{"class":3314},[3285,10745,10746],{"class":3287,"line":4743},[3285,10747,10748],{"class":3580},"        \u002F\u002F Converter для відображення назв тем\n",[3285,10750,10751,10753,10755,10758,10760,10762,10765],{"class":3287,"line":4768},[3285,10752,5076],{"class":3570},[3285,10754,3269],{"class":3314},[3285,10756,10757],{"class":3560},"setConverter",[3285,10759,3564],{"class":3314},[3285,10761,3598],{"class":3597},[3285,10763,10764],{"class":3523}," StringConverter",[3285,10766,10767],{"class":3314},"\u003C>() {\n",[3285,10769,10770,10773],{"class":3287,"line":4790},[3285,10771,10772],{"class":3314},"            @",[3285,10774,3548],{"class":3523},[3285,10776,10777,10780,10782,10785,10787,10789,10791,10793,10795],{"class":3287,"line":4813},[3285,10778,10779],{"class":3454},"            public",[3285,10781,4577],{"class":3523},[3285,10783,10784],{"class":3560}," toString",[3285,10786,3564],{"class":3314},[3285,10788,4975],{"class":3523},[3285,10790,3269],{"class":3314},[3285,10792,4512],{"class":3523},[3285,10794,4515],{"class":3570},[3285,10796,3574],{"class":3314},[3285,10798,10799,10802,10805,10807,10810,10812,10814,10817,10820,10822,10825],{"class":3287,"line":4836},[3285,10800,10801],{"class":3597},"                return",[3285,10803,10804],{"class":3314}," theme != ",[3285,10806,10089],{"class":3454},[3285,10808,10809],{"class":3597}," ?",[3285,10811,4515],{"class":3570},[3285,10813,3269],{"class":3314},[3285,10815,10816],{"class":3560},"getDisplayName",[3285,10818,10819],{"class":3314},"() ",[3285,10821,3442],{"class":3597},[3285,10823,10824],{"class":3644}," \"\"",[3285,10826,4518],{"class":3314},[3285,10828,10829],{"class":3287,"line":4859},[3285,10830,10128],{"class":3314},[3285,10832,10833],{"class":3287,"line":4882},[3285,10834,10835],{"class":3314},"            \n",[3285,10837,10838,10840],{"class":3287,"line":4904},[3285,10839,10772],{"class":3314},[3285,10841,3548],{"class":3523},[3285,10843,10844,10846,10848,10850,10852,10855,10857,10859,10862],{"class":3287,"line":4909},[3285,10845,10779],{"class":3454},[3285,10847,4386],{"class":3523},[3285,10849,3269],{"class":3314},[3285,10851,4512],{"class":3523},[3285,10853,10854],{"class":3560}," fromString",[3285,10856,3564],{"class":3314},[3285,10858,3775],{"class":3523},[3285,10860,10861],{"class":3570}," string",[3285,10863,3574],{"class":3314},[3285,10865,10866,10868,10871],{"class":3287,"line":4914},[3285,10867,10801],{"class":3597},[3285,10869,10870],{"class":3454}," null",[3285,10872,4518],{"class":3314},[3285,10874,10875],{"class":3287,"line":9349},[3285,10876,10128],{"class":3314},[3285,10878,10879],{"class":3287,"line":9358},[3285,10880,5187],{"class":3314},[3285,10882,10883],{"class":3287,"line":9385},[3285,10884,3752],{"class":3314},[3285,10886,10887],{"class":3287,"line":9401},[3285,10888,3539],{"class":3314},[3285,10890,10891,10893,10895,10898],{"class":3287,"line":9410},[3285,10892,4613],{"class":3454},[3285,10894,3557],{"class":3523},[3285,10896,10897],{"class":3560}," setupDarkModeToggle",[3285,10899,4583],{"class":3314},[3285,10901,10902,10904,10906,10909,10911,10913],{"class":3287,"line":9415},[3285,10903,5201],{"class":3570},[3285,10905,3269],{"class":3314},[3285,10907,10908],{"class":3560},"setText",[3285,10910,3564],{"class":3314},[3285,10912,5605],{"class":3644},[3285,10914,3648],{"class":3314},[3285,10916,10917],{"class":3287,"line":9420},[3285,10918,3752],{"class":3314},[3285,10920,10921],{"class":3287,"line":9431},[3285,10922,3539],{"class":3314},[3285,10924,10925,10927,10929,10932],{"class":3287,"line":9460},[3285,10926,4613],{"class":3454},[3285,10928,3557],{"class":3523},[3285,10930,10931],{"class":3560}," setupBindings",[3285,10933,4583],{"class":3314},[3285,10935,10936],{"class":3287,"line":9467},[3285,10937,10938],{"class":3580},"        \u002F\u002F Bidirectional binding для вибраної теми\n",[3285,10940,10941,10943,10945,10948,10950,10953],{"class":3287,"line":9480},[3285,10942,5076],{"class":3570},[3285,10944,3269],{"class":3314},[3285,10946,10947],{"class":3560},"valueProperty",[3285,10949,3604],{"class":3314},[3285,10951,10952],{"class":3560},"bindBidirectional",[3285,10954,6290],{"class":3314},[3285,10956,10957,10960,10962,10964],{"class":3287,"line":9495},[3285,10958,10959],{"class":3570},"            viewModel",[3285,10961,3269],{"class":3314},[3285,10963,10195],{"class":3560},[3285,10965,10966],{"class":3314},"()\n",[3285,10968,10969],{"class":3287,"line":9508},[3285,10970,10971],{"class":3314},"        );\n",[3285,10973,10974],{"class":3287,"line":9513},[3285,10975,3616],{"class":3314},[3285,10977,10978],{"class":3287,"line":9518},[3285,10979,10980],{"class":3580},"        \u002F\u002F Bidirectional binding для dark mode toggle\n",[3285,10982,10983,10985,10987,10989,10991,10993],{"class":3287,"line":9523},[3285,10984,5201],{"class":3570},[3285,10986,3269],{"class":3314},[3285,10988,5637],{"class":3560},[3285,10990,3604],{"class":3314},[3285,10992,10952],{"class":3560},[3285,10994,6290],{"class":3314},[3285,10996,10997,10999,11001,11004],{"class":3287,"line":9540},[3285,10998,10959],{"class":3570},[3285,11000,3269],{"class":3314},[3285,11002,11003],{"class":3560},"darkModeProperty",[3285,11005,10966],{"class":3314},[3285,11007,11008],{"class":3287,"line":9551},[3285,11009,10971],{"class":3314},[3285,11011,11012],{"class":3287,"line":9558},[3285,11013,3616],{"class":3314},[3285,11015,11016],{"class":3287,"line":9577},[3285,11017,11018],{"class":3580},"        \u002F\u002F Unidirectional binding для відображення поточної теми\n",[3285,11020,11021,11024,11026,11029,11031,11034],{"class":3287,"line":9582},[3285,11022,11023],{"class":3570},"        currentThemeLabel",[3285,11025,3269],{"class":3314},[3285,11027,11028],{"class":3560},"textProperty",[3285,11030,3604],{"class":3314},[3285,11032,11033],{"class":3560},"bind",[3285,11035,6290],{"class":3314},[3285,11037,11038,11040,11042,11044,11046,11049],{"class":3287,"line":9587},[3285,11039,10959],{"class":3570},[3285,11041,3269],{"class":3314},[3285,11043,10195],{"class":3560},[3285,11045,3604],{"class":3314},[3285,11047,11048],{"class":3560},"asString",[3285,11050,10966],{"class":3314},[3285,11052,11053],{"class":3287,"line":9605},[3285,11054,10971],{"class":3314},[3285,11056,11057],{"class":3287,"line":9624},[3285,11058,3752],{"class":3314},[3285,11060,11061],{"class":3287,"line":9629},[3285,11062,3539],{"class":3314},[3285,11064,11065,11067],{"class":3287,"line":9634},[3285,11066,3545],{"class":3314},[3285,11068,5055],{"class":3523},[3285,11070,11071,11073,11075,11078],{"class":3287,"line":9645},[3285,11072,4613],{"class":3454},[3285,11074,3557],{"class":3523},[3285,11076,11077],{"class":3560}," onToggleDarkMode",[3285,11079,4583],{"class":3314},[3285,11081,11082,11085,11087,11089],{"class":3287,"line":9652},[3285,11083,11084],{"class":3570},"        viewModel",[3285,11086,3269],{"class":3314},[3285,11088,5220],{"class":3560},[3285,11090,3746],{"class":3314},[3285,11092,11093],{"class":3287,"line":9657},[3285,11094,3752],{"class":3314},[3285,11096,11097],{"class":3287,"line":9662},[3285,11098,3395],{"class":3314},[3271,11100,11102],{"id":11101},"fxml-з-atlantafx-контролами","FXML з AtlantaFX контролами",[3276,11104,11106],{"className":3278,"code":11105,"language":3280,"meta":3281,"style":3281},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n\u003C?import atlantafx.base.controls.ToggleSwitch?>\n\u003C?import javafx.scene.control.*?>\n\u003C?import javafx.scene.layout.*?>\n\u003C?import javafx.geometry.Insets?>\n\n\u003CVBox xmlns:fx=\"http:\u002F\u002Fjavafx.com\u002Ffxml\"\n      fx:controller=\"dev.kostyl.audiobook.controller.SettingsController\"\n      spacing=\"20\" padding=\"20\">\n    \n    \u003CLabel text=\"Theme Settings\" styleClass=\"title-2, text-bold\"\u002F>\n    \n    \u003CVBox spacing=\"10\">\n        \u003CLabel text=\"Select Theme:\"\u002F>\n        \u003CComboBox fx:id=\"themeComboBox\" prefWidth=\"300\"\u002F>\n    \u003C\u002FVBox>\n    \n    \u003CToggleSwitch fx:id=\"darkModeToggle\" onAction=\"#onToggleDarkMode\"\u002F>\n    \n    \u003CLabel fx:id=\"currentThemeLabel\" styleClass=\"text-muted\"\u002F>\n    \n\u003C\u002FVBox>\n",[3199,11107,11108,11136,11140,11153,11167,11180,11193,11197,11211,11221,11240,11244,11269,11273,11289,11305,11330,11339,11343,11366,11370,11392,11396],{"__ignoreMap":3281},[3285,11109,11110,11113,11115,11118,11121,11125,11128,11130,11133],{"class":3287,"line":3288},[3285,11111,11112],{"class":3291},"\u003C?",[3285,11114,3280],{"class":3295},[3285,11116,11117],{"class":7313}," version",[3285,11119,11120],{"class":3314},"=",[3285,11122,11124],{"class":11123},"su9tN","\"1.0\"",[3285,11126,11127],{"class":7313}," encoding",[3285,11129,11120],{"class":3314},[3285,11131,11132],{"class":11123},"\"UTF-8\"",[3285,11134,11135],{"class":3291},"?>\n",[3285,11137,11138],{"class":3287,"line":3302},[3285,11139,3401],{"emptyLinePlaceholder":3400},[3285,11141,11142,11144,11146,11148,11151],{"class":3287,"line":3325},[3285,11143,11112],{"class":3291},[3285,11145,3467],{"class":3295},[3285,11147,4497],{"class":7313},[3285,11149,11150],{"class":3314},".base.controls.ToggleSwitch",[3285,11152,11135],{"class":3291},[3285,11154,11155,11157,11159,11162,11165],{"class":3287,"line":3344},[3285,11156,11112],{"class":3291},[3285,11158,3467],{"class":3295},[3285,11160,11161],{"class":7313}," javafx",[3285,11163,11164],{"class":3314},".scene.control.*",[3285,11166,11135],{"class":3291},[3285,11168,11169,11171,11173,11175,11178],{"class":3287,"line":3363},[3285,11170,11112],{"class":3291},[3285,11172,3467],{"class":3295},[3285,11174,11161],{"class":7313},[3285,11176,11177],{"class":3314},".scene.layout.*",[3285,11179,11135],{"class":3291},[3285,11181,11182,11184,11186,11188,11191],{"class":3287,"line":3409},[3285,11183,11112],{"class":3291},[3285,11185,3467],{"class":3295},[3285,11187,11161],{"class":7313},[3285,11189,11190],{"class":3314},".geometry.Insets",[3285,11192,11135],{"class":3291},[3285,11194,11195],{"class":3287,"line":3415},[3285,11196,3401],{"emptyLinePlaceholder":3400},[3285,11198,11199,11201,11203,11206,11208],{"class":3287,"line":3501},[3285,11200,3292],{"class":3291},[3285,11202,6108],{"class":3295},[3285,11204,11205],{"class":7313}," xmlns:fx",[3285,11207,11120],{"class":3314},[3285,11209,11210],{"class":11123},"\"http:\u002F\u002Fjavafx.com\u002Ffxml\"\n",[3285,11212,11213,11216,11218],{"class":3287,"line":3509},[3285,11214,11215],{"class":7313},"      fx:controller",[3285,11217,11120],{"class":3314},[3285,11219,11220],{"class":11123},"\"dev.kostyl.audiobook.controller.SettingsController\"\n",[3285,11222,11223,11226,11228,11231,11234,11236,11238],{"class":3287,"line":3514},[3285,11224,11225],{"class":7313},"      spacing",[3285,11227,11120],{"class":3314},[3285,11229,11230],{"class":11123},"\"20\"",[3285,11232,11233],{"class":7313}," padding",[3285,11235,11120],{"class":3314},[3285,11237,11230],{"class":11123},[3285,11239,3299],{"class":3291},[3285,11241,11242],{"class":3287,"line":3536},[3285,11243,3539],{"class":3314},[3285,11245,11246,11248,11250,11253,11255,11258,11261,11263,11266],{"class":3287,"line":3542},[3285,11247,3305],{"class":3291},[3285,11249,8620],{"class":3295},[3285,11251,11252],{"class":7313}," text",[3285,11254,11120],{"class":3314},[3285,11256,11257],{"class":11123},"\"Theme Settings\"",[3285,11259,11260],{"class":7313}," styleClass",[3285,11262,11120],{"class":3314},[3285,11264,11265],{"class":11123},"\"title-2, text-bold\"",[3285,11267,11268],{"class":3291},"\u002F>\n",[3285,11270,11271],{"class":3287,"line":3551},[3285,11272,3539],{"class":3314},[3285,11274,11275,11277,11279,11282,11284,11287],{"class":3287,"line":3577},[3285,11276,3305],{"class":3291},[3285,11278,6108],{"class":3295},[3285,11280,11281],{"class":7313}," spacing",[3285,11283,11120],{"class":3314},[3285,11285,11286],{"class":11123},"\"10\"",[3285,11288,3299],{"class":3291},[3285,11290,11291,11294,11296,11298,11300,11303],{"class":3287,"line":3584},[3285,11292,11293],{"class":3291},"        \u003C",[3285,11295,8620],{"class":3295},[3285,11297,11252],{"class":7313},[3285,11299,11120],{"class":3314},[3285,11301,11302],{"class":11123},"\"Select Theme:\"",[3285,11304,11268],{"class":3291},[3285,11306,11307,11309,11312,11315,11317,11320,11323,11325,11328],{"class":3287,"line":3613},[3285,11308,11293],{"class":3291},[3285,11310,11311],{"class":3295},"ComboBox",[3285,11313,11314],{"class":7313}," fx:id",[3285,11316,11120],{"class":3314},[3285,11318,11319],{"class":11123},"\"themeComboBox\"",[3285,11321,11322],{"class":7313}," prefWidth",[3285,11324,11120],{"class":3314},[3285,11326,11327],{"class":11123},"\"300\"",[3285,11329,11268],{"class":3291},[3285,11331,11332,11335,11337],{"class":3287,"line":3619},[3285,11333,11334],{"class":3291},"    \u003C\u002F",[3285,11336,6108],{"class":3295},[3285,11338,3299],{"class":3291},[3285,11340,11341],{"class":3287,"line":3625},[3285,11342,3539],{"class":3314},[3285,11344,11345,11347,11349,11351,11353,11356,11359,11361,11364],{"class":3287,"line":3651},[3285,11346,3305],{"class":3291},[3285,11348,5570],{"class":3295},[3285,11350,11314],{"class":7313},[3285,11352,11120],{"class":3314},[3285,11354,11355],{"class":11123},"\"darkModeToggle\"",[3285,11357,11358],{"class":7313}," onAction",[3285,11360,11120],{"class":3314},[3285,11362,11363],{"class":11123},"\"#onToggleDarkMode\"",[3285,11365,11268],{"class":3291},[3285,11367,11368],{"class":3287,"line":3670},[3285,11369,3539],{"class":3314},[3285,11371,11372,11374,11376,11378,11380,11383,11385,11387,11390],{"class":3287,"line":3700},[3285,11373,3305],{"class":3291},[3285,11375,8620],{"class":3295},[3285,11377,11314],{"class":7313},[3285,11379,11120],{"class":3314},[3285,11381,11382],{"class":11123},"\"currentThemeLabel\"",[3285,11384,11260],{"class":7313},[3285,11386,11120],{"class":3314},[3285,11388,11389],{"class":11123},"\"text-muted\"",[3285,11391,11268],{"class":3291},[3285,11393,11394],{"class":3287,"line":3705},[3285,11395,3539],{"class":3314},[3285,11397,11398,11400,11402],{"class":3287,"line":3723},[3285,11399,3318],{"class":3291},[3285,11401,6108],{"class":3295},[3285,11403,3299],{"class":3291},[3253,11405],{},[3145,11407,11409],{"id":11408},"практичні-завдання","Практичні завдання",[11411,11412,11413,11417,11423,11435,11446,11450,11462,11468,11474,11478,11490,11496],"steps",{},[3271,11414,11416],{"id":11415},"рівень-1-базове-використання-atlantafx","Рівень 1: Базове використання AtlantaFX",[3150,11418,11419,11422],{},[3154,11420,11421],{},"Завдання 1.1:"," Додайте AtlantaFX до вашого проєкту через Maven\u002FGradle. Застосуйте тему Primer Light до додатку. Перевірте, що всі стандартні компоненти (Button, TextField, TableView) автоматично стилізовані.",[3150,11424,11425,11428,11429,3202,11431,11434],{},[3154,11426,11427],{},"Завдання 1.2:"," Створіть форму з TextField, PasswordTextField (з AtlantaFX), та кнопками. Використайте utility classes (",[3199,11430,6608],{},[3199,11432,11433],{},"Styles.LARGE",") для стилізації кнопок.",[3150,11436,11437,11440,11441,5877,11443,11445],{},[3154,11438,11439],{},"Завдання 1.3:"," Додайте Message компонент для відображення повідомлень про успіх\u002Fпомилку. Використайте ",[3199,11442,6614],{},[3199,11444,6626],{}," для різних типів повідомлень.",[3271,11447,11449],{"id":11448},"рівень-2-перемикання-тем-та-кастомізація","Рівень 2: Перемикання тем та кастомізація",[3150,11451,11452,11455,11456,11458,11459,11461],{},[3154,11453,11454],{},"Завдання 2.1:"," Створіть ",[3199,11457,4975],{}," з підтримкою всіх 7 тем AtlantaFX. Реалізуйте перемикання теми через ComboBox. Додайте збереження вибраної теми через ",[3199,11460,5244],{}," API.",[3150,11463,11464,11467],{},[3154,11465,11466],{},"Завдання 2.2:"," Створіть власний CSS-файл, що перевизначає акцентний колір AtlantaFX на фіолетовий (#9b59b6). Підключіть його після теми AtlantaFX.",[3150,11469,11470,11473],{},[3154,11471,11472],{},"Завдання 2.3:"," Додайте ToggleSwitch для перемикання між світлою та темною версіями поточної теми (Primer Light ↔ Primer Dark, Nord Light ↔ Nord Dark).",[3271,11475,11477],{"id":11476},"рівень-3-інтеграція-з-mvvm-та-додаткові-контроли","Рівень 3: Інтеграція з MVVM та додаткові контроли",[3150,11479,11480,11483,11484,11486,11487,11489],{},[3154,11481,11482],{},"Завдання 3.1:"," Інтегруйте ",[3199,11485,4975],{}," з Guice як Singleton. Створіть ",[3199,11488,10640],{}," з Properties для вибраної теми. Реалізуйте Controller з Bindings між ComboBox та ViewModel.",[3150,11491,11492,11495],{},[3154,11493,11494],{},"Завдання 3.2:"," Використайте Popover для відображення додаткової інформації про аудіокнигу при натисканні на кнопку \"Info\". Popover має містити опис, рейтинг, та кнопку \"Read More\".",[3150,11497,11498,11501,11502,3202,11504,3202,11506,3209],{},[3154,11499,11500],{},"Завдання 3.3:"," Створіть dashboard з Tile компонентами для відображення статистики (кількість аудіокниг, активних користувачів, нових додавань за місяць). Використайте різні кольори для різних метрик (",[3199,11503,6608],{},[3199,11505,6614],{},[3199,11507,6620],{},[3253,11509],{},[3145,11511,11513],{"id":11512},"підсумок","Підсумок",[3150,11515,11516],{},"У цій статті ми розглянули AtlantaFX — сучасну бібліотеку тем для JavaFX. Ключові висновки:",[3150,11518,11519,11522],{},[3154,11520,11521],{},"AtlantaFX вирішує проблему застарілого вигляду JavaFX."," Замість стандартної теми Modena отримуємо 7 професійних тем, натхнених сучасними дизайн-системами (GitHub Primer, Nord, Dracula, Cupertino). Додаток одразу виглядає сучасно без написання CSS.",[3150,11524,11525,11528,11529,11532,11533,11536],{},[3154,11526,11527],{},"Встановлення через Maven\u002FGradle."," Одна залежність (",[3199,11530,11531],{},"io.github.mkpaz:atlantafx-base:2.1.0",") та один рядок коду (",[3199,11534,11535],{},"Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet())",") — тема застосована до всього додатку.",[3150,11538,11539,11542],{},[3154,11540,11541],{},"7 готових тем для різних сценаріїв."," Primer (універсальна, бізнесова), Nord (арктична, для розробників), Cupertino (Apple-подібна), Dracula (темна, яскрава). Кожна тема має світлу та темну версії (окрім Dracula).",[3150,11544,11545,11548],{},[3154,11546,11547],{},"Додаткові контроли розширюють можливості JavaFX."," ToggleSwitch (iOS-стиль перемикач), PasswordTextField (з кнопкою показу пароля), Popover (спливаюче вікно), Message (повідомлення з іконкою), Notification (toast), Tile (інформаційна плитка).",[3150,11550,11551,11554,11555,3202,11557,11560],{},[3154,11552,11553],{},"CSS Variables для легкої кастомізації."," Всі кольори визначені через змінні (",[3199,11556,7519],{},[3199,11558,11559],{},"--color-bg-default","). Перевизначте змінні у власному CSS — всі компоненти автоматично оновляться.",[3150,11562,11563,3825,11565,3202,11567,3202,11569,11571,11572,3202,11575,11578,11579,11582],{},[3154,11564,3238],{},[3199,11566,6608],{},[3199,11568,6614],{},[3199,11570,6626],{}," для кнопок. ",[3199,11573,11574],{},"Styles.TEXT_BOLD",[3199,11576,11577],{},"Styles.TITLE_2"," для тексту. ",[3199,11580,11581],{},"Styles.BG_SUBTLE"," для фонів. Професійний вигляд без написання CSS.",[3150,11584,11585,3825,11587,11589],{},[3154,11586,3229],{},[3199,11588,3810],{}," дозволяє змінювати тему динамічно. ThemeManager з Preferences API зберігає вибрану тему між запусками.",[3150,11591,11592,11595],{},[3154,11593,11594],{},"Інтеграція з MVVM."," ThemeManager як Singleton через Guice, SettingsViewModel з Properties для вибраної теми, Controller з Bindings між UI та ViewModel. AtlantaFX не конфліктує з MVVM-архітектурою.",[3150,11597,11598],{},"AtlantaFX — це не заміна власного CSS, а потужна основа. Використовуйте AtlantaFX для стилізації стандартних компонентів та додавайте власні стилі для унікальних елементів. Це економить тижні роботи та робить JavaFX-додатки конкурентоспроможними з Electron та Flutter.",[11600,11601,11602],"style",{},"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 .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}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 .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .sqdDX, html code.shiki .sqdDX{--shiki-light:#800000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .sa4r_, html code.shiki .sa4r_{--shiki-light:#E50000;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .sDUd3, html code.shiki .sDUd3{--shiki-light:#0451A5;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .su9tN, html code.shiki .su9tN{--shiki-light:#0000FF;--shiki-default:#CE9178;--shiki-dark:#CE9178}",{"title":3281,"searchDepth":3302,"depth":3302,"links":11604},[11605,11606,11612,11619,11624,11632,11636,11642,11649,11654],{"id":3147,"depth":3302,"text":3148},{"id":3257,"depth":3302,"text":3258,"children":11607},[11608,11609,11610,11611],{"id":3273,"depth":3325,"text":3274},{"id":3372,"depth":3325,"text":3373},{"id":3434,"depth":3325,"text":3435},{"id":3836,"depth":3325,"text":3837},{"id":3903,"depth":3302,"text":3904,"children":11613},[11614,11615,11616,11617,11618],{"id":3910,"depth":3325,"text":3911},{"id":4009,"depth":3325,"text":4010},{"id":4102,"depth":3325,"text":4103},{"id":4195,"depth":3325,"text":4196},{"id":4255,"depth":3325,"text":4256},{"id":4364,"depth":3302,"text":4365,"children":11620},[11621,11622,11623],{"id":4371,"depth":3325,"text":4372},{"id":4919,"depth":3325,"text":4920},{"id":5237,"depth":3325,"text":5238},{"id":5557,"depth":3302,"text":5558,"children":11625},[11626,11627,11628,11629,11630,11631],{"id":5564,"depth":3325,"text":5565},{"id":5773,"depth":3325,"text":5774},{"id":5886,"depth":3325,"text":5887},{"id":6377,"depth":3325,"text":6378},{"id":6630,"depth":3325,"text":6631},{"id":6806,"depth":3325,"text":6807},{"id":6978,"depth":3302,"text":6979,"children":11633},[11634,11635],{"id":6985,"depth":3325,"text":6986},{"id":7278,"depth":3325,"text":7279},{"id":7525,"depth":3302,"text":7526,"children":11637},[11638,11639,11640,11641],{"id":7532,"depth":3325,"text":7533},{"id":7975,"depth":3325,"text":7976},{"id":8242,"depth":3325,"text":8243},{"id":8541,"depth":3325,"text":8542},{"id":8907,"depth":3302,"text":8908,"children":11643},[11644,11645,11646,11647,11648],{"id":8914,"depth":3325,"text":8915},{"id":9698,"depth":3325,"text":9699},{"id":9772,"depth":3325,"text":9773},{"id":10455,"depth":3325,"text":10456},{"id":11101,"depth":3325,"text":11102},{"id":11408,"depth":3302,"text":11409,"children":11650},[11651,11652,11653],{"id":11415,"depth":3325,"text":11416},{"id":11448,"depth":3325,"text":11449},{"id":11476,"depth":3325,"text":11477},{"id":11512,"depth":3302,"text":11513},"Від стандартного Modena до сучасного дизайну: AtlantaFX як колекція готових тем (Primer, Nord, Cupertino, Dracula), додаткові контроли, CSS Variables, utility classes, інтеграція з MVVM-додатками.","md",null,{},{"title":2454,"description":11655},"KJDlrWXYgi4KANzYjPtk1V9tVTPFJUTSAlR2DvLFWVI",[11662,11664],{"title":2450,"path":2451,"stem":2452,"description":11663,"children":-1},"Від функціональності до естетики: JavaFX CSS (синтаксис, селектори, псевдокласи), створення Light та Dark тем, CSS Variables, стилізація TableView, підключення Font Awesome, responsive design.",{"title":2458,"path":2459,"stem":2460,"description":11665,"children":-1},"Від вихідного коду до готового інсталятора: створення Fat JAR, використання jpackage для генерації нативних інсталяторів під Windows, macOS та Linux, публікація релізів у GitHub Releases.",1778998380857]