@threadlabs/looma 0.5.0 → 0.5.2

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 (313) hide show
  1. package/README.md +1 -1
  2. package/components/shared/input-modality.d.ts +8 -0
  3. package/components/shared/input-modality.js +2 -0
  4. package/components/ui-button/ui-button.html +42 -1
  5. package/components/ui-combobox/ui-combobox.html +12 -4
  6. package/components/ui-dialog/ui-dialog.html +13 -0
  7. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
  8. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
  9. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
  10. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
  11. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
  12. package/components/ui-form-field/ui-form-field.html +18 -7
  13. package/components/ui-icon/ui-icon.html +5 -1
  14. package/components/ui-icon-button/ui-icon-button.html +44 -1
  15. package/components/ui-popover/ui-popover.js +10 -2
  16. package/components/ui-search-shell/ui-search-shell.html +7 -0
  17. package/components/ui-search-shell/ui-search-shell.js +9 -0
  18. package/components/ui-tabs/ui-tabs.html +1 -1
  19. package/components/ui-toast-region/ui-toast-region.html +1 -1
  20. package/components/ui-tree-item/ui-tree-item.html +6 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +2 -2
  23. package/package.json +2 -2
  24. package/styles/ui-affordance-scope.css +1 -1
  25. package/styles/ui-avatar-group.css +1 -1
  26. package/styles/ui-avatar.css +1 -1
  27. package/styles/ui-badge.css +1 -1
  28. package/styles/ui-button.css +42 -2
  29. package/styles/ui-callout.css +1 -1
  30. package/styles/ui-checkbox.css +1 -1
  31. package/styles/ui-cluster.css +1 -1
  32. package/styles/ui-combobox.css +1 -1
  33. package/styles/ui-container.css +1 -1
  34. package/styles/ui-context-menu.css +1 -1
  35. package/styles/ui-dialog.css +18 -1
  36. package/styles/ui-disclosure.css +1 -1
  37. package/styles/ui-editable.css +1 -1
  38. package/styles/ui-editor-insert-table-grid.css +1 -1
  39. package/styles/ui-editor-mention-menu.css +1 -1
  40. package/styles/ui-editor-slash-menu.css +1 -1
  41. package/styles/ui-editor-table-context-menu.css +1 -1
  42. package/styles/ui-editor-table-overlay.css +1 -1
  43. package/styles/ui-editor-table-toolbar.css +1 -1
  44. package/styles/ui-editor-toolbar.css +1 -1
  45. package/styles/ui-floating-action-button.css +1 -1
  46. package/styles/ui-form-field.css +24 -10
  47. package/styles/ui-grid.css +1 -1
  48. package/styles/ui-icon-button.css +52 -2
  49. package/styles/ui-icon.css +1 -1
  50. package/styles/ui-input.css +1 -1
  51. package/styles/ui-menu-item.css +1 -1
  52. package/styles/ui-menu.css +1 -1
  53. package/styles/ui-popover.css +1 -1
  54. package/styles/ui-radio-group.css +1 -1
  55. package/styles/ui-radio.css +1 -1
  56. package/styles/ui-reel.css +1 -1
  57. package/styles/ui-search-result-row.css +1 -1
  58. package/styles/ui-search-shell.css +11 -2
  59. package/styles/ui-select.css +1 -1
  60. package/styles/ui-separator.css +1 -1
  61. package/styles/ui-sidebar.css +1 -1
  62. package/styles/ui-stack.css +1 -1
  63. package/styles/ui-switch.css +1 -1
  64. package/styles/ui-switcher.css +1 -1
  65. package/styles/ui-tabs.css +1 -1
  66. package/styles/ui-textarea.css +1 -1
  67. package/styles/ui-toast-region.css +1 -1
  68. package/styles/ui-tooltip.css +1 -1
  69. package/styles/ui-top-bar.css +1 -1
  70. package/styles/ui-tree-item.css +10 -2
  71. package/styles/ui-tree.css +1 -1
  72. package/vanilla/UiAffordanceScope.d.ts +1 -1
  73. package/vanilla/UiAffordanceScope.js +2 -2
  74. package/vanilla/UiAvatar.d.ts +1 -1
  75. package/vanilla/UiAvatar.js +2 -2
  76. package/vanilla/UiAvatarGroup.d.ts +1 -1
  77. package/vanilla/UiAvatarGroup.js +2 -2
  78. package/vanilla/UiBadge.d.ts +1 -1
  79. package/vanilla/UiBadge.js +2 -2
  80. package/vanilla/UiButton.d.ts +3 -1
  81. package/vanilla/UiButton.js +3 -3
  82. package/vanilla/UiCallout.d.ts +1 -1
  83. package/vanilla/UiCallout.js +2 -2
  84. package/vanilla/UiCheckbox.d.ts +1 -1
  85. package/vanilla/UiCheckbox.js +2 -2
  86. package/vanilla/UiCluster.d.ts +1 -1
  87. package/vanilla/UiCluster.js +2 -2
  88. package/vanilla/UiCombobox.d.ts +1 -1
  89. package/vanilla/UiCombobox.js +3 -3
  90. package/vanilla/UiContainer.d.ts +1 -1
  91. package/vanilla/UiContainer.js +2 -2
  92. package/vanilla/UiContextMenu.d.ts +1 -1
  93. package/vanilla/UiContextMenu.js +2 -2
  94. package/vanilla/UiDialog.d.ts +1 -1
  95. package/vanilla/UiDialog.js +2 -2
  96. package/vanilla/UiDisclosure.d.ts +1 -1
  97. package/vanilla/UiDisclosure.js +2 -2
  98. package/vanilla/UiEditable.d.ts +1 -1
  99. package/vanilla/UiEditable.js +2 -2
  100. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  101. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  102. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  103. package/vanilla/UiEditorMentionMenu.js +3 -3
  104. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  105. package/vanilla/UiEditorSlashMenu.js +2 -2
  106. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  107. package/vanilla/UiEditorTableContextMenu.js +3 -3
  108. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  109. package/vanilla/UiEditorTableOverlay.js +3 -3
  110. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  111. package/vanilla/UiEditorTableToolbar.js +3 -3
  112. package/vanilla/UiEditorToolbar.d.ts +1 -1
  113. package/vanilla/UiEditorToolbar.js +2 -2
  114. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  115. package/vanilla/UiFloatingActionButton.js +2 -2
  116. package/vanilla/UiFormField.d.ts +1 -1
  117. package/vanilla/UiFormField.js +15 -6
  118. package/vanilla/UiGrid.d.ts +1 -1
  119. package/vanilla/UiGrid.js +2 -2
  120. package/vanilla/UiIcon.d.ts +1 -1
  121. package/vanilla/UiIcon.js +3 -3
  122. package/vanilla/UiIconButton.d.ts +1 -1
  123. package/vanilla/UiIconButton.js +2 -2
  124. package/vanilla/UiInput.d.ts +1 -1
  125. package/vanilla/UiInput.js +2 -2
  126. package/vanilla/UiMenu.d.ts +1 -1
  127. package/vanilla/UiMenu.js +2 -2
  128. package/vanilla/UiMenuItem.d.ts +1 -1
  129. package/vanilla/UiMenuItem.js +2 -2
  130. package/vanilla/UiPopover.d.ts +1 -1
  131. package/vanilla/UiPopover.js +2 -2
  132. package/vanilla/UiRadio.d.ts +1 -1
  133. package/vanilla/UiRadio.js +2 -2
  134. package/vanilla/UiRadioGroup.d.ts +1 -1
  135. package/vanilla/UiRadioGroup.js +2 -2
  136. package/vanilla/UiReel.d.ts +1 -1
  137. package/vanilla/UiReel.js +2 -2
  138. package/vanilla/UiSearchResultRow.d.ts +1 -1
  139. package/vanilla/UiSearchResultRow.js +2 -2
  140. package/vanilla/UiSearchShell.d.ts +1 -1
  141. package/vanilla/UiSearchShell.js +2 -2
  142. package/vanilla/UiSelect.d.ts +1 -1
  143. package/vanilla/UiSelect.js +2 -2
  144. package/vanilla/UiSeparator.d.ts +1 -1
  145. package/vanilla/UiSeparator.js +2 -2
  146. package/vanilla/UiSidebar.d.ts +1 -1
  147. package/vanilla/UiSidebar.js +2 -2
  148. package/vanilla/UiStack.d.ts +1 -1
  149. package/vanilla/UiStack.js +2 -2
  150. package/vanilla/UiSwitch.d.ts +1 -1
  151. package/vanilla/UiSwitch.js +2 -2
  152. package/vanilla/UiSwitcher.d.ts +1 -1
  153. package/vanilla/UiSwitcher.js +2 -2
  154. package/vanilla/UiTabs.d.ts +1 -1
  155. package/vanilla/UiTabs.js +3 -3
  156. package/vanilla/UiTextarea.d.ts +1 -1
  157. package/vanilla/UiTextarea.js +2 -2
  158. package/vanilla/UiToastRegion.d.ts +1 -1
  159. package/vanilla/UiToastRegion.js +3 -3
  160. package/vanilla/UiTooltip.d.ts +1 -1
  161. package/vanilla/UiTooltip.js +2 -2
  162. package/vanilla/UiTopBar.d.ts +1 -1
  163. package/vanilla/UiTopBar.js +1 -1
  164. package/vanilla/UiTree.d.ts +1 -1
  165. package/vanilla/UiTree.js +2 -2
  166. package/vanilla/UiTreeItem.d.ts +1 -1
  167. package/vanilla/UiTreeItem.js +2 -2
  168. package/vue/UiAffordanceScope.d.ts +2 -2
  169. package/vue/UiAffordanceScope.vue +92 -73
  170. package/vue/UiAvatar.d.ts +7 -7
  171. package/vue/UiAvatar.vue +145 -105
  172. package/vue/UiAvatarGroup.d.ts +4 -4
  173. package/vue/UiAvatarGroup.vue +134 -118
  174. package/vue/UiBadge.d.ts +4 -4
  175. package/vue/UiBadge.vue +113 -114
  176. package/vue/UiButton.d.ts +10 -6
  177. package/vue/UiButton.vue +289 -220
  178. package/vue/UiCallout.d.ts +2 -2
  179. package/vue/UiCallout.vue +154 -87
  180. package/vue/UiCheckbox.d.ts +14 -10
  181. package/vue/UiCheckbox.vue +228 -162
  182. package/vue/UiCluster.d.ts +2 -2
  183. package/vue/UiCluster.vue +53 -60
  184. package/vue/UiCombobox.d.ts +36 -32
  185. package/vue/UiCombobox.vue +1005 -416
  186. package/vue/UiContainer.d.ts +2 -2
  187. package/vue/UiContainer.vue +48 -51
  188. package/vue/UiContextMenu.d.ts +6 -4
  189. package/vue/UiContextMenu.vue +205 -116
  190. package/vue/UiDialog.d.ts +11 -9
  191. package/vue/UiDialog.vue +287 -212
  192. package/vue/UiDisclosure.d.ts +8 -6
  193. package/vue/UiDisclosure.vue +248 -159
  194. package/vue/UiEditable.d.ts +16 -12
  195. package/vue/UiEditable.vue +325 -205
  196. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  197. package/vue/UiEditorInsertTableGrid.vue +216 -157
  198. package/vue/UiEditorMentionMenu.d.ts +9 -9
  199. package/vue/UiEditorMentionMenu.vue +265 -222
  200. package/vue/UiEditorSlashMenu.d.ts +7 -7
  201. package/vue/UiEditorSlashMenu.vue +286 -240
  202. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  203. package/vue/UiEditorTableContextMenu.vue +306 -193
  204. package/vue/UiEditorTableOverlay.d.ts +2 -2
  205. package/vue/UiEditorTableOverlay.vue +609 -369
  206. package/vue/UiEditorTableToolbar.d.ts +7 -7
  207. package/vue/UiEditorTableToolbar.vue +443 -268
  208. package/vue/UiEditorToolbar.d.ts +2 -2
  209. package/vue/UiEditorToolbar.vue +134 -121
  210. package/vue/UiFloatingActionButton.d.ts +6 -6
  211. package/vue/UiFloatingActionButton.vue +100 -99
  212. package/vue/UiFormField.d.ts +6 -6
  213. package/vue/UiFormField.vue +112 -80
  214. package/vue/UiGrid.d.ts +2 -2
  215. package/vue/UiGrid.vue +51 -57
  216. package/vue/UiIcon.d.ts +2 -2
  217. package/vue/UiIcon.vue +118 -89
  218. package/vue/UiIconButton.d.ts +11 -11
  219. package/vue/UiIconButton.vue +285 -206
  220. package/vue/UiInput.d.ts +9 -9
  221. package/vue/UiInput.vue +153 -127
  222. package/vue/UiMenu.d.ts +8 -6
  223. package/vue/UiMenu.vue +217 -143
  224. package/vue/UiMenuItem.d.ts +4 -4
  225. package/vue/UiMenuItem.vue +52 -46
  226. package/vue/UiPopover.d.ts +8 -6
  227. package/vue/UiPopover.vue +197 -137
  228. package/vue/UiRadio.d.ts +14 -10
  229. package/vue/UiRadio.vue +183 -117
  230. package/vue/UiRadioGroup.d.ts +14 -12
  231. package/vue/UiRadioGroup.vue +172 -111
  232. package/vue/UiReel.d.ts +3 -3
  233. package/vue/UiReel.vue +77 -77
  234. package/vue/UiSearchResultRow.d.ts +4 -4
  235. package/vue/UiSearchResultRow.vue +124 -115
  236. package/vue/UiSearchShell.d.ts +10 -8
  237. package/vue/UiSearchShell.vue +245 -176
  238. package/vue/UiSelect.d.ts +9 -9
  239. package/vue/UiSelect.vue +162 -134
  240. package/vue/UiSeparator.d.ts +2 -2
  241. package/vue/UiSeparator.vue +22 -27
  242. package/vue/UiSidebar.d.ts +20 -18
  243. package/vue/UiSidebar.vue +312 -224
  244. package/vue/UiStack.d.ts +3 -3
  245. package/vue/UiStack.vue +64 -70
  246. package/vue/UiSwitch.d.ts +12 -8
  247. package/vue/UiSwitch.vue +218 -150
  248. package/vue/UiSwitcher.d.ts +3 -3
  249. package/vue/UiSwitcher.vue +73 -75
  250. package/vue/UiTabs.d.ts +10 -8
  251. package/vue/UiTabs.vue +251 -210
  252. package/vue/UiTextarea.d.ts +11 -11
  253. package/vue/UiTextarea.vue +155 -128
  254. package/vue/UiToastRegion.d.ts +10 -8
  255. package/vue/UiToastRegion.vue +261 -198
  256. package/vue/UiTooltip.d.ts +14 -12
  257. package/vue/UiTooltip.vue +241 -177
  258. package/vue/UiTopBar.vue +51 -42
  259. package/vue/UiTree.d.ts +8 -6
  260. package/vue/UiTree.vue +157 -70
  261. package/vue/UiTreeItem.d.ts +24 -22
  262. package/vue/UiTreeItem.vue +456 -339
  263. package/vue/chunks/UiAffordanceScope.js +9 -16
  264. package/vue/chunks/UiAvatar.js +23 -29
  265. package/vue/chunks/UiAvatarGroup.js +16 -39
  266. package/vue/chunks/UiBadge.js +3 -12
  267. package/vue/chunks/UiButton.js +15 -18
  268. package/vue/chunks/UiCallout.js +8 -17
  269. package/vue/chunks/UiCheckbox.js +37 -40
  270. package/vue/chunks/UiCluster.js +3 -12
  271. package/vue/chunks/UiCombobox.js +224 -266
  272. package/vue/chunks/UiContainer.js +3 -12
  273. package/vue/chunks/UiContextMenu.js +39 -34
  274. package/vue/chunks/UiDialog.js +36 -39
  275. package/vue/chunks/UiDisclosure.js +43 -48
  276. package/vue/chunks/UiEditable.js +55 -57
  277. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  278. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  279. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  280. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  281. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  282. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  283. package/vue/chunks/UiEditorToolbar.js +4 -13
  284. package/vue/chunks/UiFloatingActionButton.js +7 -21
  285. package/vue/chunks/UiFormField.js +15 -12
  286. package/vue/chunks/UiGrid.js +3 -12
  287. package/vue/chunks/UiIcon.js +20 -43
  288. package/vue/chunks/UiIconButton.js +16 -28
  289. package/vue/chunks/UiInput.js +20 -25
  290. package/vue/chunks/UiMenu.js +29 -33
  291. package/vue/chunks/UiMenuItem.js +4 -10
  292. package/vue/chunks/UiPopover.js +28 -29
  293. package/vue/chunks/UiRadio.js +36 -39
  294. package/vue/chunks/UiRadioGroup.js +30 -34
  295. package/vue/chunks/UiReel.js +6 -15
  296. package/vue/chunks/UiSearchResultRow.js +6 -19
  297. package/vue/chunks/UiSearchShell.js +25 -28
  298. package/vue/chunks/UiSelect.js +20 -23
  299. package/vue/chunks/UiSeparator.js +2 -8
  300. package/vue/chunks/UiSidebar.js +39 -44
  301. package/vue/chunks/UiStack.js +6 -15
  302. package/vue/chunks/UiSwitch.js +35 -38
  303. package/vue/chunks/UiSwitcher.js +6 -15
  304. package/vue/chunks/UiTabs.js +47 -85
  305. package/vue/chunks/UiTextarea.js +21 -26
  306. package/vue/chunks/UiToastRegion.js +38 -72
  307. package/vue/chunks/UiTooltip.js +34 -35
  308. package/vue/chunks/UiTopBar.js +1 -1
  309. package/vue/chunks/UiTree.js +20 -15
  310. package/vue/chunks/UiTreeItem.js +85 -102
  311. package/vue/components.css +3994 -3764
  312. package/vue/index.d.ts +1 -0
  313. package/vue/index.js +2 -1
