@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
@@ -1,256 +1,319 @@
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 UiIconButton from "./UiIconButton.vue";
5
- import * as controllerModule from "../components/ui-toast-region/ui-toast-region.js";
3
+ import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
4
+ import * as controllerModule from '../components/ui-toast-region/ui-toast-region.js'
5
+ import UiIconButton from './UiIconButton.vue'
6
6
 
7
- defineOptions({ inheritAttrs: false });
7
+ defineOptions({ inheritAttrs: false })
8
8
 
9
- const hn = {
10
- 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),
11
- n: (v: unknown): number | undefined => typeof v === "number" && v === v ? v : undefined,
12
- text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
13
- 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),
14
- call: (fn: string, ...args: unknown[]): any => {
15
- if (fn === "format") {
16
- let index = 1;
17
- return typeof args[0] === "string" ? args[0].replace(/%s/g, () => index < args.length ? hn.text(args[index++]) : "%s") : undefined;
18
- }
19
- const n = args.map(hn.n);
20
- if (n.some((value) => value === undefined)) return undefined;
21
- const v = n as number[];
22
- switch (fn) {
23
- case "abs": return v.length === 1 ? Math.abs(v[0]!) : undefined;
24
- case "round": return v.length === 1 ? Math.round(v[0]!) : undefined;
25
- case "min": return v.length > 0 ? Math.min(...v) : undefined;
26
- case "max": return v.length > 0 ? Math.max(...v) : undefined;
27
- case "clamp": return v.length === 3 ? Math.min(Math.max(v[0]!, v[1]!), v[2]!) : undefined;
28
- }
29
- return undefined;
30
- },
31
- shape: (items: unknown, where: ((item: any) => unknown) | undefined, sort: readonly string[], limit: unknown): any[] => {
32
- let list = Array.isArray(items) ? items.slice() : [];
33
- if (where !== undefined) list = list.filter((item) => hn.t(where(item)));
34
- if (sort.length > 0) {
35
- const field = (item: unknown, path: string): unknown => item !== null && typeof item === "object" && !Array.isArray(item)
36
- ? path.split(".").reduce<unknown>((value, key) => (value as Record<string, unknown> | undefined)?.[key], item)
37
- : item;
38
- const compare = (a: unknown, b: unknown): number => typeof a === "number" && typeof b === "number" ? a - b : hn.text(a).localeCompare(hn.text(b));
39
- list.sort((a, b) => {
40
- for (const key of sort) {
41
- const descending = key.startsWith("-");
42
- const order = compare(field(a, descending ? key.slice(1) : key), field(b, descending ? key.slice(1) : key));
43
- if (order !== 0) return descending ? -order : order;
44
- }
45
- return 0;
46
- });
47
- }
48
- return typeof limit === "number" ? list.slice(0, Math.max(0, Math.trunc(limit))) : list;
9
+ const props = withDefaults(
10
+ defineProps<{
11
+ auto?: boolean
12
+ duration?: number
13
+ message?: string
14
+ open?: boolean
15
+ }>(),
16
+ {
17
+ auto: false,
18
+ duration: 5000,
19
+ message: 'Notification',
20
+ open: false,
49
21
  },
50
- };
51
-
52
- const props = withDefaults(defineProps<{
53
- auto?: boolean | null;
54
- duration?: number | null;
55
- message?: string | null;
56
- open?: boolean | null;
57
- }>(), {
58
- auto: false,
59
- duration: 5000,
60
- message: "Notification",
61
- open: false,
62
- });
22
+ )
63
23
  const emit = defineEmits<{
64
- "close": [detail: { readonly open: boolean; readonly reason: "action" | "timeout" | "programmatic" | "light-dismiss" | "escape"; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
65
- "dismiss": [detail: { readonly id: string; readonly reason: "action" | "timeout"; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
66
- }>();
67
- const root = ref<HTMLElement | null>(null);
68
- const refs: Record<string, Element | undefined> = {};
69
- const state_internalOpen = ref<any>(false);
70
- const state_toasts = ref<any>([]);
24
+ 'update:open': [value: boolean]
25
+ close: [
26
+ detail: {
27
+ readonly open: boolean
28
+ readonly reason: 'action' | 'timeout' | 'programmatic' | 'light-dismiss' | 'escape'
29
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
30
+ },
31
+ ]
32
+ dismiss: [
33
+ detail: {
34
+ readonly id: string
35
+ readonly reason: 'action' | 'timeout'
36
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
37
+ },
38
+ ]
39
+ }>()
40
+
41
+ const root = ref<HTMLElement | null>(null)
42
+ const internalOpen = ref(false)
43
+ const toasts = ref<{ id: string; message: string; role: 'alert' | 'status'; closing: boolean }[]>(
44
+ [],
45
+ )
71
46
 
72
47
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
73
- const dispatch = (name: string, detail?: unknown): boolean => {
74
- const declared = {"close":{"bubbles":true,"composed":true,"cancelable":false},"dismiss":{"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
+ dismiss: { bubbles: true, composed: true, cancelable: false },
52
+ }
75
53
  const checks: Record<string, (detail: unknown) => boolean> = {
76
- "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"] === "timeout" || (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))),
77
- "dismiss": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["id"] === "string" && ((detail as Record<string, unknown>)["reason"] === "action" || (detail as Record<string, unknown>)["reason"] === "timeout") && ((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) => ["id","reason","trigger"].includes(key))),
78
- };
54
+ close: (detail) =>
55
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
56
+ && typeof (detail as Record<string, unknown>)['open'] === 'boolean'
57
+ && ((detail as Record<string, unknown>)['reason'] === 'action'
58
+ || (detail as Record<string, unknown>)['reason'] === 'timeout'
59
+ || (detail as Record<string, unknown>)['reason'] === 'programmatic'
60
+ || (detail as Record<string, unknown>)['reason'] === 'light-dismiss'
61
+ || (detail as Record<string, unknown>)['reason'] === 'escape')
62
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
63
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
64
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
65
+ && Object.keys(detail as object).every((key) => ['open', 'reason', 'trigger'].includes(key)),
66
+ dismiss: (detail) =>
67
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
68
+ && typeof (detail as Record<string, unknown>)['id'] === 'string'
69
+ && ((detail as Record<string, unknown>)['reason'] === 'action'
70
+ || (detail as Record<string, unknown>)['reason'] === 'timeout')
71
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
72
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
73
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
74
+ && Object.keys(detail as object).every((key) => ['id', 'reason', 'trigger'].includes(key)),
75
+ }
79
76
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
80
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
77
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
78
+ }
79
+ const emitEvent = emit as (name: string, detail: unknown) => void
80
+ emitEvent(name, detail)
81
+ if (detail !== null && typeof detail === 'object' && 'open' in detail) {
82
+ emitEvent('update:open', (detail as Record<string, unknown>)['open'])
81
83
  }
