@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/UiTabs.vue CHANGED
@@ -1,269 +1,310 @@
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-tabs/ui-tabs.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-tabs/ui-tabs.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;
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;
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ label?: string
19
+ orientation?: 'horizontal' | 'vertical'
20
+ stretch?: boolean
21
+ value?: string
22
+ }>(),
23
+ {
24
+ label: 'Tabs',
25
+ orientation: 'horizontal',
26
+ stretch: false,
27
+ value: '',
49
28
  },
50
- };
51
-
52
- const props = withDefaults(defineProps<{
53
- label?: string | null;
54
- orientation?: "horizontal" | "vertical" | null;
55
- stretch?: boolean | null;
56
- value?: string | null;
57
- }>(), {
58
- label: "Tabs",
59
- orientation: "horizontal",
60
- stretch: false,
61
- value: "",
62
- });
29
+ )
63
30
  const emit = defineEmits<{
64
- "select": [detail: { readonly value: string; readonly previousValue: string; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
65
- }>();
66
- const root = ref<HTMLElement | null>(null);
67
- const refs: Record<string, Element | undefined> = {};
68
- const state_internalValue = ref<any>("");
69
- const state_tabs = ref<any>([]);
31
+ 'update:value': [value: string]
32
+ select: [
33
+ detail: {
34
+ readonly value: string
35
+ readonly previousValue: string
36
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
37
+ },
38
+ ]
39
+ }>()
40
+
41
+ const root = ref<HTMLElement | null>(null)
42
+ const listElement = useTemplateRef<HTMLElement>('list')
43
+ const panelsElement = useTemplateRef<HTMLElement>('panels')
44
+ const internalValue = ref('')
45
+ const tabs = ref<{ id: string; label: string }[]>([])
46
+
47
+ /** The values the styles' :host-state() rules test. */
48
+ const hostState = computed(() =>
49
+ [
50
+ props.stretch && 'stretch',
51
+ props.orientation && `orientation orientation=${props.orientation}`,
52
+ ].filter(Boolean).join(' ')
53
+ )
70
54
 
71
55
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
72
- const dispatch = (name: string, detail?: unknown): boolean => {
73
- const declared = {"select":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
56
+ function dispatch(name: string, detail?: unknown): boolean {
57
+ const declared: Record<string, EventInit | undefined> = {
58
+ select: { bubbles: true, composed: true, cancelable: false },
59
+ }
74
60
  const checks: Record<string, (detail: unknown) => boolean> = {
75
- "select": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["value"] === "string" && typeof (detail as Record<string, unknown>)["previousValue"] === "string" && ((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) => ["value","previousValue","trigger"].includes(key))),
76
- };
61
+ select: (detail) =>
62
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
63
+ && typeof (detail as Record<string, unknown>)['value'] === 'string'
64
+ && typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
65
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
66
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
67
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
68
+ && Object.keys(detail as object).every((key) =>
69
+ ['value', 'previousValue', 'trigger'].includes(key)
70
+ ),
71
+ }
77
72
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
78
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
73
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
79
74
  }
80
- (emit as (name: string, detail: unknown) => void)(name, detail);
81
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
82
- };
83
-
84
- /** The resolved values the styles' :host-state() rules test. */
85
- const hostState = computed(() => (["stretch","orientation"] as const).flatMap((name) => {
86
- const value = read(name);
87
- const tokens: string[] = hn.t(value) ? [name] : [];
88
- if (typeof value === "string" || typeof value === "number") tokens.push(`${name}=${encodeURIComponent(String(value))}`);
89
- return tokens;
90
- }).join(" "));
75
+ const emitEvent = emit as (name: string, detail: unknown) => void
76
+ emitEvent(name, detail)
77
+ if (detail !== null && typeof detail === 'object' && 'value' in detail) {
78
+ emitEvent('update:value', (detail as Record<string, unknown>)['value'])
79
+ }
80
+ return root.value?.dispatchEvent(
81
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
82
+ ) ?? true
83
+ }
91
84
 
92
85
  function read(name: string): unknown {
93
- if (name === "internalValue") return state_internalValue.value;
94
- if (name === "tabs") return state_tabs.value;
95
- return (props as Record<string, unknown>)[name];
86
+ if (name === 'internalValue') return internalValue.value
87
+ if (name === 'tabs') return tabs.value
88
+ return (props as Record<string, unknown>)[name]
96
89
  }
97
90
 
