@bysages/solid 0.2.2 → 0.3.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 (293) hide show
  1. package/README.md +16 -2
  2. package/dist/ai-response-ClGGptX3.mjs +139 -0
  3. package/dist/chevron-D5RzcayK.mjs +9 -0
  4. package/dist/components/accordion/index.d.mts +7 -0
  5. package/dist/components/accordion/index.mjs +10 -0
  6. package/dist/components/affix/index.d.mts +20 -0
  7. package/dist/components/affix/index.mjs +33 -0
  8. package/dist/components/ai/index.d.mts +2 -0
  9. package/dist/components/ai/index.mjs +71 -0
  10. package/dist/components/ai-action/index.d.mts +13 -0
  11. package/dist/components/ai-action/index.mjs +27 -0
  12. package/dist/components/ai-attachments/index.d.mts +20 -0
  13. package/dist/components/ai-attachments/index.mjs +110 -0
  14. package/dist/components/ai-message/index.d.mts +13 -0
  15. package/dist/components/ai-message/index.mjs +22 -0
  16. package/dist/components/ai-prompt-input/index.d.mts +45 -0
  17. package/dist/components/ai-prompt-input/index.mjs +153 -0
  18. package/dist/components/ai-reasoning/index.d.mts +13 -0
  19. package/dist/components/ai-reasoning/index.mjs +38 -0
  20. package/dist/components/ai-response/index.d.mts +20 -0
  21. package/dist/components/ai-response/index.mjs +2 -0
  22. package/dist/components/ai-source/index.d.mts +13 -0
  23. package/dist/components/ai-source/index.mjs +36 -0
  24. package/dist/components/ai-suggestion/index.d.mts +13 -0
  25. package/dist/components/ai-suggestion/index.mjs +22 -0
  26. package/dist/components/ai-tool/index.d.mts +23 -0
  27. package/dist/components/ai-tool/index.mjs +90 -0
  28. package/dist/components/alert/index.d.mts +22 -0
  29. package/dist/components/alert/index.mjs +87 -0
  30. package/dist/components/angle-slider/index.d.mts +15 -0
  31. package/dist/components/angle-slider/index.mjs +18 -0
  32. package/dist/components/aspect-ratio/index.d.mts +10 -0
  33. package/dist/components/aspect-ratio/index.mjs +23 -0
  34. package/dist/components/autocomplete/index.d.mts +21 -0
  35. package/dist/components/autocomplete/index.mjs +76 -0
  36. package/dist/components/avatar/index.d.mts +23 -0
  37. package/dist/components/avatar/index.mjs +20 -0
  38. package/dist/components/avatar-group/index.d.mts +11 -0
  39. package/dist/components/avatar-group/index.mjs +20 -0
  40. package/dist/components/back-top/index.d.mts +29 -0
  41. package/dist/components/back-top/index.mjs +93 -0
  42. package/dist/components/badge/index.d.mts +10 -0
  43. package/dist/components/badge/index.mjs +23 -0
  44. package/dist/components/banner/index.d.mts +24 -0
  45. package/dist/components/banner/index.mjs +67 -0
  46. package/dist/components/bento/index.d.mts +24 -0
  47. package/dist/components/bento/index.mjs +51 -0
  48. package/dist/components/block-ui/index.d.mts +12 -0
  49. package/dist/components/block-ui/index.mjs +43 -0
  50. package/dist/components/breadcrumb/index.d.mts +11 -0
  51. package/dist/components/breadcrumb/index.mjs +45 -0
  52. package/dist/components/browser/index.d.mts +21 -0
  53. package/dist/components/browser/index.mjs +87 -0
  54. package/dist/components/button/index.d.mts +15 -0
  55. package/dist/components/button/index.mjs +43 -0
  56. package/dist/components/button-group/index.d.mts +23 -0
  57. package/dist/components/button-group/index.mjs +38 -0
  58. package/dist/components/calendar/index.d.mts +17 -0
  59. package/dist/components/calendar/index.mjs +209 -0
  60. package/dist/components/card/index.d.mts +11 -0
  61. package/dist/components/card/index.mjs +33 -0
  62. package/dist/components/carousel/index.d.mts +9 -0
  63. package/dist/components/carousel/index.mjs +12 -0
  64. package/dist/components/cascade-select/index.d.mts +31 -0
  65. package/dist/components/cascade-select/index.mjs +304 -0
  66. package/dist/components/checkbox/index.d.mts +15 -0
  67. package/dist/components/checkbox/index.mjs +18 -0
  68. package/dist/components/checkbox-group/index.d.mts +28 -0
  69. package/dist/components/checkbox-group/index.mjs +97 -0
  70. package/dist/components/chip/index.d.mts +12 -0
  71. package/dist/components/chip/index.mjs +36 -0
  72. package/dist/components/client-only/index.d.mts +2 -0
  73. package/dist/components/client-only/index.mjs +2 -0
  74. package/dist/components/clipboard/index.d.mts +16 -0
  75. package/dist/components/clipboard/index.mjs +19 -0
  76. package/dist/components/collapsible/index.d.mts +7 -0
  77. package/dist/components/collapsible/index.mjs +10 -0
  78. package/dist/components/collection/index.d.mts +2 -0
  79. package/dist/components/collection/index.mjs +2 -0
  80. package/dist/components/color-picker/index.d.mts +19 -0
  81. package/dist/components/color-picker/index.mjs +18 -0
  82. package/dist/components/combobox/index.d.mts +17 -0
  83. package/dist/components/combobox/index.mjs +18 -0
  84. package/dist/components/command/index.d.mts +43 -0
  85. package/dist/components/command/index.mjs +253 -0
  86. package/dist/components/comment/index.d.mts +17 -0
  87. package/dist/components/comment/index.mjs +101 -0
  88. package/dist/components/config-provider/index.d.mts +48 -0
  89. package/dist/components/config-provider/index.mjs +67 -0
  90. package/dist/components/container/index.d.mts +13 -0
  91. package/dist/components/container/index.mjs +23 -0
  92. package/dist/components/data-view/index.d.mts +18 -0
  93. package/dist/components/data-view/index.mjs +110 -0
  94. package/dist/components/date-input/index.d.mts +15 -0
  95. package/dist/components/date-input/index.mjs +18 -0
  96. package/dist/components/date-picker/index.d.mts +17 -0
  97. package/dist/components/date-picker/index.mjs +18 -0
  98. package/dist/components/deferred-content/index.d.mts +16 -0
  99. package/dist/components/deferred-content/index.mjs +52 -0
  100. package/dist/components/descriptions/index.d.mts +26 -0
  101. package/dist/components/descriptions/index.mjs +69 -0
  102. package/dist/components/dialog/index.d.mts +9 -0
  103. package/dist/components/dialog/index.mjs +11 -0
  104. package/dist/components/dock/index.d.mts +22 -0
  105. package/dist/components/dock/index.mjs +64 -0
  106. package/dist/components/download-trigger/index.d.mts +2 -0
  107. package/dist/components/download-trigger/index.mjs +2 -0
  108. package/dist/components/drawer/index.d.mts +9 -0
  109. package/dist/components/drawer/index.mjs +12 -0
  110. package/dist/components/dynamic-input/index.d.mts +30 -0
  111. package/dist/components/dynamic-input/index.mjs +119 -0
  112. package/dist/components/editable/index.d.mts +15 -0
  113. package/dist/components/editable/index.mjs +18 -0
  114. package/dist/components/ellipsis/index.d.mts +10 -0
  115. package/dist/components/ellipsis/index.mjs +27 -0
  116. package/dist/components/empty/index.d.mts +10 -0
  117. package/dist/components/empty/index.mjs +31 -0
  118. package/dist/components/field/index.d.mts +8 -0
  119. package/dist/components/field/index.mjs +11 -0
  120. package/dist/components/fieldset/index.d.mts +7 -0
  121. package/dist/components/fieldset/index.mjs +10 -0
  122. package/dist/components/file-upload/index.d.mts +17 -0
  123. package/dist/components/file-upload/index.mjs +18 -0
  124. package/dist/components/float-button/index.d.mts +61 -0
  125. package/dist/components/float-button/index.mjs +129 -0
  126. package/dist/components/floating-panel/index.d.mts +9 -0
  127. package/dist/components/floating-panel/index.mjs +12 -0
  128. package/dist/components/focus-trap/index.d.mts +2 -0
  129. package/dist/components/focus-trap/index.mjs +2 -0
  130. package/dist/components/form/index.d.mts +2 -0
  131. package/dist/components/form/index.mjs +125 -0
  132. package/dist/components/format/index.d.mts +9 -0
  133. package/dist/components/format/index.mjs +10 -0
  134. package/dist/components/frame/index.d.mts +10 -0
  135. package/dist/components/frame/index.mjs +12 -0
  136. package/dist/components/grid/index.d.mts +13 -0
  137. package/dist/components/grid/index.mjs +42 -0
  138. package/dist/components/highlight/index.d.mts +7 -0
  139. package/dist/components/highlight/index.mjs +11 -0
  140. package/dist/components/hover-card/index.d.mts +7 -0
  141. package/dist/components/hover-card/index.mjs +10 -0
  142. package/dist/components/icon/index.d.mts +24 -0
  143. package/dist/components/icon/index.mjs +54 -0
  144. package/dist/components/image/index.d.mts +17 -0
  145. package/dist/components/image/index.mjs +70 -0
  146. package/dist/components/image-cropper/index.d.mts +8 -0
  147. package/dist/components/image-cropper/index.mjs +11 -0
  148. package/dist/components/image-viewer/index.d.mts +19 -0
  149. package/dist/components/image-viewer/index.mjs +152 -0
  150. package/dist/components/input/index.d.mts +19 -0
  151. package/dist/components/input/index.mjs +2 -0
  152. package/dist/components/input-group/index.d.mts +18 -0
  153. package/dist/components/input-group/index.mjs +36 -0
  154. package/dist/components/json-tree-view/index.d.mts +7 -0
  155. package/dist/components/json-tree-view/index.mjs +10 -0
  156. package/dist/components/kbd/index.d.mts +6 -0
  157. package/dist/components/kbd/index.mjs +15 -0
  158. package/dist/components/layout/index.d.mts +60 -0
  159. package/dist/components/layout/index.mjs +192 -0
  160. package/dist/components/link/index.d.mts +10 -0
  161. package/dist/components/link/index.mjs +24 -0
  162. package/dist/components/list/index.d.mts +26 -0
  163. package/dist/components/list/index.mjs +97 -0
  164. package/dist/components/listbox/index.d.mts +17 -0
  165. package/dist/components/listbox/index.mjs +19 -0
  166. package/dist/components/marquee/index.d.mts +7 -0
  167. package/dist/components/marquee/index.mjs +10 -0
  168. package/dist/components/masonry/index.d.mts +11 -0
  169. package/dist/components/masonry/index.mjs +34 -0
  170. package/dist/components/mentions/index.d.mts +2 -0
  171. package/dist/components/mentions/index.mjs +3 -0
  172. package/dist/components/menu/index.d.mts +13 -0
  173. package/dist/components/menu/index.mjs +38 -0
  174. package/dist/components/menubar/index.d.mts +32 -0
  175. package/dist/components/menubar/index.mjs +83 -0
  176. package/dist/components/meter/index.d.mts +21 -0
  177. package/dist/components/meter/index.mjs +95 -0
  178. package/dist/components/navigation-menu/index.d.mts +8 -0
  179. package/dist/components/navigation-menu/index.mjs +11 -0
  180. package/dist/components/number-input/index.d.mts +15 -0
  181. package/dist/components/number-input/index.mjs +18 -0
  182. package/dist/components/order-list/index.d.mts +21 -0
  183. package/dist/components/order-list/index.mjs +160 -0
  184. package/dist/components/page-header/index.d.mts +11 -0
  185. package/dist/components/page-header/index.mjs +34 -0
  186. package/dist/components/pagination/index.d.mts +17 -0
  187. package/dist/components/pagination/index.mjs +18 -0
  188. package/dist/components/password-input/index.d.mts +15 -0
  189. package/dist/components/password-input/index.mjs +18 -0
  190. package/dist/components/pin-input/index.d.mts +14 -0
  191. package/dist/components/pin-input/index.mjs +18 -0
  192. package/dist/components/popconfirm/index.d.mts +17 -0
  193. package/dist/components/popconfirm/index.mjs +85 -0
  194. package/dist/components/popover/index.d.mts +8 -0
  195. package/dist/components/popover/index.mjs +11 -0
  196. package/dist/components/presence/index.d.mts +2 -0
  197. package/dist/components/presence/index.mjs +2 -0
  198. package/dist/components/progress/index.d.mts +15 -0
  199. package/dist/components/progress/index.mjs +18 -0
  200. package/dist/components/progress-group/index.d.mts +22 -0
  201. package/dist/components/progress-group/index.mjs +84 -0
  202. package/dist/components/qr-code/index.d.mts +8 -0
  203. package/dist/components/qr-code/index.mjs +11 -0
  204. package/dist/components/radio-group/index.d.mts +15 -0
  205. package/dist/components/radio-group/index.mjs +18 -0
  206. package/dist/components/rating-group/index.d.mts +15 -0
  207. package/dist/components/rating-group/index.mjs +18 -0
  208. package/dist/components/result/index.d.mts +22 -0
  209. package/dist/components/result/index.mjs +66 -0
  210. package/dist/components/scroll-area/index.d.mts +7 -0
  211. package/dist/components/scroll-area/index.mjs +10 -0
  212. package/dist/components/segment-group/index.d.mts +17 -0
  213. package/dist/components/segment-group/index.mjs +23 -0
  214. package/dist/components/select/index.d.mts +2 -0
  215. package/dist/components/select/index.mjs +2 -0
  216. package/dist/components/separator/index.d.mts +11 -0
  217. package/dist/components/separator/index.mjs +27 -0
  218. package/dist/components/signature-pad/index.d.mts +8 -0
  219. package/dist/components/signature-pad/index.mjs +11 -0
  220. package/dist/components/skeleton/index.d.mts +7 -0
  221. package/dist/components/skeleton/index.mjs +15 -0
  222. package/dist/components/slider/index.d.mts +15 -0
  223. package/dist/components/slider/index.mjs +18 -0
  224. package/dist/components/spinner/index.d.mts +9 -0
  225. package/dist/components/spinner/index.mjs +26 -0
  226. package/dist/components/split-button/index.d.mts +36 -0
  227. package/dist/components/split-button/index.mjs +124 -0
  228. package/dist/components/splitter/index.d.mts +7 -0
  229. package/dist/components/splitter/index.mjs +10 -0
  230. package/dist/components/spotlight/index.d.mts +11 -0
  231. package/dist/components/spotlight/index.mjs +38 -0
  232. package/dist/components/stack/index.d.mts +11 -0
  233. package/dist/components/stack/index.mjs +45 -0
  234. package/dist/components/stat/index.d.mts +17 -0
  235. package/dist/components/stat/index.mjs +44 -0
  236. package/dist/components/steps/index.d.mts +18 -0
  237. package/dist/components/steps/index.mjs +18 -0
  238. package/dist/components/swap/index.d.mts +8 -0
  239. package/dist/components/swap/index.mjs +11 -0
  240. package/dist/components/switch/index.d.mts +15 -0
  241. package/dist/components/switch/index.mjs +18 -0
  242. package/dist/components/table/index.d.mts +77 -0
  243. package/dist/components/table/index.mjs +837 -0
  244. package/dist/components/tabs/index.d.mts +19 -0
  245. package/dist/components/tabs/index.mjs +23 -0
  246. package/dist/components/tags-input/index.d.mts +16 -0
  247. package/dist/components/tags-input/index.mjs +18 -0
  248. package/dist/components/terminal/index.d.mts +17 -0
  249. package/dist/components/terminal/index.mjs +84 -0
  250. package/dist/components/textarea/index.d.mts +14 -0
  251. package/dist/components/textarea/index.mjs +37 -0
  252. package/dist/components/timeline/index.d.mts +15 -0
  253. package/dist/components/timeline/index.mjs +44 -0
  254. package/dist/components/timer/index.d.mts +8 -0
  255. package/dist/components/timer/index.mjs +11 -0
  256. package/dist/components/toast/index.d.mts +11 -0
  257. package/dist/components/toast/index.mjs +13 -0
  258. package/dist/components/toc/index.d.mts +7 -0
  259. package/dist/components/toc/index.mjs +10 -0
  260. package/dist/components/toggle/index.d.mts +7 -0
  261. package/dist/components/toggle/index.mjs +10 -0
  262. package/dist/components/toggle-group/index.d.mts +14 -0
  263. package/dist/components/toggle-group/index.mjs +18 -0
  264. package/dist/components/toolbar/index.d.mts +17 -0
  265. package/dist/components/toolbar/index.mjs +46 -0
  266. package/dist/components/tooltip/index.d.mts +7 -0
  267. package/dist/components/tooltip/index.mjs +10 -0
  268. package/dist/components/tour/index.d.mts +11 -0
  269. package/dist/components/tour/index.mjs +13 -0
  270. package/dist/components/transfer/index.d.mts +24 -0
  271. package/dist/components/transfer/index.mjs +175 -0
  272. package/dist/components/tree-select/index.d.mts +28 -0
  273. package/dist/components/tree-select/index.mjs +253 -0
  274. package/dist/components/tree-view/index.d.mts +18 -0
  275. package/dist/components/tree-view/index.mjs +19 -0
  276. package/dist/components/typography/index.d.mts +11 -0
  277. package/dist/components/typography/index.mjs +34 -0
  278. package/dist/components/user/index.d.mts +19 -0
  279. package/dist/components/user/index.mjs +68 -0
  280. package/dist/components/virtual-list/index.d.mts +17 -0
  281. package/dist/components/virtual-list/index.mjs +71 -0
  282. package/dist/components/watermark/index.d.mts +17 -0
  283. package/dist/components/watermark/index.mjs +77 -0
  284. package/dist/index-B1xiJ5ki.d.mts +1811 -0
  285. package/dist/index-DDX7x8aT.d.mts +95 -0
  286. package/dist/index-IfofF-SW.d.mts +10356 -0
  287. package/dist/index-YPUiqD3n.d.mts +42 -0
  288. package/dist/index.d.mts +141 -15209
  289. package/dist/index.mjs +141 -6171
  290. package/dist/input-DoFQ7RXh.mjs +78 -0
  291. package/dist/mentions-f5Js_2W7.mjs +263 -0
  292. package/dist/select-CHaXbzLX.mjs +115 -0
  293. package/package.json +101 -7