82
- (emit as (name: string, detail: unknown) => void)(name, detail);
83
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
84
- };
84
+ return root.value?.dispatchEvent(
85
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
86
+ ) ?? true
87
+ }
85
88
 
86
89
  function read(name: string): unknown {
87
- if (name === "internalOpen") return state_internalOpen.value;
88
- if (name === "toasts") return state_toasts.value;
89
- return (props as Record<string, unknown>)[name];
90
+ if (name === 'internalOpen') return internalOpen.value
91
+ if (name === 'toasts') return toasts.value
92
+ return (props as Record<string, unknown>)[name]
90
93
  }
91
94
 
92
95
  function write(name: string, value: unknown): boolean {
93
- if (name === "internalOpen") { state_internalOpen.value = value; return true; }
94
- if (name === "toasts") { state_toasts.value = value; return true; }
95
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
96
+ if (name === 'internalOpen') {
97
+ internalOpen.value = value as never
98
+ return true
99
+ }
100
+ if (name === 'toasts') {
101
+ toasts.value = value as never
102
+ return true
103
+ }
104
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
96
105
  }
97
106
 
98
- const stops: Array<() => void> = [];
107
+ const stops: Array<() => void> = []
99
108
  const host = {
100
- get element(): Element { return root.value as Element; },
109
+ get element(): Element {
110
+ return root.value as Element
111
+ },
101
112
  state: new Proxy({} as Record<string, unknown>, {
102
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
103
- set: (_target, name, value) => typeof name === "string" && write(name, value),
113
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
114
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
104
115
  }),
105
- refs: refs as Readonly<Record<string, Element>>,
116
+ refs: {} as Readonly<Record<string, Element>>,
106
117
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
107
118
  get: (_target, name) => {
108
- if (typeof name !== "string" || root.value === null) return undefined;
109
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
110
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
119
+ if (typeof name !== 'string' || root.value === null) return undefined
120
+ const form = root.value instanceof HTMLFormElement
121
+ ? root.value
122
+ : root.value.querySelector('form')
123
+ return form?.elements.namedItem(name)
124
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
111
125
  },
112
126
  }),
