@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
@@ -1,167 +1,183 @@
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-avatar-group/ui-avatar-group.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-avatar-group/ui-avatar-group.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
- n: (v: unknown): number | undefined => typeof v === "number" && v === v ? v : undefined,
11
- text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
12
- 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),
13
- enumerated: (v: unknown): any => typeof v === "boolean" ? String(v) : hn.attr(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;
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ label?: string
19
+ max?: number
20
+ }>(),
21
+ {
22
+ label: 'People',
23
+ max: 5,
30
24
  },
31
- };
25
+ )
32
26
 
33
- const props = withDefaults(defineProps<{
34
- label?: string | null;
35
- max?: number | null;
36
- }>(), {
37
- label: "People",
38
- max: 5,
39
- });
40
- const root = ref<HTMLElement | null>(null);
41
- const refs: Record<string, Element | undefined> = {};
42
- const state_overflowCount = ref<any>(0);
27
+ const root = ref<HTMLElement | null>(null)
28
+ const overflowElement = useTemplateRef<HTMLElement>('overflow')
29
+ const overflowCount = ref(0)
43
30
 
44
31
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
45
- const dispatch = (name: string, detail?: unknown): boolean => {
46
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail })) ?? true;
47
- };
32
+ function dispatch(name: string, detail?: unknown): boolean {
33
+ return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
34
+ ?? true
35
+ }
48
36
 
49
37
  function read(name: string): unknown {
50
- if (name === "overflowCount") return state_overflowCount.value;
51
- return (props as Record<string, unknown>)[name];
38
+ if (name === 'overflowCount') return overflowCount.value
39
+ return (props as Record<string, unknown>)[name]
52
40
  }
53
41
 
54
42
  function write(name: string, value: unknown): boolean {
55
- if (name === "overflowCount") { state_overflowCount.value = value; return true; }
56
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
43
+ if (name === 'overflowCount') {
44
+ overflowCount.value = value as never
45
+ return true
46
+ }
47
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
57
48
  }
58
49
 
59
- const stops: Array<() => void> = [];
50
+ const stops: Array<() => void> = []
60
51
  const host = {
61
- get element(): Element { return root.value as Element; },
52
+ get element(): Element {
53
+ return root.value as Element
54
+ },
62
55
  state: new Proxy({} as Record<string, unknown>, {
63
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
64
- set: (_target, name, value) => typeof name === "string" && write(name, value),
56
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
57
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
65
58
  }),
66
- refs: refs as Readonly<Record<string, Element>>,
59
+ refs: {
60
+ get overflow(): Element {
61
+ return overflowElement.value as Element
62
+ },
63
+ } as Readonly<Record<string, Element>>,
67
64
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
68
65
  get: (_target, name) => {
69
- if (typeof name !== "string" || root.value === null) return undefined;
70
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
71
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
66
+ if (typeof name !== 'string' || root.value === null) return undefined
67
+ const form = root.value instanceof HTMLFormElement
68
+ ? root.value
69
+ : root.value.querySelector('form')
70
+ return form?.elements.namedItem(name)
71
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
72
72
  },
73
73
  }),
74
74
  signal<T>(initialValue: T) {
75
- const value = shallowRef(initialValue);
75
+ const value = shallowRef(initialValue)
76
76
  return {
77
77
  get: (): T => value.value,
78
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
79
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
80
- };
78
+ set: (next: T): void => {
79
+ if (!Object.is(value.value, next)) value.value = next
80
+ },
81
+ update: (next: (current: T) => T): void => {
82
+ const updated = next(value.value)
83
+ if (!Object.is(value.value, updated)) value.value = updated
84
+ },
85
+ }
81
86
  },
82
87
  computed<T>(compute: () => T) {
83
- const value = computed(compute);
84
- return { get: (): T => value.value };
88
+ const value = computed(compute)
89
+ return { get: (): T => value.value }
85
90
  },
