@threadlabs/looma 0.5.1 → 0.6.0-rc.1

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 (341) hide show
  1. package/README.md +1 -1
  2. package/components/shared/overlay.js +3 -0
  3. package/components/ui-button/ui-button.html +27 -14
  4. package/components/ui-callout/ui-callout.html +1 -1
  5. package/components/ui-checkbox/ui-checkbox.html +1 -1
  6. package/components/ui-cluster/ui-cluster.html +6 -6
  7. package/components/ui-combobox/ui-combobox.html +35 -27
  8. package/components/ui-container/ui-container.html +4 -4
  9. package/components/ui-context-menu/ui-context-menu.html +2 -2
  10. package/components/ui-dialog/ui-dialog.html +21 -8
  11. package/components/ui-disclosure/ui-disclosure.html +19 -4
  12. package/components/ui-editable/ui-editable.html +6 -6
  13. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +21 -21
  14. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +26 -26
  15. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +39 -39
  16. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +26 -22
  17. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +68 -52
  18. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +42 -38
  19. package/components/ui-editor-toolbar/ui-editor-toolbar.html +9 -9
  20. package/components/ui-floating-action-button/ui-floating-action-button.html +16 -22
  21. package/components/ui-form-field/ui-form-field.html +18 -7
  22. package/components/ui-grid/ui-grid.html +6 -6
  23. package/components/ui-icon/ui-icon.html +5 -1
  24. package/components/ui-icon-button/ui-icon-button.html +68 -34
  25. package/components/ui-input/ui-input.html +2 -2
  26. package/components/ui-menu/ui-menu.html +15 -4
  27. package/components/ui-menu-item/ui-menu-item.html +5 -5
  28. package/components/ui-popover/ui-popover.html +3 -3
  29. package/components/ui-popover/ui-popover.js +10 -2
  30. package/components/ui-reel/ui-reel.html +6 -6
  31. package/components/ui-search-result-row/ui-search-result-row.html +9 -9
  32. package/components/ui-search-shell/ui-search-shell.html +10 -3
  33. package/components/ui-search-shell/ui-search-shell.js +9 -0
  34. package/components/ui-select/ui-select.html +2 -2
  35. package/components/ui-sidebar/ui-sidebar.html +11 -11
  36. package/components/ui-stack/ui-stack.html +6 -6
  37. package/components/ui-switcher/ui-switcher.html +6 -6
  38. package/components/ui-tabs/ui-tabs.html +19 -5
  39. package/components/ui-textarea/ui-textarea.html +2 -2
  40. package/components/ui-toast-region/ui-toast-region.html +3 -3
  41. package/components/ui-tooltip/ui-tooltip.html +1 -1
  42. package/components/ui-top-bar/ui-top-bar.html +5 -5
  43. package/components/ui-tree/ui-tree.html +7 -0
  44. package/components/ui-tree-item/ui-tree-item.html +20 -7
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +2 -2
  47. package/package.json +2 -2
  48. package/styles/ui-affordance-scope.css +1 -1
  49. package/styles/ui-avatar-group.css +1 -1
  50. package/styles/ui-avatar.css +1 -1
  51. package/styles/ui-badge.css +1 -1
  52. package/styles/ui-button.css +25 -15
  53. package/styles/ui-callout.css +2 -2
  54. package/styles/ui-checkbox.css +2 -2
  55. package/styles/ui-cluster.css +7 -7
  56. package/styles/ui-combobox.css +24 -24
  57. package/styles/ui-container.css +5 -5
  58. package/styles/ui-context-menu.css +3 -3
  59. package/styles/ui-dialog.css +26 -9
  60. package/styles/ui-disclosure.css +23 -7
  61. package/styles/ui-editable.css +7 -7
  62. package/styles/ui-editor-insert-table-grid.css +21 -21
  63. package/styles/ui-editor-mention-menu.css +26 -26
  64. package/styles/ui-editor-slash-menu.css +40 -40
  65. package/styles/ui-editor-table-context-menu.css +21 -21
  66. package/styles/ui-editor-table-overlay.css +49 -49
  67. package/styles/ui-editor-table-toolbar.css +35 -35
  68. package/styles/ui-editor-toolbar.css +10 -10
  69. package/styles/ui-floating-action-button.css +17 -23
  70. package/styles/ui-form-field.css +24 -10
  71. package/styles/ui-grid.css +7 -7
  72. package/styles/ui-icon-button.css +74 -35
  73. package/styles/ui-icon.css +1 -1
  74. package/styles/ui-input.css +3 -3
  75. package/styles/ui-menu-item.css +6 -6
  76. package/styles/ui-menu.css +19 -7
  77. package/styles/ui-popover.css +4 -4
  78. package/styles/ui-radio-group.css +1 -1
  79. package/styles/ui-radio.css +1 -1
  80. package/styles/ui-reel.css +7 -7
  81. package/styles/ui-search-result-row.css +10 -10
  82. package/styles/ui-search-shell.css +14 -5
  83. package/styles/ui-select.css +3 -3
  84. package/styles/ui-separator.css +1 -1
  85. package/styles/ui-sidebar.css +12 -12
  86. package/styles/ui-stack.css +7 -7
  87. package/styles/ui-switch.css +1 -1
  88. package/styles/ui-switcher.css +7 -7
  89. package/styles/ui-tabs.css +21 -7
  90. package/styles/ui-textarea.css +3 -3
  91. package/styles/ui-toast-region.css +3 -3
  92. package/styles/ui-tooltip.css +2 -2
  93. package/styles/ui-top-bar.css +6 -6
  94. package/styles/ui-tree-item.css +30 -9
  95. package/styles/ui-tree.css +8 -2
  96. package/theme-dark.css +42 -103
  97. package/theme-high-contrast.css +18 -22
  98. package/theme-light.css +15 -41
  99. package/tokens.css +149 -201
  100. package/vanilla/UiAffordanceScope.d.ts +1 -1
  101. package/vanilla/UiAffordanceScope.js +2 -2
  102. package/vanilla/UiAvatar.d.ts +1 -1
  103. package/vanilla/UiAvatar.js +2 -2
  104. package/vanilla/UiAvatarGroup.d.ts +1 -1
  105. package/vanilla/UiAvatarGroup.js +2 -2
  106. package/vanilla/UiBadge.d.ts +1 -1
  107. package/vanilla/UiBadge.js +2 -2
  108. package/vanilla/UiButton.d.ts +3 -1
  109. package/vanilla/UiButton.js +3 -3
  110. package/vanilla/UiCallout.d.ts +1 -1
  111. package/vanilla/UiCallout.js +2 -2
  112. package/vanilla/UiCheckbox.d.ts +1 -1
  113. package/vanilla/UiCheckbox.js +2 -2
  114. package/vanilla/UiCluster.d.ts +1 -1
  115. package/vanilla/UiCluster.js +2 -2
  116. package/vanilla/UiCombobox.d.ts +1 -1
  117. package/vanilla/UiCombobox.js +3 -3
  118. package/vanilla/UiContainer.d.ts +1 -1
  119. package/vanilla/UiContainer.js +2 -2
  120. package/vanilla/UiContextMenu.d.ts +1 -1
  121. package/vanilla/UiContextMenu.js +2 -2
  122. package/vanilla/UiDialog.d.ts +1 -1
  123. package/vanilla/UiDialog.js +2 -2
  124. package/vanilla/UiDisclosure.d.ts +2 -1
  125. package/vanilla/UiDisclosure.js +3 -3
  126. package/vanilla/UiEditable.d.ts +1 -1
  127. package/vanilla/UiEditable.js +2 -2
  128. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  129. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  130. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  131. package/vanilla/UiEditorMentionMenu.js +3 -3
  132. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  133. package/vanilla/UiEditorSlashMenu.js +2 -2
  134. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  135. package/vanilla/UiEditorTableContextMenu.js +3 -3
  136. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  137. package/vanilla/UiEditorTableOverlay.js +3 -3
  138. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  139. package/vanilla/UiEditorTableToolbar.js +3 -3
  140. package/vanilla/UiEditorToolbar.d.ts +1 -1
  141. package/vanilla/UiEditorToolbar.js +2 -2
  142. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  143. package/vanilla/UiFloatingActionButton.js +2 -2
  144. package/vanilla/UiFormField.d.ts +1 -1
  145. package/vanilla/UiFormField.js +15 -6
  146. package/vanilla/UiGrid.d.ts +1 -1
  147. package/vanilla/UiGrid.js +2 -2
  148. package/vanilla/UiIcon.d.ts +1 -1
  149. package/vanilla/UiIcon.js +3 -3
  150. package/vanilla/UiIconButton.d.ts +1 -1
  151. package/vanilla/UiIconButton.js +2 -2
  152. package/vanilla/UiInput.d.ts +1 -1
  153. package/vanilla/UiInput.js +2 -2
  154. package/vanilla/UiMenu.d.ts +2 -1
  155. package/vanilla/UiMenu.js +3 -3
  156. package/vanilla/UiMenuItem.d.ts +1 -1
  157. package/vanilla/UiMenuItem.js +2 -2
  158. package/vanilla/UiPopover.d.ts +1 -1
  159. package/vanilla/UiPopover.js +2 -2
  160. package/vanilla/UiRadio.d.ts +1 -1
  161. package/vanilla/UiRadio.js +2 -2
  162. package/vanilla/UiRadioGroup.d.ts +1 -1
  163. package/vanilla/UiRadioGroup.js +2 -2
  164. package/vanilla/UiReel.d.ts +1 -1
  165. package/vanilla/UiReel.js +2 -2
  166. package/vanilla/UiSearchResultRow.d.ts +1 -1
  167. package/vanilla/UiSearchResultRow.js +2 -2
  168. package/vanilla/UiSearchShell.d.ts +1 -1
  169. package/vanilla/UiSearchShell.js +2 -2
  170. package/vanilla/UiSelect.d.ts +1 -1
  171. package/vanilla/UiSelect.js +2 -2
  172. package/vanilla/UiSeparator.d.ts +1 -1
  173. package/vanilla/UiSeparator.js +2 -2
  174. package/vanilla/UiSidebar.d.ts +1 -1
  175. package/vanilla/UiSidebar.js +2 -2
  176. package/vanilla/UiStack.d.ts +1 -1
  177. package/vanilla/UiStack.js +2 -2
  178. package/vanilla/UiSwitch.d.ts +1 -1
  179. package/vanilla/UiSwitch.js +2 -2
  180. package/vanilla/UiSwitcher.d.ts +1 -1
  181. package/vanilla/UiSwitcher.js +2 -2
  182. package/vanilla/UiTabs.d.ts +2 -1
  183. package/vanilla/UiTabs.js +3 -3
  184. package/vanilla/UiTextarea.d.ts +1 -1
  185. package/vanilla/UiTextarea.js +2 -2
  186. package/vanilla/UiToastRegion.d.ts +1 -1
  187. package/vanilla/UiToastRegion.js +3 -3
  188. package/vanilla/UiTooltip.d.ts +1 -1
  189. package/vanilla/UiTooltip.js +2 -2
  190. package/vanilla/UiTopBar.d.ts +1 -1
  191. package/vanilla/UiTopBar.js +1 -1
  192. package/vanilla/UiTree.d.ts +2 -1
  193. package/vanilla/UiTree.js +3 -3
  194. package/vanilla/UiTreeItem.d.ts +1 -1
  195. package/vanilla/UiTreeItem.js +2 -2
  196. package/vue/UiAffordanceScope.d.ts +2 -2
  197. package/vue/UiAffordanceScope.vue +92 -73
  198. package/vue/UiAvatar.d.ts +7 -7
  199. package/vue/UiAvatar.vue +145 -105
  200. package/vue/UiAvatarGroup.d.ts +4 -4
  201. package/vue/UiAvatarGroup.vue +134 -118
  202. package/vue/UiBadge.d.ts +4 -4
  203. package/vue/UiBadge.vue +113 -114
  204. package/vue/UiButton.d.ts +10 -6
  205. package/vue/UiButton.vue +295 -248
  206. package/vue/UiCallout.d.ts +2 -2
  207. package/vue/UiCallout.vue +154 -87
  208. package/vue/UiCheckbox.d.ts +14 -10
  209. package/vue/UiCheckbox.vue +228 -162
  210. package/vue/UiCluster.d.ts +2 -2
  211. package/vue/UiCluster.vue +53 -60
  212. package/vue/UiCombobox.d.ts +36 -32
  213. package/vue/UiCombobox.vue +1005 -416
  214. package/vue/UiContainer.d.ts +2 -2
  215. package/vue/UiContainer.vue +48 -51
  216. package/vue/UiContextMenu.d.ts +6 -4
  217. package/vue/UiContextMenu.vue +205 -116
  218. package/vue/UiDialog.d.ts +11 -9
  219. package/vue/UiDialog.vue +287 -212
  220. package/vue/UiDisclosure.d.ts +10 -6
  221. package/vue/UiDisclosure.vue +265 -159
  222. package/vue/UiEditable.d.ts +16 -12
  223. package/vue/UiEditable.vue +325 -205
  224. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  225. package/vue/UiEditorInsertTableGrid.vue +216 -157
  226. package/vue/UiEditorMentionMenu.d.ts +9 -9
  227. package/vue/UiEditorMentionMenu.vue +265 -222
  228. package/vue/UiEditorSlashMenu.d.ts +7 -7
  229. package/vue/UiEditorSlashMenu.vue +286 -240
  230. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  231. package/vue/UiEditorTableContextMenu.vue +306 -193
  232. package/vue/UiEditorTableOverlay.d.ts +2 -2
  233. package/vue/UiEditorTableOverlay.vue +600 -369
  234. package/vue/UiEditorTableToolbar.d.ts +7 -7
  235. package/vue/UiEditorTableToolbar.vue +443 -268
  236. package/vue/UiEditorToolbar.d.ts +2 -2
  237. package/vue/UiEditorToolbar.vue +134 -121
  238. package/vue/UiFloatingActionButton.d.ts +6 -6
  239. package/vue/UiFloatingActionButton.vue +95 -99
  240. package/vue/UiFormField.d.ts +6 -6
  241. package/vue/UiFormField.vue +112 -80
  242. package/vue/UiGrid.d.ts +2 -2
  243. package/vue/UiGrid.vue +51 -57
  244. package/vue/UiIcon.d.ts +2 -2
  245. package/vue/UiIcon.vue +118 -89
  246. package/vue/UiIconButton.d.ts +11 -11
  247. package/vue/UiIconButton.vue +287 -217
  248. package/vue/UiInput.d.ts +9 -9
  249. package/vue/UiInput.vue +153 -127
  250. package/vue/UiMenu.d.ts +10 -6
  251. package/vue/UiMenu.vue +227 -143
  252. package/vue/UiMenuItem.d.ts +4 -4
  253. package/vue/UiMenuItem.vue +53 -46
  254. package/vue/UiPopover.d.ts +8 -6
  255. package/vue/UiPopover.vue +197 -137
  256. package/vue/UiRadio.d.ts +14 -10
  257. package/vue/UiRadio.vue +183 -117
  258. package/vue/UiRadioGroup.d.ts +14 -12
  259. package/vue/UiRadioGroup.vue +172 -111
  260. package/vue/UiReel.d.ts +3 -3
  261. package/vue/UiReel.vue +77 -77
  262. package/vue/UiSearchResultRow.d.ts +4 -4
  263. package/vue/UiSearchResultRow.vue +121 -115
  264. package/vue/UiSearchShell.d.ts +10 -8
  265. package/vue/UiSearchShell.vue +245 -176
  266. package/vue/UiSelect.d.ts +9 -9
  267. package/vue/UiSelect.vue +162 -134
  268. package/vue/UiSeparator.d.ts +2 -2
  269. package/vue/UiSeparator.vue +22 -27
  270. package/vue/UiSidebar.d.ts +20 -18
  271. package/vue/UiSidebar.vue +307 -224
  272. package/vue/UiStack.d.ts +3 -3
  273. package/vue/UiStack.vue +64 -70
  274. package/vue/UiSwitch.d.ts +12 -8
  275. package/vue/UiSwitch.vue +218 -150
  276. package/vue/UiSwitcher.d.ts +3 -3
  277. package/vue/UiSwitcher.vue +73 -75
  278. package/vue/UiTabs.d.ts +12 -8
  279. package/vue/UiTabs.vue +268 -210
  280. package/vue/UiTextarea.d.ts +11 -11
  281. package/vue/UiTextarea.vue +155 -128
  282. package/vue/UiToastRegion.d.ts +10 -8
  283. package/vue/UiToastRegion.vue +261 -198
  284. package/vue/UiTooltip.d.ts +14 -12
  285. package/vue/UiTooltip.vue +241 -177
  286. package/vue/UiTopBar.vue +51 -42
  287. package/vue/UiTree.d.ts +10 -6
  288. package/vue/UiTree.vue +180 -70
  289. package/vue/UiTreeItem.d.ts +24 -22
  290. package/vue/UiTreeItem.vue +464 -339
  291. package/vue/chunks/UiAffordanceScope.js +9 -16
  292. package/vue/chunks/UiAvatar.js +23 -29
  293. package/vue/chunks/UiAvatarGroup.js +16 -39
  294. package/vue/chunks/UiBadge.js +3 -12
  295. package/vue/chunks/UiButton.js +15 -18
  296. package/vue/chunks/UiCallout.js +8 -17
  297. package/vue/chunks/UiCheckbox.js +37 -40
  298. package/vue/chunks/UiCluster.js +3 -12
  299. package/vue/chunks/UiCombobox.js +224 -266
  300. package/vue/chunks/UiContainer.js +3 -12
  301. package/vue/chunks/UiContextMenu.js +39 -34
  302. package/vue/chunks/UiDialog.js +36 -39
  303. package/vue/chunks/UiDisclosure.js +44 -48
  304. package/vue/chunks/UiEditable.js +55 -57
  305. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  306. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  307. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  308. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  309. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  310. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  311. package/vue/chunks/UiEditorToolbar.js +4 -13
  312. package/vue/chunks/UiFloatingActionButton.js +7 -21
  313. package/vue/chunks/UiFormField.js +15 -12
  314. package/vue/chunks/UiGrid.js +3 -12
  315. package/vue/chunks/UiIcon.js +20 -43
  316. package/vue/chunks/UiIconButton.js +16 -28
  317. package/vue/chunks/UiInput.js +20 -25
  318. package/vue/chunks/UiMenu.js +30 -33
  319. package/vue/chunks/UiMenuItem.js +4 -10
  320. package/vue/chunks/UiPopover.js +28 -29
  321. package/vue/chunks/UiRadio.js +36 -39
  322. package/vue/chunks/UiRadioGroup.js +30 -34
  323. package/vue/chunks/UiReel.js +6 -15
  324. package/vue/chunks/UiSearchResultRow.js +6 -19
  325. package/vue/chunks/UiSearchShell.js +25 -28
  326. package/vue/chunks/UiSelect.js +20 -23
  327. package/vue/chunks/UiSeparator.js +2 -8
  328. package/vue/chunks/UiSidebar.js +39 -44
  329. package/vue/chunks/UiStack.js +6 -15
  330. package/vue/chunks/UiSwitch.js +35 -38
  331. package/vue/chunks/UiSwitcher.js +6 -15
  332. package/vue/chunks/UiTabs.js +52 -85
  333. package/vue/chunks/UiTextarea.js +21 -26
  334. package/vue/chunks/UiToastRegion.js +38 -72
  335. package/vue/chunks/UiTooltip.js +34 -35
  336. package/vue/chunks/UiTopBar.js +1 -1
  337. package/vue/chunks/UiTree.js +27 -16
  338. package/vue/chunks/UiTreeItem.js +85 -102
  339. package/vue/components.css +4027 -3800
  340. package/vue/editor/LoomaEditor.d.ts +11 -0
  341. package/vue/editor/index.js +9 -0
