accessible-kit 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/README.md DELETED
@@ -1,2240 +0,0 @@
1
- # a11y-kit
2
-
3
- Lightweight, accessible UI component library with full ARIA support. Zero dependencies, vanilla JavaScript.
4
-
5
- Kolekcia plne prístupných UI komponentov pre moderné webové aplikácie. Vanilla JavaScript, žiadne závislosti.
6
-
7
- ## Inštalácia
8
-
9
- ### NPM
10
-
11
- ```bash
12
- npm install a11y-kit
13
- ```
14
-
15
- ### Yarn
16
-
17
- ```bash
18
- yarn add a11y-kit
19
- ```
20
-
21
- ### CDN (príklad použitia priamo v HTML)
22
-
23
- ```html
24
- <!-- CSS -->
25
- <link rel="stylesheet" href="https://unpkg.com/a11y-kit/src/css/a11y-dropdown.core.css">
26
- <link rel="stylesheet" href="https://unpkg.com/a11y-kit/src/css/a11y-dropdown.theme.css">
27
-
28
- <!-- JavaScript -->
29
- <script src="https://unpkg.com/a11y-kit/src/js/a11y-dropdown.js"></script>
30
- ```
31
-
32
- ### Lokálna inštalácia (stiahnutie súborov)
33
-
34
- Stiahnite súbory z GitLab/GitHub a includujte ich do vášho projektu.
35
-
36
- ## Dostupné komponenty
37
-
38
- ### ✅ Hotové (v1.0)
39
-
40
- - ✅ [Dropdown](#dropdown) - Prístupné rozbaľovacie menu
41
- - ✅ [Tabs](#tabs) - Prístupné záložky
42
- - ✅ [Offcanvas](#offcanvas) - Vysúvacie bočné menu s focus trapom
43
- - ✅ [Modal](#modal) - Modálne okná s focus trapom
44
- - ✅ [Collapse](#collapse) - Standalone collapse toggle pre show/hide funkcionalitu
45
- - ✅ [Accordion](#accordion) - Prístupný accordion s klávesovou navigáciou
46
-
47
- ### 🚧 Roadmap (v1.1+)
48
-
49
- - 🔜 **Tooltip** - Prístupný tooltip s ARIA podporou a pozicionovaním
50
- - 🔜 **Toast/Notification** - Live region announcements s auto-dismiss
51
- - 🔜 **Toggle Switch** - Switch s localStorage/preferences podporou
52
- - 🔜 **Popover** - Interaktívny popover s positioning a focus management
53
- - 🔜 **Alert/Banner** - ARIA alert s dismissible podporou
54
- - 🔜 **Combobox/Autocomplete** - Komplexný ARIA pattern pre search a autocomplete
55
-
56
- ## Všeobecné vlastnosti
57
-
58
- - ✅ Plná podpora ARIA atribútov
59
- - ✅ Kompletná klávesová navigácia
60
- - ✅ Focus management pre screen readery
61
- - ✅ Žiadne závislosti (vanilla JS)
62
- - ✅ Responzívny dizajn
63
- - ✅ Dark mode podpora
64
- - ✅ High contrast mode podpora
65
- - ✅ Reduced motion podpora
66
- - ✅ Oddelený core a theme CSS
67
-
68
- ## Inicializácia komponentov
69
-
70
- Každý komponent v a11y-kit môže byť inicializovaný viacerými spôsobmi podľa vašich potrieb:
71
-
72
- ### 1. Automatická inicializácia (CDN / priame súbory)
73
-
74
- Pri použití cez `<script>` tag sa komponenty automaticky inicializujú po načítaní DOM:
75
-
76
- ```html
77
- <script src="js/a11y-dropdown.js"></script>
78
- <!-- Dropdown sa automaticky inicializuje -->
79
- ```
80
-
81
- ### 2. CDN s window.a11yKit namespace (odporúčané pre CDN)
82
-
83
- ```html
84
- <script src="js/a11y-dropdown.js"></script>
85
- <script src="js/a11y-tabs.js"></script>
86
- <script src="js/a11y-modal.js"></script>
87
- <!-- Alebo všetko naraz -->
88
- <script src="js/index.js"></script>
89
-
90
- <script>
91
- // Cez globálny namespace (odporúčané - žiadne kolízie)
92
- a11yKit.initAll(); // inicializuje všetky komponenty
93
-
94
- // Alebo jednotlivo
95
- a11yKit.initDropdowns();
96
- a11yKit.initTabs();
97
- a11yKit.initCollapses();
98
- a11yKit.initAccordions();
99
-
100
- // Bootstrap štýl - krátke aliasy pre manuálnu inicializáciu
101
- const dropdown = new a11yKit.Dropdown(element, options);
102
- const modal = new a11yKit.Modal(element, options);
103
- const tabs = new a11yKit.Tabs(element, options);
104
- const collapse = new a11yKit.Collapse();
105
- const accordion = new a11yKit.Accordion();
106
- </script>
107
- ```
108
-
109
- ### 3. Manuálna inicializácia (so zakázaním auto-init)
110
-
111
- ```html
112
- <script>
113
- // Zakázať auto-inicializáciu
114
- window.a11yKitManualInit = true;
115
- </script>
116
- <script src="js/a11y-dropdown.js"></script>
117
- <script>
118
- // Potom volať manuálne cez namespace
119
- a11yKit.initDropdowns();
120
-
121
- // Alebo priamo (backwards compatible)
122
- initDropdowns();
123
- </script>
124
- ```
125
-
126
- ### 4. ES6 Module import (Astro, Vite, Webpack)
127
-
128
- #### Named import - init funkcie
129
-
130
- ```javascript
131
- // S .js príponou (explicitné)
132
- import { initDropdowns } from './a11y-kit/a11y-dropdown.js';
133
- import { initTabs } from './a11y-kit/a11y-tabs.js';
134
-
135
- // Bez .js prípony (podľa bundlera)
136
- import { initDropdowns } from './a11y-kit/a11y-dropdown';
137
- import { initTabs } from './a11y-kit/a11y-tabs';
138
-
139
- // Inicializovať
140
- initDropdowns();
141
- initTabs();
142
- ```
143
-
144
- #### Named import - krátke aliasy (Bootstrap štýl)
145
-
146
- ```javascript
147
- // Import krátkych aliasov pre manuálnu inicializáciu z index.js:
148
- import { Dropdown, Modal, Tabs, Collapse, Accordion } from './a11y-kit/index.js';
149
-
150
- // Použitie ako Bootstrap
151
- const dropdown = new Dropdown(element, {
152
- closeOnSelect: true,
153
- onOpen: (instance) => {
154
- console.log('Dropdown opened!');
155
- }
156
- });
157
-
158
- const modal = new Modal(element, options);
159
- const tabs = new Tabs(element, options);
160
- const collapse = new Collapse();
161
- const accordion = new Accordion();
162
- ```
163
-
164
- **Poznámka:** `.js` prípona je voliteľná a závisí od vášho bundlera a konfigurácie. Astro, Vite a moderné bundlery zvyčajne podporujú oba spôsoby.
165
-
166
- #### Wildcard import
167
-
168
- ```javascript
169
- // Import všetkého z index.js
170
- import * as a11yKit from './a11y-kit/index.js';
171
-
172
- // Init funkcie:
173
- a11yKit.initDropdowns();
174
- a11yKit.initTabs();
175
- a11yKit.initModals();
176
- a11yKit.initCollapses();
177
- a11yKit.initAccordions();
178
- a11yKit.initAll(); // všetko naraz
179
-
180
- // Alebo Bootstrap štýl s krátkymi aliasmi:
181
- const dropdown = new a11yKit.Dropdown(element, options);
182
- const modal = new a11yKit.Modal(element, options);
183
- const collapse = new a11yKit.Collapse();
184
- const accordion = new a11yKit.Accordion();
185
- ```
186
-
187
- #### Import len určitých komponentov (tree-shaking)
188
-
189
- ```javascript
190
- // Import init funkcie + class pre flexibility
191
- import { initDropdowns, Dropdown } from './a11y-kit/a11y-dropdown';
192
-
193
- // Auto-init všetky dropdowny na stránke
194
- initDropdowns();
195
-
196
- // ALEBO vytvoriť špecifickú inštanciu (Bootstrap štýl)
197
- const myDropdown = new Dropdown(element, {
198
- closeOnSelect: true,
199
- onOpen: (instance) => {
200
- console.log('Dropdown opened!');
201
- }
202
- });
203
- ```
204
-
205
- ### 5. Inicializácia s callbackmi a options
206
-
207
- Každý komponent podporuje voliteľné options a callbacky:
208
-
209
- ```javascript
210
- // Import - krátky alias (odporúčané)
211
- import { Dropdown } from './a11y-kit/a11y-dropdown';
212
-
213
- // Alebo plný názov (backwards compatible)
214
- import { AccessibleDropdown } from './a11y-kit/a11y-dropdown';
215
-
216
- const dropdown = new Dropdown(element, {
217
- closeOnSelect: true, // Zatvorí po výbere položky
218
- closeOnOutsideClick: true, // Zatvorí pri kliku mimo
219
- closeOnEscape: true, // Zatvorí pri Escape
220
- onOpen: (instance) => {
221
- console.log('Otvorené!');
222
- },
223
- onClose: (instance) => {
224
- console.log('Zatvorené!');
225
- },
226
- onSelect: (item, index) => {
227
- console.log('Vybraná položka:', item.textContent);
228
- }
229
- });
230
- ```
231
-
232
- ### 6. NPM package import
233
-
234
- ```javascript
235
- // Init všetkého naraz
236
- import { initAll } from 'a11y-kit';
237
- initAll();
238
-
239
- // Wildcard
240
- import * as a11yKit from 'a11y-kit';
241
- a11yKit.initDropdowns();
242
- // alebo Bootstrap štýl:
243
- const modal = new a11yKit.Modal(element, options);
244
-
245
- // Špecifické komponenty (tree-shaking)
246
- import { initDropdowns, Dropdown } from 'a11y-kit/dropdown';
247
- import { initTabs, Tabs } from 'a11y-kit/tabs';
248
-
249
- // Init funkcia:
250
- initDropdowns();
251
- // alebo Bootstrap štýl:
252
- const dropdown = new Dropdown(element, options);
253
- ```
254
-
255
- ### Ktorý spôsob použiť?
256
-
257
- - 🌐 **CDN / priame súbory** → `window.a11yKit` namespace (odporúčané, žiadne kolízie)
258
- - ⚡ **Rýchla inicializácia** → `a11yKit.initAll()` alebo `initDropdowns()`
259
- - 🎯 **Bootstrap štýl (manuálna kontrola)** → `new a11yKit.Dropdown()` alebo `new Dropdown()`
260
- - 📦 **Module bundler** → ES6 import s `initComponentName()` alebo `Dropdown` class
261
- - 🔧 **Potrebujete callbacky** → `new Dropdown(element, options)` s callbacks
262
- - 📉 **Malý bundle size** → Named imports len potrebných komponentov (tree-shaking)
263
- - 💨 **Rýchle prototypovanie** → Wildcard `import * as a11yKit` + `initAll()`
264
-
265
- ## Architektúra CSS
266
-
267
- Všetky komponenty majú CSS rozdelený na dve časti:
268
-
269
- ### Core CSS (`.core.css`)
270
- Obsahuje iba logiku a správanie:
271
- - Positioning a layout
272
- - Visibility states
273
- - Transform animácie
274
- - Štruktúru komponentu
275
-
276
- **Neupravujte**, pokiaľ nemeníte funkčnosť.
277
-
278
- ### Theme CSS (`.theme.css`)
279
- Obsahuje vizuálne nastavenia:
280
- - Farby, spacing, typography
281
- - Borders, shadows, transitions
282
- - Dark mode, high contrast
283
- - Responsive breakpoints
284
-
285
- **Upravujte** pre zmenu vzhľadu alebo vytvorte vlastnú tému.
286
-
287
- ## Filozofia: Data atribúty vs triedy
288
-
289
- Komponenty používajú **data atribúty** ako primárne CSS selektory:
290
- - `[data-tabs]`, `[data-tabs-tab]`, `[data-tabs-panel]` - pre základný styling
291
- - `[data-dropdown]`, `[data-dropdown-button]` - pre dropdown
292
-
293
- **Data atribúty pre varianty**:
294
- - `data-variant="boxed"`, `data-variant="pills"` - vizuálne varianty
295
- - `data-orientation="vertical"` - vertikálne tabs
296
- - `data-animation="fade"` - fade animácia
297
-
298
- **Triedy** sa používajú len pre voliteľné styling elementy:
299
- - **Helpery**: `.tabs__tab-badge`, `.tabs__tab-icon` (iba vizuálne utility)
300
-
301
- **Výhody tohto prístupu:**
302
- - Menej verbózny HTML
303
- - JS a CSS používajú rovnaké hooky
304
- - Triedy voľné pre customizáciu
305
- - Jasná separácia: data-* = funkčnosť, class = varianty
306
-
307
- ---
308
-
309
- # Dropdown
310
-
311
- Plne prístupný dropdown komponent s podporou klávesovej navigácie a ARIA atribútov.
312
-
313
- ## Vlastnosti
314
-
315
- - ✅ Plná podpora ARIA atribútov
316
- - ✅ Klávesová navigácia (šípky, Enter, Space, Esc, Home, End)
317
- - ✅ Focus management
318
- - ✅ Automatické zatváranie pri kliku mimo
319
- - ✅ Konfigurovateľné správanie
320
- - ✅ CSS Grid animácie default (vypnutie cez data-no-animation)
321
- - ✅ Viacero variantov (nav, language)
322
- - ✅ Automatická podpora prefers-reduced-motion
323
-
324
- ## Inštalácia
325
-
326
- ```html
327
- <!-- CSS -->
328
- <link rel="stylesheet" href="css/a11y-dropdown.core.css">
329
- <link rel="stylesheet" href="css/a11y-dropdown.theme.css">
330
-
331
- <!-- JavaScript -->
332
- <script src="js/a11y-dropdown.js"></script>
333
- ```
334
-
335
- ## Použitie
336
-
337
- ### Základná štruktúra
338
-
339
- Dropdown má **CSS Grid animácie default** pri otváraní/zatváraní menu.
340
-
341
- ```html
342
- <div class="dropdown" data-dropdown>
343
- <button class="dropdown__button" data-dropdown-button>
344
- Možnosti
345
- <span class="dropdown__arrow"></span>
346
- </button>
347
- <div class="dropdown__menu" data-dropdown-menu>
348
- <!-- Prvý div: overflow wrapper (overflow: hidden, grid-row: 1/span 2) -->
349
- <div>
350
- <!-- Druhý div: content wrapper (padding) -->
351
- <div>
352
- <button class="dropdown__item" data-dropdown-item>Upraviť</button>
353
- <button class="dropdown__item" data-dropdown-item>Duplikovať</button>
354
- <hr class="dropdown__divider">
355
- <button class="dropdown__item" data-dropdown-item>Odstrániť</button>
356
- </div>
357
- </div>
358
- </div>
359
- </div>
360
- ```
361
-
362
- **Dôležité pre animáciu:**
363
- - Potrebná štruktúra: `data-dropdown-menu > wrapper (overflow) > obsah (padding)`
364
- - Prvý vnorený div: technický wrapper s `overflow: hidden` (BEZ paddingu)
365
- - Druhý vnorený div: kontajner pre obsah (má padding)
366
- - Animácia: CSS Grid (`grid-template-rows: 0fr → 1fr`)
367
- - Funguje bez potreby poznať výšku menu vopred
368
-
369
- ### Animácie
370
-
371
- **Nastavenie rýchlosti animácie:**
372
-
373
- ```html
374
- <!-- Inline pomocou style atribútu -->
375
- <div data-dropdown style="--a11y-dropdown-duration: 0.5s;">
376
- <button data-dropdown-button>Menu</button>
377
- <div data-dropdown-menu>
378
- <div>
379
- <div>
380
- <button data-dropdown-item>Item 1</button>
381
- <button data-dropdown-item>Item 2</button>
382
- </div>
383
- </div>
384
- </div>
385
- </div>
386
-
387
- <!-- Vlastný easing -->
388
- <div data-dropdown style="--a11y-dropdown-duration: 0.3s; --a11y-dropdown-easing: ease-in-out;">
389
- <!-- dropdown menu -->
390
- </div>
391
- ```
392
-
393
- ```css
394
- /* Alebo globálne v CSS */
395
- :root {
396
- --a11y-dropdown-duration: 0.25s;
397
- --a11y-dropdown-easing: cubic-bezier(0.4, 0, 0.2, 1);
398
- }
399
- ```
400
-
401
- **Dostupné CSS custom properties:**
402
- - `--a11y-dropdown-duration` - Dĺžka animácie (default: `0.2s`)
403
- - `--a11y-dropdown-easing` - Easing funkcia (default: `ease`)
404
-
405
- **Vypnutie animácií:**
406
-
407
- Ak chcete vypnúť animácie pre konkrétny dropdown, použite atribút `data-no-animation`:
408
-
409
- ```html
410
- <div class="dropdown" data-dropdown>
411
- <button class="dropdown__button" data-dropdown-button>
412
- Menu bez animácie
413
- <span class="dropdown__arrow"></span>
414
- </button>
415
- <div class="dropdown__menu" data-dropdown-menu data-no-animation>
416
- <div>
417
- <div>
418
- <button class="dropdown__item" data-dropdown-item>Upraviť</button>
419
- <button class="dropdown__item" data-dropdown-item>Odstrániť</button>
420
- </div>
421
- </div>
422
- </div>
423
- </div>
424
- ```
425
-
426
- **Automatická podpora prefers-reduced-motion:**
427
-
428
- Animácie sa automaticky vypnú pre používateľov, ktorí majú nastavené `prefers-reduced-motion: reduce` v prehliadači alebo operačnom systéme. Nemusíte nič nastavovať.
429
-
430
- ### JavaScript inicializácia
431
-
432
- ```javascript
433
- // Automatická inicializácia
434
- initDropdowns();
435
-
436
- // Manuálna inicializácia
437
- const dropdown = new AccessibleDropdown(element, {
438
- closeOnSelect: true,
439
- closeOnOutsideClick: true,
440
- closeOnEscape: true,
441
- hoverDelay: 0,
442
- onOpen: (dropdown) => {},
443
- onClose: (dropdown) => {},
444
- onSelect: (item, index) => {}
445
- });
446
- ```
447
-
448
- ## Konfigurácia
449
-
450
- ### Data atribúty
451
-
452
- ```html
453
- <!-- Nechá dropdown otvorený po výbere -->
454
- <div class="dropdown" data-dropdown data-close-on-select="false">
455
-
456
- <!-- Zakáže zatvorenie pri kliku mimo -->
457
- <div class="dropdown" data-dropdown data-close-on-outside-click="false">
458
-
459
- <!-- Oneskorenie hover efektu (ms) -->
460
- <div class="dropdown" data-dropdown data-hover-delay="200">
461
- ```
462
-
463
- ### JavaScript options
464
-
465
- ```javascript
466
- {
467
- closeOnSelect: true, // Zatvorí dropdown po výbere položky
468
- closeOnOutsideClick: true, // Zatvorí dropdown pri kliku mimo
469
- closeOnEscape: true, // Zatvorí dropdown pri stlačení Escape
470
- hoverDelay: 0, // Oneskorenie pre hover efekt (ms)
471
- onOpen: (dropdown) => {}, // Callback po otvorení
472
- onClose: (dropdown) => {}, // Callback po zatvorení
473
- onSelect: (item, index) => {} // Callback po výbere položky
474
- }
475
- ```
476
-
477
- ## Klávesová navigácia
478
-
479
- - **Enter** / **Space** - Otvorí/zatvorí menu alebo vyberie položku
480
- - **↓** / **↑** - Navigácia medzi položkami
481
- - **Home** / **End** - Skok na prvú/poslednú položku
482
- - **Esc** - Zatvorí menu a vráti focus na tlačidlo
483
- - **Tab** - Zatvorí menu a presunie focus ďalej
484
-
485
- ## Varianty
486
-
487
- ### Navigačné menu
488
-
489
- ```html
490
- <div data-dropdown data-variant="nav">
491
- <!-- ... -->
492
- </div>
493
- ```
494
-
495
- ### Prepínač jazykov
496
-
497
- ```html
498
- <div data-dropdown data-variant="language">
499
- <!-- ... -->
500
- </div>
501
- ```
502
-
503
- ### Menu zarovnané doprava
504
-
505
- ```html
506
- <div data-dropdown-menu="right">
507
- <div>
508
- <div>
509
- <!-- položky -->
510
- </div>
511
- </div>
512
- </div>
513
- ```
514
-
515
- ## Demo
516
-
517
- Kompletnú demo stránku nájdete v [demo/dropdown.html](demo/dropdown.html)
518
-
519
- ---
520
-
521
- # Tabs
522
-
523
- Plne prístupné záložky s podporou klávesovej navigácie podľa WAI-ARIA Tabs Pattern.
524
-
525
- ## Vlastnosti
526
-
527
- - ✅ Plná podpora ARIA atribútov (role, aria-selected, aria-controls)
528
- - ✅ Klávesová navigácia (šípky, Home, End)
529
- - ✅ Automatická aj manuálna aktivácia
530
- - ✅ Focus management
531
- - ✅ Podpora disabled tabov
532
- - ✅ Horizontálna aj vertikálna orientácia
533
- - ✅ Viacero vizuálnych variantov (basic, boxed, pills)
534
- - ✅ Fade animácie default (vypnutie cez data-no-animation)
535
- - ✅ Automatická podpora prefers-reduced-motion
536
-
537
- ## Inštalácia
538
-
539
- ```html
540
- <!-- CSS -->
541
- <link rel="stylesheet" href="css/a11y-tabs.core.css">
542
- <link rel="stylesheet" href="css/a11y-tabs.theme.css">
543
-
544
- <!-- JavaScript -->
545
- <script src="js/a11y-tabs.js"></script>
546
- ```
547
-
548
- ## Použitie
549
-
550
- ### Základná štruktúra
551
-
552
- ```html
553
- <div data-tabs>
554
- <div role="tablist" data-tabs-list>
555
- <button data-tabs-tab>Tab 1</button>
556
- <button data-tabs-tab>Tab 2</button>
557
- <button data-tabs-tab>Tab 3</button>
558
- </div>
559
-
560
- <div data-tabs-panel>
561
- Obsah tabu 1
562
- </div>
563
-
564
- <div data-tabs-panel>
565
- Obsah tabu 2
566
- </div>
567
-
568
- <div data-tabs-panel>
569
- Obsah tabu 3
570
- </div>
571
- </div>
572
- ```
573
-
574
- ### JavaScript inicializácia
575
-
576
- ```javascript
577
- // Automatická inicializácia
578
- initTabs();
579
-
580
- // Manuálna inicializácia
581
- const tabs = new AccessibleTabs(element, {
582
- activeIndex: 0, // Počiatočný aktívny tab
583
- automatic: true, // Automatická aktivácia pri arrow keys
584
- orientation: 'horizontal', // 'horizontal' alebo 'vertical'
585
- onChange: (tab, panel, index) => {},
586
- onTabClick: (tab, index) => {}
587
- });
588
- ```
589
-
590
- ## Konfigurácia
591
-
592
- ### Data atribúty
593
-
594
- ```html
595
- <!-- Nastaviť počiatočný aktívny tab -->
596
- <div class="tabs" data-tabs data-active-index="1">
597
-
598
- <!-- Manuálna aktivácia (vyžaduje Enter/Space) -->
599
- <div class="tabs" data-tabs data-automatic="false">
600
-
601
- <!-- Vertikálna orientácia -->
602
- <div class="tabs" data-tabs data-orientation="vertical">
603
- ```
604
-
605
- ### JavaScript options
606
-
607
- ```javascript
608
- {
609
- activeIndex: 0, // Počiatočný aktívny tab (0-based)
610
- automatic: true, // Auto aktivácia pri arrow keys
611
- orientation: 'horizontal', // 'horizontal' alebo 'vertical'
612
- onChange: (tab, panel, index) => {}, // Callback pri zmene tabu
613
- onTabClick: (tab, index) => {} // Callback pri kliknutí
614
- }
615
- ```
616
-
617
- ## Klávesová navigácia
618
-
619
- ### Horizontálne tabs
620
- - **←** / **→** - Navigácia medzi tabmi
621
- - **Home** - Skok na prvý tab
622
- - **End** - Skok na posledný tab
623
- - **Enter** / **Space** - Aktivuje tab (pri manuálnej aktivácii)
624
- - **Tab** - Presunie focus do obsahu panelu
625
-
626
- ### Vertikálne tabs
627
- - **↑** / **↓** - Navigácia medzi tabmi
628
- - **Home** / **End** - Prvý/posledný tab
629
- - **Enter** / **Space** - Aktivuje tab
630
- - **Tab** - Do obsahu panelu
631
-
632
- ## Varianty
633
-
634
- ### Boxed variant
635
-
636
- ```html
637
- <div data-tabs data-variant="boxed">
638
- <!-- tabs s rámčekom okolo obsahu -->
639
- <!-- pre boxed pridajte aj data-tabs-panels wrapper -->
640
- <div data-tabs-panels>...</div>
641
- </div>
642
- ```
643
-
644
- ### Pills variant
645
-
646
- ```html
647
- <div data-tabs data-variant="pills">
648
- <!-- tabs v štýle pills/buttons -->
649
- </div>
650
- ```
651
-
652
- ### Vertikálne tabs
653
-
654
- ```html
655
- <div data-tabs data-orientation="vertical">
656
- <div role="tablist" data-tabs-list>
657
- <button data-tabs-tab>Tab 1</button>
658
- <button data-tabs-tab>Tab 2</button>
659
- </div>
660
-
661
- <div data-tabs-panels>
662
- <div data-tabs-panel>Obsah 1</div>
663
- <div data-tabs-panel>Obsah 2</div>
664
- </div>
665
- </div>
666
- ```
667
-
668
- ### Animácie
669
-
670
- Tabs majú **fade animáciu default** pri prepínaní medzi panelmi. Plynulý prechod sa aplikuje automaticky.
671
-
672
- ```html
673
- <div data-tabs>
674
- <div role="tablist" data-tabs-list>
675
- <button data-tabs-tab>Tab 1</button>
676
- <button data-tabs-tab>Tab 2</button>
677
- </div>
678
-
679
- <div data-tabs-panels>
680
- <div data-tabs-panel>Obsah 1</div>
681
- <div data-tabs-panel>Obsah 2</div>
682
- </div>
683
- </div>
684
- ```
685
-
686
- **Nastavenie rýchlosti animácie:**
687
-
688
- ```html
689
- <!-- Inline pomocou style atribútu -->
690
- <div data-tabs style="--a11y-tabs-duration: 0.5s;">
691
- <!-- tabs -->
692
- </div>
693
- ```
694
-
695
- ```css
696
- /* Alebo globálne v CSS */
697
- :root {
698
- --a11y-tabs-duration: 0.3s;
699
- --a11y-tabs-easing: ease-in-out;
700
- }
701
- ```
702
-
703
- **Dostupné CSS custom properties:**
704
- - `--a11y-tabs-duration` - Dĺžka animácie (default: `0.2s`)
705
- - `--a11y-tabs-easing` - Easing funkcia (default: `ease`)
706
-
707
- **Vypnutie animácií:**
708
-
709
- Ak chcete vypnúť fade animáciu pre konkrétny tabs komponent, použite atribút `data-no-animation`:
710
-
711
- ```html
712
- <div data-tabs data-no-animation>
713
- <div role="tablist" data-tabs-list>
714
- <button data-tabs-tab>Tab 1</button>
715
- <button data-tabs-tab>Tab 2</button>
716
- </div>
717
-
718
- <div data-tabs-panels>
719
- <div data-tabs-panel>Obsah 1 - prepne sa okamžite</div>
720
- <div data-tabs-panel>Obsah 2 - prepne sa okamžite</div>
721
- </div>
722
- </div>
723
- ```
724
-
725
- **Automatická podpora prefers-reduced-motion:**
726
-
727
- Animácie sa automaticky vypnú pre používateľov, ktorí majú nastavené `prefers-reduced-motion: reduce` v prehliadači alebo operačnom systéme. Nemusíte nič nastavovať.
728
-
729
- ### Disabled tab
730
-
731
- ```html
732
- <button data-tabs-tab disabled>Disabled Tab</button>
733
- ```
734
-
735
- ### Tabs s badge
736
-
737
- ```html
738
- <button data-tabs-tab>
739
- Aktívne
740
- <span class="tabs__tab-badge">12</span>
741
- </button>
742
- <!-- Poznámka: .tabs__tab-badge je helper trieda pre styling -->
743
- ```
744
-
745
- ### Tabs s ikonami
746
-
747
- ```html
748
- <button data-tabs-tab>
749
- <span class="tabs__tab-icon">
750
- 📊 Štatistiky
751
- </span>
752
- </button>
753
- <!-- Poznámka: .tabs__tab-icon je helper trieda pre styling -->
754
- ```
755
-
756
- ## Demo
757
-
758
- Kompletnú demo stránku nájdete v [demo/tabs.html](demo/tabs.html)
759
-
760
- ---
761
-
762
- # Offcanvas
763
-
764
- Vysúvacie bočné menu s focus trapom a plnou a11y podporou podľa WAI-ARIA Dialog Pattern.
765
-
766
- ## Vlastnosti
767
-
768
- - ✅ Plná podpora ARIA atribútov (role="dialog", aria-modal="true")
769
- - ✅ Focus trap - Tab cykluje iba cez elementy v offcanvas
770
- - ✅ Return focus - Po zatvorení vráti focus na trigger
771
- - ✅ Scroll lock - Zamkne scrollovanie body
772
- - ✅ Escape na zatvorenie
773
- - ✅ Backdrop click na zatvorenie
774
- - ✅ 4 pozície (left, right, top, bottom)
775
- - ✅ Konfigurovateľné správanie
776
-
777
- ## Inštalácia
778
-
779
- ```html
780
- <!-- CSS -->
781
- <link rel="stylesheet" href="css/a11y-offcanvas.core.css">
782
- <link rel="stylesheet" href="css/a11y-offcanvas.theme.css">
783
-
784
- <!-- JavaScript -->
785
- <script src="js/a11y-offcanvas.js"></script>
786
- ```
787
-
788
- ## Použitie
789
-
790
- ### Základná štruktúra
791
-
792
- ```html
793
- <!-- Trigger button -->
794
- <button data-offcanvas-trigger="my-offcanvas">Otvoriť menu</button>
795
-
796
- <!-- Offcanvas -->
797
- <div data-offcanvas id="my-offcanvas">
798
- <div data-position="left" data-offcanvas-panel>
799
- <div data-offcanvas-header>
800
- <h2 data-offcanvas-title>Nadpis</h2>
801
- <button data-offcanvas-close aria-label="Zatvoriť">&times;</button>
802
- </div>
803
-
804
- <div data-offcanvas-body>
805
- Obsah offcanvas...
806
- </div>
807
-
808
- <!-- Voliteľný footer -->
809
- <div data-offcanvas-footer>
810
- <button data-offcanvas-close>Zatvoriť</button>
811
- </div>
812
- </div>
813
-
814
- <div data-offcanvas-backdrop></div>
815
- </div>
816
- ```
817
-
818
- ### JavaScript inicializácia
819
-
820
- ```javascript
821
- // Automatická inicializácia
822
- initOffcanvas();
823
-
824
- // Manuálna inicializácia
825
- const offcanvas = new AccessibleOffcanvas(element, {
826
- closeOnBackdrop: true, // Zatvorí pri kliku na backdrop
827
- closeOnEscape: true, // Zatvorí pri stlačení Escape
828
- trapFocus: true, // Aktivuje focus trap
829
- scrollLock: true, // Zamkne scrollovanie body
830
- onOpen: (instance) => {}, // Callback po otvorení
831
- onClose: (instance) => {} // Callback po zatvorení
832
- });
833
- ```
834
-
835
- ## Animácie
836
-
837
- Offcanvas používa **transform animácie** (translateX/translateY) pre plynulé vysúvanie panelu.
838
-
839
- ### Základná animácia (default)
840
-
841
- Animácia je aktívna automaticky s predvolenou rýchlosťou `0.3s` a `ease` easingom.
842
-
843
- ```html
844
- <!-- Offcanvas s default animáciou -->
845
- <div data-offcanvas id="my-offcanvas">
846
- <div data-position="left" data-offcanvas-panel>
847
- <div data-offcanvas-header>
848
- <h2 data-offcanvas-title>Menu</h2>
849
- <button data-offcanvas-close aria-label="Zatvoriť">&times;</button>
850
- </div>
851
- <div data-offcanvas-body>
852
- Obsah...
853
- </div>
854
- </div>
855
- <div data-offcanvas-backdrop></div>
856
- </div>
857
- ```
858
-
859
- ### Vlastná rýchlosť animácie
860
-
861
- Rýchlosť animácie sa dá nastaviť pomocou CSS custom properties.
862
-
863
- ```html
864
- <!-- Pomalá animácia (0.6s) -->
865
- <div data-offcanvas id="slow-offcanvas" style="--a11y-offcanvas-duration: 0.6s;">
866
- <div data-position="left" data-offcanvas-panel>
867
- <!-- obsah -->
868
- </div>
869
- <div data-offcanvas-backdrop></div>
870
- </div>
871
-
872
- <!-- Rýchla animácia (0.15s) -->
873
- <div data-offcanvas id="fast-offcanvas" style="--a11y-offcanvas-duration: 0.15s;">
874
- <div data-position="right" data-offcanvas-panel>
875
- <!-- obsah -->
876
- </div>
877
- <div data-offcanvas-backdrop></div>
878
- </div>
879
-
880
- <!-- Vlastný easing -->
881
- <div data-offcanvas id="custom-offcanvas"
882
- style="--a11y-offcanvas-duration: 0.4s; --a11y-offcanvas-easing: cubic-bezier(0.68, -0.55, 0.265, 1.55);">
883
- <div data-position="top" data-offcanvas-panel>
884
- <!-- obsah -->
885
- </div>
886
- <div data-offcanvas-backdrop></div>
887
- </div>
888
- ```
889
-
890
- ```css
891
- /* Alebo globálne v CSS */
892
- [data-offcanvas] {
893
- --a11y-offcanvas-duration: 0.25s;
894
- --a11y-offcanvas-easing: ease-in-out;
895
- }
896
- ```
897
-
898
- **Dostupné CSS custom properties:**
899
- - `--a11y-offcanvas-duration` - Dĺžka animácie (default: `0.3s`)
900
- - `--a11y-offcanvas-easing` - Easing funkcia (default: `ease`)
901
-
902
- **Dôležité:**
903
- - Animácia sa automaticky vypne pri `prefers-reduced-motion: reduce`
904
- - Animuje sa panel (transform) aj backdrop (opacity)
905
-
906
- ## Konfigurácia
907
-
908
- ### Data atribúty
909
-
910
- ```html
911
- <!-- Zakáže zatvorenie pri kliku na backdrop -->
912
- <div data-offcanvas data-close-on-backdrop="false">
913
-
914
- <!-- Zakáže focus trap -->
915
- <div data-offcanvas data-trap-focus="false">
916
-
917
- <!-- Zakáže scroll lock -->
918
- <div data-offcanvas data-scroll-lock="false">
919
- ```
920
-
921
- ### JavaScript options
922
-
923
- ```javascript
924
- {
925
- closeOnBackdrop: true, // Zatvorí pri kliku na backdrop
926
- closeOnEscape: true, // Zatvorí pri Escape
927
- trapFocus: true, // Focus trap aktívny
928
- scrollLock: true, // Body scroll lock
929
- onOpen: (instance) => {}, // Callback po otvorení
930
- onClose: (instance) => {} // Callback po zatvorení
931
- }
932
- ```
933
-
934
- ## Klávesová navigácia
935
-
936
- - **Tab** - Navigácia medzi focusable elementmi (s focus trapom)
937
- - **Shift + Tab** - Spätná navigácia (s focus trapom)
938
- - **Esc** - Zatvorí offcanvas a vráti focus na trigger
939
-
940
- ## Focus Trap
941
-
942
- Focus trap zabezpečuje, že keď je offcanvas otvorený:
943
- - Tab cykluje iba cez focusable elementy v offcanvas
944
- - Shift+Tab cykluje spätne
945
- - Focus nemôže uniknúť mimo offcanvas
946
- - Po zatvorení sa focus vráti na trigger button
947
-
948
- ## Pozície
949
-
950
- ### Zľava
951
-
952
- ```html
953
- <div data-position="left" data-offcanvas-panel>
954
- <!-- Výška 100%, width 320px -->
955
- </div>
956
- ```
957
-
958
- ### Zprava
959
-
960
- ```html
961
- <div data-position="right" data-offcanvas-panel>
962
- <!-- Výška 100%, width 320px -->
963
- </div>
964
- ```
965
-
966
- ### Zhora
967
-
968
- ```html
969
- <div data-position="top" data-offcanvas-panel>
970
- <!-- Šírka 100%, max-height 50vh -->
971
- </div>
972
- ```
973
-
974
- ### Zdola
975
-
976
- ```html
977
- <div data-position="bottom" data-offcanvas-panel>
978
- <!-- Šírka 100%, max-height 50vh -->
979
- </div>
980
- ```
981
-
982
- ## Varianty
983
-
984
- ### Široký variant
985
-
986
- ```html
987
- <div data-position="left" data-width="wide" data-offcanvas-panel>
988
- <!-- Width 480px namiesto 320px -->
989
- </div>
990
- ```
991
-
992
- ### Full height (pre top/bottom)
993
-
994
- ```html
995
- <div data-position="top" data-width="full" data-offcanvas-panel>
996
- <!-- Max-height 100vh namiesto 50vh -->
997
- </div>
998
- ```
999
-
1000
- ### S footrom
1001
-
1002
- ```html
1003
- <div data-offcanvas-panel>
1004
- <div data-offcanvas-header>...</div>
1005
- <div data-offcanvas-body>...</div>
1006
- <div data-offcanvas-footer>
1007
- <button>Zrušiť</button>
1008
- <button>Potvrdiť</button>
1009
- </div>
1010
- </div>
1011
- ```
1012
-
1013
- ## Demo
1014
-
1015
- Kompletnú demo stránku nájdete v [demo/offcanvas.html](demo/offcanvas.html)
1016
-
1017
- ---
1018
-
1019
- # Modal
1020
-
1021
- Plne prístupné modálne okno s focus trapom podľa WAI-ARIA Dialog Pattern.
1022
-
1023
- ## Vlastnosti
1024
-
1025
- - ✅ Plná podpora ARIA atribútov (role="dialog", aria-modal="true")
1026
- - ✅ Focus trap - Tab cykluje iba cez elementy v modali
1027
- - ✅ Return focus - Po zatvorení vráti focus na trigger
1028
- - ✅ Scroll lock - Zamkne scrollovanie body
1029
- - ✅ Escape na zatvorenie
1030
- - ✅ Backdrop click na zatvorenie
1031
- - ✅ Viacero veľkostí (sm, md, lg, fullscreen)
1032
- - ✅ Konfigurovateľné správanie
1033
-
1034
- ## Inštalácia
1035
-
1036
- ```html
1037
- <!-- CSS -->
1038
- <link rel="stylesheet" href="css/a11y-modal.core.css">
1039
- <link rel="stylesheet" href="css/a11y-modal.theme.css">
1040
-
1041
- <!-- JavaScript -->
1042
- <script src="js/a11y-modal.js"></script>
1043
- ```
1044
-
1045
- ## Použitie
1046
-
1047
- ### Základná štruktúra
1048
-
1049
- ```html
1050
- <!-- Trigger button -->
1051
- <button data-modal-trigger="my-modal">Otvoriť modal</button>
1052
-
1053
- <!-- Modal -->
1054
- <div data-modal id="my-modal">
1055
- <div data-modal-dialog>
1056
- <div data-modal-header>
1057
- <h2 data-modal-title>Nadpis</h2>
1058
- <button data-modal-close aria-label="Zatvoriť">&times;</button>
1059
- </div>
1060
-
1061
- <div data-modal-body>
1062
- Obsah modalu...
1063
- </div>
1064
-
1065
- <div data-modal-footer>
1066
- <button data-modal-close>Zrušiť</button>
1067
- <button>Potvrdiť</button>
1068
- </div>
1069
- </div>
1070
-
1071
- <div data-modal-backdrop></div>
1072
- </div>
1073
- ```
1074
-
1075
- ### JavaScript inicializácia
1076
-
1077
- ```javascript
1078
- // Automatická inicializácia
1079
- initModals();
1080
-
1081
- // Manuálna inicializácia
1082
- const modal = new AccessibleModal(element, {
1083
- closeOnBackdrop: true, // Zatvorí pri kliku na backdrop
1084
- closeOnEscape: true, // Zatvorí pri stlačení Escape
1085
- trapFocus: true, // Aktivuje focus trap
1086
- scrollLock: true, // Zamkne scrollovanie body
1087
- onOpen: (instance) => {}, // Callback po otvorení
1088
- onClose: (instance) => {} // Callback po zatvorení
1089
- });
1090
- ```
1091
-
1092
- ## Konfigurácia
1093
-
1094
- ### Data atribúty
1095
-
1096
- ```html
1097
- <!-- Zakáže zatvorenie pri kliku na backdrop -->
1098
- <div data-modal data-close-on-backdrop="false">
1099
-
1100
- <!-- Zakáže focus trap -->
1101
- <div data-modal data-trap-focus="false">
1102
-
1103
- <!-- Zakáže scroll lock -->
1104
- <div data-modal data-scroll-lock="false">
1105
- ```
1106
-
1107
- ### JavaScript options
1108
-
1109
- ```javascript
1110
- {
1111
- closeOnBackdrop: true, // Zatvorí pri kliku na backdrop
1112
- closeOnEscape: true, // Zatvorí pri Escape
1113
- trapFocus: true, // Focus trap aktívny
1114
- scrollLock: true, // Body scroll lock
1115
- onOpen: (instance) => {}, // Callback po otvorení
1116
- onClose: (instance) => {} // Callback po zatvorení
1117
- }
1118
- ```
1119
-
1120
- ## Klávesová navigácia
1121
-
1122
- - **Tab** - Navigácia medzi focusable elementmi (s focus trapom)
1123
- - **Shift + Tab** - Spätná navigácia (s focus trapom)
1124
- - **Esc** - Zatvorí modal a vráti focus na trigger
1125
-
1126
- ## Focus Trap
1127
-
1128
- Focus trap zabezpečuje, že keď je modal otvorený:
1129
- - Tab cykluje iba cez focusable elementy v modali
1130
- - Shift+Tab cykluje spätne
1131
- - Focus nemôže uniknúť mimo modal
1132
- - Po zatvorení sa focus vráti na trigger button
1133
-
1134
- ## Veľkosti
1135
-
1136
- ### Small (400px)
1137
-
1138
- ```html
1139
- <div data-modal-dialog data-size="sm">
1140
- <!-- Obsah -->
1141
- </div>
1142
- ```
1143
-
1144
- ### Medium (600px) - predvolené
1145
-
1146
- ```html
1147
- <div data-modal-dialog>
1148
- <!-- Obsah -->
1149
- </div>
1150
- ```
1151
-
1152
- ### Large (800px)
1153
-
1154
- ```html
1155
- <div data-modal-dialog data-size="lg">
1156
- <!-- Obsah -->
1157
- </div>
1158
- ```
1159
-
1160
- ### Fullscreen
1161
-
1162
- ```html
1163
- <div data-modal-dialog data-size="fullscreen">
1164
- <!-- Obsah -->
1165
- </div>
1166
- ```
1167
-
1168
- ## Varianty
1169
-
1170
- ### Potvrdzovacie dialógy
1171
-
1172
- ```html
1173
- <div data-modal id="confirm-delete">
1174
- <div data-modal-dialog data-size="sm">
1175
- <div data-modal-header>
1176
- <h2 data-modal-title>Potvrdiť odstránenie</h2>
1177
- <button data-modal-close>&times;</button>
1178
- </div>
1179
-
1180
- <div data-modal-body>
1181
- <p>Naozaj chcete odstrániť túto položku?</p>
1182
- </div>
1183
-
1184
- <div data-modal-footer>
1185
- <button data-modal-close>Zrušiť</button>
1186
- <button data-modal-close>Odstrániť</button>
1187
- </div>
1188
- </div>
1189
-
1190
- <div data-modal-backdrop></div>
1191
- </div>
1192
- ```
1193
-
1194
- ### S formulárom
1195
-
1196
- ```html
1197
- <div data-modal id="modal-form">
1198
- <div data-modal-dialog>
1199
- <div data-modal-header>
1200
- <h2 data-modal-title>Kontaktný formulár</h2>
1201
- <button data-modal-close>&times;</button>
1202
- </div>
1203
-
1204
- <div data-modal-body>
1205
- <form>
1206
- <input type="text" placeholder="Meno">
1207
- <input type="email" placeholder="Email">
1208
- <textarea placeholder="Správa"></textarea>
1209
- </form>
1210
- </div>
1211
-
1212
- <div data-modal-footer>
1213
- <button data-modal-close>Zrušiť</button>
1214
- <button>Odoslať</button>
1215
- </div>
1216
- </div>
1217
-
1218
- <div data-modal-backdrop></div>
1219
- </div>
1220
- ```
1221
-
1222
- ### Scrollovateľný obsah
1223
-
1224
- ```html
1225
- <div data-modal-body>
1226
- <!-- Dlhý obsah -->
1227
- <!-- Modal body automaticky pridá scrollbar -->
1228
- </div>
1229
- ```
1230
-
1231
- ## Demo
1232
-
1233
- Kompletnú demo stránku nájdete v [demo/modal.html](demo/modal.html)
1234
-
1235
- ---
1236
-
1237
- # Collapse
1238
-
1239
- Samostatný collapse komponent pre show/hide funkcionalitu. Jednoduché prepínanie viditeľnosti obsahu pomocou tlačidla.
1240
-
1241
- ## Vlastnosti
1242
-
1243
- - ✅ Plná podpora ARIA atribútov (aria-expanded, aria-controls, aria-labelledby)
1244
- - ✅ Dynamické texty pre show/hide stavy (aria-label sa mení automaticky)
1245
- - ✅ Podpora viacerých panelov naraz (cez CSS selector)
1246
- - ✅ CSS Grid animácie default (vypnutie cez data-no-animation)
1247
- - ✅ Automatická podpora prefers-reduced-motion
1248
- - ✅ Jednoduchá integrácia
1249
-
1250
- ## Inštalácia
1251
-
1252
- ```html
1253
- <!-- CSS -->
1254
- <link rel="stylesheet" href="css/a11y-accordion.core.css">
1255
- <link rel="stylesheet" href="css/a11y-accordion.theme.css">
1256
-
1257
- <!-- JavaScript -->
1258
- <script src="js/a11y-accordion.js"></script>
1259
- ```
1260
-
1261
- ## Použitie
1262
-
1263
- ### Základný collapse (bez animácie)
1264
-
1265
- Samostatné tlačidlo, ktoré prepína viditeľnosť panelu cez CSS selector. Panel sa zobrazí/skryje okamžite.
1266
-
1267
- ```html
1268
- <!-- S ID selektorom -->
1269
- <button data-collapse-toggle="#panel-1">
1270
- Otvoriť panel
1271
- </button>
1272
-
1273
- <div id="panel-1">
1274
- <div>
1275
- <div>
1276
- <p>Obsah panelu...</p>
1277
- </div>
1278
- </div>
1279
- </div>
1280
- ```
1281
-
1282
- ### Animácie
1283
-
1284
- Collapse má **CSS Grid animácie default** pri otváraní/zatváraní.
1285
-
1286
- ```html
1287
- <button data-collapse-toggle="#panel">
1288
- Otvoriť panel
1289
- </button>
1290
-
1291
- <div id="panel">
1292
- <!-- Prvý div: overflow wrapper (overflow: hidden, grid-row: 1/span 2) -->
1293
- <div>
1294
- <!-- Druhý div: content wrapper (padding) -->
1295
- <div>
1296
- <p>Obsah panelu s plynulou animáciou...</p>
1297
- </div>
1298
- </div>
1299
- </div>
1300
- ```
1301
-
1302
- **Dôležité pre animáciu:**
1303
- - Potrebná štruktúra: `panel > wrapper (overflow) > obsah (padding)`
1304
- - Prvý vnorený div: technický wrapper s `overflow: hidden` (BEZ paddingu)
1305
- - Druhý vnorený div: kontajner pre obsah (má padding)
1306
- - Animácia: CSS Grid (`grid-template-rows: 0fr → 1fr`)
1307
- - Funguje bez potreby poznať výšku obsahu vopred
1308
-
1309
- **Nastavenie rýchlosti animácie:**
1310
-
1311
- ```html
1312
- <!-- Inline pomocou style atribútu na paneli -->
1313
- <div id="panel" style="--a11y-accordion-duration: 0.5s;">
1314
- <div>
1315
- <div>Obsah...</div>
1316
- </div>
1317
- </div>
1318
- ```
1319
-
1320
- ```css
1321
- /* Alebo globálne v CSS */
1322
- :root {
1323
- --a11y-accordion-duration: 0.4s;
1324
- --a11y-accordion-easing: ease-in-out;
1325
- }
1326
- ```
1327
-
1328
- **Dostupné CSS custom properties:**
1329
- - `--a11y-accordion-duration` - Dĺžka animácie (default: `0.3s`)
1330
- - `--a11y-accordion-easing` - Easing funkcia (default: `ease`)
1331
-
1332
- **Vypnutie animácií:**
1333
-
1334
- Ak chcete vypnúť animácie pre konkrétny panel, použite atribút `data-no-animation`:
1335
-
1336
- ```html
1337
- <button data-collapse-toggle="#no-animation-panel">
1338
- Bez animácie
1339
- </button>
1340
-
1341
- <div id="no-animation-panel" data-no-animation>
1342
- <div>
1343
- <div>
1344
- <p>Tento panel sa zobrazí/skryje okamžite bez animácie.</p>
1345
- </div>
1346
- </div>
1347
- </div>
1348
- ```
1349
-
1350
- **Automatická podpora prefers-reduced-motion:**
1351
-
1352
- Animácie sa automaticky vypnú pre používateľov, ktorí majú nastavené `prefers-reduced-motion: reduce` v prehliadači alebo operačnom systéme. Nemusíte nič nastavovať.
1353
-
1354
- ### Viacero panelov naraz
1355
-
1356
- Jeden button môže ovládať viacero panelov pomocou class selektora alebo ľubovoľného CSS selektora.
1357
-
1358
- ```html
1359
- <!-- S class selektorom (ovláda viacero panelov naraz) -->
1360
- <button data-collapse-toggle=".info-panel">
1361
- Prepnúť všetky info panely
1362
- </button>
1363
-
1364
- <div class="info-panel">
1365
- <div>
1366
- <div>Panel 1</div>
1367
- </div>
1368
- </div>
1369
- <div class="info-panel">
1370
- <div>
1371
- <div>Panel 2</div>
1372
- </div>
1373
- </div>
1374
- <div class="info-panel">
1375
- <div>
1376
- <div>Panel 3</div>
1377
- </div>
1378
- </div>
1379
-
1380
- <!-- S ľubovoľným selektorom -->
1381
- <button data-collapse-toggle="[data-section='details']">
1382
- Prepnúť detaily
1383
- </button>
1384
-
1385
- <div data-section="details">
1386
- <div>
1387
- <div>Detail 1</div>
1388
- </div>
1389
- </div>
1390
- <div data-section="details">
1391
- <div>
1392
- <div>Detail 2</div>
1393
- </div>
1394
- </div>
1395
- ```
1396
-
1397
- ### Dynamické texty (data-text-for-show / data-text-for-hide)
1398
-
1399
- Button môže meniť svoj aria-label a viditeľný text podľa stavu (otvorené/zatvorené).
1400
-
1401
- ```html
1402
- <button
1403
- data-collapse-toggle="#detail-panel"
1404
- data-text-for-show="Zobraziť detail"
1405
- data-text-for-hide="Skryť detail">
1406
- <span>Zobraziť detail</span>
1407
- </button>
1408
-
1409
- <div id="detail-panel">
1410
- <div>
1411
- <div>
1412
- <p>Detailný obsah...</p>
1413
- </div>
1414
- </div>
1415
- </div>
1416
- ```
1417
-
1418
- **Správanie:**
1419
- - Keď je panel ZATVORENÝ → aria-label = "Zobraziť detail", text v `<span>` = "Zobraziť detail"
1420
- - Keď je panel OTVORENÝ → aria-label = "Skryť detail", text v `<span>` = "Skryť detail"
1421
- - Button **musí obsahovať** `<span>` element, v ktorom sa mení text
1422
- - `aria-expanded` atribút sa automaticky nastavuje na `true`/`false`
1423
-
1424
- ### Oddelené aria-label texty (data-aria-label-for-show / data-aria-label-for-hide)
1425
-
1426
- Ak chcete mať odlišné texty pre aria-label a viditeľný text v `<span>`, použite samostatné atribúty:
1427
-
1428
- ```html
1429
- <button
1430
- data-collapse-toggle=".info-panel"
1431
- data-text-for-show="Zobraziť všetko"
1432
- data-text-for-hide="Skryť všetko"
1433
- data-aria-label-for-show="Zobraziť všetky info panely"
1434
- data-aria-label-for-hide="Skryť všetky info panely">
1435
- <span>Zobraziť všetko</span>
1436
- </button>
1437
- ```
1438
-
1439
- **Správanie:**
1440
- - Keď je panel ZATVORENÝ → aria-label = "Zobraziť všetky info panely", text v `<span>` = "Zobraziť všetko"
1441
- - Keď je panel OTVORENÝ → aria-label = "Skryť všetky info panely", text v `<span>` = "Skryť všetko"
1442
-
1443
- ### JavaScript inicializácia
1444
-
1445
- ```javascript
1446
- // Automatická inicializácia
1447
- initCollapses();
1448
-
1449
- // Manuálna inicializácia (Bootstrap štýl)
1450
- const collapse = new Collapse();
1451
-
1452
- // Alebo cez namespace (CDN)
1453
- const collapse = new a11yKit.Collapse();
1454
- ```
1455
-
1456
- ---
1457
-
1458
- # Accordion
1459
-
1460
- Plne prístupný accordion komponent s klávesovou navigáciou podľa WAI-ARIA Accordion Pattern. Pre samostatné collapse toggles použite [Collapse](#collapse) komponent.
1461
-
1462
- ## Vlastnosti
1463
-
1464
- - ✅ Plná podpora ARIA atribútov (aria-expanded, aria-controls, role="region")
1465
- - ✅ Klávesová navigácia (Arrow keys, Home, End)
1466
- - ✅ Single aj multiple expand modes
1467
- - ✅ Toggle all funkcionality (jeden button s dynamickým textom a ikonou)
1468
- - ✅ Standalone collapse toggles (button + panel via selector)
1469
- - ✅ Dynamické texty pre show/hide stavy (aria-label sa mení automaticky)
1470
- - ✅ CSS Grid animácie default (vypnutie cez data-no-animation)
1471
- - ✅ Viacero vizuálnych variantov
1472
- - ✅ Automatická podpora prefers-reduced-motion
1473
-
1474
- ## Inštalácia
1475
-
1476
- ```html
1477
- <!-- CSS -->
1478
- <link rel="stylesheet" href="css/a11y-accordion.core.css">
1479
- <link rel="stylesheet" href="css/a11y-accordion.theme.css">
1480
-
1481
- <!-- JavaScript -->
1482
- <script src="js/a11y-accordion.js"></script>
1483
- ```
1484
-
1485
- ## Použitie
1486
-
1487
- ### Základný accordion (Single Expand)
1488
-
1489
- Iba jedna sekcia môže byť otvorená naraz.
1490
-
1491
- ```html
1492
- <div data-accordion>
1493
- <div data-accordion-item>
1494
- <button data-accordion-trigger>
1495
- Sekcia 1
1496
- </button>
1497
- <div data-accordion-panel>
1498
- <div>
1499
- <div>
1500
- Obsah sekcie 1
1501
- </div>
1502
- </div>
1503
- </div>
1504
- </div>
1505
-
1506
- <div data-accordion-item>
1507
- <button data-accordion-trigger>
1508
- Sekcia 2
1509
- </button>
1510
- <div data-accordion-panel>
1511
- <div>
1512
- <div>
1513
- Obsah sekcie 2
1514
- </div>
1515
- </div>
1516
- </div>
1517
- </div>
1518
-
1519
- <div data-accordion-item>
1520
- <button data-accordion-trigger>
1521
- Sekcia 3
1522
- </button>
1523
- <div data-accordion-panel>
1524
- <div>
1525
- <div>
1526
- Obsah sekcie 3
1527
- </div>
1528
- </div>
1529
- </div>
1530
- </div>
1531
- </div>
1532
- ```
1533
-
1534
- ### Animácie
1535
-
1536
- Accordion má **CSS Grid animácie default** pri otváraní/zatváraní.
1537
-
1538
- ```html
1539
- <div data-accordion>
1540
- <div data-accordion-item>
1541
- <button data-accordion-trigger>Sekcia 1</button>
1542
- <div data-accordion-panel>
1543
- <!-- Prvý div: overflow wrapper (overflow: hidden, grid-row: 1/span 2) -->
1544
- <div>
1545
- <!-- Druhý div: content wrapper (padding) -->
1546
- <div>
1547
- Obsah sekcie 1
1548
- </div>
1549
- </div>
1550
- </div>
1551
- </div>
1552
-
1553
- <div data-accordion-item>
1554
- <button data-accordion-trigger>Sekcia 2</button>
1555
- <div data-accordion-panel>
1556
- <div>
1557
- <div>
1558
- Obsah sekcie 2
1559
- </div>
1560
- </div>
1561
- </div>
1562
- </div>
1563
- </div>
1564
- ```
1565
-
1566
- **Dôležité pre animáciu:**
1567
- - Potrebná štruktúra: `data-accordion-panel > wrapper (overflow) > obsah (padding)`
1568
- - Prvý vnorený div: technický wrapper s `overflow: hidden` (BEZ paddingu)
1569
- - Druhý vnorený div: kontajner pre obsah (má padding)
1570
- - Animácia: CSS Grid (`grid-template-rows: 0fr → 1fr`)
1571
- - Funguje bez potreby poznať výšku obsahu vopred
1572
- - Animácia sa automaticky vypne pri `prefers-reduced-motion: reduce`
1573
-
1574
- **Vlastná rýchlosť animácie:**
1575
-
1576
- ```html
1577
- <!-- Inline pomocou style atribútu -->
1578
- <div data-accordion style="--a11y-accordion-duration: 0.6s;">
1579
- <!-- accordion items -->
1580
- </div>
1581
-
1582
- <!-- Vlastný easing -->
1583
- <div data-accordion style="--a11y-accordion-duration: 0.4s; --a11y-accordion-easing: ease-in-out;">
1584
- <!-- accordion items -->
1585
- </div>
1586
- ```
1587
-
1588
- ```css
1589
- /* Alebo globálne v CSS */
1590
- [data-accordion] {
1591
- --a11y-accordion-duration: 0.5s;
1592
- --a11y-accordion-easing: ease-in-out;
1593
- }
1594
- ```
1595
-
1596
- **Dostupné CSS custom properties:**
1597
- - `--a11y-accordion-duration` - Dĺžka animácie (default: `0.3s`)
1598
- - `--a11y-accordion-easing` - Easing funkcia (default: `ease`)
1599
-
1600
- **Vypnutie animácií:**
1601
-
1602
- ```html
1603
- <!-- Vypnúť animácie pre konkrétny accordion -->
1604
- <div data-accordion data-no-animation>
1605
- <!-- panely sa prepínajú okamžite bez animácie -->
1606
- </div>
1607
- ```
1608
-
1609
- **Automatická podpora prefers-reduced-motion:**
1610
- - Animácie sa automaticky vypnú, ak má používateľ v systéme nastavené `prefers-reduced-motion: reduce`
1611
- - Nemusíte nič programovať, funguje automaticky
1612
-
1613
- ### Multiple Expand Accordion
1614
-
1615
- Viacero sekcií môže byť otvorených súčasne.
1616
-
1617
- ```html
1618
- <div data-accordion data-accordion-multiple>
1619
- <div data-accordion-item>
1620
- <button data-accordion-trigger>Sekcia 1</button>
1621
- <div data-accordion-panel>
1622
- <div>
1623
- <div>Obsah 1</div>
1624
- </div>
1625
- </div>
1626
- </div>
1627
-
1628
- <div data-accordion-item>
1629
- <button data-accordion-trigger>Sekcia 2</button>
1630
- <div data-accordion-panel>
1631
- <div>
1632
- <div>Obsah 2</div>
1633
- </div>
1634
- </div>
1635
- </div>
1636
- </div>
1637
- ```
1638
-
1639
- ### JavaScript inicializácia
1640
-
1641
- ```javascript
1642
- // Automatická inicializácia
1643
- initAccordions();
1644
-
1645
- // Manuálna inicializácia
1646
- const accordion = new AccessibleAccordion();
1647
- ```
1648
-
1649
- ## Klávesová navigácia
1650
-
1651
- V accordion groups:
1652
-
1653
- - **↓** - Presun na ďalší trigger
1654
- - **↑** - Presun na predchádzajúci trigger
1655
- - **Home** - Presun na prvý trigger
1656
- - **End** - Presun na posledný trigger
1657
- - **Enter** / **Space** - Toggle accordion item
1658
-
1659
- ## Rozšírené použitie
1660
-
1661
- ### Toggle All Control
1662
-
1663
- Jedno toggle tlačidlo, ktoré prepína všetky sekcie naraz. Tlačidlo automaticky mení text a ikonu podľa stavu.
1664
-
1665
- ```html
1666
- <div data-accordion data-accordion-multiple>
1667
- <!-- Toggle control na vrchu (vytvorí sa automaticky) -->
1668
- <div data-accordion-controls="top"></div>
1669
-
1670
- <div data-accordion-item>
1671
- <button data-accordion-trigger>Sekcia 1</button>
1672
- <div data-accordion-panel>
1673
- <div>
1674
- <div>Obsah 1</div>
1675
- </div>
1676
- </div>
1677
- </div>
1678
-
1679
- <div data-accordion-item>
1680
- <button data-accordion-trigger>Sekcia 2</button>
1681
- <div data-accordion-panel>
1682
- <div>
1683
- <div>Obsah 2</div>
1684
- </div>
1685
- </div>
1686
- </div>
1687
-
1688
- <!-- Toggle control na spodku (vytvorí sa automaticky) -->
1689
- <div data-accordion-controls="bottom"></div>
1690
- </div>
1691
- ```
1692
-
1693
- **Správanie:**
1694
- - Keď sú všetky sekcie zatvorené → text v `<span>` = "Otvoriť všetko", aria-label = "Otvoriť všetky panely", ikona = plus (+)
1695
- - Keď sú všetky sekcie otvorené → text v `<span>` = "Zatvoriť všetko", aria-label = "Zatvoriť všetky panely", ikona = mínus (−)
1696
- - `aria-expanded` atribút reflektuje aktuálny stav (`true`/`false`)
1697
- - `aria-controls` obsahuje ID všetkých panelov, ktoré tlačidlo ovláda
1698
- - Ak existujú viaceré toggle buttony (top a bottom), všetky sa synchronizujú pri kliknutí
1699
-
1700
- **Default hodnoty pre automaticky generovaný toggle button:**
1701
- - `data-text-for-show="Otvoriť všetko"`
1702
- - `data-text-for-hide="Zatvoriť všetko"`
1703
- - `data-aria-label-for-show="Otvoriť všetky panely"`
1704
- - `data-aria-label-for-hide="Zatvoriť všetky panely"`
1705
-
1706
- ### Custom Toggle All Button
1707
-
1708
- Ak chcete vlastný toggle button namiesto automaticky generovaného:
1709
-
1710
- ```html
1711
- <div data-accordion data-accordion-multiple>
1712
- <div data-accordion-controls="top">
1713
- <button
1714
- data-accordion-toggle-all
1715
- data-text-for-show="Rozbaliť všetko"
1716
- data-text-for-hide="Zbaliť všetko"
1717
- data-aria-label-for-show="Rozbaliť všetky sekcie"
1718
- data-aria-label-for-hide="Zbaliť všetky sekcie">
1719
- <svg aria-hidden="true" width="16" height="16">
1720
- <path class="toggle-icon-expand" d="M8 3v10M3 8h10" stroke="currentColor"/>
1721
- <path class="toggle-icon-collapse" d="M3 8h10" stroke="currentColor" style="display: none;"/>
1722
- </svg>
1723
- <span>Rozbaliť všetko</span>
1724
- </button>
1725
- </div>
1726
-
1727
- <div data-accordion-item>
1728
- <button data-accordion-trigger>Sekcia 1</button>
1729
- <div data-accordion-panel>
1730
- <div>
1731
- <div>Obsah 1</div>
1732
- </div>
1733
- </div>
1734
- </div>
1735
-
1736
- <div data-accordion-item>
1737
- <button data-accordion-trigger>Sekcia 2</button>
1738
- <div data-accordion-panel>
1739
- <div>
1740
- <div>Obsah 2</div>
1741
- </div>
1742
- </div>
1743
- </div>
1744
- </div>
1745
- ```
1746
-
1747
- **Dôležité:**
1748
- - Button **musí obsahovať** `<span>` element pre dynamický text
1749
- - Ikony používajú triedy `.toggle-icon-expand` a `.toggle-icon-collapse` pre prepínanie
1750
- - Atribút `data-accordion-toggle-all` je povinný
1751
-
1752
- ### Dynamické texty (data-text-for-show / data-text-for-hide)
1753
-
1754
- Button môže meniť svoj aria-label podľa stavu (otvorené/zatvorené):
1755
-
1756
- ```html
1757
- <div data-accordion data-accordion-multiple>
1758
- <div data-accordion-item>
1759
- <button
1760
- data-accordion-trigger
1761
- data-text-for-show="Rozbaliť informácie"
1762
- data-text-for-hide="Zabaliť informácie">
1763
- Rozbaliť informácie
1764
- </button>
1765
- <div data-accordion-panel>
1766
- <div>
1767
- <div>
1768
- Obsah...
1769
- </div>
1770
- </div>
1771
- </div>
1772
- </div>
1773
- </div>
1774
- ```
1775
-
1776
- ## Varianty
1777
-
1778
- ### Bordered variant
1779
-
1780
- Accordion bez okrajov, iba s oddeľovačmi medzi položkami.
1781
-
1782
- ```html
1783
- <div data-accordion data-variant="bordered">
1784
- <!-- accordion items -->
1785
- </div>
1786
- ```
1787
-
1788
- ### Separated variant
1789
-
1790
- Accordion s väčším odstupom a tieňom medzi položkami.
1791
-
1792
- ```html
1793
- <div data-accordion data-variant="separated" data-accordion-multiple>
1794
- <!-- accordion items -->
1795
- </div>
1796
- ```
1797
-
1798
- ### Compact variant
1799
-
1800
- Menšie paddingy a font size pre kompaktnejší vzhľad.
1801
-
1802
- ```html
1803
- <div data-accordion data-size="compact">
1804
- <!-- accordion items -->
1805
- </div>
1806
- ```
1807
-
1808
- ### Large variant
1809
-
1810
- Väčšie paddingy a font size pre výraznejší vzhľad.
1811
-
1812
- ```html
1813
- <div data-accordion data-size="large">
1814
- <!-- accordion items -->
1815
- </div>
1816
- ```
1817
-
1818
- ## Data atribúty - prehľad
1819
-
1820
- ### Collapse (standalone toggles)
1821
-
1822
- - `data-collapse-toggle="selector"` - Na buttone, CSS selector panelu/panelov
1823
- - `data-text-for-show="text"` - Text v `<span>` keď je panel zatvorený (aj aria-label ak nie je nastavený aria-label atribút)
1824
- - `data-text-for-hide="text"` - Text v `<span>` keď je panel otvorený (aj aria-label ak nie je nastavený aria-label atribút)
1825
- - `data-aria-label-for-show="text"` - Voliteľný: Samostatný aria-label text pre zatvorený stav
1826
- - `data-aria-label-for-hide="text"` - Voliteľný: Samostatný aria-label text pre otvorený stav
1827
-
1828
- ### Accordion groups
1829
-
1830
- - `data-accordion` - Označuje accordion skupinu
1831
- - `data-accordion-multiple` - Povolí multiple expand
1832
- - `data-accordion-item` - Jednotlivý accordion item
1833
- - `data-accordion-trigger` - Button na toggle accordion item
1834
- - `data-accordion-panel` - Panel s obsahom
1835
- - `data-accordion-controls="top|bottom"` - Kontajner pre toggle all button (vytvorí sa automaticky)
1836
- - `data-accordion-toggle-all` - Toggle button na prepnutie všetkých sekcií (automaticky generovaný alebo vlastný)
1837
- - `data-text-for-show="text"` - Text v `<span>` pre zatvorený stav (na accordion trigger alebo toggle all buttone)
1838
- - `data-text-for-hide="text"` - Text v `<span>` pre otvorený stav
1839
- - `data-aria-label-for-show="text"` - Voliteľný: Samostatný aria-label text pre zatvorený stav
1840
- - `data-aria-label-for-hide="text"` - Voliteľný: Samostatný aria-label text pre otvorený stav
1841
-
1842
- ## Demo
1843
-
1844
- Kompletnú demo stránku nájdete v [demo/accordion.html](demo/accordion.html)
1845
-
1846
- ---
1847
-
1848
- ## Použitie s module bundlermi
1849
-
1850
- Všetky komponenty podporujú ES6 import/export pre použitie s Webpack, Vite, Astro, atď.
1851
-
1852
- > **💡 Tip:** Pre prehľad všetkých spôsobov inicializácie (CDN, manuálne, ES6 import) pozrite sekciu [Inicializácia komponentov](#inicializácia-komponentov) vyššie.
1853
-
1854
- ### Použitie s NPM package
1855
-
1856
- #### 1. Import všetkých komponentov naraz
1857
-
1858
- ```javascript
1859
- // Import všetkých komponentov naraz
1860
- import { initAll } from 'a11y-kit';
1861
-
1862
- // Auto-initialize všetky komponenty
1863
- initAll();
1864
- ```
1865
-
1866
- #### 2. Wildcard import (importovať všetko, volať postupne)
1867
-
1868
- ```javascript
1869
- // Import všetkých exportov ako namespace
1870
- import * as a11yKit from 'a11y-kit';
1871
-
1872
- // Init funkcie:
1873
- a11yKit.initAll(); // všetko naraz
1874
- a11yKit.initDropdowns();
1875
- a11yKit.initTabs();
1876
- a11yKit.initModals();
1877
- a11yKit.initCollapses();
1878
- a11yKit.initAccordions();
1879
-
1880
- // Bootstrap štýl - krátke aliasy (odporúčané):
1881
- const dropdown = new a11yKit.Dropdown(element, options);
1882
- const tabs = new a11yKit.Tabs(element, options);
1883
- const modal = new a11yKit.Modal(element, options);
1884
- const collapse = new a11yKit.Collapse();
1885
- const accordion = new a11yKit.Accordion();
1886
-
1887
- // Alebo plné názvy (backwards compatible):
1888
- const dropdown2 = new a11yKit.AccessibleDropdown(element, options);
1889
- const collapse2 = new a11yKit.AccessibleCollapse();
1890
- ```
1891
-
1892
- #### 3. Named imports (len špecifické komponenty)
1893
-
1894
- ```javascript
1895
- // Init funkcie
1896
- import { initDropdowns } from 'a11y-kit/dropdown';
1897
- import { initTabs } from 'a11y-kit/tabs';
1898
- import { initModals } from 'a11y-kit/modal';
1899
-
1900
- // Alebo Bootstrap štýl - krátke aliasy
1901
- import { Dropdown, Modal, Tabs } from 'a11y-kit/dropdown';
1902
- // alebo jednotlivo:
1903
- import { Dropdown } from 'a11y-kit/dropdown';
1904
- import { Tabs } from 'a11y-kit/tabs';
1905
-
1906
- // CSS import
1907
- import 'a11y-kit/styles/dropdown-core';
1908
- import 'a11y-kit/styles/dropdown-theme';
1909
- import 'a11y-kit/styles/tabs-core';
1910
- import 'a11y-kit/styles/tabs-theme';
1911
-
1912
- // Initialize - init funkcie:
1913
- initDropdowns();
1914
- initTabs();
1915
- initModals();
1916
-
1917
- // Alebo Bootstrap štýl:
1918
- const dropdown = new Dropdown(element, options);
1919
- const tabs = new Tabs(element, options);
1920
- ```
1921
-
1922
- ### Astro (s NPM package)
1923
-
1924
- ```javascript
1925
- // src/scripts/main.js
1926
- import { initAll } from 'a11y-kit';
1927
-
1928
- // Inicializovať všetky komponenty
1929
- document.addEventListener('DOMContentLoaded', () => {
1930
- initAll();
1931
- });
1932
- ```
1933
-
1934
- ### Astro (lokálne súbory bez NPM)
1935
-
1936
- #### Named imports (štandardný spôsob)
1937
-
1938
- ```javascript
1939
- // src/scripts/main.js
1940
-
1941
- // S .js príponou (explicitné)
1942
- import { initDropdowns } from '../assets/js/a11y-kit/a11y-dropdown.js';
1943
- import { initTabs } from '../assets/js/a11y-kit/a11y-tabs.js';
1944
- import { initModals } from '../assets/js/a11y-kit/a11y-modal.js';
1945
- import { initAccordions } from '../assets/js/a11y-kit/a11y-accordion.js';
1946
-
1947
- // ALEBO bez .js prípony (podľa konfigurácie bundlera)
1948
- import { initDropdowns } from '../assets/js/a11y-kit/a11y-dropdown';
1949
- import { initTabs } from '../assets/js/a11y-kit/a11y-tabs';
1950
- import { initModals } from '../assets/js/a11y-kit/a11y-modal';
1951
- import { initAccordions } from '../assets/js/a11y-kit/a11y-accordion';
1952
-
1953
- // Inicializovať komponenty
1954
- initDropdowns();
1955
- initTabs();
1956
- initModals();
1957
- initAccordions();
1958
- ```
1959
-
1960
- #### Wildcard import z jednotlivých súborov
1961
-
1962
- ```javascript
1963
- // Import všetkých exportov z jednotlivých súborov ako namespace
1964
-
1965
- // S .js príponou
1966
- import * as dropdown from '../assets/js/a11y-kit/a11y-dropdown.js';
1967
- import * as tabs from '../assets/js/a11y-kit/a11y-tabs.js';
1968
-
1969
- // ALEBO bez .js prípony
1970
- import * as dropdown from '../assets/js/a11y-kit/a11y-dropdown';
1971
- import * as tabs from '../assets/js/a11y-kit/a11y-tabs';
1972
- import * as modal from '../assets/js/a11y-kit/a11y-modal';
1973
- import * as accordion from '../assets/js/a11y-kit/a11y-accordion';
1974
-
1975
- // Potom volať funkcie:
1976
- dropdown.initDropdowns();
1977
- tabs.initTabs();
1978
- modal.initModals();
1979
- accordion.initAccordions();
1980
-
1981
- // Alebo vytvoriť manuálne instance:
1982
- const myDropdown = new dropdown.AccessibleDropdown(element, options);
1983
- const myTabs = new tabs.AccessibleTabs(element, options);
1984
- ```
1985
-
1986
- #### Import cez index.js (všetko naraz)
1987
-
1988
- ```javascript
1989
- // Import všetkého z index.js ako namespace
1990
-
1991
- // S .js príponou
1992
- import * as a11yKit from '../assets/js/a11y-kit/index.js';
1993
-
1994
- // ALEBO bez .js prípony
1995
- import * as a11yKit from '../assets/js/a11y-kit/index';
1996
- // alebo ešte kratšie (ak bundler automaticky hľadá index):
1997
- import * as a11yKit from '../assets/js/a11y-kit';
1998
-
1999
- // Volať funkcie postupne:
2000
- a11yKit.initDropdowns();
2001
- a11yKit.initTabs();
2002
- a11yKit.initModals();
2003
-
2004
- // Alebo všetko naraz:
2005
- a11yKit.initAll();
2006
- ```
2007
-
2008
- **Dôležité pre Astro:**
2009
- - Všetky JavaScript súbory teraz používajú ES6 exports
2010
- - Auto-initialize sa deaktivuje automaticky v module bundler prostredí
2011
- - Môžete volať `initDropdowns()` a ostatné funkcie kedykoľvek
2012
-
2013
- **Príklad Astro Layout s lokálnymi súbormi:**
2014
-
2015
- ```astro
2016
- ---
2017
- // src/layouts/Layout.astro
2018
- ---
2019
-
2020
- <html>
2021
- <head>
2022
- <!-- Import CSS -->
2023
- <link rel="stylesheet" href="/assets/css/a11y-kit/a11y-dropdown.core.css">
2024
- <link rel="stylesheet" href="/assets/css/a11y-kit/a11y-dropdown.theme.css">
2025
- <link rel="stylesheet" href="/assets/css/a11y-kit/a11y-tabs.core.css">
2026
- <link rel="stylesheet" href="/assets/css/a11y-kit/a11y-tabs.theme.css">
2027
- </head>
2028
- <body>
2029
- <slot />
2030
-
2031
- <script>
2032
- // Variant 1: Named imports (s .js príponou)
2033
- import { initDropdowns } from '/src/assets/js/a11y-kit/a11y-dropdown.js';
2034
- import { initTabs } from '/src/assets/js/a11y-kit/a11y-tabs.js';
2035
-
2036
- initDropdowns();
2037
- initTabs();
2038
- </script>
2039
-
2040
- <!-- ALEBO -->
2041
-
2042
- <script>
2043
- // Variant 2: Named imports (bez .js prípony)
2044
- import { initDropdowns } from '/src/assets/js/a11y-kit/a11y-dropdown';
2045
- import { initTabs } from '/src/assets/js/a11y-kit/a11y-tabs';
2046
-
2047
- initDropdowns();
2048
- initTabs();
2049
- </script>
2050
-
2051
- <!-- ALEBO -->
2052
-
2053
- <script>
2054
- // Variant 3: Wildcard import z index.js
2055
- import * as a11yKit from '/src/assets/js/a11y-kit/index.js';
2056
-
2057
- a11yKit.initAll(); // všetko naraz
2058
-
2059
- // alebo postupne:
2060
- // a11yKit.initDropdowns();
2061
- // a11yKit.initTabs();
2062
- </script>
2063
-
2064
- <!-- ALEBO -->
2065
-
2066
- <script>
2067
- // Variant 4: Wildcard import (kratšie, bez index.js)
2068
- import * as a11yKit from '/src/assets/js/a11y-kit';
2069
-
2070
- a11yKit.initAll();
2071
- </script>
2072
- </body>
2073
- </html>
2074
- ```
2075
-
2076
- ### Webpack / Vite
2077
-
2078
- #### Variant 1: Import všetkého naraz (s NPM package)
2079
-
2080
- ```javascript
2081
- // main.js
2082
- import 'a11y-kit/styles/dropdown-core';
2083
- import 'a11y-kit/styles/dropdown-theme';
2084
- import 'a11y-kit/styles/tabs-core';
2085
- import 'a11y-kit/styles/tabs-theme';
2086
- import 'a11y-kit/styles/offcanvas-core';
2087
- import 'a11y-kit/styles/offcanvas-theme';
2088
- import 'a11y-kit/styles/modal-core';
2089
- import 'a11y-kit/styles/modal-theme';
2090
- import 'a11y-kit/styles/accordion-core';
2091
- import 'a11y-kit/styles/accordion-theme';
2092
-
2093
- import { initAll } from 'a11y-kit';
2094
-
2095
- // Auto-initialize všetky komponenty
2096
- initAll();
2097
- ```
2098
-
2099
- #### Variant 2: Wildcard import (s NPM package)
2100
-
2101
- ```javascript
2102
- import * as a11yKit from 'a11y-kit';
2103
-
2104
- // Volať postupne
2105
- a11yKit.initDropdowns();
2106
- a11yKit.initTabs();
2107
-
2108
- // Alebo všetko
2109
- a11yKit.initAll();
2110
- ```
2111
-
2112
- #### Variant 3: Lokálne súbory (bez NPM)
2113
-
2114
- ```javascript
2115
- // S .js príponou
2116
- import { initDropdowns } from './a11y-kit/a11y-dropdown.js';
2117
- import { initTabs } from './a11y-kit/a11y-tabs.js';
2118
-
2119
- // ALEBO bez .js prípony
2120
- import { initDropdowns } from './a11y-kit/a11y-dropdown';
2121
- import { initTabs } from './a11y-kit/a11y-tabs';
2122
-
2123
- initDropdowns();
2124
- initTabs();
2125
- ```
2126
-
2127
- #### Variant 4: Wildcard import z lokálnych súborov
2128
-
2129
- ```javascript
2130
- // Kratšie - bundler automaticky hľadá index.js
2131
- import * as a11yKit from './a11y-kit';
2132
-
2133
- // Alebo explicitne s index.js
2134
- import * as a11yKit from './a11y-kit/index.js';
2135
-
2136
- a11yKit.initAll();
2137
- ```
2138
-
2139
- ### Manuálna inicializácia (pre špecifické use cases)
2140
-
2141
- ```javascript
2142
- // S NPM package
2143
- import { AccessibleDropdown, AccessibleTabs, AccessibleModal } from 'a11y-kit';
2144
-
2145
- // ALEBO z lokálnych súborov (s .js príponou)
2146
- import { AccessibleDropdown } from './a11y-kit/a11y-dropdown.js';
2147
- import { AccessibleTabs } from './a11y-kit/a11y-tabs.js';
2148
-
2149
- // ALEBO z lokálnych súborov (bez .js prípony)
2150
- import { AccessibleDropdown } from './a11y-kit/a11y-dropdown';
2151
- import { AccessibleTabs } from './a11y-kit/a11y-tabs';
2152
-
2153
- // Inicializovať len konkrétne instance s callbackmi
2154
- const myDropdown = new AccessibleDropdown(
2155
- document.getElementById('my-dropdown'),
2156
- {
2157
- closeOnSelect: true,
2158
- onSelect: (item, index) => {
2159
- console.log('Selected:', item.textContent);
2160
- }
2161
- }
2162
- );
2163
-
2164
- const myTabs = new AccessibleTabs(
2165
- document.querySelector('[data-tabs]'),
2166
- {
2167
- activeIndex: 1,
2168
- onChange: (tab, panel, index) => {
2169
- console.log('Tab changed to:', index);
2170
- }
2171
- }
2172
- );
2173
- ```
2174
-
2175
- ### Tree-shaking (len potrebné komponenty)
2176
-
2177
- ```javascript
2178
- // S NPM package - importovať len to čo potrebuješ
2179
- import { initDropdowns } from 'a11y-kit/dropdown';
2180
- import 'a11y-kit/styles/dropdown-core';
2181
- import 'a11y-kit/styles/dropdown-theme';
2182
-
2183
- // ALEBO z lokálnych súborov
2184
- import { initDropdowns } from './a11y-kit/a11y-dropdown.js';
2185
- // alebo bez .js prípony:
2186
- import { initDropdowns } from './a11y-kit/a11y-dropdown';
2187
-
2188
- // Len dropdown bude v bundle (ostatné komponenty budú vynechané)
2189
- initDropdowns();
2190
- ```
2191
-
2192
- ### Poznámka o .js príponách
2193
-
2194
- **Kedy používať `.js` príponu?**
2195
-
2196
- - ✅ **S príponou** (`./a11y-kit/a11y-dropdown.js`) - vždy funguje, jasné a explicitné
2197
- - ✅ **Bez prípony** (`./a11y-kit/a11y-dropdown`) - funguje vo väčšine moderných bundlerov (Vite, Webpack 5, Astro)
2198
- - ✅ **Kratšie cesty** (`./a11y-kit`) - funguje ak máte `index.js` a bundler ho automaticky hľadá
2199
-
2200
- **Odporúčanie:**
2201
- - Pre **produkčné projekty**: používajte `.js` príponu pre explicitnosť
2202
- - Pre **rýchle prototypy**: môžete vynechať príponu ak váš bundler to podporuje
2203
- - Pre **NPM package importy**: prípona nie je potrebná (`import ... from 'a11y-kit'`)
2204
-
2205
- ---
2206
-
2207
- ## Vytvorenie vlastnej témy
2208
-
2209
- 1. Skopírujte `*.theme.css` súbor ako `my-custom-theme.css`
2210
- 2. Upravte CSS hodnoty podľa potreby
2211
- 3. Zmeňte import v HTML:
2212
-
2213
- ```html
2214
- <link rel="stylesheet" href="css/a11y-dropdown.core.css">
2215
- <link rel="stylesheet" href="css/my-custom-theme.css">
2216
- ```
2217
-
2218
- Alebo v JavaScript:
2219
-
2220
- ```javascript
2221
- import './styles/a11y-dropdown.core.css';
2222
- import './styles/my-custom-theme.css'; // Vaša vlastná téma
2223
- ```
2224
-
2225
- ## Prehliadače
2226
-
2227
- Testované a funkčné v:
2228
- - Chrome/Edge 90+
2229
- - Firefox 88+
2230
- - Safari 14+
2231
- - iOS Safari 14+
2232
- - Android Chrome 90+
2233
-
2234
- ## Licencia
2235
-
2236
- MIT
2237
-
2238
- ## Autor
2239
-
2240
- Vytvorené s dôrazom na prístupnosť a použiteľnosť.