113
127
  signal<T>(initialValue: T) {
114
- const value = shallowRef(initialValue);
128
+ const value = shallowRef(initialValue)
115
129
  return {
116
130
  get: (): T => value.value,
117
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
118
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
119
- };
131
+ set: (next: T): void => {
132
+ if (!Object.is(value.value, next)) value.value = next
133
+ },
134
+ update: (next: (current: T) => T): void => {
135
+ const updated = next(value.value)
136
+ if (!Object.is(value.value, updated)) value.value = updated
137
+ },
138
+ }
120
139
  },
121
140
  computed<T>(compute: () => T) {
122
- const value = computed(compute);
123
- return { get: (): T => value.value };
141
+ const value = computed(compute)
142
+ return { get: (): T => value.value }
124
143
  },
125
144
  effect(run: () => void | (() => void)): () => void {
126
145
  const stop = watchEffect((onCleanup) => {
127
- const cleanup = run();
128
- if (typeof cleanup === "function") onCleanup(cleanup);
129
- }, { flush: "post" });
130
- stops.push(stop);
131
- return stop;
146
+ const cleanup = run()
147
+ if (typeof cleanup === 'function') onCleanup(cleanup)
148
+ }, { flush: 'post' })
149
+ stops.push(stop)
150
+ return stop
132
151
  },
133
152
  on(event: string, listener: EventListener): () => void {
134
- const element = root.value;
135
- element?.addEventListener(event, listener);
136
- const off = (): void => element?.removeEventListener(event, listener);
137
- stops.push(off);
138
- return off;
153
+ const element = root.value
154
+ element?.addEventListener(event, listener)
155
+ const off = (): void => element?.removeEventListener(event, listener)
156
+ stops.push(off)
157
+ return off
139
158
  },
140
159
  dispatch,
141
- };
160
+ }
142
161
 
143
- let cleanup: void | (() => void);
144
- let ready: Promise<void> | undefined;
162
+ let cleanup: void | (() => void)
163
+ let ready: Promise<void> | undefined
145
164
  onMounted(() => {
146
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
147
- });
165
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
166
+ cleanup = result
167
+ })
168
+ })
148
169
  onBeforeUnmount(() => {
149
- for (const stop of stops.splice(0)) stop();
150
- if (typeof cleanup === "function") cleanup();
151
- });
170
+ for (const stop of stops.splice(0)) stop()
171
+ if (typeof cleanup === 'function') cleanup()
172
+ })
152
173
  defineExpose({
153
- show: async (...args: unknown[]) => { await ready; return (controllerModule as Record<string, (...values: unknown[]) => unknown>)["show"]!(host, ...args); },
154
- });
174
+ show: async (...args: unknown[]) => {
175
+ await ready
176
+ return (controllerModule as Record<string, (...values: unknown[]) => unknown>)['show']!(
177
+ host,
178
+ ...args,
179
+ )
180
+ },
181
+ })
155
182
  </script>
156
183
 
157
184
  <template>
158
- <div data-component="ui-toast-region" role="region" aria-label="Notifications" aria-live="polite" popover="manual" v-bind="$attrs" ref="root"><slot></slot><template v-for="(toast, index) in hn.shape(state_toasts, undefined, [], undefined)" :key="(toast)?.id"><div class="toast" :id="hn.attr((toast)?.id)" :role="hn.attr((toast)?.role)" :class="{ 'closing': hn.t((toast)?.closing) }"><span class="message">{{ hn.text((toast)?.message) }}</span><span class="dismiss" :data-toast="hn.attr((toast)?.id)"><UiIconButton size="sm" variant="ghost" :round="true" :label="hn.call('format', 'Dismiss %s', (toast)?.message)"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"></path></svg></UiIconButton></span></div></template></div>
185
+ <div
186
+ data-component="ui-toast-region"
187
+ role="region"
188
+ aria-label="Notifications"
189
+ aria-live="polite"
190
+ popover="manual"
191
+ v-bind="$attrs"
192
+ ref="root"
193
+ >
194
+ <slot />
195
+ <div
196
+ v-for="toast in toasts"
197
+ :key="toast.id"
198
+ class="toast"
199
+ :id="toast.id"
200
+ :role="toast.role"
201
+ :class="{ closing: toast.closing }"
202
+ >
203
+ <span class="message">{{ toast.message }}</span>
204
+ <span class="dismiss" :data-toast="toast.id"><UiIconButton
205
+ size="sm"
206
+ variant="ghost"
207
+ :round="true"
208
+ :label="`Dismiss ${toast.message}`"
209
+ ><svg
210
+ viewBox="0 0 24 24"
211
+ fill="none"
212
+ stroke="currentColor"
213
+ stroke-width="2"
214
+ stroke-linecap="round"
215
+ aria-hidden="true"
216
+ >
217
+ <path d="M18 6 6 18M6 6l12 12"></path>
218
+ </svg></UiIconButton></span>
219
+ </div>
220
+ </div>
159
221
  </template>
