@fpkit/acss 0.5.13 → 0.6.0

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.
Files changed (280) hide show
  1. package/libs/{chunk-PQ2K3BM6.cjs → chunk-2NRIP6RB.cjs} +3 -3
  2. package/libs/chunk-33PNJ4LO.cjs +15 -0
  3. package/libs/chunk-33PNJ4LO.cjs.map +1 -0
  4. package/libs/chunk-4BZKFPEC.cjs +17 -0
  5. package/libs/chunk-4BZKFPEC.cjs.map +1 -0
  6. package/libs/{chunk-772NRB75.js → chunk-5QD3DWFI.js} +2 -2
  7. package/libs/chunk-6SAHIYCZ.js +7 -0
  8. package/libs/chunk-6SAHIYCZ.js.map +1 -0
  9. package/libs/{chunk-3MKLDCKQ.cjs → chunk-6WTC4JXH.cjs} +3 -3
  10. package/libs/chunk-75QHTLFO.js +7 -0
  11. package/libs/chunk-75QHTLFO.js.map +1 -0
  12. package/libs/{chunk-ZANSFMTD.js → chunk-7XPFW7CB.js} +3 -3
  13. package/libs/chunk-BFK62VX5.js +5 -0
  14. package/libs/chunk-BFK62VX5.js.map +1 -0
  15. package/libs/{chunk-ROZI23GS.cjs → chunk-DKTHCQ5P.cjs} +4 -4
  16. package/libs/chunk-E2AJURUW.cjs +13 -0
  17. package/libs/chunk-E2AJURUW.cjs.map +1 -0
  18. package/libs/{chunk-L75OQKEI.cjs → chunk-ENTCUJ3A.cjs} +3 -3
  19. package/libs/chunk-ENTCUJ3A.cjs.map +1 -0
  20. package/libs/chunk-F5EYMVQM.js +10 -0
  21. package/libs/chunk-F5EYMVQM.js.map +1 -0
  22. package/libs/chunk-FVROL3V5.js +9 -0
  23. package/libs/chunk-FVROL3V5.js.map +1 -0
  24. package/libs/chunk-GT77BX4L.cjs +17 -0
  25. package/libs/chunk-GT77BX4L.cjs.map +1 -0
  26. package/libs/chunk-GUJSMQ3V.cjs +16 -0
  27. package/libs/chunk-GUJSMQ3V.cjs.map +1 -0
  28. package/libs/chunk-HHLNOC5T.js +7 -0
  29. package/libs/chunk-HHLNOC5T.js.map +1 -0
  30. package/libs/chunk-HRRHPLER.js +8 -0
  31. package/libs/chunk-HRRHPLER.js.map +1 -0
  32. package/libs/chunk-IEB64SWY.js +8 -0
  33. package/libs/chunk-IEB64SWY.js.map +1 -0
  34. package/libs/{chunk-NGTJDDFO.js → chunk-IQ76HGVP.js} +2 -2
  35. package/libs/chunk-IRLFZ3OL.js +9 -0
  36. package/libs/chunk-IRLFZ3OL.js.map +1 -0
  37. package/libs/{chunk-JJ43O4Y5.js → chunk-KK47SYZI.js} +2 -2
  38. package/libs/chunk-O3JIHC5M.cjs +15 -0
  39. package/libs/chunk-O3JIHC5M.cjs.map +1 -0
  40. package/libs/chunk-O5XAJ7BY.cjs +18 -0
  41. package/libs/chunk-O5XAJ7BY.cjs.map +1 -0
  42. package/libs/chunk-OVWLQYMK.js +10 -0
  43. package/libs/chunk-OVWLQYMK.js.map +1 -0
  44. package/libs/chunk-PNWIRCG3.cjs +7 -0
  45. package/libs/chunk-PNWIRCG3.cjs.map +1 -0
  46. package/libs/{chunk-D4YLRWAO.cjs → chunk-QVW6W76L.cjs} +6 -6
  47. package/libs/chunk-T4T6GWYQ.cjs +17 -0
  48. package/libs/chunk-T4T6GWYQ.cjs.map +1 -0
  49. package/libs/chunk-TON2YGMD.cjs +9 -0
  50. package/libs/chunk-TON2YGMD.cjs.map +1 -0
  51. package/libs/chunk-UEPAWMDF.js +8 -0
  52. package/libs/chunk-UEPAWMDF.js.map +1 -0
  53. package/libs/{chunk-LT5KZ2QW.cjs → chunk-US2I5GI7.cjs} +3 -3
  54. package/libs/{chunk-B7F5FS6D.cjs → chunk-W2UIN7EV.cjs} +3 -3
  55. package/libs/{chunk-P2DC76ZZ.cjs → chunk-W5TKWBFC.cjs} +3 -3
  56. package/libs/chunk-WXBFBWYF.cjs +16 -0
  57. package/libs/chunk-WXBFBWYF.cjs.map +1 -0
  58. package/libs/{chunk-VUH3FXGJ.js → chunk-X3JCTEPD.js} +5 -5
  59. package/libs/chunk-X5LGFCWG.js +9 -0
  60. package/libs/chunk-X5LGFCWG.js.map +1 -0
  61. package/libs/{chunk-5M57K4SW.js → chunk-Y2PFDELK.js} +2 -2
  62. package/libs/{chunk-ETFLFC2S.js → chunk-ZFJ4U45S.js} +2 -2
  63. package/libs/{component-props-a8a2f97e.d.ts → component-props-67d978a2.d.ts} +4 -4
  64. package/libs/components/alert/alert.css +1 -1
  65. package/libs/components/alert/alert.css.map +1 -1
  66. package/libs/components/alert/alert.min.css +2 -2
  67. package/libs/components/breadcrumbs/breadcrumb.cjs +6 -6
  68. package/libs/components/breadcrumbs/breadcrumb.d.cts +11 -11
  69. package/libs/components/breadcrumbs/breadcrumb.d.ts +11 -11
  70. package/libs/components/breadcrumbs/breadcrumb.js +3 -3
  71. package/libs/components/button.cjs +6 -4
  72. package/libs/components/button.d.cts +97 -4
  73. package/libs/components/button.d.ts +97 -4
  74. package/libs/components/button.js +4 -2
  75. package/libs/components/card.cjs +7 -7
  76. package/libs/components/card.d.cts +14 -14
  77. package/libs/components/card.d.ts +14 -14
  78. package/libs/components/card.js +2 -2
  79. package/libs/components/dialog/dialog.cjs +9 -7
  80. package/libs/components/dialog/dialog.d.cts +3 -3
  81. package/libs/components/dialog/dialog.d.ts +3 -3
  82. package/libs/components/dialog/dialog.js +7 -5
  83. package/libs/components/form/fields.cjs +4 -4
  84. package/libs/components/form/fields.d.cts +16 -7
  85. package/libs/components/form/fields.d.ts +16 -7
  86. package/libs/components/form/fields.js +2 -2
  87. package/libs/components/form/inputs.cjs +6 -4
  88. package/libs/components/form/inputs.d.cts +50 -2
  89. package/libs/components/form/inputs.d.ts +50 -2
  90. package/libs/components/form/inputs.js +4 -2
  91. package/libs/components/form/textarea.cjs +5 -4
  92. package/libs/components/form/textarea.d.cts +32 -23
  93. package/libs/components/form/textarea.d.ts +32 -23
  94. package/libs/components/form/textarea.js +3 -2
  95. package/libs/components/heading/heading.cjs +3 -3
  96. package/libs/components/heading/heading.d.cts +2 -2
  97. package/libs/components/heading/heading.d.ts +2 -2
  98. package/libs/components/heading/heading.js +2 -2
  99. package/libs/components/icons/icon.cjs +4 -4
  100. package/libs/components/icons/icon.d.cts +38 -38
  101. package/libs/components/icons/icon.d.ts +38 -38
  102. package/libs/components/icons/icon.js +2 -2
  103. package/libs/components/link/link.cjs +4 -4
  104. package/libs/components/link/link.css +1 -1
  105. package/libs/components/link/link.css.map +1 -1
  106. package/libs/components/link/link.d.cts +3 -19
  107. package/libs/components/link/link.d.ts +3 -19
  108. package/libs/components/link/link.js +2 -2
  109. package/libs/components/link/link.min.css +2 -2
  110. package/libs/components/list/list.cjs +5 -5
  111. package/libs/components/list/list.css +1 -0
  112. package/libs/components/list/list.css.map +1 -0
  113. package/libs/components/list/list.d.cts +120 -33
  114. package/libs/components/list/list.d.ts +120 -33
  115. package/libs/components/list/list.js +2 -2
  116. package/libs/components/list/list.min.css +3 -0
  117. package/libs/components/modal.cjs +6 -4
  118. package/libs/components/modal.d.cts +8 -8
  119. package/libs/components/modal.d.ts +8 -8
  120. package/libs/components/modal.js +5 -3
  121. package/libs/components/nav/nav.cjs +7 -7
  122. package/libs/components/nav/nav.css +1 -1
  123. package/libs/components/nav/nav.css.map +1 -1
  124. package/libs/components/nav/nav.d.cts +550 -34
  125. package/libs/components/nav/nav.d.ts +550 -34
  126. package/libs/components/nav/nav.js +3 -3
  127. package/libs/components/nav/nav.min.css +2 -2
  128. package/libs/components/popover/popover.d.cts +5 -5
  129. package/libs/components/popover/popover.d.ts +5 -5
  130. package/libs/components/tables/table.cjs +5 -5
  131. package/libs/components/tables/table.d.cts +8 -8
  132. package/libs/components/tables/table.d.ts +8 -8
  133. package/libs/components/tables/table.js +2 -2
  134. package/libs/components/tag/tag.css +1 -1
  135. package/libs/components/tag/tag.css.map +1 -1
  136. package/libs/components/tag/tag.min.css +2 -2
  137. package/libs/components/text/text.cjs +5 -5
  138. package/libs/components/text/text.d.cts +5 -5
  139. package/libs/components/text/text.d.ts +5 -5
  140. package/libs/components/text/text.js +2 -2
  141. package/libs/form.types-d25ebfac.d.ts +233 -0
  142. package/libs/{heading-3648c538.d.ts → heading-7446cb46.d.ts} +8 -8
  143. package/libs/hooks.cjs +9 -4
  144. package/libs/hooks.d.cts +137 -3
  145. package/libs/hooks.d.ts +137 -3
  146. package/libs/hooks.js +4 -3
  147. package/libs/icons.cjs +3 -3
  148. package/libs/icons.d.cts +2 -2
  149. package/libs/icons.d.ts +2 -2
  150. package/libs/icons.js +2 -2
  151. package/libs/index.cjs +53 -51
  152. package/libs/index.cjs.map +1 -1
  153. package/libs/index.css +1 -1
  154. package/libs/index.css.map +1 -1
  155. package/libs/index.d.cts +338 -49
  156. package/libs/index.d.ts +338 -49
  157. package/libs/index.js +24 -22
  158. package/libs/index.js.map +1 -1
  159. package/libs/link-5192f411.d.ts +323 -0
  160. package/libs/list.types-d26de310.d.ts +245 -0
  161. package/libs/{ui-645f95b5.d.ts → ui-d01b50d4.d.ts} +16 -12
  162. package/package.json +4 -6
  163. package/src/components/alert/alert.scss +1 -4
  164. package/src/components/breadcrumbs/breadcrumb.tsx +4 -1
  165. package/src/components/buttons/README.mdx +102 -1
  166. package/src/components/buttons/button.stories.tsx +106 -0
  167. package/src/components/buttons/button.tsx +82 -52
  168. package/src/components/dialog/dialog-a11y-review.md +653 -0
  169. package/src/components/form/README.mdx +725 -43
  170. package/src/components/form/WCAG-REVIEW.md +654 -0
  171. package/src/components/form/fields.tsx +10 -1
  172. package/src/components/form/form.stories.tsx +604 -23
  173. package/src/components/form/form.tsx +204 -63
  174. package/src/components/form/form.types.ts +378 -0
  175. package/src/components/form/input.stories.tsx +71 -3
  176. package/src/components/form/inputs.tsx +159 -67
  177. package/src/components/form/select.tsx +122 -66
  178. package/src/components/form/textarea.tsx +120 -73
  179. package/src/components/fp.tsx +86 -11
  180. package/src/components/link/README.mdx +923 -0
  181. package/src/components/link/link.scss +79 -26
  182. package/src/components/link/link.stories.tsx +383 -30
  183. package/src/components/link/link.test.tsx +677 -0
  184. package/src/components/link/link.tsx +163 -57
  185. package/src/components/link/link.types.ts +261 -0
  186. package/src/components/list/README.mdx +764 -0
  187. package/src/components/list/list.scss +285 -0
  188. package/src/components/list/list.stories.tsx +514 -27
  189. package/src/components/list/list.test.tsx +554 -0
  190. package/src/components/list/list.tsx +153 -51
  191. package/src/components/list/list.types.ts +255 -0
  192. package/src/components/nav/ACCESSIBILITY.md +649 -0
  193. package/src/components/nav/README.mdx +782 -0
  194. package/src/components/nav/nav.scss +32 -1
  195. package/src/components/nav/nav.stories.tsx +44 -6
  196. package/src/components/nav/nav.tsx +302 -51
  197. package/src/components/nav/nav.types.ts +308 -0
  198. package/src/components/tag/README.mdx +426 -0
  199. package/src/components/tag/tag.scss +101 -27
  200. package/src/components/tag/tag.stories.tsx +384 -10
  201. package/src/components/tag/tag.test.tsx +210 -0
  202. package/src/components/tag/tag.tsx +106 -9
  203. package/src/components/tag/tag.types.ts +107 -0
  204. package/src/components/ui.tsx +8 -3
  205. package/src/hooks/use-disabled-state.test.tsx +536 -0
  206. package/src/hooks/use-disabled-state.ts +246 -0
  207. package/src/hooks/useDisabledState.md +393 -0
  208. package/src/hooks.ts +6 -0
  209. package/src/index.scss +2 -0
  210. package/src/index.ts +2 -1
  211. package/src/sass/_globals.scss +2 -7
  212. package/src/styles/alert/alert.css +1 -3
  213. package/src/styles/alert/alert.css.map +1 -1
  214. package/src/styles/index.css +450 -76
  215. package/src/styles/index.css.map +1 -1
  216. package/src/styles/link/link.css +45 -28
  217. package/src/styles/link/link.css.map +1 -1
  218. package/src/styles/list/list.css +214 -0
  219. package/src/styles/list/list.css.map +1 -0
  220. package/src/styles/nav/nav.css +21 -1
  221. package/src/styles/nav/nav.css.map +1 -1
  222. package/src/styles/tag/tag.css +113 -35
  223. package/src/styles/tag/tag.css.map +1 -1
  224. package/src/styles/utilities/_disabled.scss +58 -0
  225. package/src/types/shared.ts +43 -6
  226. package/src/utils/accessibility.ts +109 -0
  227. package/libs/chunk-2LTJ7HHX.cjs +0 -18
  228. package/libs/chunk-2LTJ7HHX.cjs.map +0 -1
  229. package/libs/chunk-2Y7W75TT.js +0 -9
  230. package/libs/chunk-2Y7W75TT.js.map +0 -1
  231. package/libs/chunk-5S4ORA4C.cjs +0 -15
  232. package/libs/chunk-5S4ORA4C.cjs.map +0 -1
  233. package/libs/chunk-AHDJGCG5.cjs +0 -15
  234. package/libs/chunk-AHDJGCG5.cjs.map +0 -1
  235. package/libs/chunk-BHRQBJRY.js +0 -8
  236. package/libs/chunk-BHRQBJRY.js.map +0 -1
  237. package/libs/chunk-GZ4QFPRY.js +0 -9
  238. package/libs/chunk-GZ4QFPRY.js.map +0 -1
  239. package/libs/chunk-IYUN2EW3.cjs +0 -15
  240. package/libs/chunk-IYUN2EW3.cjs.map +0 -1
  241. package/libs/chunk-J32EZPYD.cjs +0 -15
  242. package/libs/chunk-J32EZPYD.cjs.map +0 -1
  243. package/libs/chunk-KUKIVRC2.js +0 -7
  244. package/libs/chunk-KUKIVRC2.js.map +0 -1
  245. package/libs/chunk-L75OQKEI.cjs.map +0 -1
  246. package/libs/chunk-M5RRNTVX.cjs +0 -15
  247. package/libs/chunk-M5RRNTVX.cjs.map +0 -1
  248. package/libs/chunk-OK5QEIMD.cjs +0 -17
  249. package/libs/chunk-OK5QEIMD.cjs.map +0 -1
  250. package/libs/chunk-P7TTEYCD.js +0 -7
  251. package/libs/chunk-P7TTEYCD.js.map +0 -1
  252. package/libs/chunk-QLZWHAMK.js +0 -8
  253. package/libs/chunk-QLZWHAMK.js.map +0 -1
  254. package/libs/chunk-RIVUMPOG.js +0 -8
  255. package/libs/chunk-RIVUMPOG.js.map +0 -1
  256. package/libs/chunk-S7BABR7Z.cjs +0 -13
  257. package/libs/chunk-S7BABR7Z.cjs.map +0 -1
  258. package/libs/chunk-SMYRLO3E.js +0 -8
  259. package/libs/chunk-SMYRLO3E.js.map +0 -1
  260. package/libs/chunk-TYRCEX2L.js +0 -8
  261. package/libs/chunk-TYRCEX2L.js.map +0 -1
  262. package/libs/chunk-XBA562WW.js +0 -8
  263. package/libs/chunk-XBA562WW.js.map +0 -1
  264. package/libs/chunk-XTQKWY7W.cjs +0 -32
  265. package/libs/chunk-XTQKWY7W.cjs.map +0 -1
  266. package/libs/inputs-f3a216db.d.ts +0 -45
  267. /package/libs/{chunk-PQ2K3BM6.cjs.map → chunk-2NRIP6RB.cjs.map} +0 -0
  268. /package/libs/{chunk-772NRB75.js.map → chunk-5QD3DWFI.js.map} +0 -0
  269. /package/libs/{chunk-3MKLDCKQ.cjs.map → chunk-6WTC4JXH.cjs.map} +0 -0
  270. /package/libs/{chunk-ZANSFMTD.js.map → chunk-7XPFW7CB.js.map} +0 -0
  271. /package/libs/{chunk-ROZI23GS.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
  272. /package/libs/{chunk-NGTJDDFO.js.map → chunk-IQ76HGVP.js.map} +0 -0
  273. /package/libs/{chunk-JJ43O4Y5.js.map → chunk-KK47SYZI.js.map} +0 -0
  274. /package/libs/{chunk-D4YLRWAO.cjs.map → chunk-QVW6W76L.cjs.map} +0 -0
  275. /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
  276. /package/libs/{chunk-B7F5FS6D.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
  277. /package/libs/{chunk-P2DC76ZZ.cjs.map → chunk-W5TKWBFC.cjs.map} +0 -0
  278. /package/libs/{chunk-VUH3FXGJ.js.map → chunk-X3JCTEPD.js.map} +0 -0
  279. /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
  280. /package/libs/{chunk-ETFLFC2S.js.map → chunk-ZFJ4U45S.js.map} +0 -0
@@ -1,57 +1,544 @@
1
1
  import React from "react";
2
-
3
2
  import { StoryObj, Meta } from "@storybook/react-vite";
4
-
5
- // import { within, userEvent } from "storybook/test";
6
-
7
3
  import List from "./list";
8
4
 
9
5
  const meta: Meta<typeof List> = {
10
6
  title: "FP.React Components/List",
11
- tags: ["version:1.0.0"],
7
+ tags: ["version:1.0.0", "accessibility:wcag-aa"],
12
8
  component: List,
13
- } as Meta;
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: `
13
+ A flexible, accessible list component supporting unordered (ul), ordered (ol), and definition (dl) lists with WCAG 2.1 AA compliance.
14
+
15
+ ## Features
16
+ - 🎯 Multiple list types (ul, ol, dl)
17
+ - ♿ WCAG 2.1 AA compliant
18
+ - 🎨 Built-in variants (inline, compact, spaced, custom, none)
19
+ - ⚡ React.forwardRef support
20
+ - 📦 Compound component pattern
21
+ - 🎨 CSS custom properties for theming
14
22
 
15
- const listElm = (
16
- <>
17
- <List.ListItem>Home</List.ListItem>
18
- <List.ListItem>About</List.ListItem>
19
- <List.ListItem>Contact</List.ListItem>
20
- </>
21
- );
23
+ ## Accessibility
24
+ - Semantic HTML with native screen reader support
25
+ - role="list" override for Safari/VoiceOver when styling is removed
26
+ - ARIA label support
27
+ - Keyboard navigation compatible
28
+ `,
29
+ },
30
+ },
31
+ },
32
+ argTypes: {
33
+ type: {
34
+ control: "select",
35
+ options: ["ul", "ol", "dl"],
36
+ description: "Type of list element to render",
37
+ table: {
38
+ defaultValue: { summary: "ul" },
39
+ },
40
+ },
41
+ variant: {
42
+ control: "select",
43
+ options: ["none", "inline", "compact", "spaced", "custom"],
44
+ description: "Variant for custom styling",
45
+ table: {
46
+ defaultValue: { summary: "undefined" },
47
+ },
48
+ },
49
+ role: {
50
+ control: "text",
51
+ description: "ARIA role override (use 'list' when removing list styling)",
52
+ },
53
+ "aria-label": {
54
+ control: "text",
55
+ description: "Accessible label for screen readers",
56
+ },
57
+ children: {
58
+ control: false,
59
+ description: "Child elements (typically List.ListItem components)",
60
+ },
61
+ styles: {
62
+ control: "object",
63
+ description: "Inline CSS styles (can include CSS custom properties)",
64
+ },
65
+ },
66
+ } as Meta;
22
67
 
