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/CHANGELOG.md +69 -0
- package/README.md +63 -33
- package/package.json +42 -11
- package/src/js/a11y-accordion.js +8 -20
- package/src/js/a11y-dropdown.js +14 -30
- package/src/js/a11y-modal.js +4 -17
- package/src/js/a11y-offcanvas.js +4 -17
- package/src/js/a11y-tabs.js +4 -17
- package/src/js/index.js +2 -17
- package/src/README.md +0 -2240
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ť">×</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ť">×</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ť">×</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>×</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>×</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ť.
|