package/vue/UiTabs.vue CHANGED
@@ -1,269 +1,327 @@
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
+ density?: 'comfortable' | 'compact'
19
+ label?: string
20
+ orientation?: 'horizontal' | 'vertical'
21
+ stretch?: boolean
22
+ value?: string
23
+ }>(),
24
+ {
25
+ density: 'comfortable',
26
+ label: 'Tabs',
27
+ orientation: 'horizontal',
28
+ stretch: false,
29
+ value: '',
49
30
  },
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
- });
31
+ )
63
32
  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>([]);
33
+ 'update:value': [value: string]
34
+ select: [
35
+ detail: {
36
+ readonly value: string
37
+ readonly previousValue: string
38
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
39
+ },
40
+ ]
41
+ }>()
42
+
43
+ const root = ref<HTMLElement | null>(null)
44
+ const listElement = useTemplateRef<HTMLElement>('list')
45
+ const panelsElement = useTemplateRef<HTMLElement>('panels')
46
+ const internalValue = ref('')
47
+ const tabs = ref<{ id: string; label: string }[]>([])
48
+
49
+ /** The values the styles' :host-state() rules test. */
50
+ const hostState = computed(() =>
51
+ [
52
+ props.density && `density density=${props.density}`,
53
+ props.stretch && 'stretch',
54
+ props.orientation && `orientation orientation=${props.orientation}`,
55
+ ].filter(Boolean).join(' ')
56
+ )
70
57
 
