@bysages/react 0.4.4 → 0.6.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 (314) hide show
  1. package/dist/ai-B0o-dsAf.mjs +309 -0
  2. package/dist/ai-prompt-input-Cl9ulICF.mjs +401 -0
  3. package/dist/{ai-response-CjjjprMY.mjs → ai-response-DTxdL5rX.mjs} +9 -11
  4. package/dist/{chevron-BA7kV9m7.mjs → chevron-DnImlNip.mjs} +2 -3
  5. package/dist/components/accordion/index.d.mts +1 -2
  6. package/dist/components/accordion/index.mjs +3 -4
  7. package/dist/components/affix/index.d.mts +1 -2
  8. package/dist/components/affix/index.mjs +2 -3
  9. package/dist/components/ai/index.d.mts +107 -2
  10. package/dist/components/ai/index.mjs +7 -82
  11. package/dist/components/ai-action/index.d.mts +0 -2
  12. package/dist/components/ai-action/index.mjs +2 -3
  13. package/dist/components/ai-attachments/index.d.mts +0 -2
  14. package/dist/components/ai-attachments/index.mjs +4 -5
  15. package/dist/components/ai-message/index.d.mts +2 -14
  16. package/dist/components/ai-message/index.mjs +5 -4
  17. package/dist/components/ai-prompt-input/index.d.mts +14 -18
  18. package/dist/components/ai-prompt-input/index.mjs +1 -126
  19. package/dist/components/ai-reasoning/index.d.mts +0 -2
  20. package/dist/components/ai-reasoning/index.mjs +3 -4
  21. package/dist/components/ai-response/index.d.mts +1 -3
  22. package/dist/components/ai-response/index.mjs +1 -2
  23. package/dist/components/ai-source/index.d.mts +0 -2
  24. package/dist/components/ai-source/index.mjs +2 -3
  25. package/dist/components/ai-suggestion/index.d.mts +0 -2
  26. package/dist/components/ai-suggestion/index.mjs +2 -3
  27. package/dist/components/ai-tool/index.d.mts +2 -24
  28. package/dist/components/ai-tool/index.mjs +46 -14
  29. package/dist/components/alert/index.d.mts +1 -2
  30. package/dist/components/alert/index.mjs +2 -3
  31. package/dist/components/angle-slider/index.d.mts +1 -2
  32. package/dist/components/angle-slider/index.mjs +2 -3
  33. package/dist/components/aspect-ratio/index.d.mts +1 -2
  34. package/dist/components/aspect-ratio/index.mjs +2 -3
  35. package/dist/components/autocomplete/index.d.mts +5 -3
  36. package/dist/components/autocomplete/index.mjs +12 -10
  37. package/dist/components/avatar/index.d.mts +1 -2
  38. package/dist/components/avatar/index.mjs +2 -3
  39. package/dist/components/avatar-group/index.d.mts +1 -2
  40. package/dist/components/avatar-group/index.mjs +2 -3
  41. package/dist/components/back-top/index.d.mts +1 -2
  42. package/dist/components/back-top/index.mjs +3 -4
  43. package/dist/components/badge/index.d.mts +1 -2
  44. package/dist/components/badge/index.mjs +2 -3
  45. package/dist/components/banner/index.d.mts +1 -2
  46. package/dist/components/banner/index.mjs +3 -4
  47. package/dist/components/bento/index.d.mts +1 -3
  48. package/dist/components/bento/index.mjs +1 -2
  49. package/dist/components/block-ui/index.d.mts +1 -2
  50. package/dist/components/block-ui/index.mjs +2 -3
  51. package/dist/components/breadcrumb/index.d.mts +1 -2
  52. package/dist/components/breadcrumb/index.mjs +2 -3
  53. package/dist/components/browser/index.d.mts +1 -3
  54. package/dist/components/browser/index.mjs +1 -2
  55. package/dist/components/button/index.d.mts +1 -2
  56. package/dist/components/button/index.mjs +2 -3
  57. package/dist/components/button-group/index.d.mts +1 -2
  58. package/dist/components/button-group/index.mjs +1 -2
  59. package/dist/components/calendar/index.d.mts +1 -2
  60. package/dist/components/calendar/index.mjs +3 -4
  61. package/dist/components/card/index.d.mts +1 -3
  62. package/dist/components/card/index.mjs +1 -2
  63. package/dist/components/carousel/index.d.mts +1 -2
  64. package/dist/components/carousel/index.mjs +3 -4
  65. package/dist/components/cascade-select/index.d.mts +5 -3
  66. package/dist/components/cascade-select/index.mjs +42 -40
  67. package/dist/components/checkbox/index.d.mts +1 -2
  68. package/dist/components/checkbox/index.mjs +3 -4
  69. package/dist/components/checkbox-group/index.d.mts +1 -2
  70. package/dist/components/checkbox-group/index.mjs +3 -4
  71. package/dist/components/chip/index.d.mts +1 -2
  72. package/dist/components/chip/index.mjs +2 -3
  73. package/dist/components/client-only/index.d.mts +0 -2
  74. package/dist/components/client-only/index.mjs +2 -3
  75. package/dist/components/clipboard/index.d.mts +1 -2
  76. package/dist/components/clipboard/index.mjs +3 -4
  77. package/dist/components/collapsible/index.d.mts +1 -2
  78. package/dist/components/collapsible/index.mjs +3 -4
  79. package/dist/components/collection/index.mjs +1 -2
  80. package/dist/components/color-picker/index.d.mts +10 -3
  81. package/dist/components/color-picker/index.mjs +39 -33
  82. package/dist/components/combobox/index.d.mts +10 -3
  83. package/dist/components/combobox/index.mjs +17 -12
  84. package/dist/components/command/index.d.mts +5 -3
  85. package/dist/components/command/index.mjs +74 -72
  86. package/dist/components/comment/index.d.mts +1 -2
  87. package/dist/components/comment/index.mjs +2 -3
  88. package/dist/components/config-provider/index.d.mts +1 -2
  89. package/dist/components/config-provider/index.mjs +2 -3
  90. package/dist/components/container/index.d.mts +1 -2
  91. package/dist/components/container/index.mjs +2 -3
  92. package/dist/components/data-view/index.d.mts +1 -2
  93. package/dist/components/data-view/index.mjs +3 -4
  94. package/dist/components/date-input/index.d.mts +0 -2
  95. package/dist/components/date-input/index.mjs +2 -3
  96. package/dist/components/date-picker/index.d.mts +9 -3
  97. package/dist/components/date-picker/index.mjs +30 -25
  98. package/dist/components/deferred-content/index.d.mts +1 -2
  99. package/dist/components/deferred-content/index.mjs +2 -3
  100. package/dist/components/descriptions/index.d.mts +1 -2
  101. package/dist/components/descriptions/index.mjs +2 -3
  102. package/dist/components/dialog/index.d.mts +49 -5
  103. package/dist/components/dialog/index.mjs +67 -20
  104. package/dist/components/dock/index.d.mts +1 -3
  105. package/dist/components/dock/index.mjs +1 -2
  106. package/dist/components/download-trigger/index.d.mts +0 -2
  107. package/dist/components/download-trigger/index.mjs +2 -3
  108. package/dist/components/drawer/index.d.mts +20 -5
  109. package/dist/components/drawer/index.mjs +21 -16
  110. package/dist/components/dynamic-input/index.d.mts +1 -2
  111. package/dist/components/dynamic-input/index.mjs +5 -6
  112. package/dist/components/editable/index.d.mts +1 -2
  113. package/dist/components/editable/index.mjs +3 -4
  114. package/dist/components/ellipsis/index.d.mts +1 -2
  115. package/dist/components/ellipsis/index.mjs +2 -3
  116. package/dist/components/empty/index.d.mts +1 -3
  117. package/dist/components/empty/index.mjs +1 -2
  118. package/dist/components/field/index.d.mts +1 -2
  119. package/dist/components/field/index.mjs +2 -3
  120. package/dist/components/fieldset/index.d.mts +1 -2
  121. package/dist/components/fieldset/index.mjs +2 -3
  122. package/dist/components/file-upload/index.d.mts +1 -2
  123. package/dist/components/file-upload/index.mjs +3 -4
  124. package/dist/components/float-button/index.d.mts +1 -2
  125. package/dist/components/float-button/index.mjs +3 -4
  126. package/dist/components/floating-panel/index.d.mts +20 -5
  127. package/dist/components/floating-panel/index.mjs +37 -32
  128. package/dist/components/focus-trap/index.d.mts +0 -2
  129. package/dist/components/focus-trap/index.mjs +2 -3
  130. package/dist/components/form/index.d.mts +0 -2
  131. package/dist/components/form/index.mjs +2 -3
  132. package/dist/components/format/index.d.mts +1 -3
  133. package/dist/components/format/index.mjs +1 -2
  134. package/dist/components/frame/index.d.mts +1 -3
  135. package/dist/components/frame/index.mjs +3 -4
  136. package/dist/components/grid/index.d.mts +1 -2
  137. package/dist/components/grid/index.mjs +2 -3
  138. package/dist/components/highlight/index.d.mts +1 -3
  139. package/dist/components/highlight/index.mjs +2 -3
  140. package/dist/components/hover-card/index.d.mts +18 -5
  141. package/dist/components/hover-card/index.mjs +16 -11
  142. package/dist/components/icon/index.d.mts +1 -2
  143. package/dist/components/icon/index.mjs +2 -3
  144. package/dist/components/image/index.d.mts +1 -2
  145. package/dist/components/image/index.mjs +3 -4
  146. package/dist/components/image-cropper/index.d.mts +1 -2
  147. package/dist/components/image-cropper/index.mjs +2 -3
  148. package/dist/components/image-viewer/index.d.mts +1 -1
  149. package/dist/components/image-viewer/index.mjs +1 -2
  150. package/dist/components/input/index.d.mts +1 -3
  151. package/dist/components/input/index.mjs +1 -2
  152. package/dist/components/input-group/index.d.mts +1 -3
  153. package/dist/components/input-group/index.mjs +1 -2
  154. package/dist/components/json-tree-view/index.d.mts +1 -2
  155. package/dist/components/json-tree-view/index.mjs +3 -4
  156. package/dist/components/kbd/index.d.mts +1 -2
  157. package/dist/components/kbd/index.mjs +2 -3
  158. package/dist/components/layout/index.d.mts +1 -2
  159. package/dist/components/layout/index.mjs +19 -15
  160. package/dist/components/link/index.d.mts +1 -2
  161. package/dist/components/link/index.mjs +2 -3
  162. package/dist/components/list/index.d.mts +1 -2
  163. package/dist/components/list/index.mjs +1 -2
  164. package/dist/components/listbox/index.d.mts +0 -2
  165. package/dist/components/listbox/index.mjs +3 -4
  166. package/dist/components/marquee/index.d.mts +1 -2
  167. package/dist/components/marquee/index.mjs +2 -3
  168. package/dist/components/masonry/index.d.mts +1 -2
  169. package/dist/components/masonry/index.mjs +2 -3
  170. package/dist/components/media-player/index.d.mts +1 -1
  171. package/dist/components/media-player/index.mjs +1 -2
  172. package/dist/components/mentions/index.d.mts +2 -2
  173. package/dist/components/mentions/index.mjs +1 -2
  174. package/dist/components/menu/index.d.mts +11 -4
  175. package/dist/components/menu/index.mjs +15 -10
  176. package/dist/components/menubar/index.d.mts +5 -3
  177. package/dist/components/menubar/index.mjs +14 -12
  178. package/dist/components/meter/index.d.mts +1 -3
  179. package/dist/components/meter/index.mjs +1 -2
  180. package/dist/components/navigation-menu/index.d.mts +10 -3
  181. package/dist/components/navigation-menu/index.mjs +9 -4
  182. package/dist/components/number-input/index.d.mts +1 -2
  183. package/dist/components/number-input/index.mjs +3 -4
  184. package/dist/components/order-list/index.d.mts +1 -2
  185. package/dist/components/order-list/index.mjs +4 -5
  186. package/dist/components/page-header/index.d.mts +1 -3
  187. package/dist/components/page-header/index.mjs +1 -2
  188. package/dist/components/pagination/index.d.mts +3 -4
  189. package/dist/components/pagination/index.mjs +3 -4
  190. package/dist/components/password-input/index.d.mts +1 -2
  191. package/dist/components/password-input/index.mjs +3 -4
  192. package/dist/components/pin-input/index.d.mts +1 -2
  193. package/dist/components/pin-input/index.mjs +2 -3
  194. package/dist/components/popconfirm/index.d.mts +6 -4
  195. package/dist/components/popconfirm/index.mjs +33 -31
  196. package/dist/components/popover/index.d.mts +1 -1
  197. package/dist/components/popover/index.mjs +23 -18
  198. package/dist/components/presence/index.d.mts +0 -2
  199. package/dist/components/presence/index.mjs +2 -3
  200. package/dist/components/progress/index.d.mts +1 -2
  201. package/dist/components/progress/index.mjs +2 -3
  202. package/dist/components/progress-group/index.d.mts +1 -2
  203. package/dist/components/progress-group/index.mjs +2 -3
  204. package/dist/components/qr-code/index.d.mts +1 -2
  205. package/dist/components/qr-code/index.mjs +2 -3
  206. package/dist/components/radio-group/index.d.mts +1 -2
  207. package/dist/components/radio-group/index.mjs +2 -3
  208. package/dist/components/rating-group/index.d.mts +1 -2
  209. package/dist/components/rating-group/index.mjs +3 -4
  210. package/dist/components/result/index.d.mts +1 -2
  211. package/dist/components/result/index.mjs +2 -3
  212. package/dist/components/scroll-area/index.d.mts +8 -3
  213. package/dist/components/scroll-area/index.mjs +7 -6
  214. package/dist/components/segment-group/index.d.mts +1 -2
  215. package/dist/components/segment-group/index.mjs +2 -3
  216. package/dist/components/select/index.d.mts +1 -1
  217. package/dist/components/select/index.mjs +1 -2
  218. package/dist/components/separator/index.d.mts +1 -2
  219. package/dist/components/separator/index.mjs +2 -3
  220. package/dist/components/signature-pad/index.d.mts +1 -2
  221. package/dist/components/signature-pad/index.mjs +3 -4
  222. package/dist/components/skeleton/index.d.mts +1 -2
  223. package/dist/components/skeleton/index.mjs +2 -3
  224. package/dist/components/slider/index.d.mts +1 -2
  225. package/dist/components/slider/index.mjs +2 -3
  226. package/dist/components/spinner/index.d.mts +1 -2
  227. package/dist/components/spinner/index.mjs +3 -4
  228. package/dist/components/split-button/index.d.mts +5 -3
  229. package/dist/components/split-button/index.mjs +16 -14
  230. package/dist/components/splitter/index.d.mts +1 -2
  231. package/dist/components/splitter/index.mjs +2 -3
  232. package/dist/components/spotlight/index.d.mts +1 -2
  233. package/dist/components/spotlight/index.mjs +2 -3
  234. package/dist/components/stack/index.d.mts +1 -2
  235. package/dist/components/stack/index.mjs +2 -3
  236. package/dist/components/stat/index.d.mts +1 -3
  237. package/dist/components/stat/index.mjs +1 -2
  238. package/dist/components/steps/index.d.mts +0 -2
  239. package/dist/components/steps/index.mjs +2 -3
  240. package/dist/components/swap/index.d.mts +1 -2
  241. package/dist/components/swap/index.mjs +3 -4
  242. package/dist/components/switch/index.d.mts +1 -2
  243. package/dist/components/switch/index.mjs +2 -3
  244. package/dist/components/table/index.d.mts +21 -3
  245. package/dist/components/table/index.mjs +28 -14
  246. package/dist/components/tabs/index.d.mts +9 -3
  247. package/dist/components/tabs/index.mjs +36 -8
  248. package/dist/components/tag/index.d.mts +1 -2
  249. package/dist/components/tag/index.mjs +3 -4
  250. package/dist/components/tags-input/index.d.mts +1 -2
  251. package/dist/components/tags-input/index.mjs +3 -4
  252. package/dist/components/terminal/index.d.mts +4 -3
  253. package/dist/components/terminal/index.mjs +8 -7
  254. package/dist/components/textarea/index.d.mts +1 -2
  255. package/dist/components/textarea/index.mjs +2 -3
  256. package/dist/components/timeline/index.d.mts +1 -2
  257. package/dist/components/timeline/index.mjs +1 -2
  258. package/dist/components/timer/index.d.mts +1 -2
  259. package/dist/components/timer/index.mjs +2 -3
  260. package/dist/components/toast/index.d.mts +0 -2
  261. package/dist/components/toast/index.mjs +4 -5
  262. package/dist/components/toc/index.d.mts +1 -2
  263. package/dist/components/toc/index.mjs +2 -3
  264. package/dist/components/toggle/index.d.mts +1 -2
  265. package/dist/components/toggle/index.mjs +2 -3
  266. package/dist/components/toggle-group/index.d.mts +1 -2
  267. package/dist/components/toggle-group/index.mjs +3 -4
  268. package/dist/components/toolbar/index.d.mts +1 -2
  269. package/dist/components/toolbar/index.mjs +2 -3
  270. package/dist/components/tooltip/index.d.mts +18 -5
  271. package/dist/components/tooltip/index.mjs +10 -5
  272. package/dist/components/tour/index.d.mts +20 -5
  273. package/dist/components/tour/index.mjs +18 -13
  274. package/dist/components/transfer/index.d.mts +1 -2
  275. package/dist/components/transfer/index.mjs +5 -6
  276. package/dist/components/tree-select/index.d.mts +6 -4
  277. package/dist/components/tree-select/index.mjs +43 -41
  278. package/dist/components/tree-view/index.d.mts +15 -5
  279. package/dist/components/tree-view/index.mjs +30 -12
  280. package/dist/components/typography/index.d.mts +9 -7
  281. package/dist/components/typography/index.mjs +10 -3
  282. package/dist/components/user/index.d.mts +1 -2
  283. package/dist/components/user/index.mjs +2 -3
  284. package/dist/components/virtual-list/index.d.mts +1 -2
  285. package/dist/components/virtual-list/index.mjs +2 -3
  286. package/dist/components/watermark/index.d.mts +1 -2
  287. package/dist/components/watermark/index.mjs +2 -3
  288. package/dist/{family-DE_GQeeM.mjs → family-Co1YsN4N.mjs} +1 -2
  289. package/dist/floating-BhcDRgnx.d.mts +7 -0
  290. package/dist/floating-CMR7cvmA.mjs +33 -0
  291. package/dist/generative/index.d.mts +0 -2
  292. package/dist/generative/index.mjs +28 -53
  293. package/dist/{icon-Cri0-7-x.mjs → icon-C9udWCyz.mjs} +1 -2
  294. package/dist/{id-C37UYLwJ.mjs → id-Ctic_3o8.mjs} +1 -2
  295. package/dist/{image-viewer-D4FuYrk6.mjs → image-viewer-BPTApdoP.mjs} +50 -52
  296. package/dist/index-CEYybyEQ.d.mts +163 -0
  297. package/dist/index-CjO4Ggf0.d.mts +115 -0
  298. package/dist/{index-BcRdWGY-.d.mts → index-DIZEFqJM.d.mts} +0 -8
  299. package/dist/{index-D_iKc2Uw.d.mts → index-DZ2S5rMj.d.mts} +10 -6
  300. package/dist/index-j02dTkfc.d.mts +37 -0
  301. package/dist/index-lCsvE2Vl.d.mts +37 -0
  302. package/dist/{index-Dj8S4eyJ.d.mts → index-n9VlNO7D.d.mts} +4 -5
  303. package/dist/index.d.mts +13 -13
  304. package/dist/index.mjs +10 -10
  305. package/dist/{input-BDpQ0e6G.mjs → input-YRjehBhU.mjs} +3 -5
  306. package/dist/{media-player-C0WcjVI-.mjs → media-player-DxG0EYz7.mjs} +7 -12
  307. package/dist/mentions-B59tQDPt.mjs +341 -0
  308. package/dist/{messages-1jJWtaYU.mjs → messages-B6n0lVyt.mjs} +1 -2
  309. package/dist/{select-D_soVdWK.mjs → select-BLFqfeVw.mjs} +24 -20
  310. package/package.json +17 -17
  311. package/dist/index-B4twHAQC.d.mts +0 -10456
  312. package/dist/index-Bbg4heDO.d.mts +0 -113
  313. package/dist/index-Eu-Bttta.d.mts +0 -24
  314. package/dist/mentions-BwnyvdXz.mjs +0 -213