package/vue/UiDialog.vue CHANGED
@@ -1,273 +1,348 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.1 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from "vue";
4
- import * as controllerModule from "../components/ui-dialog/ui-dialog.js";
3
+ import {
4
+ computed,
5
+ onBeforeUnmount,
6
+ onMounted,
7
+ ref,
8
+ shallowRef,
9
+ useTemplateRef,
10
+ watchEffect,
11
+ } from 'vue'
12
+ import * as controllerModule from '../components/ui-dialog/ui-dialog.js'
5
13
 
6
- defineOptions({ inheritAttrs: false });
14
+ defineOptions({ inheritAttrs: false })
7
15
 
8
- const hn = {
9
- t: (v: unknown): boolean => v === true || (typeof v === "string" ? v.length > 0 : typeof v === "number" ? v !== 0 && v === v : Array.isArray(v) ? v.length > 0 : v !== null && typeof v === "object" ? Object.keys(v).length > 0 : false),
10
- text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
11
- attr: (v: unknown): any => v === undefined || v === null || v === false ? undefined : v === true ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? undefined : String(v),
12
- enumerated: (v: unknown): any => typeof v === "boolean" ? String(v) : hn.attr(v),
13
- };
14
-
15
- const props = withDefaults(defineProps<{
16
- dismissible?: boolean | null;
17
- for?: string | null;
18
- label?: string | null;
19
- modal?: boolean | null;
20
- open?: boolean | null;
21
- }>(), {
22
- dismissible: false,
23
- for: "",
24
- modal: false,
25
- open: false,
26
- });
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ dismissible?: boolean
19
+ for?: string
20
+ label?: string
21
+ modal?: boolean
22
+ open?: boolean
23
+ }>(),
24
+ {
25
+ dismissible: false,
26
+ for: '',
27
+ modal: false,
28
+ open: false,
29
+ },
30
+ )
27
31
  const emit = defineEmits<{
28
- "close": [detail: { readonly open: boolean; readonly reason: "action" | "programmatic" | "light-dismiss" | "escape"; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
29
- }>();
30
- const root = ref<HTMLElement | null>(null);
31
- const refs: Record<string, Element | undefined> = {};
32
- const state_internalOpen = ref<any>(false);
33
- const state_accessibleLabel = ref<any>("Dialog");
32
+ 'update:open': [value: boolean]
33
+ close: [
34
+ detail: {
35
+ readonly open: boolean
36
+ readonly reason: 'action' | 'programmatic' | 'light-dismiss' | 'escape'
37
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
38
+ },
39
+ ]
40
+ }>()
41
+
42
+ const root = ref<HTMLElement | null>(null)
43
+ const closeElement = useTemplateRef<HTMLElement>('close')
44
+ const internalOpen = ref(false)
45
+ const accessibleLabel = ref('Dialog')
34
46
 
35
47
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
36
- const dispatch = (name: string, detail?: unknown): boolean => {
37
- const declared = {"close":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
48
+ function dispatch(name: string, detail?: unknown): boolean {
49
+ const declared: Record<string, EventInit | undefined> = {
50
+ close: { bubbles: true, composed: true, cancelable: false },
51
+ }
38
52
  const checks: Record<string, (detail: unknown) => boolean> = {
39
- "close": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["open"] === "boolean" && ((detail as Record<string, unknown>)["reason"] === "action" || (detail as Record<string, unknown>)["reason"] === "programmatic" || (detail as Record<string, unknown>)["reason"] === "light-dismiss" || (detail as Record<string, unknown>)["reason"] === "escape") && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["open","reason","trigger"].includes(key))),
40
- };
53
+ close: (detail) =>
54
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
55
+ && typeof (detail as Record<string, unknown>)['open'] === 'boolean'
56
+ && ((detail as Record<string, unknown>)['reason'] === 'action'
57
+ || (detail as Record<string, unknown>)['reason'] === 'programmatic'
58
+ || (detail as Record<string, unknown>)['reason'] === 'light-dismiss'
59
+ || (detail as Record<string, unknown>)['reason'] === 'escape')
60
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
61
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
62
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
63
+ && Object.keys(detail as object).every((key) => ['open', 'reason', 'trigger'].includes(key)),
64
+ }
41
65
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
42
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
66
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
67
+ }
68
+ const emitEvent = emit as (name: string, detail: unknown) => void
69
+ emitEvent(name, detail)
70
+ if (detail !== null && typeof detail === 'object' && 'open' in detail) {
71
+ emitEvent('update:open', (detail as Record<string, unknown>)['open'])
43
72
  }