98
91
  function write(name: string, value: unknown): boolean {
99
- if (name === "internalValue") { state_internalValue.value = value; return true; }
100
- if (name === "tabs") { state_tabs.value = value; return true; }
101
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
92
+ if (name === 'internalValue') {
93
+ internalValue.value = value as never
94
+ return true
95
+ }
96
+ if (name === 'tabs') {
97
+ tabs.value = value as never
98
+ return true
99
+ }
100
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
102
101
  }
103
102
 
104
- const stops: Array<() => void> = [];
103
+ const stops: Array<() => void> = []
105
104
  const host = {
106
- get element(): Element { return root.value as Element; },
105
+ get element(): Element {
106
+ return root.value as Element
107
+ },
107
108
  state: new Proxy({} as Record<string, unknown>, {
108
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
109
- set: (_target, name, value) => typeof name === "string" && write(name, value),
109
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
110
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
110
111
  }),
111
- refs: refs as Readonly<Record<string, Element>>,
112
+ refs: {
113
+ get list(): Element {
114
+ return listElement.value as Element
115
+ },
116
+ get panels(): Element {
117
+ return panelsElement.value as Element
118
+ },
119
+ } as Readonly<Record<string, Element>>,
112
120
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
113
121
  get: (_target, name) => {
114
- if (typeof name !== "string" || root.value === null) return undefined;
115
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
116
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
122
+ if (typeof name !== 'string' || root.value === null) return undefined
123
+ const form = root.value instanceof HTMLFormElement
124
+ ? root.value
125
+ : root.value.querySelector('form')
126
+ return form?.elements.namedItem(name)
127
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
117
128
  },
118
129
  }),
119
130
  signal<T>(initialValue: T) {
120
- const value = shallowRef(initialValue);
131
+ const value = shallowRef(initialValue)
121
132
  return {
122
133
  get: (): T => value.value,
123
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
124
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
125
- };
134
+ set: (next: T): void => {
135
+ if (!Object.is(value.value, next)) value.value = next
136
+ },
137
+ update: (next: (current: T) => T): void => {
138
+ const updated = next(value.value)
139
+ if (!Object.is(value.value, updated)) value.value = updated
140
+ },
141
+ }
126
142
  },
127
143
  computed<T>(compute: () => T) {
128
- const value = computed(compute);
129
- return { get: (): T => value.value };
144
+ const value = computed(compute)
145
+ return { get: (): T => value.value }
130
146
  },
131
147
  effect(run: () => void | (() => void)): () => void {
132
148
  const stop = watchEffect((onCleanup) => {
133
- const cleanup = run();
134
- if (typeof cleanup === "function") onCleanup(cleanup);
135
- }, { flush: "post" });
136
- stops.push(stop);
137
- return stop;
149
+ const cleanup = run()
150
+ if (typeof cleanup === 'function') onCleanup(cleanup)
151
+ }, { flush: 'post' })
152
+ stops.push(stop)
153
+ return stop
138
154
  },
139
155
  on(event: string, listener: EventListener): () => void {
140
- const element = root.value;
141
- element?.addEventListener(event, listener);
142
- const off = (): void => element?.removeEventListener(event, listener);
143
- stops.push(off);
144
- return off;
156
+ const element = root.value
157
+ element?.addEventListener(event, listener)
158
+ const off = (): void => element?.removeEventListener(event, listener)
159
+ stops.push(off)
160
+ return off
145
161
  },
146
162
  dispatch,
147
- };
163
+ }
148
164
 
149
- let cleanup: void | (() => void);
150
- let ready: Promise<void> | undefined;
165
+ let cleanup: void | (() => void)
166
+ let ready: Promise<void> | undefined
151
167
  onMounted(() => {
152
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
153
- });
168
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
169
+ cleanup = result
170
+ })
171
+ })
154
172
  onBeforeUnmount(() => {
155
- for (const stop of stops.splice(0)) stop();
156
- if (typeof cleanup === "function") cleanup();
157
- });
173
+ for (const stop of stops.splice(0)) stop()
174
+ if (typeof cleanup === 'function') cleanup()
175
+ })
158
176
  </script>
159
177
 
160
178
  <template>