23
68
  export default meta;
24
69
  type Story = StoryObj<typeof List>;
25
70
 
26
- export const DefaultList: Story = {
71
+ // =============================================================================
72
+ // Basic Examples
73
+ // =============================================================================
74
+
75
+ export const DefaultUnorderedList: Story = {
27
76
  args: {
28
- children: listElm,
77
+ children: (
78
+ <>
79
+ <List.ListItem>React - A JavaScript library for building UIs</List.ListItem>
80
+ <List.ListItem>TypeScript - JavaScript with syntax for types</List.ListItem>
81
+ <List.ListItem>SCSS - Syntactically Awesome Style Sheets</List.ListItem>
82
+ </>
83
+ ),
29
84
  },
30
- argTypes: {
31
- // foo is the property we want to remove from the UI
32
- children: {
33
- control: false,
85
+ parameters: {
86
+ docs: {
87
+ description: {
88
+ story: "Basic unordered list with default bullet styling. Uses semantic `<ul>` element.",
89
+ },
90
+ },
91
+ },
92
+ };
93
+
94
+ export const OrderedList: Story = {
95
+ args: {
96
+ type: "ol",
97
+ "aria-label": "Installation steps",
98
+ children: (
99
+ <>
100
+ <List.ListItem>Clone the repository from GitHub</List.ListItem>
101
+ <List.ListItem>Install dependencies with npm install</List.ListItem>
102
+ <List.ListItem>Run the development server with npm start</List.ListItem>
103
+ <List.ListItem>Open localhost:6006 in your browser</List.ListItem>
104
+ </>
105
+ ),
106
+ },
107
+ parameters: {
108
+ docs: {
109
+ description: {
110
+ story: "Sequential numbered list perfect for instructions, steps, or ranked items. Uses semantic `<ol>` element.",
111
+ },
112
+ },
113
+ },
114
+ };
115
+
116
+ export const DefinitionList: Story = {
117
+ args: {
118
+ type: "dl",
119
+ children: (
120
+ <>
121
+ <List.ListItem type="dt">HTML</List.ListItem>
122
+ <List.ListItem type="dd">HyperText Markup Language - The standard markup language for web pages</List.ListItem>
123
+
124
+ <List.ListItem type="dt">CSS</List.ListItem>
125
+ <List.ListItem type="dd">Cascading Style Sheets - Describes how HTML elements are displayed</List.ListItem>
126
+
127
+ <List.ListItem type="dt">JavaScript</List.ListItem>
128
+ <List.ListItem type="dd">High-level programming language for web development</List.ListItem>
129
+ </>
130
+ ),
131
+ },
132
+ parameters: {
133
+ docs: {
134
+ description: {
135
+ story: "Definition list for term-definition pairs, glossaries, or metadata. Uses semantic `<dl>`, `<dt>`, and `<dd>` elements.",
136
+ },
34
137
  },
35
138
  },
36
- } as Story;
139
+ };
140
+
141
+ // =============================================================================
142
+ // Variant Examples
143
+ // =============================================================================
144
+
145
+ export const InlineList: Story = {
146
+ args: {
147
+ variant: "inline",
148
+ role: "list",
149
+ "aria-label": "Main navigation",
150
+ children: (
151
+ <>
152
+ <List.ListItem><a href="/">Home</a></List.ListItem>
153
+ <List.ListItem><a href="/about">About</a></List.ListItem>
154
+ <List.ListItem><a href="/products">Products</a></List.ListItem>
155
+ <List.ListItem><a href="/contact">Contact</a></List.ListItem>
156
+ </>
157
+ ),
158
+ },
159
+ parameters: {
160
+ docs: {
161
+ description: {
162
+ story: "Horizontal list layout using flexbox. Perfect for navigation menus. Remember to add `role='list'` when removing list styling.",
163
+ },
164
+ },
165
+ },
166
+ };
37
167
 
38
168
  export const UnstyledList: Story = {
39
169
  args: {
40
- ...DefaultList.args,
170
+ variant: "none",
41
171
  role: "list",
172
+ "aria-label": "Feature highlights",
173
+ children: (
174
+ <>
175
+ <List.ListItem>✓ No bullets or numbers</List.ListItem>
176
+ <List.ListItem>✓ Clean, minimal design</List.ListItem>
177
+ <List.ListItem>✓ Still accessible with role='list'</List.ListItem>
178
+ <List.ListItem>✓ Great for custom icons</List.ListItem>
179
+ </>
180
+ ),
42
181
  },
43
182
  parameters: {
44
183
  docs: {
45
184
  description: {
46
- story: "Another description `on the story`, with some markdown",
185
+ story: "List with all default styling removed. **Important:** Add `role='list'` to restore list semantics for Safari/VoiceOver.",
47
186
  },
48
187
  },
49
188
  },
50
- } as Story;
189
+ };
51
190
 
52
- export const InlineList: Story = {
191
+ export const CompactList: Story = {
192
+ args: {
193
+ variant: "compact",
194
+ children: (
195
+ <>
196
+ <List.ListItem>Reduced spacing</List.ListItem>
197
+ <List.ListItem>Tighter layout</List.ListItem>
198
+ <List.ListItem>More items visible</List.ListItem>
199
+ <List.ListItem>Perfect for sidebars</List.ListItem>
200
+ <List.ListItem>Dense information</List.ListItem>
201
+ </>
202
+ ),
203
+ },
204
+ parameters: {
205
+ docs: {
206
+ description: {
207
+ story: "Reduced spacing between items for more compact layouts. Useful in sidebars, footers, or dense information displays.",
208
+ },
209
+ },
210
+ },
211
+ };
212
+
213
+ export const SpacedList: Story = {
214
+ args: {
215
+ variant: "spaced",
216
+ children: (
217
+ <>
218
+ <List.ListItem>Increased spacing</List.ListItem>
219
+ <List.ListItem>Better readability</List.ListItem>
220
+ <List.ListItem>Comfortable layout</List.ListItem>
221
+ <List.ListItem>Focus on individual items</List.ListItem>
222
+ </>
223
+ ),
224
+ },
225
+ parameters: {
226
+ docs: {
227
+ description: {
228
+ story: "Increased spacing between items for better readability and visual comfort. Great for feature lists and content-heavy items.",
229
+ },
230
+ },
231
+ },
232
+ };
233
+
234
+ export const CustomMarkerList: Story = {
235
+ args: {
236
+ variant: "custom",
237
+ styles: {
238
+ "--list-marker-content": '"→"',
239
+ "--list-marker-color": "#0066cc",
240
+ "--list-marker-size": "1.25em",
241
+ } as React.CSSProperties,
242
+ children: (
243
+ <>
244
+ <List.ListItem>Custom arrow marker</List.ListItem>
245
+ <List.ListItem>Brand color applied</List.ListItem>
246
+ <List.ListItem>Larger marker size</List.ListItem>
247
+ <List.ListItem>Fully customizable</List.ListItem>
248
+ </>
249
+ ),
250
+ },
251
+ parameters: {
252
+ docs: {
253
+ description: {
254
+ story: "Custom list markers using CSS custom properties. Set `--list-marker-content`, `--list-marker-color`, and `--list-marker-size` to customize.",
255
+ },
256
+ },
257
+ },
258
+ };
259
+
260
+ // =============================================================================
261
+ // Nested Lists
262
+ // =============================================================================
263
+
264
+ export const NestedUnorderedList: Story = {
265
+ args: {
266
+ children: (
267
+ <>
268
+ <List.ListItem>
269
+ Frontend Technologies
270
+ <List>
271
+ <List.ListItem>React - Component-based library</List.ListItem>
272
+ <List.ListItem>Vue - Progressive framework</List.ListItem>
273
+ <List.ListItem>Svelte - Compiler-based framework</List.ListItem>
274
+ </List>
275
+ </List.ListItem>
276
+ <List.ListItem>
277
+ Backend Technologies
278
+ <List>
279
+ <List.ListItem>Node.js - JavaScript runtime</List.ListItem>
280
+ <List.ListItem>Python - Versatile language</List.ListItem>
281
+ <List.ListItem>Go - Fast and efficient</List.ListItem>
282
+ </List>
283
+ </List.ListItem>
284
+ </>
285
+ ),
286
+ },
287
+ parameters: {
288
+ docs: {
289
+ description: {
290
+ story: "Hierarchical list structure with nested lists. Automatically uses different bullet styles for nested levels (disc → circle → square).",
291
+ },
292
+ },
293
+ },
294
+ };
295
+
296
+ export const MixedNestedList: Story = {
297
+ args: {
298
+ type: "ul",
299
+ children: (
300
+ <>
301
+ <List.ListItem>
302
+ Getting Started
303
+ <List type="ol">
304
+ <List.ListItem>Read the documentation</List.ListItem>
305
+ <List.ListItem>Install the package</List.ListItem>
306
+ <List.ListItem>Run the examples</List.ListItem>
307
+ </List>
308
+ </List.ListItem>
309
+ <List.ListItem>
310
+ Advanced Topics
311
+ <List type="ol">
312
+ <List.ListItem>TypeScript integration</List.ListItem>
313
+ <List.ListItem>Custom theming</List.ListItem>
314
+ <List.ListItem>Performance optimization</List.ListItem>
315
+ </List>
316
+ </List.ListItem>
317
+ </>
318
+ ),
319
+ },
320
+ parameters: {
321
+ docs: {
322
+ description: {
323
+ story: "Mix different list types to create complex hierarchical structures. Combines unordered parent with ordered children.",
324
+ },
325
+ },
326
+ },
327
+ };
328
+
329
+ // =============================================================================
330
+ // Styling Examples
331
+ // =============================================================================
332
+
333
+ export const CustomStyledList: Story = {
334
+ args: {
335
+ styles: {
336
+ "--list-marker-color": "#d63384",
337
+ "--list-gap": "1rem",
338
+ "--list-item-margin-bottom": "0.75rem",
339
+ "--list-font-size": "1.125rem",
340
+ } as React.CSSProperties,
341
+ children: (
342
+ <>
343
+ <List.ListItem>Custom marker color (brand magenta)</List.ListItem>
344
+ <List.ListItem>Increased gap between items</List.ListItem>
345
+ <List.ListItem>Larger font size (1.125rem)</List.ListItem>
346
+ <List.ListItem>Fully themeable via CSS variables</List.ListItem>
347
+ </>
348
+ ),
349
+ },
350
+ parameters: {
351
+ docs: {
352
+ description: {
353
+ story: "Demonstrate CSS custom property theming. Override `--list-marker-color`, `--list-gap`, `--list-item-margin-bottom`, and `--list-font-size`.",
354
+ },
355
+ },
356
+ },
357
+ };
358
+
359
+ export const ColoredMarkers: Story = {
360
+ args: {
361
+ type: "ol",
362
+ styles: {
363
+ "--list-marker-color": "#16a34a",
364
+ } as React.CSSProperties,
365
+ children: (
366
+ <>
367
+ <List.ListItem>Green numbered markers</List.ListItem>
368
+ <List.ListItem>Uses --list-marker-color variable</List.ListItem>
369
+ <List.ListItem>Works with all list types</List.ListItem>
370
+ <List.ListItem>Simple and effective</List.ListItem>
371
+ </>
372
+ ),
373
+ },
374
+ parameters: {
375
+ docs: {
376
+ description: {
377
+ story: "Change marker color for ordered lists using the `--list-marker-color` CSS variable.",
378
+ },
379
+ },
380
+ },
381
+ };
382
+
383
+ // =============================================================================
384
+ // Accessibility Examples
385
+ // =============================================================================
386
+
387
+ export const AccessibleNavigationList: Story = {
388
+ render: () => (
389
+ <nav>
390
+ <List variant="inline" role="list" aria-label="Main navigation">
391
+ <List.ListItem><a href="/">Home</a></List.ListItem>
392
+ <List.ListItem><a href="/about">About Us</a></List.ListItem>
393
+ <List.ListItem><a href="/services">Services</a></List.ListItem>
394
+ <List.ListItem><a href="/blog">Blog</a></List.ListItem>
395
+ <List.ListItem><a href="/contact">Contact</a></List.ListItem>
396
+ </List>
397
+ </nav>
398
+ ),
399
+ parameters: {
400
+ docs: {
401
+ description: {
402
+ story: "Accessible navigation menu using inline list variant with proper ARIA labeling and role restoration.",
403
+ },
404
+ },
405
+ },
406
+ };
407
+
408
+ export const AccessibleFeatureList: Story = {
409
+ render: () => (
410
+ <List variant="none" role="list" aria-label="Product features">
411
+ <List.ListItem>
412
+ <span role="img" aria-label="Checkmark">✓</span>
413
+ <span> Unlimited projects</span>
414
+ </List.ListItem>
415
+ <List.ListItem>
416
+ <span role="img" aria-label="Checkmark">✓</span>
417
+ <span> 24/7 customer support</span>
418
+ </List.ListItem>
419
+ <List.ListItem>
420
+ <span role="img" aria-label="Checkmark">✓</span>
421
+ <span> Advanced analytics dashboard</span>
422
+ </List.ListItem>
423
+ <List.ListItem>
424
+ <span role="img" aria-label="Checkmark">✓</span>
425
+ <span> Free updates forever</span>
426
+ </List.ListItem>
427
+ </List>
428
+ ),
429
+ parameters: {
430
+ docs: {
431
+ description: {
432
+ story: "Icon-based feature list with proper accessibility. Icons have `role='img'` and descriptive `aria-label`.",
433
+ },
434
+ },
435
+ },
436
+ };
437
+
438
+ // =============================================================================
439
+ // Complex Examples
440
+ // =============================================================================
441
+
442
+ export const RichContentList: Story = {
443
+ render: () => (
444
+ <List>
445
+ <List.ListItem>
446
+ <h3 style={{ margin: "0 0 0.5rem 0", color: "#0066cc" }}>Premium Package</h3>
447
+ <p style={{ margin: "0 0 0.5rem 0" }}>All features included with priority support and dedicated account manager.</p>
448
+ <button style={{ padding: "0.5rem 1rem", cursor: "pointer" }}>Learn More</button>
449
+ </List.ListItem>
450
+ <List.ListItem>
451
+ <h3 style={{ margin: "0 0 0.5rem 0", color: "#0066cc" }}>Standard Package</h3>
452
+ <p style={{ margin: "0 0 0.5rem 0" }}>Core features perfect for individuals and small teams.</p>
453
+ <button style={{ padding: "0.5rem 1rem", cursor: "pointer" }}>Learn More</button>
454
+ </List.ListItem>
455
+ <List.ListItem>
456
+ <h3 style={{ margin: "0 0 0.5rem 0", color: "#0066cc" }}>Basic Package</h3>
457
+ <p style={{ margin: "0 0 0.5rem 0" }}>Essential features to get started quickly.</p>
458
+ <button style={{ padding: "0.5rem 1rem", cursor: "pointer" }}>Learn More</button>
459
+ </List.ListItem>
460
+ </List>
461
+ ),
462
+ parameters: {
463
+ docs: {
464
+ description: {
465
+ story: "List items can contain complex content like headings, paragraphs, buttons, and images. Maintains semantic structure.",
466
+ },
467
+ },
468
+ },
469
+ };
470
+
471
+ export const NestedDefinitionList: Story = {
472
+ args: {
473
+ type: "dl",
474
+ children: (
475
+ <>
476
+ <List.ListItem type="dt">Web Development</List.ListItem>
477
+ <List.ListItem type="dd">
478
+ Creating and maintaining websites and web applications
479
+ <List type="dl">
480
+ <List.ListItem type="dt">Frontend</List.ListItem>
481
+ <List.ListItem type="dd">User interface and client-side logic</List.ListItem>
482
+ <List.ListItem type="dt">Backend</List.ListItem>
483
+ <List.ListItem type="dd">Server-side logic and database management</List.ListItem>
484
+ </List>
485
+ </List.ListItem>
486
+
487
+ <List.ListItem type="dt">Mobile Development</List.ListItem>
488
+ <List.ListItem type="dd">Building applications for mobile devices</List.ListItem>
489
+ </>
490
+ ),
491
+ },
492
+ parameters: {
493
+ docs: {
494
+ description: {
495
+ story: "Nested definition lists for hierarchical term-definition structures. Useful for complex glossaries.",
496
+ },
497
+ },
498
+ },
499
+ };
500
+
501
+ // =============================================================================
502
+ // Edge Cases & Testing
503
+ // =============================================================================
504
+
505
+ export const EmptyList: Story = {
506
+ render: () => <List aria-label="Empty list example">{undefined}</List>,
507
+ parameters: {
508
+ docs: {
509
+ description: {
510
+ story: "List with no children renders an empty list element. Still maintains semantic structure.",
511
+ },
512
+ },
513
+ },
514
+ };
515
+
516
+ export const SingleItemList: Story = {
53
517
  args: {
54
- ...UnstyledList.args,
55
- "data-list": "inline",
518
+ children: <List.ListItem>Single item in the list</List.ListItem>,
519
+ },
520
+ parameters: {
521
+ docs: {
522
+ description: {
523
+ story: "List with a single item. Valid semantic HTML, though consider if a list is necessary.",
524
+ },
525
+ },
526
+ },
527
+ };
528
+
529
+ export const LongList: Story = {
530
+ render: () => (
531
+ <List variant="compact">
532
+ {Array.from({ length: 20 }, (_, i) => (
533
+ <List.ListItem key={i}>Item {i + 1} - Lorem ipsum dolor sit amet</List.ListItem>
534
+ ))}
535
+ </List>
536
+ ),
537
+ parameters: {
538
+ docs: {
539
+ description: {
540
+ story: "Long list with many items. Uses compact variant to save space. Demonstrates performance with dynamic content.",
541
+ },
542
+ },
56
543
  },
57
- } as Story;
544
+ };