44
- (emit as (name: string, detail: unknown) => void)(name, detail);
45
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
46
- };
73
+ return root.value?.dispatchEvent(
74
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
75
+ ) ?? true
76
+ }
47
77
 
48
78
  function read(name: string): unknown {
49
- if (name === "internalOpen") return state_internalOpen.value;
50
- if (name === "accessibleLabel") return state_accessibleLabel.value;
51
- return (props as Record<string, unknown>)[name];
79
+ if (name === 'internalOpen') return internalOpen.value
80
+ if (name === 'accessibleLabel') return accessibleLabel.value
81
+ return (props as Record<string, unknown>)[name]
52
82
  }
53
83
 
54
84
  function write(name: string, value: unknown): boolean {
55
- if (name === "internalOpen") { state_internalOpen.value = value; return true; }
56
- if (name === "accessibleLabel") { state_accessibleLabel.value = value; return true; }
57
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
85
+ if (name === 'internalOpen') {
86
+ internalOpen.value = value as never
87
+ return true
88
+ }
89
+ if (name === 'accessibleLabel') {
90
+ accessibleLabel.value = value as never
91
+ return true
92
+ }
93
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
58
94
  }
59
95
 
60
- const stops: Array<() => void> = [];
96
+ const stops: Array<() => void> = []
61
97
  const host = {
62
- get element(): Element { return root.value as Element; },
98
+ get element(): Element {
99
+ return root.value as Element
100
+ },
63
101
  state: new Proxy({} as Record<string, unknown>, {
64
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
65
- set: (_target, name, value) => typeof name === "string" && write(name, value),
102
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
103
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
66
104
  }),
67
- refs: refs as Readonly<Record<string, Element>>,
105
+ refs: {
106
+ get close(): Element {
107
+ return closeElement.value as Element
108
+ },
109
+ } as Readonly<Record<string, Element>>,
68
110
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
69
111
  get: (_target, name) => {
70
- if (typeof name !== "string" || root.value === null) return undefined;
71
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
72
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
112
+ if (typeof name !== 'string' || root.value === null) return undefined
113
+ const form = root.value instanceof HTMLFormElement
114
+ ? root.value
115
+ : root.value.querySelector('form')
116
+ return form?.elements.namedItem(name)
117
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
73
118
  },
74
119
  }),
