@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
@@ -1,284 +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-editor-mention-menu/ui-editor-mention-menu.js";
3
+ import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
4
+ import * as controllerModule from '../components/ui-editor-mention-menu/ui-editor-mention-menu.js'
5
5
 
6
- defineOptions({ inheritAttrs: false });
6
+ defineOptions({ inheritAttrs: false })
7
7
 
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;
8
+ const props = withDefaults(
9
+ defineProps<{
10
+ anchorRect?: {
11
+ readonly left?: number
12
+ readonly top?: number
13
+ readonly right?: number
14
+ readonly bottom?: number
15
+ readonly x?: number
16
+ readonly y?: number
17
+ readonly width?: number
18
+ readonly height?: number
19
+ } | null
20
+ items?:
21
+ readonly ({
22
+ readonly id: string
23
+ readonly label: string
24
+ readonly detail?: string
25
+ readonly initials?: string
26
+ })[]
27
+ loading?: boolean
28
+ open?: boolean
29
+ query?: string
30
+ selectedIndex?: number
31
+ }>(),
32
+ {
33
+ loading: false,
34
+ open: false,
35
+ query: '',
36
+ selectedIndex: 0,
49
37
  },
50
- };
51
-
52
- const props = withDefaults(defineProps<{
53
- anchorRect?: { readonly left?: number; readonly top?: number; readonly right?: number; readonly bottom?: number; readonly x?: number; readonly y?: number; readonly width?: number; readonly height?: number } | null;
54
- items?: readonly ({ readonly id: string; readonly label: string; readonly detail?: string; readonly initials?: string })[] | null;
55
- loading?: boolean | null;
56
- open?: boolean | null;
57
- query?: string | null;
58
- selectedIndex?: number | null;
59
- }>(), {
60
- loading: false,
61
- open: false,
62
- query: "",
63
- selectedIndex: 0,
64
- });
38
+ )
65
39
  const emit = defineEmits<{
66
- "highlight": [detail: { readonly index: number }];
67
- "select": [detail: { readonly index: number }];
68
- }>();
69
- const root = ref<HTMLElement | null>(null);
70
- const refs: Record<string, Element | undefined> = {};
71
- const state_visible = ref<any>(false);
72
- const state_rows = ref<any>([]);
73
- const state_searching = ref<any>(false);
74
- const state_active = ref<any>(0);
75
- const state_prefix = ref<any>("ui-editor-mention-menu");
40
+ highlight: [detail: { readonly index: number }]
41
+ select: [detail: { readonly index: number }]
42
+ }>()
43
+
44
+ const root = ref<HTMLElement | null>(null)
45
+ const visible = ref(false)
46
+ const rows = ref<{ id: string; label: string; detail?: string; initials: string }[]>([])
47
+ const searching = ref(false)
48
+ const active = ref(0)
49
+ const prefix = ref('ui-editor-mention-menu')
76
50
 
77
51
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
78
- const dispatch = (name: string, detail?: unknown): boolean => {
79
- const declared = {"highlight":{"bubbles":true,"composed":true,"cancelable":false},"select":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
52
+ function dispatch(name: string, detail?: unknown): boolean {
53
+ const declared: Record<string, EventInit | undefined> = {
54
+ highlight: { bubbles: true, composed: true, cancelable: false },
55
+ select: { bubbles: true, composed: true, cancelable: false },
56
+ }
80
57
  const checks: Record<string, (detail: unknown) => boolean> = {
81
- "highlight": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && Number.isInteger((detail as Record<string, unknown>)["index"]) && Object.keys(detail as object).every((key) => ["index"].includes(key))),
82
- "select": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && Number.isInteger((detail as Record<string, unknown>)["index"]) && Object.keys(detail as object).every((key) => ["index"].includes(key))),
83
- };
58
+ highlight: (detail) =>
59
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
60
+ && Number.isInteger((detail as Record<string, unknown>)['index'])
61
+ && Object.keys(detail as object).every((key) => ['index'].includes(key)),
62
+ select: (detail) =>
63
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
64
+ && Number.isInteger((detail as Record<string, unknown>)['index'])
65
+ && Object.keys(detail as object).every((key) => ['index'].includes(key)),
66
+ }
84
67
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
85
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
68
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
86
69
  }
87
- (emit as (name: string, detail: unknown) => void)(name, detail);
88
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
89
- };
70
+ const emitEvent = emit as (name: string, detail: unknown) => void
71
+ emitEvent(name, detail)
72
+ return root.value?.dispatchEvent(
73
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
74
+ ) ?? true
75
+ }
90
76
 
