@chiralkit/design-system 0.1.0-alpha.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/chiralkit-ds/chiralkit-ds.css +1 -0
  4. package/dist/chiralkit-ds/chiralkit-ds.esm.js +1 -0
  5. package/dist/chiralkit-ds/index.esm.js +1 -0
  6. package/dist/chiralkit-ds/p-038fa008.entry.js +1 -0
  7. package/dist/chiralkit-ds/p-2fdc1012.entry.js +1 -0
  8. package/dist/chiralkit-ds/p-306ec33b.entry.js +1 -0
  9. package/dist/chiralkit-ds/p-3f704698.entry.js +1 -0
  10. package/dist/chiralkit-ds/p-41081d22.entry.js +1 -0
  11. package/dist/chiralkit-ds/p-7d7e5aac.entry.js +1 -0
  12. package/dist/chiralkit-ds/p-84b801f8.entry.js +1 -0
  13. package/dist/chiralkit-ds/p-a28c71b4.entry.js +1 -0
  14. package/dist/chiralkit-ds/p-be84312f.entry.js +1 -0
  15. package/dist/chiralkit-ds/p-c8015fe6.entry.js +1 -0
  16. package/dist/chiralkit-ds/p-d36a6bea.entry.js +1 -0
  17. package/dist/chiralkit-ds/p-e-glNjK6.js +2 -0
  18. package/dist/chiralkit-ds/p-f0f9ff61.entry.js +1 -0
  19. package/dist/cjs/chiralkit-ds.cjs.js +24 -0
  20. package/dist/cjs/ds-badge.cjs.entry.js +18 -0
  21. package/dist/cjs/ds-button.cjs.entry.js +26 -0
  22. package/dist/cjs/ds-card.cjs.entry.js +17 -0
  23. package/dist/cjs/ds-checkbox.cjs.entry.js +67 -0
  24. package/dist/cjs/ds-code-block.cjs.entry.js +39 -0
  25. package/dist/cjs/ds-dialog.cjs.entry.js +67 -0
  26. package/dist/cjs/ds-input.cjs.entry.js +50 -0
  27. package/dist/cjs/ds-loader.cjs.entry.js +26 -0
  28. package/dist/cjs/ds-select.cjs.entry.js +85 -0
  29. package/dist/cjs/ds-tabs.cjs.entry.js +138 -0
  30. package/dist/cjs/ds-textarea.cjs.entry.js +50 -0
  31. package/dist/cjs/ds-tooltip.cjs.entry.js +233 -0
  32. package/dist/cjs/index-mMvyq7U_.js +2018 -0
  33. package/dist/cjs/index.cjs.js +10 -0
  34. package/dist/cjs/loader.cjs.js +12 -0
  35. package/dist/collection/collection-manifest.json +24 -0
  36. package/dist/collection/components/ds-badge/ds-badge.css +36 -0
  37. package/dist/collection/components/ds-badge/ds-badge.js +93 -0
  38. package/dist/collection/components/ds-button/ds-button.css +66 -0
  39. package/dist/collection/components/ds-button/ds-button.js +197 -0
  40. package/dist/collection/components/ds-card/ds-card.css +12 -0
  41. package/dist/collection/components/ds-card/ds-card.js +68 -0
  42. package/dist/collection/components/ds-checkbox/ds-checkbox.css +22 -0
  43. package/dist/collection/components/ds-checkbox/ds-checkbox.js +339 -0
  44. package/dist/collection/components/ds-code-block/ds-code-block.css +65 -0
  45. package/dist/collection/components/ds-code-block/ds-code-block.js +162 -0
  46. package/dist/collection/components/ds-dialog/ds-dialog.css +30 -0
  47. package/dist/collection/components/ds-dialog/ds-dialog.js +313 -0
  48. package/dist/collection/components/ds-input/ds-input.css +38 -0
  49. package/dist/collection/components/ds-input/ds-input.js +353 -0
  50. package/dist/collection/components/ds-loader/ds-loader.css +94 -0
  51. package/dist/collection/components/ds-loader/ds-loader.js +149 -0
  52. package/dist/collection/components/ds-select/ds-select.css +69 -0
  53. package/dist/collection/components/ds-select/ds-select.js +235 -0
  54. package/dist/collection/components/ds-tabs/ds-tabs.css +59 -0
  55. package/dist/collection/components/ds-tabs/ds-tabs.js +248 -0
  56. package/dist/collection/components/ds-textarea/ds-textarea.css +41 -0
  57. package/dist/collection/components/ds-textarea/ds-textarea.js +342 -0
  58. package/dist/collection/components/ds-tooltip/ds-tooltip.css +31 -0
  59. package/dist/collection/components/ds-tooltip/ds-tooltip.js +318 -0
  60. package/dist/collection/components.js +2 -0
  61. package/dist/collection/index.js +1 -0
  62. package/dist/components/ds-badge.d.ts +11 -0
  63. package/dist/components/ds-badge.js +1 -0
  64. package/dist/components/ds-button.d.ts +11 -0
  65. package/dist/components/ds-button.js +1 -0
  66. package/dist/components/ds-card.d.ts +11 -0
  67. package/dist/components/ds-card.js +1 -0
  68. package/dist/components/ds-checkbox.d.ts +11 -0
  69. package/dist/components/ds-checkbox.js +1 -0
  70. package/dist/components/ds-code-block.d.ts +11 -0
  71. package/dist/components/ds-code-block.js +1 -0
  72. package/dist/components/ds-dialog.d.ts +11 -0
  73. package/dist/components/ds-dialog.js +1 -0
  74. package/dist/components/ds-input.d.ts +11 -0
  75. package/dist/components/ds-input.js +1 -0
  76. package/dist/components/ds-loader.d.ts +11 -0
  77. package/dist/components/ds-loader.js +1 -0
  78. package/dist/components/ds-select.d.ts +11 -0
  79. package/dist/components/ds-select.js +1 -0
  80. package/dist/components/ds-tabs.d.ts +11 -0
  81. package/dist/components/ds-tabs.js +1 -0
  82. package/dist/components/ds-textarea.d.ts +11 -0
  83. package/dist/components/ds-textarea.js +1 -0
  84. package/dist/components/ds-tooltip.d.ts +11 -0
  85. package/dist/components/ds-tooltip.js +1 -0
  86. package/dist/components/index.d.ts +35 -0
  87. package/dist/components/index.js +1 -0
  88. package/dist/components/p-DDUZow8F.js +1 -0
  89. package/dist/components/p-ZsYP0VBq.js +1 -0
  90. package/dist/components/p-k0ywxWpC.js +1 -0
  91. package/dist/esm/chiralkit-ds.js +20 -0
  92. package/dist/esm/ds-badge.entry.js +16 -0
  93. package/dist/esm/ds-button.entry.js +24 -0
  94. package/dist/esm/ds-card.entry.js +15 -0
  95. package/dist/esm/ds-checkbox.entry.js +65 -0
  96. package/dist/esm/ds-code-block.entry.js +37 -0
  97. package/dist/esm/ds-dialog.entry.js +65 -0
  98. package/dist/esm/ds-input.entry.js +48 -0
  99. package/dist/esm/ds-loader.entry.js +24 -0
  100. package/dist/esm/ds-select.entry.js +83 -0
  101. package/dist/esm/ds-tabs.entry.js +136 -0
  102. package/dist/esm/ds-textarea.entry.js +48 -0
  103. package/dist/esm/ds-tooltip.entry.js +231 -0
  104. package/dist/esm/index-e-glNjK6.js +2008 -0
  105. package/dist/esm/index.js +3 -0
  106. package/dist/esm/loader.js +10 -0
  107. package/dist/index.cjs.js +1 -0
  108. package/dist/index.js +1 -0
  109. package/dist/layouts/app-shell.css +84 -0
  110. package/dist/tests/a11y.js +55 -0
  111. package/dist/types/Users/alex/projects/MyGitHub/chiralkit/packages/design-system/.stencil/tests/a11y.d.ts +17 -0
  112. package/dist/types/components/ds-badge/ds-badge.d.ts +54 -0
  113. package/dist/types/components/ds-button/ds-button.d.ts +75 -0
  114. package/dist/types/components/ds-card/ds-card.d.ts +53 -0
  115. package/dist/types/components/ds-checkbox/ds-checkbox.d.ts +94 -0
  116. package/dist/types/components/ds-code-block/ds-code-block.d.ts +83 -0
  117. package/dist/types/components/ds-dialog/ds-dialog.d.ts +148 -0
  118. package/dist/types/components/ds-input/ds-input.d.ts +104 -0
  119. package/dist/types/components/ds-loader/ds-loader.d.ts +64 -0
  120. package/dist/types/components/ds-select/ds-select.d.ts +123 -0
  121. package/dist/types/components/ds-tabs/ds-tabs.d.ts +155 -0
  122. package/dist/types/components/ds-textarea/ds-textarea.d.ts +93 -0
  123. package/dist/types/components/ds-tooltip/ds-tooltip.d.ts +26 -0
  124. package/dist/types/components.d.ts +3068 -0
  125. package/dist/types/index.d.ts +1 -0
  126. package/dist/types/stencil-public-runtime.d.ts +1861 -0
  127. package/docs.json +2112 -0
  128. package/loader/cdn.js +1 -0
  129. package/loader/index.cjs.js +1 -0
  130. package/loader/index.d.ts +24 -0
  131. package/loader/index.es2017.js +1 -0
  132. package/loader/index.js +2 -0
  133. package/package.json +78 -0
  134. package/react/components/ds-badge.tsx +25 -0
  135. package/react/components/ds-button.tsx +25 -0
  136. package/react/components/ds-card.tsx +25 -0
  137. package/react/components/ds-checkbox.tsx +25 -0
  138. package/react/components/ds-code-block.tsx +25 -0
  139. package/react/components/ds-dialog.tsx +31 -0
  140. package/react/components/ds-input.tsx +25 -0
  141. package/react/components/ds-loader.tsx +25 -0
  142. package/react/components/ds-select.tsx +25 -0
  143. package/react/components/ds-tabs.tsx +25 -0
  144. package/react/components/ds-textarea.tsx +25 -0
  145. package/react/components/ds-tooltip.tsx +25 -0
  146. package/react/components.ts +162 -0
