@bysages/react 0.4.3 → 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 (310) hide show
  1. package/dist/ai-B3vbpXlK.mjs +309 -0
  2. package/dist/ai-prompt-input-k34KssHJ.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 +1 -2
  36. package/dist/components/autocomplete/index.mjs +3 -4
  37. package/dist/components/avatar/index.d.mts +13 -4
  38. package/dist/components/avatar/index.mjs +20 -6
  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 +17 -4
  46. package/dist/components/banner/index.mjs +21 -6
  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 +16 -3
  52. package/dist/components/breadcrumb/index.mjs +22 -5
  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 +1 -2
  66. package/dist/components/cascade-select/index.mjs +6 -7
  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 +3 -2
  81. package/dist/components/color-picker/index.mjs +38 -25
  82. package/dist/components/combobox/index.d.mts +1 -2
  83. package/dist/components/combobox/index.mjs +3 -4
  84. package/dist/components/command/index.d.mts +1 -2
  85. package/dist/components/command/index.mjs +3 -4
  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 +0 -2
  97. package/dist/components/date-picker/index.mjs +3 -4
  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 +31 -4
  103. package/dist/components/dialog/index.mjs +41 -10
  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 +1 -2
  109. package/dist/components/drawer/index.mjs +3 -4
  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 +4 -9
  124. package/dist/components/float-button/index.d.mts +23 -3
  125. package/dist/components/float-button/index.mjs +30 -5
  126. package/dist/components/floating-panel/index.d.mts +1 -2
  127. package/dist/components/floating-panel/index.mjs +8 -4
  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 +1 -2
  141. package/dist/components/hover-card/index.mjs +2 -3
  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 +1 -2
  175. package/dist/components/menu/index.mjs +3 -4
  176. package/dist/components/menubar/index.d.mts +1 -2
  177. package/dist/components/menubar/index.mjs +2 -3
  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 +1 -2
  181. package/dist/components/navigation-menu/index.mjs +2 -3
  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 +2 -3
  195. package/dist/components/popconfirm/index.mjs +2 -3
  196. package/dist/components/popover/index.d.mts +1 -1
  197. package/dist/components/popover/index.mjs +3 -4
  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 +1 -2
  229. package/dist/components/split-button/index.mjs +4 -5
  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 +0 -2
  245. package/dist/components/table/index.mjs +5 -6
  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 +18 -6
  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 +1 -2
  271. package/dist/components/tooltip/index.mjs +2 -3
  272. package/dist/components/tour/index.d.mts +0 -2
  273. package/dist/components/tour/index.mjs +2 -3
  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 +2 -3
  277. package/dist/components/tree-select/index.mjs +5 -6
  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 +1 -3
  281. package/dist/components/typography/index.mjs +1 -2
  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/generative/index.d.mts +0 -2
  290. package/dist/generative/index.mjs +146 -106
  291. package/dist/{icon-Cri0-7-x.mjs → icon-C9udWCyz.mjs} +1 -2
  292. package/dist/{id-C37UYLwJ.mjs → id-Ctic_3o8.mjs} +1 -2
  293. package/dist/{image-viewer-D4FuYrk6.mjs → image-viewer-BYiXpi1X.mjs} +21 -26
  294. package/dist/{index-Eu-Bttta.d.mts → index-BVdkcSSY.d.mts} +0 -2
  295. package/dist/index-CjO4Ggf0.d.mts +115 -0
  296. package/dist/{index-Dj8S4eyJ.d.mts → index-D4C52fI7.d.mts} +0 -4
  297. package/dist/{index-BcRdWGY-.d.mts → index-DIZEFqJM.d.mts} +0 -8
  298. package/dist/{index-Bbg4heDO.d.mts → index-DcpvCyt6.d.mts} +63 -18
  299. package/dist/{index-D_iKc2Uw.d.mts → index-DczfbPCg.d.mts} +0 -4
  300. package/dist/index-lCsvE2Vl.d.mts +37 -0
  301. package/dist/index.d.mts +14 -14
  302. package/dist/index.mjs +10 -10
  303. package/dist/{input-BDpQ0e6G.mjs → input-YRjehBhU.mjs} +3 -5
  304. package/dist/{media-player-C0WcjVI-.mjs → media-player-CO2Cczl-.mjs} +7 -12
  305. package/dist/mentions-De7ChJbl.mjs +335 -0
  306. package/dist/{messages-1jJWtaYU.mjs → messages-B6n0lVyt.mjs} +1 -2
  307. package/dist/{select-D_soVdWK.mjs → select-DQ5669_K.mjs} +4 -6
  308. package/package.json +17 -17
  309. package/dist/index-B4twHAQC.d.mts +0 -10456
  310. package/dist/mentions-BwnyvdXz.mjs +0 -213