71
58
  /** 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>;
59
+ function dispatch(name: string, detail?: unknown): boolean {
60
+ const declared: Record<string, EventInit | undefined> = {
61
+ select: { bubbles: true, composed: true, cancelable: false },
62
+ }
74
63
  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
- };
64
+ select: (detail) =>
65
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
66
+ && typeof (detail as Record<string, unknown>)['value'] === 'string'
67
+ && typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
68
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
69
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
70
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
71
+ && Object.keys(detail as object).every((key) =>
72
+ ['value', 'previousValue', 'trigger'].includes(key)
73
+ ),
74
+ }
77
75
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
78
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
76
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
79
77
  }
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(" "));
78
+ const emitEvent = emit as (name: string, detail: unknown) => void
79
+ emitEvent(name, detail)
80
+ if (detail !== null && typeof detail === 'object' && 'value' in detail) {
81
+ emitEvent('update:value', (detail as Record<string, unknown>)['value'])
82
+ }
83
+ return root.value?.dispatchEvent(
84
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
85
+ ) ?? true
86
+ }
91
87
 
92
88
  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];
89
+ if (name === 'internalValue') return internalValue.value
90
+ if (name === 'tabs') return tabs.value
91
+ return (props as Record<string, unknown>)[name]
96
92
  }
97
93
 
98
94
  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.`);
95
+ if (name === 'internalValue') {
96
+ internalValue.value = value as never
97
+ return true
98
+ }
99
+ if (name === 'tabs') {
100
+ tabs.value = value as never
101
+ return true
102
+ }
103
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
102
104
  }
103
105
 
104
- const stops: Array<() => void> = [];
106
+ const stops: Array<() => void> = []
105
107
  const host = {
106
- get element(): Element { return root.value as Element; },
108
+ get element(): Element {
109
+ return root.value as Element
110
+ },
107
111
  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),
112
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
113
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
110
114
  }),
111
- refs: refs as Readonly<Record<string, Element>>,
115
+ refs: {
116
+ get list(): Element {
117
+ return listElement.value as Element
118
+ },
119
+ get panels(): Element {
120
+ return panelsElement.value as Element
121
+ },
122
+ } as Readonly<Record<string, Element>>,
112
123
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
113
124
  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;
125
+ if (typeof name !== 'string' || root.value === null) return undefined
126
+ const form = root.value instanceof HTMLFormElement
127
+ ? root.value
128
+ : root.value.querySelector('form')
129
+ return form?.elements.namedItem(name)
130
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
117
131
  },
118
132
  }),
119
133
  signal<T>(initialValue: T) {
120
- const value = shallowRef(initialValue);
134
+ const value = shallowRef(initialValue)
121
135
  return {
122
136
  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
- };
137
+ set: (next: T): void => {
138
+ if (!Object.is(value.value, next)) value.value = next
139
+ },
140
+ update: (next: (current: T) => T): void => {
141
+ const updated = next(value.value)
142
+ if (!Object.is(value.value, updated)) value.value = updated
143
+ },
144
+ }
126
145
  },
127
146
  computed<T>(compute: () => T) {
128
- const value = computed(compute);
129
- return { get: (): T => value.value };
147
+ const value = computed(compute)
148
+ return { get: (): T => value.value }
130
149
  },
131
150
  effect(run: () => void | (() => void)): () => void {
132
151
  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;
152
+ const cleanup = run()
153
+ if (typeof cleanup === 'function') onCleanup(cleanup)
154
+ }, { flush: 'post' })
155
+ stops.push(stop)
156
+ return stop
138
157
  },
139
158
  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;
159
+ const element = root.value
160
+ element?.addEventListener(event, listener)
161
+ const off = (): void => element?.removeEventListener(event, listener)
162
+ stops.push(off)
163
+ return off
145
164
  },
146
165
  dispatch,
147
- };
166
+ }
148
167
 
149
- let cleanup: void | (() => void);
150
- let ready: Promise<void> | undefined;
168
+ let cleanup: void | (() => void)
169
+ let ready: Promise<void> | undefined
151
170
  onMounted(() => {
152
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
153
- });
171
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
172
+ cleanup = result
173
+ })
174
+ })
154
175
  onBeforeUnmount(() => {
155
- for (const stop of stops.splice(0)) stop();
156
- if (typeof cleanup === "function") cleanup();
157
- });
176
+ for (const stop of stops.splice(0)) stop()
177
+ if (typeof cleanup === 'function') cleanup()
178
+ })
158
179
  </script>
159
180
 
160
181
  <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>
182
+ <div
183
+ data-component="ui-tabs"
184
+ v-bind="$attrs"
185
+ :data-ui-tabs-state="hostState || undefined"
186
+ ref="root"
187
+ >
188
+ <div class="list" role="tablist" :aria-label="label" :aria-orientation="orientation" ref="list">
189
+ <button
190
+ v-for="tab in tabs"
191
+ :key="tab.id"
192
+ type="button"
193
+ role="tab"
194
+ :id="`${tab.id}-tab`"
195
+ :value="tab.id"
196
+ :aria-controls="tab.id"
197
+ :aria-selected="tab.id === internalValue"
198
+ >
199
+ {{ tab.label }}
200
+ </button>
201
+ </div>
202
+ <div class="panels" ref="panels"><slot /></div>
203
+ </div>
162
204
  </template>
163
205
 
164
206
  <style scoped>
207
+ /* Density resolves into the tab row's own values; the public tokens still override them. */
165
208
  [data-component~="ui-tabs"] {
166
- display: grid;
167
- inline-size: 100%;
168
- min-inline-size: 0;
169
- }
209
+ --_tab-min-block-size: var(--ui-control-size);
210
+ --_tab-padding-block: var(--ui-space-2);
211
+ --_tab-padding-inline: var(--ui-space-3);
212
+ }
170
213
 
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
- }
214
+ [data-component~="ui-tabs"][data-ui-tabs-state~="density=compact"] {
215
+ --_tab-min-block-size: var(--ui-control-size-sm);
216
+ --_tab-padding-block: var(--ui-space-1);
217
+ --_tab-padding-inline: var(--ui-space-2);
218
+ }
187
219
 
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
- }
220
+ [data-component~="ui-tabs"] {
221
+ display: grid;
222
+ inline-size: 100%;
223
+ min-inline-size: 0;
224
+ }
205
225
 
