@threadlabs/looma 0.5.1 → 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 (309) hide show
  1. package/README.md +1 -1
  2. package/components/ui-button/ui-button.html +13 -0
  3. package/components/ui-combobox/ui-combobox.html +12 -4
  4. package/components/ui-dialog/ui-dialog.html +13 -0
  5. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
  6. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
  7. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
  8. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
  9. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
  10. package/components/ui-form-field/ui-form-field.html +18 -7
  11. package/components/ui-icon/ui-icon.html +5 -1
  12. package/components/ui-icon-button/ui-icon-button.html +30 -0
  13. package/components/ui-popover/ui-popover.js +10 -2
  14. package/components/ui-search-shell/ui-search-shell.html +7 -0
  15. package/components/ui-search-shell/ui-search-shell.js +9 -0
  16. package/components/ui-tabs/ui-tabs.html +1 -1
  17. package/components/ui-toast-region/ui-toast-region.html +1 -1
  18. package/components/ui-tree-item/ui-tree-item.html +6 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +2 -2
  21. package/package.json +2 -2
  22. package/styles/ui-affordance-scope.css +1 -1
  23. package/styles/ui-avatar-group.css +1 -1
  24. package/styles/ui-avatar.css +1 -1
  25. package/styles/ui-badge.css +1 -1
  26. package/styles/ui-button.css +11 -1
  27. package/styles/ui-callout.css +1 -1
  28. package/styles/ui-checkbox.css +1 -1
  29. package/styles/ui-cluster.css +1 -1
  30. package/styles/ui-combobox.css +1 -1
  31. package/styles/ui-container.css +1 -1
  32. package/styles/ui-context-menu.css +1 -1
  33. package/styles/ui-dialog.css +18 -1
  34. package/styles/ui-disclosure.css +1 -1
  35. package/styles/ui-editable.css +1 -1
  36. package/styles/ui-editor-insert-table-grid.css +1 -1
  37. package/styles/ui-editor-mention-menu.css +1 -1
  38. package/styles/ui-editor-slash-menu.css +1 -1
  39. package/styles/ui-editor-table-context-menu.css +1 -1
  40. package/styles/ui-editor-table-overlay.css +1 -1
  41. package/styles/ui-editor-table-toolbar.css +1 -1
  42. package/styles/ui-editor-toolbar.css +1 -1
  43. package/styles/ui-floating-action-button.css +1 -1
  44. package/styles/ui-form-field.css +24 -10
  45. package/styles/ui-grid.css +1 -1
  46. package/styles/ui-icon-button.css +36 -1
  47. package/styles/ui-icon.css +1 -1
  48. package/styles/ui-input.css +1 -1
  49. package/styles/ui-menu-item.css +1 -1
  50. package/styles/ui-menu.css +1 -1
  51. package/styles/ui-popover.css +1 -1
  52. package/styles/ui-radio-group.css +1 -1
  53. package/styles/ui-radio.css +1 -1
  54. package/styles/ui-reel.css +1 -1
  55. package/styles/ui-search-result-row.css +1 -1
  56. package/styles/ui-search-shell.css +11 -2
  57. package/styles/ui-select.css +1 -1
  58. package/styles/ui-separator.css +1 -1
  59. package/styles/ui-sidebar.css +1 -1
  60. package/styles/ui-stack.css +1 -1
  61. package/styles/ui-switch.css +1 -1
  62. package/styles/ui-switcher.css +1 -1
  63. package/styles/ui-tabs.css +1 -1
  64. package/styles/ui-textarea.css +1 -1
  65. package/styles/ui-toast-region.css +1 -1
  66. package/styles/ui-tooltip.css +1 -1
  67. package/styles/ui-top-bar.css +1 -1
  68. package/styles/ui-tree-item.css +10 -2
  69. package/styles/ui-tree.css +1 -1
  70. package/vanilla/UiAffordanceScope.d.ts +1 -1
  71. package/vanilla/UiAffordanceScope.js +2 -2
  72. package/vanilla/UiAvatar.d.ts +1 -1
  73. package/vanilla/UiAvatar.js +2 -2
  74. package/vanilla/UiAvatarGroup.d.ts +1 -1
  75. package/vanilla/UiAvatarGroup.js +2 -2
  76. package/vanilla/UiBadge.d.ts +1 -1
  77. package/vanilla/UiBadge.js +2 -2
  78. package/vanilla/UiButton.d.ts +3 -1
  79. package/vanilla/UiButton.js +3 -3
  80. package/vanilla/UiCallout.d.ts +1 -1
  81. package/vanilla/UiCallout.js +2 -2
  82. package/vanilla/UiCheckbox.d.ts +1 -1
  83. package/vanilla/UiCheckbox.js +2 -2
  84. package/vanilla/UiCluster.d.ts +1 -1
  85. package/vanilla/UiCluster.js +2 -2
  86. package/vanilla/UiCombobox.d.ts +1 -1
  87. package/vanilla/UiCombobox.js +3 -3
  88. package/vanilla/UiContainer.d.ts +1 -1
  89. package/vanilla/UiContainer.js +2 -2
  90. package/vanilla/UiContextMenu.d.ts +1 -1
  91. package/vanilla/UiContextMenu.js +2 -2
  92. package/vanilla/UiDialog.d.ts +1 -1
  93. package/vanilla/UiDialog.js +2 -2
  94. package/vanilla/UiDisclosure.d.ts +1 -1
  95. package/vanilla/UiDisclosure.js +2 -2
  96. package/vanilla/UiEditable.d.ts +1 -1
  97. package/vanilla/UiEditable.js +2 -2
  98. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  99. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  100. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  101. package/vanilla/UiEditorMentionMenu.js +3 -3
  102. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  103. package/vanilla/UiEditorSlashMenu.js +2 -2
  104. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  105. package/vanilla/UiEditorTableContextMenu.js +3 -3
  106. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  107. package/vanilla/UiEditorTableOverlay.js +3 -3
  108. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  109. package/vanilla/UiEditorTableToolbar.js +3 -3
  110. package/vanilla/UiEditorToolbar.d.ts +1 -1
  111. package/vanilla/UiEditorToolbar.js +2 -2
  112. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  113. package/vanilla/UiFloatingActionButton.js +2 -2
  114. package/vanilla/UiFormField.d.ts +1 -1
  115. package/vanilla/UiFormField.js +15 -6
  116. package/vanilla/UiGrid.d.ts +1 -1
  117. package/vanilla/UiGrid.js +2 -2
  118. package/vanilla/UiIcon.d.ts +1 -1
  119. package/vanilla/UiIcon.js +3 -3
  120. package/vanilla/UiIconButton.d.ts +1 -1
  121. package/vanilla/UiIconButton.js +2 -2
  122. package/vanilla/UiInput.d.ts +1 -1
  123. package/vanilla/UiInput.js +2 -2
  124. package/vanilla/UiMenu.d.ts +1 -1
  125. package/vanilla/UiMenu.js +2 -2
  126. package/vanilla/UiMenuItem.d.ts +1 -1
  127. package/vanilla/UiMenuItem.js +2 -2
  128. package/vanilla/UiPopover.d.ts +1 -1
  129. package/vanilla/UiPopover.js +2 -2
  130. package/vanilla/UiRadio.d.ts +1 -1
  131. package/vanilla/UiRadio.js +2 -2
  132. package/vanilla/UiRadioGroup.d.ts +1 -1
  133. package/vanilla/UiRadioGroup.js +2 -2
  134. package/vanilla/UiReel.d.ts +1 -1
  135. package/vanilla/UiReel.js +2 -2
  136. package/vanilla/UiSearchResultRow.d.ts +1 -1
  137. package/vanilla/UiSearchResultRow.js +2 -2
  138. package/vanilla/UiSearchShell.d.ts +1 -1
  139. package/vanilla/UiSearchShell.js +2 -2
  140. package/vanilla/UiSelect.d.ts +1 -1
  141. package/vanilla/UiSelect.js +2 -2
  142. package/vanilla/UiSeparator.d.ts +1 -1
  143. package/vanilla/UiSeparator.js +2 -2
  144. package/vanilla/UiSidebar.d.ts +1 -1
  145. package/vanilla/UiSidebar.js +2 -2
  146. package/vanilla/UiStack.d.ts +1 -1
  147. package/vanilla/UiStack.js +2 -2
  148. package/vanilla/UiSwitch.d.ts +1 -1
  149. package/vanilla/UiSwitch.js +2 -2
  150. package/vanilla/UiSwitcher.d.ts +1 -1
  151. package/vanilla/UiSwitcher.js +2 -2
  152. package/vanilla/UiTabs.d.ts +1 -1
  153. package/vanilla/UiTabs.js +3 -3
  154. package/vanilla/UiTextarea.d.ts +1 -1
  155. package/vanilla/UiTextarea.js +2 -2
  156. package/vanilla/UiToastRegion.d.ts +1 -1
  157. package/vanilla/UiToastRegion.js +3 -3
  158. package/vanilla/UiTooltip.d.ts +1 -1
  159. package/vanilla/UiTooltip.js +2 -2
  160. package/vanilla/UiTopBar.d.ts +1 -1
  161. package/vanilla/UiTopBar.js +1 -1
  162. package/vanilla/UiTree.d.ts +1 -1
  163. package/vanilla/UiTree.js +2 -2
  164. package/vanilla/UiTreeItem.d.ts +1 -1
  165. package/vanilla/UiTreeItem.js +2 -2
  166. package/vue/UiAffordanceScope.d.ts +2 -2
  167. package/vue/UiAffordanceScope.vue +92 -73
  168. package/vue/UiAvatar.d.ts +7 -7
  169. package/vue/UiAvatar.vue +145 -105
  170. package/vue/UiAvatarGroup.d.ts +4 -4
  171. package/vue/UiAvatarGroup.vue +134 -118
  172. package/vue/UiBadge.d.ts +4 -4
  173. package/vue/UiBadge.vue +113 -114
  174. package/vue/UiButton.d.ts +10 -6
  175. package/vue/UiButton.vue +289 -248
  176. package/vue/UiCallout.d.ts +2 -2
  177. package/vue/UiCallout.vue +154 -87
  178. package/vue/UiCheckbox.d.ts +14 -10
  179. package/vue/UiCheckbox.vue +228 -162
  180. package/vue/UiCluster.d.ts +2 -2
  181. package/vue/UiCluster.vue +53 -60
  182. package/vue/UiCombobox.d.ts +36 -32
  183. package/vue/UiCombobox.vue +1005 -416
  184. package/vue/UiContainer.d.ts +2 -2
  185. package/vue/UiContainer.vue +48 -51
  186. package/vue/UiContextMenu.d.ts +6 -4
  187. package/vue/UiContextMenu.vue +205 -116
  188. package/vue/UiDialog.d.ts +11 -9
  189. package/vue/UiDialog.vue +287 -212
  190. package/vue/UiDisclosure.d.ts +8 -6
  191. package/vue/UiDisclosure.vue +248 -159
  192. package/vue/UiEditable.d.ts +16 -12
  193. package/vue/UiEditable.vue +325 -205
  194. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  195. package/vue/UiEditorInsertTableGrid.vue +216 -157
  196. package/vue/UiEditorMentionMenu.d.ts +9 -9
  197. package/vue/UiEditorMentionMenu.vue +265 -222
  198. package/vue/UiEditorSlashMenu.d.ts +7 -7
  199. package/vue/UiEditorSlashMenu.vue +286 -240
  200. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  201. package/vue/UiEditorTableContextMenu.vue +306 -193
  202. package/vue/UiEditorTableOverlay.d.ts +2 -2
  203. package/vue/UiEditorTableOverlay.vue +609 -369
  204. package/vue/UiEditorTableToolbar.d.ts +7 -7
  205. package/vue/UiEditorTableToolbar.vue +443 -268
  206. package/vue/UiEditorToolbar.d.ts +2 -2
  207. package/vue/UiEditorToolbar.vue +134 -121
  208. package/vue/UiFloatingActionButton.d.ts +6 -6
  209. package/vue/UiFloatingActionButton.vue +100 -99
  210. package/vue/UiFormField.d.ts +6 -6
  211. package/vue/UiFormField.vue +112 -80
  212. package/vue/UiGrid.d.ts +2 -2
  213. package/vue/UiGrid.vue +51 -57
  214. package/vue/UiIcon.d.ts +2 -2
  215. package/vue/UiIcon.vue +118 -89
  216. package/vue/UiIconButton.d.ts +11 -11
  217. package/vue/UiIconButton.vue +283 -217
  218. package/vue/UiInput.d.ts +9 -9
  219. package/vue/UiInput.vue +153 -127
  220. package/vue/UiMenu.d.ts +8 -6
  221. package/vue/UiMenu.vue +217 -143
  222. package/vue/UiMenuItem.d.ts +4 -4
  223. package/vue/UiMenuItem.vue +52 -46
  224. package/vue/UiPopover.d.ts +8 -6
  225. package/vue/UiPopover.vue +197 -137
  226. package/vue/UiRadio.d.ts +14 -10
  227. package/vue/UiRadio.vue +183 -117
  228. package/vue/UiRadioGroup.d.ts +14 -12
  229. package/vue/UiRadioGroup.vue +172 -111
  230. package/vue/UiReel.d.ts +3 -3
  231. package/vue/UiReel.vue +77 -77
  232. package/vue/UiSearchResultRow.d.ts +4 -4
  233. package/vue/UiSearchResultRow.vue +124 -115
  234. package/vue/UiSearchShell.d.ts +10 -8
  235. package/vue/UiSearchShell.vue +245 -176
  236. package/vue/UiSelect.d.ts +9 -9
  237. package/vue/UiSelect.vue +162 -134
  238. package/vue/UiSeparator.d.ts +2 -2
  239. package/vue/UiSeparator.vue +22 -27
  240. package/vue/UiSidebar.d.ts +20 -18
  241. package/vue/UiSidebar.vue +312 -224
  242. package/vue/UiStack.d.ts +3 -3
  243. package/vue/UiStack.vue +64 -70
  244. package/vue/UiSwitch.d.ts +12 -8
  245. package/vue/UiSwitch.vue +218 -150
  246. package/vue/UiSwitcher.d.ts +3 -3
  247. package/vue/UiSwitcher.vue +73 -75
  248. package/vue/UiTabs.d.ts +10 -8
  249. package/vue/UiTabs.vue +251 -210
  250. package/vue/UiTextarea.d.ts +11 -11
  251. package/vue/UiTextarea.vue +155 -128
  252. package/vue/UiToastRegion.d.ts +10 -8
  253. package/vue/UiToastRegion.vue +261 -198
  254. package/vue/UiTooltip.d.ts +14 -12
  255. package/vue/UiTooltip.vue +241 -177
  256. package/vue/UiTopBar.vue +51 -42
  257. package/vue/UiTree.d.ts +8 -6
  258. package/vue/UiTree.vue +157 -70
  259. package/vue/UiTreeItem.d.ts +24 -22
  260. package/vue/UiTreeItem.vue +456 -339
  261. package/vue/chunks/UiAffordanceScope.js +9 -16
  262. package/vue/chunks/UiAvatar.js +23 -29
  263. package/vue/chunks/UiAvatarGroup.js +16 -39
  264. package/vue/chunks/UiBadge.js +3 -12
  265. package/vue/chunks/UiButton.js +15 -18
  266. package/vue/chunks/UiCallout.js +8 -17
  267. package/vue/chunks/UiCheckbox.js +37 -40
  268. package/vue/chunks/UiCluster.js +3 -12
  269. package/vue/chunks/UiCombobox.js +224 -266
  270. package/vue/chunks/UiContainer.js +3 -12
  271. package/vue/chunks/UiContextMenu.js +39 -34
  272. package/vue/chunks/UiDialog.js +36 -39
  273. package/vue/chunks/UiDisclosure.js +43 -48
  274. package/vue/chunks/UiEditable.js +55 -57
  275. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  276. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  277. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  278. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  279. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  280. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  281. package/vue/chunks/UiEditorToolbar.js +4 -13
  282. package/vue/chunks/UiFloatingActionButton.js +7 -21
  283. package/vue/chunks/UiFormField.js +15 -12
  284. package/vue/chunks/UiGrid.js +3 -12
  285. package/vue/chunks/UiIcon.js +20 -43
  286. package/vue/chunks/UiIconButton.js +16 -28
  287. package/vue/chunks/UiInput.js +20 -25
  288. package/vue/chunks/UiMenu.js +29 -33
  289. package/vue/chunks/UiMenuItem.js +4 -10
  290. package/vue/chunks/UiPopover.js +28 -29
  291. package/vue/chunks/UiRadio.js +36 -39
  292. package/vue/chunks/UiRadioGroup.js +30 -34
  293. package/vue/chunks/UiReel.js +6 -15
  294. package/vue/chunks/UiSearchResultRow.js +6 -19
  295. package/vue/chunks/UiSearchShell.js +25 -28
  296. package/vue/chunks/UiSelect.js +20 -23
  297. package/vue/chunks/UiSeparator.js +2 -8
  298. package/vue/chunks/UiSidebar.js +39 -44
  299. package/vue/chunks/UiStack.js +6 -15
  300. package/vue/chunks/UiSwitch.js +35 -38
  301. package/vue/chunks/UiSwitcher.js +6 -15
  302. package/vue/chunks/UiTabs.js +47 -85
  303. package/vue/chunks/UiTextarea.js +21 -26
  304. package/vue/chunks/UiToastRegion.js +38 -72
  305. package/vue/chunks/UiTooltip.js +34 -35
  306. package/vue/chunks/UiTopBar.js +1 -1
  307. package/vue/chunks/UiTree.js +20 -15
  308. package/vue/chunks/UiTreeItem.js +85 -102
  309. package/vue/components.css +3994 -3801
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;