@@ -0,0 +1,78 @@
1
+ import { injectComponentStyle } from "@bysages/core";
2
+ import { spread, template } from "@solidjs/web";
3
+ import { mergeProps as mergeProps$1, splitProps } from "solid-js";
4
+ import { useFieldContext } from "@ark-ui/solid/field";
5
+ //#region src/components/input/mask.ts
6
+ function accepts(slot, ch) {
7
+ if (slot === "9") return /\d/.test(ch);
8
+ if (slot === "a") return /[a-zA-Z]/.test(ch);
9
+ return /[\da-zA-Z]/.test(ch);
10
+ }
11
+ /** Apply the entry mask: `9` takes a digit, `a` a letter, `*` either;
12
+ * every other character is literal. A literal already typed is consumed,
13
+ * not duplicated; a literal met out of place holds the walk and lets its
14
+ * own slot claim it — so deleting through the middle reflows the shape
15
+ * instead of corrupting it. */
16
+ function applyMask(raw, mask) {
17
+ const literals = new Set(mask.split("").filter((s) => s !== "9" && s !== "a" && s !== "*"));
18
+ let out = "";
19
+ let at = 0;
20
+ slots: for (const slot of mask) {
21
+ if (at >= raw.length) break;
22
+ if (slot === "9" || slot === "a" || slot === "*") {
23
+ let ch = raw[at];
24
+ while (ch !== void 0 && !accepts(slot, ch)) {
25
+ if (literals.has(ch)) continue slots;
26
+ at += 1;
27
+ ch = raw[at];
28
+ }
29
+ if (ch === void 0) break;
30
+ out += ch;
31
+ at += 1;
32
+ } else if (raw[at] === slot) {
33
+ at += 1;
34
+ out += slot;
35
+ } else out += slot;
36
+ }
37
+ return out;
38
+ }
39
+ //#endregion
40
+ //#region src/components/input/index.tsx
41
+ var _tmpl$ = /* @__PURE__ */ template(`<input>`);
42
+ /** The bare text input: the field recipe — border, surface, focus halo —
43
+ * on a native control. Standing alone it styles itself from the `invalid`
44
+ * prop; inside a `Field.Root` it consumes the field context, picking up
45
+ * the label id, the described-by wiring and the invalid state for free,
46
+ * which is also the seam the Form validation layer will drive. Disabled
47
+ * rides the native attribute. */
48
+ function Input(props) {
49
+ injectComponentStyle("input");
50
+ const field = useFieldContext();
51
+ const [own, rest] = splitProps(props, [
52
+ "value",
53
+ "size",
54
+ "invalid",
55
+ "mask",
56
+ "onValueChange"
57
+ ]);
58
+ var _el$ = _tmpl$();
59
+ spread(_el$, () => {
60
+ return mergeProps$1(() => field?.().getInputProps() ?? {}, rest, {
61
+ get value() {
62
+ return own.value;
63
+ },
64
+ "data-scope": "input",
65
+ "data-part": "root",
66
+ get "data-size"() {
67
+ return own.size ?? "md";
68
+ },
69
+ get "data-invalid"() {
70
+ return own.invalid || field?.().getInputProps()["data-invalid"] != null ? "" : void 0;
71
+ },
72
+ onInput: (event) => own.onValueChange?.(own.mask ? applyMask(event.currentTarget.value, own.mask) : event.currentTarget.value)
73
+ });
74
+ }, false);
75
+ return _el$;
76
+ }
77
+ //#endregion
78
+ export { Input as t };
@@ -0,0 +1,263 @@
1
+ import { Textarea } from "./components/textarea/index.mjs";
2
+ import { injectComponentStyle } from "@bysages/core";
3
+ import { createComponent, delegateEvents, effect, insert, setAttribute, spread, template } from "@solidjs/web";
4
+ import { For, createEffect, createSignal, splitProps } from "solid-js";
5
+ import { Portal } from "solid-js/web";
6
+ import { Popover } from "@ark-ui/solid/popover";
7
+ //#region src/components/mentions/use-mentions.ts
8
+ /** The @-detection machinery behind a mention field: watch the caret,
9
+ * offer the matching candidates, and answer for the keys that drive
10
+ * them. The field element arrives as an accessor because hosts wrap it
11
+ * differently (a bare textarea, a field's own part).
12
+ *
13
+ * `onKeydown` answers whether the vessel consumed the key, so a host
14
+ * with its own Enter semantics — a composer that sends — can yield to
15
+ * the candidates first and act only when the vessel stands down. */
16
+ function useMentions(options, textarea, handlers) {
17
+ const [popupOpen, setPopupOpen] = createSignal(false);
18
+ const [matches, setMatches] = createSignal([]);
19
+ const [active, setActive] = createSignal(0);
20
+ const [anchorIndex, setAnchorIndex] = createSignal(0);
21
+ const [caretIndex, setCaretIndex] = createSignal(0);
22
+ const closePopup = () => {
23
+ setPopupOpen(false);
24
+ setMatches([]);
25
+ };
26
+ const detect = () => {
27
+ const text = handlers.getText();
28
+ const caret = textarea()?.selectionStart ?? text.length;
29
+ setCaretIndex(caret);
30
+ const head = text.slice(0, caret);
31
+ const char = options().trigger ?? "@";
32
+ const anchor = head.lastIndexOf(char);
33
+ const token = anchor === -1 ? "" : head.slice(anchor + char.length);
34
+ if (anchor === -1 || /\s/.test(token)) {
35
+ closePopup();
36
+ return;
37
+ }
38
+ const found = options().items.filter((entry) => entry.label.toLowerCase().startsWith(token.toLowerCase()));
39
+ setMatches(found);
40
+ setActive(0);
41
+ setAnchorIndex(anchor);
42
+ setPopupOpen(found.length > 0);
43
+ };
44
+ const insert = (entry) => {
45
+ const text = handlers.getText();
46
+ const char = options().trigger ?? "@";
47
+ const next = text.slice(0, anchorIndex()) + char + entry.label + " " + text.slice(caretIndex());
48
+ handlers.setText(next);
49
+ closePopup();
50
+ queueMicrotask(() => {
51
+ const el = textarea();
52
+ if (!el) return;
53
+ const caret = anchorIndex() + char.length + entry.label.length + 1;
54
+ el.focus();
55
+ el.setSelectionRange(caret, caret);
56
+ });
57
+ };
58
+ /** Feed the field's input events through here — the vessel watches
59
+ * the text as it lands, from the element itself. */
60
+ const onInput = () => detect();
61
+ /** Arrows move, Enter inserts, Escape dismisses. Answers `true` when
62
+ * the vessel consumed the key. */
63
+ const onKeydown = (event) => {
64
+ if (!popupOpen() || matches().length === 0) return false;
65
+ if (event.key === "ArrowDown") {
66
+ event.preventDefault();
67
+ setActive((active() + 1) % matches().length);
68
+ } else if (event.key === "ArrowUp") {
69
+ event.preventDefault();
70
+ setActive((active() - 1 + matches().length) % matches().length);
71
+ } else if (event.key === "Enter") {
72
+ event.preventDefault();
73
+ insert(matches()[active()]);
74
+ } else if (event.key === "Escape") closePopup();
75
+ else return false;
76
+ return true;
77
+ };
78
+ return {
79
+ open: popupOpen,
80
+ matches,
81
+ active,
82
+ setActive,
83
+ insert,
84
+ close: closePopup,
85
+ onInput,
86
+ onKeydown
87
+ };
88
+ }
89
+ //#endregion
90
+ //#region src/components/mentions/index.tsx
91
+ var _tmpl$ = /* @__PURE__ */ template(`<div>`);
92
+ var _tmpl$2 = /* @__PURE__ */ template(`<div data-scope=mentions data-part=option>`);
93
+ var _tmpl$3 = /* @__PURE__ */ template(`<div><!><!>`);
94
+ /** The vessel: the candidates themselves as a floating card. The anchor
95
+ * is virtual — a live rectangle off the host's field — so a host keeps
96
+ * its own anatomy (the textarea rides where the host puts it) and the
97
+ * vessel still points at the right place. Shares the detection state
98
+ * with the host through `useMentions`. */
99
+ function MentionsVessel(props) {
100
+ injectComponentStyle("mentions");
101
+ return createComponent(Popover.Root, {
102
+ get open() {
103
+ return props.open ?? false;
104
+ },
105
+ onOpenChange: (details) => props.onOpenChange?.(details.open),
106
+ positioning: {
107
+ placement: "bottom-start",
108
+ getAnchorRect: () => props.anchor?.getBoundingClientRect() ?? null
109
+ },
110
+ get children() {
111
+ return createComponent(Portal, { get children() {
112
+ return createComponent(Popover.Positioner, { get children() {
113
+ return createComponent(Popover.Content, { asChild: (contentProps) => (() => {
114
+ var _el$ = _tmpl$();
115
+ spread(_el$, [contentProps, {
116
+ "data-scope": "mentions",
117
+ "data-part": "popup",
118
+ get "data-size"() {
119
+ return props.size ?? "md";
120
+ }
121
+ }], true);
122
+ insert(_el$, createComponent(For, {
123
+ get each() {
124
+ return props.matches ?? [];
125
+ },
126
+ children: (entry, index) => (() => {
127
+ var _el$2 = _tmpl$2();
128
+ _el$2._$$click = () => props.onInsert?.(entry);
129
+ _el$2._$$mousedown = (event) => event.preventDefault();
130
+ _el$2.addEventListener("mouseenter", () => props.onActiveChange?.(index()));
131
+ insert(_el$2, () => {
132
+ return entry.label;
133
+ });
134
+ effect(() => index() === (props.active ?? 0) ? "" : void 0, (_v$) => {
135
+ setAttribute(_el$2, "data-active", _v$);
136
+ });
137
+ return _el$2;
138
+ })()
139
+ }));
140
+ return _el$;
141
+ })() });
142
+ } });
143
+ } });
144
+ }
145
+ });
146
+ }
147
+ /**
148
+ * @-mentions: a plain textarea that, when the text before the caret ends
149
+ * with the trigger character followed by a token, offers the matching
150
+ * candidates in a small anchored vessel; choosing one replaces the token
151
+ * with `trigger + label` and hands the whole text back through
152
+ * `onValueChange`. Arrows move, Enter inserts, Escape dismisses.
153
+ *
154
+ * The field is the shared `Textarea` — field wiring (label ids, the
155
+ * invalid state) rides on it for free — and the vessel anchors to the
156
+ * field as a whole (popover machinery), not to the caret coordinates;
157
+ * caret-precise positioning would need a second positioning system for
158
+ * no practical gain at typical field sizes. Composers that keep their
159
+ * own field anatomy (the AI prompt input) skip this shell and wire
160
+ * `useMentions` plus `MentionsVessel` themselves.
161
+ */
162
+ function Mentions(props) {
163
+ const [own, rest] = splitProps(props, [
164
+ "items",
165
+ "value",
166
+ "trigger",
167
+ "placeholder",
168
+ "autoresize",
169
+ "invalid",
170
+ "size",
171
+ "onValueChange"
172
+ ]);
173
+ const [internal, setInternal] = createSignal("");
174
+ const [fieldEl, setFieldEl] = createSignal(null);
175
+ const value = () => own.value ?? internal();
176
+ const mentions = useMentions(() => ({
177
+ items: own.items ?? [],
178
+ trigger: own.trigger
179
+ }), fieldEl, {
180
+ getText: () => fieldEl()?.value ?? value(),
181
+ setText: (next) => {
182
+ setInternal(next);
183
+ own.onValueChange?.(next);
184
+ }
185
+ });
186
+ createEffect(() => {
187
+ value();
188
+ const node = fieldEl();
189
+ if (!node || !(own.autoresize ?? false)) return;
190
+ node.style.height = "auto";
191
+ node.style.height = `${node.scrollHeight}px`;
192
+ });
193
+ const onInput = () => {
194
+ const node = fieldEl();
195
+ if (!node) return;
196
+ setInternal(node.value);
197
+ own.onValueChange?.(node.value);
198
+ mentions.onInput();
199
+ };
200
+ var _el$3 = _tmpl$3();
201
+ var _el$4 = _el$3.firstChild;
202
+ var _el$5 = _el$4.nextSibling;
203
+ spread(_el$3, [rest, {
204
+ "data-scope": "mentions",
205
+ "data-part": "root",
206
+ get "data-size"() {
207
+ return own.size ?? "md";
208
+ }
209
+ }], true);
210
+ insert(_el$3, createComponent(Textarea, {
211
+ ref: (node) => setFieldEl(node),
212
+ get invalid() {
213
+ return own.invalid;
214
+ },
215
+ rows: 3,
216
+ get placeholder() {
217
+ return own.placeholder;
218
+ },
219
+ get value() {
220
+ return value();
221
+ },
222
+ onValueChange: (next) => {
223
+ setInternal(next);
224
+ own.onValueChange?.(next);
225
+ },
226
+ onInput,
227
+ onKeyDown: (event) => {
228
+ mentions.onKeydown(event);
229
+ },
230
+ "data-scope": "mentions",
231
+ "data-part": "textarea"
232
+ }), _el$4);
233
+ insert(_el$3, createComponent(MentionsVessel, {
234
+ get open() {
235
+ return mentions.open();
236
+ },
237
+ get matches() {
238
+ return mentions.matches();
239
+ },
240
+ get active() {
241
+ return mentions.active();
242
+ },
243
+ get size() {
244
+ return own.size ?? "md";
245
+ },
246
+ get anchor() {
247
+ return fieldEl();
248
+ },
249
+ get onInsert() {
250
+ return mentions.insert;
251
+ },
252
+ get onActiveChange() {
253
+ return mentions.setActive;
254
+ },
255
+ onOpenChange: (open) => {
256
+ if (!open) mentions.close();
257
+ }
258
+ }), _el$5);
259
+ return _el$3;
260
+ }
261
+ delegateEvents(["mousedown", "click"]);
262
+ //#endregion
263
+ export { MentionsVessel as n, useMentions as r, Mentions as t };
@@ -0,0 +1,115 @@
1
+ import { injectComponentStyle } from "@bysages/core";
2
+ import { createComponent, effect, insert, mergeProps, ref, setAttribute, spread, template } from "@solidjs/web";
3
+ import { For, Show, createEffect, createSignal, onMount, splitProps } from "solid-js";
4
+ import { useFieldContext } from "@ark-ui/solid/field";
5
+ import { Select } from "@ark-ui/solid/select";
6
+ //#region src/components/select/native.tsx
7
+ var _tmpl$ = /* @__PURE__ */ template(`<option value disabled>`);
8
+ var _tmpl$2 = /* @__PURE__ */ template(`<span><select><!><!></select><svg data-scope=select data-part=native-icon viewBox="0 0 16 16"aria-hidden=true><path d="M4 6l4 4 4-4"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`);
9
+ var _tmpl$3 = /* @__PURE__ */ template(`<option>`);
10
+ function NativeSelect(props) {
11
+ injectComponentStyle("select");
12
+ const field = useFieldContext();
13
+ const [own, rest] = splitProps(props, [
14
+ "value",
15
+ "options",
16
+ "size",
17
+ "invalid",
18
+ "placeholder",
19
+ "disabled",
20
+ "onValueChange"
21
+ ]);
22
+ const [select, setSelect] = createSignal(null);
23
+ onMount(() => {
24
+ createEffect(() => {
25
+ const el = select();
26
+ if (el) el.value = own.value ?? "";
27
+ });
28
+ });
29
+ const fieldProps = field?.().getInputProps() ?? {};
30
+ const empty = () => own.value == null || own.value === "";
31
+ const off = () => own.disabled || field?.().disabled;
32
+ var _el$ = _tmpl$2();
33
+ var _el$2 = _el$.firstChild;
34
+ var _el$4 = _el$2.firstChild;
35
+ var _el$5 = _el$4.nextSibling;
36
+ spread(_el$, [rest, {
37
+ "data-scope": "select",
38
+ "data-part": "native-root",
39
+ get "data-size"() {
40
+ return own.size ?? "md";
41
+ },
42
+ get "data-invalid"() {
43
+ return own.invalid || field?.().invalid ? "" : void 0;
44
+ },
45
+ get "data-disabled"() {
46
+ return off() ? "" : void 0;
47
+ },
48
+ get "data-placeholder-shown"() {
49
+ return empty() ? "" : void 0;
50
+ }
51
+ }], true);
52
+ ref(() => {
53
+ return setSelect;
54
+ }, _el$2);
55
+ spread(_el$2, [fieldProps, {
56
+ "data-scope": "select",
57
+ "data-part": "native",
58
+ get disabled() {
59
+ return off() || void 0;
60
+ },
61
+ onChange: (event) => own.onValueChange?.(event.currentTarget.value)
62
+ }], true);
63
+ insert(_el$2, createComponent(Show, {
64
+ get when() {
65
+ return own.placeholder;
66
+ },
67
+ get children() {
68
+ var _el$3 = _tmpl$();
69
+ insert(_el$3, () => {
70
+ return own.placeholder;
71
+ });
72
+ effect(() => empty() ? void 0 : true, (_v$) => {
73
+ setAttribute(_el$3, "hidden", _v$);
74
+ });
75
+ return _el$3;
76
+ }
77
+ }), _el$4);
78
+ insert(_el$2, createComponent(For, {
79
+ get each() {
80
+ return own.options;
81
+ },
82
+ children: (option) => (() => {
83
+ var _el$6 = _tmpl$3();
84
+ insert(_el$6, () => {
85
+ return option.label;
86
+ });
87
+ effect(() => {
88
+ return {
89
+ e: option.value,
90
+ t: option.disabled
91
+ };
92
+ }, ({ e, t }, _p$) => {
93
+ _el$6.value = e;
94
+ t !== _p$?.t && setAttribute(_el$6, "disabled", t);
95
+ });
96
+ return _el$6;
97
+ })()
98
+ }), _el$5);
99
+ return _el$;
100
+ }
101
+ //#endregion
102
+ //#region src/components/select/index.tsx
103
+ function SelectRoot(props) {
104
+ const [own, rest] = splitProps(props, ["size"]);
105
+ return createComponent(Select.Root, mergeProps(rest, { get "data-size"() {
106
+ return own.size ?? "md";
107
+ } }));
108
+ }
109
+ const Select$1 = {
110
+ ...Select,
111
+ Root: SelectRoot
112
+ };
113
+ injectComponentStyle("select");
114
+ //#endregion
115
+ export { NativeSelect as n, Select$1 as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bysages/solid",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "By Sages Elements components for Solid — styled by the paper-and-ink design tokens",
5
5
  "keywords": [
6
6
  "accessible",
@@ -32,31 +32,125 @@
32
32
  "dist"
33
33
  ],
34
34
  "type": "module",
35
+ "sideEffects": [
36
+ "./dist/components/accordion/index.mjs",
37
+ "./dist/components/ai/index.mjs",
38
+ "./dist/components/alert/index.mjs",
39
+ "./dist/components/angle-slider/index.mjs",
40
+ "./dist/components/avatar/index.mjs",
41
+ "./dist/components/banner/index.mjs",
42
+ "./dist/components/breadcrumb/index.mjs",
43
+ "./dist/components/card/index.mjs",
44
+ "./dist/components/carousel/index.mjs",
45
+ "./dist/components/checkbox/index.mjs",
46
+ "./dist/components/clipboard/index.mjs",
47
+ "./dist/components/collapsible/index.mjs",
48
+ "./dist/components/color-picker/index.mjs",
49
+ "./dist/components/combobox/index.mjs",
50
+ "./dist/components/date-input/index.mjs",
51
+ "./dist/components/date-picker/index.mjs",
52
+ "./dist/components/descriptions/index.mjs",
53
+ "./dist/components/dialog/index.mjs",
54
+ "./dist/components/drawer/index.mjs",
55
+ "./dist/components/editable/index.mjs",
56
+ "./dist/components/empty/index.mjs",
57
+ "./dist/components/field/index.mjs",
58
+ "./dist/components/fieldset/index.mjs",
59
+ "./dist/components/file-upload/index.mjs",
60
+ "./dist/components/float-button/index.mjs",
61
+ "./dist/components/floating-panel/index.mjs",
62
+ "./dist/components/highlight/index.mjs",
63
+ "./dist/components/hover-card/index.mjs",
64
+ "./dist/components/image-cropper/index.mjs",
65
+ "./dist/components/input-group/index.mjs",
66
+ "./dist/components/json-tree-view/index.mjs",
67
+ "./dist/components/layout/index.mjs",
68
+ "./dist/components/list/index.mjs",
69
+ "./dist/components/listbox/index.mjs",
70
+ "./dist/components/marquee/index.mjs",
71
+ "./dist/components/menu/index.mjs",
72
+ "./dist/components/meter/index.mjs",
73
+ "./dist/components/navigation-menu/index.mjs",
74
+ "./dist/components/number-input/index.mjs",
75
+ "./dist/components/page-header/index.mjs",
76
+ "./dist/components/pagination/index.mjs",
77
+ "./dist/components/password-input/index.mjs",
78
+ "./dist/components/pin-input/index.mjs",
79
+ "./dist/components/popover/index.mjs",
80
+ "./dist/components/progress/index.mjs",
81
+ "./dist/components/qr-code/index.mjs",
82
+ "./dist/components/radio-group/index.mjs",
83
+ "./dist/components/rating-group/index.mjs",
84
+ "./dist/components/scroll-area/index.mjs",
85
+ "./dist/components/segment-group/index.mjs",
86
+ "./dist/components/select/index.mjs",
87
+ "./dist/components/signature-pad/index.mjs",
88
+ "./dist/components/slider/index.mjs",
89
+ "./dist/components/splitter/index.mjs",
90
+ "./dist/components/stat/index.mjs",
91
+ "./dist/components/steps/index.mjs",
92
+ "./dist/components/swap/index.mjs",
93
+ "./dist/components/switch/index.mjs",
94
+ "./dist/components/tabs/index.mjs",
95
+ "./dist/components/tags-input/index.mjs",
96
+ "./dist/components/timeline/index.mjs",
97
+ "./dist/components/timer/index.mjs",
98
+ "./dist/components/toast/index.mjs",
99
+ "./dist/components/toc/index.mjs",
100
+ "./dist/components/toggle/index.mjs",
101
+ "./dist/components/toggle-group/index.mjs",
102
+ "./dist/components/tooltip/index.mjs",
103
+ "./dist/components/tour/index.mjs",
104
+ "./dist/components/tree-view/index.mjs",
105
+ "./dist/components/typography/index.mjs"
106
+ ],
35
107
  "main": "dist/index.mjs",
36
108
  "types": "dist/index.d.mts",
37
109
  "exports": {
38
110
  ".": {
39
111
  "types": "./dist/index.d.mts",
40
112
  "import": "./dist/index.mjs"
113
+ },
114
+ "./generative": {
115
+ "types": "./dist/generative/index.d.mts",
116
+ "import": "./dist/generative/index.mjs"
41
117
  }
42
118
  },
43
119
  "dependencies": {
44
120
  "@ark-ui/solid": "5.39.2",
45
- "@tanstack/markdown": "0.0.15",
121
+ "@tanstack/markdown": "1.0.0",
122
+ "@tanstack/solid-form": "1.33.5",
46
123
  "@tanstack/solid-table": "9.2.4",
47
124
  "@tanstack/solid-virtual": "3.13.40",
48
125
  "@zag-js/cascade-select": "1.44.0",
49
126
  "@zag-js/solid": "1.44.0",
50
- "@bysages/icons": "0.2.2",
51
- "@bysages/core": "0.2.2"
127
+ "@bysages/icons": "0.3.0",
128
+ "@bysages/core": "0.3.0"
52
129
  },
53
130
  "devDependencies": {
54
- "ai": "7.0.107",
131
+ "@json-render/core": "0.21.0",
132
+ "@json-render/solid": "0.21.0",
133
+ "ai": "7.0.126",
55
134
  "solid-js": "1.9.15",
56
- "unplugin-solid": "2.0.0"
135
+ "unplugin-solid": "3.0.0",
136
+ "zod": "4.6.5"
57
137
  },
58
138
  "peerDependencies": {
59
- "solid-js": "^1.9"
139
+ "@json-render/core": "^0.21.0",
140
+ "@json-render/solid": "^0.21.0",
141
+ "solid-js": "^1.9",
142
+ "zod": "^4.0"
143
+ },
144
+ "peerDependenciesMeta": {
145
+ "@json-render/core": {
146
+ "optional": true
147
+ },
148
+ "@json-render/solid": {
149
+ "optional": true
150
+ },
151
+ "zod": {
152
+ "optional": true
153
+ }
60
154
  },
61
155
  "scripts": {
62
156
  "dev": "basis build --stub",