@bysages/solid 0.4.4 → 0.5.0

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 (315) hide show
  1. package/README.md +2 -2
  2. package/dist/ai-NX47X8sz.mjs +365 -0
  3. package/dist/ai-prompt-input-CEnnpkgi.mjs +486 -0
  4. package/dist/{ai-response-CJ-uEAgj.mjs → ai-response-BM_DVIDY.mjs} +25 -27
  5. package/dist/{chevron-BHQrYKPM.mjs → chevron-DGKPHc2O.mjs} +2 -3
  6. package/dist/components/accordion/index.d.mts +1 -2
  7. package/dist/components/accordion/index.mjs +9 -16
  8. package/dist/components/affix/index.d.mts +1 -3
  9. package/dist/components/affix/index.mjs +19 -18
  10. package/dist/components/ai/index.d.mts +95 -2
  11. package/dist/components/ai/index.mjs +7 -69
  12. package/dist/components/ai-action/index.d.mts +0 -2
  13. package/dist/components/ai-action/index.mjs +4 -5
  14. package/dist/components/ai-attachments/index.d.mts +0 -2
  15. package/dist/components/ai-attachments/index.mjs +39 -52
  16. package/dist/components/ai-message/index.d.mts +2 -15
  17. package/dist/components/ai-message/index.mjs +18 -15
  18. package/dist/components/ai-prompt-input/index.d.mts +19 -15
  19. package/dist/components/ai-prompt-input/index.mjs +1 -168
  20. package/dist/components/ai-reasoning/index.d.mts +0 -2
  21. package/dist/components/ai-reasoning/index.mjs +8 -13
  22. package/dist/components/ai-response/index.d.mts +1 -3
  23. package/dist/components/ai-response/index.mjs +1 -2
  24. package/dist/components/ai-source/index.d.mts +0 -2
  25. package/dist/components/ai-source/index.mjs +25 -26
  26. package/dist/components/ai-suggestion/index.d.mts +0 -2
  27. package/dist/components/ai-suggestion/index.mjs +3 -4
  28. package/dist/components/ai-tool/index.d.mts +2 -25
  29. package/dist/components/ai-tool/index.mjs +75 -40
  30. package/dist/components/alert/index.d.mts +1 -2
  31. package/dist/components/alert/index.mjs +38 -33
  32. package/dist/components/angle-slider/index.d.mts +1 -2
  33. package/dist/components/angle-slider/index.mjs +6 -9
  34. package/dist/components/aspect-ratio/index.d.mts +1 -3
  35. package/dist/components/aspect-ratio/index.mjs +18 -17
  36. package/dist/components/autocomplete/index.d.mts +1 -2
  37. package/dist/components/autocomplete/index.mjs +6 -8
  38. package/dist/components/avatar/index.d.mts +1 -2
  39. package/dist/components/avatar/index.mjs +6 -7
  40. package/dist/components/avatar-group/index.d.mts +1 -3
  41. package/dist/components/avatar-group/index.mjs +15 -14
  42. package/dist/components/back-top/index.d.mts +1 -3
  43. package/dist/components/back-top/index.mjs +29 -34
  44. package/dist/components/badge/index.d.mts +1 -3
  45. package/dist/components/badge/index.mjs +18 -17
  46. package/dist/components/banner/index.d.mts +1 -2
  47. package/dist/components/banner/index.mjs +32 -31
  48. package/dist/components/bento/index.d.mts +1 -3
  49. package/dist/components/bento/index.mjs +30 -31
  50. package/dist/components/block-ui/index.d.mts +1 -3
  51. package/dist/components/block-ui/index.mjs +30 -33
  52. package/dist/components/breadcrumb/index.d.mts +1 -2
  53. package/dist/components/breadcrumb/index.mjs +8 -13
  54. package/dist/components/browser/index.d.mts +1 -3
  55. package/dist/components/browser/index.mjs +50 -51
  56. package/dist/components/button/index.d.mts +1 -3
  57. package/dist/components/button/index.mjs +31 -30
  58. package/dist/components/button-group/index.d.mts +1 -3
  59. package/dist/components/button-group/index.mjs +21 -20
  60. package/dist/components/calendar/index.d.mts +0 -2
  61. package/dist/components/calendar/index.mjs +73 -116
  62. package/dist/components/card/index.d.mts +1 -3
  63. package/dist/components/card/index.mjs +3 -4
  64. package/dist/components/carousel/index.d.mts +1 -2
  65. package/dist/components/carousel/index.mjs +6 -7
  66. package/dist/components/cascade-select/index.d.mts +1 -3
  67. package/dist/components/cascade-select/index.mjs +127 -167
  68. package/dist/components/checkbox/index.d.mts +1 -2
  69. package/dist/components/checkbox/index.mjs +7 -10
  70. package/dist/components/checkbox-group/index.d.mts +1 -2
  71. package/dist/components/checkbox-group/index.mjs +9 -12
  72. package/dist/components/chip/index.d.mts +1 -3
  73. package/dist/components/chip/index.mjs +22 -25
  74. package/dist/components/client-only/index.d.mts +0 -2
  75. package/dist/components/client-only/index.mjs +2 -3
  76. package/dist/components/clipboard/index.d.mts +1 -2
  77. package/dist/components/clipboard/index.mjs +10 -17
  78. package/dist/components/collapsible/index.d.mts +1 -2
  79. package/dist/components/collapsible/index.mjs +7 -14
  80. package/dist/components/collection/index.mjs +1 -2
  81. package/dist/components/color-picker/index.d.mts +1 -2
  82. package/dist/components/color-picker/index.mjs +10 -14
  83. package/dist/components/combobox/index.d.mts +1 -2
  84. package/dist/components/combobox/index.mjs +9 -14
  85. package/dist/components/command/index.d.mts +1 -2
  86. package/dist/components/command/index.mjs +63 -80
  87. package/dist/components/comment/index.d.mts +1 -3
  88. package/dist/components/comment/index.mjs +64 -80
  89. package/dist/components/config-provider/index.d.mts +1 -3
  90. package/dist/components/config-provider/index.mjs +10 -13
  91. package/dist/components/container/index.d.mts +1 -3
  92. package/dist/components/container/index.mjs +18 -17
  93. package/dist/components/data-view/index.d.mts +1 -3
  94. package/dist/components/data-view/index.mjs +81 -90
  95. package/dist/components/date-input/index.d.mts +1 -2
  96. package/dist/components/date-input/index.mjs +6 -9
  97. package/dist/components/date-picker/index.d.mts +1 -2
  98. package/dist/components/date-picker/index.mjs +11 -16
  99. package/dist/components/deferred-content/index.d.mts +1 -3
  100. package/dist/components/deferred-content/index.mjs +24 -25
  101. package/dist/components/descriptions/index.d.mts +1 -2
  102. package/dist/components/descriptions/index.mjs +40 -39
  103. package/dist/components/dialog/index.d.mts +11 -2
  104. package/dist/components/dialog/index.mjs +78 -40
  105. package/dist/components/dock/index.d.mts +1 -3
  106. package/dist/components/dock/index.mjs +29 -30
  107. package/dist/components/download-trigger/index.d.mts +0 -2
  108. package/dist/components/download-trigger/index.mjs +2 -3
  109. package/dist/components/drawer/index.d.mts +1 -2
  110. package/dist/components/drawer/index.mjs +9 -18
  111. package/dist/components/dynamic-input/index.d.mts +1 -3
  112. package/dist/components/dynamic-input/index.mjs +73 -77
  113. package/dist/components/editable/index.d.mts +1 -2
  114. package/dist/components/editable/index.mjs +7 -10
  115. package/dist/components/ellipsis/index.d.mts +1 -3
  116. package/dist/components/ellipsis/index.mjs +21 -20
  117. package/dist/components/empty/index.d.mts +1 -3
  118. package/dist/components/empty/index.mjs +3 -4
  119. package/dist/components/field/index.d.mts +1 -2
  120. package/dist/components/field/index.mjs +4 -5
  121. package/dist/components/fieldset/index.d.mts +1 -2
  122. package/dist/components/fieldset/index.mjs +6 -9
  123. package/dist/components/file-upload/index.d.mts +1 -2
  124. package/dist/components/file-upload/index.mjs +6 -7
  125. package/dist/components/float-button/index.d.mts +1 -2
  126. package/dist/components/float-button/index.mjs +41 -43
  127. package/dist/components/floating-panel/index.d.mts +1 -2
  128. package/dist/components/floating-panel/index.mjs +10 -21
  129. package/dist/components/focus-trap/index.d.mts +0 -2
  130. package/dist/components/focus-trap/index.mjs +2 -3
  131. package/dist/components/form/index.d.mts +0 -2
  132. package/dist/components/form/index.mjs +42 -58
  133. package/dist/components/format/index.d.mts +1 -3
  134. package/dist/components/format/index.mjs +1 -2
  135. package/dist/components/frame/index.d.mts +1 -2
  136. package/dist/components/frame/index.mjs +3 -4
  137. package/dist/components/grid/index.d.mts +1 -3
  138. package/dist/components/grid/index.mjs +23 -22
  139. package/dist/components/highlight/index.d.mts +1 -3
  140. package/dist/components/highlight/index.mjs +2 -3
  141. package/dist/components/hover-card/index.d.mts +1 -2
  142. package/dist/components/hover-card/index.mjs +12 -27
  143. package/dist/components/icon/index.d.mts +1 -3
  144. package/dist/components/icon/index.mjs +35 -36
  145. package/dist/components/image/index.d.mts +1 -3
  146. package/dist/components/image/index.mjs +48 -52
  147. package/dist/components/image-cropper/index.d.mts +1 -2
  148. package/dist/components/image-cropper/index.mjs +5 -6
  149. package/dist/components/image-viewer/index.d.mts +1 -1
  150. package/dist/components/image-viewer/index.mjs +1 -2
  151. package/dist/components/input/index.d.mts +1 -3
  152. package/dist/components/input/index.mjs +1 -2
  153. package/dist/components/input-group/index.d.mts +1 -2
  154. package/dist/components/input-group/index.mjs +19 -16
  155. package/dist/components/json-tree-view/index.d.mts +1 -2
  156. package/dist/components/json-tree-view/index.mjs +5 -6
  157. package/dist/components/kbd/index.d.mts +1 -3
  158. package/dist/components/kbd/index.mjs +12 -11
  159. package/dist/components/layout/index.d.mts +1 -2
  160. package/dist/components/layout/index.mjs +92 -84
  161. package/dist/components/link/index.d.mts +1 -3
  162. package/dist/components/link/index.mjs +15 -15
  163. package/dist/components/list/index.d.mts +1 -2
  164. package/dist/components/list/index.mjs +57 -61
  165. package/dist/components/listbox/index.d.mts +1 -2
  166. package/dist/components/listbox/index.mjs +8 -11
  167. package/dist/components/marquee/index.d.mts +1 -2
  168. package/dist/components/marquee/index.mjs +7 -8
  169. package/dist/components/masonry/index.d.mts +1 -3
  170. package/dist/components/masonry/index.mjs +19 -18
  171. package/dist/components/media-player/index.d.mts +1 -1
  172. package/dist/components/media-player/index.mjs +1 -2
  173. package/dist/components/mentions/index.d.mts +2 -2
  174. package/dist/components/mentions/index.mjs +1 -3
  175. package/dist/components/menu/index.d.mts +1 -2
  176. package/dist/components/menu/index.mjs +8 -17
  177. package/dist/components/menubar/index.d.mts +1 -2
  178. package/dist/components/menubar/index.mjs +66 -72
  179. package/dist/components/meter/index.d.mts +1 -2
  180. package/dist/components/meter/index.mjs +42 -43
  181. package/dist/components/navigation-menu/index.d.mts +1 -2
  182. package/dist/components/navigation-menu/index.mjs +7 -12
  183. package/dist/components/number-input/index.d.mts +1 -2
  184. package/dist/components/number-input/index.mjs +7 -10
  185. package/dist/components/order-list/index.d.mts +1 -3
  186. package/dist/components/order-list/index.mjs +86 -101
  187. package/dist/components/page-header/index.d.mts +1 -3
  188. package/dist/components/page-header/index.mjs +3 -4
  189. package/dist/components/pagination/index.d.mts +1 -2
  190. package/dist/components/pagination/index.mjs +31 -42
  191. package/dist/components/password-input/index.d.mts +1 -2
  192. package/dist/components/password-input/index.mjs +6 -7
  193. package/dist/components/pin-input/index.d.mts +1 -2
  194. package/dist/components/pin-input/index.mjs +6 -9
  195. package/dist/components/popconfirm/index.d.mts +2 -3
  196. package/dist/components/popconfirm/index.mjs +15 -23
  197. package/dist/components/popover/index.d.mts +2 -26
  198. package/dist/components/popover/index.mjs +10 -21
  199. package/dist/components/presence/index.d.mts +0 -2
  200. package/dist/components/presence/index.mjs +2 -3
  201. package/dist/components/progress/index.d.mts +1 -2
  202. package/dist/components/progress/index.mjs +14 -26
  203. package/dist/components/progress-group/index.d.mts +1 -3
  204. package/dist/components/progress-group/index.mjs +60 -68
  205. package/dist/components/qr-code/index.d.mts +1 -2
  206. package/dist/components/qr-code/index.mjs +5 -8
  207. package/dist/components/radio-group/index.d.mts +1 -2
  208. package/dist/components/radio-group/index.mjs +6 -9
  209. package/dist/components/rating-group/index.d.mts +1 -2
  210. package/dist/components/rating-group/index.mjs +7 -10
  211. package/dist/components/result/index.d.mts +1 -2
  212. package/dist/components/result/index.mjs +28 -29
  213. package/dist/components/scroll-area/index.d.mts +8 -3
  214. package/dist/components/scroll-area/index.mjs +19 -11
  215. package/dist/components/segment-group/index.d.mts +1 -2
  216. package/dist/components/segment-group/index.mjs +5 -8
  217. package/dist/components/select/index.d.mts +1 -1
  218. package/dist/components/select/index.mjs +1 -2
  219. package/dist/components/separator/index.d.mts +1 -3
  220. package/dist/components/separator/index.mjs +21 -20
  221. package/dist/components/signature-pad/index.d.mts +1 -2
  222. package/dist/components/signature-pad/index.mjs +7 -10
  223. package/dist/components/skeleton/index.d.mts +1 -3
  224. package/dist/components/skeleton/index.mjs +12 -11
  225. package/dist/components/slider/index.d.mts +1 -2
  226. package/dist/components/slider/index.mjs +6 -9
  227. package/dist/components/spinner/index.d.mts +1 -3
  228. package/dist/components/spinner/index.mjs +20 -19
  229. package/dist/components/split-button/index.d.mts +1 -2
  230. package/dist/components/split-button/index.mjs +92 -94
  231. package/dist/components/splitter/index.d.mts +1 -2
  232. package/dist/components/splitter/index.mjs +5 -8
  233. package/dist/components/spotlight/index.d.mts +1 -3
  234. package/dist/components/spotlight/index.mjs +22 -23
  235. package/dist/components/stack/index.d.mts +1 -3
  236. package/dist/components/stack/index.mjs +24 -23
  237. package/dist/components/stat/index.d.mts +1 -2
  238. package/dist/components/stat/index.mjs +15 -14
  239. package/dist/components/steps/index.d.mts +0 -2
  240. package/dist/components/steps/index.mjs +10 -17
  241. package/dist/components/swap/index.d.mts +1 -2
  242. package/dist/components/swap/index.mjs +5 -6
  243. package/dist/components/switch/index.d.mts +1 -2
  244. package/dist/components/switch/index.mjs +6 -9
  245. package/dist/components/table/index.d.mts +0 -2
  246. package/dist/components/table/index.mjs +233 -320
  247. package/dist/components/tabs/index.d.mts +8 -12
  248. package/dist/components/tabs/index.mjs +83 -34
  249. package/dist/components/tag/index.d.mts +1 -2
  250. package/dist/components/tag/index.mjs +46 -70
  251. package/dist/components/tags-input/index.d.mts +1 -2
  252. package/dist/components/tags-input/index.mjs +7 -10
  253. package/dist/components/terminal/index.d.mts +3 -3
  254. package/dist/components/terminal/index.mjs +61 -56
  255. package/dist/components/textarea/index.d.mts +1 -3
  256. package/dist/components/textarea/index.mjs +10 -11
  257. package/dist/components/timeline/index.d.mts +1 -2
  258. package/dist/components/timeline/index.mjs +15 -14
  259. package/dist/components/timer/index.d.mts +1 -2
  260. package/dist/components/timer/index.mjs +5 -6
  261. package/dist/components/toast/index.d.mts +0 -2
  262. package/dist/components/toast/index.mjs +5 -6
  263. package/dist/components/toc/index.d.mts +1 -1
  264. package/dist/components/toc/index.mjs +1 -2
  265. package/dist/components/toggle/index.d.mts +1 -2
  266. package/dist/components/toggle/index.mjs +5 -6
  267. package/dist/components/toggle-group/index.d.mts +1 -2
  268. package/dist/components/toggle-group/index.mjs +11 -16
  269. package/dist/components/toolbar/index.d.mts +1 -3
  270. package/dist/components/toolbar/index.mjs +27 -31
  271. package/dist/components/tooltip/index.d.mts +1 -2
  272. package/dist/components/tooltip/index.mjs +7 -16
  273. package/dist/components/tour/index.d.mts +0 -2
  274. package/dist/components/tour/index.mjs +11 -16
  275. package/dist/components/transfer/index.d.mts +1 -2
  276. package/dist/components/transfer/index.mjs +115 -126
  277. package/dist/components/tree-select/index.d.mts +2 -3
  278. package/dist/components/tree-select/index.mjs +24 -33
  279. package/dist/components/tree-view/index.d.mts +10 -4
  280. package/dist/components/tree-view/index.mjs +32 -23
  281. package/dist/components/typography/index.d.mts +2 -3
  282. package/dist/components/typography/index.mjs +4 -4
  283. package/dist/components/user/index.d.mts +1 -3
  284. package/dist/components/user/index.mjs +40 -57
  285. package/dist/components/virtual-list/index.d.mts +1 -3
  286. package/dist/components/virtual-list/index.mjs +39 -45
  287. package/dist/components/watermark/index.d.mts +1 -3
  288. package/dist/components/watermark/index.mjs +15 -22
  289. package/dist/{element-dGIhOTJ6.mjs → element-liigPBUh.mjs} +1 -2
  290. package/dist/{family-Cmd8HEyK.mjs → family-B5HtE0on.mjs} +1 -2
  291. package/dist/generative/index.d.mts +0 -2
  292. package/dist/generative/index.mjs +28 -53
  293. package/dist/{icon-DTqmJCd5.mjs → icon-DQqYA2fO.mjs} +11 -17
  294. package/dist/{id-2ygNzPHF.mjs → id-DGvz-2rQ.mjs} +1 -2
  295. package/dist/{image-viewer-19s75Hz_.mjs → image-viewer-TEia4PaY.mjs} +73 -101
  296. package/dist/{index-BU5U5w04.d.mts → index-B4WyTngM.d.mts} +0 -4
  297. package/dist/index-BRvSfkKs.d.mts +25 -0
  298. package/dist/{index-DhripUtf.d.mts → index-CTsFsYdA.d.mts} +0 -4
  299. package/dist/index-CutrHCzU.d.mts +153 -0
  300. package/dist/{index-wW28BYf1.d.mts → index-CwmZdzxT.d.mts} +0 -8
  301. package/dist/index-DK7YgaAU.d.mts +37 -0
  302. package/dist/index-Dms00480.d.mts +115 -0
  303. package/dist/{index-ID48LCMU.d.mts → index-Dv6mwzIr.d.mts} +3 -7
  304. package/dist/index.d.mts +13 -13
  305. package/dist/index.mjs +12 -12
  306. package/dist/{input-BL3N3L8g.mjs → input-2xfPP-7Z.mjs} +11 -13
  307. package/dist/{media-player-yF7KVUxM.mjs → media-player-LHnTiSiN.mjs} +248 -259
  308. package/dist/mentions-CvY9IGzc.mjs +438 -0
  309. package/dist/{select-DI7pFspF.mjs → select-NaNlrYUT.mjs} +72 -96
  310. package/dist/{toc-DRHr8_eD.mjs → toc-RnPG3w7q.mjs} +5 -7
  311. package/dist/{use-component-messages-C4SCVYjD.mjs → use-component-messages-DS9ppb4C.mjs} +1 -2
  312. package/package.json +13 -13
  313. package/dist/index-DEArHiFI.d.mts +0 -104
  314. package/dist/index-DVc1L_zt.d.mts +0 -10435
  315. package/dist/mentions-DKUG7eHt.mjs +0 -279