75
120
  signal<T>(initialValue: T) {
76
- const value = shallowRef(initialValue);
121
+ const value = shallowRef(initialValue)
77
122
  return {
78
123
  get: (): T => value.value,
79
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
80
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
81
- };
124
+ set: (next: T): void => {
125
+ if (!Object.is(value.value, next)) value.value = next
126
+ },
127
+ update: (next: (current: T) => T): void => {
128
+ const updated = next(value.value)
129
+ if (!Object.is(value.value, updated)) value.value = updated
130
+ },
131
+ }
82
132
  },
83
133
  computed<T>(compute: () => T) {
84
- const value = computed(compute);
85
- return { get: (): T => value.value };
134
+ const value = computed(compute)
135
+ return { get: (): T => value.value }
86
136
  },
87
137
  effect(run: () => void | (() => void)): () => void {
88
138
  const stop = watchEffect((onCleanup) => {
89
- const cleanup = run();
90
- if (typeof cleanup === "function") onCleanup(cleanup);
91
- }, { flush: "post" });
92
- stops.push(stop);
93
- return stop;
139
+ const cleanup = run()
140
+ if (typeof cleanup === 'function') onCleanup(cleanup)
141
+ }, { flush: 'post' })
142
+ stops.push(stop)
143
+ return stop
94
144
  },