160
222
 
161
223
  <style scoped>
162
224
  [data-component~="ui-toast-region"] {
163
- position: fixed;
164
- top: calc(var(--ui-space-4) + env(safe-area-inset-top));
165
- right: auto;
166
- bottom: auto;
167
- left: 50%;
168
- transform: translateX(-50%);
169
- z-index: 9999;
170
- display: grid;
171
- gap: var(--ui-space-2);
172
- inline-size: min(24rem, calc(100vw - var(--ui-space-4) * 2));
173
- max-inline-size: 100%;
174
- box-sizing: border-box;
175
- margin: 0;
176
- padding: 0;
177
- overflow: visible;
178
- border: 0;
179
- outline: 0;
180
- background: transparent;
181
- box-shadow: none;
182
- pointer-events: none;
183
- }
225
+ position: fixed;
226
+ top: calc(var(--ui-space-4) + env(safe-area-inset-top));
227
+ right: auto;
228
+ bottom: auto;
229
+ left: 50%;
230
+ transform: translateX(-50%);
231
+ z-index: 9999;
232
+ display: grid;
233
+ gap: var(--ui-space-2);
234
+ inline-size: min(24rem, calc(100vw - var(--ui-space-4) * 2));
235
+ max-inline-size: 100%;
236
+ box-sizing: border-box;
237
+ margin: 0;
238
+ padding: 0;
239
+ overflow: visible;
240
+ border: 0;
241
+ outline: 0;
242
+ background: transparent;
243
+ box-shadow: none;
244
+ pointer-events: none;
245
+ }
184
246
 
185
- [data-component~="ui-toast-region"]:not(:popover-open) {
186
- display: none;
187
- }
247
+ [data-component~="ui-toast-region"]:not(:popover-open) {
248
+ display: none;
249
+ }
188
250
 
189
- [data-component~="ui-toast-region"] > .toast,
190
- [data-component~="ui-toast-region"] > :slotted(*) {
191
- pointer-events: auto;
192
- }
251
+ [data-component~="ui-toast-region"] > .toast,
252
+ [data-component~="ui-toast-region"] > :slotted(*) {
253
+ pointer-events: auto;
254
+ }
193
255
 
194
- .toast {
195
- display: grid;
196
- grid-template-columns: 1fr auto;
197
- gap: var(--ui-space-2);
198
- align-items: start;
199
- border: 1px solid var(--ui-border-default);
200
- border-radius: var(--ui-radius-3);
201
- padding: var(--ui-space-3) var(--ui-space-4);
202
- background: var(--ui-surface-elevated);
203
- color: var(--ui-text-primary);
204
- box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
205
- animation: ui-toast-enter var(--ui-toast-enter-duration, 0.32s) var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
206
- }
256
+ .toast {
257
+ display: grid;
258
+ grid-template-columns: 1fr auto;
259
+ gap: var(--ui-space-2);
260
+ align-items: start;
261
+ border: 1px solid var(--ui-border-default);
262
+ border-radius: var(--ui-radius-3);
263
+ padding: var(--ui-space-3) var(--ui-space-4);
264
+ background: var(--ui-surface-elevated);
265
+ color: var(--ui-text-primary);
266
+ box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
267
+ animation: ui-toast-enter var(--ui-toast-enter-duration, 0.32s)
268
+ var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
269
+ }
207
270
 