86
91
  effect(run: () => void | (() => void)): () => void {
87
92
  const stop = watchEffect((onCleanup) => {
88
- const cleanup = run();
89
- if (typeof cleanup === "function") onCleanup(cleanup);
90
- }, { flush: "post" });
91
- stops.push(stop);
92
- return stop;
93
+ const cleanup = run()
94
+ if (typeof cleanup === 'function') onCleanup(cleanup)
95
+ }, { flush: 'post' })
96
+ stops.push(stop)
97
+ return stop
93
98
  },
94
99
  on(event: string, listener: EventListener): () => void {
95
- const element = root.value;
96
- element?.addEventListener(event, listener);
97
- const off = (): void => element?.removeEventListener(event, listener);
98
- stops.push(off);
99
- return off;
100
+ const element = root.value
101
+ element?.addEventListener(event, listener)
102
+ const off = (): void => element?.removeEventListener(event, listener)
103
+ stops.push(off)
104
+ return off
100
105
  },
101
106
  dispatch,
102
- };
107
+ }
103
108
 
104
- let cleanup: void | (() => void);
105
- let ready: Promise<void> | undefined;
109
+ let cleanup: void | (() => void)
110
+ let ready: Promise<void> | undefined
106
111
  onMounted(() => {
107
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
108
- });
112
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
113
+ cleanup = result
114
+ })
115
+ })
109
116
  onBeforeUnmount(() => {
110
- for (const stop of stops.splice(0)) stop();
111
- if (typeof cleanup === "function") cleanup();
112
- });
117
+ for (const stop of stops.splice(0)) stop()
118
+ if (typeof cleanup === 'function') cleanup()
119
+ })
113
120
  </script>
114
121
 
115
122
  <template>
116
- <div data-component="ui-avatar-group" role="group" v-bind="$attrs" :aria-label="hn.enumerated(props.label)" ref="root"><slot></slot><span class="overflow" role="img" :hidden="hn.attr(!hn.t(state_overflowCount))" :aria-label="hn.enumerated(hn.call('format', '%s more', state_overflowCount))" :ref="(element) => { refs['overflow'] = element as Element }">{{ hn.text(hn.call("format", "+%s", state_overflowCount)) }}</span></div>
123
+ <div data-component="ui-avatar-group" role="group" v-bind="$attrs" :aria-label="label" ref="root">
124
+ <slot />
125
+ <span
126
+ class="overflow"
127
+ role="img"
128
+ :hidden="!overflowCount"
129
+ :aria-label="`${overflowCount} more`"
130
+ ref="overflow"
131
+ >{{ `+${overflowCount}` }}</span>
132
+ </div>
117
133
  </template>
118
134
 
119
135
  <style scoped>
120
136
  [data-component~="ui-avatar-group"] {
121
- display: flex;
122
- align-items: center;
123
- flex-direction: row;
124
- gap: 0;
125
- }
137
+ display: flex;
138
+ align-items: center;
139
+ flex-direction: row;
140
+ gap: 0;
141
+ }
126
142
 
127
- /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
128
- * component roots outside this style scope. */
129
- :slotted(*) {
130
- margin-inline-start: -0.625rem;
131
- flex-shrink: 0;
132
- border-radius: 999px;
133
- }
143
+ /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
144
+ * component roots outside this style scope. */
145
+ :slotted(*) {
146
+ margin-inline-start: -0.625rem;
147
+ flex-shrink: 0;
148
+ border-radius: 999px;
149
+ }
134
150
 
135
- :slotted(*:first-child) {
136
- margin-inline-start: 0;
137
- }
151
+ :slotted(*:first-child) {
152
+ margin-inline-start: 0;
153
+ }
138
154
 