95
145
  on(event: string, listener: EventListener): () => void {
96
- const element = root.value;
97
- element?.addEventListener(event, listener);
98
- const off = (): void => element?.removeEventListener(event, listener);
99
- stops.push(off);
100
- return off;
146
+ const element = root.value
147
+ element?.addEventListener(event, listener)
148
+ const off = (): void => element?.removeEventListener(event, listener)
149
+ stops.push(off)
150
+ return off
101
151
  },
102
152
  dispatch,
103
- };
153
+ }
104
154
 
105
- let cleanup: void | (() => void);
106
- let ready: Promise<void> | undefined;
155
+ let cleanup: void | (() => void)
156
+ let ready: Promise<void> | undefined
107
157
  onMounted(() => {
108
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
109
- });
158
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
159
+ cleanup = result
160
+ })
161
+ })
110
162
  onBeforeUnmount(() => {
111
- for (const stop of stops.splice(0)) stop();
112
- if (typeof cleanup === "function") cleanup();
113
- });
163
+ for (const stop of stops.splice(0)) stop()
164
+ if (typeof cleanup === 'function') cleanup()
165
+ })
114
166
  </script>
115
167
 
116
168
  <template>
117
- <dialog data-component="ui-dialog" v-bind="$attrs" :aria-label="hn.enumerated(state_accessibleLabel)" ref="root"><header><template v-if="hn.t(props.label)"><h2 class="title">{{ hn.text(props.label) }}</h2></template><button class="close" type="button" aria-label="Close" :ref="(element) => { refs['close'] = element as Element }"></button></header><div class="body"><slot></slot></div><footer><slot name="actions"></slot></footer></dialog>
169
+ <dialog data-component="ui-dialog" v-bind="$attrs" :aria-label="accessibleLabel" ref="root">
170
+ <header>
171
+ <h2 v-if="label" class="title">{{ label }}</h2>
172
+ <button class="close" type="button" aria-label="Close" ref="close"></button>
173
+ </header>
174
+ <div class="body"><slot /></div>
175
+ <footer><slot name="actions" /></footer>
176
+ </dialog>
118
177
  </template>
