@getdom/studio 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 (213) hide show
  1. package/LICENSE.md +109 -0
  2. package/README.md +44 -0
  3. package/SKILL.md +83 -0
  4. package/package.json +73 -0
  5. package/public/llms.txt +57 -0
  6. package/public/skills.sh +11 -0
  7. package/src/pages/_layout/componentCatalog.generated.js +4514 -0
  8. package/src/pages/_layout/componentInspector.js +60 -0
  9. package/src/pages/_layout/componentManager.js +192 -0
  10. package/src/pages/_layout/componentRuntimeRecords.js +49 -0
  11. package/src/pages/_layout/inspector/componentRegistry.js +639 -0
  12. package/src/pages/_layout/inspector/serialize.js +134 -0
  13. package/src/pages/_layout/inspector/useInspector.js +293 -0
  14. package/src/pages/components/accordion/DomAccordion.vue +39 -0
  15. package/src/pages/components/breadcrumbs/DomBreadcrumbs.vue +347 -0
  16. package/src/pages/components/button/DomButton.vue +132 -0
  17. package/src/pages/components/command-palette/DomCommandPalette.vue +482 -0
  18. package/src/pages/components/context-menu/DomContextMenu.vue +178 -0
  19. package/src/pages/components/dialog/DomDialog.vue +271 -0
  20. package/src/pages/components/dialog/DomDialogSchemaForm.vue +72 -0
  21. package/src/pages/components/dialog/DomDialogStack.vue +289 -0
  22. package/src/pages/components/dialog/useDialogs.js +253 -0
  23. package/src/pages/components/drawer/DomDrawer.vue +159 -0
  24. package/src/pages/components/dropdown/DomDropdown.vue +261 -0
  25. package/src/pages/components/icon-button/DomIconButton.vue +155 -0
  26. package/src/pages/components/lightbox/DomLightbox.vue +1561 -0
  27. package/src/pages/components/menu/DomMenu.vue +359 -0
  28. package/src/pages/components/menu/DomMenuItem.vue +233 -0
  29. package/src/pages/components/menu/DomMenuLabel.vue +19 -0
  30. package/src/pages/components/menu/DomMenuSeparator.vue +14 -0
  31. package/src/pages/components/menu/menuContext.js +11 -0
  32. package/src/pages/components/menu/menuPlacement.js +26 -0
  33. package/src/pages/components/menu/submenu.js +58 -0
  34. package/src/pages/components/pagination/DomPagination.vue +265 -0
  35. package/src/pages/components/playground/DomRenderer.vue +48 -0
  36. package/src/pages/components/popover/DomPopover.vue +244 -0
  37. package/src/pages/components/profile-menu/DomProfileMenu.vue +408 -0
  38. package/src/pages/components/profile-menu/DomProfileMenuItemContent.vue +45 -0
  39. package/src/pages/components/scroll-menu/DomScrollMenu.vue +430 -0
  40. package/src/pages/components/scroll-menu/DomScrollMenuItem.vue +212 -0
  41. package/src/pages/components/scroll-menu/scrollMenuContext.js +22 -0
  42. package/src/pages/components/splitter-panel/DomSplitterPanel.vue +283 -0
  43. package/src/pages/components/stepper/DomStepper.vue +386 -0
  44. package/src/pages/components/tabs/DomTabs.vue +149 -0
  45. package/src/pages/components/theme-switcher/DomThemeSwitcher.vue +226 -0
  46. package/src/pages/components/toast/DomToastItem.vue +52 -0
  47. package/src/pages/components/toast/DomToastStack.vue +768 -0
  48. package/src/pages/components/toast/useToasts.js +237 -0
  49. package/src/pages/components/toolbar/DomToolbar.vue +158 -0
  50. package/src/pages/components/tooltip/DomTooltip.vue +69 -0
  51. package/src/pages/components/tooltip/vDomTooltip.js +106 -0
  52. package/src/pages/components/tree-view/DomTreeView.vue +961 -0
  53. package/src/pages/components/tree-view/treeSchemas.js +129 -0
  54. package/src/pages/components/tree-view/treeUtils.js +228 -0
  55. package/src/pages/data/_shared/calculateVirtualWindow.js +101 -0
  56. package/src/pages/data/_shared/resourceRecord.js +29 -0
  57. package/src/pages/data/activity-timeline/DomActivityTimeline.vue +417 -0
  58. package/src/pages/data/agent-chat/DomAgentChatShell.vue +565 -0
  59. package/src/pages/data/agent-chat/DomAgentConversation.vue +737 -0
  60. package/src/pages/data/agent-chat/DomAgentConversationList.vue +319 -0
  61. package/src/pages/data/agent-chat/examples/agentChatMockApi.js +620 -0
  62. package/src/pages/data/agent-chat/examples/useAgentChatDemoStore.js +730 -0
  63. package/src/pages/data/data-grid/DataGridVirtualRows.vue +220 -0
  64. package/src/pages/data/data-grid/DomDataGrid.vue +1643 -0
  65. package/src/pages/data/document-editor/DomDocumentEditor.vue +3030 -0
  66. package/src/pages/data/document-editor/documentEditorCodeBlock.js +282 -0
  67. package/src/pages/data/document-editor/examples/documentEditorMockApi.js +272 -0
  68. package/src/pages/data/document-editor/examples/useDocumentEditorDemoStore.js +284 -0
  69. package/src/pages/data/filter-bar/DomFilterBar.vue +533 -0
  70. package/src/pages/data/kanban/DomKanban.vue +1703 -0
  71. package/src/pages/data/kanban/kanbanApi.js +80 -0
  72. package/src/pages/data/media-browser/DomMediaBrowser.vue +2344 -0
  73. package/src/pages/data/media-browser/examples/mediaBrowserMockApi.js +653 -0
  74. package/src/pages/data/media-browser/examples/useMediaBrowserDemoStore.js +1157 -0
  75. package/src/pages/data/month-calendar/DomMonthCalendar.vue +1718 -0
  76. package/src/pages/data/week-planner/DomWeekPlanner.vue +2308 -0
  77. package/src/pages/dev/code-block/DomCodeBlock.vue +263 -0
  78. package/src/pages/dev/json-viewer/DomJsonViewer.vue +962 -0
  79. package/src/pages/forms/_shared/DomFieldLoadingSpinner.vue +12 -0
  80. package/src/pages/forms/_shared/options.js +61 -0
  81. package/src/pages/forms/_shared/useOptionMenu.js +59 -0
  82. package/src/pages/forms/autocomplete/DomAutocomplete.vue +180 -0
  83. package/src/pages/forms/calendar/DomCalendar.vue +442 -0
  84. package/src/pages/forms/checkbox/DomCheckbox.vue +69 -0
  85. package/src/pages/forms/class-toggle-input/DomClassToggleInput.vue +316 -0
  86. package/src/pages/forms/code-input/DomCodeInput.vue +202 -0
  87. package/src/pages/forms/color-input/DomColorInput.vue +118 -0
  88. package/src/pages/forms/combobox/DomCombobox.vue +237 -0
  89. package/src/pages/forms/confirmation-code-input/DomConfirmationCodeInput.vue +345 -0
  90. package/src/pages/forms/date-picker/DomDatePicker.vue +299 -0
  91. package/src/pages/forms/date-time-picker/DomDateTimePicker.vue +630 -0
  92. package/src/pages/forms/email-input/DomEmailInput.vue +55 -0
  93. package/src/pages/forms/field/DomField.vue +267 -0
  94. package/src/pages/forms/field/fieldLayout.js +1 -0
  95. package/src/pages/forms/field/fieldProps.js +114 -0
  96. package/src/pages/forms/field/layouts/DomGridFieldLayout.vue +38 -0
  97. package/src/pages/forms/field/useField.js +343 -0
  98. package/src/pages/forms/field/validators.js +364 -0
  99. package/src/pages/forms/file-upload/DomFileUpload.vue +361 -0
  100. package/src/pages/forms/form/DomForm.vue +985 -0
  101. package/src/pages/forms/form/adapters/fieldBuilder.js +45 -0
  102. package/src/pages/forms/form/adapters/jsonSchema.js +264 -0
  103. package/src/pages/forms/form/adapters/shared.js +53 -0
  104. package/src/pages/forms/form/adapters/zod.js +235 -0
  105. package/src/pages/forms/form/formApi.js +38 -0
  106. package/src/pages/forms/form/formDefinition.js +392 -0
  107. package/src/pages/forms/form/schemaAdapter.js +54 -0
  108. package/src/pages/forms/icon-selector/DomIconSelector.vue +460 -0
  109. package/src/pages/forms/icon-selector/iconSelectorItems.js +490 -0
  110. package/src/pages/forms/input-group/DomInputGroup.vue +232 -0
  111. package/src/pages/forms/json-input/DomJsonInput.vue +227 -0
  112. package/src/pages/forms/json-list-input/DomJsonListInput.vue +206 -0
  113. package/src/pages/forms/listbox/DomListbox.vue +105 -0
  114. package/src/pages/forms/money-input/DomMoneyInput.vue +147 -0
  115. package/src/pages/forms/native-select/DomNativeSelect.vue +67 -0
  116. package/src/pages/forms/number-input/DomNumberInput.vue +47 -0
  117. package/src/pages/forms/password-input/DomPasswordInput.vue +218 -0
  118. package/src/pages/forms/password-input/pwnedPasswords.js +47 -0
  119. package/src/pages/forms/password-strength/DomPasswordStrength.vue +128 -0
  120. package/src/pages/forms/password-strength/passwordStrength.js +92 -0
  121. package/src/pages/forms/position-input/DomPositionInput.vue +83 -0
  122. package/src/pages/forms/radio-group/DomRadioGroup.vue +102 -0
  123. package/src/pages/forms/range-input/DomRangeInput.vue +296 -0
  124. package/src/pages/forms/select/DomSelect.vue +479 -0
  125. package/src/pages/forms/select-input/DomSelectInput.vue +155 -0
  126. package/src/pages/forms/tag-combobox/DomTagCombobox.vue +358 -0
  127. package/src/pages/forms/text-input/DomTextInput.vue +48 -0
  128. package/src/pages/forms/textarea-composer/DomTextareaComposer.vue +234 -0
  129. package/src/pages/forms/textarea-input/DomTextareaInput.vue +86 -0
  130. package/src/pages/forms/textarea-input/useTextareaAutosize.js +147 -0
  131. package/src/pages/forms/time-selector/DomTimeSelector.vue +389 -0
  132. package/src/pages/forms/time-selector/timeUtils.js +194 -0
  133. package/src/pages/forms/toggle/DomToggle.vue +158 -0
  134. package/src/pages/forms/toggle-button/DomToggleButton.vue +88 -0
  135. package/src/pages/forms/toggle-button-group/DomToggleButtonGroup.vue +340 -0
  136. package/src/pages/forms/url-input/DomUrlInput.vue +55 -0
  137. package/src/pages/forms/wysiwyg/DomWysiwyg.vue +204 -0
  138. package/src/pages/lib/css/color.js +245 -0
  139. package/src/pages/lib/headless/accordion.d.ts +7 -0
  140. package/src/pages/lib/headless/accordion.js +246 -0
  141. package/src/pages/lib/headless/autocomplete.d.ts +4 -0
  142. package/src/pages/lib/headless/autocomplete.js +33 -0
  143. package/src/pages/lib/headless/base.d.ts +25 -0
  144. package/src/pages/lib/headless/base.js +127 -0
  145. package/src/pages/lib/headless/checkbox.d.ts +19 -0
  146. package/src/pages/lib/headless/checkbox.js +99 -0
  147. package/src/pages/lib/headless/combobox.d.ts +7 -0
  148. package/src/pages/lib/headless/combobox.js +488 -0
  149. package/src/pages/lib/headless/dialog.d.ts +23 -0
  150. package/src/pages/lib/headless/dialog.js +384 -0
  151. package/src/pages/lib/headless/drawer.d.ts +21 -0
  152. package/src/pages/lib/headless/drawer.js +682 -0
  153. package/src/pages/lib/headless/dropdown.d.ts +19 -0
  154. package/src/pages/lib/headless/dropdown.js +412 -0
  155. package/src/pages/lib/headless/floating-effect.js +118 -0
  156. package/src/pages/lib/headless/floating.d.ts +34 -0
  157. package/src/pages/lib/headless/floating.js +382 -0
  158. package/src/pages/lib/headless/index.d.ts +19 -0
  159. package/src/pages/lib/headless/index.js +19 -0
  160. package/src/pages/lib/headless/listbox.d.ts +19 -0
  161. package/src/pages/lib/headless/listbox.js +126 -0
  162. package/src/pages/lib/headless/menu.d.ts +18 -0
  163. package/src/pages/lib/headless/menu.js +117 -0
  164. package/src/pages/lib/headless/popover-panel.d.ts +18 -0
  165. package/src/pages/lib/headless/popover-panel.js +309 -0
  166. package/src/pages/lib/headless/popover.d.ts +19 -0
  167. package/src/pages/lib/headless/popover.js +391 -0
  168. package/src/pages/lib/headless/radio-group.d.ts +19 -0
  169. package/src/pages/lib/headless/radio-group.js +100 -0
  170. package/src/pages/lib/headless/tabs.d.ts +18 -0
  171. package/src/pages/lib/headless/tabs.js +119 -0
  172. package/src/pages/lib/headless/toast.d.ts +13 -0
  173. package/src/pages/lib/headless/toast.js +65 -0
  174. package/src/pages/lib/headless/toggle.d.ts +19 -0
  175. package/src/pages/lib/headless/toggle.js +162 -0
  176. package/src/pages/lib/headless/tooltip-controller.d.ts +22 -0
  177. package/src/pages/lib/headless/tooltip-controller.js +549 -0
  178. package/src/pages/lib/headless/tooltip.d.ts +19 -0
  179. package/src/pages/lib/headless/tooltip.js +153 -0
  180. package/src/pages/lib/headless/transitions.d.ts +5 -0
  181. package/src/pages/lib/headless/transitions.js +89 -0
  182. package/src/pages/lib/vue/_internal/DomLiquidGlassSurface.vue +310 -0
  183. package/src/pages/lib/vue/_internal/liquidGlass.js +112 -0
  184. package/src/pages/lib/vue/_internal/liquidGlassConfig.js +10 -0
  185. package/src/pages/lib/vue/codeHighlighter.js +132 -0
  186. package/src/pages/lib/vue/floatingTeleportTarget.js +23 -0
  187. package/src/pages/lib/vue/index.d.ts +6806 -0
  188. package/src/pages/lib/vue/index.js +218 -0
  189. package/src/pages/lib/vue/useTheme.js +116 -0
  190. package/src/pages/mobile/action-sheet/DomActionSheet.vue +186 -0
  191. package/src/pages/mobile/bottom-nav/DomAppBottomNav.vue +94 -0
  192. package/src/pages/mobile/list-item/DomAppListItem.vue +90 -0
  193. package/src/pages/mobile/safe-area/DomSafeArea.vue +39 -0
  194. package/src/pages/mobile/shell/DomAppShell.vue +51 -0
  195. package/src/pages/mobile/stack/AppStackScreen.vue +63 -0
  196. package/src/pages/mobile/stack/DomAppStack.vue +711 -0
  197. package/src/pages/mobile/top-bar/DomAppTopBar.vue +67 -0
  198. package/src/pages/visual/alert/DomAlert.vue +363 -0
  199. package/src/pages/visual/avatar/DomAvatar.vue +110 -0
  200. package/src/pages/visual/avatar-stack/DomAvatarStack.vue +89 -0
  201. package/src/pages/visual/badge/DomBadge.vue +105 -0
  202. package/src/pages/visual/card/DomCard.vue +65 -0
  203. package/src/pages/visual/card-rail/DomCardRail.vue +99 -0
  204. package/src/pages/visual/empty-state/DomEmptyState.vue +88 -0
  205. package/src/pages/visual/progress/DomProgress.vue +212 -0
  206. package/src/pages/visual/progress/DomRadialProgress.vue +186 -0
  207. package/src/pages/visual/progress/DomSegmentedProgress.vue +350 -0
  208. package/src/pages/visual/skeleton/DomSkeleton.vue +174 -0
  209. package/src/pages/visual/spinner/DomSpinner.vue +122 -0
  210. package/src/pages/visual/status-pill/DomStatusPill.vue +75 -0
  211. package/src/pages/visual/text-diff/DomTextDiff.vue +577 -0
  212. package/src/pages/visual/text-diff/textDiff.js +300 -0
  213. package/src/style.css +446 -0