161
- <div data-component="ui-tabs" v-bind="$attrs" :data-ui-tabs-state="hostState || undefined" ref="root"><div class="list" role="tablist" :aria-label="hn.enumerated(props.label)" :aria-orientation="hn.enumerated(props.orientation)" :ref="(element) => { refs['list'] = element as Element }"><template v-for="(tab, index) in hn.shape(state_tabs, undefined, [], undefined)" :key="(tab)?.id"><button type="button" role="tab" :id="hn.attr(hn.call('format', '%s-tab', (tab)?.id))" :value="hn.attr((tab)?.id)" :aria-controls="hn.enumerated((tab)?.id)" :aria-selected="hn.enumerated(((tab)?.id === state_internalValue))">{{ hn.text((tab)?.label) }}</button></template></div><div class="panels" :ref="(element) => { refs['panels'] = element as Element }"><slot></slot></div></div>
179
+ <div
180
+ data-component="ui-tabs"
181
+ v-bind="$attrs"
182
+ :data-ui-tabs-state="hostState || undefined"
183
+ ref="root"
184
+ >
185
+ <div class="list" role="tablist" :aria-label="label" :aria-orientation="orientation" ref="list">
186
+ <button
187
+ v-for="tab in tabs"
188
+ :key="tab.id"
189
+ type="button"
190
+ role="tab"
191
+ :id="`${tab.id}-tab`"
192
+ :value="tab.id"
193
+ :aria-controls="tab.id"
194
+ :aria-selected="tab.id === internalValue"
195
+ >
196
+ {{ tab.label }}
197
+ </button>
198
+ </div>
199
+ <div class="panels" ref="panels"><slot /></div>
200
+ </div>
162
201
  </template>
163
202
 
164
203
  <style scoped>
165
204
  [data-component~="ui-tabs"] {
166
- display: grid;
167
- inline-size: 100%;
168
- min-inline-size: 0;
169
- }
205
+ display: grid;
206
+ inline-size: 100%;
207
+ min-inline-size: 0;
208
+ }
170
209
 
171
- .list {
172
- display: grid;
173
- grid-auto-flow: column;
174
- grid-auto-columns: max-content;
175
- justify-content: start;
176
- inline-size: 100%;
177
- max-inline-size: 100%;
178
- /* Tabs that do not fit scroll sideways rather than wrapping or squeezing. */
179
- overflow-x: auto;
180
- /* overflow-x: auto would make the block axis scrollable too; a sideways swipe must not scroll the
181
- strip or the page vertically. */
182
- overflow-y: hidden;
183
- overscroll-behavior: contain;
184
- scrollbar-width: thin;
185
- border-block-end: 1px solid var(--ui-border-default);
186
- }
210
+ .list {
211
+ display: grid;
212
+ grid-auto-flow: column;
213
+ grid-auto-columns: max-content;
214
+ justify-content: start;
215
+ inline-size: 100%;
216
+ max-inline-size: 100%;
217
+ /* Tabs that do not fit scroll sideways rather than wrapping or squeezing. */
218
+ overflow-x: auto;
219
+ /* overflow-x: auto would make the block axis scrollable too; a sideways swipe must not scroll the
220
+ strip or the page vertically. */
221
+ overflow-y: hidden;
222
+ overscroll-behavior: contain;
223
+ scrollbar-width: thin;
224
+ border-block-end: 1px solid var(--ui-border-default);
225
+ }
187
226
 
188
- .list button {
189
- min-block-size: 2.5rem;
190
- margin: 0 0 -1px;
191
- padding: var(--ui-space-2) var(--ui-space-3);
192
- border: 0;
193
- border-block-end: 2px solid transparent;
194
- background: transparent;
195
- color: var(--ui-text-secondary);
196
- font: inherit;
197
- font-size: var(--ui-font-size-sm);
198
- font-weight: var(--ui-font-medium, 500);
199
- cursor: pointer;
200
- transition:
201
- color var(--ui-motion-fast) var(--ui-motion-ease),
202
- background-color var(--ui-motion-fast) var(--ui-motion-ease),
203
- border-color var(--ui-motion-fast) var(--ui-motion-ease);
204
- }
227
+ .list button {
228
+ min-block-size: 2.5rem;
229
+ margin: 0 0 -1px;
230
+ padding: var(--ui-space-2) var(--ui-space-3);
231
+ border: 0;
232
+ border-block-end: 2px solid transparent;
233
+ background: transparent;
234
+ color: var(--ui-text-secondary);
235
+ font: inherit;
236
+ font-size: var(--ui-font-size-sm);
237
+ font-weight: var(--ui-font-medium, 500);
238
+ cursor: pointer;
239
+ transition:
240
+ color var(--ui-motion-fast) var(--ui-motion-ease),
241
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
242
+ border-color var(--ui-motion-fast) var(--ui-motion-ease);
243
+ }
205
244
 
206
- [data-component~="ui-tabs"][data-ui-tabs-state~="stretch"] .list {
207
- grid-auto-columns: minmax(max-content, 1fr);
208
- }
245
+ [data-component~="ui-tabs"][data-ui-tabs-state~="stretch"] .list {
246
+ grid-auto-columns: minmax(max-content, 1fr);
247
+ }
209
248
 