@@ -1,17 +1,16 @@
1
- import { r as iconNode } from "./icon-Cri0-7-x.mjs";
2
- import { t as Select } from "./select-D_soVdWK.mjs";
1
+ import { r as iconNode } from "./icon-C9udWCyz.mjs";
2
+ import { t as Select } from "./select-DQ5669_K.mjs";
3
3
  import { injectComponentStyle } from "@bysages/core/styling";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
6
- //#region src/components/media-player/context.ts
6
+ // src/components/media-player/context.ts
7
7
  const MediaPlayerProvider = createContext(null);
8
8
  function useMediaPlayer() {
9
9
  const context = useContext(MediaPlayerProvider);
10
10
  if (!context) throw new Error("Media player parts must be used inside Audio.Root or Video.Root");
11
11
  return context;
12
12
  }
13
- //#endregion
14
- //#region src/components/media-player/use-media-controls.ts
13
+ // src/components/media-player/use-media-controls.ts
15
14
  /** The shared HTMLMediaElement state: one source of truth for both the
16
15
  * audio and video faces, so their controls never drift apart. */
17
16
  function useMediaControls(media) {
@@ -156,8 +155,7 @@ function formatMediaTime(seconds) {
156
155
  const secs = String(whole % 3600 % 60).padStart(2, "0");
157
156
  return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${secs}` : `${minutes}:${secs}`;
158
157
  }
159
- //#endregion
160
- //#region src/components/media-player/parts.tsx
158
+ // src/components/media-player/parts.tsx
161
159
  function part(name) {
162
160
  function MediaPart(props) {
163
161
  return /* @__PURE__ */ jsx("div", {
@@ -409,8 +407,7 @@ function FullscreenButton({ label = "Toggle fullscreen", ...props }) {
409
407
  }
410
408
  const Stage = part("Stage");
411
409
  const Controls = part("Controls");
412
- //#endregion
413
- //#region src/components/media-player/shell.tsx
410
+ // src/components/media-player/shell.tsx
414
411
  /** The headless shell: it owns the media reference and the shared state
415
412
  * machine, while the public parts remain free to compose in any order. */
416
413
  function MediaPlayerShell(props) {
@@ -473,8 +470,7 @@ function MediaPlayerShell(props) {
473
470
  })
474
471
  });
475
472
  }
476
- //#endregion
477
- //#region src/components/media-player/index.tsx
473
+ // src/components/media-player/index.tsx
478
474
  function createRoot(kind) {
479
475
  function MediaRoot(props) {
480
476
  return /* @__PURE__ */ jsx(MediaPlayerShell, {
@@ -550,5 +546,4 @@ const Video = Object.assign(VideoFacade, {
550
546
  PipButton,
551
547
  FullscreenButton
552
548
  });
553
- //#endregion
554
549
  export { Video as n, formatMediaTime as r, Audio as t };
@@ -0,0 +1,335 @@
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 { Icon } from "./components/icon/index.mjs";
5
+ import { Popover as Popover$1 } from "./components/popover/index.mjs";
6
+ import { injectComponentStyle } from "@bysages/core/styling";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { Fragment as Fragment$1, useRef, useState } from "react";
9
+ import { Popover } from "@ark-ui/react/popover";
10
+ import { Portal } from "@ark-ui/react/portal";
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({ 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(Portal, { children: /* @__PURE__ */ jsx(Popover.Positioner, { children: /* @__PURE__ */ jsx(Popover.Content, {
250
+ asChild: true,
251
+ children: /* @__PURE__ */ jsx(MentionsPopup, {
252
+ size,
253
+ matches,
254
+ active,
255
+ onInsert,
256
+ onActiveChange,
257
+ id: `${hostId}:popup`
258
+ })
259
+ }) }) })
260
+ });
261
+ }
262
+ const MentionsVessel = withSelfRoot(MentionsVesselImpl);
263
+ function MentionsImpl({ items = [], value, trigger = "@", triggers, insertOnSelect = true, commitKeys, placement = "bottom-start", placeholder, autoresize = false, invalid = false, size = "md", onValueChange, onSelect, children, ...rest }) {
264
+ const hostId = useElementId("mentions", rest);
265
+ const [internal, setInternal] = useState("");
266
+ const fieldRef = useRef(null);
267
+ const el = () => fieldRef.current;
268
+ const current = value ?? internal;
269
+ const mentions = useMentions(() => ({
270
+ items,
271
+ trigger,
272
+ triggers,
273
+ commitKeys
274
+ }), el, {
275
+ getText: () => el()?.value ?? current,
276
+ setText: (next) => {
277
+ setInternal(next);
278
+ onValueChange?.(next);
279
+ },
280
+ select: (entry) => {
281
+ onSelect?.(entry);
282
+ return insertOnSelect;
283
+ }
284
+ });
285
+ const handleChange = (event) => {
286
+ const node = event.currentTarget;
287
+ setInternal(node.value);
288
+ onValueChange?.(node.value);
289
+ mentions.onInput();
290
+ };
291
+ return /* @__PURE__ */ jsxs("div", {
292
+ ...rest,
293
+ "data-scope": "mentions",
294
+ "data-part": "root",
295
+ "data-size": size,
296
+ children: [/* @__PURE__ */ jsxs(Popover.Root, {
297
+ id: `${hostId}:vessel`,
298
+ ids: { content: `${hostId}:vessel:popup` },
299
+ open: mentions.open,
300
+ onOpenChange: (details) => {
301
+ if (!details.open) mentions.close();
302
+ },
303
+ positioning: { placement },
304
+ children: [/* @__PURE__ */ jsx(Popover.Anchor, {
305
+ asChild: true,
306
+ children: /* @__PURE__ */ jsx(Field.Textarea, {
307
+ ref: fieldRef,
308
+ autoresize,
309
+ rows: 3,
310
+ placeholder,
311
+ value: current,
312
+ "aria-expanded": mentions.open,
313
+ "aria-controls": mentions.open ? `${hostId}:vessel:popup` : void 0,
314
+ onChange: handleChange,
315
+ onKeyDown: (event) => mentions.onKeydown(event),
316
+ "data-invalid": invalid || void 0,
317
+ "data-scope": "mentions",
318
+ "data-part": "textarea"
319
+ })
320
+ }), /* @__PURE__ */ jsx(Popover.Positioner, { children: /* @__PURE__ */ jsx(Popover.Content, {
321
+ asChild: true,
322
+ children: /* @__PURE__ */ jsx(MentionsPopup, {
323
+ size,
324
+ matches: mentions.matches,
325
+ active: mentions.active,
326
+ onInsert: mentions.insert,
327
+ onActiveChange: mentions.setActive,
328
+ id: `${hostId}:vessel:popup`
329
+ })
330
+ }) })]
331
+ }), children]
332
+ });
333
+ }
334
+ const Mentions = Object.assign(MentionsImpl, Popover$1);
335
+ 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,11 @@
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
3
  import { injectComponentStyle } from "@bysages/core/styling";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { useMemo } from "react";
6
6
  import { useFieldContext } from "@ark-ui/react/field";
7
7
  import { Select, createListCollection } from "@ark-ui/react/select";
8
- //#region src/components/select/native.tsx
8
+ // src/components/select/native.tsx
9
9
  function NativeSelect({ value, options, size = "md", invalid = false, placeholder, disabled = false, onValueChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...rest }) {
10
10
  injectComponentStyle("select");
11
11
  const field = useFieldContext();
@@ -45,8 +45,7 @@ function NativeSelect({ value, options, size = "md", invalid = false, placeholde
45
45
  })]
46
46
  });
47
47
  }
48
- //#endregion
49
- //#region src/components/select/index.tsx
48
+ // src/components/select/index.tsx
50
49
  function SelectRoot(props) {
51
50
  const id = useElementId("select", props);
52
51
  const { size = "md", ...rest } = props;
@@ -117,5 +116,4 @@ const Select$1 = Object.assign(SelectFacade, {
117
116
  Root: SelectRoot
118
117
  });
119
118
  injectComponentStyle("select");
120
- //#endregion
121
119
  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.3",
3
+ "version": "0.5.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.3"
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.5.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"