119
178
 
120
179
  <style scoped>
121
180
  [data-component~="ui-dialog"] {
122
- position: fixed;
123
- inset: 0;
124
- box-sizing: border-box;
125
- inline-size: min(
126
- calc(100% - var(--ui-dialog-viewport-gap, var(--ui-space-4, 1rem)) * 2),
127
- var(--ui-dialog-max-width, 440px)
128
- );
129
- max-inline-size: none;
130
- max-block-size: calc(100dvh - var(--ui-dialog-viewport-gap, var(--ui-space-4, 1rem)) * 2);
131
- margin: auto;
132
- padding: 0;
133
- overflow: hidden;
134
- flex-direction: column;
135
- background: var(--ui-surface-elevated);
136
- border: 1px solid var(--ui-border-default);
137
- border-radius: var(--ui-radius-dialog);
138
- box-shadow: var(--ui-elevation-dialog, var(--ui-shadow-xl));
139
- visibility: hidden;
140
- pointer-events: none;
141
- opacity: 0;
142
- transform: scale(0.96);
143
- transition:
144
- opacity var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
145
- transform var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
146
- visibility var(--ui-dialog-duration, var(--ui-motion-base)),
147
- display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
148
- overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
149
- }
181
+ position: fixed;
182
+ inset: 0;
183
+ box-sizing: border-box;
184
+ inline-size: min(
185
+ calc(100% - var(--ui-dialog-viewport-gap, var(--ui-space-4, 1rem)) * 2),
186
+ var(--ui-dialog-max-width, 440px)
187
+ );
188
+ max-inline-size: none;
189
+ max-block-size: calc(100dvh - var(--ui-dialog-viewport-gap, var(--ui-space-4, 1rem)) * 2);
190
+ margin: auto;
191
+ padding: 0;
192
+ overflow: hidden;
193
+ flex-direction: column;
194
+ background: var(--ui-surface-elevated);
195
+ border: 1px solid var(--ui-border-default);
196
+ border-radius: var(--ui-radius-dialog);
197
+ box-shadow: var(--ui-elevation-dialog, var(--ui-shadow-xl));
198
+ visibility: hidden;
199
+ pointer-events: none;
200
+ opacity: 0;
201
+ transform: scale(0.96);
202
+ transition:
203
+ opacity var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
204
+ transform var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
205
+ visibility var(--ui-dialog-duration, var(--ui-motion-base)),
206
+ display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
207
+ overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
208
+ }
150
209
 