208
- /* Leaving slides on down and fades; the controller removes the toast when this ends. */
209
- .toast.closing {
210
- animation: ui-toast-exit var(--ui-toast-exit-duration, 0.22s) var(--ui-motion-ease, ease) both;
211
- pointer-events: none;
212
- }
271
+ /* Leaving slides on down and fades; the controller removes the toast when this ends. */
272
+ .toast.closing {
273
+ animation: ui-toast-exit var(--ui-toast-exit-duration, 0.22s) var(--ui-motion-ease, ease) both;
274
+ pointer-events: none;
275
+ }
213
276
 
214
- @keyframes ui-toast-enter {
215
- from {
216
- opacity: 0;
217
- transform: translateY(-1rem);
218
- }
219
- to {
220
- opacity: 1;
221
- transform: translateY(0);
222
- }
223
- }
277
+ @keyframes ui-toast-enter {
278
+ from {
279
+ opacity: 0;
280
+ transform: translateY(-1rem);
281
+ }
282
+ to {
283
+ opacity: 1;
284
+ transform: translateY(0);
285
+ }
286
+ }
224
287
 
225
- @keyframes ui-toast-exit {
226
- from {
227
- opacity: 1;
228
- transform: translateY(0);
229
- }
230
- to {
231
- opacity: 0;
232
- transform: translateY(0.75rem);
233
- }
234
- }
288
+ @keyframes ui-toast-exit {
289
+ from {
290
+ opacity: 1;
291
+ transform: translateY(0);
292
+ }
293
+ to {
294
+ opacity: 0;
295
+ transform: translateY(0.75rem);
296
+ }
297
+ }
235
298
 
236
- @media (prefers-reduced-motion: reduce) {
237
- .toast, .toast.closing {
238
- animation: none;
239
- }
240
- }
299
+ @media (prefers-reduced-motion: reduce) {
300
+ .toast, .toast.closing {
301
+ animation: none;
302
+ }
303
+ }
241
304
 
242
- .message {
243
- min-inline-size: 0;
244
- align-self: center;
245
- }
305
+ .message {
306
+ min-inline-size: 0;
307
+ align-self: center;
308
+ }
246
309
 
247
- .dismiss {
248
- align-self: center;
249
- margin-inline-end: calc(var(--ui-space-2) * -1);
250
- }
310
+ .dismiss {
311
+ align-self: center;
312
+ margin-inline-end: calc(var(--ui-space-2) * -1);
313
+ }
251
314
 
252
- /* A component that sets its display still honours the hidden attribute on its root. */
253
- [data-component~="ui-toast-region"][hidden] {
254
- display: none;
255
- }
315
+ /* A component that sets its display still honours the hidden attribute on its root. */
316
+ [data-component~="ui-toast-region"][hidden] {
317
+ display: none;
318
+ }
256
319
  </style>
@@ -1,10 +1,10 @@
1
1
  type __VLS_Props = {
2
- for?: string | null;
3
- hideDelay?: number | null;
4
- inverse?: boolean | null;
5
- open?: boolean | null;
6
- placement?: string | null;
7
- showDelay?: number | null;
2
+ for?: string;
3
+ hideDelay?: number;
4
+ inverse?: boolean;
5
+ open?: boolean;
6
+ placement?: string;
7
+ showDelay?: number;
8
8
  };
9
9
  declare var __VLS_1: {};
10
10
  type __VLS_Slots = {} & {
@@ -21,6 +21,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
21
21
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
22
22
  readonly trigger: "keyboard" | "pointer" | "programmatic";
23
23
  }) => any;
24
+ "update:open": (value: boolean) => any;
24
25
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
25
26
  onClose?: ((detail: {
26
27
  readonly open: boolean;
@@ -32,13 +33,14 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
32
33
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
33
34
  readonly trigger: "keyboard" | "pointer" | "programmatic";
34
35
  }) => any) | undefined;
36
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
35
37
  }>, {
36
- for: string | null;
37
- hideDelay: number | null;
38
- inverse: boolean | null;
39
- open: boolean | null;
40
- placement: string | null;
41
- showDelay: number | null;
38
+ for: string;
39
+ hideDelay: number;
40
+ inverse: boolean;
41
+ open: boolean;
42
+ placement: string;
43
+ showDelay: number;
42
44
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
43
45
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
44
46
  declare const _default: typeof __VLS_export;