package/docs.json ADDED
@@ -0,0 +1,2112 @@
1
+ {
2
+ "timestamp": "2026-09-25T23:38:41",
3
+ "compiler": {
4
+ "name": "@stencil/core",
5
+ "version": "4.43.5",
6
+ "typescriptVersion": "5.8.3"
7
+ },
8
+ "components": [
9
+ {
10
+ "filePath": "src/components/ds-badge/ds-badge.tsx",
11
+ "encapsulation": "shadow",
12
+ "tag": "ds-badge",
13
+ "readme": "# ds-badge\n\n\n",
14
+ "docs": "## Accessibility\n\n**Category:** static-display\n**APG pattern:** N/A — non-interactive text label.\n\n**Keyboard interactions:**\n- Tab: N/A — the badge is not focusable and does not appear in tab order.\n- Enter: N/A.\n- Escape: N/A.\n- Arrow keys: N/A.\n- Printable characters: N/A.\n\n**ARIA:**\n- Roles used: none — renders a plain `<span>` around a `<slot />`. The\n `variant` prop is a purely visual axis and MUST NOT be the sole carrier\n of information (color/style alone fails WCAG 1.4.1 Use of Color); the\n textual content inside the slot must convey the same meaning.\n- State attributes: none.\n- Labeling strategy: visible text via `<slot />`. Consumers place the\n readable label directly inside the tag.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On activate/open: N/A — non-interactive.\n- On close/deactivate: N/A.\n- Focus indicator: N/A — the host is not focusable. If a consumer wraps\n `ds-badge` in an interactive element (e.g. `<button>`, `<a>`), that\n wrapper owns the focus indicator via the DS `--ds-color-focus` token\n and its own `:focus-visible` rule.\n\n**Motion:**\n- Animations: none.\n- Reduced-motion behavior: N/A.\n\n**Contrast:**\n- Text: inherits `color: inherit` / `currentColor` from the host page and\n the variant-specific style; not verified in isolation here. Consumers\n are responsible for confirming ≥ 4.5:1 (WCAG 1.4.3) against the surface\n the badge is placed on.\n- Non-text: no state-conveying icons or borders that need the 3:1\n non-text contrast threshold.\n\n**Screen reader announcement:**\n- Rendered state: announces the slot text as inline content within its\n surrounding context (no role means AT reads it as plain text). The\n `variant` value is not announced — that is intentional; the label text\n is the source of truth for meaning.\n- State change: N/A — no dynamic state owned by this component.",
15
+ "docsTags": [],
16
+ "usage": {},
17
+ "props": [
18
+ {
19
+ "name": "variant",
20
+ "type": "\"agent\" | \"config\" | \"neutral\" | \"recipe\" | \"ui-component\"",
21
+ "complexType": {
22
+ "original": "| \"neutral\"\n | \"ui-component\"\n | \"recipe\"\n | \"agent\"\n | \"config\"",
23
+ "resolved": "\"agent\" | \"config\" | \"neutral\" | \"recipe\" | \"ui-component\"",
24
+ "references": {}
25
+ },
26
+ "mutable": false,
27
+ "attr": "variant",
28
+ "reflectToAttr": false,
29
+ "docs": "",
30
+ "docsTags": [
31
+ {
32
+ "name": "default",
33
+ "text": "\"neutral\""
34
+ }
35
+ ],
36
+ "default": "\"neutral\"",
37
+ "values": [
38
+ {
39
+ "value": "agent",
40
+ "type": "string"
41
+ },
42
+ {
43
+ "value": "config",
44
+ "type": "string"
45
+ },
46
+ {
47
+ "value": "neutral",
48
+ "type": "string"
49
+ },
50
+ {
51
+ "value": "recipe",
52
+ "type": "string"
53
+ },
54
+ {
55
+ "value": "ui-component",
56
+ "type": "string"
57
+ }
58
+ ],
59
+ "optional": false,
60
+ "required": false,
61
+ "getter": false,
62
+ "setter": false
63
+ }
64
+ ],
65
+ "methods": [],
66
+ "events": [],
67
+ "listeners": [],
68
+ "styles": [],
69
+ "slots": [],
70
+ "parts": [],
71
+ "states": [],
72
+ "dependents": [],
73
+ "dependencies": [],
74
+ "dependencyGraph": {}
75
+ },
76
+ {
77
+ "filePath": "src/components/ds-button/ds-button.tsx",
78
+ "encapsulation": "shadow",
79
+ "tag": "ds-button",
80
+ "readme": "# ds-button\n\n\n",
81
+ "docs": "## Accessibility\n\n**Category:** interactive-display\n**APG pattern:** Button — https://www.w3.org/WAI/ARIA/apg/patterns/button/\n(satisfied natively by the underlying `<button>` element). When `href` is\nset, the component renders `<a href>` instead — a link, not a button — and\nthat surface follows native `<a>` semantics rather than the Button pattern.\n\n**Keyboard interactions:**\n- Tab: moves focus to the internal `<button>` or `<a>` (shadow DOM does not\n interrupt tab order).\n- Enter: activates (fires click on `<button>`, navigates on `<a>`).\n- Space: activates the `<button>` variant only (native behavior); on the\n `<a>` variant Space scrolls the page as usual.\n- Escape: N/A — no dismissible state owned by this component.\n- Arrow keys: N/A.\n- Printable characters: N/A.\n\n**ARIA:**\n- Roles used: none explicit — the native `<button>` / `<a href>` supplies\n the implicit `button` / `link` role.\n- State attributes: `disabled` (native attribute on `<button>`, not\n `aria-disabled`). The `<a>` variant does not accept `disabled` — a\n disabled navigation is a spec smell (see spec §\"Button vs Link\"); if a\n link needs a disabled state, model it as a `<button>` action instead.\n- Labeling strategy: visible text via `<slot />`. Consumers MUST place\n readable text (or a labeled icon) inside the tag. An empty slot leaves\n the button/link without an accessible name and fails\n `button-name` / `link-name` axe rules. Icon-only usage is out of contract\n for `ds-button`; use a future `ds-icon-button` with a required\n `aria-label` prop when that lands.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On activate: focus stays on the element (native click behavior; the\n component does not move focus on its own).\n- On close/deactivate: N/A.\n- Focus indicator: 2px `outline` in `var(--ds-color-focus)` with 2px\n `outline-offset`, applied via `:focus-visible` — replaces the browser\n default so both `<button>` and `<a>` variants use the same DS ring\n (spec universal rule 3, WCAG 1.4.11 non-text contrast ≥ 3:1).\n\n**Motion:**\n- Animations: 150ms `background-color` ease-in-out transition on\n `primary`/`secondary` variants (hover).\n- Reduced-motion behavior: N/A — 150ms is below the spec's 200ms threshold\n for `prefers-reduced-motion` handling, and the transition animates color\n only (no motion of position, scale, or opacity).\n\n**Contrast:**\n- Text: `primary` and `secondary` variants pair `--ds-color-{primary,secondary}`\n with `--ds-color-text-on-{primary,secondary}` — the token pairs are\n authored to meet WCAG 2.1 AA (≥ 4.5:1). The `ghost` variant inherits\n `color: inherit` and pins `opacity: 0.85`, so its effective contrast\n depends on the consumer's surface — verify per site.\n- Non-text (border on `ghost`): 1px `currentColor`; contrast tracks the\n text color 1:1, subject to the same host-page caveat.\n\n**Screen reader announcement:**\n- Rendered state: announces the slot text followed by \"button\" (or \"link\"\n for the `href` variant), plus \"dimmed\" / \"unavailable\" when `disabled`\n is set (browser/AT dependent wording).\n- State change: N/A — this component does not own toggle state. A pressed\n toggle needs `aria-pressed`, which is out of scope here; model that as\n a distinct component or extend the API deliberately per the spec.",
82
+ "docsTags": [],
83
+ "usage": {},
84
+ "props": [
85
+ {
86
+ "name": "disabled",
87
+ "type": "boolean",
88
+ "complexType": {
89
+ "original": "boolean",
90
+ "resolved": "boolean",
91
+ "references": {}
92
+ },
93
+ "mutable": false,
94
+ "attr": "disabled",
95
+ "reflectToAttr": false,
96
+ "docs": "",
97
+ "docsTags": [
98
+ {
99
+ "name": "default",
100
+ "text": "false"
101
+ }
102
+ ],
103
+ "default": "false",
104
+ "values": [
105
+ {
106
+ "type": "boolean"
107
+ }
108
+ ],
109
+ "optional": false,
110
+ "required": false,
111
+ "getter": false,
112
+ "setter": false
113
+ },
114
+ {
115
+ "name": "href",
116
+ "type": "string | undefined",
117
+ "complexType": {
118
+ "original": "string",
119
+ "resolved": "string | undefined",
120
+ "references": {}
121
+ },
122
+ "mutable": false,
123
+ "attr": "href",
124
+ "reflectToAttr": false,
125
+ "docs": "",
126
+ "docsTags": [],
127
+ "values": [
128
+ {
129
+ "type": "string"
130
+ },
131
+ {
132
+ "type": "undefined"
133
+ }
134
+ ],
135
+ "optional": true,
136
+ "required": false,
137
+ "getter": false,
138
+ "setter": false
139
+ },
140
+ {
141
+ "name": "size",
142
+ "type": "\"lg\" | \"md\"",
143
+ "complexType": {
144
+ "original": "\"md\" | \"lg\"",
145
+ "resolved": "\"lg\" | \"md\"",
146
+ "references": {}
147
+ },
148
+ "mutable": false,
149
+ "attr": "size",
150
+ "reflectToAttr": false,
151
+ "docs": "",
152
+ "docsTags": [
153
+ {
154
+ "name": "default",
155
+ "text": "\"md\""
156
+ }
157
+ ],
158
+ "default": "\"md\"",
159
+ "values": [
160
+ {
161
+ "value": "lg",
162
+ "type": "string"
163
+ },
164
+ {
165
+ "value": "md",
166
+ "type": "string"
167
+ }
168
+ ],
169
+ "optional": false,
170
+ "required": false,
171
+ "getter": false,
172
+ "setter": false
173
+ },
174
+ {
175
+ "name": "type",
176
+ "type": "\"button\" | \"reset\" | \"submit\"",
177
+ "complexType": {
178
+ "original": "\"button\" | \"submit\" | \"reset\"",
179
+ "resolved": "\"button\" | \"reset\" | \"submit\"",
180
+ "references": {}
181
+ },
182
+ "mutable": false,
183
+ "attr": "type",
184
+ "reflectToAttr": false,
185
+ "docs": "",
186
+ "docsTags": [
187
+ {
188
+ "name": "default",
189
+ "text": "\"button\""
190
+ }
191
+ ],
192
+ "default": "\"button\"",
193
+ "values": [
194
+ {
195
+ "value": "button",
196
+ "type": "string"
197
+ },
198
+ {
199
+ "value": "reset",
200
+ "type": "string"
201
+ },
202
+ {
203
+ "value": "submit",
204
+ "type": "string"
205
+ }
206
+ ],
207
+ "optional": false,
208
+ "required": false,
209
+ "getter": false,
210
+ "setter": false
211
+ },
212
+ {
213
+ "name": "variant",
214
+ "type": "\"ghost\" | \"primary\" | \"secondary\"",
215
+ "complexType": {
216
+ "original": "\"primary\" | \"secondary\" | \"ghost\"",
217
+ "resolved": "\"ghost\" | \"primary\" | \"secondary\"",
218
+ "references": {}
219
+ },
220
+ "mutable": false,
221
+ "attr": "variant",
222
+ "reflectToAttr": false,
223
+ "docs": "",
224
+ "docsTags": [
225
+ {
226
+ "name": "default",
227
+ "text": "\"primary\""
228
+ }
229
+ ],
230
+ "default": "\"primary\"",
231
+ "values": [
232
+ {
233
+ "value": "ghost",
234
+ "type": "string"
235
+ },
236
+ {
237
+ "value": "primary",
238
+ "type": "string"
239
+ },
240
+ {
241
+ "value": "secondary",
242
+ "type": "string"
243
+ }
244
+ ],
245
+ "optional": false,
246
+ "required": false,
247
+ "getter": false,
248
+ "setter": false
249
+ }
250
+ ],
251
+ "methods": [],
252
+ "events": [],
253
+ "listeners": [],
254
+ "styles": [],
255
+ "slots": [],
256
+ "parts": [],
257
+ "states": [],
258
+ "dependents": [],
259
+ "dependencies": [],
260
+ "dependencyGraph": {}
261
+ },
262
+ {
263
+ "filePath": "src/components/ds-card/ds-card.tsx",
264
+ "encapsulation": "shadow",
265
+ "tag": "ds-card",
266
+ "readme": "# ds-card\n\n\n",
267
+ "docs": "## Accessibility\n\n**Category:** static-display\n**APG pattern:** N/A — a container surface with no interactive\nbehavior of its own. If a consumer nests interactive elements\ninside (button, link, form field), those elements satisfy their\nown a11y bucket independently.\n\n**Keyboard interactions:**\n- Tab / Shift+Tab: N/A — the card itself is not focusable. Any\n interactive descendant carries its own tab semantics.\n- Enter / Space / Arrow / Escape / Printable: N/A.\n\n**ARIA:**\n- Roles used: none. `<ds-card>` is a purely visual grouping and\n deliberately does not carry `role=\"region\"` — that would demand\n a labelledby target, which would only be correct in a subset of\n uses. Consumers that need a labeled landmark should render a\n `<section aria-labelledby>` around the card.\n- State attributes: none.\n- Labeling strategy: none applied by the component; consumer's\n heading structure inside the slot supplies the accessible name\n when needed.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- Focus indicator: N/A — the card itself is not focusable.\n\n**Motion:**\n- Animations: none.\n- Reduced-motion behavior: N/A.\n\n**Contrast:**\n- Text: inherits `color: inherit` / `currentColor`; the card does\n not impose a text color, so contrast is the consumer theme's\n responsibility.\n- Non-text (border, subtle background tint): both derived from\n `color-mix(in oklch, currentColor N%, transparent)`, matching\n the pattern used by `ds-input` and `ds-select`. WCAG 1.4.11\n (3:1 non-text contrast) is met in themes where the surface has\n enough delta against the page background; the component does\n not override the consumer's palette to force it.\n\n**Screen reader announcement:**\n- Rendered state: no announcement of the card itself. AT\n navigates to the slotted content directly, using whatever\n heading and landmark structure the consumer places inside.\n- State change: N/A.",
268
+ "docsTags": [],
269
+ "usage": {},
270
+ "props": [],
271
+ "methods": [],
272
+ "events": [],
273
+ "listeners": [],
274
+ "styles": [],
275
+ "slots": [],
276
+ "parts": [],
277
+ "states": [],
278
+ "dependents": [],
279
+ "dependencies": [],
280
+ "dependencyGraph": {}
281
+ },
282
+ {
283
+ "filePath": "src/components/ds-checkbox/ds-checkbox.tsx",
284
+ "encapsulation": "shadow",
285
+ "tag": "ds-checkbox",
286
+ "readme": "# ds-checkbox\n\n\n",
287
+ "docs": "## Accessibility\n\n**Category:** form-field\n**APG pattern:** N/A — native element. This wraps a native\n`<input type=\"checkbox\">`; the browser already implements the\ncheckbox role and its state semantics. Reference:\nhttps://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox\n\nNote: `ds-checkbox` intentionally does NOT reach for the WAI-ARIA\nAPG \"tri-state checkbox\" pattern (indeterminate + on + off) as a\nscratch-built ARIA widget. The native input already exposes the\n`indeterminate` DOM property and browsers report it to AT\ncorrectly; the `indeterminate` prop here forwards to that DOM\nproperty so the native mechanism carries the semantics.\n\n**Keyboard interactions:**\n- Tab: moves focus to the native `<input type=\"checkbox\">`.\n- Space: toggles the checked state (native behavior).\n- Enter: no native effect on a checkbox (unlike button). Form\n submission triggered by Enter comes from the enclosing form's\n default submit button, not from the checkbox itself.\n\n**ARIA:**\n- Roles used: none explicit — the native checkbox supplies the\n implicit `checkbox` role.\n- State attributes: `checked` (DOM property, kept in sync via\n componentDidRender because Stencil does not JSX-forward the\n attribute cleanly for controlled use), `disabled` (native\n attribute, not `aria-disabled`), `aria-invalid` (from the\n `invalid` prop), `aria-required` (from the `required` prop),\n `aria-describedby` (from the `describedBy` prop).\n- Labeling strategy: `aria-label` set from the `label` prop onto\n the internal checkbox. This is the **canonical, recommended**\n mode. Wrapping the host in a light-DOM `<label>` also produces\n an accessible name in Chromium via flattened-tree resolution —\n same secondary mode documented on `ds-input`.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On toggle: focus remains on the native checkbox.\n- Focus indicator: browser default `:focus-visible` ring, kept on\n purpose until the DS ships a themed focus utility using\n `--ds-color-focus`. Not overridden by `ds-checkbox.css`.\n\n**Motion:**\n- Animations: none.\n- Reduced-motion behavior: N/A.\n\n**Contrast:**\n- Text: N/A — the checkbox itself renders no text (labels are\n supplied by the consumer via `label` prop or wrapping <label>).\n- Non-text (the box and its check glyph): browser default rendering\n is kept on purpose (no `appearance: none` override); this\n preserves the OS/browser accessibility rendering that AT and\n forced-color modes rely on. A themed override is a future\n decision once the DS commits to a checkbox visual language that\n still passes 3:1 non-text contrast in every theme.\n\n**Screen reader announcement:**\n- Rendered state: announces the `label` prop text as the\n accessible name, followed by \"checkbox\", followed by \"checked\"\n / \"not checked\" / \"mixed\" per the current DOM state.\n- State change: on toggle, AT announces the new state (native\n behavior); no `aria-live` added.\n\n**Consumer contract:**\n- `checked` is the source of truth for controlled use. Reading\n `event.detail` from `dsChange` gives the new state; the internal\n input is kept in sync via a Watch + a re-sync in componentDidRender.\n- `indeterminate` is a visual/AT state, not a value — it is NOT\n submitted with a form and clears on the next user toggle.",
288
+ "docsTags": [],
289
+ "usage": {},
290
+ "props": [
291
+ {
292
+ "name": "checked",
293
+ "type": "boolean",
294
+ "complexType": {
295
+ "original": "boolean",
296
+ "resolved": "boolean",
297
+ "references": {}
298
+ },
299
+ "mutable": false,
300
+ "attr": "checked",
301
+ "reflectToAttr": false,
302
+ "docs": "",
303
+ "docsTags": [
304
+ {
305
+ "name": "default",
306
+ "text": "false"
307
+ }
308
+ ],
309
+ "default": "false",
310
+ "values": [
311
+ {
312
+ "type": "boolean"
313
+ }
314
+ ],
315
+ "optional": false,
316
+ "required": false,
317
+ "getter": false,
318
+ "setter": false
319
+ },
320
+ {
321
+ "name": "describedBy",
322
+ "type": "string | undefined",
323
+ "complexType": {
324
+ "original": "string",
325
+ "resolved": "string | undefined",
326
+ "references": {}
327
+ },
328
+ "mutable": false,
329
+ "attr": "described-by",
330
+ "reflectToAttr": false,
331
+ "docs": "",
332
+ "docsTags": [],
333
+ "values": [
334
+ {
335
+ "type": "string"
336
+ },
337
+ {
338
+ "type": "undefined"
339
+ }
340
+ ],
341
+ "optional": true,
342
+ "required": false,
343
+ "getter": false,
344
+ "setter": false
345
+ },
346
+ {
347
+ "name": "disabled",
348
+ "type": "boolean",
349
+ "complexType": {
350
+ "original": "boolean",
351
+ "resolved": "boolean",
352
+ "references": {}
353
+ },
354
+ "mutable": false,
355
+ "attr": "disabled",
356
+ "reflectToAttr": false,
357
+ "docs": "",
358
+ "docsTags": [
359
+ {
360
+ "name": "default",
361
+ "text": "false"
362
+ }
363
+ ],
364
+ "default": "false",
365
+ "values": [
366
+ {
367
+ "type": "boolean"
368
+ }
369
+ ],
370
+ "optional": false,
371
+ "required": false,
372
+ "getter": false,
373
+ "setter": false
374
+ },
375
+ {
376
+ "name": "indeterminate",
377
+ "type": "boolean",
378
+ "complexType": {
379
+ "original": "boolean",
380
+ "resolved": "boolean",
381
+ "references": {}
382
+ },
383
+ "mutable": false,
384
+ "attr": "indeterminate",
385
+ "reflectToAttr": false,
386
+ "docs": "",
387
+ "docsTags": [
388
+ {
389
+ "name": "default",
390
+ "text": "false"
391
+ }
392
+ ],
393
+ "default": "false",
394
+ "values": [
395
+ {
396
+ "type": "boolean"
397
+ }
398
+ ],
399
+ "optional": false,
400
+ "required": false,
401
+ "getter": false,
402
+ "setter": false
403
+ },
404
+ {
405
+ "name": "invalid",
406
+ "type": "boolean",
407
+ "complexType": {
408
+ "original": "boolean",
409
+ "resolved": "boolean",
410
+ "references": {}
411
+ },
412
+ "mutable": false,
413
+ "attr": "invalid",
414
+ "reflectToAttr": false,
415
+ "docs": "",
416
+ "docsTags": [
417
+ {
418
+ "name": "default",
419
+ "text": "false"
420
+ }
421
+ ],
422
+ "default": "false",
423
+ "values": [
424
+ {
425
+ "type": "boolean"
426
+ }
427
+ ],
428
+ "optional": false,
429
+ "required": false,
430
+ "getter": false,
431
+ "setter": false
432
+ },
433
+ {
434
+ "name": "label",
435
+ "type": "string | undefined",
436
+ "complexType": {
437
+ "original": "string",
438
+ "resolved": "string | undefined",
439
+ "references": {}
440
+ },
441
+ "mutable": false,
442
+ "attr": "label",
443
+ "reflectToAttr": false,
444
+ "docs": "",
445
+ "docsTags": [],
446
+ "values": [
447
+ {
448
+ "type": "string"
449
+ },
450
+ {
451
+ "type": "undefined"
452
+ }
453
+ ],
454
+ "optional": true,
455
+ "required": false,
456
+ "getter": false,
457
+ "setter": false
458
+ },
459
+ {
460
+ "name": "name",
461
+ "type": "string | undefined",
462
+ "complexType": {
463
+ "original": "string",
464
+ "resolved": "string | undefined",
465
+ "references": {}
466
+ },
467
+ "mutable": false,
468
+ "attr": "name",
469
+ "reflectToAttr": false,
470
+ "docs": "",
471
+ "docsTags": [],
472
+ "values": [
473
+ {
474
+ "type": "string"
475
+ },
476
+ {
477
+ "type": "undefined"
478
+ }
479
+ ],
480
+ "optional": true,
481
+ "required": false,
482
+ "getter": false,
483
+ "setter": false
484
+ },
485
+ {
486
+ "name": "required",
487
+ "type": "boolean",
488
+ "complexType": {
489
+ "original": "boolean",
490
+ "resolved": "boolean",
491
+ "references": {}
492
+ },
493
+ "mutable": false,
494
+ "attr": "required",
495
+ "reflectToAttr": false,
496
+ "docs": "",
497
+ "docsTags": [
498
+ {
499
+ "name": "default",
500
+ "text": "false"
501
+ }
502
+ ],
503
+ "default": "false",
504
+ "values": [
505
+ {
506
+ "type": "boolean"
507
+ }
508
+ ],
509
+ "optional": false,
510
+ "required": false,
511
+ "getter": false,
512
+ "setter": false
513
+ },
514
+ {
515
+ "name": "value",
516
+ "type": "string | undefined",
517
+ "complexType": {
518
+ "original": "string",
519
+ "resolved": "string | undefined",
520
+ "references": {}
521
+ },
522
+ "mutable": false,
523
+ "attr": "value",
524
+ "reflectToAttr": false,
525
+ "docs": "",
526
+ "docsTags": [],
527
+ "values": [
528
+ {
529
+ "type": "string"
530
+ },
531
+ {
532
+ "type": "undefined"
533
+ }
534
+ ],
535
+ "optional": true,
536
+ "required": false,
537
+ "getter": false,
538
+ "setter": false
539
+ }
540
+ ],
541
+ "methods": [],
542
+ "events": [
543
+ {
544
+ "event": "dsChange",
545
+ "detail": "boolean",
546
+ "bubbles": true,
547
+ "complexType": {
548
+ "original": "boolean",
549
+ "resolved": "boolean",
550
+ "references": {}
551
+ },
552
+ "cancelable": true,
553
+ "composed": true,
554
+ "docs": "",
555
+ "docsTags": []
556
+ }
557
+ ],
558
+ "listeners": [],
559
+ "styles": [],
560
+ "slots": [],
561
+ "parts": [],
562
+ "states": [],
563
+ "dependents": [],
564
+ "dependencies": [],
565
+ "dependencyGraph": {}
566
+ },
567
+ {
568
+ "filePath": "src/components/ds-code-block/ds-code-block.tsx",
569
+ "encapsulation": "shadow",
570
+ "tag": "ds-code-block",
571
+ "readme": "# ds-code-block\n\n\n",
572
+ "docs": "## Accessibility\n\n**Category:** interactive-display\n**APG pattern:** Button — https://www.w3.org/WAI/ARIA/apg/patterns/button/\n(for the internal copy control; the code readout itself is static text).\n\n**Keyboard interactions:**\n- Tab: moves focus into the internal copy `<button>`; the code readout\n (`<pre><code>`) is not focusable itself, but its container is\n horizontally scrollable and remains reachable via the browser's caret\n browsing / find-in-page path.\n- Enter: activates the copy button (writes `code` to the clipboard).\n- Space: activates the copy button (native `<button>` behavior).\n- Escape: N/A — the \"Copied\" state auto-clears after 1.4s; no dismissible\n modal state.\n- Arrow keys: N/A.\n- Printable characters: N/A.\n\n**ARIA:**\n- Roles used: none explicit — the native `<button>` supplies the implicit\n `button` role; `<pre>` and `<code>` supply their semantic roles.\n- State attributes: none. The `copied` flag lives only in the button's\n accessible name (see below); it is intentionally not surfaced via\n `aria-pressed` because it is not a toggle — it is a transient\n post-action confirmation.\n- Labeling strategy: `aria-label` on the copy button — \"Copy code\" in the\n resting state, \"Copied\" while the confirmation is visible. This is\n authoritative because the button carries both an icon and the words\n \"Copy\" / \"Copied\", and mixed icon+text needs an explicit accessible\n name to avoid AT reading the SVG as a separate node.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On activate: focus stays on the copy button (clipboard write is\n synchronous from the user's perspective; no focus is moved).\n- On close/deactivate: N/A — no popup or overlay to close.\n- Focus indicator: 2px `outline` in `var(--ds-color-focus)` with 2px\n `outline-offset`, applied to `.ds-code-block__copy:focus-visible`. The\n readout itself is not focusable and has no focus indicator by design.\n\n**Motion:**\n- Animations: 120ms `color` / `border-color` ease transition on the copy\n button (hover/focus).\n- Reduced-motion behavior: N/A — 120ms is below the spec's 200ms\n threshold, and the transition animates color only.\n\n**Contrast:**\n- Text (code readout): inherits `color: currentColor`; contrast depends\n on the host page's text color vs. the block's tinted background\n (`color-mix(currentColor 4%, transparent)`). Verify per site.\n- Text (copy button): `color-mix(in oklch, currentColor 70%, transparent)`\n at rest, `currentColor` on hover. The 70%-mixed resting color can drop\n below 4.5:1 on low-contrast surfaces — audit per usage site, and lean\n on the hover/focus states (both restore full `currentColor`) as the\n accessible fallback.\n- Non-text (button border, language tag border-bottom): both use\n `color-mix(currentColor <15|12>%, transparent)` — decorative separators,\n they do not convey state, so the 3:1 non-text contrast rule does not\n apply. Focus and hover borders shift up to 30% for clearer edges.\n\n**Screen reader announcement:**\n- Rendered state: announces \"Copy code, button\" (the `aria-label`), then\n the code content when the user navigates into the `<pre><code>` block\n (usually announced as a code block on VoiceOver).\n- State change: after clicking Copy, the button's `aria-label` flips to\n \"Copied\"; AT will announce this on the next focus or re-read of the\n button, but NOT proactively — there is no `aria-live` region. This is\n deliberate per spec §\"What we explicitly do NOT do\" (avoid live-region\n overuse), and the trade-off is that a screen-reader-only user does not\n get an unsolicited confirmation. If a future review decides that\n confirmation must be audible, add a visually-hidden\n `aria-live=\"polite\"` element whose text toggles on `copied`.",
573
+ "docsTags": [],
574
+ "usage": {},
575
+ "props": [
576
+ {
577
+ "name": "code",
578
+ "type": "string",
579
+ "complexType": {
580
+ "original": "string",
581
+ "resolved": "string",
582
+ "references": {}
583
+ },
584
+ "mutable": false,
585
+ "attr": "code",
586
+ "reflectToAttr": false,
587
+ "docs": "",
588
+ "docsTags": [],
589
+ "values": [
590
+ {
591
+ "type": "string"
592
+ }
593
+ ],
594
+ "optional": false,
595
+ "required": true,
596
+ "getter": false,
597
+ "setter": false
598
+ },
599
+ {
600
+ "name": "language",
601
+ "type": "string",
602
+ "complexType": {
603
+ "original": "string",
604
+ "resolved": "string",
605
+ "references": {}
606
+ },
607
+ "mutable": false,
608
+ "attr": "language",
609
+ "reflectToAttr": false,
610
+ "docs": "",
611
+ "docsTags": [
612
+ {
613
+ "name": "default",
614
+ "text": "\"bash\""
615
+ }
616
+ ],
617
+ "default": "\"bash\"",
618
+ "values": [
619
+ {
620
+ "type": "string"
621
+ }
622
+ ],
623
+ "optional": false,
624
+ "required": false,
625
+ "getter": false,
626
+ "setter": false
627
+ }
628
+ ],
629
+ "methods": [],
630
+ "events": [],
631
+ "listeners": [],
632
+ "styles": [],
633
+ "slots": [],
634
+ "parts": [],
635
+ "states": [],
636
+ "dependents": [],
637
+ "dependencies": [],
638
+ "dependencyGraph": {}
639
+ },
640
+ {
641
+ "filePath": "src/components/ds-dialog/ds-dialog.tsx",
642
+ "encapsulation": "shadow",
643
+ "tag": "ds-dialog",
644
+ "readme": "# ds-dialog\n\n\n",
645
+ "docs": "## Accessibility\n\n**Category:** state-machine\n**APG pattern:** https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/\n\nThis component wraps the **native `<dialog>` element** rather than\nscratch-building the APG pattern on top of a `<div role=\"dialog\">`.\n`<dialog>` opened via `showModal()` gives us — from the browser,\nverified by the platform, not by us:\n\n- Focus trap: Tab / Shift+Tab cycle only through focusable\n descendants (including slotted light-DOM descendants; the flattened\n accessibility tree is what the trap operates on).\n- Escape: closes the dialog and returns focus to the previously\n focused element (native, not implemented here).\n- Inert background: everything outside the dialog is inert while it\n is open — no mouse, no keyboard, not part of the a11y tree.\n- Return focus: on close, focus returns to whatever element had it\n before `showModal()` — native, not implemented here.\n- Initial focus: browser auto-focuses the first `autofocus` element\n inside, or the first focusable if none — native.\n- `role=\"dialog\"` and `aria-modal=\"true\"` semantics: implicit on\n `<dialog>`, no ARIA needed from us.\n\nThis is the deliberate answer to the a11y spec §D warning about\nscratch-building Tier 2 components: the native element removes the\n\"compiles, axe passes, screen-reader user gets trapped\" failure\nmode by delegating the state machine to the platform.\n\n**Keyboard interactions (all handled by the native element unless\nnoted otherwise):**\n- Tab: cycles focus within the dialog's focusable descendants\n (native focus trap).\n- Shift+Tab: reverse cycle (native).\n- Escape: closes the dialog and fires the `close` event (native).\n Consumers who need to prevent dismissal on Escape (destructive\n flows: e.g. an unsaved-changes guard) must call\n `event.preventDefault()` inside their own `keydown` listener on\n the dialog before it reaches the browser — that is an escape\n hatch, not a default we impose.\n- Enter / Space: no special dialog behavior; forwarded to\n whatever descendant has focus (a button will activate).\n- Home / End / Arrow keys: no special dialog behavior; forwarded\n to descendants.\n- Printable characters: forwarded to descendants (e.g. typing\n inside a slotted `<ds-input>`).\n\n**ARIA attributes and value triggers:**\n- Implicit `role=\"dialog\"` on the native `<dialog>`.\n- Implicit `aria-modal=\"true\"` when opened via `showModal()`\n (which is what this component always uses; `show()` — the\n non-modal form — is intentionally not exposed in v1).\n- `aria-label` set from the `label` prop onto the `<dialog>`.\n Consumers who prefer an in-content title can pass a\n `labelledBy` prop instead, whose value is the id of a heading\n element they render inside the slot — `aria-labelledby`\n resolves that id through the flattened tree.\n- `aria-describedby` from the `describedBy` prop, resolving a\n light-DOM id of a descriptive block (e.g. the dialog body copy\n when the label is short).\n\n**Focus lifecycle:**\n- Opening: `showModal()` moves focus to the first `autofocus`\n element inside, or the first focusable if none. Consumers who\n want a specific initial focus target should mark that element\n with `autofocus`.\n- While open: focus is trapped within the flattened tree of the\n `<dialog>`; Tab / Shift+Tab cycle through slotted descendants.\n Focus cannot escape into the inert background.\n- Closing: `close()` (either from Escape, from a form-submit with\n `method=\"dialog\"`, from a light-dismiss backdrop click handler\n the consumer wires up, or from `open=false`) returns focus to\n the element that had it immediately before `showModal()` was\n called. The `dsClose` event fires after focus has been restored.\n\n**ARIA labelling contract (choose one):**\n- **`label`** (string) — sets `aria-label` on the dialog. Simplest\n for short titles.\n- **`labelledBy`** (id) — sets `aria-labelledby` to reference a\n heading rendered inside the slot. Preferred when the dialog has\n a visible title so the accessible name matches the visible name.\n\nIf both are omitted, axe reports `dialog-name` — the dialog has no\naccessible name. The a11y test for this component asserts that at\nleast one of the two is provided.\n\n**Motion:**\n- Animations: none applied by the component. Consumers who want an\n entrance transition can style `::backdrop` and `dialog[open]`\n with their own animation, gated on `@media\n (prefers-reduced-motion: no-preference)`.\n- Reduced-motion behavior: N/A — no animation to collapse. If a\n consumer adds one, they own the reduced-motion fallback.\n\n**Contrast:**\n- Text: inherits `color: inherit`; consumer theme owns contrast.\n- Non-text: subtle bordered surface via\n `color-mix(in oklch, currentColor N%, transparent)` matching\n `ds-card`. Backdrop is a semi-transparent black by default.\n\n**Screen reader announcement:**\n- Rendered state (closed): dialog is not in the a11y tree.\n- Opened: AT announces \"dialog\" plus the accessible name from\n `label` / `labelledBy`, then reads the content following focus\n (or the descriptive block referenced by `describedBy` first,\n depending on AT).\n- State change: on close, AT returns to the element that regained\n focus (the trigger); no `aria-live` announcement is added.\n\n**Consumer contract:**\n- Set `open` to true to show; set to false to close. The component\n syncs the DOM state via `showModal()` / `close()` in a Watch.\n- Listen to `dsClose` to know when the dialog was dismissed (by\n Escape, by `open=false`, or by a form submit with\n `method=\"dialog\"`). Listen to `dsOpen` for the mirror event.\n- The default backdrop is opaque and NOT click-to-dismiss. Consumers\n who want light-dismiss can add a click listener on the dialog\n that closes when the click target is the dialog itself (not a\n descendant): `if (e.target === dialog) dialog.close()`.\n- Put focus targets (form fields, primary action button) inside\n the slot. Use `autofocus` on the element that should receive\n focus first.\n\n**Pending manual verification (see commit message TODO):**\n- VoiceOver on macOS: confirm the dialog announces its accessible\n name + \"dialog\" on open, focus lands on the correct element,\n Escape closes and focus returns to the trigger.\n- Chromium high-contrast / forced-colors: confirm the surface\n still reads as a bordered container with the native ::backdrop\n dim.",
646
+ "docsTags": [],
647
+ "usage": {},
648
+ "props": [
649
+ {
650
+ "name": "describedBy",
651
+ "type": "string | undefined",
652
+ "complexType": {
653
+ "original": "string",
654
+ "resolved": "string | undefined",
655
+ "references": {}
656
+ },
657
+ "mutable": false,
658
+ "attr": "described-by",
659
+ "reflectToAttr": false,
660
+ "docs": "",
661
+ "docsTags": [],
662
+ "values": [
663
+ {
664
+ "type": "string"
665
+ },
666
+ {
667
+ "type": "undefined"
668
+ }
669
+ ],
670
+ "optional": true,
671
+ "required": false,
672
+ "getter": false,
673
+ "setter": false
674
+ },
675
+ {
676
+ "name": "label",
677
+ "type": "string | undefined",
678
+ "complexType": {
679
+ "original": "string",
680
+ "resolved": "string | undefined",
681
+ "references": {}
682
+ },
683
+ "mutable": false,
684
+ "attr": "label",
685
+ "reflectToAttr": false,
686
+ "docs": "",
687
+ "docsTags": [],
688
+ "values": [
689
+ {
690
+ "type": "string"
691
+ },
692
+ {
693
+ "type": "undefined"
694
+ }
695
+ ],
696
+ "optional": true,
697
+ "required": false,
698
+ "getter": false,
699
+ "setter": false
700
+ },
701
+ {
702
+ "name": "labelledBy",
703
+ "type": "string | undefined",
704
+ "complexType": {
705
+ "original": "string",
706
+ "resolved": "string | undefined",
707
+ "references": {}
708
+ },
709
+ "mutable": false,
710
+ "attr": "labelled-by",
711
+ "reflectToAttr": false,
712
+ "docs": "",
713
+ "docsTags": [],
714
+ "values": [
715
+ {
716
+ "type": "string"
717
+ },
718
+ {
719
+ "type": "undefined"
720
+ }
721
+ ],
722
+ "optional": true,
723
+ "required": false,
724
+ "getter": false,
725
+ "setter": false
726
+ },
727
+ {
728
+ "name": "open",
729
+ "type": "boolean",
730
+ "complexType": {
731
+ "original": "boolean",
732
+ "resolved": "boolean",
733
+ "references": {}
734
+ },
735
+ "mutable": false,
736
+ "attr": "open",
737
+ "reflectToAttr": false,
738
+ "docs": "",
739
+ "docsTags": [
740
+ {
741
+ "name": "default",
742
+ "text": "false"
743
+ }
744
+ ],
745
+ "default": "false",
746
+ "values": [
747
+ {
748
+ "type": "boolean"
749
+ }
750
+ ],
751
+ "optional": false,
752
+ "required": false,
753
+ "getter": false,
754
+ "setter": false
755
+ }
756
+ ],
757
+ "methods": [],
758
+ "events": [
759
+ {
760
+ "event": "dsClose",
761
+ "detail": "void",
762
+ "bubbles": true,
763
+ "complexType": {
764
+ "original": "void",
765
+ "resolved": "void",
766
+ "references": {}
767
+ },
768
+ "cancelable": true,
769
+ "composed": true,
770
+ "docs": "",
771
+ "docsTags": []
772
+ },
773
+ {
774
+ "event": "dsOpen",
775
+ "detail": "void",
776
+ "bubbles": true,
777
+ "complexType": {
778
+ "original": "void",
779
+ "resolved": "void",
780
+ "references": {}
781
+ },
782
+ "cancelable": true,
783
+ "composed": true,
784
+ "docs": "",
785
+ "docsTags": []
786
+ }
787
+ ],
788
+ "listeners": [],
789
+ "styles": [],
790
+ "slots": [],
791
+ "parts": [],
792
+ "states": [],
793
+ "dependents": [],
794
+ "dependencies": [],
795
+ "dependencyGraph": {}
796
+ },
797
+ {
798
+ "filePath": "src/components/ds-input/ds-input.tsx",
799
+ "encapsulation": "shadow",
800
+ "tag": "ds-input",
801
+ "readme": "# ds-input\n\n\n",
802
+ "docs": "## Accessibility\n\n**Category:** form-field\n**APG pattern:** N/A — native element. This wraps a native `<input>`;\nthere is no WAI-ARIA APG pattern for a plain text input because the\nbrowser already implements it natively. Reference:\nhttps://developer.mozilla.org/en-US/docs/Web/HTML/Element/input\n\n**Keyboard interactions:**\n- Tab: moves focus to the native `<input>` (shadow DOM does not\n interrupt tab order).\n- Printable characters: insert at the caret position (native).\n- Backspace / Delete: native editing.\n- Arrow keys: move the caret within the value (native); for\n `type=\"number\"` Up/Down step the numeric value (native).\n- Enter: on `type=\"search\"` may submit the enclosing form (native);\n no custom handling.\n- Escape: no native meaning for a text input.\n\n**ARIA:**\n- Roles used: none explicit — the native `<input>` supplies its\n implicit role (`textbox`, `searchbox`, etc. depending on `type`).\n- State attributes: `disabled` (native attribute, not `aria-disabled`),\n `aria-invalid` (from the `invalid` prop), `aria-required` (from the\n `required` prop), `aria-describedby` (from the `describedBy` prop,\n expected to reference a light-DOM node id — typically a hint or\n error message rendered by the consumer alongside the field).\n- Labeling strategy: `aria-label` set from the `label` prop onto the\n internal `<input>`. This is the **canonical, recommended** mode —\n explicit and independent of DOM structure. Consumers MUST pass\n `label` (or otherwise give the field an accessible name) — an\n `<input>` with no accessible name is a WCAG failure (axe rule\n `label`). Wrapping the host in a light-DOM `<label>` (e.g.\n `<label>Email <ds-input></ds-input></label>`) also produces an\n accessible name in Chromium via flattened-tree resolution — the\n same secondary mode documented on `ds-select`, verified in this\n component's e2e tests. Setting `aria-label` directly on the\n `<ds-input>` host does NOT work: shadow-DOM attribute forwarding\n would be required — use the `label` prop instead.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On value change: focus remains on the native `<input>`.\n- Focus indicator: the browser default `:focus-visible` ring is kept\n on purpose — a themed focus ring using `--ds-color-focus` is a\n future decision once the DS ships a shared focus utility. Not\n overridden by `ds-input.css`.\n\n**Motion:**\n- Animations: none.\n- Reduced-motion behavior: N/A — no animation to collapse.\n\n**Contrast:**\n- Text: inherits `color: inherit` / `currentColor`; ratio depends on\n the consumer's theme, not verified in isolation here.\n- Border: `color-mix(in oklch, currentColor 22%, transparent)`,\n matching `ds-select` — inherits whatever contrast the host page\n sets. WCAG 1.4.11 (3:1 non-text) is the consumer's responsibility\n in themes that override the surface.\n\n**Screen reader announcement:**\n- Rendered state: announces the `label` prop text as the accessible\n name, followed by the browser/AT's role announcement for the\n input type (\"edit text\", \"search text\", \"password\", \"phone\n number\", \"email\"…). When `required=true` the announcement\n includes \"required\"; when `invalid=true` it includes \"invalid\".\n- State change: on value edit, AT typically echoes the typed\n character (native input behavior); no `aria-live` added, per the\n spec's guidance against live-region overuse.\n\n**Consumer contract:**\n- `placeholder` is a hint, not a label. It disappears on focus in\n most browsers and is not reliably announced by every AT — always\n pair with `label`.\n- For `type=\"password\"` in a real form, pair with a light-DOM\n `<input type=\"hidden\">` or a form-associated ancestor that gives\n the browser's password manager an `autocomplete` hint. This\n component intentionally does not expose `autocomplete` in v1;\n consumers that need it can render a native `<input>` for that\n field until the prop is added.\n- When `invalid=true`, pair with a `describedBy` id that points at\n a visible error message; `aria-invalid` alone gives the AT the\n status but not the reason.",
803
+ "docsTags": [],
804
+ "usage": {},
805
+ "props": [
806
+ {
807
+ "name": "describedBy",
808
+ "type": "string | undefined",
809
+ "complexType": {
810
+ "original": "string",
811
+ "resolved": "string | undefined",
812
+ "references": {}
813
+ },
814
+ "mutable": false,
815
+ "attr": "described-by",
816
+ "reflectToAttr": false,
817
+ "docs": "",
818
+ "docsTags": [],
819
+ "values": [
820
+ {
821
+ "type": "string"
822
+ },
823
+ {
824
+ "type": "undefined"
825
+ }
826
+ ],
827
+ "optional": true,
828
+ "required": false,
829
+ "getter": false,
830
+ "setter": false
831
+ },
832
+ {
833
+ "name": "disabled",
834
+ "type": "boolean",
835
+ "complexType": {
836
+ "original": "boolean",
837
+ "resolved": "boolean",
838
+ "references": {}
839
+ },
840
+ "mutable": false,
841
+ "attr": "disabled",
842
+ "reflectToAttr": false,
843
+ "docs": "",
844
+ "docsTags": [
845
+ {
846
+ "name": "default",
847
+ "text": "false"
848
+ }
849
+ ],
850
+ "default": "false",
851
+ "values": [
852
+ {
853
+ "type": "boolean"
854
+ }
855
+ ],
856
+ "optional": false,
857
+ "required": false,
858
+ "getter": false,
859
+ "setter": false
860
+ },
861
+ {
862
+ "name": "invalid",
863
+ "type": "boolean",
864
+ "complexType": {
865
+ "original": "boolean",
866
+ "resolved": "boolean",
867
+ "references": {}
868
+ },
869
+ "mutable": false,
870
+ "attr": "invalid",
871
+ "reflectToAttr": false,
872
+ "docs": "",
873
+ "docsTags": [
874
+ {
875
+ "name": "default",
876
+ "text": "false"
877
+ }
878
+ ],
879
+ "default": "false",
880
+ "values": [
881
+ {
882
+ "type": "boolean"
883
+ }
884
+ ],
885
+ "optional": false,
886
+ "required": false,
887
+ "getter": false,
888
+ "setter": false
889
+ },
890
+ {
891
+ "name": "label",
892
+ "type": "string | undefined",
893
+ "complexType": {
894
+ "original": "string",
895
+ "resolved": "string | undefined",
896
+ "references": {}
897
+ },
898
+ "mutable": false,
899
+ "attr": "label",
900
+ "reflectToAttr": false,
901
+ "docs": "",
902
+ "docsTags": [],
903
+ "values": [
904
+ {
905
+ "type": "string"
906
+ },
907
+ {
908
+ "type": "undefined"
909
+ }
910
+ ],
911
+ "optional": true,
912
+ "required": false,
913
+ "getter": false,
914
+ "setter": false
915
+ },
916
+ {
917
+ "name": "name",
918
+ "type": "string | undefined",
919
+ "complexType": {
920
+ "original": "string",
921
+ "resolved": "string | undefined",
922
+ "references": {}
923
+ },
924
+ "mutable": false,
925
+ "attr": "name",
926
+ "reflectToAttr": false,
927
+ "docs": "",
928
+ "docsTags": [],
929
+ "values": [
930
+ {
931
+ "type": "string"
932
+ },
933
+ {
934
+ "type": "undefined"
935
+ }
936
+ ],
937
+ "optional": true,
938
+ "required": false,
939
+ "getter": false,
940
+ "setter": false
941
+ },
942
+ {
943
+ "name": "placeholder",
944
+ "type": "string | undefined",
945
+ "complexType": {
946
+ "original": "string",
947
+ "resolved": "string | undefined",
948
+ "references": {}
949
+ },
950
+ "mutable": false,
951
+ "attr": "placeholder",
952
+ "reflectToAttr": false,
953
+ "docs": "",
954
+ "docsTags": [],
955
+ "values": [
956
+ {
957
+ "type": "string"
958
+ },
959
+ {
960
+ "type": "undefined"
961
+ }
962
+ ],
963
+ "optional": true,
964
+ "required": false,
965
+ "getter": false,
966
+ "setter": false
967
+ },
968
+ {
969
+ "name": "required",
970
+ "type": "boolean",
971
+ "complexType": {
972
+ "original": "boolean",
973
+ "resolved": "boolean",
974
+ "references": {}
975
+ },
976
+ "mutable": false,
977
+ "attr": "required",
978
+ "reflectToAttr": false,
979
+ "docs": "",
980
+ "docsTags": [
981
+ {
982
+ "name": "default",
983
+ "text": "false"
984
+ }
985
+ ],
986
+ "default": "false",
987
+ "values": [
988
+ {
989
+ "type": "boolean"
990
+ }
991
+ ],
992
+ "optional": false,
993
+ "required": false,
994
+ "getter": false,
995
+ "setter": false
996
+ },
997
+ {
998
+ "name": "size",
999
+ "type": "\"lg\" | \"md\"",
1000
+ "complexType": {
1001
+ "original": "\"md\" | \"lg\"",
1002
+ "resolved": "\"lg\" | \"md\"",
1003
+ "references": {}
1004
+ },
1005
+ "mutable": false,
1006
+ "attr": "size",
1007
+ "reflectToAttr": false,
1008
+ "docs": "",
1009
+ "docsTags": [
1010
+ {
1011
+ "name": "default",
1012
+ "text": "\"md\""
1013
+ }
1014
+ ],
1015
+ "default": "\"md\"",
1016
+ "values": [
1017
+ {
1018
+ "value": "lg",
1019
+ "type": "string"
1020
+ },
1021
+ {
1022
+ "value": "md",
1023
+ "type": "string"
1024
+ }
1025
+ ],
1026
+ "optional": false,
1027
+ "required": false,
1028
+ "getter": false,
1029
+ "setter": false
1030
+ },
1031
+ {
1032
+ "name": "type",
1033
+ "type": "\"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\" | \"url\"",
1034
+ "complexType": {
1035
+ "original": "| \"text\"\n | \"email\"\n | \"password\"\n | \"search\"\n | \"tel\"\n | \"url\"\n | \"number\"",
1036
+ "resolved": "\"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\" | \"url\"",
1037
+ "references": {}
1038
+ },
1039
+ "mutable": false,
1040
+ "attr": "type",
1041
+ "reflectToAttr": false,
1042
+ "docs": "",
1043
+ "docsTags": [
1044
+ {
1045
+ "name": "default",
1046
+ "text": "\"text\""
1047
+ }
1048
+ ],
1049
+ "default": "\"text\"",
1050
+ "values": [
1051
+ {
1052
+ "value": "email",
1053
+ "type": "string"
1054
+ },
1055
+ {
1056
+ "value": "number",
1057
+ "type": "string"
1058
+ },
1059
+ {
1060
+ "value": "password",
1061
+ "type": "string"
1062
+ },
1063
+ {
1064
+ "value": "search",
1065
+ "type": "string"
1066
+ },
1067
+ {
1068
+ "value": "tel",
1069
+ "type": "string"
1070
+ },
1071
+ {
1072
+ "value": "text",
1073
+ "type": "string"
1074
+ },
1075
+ {
1076
+ "value": "url",
1077
+ "type": "string"
1078
+ }
1079
+ ],
1080
+ "optional": false,
1081
+ "required": false,
1082
+ "getter": false,
1083
+ "setter": false
1084
+ },
1085
+ {
1086
+ "name": "value",
1087
+ "type": "string | undefined",
1088
+ "complexType": {
1089
+ "original": "string",
1090
+ "resolved": "string | undefined",
1091
+ "references": {}
1092
+ },
1093
+ "mutable": false,
1094
+ "attr": "value",
1095
+ "reflectToAttr": false,
1096
+ "docs": "",
1097
+ "docsTags": [],
1098
+ "values": [
1099
+ {
1100
+ "type": "string"
1101
+ },
1102
+ {
1103
+ "type": "undefined"
1104
+ }
1105
+ ],
1106
+ "optional": true,
1107
+ "required": false,
1108
+ "getter": false,
1109
+ "setter": false
1110
+ }
1111
+ ],
1112
+ "methods": [],
1113
+ "events": [
1114
+ {
1115
+ "event": "dsInput",
1116
+ "detail": "string",
1117
+ "bubbles": true,
1118
+ "complexType": {
1119
+ "original": "string",
1120
+ "resolved": "string",
1121
+ "references": {}
1122
+ },
1123
+ "cancelable": true,
1124
+ "composed": true,
1125
+ "docs": "",
1126
+ "docsTags": []
1127
+ }
1128
+ ],
1129
+ "listeners": [],
1130
+ "styles": [],
1131
+ "slots": [],
1132
+ "parts": [],
1133
+ "states": [],
1134
+ "dependents": [],
1135
+ "dependencies": [],
1136
+ "dependencyGraph": {}
1137
+ },
1138
+ {
1139
+ "filePath": "src/components/ds-loader/ds-loader.tsx",
1140
+ "encapsulation": "shadow",
1141
+ "tag": "ds-loader",
1142
+ "readme": "# ds-loader\n\n\n",
1143
+ "docs": "## Accessibility\n\n**Category:** static-display (indeterminate progress indicator)\n**APG pattern:** N/A — the loader is a passive presence indicator, not a\n`progressbar` (no measurable value). Uses `role=\"status\"` per WAI-ARIA\nlive-region semantics for indeterminate loading states.\n\n**Keyboard interactions:**\n- Tab: N/A — not focusable.\n- Enter: N/A.\n- Escape: N/A.\n- Arrow keys: N/A.\n- Printable characters: N/A.\n\n**ARIA:**\n- Roles used: `role=\"status\"` on the host — an implicit polite live\n region ARIA lists as valid for \"advisory information\" including\n in-progress operations. The inner `<svg>` is decorative and carries\n `aria-hidden=\"true\"` + `focusable=\"false\"` so it never becomes a\n parallel target for screen readers.\n- State attributes: none. The loader has no state changes to announce\n beyond its own presence; the polite live region on mount is the\n announcement.\n- Labeling strategy: `aria-label` from the `label` prop (default\n \"Loading\"). Consumers pass a more specific string when the context\n warrants (\"Loading ceremonies\", \"Signing in\", …).\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On activate/open: N/A — not interactive.\n- On close/deactivate: N/A.\n- Focus indicator: N/A — the host is not focusable.\n\n**Motion:**\n- Animations: two mirrored halves of the logo path oscillate\n symmetrically around the visual center, meeting at the ring midpoint\n and separating again. Cycle 1.4s by default (`speed=\"normal\"`);\n `speed=\"slow\"` = 2.2s, `speed=\"fast\"` = 0.9s.\n- Reduced-motion behavior: `@media (prefers-reduced-motion: reduce)`\n collapses both halves to a static rendering with a slow opacity\n pulse (2s ease-in-out). No rotation, no lateral movement.\n\n**Contrast:**\n- Text: N/A — the visible surface is the SVG stroke, not text.\n- Non-text: stroke inherits `currentColor` from the host. Consumers are\n responsible for confirming the stroke against its background meets\n the ≥ 3:1 non-text contrast threshold (WCAG 1.4.11) where the loader\n conveys state (e.g. distinguishing \"still loading\" from \"idle\").\n\n**Screen reader announcement:**\n- Rendered state: the polite live region announces the label\n (e.g. \"Loading\") when the loader mounts.\n- State change: N/A — the loader itself has no state that changes.\n Consumers unmount the loader when the awaited work completes; that\n removal is silent, which is the intended behavior (the arriving\n content is the announcement).",
1144
+ "docsTags": [],
1145
+ "usage": {},
1146
+ "props": [
1147
+ {
1148
+ "name": "label",
1149
+ "type": "string",
1150
+ "complexType": {
1151
+ "original": "string",
1152
+ "resolved": "string",
1153
+ "references": {}
1154
+ },
1155
+ "mutable": false,
1156
+ "attr": "label",
1157
+ "reflectToAttr": false,
1158
+ "docs": "",
1159
+ "docsTags": [
1160
+ {
1161
+ "name": "default",
1162
+ "text": "\"Loading\""
1163
+ }
1164
+ ],
1165
+ "default": "\"Loading\"",
1166
+ "values": [
1167
+ {
1168
+ "type": "string"
1169
+ }
1170
+ ],
1171
+ "optional": false,
1172
+ "required": false,
1173
+ "getter": false,
1174
+ "setter": false
1175
+ },
1176
+ {
1177
+ "name": "size",
1178
+ "type": "\"lg\" | \"md\" | \"sm\"",
1179
+ "complexType": {
1180
+ "original": "\"sm\" | \"md\" | \"lg\"",
1181
+ "resolved": "\"lg\" | \"md\" | \"sm\"",
1182
+ "references": {}
1183
+ },
1184
+ "mutable": false,
1185
+ "attr": "size",
1186
+ "reflectToAttr": false,
1187
+ "docs": "",
1188
+ "docsTags": [
1189
+ {
1190
+ "name": "default",
1191
+ "text": "\"md\""
1192
+ }
1193
+ ],
1194
+ "default": "\"md\"",
1195
+ "values": [
1196
+ {
1197
+ "value": "lg",
1198
+ "type": "string"
1199
+ },
1200
+ {
1201
+ "value": "md",
1202
+ "type": "string"
1203
+ },
1204
+ {
1205
+ "value": "sm",
1206
+ "type": "string"
1207
+ }
1208
+ ],
1209
+ "optional": false,
1210
+ "required": false,
1211
+ "getter": false,
1212
+ "setter": false
1213
+ },
1214
+ {
1215
+ "name": "speed",
1216
+ "type": "\"fast\" | \"normal\" | \"slow\"",
1217
+ "complexType": {
1218
+ "original": "\"slow\" | \"normal\" | \"fast\"",
1219
+ "resolved": "\"fast\" | \"normal\" | \"slow\"",
1220
+ "references": {}
1221
+ },
1222
+ "mutable": false,
1223
+ "attr": "speed",
1224
+ "reflectToAttr": false,
1225
+ "docs": "",
1226
+ "docsTags": [
1227
+ {
1228
+ "name": "default",
1229
+ "text": "\"normal\""
1230
+ }
1231
+ ],
1232
+ "default": "\"normal\"",
1233
+ "values": [
1234
+ {
1235
+ "value": "fast",
1236
+ "type": "string"
1237
+ },
1238
+ {
1239
+ "value": "normal",
1240
+ "type": "string"
1241
+ },
1242
+ {
1243
+ "value": "slow",
1244
+ "type": "string"
1245
+ }
1246
+ ],
1247
+ "optional": false,
1248
+ "required": false,
1249
+ "getter": false,
1250
+ "setter": false
1251
+ }
1252
+ ],
1253
+ "methods": [],
1254
+ "events": [],
1255
+ "listeners": [],
1256
+ "styles": [],
1257
+ "slots": [],
1258
+ "parts": [],
1259
+ "states": [],
1260
+ "dependents": [],
1261
+ "dependencies": [],
1262
+ "dependencyGraph": {}
1263
+ },
1264
+ {
1265
+ "filePath": "src/components/ds-select/ds-select.tsx",
1266
+ "encapsulation": "shadow",
1267
+ "tag": "ds-select",
1268
+ "readme": "# ds-select\n\n\n",
1269
+ "docs": "",
1270
+ "docsTags": [],
1271
+ "usage": {},
1272
+ "props": [
1273
+ {
1274
+ "name": "disabled",
1275
+ "type": "boolean",
1276
+ "complexType": {
1277
+ "original": "boolean",
1278
+ "resolved": "boolean",
1279
+ "references": {}
1280
+ },
1281
+ "mutable": false,
1282
+ "attr": "disabled",
1283
+ "reflectToAttr": false,
1284
+ "docs": "",
1285
+ "docsTags": [
1286
+ {
1287
+ "name": "default",
1288
+ "text": "false"
1289
+ }
1290
+ ],
1291
+ "default": "false",
1292
+ "values": [
1293
+ {
1294
+ "type": "boolean"
1295
+ }
1296
+ ],
1297
+ "optional": false,
1298
+ "required": false,
1299
+ "getter": false,
1300
+ "setter": false
1301
+ },
1302
+ {
1303
+ "name": "label",
1304
+ "type": "string | undefined",
1305
+ "complexType": {
1306
+ "original": "string",
1307
+ "resolved": "string | undefined",
1308
+ "references": {}
1309
+ },
1310
+ "mutable": false,
1311
+ "attr": "label",
1312
+ "reflectToAttr": false,
1313
+ "docs": "",
1314
+ "docsTags": [],
1315
+ "values": [
1316
+ {
1317
+ "type": "string"
1318
+ },
1319
+ {
1320
+ "type": "undefined"
1321
+ }
1322
+ ],
1323
+ "optional": true,
1324
+ "required": false,
1325
+ "getter": false,
1326
+ "setter": false
1327
+ },
1328
+ {
1329
+ "name": "name",
1330
+ "type": "string | undefined",
1331
+ "complexType": {
1332
+ "original": "string",
1333
+ "resolved": "string | undefined",
1334
+ "references": {}
1335
+ },
1336
+ "mutable": false,
1337
+ "attr": "name",
1338
+ "reflectToAttr": false,
1339
+ "docs": "",
1340
+ "docsTags": [],
1341
+ "values": [
1342
+ {
1343
+ "type": "string"
1344
+ },
1345
+ {
1346
+ "type": "undefined"
1347
+ }
1348
+ ],
1349
+ "optional": true,
1350
+ "required": false,
1351
+ "getter": false,
1352
+ "setter": false
1353
+ },
1354
+ {
1355
+ "name": "options",
1356
+ "type": "readonly DsSelectOption[] | string",
1357
+ "complexType": {
1358
+ "original": "string | ReadonlyArray<DsSelectOption>",
1359
+ "resolved": "readonly DsSelectOption[] | string",
1360
+ "references": {
1361
+ "ReadonlyArray": {
1362
+ "location": "global",
1363
+ "id": "global::ReadonlyArray"
1364
+ },
1365
+ "DsSelectOption": {
1366
+ "location": "local",
1367
+ "path": "/Users/alex/projects/MyGitHub/chiralkit/packages/design-system/src/components/ds-select/ds-select.tsx",
1368
+ "id": "src/components/ds-select/ds-select.tsx::DsSelectOption"
1369
+ }
1370
+ }
1371
+ },
1372
+ "mutable": false,
1373
+ "attr": "options",
1374
+ "reflectToAttr": false,
1375
+ "docs": "Options rendered inside the internal shadow `<select>`. Accepts either:\n- a JSON string (SSR-friendly — server-rendered HTML can only set\n string attributes, and Stencil does not JSON-parse array attributes),\n e.g. `options='[{\"value\":\"en\",\"label\":\"EN\"}]'`\n- an array property set from client-side JS,\n e.g. `el.options = [{ value: 'en', label: 'EN' }]`\n\nMalformed JSON fails safe to an empty list rather than throwing, so the\ncomponent still renders a visible (if empty) select.",
1376
+ "docsTags": [
1377
+ {
1378
+ "name": "default",
1379
+ "text": "\"[]\""
1380
+ }
1381
+ ],
1382
+ "default": "\"[]\"",
1383
+ "values": [
1384
+ {
1385
+ "type": "readonly DsSelectOption[]"
1386
+ },
1387
+ {
1388
+ "type": "string"
1389
+ }
1390
+ ],
1391
+ "optional": false,
1392
+ "required": false,
1393
+ "getter": false,
1394
+ "setter": false
1395
+ },
1396
+ {
1397
+ "name": "size",
1398
+ "type": "\"lg\" | \"md\"",
1399
+ "complexType": {
1400
+ "original": "\"md\" | \"lg\"",
1401
+ "resolved": "\"lg\" | \"md\"",
1402
+ "references": {}
1403
+ },
1404
+ "mutable": false,
1405
+ "attr": "size",
1406
+ "reflectToAttr": false,
1407
+ "docs": "",
1408
+ "docsTags": [
1409
+ {
1410
+ "name": "default",
1411
+ "text": "\"md\""
1412
+ }
1413
+ ],
1414
+ "default": "\"md\"",
1415
+ "values": [
1416
+ {
1417
+ "value": "lg",
1418
+ "type": "string"
1419
+ },
1420
+ {
1421
+ "value": "md",
1422
+ "type": "string"
1423
+ }
1424
+ ],
1425
+ "optional": false,
1426
+ "required": false,
1427
+ "getter": false,
1428
+ "setter": false
1429
+ },
1430
+ {
1431
+ "name": "value",
1432
+ "type": "string | undefined",
1433
+ "complexType": {
1434
+ "original": "string",
1435
+ "resolved": "string | undefined",
1436
+ "references": {}
1437
+ },
1438
+ "mutable": false,
1439
+ "attr": "value",
1440
+ "reflectToAttr": false,
1441
+ "docs": "",
1442
+ "docsTags": [],
1443
+ "values": [
1444
+ {
1445
+ "type": "string"
1446
+ },
1447
+ {
1448
+ "type": "undefined"
1449
+ }
1450
+ ],
1451
+ "optional": true,
1452
+ "required": false,
1453
+ "getter": false,
1454
+ "setter": false
1455
+ }
1456
+ ],
1457
+ "methods": [],
1458
+ "events": [
1459
+ {
1460
+ "event": "dsChange",
1461
+ "detail": "string",
1462
+ "bubbles": true,
1463
+ "complexType": {
1464
+ "original": "string",
1465
+ "resolved": "string",
1466
+ "references": {}
1467
+ },
1468
+ "cancelable": true,
1469
+ "composed": true,
1470
+ "docs": "",
1471
+ "docsTags": []
1472
+ }
1473
+ ],
1474
+ "listeners": [],
1475
+ "styles": [],
1476
+ "slots": [],
1477
+ "parts": [],
1478
+ "states": [],
1479
+ "dependents": [],
1480
+ "dependencies": [],
1481
+ "dependencyGraph": {}
1482
+ },
1483
+ {
1484
+ "filePath": "src/components/ds-tabs/ds-tabs.tsx",
1485
+ "encapsulation": "none",
1486
+ "tag": "ds-tabs",
1487
+ "readme": "# ds-tabs\n\n\n",
1488
+ "docs": "",
1489
+ "docsTags": [],
1490
+ "usage": {},
1491
+ "props": [
1492
+ {
1493
+ "name": "active",
1494
+ "type": "string | undefined",
1495
+ "complexType": {
1496
+ "original": "string",
1497
+ "resolved": "string | undefined",
1498
+ "references": {}
1499
+ },
1500
+ "mutable": true,
1501
+ "attr": "active",
1502
+ "reflectToAttr": false,
1503
+ "docs": "",
1504
+ "docsTags": [],
1505
+ "values": [
1506
+ {
1507
+ "type": "string"
1508
+ },
1509
+ {
1510
+ "type": "undefined"
1511
+ }
1512
+ ],
1513
+ "optional": true,
1514
+ "required": false,
1515
+ "getter": false,
1516
+ "setter": false
1517
+ },
1518
+ {
1519
+ "name": "items",
1520
+ "type": "readonly DsTabItem[] | string",
1521
+ "complexType": {
1522
+ "original": "string | ReadonlyArray<DsTabItem>",
1523
+ "resolved": "readonly DsTabItem[] | string",
1524
+ "references": {
1525
+ "ReadonlyArray": {
1526
+ "location": "global",
1527
+ "id": "global::ReadonlyArray"
1528
+ },
1529
+ "DsTabItem": {
1530
+ "location": "local",
1531
+ "path": "/Users/alex/projects/MyGitHub/chiralkit/packages/design-system/src/components/ds-tabs/ds-tabs.tsx",
1532
+ "id": "src/components/ds-tabs/ds-tabs.tsx::DsTabItem"
1533
+ }
1534
+ }
1535
+ },
1536
+ "mutable": false,
1537
+ "attr": "items",
1538
+ "reflectToAttr": false,
1539
+ "docs": "",
1540
+ "docsTags": [
1541
+ {
1542
+ "name": "default",
1543
+ "text": "\"[]\""
1544
+ }
1545
+ ],
1546
+ "default": "\"[]\"",
1547
+ "values": [
1548
+ {
1549
+ "type": "readonly DsTabItem[]"
1550
+ },
1551
+ {
1552
+ "type": "string"
1553
+ }
1554
+ ],
1555
+ "optional": false,
1556
+ "required": false,
1557
+ "getter": false,
1558
+ "setter": false
1559
+ },
1560
+ {
1561
+ "name": "label",
1562
+ "type": "string | undefined",
1563
+ "complexType": {
1564
+ "original": "string",
1565
+ "resolved": "string | undefined",
1566
+ "references": {}
1567
+ },
1568
+ "mutable": false,
1569
+ "attr": "label",
1570
+ "reflectToAttr": false,
1571
+ "docs": "",
1572
+ "docsTags": [],
1573
+ "values": [
1574
+ {
1575
+ "type": "string"
1576
+ },
1577
+ {
1578
+ "type": "undefined"
1579
+ }
1580
+ ],
1581
+ "optional": true,
1582
+ "required": false,
1583
+ "getter": false,
1584
+ "setter": false
1585
+ },
1586
+ {
1587
+ "name": "orientation",
1588
+ "type": "\"horizontal\" | \"vertical\"",
1589
+ "complexType": {
1590
+ "original": "\"horizontal\" | \"vertical\"",
1591
+ "resolved": "\"horizontal\" | \"vertical\"",
1592
+ "references": {}
1593
+ },
1594
+ "mutable": false,
1595
+ "attr": "orientation",
1596
+ "reflectToAttr": false,
1597
+ "docs": "",
1598
+ "docsTags": [
1599
+ {
1600
+ "name": "default",
1601
+ "text": "\"horizontal\""
1602
+ }
1603
+ ],
1604
+ "default": "\"horizontal\"",
1605
+ "values": [
1606
+ {
1607
+ "value": "horizontal",
1608
+ "type": "string"
1609
+ },
1610
+ {
1611
+ "value": "vertical",
1612
+ "type": "string"
1613
+ }
1614
+ ],
1615
+ "optional": false,
1616
+ "required": false,
1617
+ "getter": false,
1618
+ "setter": false
1619
+ }
1620
+ ],
1621
+ "methods": [],
1622
+ "events": [
1623
+ {
1624
+ "event": "dsChange",
1625
+ "detail": "string",
1626
+ "bubbles": true,
1627
+ "complexType": {
1628
+ "original": "string",
1629
+ "resolved": "string",
1630
+ "references": {}
1631
+ },
1632
+ "cancelable": true,
1633
+ "composed": true,
1634
+ "docs": "",
1635
+ "docsTags": []
1636
+ }
1637
+ ],
1638
+ "listeners": [],
1639
+ "styles": [],
1640
+ "slots": [],
1641
+ "parts": [],
1642
+ "states": [],
1643
+ "dependents": [],
1644
+ "dependencies": [],
1645
+ "dependencyGraph": {}
1646
+ },
1647
+ {
1648
+ "filePath": "src/components/ds-textarea/ds-textarea.tsx",
1649
+ "encapsulation": "shadow",
1650
+ "tag": "ds-textarea",
1651
+ "readme": "# ds-textarea\n\n\n",
1652
+ "docs": "## Accessibility\n\n**Category:** form-field\n**APG pattern:** N/A — native element. This wraps a native\n`<textarea>`; there is no WAI-ARIA APG pattern for a plain\nmulti-line text field because the browser already implements it\nnatively. Reference:\nhttps://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n\n**Keyboard interactions:**\n- Tab: moves focus to the native `<textarea>`; Tab inside the\n textarea inserts a tab character only when the browser is\n configured to do so (default behavior: Tab moves focus out).\n- Printable characters: insert at the caret position (native).\n- Enter: inserts a newline within the value (native), does not\n submit the enclosing form (unlike a single-line input).\n- Backspace / Delete: native editing.\n- Arrow keys: move the caret within the value (native).\n- Escape: no native meaning for a text area.\n\n**ARIA:**\n- Roles used: none explicit — the native `<textarea>` supplies\n the implicit `textbox` role with multiline behavior.\n- State attributes: `disabled` (native attribute, not\n `aria-disabled`), `aria-invalid` (from the `invalid` prop),\n `aria-required` (from the `required` prop), `aria-describedby`\n (from the `describedBy` prop, expected to reference a light-DOM\n node id — typically a hint or error message rendered by the\n consumer alongside the field).\n- Labeling strategy: `aria-label` set from the `label` prop onto\n the internal `<textarea>`. This is the **canonical, recommended**\n mode. Wrapping the host in a light-DOM `<label>` also produces\n an accessible name in Chromium via flattened-tree resolution —\n same secondary mode documented on `ds-input` and `ds-select`,\n verified in this component's e2e tests. Setting `aria-label`\n directly on the `<ds-textarea>` host does NOT work: shadow-DOM\n attribute forwarding would be required — use the `label` prop.\n\n**Focus:**\n- On mount: nothing auto-focuses.\n- On value change: focus remains on the native `<textarea>`.\n- Focus indicator: the browser default `:focus-visible` ring is\n kept on purpose — a themed focus ring using `--ds-color-focus`\n is a future decision once the DS ships a shared focus utility.\n\n**Motion:**\n- Animations: none.\n- Reduced-motion behavior: N/A — no animation to collapse.\n\n**Contrast:**\n- Text: inherits `color: inherit` / `currentColor`; ratio depends\n on the consumer's theme, not verified in isolation.\n- Border: `color-mix(in oklch, currentColor 22%, transparent)`,\n matching `ds-input`.\n\n**Screen reader announcement:**\n- Rendered state: announces the `label` prop text as the\n accessible name, followed by \"edit text, multiline\" (browser/AT\n wording varies). When `required=true` the announcement includes\n \"required\"; when `invalid=true` it includes \"invalid\".\n- State change: on value edit, AT typically echoes the typed\n character (native behavior); no `aria-live` added.\n\n**Consumer contract:**\n- `placeholder` is a hint, not a label — always pair with `label`.\n- When `invalid=true`, pair with a `describedBy` id that points at\n a visible error message; `aria-invalid` alone gives the AT the\n status but not the reason.\n- `rows` sets the initial visible line count. Vertical resize is\n left to the native default (`resize: vertical`) so users can\n grow the field for long entries; the consumer's CSS can pin it\n with `resize: none` when a fixed height matters.",
1653
+ "docsTags": [],
1654
+ "usage": {},
1655
+ "props": [
1656
+ {
1657
+ "name": "describedBy",
1658
+ "type": "string | undefined",
1659
+ "complexType": {
1660
+ "original": "string",
1661
+ "resolved": "string | undefined",
1662
+ "references": {}
1663
+ },
1664
+ "mutable": false,
1665
+ "attr": "described-by",
1666
+ "reflectToAttr": false,
1667
+ "docs": "",
1668
+ "docsTags": [],
1669
+ "values": [
1670
+ {
1671
+ "type": "string"
1672
+ },
1673
+ {
1674
+ "type": "undefined"
1675
+ }
1676
+ ],
1677
+ "optional": true,
1678
+ "required": false,
1679
+ "getter": false,
1680
+ "setter": false
1681
+ },
1682
+ {
1683
+ "name": "disabled",
1684
+ "type": "boolean",
1685
+ "complexType": {
1686
+ "original": "boolean",
1687
+ "resolved": "boolean",
1688
+ "references": {}
1689
+ },
1690
+ "mutable": false,
1691
+ "attr": "disabled",
1692
+ "reflectToAttr": false,
1693
+ "docs": "",
1694
+ "docsTags": [
1695
+ {
1696
+ "name": "default",
1697
+ "text": "false"
1698
+ }
1699
+ ],
1700
+ "default": "false",
1701
+ "values": [
1702
+ {
1703
+ "type": "boolean"
1704
+ }
1705
+ ],
1706
+ "optional": false,
1707
+ "required": false,
1708
+ "getter": false,
1709
+ "setter": false
1710
+ },
1711
+ {
1712
+ "name": "invalid",
1713
+ "type": "boolean",
1714
+ "complexType": {
1715
+ "original": "boolean",
1716
+ "resolved": "boolean",
1717
+ "references": {}
1718
+ },
1719
+ "mutable": false,
1720
+ "attr": "invalid",
1721
+ "reflectToAttr": false,
1722
+ "docs": "",
1723
+ "docsTags": [
1724
+ {
1725
+ "name": "default",
1726
+ "text": "false"
1727
+ }
1728
+ ],
1729
+ "default": "false",
1730
+ "values": [
1731
+ {
1732
+ "type": "boolean"
1733
+ }
1734
+ ],
1735
+ "optional": false,
1736
+ "required": false,
1737
+ "getter": false,
1738
+ "setter": false
1739
+ },
1740
+ {
1741
+ "name": "label",
1742
+ "type": "string | undefined",
1743
+ "complexType": {
1744
+ "original": "string",
1745
+ "resolved": "string | undefined",
1746
+ "references": {}
1747
+ },
1748
+ "mutable": false,
1749
+ "attr": "label",
1750
+ "reflectToAttr": false,
1751
+ "docs": "",
1752
+ "docsTags": [],
1753
+ "values": [
1754
+ {
1755
+ "type": "string"
1756
+ },
1757
+ {
1758
+ "type": "undefined"
1759
+ }
1760
+ ],
1761
+ "optional": true,
1762
+ "required": false,
1763
+ "getter": false,
1764
+ "setter": false
1765
+ },
1766
+ {
1767
+ "name": "name",
1768
+ "type": "string | undefined",
1769
+ "complexType": {
1770
+ "original": "string",
1771
+ "resolved": "string | undefined",
1772
+ "references": {}
1773
+ },
1774
+ "mutable": false,
1775
+ "attr": "name",
1776
+ "reflectToAttr": false,
1777
+ "docs": "",
1778
+ "docsTags": [],
1779
+ "values": [
1780
+ {
1781
+ "type": "string"
1782
+ },
1783
+ {
1784
+ "type": "undefined"
1785
+ }
1786
+ ],
1787
+ "optional": true,
1788
+ "required": false,
1789
+ "getter": false,
1790
+ "setter": false
1791
+ },
1792
+ {
1793
+ "name": "placeholder",
1794
+ "type": "string | undefined",
1795
+ "complexType": {
1796
+ "original": "string",
1797
+ "resolved": "string | undefined",
1798
+ "references": {}
1799
+ },
1800
+ "mutable": false,
1801
+ "attr": "placeholder",
1802
+ "reflectToAttr": false,
1803
+ "docs": "",
1804
+ "docsTags": [],
1805
+ "values": [
1806
+ {
1807
+ "type": "string"
1808
+ },
1809
+ {
1810
+ "type": "undefined"
1811
+ }
1812
+ ],
1813
+ "optional": true,
1814
+ "required": false,
1815
+ "getter": false,
1816
+ "setter": false
1817
+ },
1818
+ {
1819
+ "name": "required",
1820
+ "type": "boolean",
1821
+ "complexType": {
1822
+ "original": "boolean",
1823
+ "resolved": "boolean",
1824
+ "references": {}
1825
+ },
1826
+ "mutable": false,
1827
+ "attr": "required",
1828
+ "reflectToAttr": false,
1829
+ "docs": "",
1830
+ "docsTags": [
1831
+ {
1832
+ "name": "default",
1833
+ "text": "false"
1834
+ }
1835
+ ],
1836
+ "default": "false",
1837
+ "values": [
1838
+ {
1839
+ "type": "boolean"
1840
+ }
1841
+ ],
1842
+ "optional": false,
1843
+ "required": false,
1844
+ "getter": false,
1845
+ "setter": false
1846
+ },
1847
+ {
1848
+ "name": "rows",
1849
+ "type": "number",
1850
+ "complexType": {
1851
+ "original": "number",
1852
+ "resolved": "number",
1853
+ "references": {}
1854
+ },
1855
+ "mutable": false,
1856
+ "attr": "rows",
1857
+ "reflectToAttr": false,
1858
+ "docs": "",
1859
+ "docsTags": [
1860
+ {
1861
+ "name": "default",
1862
+ "text": "3"
1863
+ }
1864
+ ],
1865
+ "default": "3",
1866
+ "values": [
1867
+ {
1868
+ "type": "number"
1869
+ }
1870
+ ],
1871
+ "optional": false,
1872
+ "required": false,
1873
+ "getter": false,
1874
+ "setter": false
1875
+ },
1876
+ {
1877
+ "name": "size",
1878
+ "type": "\"lg\" | \"md\"",
1879
+ "complexType": {
1880
+ "original": "\"md\" | \"lg\"",
1881
+ "resolved": "\"lg\" | \"md\"",
1882
+ "references": {}
1883
+ },
1884
+ "mutable": false,
1885
+ "attr": "size",
1886
+ "reflectToAttr": false,
1887
+ "docs": "",
1888
+ "docsTags": [
1889
+ {
1890
+ "name": "default",
1891
+ "text": "\"md\""
1892
+ }
1893
+ ],
1894
+ "default": "\"md\"",
1895
+ "values": [
1896
+ {
1897
+ "value": "lg",
1898
+ "type": "string"
1899
+ },
1900
+ {
1901
+ "value": "md",
1902
+ "type": "string"
1903
+ }
1904
+ ],
1905
+ "optional": false,
1906
+ "required": false,
1907
+ "getter": false,
1908
+ "setter": false
1909
+ },
1910
+ {
1911
+ "name": "value",
1912
+ "type": "string | undefined",
1913
+ "complexType": {
1914
+ "original": "string",
1915
+ "resolved": "string | undefined",
1916
+ "references": {}
1917
+ },
1918
+ "mutable": false,
1919
+ "attr": "value",
1920
+ "reflectToAttr": false,
1921
+ "docs": "",
1922
+ "docsTags": [],
1923
+ "values": [
1924
+ {
1925
+ "type": "string"
1926
+ },
1927
+ {
1928
+ "type": "undefined"
1929
+ }
1930
+ ],
1931
+ "optional": true,
1932
+ "required": false,
1933
+ "getter": false,
1934
+ "setter": false
1935
+ }
1936
+ ],
1937
+ "methods": [],
1938
+ "events": [
1939
+ {
1940
+ "event": "dsInput",
1941
+ "detail": "string",
1942
+ "bubbles": true,
1943
+ "complexType": {
1944
+ "original": "string",
1945
+ "resolved": "string",
1946
+ "references": {}
1947
+ },
1948
+ "cancelable": true,
1949
+ "composed": true,
1950
+ "docs": "",
1951
+ "docsTags": []
1952
+ }
1953
+ ],
1954
+ "listeners": [],
1955
+ "styles": [],
1956
+ "slots": [],
1957
+ "parts": [],
1958
+ "states": [],
1959
+ "dependents": [],
1960
+ "dependencies": [],
1961
+ "dependencyGraph": {}
1962
+ },
1963
+ {
1964
+ "filePath": "src/components/ds-tooltip/ds-tooltip.tsx",
1965
+ "encapsulation": "none",
1966
+ "tag": "ds-tooltip",
1967
+ "readme": "# ds-tooltip\n\n\n",
1968
+ "docs": "",
1969
+ "docsTags": [],
1970
+ "usage": {},
1971
+ "props": [
1972
+ {
1973
+ "name": "closeDelay",
1974
+ "type": "number",
1975
+ "complexType": {
1976
+ "original": "number",
1977
+ "resolved": "number",
1978
+ "references": {}
1979
+ },
1980
+ "mutable": false,
1981
+ "attr": "close-delay",
1982
+ "reflectToAttr": false,
1983
+ "docs": "",
1984
+ "docsTags": [
1985
+ {
1986
+ "name": "default",
1987
+ "text": "100"
1988
+ }
1989
+ ],
1990
+ "default": "100",
1991
+ "values": [
1992
+ {
1993
+ "type": "number"
1994
+ }
1995
+ ],
1996
+ "optional": false,
1997
+ "required": false,
1998
+ "getter": false,
1999
+ "setter": false
2000
+ },
2001
+ {
2002
+ "name": "label",
2003
+ "type": "string",
2004
+ "complexType": {
2005
+ "original": "string",
2006
+ "resolved": "string",
2007
+ "references": {}
2008
+ },
2009
+ "mutable": false,
2010
+ "attr": "label",
2011
+ "reflectToAttr": false,
2012
+ "docs": "",
2013
+ "docsTags": [],
2014
+ "values": [
2015
+ {
2016
+ "type": "string"
2017
+ }
2018
+ ],
2019
+ "optional": false,
2020
+ "required": true,
2021
+ "getter": false,
2022
+ "setter": false
2023
+ },
2024
+ {
2025
+ "name": "openDelay",
2026
+ "type": "number",
2027
+ "complexType": {
2028
+ "original": "number",
2029
+ "resolved": "number",
2030
+ "references": {}
2031
+ },
2032
+ "mutable": false,
2033
+ "attr": "open-delay",
2034
+ "reflectToAttr": false,
2035
+ "docs": "",
2036
+ "docsTags": [
2037
+ {
2038
+ "name": "default",
2039
+ "text": "250"
2040
+ }
2041
+ ],
2042
+ "default": "250",
2043
+ "values": [
2044
+ {
2045
+ "type": "number"
2046
+ }
2047
+ ],
2048
+ "optional": false,
2049
+ "required": false,
2050
+ "getter": false,
2051
+ "setter": false
2052
+ },
2053
+ {
2054
+ "name": "placement",
2055
+ "type": "\"bottom\" | \"top\"",
2056
+ "complexType": {
2057
+ "original": "\"top\" | \"bottom\"",
2058
+ "resolved": "\"bottom\" | \"top\"",
2059
+ "references": {}
2060
+ },
2061
+ "mutable": false,
2062
+ "attr": "placement",
2063
+ "reflectToAttr": false,
2064
+ "docs": "",
2065
+ "docsTags": [
2066
+ {
2067
+ "name": "default",
2068
+ "text": "\"bottom\""
2069
+ }
2070
+ ],
2071
+ "default": "\"bottom\"",
2072
+ "values": [
2073
+ {
2074
+ "value": "bottom",
2075
+ "type": "string"
2076
+ },
2077
+ {
2078
+ "value": "top",
2079
+ "type": "string"
2080
+ }
2081
+ ],
2082
+ "optional": false,
2083
+ "required": false,
2084
+ "getter": false,
2085
+ "setter": false
2086
+ }
2087
+ ],
2088
+ "methods": [],
2089
+ "events": [],
2090
+ "listeners": [],
2091
+ "styles": [],
2092
+ "slots": [],
2093
+ "parts": [],
2094
+ "states": [],
2095
+ "dependents": [],
2096
+ "dependencies": [],
2097
+ "dependencyGraph": {}
2098
+ }
2099
+ ],
2100
+ "typeLibrary": {
2101
+ "src/components/ds-select/ds-select.tsx::DsSelectOption": {
2102
+ "declaration": "{ value: string; label: string }",
2103
+ "docstring": "",
2104
+ "path": "src/components/ds-select/ds-select.tsx"
2105
+ },
2106
+ "src/components/ds-tabs/ds-tabs.tsx::DsTabItem": {
2107
+ "declaration": "{\n id: string;\n label: string;\n /**\n * Id of the tabpanel this tab controls. Defaults to `id`.\n */\n controls?: string;\n disabled?: boolean;\n}",
2108
+ "docstring": "",
2109
+ "path": "src/components/ds-tabs/ds-tabs.tsx"
2110
+ }
2111
+ }
2112
+ }