91
77
  function read(name: string): unknown {
92
- if (name === "visible") return state_visible.value;
93
- if (name === "rows") return state_rows.value;
94
- if (name === "searching") return state_searching.value;
95
- if (name === "active") return state_active.value;
96
- if (name === "prefix") return state_prefix.value;
97
- return (props as Record<string, unknown>)[name];
78
+ if (name === 'visible') return visible.value
79
+ if (name === 'rows') return rows.value
80
+ if (name === 'searching') return searching.value
81
+ if (name === 'active') return active.value
82
+ if (name === 'prefix') return prefix.value
83
+ return (props as Record<string, unknown>)[name]
98
84
  }
99
85
 
100
86
  function write(name: string, value: unknown): boolean {
101
- if (name === "visible") { state_visible.value = value; return true; }
102
- if (name === "rows") { state_rows.value = value; return true; }
103
- if (name === "searching") { state_searching.value = value; return true; }
104
- if (name === "active") { state_active.value = value; return true; }
105
- if (name === "prefix") { state_prefix.value = value; return true; }
106
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
87
+ if (name === 'visible') {
88
+ visible.value = value as never
89
+ return true
90
+ }
91
+ if (name === 'rows') {
92
+ rows.value = value as never
93
+ return true
94
+ }
95
+ if (name === 'searching') {
96
+ searching.value = value as never
97
+ return true
98
+ }
99
+ if (name === 'active') {
100
+ active.value = value as never
101
+ return true
102
+ }
103
+ if (name === 'prefix') {
104
+ prefix.value = value as never
105
+ return true
106
+ }
107
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
107
108
  }
108
109
 
109
- const stops: Array<() => void> = [];
110
+ const stops: Array<() => void> = []
110
111
  const host = {
111
- get element(): Element { return root.value as Element; },
112
+ get element(): Element {
113
+ return root.value as Element
114
+ },
112
115
  state: new Proxy({} as Record<string, unknown>, {
113
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
114
- set: (_target, name, value) => typeof name === "string" && write(name, value),
116
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
117
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
115
118
  }),
116
- refs: refs as Readonly<Record<string, Element>>,
119
+ refs: {} as Readonly<Record<string, Element>>,
117
120
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
118
121
  get: (_target, name) => {
119
- if (typeof name !== "string" || root.value === null) return undefined;
120
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
121
- 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
122
128
  },
123
129
  }),
124
130
  signal<T>(initialValue: T) {
125
- const value = shallowRef(initialValue);
131
+ const value = shallowRef(initialValue)
126
132
  return {
127
133
  get: (): T => value.value,
128
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
129
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
130
- };
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
+ }
131
142
  },
132
143
  computed<T>(compute: () => T) {
133
- const value = computed(compute);
134
- return { get: (): T => value.value };
144
+ const value = computed(compute)
145
+ return { get: (): T => value.value }
135
146
  },
136
147
  effect(run: () => void | (() => void)): () => void {
137
148
  const stop = watchEffect((onCleanup) => {
138
- const cleanup = run();
139
- if (typeof cleanup === "function") onCleanup(cleanup);
140
- }, { flush: "post" });
141
- stops.push(stop);
142
- return stop;
149
+ const cleanup = run()
150
+ if (typeof cleanup === 'function') onCleanup(cleanup)
151
+ }, { flush: 'post' })
152
+ stops.push(stop)
153
+ return stop
143
154
  },
144
155
  on(event: string, listener: EventListener): () => void {
145
- const element = root.value;
146
- element?.addEventListener(event, listener);
147
- const off = (): void => element?.removeEventListener(event, listener);
148
- stops.push(off);
149
- 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
150
161
  },
151
162
  dispatch,
152
- };
163
+ }
153
164
 
154
- let cleanup: void | (() => void);
155
- let ready: Promise<void> | undefined;
165
+ let cleanup: void | (() => void)
166
+ let ready: Promise<void> | undefined
156
167
  onMounted(() => {
157
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
158
- });
168
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
169
+ cleanup = result
170
+ })
171
+ })
159
172
  onBeforeUnmount(() => {
160
- for (const stop of stops.splice(0)) stop();
161
- if (typeof cleanup === "function") cleanup();
162
- });
173
+ for (const stop of stops.splice(0)) stop()
174
+ if (typeof cleanup === 'function') cleanup()
175
+ })
163
176
  </script>
164
177
 
165
178
  <template>