@@ -0,0 +1,438 @@
1
+ import { n as withSelfRoot, t as defineFamily } from "./family-B5HtE0on.mjs";
2
+ import { t as useElementId } from "./id-DGvz-2rQ.mjs";
3
+ import { Icon } from "./components/icon/index.mjs";
4
+ import { Popover as Popover$1 } from "./components/popover/index.mjs";
5
+ import { Portal, createComponent, delegateEvents, effect, insert, memo, mergeProps, setAttribute, spread, template } from "solid-js/web";
6
+ import { injectComponentStyle } from "@bysages/core/styling";
7
+ import { For, Show, createSignal, splitProps } from "solid-js";
8
+ import { Field } from "@ark-ui/solid/field";
9
+ import { Popover } from "@ark-ui/solid/popover";
10
+ // src/components/mentions/use-mentions.ts
11
+ /** The @-detection machinery behind a mention field: watch the caret,
12
+ * offer the matching candidates, and answer for the keys that drive
13
+ * them. The field element arrives as an accessor because hosts wrap it
14
+ * differently (a bare textarea, a field's own part).
15
+ *
16
+ * `onKeydown` answers whether the vessel consumed the key, so a host
17
+ * with its own Enter semantics — a composer that sends — can yield to
18
+ * the candidates first and act only when the vessel stands down. */
19
+ function useMentions(options, textarea, handlers) {
20
+ const [popupOpen, setPopupOpen] = createSignal(false);
21
+ const [matches, setMatches] = createSignal([]);
22
+ const [active, setActive] = createSignal(0);
23
+ const [anchorIndex, setAnchorIndex] = createSignal(0);
24
+ const [caretIndex, setCaretIndex] = createSignal(0);
25
+ const [activeTrigger, setActiveTrigger] = createSignal("@");
26
+ const triggers = () => {
27
+ const value = options().triggers ?? options().trigger ?? "@";
28
+ return (Array.isArray(value) ? value : [value]).filter((trigger) => trigger.length > 0);
29
+ };
30
+ const closePopup = () => {
31
+ setPopupOpen(false);
32
+ setMatches([]);
33
+ };
34
+ const moveActive = (delta) => {
35
+ const enabled = matches().map((entry, index) => ({
36
+ entry,
37
+ index
38
+ })).filter(({ entry }) => !entry.disabled);
39
+ if (enabled.length === 0) return;
40
+ const position = enabled.findIndex(({ index }) => index === active());
41
+ const next = position === -1 ? 0 : (position + delta + enabled.length) % enabled.length;
42
+ setActive(enabled[next]?.index ?? 0);
43
+ };
44
+ const detect = () => {
45
+ const text = handlers.getText();
46
+ const el = textarea();
47
+ const caret = handlers.getCaret?.() ?? el?.selectionStart ?? text.length;
48
+ setCaretIndex(caret);
49
+ const head = text.slice(0, caret);
50
+ const found = triggers().map((trigger) => ({
51
+ trigger,
52
+ anchor: head.lastIndexOf(trigger)
53
+ })).filter((candidate) => candidate.anchor !== -1).sort((left, right) => right.anchor - left.anchor || right.trigger.length - left.trigger.length)[0];
54
+ const token = found ? head.slice(found.anchor + found.trigger.length) : "";
55
+ if (!found || /\s/.test(token)) {
56
+ closePopup();
57
+ return;
58
+ }
59
+ const query = token.toLowerCase();
60
+ const roster = options().items.filter((entry) => entry.label.toLowerCase().startsWith(query) || entry.value.toLowerCase().startsWith(query));
61
+ setMatches(roster);
62
+ setActive(roster.findIndex((entry) => !entry.disabled));
63
+ setAnchorIndex(found.anchor);
64
+ setActiveTrigger(found.trigger);
65
+ setPopupOpen(roster.length > 0);
66
+ };
67
+ const insert = (entry) => {
68
+ if (entry.disabled) {
69
+ closePopup();
70
+ return;
71
+ }
72
+ if (handlers.select?.(entry) === false) {
73
+ handlers.commit?.(entry);
74
+ closePopup();
75
+ return;
76
+ }
77
+ if (handlers.commit) {
78
+ handlers.commit(entry);
79
+ closePopup();
80
+ return;
81
+ }
82
+ const text = handlers.getText();
83
+ const trigger = activeTrigger();
84
+ const replacement = entry.insertText ?? trigger + entry.label;
85
+ const suffix = entry.insertText == null ? " " : "";
86
+ const next = text.slice(0, anchorIndex()) + replacement + suffix + text.slice(caretIndex());
87
+ handlers.setText(next);
88
+ closePopup();
89
+ queueMicrotask(() => {
90
+ const el = textarea();
91
+ if (!el) return;
92
+ const caret = anchorIndex() + replacement.length + suffix.length;
93
+ el.focus();
94
+ el.setSelectionRange(caret, caret);
95
+ });
96
+ };
97
+ /** Feed the field's input events through here — the vessel watches
98
+ * the text as it lands, from the element itself. */
99
+ const onInput = () => detect();
100
+ /** Arrows move, configured commit keys insert, Escape dismisses.
101
+ * Answers `true` when the vessel consumed the key. */
102
+ const onKeydown = (event) => {
103
+ if (!popupOpen() || matches().length === 0) return false;
104
+ if (event.key === "ArrowDown") {
105
+ event.preventDefault();
106
+ moveActive(1);
107
+ } else if (event.key === "ArrowUp") {
108
+ event.preventDefault();
109
+ moveActive(-1);
110
+ } else if ((options().commitKeys ?? ["Enter", " "]).includes(event.key)) {
111
+ const entry = matches()[active()];
112
+ if (!entry || entry.disabled) return false;
113
+ event.preventDefault();
114
+ insert(entry);
115
+ } else if (event.key === "Escape") closePopup();
116
+ else return false;
117
+ return true;
118
+ };
119
+ return {
120
+ open: popupOpen,
121
+ matches,
122
+ active,
123
+ setActive,
124
+ anchorIndex,
125
+ caretIndex,
126
+ activeTrigger,
127
+ insert,
128
+ close: closePopup,
129
+ onInput,
130
+ onKeydown
131
+ };
132
+ }
133
+ // src/components/mentions/index.tsx
134
+ var _tmpl$ = /*#__PURE__*/ template(`<span data-scope=mentions data-part=option-description>`);
135
+ var _tmpl$2 = /*#__PURE__*/ template(`<span data-scope=mentions data-part=option-kind>`);
136
+ var _tmpl$3 = /*#__PURE__*/ template(`<div role=option tabindex=-1 data-scope=mentions data-part=option><span data-scope=mentions data-part=option-main><span data-scope=mentions data-part=option-label>`);
137
+ var _tmpl$4 = /*#__PURE__*/ template(`<div>`);
138
+ var _tmpl$5 = /*#__PURE__*/ template(`<div role=group data-scope=mentions data-part=group><div data-scope=mentions data-part=group-label>`);
139
+ function groupMentions(matches) {
140
+ const ordered = [];
141
+ const byName = /* @__PURE__ */ new Map();
142
+ matches.forEach((entry, index) => {
143
+ const name = entry.group ?? "";
144
+ const group = byName.get(name);
145
+ if (group) group.entries.push({
146
+ entry,
147
+ index
148
+ });
149
+ else {
150
+ const next = {
151
+ name,
152
+ entries: [{
153
+ entry,
154
+ index
155
+ }]
156
+ };
157
+ byName.set(name, next);
158
+ ordered.push(next);
159
+ }
160
+ });
161
+ return ordered;
162
+ }
163
+ /** The vessel: the candidates themselves as a floating card. A host can
164
+ * render its field through the Anchor; the rectangle fallback keeps the
165
+ * textarea in the host's own anatomy. Shares the detection state with
166
+ * the host through `useMentions`. */
167
+ const MentionsVessel = withSelfRoot(function MentionsVessel(props) {
168
+ injectComponentStyle("mentions");
169
+ const id = useElementId("mentions-vessel", () => props.id);
170
+ const popupId = () => `${id()}:popup`;
171
+ const option = (entry, index) => {
172
+ const active = () => index() === (props.active ?? 0) && !entry.disabled;
173
+ return (() => {
174
+ var _el$ = _tmpl$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
175
+ _el$.$$keydown = (event) => {
176
+ if (event.key !== "Enter" && event.key !== " ") return;
177
+ event.preventDefault();
178
+ if (!entry.disabled) props.onInsert?.(entry);
179
+ };
180
+ _el$.$$mousedown = (event) => {
181
+ if (event.button !== 0) return;
182
+ event.preventDefault();
183
+ if (!entry.disabled) props.onInsert?.(entry);
184
+ };
185
+ _el$.addEventListener("mouseenter", () => {
186
+ if (!entry.disabled) props.onActiveChange?.(index());
187
+ });
188
+ insert(_el$, createComponent(Show, {
189
+ get when() {
190
+ return entry.icon;
191
+ },
192
+ get children() {
193
+ return createComponent(Icon, { get name() {
194
+ return entry.icon;
195
+ } });
196
+ }
197
+ }), _el$2);
198
+ insert(_el$3, () => entry.label);
199
+ insert(_el$2, createComponent(Show, {
200
+ get when() {
201
+ return entry.description;
202
+ },
203
+ get children() {
204
+ var _el$4 = _tmpl$();
205
+ insert(_el$4, () => entry.description);
206
+ return _el$4;
207
+ }
208
+ }), null);
209
+ insert(_el$, createComponent(Show, {
210
+ get when() {
211
+ return entry.kind;
212
+ },
213
+ get children() {
214
+ var _el$5 = _tmpl$2();
215
+ insert(_el$5, () => entry.kind);
216
+ return _el$5;
217
+ }
218
+ }), null);
219
+ effect((_p$) => {
220
+ var _v$ = `${popupId()}:option-${index()}`, _v$2 = active(), _v$3 = entry.disabled ? "true" : void 0, _v$4 = active() ? "" : void 0, _v$5 = entry.disabled ? "" : void 0;
221
+ _v$ !== _p$.e && setAttribute(_el$, "id", _p$.e = _v$);
222
+ _v$2 !== _p$.t && setAttribute(_el$, "aria-selected", _p$.t = _v$2);
223
+ _v$3 !== _p$.a && setAttribute(_el$, "aria-disabled", _p$.a = _v$3);
224
+ _v$4 !== _p$.o && setAttribute(_el$, "data-active", _p$.o = _v$4);
225
+ _v$5 !== _p$.i && setAttribute(_el$, "data-disabled", _p$.i = _v$5);
226
+ return _p$;
227
+ }, {
228
+ e: void 0,
229
+ t: void 0,
230
+ a: void 0,
231
+ o: void 0,
232
+ i: void 0
233
+ });
234
+ return _el$;
235
+ })();
236
+ };
237
+ return createComponent(Popover.Root, {
238
+ get id() {
239
+ return `${id()}:vessel`;
240
+ },
241
+ get ids() {
242
+ return { content: popupId() };
243
+ },
244
+ get open() {
245
+ return props.open ?? false;
246
+ },
247
+ onOpenChange: (details) => props.onOpenChange?.(details.open),
248
+ get positioning() {
249
+ return memo(() => !!props.children)() ? { placement: props.placement ?? "bottom-start" } : {
250
+ placement: props.placement ?? "bottom-start",
251
+ getAnchorRect: () => props.anchor?.getBoundingClientRect() ?? null
252
+ };
253
+ },
254
+ get children() {
255
+ return [memo(() => memo(() => !!props.children)() ? createComponent(Popover.Anchor, { asChild: (anchorProps) => typeof props.children === "function" ? props.children(anchorProps()) : props.children }) : null), createComponent(Portal, { get children() {
256
+ return createComponent(Popover.Positioner, { get children() {
257
+ return createComponent(Popover.Content, { asChild: (contentProps) => (() => {
258
+ var _el$6 = _tmpl$4();
259
+ spread(_el$6, mergeProps(contentProps, {
260
+ get id() {
261
+ return popupId();
262
+ },
263
+ "role": "listbox",
264
+ get ["aria-activedescendant"]() {
265
+ return memo(() => !!(props.matches?.[props.active ?? 0] && !props.matches?.[props.active ?? 0]?.disabled))() ? `${popupId()}:option-${props.active ?? 0}` : void 0;
266
+ },
267
+ "data-scope": "mentions",
268
+ "data-part": "popup",
269
+ get ["data-size"]() {
270
+ return props.size ?? "md";
271
+ }
272
+ }), false, true);
273
+ insert(_el$6, createComponent(For, {
274
+ get each() {
275
+ return groupMentions(props.matches ?? []);
276
+ },
277
+ children: (group, groupIndex) => {
278
+ const labelId = group.name ? `${popupId()}:group-${groupIndex()}` : void 0;
279
+ const options = createComponent(For, {
280
+ get each() {
281
+ return group.entries;
282
+ },
283
+ children: ({ entry, index }) => option(entry, () => index)
284
+ });
285
+ if (!group.name) return options;
286
+ return (() => {
287
+ var _el$7 = _tmpl$5(), _el$8 = _el$7.firstChild;
288
+ setAttribute(_el$7, "aria-labelledby", labelId);
289
+ setAttribute(_el$8, "id", labelId);
290
+ insert(_el$8, () => group.name);
291
+ insert(_el$7, options, null);
292
+ return _el$7;
293
+ })();
294
+ }
295
+ }));
296
+ return _el$6;
297
+ })() });
298
+ } });
299
+ } })];
300
+ }
301
+ });
302
+ });
303
+ /**
304
+ * @-mentions: a plain textarea that, when the text before the caret ends
305
+ * with a trigger character followed by a token, offers matching
306
+ * candidates in a small anchored vessel. Entries may carry descriptions,
307
+ * icons, groups and consumer metadata. Selecting reports the whole
308
+ * entry; by default it also replaces the token with the trigger that
309
+ * opened it plus the label. Arrows move, Enter inserts, Escape dismisses.
310
+ *
311
+ * The field is the shared `Field.Textarea` — field wiring (label ids,
312
+ * the invalid state, autoresize) rides on it for free — and the vessel
313
+ * anchors to the field as a whole (popover machinery), not to the caret
314
+ * coordinates; caret-precise positioning would need a second positioning
315
+ * system for no practical gain at typical field sizes. Composers that
316
+ * keep their own field anatomy (the AI prompt input) skip this shell and
317
+ * wire `useMentions` plus `MentionsVessel` themselves.
318
+ */
319
+ function MentionsImpl(props) {
320
+ const [own, rest] = splitProps(props, [
321
+ "items",
322
+ "value",
323
+ "trigger",
324
+ "triggers",
325
+ "insertOnSelect",
326
+ "commitKeys",
327
+ "placement",
328
+ "placeholder",
329
+ "autoresize",
330
+ "invalid",
331
+ "size",
332
+ "onValueChange",
333
+ "onSelect"
334
+ ]);
335
+ const [internal, setInternal] = createSignal("");
336
+ const [fieldEl, setFieldEl] = createSignal(null);
337
+ const hostId = useElementId("mentions", () => rest.id);
338
+ const popupId = () => `${hostId()}:vessel:popup`;
339
+ const value = () => own.value ?? internal();
340
+ const mentions = useMentions(() => ({
341
+ items: own.items ?? [],
342
+ trigger: own.trigger,
343
+ triggers: own.triggers,
344
+ commitKeys: own.commitKeys
345
+ }), fieldEl, {
346
+ getText: () => fieldEl()?.value ?? value(),
347
+ setText: (next) => {
348
+ setInternal(next);
349
+ own.onValueChange?.(next);
350
+ },
351
+ select: (entry) => {
352
+ own.onSelect?.(entry);
353
+ return own.insertOnSelect !== false;
354
+ }
355
+ });
356
+ const onInput = () => {
357
+ const node = fieldEl();
358
+ if (!node) return;
359
+ setInternal(node.value);
360
+ own.onValueChange?.(node.value);
361
+ mentions.onInput();
362
+ };
363
+ const field = (anchorProps) => createComponent(Field.Textarea, mergeProps(anchorProps, {
364
+ ref: (node) => setFieldEl(node),
365
+ get autoresize() {
366
+ return own.autoresize ?? false;
367
+ },
368
+ get ["aria-invalid"]() {
369
+ return own.invalid ? "true" : void 0;
370
+ },
371
+ get ["aria-expanded"]() {
372
+ return mentions.open();
373
+ },
374
+ get ["aria-controls"]() {
375
+ return memo(() => !!mentions.open())() ? popupId() : void 0;
376
+ },
377
+ rows: 3,
378
+ get placeholder() {
379
+ return own.placeholder;
380
+ },
381
+ get value() {
382
+ return value();
383
+ },
384
+ onInput,
385
+ onKeyDown: (event) => {
386
+ mentions.onKeydown(event);
387
+ },
388
+ "data-scope": "mentions",
389
+ "data-part": "textarea"
390
+ }));
391
+ return (() => {
392
+ var _el$9 = _tmpl$4();
393
+ spread(_el$9, mergeProps(rest, {
394
+ get id() {
395
+ return hostId();
396
+ },
397
+ "data-scope": "mentions",
398
+ "data-part": "root",
399
+ get ["data-size"]() {
400
+ return own.size ?? "md";
401
+ }
402
+ }), false, true);
403
+ insert(_el$9, createComponent(MentionsVessel, {
404
+ get open() {
405
+ return mentions.open();
406
+ },
407
+ get matches() {
408
+ return mentions.matches();
409
+ },
410
+ get active() {
411
+ return mentions.active();
412
+ },
413
+ get size() {
414
+ return own.size ?? "md";
415
+ },
416
+ get id() {
417
+ return `${hostId()}:vessel`;
418
+ },
419
+ get placement() {
420
+ return own.placement ?? "bottom-start";
421
+ },
422
+ get onInsert() {
423
+ return mentions.insert;
424
+ },
425
+ get onActiveChange() {
426
+ return mentions.setActive;
427
+ },
428
+ onOpenChange: (open) => {
429
+ if (!open) mentions.close();
430
+ },
431
+ children: field
432
+ }));
433
+ return _el$9;
434
+ })();
435
+ }
436
+ const Mentions = defineFamily(MentionsImpl, Popover$1);
437
+ delegateEvents(["mousedown", "keydown"]);
438
+ export { MentionsVessel as n, useMentions as r, Mentions as t };
@@ -1,15 +1,15 @@
1
- import { t as defineFamily } from "./family-Cmd8HEyK.mjs";
2
- import { r as iconNode } from "./icon-DTqmJCd5.mjs";
3
- import { t as useElementId } from "./id-2ygNzPHF.mjs";
4
- import { createComponent, effect, insert, memo, mergeProps, ref, setAttribute, spread, template } from "@solidjs/web";
1
+ import { t as defineFamily } from "./family-B5HtE0on.mjs";
2
+ import { r as iconNode } from "./icon-DQqYA2fO.mjs";
3
+ import { t as useElementId } from "./id-DGvz-2rQ.mjs";
4
+ import { createComponent, effect, insert, memo, mergeProps, spread, template, use } from "solid-js/web";
5
5
  import { injectComponentStyle } from "@bysages/core/styling";