206
- [data-component~="ui-tabs"][data-ui-tabs-state~="stretch"] .list {
207
- grid-auto-columns: minmax(max-content, 1fr);
208
- }
226
+ .list {
227
+ display: grid;
228
+ grid-auto-flow: column;
229
+ grid-auto-columns: max-content;
230
+ justify-content: start;
231
+ inline-size: 100%;
232
+ max-inline-size: 100%;
233
+ /* Tabs that do not fit scroll sideways rather than wrapping or squeezing. */
234
+ overflow-x: auto;
235
+ /* overflow-x: auto would make the block axis scrollable too; a sideways swipe must not scroll the
236
+ strip or the page vertically. */
237
+ overflow-y: hidden;
238
+ overscroll-behavior: contain;
239
+ scrollbar-width: thin;
240
+ border-block-end: 1px solid var(--ui-border-default);
241
+ }
209
242
 
210
- .list button {
211
- white-space: nowrap;
212
- }
243
+ .list button {
244
+ min-block-size: var(--ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
245
+ margin: 0 0 -1px;
246
+ padding: var(--ui-tabs-tab-padding-block, var(--_tab-padding-block))
247
+ var(--ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
248
+ border: 0;
249
+ border-block-end: 2px solid transparent;
250
+ background: transparent;
251
+ color: var(--ui-text-secondary);
252
+ font: inherit;
253
+ font-size: var(--ui-font-size-sm);
254
+ font-weight: var(--ui-font-medium);
255
+ cursor: pointer;
256
+ transition:
257
+ color var(--ui-motion-fast) var(--ui-motion-ease),
258
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
259
+ border-color var(--ui-motion-fast) var(--ui-motion-ease);
260
+ }
213
261
 
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
- }
262
+ [data-component~="ui-tabs"][data-ui-tabs-state~="stretch"] .list {
263
+ grid-auto-columns: minmax(max-content, 1fr);
264
+ }
228
265
 
229
- .panels {
230
- min-inline-size: 0;
231
- }
232
- :slotted(*) {
233
- padding: var(--ui-space-4);
234
- }
266
+ .list button {
267
+ white-space: nowrap;
268
+ }
235
269
 
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
- }
270
+ .list button:hover {
271
+ color: var(--ui-text-primary);
272
+ background: var(--ui-surface-muted);
273
+ }
274
+ .list button[aria-selected="true"] {
275
+ color: var(--ui-accent-solid);
276
+ border-block-end-color: var(--ui-accent-solid);
277
+ }
278
+ .list button:focus-visible {
279
+ position: relative;
280
+ outline: none;
281
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
282
+ border-radius: var(--ui-radius-sm);
283
+ }
240
284
 
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
- }
285
+ .panels {
286
+ min-inline-size: 0;
287
+ }
288
+ :slotted(*) {
289
+ padding: var(--ui-space-4);
290
+ }
247
291
 
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
- }
292
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] {
293
+ grid-template-columns: max-content minmax(0, 1fr);
294
+ align-items: start;
295
+ }
254
296
 
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
- }
297
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list {
298
+ grid-auto-flow: row;
299
+ grid-auto-columns: auto;
300
+ border-block-end: 0;
301
+ border-inline-end: 1px solid var(--ui-border-default);
302
+ }
258
303
 
259
- @media (prefers-reduced-motion: reduce) {
260
- .list button {
261
- transition: none;
262
- }
263
- }
304
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button {
305
+ margin: 0 -1px 0 0;
306
+ border-block-end: 0;
307
+ border-inline-end: 2px solid transparent;
308
+ text-align: start;
309
+ }
264
310
 
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
- }
311
+ [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"]
312
+ .list
313
+ button[aria-selected="true"] {
314
+ border-inline-end-color: var(--ui-accent-solid);
315
+ }
316
+
317
+ @media (prefers-reduced-motion: reduce) {
318
+ .list button {
319
+ transition: none;
320
+ }
321
+ }
322
+
323
+ /* A component that sets its display still honours the hidden attribute on its root. */
324
+ [data-component~="ui-tabs"][hidden] {
325
+ display: none;
326
+ }
269
327
  </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;