139
- .overflow {
140
- margin-inline-start: -0.625rem;
141
- display: inline-flex;
142
- align-items: center;
143
- justify-content: center;
144
- inline-size: 2.5rem;
145
- block-size: 2.5rem;
146
- border-radius: 999px;
147
- border: 1px solid var(--ui-border-strong);
148
- background: var(--ui-surface-elevated);
149
- color: var(--ui-text-primary);
150
- box-shadow:
151
- var(--ui-avatar-group-overlap-shadow, -2px 0 5px -1px rgb(0 0 0 / 0.28)),
152
- 0 0 0 1px rgb(0 0 0 / 0.06);
153
- font: inherit;
154
- font-size: 0.75rem;
155
- font-weight: 600;
156
- flex-shrink: 0;
157
- }
155
+ .overflow {
156
+ margin-inline-start: -0.625rem;
157
+ display: inline-flex;
158
+ align-items: center;
159
+ justify-content: center;
160
+ inline-size: 2.5rem;
161
+ block-size: 2.5rem;
162
+ border-radius: 999px;
163
+ border: 1px solid var(--ui-border-strong);
164
+ background: var(--ui-surface-elevated);
165
+ color: var(--ui-text-primary);
166
+ box-shadow:
167
+ var(--ui-avatar-group-overlap-shadow, -2px 0 5px -1px rgb(0 0 0 / 0.28)),
168
+ 0 0 0 1px rgb(0 0 0 / 0.06);
169
+ font: inherit;
170
+ font-size: 0.75rem;
171
+ font-weight: 600;
172
+ flex-shrink: 0;
173
+ }
158
174
 
159
- .overflow[hidden] {
160
- display: none;
161
- }
175
+ .overflow[hidden] {
176
+ display: none;
177
+ }
162
178
 
163
- /* A component that sets its display still honours the hidden attribute on its root. */
164
- [data-component~="ui-avatar-group"][hidden] {
165
- display: none;
166
- }
179
+ /* A component that sets its display still honours the hidden attribute on its root. */
180
+ [data-component~="ui-avatar-group"][hidden] {
181
+ display: none;
182
+ }
167
183
  </style>
package/vue/UiBadge.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  type __VLS_Props = {
2
- tone?: "neutral" | "accent" | "info" | "success" | "warning" | "danger" | null;
3
- variant?: "solid" | "subtle" | null;
2
+ tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
3
+ variant?: 'solid' | 'subtle';
4
4
  };
5
5
  declare var __VLS_1: {};
6
6
  type __VLS_Slots = {} & {
7
7
  default?: (props: typeof __VLS_1) => any;
8
8
  };
9
9
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
10
- tone: "neutral" | "accent" | "info" | "success" | "warning" | "danger" | null;
11
- variant: "solid" | "subtle" | null;
10
+ tone: "neutral" | "accent" | "info" | "success" | "warning" | "danger";
11
+ variant: "solid" | "subtle";
12
12
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
13
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
14
14
  declare const _default: typeof __VLS_export;
package/vue/UiBadge.vue CHANGED
@@ -1,123 +1,122 @@
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 } from "vue";
4
-
5
- defineOptions({ inheritAttrs: false });
6
-
7
- const hn = {
8
- 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),
9
- };
10
-
11
- const props = withDefaults(defineProps<{
12
- tone?: "neutral" | "accent" | "info" | "success" | "warning" | "danger" | null;
13
- variant?: "solid" | "subtle" | null;
14
- }>(), {
15
- tone: "neutral",
16
- variant: "subtle",
17
- });
18
-
19
- /** The resolved values the styles' :host-state() rules test. */
20
- const hostState = computed(() => (["tone","variant"] as const).flatMap((name) => {
21
- const value = read(name);
22
- const tokens: string[] = hn.t(value) ? [name] : [];
23
- if (typeof value === "string" || typeof value === "number") tokens.push(`${name}=${encodeURIComponent(String(value))}`);
24
- return tokens;
25
- }).join(" "));
26
-
27
- function read(name: string): unknown {
28
- return (props as Record<string, unknown>)[name];
29
- }
30
-
3
+ import { computed } from 'vue'
4
+
5
+ defineOptions({ inheritAttrs: false })
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger'
10
+ variant?: 'solid' | 'subtle'
11
+ }>(),
12
+ {
13
+ tone: 'neutral',
14
+ variant: 'subtle',
15
+ },
16
+ )
17
+
18
+ /** The values the styles' :host-state() rules test. */
19
+ const hostState = computed(() =>
20
+ [
21
+ props.tone && `tone tone=${props.tone}`,
22
+ props.variant && `variant variant=${props.variant}`,
23
+ ].filter(Boolean).join(' ')
24
+ )
31
25
  </script>