151
- [data-component~="ui-dialog"][open] {
152
- display: flex;
153
- visibility: visible;
154
- pointer-events: auto;
155
- opacity: 1;
156
- transform: scale(1);
157
- animation: ui-dialog-enter var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
158
- }
210
+ [data-component~="ui-dialog"][open] {
211
+ display: flex;
212
+ visibility: visible;
213
+ pointer-events: auto;
214
+ opacity: 1;
215
+ transform: scale(1);
216
+ animation: ui-dialog-enter var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
217
+ }
159
218
 
160
- /* Header and actions stay pinned; only the body scrolls when content is long. */
161
- header {
162
- display: flex;
163
- align-items: center;
164
- gap: var(--ui-space-3);
165
- flex: none;
166
- padding: var(--ui-space-3) var(--ui-space-3) var(--ui-space-3) var(--ui-space-5);
167
- border-block-end: 1px solid var(--ui-border-default);
168
- }
219
+ /* Header and actions stay pinned; only the body scrolls when content is long. */
220
+ header {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: var(--ui-space-3);
224
+ flex: none;
225
+ padding: var(--ui-space-3) var(--ui-space-3) var(--ui-space-3) var(--ui-space-5);
226
+ border-block-end: 1px solid var(--ui-border-default);
227
+ }
169
228
 
170
- /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
171
- [data-component~="ui-dialog"] .title {
172
- flex: 1;
173
- min-inline-size: 0;
174
- margin: 0;
175
- padding: 0;
176
- border: 0;
177
- color: var(--ui-text-primary);
178
- letter-spacing: normal;
179
- font-size: var(--ui-font-size-lg, 1.125rem);
180
- font-weight: var(--ui-font-semibold, 600);
181
- line-height: var(--ui-line-height-tight);
182
- }
229
+ /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
230
+ [data-component~="ui-dialog"] .title {
231
+ flex: 1;
232
+ min-inline-size: 0;
233
+ margin: 0;
234
+ padding: 0;
235
+ border: 0;
236
+ color: var(--ui-text-primary);
237
+ letter-spacing: normal;
238
+ font-size: var(--ui-font-size-lg, 1.125rem);
239
+ font-weight: var(--ui-font-semibold, 600);
240
+ line-height: var(--ui-line-height-tight);
241
+ }
183
242
 
184
- .close {
185
- display: inline-grid;
186
- place-items: center;
187
- flex: none;
188
- margin-inline-start: auto;
189
- inline-size: var(--ui-control-size-sm, 2rem);
190
- block-size: var(--ui-control-size-sm, 2rem);
191
- padding: 0;
192
- border: 0;
193
- border-radius: var(--ui-radius-round, 999px);
194
- background: transparent;
195
- color: var(--ui-text-secondary);
196
- cursor: pointer;
197
- transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), color var(--ui-motion-fast) var(--ui-motion-ease);
198
- }
243
+ .close {
244
+ display: inline-grid;
245
+ place-items: center;
246
+ flex: none;
247
+ margin-inline-start: auto;
248
+ inline-size: var(--ui-control-size-sm, 2rem);
249
+ block-size: var(--ui-control-size-sm, 2rem);
250
+ padding: 0;
251
+ border: 0;
252
+ border-radius: var(--ui-radius-round, 999px);
253
+ background: transparent;
254
+ color: var(--ui-text-secondary);
255
+ cursor: pointer;
256
+ transition:
257
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
258
+ color var(--ui-motion-fast) var(--ui-motion-ease);
259
+ }
199
260
 
200
- /* A CSS-drawn X. */
201
- .close::before,
202
- .close::after {
203
- content: "";
204
- grid-area: 1 / 1;
205
- inline-size: 0.875rem;
206
- block-size: 1.5px;
207
- border-radius: 1px;
208
- background: currentColor;
209
- transform: rotate(45deg);
210
- }
261
+ /* A CSS-drawn X. */
262
+ .close::before,
263
+ .close::after {
264
+ content: "";
265
+ grid-area: 1 / 1;
266
+ inline-size: 0.875rem;
267
+ block-size: 1.5px;
268
+ border-radius: 1px;
269
+ background: currentColor;
270
+ transform: rotate(45deg);
271
+ }
211
272
 
212
- .close::after {
213
- transform: rotate(-45deg);
214
- }
273
+ .close::after {
274
+ transform: rotate(-45deg);
275
+ }
215
276
 
