@chromvoid/uikit 0.1.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 (246) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +96 -0
  3. package/dist/components/cv-accordion-item.d.ts +69 -0
  4. package/dist/components/cv-accordion-item.js +176 -0
  5. package/dist/components/cv-accordion.d.ts +79 -0
  6. package/dist/components/cv-accordion.js +310 -0
  7. package/dist/components/cv-alert-dialog.d.ts +86 -0
  8. package/dist/components/cv-alert-dialog.js +393 -0
  9. package/dist/components/cv-alert.d.ts +48 -0
  10. package/dist/components/cv-alert.js +156 -0
  11. package/dist/components/cv-badge.d.ts +56 -0
  12. package/dist/components/cv-badge.js +280 -0
  13. package/dist/components/cv-breadcrumb-item.d.ts +35 -0
  14. package/dist/components/cv-breadcrumb-item.js +64 -0
  15. package/dist/components/cv-breadcrumb.d.ts +39 -0
  16. package/dist/components/cv-breadcrumb.js +160 -0
  17. package/dist/components/cv-button.d.ts +83 -0
  18. package/dist/components/cv-button.js +541 -0
  19. package/dist/components/cv-callout.d.ts +32 -0
  20. package/dist/components/cv-callout.js +221 -0
  21. package/dist/components/cv-card.d.ts +48 -0
  22. package/dist/components/cv-card.js +269 -0
  23. package/dist/components/cv-carousel-slide.d.ts +25 -0
  24. package/dist/components/cv-carousel-slide.js +51 -0
  25. package/dist/components/cv-carousel.d.ts +96 -0
  26. package/dist/components/cv-carousel.js +457 -0
  27. package/dist/components/cv-checkbox.d.ts +84 -0
  28. package/dist/components/cv-checkbox.js +274 -0
  29. package/dist/components/cv-combobox-group.d.ts +15 -0
  30. package/dist/components/cv-combobox-group.js +34 -0
  31. package/dist/components/cv-combobox-option.d.ts +30 -0
  32. package/dist/components/cv-combobox-option.js +66 -0
  33. package/dist/components/cv-combobox.d.ts +135 -0
  34. package/dist/components/cv-combobox.js +834 -0
  35. package/dist/components/cv-command-item.d.ts +30 -0
  36. package/dist/components/cv-command-item.js +68 -0
  37. package/dist/components/cv-command-palette.d.ts +105 -0
  38. package/dist/components/cv-command-palette.js +578 -0
  39. package/dist/components/cv-context-menu.d.ts +98 -0
  40. package/dist/components/cv-context-menu.js +515 -0
  41. package/dist/components/cv-copy-button.d.ts +61 -0
  42. package/dist/components/cv-copy-button.js +318 -0
  43. package/dist/components/cv-date-picker.d.ts +161 -0
  44. package/dist/components/cv-date-picker.js +803 -0
  45. package/dist/components/cv-dialog.d.ts +89 -0
  46. package/dist/components/cv-dialog.js +459 -0
  47. package/dist/components/cv-disclosure.d.ts +57 -0
  48. package/dist/components/cv-disclosure.js +241 -0
  49. package/dist/components/cv-drawer.d.ts +102 -0
  50. package/dist/components/cv-drawer.js +595 -0
  51. package/dist/components/cv-feed-article.d.ts +26 -0
  52. package/dist/components/cv-feed-article.js +52 -0
  53. package/dist/components/cv-feed.d.ts +62 -0
  54. package/dist/components/cv-feed.js +310 -0
  55. package/dist/components/cv-grid-cell.d.ts +30 -0
  56. package/dist/components/cv-grid-cell.js +57 -0
  57. package/dist/components/cv-grid-column.d.ts +30 -0
  58. package/dist/components/cv-grid-column.js +43 -0
  59. package/dist/components/cv-grid-row.d.ts +30 -0
  60. package/dist/components/cv-grid-row.js +42 -0
  61. package/dist/components/cv-grid.d.ts +119 -0
  62. package/dist/components/cv-grid.js +567 -0
  63. package/dist/components/cv-icon.d.ts +57 -0
  64. package/dist/components/cv-icon.js +352 -0
  65. package/dist/components/cv-input.d.ts +127 -0
  66. package/dist/components/cv-input.js +482 -0
  67. package/dist/components/cv-landmark.d.ts +32 -0
  68. package/dist/components/cv-landmark.js +62 -0
  69. package/dist/components/cv-link.d.ts +22 -0
  70. package/dist/components/cv-link.js +99 -0
  71. package/dist/components/cv-listbox-group.d.ts +15 -0
  72. package/dist/components/cv-listbox-group.js +42 -0
  73. package/dist/components/cv-listbox.d.ts +81 -0
  74. package/dist/components/cv-listbox.js +388 -0
  75. package/dist/components/cv-menu-button.d.ts +118 -0
  76. package/dist/components/cv-menu-button.js +822 -0
  77. package/dist/components/cv-menu-group.d.ts +20 -0
  78. package/dist/components/cv-menu-group.js +48 -0
  79. package/dist/components/cv-menu-item.d.ts +52 -0
  80. package/dist/components/cv-menu-item.js +105 -0
  81. package/dist/components/cv-menu.d.ts +62 -0
  82. package/dist/components/cv-menu.js +414 -0
  83. package/dist/components/cv-meter.d.ts +66 -0
  84. package/dist/components/cv-meter.js +154 -0
  85. package/dist/components/cv-number.d.ts +139 -0
  86. package/dist/components/cv-number.js +553 -0
  87. package/dist/components/cv-option.d.ts +30 -0
  88. package/dist/components/cv-option.js +84 -0
  89. package/dist/components/cv-popover.d.ts +87 -0
  90. package/dist/components/cv-popover.js +373 -0
  91. package/dist/components/cv-progress-ring.d.ts +45 -0
  92. package/dist/components/cv-progress-ring.js +169 -0
  93. package/dist/components/cv-progress.d.ts +45 -0
  94. package/dist/components/cv-progress.js +148 -0
  95. package/dist/components/cv-radio-group.d.ts +79 -0
  96. package/dist/components/cv-radio-group.js +398 -0
  97. package/dist/components/cv-radio.d.ts +36 -0
  98. package/dist/components/cv-radio.js +123 -0
  99. package/dist/components/cv-select-group.d.ts +15 -0
  100. package/dist/components/cv-select-group.js +44 -0
  101. package/dist/components/cv-select-option.d.ts +30 -0
  102. package/dist/components/cv-select-option.js +66 -0
  103. package/dist/components/cv-select.d.ts +128 -0
  104. package/dist/components/cv-select.js +666 -0
  105. package/dist/components/cv-sidebar-item.d.ts +26 -0
  106. package/dist/components/cv-sidebar-item.js +142 -0
  107. package/dist/components/cv-sidebar.d.ts +171 -0
  108. package/dist/components/cv-sidebar.js +767 -0
  109. package/dist/components/cv-slider-multi-thumb.d.ts +73 -0
  110. package/dist/components/cv-slider-multi-thumb.js +374 -0
  111. package/dist/components/cv-slider.d.ts +84 -0
  112. package/dist/components/cv-slider.js +328 -0
  113. package/dist/components/cv-spinbutton.d.ts +121 -0
  114. package/dist/components/cv-spinbutton.js +486 -0
  115. package/dist/components/cv-spinner.d.ts +18 -0
  116. package/dist/components/cv-spinner.js +95 -0
  117. package/dist/components/cv-switch.d.ts +81 -0
  118. package/dist/components/cv-switch.js +285 -0
  119. package/dist/components/cv-tab-panel.d.ts +20 -0
  120. package/dist/components/cv-tab-panel.js +37 -0
  121. package/dist/components/cv-tab.d.ts +40 -0
  122. package/dist/components/cv-tab.js +132 -0
  123. package/dist/components/cv-table-cell.d.ts +31 -0
  124. package/dist/components/cv-table-cell.js +49 -0
  125. package/dist/components/cv-table-column.d.ts +37 -0
  126. package/dist/components/cv-table-column.js +63 -0
  127. package/dist/components/cv-table-row.d.ts +30 -0
  128. package/dist/components/cv-table-row.js +45 -0
  129. package/dist/components/cv-table.d.ts +147 -0
  130. package/dist/components/cv-table.js +607 -0
  131. package/dist/components/cv-tabs.d.ts +70 -0
  132. package/dist/components/cv-tabs.js +524 -0
  133. package/dist/components/cv-textarea.d.ts +108 -0
  134. package/dist/components/cv-textarea.js +328 -0
  135. package/dist/components/cv-toast-region.d.ts +39 -0
  136. package/dist/components/cv-toast-region.js +162 -0
  137. package/dist/components/cv-toast.d.ts +67 -0
  138. package/dist/components/cv-toast.js +315 -0
  139. package/dist/components/cv-toolbar-item.d.ts +25 -0
  140. package/dist/components/cv-toolbar-item.js +72 -0
  141. package/dist/components/cv-toolbar-separator.d.ts +25 -0
  142. package/dist/components/cv-toolbar-separator.js +45 -0
  143. package/dist/components/cv-toolbar.d.ts +63 -0
  144. package/dist/components/cv-toolbar.js +295 -0
  145. package/dist/components/cv-tooltip.d.ts +83 -0
  146. package/dist/components/cv-tooltip.js +455 -0
  147. package/dist/components/cv-treegrid-cell.d.ts +30 -0
  148. package/dist/components/cv-treegrid-cell.js +57 -0
  149. package/dist/components/cv-treegrid-column.d.ts +37 -0
  150. package/dist/components/cv-treegrid-column.js +53 -0
  151. package/dist/components/cv-treegrid-row.d.ts +55 -0
  152. package/dist/components/cv-treegrid-row.js +90 -0
  153. package/dist/components/cv-treegrid.d.ts +96 -0
  154. package/dist/components/cv-treegrid.js +632 -0
  155. package/dist/components/cv-treeitem.d.ts +58 -0
  156. package/dist/components/cv-treeitem.js +144 -0
  157. package/dist/components/cv-treeview.d.ts +70 -0
  158. package/dist/components/cv-treeview.js +396 -0
  159. package/dist/components/cv-window-splitter.d.ts +79 -0
  160. package/dist/components/cv-window-splitter.js +316 -0
  161. package/dist/components/index.d.ts +94 -0
  162. package/dist/components/index.js +79 -0
  163. package/dist/dialog/create-dialog-controller.d.ts +31 -0
  164. package/dist/dialog/create-dialog-controller.js +320 -0
  165. package/dist/dialog/index.d.ts +2 -0
  166. package/dist/dialog/index.js +1 -0
  167. package/dist/form-associated/FormAssociatedReatomElement.d.ts +25 -0
  168. package/dist/form-associated/FormAssociatedReatomElement.js +70 -0
  169. package/dist/form-associated/withFormAssociated.d.ts +5 -0
  170. package/dist/form-associated/withFormAssociated.js +1 -0
  171. package/dist/index.d.ts +10 -0
  172. package/dist/index.js +9 -0
  173. package/dist/reatom-lit/ReatomLitElement.d.ts +27 -0
  174. package/dist/reatom-lit/ReatomLitElement.js +118 -0
  175. package/dist/reatom-lit/html.d.ts +4 -0
  176. package/dist/reatom-lit/html.js +10 -0
  177. package/dist/reatom-lit/index.d.ts +4 -0
  178. package/dist/reatom-lit/index.js +4 -0
  179. package/dist/reatom-lit/watch.d.ts +15 -0
  180. package/dist/reatom-lit/watch.js +40 -0
  181. package/dist/reatom-lit/withReatomElement.d.ts +4 -0
  182. package/dist/reatom-lit/withReatomElement.js +57 -0
  183. package/dist/register.d.ts +1 -0
  184. package/dist/register.js +84 -0
  185. package/dist/styles/component-styles.d.ts +4 -0
  186. package/dist/styles/component-styles.js +78 -0
  187. package/dist/theme/cv-theme-provider.d.ts +32 -0
  188. package/dist/theme/cv-theme-provider.js +110 -0
  189. package/dist/theme/index.d.ts +4 -0
  190. package/dist/theme/index.js +2 -0
  191. package/dist/theme/theme-engine.d.ts +4 -0
  192. package/dist/theme/theme-engine.js +67 -0
  193. package/dist/theme/tokens.css +265 -0
  194. package/dist/theme/types.d.ts +7 -0
  195. package/dist/theme/types.js +1 -0
  196. package/dist/toast/create-toast-controller.d.ts +12 -0
  197. package/dist/toast/create-toast-controller.js +12 -0
  198. package/dist/toast/index.d.ts +2 -0
  199. package/dist/toast/index.js +1 -0
  200. package/package.json +146 -0
  201. package/specs/_template.md +110 -0
  202. package/specs/components/accordion.md +207 -0
  203. package/specs/components/alert.md +83 -0
  204. package/specs/components/badge.md +183 -0
  205. package/specs/components/breadcrumb.md +152 -0
  206. package/specs/components/button.md +227 -0
  207. package/specs/components/callout.md +153 -0
  208. package/specs/components/card.md +192 -0
  209. package/specs/components/carousel.md +232 -0
  210. package/specs/components/checkbox.md +141 -0
  211. package/specs/components/combobox.md +427 -0
  212. package/specs/components/context-menu.md +375 -0
  213. package/specs/components/copy-button.md +236 -0
  214. package/specs/components/date-picker.md +290 -0
  215. package/specs/components/dialog.md +184 -0
  216. package/specs/components/disclosure.md +151 -0
  217. package/specs/components/drawer.md +216 -0
  218. package/specs/components/feed.md +266 -0
  219. package/specs/components/grid.md +423 -0
  220. package/specs/components/input.md +237 -0
  221. package/specs/components/landmark.md +92 -0
  222. package/specs/components/link.md +117 -0
  223. package/specs/components/listbox.md +327 -0
  224. package/specs/components/menu.md +508 -0
  225. package/specs/components/meter.md +148 -0
  226. package/specs/components/number.md +268 -0
  227. package/specs/components/option.md +167 -0
  228. package/specs/components/popover.md +207 -0
  229. package/specs/components/progress-ring.md +134 -0
  230. package/specs/components/progress.md +110 -0
  231. package/specs/components/radio.md +208 -0
  232. package/specs/components/select.md +305 -0
  233. package/specs/components/sidebar.md +204 -0
  234. package/specs/components/spinbutton.md +157 -0
  235. package/specs/components/spinner.md +83 -0
  236. package/specs/components/switch.md +145 -0
  237. package/specs/components/table.md +372 -0
  238. package/specs/components/tabs.md +242 -0
  239. package/specs/components/textarea.md +166 -0
  240. package/specs/components/theme.md +364 -0
  241. package/specs/components/toast.md +198 -0
  242. package/specs/components/toolbar.md +258 -0
  243. package/specs/components/tooltip.md +152 -0
  244. package/specs/components/treegrid.md +363 -0
  245. package/specs/components/treeview.md +263 -0
  246. package/specs/components/window-splitter.md +225 -0
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ ChromVoid uses the GNU Affero General Public License, version 3, for the
2
+ components identified as `AGPL-3.0-only` in `LICENSING.md`.
3
+
4
+ Canonical text:
5
+ https://www.gnu.org/licenses/agpl-3.0.txt
6
+
7
+ Human-readable overview:
8
+ https://www.gnu.org/licenses/agpl-3.0.en.html
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @chromvoid/uikit
2
+
3
+ Thin Lit UI layer over `@chromvoid/headless-ui`.
4
+
5
+ ## Scope (MVP)
6
+
7
+ - `cv-theme-provider` + theme engine API
8
+ - `cv-accordion` + `cv-accordion-item`
9
+ - `cv-alert-dialog`
10
+ - `cv-alert`
11
+ - `cv-breadcrumb` + `cv-breadcrumb-item`
12
+ - `cv-button`
13
+ - `cv-carousel` + `cv-carousel-slide`
14
+ - `cv-checkbox`
15
+ - `cv-command-palette` + `cv-command-item`
16
+ - `cv-combobox` + `cv-combobox-option`
17
+ - `cv-context-menu` + `cv-menu-item`
18
+ - `cv-disclosure`
19
+ - `cv-dialog`
20
+ - `cv-feed` + `cv-feed-article`
21
+ - `cv-grid` + `cv-grid-column` + `cv-grid-row` + `cv-grid-cell`
22
+ - `cv-landmark`
23
+ - `cv-link`
24
+ - `cv-listbox` + `cv-option`
25
+ - `cv-menu` + `cv-menu-item`
26
+ - `cv-menu-button` + `cv-menu-item`
27
+ - `cv-meter`
28
+ - `cv-popover`
29
+ - `cv-radio-group` + `cv-radio`
30
+ - `cv-select` + `cv-select-option` + `cv-select-group`
31
+ - `cv-slider`
32
+ - `cv-slider-multi-thumb`
33
+ - `cv-spinbutton`
34
+ - `cv-switch`
35
+ - `cv-table` + `cv-table-column` + `cv-table-row` + `cv-table-cell`
36
+ - `cv-progress`
37
+ - `cv-tabs` + `cv-tab` + `cv-tab-panel`
38
+ - `cv-toast-region` + imperative toast controller
39
+ - `cv-treegrid` + `cv-treegrid-column` + `cv-treegrid-row` + `cv-treegrid-cell`
40
+ - `cv-treeview` + `cv-treeitem`
41
+ - `cv-toolbar` + `cv-toolbar-item`
42
+ - `cv-tooltip`
43
+ - `cv-window-splitter`
44
+ - vendored Reatom Lit runtime helpers
45
+
46
+ ## Vendored Reatom Lit source
47
+
48
+ The `src/reatom-lit/*` files are vendored from:
49
+
50
+ - Repository: `https://github.com/kaifaty/reatom`
51
+ - Branch: `LIT_UPDATE`
52
+ - Commit: `37ea4f8f6ff7165080f0f6c44603ab508cdf7238`
53
+
54
+ ## Usage
55
+
56
+ ```ts
57
+ import {registerUikit} from '@chromvoid/uikit/register'
58
+
59
+ registerUikit()
60
+ ```
61
+
62
+ Optional theme css defaults:
63
+
64
+ ```ts
65
+ import '@chromvoid/uikit/theme/tokens.css'
66
+ ```
67
+
68
+ ## Package-local Workflow
69
+
70
+ ```bash
71
+ npm install
72
+ npm run lint
73
+ npm run test
74
+ npm run build
75
+ npm pack --dry-run
76
+ ```
77
+
78
+ Run local documentation site:
79
+
80
+ ```bash
81
+ npm run docs:dev
82
+ ```
83
+
84
+ Open the docs dev server through the legacy shortcut:
85
+
86
+ ```bash
87
+ npm run demo
88
+ ```
89
+
90
+ The interactive playground now lives inside the documentation site at `/guide/playground`.
91
+
92
+ Build the static docs output used for GitHub Pages:
93
+
94
+ ```bash
95
+ npm run docs:build
96
+ ```
@@ -0,0 +1,69 @@
1
+ import { LitElement } from 'lit';
2
+ interface CVAccordionItemTriggerState {
3
+ id: string;
4
+ role: 'button';
5
+ tabindex: '0' | '-1';
6
+ ariaExpanded: 'true' | 'false';
7
+ ariaControls: string;
8
+ ariaDisabled: 'true' | 'false';
9
+ }
10
+ interface CVAccordionItemPanelState {
11
+ id: string;
12
+ role: 'region';
13
+ ariaLabelledBy: string;
14
+ hidden: boolean;
15
+ }
16
+ export interface CVAccordionItemContracts {
17
+ headerId: string;
18
+ trigger: CVAccordionItemTriggerState;
19
+ panel: CVAccordionItemPanelState;
20
+ }
21
+ export interface CVAccordionItemTriggerKeydownDetail {
22
+ key: string;
23
+ }
24
+ export type CVAccordionItemTriggerClickEvent = CustomEvent<null>;
25
+ export type CVAccordionItemTriggerFocusEvent = CustomEvent<null>;
26
+ export type CVAccordionItemTriggerKeydownEvent = CustomEvent<CVAccordionItemTriggerKeydownDetail>;
27
+ export interface CVAccordionItemEventMap {
28
+ 'cv-accordion-item-trigger-click': CVAccordionItemTriggerClickEvent;
29
+ 'cv-accordion-item-trigger-focus': CVAccordionItemTriggerFocusEvent;
30
+ 'cv-accordion-item-trigger-keydown': CVAccordionItemTriggerKeydownEvent;
31
+ }
32
+ export declare class CVAccordionItem extends LitElement {
33
+ static elementName: string;
34
+ static get properties(): {
35
+ value: {
36
+ type: StringConstructor;
37
+ reflect: boolean;
38
+ };
39
+ disabled: {
40
+ type: BooleanConstructor;
41
+ reflect: boolean;
42
+ };
43
+ expanded: {
44
+ type: BooleanConstructor;
45
+ reflect: boolean;
46
+ };
47
+ active: {
48
+ type: BooleanConstructor;
49
+ reflect: boolean;
50
+ };
51
+ };
52
+ value: string;
53
+ disabled: boolean;
54
+ expanded: boolean;
55
+ active: boolean;
56
+ private headerId;
57
+ private triggerState;
58
+ private panelState;
59
+ constructor();
60
+ static styles: import("lit").CSSResult[];
61
+ static define(): void;
62
+ applyContracts(contracts: CVAccordionItemContracts): void;
63
+ focusTrigger(): void;
64
+ private handleTriggerClick;
65
+ private handleTriggerFocus;
66
+ private handleTriggerKeyDown;
67
+ protected render(): import("lit").TemplateResult<1>;
68
+ }
69
+ export {};
@@ -0,0 +1,176 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+ export class CVAccordionItem extends LitElement {
3
+ static elementName = 'cv-accordion-item';
4
+ static get properties() {
5
+ return {
6
+ value: { type: String, reflect: true },
7
+ disabled: { type: Boolean, reflect: true },
8
+ expanded: { type: Boolean, reflect: true },
9
+ active: { type: Boolean, reflect: true },
10
+ };
11
+ }
12
+ headerId = '';
13
+ triggerState = {
14
+ id: '',
15
+ role: 'button',
16
+ tabindex: '-1',
17
+ ariaExpanded: 'false',
18
+ ariaControls: '',
19
+ ariaDisabled: 'false',
20
+ };
21
+ panelState = {
22
+ id: '',
23
+ role: 'region',
24
+ ariaLabelledBy: '',
25
+ hidden: true,
26
+ };
27
+ constructor() {
28
+ super();
29
+ this.value = '';
30
+ this.disabled = false;
31
+ this.expanded = false;
32
+ this.active = false;
33
+ }
34
+ static styles = [
35
+ css `
36
+ :host {
37
+ display: block;
38
+ }
39
+
40
+ [part='base'] {
41
+ display: grid;
42
+ gap: var(--cv-space-1, 4px);
43
+ }
44
+
45
+ [part='trigger'] {
46
+ inline-size: 100%;
47
+ min-block-size: 36px;
48
+ display: inline-flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ gap: var(--cv-space-2, 8px);
52
+ padding: 0 var(--cv-space-3, 12px);
53
+ border-radius: var(--cv-radius-sm, 6px);
54
+ border: 1px solid var(--cv-color-border, #2a3245);
55
+ background: var(--cv-color-surface, #141923);
56
+ color: var(--cv-color-text, #e8ecf6);
57
+ font: inherit;
58
+ text-align: start;
59
+ }
60
+
61
+ [part='trigger']:focus-visible {
62
+ outline: 2px solid var(--cv-color-primary, #65d7ff);
63
+ outline-offset: 1px;
64
+ }
65
+
66
+ [part='trigger-icon'] {
67
+ inline-size: 16px;
68
+ block-size: 16px;
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ color: var(--cv-color-text-muted, #9aa6bf);
73
+ transition: transform var(--cv-duration-fast, 120ms) var(--cv-easing-standard, ease);
74
+ }
75
+
76
+ :host([expanded]) [part='trigger-icon'] {
77
+ transform: rotate(90deg);
78
+ }
79
+
80
+ [part='panel'] {
81
+ padding: var(--cv-space-3, 12px);
82
+ border-radius: var(--cv-radius-sm, 6px);
83
+ border: 1px solid var(--cv-color-border, #2a3245);
84
+ background: var(--cv-color-surface-elevated, #1d2432);
85
+ color: var(--cv-color-text, #e8ecf6);
86
+ }
87
+
88
+ [part='panel'][hidden] {
89
+ display: none;
90
+ }
91
+
92
+ :host([active]) [part='trigger'] {
93
+ border-color: var(--cv-color-primary, #65d7ff);
94
+ }
95
+
96
+ :host([disabled]) [part='trigger'] {
97
+ opacity: 0.55;
98
+ }
99
+ `,
100
+ ];
101
+ static define() {
102
+ if (!customElements.get(this.elementName)) {
103
+ customElements.define(this.elementName, this);
104
+ }
105
+ }
106
+ applyContracts(contracts) {
107
+ this.headerId = contracts.headerId;
108
+ this.triggerState = contracts.trigger;
109
+ this.panelState = contracts.panel;
110
+ this.expanded = contracts.trigger.ariaExpanded === 'true';
111
+ this.active = contracts.trigger.tabindex === '0';
112
+ this.requestUpdate();
113
+ }
114
+ focusTrigger() {
115
+ const trigger = this.renderRoot.querySelector('[part="trigger"]');
116
+ trigger?.focus();
117
+ }
118
+ handleTriggerClick() {
119
+ this.dispatchEvent(new CustomEvent('cv-accordion-item-trigger-click', {
120
+ bubbles: true,
121
+ composed: true,
122
+ }));
123
+ }
124
+ handleTriggerFocus() {
125
+ this.dispatchEvent(new CustomEvent('cv-accordion-item-trigger-focus', {
126
+ bubbles: true,
127
+ composed: true,
128
+ }));
129
+ }
130
+ handleTriggerKeyDown(event) {
131
+ const dispatched = this.dispatchEvent(new CustomEvent('cv-accordion-item-trigger-keydown', {
132
+ detail: { key: event.key },
133
+ bubbles: true,
134
+ composed: true,
135
+ cancelable: true,
136
+ }));
137
+ if (!dispatched) {
138
+ event.preventDefault();
139
+ }
140
+ }
141
+ render() {
142
+ return html `
143
+ <div part="base">
144
+ <h3 id=${this.headerId} part="header">
145
+ <button
146
+ id=${this.triggerState.id}
147
+ role=${this.triggerState.role}
148
+ tabindex=${this.triggerState.tabindex}
149
+ aria-expanded=${this.triggerState.ariaExpanded}
150
+ aria-controls=${this.triggerState.ariaControls}
151
+ aria-disabled=${this.triggerState.ariaDisabled}
152
+ ?disabled=${this.triggerState.ariaDisabled === 'true'}
153
+ part="trigger"
154
+ type="button"
155
+ @click=${this.handleTriggerClick}
156
+ @focus=${this.handleTriggerFocus}
157
+ @keydown=${this.handleTriggerKeyDown}
158
+ >
159
+ <slot name="trigger"></slot>
160
+ <span part="trigger-icon" aria-hidden="true">▶</span>
161
+ </button>
162
+ </h3>
163
+
164
+ <div
165
+ id=${this.panelState.id}
166
+ role=${this.panelState.role}
167
+ aria-labelledby=${this.panelState.ariaLabelledBy || nothing}
168
+ ?hidden=${this.panelState.hidden}
169
+ part="panel"
170
+ >
171
+ <slot></slot>
172
+ </div>
173
+ </div>
174
+ `;
175
+ }
176
+ }
@@ -0,0 +1,79 @@
1
+ import type { PropertyValues } from 'lit';
2
+ import { ReatomLitElement } from '../reatom-lit/ReatomLitElement.js';
3
+ export interface CVAccordionEventDetail {
4
+ value: string | null;
5
+ values: string[];
6
+ activeId: string | null;
7
+ }
8
+ export declare class CVAccordion extends ReatomLitElement {
9
+ static elementName: string;
10
+ static get properties(): {
11
+ value: {
12
+ type: StringConstructor;
13
+ reflect: boolean;
14
+ };
15
+ expandedValues: {
16
+ attribute: boolean;
17
+ };
18
+ allowMultiple: {
19
+ type: BooleanConstructor;
20
+ attribute: string;
21
+ reflect: boolean;
22
+ };
23
+ allowZeroExpanded: {
24
+ type: BooleanConstructor;
25
+ attribute: string;
26
+ reflect: boolean;
27
+ };
28
+ headingLevel: {
29
+ type: NumberConstructor;
30
+ attribute: string;
31
+ reflect: boolean;
32
+ };
33
+ ariaLabel: {
34
+ type: StringConstructor;
35
+ attribute: string;
36
+ };
37
+ revealExpanded: {
38
+ type: BooleanConstructor;
39
+ attribute: string;
40
+ };
41
+ };
42
+ value: string;
43
+ expandedValues: string[];
44
+ allowMultiple: boolean;
45
+ allowZeroExpanded: boolean;
46
+ headingLevel: number;
47
+ ariaLabel: string;
48
+ revealExpanded: boolean;
49
+ private readonly idBase;
50
+ private itemRecords;
51
+ private itemListeners;
52
+ private readonly model;
53
+ constructor();
54
+ static styles: import("lit").CSSResult[];
55
+ static define(): void;
56
+ connectedCallback(): void;
57
+ disconnectedCallback(): void;
58
+ willUpdate(changedProperties: PropertyValues): void;
59
+ updated(changedProperties: PropertyValues): void;
60
+ private getItemElements;
61
+ private ensureItemValue;
62
+ private resolveConfiguredExpandedIds;
63
+ private syncFromSlot;
64
+ private detachItemListeners;
65
+ private attachItemListeners;
66
+ private syncItemElements;
67
+ private syncControlledValuesFromModel;
68
+ private captureSnapshot;
69
+ private focusActiveItem;
70
+ private dispatchInput;
71
+ private dispatchChange;
72
+ private revealExpandedItem;
73
+ private applyInteractionResult;
74
+ private handleItemTriggerClick;
75
+ private handleItemTriggerFocus;
76
+ private handleItemTriggerKeyDown;
77
+ private handleSlotChange;
78
+ protected render(): import("lit").TemplateResult<1>;
79
+ }