32
26
 
33
27
  <template>
34
- <span data-component="ui-badge" v-bind="$attrs" :data-ui-badge-state="hostState || undefined"><slot></slot></span>
28
+ <span
29
+ data-component="ui-badge"
30
+ v-bind="$attrs"
31
+ :data-ui-badge-state="hostState || undefined"
32
+ ><slot /></span>
35
33
  </template>
36
34
 
37
35
  <style scoped>
38
36
  [data-component~="ui-badge"] {
39
- --_badge-surface: var(--ui-surface-subtle);
40
- --_badge-text: var(--ui-text-secondary);
41
- --_badge-border: color-mix(in srgb, var(--ui-text-secondary) 30%, transparent);
42
-
43
- display: inline-flex;
44
- align-items: center;
45
- justify-content: center;
46
- max-width: 100%;
47
- padding: var(--ui-badge-padding-block, var(--ui-space-0-5)) var(--ui-badge-padding-inline, var(--ui-space-2));
48
- border: 1px solid var(--ui-badge-border, var(--_badge-border));
49
- border-radius: var(--ui-radius-round);
50
- background: var(--ui-badge-surface, var(--_badge-surface));
51
- color: var(--ui-badge-text, var(--_badge-text));
52
- font-family: var(--ui-font-family-sans);
53
- font-size: var(--ui-badge-font-size, var(--ui-font-size-sm));
54
- font-weight: var(--ui-badge-font-weight, var(--ui-font-medium));
55
- line-height: var(--ui-badge-line-height, var(--ui-line-height-tight));
56
- white-space: nowrap;
57
- }
58
-
59
- [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"] {
60
- --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
61
- --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
62
- --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
63
- }
64
-
65
- [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"] {
66
- --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
67
- --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
68
- --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
69
- }
70
-
71
- [data-component~="ui-badge"][data-ui-badge-state~="tone=success"] {
72
- --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
73
- --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
74
- --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
75
- }
76
-
77
- [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"] {
78
- --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
79
- --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
80
- --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
81
- }
82
-
83
- [data-component~="ui-badge"][data-ui-badge-state~="tone=info"] {
84
- --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
85
- --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
86
- --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
87
- }
88
-
89
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"] {
90
- --_badge-surface: var(--ui-accent-soft);
91
- --_badge-border: var(--ui-accent-soft);
92
- --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
93
- }
94
-
95
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"] {
96
- --_badge-surface: var(--ui-danger-soft);
97
- --_badge-border: var(--ui-danger-soft);
98
- --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
99
- }
100
-
101
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"] {
102
- --_badge-surface: var(--ui-success-soft);
103
- --_badge-border: var(--ui-success-soft);
104
- --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
105
- }
106
-
107
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"] {
108
- --_badge-surface: var(--ui-warning-soft);
109
- --_badge-border: var(--ui-warning-soft);
110
- --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
111
- }
112
-
113
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"] {
114
- --_badge-surface: var(--ui-info-soft);
115
- --_badge-border: var(--ui-info-soft);
116
- --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
117
- }
118
-
119
- /* A component that sets its display still honours the hidden attribute on its root. */
120
- [data-component~="ui-badge"][hidden] {
121
- display: none;
122
- }
37
+ --_badge-surface: var(--ui-surface-subtle);
38
+ --_badge-text: var(--ui-text-secondary);
39
+ --_badge-border: color-mix(in srgb, var(--ui-text-secondary) 30%, transparent);
40
+
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ max-width: 100%;
45
+ padding: var(--ui-badge-padding-block, var(--ui-space-0-5))
46
+ var(--ui-badge-padding-inline, var(--ui-space-2));
47
+ border: 1px solid var(--ui-badge-border, var(--_badge-border));
48
+ border-radius: var(--ui-radius-round);
49
+ background: var(--ui-badge-surface, var(--_badge-surface));
50
+ color: var(--ui-badge-text, var(--_badge-text));
51
+ font-family: var(--ui-font-family-sans);
52
+ font-size: var(--ui-badge-font-size, var(--ui-font-size-sm));
53
+ font-weight: var(--ui-badge-font-weight, var(--ui-font-medium));
54
+ line-height: var(--ui-badge-line-height, var(--ui-line-height-tight));
55
+ white-space: nowrap;
56
+ }
57
+
58
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"] {
59
+ --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
60
+ --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
61
+ --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
62
+ }
63
+
64
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"] {
65
+ --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
66
+ --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
67
+ --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
68
+ }
69
+
70
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=success"] {
71
+ --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
72
+ --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
73
+ --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
74
+ }
75
+
76
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"] {
77
+ --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
78
+ --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
79
+ --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
80
+ }
81
+
82
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=info"] {
83
+ --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
84
+ --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
85
+ --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
86
+ }
87
+
88
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"] {
89
+ --_badge-surface: var(--ui-accent-soft);
90
+ --_badge-border: var(--ui-accent-soft);
91
+ --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
92
+ }
93
+
94
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"] {
95
+ --_badge-surface: var(--ui-danger-soft);
96
+ --_badge-border: var(--ui-danger-soft);
97
+ --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
98
+ }
99
+
100
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"] {
101
+ --_badge-surface: var(--ui-success-soft);
102
+ --_badge-border: var(--ui-success-soft);
103
+ --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
104
+ }
105
+
106
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"] {
107
+ --_badge-surface: var(--ui-warning-soft);
108
+ --_badge-border: var(--ui-warning-soft);
109
+ --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
110
+ }
111
+
112
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"] {
113
+ --_badge-surface: var(--ui-info-soft);
114
+ --_badge-border: var(--ui-info-soft);
115
+ --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
116
+ }
117
+
118
+ /* A component that sets its display still honours the hidden attribute on its root. */
119
+ [data-component~="ui-badge"][hidden] {
120
+ display: none;
121
+ }
123
122
  </style>
package/vue/UiButton.d.ts CHANGED
@@ -1,16 +1,20 @@
1
1
  type __VLS_Props = {
2
- disabled?: boolean | null;
3
- size?: "sm" | "md" | "lg" | null;
4
- variant?: "outline" | "solid" | "danger" | "ghost" | "link" | null;
2
+ align?: 'center' | 'start';
3
+ disabled?: boolean;
4
+ size?: 'sm' | 'md' | 'lg';
5
+ stretch?: boolean;
6
+ variant?: 'outline' | 'solid' | 'danger' | 'ghost' | 'link';
5
7
  };
6
8
  declare var __VLS_1: {};
7
9
  type __VLS_Slots = {} & {
8
10
  default?: (props: typeof __VLS_1) => any;
9
11
  };
10
12
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
- variant: "outline" | "solid" | "danger" | "ghost" | "link" | null;
12
- disabled: boolean | null;
13
- size: "sm" | "md" | "lg" | null;
13
+ variant: "outline" | "solid" | "danger" | "ghost" | "link";
14
+ align: "center" | "start";
15
+ disabled: boolean;
16
+ size: "sm" | "md" | "lg";
17
+ stretch: boolean;
14
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
19
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
16
20
  declare const _default: typeof __VLS_export;