@@ -0,0 +1,341 @@
1
+ import { t as useElementId } from "./id-Ctic_3o8.mjs";
2
+ import { t as withSelfRoot } from "./family-Co1YsN4N.mjs";
3
+ import { Field } from "./components/field/index.mjs";
4
+ import { t as FloatingPortal } from "./floating-CMR7cvmA.mjs";
5
+ import { Icon } from "./components/icon/index.mjs";
6
+ import { Popover as Popover$1 } from "./components/popover/index.mjs";
7
+ import { injectComponentStyle } from "@bysages/core/styling";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Fragment as Fragment$1, useRef, useState } from "react";
10
+ import { Popover } from "@ark-ui/react/popover";
11
+ // src/components/mentions/use-mentions.ts
12
+ /** The detection machinery behind a mention field: watch the caret,
13
+ * offer the matching candidates, and answer for the keys that drive
14
+ * them. The field element arrives as a getter because hosts wrap it
15
+ * differently (a bare textarea, a field part's ref).
16
+ *
17
+ * `onKeydown` answers whether the vessel consumed the key, so a host
18
+ * with its own Enter semantics — a composer that sends — can yield to
19
+ * the candidates first and act only when the vessel stands down. */
20
+ function useMentions(options, textarea, handlers) {
21
+ const [popupOpen, setPopupOpen] = useState(false);
22
+ const [matches, setMatches] = useState([]);
23
+ const [active, setActive] = useState(0);
24
+ const anchorIndex = useRef(0);
25
+ const caretIndex = useRef(0);
26
+ const activeTrigger = useRef("@");
27
+ const resolve = () => typeof options === "function" ? options() : options;
28
+ const triggers = () => {
29
+ const value = resolve().triggers ?? resolve().trigger ?? "@";
30
+ return (Array.isArray(value) ? value : [value]).filter((trigger) => trigger.length > 0);
31
+ };
32
+ const closePopup = () => {
33
+ setPopupOpen(false);
34
+ setMatches([]);
35
+ };
36
+ const moveActive = (delta) => {
37
+ const enabled = matches.map((entry, index) => ({
38
+ entry,
39
+ index
40
+ })).filter(({ entry }) => !entry.disabled);
41
+ if (enabled.length === 0) return;
42
+ const position = enabled.findIndex(({ index }) => index === active);
43
+ const next = position === -1 ? 0 : (position + delta + enabled.length) % enabled.length;
44
+ setActive(enabled[next]?.index ?? 0);
45
+ };
46
+ const detect = () => {
47
+ const text = handlers.getText();
48
+ const el = textarea();
49
+ const caret = handlers.getCaret?.() ?? el?.selectionStart ?? text.length;
50
+ caretIndex.current = caret;
51
+ const head = text.slice(0, caret);
52
+ const found = triggers().map((trigger) => ({
53
+ trigger,
54
+ anchor: head.lastIndexOf(trigger)
55
+ })).filter((candidate) => candidate.anchor !== -1).sort((left, right) => right.anchor - left.anchor || right.trigger.length - left.trigger.length)[0];
56
+ const token = found ? head.slice(found.anchor + found.trigger.length) : "";
57
+ if (!found || /\s/.test(token)) {
58
+ closePopup();
59
+ return;
60
+ }
61
+ const query = token.toLowerCase();
62
+ const roster = resolve().items.filter((entry) => entry.label.toLowerCase().startsWith(query) || entry.value.toLowerCase().startsWith(query));
63
+ setMatches(roster);
64
+ setActive(roster.findIndex((entry) => !entry.disabled));
65
+ anchorIndex.current = found.anchor;
66
+ activeTrigger.current = found.trigger;
67
+ setPopupOpen(roster.length > 0);
68
+ };
69
+ const insert = (entry) => {
70
+ if (entry.disabled) {
71
+ closePopup();
72
+ return;
73
+ }
74
+ if (handlers.select?.(entry) === false) {
75
+ handlers.commit?.(entry);
76
+ closePopup();
77
+ return;
78
+ }
79
+ if (handlers.commit) {
80
+ handlers.commit(entry);
81
+ closePopup();
82
+ return;
83
+ }
84
+ const text = handlers.getText();
85
+ const trigger = activeTrigger.current;
86
+ const replacement = entry.insertText ?? trigger + entry.label;
87
+ const suffix = entry.insertText == null ? " " : "";
88
+ const next = text.slice(0, anchorIndex.current) + replacement + suffix + text.slice(caretIndex.current);
89
+ handlers.setText(next);
90
+ closePopup();
91
+ setTimeout(() => {
92
+ const el = textarea();
93
+ if (!el) return;
94
+ const caret = anchorIndex.current + replacement.length + suffix.length;
95
+ el.focus();
96
+ el.setSelectionRange(caret, caret);
97
+ }, 0);
98
+ };
99
+ /** Feed the field's input events through here — the vessel watches
100
+ * the text as it lands, from the element itself. */
101
+ const onInput = () => detect();
102
+ /** Arrows move, configured commit keys insert, Escape dismisses. Answers
103
+ * `true` when the vessel consumed the key. */
104
+ const onKeydown = (event) => {
105
+ if (!popupOpen || matches.length === 0) return false;
106
+ if (event.key === "ArrowDown") {
107
+ event.preventDefault();
108
+ moveActive(1);
109
+ } else if (event.key === "ArrowUp") {
110
+ event.preventDefault();
111
+ moveActive(-1);
112
+ } else if ((resolve().commitKeys ?? ["Enter", " "]).includes(event.key)) {
113
+ const entry = matches[active];
114
+ if (!entry || entry.disabled) return false;
115
+ event.preventDefault();
116
+ insert(entry);
117
+ } else if (event.key === "Escape") closePopup();
118
+ else return false;
119
+ return true;
120
+ };
121
+ return {
122
+ open: popupOpen,
123
+ matches,
124
+ active,
125
+ setActive,
126
+ anchorIndex,
127
+ caretIndex,
128
+ activeTrigger,
129
+ insert,
130
+ close: closePopup,
131
+ onInput,
132
+ onKeydown
133
+ };
134
+ }
135
+ // src/components/mentions/index.tsx
136
+ function MentionsPopup({ size, matches, active, onInsert, onActiveChange, ...rest }) {
137
+ const id = useElementId("mentions-popup", rest);
138
+ const groups = [];
139
+ const byName = /* @__PURE__ */ new Map();
140
+ matches.forEach((entry, index) => {
141
+ const name = entry.group ?? "";
142
+ const group = byName.get(name);
143
+ if (group) group.entries.push({
144
+ entry,
145
+ index
146
+ });
147
+ else {
148
+ const next = {
149
+ name,
150
+ entries: [{
151
+ entry,
152
+ index
153
+ }]
154
+ };
155
+ byName.set(name, next);
156
+ groups.push(next);
157
+ }
158
+ });
159
+ const optionId = (index) => `${id}:option-${index}`;
160
+ const activeEntry = matches[active];
161
+ return /* @__PURE__ */ jsx("div", {
162
+ ...rest,
163
+ id,
164
+ "data-scope": "mentions",
165
+ "data-part": "popup",
166
+ "data-size": size,
167
+ role: "listbox",
168
+ "aria-activedescendant": activeEntry && !activeEntry.disabled ? optionId(active) : void 0,
169
+ children: groups.map((group, groupIndex) => {
170
+ const labelId = group.name ? `${id}:group-${groupIndex}` : void 0;
171
+ const options = group.entries.map(({ entry, index }) => /* @__PURE__ */ jsxs("div", {
172
+ id: optionId(index),
173
+ role: "option",
174
+ "aria-selected": index === active && !entry.disabled,
175
+ "aria-disabled": entry.disabled ? "true" : void 0,
176
+ tabIndex: -1,
177
+ "data-scope": "mentions",
178
+ "data-part": "option",
179
+ "data-active": index === active && !entry.disabled ? "" : void 0,
180
+ "data-disabled": entry.disabled ? "" : void 0,
181
+ onMouseEnter: () => {
182
+ if (!entry.disabled) onActiveChange?.(index);
183
+ },
184
+ onMouseDown: (event) => {
185
+ if (event.button !== 0) return;
186
+ event.preventDefault();
187
+ if (!entry.disabled) onInsert?.(entry);
188
+ },
189
+ onKeyDown: (event) => {
190
+ if (event.key !== "Enter" && event.key !== " ") return;
191
+ event.preventDefault();
192
+ if (!entry.disabled) onInsert?.(entry);
193
+ },
194
+ children: [
195
+ entry.icon ? /* @__PURE__ */ jsx(Icon, { name: entry.icon }) : null,
196
+ /* @__PURE__ */ jsxs("span", {
197
+ "data-scope": "mentions",
198
+ "data-part": "option-main",
199
+ children: [/* @__PURE__ */ jsx("span", {
200
+ "data-scope": "mentions",
201
+ "data-part": "option-label",
202
+ children: entry.label
203
+ }), entry.description ? /* @__PURE__ */ jsx("span", {
204
+ "data-scope": "mentions",
205
+ "data-part": "option-description",
206
+ children: entry.description
207
+ }) : null]
208
+ }),
209
+ entry.kind ? /* @__PURE__ */ jsx("span", {
210
+ "data-scope": "mentions",
211
+ "data-part": "option-kind",
212
+ children: entry.kind
213
+ }) : null
214
+ ]
215
+ }, `${entry.id ?? entry.value}:${index}`));
216
+ if (!group.name) return /* @__PURE__ */ jsx(Fragment$1, { children: options }, "ungrouped");
217
+ return /* @__PURE__ */ jsxs("div", {
218
+ role: "group",
219
+ "aria-labelledby": labelId,
220
+ "data-scope": "mentions",
221
+ "data-part": "group",
222
+ children: [/* @__PURE__ */ jsx("div", {
223
+ id: labelId,
224
+ "data-scope": "mentions",
225
+ "data-part": "group-label",
226
+ children: group.name
227
+ }), options]
228
+ }, `group:${group.name}`);
229
+ })
230
+ });
231
+ }
232
+ /** The vessel: the candidates themselves as a floating card. The anchor
233
+ * is virtual — a live rectangle off the host's field — so a host keeps
234
+ * its own anatomy (the textarea rides where the host puts it) and the
235
+ * vessel still points at the right place. Shares the detection state
236
+ * with the host through `useMentions`. */
237
+ function MentionsVesselImpl({ portal = false, size = "md", open = false, matches = [], active = 0, anchor = null, placement = "bottom-start", onInsert, onActiveChange, onOpenChange, id }) {
238
+ injectComponentStyle("mentions");
239
+ const hostId = useElementId("mentions", { id });
240
+ return /* @__PURE__ */ jsx(Popover.Root, {
241
+ id: `${hostId}:vessel`,
242
+ ids: { content: `${hostId}:popup` },
243
+ open,
244
+ onOpenChange: (details) => onOpenChange?.(details.open),
245
+ positioning: {
246
+ placement,
247
+ getAnchorRect: () => anchor?.getBoundingClientRect() ?? null
248
+ },
249
+ children: /* @__PURE__ */ jsx(FloatingPortal, {
250
+ portal,
251
+ children: /* @__PURE__ */ jsx(Popover.Positioner, { children: /* @__PURE__ */ jsx(Popover.Content, {
252
+ asChild: true,
253
+ children: /* @__PURE__ */ jsx(MentionsPopup, {
254
+ size,
255
+ matches,
256
+ active,
257
+ onInsert,
258
+ onActiveChange,
259
+ id: `${hostId}:popup`
260
+ })
261
+ }) })
262
+ })
263
+ });
264
+ }
265
+ const MentionsVessel = withSelfRoot(MentionsVesselImpl);
266
+ function MentionsImpl({ portal = false, items = [], value, trigger = "@", triggers, insertOnSelect = true, commitKeys, placement = "bottom-start", placeholder, autoresize = false, invalid = false, size = "md", onValueChange, onSelect, children, ...rest }) {
267
+ const hostId = useElementId("mentions", rest);
268
+ const [internal, setInternal] = useState("");
269
+ const fieldRef = useRef(null);
270
+ const el = () => fieldRef.current;
271
+ const current = value ?? internal;
272
+ const mentions = useMentions(() => ({
273
+ items,
274
+ trigger,
275
+ triggers,
276
+ commitKeys
277
+ }), el, {
278
+ getText: () => el()?.value ?? current,
279
+ setText: (next) => {
280
+ setInternal(next);
281
+ onValueChange?.(next);
282
+ },
283
+ select: (entry) => {
284
+ onSelect?.(entry);
285
+ return insertOnSelect;
286
+ }
287
+ });
288
+ const handleChange = (event) => {
289
+ const node = event.currentTarget;
290
+ setInternal(node.value);
291
+ onValueChange?.(node.value);
292
+ mentions.onInput();
293
+ };
294
+ return /* @__PURE__ */ jsxs("div", {
295
+ ...rest,
296
+ "data-scope": "mentions",
297
+ "data-part": "root",
298
+ "data-size": size,
299
+ children: [/* @__PURE__ */ jsxs(Popover.Root, {
300
+ id: `${hostId}:vessel`,
301
+ ids: { content: `${hostId}:vessel:popup` },
302
+ open: mentions.open,
303
+ onOpenChange: (details) => {
304
+ if (!details.open) mentions.close();
305
+ },
306
+ positioning: { placement },
307
+ children: [/* @__PURE__ */ jsx(Popover.Anchor, {
308
+ asChild: true,
309
+ children: /* @__PURE__ */ jsx(Field.Textarea, {
310
+ ref: fieldRef,
311
+ autoresize,
312
+ rows: 3,
313
+ placeholder,
314
+ value: current,
315
+ "aria-expanded": mentions.open,
316
+ "aria-controls": mentions.open ? `${hostId}:vessel:popup` : void 0,
317
+ onChange: handleChange,
318
+ onKeyDown: (event) => mentions.onKeydown(event),
319
+ "data-invalid": invalid || void 0,
320
+ "data-scope": "mentions",
321
+ "data-part": "textarea"
322
+ })
323
+ }), /* @__PURE__ */ jsx(FloatingPortal, {
324
+ portal,
325
+ children: /* @__PURE__ */ jsx(Popover.Positioner, { children: /* @__PURE__ */ jsx(Popover.Content, {
326
+ asChild: true,
327
+ children: /* @__PURE__ */ jsx(MentionsPopup, {
328
+ size,
329
+ matches: mentions.matches,
330
+ active: mentions.active,
331
+ onInsert: mentions.insert,
332
+ onActiveChange: mentions.setActive,
333
+ id: `${hostId}:vessel:popup`
334
+ })
335
+ }) })
336
+ })]
337
+ }), children]
338
+ });
339
+ }
340
+ const Mentions = Object.assign(MentionsImpl, Popover$1);
341
+ export { MentionsVessel as n, useMentions as r, Mentions as t };
@@ -1,7 +1,7 @@
1
1
  import { useConfig } from "./components/config-provider/index.mjs";
