@fpkit/acss 0.5.13 → 0.6.1
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/libs/{chunk-PQ2K3BM6.cjs → chunk-2NRIP6RB.cjs} +3 -3
- package/libs/chunk-33PNJ4LO.cjs +15 -0
- package/libs/chunk-33PNJ4LO.cjs.map +1 -0
- package/libs/chunk-4BZKFPEC.cjs +17 -0
- package/libs/chunk-4BZKFPEC.cjs.map +1 -0
- package/libs/{chunk-772NRB75.js → chunk-5QD3DWFI.js} +2 -2
- package/libs/chunk-6SAHIYCZ.js +7 -0
- package/libs/chunk-6SAHIYCZ.js.map +1 -0
- package/libs/{chunk-3MKLDCKQ.cjs → chunk-6WTC4JXH.cjs} +3 -3
- package/libs/chunk-75QHTLFO.js +7 -0
- package/libs/chunk-75QHTLFO.js.map +1 -0
- package/libs/{chunk-ZANSFMTD.js → chunk-7XPFW7CB.js} +3 -3
- package/libs/chunk-BFK62VX5.js +5 -0
- package/libs/chunk-BFK62VX5.js.map +1 -0
- package/libs/{chunk-ROZI23GS.cjs → chunk-DKTHCQ5P.cjs} +4 -4
- package/libs/chunk-E2AJURUW.cjs +13 -0
- package/libs/chunk-E2AJURUW.cjs.map +1 -0
- package/libs/{chunk-L75OQKEI.cjs → chunk-ENTCUJ3A.cjs} +3 -3
- package/libs/chunk-ENTCUJ3A.cjs.map +1 -0
- package/libs/chunk-F5EYMVQM.js +10 -0
- package/libs/chunk-F5EYMVQM.js.map +1 -0
- package/libs/chunk-FVROL3V5.js +9 -0
- package/libs/chunk-FVROL3V5.js.map +1 -0
- package/libs/chunk-GT77BX4L.cjs +17 -0
- package/libs/chunk-GT77BX4L.cjs.map +1 -0
- package/libs/chunk-GUJSMQ3V.cjs +16 -0
- package/libs/chunk-GUJSMQ3V.cjs.map +1 -0
- package/libs/chunk-HHLNOC5T.js +7 -0
- package/libs/chunk-HHLNOC5T.js.map +1 -0
- package/libs/chunk-HRRHPLER.js +8 -0
- package/libs/chunk-HRRHPLER.js.map +1 -0
- package/libs/chunk-IEB64SWY.js +8 -0
- package/libs/chunk-IEB64SWY.js.map +1 -0
- package/libs/{chunk-NGTJDDFO.js → chunk-IQ76HGVP.js} +2 -2
- package/libs/chunk-IRLFZ3OL.js +9 -0
- package/libs/chunk-IRLFZ3OL.js.map +1 -0
- package/libs/{chunk-JJ43O4Y5.js → chunk-KK47SYZI.js} +2 -2
- package/libs/chunk-O3JIHC5M.cjs +15 -0
- package/libs/chunk-O3JIHC5M.cjs.map +1 -0
- package/libs/chunk-O5XAJ7BY.cjs +18 -0
- package/libs/chunk-O5XAJ7BY.cjs.map +1 -0
- package/libs/chunk-OVWLQYMK.js +10 -0
- package/libs/chunk-OVWLQYMK.js.map +1 -0
- package/libs/chunk-PNWIRCG3.cjs +7 -0
- package/libs/chunk-PNWIRCG3.cjs.map +1 -0
- package/libs/{chunk-D4YLRWAO.cjs → chunk-QVW6W76L.cjs} +6 -6
- package/libs/chunk-T4T6GWYQ.cjs +17 -0
- package/libs/chunk-T4T6GWYQ.cjs.map +1 -0
- package/libs/chunk-TON2YGMD.cjs +9 -0
- package/libs/chunk-TON2YGMD.cjs.map +1 -0
- package/libs/chunk-UEPAWMDF.js +8 -0
- package/libs/chunk-UEPAWMDF.js.map +1 -0
- package/libs/{chunk-LT5KZ2QW.cjs → chunk-US2I5GI7.cjs} +3 -3
- package/libs/{chunk-B7F5FS6D.cjs → chunk-W2UIN7EV.cjs} +3 -3
- package/libs/{chunk-P2DC76ZZ.cjs → chunk-W5TKWBFC.cjs} +3 -3
- package/libs/chunk-WXBFBWYF.cjs +16 -0
- package/libs/chunk-WXBFBWYF.cjs.map +1 -0
- package/libs/{chunk-VUH3FXGJ.js → chunk-X3JCTEPD.js} +5 -5
- package/libs/chunk-X5LGFCWG.js +9 -0
- package/libs/chunk-X5LGFCWG.js.map +1 -0
- package/libs/{chunk-5M57K4SW.js → chunk-Y2PFDELK.js} +2 -2
- package/libs/{chunk-ETFLFC2S.js → chunk-ZFJ4U45S.js} +2 -2
- package/libs/{component-props-a8a2f97e.d.ts → component-props-67d978a2.d.ts} +4 -4
- package/libs/components/alert/alert.css +1 -1
- package/libs/components/alert/alert.css.map +1 -1
- package/libs/components/alert/alert.min.css +2 -2
- package/libs/components/breadcrumbs/breadcrumb.cjs +6 -6
- package/libs/components/breadcrumbs/breadcrumb.d.cts +11 -11
- package/libs/components/breadcrumbs/breadcrumb.d.ts +11 -11
- package/libs/components/breadcrumbs/breadcrumb.js +3 -3
- package/libs/components/button.cjs +6 -4
- package/libs/components/button.d.cts +97 -4
- package/libs/components/button.d.ts +97 -4
- package/libs/components/button.js +4 -2
- package/libs/components/card.cjs +7 -7
- package/libs/components/card.d.cts +14 -14
- package/libs/components/card.d.ts +14 -14
- package/libs/components/card.js +2 -2
- package/libs/components/dialog/dialog.cjs +9 -7
- package/libs/components/dialog/dialog.d.cts +3 -3
- package/libs/components/dialog/dialog.d.ts +3 -3
- package/libs/components/dialog/dialog.js +7 -5
- package/libs/components/form/fields.cjs +4 -4
- package/libs/components/form/fields.d.cts +16 -7
- package/libs/components/form/fields.d.ts +16 -7
- package/libs/components/form/fields.js +2 -2
- package/libs/components/form/inputs.cjs +6 -4
- package/libs/components/form/inputs.d.cts +50 -2
- package/libs/components/form/inputs.d.ts +50 -2
- package/libs/components/form/inputs.js +4 -2
- package/libs/components/form/textarea.cjs +5 -4
- package/libs/components/form/textarea.d.cts +32 -23
- package/libs/components/form/textarea.d.ts +32 -23
- package/libs/components/form/textarea.js +3 -2
- package/libs/components/heading/heading.cjs +3 -3
- package/libs/components/heading/heading.d.cts +2 -2
- package/libs/components/heading/heading.d.ts +2 -2
- package/libs/components/heading/heading.js +2 -2
- package/libs/components/icons/icon.cjs +4 -4
- package/libs/components/icons/icon.d.cts +38 -38
- package/libs/components/icons/icon.d.ts +38 -38
- package/libs/components/icons/icon.js +2 -2
- package/libs/components/link/link.cjs +4 -4
- package/libs/components/link/link.css +1 -1
- package/libs/components/link/link.css.map +1 -1
- package/libs/components/link/link.d.cts +3 -19
- package/libs/components/link/link.d.ts +3 -19
- package/libs/components/link/link.js +2 -2
- package/libs/components/link/link.min.css +2 -2
- package/libs/components/list/list.cjs +5 -5
- package/libs/components/list/list.css +1 -0
- package/libs/components/list/list.css.map +1 -0
- package/libs/components/list/list.d.cts +120 -33
- package/libs/components/list/list.d.ts +120 -33
- package/libs/components/list/list.js +2 -2
- package/libs/components/list/list.min.css +3 -0
- package/libs/components/modal.cjs +6 -4
- package/libs/components/modal.d.cts +8 -8
- package/libs/components/modal.d.ts +8 -8
- package/libs/components/modal.js +5 -3
- package/libs/components/nav/nav.cjs +7 -7
- package/libs/components/nav/nav.css +1 -1
- package/libs/components/nav/nav.css.map +1 -1
- package/libs/components/nav/nav.d.cts +550 -34
- package/libs/components/nav/nav.d.ts +550 -34
- package/libs/components/nav/nav.js +3 -3
- package/libs/components/nav/nav.min.css +2 -2
- package/libs/components/popover/popover.d.cts +5 -5
- package/libs/components/popover/popover.d.ts +5 -5
- package/libs/components/tables/table.cjs +5 -5
- package/libs/components/tables/table.d.cts +8 -8
- package/libs/components/tables/table.d.ts +8 -8
- package/libs/components/tables/table.js +2 -2
- package/libs/components/tag/tag.css +1 -1
- package/libs/components/tag/tag.css.map +1 -1
- package/libs/components/tag/tag.min.css +2 -2
- package/libs/components/text/text.cjs +5 -5
- package/libs/components/text/text.d.cts +5 -5
- package/libs/components/text/text.d.ts +5 -5
- package/libs/components/text/text.js +2 -2
- package/libs/form.types-d25ebfac.d.ts +233 -0
- package/libs/{heading-3648c538.d.ts → heading-7446cb46.d.ts} +8 -8
- package/libs/hooks.cjs +9 -4
- package/libs/hooks.d.cts +137 -3
- package/libs/hooks.d.ts +137 -3
- package/libs/hooks.js +4 -3
- package/libs/icons.cjs +3 -3
- package/libs/icons.d.cts +2 -2
- package/libs/icons.d.ts +2 -2
- package/libs/icons.js +2 -2
- package/libs/index.cjs +53 -51
- package/libs/index.cjs.map +1 -1
- package/libs/index.css +1 -1
- package/libs/index.css.map +1 -1
- package/libs/index.d.cts +338 -49
- package/libs/index.d.ts +338 -49
- package/libs/index.js +24 -22
- package/libs/index.js.map +1 -1
- package/libs/link-5192f411.d.ts +323 -0
- package/libs/list.types-d26de310.d.ts +245 -0
- package/libs/{ui-645f95b5.d.ts → ui-d01b50d4.d.ts} +16 -12
- package/package.json +4 -6
- package/src/components/alert/alert.scss +1 -4
- package/src/components/breadcrumbs/breadcrumb.tsx +4 -1
- package/src/components/buttons/README.mdx +102 -1
- package/src/components/buttons/button.stories.tsx +106 -0
- package/src/components/buttons/button.tsx +82 -52
- package/src/components/dialog/dialog-a11y-review.md +653 -0
- package/src/components/form/README.mdx +725 -43
- package/src/components/form/WCAG-REVIEW.md +654 -0
- package/src/components/form/fields.tsx +10 -1
- package/src/components/form/form.stories.tsx +604 -23
- package/src/components/form/form.tsx +204 -63
- package/src/components/form/form.types.ts +378 -0
- package/src/components/form/input.stories.tsx +71 -3
- package/src/components/form/inputs.tsx +159 -67
- package/src/components/form/select.tsx +122 -66
- package/src/components/form/textarea.tsx +120 -73
- package/src/components/fp.tsx +86 -11
- package/src/components/link/README.mdx +923 -0
- package/src/components/link/link.scss +79 -26
- package/src/components/link/link.stories.tsx +383 -30
- package/src/components/link/link.test.tsx +677 -0
- package/src/components/link/link.tsx +163 -57
- package/src/components/link/link.types.ts +261 -0
- package/src/components/list/README.mdx +764 -0
- package/src/components/list/list.scss +285 -0
- package/src/components/list/list.stories.tsx +514 -27
- package/src/components/list/list.test.tsx +554 -0
- package/src/components/list/list.tsx +153 -51
- package/src/components/list/list.types.ts +255 -0
- package/src/components/nav/ACCESSIBILITY.md +649 -0
- package/src/components/nav/README.mdx +782 -0
- package/src/components/nav/nav.scss +37 -4
- package/src/components/nav/nav.stories.tsx +44 -6
- package/src/components/nav/nav.tsx +302 -51
- package/src/components/nav/nav.types.ts +308 -0
- package/src/components/tag/README.mdx +426 -0
- package/src/components/tag/tag.scss +101 -27
- package/src/components/tag/tag.stories.tsx +384 -10
- package/src/components/tag/tag.test.tsx +210 -0
- package/src/components/tag/tag.tsx +106 -9
- package/src/components/tag/tag.types.ts +107 -0
- package/src/components/ui.tsx +8 -3
- package/src/hooks/use-disabled-state.test.tsx +536 -0
- package/src/hooks/use-disabled-state.ts +246 -0
- package/src/hooks/useDisabledState.md +393 -0
- package/src/hooks.ts +6 -0
- package/src/index.scss +2 -0
- package/src/index.ts +2 -1
- package/src/sass/_globals.scss +2 -7
- package/src/styles/alert/alert.css +1 -3
- package/src/styles/alert/alert.css.map +1 -1
- package/src/styles/index.css +461 -81
- package/src/styles/index.css.map +1 -1
- package/src/styles/link/link.css +45 -28
- package/src/styles/link/link.css.map +1 -1
- package/src/styles/list/list.css +214 -0
- package/src/styles/list/list.css.map +1 -0
- package/src/styles/nav/nav.css +32 -6
- package/src/styles/nav/nav.css.map +1 -1
- package/src/styles/tag/tag.css +113 -35
- package/src/styles/tag/tag.css.map +1 -1
- package/src/styles/utilities/_disabled.scss +58 -0
- package/src/types/shared.ts +43 -6
- package/src/utils/accessibility.ts +109 -0
- package/libs/chunk-2LTJ7HHX.cjs +0 -18
- package/libs/chunk-2LTJ7HHX.cjs.map +0 -1
- package/libs/chunk-2Y7W75TT.js +0 -9
- package/libs/chunk-2Y7W75TT.js.map +0 -1
- package/libs/chunk-5S4ORA4C.cjs +0 -15
- package/libs/chunk-5S4ORA4C.cjs.map +0 -1
- package/libs/chunk-AHDJGCG5.cjs +0 -15
- package/libs/chunk-AHDJGCG5.cjs.map +0 -1
- package/libs/chunk-BHRQBJRY.js +0 -8
- package/libs/chunk-BHRQBJRY.js.map +0 -1
- package/libs/chunk-GZ4QFPRY.js +0 -9
- package/libs/chunk-GZ4QFPRY.js.map +0 -1
- package/libs/chunk-IYUN2EW3.cjs +0 -15
- package/libs/chunk-IYUN2EW3.cjs.map +0 -1
- package/libs/chunk-J32EZPYD.cjs +0 -15
- package/libs/chunk-J32EZPYD.cjs.map +0 -1
- package/libs/chunk-KUKIVRC2.js +0 -7
- package/libs/chunk-KUKIVRC2.js.map +0 -1
- package/libs/chunk-L75OQKEI.cjs.map +0 -1
- package/libs/chunk-M5RRNTVX.cjs +0 -15
- package/libs/chunk-M5RRNTVX.cjs.map +0 -1
- package/libs/chunk-OK5QEIMD.cjs +0 -17
- package/libs/chunk-OK5QEIMD.cjs.map +0 -1
- package/libs/chunk-P7TTEYCD.js +0 -7
- package/libs/chunk-P7TTEYCD.js.map +0 -1
- package/libs/chunk-QLZWHAMK.js +0 -8
- package/libs/chunk-QLZWHAMK.js.map +0 -1
- package/libs/chunk-RIVUMPOG.js +0 -8
- package/libs/chunk-RIVUMPOG.js.map +0 -1
- package/libs/chunk-S7BABR7Z.cjs +0 -13
- package/libs/chunk-S7BABR7Z.cjs.map +0 -1
- package/libs/chunk-SMYRLO3E.js +0 -8
- package/libs/chunk-SMYRLO3E.js.map +0 -1
- package/libs/chunk-TYRCEX2L.js +0 -8
- package/libs/chunk-TYRCEX2L.js.map +0 -1
- package/libs/chunk-XBA562WW.js +0 -8
- package/libs/chunk-XBA562WW.js.map +0 -1
- package/libs/chunk-XTQKWY7W.cjs +0 -32
- package/libs/chunk-XTQKWY7W.cjs.map +0 -1
- package/libs/inputs-f3a216db.d.ts +0 -45
- /package/libs/{chunk-PQ2K3BM6.cjs.map → chunk-2NRIP6RB.cjs.map} +0 -0
- /package/libs/{chunk-772NRB75.js.map → chunk-5QD3DWFI.js.map} +0 -0
- /package/libs/{chunk-3MKLDCKQ.cjs.map → chunk-6WTC4JXH.cjs.map} +0 -0
- /package/libs/{chunk-ZANSFMTD.js.map → chunk-7XPFW7CB.js.map} +0 -0
- /package/libs/{chunk-ROZI23GS.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
- /package/libs/{chunk-NGTJDDFO.js.map → chunk-IQ76HGVP.js.map} +0 -0
- /package/libs/{chunk-JJ43O4Y5.js.map → chunk-KK47SYZI.js.map} +0 -0
- /package/libs/{chunk-D4YLRWAO.cjs.map → chunk-QVW6W76L.cjs.map} +0 -0
- /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
- /package/libs/{chunk-B7F5FS6D.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
- /package/libs/{chunk-P2DC76ZZ.cjs.map → chunk-W5TKWBFC.cjs.map} +0 -0
- /package/libs/{chunk-VUH3FXGJ.js.map → chunk-X3JCTEPD.js.map} +0 -0
- /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
- /package/libs/{chunk-ETFLFC2S.js.map → chunk-ZFJ4U45S.js.map} +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import UI from "#components/ui";
|
|
3
|
+
import type { ListProps, ListItemProps } from "../list/list.types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Props for the Nav component (navigation container).
|
|
7
|
+
*
|
|
8
|
+
* The Nav component provides a semantic `<nav>` element for site navigation,
|
|
9
|
+
* meeting WCAG 2.1 AA standards for accessible navigation landmarks.
|
|
10
|
+
*
|
|
11
|
+
* ## Accessibility Features:
|
|
12
|
+
* - ✅ Uses semantic `<nav>` element (landmark role)
|
|
13
|
+
* - ✅ Supports `aria-label` for multiple navigation regions
|
|
14
|
+
* - ✅ Supports `aria-labelledby` for heading-based labels
|
|
15
|
+
* - ✅ Works with screen readers and keyboard navigation
|
|
16
|
+
*
|
|
17
|
+
* ## Best Practices:
|
|
18
|
+
* - Use `aria-label` when you have multiple navigation regions
|
|
19
|
+
* - Prefer descriptive labels like "Main navigation" or "Footer navigation"
|
|
20
|
+
* - Use `aria-current="page"` on links to indicate current page
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* // Single navigation on page (no label needed)
|
|
25
|
+
* <Nav>
|
|
26
|
+
* <Nav.List>
|
|
27
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
28
|
+
* </Nav.List>
|
|
29
|
+
* </Nav>
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* // Multiple navigation regions (labels required)
|
|
35
|
+
* <Nav aria-label="Main navigation">
|
|
36
|
+
* <Nav.List>
|
|
37
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
38
|
+
* </Nav.List>
|
|
39
|
+
* </Nav>
|
|
40
|
+
*
|
|
41
|
+
* <Nav aria-label="Footer navigation">
|
|
42
|
+
* <Nav.List>
|
|
43
|
+
* <Nav.Item><Link href="/privacy">Privacy</Link></Nav.Item>
|
|
44
|
+
* </Nav.List>
|
|
45
|
+
* </Nav>
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* // Using aria-labelledby with a heading
|
|
51
|
+
* <h2 id="main-nav-heading">Site Navigation</h2>
|
|
52
|
+
* <Nav aria-labelledby="main-nav-heading">
|
|
53
|
+
* <Nav.List>
|
|
54
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
55
|
+
* </Nav.List>
|
|
56
|
+
* </Nav>
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export type NavProps = {
|
|
60
|
+
/**
|
|
61
|
+
* Child elements (typically Nav.List components).
|
|
62
|
+
*
|
|
63
|
+
* @required
|
|
64
|
+
* @example
|
|
65
|
+
* ```tsx
|
|
66
|
+
* <Nav>
|
|
67
|
+
* <Nav.List>
|
|
68
|
+
* <Nav.Item>Link 1</Nav.Item>
|
|
69
|
+
* </Nav.List>
|
|
70
|
+
* </Nav>
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
children: React.ReactNode;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Accessible label for the navigation region.
|
|
77
|
+
*
|
|
78
|
+
* **WCAG 2.1 Requirement**: Use when you have multiple `<nav>` elements
|
|
79
|
+
* on the same page to distinguish them for screen reader users.
|
|
80
|
+
*
|
|
81
|
+
* @optional
|
|
82
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA11}
|
|
83
|
+
* @example
|
|
84
|
+
* ```tsx
|
|
85
|
+
* aria-label="Main navigation"
|
|
86
|
+
* aria-label="Footer navigation"
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
"aria-label"?: string;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* ID of an element that labels this navigation region.
|
|
93
|
+
*
|
|
94
|
+
* Use when a visible heading already describes the navigation.
|
|
95
|
+
*
|
|
96
|
+
* @optional
|
|
97
|
+
* @example
|
|
98
|
+
* ```tsx
|
|
99
|
+
* <h2 id="sidebar-nav">Quick Links</h2>
|
|
100
|
+
* <Nav aria-labelledby="sidebar-nav">...</Nav>
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
"aria-labelledby"?: string;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* HTML id attribute for the navigation element.
|
|
107
|
+
*
|
|
108
|
+
* @optional
|
|
109
|
+
* @example
|
|
110
|
+
* ```tsx
|
|
111
|
+
* id="main-navigation"
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
id?: string;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* CSS class names to apply to the nav element.
|
|
118
|
+
*
|
|
119
|
+
* @optional
|
|
120
|
+
* @example
|
|
121
|
+
* ```tsx
|
|
122
|
+
* classes="navbar sticky-header"
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
classes?: string;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Inline CSS styles to apply.
|
|
129
|
+
* Can include CSS custom properties for theming.
|
|
130
|
+
*
|
|
131
|
+
* @optional
|
|
132
|
+
* @example
|
|
133
|
+
* ```tsx
|
|
134
|
+
* styles={{
|
|
135
|
+
* '--nav-bg': '#f8f9fa',
|
|
136
|
+
* '--nav-h': '4rem'
|
|
137
|
+
* }}
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
styles?: React.CSSProperties;
|
|
141
|
+
} & Partial<React.ComponentProps<typeof UI>>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Props for the NavList component (list of navigation items).
|
|
145
|
+
*
|
|
146
|
+
* Extends the List component with navigation-specific styling through
|
|
147
|
+
* the `isBlock` prop for vertical layout control.
|
|
148
|
+
*
|
|
149
|
+
* ## Layout Options:
|
|
150
|
+
* - **Default (inline)**: Horizontal list for primary navigation
|
|
151
|
+
* - **Block**: Vertical stacked list for sidebars or mobile menus
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```tsx
|
|
155
|
+
* // Horizontal navigation (default)
|
|
156
|
+
* <Nav.List>
|
|
157
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
158
|
+
* <Nav.Item><Link href="/about">About</Link></Nav.Item>
|
|
159
|
+
* </Nav.List>
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```tsx
|
|
164
|
+
* // Vertical navigation (block layout)
|
|
165
|
+
* <Nav.List isBlock>
|
|
166
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
167
|
+
* <Nav.Item><Link href="/about">About</Link></Nav.Item>
|
|
168
|
+
* </Nav.List>
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```tsx
|
|
173
|
+
* // Multiple lists in a navbar
|
|
174
|
+
* <Nav classes="navbar">
|
|
175
|
+
* <Nav.List aria-label="Primary navigation">
|
|
176
|
+
* <Nav.Item><Link href="/">Home</Link></Nav.Item>
|
|
177
|
+
* </Nav.List>
|
|
178
|
+
* <Nav.List aria-label="User actions">
|
|
179
|
+
* <Nav.Item><Link href="/login">Login</Link></Nav.Item>
|
|
180
|
+
* </Nav.List>
|
|
181
|
+
* </Nav>
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export type NavListProps = Omit<ListProps, "type"> & {
|
|
185
|
+
/**
|
|
186
|
+
* Display list items vertically (block layout).
|
|
187
|
+
*
|
|
188
|
+
* When true, applies `data-list="unstyled block"` for vertical stacking.
|
|
189
|
+
* When false or undefined, items display inline horizontally.
|
|
190
|
+
*
|
|
191
|
+
* @default false
|
|
192
|
+
* @example
|
|
193
|
+
* ```tsx
|
|
194
|
+
* isBlock={true} // Vertical sidebar navigation
|
|
195
|
+
* isBlock={false} // Horizontal top navigation (default)
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
isBlock?: boolean;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Accessible label for the navigation list.
|
|
202
|
+
*
|
|
203
|
+
* Use when you have multiple lists in the same Nav to distinguish them.
|
|
204
|
+
*
|
|
205
|
+
* @optional
|
|
206
|
+
* @example
|
|
207
|
+
* ```tsx
|
|
208
|
+
* aria-label="Main menu"
|
|
209
|
+
* aria-label="Social media links"
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
"aria-label"?: string;
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Child elements (typically Nav.Item components).
|
|
216
|
+
*
|
|
217
|
+
* @required
|
|
218
|
+
*/
|
|
219
|
+
children: React.ReactNode;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Props for the NavItem component (individual navigation link container).
|
|
224
|
+
*
|
|
225
|
+
* Wraps navigation links in a list item element with consistent styling.
|
|
226
|
+
* Typically contains a Link component or anchor element.
|
|
227
|
+
*
|
|
228
|
+
* ## Accessibility Considerations:
|
|
229
|
+
* - Use `aria-current="page"` on the link inside to indicate current page
|
|
230
|
+
* - Ensure sufficient color contrast (WCAG 2.1: 4.5:1 for text)
|
|
231
|
+
* - Provide focus indicators (WCAG 2.1: 3:1 contrast for focus state)
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```tsx
|
|
235
|
+
* // Basic navigation item
|
|
236
|
+
* <Nav.Item>
|
|
237
|
+
* <Link href="/about">About Us</Link>
|
|
238
|
+
* </Nav.Item>
|
|
239
|
+
* ```
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```tsx
|
|
243
|
+
* // Current page indicator
|
|
244
|
+
* <Nav.Item>
|
|
245
|
+
* <Link href="/about" aria-current="page">
|
|
246
|
+
* About Us
|
|
247
|
+
* </Link>
|
|
248
|
+
* </Nav.Item>
|
|
249
|
+
* ```
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* ```tsx
|
|
253
|
+
* // Custom styling
|
|
254
|
+
* <Nav.Item
|
|
255
|
+
* classes="nav-item-featured"
|
|
256
|
+
* styles={{ '--nav-px': '2rem' }}
|
|
257
|
+
* >
|
|
258
|
+
* <Link href="/pricing">Pricing</Link>
|
|
259
|
+
* </Nav.Item>
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
export type NavItemProps = Omit<ListItemProps, "type"> & {
|
|
263
|
+
/**
|
|
264
|
+
* HTML id attribute for the list item.
|
|
265
|
+
*
|
|
266
|
+
* @optional
|
|
267
|
+
* @example
|
|
268
|
+
* ```tsx
|
|
269
|
+
* id="nav-item-home"
|
|
270
|
+
* ```
|
|
271
|
+
*/
|
|
272
|
+
id?: string;
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Inline CSS styles to apply to the list item.
|
|
276
|
+
*
|
|
277
|
+
* @optional
|
|
278
|
+
* @example
|
|
279
|
+
* ```tsx
|
|
280
|
+
* styles={{ paddingInline: '1.5rem' }}
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
styles?: React.CSSProperties;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* CSS class names to apply to the list item.
|
|
287
|
+
*
|
|
288
|
+
* @optional
|
|
289
|
+
* @example
|
|
290
|
+
* ```tsx
|
|
291
|
+
* classes="nav-item active"
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
classes?: string;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Child elements (typically a Link component).
|
|
298
|
+
*
|
|
299
|
+
* @required
|
|
300
|
+
* @example
|
|
301
|
+
* ```tsx
|
|
302
|
+
* <Nav.Item>
|
|
303
|
+
* <Link href="/">Home</Link>
|
|
304
|
+
* </Nav.Item>
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
children: React.ReactNode;
|
|
308
|
+
};
|