216
- .close:hover {
217
- background: var(--ui-surface-muted);
218
- color: var(--ui-text-primary);
219
- }
277
+ .close:hover {
278
+ background: var(--ui-surface-muted);
279
+ color: var(--ui-text-primary);
280
+ }
220
281
 
221
- .close:focus-visible {
222
- outline: 2px solid var(--ui-focus-ring, currentColor);
223
- outline-offset: 2px;
224
- }
282
+ .close:focus-visible {
283
+ outline: 2px solid var(--ui-focus-ring, currentColor);
284
+ outline-offset: 2px;
285
+ }
225
286
 
226
- .body {
227
- flex: 1 1 auto;
228
- min-block-size: 0;
229
- overflow: auto;
230
- overscroll-behavior: contain;
231
- padding: var(--ui-space-5);
232
- }
287
+ /* A touch target, like Button on coarse pointers. */
288
+ @media (pointer: coarse) {
289
+ .close {
290
+ inline-size: var(--ui-control-min-block-size, 2.75rem);
291
+ block-size: var(--ui-control-min-block-size, 2.75rem);
292
+ }
293
+ }
233
294
 
234
- footer {
235
- display: flex;
236
- flex: none;
237
- flex-wrap: wrap;
238
- justify-content: flex-end;
239
- gap: var(--ui-space-2);
240
- padding: var(--ui-space-3) var(--ui-space-5);
241
- border-block-start: 1px solid var(--ui-border-default);
242
- }
295
+ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close {
296
+ inline-size: var(--ui-control-min-block-size, 2.75rem);
297
+ block-size: var(--ui-control-min-block-size, 2.75rem);
298
+ }
243
299
 
244
- footer:empty {
245
- display: none;
246
- }
300
+ .body {
301
+ flex: 1 1 auto;
302
+ min-block-size: 0;
303
+ overflow: auto;
304
+ overscroll-behavior: contain;
305
+ padding: var(--ui-space-5);
306
+ }
247
307
 
248
- @keyframes ui-dialog-enter {
249
- from {
250
- opacity: 0;
251
- transform: scale(0.96);
252
- }
253
- }
308
+ footer {
309
+ display: flex;
310
+ flex: none;
311
+ flex-wrap: wrap;
312
+ justify-content: flex-end;
313
+ gap: var(--ui-space-2);
314
+ padding: var(--ui-space-3) var(--ui-space-5);
315
+ border-block-start: 1px solid var(--ui-border-default);
316
+ }
254
317
 
255
- [data-component~="ui-dialog"]::backdrop {
256
- background-color: transparent;
257
- transition:
258
- background-color var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
259
- display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
260
- overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
261
- }
318
+ footer:empty {
319
+ display: none;
320
+ }
262
321
 
263
- [data-component~="ui-dialog"][open]::backdrop {
264
- background-color: var(--ui-overlay-backdrop);
265
- animation: ui-dialog-backdrop-enter var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
266
- }
322
+ @keyframes ui-dialog-enter {
323
+ from {
324
+ opacity: 0;
325
+ transform: scale(0.96);
326
+ }
327
+ }
267
328
 
268
- @keyframes ui-dialog-backdrop-enter {
269
- from {
270
- background-color: transparent;
271
- }
272
- }
329
+ [data-component~="ui-dialog"]::backdrop {
330
+ background-color: transparent;
331
+ transition:
332
+ background-color var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
333
+ display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
334
+ overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
335
+ }
336
+
337
+ [data-component~="ui-dialog"][open]::backdrop {
338
+ background-color: var(--ui-overlay-backdrop);
339
+ animation: ui-dialog-backdrop-enter var(--ui-dialog-duration, var(--ui-motion-base))
340
+ var(--ui-motion-ease);
341
+ }
342
+
343
+ @keyframes ui-dialog-backdrop-enter {
344
+ from {
345
+ background-color: transparent;
346
+ }
347
+ }
273
348
  </style>
@@ -1,7 +1,7 @@
1
1
  type __VLS_Props = {
2
- disabled?: boolean | null;
3
- open?: boolean | null;
4
- summary?: string | null;
2
+ disabled?: boolean;
3
+ open?: boolean;
4
+ summary?: string;
5
5
  };
6
6
  declare var __VLS_1: {};
7
7
  type __VLS_Slots = {} & {
@@ -18,6 +18,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
18
18
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
19
19
  readonly trigger: "keyboard" | "pointer" | "programmatic";
20
20
  }) => any;
21
+ "update:open": (value: boolean) => any;
21
22
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
23
  onClose?: ((detail: {
23
24
  readonly open: boolean;
@@ -29,10 +30,11 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
29
30
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
30
31
  readonly trigger: "keyboard" | "pointer" | "programmatic";
31
32
  }) => any) | undefined;
33
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
32
34
  }>, {
33
- summary: string | null;
34
- disabled: boolean | null;
35
- open: boolean | null;
35
+ summary: string;
36
+ disabled: boolean;
37
+ open: boolean;
36
38
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
37
39
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
40
  declare const _default: typeof __VLS_export;