2
2
  import { resolveComponentMessages } from "@bysages/core";
3
3
  import { useMemo } from "react";
4
- //#region src/internal/messages.ts
4
+ // src/internal/messages.ts
5
5
  /** Complete wrapper-owned copy for the nearest ConfigProvider, resolved
6
6
  * from its locale and partial message overrides. */
7
7
  function useComponentMessages() {
@@ -12,5 +12,4 @@ function useComponentMessages() {
12
12
  function formatMessage(template, values) {
13
13
  return template.replace(/\{(\w+)\}/g, (match, key) => key in values ? String(values[key]) : match);
14
14
  }
15
- //#endregion
16
15
  export { useComponentMessages as n, formatMessage as t };
@@ -1,11 +1,12 @@
1
- import { r as iconNode } from "./icon-Cri0-7-x.mjs";
2
- import { t as useElementId } from "./id-C37UYLwJ.mjs";
1
+ import { r as iconNode } from "./icon-C9udWCyz.mjs";
2
+ import { t as useElementId } from "./id-Ctic_3o8.mjs";
3
+ import { n as definePositioner, t as FloatingPortal } from "./floating-CMR7cvmA.mjs";
3
4
  import { injectComponentStyle } from "@bysages/core/styling";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { useMemo } from "react";
6
7
  import { useFieldContext } from "@ark-ui/react/field";
7
8
  import { Select, createListCollection } from "@ark-ui/react/select";
8
- //#region src/components/select/native.tsx
9
+ // src/components/select/native.tsx
9
10
  function NativeSelect({ value, options, size = "md", invalid = false, placeholder, disabled = false, onValueChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...rest }) {
10
11
  injectComponentStyle("select");
11
12
  const field = useFieldContext();
@@ -45,8 +46,7 @@ function NativeSelect({ value, options, size = "md", invalid = false, placeholde
45
46
  })]
46
47
  });