166
- <div data-component="ui-editor-mention-menu" role="listbox" aria-label="Mention a person" v-bind="$attrs" :aria-busy="hn.enumerated(props.loading)" :hidden="hn.attr(!hn.t(state_visible))" ref="root"><div class="header"><span>People</span><span class="hint">Type after @ to search</span></div><template v-if="hn.t(state_searching)"><div class="loading" role="status">Searching…</div></template><template v-if="hn.t(!hn.t(state_searching))"><ul class="list" role="presentation"><template v-for="(row, index) in hn.shape(state_rows, undefined, [], undefined)" :key="index"><li class="item" role="option" :id="hn.attr(hn.call('format', '%s-option-%s', state_prefix, index))" :aria-selected="hn.enumerated((index === state_active))" :data-index="hn.attr(index)" :class="{ 'active': hn.t((index === state_active)) }"><span class="avatar" aria-hidden="true">{{ hn.text((row)?.initials) }}</span><span class="body"><span class="label">{{ hn.text((row)?.label) }}</span><template v-if="hn.t((row)?.detail)"><span class="detail">{{ hn.text((row)?.detail) }}</span></template></span></li></template></ul></template></div>
179
+ <div
180
+ data-component="ui-editor-mention-menu"
181
+ role="listbox"
182
+ aria-label="Mention a person"
183
+ v-bind="$attrs"
184
+ :aria-busy="loading"
185
+ :hidden="!visible"
186
+ ref="root"
187
+ >
188
+ <div class="header">
189
+ <span>People</span>
190
+ <span class="hint">Type after @ to search</span>
191
+ </div>
192
+ <div v-if="searching" class="loading" role="status">Searching…</div>
193
+ <ul v-if="!searching" class="list" role="presentation">
194
+ <li
195
+ v-for="(row, index) in rows"
196
+ :key="index"
197
+ class="item"
198
+ role="option"
199
+ :id="`${prefix}-option-${index}`"
200
+ :aria-selected="index === active"
201
+ :data-index="index"
202
+ :class="{ active: index === active }"
203
+ >
204
+ <span class="avatar" aria-hidden="true">{{ row.initials }}</span>
205
+ <span class="body"><span class="label">{{ row.label }}</span>
206
+ <span v-if="row.detail" class="detail">{{ row.detail }}</span></span>
207
+ </li>
208
+ </ul>
209
+ </div>
167
210
  </template>
168
211
 
169
212
  <style scoped>
170
213
  [data-component~="ui-editor-mention-menu"] {
171
- user-select: none;
172
- }
214
+ user-select: none;
215
+ }
173
216
 
