@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,90 @@
1
+ <script setup>
2
+ import { computed } from 'vue';
3
+
4
+ defineOptions({
5
+ __doc: {
6
+ name: 'App list item',
7
+ tag: '<DomAppListItem>',
8
+ description: 'A touch-sized app row for settings, inboxes, menus, and navigation.',
9
+ slots: [
10
+ { name: 'icon', description: 'Leading icon or avatar.' },
11
+ { name: 'trailing', description: 'Trailing value, switch, badge, or custom action.' },
12
+ ],
13
+ playground: {
14
+ mobileSlot: 'content',
15
+ initial: {
16
+ label: 'Sync Capacitor status bar',
17
+ description: 'Match native chrome to the DOM Studio theme.',
18
+ meta: 'Now',
19
+ chevron: true,
20
+ },
21
+ },
22
+ },
23
+ });
24
+
25
+ const props = defineProps({
26
+ as: {
27
+ type: String,
28
+ default: 'button',
29
+ _edit: { description: 'Element or component used for the row.' },
30
+ },
31
+ label: {
32
+ type: String,
33
+ required: true,
34
+ _edit: { description: 'Primary row label.' },
35
+ },
36
+ description: {
37
+ type: String,
38
+ default: '',
39
+ _edit: { description: 'Optional secondary copy.' },
40
+ },
41
+ meta: {
42
+ type: String,
43
+ default: '',
44
+ _edit: { description: 'Small trailing metadata shown beside the label.' },
45
+ },
46
+ chevron: {
47
+ type: Boolean,
48
+ default: false,
49
+ _edit: { description: 'Show a trailing chevron when no trailing slot is provided.' },
50
+ },
51
+ selected: {
52
+ type: Boolean,
53
+ default: false,
54
+ _edit: { description: 'Show the row as selected.' },
55
+ },
56
+ danger: {
57
+ type: Boolean,
58
+ default: false,
59
+ _edit: { description: 'Style the row as a destructive action.' },
60
+ },
61
+ });
62
+
63
+ const isButton = computed(() => props.as === 'button');
64
+ </script>
65
+
66
+ <template>
67
+ <component
68
+ :is="as"
69
+ class="flex min-h-16 w-full items-center gap-3 border-b border-border bg-canvas px-4 py-3 text-left transition last:border-b-0 hover:bg-secondary/60 active:bg-secondary"
70
+ :class="[selected && 'bg-secondary', danger && 'text-destructive']"
71
+ :type="isButton ? 'button' : undefined"
72
+ >
73
+ <div v-if="$slots.icon" class="grid size-10 shrink-0 place-items-center rounded-2xl bg-secondary text-muted-fg">
74
+ <slot name="icon" />
75
+ </div>
76
+ <div class="min-w-0 flex-1">
77
+ <div class="flex min-w-0 items-baseline gap-2">
78
+ <p class="truncate text-sm font-medium" :class="danger ? 'text-destructive' : 'text-canvas-fg'">{{ label }}</p>
79
+ <p v-if="meta" class="shrink-0 text-xs text-muted-fg">{{ meta }}</p>
80
+ </div>
81
+ <p v-if="description" class="mt-0.5 line-clamp-2 text-xs leading-5 text-muted-fg">{{ description }}</p>
82
+ </div>
83
+ <div v-if="$slots.trailing" class="flex shrink-0 items-center text-muted-fg">
84
+ <slot name="trailing" />
85
+ </div>
86
+ <svg v-else-if="chevron" class="size-4 shrink-0 text-muted-fg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
87
+ <path d="M7.3 4.3a1 1 0 0 1 1.4 0l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 1 1-1.4-1.4L11.58 10 7.3 5.7a1 1 0 0 1 0-1.4Z" />
88
+ </svg>
89
+ </component>
90
+ </template>
@@ -0,0 +1,39 @@
1
+ <script setup>
2
+ const edgeClasses = {
3
+ top: 'pt-[env(safe-area-inset-top,0px)]',
4
+ bottom: 'pb-[env(safe-area-inset-bottom,0px)]',
5
+ left: 'pl-[env(safe-area-inset-left,0px)]',
6
+ right: 'pr-[env(safe-area-inset-right,0px)]',
7
+ };
8
+
9
+ defineOptions({
10
+ __doc: {
11
+ name: 'Safe area',
12
+ tag: '<DomSafeArea>',
13
+ description: 'Applies safe-area inset padding around app chrome for devices with cutouts, home indicators, or inset system UI.',
14
+ slots: [
15
+ { name: '(default)', description: 'Content that should avoid device cutouts and home indicators.' },
16
+ ],
17
+ playground: {
18
+ mobileSlot: 'content',
19
+ },
20
+ },
21
+ });
22
+
23
+ defineProps({
24
+ edges: {
25
+ type: Array,
26
+ default: () => ['top', 'bottom'],
27
+ _edit: {
28
+ component: 'DomJsonListInput',
29
+ description: 'Safe-area edges to apply: top, bottom, left, right.',
30
+ },
31
+ },
32
+ });
33
+ </script>
34
+
35
+ <template>
36
+ <div :class="edges.map((edge) => edgeClasses[edge]).filter(Boolean)">
37
+ <slot />
38
+ </div>
39
+ </template>
@@ -0,0 +1,51 @@
1
+ <script setup>
2
+ defineOptions({
3
+ __doc: {
4
+ name: 'App shell',
5
+ tag: '<DomAppShell>',
6
+ description: 'A web app surface with safe-area padding, scrollable content, and fixed app chrome slots for mobile or desktop app layouts.',
7
+ slots: [
8
+ { name: 'top', description: 'Top navigation, status, or toolbar content.' },
9
+ { name: '(default)', description: 'Scrollable app content.' },
10
+ { name: 'bottom', description: 'Bottom navigation, tab bar, or persistent controls.' },
11
+ { name: 'overlay', description: 'Absolute overlay layer for drawers, action sheets, and app-level panels.' },
12
+ ],
13
+ playground: {
14
+ mobileSlot: 'shell',
15
+ },
16
+ },
17
+ });
18
+
19
+ defineProps({
20
+ variant: {
21
+ type: String,
22
+ default: 'app',
23
+ _edit: {
24
+ options: ['app', 'card'],
25
+ description: 'Use app for full-screen app views and card for inset surfaces.',
26
+ },
27
+ },
28
+ });
29
+ </script>
30
+
31
+ <template>
32
+ <div
33
+ data-dom-app-shell
34
+ class="relative isolate flex h-full min-h-0 w-full flex-col overflow-hidden overscroll-none bg-canvas text-canvas-fg"
35
+ :class="variant === 'card' && 'skin-card rounded-[2rem]'"
36
+ style="--dom-mobile-safe-top: env(safe-area-inset-top, 0px); --dom-mobile-safe-bottom: env(safe-area-inset-bottom, 0px);"
37
+ >
38
+ <div v-if="$slots.top" class="shrink-0 pt-[var(--dom-mobile-safe-top)]">
39
+ <slot name="top" />
40
+ </div>
41
+ <main data-dom-app-shell-main class="min-h-0 flex-1 overflow-y-auto overscroll-contain scroll-smooth [-webkit-overflow-scrolling:touch]">
42
+ <slot />
43
+ </main>
44
+ <div v-if="$slots.bottom" class="shrink-0 pb-[var(--dom-mobile-safe-bottom)]">
45
+ <slot name="bottom" />
46
+ </div>
47
+ <div v-if="$slots.overlay" data-dom-app-shell-overlay class="pointer-events-none absolute inset-0 z-20">
48
+ <slot name="overlay" />
49
+ </div>
50
+ </div>
51
+ </template>
@@ -0,0 +1,63 @@
1
+ <script setup>
2
+ defineOptions({
3
+ name: 'DomAppStackScreen',
4
+ });
5
+
6
+ defineProps({
7
+ id: {
8
+ type: String,
9
+ required: true,
10
+ _edit: { description: 'Unique screen id used in the stack path.' },
11
+ },
12
+ title: {
13
+ type: String,
14
+ default: '',
15
+ _edit: { description: 'Screen title used in breadcrumbs and generated menu rows.' },
16
+ },
17
+ description: {
18
+ type: String,
19
+ default: '',
20
+ _edit: { description: 'Optional supporting text for generated menu rows.' },
21
+ },
22
+ meta: {
23
+ type: String,
24
+ default: '',
25
+ _edit: { description: 'Small trailing metadata for generated menu rows.' },
26
+ },
27
+ icon: {
28
+ type: String,
29
+ default: '',
30
+ _edit: { description: 'Optional SVG string for generated menu rows.' },
31
+ },
32
+ parent: {
33
+ type: String,
34
+ default: '',
35
+ _edit: { description: 'Parent screen id used to build desktop and breadcrumb paths.' },
36
+ },
37
+ children: {
38
+ type: Array,
39
+ default: () => [],
40
+ _edit: {
41
+ component: 'DomJsonListInput',
42
+ description: 'Child screen ids for generated settings menus.',
43
+ },
44
+ },
45
+ props: {
46
+ type: Object,
47
+ default: () => ({}),
48
+ _edit: { description: 'Props forwarded when this screen is rendered through a component.' },
49
+ },
50
+ disabled: {
51
+ type: Boolean,
52
+ default: false,
53
+ _edit: { description: 'Disable generated menu rows that point to this screen.' },
54
+ },
55
+ loadingTitle: {
56
+ type: String,
57
+ default: '',
58
+ _edit: { description: 'Optional loading title for lazy screen content.' },
59
+ },
60
+ });
61
+ </script>
62
+
63
+ <template></template>