47
48
  }
48
- //#endregion
49
- //#region src/components/select/index.tsx
49
+ // src/components/select/index.tsx
50
50
  function SelectRoot(props) {
51
51
  const id = useElementId("select", props);
52
52
  const { size = "md", ...rest } = props;
@@ -59,7 +59,8 @@ function SelectRoot(props) {
59
59
  function toArkValue(value) {
60
60
  return value === void 0 || value === "" ? [] : Array.isArray(value) ? value : [value];
61
61
  }
62
- function SelectFacade({ value, defaultValue, options, multiple = false, deselectable = false, clearable = true, disabled = false, invalid = false, required = false, readOnly = false, label, groupLabel, placeholder, name, form, autoComplete, size = "md", onValueChange }) {
62
+ const SelectPositioner = definePositioner(Select.Positioner);
63
+ function SelectFacade({ portal = false, value, defaultValue, options, multiple = false, deselectable = false, clearable = true, disabled = false, invalid = false, required = false, readOnly = false, label, groupLabel, placeholder, name, form, autoComplete, size = "md", onValueChange }) {
63
64
  const collection = useMemo(() => createListCollection({ items: options }), [options]);
64
65
  return /* @__PURE__ */ jsxs(SelectRoot, {
65
66
  size,
@@ -94,19 +95,22 @@ function SelectFacade({ value, defaultValue, options, multiple = false, deselect
94
95
  height: 14
95
96
  }) })
96
97
  ] }),
97
- /* @__PURE__ */ jsx(Select.Positioner, { children: /* @__PURE__ */ jsx(Select.Content, { children: groupLabel ? /* @__PURE__ */ jsxs(Select.ItemGroup, { children: [/* @__PURE__ */ jsx(Select.ItemGroupLabel, { children: groupLabel }), collection.items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
98
- item,
99
- children: [/* @__PURE__ */ jsx(Select.ItemText, { children: item.label }), /* @__PURE__ */ jsx(Select.ItemIndicator, { children: iconNode("check", {
100
- width: 14,
101
- height: 14
102
- }) })]
103
- }, item.value))] }) : /* @__PURE__ */ jsx(Select.List, { children: collection.items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
104
- item,
105
- children: [/* @__PURE__ */ jsx(Select.ItemText, { children: item.label }), /* @__PURE__ */ jsx(Select.ItemIndicator, { children: iconNode("check", {
106
- width: 14,
107
- height: 14
108
- }) })]
109
- }, item.value)) }) }) }),
98
+ /* @__PURE__ */ jsx(FloatingPortal, {
99
+ portal,
100
+ children: /* @__PURE__ */ jsx(Select.Positioner, { children: /* @__PURE__ */ jsx(Select.Content, { children: groupLabel ? /* @__PURE__ */ jsxs(Select.ItemGroup, { children: [/* @__PURE__ */ jsx(Select.ItemGroupLabel, { children: groupLabel }), collection.items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
101
+ item,
102
+ children: [/* @__PURE__ */ jsx(Select.ItemText, { children: item.label }), /* @__PURE__ */ jsx(Select.ItemIndicator, { children: iconNode("check", {
103
+ width: 14,
104
+ height: 14
105
+ }) })]
106
+ }, item.value))] }) : /* @__PURE__ */ jsx(Select.List, { children: collection.items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
107
+ item,
108
+ children: [/* @__PURE__ */ jsx(Select.ItemText, { children: item.label }), /* @__PURE__ */ jsx(Select.ItemIndicator, { children: iconNode("check", {
109
+ width: 14,
110
+ height: 14
111
+ }) })]
112
+ }, item.value)) }) }) })
113
+ }),
110
114
  /* @__PURE__ */ jsx(Select.HiddenSelect, {})