210
- .list button {
211
- white-space: nowrap;
212
- }
249
+ .list button {
250
+ white-space: nowrap;
251
+ }
213
252
 
214
- .list button:hover {
215
- color: var(--ui-text-primary);
216
- background: var(--ui-surface-muted);
217
- }
218
- .list button[aria-selected="true"] {
219
- color: var(--ui-accent-solid);
220
- border-block-end-color: var(--ui-accent-solid);
221
- }
222
- .list button:focus-visible {
223
- position: relative;
224
- outline: none;
225
- box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
226
- border-radius: var(--ui-radius-1);
227
- }
253
+ .list button:hover {
254
+ color: var(--ui-text-primary);
255
+ background: var(--ui-surface-muted);
256
+ }
257
+ .list button[aria-selected="true"] {
258
+ color: var(--ui-accent-solid);
259
+ border-block-end-color: var(--ui-accent-solid);
260
+ }
261
+ .list button:focus-visible {
262
+ position: relative;
263
+ outline: none;
264
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
265
+ border-radius: var(--ui-radius-1);
266
+ }
228
267
 
229
- .panels {
230
- min-inline-size: 0;
231
- }
232
- :slotted(*) {
233
- padding: var(--ui-space-4);
234
- }
268
+ .panels {
269
+ min-inline-size: 0;
270
+ }
271
+ :slotted(*) {
272
+ padding: var(--ui-space-4);
273
+ }
235
274
 
236
- [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] {
237
- grid-template-columns: max-content minmax(0, 1fr);
238
- align-items: start;
239
- }
275
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] {
276
+ grid-template-columns: max-content minmax(0, 1fr);
277
+ align-items: start;
278
+ }
240
279
 
241
- [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list {
242
- grid-auto-flow: row;
243
- grid-auto-columns: auto;
244
- border-block-end: 0;
245
- border-inline-end: 1px solid var(--ui-border-default);
246
- }
280
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list {
281
+ grid-auto-flow: row;
282
+ grid-auto-columns: auto;
283
+ border-block-end: 0;
284
+ border-inline-end: 1px solid var(--ui-border-default);
285
+ }
247
286
 
248
- [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button {
249
- margin: 0 -1px 0 0;
250
- border-block-end: 0;
251
- border-inline-end: 2px solid transparent;
252
- text-align: start;
253
- }
287
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button {
288
+ margin: 0 -1px 0 0;
289
+ border-block-end: 0;
290
+ border-inline-end: 2px solid transparent;
291
+ text-align: start;
292
+ }
254
293
 
255
- [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button[aria-selected="true"] {
256
- border-inline-end-color: var(--ui-accent-solid);
257
- }
294
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"]
295
+ .list
296
+ button[aria-selected="true"] {
297
+ border-inline-end-color: var(--ui-accent-solid);
298
+ }
258
299
 
259
- @media (prefers-reduced-motion: reduce) {
260
- .list button {
261
- transition: none;
262
- }
263
- }
300
+ @media (prefers-reduced-motion: reduce) {
301
+ .list button {
302
+ transition: none;
303
+ }
304
+ }
264
305
 
265
- /* A component that sets its display still honours the hidden attribute on its root. */
266
- [data-component~="ui-tabs"][hidden] {
267
- display: none;
268
- }
306
+ /* A component that sets its display still honours the hidden attribute on its root. */
307
+ [data-component~="ui-tabs"][hidden] {
308
+ display: none;
309
+ }
269
310
  </style>
@@ -1,10 +1,10 @@
1
1
  type __VLS_Props = {
2
- disabled?: boolean | null;
3
- invalid?: boolean | null;
4
- readonly?: boolean | null;
5
- required?: boolean | null;
6
- rows?: number | null;
7
- value?: string | null;
2
+ disabled?: boolean;
3
+ invalid?: boolean;
4
+ readonly?: boolean;
5
+ required?: boolean;
6
+ rows?: number;
7
+ value?: string;
8
8
  modelValue?: string | null;
9
9
  };
10
10
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
@@ -12,11 +12,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
12
12
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
13
13
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
14
14
  }>, {
15
- invalid: boolean | null;
16
- disabled: boolean | null;
17
- required: boolean | null;
18
- readonly: boolean | null;
19
- rows: number | null;
15
+ invalid: boolean;
16
+ disabled: boolean;
17
+ required: boolean;
18
+ readonly: boolean;
19
+ rows: number;
20
20
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
21
  declare const _default: typeof __VLS_export;
22
22
  export default _default;