6
6
  import { For, Show, createEffect, createSignal, onMount, splitProps } from "solid-js";
7
7
  import { useFieldContext } from "@ark-ui/solid/field";
8
8
  import { Select, createListCollection } from "@ark-ui/solid/select";
9
- //#region src/components/select/native.tsx
10
- var _tmpl$ = /* @__PURE__ */ template(`<option value disabled>`);
11
- var _tmpl$2 = /* @__PURE__ */ template(`<span><select><!><!>`);
12
- var _tmpl$3 = /* @__PURE__ */ template(`<option>`);
9
+ // src/components/select/native.tsx
10
+ var _tmpl$ = /*#__PURE__*/ template(`<option value disabled>`);
11
+ var _tmpl$2 = /*#__PURE__*/ template(`<span><select>`);
12
+ var _tmpl$3 = /*#__PURE__*/ template(`<option>`);
13
13
  function NativeSelect(props) {
14
14
  injectComponentStyle("select");
15
15
  const field = useFieldContext();
@@ -34,89 +34,70 @@ function NativeSelect(props) {
34
34
  const fieldProps = field?.().getInputProps() ?? {};
35
35
  const empty = () => own.value == null || own.value === "";
36
36
  const off = () => own.disabled || field?.().disabled;
37
- var _el$ = _tmpl$2();
38
- var _el$2 = _el$.firstChild;
39
- var _el$4 = _el$2.firstChild;
40
- var _el$5 = _el$4.nextSibling;
41
- spread(_el$, [rest, {
42
- "data-scope": "select",
43
- "data-part": "native-root",
44
- get "data-size"() {
45
- return own.size ?? "md";
46
- },
47
- get "data-invalid"() {
48
- return own.invalid || field?.().invalid ? "" : void 0;
49
- },
50
- get "data-disabled"() {
51
- return off() ? "" : void 0;
52
- },
53
- get "data-placeholder-shown"() {
54
- return empty() ? "" : void 0;
55
- }
56
- }], true);
57
- ref(() => {
58
- return setSelect;
59
- }, _el$2);
60
- spread(_el$2, [fieldProps, {
61
- get "aria-label"() {
62
- return own["aria-label"];
63
- },
64
- get "aria-labelledby"() {
65
- return own["aria-labelledby"];
66
- },
67
- "data-scope": "select",
68
- "data-part": "native",
69
- get disabled() {
70
- return off() || void 0;
71
- },
72
- onChange: (event) => own.onValueChange?.(event.currentTarget.value)
73
- }], true);
74
- insert(_el$2, createComponent(Show, {
75
- get when() {
76
- return own.placeholder;
77
- },
78
- get children() {
79
- var _el$3 = _tmpl$();
80
- insert(_el$3, () => {
37
+ return (() => {
38
+ var _el$ = _tmpl$2(), _el$2 = _el$.firstChild;
39
+ spread(_el$, mergeProps(rest, {
40
+ "data-scope": "select",
41
+ "data-part": "native-root",
42
+ get ["data-size"]() {
43
+ return own.size ?? "md";
44
+ },
45
+ get ["data-invalid"]() {
46
+ return own.invalid || field?.().invalid ? "" : void 0;
47
+ },
48
+ get ["data-disabled"]() {
49
+ return off() ? "" : void 0;
50
+ },
51
+ get ["data-placeholder-shown"]() {
52
+ return empty() ? "" : void 0;
53
+ }
54
+ }), false, true);
55
+ use(setSelect, _el$2);
56
+ spread(_el$2, mergeProps(fieldProps, {
57
+ get ["aria-label"]() {
58
+ return own["aria-label"];
59
+ },
60
+ get ["aria-labelledby"]() {
61
+ return own["aria-labelledby"];
62
+ },
63
+ "data-scope": "select",
64
+ "data-part": "native",
65
+ get disabled() {
66
+ return off() || void 0;
67
+ },
68
+ "onChange": (event) => own.onValueChange?.(event.currentTarget.value)
69
+ }), false, true);
70
+ insert(_el$2, createComponent(Show, {
71
+ get when() {
81
72
  return own.placeholder;
82
- });
83
- effect(() => empty() ? void 0 : true, (_v$) => {
84
- setAttribute(_el$3, "hidden", _v$);
85
- });
86
- return _el$3;
87
- }
88
- }), _el$4);
89
- insert(_el$2, createComponent(For, {
90
- get each() {
91
- return own.options;
92
- },
93
- children: (option) => (() => {
94
- var _el$6 = _tmpl$3();
95
- insert(_el$6, () => {
96
- return option.label;
97
- });
98
- effect(() => {
99
- return {
100
- e: option.value,
101
- t: option.disabled
102
- };
103
- }, ({ e, t }, _p$) => {
104
- _el$6.value = e;
105
- t !== _p$?.t && setAttribute(_el$6, "disabled", t);
106
- });
107
- return _el$6;
108
- })()
109
- }), _el$5);
110
- insert(_el$, () => {
111
- return iconNode("chevron-down", {
73
+ },
74
+ get children() {
75
+ var _el$3 = _tmpl$();
76
+ insert(_el$3, () => own.placeholder);
77
+ effect(() => _el$3.hidden = empty() ? void 0 : true);
78
+ return _el$3;
79
+ }
80
+ }), null);
81
+ insert(_el$2, createComponent(For, {
82
+ get each() {
83
+ return own.options;
84
+ },
85
+ children: (option) => (() => {
86
+ var _el$4 = _tmpl$3();
87
+ insert(_el$4, () => option.label);
88
+ effect(() => _el$4.disabled = option.disabled);
89
+ effect(() => _el$4.value = option.value);
90
+ return _el$4;
91
+ })()
92
+ }), null);
93
+ insert(_el$, () => iconNode("chevron-down", {
112
94
  "data-scope": "select",
113
95
  "data-part": "native-icon"
114
- });
115
- }, null);
116
- return _el$;
96
+ }), null);
97
+ return _el$;
98
+ })();
117
99
  }
118
- //#endregion
119
- //#region src/components/select/index.tsx
100
+ // src/components/select/index.tsx
120
101
  function SelectRoot(props) {
121
102
  const [own, rest] = splitProps(props, ["size"]);
122
103
  const id = useElementId("select", () => rest.id);
@@ -124,7 +105,7 @@ function SelectRoot(props) {
124
105
  get id() {
125
106
  return id();
126
107
  },
127
- get "data-size"() {
108
+ get ["data-size"]() {
128
109
  return own.size ?? "md";
129
110
  }
130
111
  }));
@@ -172,9 +153,7 @@ function SelectFacade(props) {
172
153
  get defaultValue() {
173
154
  return toArkValue(props.value ?? props.defaultValue);
174
155
  }
175
- }, () => {
176
- return props.value === void 0 ? {} : { value: toArkValue(props.value) };
177
- }, {
156
+ }, () => props.value === void 0 ? {} : { value: toArkValue(props.value) }, {
178
157
  onValueChange: (details) => props.onValueChange?.(props.multiple ? details.value : details.value.at(0) ?? ""),
179
158
  get children() {
180
159
  return [
@@ -191,10 +170,8 @@ function SelectFacade(props) {
191
170
  createComponent(Select.Control, { get children() {
192
171
  return [
193
172
  createComponent(Select.Trigger, {
194
- get "aria-label"() {
195
- return memo(() => {
196
- return !!props.label;
197
- })() ? void 0 : props.placeholder;
173
+ get ["aria-label"]() {
174
+ return memo(() => !!props.label)() ? void 0 : props.placeholder;
198
175
  },
199
176
  get children() {
200
177
  return createComponent(Select.ValueText, { get placeholder() {
@@ -288,5 +265,4 @@ const Select$1 = defineFamily(SelectFacade, {
288
265
  Root: SelectRoot
289
266
  });
290
267
  injectComponentStyle("select");
291
- //#endregion
292
268
  export { NativeSelect as n, Select$1 as t };
@@ -1,17 +1,16 @@
1
- import { t as defineFamily } from "./family-Cmd8HEyK.mjs";
2
- import { t as useElementId } from "./id-2ygNzPHF.mjs";
3
- import { createComponent, mergeProps } from "@solidjs/web";
1
+ import { t as defineFamily } from "./family-B5HtE0on.mjs";
2
+ import { t as useElementId } from "./id-DGvz-2rQ.mjs";
3
+ import { createComponent, mergeProps } from "solid-js/web";
4
4
  import { injectComponentStyle } from "@bysages/core/styling";
5
5
  import { For, createComponent as createComponent$1, mergeProps as mergeProps$1 } from "solid-js";
6
6
  import { Toc } from "@ark-ui/solid/toc";
7
- //#region src/components/toc/TocIndicator.tsx
7
+ // src/components/toc/TocIndicator.tsx
8
8
  /** The active stroke is decoration; hidden so the list reads as links
9
9
  * alone. */
10
10
  function TocIndicator(props) {
11
11
  return createComponent(Toc.Indicator, mergeProps(props, { "aria-hidden": "true" }));
12
12
  }
13
- //#endregion
14
- //#region src/components/toc/index.tsx
13
+ // src/components/toc/index.tsx
15
14
  /** Ark's Toc, dressed in the paper-and-ink system: a quiet rail of links
16
15
  * beside the scroll, one stroke of primary ink marking where the reader
17
16
  * stands. The API is Ark's own — Root, Title, List, Item, Link, Indicator. */
@@ -84,5 +83,4 @@ const Toc$1 = defineFamily(TocFacade, {
84
83
  Content: TocContent
85
84
  });
86
85
  injectComponentStyle("toc");
87
- //#endregion
88
86
  export { Toc$1 as t };