111
115
  ]
112
116
  });
@@ -114,8 +118,8 @@ function SelectFacade({ value, defaultValue, options, multiple = false, deselect
114
118
  SelectFacade.displayName = "SSelect";
115
119
  const Select$1 = Object.assign(SelectFacade, {
116
120
  ...Select,
121
+ Positioner: SelectPositioner,
117
122
  Root: SelectRoot
118
123
  });
119
124
  injectComponentStyle("select");
120
- //#endregion
121
125
  export { NativeSelect as n, Select$1 as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bysages/react",
3
- "version": "0.4.4",
3
+ "version": "0.6.0",
4
4
  "description": "By Sages Elements components for React — styled by the paper-and-ink design tokens",
5
5
  "keywords": [
6
6
  "accessible",
@@ -46,31 +46,31 @@
46
46
  }
47
47
  },
48
48
  "dependencies": {
49
- "@ark-ui/react": "5.39.3",
50
- "@tanstack/markdown": "1.0.0",
49
+ "@ark-ui/react": "5.40.0",
51
50
  "@tanstack/react-form": "1.33.5",
52
- "@tanstack/react-table": "9.2.8",
53
- "@tanstack/react-virtual": "3.14.14",
54
- "@zag-js/cascade-select": "1.45.0",
55
- "@zag-js/react": "1.45.0",
56
- "@bysages/core": "0.4.4"
51
+ "@tanstack/react-table": "9.3.1",
52
+ "@tanstack/react-virtual": "3.14.25",
53
+ "@zag-js/cascade-select": "1.47.0",
54
+ "@zag-js/react": "1.47.0",
55
+ "@bysages/core": "0.6.0"
57
56
  },
58
57
  "devDependencies": {
59
- "@json-render/core": "0.21.0",
60
- "@json-render/react": "0.21.0",
61
- "@storybook/addon-a11y": "10.6.1",
62
- "@storybook/react-vite": "10.6.1",
58
+ "@json-render/core": "0.21.4",
59
+ "@json-render/react": "0.21.4",
60
+ "@storybook/addon-a11y": "10.6.5",
61
+ "@storybook/react-vite": "10.6.5",
63
62
  "@types/react": "19.3.0",
64
63
  "@types/react-dom": "19.3.0",
65
- "ai": "7.0.137",
66
- "react": "19.3.0",
67
- "react-dom": "19.3.0",
68
- "storybook": "10.6.1",
69
- "zod": "4.6.5"
64
+ "ai": "7.0.159",
65
+ "react": "19.3.1",
66
+ "react-dom": "19.3.1",
67
+ "storybook": "10.6.5",
68
+ "zod": "4.6.7"
70
69
  },
71
70
  "peerDependencies": {
72
71
  "@json-render/core": "^0.21.0",
73
72
  "@json-render/react": "^0.21.0",
73
+ "ai": "^7.0.0",
74
74
  "react": ">=18",
75
75
  "react-dom": ">=18",
76
76
  "zod": "^4.0"