174
- [data-component~="ui-editor-mention-menu"] {
175
- display: flex;
176
- overflow: hidden;
177
- flex-direction: column;
178
- background: var(--ui-surface, #fff);
179
- border: 1px solid var(--ui-border, #e5e7eb);
180
- border-radius: var(--ui-radius-xl, 1rem);
181
- box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
182
- }
217
+ [data-component~="ui-editor-mention-menu"] {
218
+ display: flex;
219
+ overflow: hidden;
220
+ flex-direction: column;
221
+ background: var(--ui-surface);
222
+ border: 1px solid var(--ui-border);
223
+ border-radius: var(--ui-radius-dialog);
224
+ box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
225
+ }
183
226
 
184
- .header {
185
- display: flex;
186
- align-items: center;
187
- justify-content: space-between;
188
- gap: var(--ui-space-3, 12px);
189
- padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
190
- color: var(--ui-text-secondary, #4b5563);
191
- border-bottom: 1px solid var(--ui-border, #e5e7eb);
192
- font-size: var(--ui-font-size-xs, 0.75rem);
193
- font-weight: var(--ui-font-semibold, 600);
194
- }
227
+ .header {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: space-between;
231
+ gap: var(--ui-space-3);
232
+ padding: var(--ui-space-2) var(--ui-space-3);
233
+ color: var(--ui-text-secondary);
234
+ border-bottom: 1px solid var(--ui-border);
235
+ font-size: var(--ui-font-size-xs);
236
+ font-weight: var(--ui-font-semibold);
237
+ }
195
238
 
196
- .hint {
197
- overflow: hidden;
198
- color: var(--ui-text-muted, #6b7280);
199
- font-weight: var(--ui-font-normal, 400);
200
- text-overflow: ellipsis;
201
- white-space: nowrap;
202
- }
239
+ .hint {
240
+ overflow: hidden;
241
+ color: var(--ui-text-muted);
242
+ font-weight: var(--ui-font-normal);
243
+ text-overflow: ellipsis;
244
+ white-space: nowrap;
245
+ }
203
246
 
204
- .list {
205
- max-height: 280px;
206
- padding: var(--ui-space-1, 4px) 0;
207
- margin: 0;
208
- overflow-y: auto;
209
- overscroll-behavior: contain;
210
- list-style: none;
211
- }
247
+ .list {
248
+ max-height: 280px;
249
+ padding: var(--ui-space-1) 0;
250
+ margin: 0;
251
+ overflow-y: auto;
252
+ overscroll-behavior: contain;
253
+ list-style: none;
254
+ }
212
255
 
213
- .item {
214
- display: flex;
215
- align-items: center;
216
- min-height: 44px;
217
- padding: var(--ui-space-1-5, 6px) var(--ui-space-3, 12px);
218
- gap: var(--ui-space-3, 12px);
219
- cursor: pointer;
220
- }
256
+ .item {
257
+ display: flex;
258
+ align-items: center;
259
+ min-height: 44px;
260
+ padding: var(--ui-space-2) var(--ui-space-3);
261
+ gap: var(--ui-space-3);
262
+ cursor: pointer;
263
+ }
221
264
 
222
- .item.active {
223
- background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
224
- }
265
+ .item.active {
266
+ background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
267
+ }
225
268
 
226
- .avatar {
227
- display: inline-flex;
228
- align-items: center;
229
- justify-content: center;
230
- width: 32px;
231
- height: 32px;
232
- flex: 0 0 auto;
233
- color: var(--ui-accent-active, var(--ui-accent-solid, #2563eb));
234
- background: var(--ui-accent-soft, var(--ui-accent-subtle, #eff6ff));
235
- border-radius: 999px;
236
- font-size: var(--ui-font-size-xs, 0.75rem);
237
- font-weight: var(--ui-font-semibold, 600);
238
- }
269
+ .avatar {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ width: 32px;
274
+ height: 32px;
275
+ flex: 0 0 auto;
276
+ color: var(--ui-accent-active, var(--ui-accent-solid));
277
+ background: var(--ui-accent-soft, var(--ui-accent-subtle));
278
+ border-radius: 999px;
279
+ font-size: var(--ui-font-size-xs);
280
+ font-weight: var(--ui-font-semibold);
281
+ }
239
282
 
240
- .body {
241
- display: flex;
242
- min-width: 0;
243
- flex-direction: column;
244
- }
283
+ .body {
284
+ display: flex;
285
+ min-width: 0;
286
+ flex-direction: column;
287
+ }
245
288
 
246
- .label,
247
- .detail {
248
- overflow: hidden;
249
- text-overflow: ellipsis;
250
- white-space: nowrap;
251
- }
289
+ .label,
290
+ .detail {
291
+ overflow: hidden;
292
+ text-overflow: ellipsis;
293
+ white-space: nowrap;
294
+ }
252
295
 
253
- .label {
254
- color: var(--ui-text-primary, #111827);
255
- font-size: var(--ui-font-size-sm, 0.875rem);
256
- font-weight: var(--ui-font-medium, 500);
257
- }
296
+ .label {
297
+ color: var(--ui-text-primary);
298
+ font-size: var(--ui-font-size-sm);
299
+ font-weight: var(--ui-font-medium);
300
+ }
258
301
 
259
- .detail,
260
- .loading {
261
- color: var(--ui-text-muted, #6b7280);
262
- font-size: var(--ui-font-size-xs, 0.75rem);
263
- }
302
+ .detail,
303
+ .loading {
304
+ color: var(--ui-text-muted);
305
+ font-size: var(--ui-font-size-xs);
306
+ }
264
307
 
265
- .loading {
266
- min-height: 44px;
267
- padding: var(--ui-space-3, 12px);
268
- }
308
+ .loading {
309
+ min-height: 44px;
310
+ padding: var(--ui-space-3);
311
+ }
269
312
 
270
- @media (max-width: 767px) {
271
- [data-component~="ui-editor-mention-menu"] {
272
- border-bottom: 0;
273
- border-radius: var(--ui-radius-xl, 1rem) var(--ui-radius-xl, 1rem) 0 0;
274
- }
313
+ @media (max-width: 767px) {
314
+ [data-component~="ui-editor-mention-menu"] {
315
+ border-bottom: 0;
316
+ border-radius: var(--ui-radius-dialog) var(--ui-radius-dialog) 0 0;
317
+ }
275
318
 
276
- .list {
277
- max-height: calc(60dvh - 48px);
278
- }
279
- }
319
+ .list {
320
+ max-height: calc(60dvh - 48px);
321
+ }
322
+ }
280
323
 
281
- [data-component~="ui-editor-mention-menu"][hidden] {
282
- display: none;
283
- }
324
+ [data-component~="ui-editor-mention-menu"][hidden] {
325
+ display: none;
326
+ }
284
327
  </style>
@@ -13,10 +13,10 @@ type __VLS_Props = {
13
13
  readonly title: string;
14
14
  readonly description: string;
15
15
  readonly icon: string;
16
- })[] | null;
17
- open?: boolean | null;
18
- query?: string | null;
19
- selectedIndex?: number | null;
16
+ })[];
17
+ open?: boolean;
18
+ query?: string;
19
+ selectedIndex?: number;
20
20
  };
21
21
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
22
22
  select: (detail: {
@@ -33,9 +33,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
33
33
  readonly index: number;
34
34
  }) => any) | undefined;
35
35
  }>, {
36
- open: boolean | null;
37
- query: string | null;
38
- selectedIndex: number | null;
36
+ open: boolean;
37
+ query: string;
38
+ selectedIndex: number;
39
39
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
40
40
  declare const _default: typeof __VLS_export;
41
41
  export default _default;