@@ -0,0 +1,4514 @@
1
+ // Generated by scripts/generate-component-catalog.mjs. Do not edit by hand.
2
+ export const componentCatalog = [
3
+ {
4
+ "id": "components/accordion",
5
+ "path": "../components/accordion/DomAccordion.vue",
6
+ "section": "components",
7
+ "slug": "accordion",
8
+ "exportName": "DomAccordion",
9
+ "route": "/components/accordion",
10
+ "doc": {},
11
+ "studio": {}
12
+ },
13
+ {
14
+ "id": "components/breadcrumbs",
15
+ "path": "../components/breadcrumbs/DomBreadcrumbs.vue",
16
+ "section": "components",
17
+ "slug": "breadcrumbs",
18
+ "exportName": "DomBreadcrumbs",
19
+ "route": "/components/breadcrumbs",
20
+ "doc": {
21
+ "name": "Breadcrumbs",
22
+ "tag": "<DomBreadcrumbs>",
23
+ "description": "Accessible route or resource-path navigation with application-owned destinations and optional middle-path collapsing.",
24
+ "icon": "M4 7h5l3 5-3 5H4m8-10h5l3 5-3 5h-5",
25
+ "events": [
26
+ {
27
+ "name": "navigate",
28
+ "payload": "BreadcrumbNavigatePayload",
29
+ "typeRef": "BreadcrumbNavigatePayload",
30
+ "description": "Fired whenever an interactive breadcrumb is selected. Link navigation continues normally."
31
+ },
32
+ {
33
+ "name": "expand",
34
+ "payload": "BreadcrumbItem[]",
35
+ "description": "Fired after a collapsed middle path is revealed."
36
+ }
37
+ ],
38
+ "slots": [
39
+ {
40
+ "name": "item",
41
+ "payload": "BreadcrumbSlotPayload",
42
+ "typeRef": "BreadcrumbSlotPayload",
43
+ "description": "Replace an item label inside its semantic link, button, or current-location element."
44
+ },
45
+ {
46
+ "name": "separator",
47
+ "payload": "{ previous, next, index }",
48
+ "description": "Replace the separator before each item after the first."
49
+ },
50
+ {
51
+ "name": "collapsed",
52
+ "payload": "{ items, count, expand }",
53
+ "description": "Replace the control used to reveal a collapsed middle path."
54
+ }
55
+ ]
56
+ },
57
+ "studio": {}
58
+ },
59
+ {
60
+ "id": "components/button",
61
+ "path": "../components/button/DomButton.vue",
62
+ "section": "components",
63
+ "slug": "button",
64
+ "exportName": "DomButton",
65
+ "route": "/components/button",
66
+ "doc": {
67
+ "name": "Button",
68
+ "tag": "<DomButton>",
69
+ "description": "The atomic call to action — variants, sizes, loading state, and any underlying element.",
70
+ "slots": [
71
+ {
72
+ "name": "(default)",
73
+ "description": "Button label and/or icons."
74
+ }
75
+ ]
76
+ },
77
+ "studio": {}
78
+ },
79
+ {
80
+ "id": "components/command-palette",
81
+ "path": "../components/command-palette/DomCommandPalette.vue",
82
+ "section": "components",
83
+ "slug": "command-palette",
84
+ "exportName": "DomCommandPalette",
85
+ "route": "/components/command-palette",
86
+ "doc": {
87
+ "name": "Command palette",
88
+ "tag": "<DomCommandPalette>",
89
+ "description": "A keyboard-first command launcher composed from dialog and listbox patterns.",
90
+ "events": [
91
+ {
92
+ "name": "update:modelValue",
93
+ "payload": "(open: boolean)",
94
+ "description": "Emitted when the palette opens or closes."
95
+ },
96
+ {
97
+ "name": "select",
98
+ "payload": "({ command, value })",
99
+ "description": "Emitted when a command is selected."
100
+ }
101
+ ]
102
+ },
103
+ "studio": {}
104
+ },
105
+ {
106
+ "id": "components/context-menu",
107
+ "path": "../components/context-menu/DomContextMenu.vue",
108
+ "section": "components",
109
+ "slug": "context-menu",
110
+ "exportName": "DomContextMenu",
111
+ "route": "/components/context-menu",
112
+ "doc": {
113
+ "name": "Context menu",
114
+ "tag": "<DomContextMenu>",
115
+ "description": "A right-click menu built on DomMenu, with popover top-layer placement and keyboard navigation.",
116
+ "slots": [
117
+ {
118
+ "name": "(default)",
119
+ "description": "The area that opens the context menu on right click."
120
+ },
121
+ {
122
+ "name": "item",
123
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
124
+ "description": "Custom label/body content inside the default menu row."
125
+ },
126
+ {
127
+ "name": "item-row",
128
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
129
+ "description": "Replace the full inner row markup while DomMenu keeps the interactive wrapper."
130
+ }
131
+ ],
132
+ "events": [
133
+ {
134
+ "name": "open",
135
+ "payload": "({ event })",
136
+ "description": "Fired when the menu is opened."
137
+ },
138
+ {
139
+ "name": "select",
140
+ "payload": "({ value, item })",
141
+ "description": "Fired when a menu item is selected."
142
+ }
143
+ ]
144
+ },
145
+ "studio": {}
146
+ },
147
+ {
148
+ "id": "components/dialog",
149
+ "path": "../components/dialog/DomDialog.vue",
150
+ "section": "components",
151
+ "slug": "dialog",
152
+ "exportName": "DomDialog",
153
+ "route": "/components/dialog",
154
+ "doc": {
155
+ "name": "Dialog",
156
+ "tag": "<DomDialog>",
157
+ "description": "A modal built on the native HTML <dialog> element — top-layer rendering, native stacking, scroll lock, and backdrop styling without z-index hacks.",
158
+ "slots": [
159
+ {
160
+ "name": "trigger",
161
+ "description": "Optional. Element that opens the dialog when clicked — omit when using v-model, a template ref, or commandfor on an external button."
162
+ },
163
+ {
164
+ "name": "(default)",
165
+ "description": "Dialog body — rendered inside the card below the title and description."
166
+ },
167
+ {
168
+ "name": "header",
169
+ "payload": "{ title, description, titleId, descriptionId }",
170
+ "description": "Replace the default title and description block. Apply the provided IDs to custom heading and description elements to preserve the dialog accessibility relationships."
171
+ },
172
+ {
173
+ "name": "footer",
174
+ "description": "Action buttons. Add `data-close` on a control to dismiss the dialog."
175
+ }
176
+ ],
177
+ "events": [
178
+ {
179
+ "name": "update:modelValue",
180
+ "payload": "(open: boolean)",
181
+ "description": "Emitted when the dialog opens or closes."
182
+ },
183
+ {
184
+ "name": "before-open",
185
+ "description": "Emitted immediately before the dialog opens; prepare draft data or item snapshots here."
186
+ },
187
+ {
188
+ "name": "close",
189
+ "description": "Emitted when the dialog is dismissed."
190
+ },
191
+ {
192
+ "name": "close-complete",
193
+ "description": "Emitted after the close transition completes; clear retained dialog data here."
194
+ }
195
+ ],
196
+ "keyboard": [
197
+ {
198
+ "keys": "Esc",
199
+ "action": "Closes the topmost open dialog unless `static` is set."
200
+ },
201
+ {
202
+ "keys": "Tab / Shift+Tab",
203
+ "action": "Focus stays within the dialog while open (native top-layer)."
204
+ },
205
+ {
206
+ "keys": "Click backdrop",
207
+ "action": "Dismisses the dialog unless `static` is set."
208
+ }
209
+ ]
210
+ },
211
+ "studio": {}
212
+ },
213
+ {
214
+ "id": "components/dialog",
215
+ "path": "../components/dialog/DomDialogSchemaForm.vue",
216
+ "section": "components",
217
+ "slug": "dialog",
218
+ "exportName": "DomDialogSchemaForm",
219
+ "route": "/components/dialog",
220
+ "doc": {
221
+ "name": "Dialog schema form",
222
+ "tag": "<DomDialogSchemaForm>",
223
+ "description": "Internal renderer used by dialogForm(schema) to resolve a DomForm children schema from a programmatic dialog.",
224
+ "events": [
225
+ {
226
+ "name": "resolve",
227
+ "payload": "Record<string, unknown>",
228
+ "description": "Emitted with validated form values."
229
+ },
230
+ {
231
+ "name": "dismiss",
232
+ "description": "Emitted when the form is cancelled."
233
+ }
234
+ ]
235
+ },
236
+ "studio": {}
237
+ },
238
+ {
239
+ "id": "components/dialog",
240
+ "path": "../components/dialog/DomDialogStack.vue",
241
+ "section": "components",
242
+ "slug": "dialog",
243
+ "exportName": "DomDialogStack",
244
+ "route": "/components/dialog",
245
+ "doc": {
246
+ "name": "Dialog stack",
247
+ "tag": "<DomDialogStack>",
248
+ "description": "Renderer for dialogs created with useDialogs(). Mount it once, then call the dialog API from script.",
249
+ "slots": [
250
+ {
251
+ "name": "default",
252
+ "payload": "{ dialog, resolve, dismiss }",
253
+ "description": "Custom renderer for a programmatic dialog body."
254
+ },
255
+ {
256
+ "name": "footer",
257
+ "payload": "{ dialog, resolve, dismiss }",
258
+ "description": "Custom renderer for programmatic dialog actions."
259
+ }
260
+ ],
261
+ "events": [
262
+ {
263
+ "name": "resolve",
264
+ "payload": "({ id, value })",
265
+ "description": "Emitted when a dialog resolves."
266
+ },
267
+ {
268
+ "name": "dismiss",
269
+ "payload": "({ id, value })",
270
+ "description": "Emitted when a dialog is dismissed."
271
+ },
272
+ {
273
+ "name": "action",
274
+ "payload": "({ id, dialog, ...payload })",
275
+ "description": "Emitted by custom dialog bodies for app-specific actions."
276
+ }
277
+ ]
278
+ },
279
+ "studio": {}
280
+ },
281
+ {
282
+ "id": "components/drawer",
283
+ "path": "../components/drawer/DomDrawer.vue",
284
+ "section": "components",
285
+ "slug": "drawer",
286
+ "exportName": "DomDrawer",
287
+ "route": "/components/drawer",
288
+ "doc": {
289
+ "name": "Drawer",
290
+ "tag": "<DomDrawer>",
291
+ "description": "A slide-out panel for navigation menus, filters, or secondary app panels with backdrop dismiss, drag dismiss, scroll lock, and focus trap built in.",
292
+ "slots": [
293
+ {
294
+ "name": "trigger",
295
+ "description": "Element that opens the drawer when clicked (omit when controlling open state yourself)."
296
+ },
297
+ {
298
+ "name": "(default)",
299
+ "description": "Panel body."
300
+ },
301
+ {
302
+ "name": "header",
303
+ "description": "Replace the default header row (title + close button)."
304
+ },
305
+ {
306
+ "name": "footer",
307
+ "description": "Optional footer below the scrollable body."
308
+ }
309
+ ],
310
+ "keyboard": [
311
+ {
312
+ "keys": "Esc",
313
+ "action": "Closes the drawer."
314
+ },
315
+ {
316
+ "keys": "Tab / Shift+Tab",
317
+ "action": "Focus stays within the panel while open."
318
+ },
319
+ {
320
+ "keys": "Click backdrop",
321
+ "action": "Dismisses the drawer. Add `static` on the host to disable."
322
+ },
323
+ {
324
+ "keys": "Drag handle",
325
+ "action": "Bottom drawers can be dragged down from the pill handle to close."
326
+ }
327
+ ]
328
+ },
329
+ "studio": {}
330
+ },
331
+ {
332
+ "id": "components/dropdown",
333
+ "path": "../components/dropdown/DomDropdown.vue",
334
+ "section": "components",
335
+ "slug": "dropdown",
336
+ "exportName": "DomDropdown",
337
+ "route": "/components/dropdown",
338
+ "doc": {
339
+ "name": "Dropdown",
340
+ "tag": "<DomDropdown>",
341
+ "description": "A menu that opens from a button — fully keyboard accessible, with focus return, optional scroll lock, and outside-click handling.",
342
+ "slots": [
343
+ {
344
+ "name": "(default)",
345
+ "payload": "{ close, open, toggle }",
346
+ "description": "Custom panel content, usually a DomMenu composed with MenuItem rows."
347
+ },
348
+ {
349
+ "name": "trigger",
350
+ "description": "Replaces the inner content of the trigger button."
351
+ },
352
+ {
353
+ "name": "item",
354
+ "payload": "{ item, index }",
355
+ "description": "Replaces the rendering of each menu item."
356
+ },
357
+ {
358
+ "name": "panel",
359
+ "payload": "{ close, open, toggle }",
360
+ "description": "Replaces menu items with custom dropdown content, such as a tree view or form."
361
+ }
362
+ ],
363
+ "events": [
364
+ {
365
+ "name": "select",
366
+ "payload": "(value: string)",
367
+ "description": "Fired when a menu item is chosen."
368
+ }
369
+ ],
370
+ "keyboard": [
371
+ {
372
+ "keys": "Enter / Space / ↓",
373
+ "action": "Open menu (when trigger is focused)."
374
+ },
375
+ {
376
+ "keys": "↑ / ↓",
377
+ "action": "Move active item."
378
+ },
379
+ {
380
+ "keys": "Home / End",
381
+ "action": "Jump to first / last item."
382
+ },
383
+ {
384
+ "keys": "Enter",
385
+ "action": "Select active item."
386
+ },
387
+ {
388
+ "keys": "Esc / Tab",
389
+ "action": "Close menu and return focus."
390
+ }
391
+ ]
392
+ },
393
+ "studio": {}
394
+ },
395
+ {
396
+ "id": "components/icon-button",
397
+ "path": "../components/icon-button/DomIconButton.vue",
398
+ "section": "components",
399
+ "slug": "icon-button",
400
+ "exportName": "DomIconButton",
401
+ "route": "/components/icon-button",
402
+ "doc": {
403
+ "name": "Icon button",
404
+ "tag": "<DomIconButton>",
405
+ "description": "A compact accessible button for toolbar, row action, and chrome controls.",
406
+ "playground": {
407
+ "initial": {
408
+ "label": "Add item",
409
+ "icon": "M12 5v14M5 12h14"
410
+ }
411
+ },
412
+ "slots": [
413
+ {
414
+ "name": "(default)",
415
+ "description": "Custom icon content. Use an SVG or icon component sized to 1em or Tailwind size utilities."
416
+ }
417
+ ]
418
+ },
419
+ "studio": {}
420
+ },
421
+ {
422
+ "id": "components/lightbox",
423
+ "path": "../components/lightbox/DomLightbox.vue",
424
+ "section": "components",
425
+ "slug": "lightbox",
426
+ "exportName": "DomLightbox",
427
+ "route": "/components/lightbox",
428
+ "doc": {
429
+ "name": "Lightbox",
430
+ "tag": "<DomLightbox>",
431
+ "description": "A gallery overlay that opens from a thumbnail into a stable preview stage, then flies back to the origin on close.",
432
+ "slots": [
433
+ {
434
+ "name": "(default)",
435
+ "payload": "{ item, index, close, next, previous, goTo, phase }",
436
+ "description": "Optional custom stage content. Omit for the built-in image preview."
437
+ },
438
+ {
439
+ "name": "caption",
440
+ "payload": "{ item, index }",
441
+ "description": "Optional caption content below the stage."
442
+ },
443
+ {
444
+ "name": "thumbnail",
445
+ "payload": "{ item, index, active }",
446
+ "description": "Optional thumbnail strip rendering."
447
+ }
448
+ ],
449
+ "events": [
450
+ {
451
+ "name": "update:modelValue",
452
+ "payload": "(open: boolean)",
453
+ "description": "Emitted when the lightbox requests an open-state change."
454
+ },
455
+ {
456
+ "name": "update:index",
457
+ "payload": "(index: number)",
458
+ "description": "Emitted when navigation changes the active item."
459
+ },
460
+ {
461
+ "name": "close",
462
+ "description": "Emitted when the close transition begins."
463
+ },
464
+ {
465
+ "name": "after-enter",
466
+ "description": "Emitted when the thumbnail-to-stage transition completes."
467
+ },
468
+ {
469
+ "name": "after-leave",
470
+ "description": "Emitted when the fly-back transition completes and retained data is released."
471
+ },
472
+ {
473
+ "name": "navigate",
474
+ "payload": "({ index, item, direction })",
475
+ "description": "Emitted after arrow or thumbnail navigation."
476
+ }
477
+ ],
478
+ "keyboard": [
479
+ {
480
+ "keys": "Esc",
481
+ "action": "Closes the lightbox."
482
+ },
483
+ {
484
+ "keys": "Left / Right",
485
+ "action": "Moves between gallery items."
486
+ },
487
+ {
488
+ "keys": "Click backdrop",
489
+ "action": "Closes the lightbox when closeOnBackdrop is true."
490
+ }
491
+ ]
492
+ },
493
+ "studio": {}
494
+ },
495
+ {
496
+ "id": "components/menu",
497
+ "path": "../components/menu/DomMenu.vue",
498
+ "section": "components",
499
+ "slug": "menu",
500
+ "exportName": "DomMenu",
501
+ "route": "/components/menu",
502
+ "doc": {
503
+ "name": "Menu",
504
+ "tag": "<DomMenu>",
505
+ "description": "A roving-focus action menu for command lists, settings menus, and static menu panels.",
506
+ "slots": [
507
+ {
508
+ "name": "(default)",
509
+ "description": "Custom <MenuItem> rows when you want markup-driven menus instead of the items prop."
510
+ },
511
+ {
512
+ "name": "item",
513
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
514
+ "description": "Custom label/body content inside the default menu row."
515
+ },
516
+ {
517
+ "name": "item-accessory",
518
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
519
+ "description": "Custom right-side content for rows that expose shortcuts, children, checks, or accessorySlot."
520
+ },
521
+ {
522
+ "name": "item-row",
523
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
524
+ "description": "Replace the full inner row markup while DomMenu keeps the interactive wrapper."
525
+ },
526
+ {
527
+ "name": "item-label",
528
+ "payload": "{ item, index, value, label }",
529
+ "description": "Replace the markup for non-selectable label/static rows."
530
+ },
531
+ {
532
+ "name": "item.slot",
533
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
534
+ "description": "Set item.slot to a named slot for per-item row markup."
535
+ },
536
+ {
537
+ "name": "item.accessorySlot",
538
+ "payload": "{ item, index, value, label, checked, open, hasChildren }",
539
+ "description": "Set item.accessorySlot to a named slot for per-item right-side accessory content."
540
+ }
541
+ ],
542
+ "events": [
543
+ {
544
+ "name": "select",
545
+ "payload": "({ value, item })",
546
+ "description": "Fired when an item is selected."
547
+ },
548
+ {
549
+ "name": "change",
550
+ "payload": "({ value, checked, item })",
551
+ "description": "Fired when a checkbox or radio item changes."
552
+ }
553
+ ]
554
+ },
555
+ "studio": {}
556
+ },
557
+ {
558
+ "id": "components/menu",
559
+ "path": "../components/menu/DomMenuItem.vue",
560
+ "section": "components",
561
+ "slug": "menu",
562
+ "exportName": "DomMenuItem",
563
+ "route": "/components/menu",
564
+ "doc": {
565
+ "name": "Menu item",
566
+ "tag": "<MenuItem>",
567
+ "description": "Markup-driven menu row for DomMenu, including optional submenu content through the submenu slot.",
568
+ "slots": [
569
+ {
570
+ "name": "(default)",
571
+ "description": "Custom row markup."
572
+ },
573
+ {
574
+ "name": "accessory",
575
+ "description": "Right-side content rendered beside the menu item, useful for controls, shortcuts, and status."
576
+ },
577
+ {
578
+ "name": "submenu",
579
+ "description": "Nested <MenuItem> rows shown as a submenu."
580
+ }
581
+ ]
582
+ },
583
+ "studio": {}
584
+ },
585
+ {
586
+ "id": "components/menu",
587
+ "path": "../components/menu/DomMenuLabel.vue",
588
+ "section": "components",
589
+ "slug": "menu",
590
+ "exportName": "DomMenuLabel",
591
+ "route": "/components/menu",
592
+ "doc": {
593
+ "name": "Menu label",
594
+ "tag": "<MenuLabel>",
595
+ "description": "A non-selectable menu row for labels, account summaries, and other static custom content.",
596
+ "slots": [
597
+ {
598
+ "name": "(default)",
599
+ "description": "Static content shown inside the menu."
600
+ }
601
+ ]
602
+ },
603
+ "studio": {}
604
+ },
605
+ {
606
+ "id": "components/menu",
607
+ "path": "../components/menu/DomMenuSeparator.vue",
608
+ "section": "components",
609
+ "slug": "menu",
610
+ "exportName": "DomMenuSeparator",
611
+ "route": "/components/menu",
612
+ "doc": {
613
+ "name": "Menu separator",
614
+ "tag": "<MenuSeparator>",
615
+ "description": "A non-focusable divider for separating groups inside DomMenu."
616
+ },
617
+ "studio": {}
618
+ },
619
+ {
620
+ "id": "components/pagination",
621
+ "path": "../components/pagination/DomPagination.vue",
622
+ "section": "components",
623
+ "slug": "pagination",
624
+ "exportName": "DomPagination",
625
+ "route": "/components/pagination",
626
+ "doc": {
627
+ "name": "Pagination",
628
+ "tag": "<DomPagination>",
629
+ "description": "A controlled page navigator for data grids, audit logs, search results, and resource lists.",
630
+ "icon": "M7 8l-4 4 4 4M17 8l4 4-4 4M10 12h4",
631
+ "events": [
632
+ {
633
+ "name": "update:page",
634
+ "payload": "number",
635
+ "description": "Fired when the selected page changes."
636
+ },
637
+ {
638
+ "name": "page-change",
639
+ "payload": "{ page, previousPage, pageCount }",
640
+ "description": "Fired with page transition metadata."
641
+ }
642
+ ],
643
+ "playground": {
644
+ "initial": {
645
+ "page": 4,
646
+ "pageSize": 25,
647
+ "total": 286
648
+ }
649
+ }
650
+ },
651
+ "studio": {}
652
+ },
653
+ {
654
+ "id": "components/popover",
655
+ "path": "../components/popover/DomPopover.vue",
656
+ "section": "components",
657
+ "slug": "popover",
658
+ "exportName": "DomPopover",
659
+ "route": "/components/popover",
660
+ "doc": {
661
+ "name": "Popover",
662
+ "tag": "<DomPopover>",
663
+ "description": "A floating panel anchored to a trigger. Built on the HTML Popover API so it sits in the top layer — no parent overflow, transform, or z-index can clip it.",
664
+ "slots": [
665
+ {
666
+ "name": "trigger",
667
+ "description": "Replaces the trigger button. Omit when using triggerId."
668
+ },
669
+ {
670
+ "name": "(default)",
671
+ "payload": "{ open, close, toggle }",
672
+ "description": "Popover body. Receives helpers so content can close itself without storing a component ref."
673
+ }
674
+ ],
675
+ "keyboard": [
676
+ {
677
+ "keys": "Click trigger",
678
+ "action": "Toggles the popover."
679
+ },
680
+ {
681
+ "keys": "Focus trigger",
682
+ "action": "Opens the popover when trigger is hover."
683
+ },
684
+ {
685
+ "keys": "Click outside",
686
+ "action": "Light-dismiss via the native popover API."
687
+ },
688
+ {
689
+ "keys": "Esc",
690
+ "action": "Closes the popover."
691
+ }
692
+ ]
693
+ },
694
+ "studio": {}
695
+ },
696
+ {
697
+ "id": "components/profile-menu",
698
+ "path": "../components/profile-menu/DomProfileMenu.vue",
699
+ "section": "components",
700
+ "slug": "profile-menu",
701
+ "exportName": "DomProfileMenu",
702
+ "route": "/components/profile-menu",
703
+ "doc": {
704
+ "name": "Profile menu",
705
+ "tag": "<DomProfileMenu>",
706
+ "description": "A signed-in account trigger with avatar, email, and app profile actions.",
707
+ "playground": {
708
+ "initial": {
709
+ "name": "Mina Patel",
710
+ "email": "mina@northstar.app",
711
+ "initials": "MP",
712
+ "showName": false
713
+ }
714
+ },
715
+ "slots": [
716
+ {
717
+ "name": "trigger",
718
+ "payload": "{ name, email, initials }",
719
+ "description": "Replace the avatar and identity text inside the dropdown trigger."
720
+ },
721
+ {
722
+ "name": "item",
723
+ "payload": "{ item, label, value }",
724
+ "description": "Replace the markup for selectable data-driven menu items. Useful for resolving item.component or item.componentName to a custom row component."
725
+ },
726
+ {
727
+ "name": "item-label",
728
+ "payload": "{ item, label, value }",
729
+ "description": "Replace the markup for non-selectable data-driven label/static rows."
730
+ }
731
+ ],
732
+ "events": [
733
+ {
734
+ "name": "select",
735
+ "payload": "({ value, item })",
736
+ "description": "Fired when an action item is chosen."
737
+ },
738
+ {
739
+ "name": "change",
740
+ "payload": "({ value, checked, item })",
741
+ "description": "Fired when a checkbox or radio menu item changes."
742
+ },
743
+ {
744
+ "name": "update:themeMode",
745
+ "payload": "(mode: \"dark\" | \"light\" | \"system\")",
746
+ "description": "Fired when the embedded theme switcher changes."
747
+ },
748
+ {
749
+ "name": "profile",
750
+ "payload": "({ value, item })",
751
+ "description": "Fired when the profile action is chosen."
752
+ },
753
+ {
754
+ "name": "onboarding",
755
+ "payload": "({ value, item })",
756
+ "description": "Fired when the onboarding action is chosen."
757
+ },
758
+ {
759
+ "name": "theme",
760
+ "payload": "({ value, item, mode })",
761
+ "description": "Fired when the theme mode changes, or when a plain theme item is chosen."
762
+ },
763
+ {
764
+ "name": "logout",
765
+ "payload": "({ value, item })",
766
+ "description": "Fired when the logout action is chosen."
767
+ }
768
+ ]
769
+ },
770
+ "studio": {}
771
+ },
772
+ {
773
+ "id": "components/profile-menu",
774
+ "path": "../components/profile-menu/DomProfileMenuItemContent.vue",
775
+ "section": "components",
776
+ "slug": "profile-menu",
777
+ "exportName": "DomProfileMenuItemContent",
778
+ "route": "/components/profile-menu",
779
+ "doc": {},
780
+ "studio": {}
781
+ },
782
+ {
783
+ "id": "components/scroll-menu",
784
+ "path": "../components/scroll-menu/DomScrollMenu.vue",
785
+ "section": "components",
786
+ "slug": "scroll-menu",
787
+ "exportName": "DomScrollMenu",
788
+ "route": "/components/scroll-menu",
789
+ "doc": {
790
+ "name": "Scroll menu",
791
+ "tag": "<DomScrollMenu>",
792
+ "description": "A smooth-scrolling table of contents that keeps real fragment links highlighted as their target headings move through a page or scroll container.",
793
+ "slots": [
794
+ {
795
+ "name": "(default)",
796
+ "payload": "{ activeHref }",
797
+ "description": "DomScrollMenuItem rows or equivalent custom content."
798
+ },
799
+ {
800
+ "name": "label",
801
+ "payload": "{ label }",
802
+ "description": "Custom visible navigation label."
803
+ }
804
+ ],
805
+ "events": [
806
+ {
807
+ "name": "update:modelValue",
808
+ "payload": "href",
809
+ "description": "Emitted when scrolling or navigation changes the active fragment link."
810
+ },
811
+ {
812
+ "name": "change",
813
+ "payload": "{ href, target }",
814
+ "description": "Emitted with the active fragment and its target element."
815
+ }
816
+ ]
817
+ },
818
+ "studio": {}
819
+ },
820
+ {
821
+ "id": "components/scroll-menu",
822
+ "path": "../components/scroll-menu/DomScrollMenuItem.vue",
823
+ "section": "components",
824
+ "slug": "scroll-menu",
825
+ "exportName": "DomScrollMenuItem",
826
+ "route": "/components/scroll-menu",
827
+ "doc": {
828
+ "name": "Scroll menu item",
829
+ "tag": "<DomScrollMenuItem>",
830
+ "description": "A fragment-link wrapper that registers either its href prop or a slotted anchor with the parent DomScrollMenu scrollspy.",
831
+ "slots": [
832
+ {
833
+ "name": "(default)",
834
+ "payload": "{ active, href }",
835
+ "description": "Link contents when href is set, or one custom fragment anchor when href is omitted."
836
+ }
837
+ ],
838
+ "events": [
839
+ {
840
+ "name": "navigate",
841
+ "payload": "{ href, active }",
842
+ "description": "Emitted when the fragment link is activated with an unmodified primary click."
843
+ }
844
+ ]
845
+ },
846
+ "studio": {}
847
+ },
848
+ {
849
+ "id": "components/splitter-panel",
850
+ "path": "../components/splitter-panel/DomSplitterPanel.vue",
851
+ "section": "components",
852
+ "slug": "splitter-panel",
853
+ "exportName": "DomSplitterPanel",
854
+ "route": "/components/splitter-panel",
855
+ "doc": {
856
+ "name": "Splitter panel",
857
+ "tag": "<DomSplitterPanel>",
858
+ "description": "A resizable multi-pane shell for editors, inspectors, file browsers, and app-builder workspaces.",
859
+ "icon": "M5 4v16M19 4v16M8 6h8M8 12h8M8 18h8",
860
+ "slots": [
861
+ {
862
+ "name": "start",
863
+ "description": "The leading resizable pane."
864
+ },
865
+ {
866
+ "name": "default",
867
+ "description": "The flexible central pane."
868
+ },
869
+ {
870
+ "name": "end",
871
+ "description": "Optional trailing resizable pane."
872
+ },
873
+ {
874
+ "name": "start-handle",
875
+ "description": "Optional content inside the leading resize handle."
876
+ },
877
+ {
878
+ "name": "end-handle",
879
+ "description": "Optional content inside the trailing resize handle."
880
+ }
881
+ ],
882
+ "events": [
883
+ {
884
+ "name": "update:startSize",
885
+ "payload": "(pixels)",
886
+ "description": "Emitted when the leading pane is resized."
887
+ },
888
+ {
889
+ "name": "update:endSize",
890
+ "payload": "(pixels)",
891
+ "description": "Emitted when the trailing pane is resized."
892
+ },
893
+ {
894
+ "name": "resize",
895
+ "payload": "({ startSize, endSize })",
896
+ "description": "Emitted after either splitter handle moves."
897
+ }
898
+ ]
899
+ },
900
+ "studio": {}
901
+ },
902
+ {
903
+ "id": "components/stepper",
904
+ "path": "../components/stepper/DomStepper.vue",
905
+ "section": "components",
906
+ "slug": "stepper",
907
+ "exportName": "DomStepper",
908
+ "route": "/components/stepper",
909
+ "doc": {
910
+ "name": "Stepper",
911
+ "tag": "<DomStepper>",
912
+ "description": "Controlled horizontal or vertical progress navigation for multi-step application workflows.",
913
+ "icon": "M5 12h14M6 12a2 2 0 1 0 0 .01M12 12a2 2 0 1 0 0 .01M18 12a2 2 0 1 0 0 .01",
914
+ "events": [
915
+ {
916
+ "name": "update:modelValue",
917
+ "payload": "string | number",
918
+ "description": "Fired when an enabled step is selected."
919
+ },
920
+ {
921
+ "name": "change",
922
+ "payload": "StepperChangePayload",
923
+ "typeRef": "StepperChangePayload",
924
+ "description": "Fired with the selected step, key, index, and previous key."
925
+ }
926
+ ],
927
+ "slots": [
928
+ {
929
+ "name": "step",
930
+ "payload": "StepperSlotPayload",
931
+ "typeRef": "StepperSlotPayload",
932
+ "description": "Replace the label and description while retaining navigation and progress structure."
933
+ },
934
+ {
935
+ "name": "indicator",
936
+ "payload": "StepperSlotPayload",
937
+ "typeRef": "StepperSlotPayload",
938
+ "description": "Replace the numbered, completed, or error indicator."
939
+ },
940
+ {
941
+ "name": "separator",
942
+ "payload": "{ index, previous, next }",
943
+ "description": "Replace the connector between adjacent steps."
944
+ }
945
+ ],
946
+ "keyboard": [
947
+ {
948
+ "keys": "← / →",
949
+ "action": "Move between enabled horizontal steps."
950
+ },
951
+ {
952
+ "keys": "↑ / ↓",
953
+ "action": "Move between enabled vertical steps."
954
+ },
955
+ {
956
+ "keys": "Home / End",
957
+ "action": "Move to the first or last enabled step."
958
+ }
959
+ ]
960
+ },
961
+ "studio": {}
962
+ },
963
+ {
964
+ "id": "components/tabs",
965
+ "path": "../components/tabs/DomTabs.vue",
966
+ "section": "components",
967
+ "slug": "tabs",
968
+ "exportName": "DomTabs",
969
+ "route": "/components/tabs",
970
+ "doc": {},
971
+ "studio": {}
972
+ },
973
+ {
974
+ "id": "components/theme-switcher",
975
+ "path": "../components/theme-switcher/DomThemeSwitcher.vue",
976
+ "section": "components",
977
+ "slug": "theme-switcher",
978
+ "exportName": "DomThemeSwitcher",
979
+ "route": "/components/theme-switcher",
980
+ "doc": {
981
+ "name": "Theme switcher",
982
+ "tag": "<DomThemeSwitcher>",
983
+ "description": "A DOM Studio light, dark, and system theme preference control.",
984
+ "events": [
985
+ {
986
+ "name": "update:modelValue",
987
+ "payload": "(mode: \"light\" | \"dark\" | \"system\")",
988
+ "description": "Emitted when the stored theme mode changes."
989
+ },
990
+ {
991
+ "name": "change",
992
+ "payload": "({ mode, theme })",
993
+ "description": "Emitted with the selected preference mode and resolved light or dark theme."
994
+ }
995
+ ],
996
+ "playground": {
997
+ "initial": {
998
+ "showLabel": true,
999
+ "size": "icon-sm"
1000
+ }
1001
+ }
1002
+ },
1003
+ "studio": {}
1004
+ },
1005
+ {
1006
+ "id": "components/toast",
1007
+ "path": "../components/toast/DomToastStack.vue",
1008
+ "section": "components",
1009
+ "slug": "toast",
1010
+ "exportName": "DomToastStack",
1011
+ "route": "/components/toast",
1012
+ "doc": {
1013
+ "name": "Toast stack",
1014
+ "tag": "<DomToastStack>",
1015
+ "description": "A polite live-region stack for transient notifications.",
1016
+ "slots": [
1017
+ {
1018
+ "name": "default",
1019
+ "payload": "{ toast, dismiss }",
1020
+ "description": "Custom toast content rendered inside the card. Use this for avatars, actions, or richer markup."
1021
+ }
1022
+ ],
1023
+ "events": [
1024
+ {
1025
+ "name": "dismiss",
1026
+ "payload": "(id: string)",
1027
+ "description": "Emitted when a toast is dismissed."
1028
+ },
1029
+ {
1030
+ "name": "action",
1031
+ "payload": "({ id, toast, ...payload })",
1032
+ "description": "Emitted by toast template content, useful for buttons and menus inside a toast."
1033
+ }
1034
+ ]
1035
+ },
1036
+ "studio": {}
1037
+ },
1038
+ {
1039
+ "id": "components/toolbar",
1040
+ "path": "../components/toolbar/DomToolbar.vue",
1041
+ "section": "components",
1042
+ "slug": "toolbar",
1043
+ "exportName": "DomToolbar",
1044
+ "route": "/components/toolbar",
1045
+ "doc": {
1046
+ "name": "Toolbar",
1047
+ "tag": "<DomToolbar>",
1048
+ "description": "A compact action surface for icon buttons, segmented controls, filters, and overflow menus.",
1049
+ "slots": [
1050
+ {
1051
+ "name": "(default)",
1052
+ "description": "Toolbar controls."
1053
+ }
1054
+ ]
1055
+ },
1056
+ "studio": {}
1057
+ },
1058
+ {
1059
+ "id": "components/tooltip",
1060
+ "path": "../components/tooltip/DomTooltip.vue",
1061
+ "section": "components",
1062
+ "slug": "tooltip",
1063
+ "exportName": "DomTooltip",
1064
+ "route": "/components/tooltip",
1065
+ "doc": {},
1066
+ "studio": {}
1067
+ },
1068
+ {
1069
+ "id": "components/tree-view",
1070
+ "path": "../components/tree-view/DomTreeView.vue",
1071
+ "section": "components",
1072
+ "slug": "tree-view",
1073
+ "exportName": "DomTreeView",
1074
+ "route": "/components/tree-view",
1075
+ "doc": {
1076
+ "name": "Tree view",
1077
+ "tag": "<DomTreeView>",
1078
+ "description": "A keyboard navigable hierarchical tree with selection, custom item rendering, lazy loading, and drag/drop reordering.",
1079
+ "icon": "M6 5h5v5H6V5Zm7 2h5M8.5 10v3M6 13h5v5H6v-5Zm7 2h5M8.5 18v1M6 21h5",
1080
+ "slots": [
1081
+ {
1082
+ "name": "item",
1083
+ "payload": "{ item, node, depth, open, selected, loading }",
1084
+ "description": "Custom content inside the default tree row."
1085
+ },
1086
+ {
1087
+ "name": "row",
1088
+ "payload": "{ item, node, depth, open, selected, loading, toggle, select }",
1089
+ "description": "Replace the full tree row while keeping tree structure, focus, and drag/drop wrapper."
1090
+ },
1091
+ {
1092
+ "name": "item.slot",
1093
+ "payload": "{ item, node, depth, open, selected, loading }",
1094
+ "description": "Set item.slot to a named slot for special node rendering."
1095
+ }
1096
+ ],
1097
+ "events": [
1098
+ {
1099
+ "name": "update:modelValue",
1100
+ "payload": "(value: string | number)",
1101
+ "description": "Emitted when the selected node changes."
1102
+ },
1103
+ {
1104
+ "name": "select",
1105
+ "payload": "({ item, value, node })",
1106
+ "typeRef": "TreeSelectionPayload",
1107
+ "description": "Fired when a tree item is selected."
1108
+ },
1109
+ {
1110
+ "name": "hover",
1111
+ "payload": "({ item, value, node })",
1112
+ "typeRef": "TreeSelectionPayload",
1113
+ "description": "Fired when a pointer enters a tree row."
1114
+ },
1115
+ {
1116
+ "name": "hover-end",
1117
+ "payload": "({ item, value, node })",
1118
+ "typeRef": "TreeSelectionPayload",
1119
+ "description": "Fired when a pointer leaves a tree row."
1120
+ },
1121
+ {
1122
+ "name": "action",
1123
+ "payload": "({ action, item, value, node })",
1124
+ "typeRef": "TreeActionPayload",
1125
+ "description": "Fired when a right-side item action is clicked."
1126
+ },
1127
+ {
1128
+ "name": "context-menu",
1129
+ "payload": "(payload: TreeContextMenuPayload)",
1130
+ "typeRef": "TreeContextMenuPayload",
1131
+ "description": "Fired when a tree row or empty tree space is right-clicked. Use kind to distinguish item from empty context."
1132
+ },
1133
+ {
1134
+ "name": "toggle",
1135
+ "payload": "({ item, value, open })",
1136
+ "typeRef": "TreeTogglePayload",
1137
+ "description": "Fired when a branch is opened or closed."
1138
+ },
1139
+ {
1140
+ "name": "load-children",
1141
+ "payload": "({ item, value })",
1142
+ "typeRef": "TreeLoadChildrenPayload",
1143
+ "description": "Fired when a lazy node is opened and needs children."
1144
+ },
1145
+ {
1146
+ "name": "drag-preview",
1147
+ "payload": "({ item, value, node, position, kind })",
1148
+ "typeRef": "TreeDragPreviewPayload",
1149
+ "description": "Fired while a valid drag target is being previewed."
1150
+ },
1151
+ {
1152
+ "name": "drag-preview-end",
1153
+ "payload": "({ value, position, kind })",
1154
+ "typeRef": "TreeDragPreviewEndPayload",
1155
+ "description": "Fired when the current drag preview is cleared."
1156
+ },
1157
+ {
1158
+ "name": "reorder",
1159
+ "payload": "({ items, item, sourceValue, sourceNode, target, targetValue, targetNode, position })",
1160
+ "typeRef": "TreeReorderPayload",
1161
+ "description": "Fired after drag/drop with a reordered items array."
1162
+ },
1163
+ {
1164
+ "name": "external-drop",
1165
+ "payload": "({ event, dataTransfer, types, getData, item, value, node, position })",
1166
+ "typeRef": "TreeExternalDropPayload",
1167
+ "description": "Fired when accepted data from outside the tree is dropped onto a row."
1168
+ },
1169
+ {
1170
+ "name": "update:items",
1171
+ "payload": "(items: TreeItems)",
1172
+ "description": "Emitted with the reordered tree so callers can sync v-model:items."
1173
+ }
1174
+ ],
1175
+ "keyboard": [
1176
+ {
1177
+ "keys": "↑ / ↓",
1178
+ "action": "Move focus through visible items."
1179
+ },
1180
+ {
1181
+ "keys": "→",
1182
+ "action": "Open a closed branch, otherwise move to the first child."
1183
+ },
1184
+ {
1185
+ "keys": "←",
1186
+ "action": "Close an open branch, otherwise move to the parent."
1187
+ },
1188
+ {
1189
+ "keys": "Enter / Space",
1190
+ "action": "Select the focused item."
1191
+ },
1192
+ {
1193
+ "keys": "Home / End",
1194
+ "action": "Move to the first or last visible item."
1195
+ },
1196
+ {
1197
+ "keys": "Alt + ↑ / ↓",
1198
+ "action": "Move the focused item before or after a sibling when draggable is enabled."
1199
+ }
1200
+ ]
1201
+ },
1202
+ "studio": {}
1203
+ },
1204
+ {
1205
+ "id": "data/activity-timeline",
1206
+ "path": "../data/activity-timeline/DomActivityTimeline.vue",
1207
+ "section": "data",
1208
+ "slug": "activity-timeline",
1209
+ "exportName": "DomActivityTimeline",
1210
+ "route": "/data/activity-timeline",
1211
+ "doc": {
1212
+ "name": "Activity timeline",
1213
+ "tag": "<DomActivityTimeline>",
1214
+ "description": "Projects application-owned resource rows into an accessible ordered activity trail without owning loading, ordering, querying, or persistence.",
1215
+ "icon": "M6 5h.01M6 12h.01M6 19h.01M10 5h8M10 12h8M10 19h8M6 6v5M6 13v5",
1216
+ "events": [],
1217
+ "slots": [
1218
+ {
1219
+ "name": "item",
1220
+ "payload": "ActivityTimelineSlotPayload",
1221
+ "typeRef": "ActivityTimelineSlotPayload",
1222
+ "description": "Replace the default title, description, status, and metadata content while retaining timeline structure."
1223
+ },
1224
+ {
1225
+ "name": "marker",
1226
+ "payload": "ActivityTimelineSlotPayload",
1227
+ "typeRef": "ActivityTimelineSlotPayload",
1228
+ "description": "Replace the semantic-tone marker for one activity row."
1229
+ },
1230
+ {
1231
+ "name": "opposite",
1232
+ "payload": "ActivityTimelineSlotPayload",
1233
+ "typeRef": "ActivityTimelineSlotPayload",
1234
+ "description": "Replace timestamp and secondary metadata, including the separate column used by split layout."
1235
+ },
1236
+ {
1237
+ "name": "actions",
1238
+ "payload": "ActivityTimelineSlotPayload",
1239
+ "typeRef": "ActivityTimelineSlotPayload",
1240
+ "description": "Append application-owned controls to the default activity content."
1241
+ },
1242
+ {
1243
+ "name": "loading",
1244
+ "payload": "{ count }",
1245
+ "description": "Replace the initial loading placeholders."
1246
+ },
1247
+ {
1248
+ "name": "empty",
1249
+ "description": "Replace the empty collection state."
1250
+ }
1251
+ ]
1252
+ },
1253
+ "studio": {}
1254
+ },
1255
+ {
1256
+ "id": "data/agent-chat",
1257
+ "path": "../data/agent-chat/DomAgentChatShell.vue",
1258
+ "section": "data",
1259
+ "slug": "agent-chat",
1260
+ "exportName": "DomAgentChatShell",
1261
+ "route": "/data/agent-chat",
1262
+ "doc": {
1263
+ "name": "Agent chat shell",
1264
+ "tag": "<DomAgentChatShell>",
1265
+ "description": "A three-pane AI chat application shell with a resizable conversation sidebar, scroll-contained conversation window, closable context aside, streaming tool calls, and audio/text handoff controls.",
1266
+ "icon": "M4 5h5v14H4V5Zm7 0h9v14h-9V5Zm2 3h5M13 12h5M13 16h3",
1267
+ "events": [
1268
+ {
1269
+ "name": "update:modelValue",
1270
+ "payload": "string",
1271
+ "description": "Passes composer updates from the conversation component."
1272
+ },
1273
+ {
1274
+ "name": "update:mode",
1275
+ "payload": "'text' | 'audio'",
1276
+ "description": "Passes audio/text mode changes from the conversation component."
1277
+ },
1278
+ {
1279
+ "name": "update:search",
1280
+ "payload": "string",
1281
+ "description": "Passes sidebar search updates."
1282
+ },
1283
+ {
1284
+ "name": "update:sidebarOpen",
1285
+ "payload": "boolean",
1286
+ "description": "Fired when the sidebar is opened or closed."
1287
+ },
1288
+ {
1289
+ "name": "update:asideOpen",
1290
+ "payload": "boolean",
1291
+ "description": "Fired when the aside is opened or closed."
1292
+ },
1293
+ {
1294
+ "name": "update:sidebarSize",
1295
+ "payload": "number",
1296
+ "description": "Fired when the sidebar splitter changes width."
1297
+ },
1298
+ {
1299
+ "name": "update:asideSize",
1300
+ "payload": "number",
1301
+ "description": "Fired when the aside splitter changes width."
1302
+ },
1303
+ {
1304
+ "name": "select-conversation",
1305
+ "payload": "conversation",
1306
+ "description": "Fired when a sidebar row is selected."
1307
+ },
1308
+ {
1309
+ "name": "new-conversation",
1310
+ "payload": "undefined",
1311
+ "description": "Fired when the sidebar new button is activated."
1312
+ },
1313
+ {
1314
+ "name": "submit",
1315
+ "payload": "({ content, mode, conversation })",
1316
+ "description": "Fired when the composer submits."
1317
+ },
1318
+ {
1319
+ "name": "stop",
1320
+ "payload": "({ conversation })",
1321
+ "description": "Fired when streaming is stopped."
1322
+ },
1323
+ {
1324
+ "name": "tool-action",
1325
+ "payload": "({ action, tool, message })",
1326
+ "description": "Fired by generic or custom tool renderers."
1327
+ }
1328
+ ],
1329
+ "slots": [
1330
+ {
1331
+ "name": "sidebar",
1332
+ "payload": "{ conversations, activeConversationId }",
1333
+ "description": "Replace the conversation sidebar."
1334
+ },
1335
+ {
1336
+ "name": "conversation",
1337
+ "payload": "{ conversation, messages, activeAgent }",
1338
+ "description": "Replace the main conversation component."
1339
+ },
1340
+ {
1341
+ "name": "aside",
1342
+ "payload": "{ conversation, activeAgent, toolParts }",
1343
+ "description": "Replace the contextual aside."
1344
+ }
1345
+ ]
1346
+ },
1347
+ "studio": {}
1348
+ },
1349
+ {
1350
+ "id": "data/agent-chat",
1351
+ "path": "../data/agent-chat/DomAgentConversation.vue",
1352
+ "section": "data",
1353
+ "slug": "agent-chat",
1354
+ "exportName": "DomAgentConversation",
1355
+ "route": "/data/agent-chat",
1356
+ "doc": {
1357
+ "name": "Agent conversation",
1358
+ "tag": "<DomAgentConversation>",
1359
+ "description": "A scroll-contained AI conversation surface with a fixed header, streaming messages, reasoning summaries, audio/text mode switching, tool-call rendering, and a composer footer.",
1360
+ "icon": "M5 7h14M5 12h10M5 17h6M18 15l3 3-3 3",
1361
+ "events": [
1362
+ {
1363
+ "name": "update:modelValue",
1364
+ "payload": "string",
1365
+ "description": "Fired when the composer text changes."
1366
+ },
1367
+ {
1368
+ "name": "update:mode",
1369
+ "payload": "'text' | 'audio'",
1370
+ "description": "Fired when the composer switches between text and audio mode."
1371
+ },
1372
+ {
1373
+ "name": "submit",
1374
+ "payload": "({ content, mode, conversation })",
1375
+ "description": "Fired when the user submits the composer."
1376
+ },
1377
+ {
1378
+ "name": "stop",
1379
+ "payload": "({ conversation })",
1380
+ "description": "Fired when the user stops an active stream."
1381
+ },
1382
+ {
1383
+ "name": "tool-action",
1384
+ "payload": "({ action, tool, message })",
1385
+ "description": "Fired by generic and custom tool renderers for approvals, retries, and inspection."
1386
+ },
1387
+ {
1388
+ "name": "scroll-bottom",
1389
+ "payload": "({ conversation })",
1390
+ "description": "Fired when the built-in jump-to-bottom control is used."
1391
+ }
1392
+ ],
1393
+ "slots": [
1394
+ {
1395
+ "name": "header-leading",
1396
+ "payload": "{ conversation, activeAgent }",
1397
+ "description": "Controls shown before the title, useful for opening an app sidebar."
1398
+ },
1399
+ {
1400
+ "name": "header-actions",
1401
+ "payload": "{ conversation, activeAgent, streaming }",
1402
+ "description": "Controls shown at the end of the header."
1403
+ },
1404
+ {
1405
+ "name": "message",
1406
+ "payload": "{ message, activeAgent, parts }",
1407
+ "description": "Replace the full message renderer."
1408
+ },
1409
+ {
1410
+ "name": "tool",
1411
+ "payload": "{ tool, message, component, action }",
1412
+ "description": "Replace generic tool rendering without supplying toolComponents."
1413
+ },
1414
+ {
1415
+ "name": "composer-attachments",
1416
+ "payload": "{ mode, disabled, streaming }",
1417
+ "description": "Application-owned file, image, or context previews above the composer text."
1418
+ },
1419
+ {
1420
+ "name": "composer-leading",
1421
+ "payload": "{ mode, setMode, disabled, streaming }",
1422
+ "description": "Controls at the start of the composer action row."
1423
+ },
1424
+ {
1425
+ "name": "composer-actions",
1426
+ "payload": "{ mode, setMode, disabled, streaming }",
1427
+ "description": "Controls before the built-in submit or stop action."
1428
+ },
1429
+ {
1430
+ "name": "footer",
1431
+ "payload": "{ value, mode, submit, setMode }",
1432
+ "description": "Replace the built-in composer footer."
1433
+ },
1434
+ {
1435
+ "name": "empty",
1436
+ "description": "Custom empty conversation state."
1437
+ }
1438
+ ],
1439
+ "keyboard": [
1440
+ {
1441
+ "keys": "Enter",
1442
+ "action": "Submit the composer."
1443
+ },
1444
+ {
1445
+ "keys": "Shift + Enter",
1446
+ "action": "Insert a new line."
1447
+ }
1448
+ ]
1449
+ },
1450
+ "studio": {}
1451
+ },
1452
+ {
1453
+ "id": "data/agent-chat",
1454
+ "path": "../data/agent-chat/DomAgentConversationList.vue",
1455
+ "section": "data",
1456
+ "slug": "agent-chat",
1457
+ "exportName": "DomAgentConversationList",
1458
+ "route": "/data/agent-chat",
1459
+ "doc": {
1460
+ "name": "Agent conversation list",
1461
+ "tag": "<DomAgentConversationList>",
1462
+ "description": "A reusable AI conversation navigation list with search, agent labels, unread counts, status pills, and active-thread selection.",
1463
+ "icon": "M5 6h14M5 12h14M5 18h8",
1464
+ "events": [
1465
+ {
1466
+ "name": "update:search",
1467
+ "payload": "string",
1468
+ "description": "Fired when the sidebar search changes."
1469
+ },
1470
+ {
1471
+ "name": "select",
1472
+ "payload": "conversation",
1473
+ "description": "Fired when a conversation row is selected."
1474
+ },
1475
+ {
1476
+ "name": "new",
1477
+ "payload": "undefined",
1478
+ "description": "Fired when the new conversation action is activated."
1479
+ }
1480
+ ],
1481
+ "slots": [
1482
+ {
1483
+ "name": "actions",
1484
+ "payload": "{ conversations }",
1485
+ "description": "Extra controls beside the heading."
1486
+ },
1487
+ {
1488
+ "name": "conversation",
1489
+ "payload": "{ conversation, active, agent }",
1490
+ "description": "Replace a conversation row."
1491
+ },
1492
+ {
1493
+ "name": "empty",
1494
+ "description": "Custom empty state."
1495
+ }
1496
+ ]
1497
+ },
1498
+ "studio": {}
1499
+ },
1500
+ {
1501
+ "id": "data/data-grid",
1502
+ "path": "../data/data-grid/DomDataGrid.vue",
1503
+ "section": "data",
1504
+ "slug": "data-grid",
1505
+ "exportName": "DomDataGrid",
1506
+ "route": "/data/data-grid",
1507
+ "doc": {
1508
+ "name": "Data grid",
1509
+ "tag": "<DomDataGrid>",
1510
+ "description": "A dense spreadsheet-like grid for database records, with typed column filters, sorting, row selection, and a server-query friendly API.\n\t\tWe talk about databases, rendering pipelines, virtual DOMs, and scalable app architecture. But really, they just want Excel.",
1511
+ "icon": "M4 5h16v14H4V5Zm0 4h16M4 13h16M9 5v14M15 5v14",
1512
+ "events": [
1513
+ {
1514
+ "name": "update:filters",
1515
+ "payload": "Record<string, DataGridFilter>",
1516
+ "description": "Fired when a column filter is applied or cleared."
1517
+ },
1518
+ {
1519
+ "name": "update:sort",
1520
+ "payload": "DataGridSort",
1521
+ "description": "Fired when column sorting changes. Complex sort values may include an ordered rules array."
1522
+ },
1523
+ {
1524
+ "name": "update:search",
1525
+ "payload": "string",
1526
+ "description": "Fired when the toolbar search changes."
1527
+ },
1528
+ {
1529
+ "name": "update:selectedKeys",
1530
+ "payload": "Array<string | number>",
1531
+ "description": "Fired when row selection changes."
1532
+ },
1533
+ {
1534
+ "name": "query-change",
1535
+ "payload": "DataGridQuery",
1536
+ "description": "Fired with the normalized search, filters, and sort state. Use this to call a resource API."
1537
+ },
1538
+ {
1539
+ "name": "viewport-scroll",
1540
+ "payload": "{ scrollTop, scrollHeight, clientHeight, remaining, atEnd }",
1541
+ "description": "Fired when the scrollable row viewport scrolls."
1542
+ },
1543
+ {
1544
+ "name": "viewport-end",
1545
+ "payload": "{ scrollTop, scrollHeight, clientHeight, remaining, atEnd }",
1546
+ "description": "Fired when the scrollable row viewport reaches the bottom threshold. Useful for cursor pagination and infinite loading."
1547
+ },
1548
+ {
1549
+ "name": "cell-update",
1550
+ "payload": "({ row, column, rowIndex, rowKey, value, previousValue })",
1551
+ "description": "Re-emitted when a column component emits update:value."
1552
+ },
1553
+ {
1554
+ "name": "cell-action",
1555
+ "payload": "({ row, column, rowIndex, rowKey, value, formatted, action, payload })",
1556
+ "description": "Re-emitted when a column component emits action."
1557
+ },
1558
+ {
1559
+ "name": "column-resize",
1560
+ "payload": "({ column, key, width, previousWidth, startWidth })",
1561
+ "description": "Fired while a header divider is dragged and a column width changes."
1562
+ },
1563
+ {
1564
+ "name": "column-resize-end",
1565
+ "payload": "({ column, key, width, previousWidth, startWidth })",
1566
+ "description": "Fired when the user finishes resizing a column."
1567
+ },
1568
+ {
1569
+ "name": "render-window-change",
1570
+ "payload": "({ startIndex, endIndex, renderedRows, totalRows, firstVisibleIndex, lastVisibleIndex })",
1571
+ "description": "Fired by the virtual row renderer when the mounted row window changes."
1572
+ },
1573
+ {
1574
+ "name": "row-click",
1575
+ "payload": "({ row, index })",
1576
+ "description": "Fired when a data row is clicked."
1577
+ }
1578
+ ],
1579
+ "slots": [
1580
+ {
1581
+ "name": "cell",
1582
+ "payload": "{ row, column, value, formatted, rowIndex, rowKey }",
1583
+ "description": "Custom cell renderer."
1584
+ },
1585
+ {
1586
+ "name": "toolbar-actions",
1587
+ "payload": "{ query, clearFilters }",
1588
+ "description": "Extra controls rendered next to search and Clear filters."
1589
+ },
1590
+ {
1591
+ "name": "empty",
1592
+ "description": "Custom empty state."
1593
+ }
1594
+ ],
1595
+ "keyboard": [
1596
+ {
1597
+ "keys": "Enter / Space on a header",
1598
+ "action": "Toggle sort when the column is sortable."
1599
+ },
1600
+ {
1601
+ "keys": "Enter / Space on a filter button",
1602
+ "action": "Open the typed filter popover."
1603
+ },
1604
+ {
1605
+ "keys": "Esc",
1606
+ "action": "Close an open filter popover."
1607
+ }
1608
+ ]
1609
+ },
1610
+ "studio": {}
1611
+ },
1612
+ {
1613
+ "id": "data/document-editor",
1614
+ "path": "../data/document-editor/DomDocumentEditor.vue",
1615
+ "section": "data",
1616
+ "slug": "document-editor",
1617
+ "exportName": "DomDocumentEditor",
1618
+ "route": "/data/document-editor",
1619
+ "doc": {
1620
+ "name": "Document editor",
1621
+ "tag": "<DomDocumentEditor>",
1622
+ "description": "A client-only WYSIWYG document editor shell for structured writing, tables, language-aware highlighted code blocks, AI rewrite suggestions, media insertion, video embeds, and optional Yjs collaboration adapters.",
1623
+ "icon": "M5 4h14v16H5V4Zm4 5h6M9 13h6M9 17h3",
1624
+ "events": [
1625
+ {
1626
+ "name": "update:modelValue",
1627
+ "payload": "Record<string, unknown> | string",
1628
+ "description": "Fired with JSON or HTML content depending on the output prop."
1629
+ },
1630
+ {
1631
+ "name": "change",
1632
+ "payload": "DocumentEditorChangePayload",
1633
+ "description": "Fired with JSON, HTML, and plain text whenever the editor changes."
1634
+ },
1635
+ {
1636
+ "name": "selection-change",
1637
+ "payload": "DocumentEditorSelectionPayload",
1638
+ "description": "Fired when the editor selection changes."
1639
+ },
1640
+ {
1641
+ "name": "rewrite-request",
1642
+ "payload": "DocumentEditorRewriteRequest",
1643
+ "description": "Fired when the user asks AI to rewrite the selected range."
1644
+ },
1645
+ {
1646
+ "name": "suggestion-create",
1647
+ "payload": "DocumentEditorSuggestion",
1648
+ "description": "Fired after a rewrite suggestion is added to the review rail."
1649
+ },
1650
+ {
1651
+ "name": "suggestion-accept",
1652
+ "payload": "DocumentEditorSuggestion",
1653
+ "description": "Fired after a suggestion is accepted."
1654
+ },
1655
+ {
1656
+ "name": "suggestion-reject",
1657
+ "payload": "DocumentEditorSuggestion",
1658
+ "description": "Fired after a suggestion is rejected."
1659
+ },
1660
+ {
1661
+ "name": "media-request",
1662
+ "payload": "DocumentEditorMediaRequestPayload",
1663
+ "description": "Fired when the image tool or an existing image requests an app-owned media picker."
1664
+ },
1665
+ {
1666
+ "name": "media-insert",
1667
+ "payload": "DocumentEditorMediaPayload",
1668
+ "description": "Fired after insertImage inserts a media-backed image node."
1669
+ },
1670
+ {
1671
+ "name": "media-update",
1672
+ "payload": "DocumentEditorMediaPayload",
1673
+ "description": "Fired after an existing media-backed image node is replaced."
1674
+ },
1675
+ {
1676
+ "name": "video-insert",
1677
+ "payload": "DocumentEditorVideoPayload",
1678
+ "description": "Fired after a video embed node is inserted."
1679
+ },
1680
+ {
1681
+ "name": "tool-action",
1682
+ "payload": "({ tool, editor })",
1683
+ "description": "Fired when a custom toolbar tool is activated."
1684
+ },
1685
+ {
1686
+ "name": "ready",
1687
+ "payload": "({ editor })",
1688
+ "description": "Fired after the browser-only editor runtime mounts."
1689
+ },
1690
+ {
1691
+ "name": "runtime-error",
1692
+ "payload": "Error",
1693
+ "description": "Fired when the editor runtime cannot mount."
1694
+ },
1695
+ {
1696
+ "name": "focus",
1697
+ "payload": "FocusEvent",
1698
+ "description": "Fired when the editable document receives focus."
1699
+ },
1700
+ {
1701
+ "name": "blur",
1702
+ "payload": "FocusEvent",
1703
+ "description": "Fired when the editable document loses focus."
1704
+ }
1705
+ ],
1706
+ "slots": [
1707
+ {
1708
+ "name": "toolbar-start",
1709
+ "payload": "{ editor, active }",
1710
+ "description": "Add controls before the built-in toolbar groups."
1711
+ },
1712
+ {
1713
+ "name": "toolbar-end",
1714
+ "payload": "{ editor, active }",
1715
+ "description": "Add controls after the built-in toolbar groups."
1716
+ },
1717
+ {
1718
+ "name": "suggestion",
1719
+ "payload": "{ suggestion, accept, reject }",
1720
+ "description": "Replace a suggestion review card."
1721
+ },
1722
+ {
1723
+ "name": "empty-suggestions",
1724
+ "description": "Replace the empty suggestion rail state."
1725
+ }
1726
+ ]
1727
+ },
1728
+ "studio": {}
1729
+ },
1730
+ {
1731
+ "id": "data/filter-bar",
1732
+ "path": "../data/filter-bar/DomFilterBar.vue",
1733
+ "section": "data",
1734
+ "slug": "filter-bar",
1735
+ "exportName": "DomFilterBar",
1736
+ "route": "/data/filter-bar",
1737
+ "doc": {
1738
+ "name": "Filter bar",
1739
+ "tag": "<DomFilterBar>",
1740
+ "description": "A controlled, transport-free query bar for application-owned search and logical filter values.",
1741
+ "icon": "M4 6h16M7 12h10M10 18h4M8 6v3M15 12v3M12 18v2",
1742
+ "events": [
1743
+ {
1744
+ "name": "update:filters",
1745
+ "payload": "Record<string, unknown>",
1746
+ "description": "Fired when one logical filter value changes or is cleared."
1747
+ },
1748
+ {
1749
+ "name": "update:search",
1750
+ "payload": "string",
1751
+ "description": "Fired when the free-text search value changes."
1752
+ },
1753
+ {
1754
+ "name": "query-change",
1755
+ "payload": "FilterBarQuery",
1756
+ "typeRef": "FilterBarQuery",
1757
+ "description": "Fired with the complete normalized query after any control changes."
1758
+ },
1759
+ {
1760
+ "name": "clear",
1761
+ "payload": "FilterBarQuery",
1762
+ "typeRef": "FilterBarQuery",
1763
+ "description": "Fired after the complete query is cleared."
1764
+ }
1765
+ ],
1766
+ "slots": [
1767
+ {
1768
+ "name": "leading",
1769
+ "payload": "{ query }",
1770
+ "description": "Content before the built-in search and filters."
1771
+ },
1772
+ {
1773
+ "name": "filter",
1774
+ "payload": "{ definition, value, setValue, clear }",
1775
+ "description": "Replace the control for each filter definition."
1776
+ },
1777
+ {
1778
+ "name": "trailing",
1779
+ "payload": "{ query, clear }",
1780
+ "description": "Application actions after the built-in controls."
1781
+ },
1782
+ {
1783
+ "name": "active-filter",
1784
+ "payload": "{ definition, value, label, clear }",
1785
+ "description": "Replace an active filter chip."
1786
+ }
1787
+ ]
1788
+ },
1789
+ "studio": {}
1790
+ },
1791
+ {
1792
+ "id": "data/kanban",
1793
+ "path": "../data/kanban/DomKanban.vue",
1794
+ "section": "data",
1795
+ "slug": "kanban",
1796
+ "exportName": "DomKanban",
1797
+ "route": "/data/kanban",
1798
+ "doc": {
1799
+ "name": "Kanban",
1800
+ "tag": "<DomKanban>",
1801
+ "description": "A controlled, API-shaped Kanban for shared resource rows, custom Vue card renderers, async creation, and precise card or column ordering.",
1802
+ "icon": "M4 5h5v14H4V5Zm7 0h5v9h-5V5Zm7 0h2v11h-2V5Z",
1803
+ "events": [
1804
+ {
1805
+ "name": "update:rows",
1806
+ "payload": "Array<Record<string, unknown>>",
1807
+ "description": "Immutable local projection after a completed card move or creation. Use v-model:rows for local boards."
1808
+ },
1809
+ {
1810
+ "name": "update:columns",
1811
+ "payload": "Array<KanbanColumn>",
1812
+ "description": "Immutable ordered columns after a completed reorder or creation."
1813
+ },
1814
+ {
1815
+ "name": "card-move",
1816
+ "payload": "KanbanCardMove",
1817
+ "typeRef": "KanbanCardMove",
1818
+ "description": "Fired after a valid pointer or keyboard move. Persist changes and orders to a resource API."
1819
+ },
1820
+ {
1821
+ "name": "card-drop",
1822
+ "payload": "KanbanCardMove",
1823
+ "typeRef": "KanbanCardMove",
1824
+ "description": "Alias emitted with card-move for applications that model drag/drop events."
1825
+ },
1826
+ {
1827
+ "name": "card-create-request",
1828
+ "payload": "({ column, columnKey, index, draft, suggestedRow })",
1829
+ "description": "Fired before the optional createCard hook runs."
1830
+ },
1831
+ {
1832
+ "name": "card-create",
1833
+ "payload": "({ column, columnKey, index, draft, result, row, nextRows })",
1834
+ "description": "Fired when the creation hook succeeds or a local suggested row is accepted."
1835
+ },
1836
+ {
1837
+ "name": "card-create-error",
1838
+ "payload": "({ column, columnKey, draft, error })",
1839
+ "description": "Fired when createCard rejects."
1840
+ },
1841
+ {
1842
+ "name": "column-move",
1843
+ "payload": "({ column, columnKey, sourceIndex, targetIndex, columnKeys, nextColumns, input })",
1844
+ "description": "Fired after a valid pointer or keyboard column reorder."
1845
+ },
1846
+ {
1847
+ "name": "column-create-request",
1848
+ "payload": "({ label, suggestedColumn })",
1849
+ "description": "Fired before the optional createColumn hook runs."
1850
+ },
1851
+ {
1852
+ "name": "column-create",
1853
+ "payload": "({ label, result, column, nextColumns })",
1854
+ "description": "Fired when the column creation hook succeeds or a local suggestion is accepted."
1855
+ },
1856
+ {
1857
+ "name": "column-create-error",
1858
+ "payload": "({ label, error })",
1859
+ "description": "Fired when createColumn rejects."
1860
+ },
1861
+ {
1862
+ "name": "card-click",
1863
+ "payload": "({ row, rowKey, column, columnKey, index, event })",
1864
+ "description": "Fired when a card shell is activated without using an inner interactive control."
1865
+ },
1866
+ {
1867
+ "name": "card-action",
1868
+ "payload": "({ row, rowKey, column, columnKey, index, action, payload })",
1869
+ "description": "Re-emitted when a custom card component emits action."
1870
+ },
1871
+ {
1872
+ "name": "card-drag-start",
1873
+ "payload": "({ row, rowKey, source, event })",
1874
+ "description": "Fired when native card dragging begins."
1875
+ },
1876
+ {
1877
+ "name": "card-drag-end",
1878
+ "payload": "({ row, rowKey, source, event })",
1879
+ "description": "Fired when native card dragging ends."
1880
+ }
1881
+ ],
1882
+ "slots": [
1883
+ {
1884
+ "name": "card",
1885
+ "payload": "{ row, rowKey, column, columnKey, index, drag }",
1886
+ "description": "Custom card renderer. The component retains the accessible focus and drag shell."
1887
+ },
1888
+ {
1889
+ "name": "column-header",
1890
+ "payload": "{ column, columnKey, index, rows, count, limit }",
1891
+ "description": "Custom content for a column header."
1892
+ },
1893
+ {
1894
+ "name": "empty",
1895
+ "payload": "{ column, columnKey }",
1896
+ "description": "Custom empty-column state."
1897
+ },
1898
+ {
1899
+ "name": "card-composer",
1900
+ "payload": "{ column, columnKey, draft, setDraft, submit, cancel, creating }",
1901
+ "description": "Custom card creation form."
1902
+ },
1903
+ {
1904
+ "name": "column-composer",
1905
+ "payload": "{ draft, setDraft, submit, cancel, creating }",
1906
+ "description": "Custom column creation form."
1907
+ },
1908
+ {
1909
+ "name": "column-footer",
1910
+ "payload": "{ column, columnKey, rows, count }",
1911
+ "description": "Extra content below a column card list."
1912
+ }
1913
+ ],
1914
+ "keyboard": [
1915
+ {
1916
+ "keys": "Alt + Up / Down",
1917
+ "action": "Move the focused card within its current column."
1918
+ },
1919
+ {
1920
+ "keys": "Alt + Left / Right",
1921
+ "action": "Move the focused card into the adjacent column."
1922
+ },
1923
+ {
1924
+ "keys": "Alt + Left / Right on column grip",
1925
+ "action": "Reorder the current column."
1926
+ },
1927
+ {
1928
+ "keys": "Enter",
1929
+ "action": "Submit the built-in card or column composer."
1930
+ },
1931
+ {
1932
+ "keys": "Escape",
1933
+ "action": "Close the active composer."
1934
+ }
1935
+ ]
1936
+ },
1937
+ "studio": {}
1938
+ },
1939
+ {
1940
+ "id": "data/media-browser",
1941
+ "path": "../data/media-browser/DomMediaBrowser.vue",
1942
+ "section": "data",
1943
+ "slug": "media-browser",
1944
+ "exportName": "DomMediaBrowser",
1945
+ "route": "/data/media-browser",
1946
+ "doc": {
1947
+ "name": "Media browser",
1948
+ "tag": "<DomMediaBrowser>",
1949
+ "description": "A folder-aware media library surface for server-backed files, optimistic Pinia stores, custom file renderers, drag and drop, upload progress, and picker workflows.",
1950
+ "icon": "M4 7h6l2 2h8v9H4V7Zm3 6h10M8 16h4",
1951
+ "events": [
1952
+ {
1953
+ "name": "update:selectedKeys",
1954
+ "payload": "Array<string>",
1955
+ "description": "Fired when the user changes the selected media rows."
1956
+ },
1957
+ {
1958
+ "name": "update:mode",
1959
+ "payload": "'grid' | 'list'",
1960
+ "description": "Fired when the user switches between grid and list layout."
1961
+ },
1962
+ {
1963
+ "name": "selection-change",
1964
+ "payload": "MediaBrowserSelectionPayload",
1965
+ "typeRef": "MediaBrowserSelectionPayload",
1966
+ "description": "Fired with selected keys and resolved rows."
1967
+ },
1968
+ {
1969
+ "name": "navigate",
1970
+ "payload": "({ path, item, breadcrumb, event })",
1971
+ "description": "Fired when the user opens a folder or breadcrumb."
1972
+ },
1973
+ {
1974
+ "name": "create-folder",
1975
+ "payload": "({ path })",
1976
+ "description": "Fired when the built-in new-folder action is activated."
1977
+ },
1978
+ {
1979
+ "name": "rename",
1980
+ "payload": "({ item, name })",
1981
+ "description": "Fired after inline rename is committed."
1982
+ },
1983
+ {
1984
+ "name": "move",
1985
+ "payload": "MediaBrowserMovePayload",
1986
+ "typeRef": "MediaBrowserMovePayload",
1987
+ "description": "Fired when one or more selected rows are dropped onto a folder."
1988
+ },
1989
+ {
1990
+ "name": "upload",
1991
+ "payload": "MediaBrowserUploadPayload",
1992
+ "typeRef": "MediaBrowserUploadPayload",
1993
+ "description": "Fired when files are selected through the upload button or files and folders are dropped onto the current browser or a folder."
1994
+ },
1995
+ {
1996
+ "name": "metadata-update",
1997
+ "payload": "({ item, meta })",
1998
+ "description": "Fired when the default inspector commits editable metadata such as image alt text."
1999
+ },
2000
+ {
2001
+ "name": "make-folder-with-items",
2002
+ "payload": "({ items, path })",
2003
+ "description": "Fired from the context menu when the selection should be grouped into a new folder."
2004
+ },
2005
+ {
2006
+ "name": "context-action",
2007
+ "payload": "({ action, items, path })",
2008
+ "description": "Fired for context menu actions after built-in handling."
2009
+ },
2010
+ {
2011
+ "name": "detail-open",
2012
+ "payload": "MediaBrowserDetailPayload",
2013
+ "typeRef": "MediaBrowserDetailPayload",
2014
+ "description": "Fired when a row with a detail component opens in dialog or inline mode."
2015
+ },
2016
+ {
2017
+ "name": "detail-close",
2018
+ "payload": "MediaBrowserDetailPayload",
2019
+ "typeRef": "MediaBrowserDetailPayload",
2020
+ "description": "Fired when the current detail component closes."
2021
+ },
2022
+ {
2023
+ "name": "open",
2024
+ "payload": "MediaBrowserItemPayload",
2025
+ "typeRef": "MediaBrowserItemPayload",
2026
+ "description": "Fired when a non-folder row is opened."
2027
+ },
2028
+ {
2029
+ "name": "item-click",
2030
+ "payload": "MediaBrowserItemPayload",
2031
+ "typeRef": "MediaBrowserItemPayload",
2032
+ "description": "Fired before selection handling when a visible row is clicked."
2033
+ }
2034
+ ],
2035
+ "slots": [
2036
+ {
2037
+ "name": "toolbar",
2038
+ "payload": "{ selectedItems, selectedKeys, mode, currentPath, setMode, viewModeOptions }",
2039
+ "description": "Replace or extend the toolbar for detached picker controls."
2040
+ },
2041
+ {
2042
+ "name": "item",
2043
+ "payload": "{ item, kind, selected, disabled, mode, rename }",
2044
+ "description": "Replace the full item body."
2045
+ },
2046
+ {
2047
+ "name": "inspector",
2048
+ "payload": "{ item, kind, file, selectedItems }",
2049
+ "description": "Replace the inspector panel body."
2050
+ },
2051
+ {
2052
+ "name": "detail",
2053
+ "payload": "{ item, kind, file, mode, close }",
2054
+ "description": "Replace a detail component body for dialog or inline rendering."
2055
+ },
2056
+ {
2057
+ "name": "empty",
2058
+ "description": "Custom empty-folder state."
2059
+ }
2060
+ ],
2061
+ "keyboard": [
2062
+ {
2063
+ "keys": "Enter on folder",
2064
+ "action": "Navigate into the folder."
2065
+ },
2066
+ {
2067
+ "keys": "Enter / Space on file",
2068
+ "action": "Select the file."
2069
+ },
2070
+ {
2071
+ "keys": "F2 on selected row",
2072
+ "action": "Start inline rename."
2073
+ },
2074
+ {
2075
+ "keys": "Enter in rename input",
2076
+ "action": "Commit the rename."
2077
+ },
2078
+ {
2079
+ "keys": "Esc in rename input",
2080
+ "action": "Cancel the rename."
2081
+ }
2082
+ ]
2083
+ },
2084
+ "studio": {}
2085
+ },
2086
+ {
2087
+ "id": "data/month-calendar",
2088
+ "path": "../data/month-calendar/DomMonthCalendar.vue",
2089
+ "section": "data",
2090
+ "slug": "month-calendar",
2091
+ "exportName": "DomMonthCalendar",
2092
+ "route": "/data/month-calendar",
2093
+ "doc": {
2094
+ "name": "Month calendar",
2095
+ "tag": "<DomMonthCalendar>",
2096
+ "description": "A large scrolling month calendar that keeps weekday grids aligned, supports continuous date streams, and lets each day render custom UI.",
2097
+ "icon": "M7 4v3M17 4v3M5 8h14M6 6h12v13H6V6Zm3 6h2M13 12h2M9 16h2M13 16h2",
2098
+ "events": [
2099
+ {
2100
+ "name": "day-click",
2101
+ "payload": "({ cell, event })",
2102
+ "typeRef": "MonthCalendarDayClickPayload",
2103
+ "description": "Fired when a clickable day is activated."
2104
+ },
2105
+ {
2106
+ "name": "day-drag-start",
2107
+ "payload": "({ cell, sourceCell, sourceValue, data, event })",
2108
+ "typeRef": "MonthCalendarDayDragPayload",
2109
+ "description": "Fired when an item using dragAttrs starts dragging from a day."
2110
+ },
2111
+ {
2112
+ "name": "day-drag-enter",
2113
+ "payload": "({ cell, sourceCell, targetCell, sourceValue, targetValue, data, event })",
2114
+ "typeRef": "MonthCalendarDayDragPayload",
2115
+ "description": "Fired when a dragged item previews a day as the drop target."
2116
+ },
2117
+ {
2118
+ "name": "day-drag-leave",
2119
+ "payload": "({ cell, sourceCell, targetCell, sourceValue, targetValue, data, event })",
2120
+ "typeRef": "MonthCalendarDayDragPayload",
2121
+ "description": "Fired when a dragged item leaves a previewed day."
2122
+ },
2123
+ {
2124
+ "name": "day-drop",
2125
+ "payload": "({ cell, sourceCell, targetCell, sourceValue, targetValue, data, event })",
2126
+ "typeRef": "MonthCalendarDayDragPayload",
2127
+ "description": "Fired when a draggable item is dropped onto a day. The calendar does not mutate records."
2128
+ },
2129
+ {
2130
+ "name": "day-drag-end",
2131
+ "payload": "({ cell, sourceCell, targetCell, sourceValue, targetValue, data, event })",
2132
+ "typeRef": "MonthCalendarDayDragPayload",
2133
+ "description": "Fired when a drag started with dragAttrs ends."
2134
+ }
2135
+ ],
2136
+ "slots": [
2137
+ {
2138
+ "name": "(default)",
2139
+ "payload": "{ cell, month, drag, dragAttrs }",
2140
+ "typeRef": "MonthCalendarDaySlotPayload",
2141
+ "description": "Custom content inside each visible calendar day. Use dragAttrs(data) on items that should be draggable."
2142
+ },
2143
+ {
2144
+ "name": "month-header",
2145
+ "payload": "{ month }",
2146
+ "description": "Custom content rendered opposite separated month titles or above a continuous range."
2147
+ }
2148
+ ],
2149
+ "keyboard": [
2150
+ {
2151
+ "keys": "Tab",
2152
+ "action": "Move through clickable days when clickable is enabled."
2153
+ },
2154
+ {
2155
+ "keys": "Enter / Space",
2156
+ "action": "Activate the focused day."
2157
+ }
2158
+ ]
2159
+ },
2160
+ "studio": {}
2161
+ },
2162
+ {
2163
+ "id": "data/week-planner",
2164
+ "path": "../data/week-planner/DomWeekPlanner.vue",
2165
+ "section": "data",
2166
+ "slug": "week-planner",
2167
+ "exportName": "DomWeekPlanner",
2168
+ "route": "/data/week-planner",
2169
+ "doc": {
2170
+ "name": "Week planner",
2171
+ "tag": "<DomWeekPlanner>",
2172
+ "description": "A fixed-width week scheduler with days as horizontally scrolling swim lanes and time chunks as rows.",
2173
+ "icon": "M7 4v3M17 4v3M5 8h14M6 6h12v13H6V6Zm4 5h6M9 16h4",
2174
+ "events": [
2175
+ {
2176
+ "name": "day-click",
2177
+ "payload": "({ cell, targetTime, targetMinutes, event })",
2178
+ "typeRef": "WeekPlannerDayClickPayload",
2179
+ "description": "Fired when a clickable day header, all-day cell, or timed row is activated."
2180
+ },
2181
+ {
2182
+ "name": "time-range-select",
2183
+ "payload": "({ cell, value, startTime, endTime, startMinutes, endMinutes, event })",
2184
+ "typeRef": "WeekPlannerTimeRangePayload",
2185
+ "description": "Fired after a mouse or pen drag selects a snapped time range. The planner does not create or persist records."
2186
+ },
2187
+ {
2188
+ "name": "day-drag-start",
2189
+ "payload": "({ cell, sourceValue, sourceTime, data, event })",
2190
+ "typeRef": "WeekPlannerDayDragPayload",
2191
+ "description": "Fired when an item using dragAttrs starts dragging."
2192
+ },
2193
+ {
2194
+ "name": "day-drag-enter",
2195
+ "payload": "({ sourceCell, targetCell, targetValue, targetTime, data, event })",
2196
+ "typeRef": "WeekPlannerDayDragPayload",
2197
+ "description": "Fired when a draggable item previews a day and time."
2198
+ },
2199
+ {
2200
+ "name": "day-drag-leave",
2201
+ "payload": "({ sourceCell, targetCell, targetValue, targetTime, data, event })",
2202
+ "typeRef": "WeekPlannerDayDragPayload",
2203
+ "description": "Fired when a draggable item leaves a day lane."
2204
+ },
2205
+ {
2206
+ "name": "day-drop",
2207
+ "payload": "({ sourceCell, targetCell, sourceValue, targetValue, sourceTime, targetTime, data, event })",
2208
+ "typeRef": "WeekPlannerDayDragPayload",
2209
+ "description": "Fired when an item is dropped. The planner does not mutate records."
2210
+ },
2211
+ {
2212
+ "name": "day-drag-end",
2213
+ "payload": "({ sourceCell, targetCell, sourceValue, targetValue, sourceTime, targetTime, data, event })",
2214
+ "typeRef": "WeekPlannerDayDragPayload",
2215
+ "description": "Fired when a drag started with dragAttrs ends."
2216
+ },
2217
+ {
2218
+ "name": "viewport-scroll",
2219
+ "payload": "({ scrollLeft, scrollWidth, clientWidth, remaining, atStart, atEnd })",
2220
+ "typeRef": "WeekPlannerViewportPayload",
2221
+ "description": "Fired while the internal two-axis viewport scrolls horizontally."
2222
+ },
2223
+ {
2224
+ "name": "viewport-end",
2225
+ "payload": "({ scrollLeft, scrollWidth, clientWidth, remaining, atStart, atEnd })",
2226
+ "typeRef": "WeekPlannerViewportPayload",
2227
+ "description": "Fired when horizontal scrolling reaches the end threshold. Apps can append another date range."
2228
+ },
2229
+ {
2230
+ "name": "render-window-change",
2231
+ "payload": "({ startIndex, endIndex, renderedWeeks, totalWeeks, start, end })",
2232
+ "typeRef": "WeekPlannerRenderWindowPayload",
2233
+ "description": "Fired when the mounted virtual week window changes so apps can fetch its record range."
2234
+ }
2235
+ ],
2236
+ "slots": [
2237
+ {
2238
+ "name": "(default)",
2239
+ "payload": "{ cell, month, week, timeSlots, drag, dragAttrs, rangeStyle }",
2240
+ "typeRef": "WeekPlannerDaySlotPayload",
2241
+ "description": "Timed content layer for each day. Use rangeStyle(record) with records containing startTime and endTime."
2242
+ },
2243
+ {
2244
+ "name": "day-header",
2245
+ "payload": "{ cell, month, week }",
2246
+ "description": "Custom day-column header content."
2247
+ },
2248
+ {
2249
+ "name": "all-day",
2250
+ "payload": "{ cell, month, week, drag, dragAttrs }",
2251
+ "description": "All-day content rendered above the timed rows."
2252
+ },
2253
+ {
2254
+ "name": "time-label",
2255
+ "payload": "{ slot }",
2256
+ "description": "Custom sticky time-rail label."
2257
+ },
2258
+ {
2259
+ "name": "corner",
2260
+ "payload": "{ range }",
2261
+ "description": "Content above the sticky time rail."
2262
+ }
2263
+ ],
2264
+ "keyboard": [
2265
+ {
2266
+ "keys": "Tab",
2267
+ "action": "Move through day headers, all-day cells, and time rows when clickable is enabled."
2268
+ },
2269
+ {
2270
+ "keys": "Enter / Space",
2271
+ "action": "Activate the focused day or time row."
2272
+ }
2273
+ ]
2274
+ },
2275
+ "studio": {}
2276
+ },
2277
+ {
2278
+ "id": "dev/code-block",
2279
+ "path": "../dev/code-block/DomCodeBlock.vue",
2280
+ "section": "dev",
2281
+ "slug": "code-block",
2282
+ "exportName": "DomCodeBlock",
2283
+ "route": "/dev/code-block",
2284
+ "doc": {
2285
+ "name": "Code block",
2286
+ "tag": "<DomCodeBlock>",
2287
+ "description": "A syntax-highlighted code block for examples, API snippets, and generated source previews.",
2288
+ "icon": "M8 9l-4 3 4 3M16 9l4 3-4 3M14 5l-4 14",
2289
+ "playground": {
2290
+ "initial": {
2291
+ "code": "import { DomCodeBlock } from '@getdom/studio/vue';\n\nconst source = '<DomButton>Save</DomButton>';",
2292
+ "lang": "js",
2293
+ "framed": true,
2294
+ "previewLines": 0
2295
+ }
2296
+ }
2297
+ },
2298
+ "studio": {}
2299
+ },
2300
+ {
2301
+ "id": "dev/json-viewer",
2302
+ "path": "../dev/json-viewer/DomJsonViewer.vue",
2303
+ "section": "dev",
2304
+ "slug": "json-viewer",
2305
+ "exportName": "DomJsonViewer",
2306
+ "route": "/dev/json-viewer",
2307
+ "doc": {
2308
+ "name": "JSON viewer",
2309
+ "tag": "<DomJsonViewer>",
2310
+ "description": "A read-only JSON viewer with a collapsible tree, formatted source view, syntax highlighting, and copy support.",
2311
+ "icon": "M5 5h5v5H5V5Zm9 0h5v5h-5V5ZM5 14h5v5H5v-5Zm9 0h5v5h-5v-5Z",
2312
+ "events": [
2313
+ {
2314
+ "name": "update:mode",
2315
+ "payload": "'tree' | 'code'",
2316
+ "description": "Fired when the built-in mode toggle changes the active view."
2317
+ },
2318
+ {
2319
+ "name": "copy",
2320
+ "payload": "string",
2321
+ "description": "Fired after formatted JSON is copied to the clipboard."
2322
+ }
2323
+ ],
2324
+ "playground": {
2325
+ "initial": {
2326
+ "title": "API response",
2327
+ "filename": "response.json",
2328
+ "value": {
2329
+ "ok": true,
2330
+ "data": {
2331
+ "id": "project_dom_studio",
2332
+ "status": "active",
2333
+ "features": [
2334
+ "components",
2335
+ "blocks",
2336
+ "theme"
2337
+ ]
2338
+ }
2339
+ }
2340
+ }
2341
+ }
2342
+ },
2343
+ "studio": {}
2344
+ },
2345
+ {
2346
+ "id": "forms/autocomplete",
2347
+ "path": "../forms/autocomplete/DomAutocomplete.vue",
2348
+ "section": "forms",
2349
+ "slug": "autocomplete",
2350
+ "exportName": "DomAutocomplete",
2351
+ "route": "/forms/autocomplete",
2352
+ "doc": {
2353
+ "name": "Autocomplete",
2354
+ "tag": "<DomAutocomplete>",
2355
+ "description": "Free-text autocomplete with optional suggestions, floating positioning, keyboard navigation, and query events for async lookups.",
2356
+ "slots": [
2357
+ {
2358
+ "name": "item",
2359
+ "payload": "{ item, index }",
2360
+ "description": "Replaces the rendering of each suggestion."
2361
+ }
2362
+ ],
2363
+ "events": [
2364
+ {
2365
+ "name": "query",
2366
+ "payload": "(query: string)",
2367
+ "description": "Fired as the user types. Use it to fetch or replace suggestions."
2368
+ },
2369
+ {
2370
+ "name": "select",
2371
+ "payload": "({ item, value, label, text, query })",
2372
+ "description": "Fired when a suggestion is chosen. item is the original option object."
2373
+ },
2374
+ {
2375
+ "name": "commit",
2376
+ "payload": "({ value, label, custom })",
2377
+ "description": "Fired when the current text is committed with Enter."
2378
+ }
2379
+ ]
2380
+ },
2381
+ "studio": {}
2382
+ },
2383
+ {
2384
+ "id": "forms/calendar",
2385
+ "path": "../forms/calendar/DomCalendar.vue",
2386
+ "section": "forms",
2387
+ "slug": "calendar",
2388
+ "exportName": "DomCalendar",
2389
+ "route": "/forms/calendar",
2390
+ "doc": {
2391
+ "name": "Calendar",
2392
+ "tag": "<DomCalendar>",
2393
+ "description": "A compact month calendar for choosing a date, with month and year navigation.",
2394
+ "events": [
2395
+ {
2396
+ "name": "update:modelValue",
2397
+ "payload": "YYYY-MM-DD",
2398
+ "description": "Fired when a date is selected."
2399
+ },
2400
+ {
2401
+ "name": "change",
2402
+ "payload": "YYYY-MM-DD",
2403
+ "description": "Fired when a date is selected."
2404
+ },
2405
+ {
2406
+ "name": "view-change",
2407
+ "payload": "({ month, year })",
2408
+ "description": "Fired when the visible month or year changes."
2409
+ }
2410
+ ],
2411
+ "keyboard": [
2412
+ {
2413
+ "keys": "ArrowLeft / ArrowRight",
2414
+ "action": "Move focus one day backward or forward."
2415
+ },
2416
+ {
2417
+ "keys": "ArrowUp / ArrowDown",
2418
+ "action": "Move focus one week backward or forward."
2419
+ },
2420
+ {
2421
+ "keys": "Home / End",
2422
+ "action": "Move focus to the first or last day of the current week."
2423
+ },
2424
+ {
2425
+ "keys": "PageUp / PageDown",
2426
+ "action": "Move focus to the same day in the previous or next month."
2427
+ },
2428
+ {
2429
+ "keys": "Shift + PageUp / PageDown",
2430
+ "action": "Move focus to the same day in the previous or next year."
2431
+ },
2432
+ {
2433
+ "keys": "Enter / Space",
2434
+ "action": "Select the focused date."
2435
+ }
2436
+ ]
2437
+ },
2438
+ "studio": {}
2439
+ },
2440
+ {
2441
+ "id": "forms/checkbox",
2442
+ "path": "../forms/checkbox/DomCheckbox.vue",
2443
+ "section": "forms",
2444
+ "slug": "checkbox",
2445
+ "exportName": "DomCheckbox",
2446
+ "route": "/forms/checkbox",
2447
+ "doc": {
2448
+ "name": "Checkbox",
2449
+ "tag": "<DomCheckbox>",
2450
+ "description": "A single accessible checkbox with a visible label and keyboard support.",
2451
+ "events": [
2452
+ {
2453
+ "name": "update:modelValue",
2454
+ "payload": "(checked: boolean)",
2455
+ "description": "Emitted when checked changes."
2456
+ }
2457
+ ]
2458
+ },
2459
+ "studio": {}
2460
+ },
2461
+ {
2462
+ "id": "forms/class-toggle-input",
2463
+ "path": "../forms/class-toggle-input/DomClassToggleInput.vue",
2464
+ "section": "forms",
2465
+ "slug": "class-toggle-input",
2466
+ "exportName": "DomClassToggleInput",
2467
+ "route": "/forms/class-toggle-input",
2468
+ "doc": {
2469
+ "name": "Class toggle input",
2470
+ "tag": "<DomClassToggleInput>",
2471
+ "description": "A class-name autocomplete that keeps every class as a checkbox so utilities can be toggled without being forgotten.",
2472
+ "icon": "M4 7h4l2 2 4-5 2 2-6 7-4-4H4V7Zm0 10h4l2 2 4-5 2 2-6 7-4-4H4v-2Z",
2473
+ "events": [
2474
+ {
2475
+ "name": "update:modelValue",
2476
+ "payload": "string",
2477
+ "description": "Emitted with the enabled class string."
2478
+ },
2479
+ {
2480
+ "name": "update:inactiveValues",
2481
+ "payload": "string[]",
2482
+ "description": "Emitted with known classes that are currently toggled off."
2483
+ },
2484
+ {
2485
+ "name": "query",
2486
+ "payload": "string",
2487
+ "description": "Fired as the user types."
2488
+ },
2489
+ {
2490
+ "name": "toggle",
2491
+ "payload": "({ value, enabled, classes, inactiveValues })",
2492
+ "description": "Fired when a class checkbox is toggled."
2493
+ },
2494
+ {
2495
+ "name": "add",
2496
+ "payload": "({ value, classes, inactiveValues })",
2497
+ "description": "Fired when a typed or suggested class is added."
2498
+ }
2499
+ ]
2500
+ },
2501
+ "studio": {}
2502
+ },
2503
+ {
2504
+ "id": "forms/code-input",
2505
+ "path": "../forms/code-input/DomCodeInput.vue",
2506
+ "section": "forms",
2507
+ "slug": "code-input",
2508
+ "exportName": "DomCodeInput",
2509
+ "route": "/forms/code-input",
2510
+ "doc": {
2511
+ "name": "Code input",
2512
+ "tag": "<DomCodeInput>",
2513
+ "description": "A form input for code or structured text. It progressively enhances to CodeMirror from a CDN and falls back to a textarea if loading fails.",
2514
+ "events": [
2515
+ {
2516
+ "name": "update:modelValue",
2517
+ "payload": "string",
2518
+ "description": "Fired when the code changes."
2519
+ },
2520
+ {
2521
+ "name": "focus",
2522
+ "description": "Fired when the input receives focus."
2523
+ },
2524
+ {
2525
+ "name": "blur",
2526
+ "description": "Fired when the input loses focus."
2527
+ }
2528
+ ]
2529
+ },
2530
+ "studio": {}
2531
+ },
2532
+ {
2533
+ "id": "forms/color-input",
2534
+ "path": "../forms/color-input/DomColorInput.vue",
2535
+ "section": "forms",
2536
+ "slug": "color-input",
2537
+ "exportName": "DomColorInput",
2538
+ "route": "/forms/color-input",
2539
+ "doc": {
2540
+ "name": "Color input",
2541
+ "tag": "<DomColorInput>",
2542
+ "description": "A compact colour swatch that opens the native colour picker while preserving CSS colour values.",
2543
+ "events": [
2544
+ {
2545
+ "name": "update:modelValue",
2546
+ "payload": "string",
2547
+ "description": "Fired when the colour changes."
2548
+ },
2549
+ {
2550
+ "name": "focus",
2551
+ "payload": "FocusEvent",
2552
+ "description": "Fired when either control receives focus."
2553
+ },
2554
+ {
2555
+ "name": "blur",
2556
+ "payload": "FocusEvent",
2557
+ "description": "Fired when either control loses focus."
2558
+ }
2559
+ ]
2560
+ },
2561
+ "studio": {}
2562
+ },
2563
+ {
2564
+ "id": "forms/combobox",
2565
+ "path": "../forms/combobox/DomCombobox.vue",
2566
+ "section": "forms",
2567
+ "slug": "combobox",
2568
+ "exportName": "DomCombobox",
2569
+ "route": "/forms/combobox",
2570
+ "doc": {
2571
+ "name": "Combobox",
2572
+ "tag": "<DomCombobox>",
2573
+ "description": "Select-like combobox with a styled input, floating list, keyboard navigation, and query events for async lookups.",
2574
+ "slots": [
2575
+ {
2576
+ "name": "item",
2577
+ "payload": "{ item, index }",
2578
+ "description": "Replaces the rendering of each option."
2579
+ }
2580
+ ],
2581
+ "events": [
2582
+ {
2583
+ "name": "query",
2584
+ "payload": "(query: string)",
2585
+ "description": "Fired as the user types. Use it to fetch or replace options."
2586
+ },
2587
+ {
2588
+ "name": "select",
2589
+ "payload": "({ item, value, label })",
2590
+ "description": "Fired when an option is selected. item is the original option object."
2591
+ }
2592
+ ]
2593
+ },
2594
+ "studio": {}
2595
+ },
2596
+ {
2597
+ "id": "forms/confirmation-code-input",
2598
+ "path": "../forms/confirmation-code-input/DomConfirmationCodeInput.vue",
2599
+ "section": "forms",
2600
+ "slug": "confirmation-code-input",
2601
+ "exportName": "DomConfirmationCodeInput",
2602
+ "route": "/forms/confirmation-code-input",
2603
+ "doc": {
2604
+ "name": "Confirmation code input",
2605
+ "tag": "<DomConfirmationCodeInput>",
2606
+ "description": "A segmented confirmation-code field with one character per box, automatic focus movement, and full-code paste support.",
2607
+ "icon": "M4 8h3v3H4V8Zm6 0h3v3h-3V8Zm6 0h3v3h-3V8ZM4 14h3v3H4v-3Zm6 0h3v3h-3v-3Zm6 0h3v3h-3v-3Z",
2608
+ "events": [
2609
+ {
2610
+ "name": "update:modelValue",
2611
+ "payload": "string",
2612
+ "description": "Fired whenever the entered code changes."
2613
+ },
2614
+ {
2615
+ "name": "complete",
2616
+ "payload": "string",
2617
+ "description": "Fired when every character box contains a value."
2618
+ },
2619
+ {
2620
+ "name": "focus",
2621
+ "payload": "FocusEvent",
2622
+ "description": "Fired when focus enters the segmented control."
2623
+ },
2624
+ {
2625
+ "name": "blur",
2626
+ "payload": "FocusEvent",
2627
+ "description": "Fired when focus leaves the segmented control."
2628
+ }
2629
+ ],
2630
+ "keyboard": [
2631
+ {
2632
+ "keys": "Character",
2633
+ "action": "Enter one character and move focus to the next box."
2634
+ },
2635
+ {
2636
+ "keys": "Backspace",
2637
+ "action": "Clear the current box, or move back and clear the previous box when empty."
2638
+ },
2639
+ {
2640
+ "keys": "Delete",
2641
+ "action": "Clear the current box."
2642
+ },
2643
+ {
2644
+ "keys": "Left / Right",
2645
+ "action": "Move between character boxes."
2646
+ },
2647
+ {
2648
+ "keys": "Home / End",
2649
+ "action": "Move to the first or last character box."
2650
+ },
2651
+ {
2652
+ "keys": "Paste",
2653
+ "action": "Distribute a complete or partial code across the boxes."
2654
+ }
2655
+ ]
2656
+ },
2657
+ "studio": {}
2658
+ },
2659
+ {
2660
+ "id": "forms/date-picker",
2661
+ "path": "../forms/date-picker/DomDatePicker.vue",
2662
+ "section": "forms",
2663
+ "slug": "date-picker",
2664
+ "exportName": "DomDatePicker",
2665
+ "route": "/forms/date-picker",
2666
+ "doc": {
2667
+ "name": "Date picker",
2668
+ "tag": "<DomDatePicker>",
2669
+ "description": "A text date input with a popover calendar picker. Stores YYYY-MM-DD while letting people type dd/mm/yyyy or mm/dd/yyyy.",
2670
+ "icon": "M7 4v3M17 4v3M5 8h14M6 6h12v13H6V6Zm3 6h2M13 12h2M9 16h2M13 16h2",
2671
+ "events": [
2672
+ {
2673
+ "name": "update:modelValue",
2674
+ "payload": "YYYY-MM-DD",
2675
+ "description": "Fired when a valid date is typed or selected."
2676
+ },
2677
+ {
2678
+ "name": "change",
2679
+ "payload": "YYYY-MM-DD",
2680
+ "description": "Fired when a valid date is committed."
2681
+ },
2682
+ {
2683
+ "name": "invalid-date",
2684
+ "payload": "string",
2685
+ "description": "Fired when typed text cannot be parsed or is outside the allowed range."
2686
+ },
2687
+ {
2688
+ "name": "focus",
2689
+ "payload": "FocusEvent",
2690
+ "description": "Fired when the text input receives focus."
2691
+ },
2692
+ {
2693
+ "name": "blur",
2694
+ "payload": "FocusEvent",
2695
+ "description": "Fired when the text input loses focus."
2696
+ }
2697
+ ],
2698
+ "keyboard": [
2699
+ {
2700
+ "keys": "Alt + ArrowDown",
2701
+ "action": "Open the calendar popover."
2702
+ },
2703
+ {
2704
+ "keys": "Enter",
2705
+ "action": "Commit the typed date when it is valid."
2706
+ },
2707
+ {
2708
+ "keys": "Esc",
2709
+ "action": "Close the popover."
2710
+ },
2711
+ {
2712
+ "keys": "Arrow keys in calendar",
2713
+ "action": "Move focus by day or week once the calendar is open."
2714
+ }
2715
+ ]
2716
+ },
2717
+ "studio": {}
2718
+ },
2719
+ {
2720
+ "id": "forms/date-time-picker",
2721
+ "path": "../forms/date-time-picker/DomDateTimePicker.vue",
2722
+ "section": "forms",
2723
+ "slug": "date-time-picker",
2724
+ "exportName": "DomDateTimePicker",
2725
+ "route": "/forms/date-time-picker",
2726
+ "doc": {
2727
+ "name": "Date time picker",
2728
+ "tag": "<DomDateTimePicker>",
2729
+ "description": "A typed date and time input with a popover calendar and time selector. Stores a local YYYY-MM-DDTHH:mm value.",
2730
+ "icon": "M7 4v3M17 4v3M5 8h14M6 6h12v13H6V6Zm7 7v3l2 1",
2731
+ "events": [
2732
+ {
2733
+ "name": "update:modelValue",
2734
+ "payload": "YYYY-MM-DDTHH:mm",
2735
+ "description": "Fired when a valid date-time is typed or selected."
2736
+ },
2737
+ {
2738
+ "name": "change",
2739
+ "payload": "YYYY-MM-DDTHH:mm",
2740
+ "description": "Fired when a valid date-time is committed."
2741
+ },
2742
+ {
2743
+ "name": "invalid-date-time",
2744
+ "payload": "string",
2745
+ "description": "Fired when typed text cannot be parsed or is outside the allowed range."
2746
+ },
2747
+ {
2748
+ "name": "focus",
2749
+ "payload": "FocusEvent",
2750
+ "description": "Fired when the text input receives focus."
2751
+ },
2752
+ {
2753
+ "name": "blur",
2754
+ "payload": "FocusEvent",
2755
+ "description": "Fired when the text input loses focus."
2756
+ }
2757
+ ],
2758
+ "keyboard": [
2759
+ {
2760
+ "keys": "Alt + ArrowDown",
2761
+ "action": "Open the calendar and time popover."
2762
+ },
2763
+ {
2764
+ "keys": "Enter",
2765
+ "action": "Commit the typed date-time when it is valid."
2766
+ },
2767
+ {
2768
+ "keys": "Esc",
2769
+ "action": "Close the popover."
2770
+ },
2771
+ {
2772
+ "keys": "Arrow keys in calendar",
2773
+ "action": "Move focus by day or week once the calendar is open."
2774
+ },
2775
+ {
2776
+ "keys": "Tab",
2777
+ "action": "Move through generated time options."
2778
+ }
2779
+ ]
2780
+ },
2781
+ "studio": {}
2782
+ },
2783
+ {
2784
+ "id": "forms/email-input",
2785
+ "path": "../forms/email-input/DomEmailInput.vue",
2786
+ "section": "forms",
2787
+ "slug": "email-input",
2788
+ "exportName": "DomEmailInput",
2789
+ "route": "/forms/email-input",
2790
+ "doc": {
2791
+ "name": "Email input",
2792
+ "tag": "<DomEmailInput>",
2793
+ "description": "A convention text field for email addresses with email type, autocomplete, and an email validator.",
2794
+ "icon": "M4.75 6.75h14.5v10.5H4.75V6.75Zm0 0 7.25 5.5 7.25-5.5",
2795
+ "events": [
2796
+ {
2797
+ "name": "update:modelValue",
2798
+ "payload": "string",
2799
+ "description": "Fired when the email address changes."
2800
+ },
2801
+ {
2802
+ "name": "focus",
2803
+ "payload": "FocusEvent",
2804
+ "description": "Fired when the input receives focus."
2805
+ },
2806
+ {
2807
+ "name": "blur",
2808
+ "payload": "FocusEvent",
2809
+ "description": "Fired when the input loses focus."
2810
+ }
2811
+ ]
2812
+ },
2813
+ "studio": {}
2814
+ },
2815
+ {
2816
+ "id": "forms/field",
2817
+ "path": "../forms/field/DomField.vue",
2818
+ "section": "forms",
2819
+ "slug": "field",
2820
+ "exportName": "DomField",
2821
+ "route": "/forms/field",
2822
+ "doc": {
2823
+ "name": "Field",
2824
+ "tag": "<DomField>",
2825
+ "description": "Shared form chrome for labels, required markers, descriptions, errors, and custom controls.",
2826
+ "slots": [
2827
+ {
2828
+ "name": "(default)",
2829
+ "payload": "{ invalid, errors, htmlFor, errorId, fields, fieldAttrs }",
2830
+ "description": "The form control or custom interactive content."
2831
+ },
2832
+ {
2833
+ "name": "label",
2834
+ "payload": "{ label, required, htmlFor, invalid, errors, fields, fieldAttrs }",
2835
+ "description": "Replace the default label while keeping field layout."
2836
+ },
2837
+ {
2838
+ "name": "errors",
2839
+ "payload": "{ errors, errorId, invalid, fields, fieldAttrs }",
2840
+ "description": "Replace the default error list."
2841
+ },
2842
+ {
2843
+ "name": "description",
2844
+ "payload": "{ description, descriptionId, fields, fieldAttrs }",
2845
+ "description": "Replace the default helper text."
2846
+ }
2847
+ ]
2848
+ },
2849
+ "studio": {}
2850
+ },
2851
+ {
2852
+ "id": "forms/file-upload",
2853
+ "path": "../forms/file-upload/DomFileUpload.vue",
2854
+ "section": "forms",
2855
+ "slug": "file-upload",
2856
+ "exportName": "DomFileUpload",
2857
+ "route": "/forms/file-upload",
2858
+ "doc": {
2859
+ "name": "File upload",
2860
+ "tag": "<DomFileUpload>",
2861
+ "description": "A generic local file picker and dropzone for forms. Uploading, persistence, and media APIs stay parent-owned.",
2862
+ "icon": "M12 16V4M8 8l4-4 4 4M5 16v3h14v-3",
2863
+ "events": [
2864
+ {
2865
+ "name": "update:modelValue",
2866
+ "payload": "Array<File | DomUploadedFile>",
2867
+ "description": "Fired when the local file list changes."
2868
+ },
2869
+ {
2870
+ "name": "add",
2871
+ "payload": "Array<File>",
2872
+ "description": "Fired with accepted local File objects."
2873
+ },
2874
+ {
2875
+ "name": "remove",
2876
+ "payload": "{ file, index }",
2877
+ "description": "Fired when a file row is removed."
2878
+ },
2879
+ {
2880
+ "name": "reject",
2881
+ "payload": "Array<DomFileUploadRejection>",
2882
+ "description": "Fired when files fail accept, size, or count checks."
2883
+ },
2884
+ {
2885
+ "name": "focus",
2886
+ "payload": "FocusEvent",
2887
+ "description": "Fired when the native file input receives focus."
2888
+ },
2889
+ {
2890
+ "name": "blur",
2891
+ "payload": "FocusEvent",
2892
+ "description": "Fired when the native file input loses focus."
2893
+ }
2894
+ ],
2895
+ "playground": {
2896
+ "initial": {
2897
+ "label": "Receipt",
2898
+ "description": "Attach images or PDFs. Uploading is handled by the parent.",
2899
+ "accept": "image/*,.pdf",
2900
+ "maxFiles": 3
2901
+ }
2902
+ }
2903
+ },
2904
+ "studio": {}
2905
+ },
2906
+ {
2907
+ "id": "forms/form",
2908
+ "path": "../forms/form/DomForm.vue",
2909
+ "section": "forms",
2910
+ "slug": "form",
2911
+ "exportName": "DomForm",
2912
+ "route": "/forms/form",
2913
+ "doc": {},
2914
+ "studio": {}
2915
+ },
2916
+ {
2917
+ "id": "forms/icon-selector",
2918
+ "path": "../forms/icon-selector/DomIconSelector.vue",
2919
+ "section": "forms",
2920
+ "slug": "icon-selector",
2921
+ "exportName": "DomIconSelector",
2922
+ "route": "/forms/icon-selector",
2923
+ "doc": {
2924
+ "name": "Icon selector",
2925
+ "tag": "<DomIconSelector>",
2926
+ "description": "A searchable select-style field for choosing SVG path icons, emoji, or app-defined symbol rows.",
2927
+ "icon": "M5 5h5v5H5V5Zm9 0h5v5h-5V5ZM5 14h5v5H5v-5Zm9 0h5v5h-5v-5Z",
2928
+ "playground": {
2929
+ "initial": {
2930
+ "label": "Icon",
2931
+ "modelValue": "M12 5v14M5 12h14",
2932
+ "kind": "icons",
2933
+ "placeholder": "Search icons"
2934
+ }
2935
+ },
2936
+ "slots": [
2937
+ {
2938
+ "name": "preview",
2939
+ "payload": "{ item }",
2940
+ "description": "Replace the selected-value preview inside the input."
2941
+ },
2942
+ {
2943
+ "name": "item",
2944
+ "payload": "{ item, selected }",
2945
+ "description": "Replace each icon, emoji, or custom row in the picker panel."
2946
+ }
2947
+ ],
2948
+ "events": [
2949
+ {
2950
+ "name": "update:modelValue",
2951
+ "payload": "string | number | boolean | Component",
2952
+ "description": "Fired with the selected icon path, emoji, component, or custom item value."
2953
+ },
2954
+ {
2955
+ "name": "select",
2956
+ "payload": "{ item, value, label }",
2957
+ "description": "Fired when a picker item is selected."
2958
+ },
2959
+ {
2960
+ "name": "query",
2961
+ "payload": "string",
2962
+ "description": "Fired as the user searches the picker."
2963
+ }
2964
+ ]
2965
+ },
2966
+ "studio": {}
2967
+ },
2968
+ {
2969
+ "id": "forms/input-group",
2970
+ "path": "../forms/input-group/DomInputGroup.vue",
2971
+ "section": "forms",
2972
+ "slug": "input-group",
2973
+ "exportName": "DomInputGroup",
2974
+ "route": "/forms/input-group",
2975
+ "doc": {
2976
+ "name": "Input group",
2977
+ "tag": "<DomInputGroup>",
2978
+ "description": "A display-only frame that presents several independent form controls as one grouped input, followed by optional feedback and their errors.",
2979
+ "icon": "M5 5h14v14H5V5Zm0 7h14",
2980
+ "slots": [
2981
+ {
2982
+ "name": "(default)",
2983
+ "description": "Form controls using chrome=\"false\". Each control keeps its own model, name, validation, and form registration."
2984
+ },
2985
+ {
2986
+ "name": "feedback",
2987
+ "description": "Supporting content shown outside the shared frame and before validation errors."
2988
+ }
2989
+ ]
2990
+ },
2991
+ "studio": {}
2992
+ },
2993
+ {
2994
+ "id": "forms/json-input",
2995
+ "path": "../forms/json-input/DomJsonInput.vue",
2996
+ "section": "forms",
2997
+ "slug": "json-input",
2998
+ "exportName": "DomJsonInput",
2999
+ "route": "/forms/json-input",
3000
+ "doc": {
3001
+ "name": "JSON input",
3002
+ "tag": "<DomJsonInput>",
3003
+ "description": "A JSON form input backed by DomCodeInput. Valid JSON emits parsed data; invalid JSON stays local and shows an error.",
3004
+ "events": [
3005
+ {
3006
+ "name": "update:modelValue",
3007
+ "payload": "object | array | string | number | boolean | null",
3008
+ "description": "Fired with parsed JSON when the editor contains valid JSON."
3009
+ },
3010
+ {
3011
+ "name": "valid",
3012
+ "payload": "parsed value",
3013
+ "description": "Fired when JSON parses successfully."
3014
+ },
3015
+ {
3016
+ "name": "invalid",
3017
+ "payload": "Error",
3018
+ "description": "Fired when JSON cannot be parsed."
3019
+ }
3020
+ ]
3021
+ },
3022
+ "studio": {}
3023
+ },
3024
+ {
3025
+ "id": "forms/json-list-input",
3026
+ "path": "../forms/json-list-input/DomJsonListInput.vue",
3027
+ "section": "forms",
3028
+ "slug": "json-list-input",
3029
+ "exportName": "DomJsonListInput",
3030
+ "route": "/forms/json-list-input",
3031
+ "doc": {
3032
+ "name": "JSON list input",
3033
+ "tag": "<DomJsonListInput>",
3034
+ "description": "A schema-aware editor for arrays of objects. Edit rows through form controls, or toggle to raw JSON for bulk changes.",
3035
+ "events": [
3036
+ {
3037
+ "name": "update:modelValue",
3038
+ "payload": "Array<object>",
3039
+ "description": "Fired when rows are added, removed, reordered, edited, or replaced from valid raw JSON."
3040
+ }
3041
+ ]
3042
+ },
3043
+ "studio": {}
3044
+ },
3045
+ {
3046
+ "id": "forms/listbox",
3047
+ "path": "../forms/listbox/DomListbox.vue",
3048
+ "section": "forms",
3049
+ "slug": "listbox",
3050
+ "exportName": "DomListbox",
3051
+ "route": "/forms/listbox",
3052
+ "doc": {
3053
+ "name": "Listbox",
3054
+ "tag": "<DomListbox>",
3055
+ "description": "A styled select-like list without free-text entry.",
3056
+ "slots": [
3057
+ {
3058
+ "name": "option",
3059
+ "payload": "{ option, index }",
3060
+ "description": "Custom option markup."
3061
+ }
3062
+ ],
3063
+ "events": [
3064
+ {
3065
+ "name": "update:modelValue",
3066
+ "payload": "(value: string)",
3067
+ "description": "Emitted when selection changes."
3068
+ },
3069
+ {
3070
+ "name": "select",
3071
+ "payload": "({ option, value })",
3072
+ "description": "Emitted with the full selected option."
3073
+ }
3074
+ ]
3075
+ },
3076
+ "studio": {}
3077
+ },
3078
+ {
3079
+ "id": "forms/money-input",
3080
+ "path": "../forms/money-input/DomMoneyInput.vue",
3081
+ "section": "forms",
3082
+ "slug": "money-input",
3083
+ "exportName": "DomMoneyInput",
3084
+ "route": "/forms/money-input",
3085
+ "doc": {
3086
+ "name": "Money input",
3087
+ "tag": "<DomMoneyInput>",
3088
+ "description": "A field-compatible decimal input with currency chrome for prices, budgets, invoices, and payouts.",
3089
+ "icon": "M12 5v14M7 8h7a3 3 0 0 1 0 6H9a3 3 0 0 0 0 6h8",
3090
+ "events": [
3091
+ {
3092
+ "name": "update:modelValue",
3093
+ "payload": "string | number",
3094
+ "description": "Fired when the amount changes."
3095
+ },
3096
+ {
3097
+ "name": "focus",
3098
+ "payload": "FocusEvent",
3099
+ "description": "Fired when the input receives focus."
3100
+ },
3101
+ {
3102
+ "name": "blur",
3103
+ "payload": "FocusEvent",
3104
+ "description": "Fired when the input loses focus."
3105
+ }
3106
+ ],
3107
+ "playground": {
3108
+ "initial": {
3109
+ "label": "Price",
3110
+ "modelValue": "149.00",
3111
+ "currency": "GBP",
3112
+ "description": "Stored as a decimal string; upload and billing logic stay parent-owned."
3113
+ }
3114
+ }
3115
+ },
3116
+ "studio": {}
3117
+ },
3118
+ {
3119
+ "id": "forms/native-select",
3120
+ "path": "../forms/native-select/DomNativeSelect.vue",
3121
+ "section": "forms",
3122
+ "slug": "native-select",
3123
+ "exportName": "DomNativeSelect",
3124
+ "route": "/forms/native-select",
3125
+ "doc": {
3126
+ "name": "Native select",
3127
+ "tag": "<DomNativeSelect>",
3128
+ "description": "A styled native select for cases where browser-native picker behaviour is intentionally preferred.",
3129
+ "events": [
3130
+ {
3131
+ "name": "update:modelValue",
3132
+ "payload": "string",
3133
+ "description": "Fired when the selected option changes."
3134
+ }
3135
+ ]
3136
+ },
3137
+ "studio": {}
3138
+ },
3139
+ {
3140
+ "id": "forms/number-input",
3141
+ "path": "../forms/number-input/DomNumberInput.vue",
3142
+ "section": "forms",
3143
+ "slug": "number-input",
3144
+ "exportName": "DomNumberInput",
3145
+ "route": "/forms/number-input",
3146
+ "doc": {},
3147
+ "studio": {}
3148
+ },
3149
+ {
3150
+ "id": "forms/password-input",
3151
+ "path": "../forms/password-input/DomPasswordInput.vue",
3152
+ "section": "forms",
3153
+ "slug": "password-input",
3154
+ "exportName": "DomPasswordInput",
3155
+ "route": "/forms/password-input",
3156
+ "doc": {
3157
+ "name": "Password input",
3158
+ "tag": "<DomPasswordInput>",
3159
+ "description": "A styled password field with show/hide control, strength feedback, and an optional compromised-password warning.",
3160
+ "events": [
3161
+ {
3162
+ "name": "update:modelValue",
3163
+ "payload": "string",
3164
+ "description": "Fired when the password text changes."
3165
+ }
3166
+ ]
3167
+ },
3168
+ "studio": {}
3169
+ },
3170
+ {
3171
+ "id": "forms/password-strength",
3172
+ "path": "../forms/password-strength/DomPasswordStrength.vue",
3173
+ "section": "forms",
3174
+ "slug": "password-strength",
3175
+ "exportName": "DomPasswordStrength",
3176
+ "route": "/forms/password-strength",
3177
+ "doc": {
3178
+ "name": "Password strength",
3179
+ "tag": "<DomPasswordStrength>",
3180
+ "description": "A display-only password strength meter that can read a named DomForm field or a direct model value.",
3181
+ "icon": "M4 18h3V9H4v9Zm6 0h3V6h-3v12Zm6 0h3V3h-3v15Z",
3182
+ "playground": {
3183
+ "initial": {
3184
+ "modelValue": "violet-orbit-lantern-47!"
3185
+ }
3186
+ }
3187
+ },
3188
+ "studio": {}
3189
+ },
3190
+ {
3191
+ "id": "forms/position-input",
3192
+ "path": "../forms/position-input/DomPositionInput.vue",
3193
+ "section": "forms",
3194
+ "slug": "position-input",
3195
+ "exportName": "DomPositionInput",
3196
+ "route": "/forms/position-input",
3197
+ "doc": {
3198
+ "name": "Position input",
3199
+ "tag": "<DomPositionInput>",
3200
+ "description": "A compact visual picker for popover and floating element positions.",
3201
+ "events": [
3202
+ {
3203
+ "name": "update:modelValue",
3204
+ "payload": "string",
3205
+ "description": "Fired when the selected position changes."
3206
+ }
3207
+ ]
3208
+ },
3209
+ "studio": {}
3210
+ },
3211
+ {
3212
+ "id": "forms/radio-group",
3213
+ "path": "../forms/radio-group/DomRadioGroup.vue",
3214
+ "section": "forms",
3215
+ "slug": "radio-group",
3216
+ "exportName": "DomRadioGroup",
3217
+ "route": "/forms/radio-group",
3218
+ "doc": {
3219
+ "name": "Radio group",
3220
+ "tag": "<DomRadioGroup>",
3221
+ "description": "A single-select radio group with roving focus and full styling control.",
3222
+ "slots": [
3223
+ {
3224
+ "name": "option",
3225
+ "payload": "{ option, index }",
3226
+ "description": "Custom option markup."
3227
+ }
3228
+ ],
3229
+ "events": [
3230
+ {
3231
+ "name": "update:modelValue",
3232
+ "payload": "(value: string)",
3233
+ "description": "Emitted when selection changes."
3234
+ }
3235
+ ]
3236
+ },
3237
+ "studio": {}
3238
+ },
3239
+ {
3240
+ "id": "forms/range-input",
3241
+ "path": "../forms/range-input/DomRangeInput.vue",
3242
+ "section": "forms",
3243
+ "slug": "range-input",
3244
+ "exportName": "DomRangeInput",
3245
+ "route": "/forms/range-input",
3246
+ "doc": {
3247
+ "name": "Range input",
3248
+ "tag": "<DomRangeInput>",
3249
+ "description": "A compact slider input for numeric values with a stylable track and handle.",
3250
+ "icon": "M5 12h14M8 12a2 2 0 1 0 0.01 0M16 12a2 2 0 1 0 0.01 0",
3251
+ "slots": [],
3252
+ "playground": {
3253
+ "initial": {
3254
+ "label": "Confidence",
3255
+ "modelValue": 64,
3256
+ "suffix": "%",
3257
+ "handleClass": "size-5 border-2 border-canvas shadow-md group-hover:scale-110",
3258
+ "activeHandleClass": "scale-125 ring-4 ring-primary/20"
3259
+ }
3260
+ }
3261
+ },
3262
+ "studio": {}
3263
+ },
3264
+ {
3265
+ "id": "forms/select",
3266
+ "path": "../forms/select/DomSelect.vue",
3267
+ "section": "forms",
3268
+ "slug": "select",
3269
+ "exportName": "DomSelect",
3270
+ "route": "/forms/select",
3271
+ "doc": {
3272
+ "name": "Select",
3273
+ "tag": "<DomSelect>",
3274
+ "description": "A styled select control with a closed trigger, floating listbox, keyboard navigation, and rich option slots.",
3275
+ "slots": [
3276
+ {
3277
+ "name": "value",
3278
+ "payload": "{ option, value, label, placeholder }",
3279
+ "description": "Custom selected-value markup inside the trigger."
3280
+ },
3281
+ {
3282
+ "name": "option",
3283
+ "payload": "{ option, index, selected, optionId }",
3284
+ "description": "Custom option markup inside the floating list. optionId identifies the focusable option button for external floating UI."
3285
+ },
3286
+ {
3287
+ "name": "group",
3288
+ "payload": "{ group, options, index }",
3289
+ "description": "Custom heading markup for options that share a group."
3290
+ }
3291
+ ],
3292
+ "events": [
3293
+ {
3294
+ "name": "update:modelValue",
3295
+ "payload": "(value: string)",
3296
+ "description": "Emitted when the selected option changes."
3297
+ },
3298
+ {
3299
+ "name": "select",
3300
+ "payload": "({ option, value, label })",
3301
+ "description": "Emitted with the selected option record."
3302
+ }
3303
+ ],
3304
+ "keyboard": [
3305
+ {
3306
+ "keys": "Enter / Space / ↓",
3307
+ "action": "Open the listbox."
3308
+ },
3309
+ {
3310
+ "keys": "↑ / ↓",
3311
+ "action": "Move active option."
3312
+ },
3313
+ {
3314
+ "keys": "Type in search",
3315
+ "action": "Filter visible options when searchable is enabled."
3316
+ },
3317
+ {
3318
+ "keys": "Enter / Space",
3319
+ "action": "Select active option."
3320
+ },
3321
+ {
3322
+ "keys": "Esc / Tab",
3323
+ "action": "Close and return focus."
3324
+ }
3325
+ ]
3326
+ },
3327
+ "studio": {}
3328
+ },
3329
+ {
3330
+ "id": "forms/select-input",
3331
+ "path": "../forms/select-input/DomSelectInput.vue",
3332
+ "section": "forms",
3333
+ "slug": "select-input",
3334
+ "exportName": "DomSelectInput",
3335
+ "route": "/forms/select-input",
3336
+ "doc": {},
3337
+ "studio": {}
3338
+ },
3339
+ {
3340
+ "id": "forms/tag-combobox",
3341
+ "path": "../forms/tag-combobox/DomTagCombobox.vue",
3342
+ "section": "forms",
3343
+ "slug": "tag-combobox",
3344
+ "exportName": "DomTagCombobox",
3345
+ "route": "/forms/tag-combobox",
3346
+ "doc": {
3347
+ "name": "Tag combobox",
3348
+ "tag": "<DomTagCombobox>",
3349
+ "description": "A tokenizing multi-select combobox for class lists, recipients, labels, and other values that need autocomplete plus optional custom entries.",
3350
+ "icon": "M7 5h5l5 5-7 7-5-5 7-7Zm1.5 4.5h.01M15 15h4M17 13v4",
3351
+ "slots": [
3352
+ {
3353
+ "name": "item",
3354
+ "payload": "{ item, index, active, custom }",
3355
+ "description": "Replaces each suggestion row."
3356
+ },
3357
+ {
3358
+ "name": "tag",
3359
+ "payload": "{ item, value, label, remove }",
3360
+ "description": "Replaces each selected token."
3361
+ }
3362
+ ],
3363
+ "events": [
3364
+ {
3365
+ "name": "query",
3366
+ "payload": "string",
3367
+ "description": "Fired as the user types."
3368
+ },
3369
+ {
3370
+ "name": "add",
3371
+ "payload": "({ item, value, label, custom })",
3372
+ "description": "Fired when a tag is added."
3373
+ },
3374
+ {
3375
+ "name": "remove",
3376
+ "payload": "({ item, value, label })",
3377
+ "description": "Fired when a tag is removed."
3378
+ },
3379
+ {
3380
+ "name": "select",
3381
+ "payload": "({ item, value, label, custom })",
3382
+ "description": "Fired when a suggestion or custom value is committed."
3383
+ },
3384
+ {
3385
+ "name": "change",
3386
+ "payload": "Array",
3387
+ "description": "Fired after the selected values array changes."
3388
+ }
3389
+ ]
3390
+ },
3391
+ "studio": {}
3392
+ },
3393
+ {
3394
+ "id": "forms/text-input",
3395
+ "path": "../forms/text-input/DomTextInput.vue",
3396
+ "section": "forms",
3397
+ "slug": "text-input",
3398
+ "exportName": "DomTextInput",
3399
+ "route": "/forms/text-input",
3400
+ "doc": {
3401
+ "name": "Text input",
3402
+ "tag": "<DomTextInput>",
3403
+ "description": "A styled text field that uses the shared field contract for labels, validation state, and optional form-provider integration.",
3404
+ "events": [
3405
+ {
3406
+ "name": "update:modelValue",
3407
+ "payload": "string",
3408
+ "description": "Fired when the text changes."
3409
+ },
3410
+ {
3411
+ "name": "focus",
3412
+ "payload": "FocusEvent",
3413
+ "description": "Fired when the input receives focus."
3414
+ },
3415
+ {
3416
+ "name": "blur",
3417
+ "payload": "FocusEvent",
3418
+ "description": "Fired when the input loses focus."
3419
+ }
3420
+ ]
3421
+ },
3422
+ "studio": {}
3423
+ },
3424
+ {
3425
+ "id": "forms/textarea-composer",
3426
+ "path": "../forms/textarea-composer/DomTextareaComposer.vue",
3427
+ "section": "forms",
3428
+ "slug": "textarea-composer",
3429
+ "exportName": "DomTextareaComposer",
3430
+ "route": "/forms/textarea-composer",
3431
+ "doc": {
3432
+ "name": "Textarea composer",
3433
+ "tag": "<DomTextareaComposer>",
3434
+ "description": "An autosizing multiline field with attachment content, leading controls, trailing actions, and submit behavior inside one visual input.",
3435
+ "icon": "M5 6h14v10H9l-4 3V6Zm3 4h8M8 13h5",
3436
+ "events": [
3437
+ {
3438
+ "name": "update:modelValue",
3439
+ "payload": "string",
3440
+ "description": "Fired when the composer text changes."
3441
+ },
3442
+ {
3443
+ "name": "submit",
3444
+ "payload": "string",
3445
+ "description": "Fired with the current text when the built-in submit action is used."
3446
+ },
3447
+ {
3448
+ "name": "keydown",
3449
+ "payload": "KeyboardEvent",
3450
+ "description": "Fired before the built-in Enter key behavior runs."
3451
+ },
3452
+ {
3453
+ "name": "focus",
3454
+ "payload": "FocusEvent",
3455
+ "description": "Fired when the textarea receives focus."
3456
+ },
3457
+ {
3458
+ "name": "blur",
3459
+ "payload": "FocusEvent",
3460
+ "description": "Fired when the textarea loses focus."
3461
+ }
3462
+ ],
3463
+ "slots": [
3464
+ {
3465
+ "name": "attachments",
3466
+ "payload": "{ value, disabled, readOnly }",
3467
+ "description": "File, image, reference, or context previews shown above the text."
3468
+ },
3469
+ {
3470
+ "name": "leading",
3471
+ "payload": "{ value, submit, disabled }",
3472
+ "description": "Controls at the start of the bottom action row, such as add or tool buttons."
3473
+ },
3474
+ {
3475
+ "name": "actions",
3476
+ "payload": "{ value, submit, disabled }",
3477
+ "description": "Additional controls before the built-in submit action."
3478
+ },
3479
+ {
3480
+ "name": "submit",
3481
+ "payload": "{ submit, disabled, submitting, label }",
3482
+ "description": "Replace the built-in circular submit button."
3483
+ }
3484
+ ],
3485
+ "keyboard": [
3486
+ {
3487
+ "keys": "Enter",
3488
+ "action": "Submit when submitOnEnter is enabled."
3489
+ },
3490
+ {
3491
+ "keys": "Shift + Enter",
3492
+ "action": "Insert a new line."
3493
+ }
3494
+ ]
3495
+ },
3496
+ "studio": {}
3497
+ },
3498
+ {
3499
+ "id": "forms/textarea-input",
3500
+ "path": "../forms/textarea-input/DomTextareaInput.vue",
3501
+ "section": "forms",
3502
+ "slug": "textarea-input",
3503
+ "exportName": "DomTextareaInput",
3504
+ "route": "/forms/textarea-input",
3505
+ "doc": {
3506
+ "name": "Textarea input",
3507
+ "tag": "<DomTextareaInput>",
3508
+ "description": "A multi-line field with shared form state and optional content-driven growth, including an optional maximum row limit.",
3509
+ "events": [
3510
+ {
3511
+ "name": "update:modelValue",
3512
+ "payload": "string",
3513
+ "description": "Fired when the text changes."
3514
+ },
3515
+ {
3516
+ "name": "focus",
3517
+ "payload": "FocusEvent",
3518
+ "description": "Fired when the textarea receives focus."
3519
+ },
3520
+ {
3521
+ "name": "blur",
3522
+ "payload": "FocusEvent",
3523
+ "description": "Fired when the textarea loses focus."
3524
+ }
3525
+ ]
3526
+ },
3527
+ "studio": {}
3528
+ },
3529
+ {
3530
+ "id": "forms/time-selector",
3531
+ "path": "../forms/time-selector/DomTimeSelector.vue",
3532
+ "section": "forms",
3533
+ "slug": "time-selector",
3534
+ "exportName": "DomTimeSelector",
3535
+ "route": "/forms/time-selector",
3536
+ "doc": {
3537
+ "name": "Time selector",
3538
+ "tag": "<DomTimeSelector>",
3539
+ "description": "A typed time field with a popover list of selectable times. Stores HH:mm by default and can display 12-hour or 24-hour labels.",
3540
+ "icon": "M12 6v6l4 2M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18Z",
3541
+ "events": [
3542
+ {
3543
+ "name": "update:modelValue",
3544
+ "payload": "HH:mm",
3545
+ "description": "Fired when a valid time is committed or selected."
3546
+ },
3547
+ {
3548
+ "name": "change",
3549
+ "payload": "HH:mm",
3550
+ "description": "Fired when a valid time is committed."
3551
+ },
3552
+ {
3553
+ "name": "invalid-time",
3554
+ "payload": "string",
3555
+ "description": "Fired when typed text cannot be parsed or is outside the allowed range."
3556
+ },
3557
+ {
3558
+ "name": "focus",
3559
+ "payload": "FocusEvent",
3560
+ "description": "Fired when the text input receives focus."
3561
+ },
3562
+ {
3563
+ "name": "blur",
3564
+ "payload": "FocusEvent",
3565
+ "description": "Fired when the text input loses focus."
3566
+ }
3567
+ ],
3568
+ "keyboard": [
3569
+ {
3570
+ "keys": "Alt + ArrowDown",
3571
+ "action": "Open the time list."
3572
+ },
3573
+ {
3574
+ "keys": "Enter",
3575
+ "action": "Commit the typed time when it is valid."
3576
+ },
3577
+ {
3578
+ "keys": "Esc",
3579
+ "action": "Close the popover."
3580
+ },
3581
+ {
3582
+ "keys": "Tab",
3583
+ "action": "Move through generated time options when the list is open."
3584
+ }
3585
+ ]
3586
+ },
3587
+ "studio": {}
3588
+ },
3589
+ {
3590
+ "id": "forms/toggle",
3591
+ "path": "../forms/toggle/DomToggle.vue",
3592
+ "section": "forms",
3593
+ "slug": "toggle",
3594
+ "exportName": "DomToggle",
3595
+ "route": "/forms/toggle",
3596
+ "doc": {
3597
+ "name": "Toggle",
3598
+ "tag": "<DomToggle>",
3599
+ "description": "Accessible switch for boolean values. Works standalone with v-model or inside DomForm through useField.",
3600
+ "events": [
3601
+ {
3602
+ "name": "update:modelValue",
3603
+ "payload": "(checked: boolean)",
3604
+ "description": "Emitted when checked changes."
3605
+ },
3606
+ {
3607
+ "name": "focus",
3608
+ "payload": "FocusEvent",
3609
+ "description": "Fired when the switch receives focus."
3610
+ },
3611
+ {
3612
+ "name": "blur",
3613
+ "payload": "FocusEvent",
3614
+ "description": "Fired when the switch loses focus."
3615
+ }
3616
+ ]
3617
+ },
3618
+ "studio": {}
3619
+ },
3620
+ {
3621
+ "id": "forms/toggle-button",
3622
+ "path": "../forms/toggle-button/DomToggleButton.vue",
3623
+ "section": "forms",
3624
+ "slug": "toggle-button",
3625
+ "exportName": "DomToggleButton",
3626
+ "route": "/forms/toggle-button",
3627
+ "doc": {
3628
+ "name": "Toggle button",
3629
+ "tag": "<DomToggleButton>",
3630
+ "description": "A pressable form button for boolean choices, using aria-pressed and v-model.",
3631
+ "slots": [
3632
+ {
3633
+ "name": "(default)",
3634
+ "description": "Button label or custom inline content."
3635
+ }
3636
+ ],
3637
+ "events": [
3638
+ {
3639
+ "name": "update:modelValue",
3640
+ "payload": "(pressed: boolean)",
3641
+ "description": "Emitted when pressed changes."
3642
+ }
3643
+ ]
3644
+ },
3645
+ "studio": {}
3646
+ },
3647
+ {
3648
+ "id": "forms/toggle-button-group",
3649
+ "path": "../forms/toggle-button-group/DomToggleButtonGroup.vue",
3650
+ "section": "forms",
3651
+ "slug": "toggle-button-group",
3652
+ "exportName": "DomToggleButtonGroup",
3653
+ "route": "/forms/toggle-button-group",
3654
+ "doc": {
3655
+ "name": "Toggle button group",
3656
+ "tag": "<DomToggleButtonGroup>",
3657
+ "description": "A single or multiple selection button group for compact form choices.",
3658
+ "slots": [
3659
+ {
3660
+ "name": "option",
3661
+ "payload": "{ option, index, selected }",
3662
+ "description": "Custom option markup."
3663
+ }
3664
+ ],
3665
+ "events": [
3666
+ {
3667
+ "name": "update:modelValue",
3668
+ "payload": "(value: string | string[])",
3669
+ "description": "Emitted when selection changes."
3670
+ }
3671
+ ]
3672
+ },
3673
+ "studio": {}
3674
+ },
3675
+ {
3676
+ "id": "forms/url-input",
3677
+ "path": "../forms/url-input/DomUrlInput.vue",
3678
+ "section": "forms",
3679
+ "slug": "url-input",
3680
+ "exportName": "DomUrlInput",
3681
+ "route": "/forms/url-input",
3682
+ "doc": {
3683
+ "name": "URL input",
3684
+ "tag": "<DomUrlInput>",
3685
+ "description": "A convention text field for web addresses with URL type, autocomplete, and a URL validator.",
3686
+ "icon": "M10.25 13.75 13.75 10.25M8.9 10.9 7.8 12a3 3 0 0 0 4.2 4.2l1.1-1.1M15.1 13.1l1.1-1.1A3 3 0 0 0 12 7.8l-1.1 1.1",
3687
+ "events": [
3688
+ {
3689
+ "name": "update:modelValue",
3690
+ "payload": "string",
3691
+ "description": "Fired when the URL changes."
3692
+ },
3693
+ {
3694
+ "name": "focus",
3695
+ "payload": "FocusEvent",
3696
+ "description": "Fired when the input receives focus."
3697
+ },
3698
+ {
3699
+ "name": "blur",
3700
+ "payload": "FocusEvent",
3701
+ "description": "Fired when the input loses focus."
3702
+ }
3703
+ ]
3704
+ },
3705
+ "studio": {}
3706
+ },
3707
+ {
3708
+ "id": "forms/wysiwyg",
3709
+ "path": "../forms/wysiwyg/DomWysiwyg.vue",
3710
+ "section": "forms",
3711
+ "slug": "wysiwyg",
3712
+ "exportName": "DomWysiwyg",
3713
+ "route": "/forms/wysiwyg",
3714
+ "doc": {
3715
+ "name": "WYSIWYG field",
3716
+ "tag": "<DomWysiwyg>",
3717
+ "description": "A textarea-shaped rich text field powered by DomDocumentEditor, with headings, language-aware highlighted code blocks, tables, simple v-model wiring, and no collaboration or AI review rail by default.",
3718
+ "events": [
3719
+ {
3720
+ "name": "update:modelValue",
3721
+ "payload": "Record<string, unknown> | string",
3722
+ "description": "Fired with JSON or HTML content depending on the output prop."
3723
+ },
3724
+ {
3725
+ "name": "change",
3726
+ "payload": "DocumentEditorChangePayload",
3727
+ "description": "Fired with JSON, HTML, and plain text whenever the editor changes."
3728
+ },
3729
+ {
3730
+ "name": "selection-change",
3731
+ "payload": "DocumentEditorSelectionPayload",
3732
+ "description": "Fired when the editor selection changes."
3733
+ },
3734
+ {
3735
+ "name": "tool-action",
3736
+ "payload": "({ tool, editor })",
3737
+ "description": "Fired when a custom toolbar tool is activated."
3738
+ },
3739
+ {
3740
+ "name": "ready",
3741
+ "payload": "({ editor })",
3742
+ "description": "Fired after the browser-only editor runtime mounts."
3743
+ },
3744
+ {
3745
+ "name": "runtime-error",
3746
+ "payload": "Error",
3747
+ "description": "Fired when the editor runtime cannot mount."
3748
+ },
3749
+ {
3750
+ "name": "focus",
3751
+ "payload": "FocusEvent",
3752
+ "description": "Fired when the editable document receives focus."
3753
+ },
3754
+ {
3755
+ "name": "blur",
3756
+ "payload": "FocusEvent",
3757
+ "description": "Fired when the editable document loses focus."
3758
+ }
3759
+ ]
3760
+ },
3761
+ "studio": {}
3762
+ },
3763
+ {
3764
+ "id": "mobile/action-sheet",
3765
+ "path": "../mobile/action-sheet/DomActionSheet.vue",
3766
+ "section": "mobile",
3767
+ "slug": "action-sheet",
3768
+ "exportName": "DomActionSheet",
3769
+ "route": "/mobile/action-sheet",
3770
+ "doc": {
3771
+ "name": "Action sheet",
3772
+ "tag": "<DomActionSheet>",
3773
+ "description": "A bottom action sheet for app choices, destructive actions, and quick commands.",
3774
+ "events": [
3775
+ {
3776
+ "name": "update:modelValue",
3777
+ "payload": "boolean",
3778
+ "description": "Fired when the sheet opens or closes."
3779
+ },
3780
+ {
3781
+ "name": "select",
3782
+ "payload": "object",
3783
+ "description": "Fired with the selected action."
3784
+ }
3785
+ ],
3786
+ "playground": {
3787
+ "mobileSlot": "overlay",
3788
+ "initial": {
3789
+ "modelValue": true,
3790
+ "title": "Project actions",
3791
+ "description": "Use for app commands that should stay near the thumb.",
3792
+ "actions": [
3793
+ {
3794
+ "label": "Share project",
3795
+ "description": "Open the native share sheet",
3796
+ "value": "share"
3797
+ },
3798
+ {
3799
+ "label": "Duplicate screen",
3800
+ "value": "duplicate"
3801
+ },
3802
+ {
3803
+ "label": "Delete draft",
3804
+ "value": "delete",
3805
+ "variant": "danger"
3806
+ }
3807
+ ]
3808
+ }
3809
+ }
3810
+ },
3811
+ "studio": {}
3812
+ },
3813
+ {
3814
+ "id": "mobile/bottom-nav",
3815
+ "path": "../mobile/bottom-nav/DomAppBottomNav.vue",
3816
+ "section": "mobile",
3817
+ "slug": "bottom-nav",
3818
+ "exportName": "DomAppBottomNav",
3819
+ "route": "/mobile/bottom-nav",
3820
+ "doc": {
3821
+ "name": "App bottom nav",
3822
+ "tag": "<DomAppBottomNav>",
3823
+ "description": "A thumb-friendly bottom navigation bar for primary app destinations.",
3824
+ "events": [
3825
+ {
3826
+ "name": "update:modelValue",
3827
+ "payload": "string",
3828
+ "description": "Fired when a tab is selected."
3829
+ },
3830
+ {
3831
+ "name": "change",
3832
+ "payload": "object",
3833
+ "description": "Fired with the selected tab item."
3834
+ }
3835
+ ],
3836
+ "playground": {
3837
+ "mobileSlot": "bottom",
3838
+ "initial": {
3839
+ "modelValue": "home",
3840
+ "items": [
3841
+ {
3842
+ "value": "home",
3843
+ "label": "Home"
3844
+ },
3845
+ {
3846
+ "value": "inbox",
3847
+ "label": "Inbox",
3848
+ "badge": "3"
3849
+ },
3850
+ {
3851
+ "value": "settings",
3852
+ "label": "Settings"
3853
+ }
3854
+ ]
3855
+ }
3856
+ }
3857
+ },
3858
+ "studio": {}
3859
+ },
3860
+ {
3861
+ "id": "mobile/list-item",
3862
+ "path": "../mobile/list-item/DomAppListItem.vue",
3863
+ "section": "mobile",
3864
+ "slug": "list-item",
3865
+ "exportName": "DomAppListItem",
3866
+ "route": "/mobile/list-item",
3867
+ "doc": {
3868
+ "name": "App list item",
3869
+ "tag": "<DomAppListItem>",
3870
+ "description": "A touch-sized app row for settings, inboxes, menus, and navigation.",
3871
+ "slots": [
3872
+ {
3873
+ "name": "icon",
3874
+ "description": "Leading icon or avatar."
3875
+ },
3876
+ {
3877
+ "name": "trailing",
3878
+ "description": "Trailing value, switch, badge, or custom action."
3879
+ }
3880
+ ],
3881
+ "playground": {
3882
+ "mobileSlot": "content",
3883
+ "initial": {
3884
+ "label": "Sync Capacitor status bar",
3885
+ "description": "Match native chrome to the DOM Studio theme.",
3886
+ "meta": "Now",
3887
+ "chevron": true
3888
+ }
3889
+ }
3890
+ },
3891
+ "studio": {}
3892
+ },
3893
+ {
3894
+ "id": "mobile/safe-area",
3895
+ "path": "../mobile/safe-area/DomSafeArea.vue",
3896
+ "section": "mobile",
3897
+ "slug": "safe-area",
3898
+ "exportName": "DomSafeArea",
3899
+ "route": "/mobile/safe-area",
3900
+ "doc": {
3901
+ "name": "Safe area",
3902
+ "tag": "<DomSafeArea>",
3903
+ "description": "Applies safe-area inset padding around app chrome for devices with cutouts, home indicators, or inset system UI.",
3904
+ "slots": [
3905
+ {
3906
+ "name": "(default)",
3907
+ "description": "Content that should avoid device cutouts and home indicators."
3908
+ }
3909
+ ],
3910
+ "playground": {
3911
+ "mobileSlot": "content"
3912
+ }
3913
+ },
3914
+ "studio": {}
3915
+ },
3916
+ {
3917
+ "id": "mobile/shell",
3918
+ "path": "../mobile/shell/DomAppShell.vue",
3919
+ "section": "mobile",
3920
+ "slug": "shell",
3921
+ "exportName": "DomAppShell",
3922
+ "route": "/mobile/shell",
3923
+ "doc": {
3924
+ "name": "App shell",
3925
+ "tag": "<DomAppShell>",
3926
+ "description": "A web app surface with safe-area padding, scrollable content, and fixed app chrome slots for mobile or desktop app layouts.",
3927
+ "slots": [
3928
+ {
3929
+ "name": "top",
3930
+ "description": "Top navigation, status, or toolbar content."
3931
+ },
3932
+ {
3933
+ "name": "(default)",
3934
+ "description": "Scrollable app content."
3935
+ },
3936
+ {
3937
+ "name": "bottom",
3938
+ "description": "Bottom navigation, tab bar, or persistent controls."
3939
+ },
3940
+ {
3941
+ "name": "overlay",
3942
+ "description": "Absolute overlay layer for drawers, action sheets, and app-level panels."
3943
+ }
3944
+ ],
3945
+ "playground": {
3946
+ "mobileSlot": "shell"
3947
+ }
3948
+ },
3949
+ "studio": {}
3950
+ },
3951
+ {
3952
+ "id": "mobile/stack",
3953
+ "path": "../mobile/stack/DomAppStack.vue",
3954
+ "section": "mobile",
3955
+ "slug": "stack",
3956
+ "exportName": "DomAppStack",
3957
+ "route": "/mobile/stack",
3958
+ "doc": {
3959
+ "name": "App stack",
3960
+ "tag": "<DomAppStack>",
3961
+ "description": "A settings-style screen stack that handles slide navigation, breadcrumbs, lazy screens, and responsive panel styling.",
3962
+ "slots": [
3963
+ {
3964
+ "name": "(default)",
3965
+ "description": "Optional DomAppStackScreen children used to register slot-driven screens."
3966
+ },
3967
+ {
3968
+ "name": "breadcrumb",
3969
+ "payload": "{ crumbs, canGoBack, back, goTo, push, path }",
3970
+ "description": "Replace the breadcrumb and back control while keeping the stack state."
3971
+ }
3972
+ ],
3973
+ "events": [
3974
+ {
3975
+ "name": "update:path",
3976
+ "payload": "(path: Array<string>)",
3977
+ "description": "Fired when the active stack path changes."
3978
+ },
3979
+ {
3980
+ "name": "navigate",
3981
+ "payload": "(payload: { path, previousPath, direction, screen, reason })",
3982
+ "description": "Fired after push, back, replace, reset, or breadcrumb navigation."
3983
+ },
3984
+ {
3985
+ "name": "load",
3986
+ "payload": "(payload: { screen, component })",
3987
+ "description": "Fired when a lazy screen component resolves."
3988
+ },
3989
+ {
3990
+ "name": "error",
3991
+ "payload": "(payload: { screen, error })",
3992
+ "description": "Fired when a lazy screen component rejects."
3993
+ }
3994
+ ],
3995
+ "playground": {
3996
+ "mobileSlot": "content",
3997
+ "initial": {
3998
+ "root": "settings",
3999
+ "screens": [
4000
+ {
4001
+ "id": "settings",
4002
+ "title": "Settings",
4003
+ "children": [
4004
+ "account",
4005
+ "notifications"
4006
+ ]
4007
+ },
4008
+ {
4009
+ "id": "account",
4010
+ "title": "Account",
4011
+ "description": "Profile, password, and sign-in settings."
4012
+ },
4013
+ {
4014
+ "id": "notifications",
4015
+ "title": "Notifications",
4016
+ "description": "Push, email, and quiet hours."
4017
+ }
4018
+ ]
4019
+ }
4020
+ }
4021
+ },
4022
+ "studio": {}
4023
+ },
4024
+ {
4025
+ "id": "mobile/top-bar",
4026
+ "path": "../mobile/top-bar/DomAppTopBar.vue",
4027
+ "section": "mobile",
4028
+ "slug": "top-bar",
4029
+ "exportName": "DomAppTopBar",
4030
+ "route": "/mobile/top-bar",
4031
+ "doc": {
4032
+ "name": "App top bar",
4033
+ "tag": "<DomAppTopBar>",
4034
+ "description": "A compact app navigation bar with optional leading and trailing actions.",
4035
+ "slots": [
4036
+ {
4037
+ "name": "leading",
4038
+ "description": "Leading icon button or back control."
4039
+ },
4040
+ {
4041
+ "name": "trailing",
4042
+ "description": "Trailing actions."
4043
+ }
4044
+ ],
4045
+ "playground": {
4046
+ "mobileSlot": "top",
4047
+ "initial": {
4048
+ "title": "Workspace",
4049
+ "subtitle": "Capacitor app"
4050
+ }
4051
+ }
4052
+ },
4053
+ "studio": {}
4054
+ },
4055
+ {
4056
+ "id": "visual/alert",
4057
+ "path": "../visual/alert/DomAlert.vue",
4058
+ "section": "visual",
4059
+ "slug": "alert",
4060
+ "exportName": "DomAlert",
4061
+ "route": "/visual/alert",
4062
+ "doc": {
4063
+ "name": "Alert",
4064
+ "tag": "<DomAlert>",
4065
+ "description": "A persistent inline notice for status messages, policy warnings, empty-flow guidance, and recoverable errors.",
4066
+ "icon": "M12 17v-5M12 8h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z",
4067
+ "playground": {
4068
+ "initial": {
4069
+ "tone": "info",
4070
+ "variant": "soft",
4071
+ "title": "Information available",
4072
+ "description": "Review the latest status details before continuing."
4073
+ }
4074
+ },
4075
+ "slots": [
4076
+ {
4077
+ "name": "icon",
4078
+ "description": "Replace the leading status icon. Prefer the icon prop for SVG path data or imported Vue icon components."
4079
+ },
4080
+ {
4081
+ "name": "title",
4082
+ "description": "Replace the title content."
4083
+ },
4084
+ {
4085
+ "name": "(default)",
4086
+ "description": "Alert body. Falls back to the description prop."
4087
+ },
4088
+ {
4089
+ "name": "actions",
4090
+ "description": "Action buttons or links aligned below the message."
4091
+ }
4092
+ ],
4093
+ "events": [
4094
+ {
4095
+ "name": "dismiss",
4096
+ "payload": "MouseEvent",
4097
+ "description": "Emitted after a dismissible alert has finished fading away."
4098
+ }
4099
+ ]
4100
+ },
4101
+ "studio": {}
4102
+ },
4103
+ {
4104
+ "id": "visual/avatar",
4105
+ "path": "../visual/avatar/DomAvatar.vue",
4106
+ "section": "visual",
4107
+ "slug": "avatar",
4108
+ "exportName": "DomAvatar",
4109
+ "route": "/visual/avatar",
4110
+ "doc": {
4111
+ "name": "Avatar",
4112
+ "tag": "<DomAvatar>",
4113
+ "description": "A compact identity primitive for people, teams, workspaces, and accounts.",
4114
+ "playground": {
4115
+ "initial": {
4116
+ "name": "Mina Patel",
4117
+ "initials": "MP",
4118
+ "src": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?auto=format&fit=crop&crop=faces&w=96&h=96&q=80",
4119
+ "size": "md"
4120
+ }
4121
+ },
4122
+ "slots": [
4123
+ {
4124
+ "name": "fallback",
4125
+ "description": "Custom fallback content when no image is available."
4126
+ }
4127
+ ]
4128
+ },
4129
+ "studio": {}
4130
+ },
4131
+ {
4132
+ "id": "visual/avatar-stack",
4133
+ "path": "../visual/avatar-stack/DomAvatarStack.vue",
4134
+ "section": "visual",
4135
+ "slug": "avatar-stack",
4136
+ "exportName": "DomAvatarStack",
4137
+ "route": "/visual/avatar-stack",
4138
+ "doc": {
4139
+ "name": "Avatar stack",
4140
+ "tag": "<DomAvatarStack>",
4141
+ "description": "A grouped identity primitive for collaborators, assignees, reviewers, and participants.",
4142
+ "playground": {
4143
+ "initial": {
4144
+ "items": [
4145
+ {
4146
+ "name": "Mina Patel",
4147
+ "initials": "MP",
4148
+ "src": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?auto=format&fit=crop&crop=faces&w=96&h=96&q=80"
4149
+ },
4150
+ {
4151
+ "name": "Ari Chen",
4152
+ "initials": "AC",
4153
+ "src": "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?auto=format&fit=crop&crop=faces&w=96&h=96&q=80"
4154
+ },
4155
+ {
4156
+ "name": "Noah Kim",
4157
+ "initials": "NK",
4158
+ "src": "https://images.unsplash.com/photo-1519345182560-3f2917c472ef?auto=format&fit=crop&crop=faces&w=96&h=96&q=80"
4159
+ },
4160
+ {
4161
+ "name": "Leah Stone",
4162
+ "initials": "LS",
4163
+ "src": "https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&crop=faces&w=96&h=96&q=80"
4164
+ },
4165
+ {
4166
+ "name": "Theo Grant",
4167
+ "initials": "TG",
4168
+ "src": "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=crop&crop=faces&w=96&h=96&q=80"
4169
+ }
4170
+ ],
4171
+ "max": 4
4172
+ }
4173
+ },
4174
+ "slots": [
4175
+ {
4176
+ "name": "avatar",
4177
+ "payload": "{ item, index }",
4178
+ "description": "Custom avatar rendering for each visible item."
4179
+ }
4180
+ ]
4181
+ },
4182
+ "studio": {}
4183
+ },
4184
+ {
4185
+ "id": "visual/badge",
4186
+ "path": "../visual/badge/DomBadge.vue",
4187
+ "section": "visual",
4188
+ "slug": "badge",
4189
+ "exportName": "DomBadge",
4190
+ "route": "/visual/badge",
4191
+ "doc": {
4192
+ "name": "Badge",
4193
+ "tag": "<DomBadge>",
4194
+ "description": "A compact visual label for counts, roles, plans, tags, and metadata.",
4195
+ "playground": {
4196
+ "initial": {
4197
+ "label": "Scale",
4198
+ "tone": "success",
4199
+ "variant": "soft",
4200
+ "size": "md"
4201
+ }
4202
+ },
4203
+ "slots": [
4204
+ {
4205
+ "name": "(default)",
4206
+ "description": "Badge text or compact inline content."
4207
+ }
4208
+ ]
4209
+ },
4210
+ "studio": {}
4211
+ },
4212
+ {
4213
+ "id": "visual/card",
4214
+ "path": "../visual/card/DomCard.vue",
4215
+ "section": "visual",
4216
+ "slug": "card",
4217
+ "exportName": "DomCard",
4218
+ "route": "/visual/card",
4219
+ "doc": {
4220
+ "name": "Card",
4221
+ "tag": "<DomCard>",
4222
+ "description": "A visual-only frame for grouped content, styled by the skin-card theme recipe.",
4223
+ "slots": [
4224
+ {
4225
+ "name": "(default)",
4226
+ "description": "Card content."
4227
+ }
4228
+ ]
4229
+ },
4230
+ "studio": {}
4231
+ },
4232
+ {
4233
+ "id": "visual/card-rail",
4234
+ "path": "../visual/card-rail/DomCardRail.vue",
4235
+ "section": "visual",
4236
+ "slug": "card-rail",
4237
+ "exportName": "DomCardRail",
4238
+ "route": "/visual/card-rail",
4239
+ "doc": {
4240
+ "name": "Card rail",
4241
+ "tag": "<DomCardRail>",
4242
+ "description": "A horizontal rail for composed card groups with native overflow, snap points, and flexible item widths.",
4243
+ "icon": "M4 8h5v8H4V8Zm7 0h5v8h-5V8Zm7 0h2v8h-2V8Z",
4244
+ "slots": [
4245
+ {
4246
+ "name": "header",
4247
+ "description": "Section heading, copy, filters, or controls above the rail."
4248
+ },
4249
+ {
4250
+ "name": "actions",
4251
+ "description": "Optional controls aligned with the header."
4252
+ },
4253
+ {
4254
+ "name": "(default)",
4255
+ "description": "Rail items. Each direct child becomes fixed-width, snap-aligned content."
4256
+ }
4257
+ ]
4258
+ },
4259
+ "studio": {}
4260
+ },
4261
+ {
4262
+ "id": "visual/empty-state",
4263
+ "path": "../visual/empty-state/DomEmptyState.vue",
4264
+ "section": "visual",
4265
+ "slug": "empty-state",
4266
+ "exportName": "DomEmptyState",
4267
+ "route": "/visual/empty-state",
4268
+ "doc": {
4269
+ "name": "Empty state",
4270
+ "tag": "<DomEmptyState>",
4271
+ "description": "A reusable empty, zero-data, or setup state with icon, copy, and actions.",
4272
+ "slots": [
4273
+ {
4274
+ "name": "icon",
4275
+ "description": "Custom icon or illustration."
4276
+ },
4277
+ {
4278
+ "name": "title",
4279
+ "description": "Custom title markup."
4280
+ },
4281
+ {
4282
+ "name": "description",
4283
+ "description": "Custom helper text."
4284
+ },
4285
+ {
4286
+ "name": "actions",
4287
+ "description": "Primary and secondary actions."
4288
+ }
4289
+ ]
4290
+ },
4291
+ "studio": {}
4292
+ },
4293
+ {
4294
+ "id": "visual/progress",
4295
+ "path": "../visual/progress/DomProgress.vue",
4296
+ "section": "visual",
4297
+ "slug": "progress",
4298
+ "exportName": "DomProgress",
4299
+ "route": "/visual/progress",
4300
+ "doc": {
4301
+ "name": "Progress",
4302
+ "tag": "<DomProgress>",
4303
+ "description": "An accessible progress bar for uploads, imports, background jobs, and completion meters.",
4304
+ "icon": "M5 12h14M5 12a3 3 0 0 1 3-3h8a3 3 0 0 1 0 6H8a3 3 0 0 1-3-3Z",
4305
+ "playground": {
4306
+ "initial": {
4307
+ "value": 68,
4308
+ "showValue": true
4309
+ }
4310
+ }
4311
+ },
4312
+ "studio": {}
4313
+ },
4314
+ {
4315
+ "id": "visual/progress",
4316
+ "path": "../visual/progress/DomRadialProgress.vue",
4317
+ "section": "visual",
4318
+ "slug": "progress",
4319
+ "exportName": "DomRadialProgress",
4320
+ "route": "/visual/progress",
4321
+ "doc": {
4322
+ "name": "Radial progress",
4323
+ "tag": "<DomRadialProgress>",
4324
+ "description": "A compact circular progress meter for uploads, media processing, sync status, and inline background jobs.",
4325
+ "icon": "M12 3a9 9 0 1 1-6.36 2.64M12 3v5m0-5a9 9 0 0 1 9 9",
4326
+ "playground": {
4327
+ "initial": {
4328
+ "value": 64,
4329
+ "showValue": true,
4330
+ "tone": "success"
4331
+ }
4332
+ }
4333
+ },
4334
+ "studio": {}
4335
+ },
4336
+ {
4337
+ "id": "visual/progress",
4338
+ "path": "../visual/progress/DomSegmentedProgress.vue",
4339
+ "section": "visual",
4340
+ "slug": "progress",
4341
+ "exportName": "DomSegmentedProgress",
4342
+ "route": "/visual/progress",
4343
+ "doc": {
4344
+ "name": "Segmented progress",
4345
+ "tag": "<DomSegmentedProgress>",
4346
+ "description": "An accessible stacked progress bar for workflows that divide a changing total across multiple states.",
4347
+ "icon": "M4 7h16M4 12h16M4 17h16",
4348
+ "playground": {
4349
+ "initial": {
4350
+ "value": 2,
4351
+ "label": "pages processed",
4352
+ "tone": "warning",
4353
+ "size": "lg",
4354
+ "segments": [
4355
+ {
4356
+ "key": "complete",
4357
+ "label": "completed",
4358
+ "value": 2,
4359
+ "tone": "success",
4360
+ "color": ""
4361
+ },
4362
+ {
4363
+ "key": "processing",
4364
+ "label": "processing",
4365
+ "value": 1,
4366
+ "tone": "warning",
4367
+ "color": "var(--warning)"
4368
+ },
4369
+ {
4370
+ "key": "queued",
4371
+ "label": "queued",
4372
+ "value": 1,
4373
+ "tone": "neutral",
4374
+ "color": ""
4375
+ }
4376
+ ]
4377
+ }
4378
+ },
4379
+ "slots": [
4380
+ {
4381
+ "name": "summary",
4382
+ "payload": "{ value, max, percent, label }",
4383
+ "description": "Custom summary content shown above the track."
4384
+ },
4385
+ {
4386
+ "name": "legend-label",
4387
+ "payload": "{ segment }",
4388
+ "description": "Custom label content for each legend entry."
4389
+ }
4390
+ ]
4391
+ },
4392
+ "studio": {}
4393
+ },
4394
+ {
4395
+ "id": "visual/skeleton",
4396
+ "path": "../visual/skeleton/DomSkeleton.vue",
4397
+ "section": "visual",
4398
+ "slug": "skeleton",
4399
+ "exportName": "DomSkeleton",
4400
+ "route": "/visual/skeleton",
4401
+ "doc": {
4402
+ "name": "Skeleton",
4403
+ "tag": "<DomSkeleton>",
4404
+ "description": "A token-driven loading placeholder for cards, rows, text blocks, and avatars.",
4405
+ "icon": "M5 7h14M5 12h10M5 17h7",
4406
+ "playground": {
4407
+ "initial": {
4408
+ "variant": "text",
4409
+ "lines": 3,
4410
+ "width": "100%"
4411
+ }
4412
+ }
4413
+ },
4414
+ "studio": {}
4415
+ },
4416
+ {
4417
+ "id": "visual/spinner",
4418
+ "path": "../visual/spinner/DomSpinner.vue",
4419
+ "section": "visual",
4420
+ "slug": "spinner",
4421
+ "exportName": "DomSpinner",
4422
+ "route": "/visual/spinner",
4423
+ "doc": {
4424
+ "name": "Spinner",
4425
+ "tag": "<DomSpinner>",
4426
+ "description": "A compact loading indicator for buttons, toolbars, inline rows, and pending states.",
4427
+ "icon": "M12 4a8 8 0 1 1-8 8",
4428
+ "playground": {
4429
+ "initial": {
4430
+ "label": "Saving",
4431
+ "size": "md",
4432
+ "background": "color-mix(in oklab, var(--warning) 20%, transparent)",
4433
+ "foreground": "var(--warning)"
4434
+ }
4435
+ }
4436
+ },
4437
+ "studio": {}
4438
+ },
4439
+ {
4440
+ "id": "visual/status-pill",
4441
+ "path": "../visual/status-pill/DomStatusPill.vue",
4442
+ "section": "visual",
4443
+ "slug": "status-pill",
4444
+ "exportName": "DomStatusPill",
4445
+ "route": "/visual/status-pill",
4446
+ "doc": {
4447
+ "name": "Status pill",
4448
+ "tag": "<DomStatusPill>",
4449
+ "description": "A badge with an optional status dot for live state, severity, and workflow labels.",
4450
+ "playground": {
4451
+ "initial": {
4452
+ "label": "Live",
4453
+ "tone": "success",
4454
+ "dot": true
4455
+ }
4456
+ },
4457
+ "slots": [
4458
+ {
4459
+ "name": "(default)",
4460
+ "description": "Status label."
4461
+ }
4462
+ ]
4463
+ },
4464
+ "studio": {}
4465
+ },
4466
+ {
4467
+ "id": "visual/text-diff",
4468
+ "path": "../visual/text-diff/DomTextDiff.vue",
4469
+ "section": "visual",
4470
+ "slug": "text-diff",
4471
+ "exportName": "DomTextDiff",
4472
+ "route": "/visual/text-diff",
4473
+ "doc": {
4474
+ "name": "Text diff",
4475
+ "tag": "<DomTextDiff>",
4476
+ "description": "A standalone text comparison for AI rewrites, code patches, editorial review, and before-and-after copy changes.",
4477
+ "icon": "M8 7H4m4 0L6 5m2 2L6 9m10 8h4m-2-2v4M11 5h3a3 3 0 0 1 3 3v1m-6 10H8a3 3 0 0 1-3-3v-1",
4478
+ "playground": {
4479
+ "initial": {
4480
+ "original": "Write better pages with a flexible visual editor.",
4481
+ "proposed": "Create clearer pages with an editor built for focused teams.",
4482
+ "mode": "diff",
4483
+ "view": "inline",
4484
+ "format": "text",
4485
+ "originalLabel": "Current",
4486
+ "proposedLabel": "Suggested",
4487
+ "showHeader": true,
4488
+ "showModeSwitcher": true,
4489
+ "framed": true
4490
+ }
4491
+ },
4492
+ "slots": [
4493
+ {
4494
+ "name": "header",
4495
+ "payload": "{ additions, removals, mode, setMode, originalLabel, proposedLabel }",
4496
+ "description": "Replace the comparison header and optionally control the active content mode."
4497
+ }
4498
+ ],
4499
+ "events": [
4500
+ {
4501
+ "name": "update:mode",
4502
+ "payload": "'diff' | 'original' | 'replacement'",
4503
+ "description": "Fired when the active content mode changes."
4504
+ },
4505
+ {
4506
+ "name": "mode-change",
4507
+ "payload": "'diff' | 'original' | 'replacement'",
4508
+ "description": "Fired after the viewer switches between the diff, current text, and replacement text."
4509
+ }
4510
+ ]
4511
+ },
4512
+ "studio": {}
4513
+ }
4514
+ ];