@rinzai/zen 0.10.3 → 0.13.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 (299) hide show
  1. package/README.md +38 -8
  2. package/dist/accordion/index.d.ts +41 -0
  3. package/dist/accordion/index.d.ts.map +1 -0
  4. package/dist/accordion/index.js +81 -0
  5. package/dist/animated-number/index.d.ts +3 -2
  6. package/dist/animated-number/index.d.ts.map +1 -1
  7. package/dist/animated-number/index.js +40 -38
  8. package/dist/avatar/index.d.ts +8 -3
  9. package/dist/avatar/index.d.ts.map +1 -1
  10. package/dist/avatar/index.js +29 -21
  11. package/dist/backdrop/index.d.ts +4 -4
  12. package/dist/backdrop/index.d.ts.map +1 -1
  13. package/dist/backdrop/index.js +41 -39
  14. package/dist/badge/index.d.ts +4 -2
  15. package/dist/badge/index.d.ts.map +1 -1
  16. package/dist/badge/index.js +20 -11
  17. package/dist/base.css +4 -0
  18. package/dist/breadcrumbs/index.d.ts +1 -1
  19. package/dist/breadcrumbs/index.d.ts.map +1 -1
  20. package/dist/breadcrumbs/index.js +25 -24
  21. package/dist/button/index.d.ts +3 -3
  22. package/dist/button/index.d.ts.map +1 -1
  23. package/dist/button/index.js +16 -11
  24. package/dist/button-group/index.d.ts +13 -0
  25. package/dist/button-group/index.d.ts.map +1 -0
  26. package/dist/button-group/index.js +14 -0
  27. package/dist/calendar/index.d.ts +15 -8
  28. package/dist/calendar/index.d.ts.map +1 -1
  29. package/dist/calendar/index.js +97 -91
  30. package/dist/calendar-heatmap/index.d.ts +7 -5
  31. package/dist/calendar-heatmap/index.d.ts.map +1 -1
  32. package/dist/calendar-heatmap/index.js +32 -30
  33. package/dist/canvas/geometry.d.ts +51 -0
  34. package/dist/canvas/geometry.d.ts.map +1 -0
  35. package/dist/canvas/geometry.js +90 -0
  36. package/dist/canvas/index.d.ts +59 -0
  37. package/dist/canvas/index.d.ts.map +1 -0
  38. package/dist/canvas/index.js +305 -0
  39. package/dist/carousel/index.d.ts +27 -0
  40. package/dist/carousel/index.d.ts.map +1 -0
  41. package/dist/carousel/index.js +162 -0
  42. package/dist/chart/index.d.ts +5 -4
  43. package/dist/chart/index.d.ts.map +1 -1
  44. package/dist/chart/index.js +137 -135
  45. package/dist/chart/palette.js +0 -1
  46. package/dist/checkbox/index.d.ts +3 -3
  47. package/dist/checkbox/index.d.ts.map +1 -1
  48. package/dist/checkbox/index.js +33 -30
  49. package/dist/chip/index.js +1 -1
  50. package/dist/code-block/index.d.ts.map +1 -1
  51. package/dist/code-block/index.js +27 -32
  52. package/dist/code-input/index.d.ts.map +1 -1
  53. package/dist/code-input/index.js +30 -24
  54. package/dist/collapse/index.d.ts +4 -3
  55. package/dist/collapse/index.d.ts.map +1 -1
  56. package/dist/collapse/index.js +42 -39
  57. package/dist/color-picker/index.d.ts +43 -0
  58. package/dist/color-picker/index.d.ts.map +1 -0
  59. package/dist/color-picker/index.js +221 -0
  60. package/dist/combobox/index.d.ts +14 -6
  61. package/dist/combobox/index.d.ts.map +1 -1
  62. package/dist/combobox/index.js +151 -139
  63. package/dist/command-palette/index.d.ts +4 -3
  64. package/dist/command-palette/index.d.ts.map +1 -1
  65. package/dist/command-palette/index.js +60 -57
  66. package/dist/confirm-dialog/index.d.ts +6 -7
  67. package/dist/confirm-dialog/index.d.ts.map +1 -1
  68. package/dist/confirm-dialog/index.js +20 -16
  69. package/dist/date-picker/index.d.ts +23 -14
  70. package/dist/date-picker/index.d.ts.map +1 -1
  71. package/dist/date-picker/index.js +109 -93
  72. package/dist/dialog/index.d.ts +3 -4
  73. package/dist/dialog/index.d.ts.map +1 -1
  74. package/dist/dialog/index.js +58 -55
  75. package/dist/disclosure/index.d.ts +8 -0
  76. package/dist/disclosure/index.d.ts.map +1 -1
  77. package/dist/disclosure/index.js +31 -32
  78. package/dist/editable-cell/index.d.ts +4 -5
  79. package/dist/editable-cell/index.d.ts.map +1 -1
  80. package/dist/editable-cell/index.js +23 -22
  81. package/dist/field/index.d.ts +8 -8
  82. package/dist/field/index.d.ts.map +1 -1
  83. package/dist/field/index.js +20 -18
  84. package/dist/filter-bar/index.d.ts +2 -2
  85. package/dist/filter-bar/index.d.ts.map +1 -1
  86. package/dist/filter-bar/index.js +38 -36
  87. package/dist/header/index.d.ts +1 -1
  88. package/dist/header/index.d.ts.map +1 -1
  89. package/dist/header/index.js +13 -11
  90. package/dist/hover-card/index.d.ts +32 -0
  91. package/dist/hover-card/index.d.ts.map +1 -0
  92. package/dist/hover-card/index.js +84 -0
  93. package/dist/icon-picker/index.d.ts +16 -5
  94. package/dist/icon-picker/index.d.ts.map +1 -1
  95. package/dist/icon-picker/index.js +42 -47
  96. package/dist/icons/micro/plus.d.ts +3 -0
  97. package/dist/icons/micro/plus.d.ts.map +1 -0
  98. package/dist/icons/micro/plus.js +17 -0
  99. package/dist/index.d.ts +41 -24
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/input/index.d.ts +5 -1
  102. package/dist/input/index.d.ts.map +1 -1
  103. package/dist/input/index.js +10 -10
  104. package/dist/input-group/index.d.ts +4 -1
  105. package/dist/input-group/index.d.ts.map +1 -1
  106. package/dist/input-group/index.js +17 -17
  107. package/dist/keypad/index.d.ts +9 -7
  108. package/dist/keypad/index.d.ts.map +1 -1
  109. package/dist/keypad/index.js +22 -19
  110. package/dist/lib.js +112 -93
  111. package/dist/load-more/index.d.ts +4 -2
  112. package/dist/load-more/index.d.ts.map +1 -1
  113. package/dist/load-more/index.js +26 -23
  114. package/dist/locale-provider/index.d.ts +23 -0
  115. package/dist/locale-provider/index.d.ts.map +1 -0
  116. package/dist/locale-provider/index.js +35 -0
  117. package/dist/menu/index.d.ts +62 -9
  118. package/dist/menu/index.d.ts.map +1 -1
  119. package/dist/menu/index.js +371 -128
  120. package/dist/meter/index.d.ts +2 -2
  121. package/dist/meter/index.d.ts.map +1 -1
  122. package/dist/meter/index.js +4 -4
  123. package/dist/money-input/index.d.ts +20 -10
  124. package/dist/money-input/index.d.ts.map +1 -1
  125. package/dist/money-input/index.js +199 -190
  126. package/dist/month-picker/index.d.ts +17 -10
  127. package/dist/month-picker/index.d.ts.map +1 -1
  128. package/dist/month-picker/index.js +97 -86
  129. package/dist/navigation-menu/index.d.ts +42 -0
  130. package/dist/navigation-menu/index.d.ts.map +1 -0
  131. package/dist/navigation-menu/index.js +144 -0
  132. package/dist/number-field/index.d.ts +34 -0
  133. package/dist/number-field/index.d.ts.map +1 -0
  134. package/dist/number-field/index.js +119 -0
  135. package/dist/page-header/index.d.ts +4 -3
  136. package/dist/page-header/index.d.ts.map +1 -1
  137. package/dist/page-header/index.js +2 -1
  138. package/dist/pagination/index.d.ts +1 -1
  139. package/dist/pagination/index.d.ts.map +1 -1
  140. package/dist/pagination/index.js +35 -33
  141. package/dist/progress-ring/index.d.ts +4 -3
  142. package/dist/progress-ring/index.d.ts.map +1 -1
  143. package/dist/progress-ring/index.js +11 -10
  144. package/dist/radio-cards/index.d.ts +9 -5
  145. package/dist/radio-cards/index.d.ts.map +1 -1
  146. package/dist/radio-cards/index.js +26 -24
  147. package/dist/radio-group/index.d.ts +9 -8
  148. package/dist/radio-group/index.d.ts.map +1 -1
  149. package/dist/radio-group/index.js +35 -34
  150. package/dist/range-slider/index.d.ts +10 -4
  151. package/dist/range-slider/index.d.ts.map +1 -1
  152. package/dist/range-slider/index.js +43 -31
  153. package/dist/repeat-picker/index.d.ts +13 -6
  154. package/dist/repeat-picker/index.d.ts.map +1 -1
  155. package/dist/repeat-picker/index.js +74 -62
  156. package/dist/resizable/index.d.ts +29 -0
  157. package/dist/resizable/index.d.ts.map +1 -0
  158. package/dist/resizable/index.js +135 -0
  159. package/dist/segmented/index.d.ts +8 -5
  160. package/dist/segmented/index.d.ts.map +1 -1
  161. package/dist/segmented/index.js +36 -34
  162. package/dist/select/index.d.ts +9 -3
  163. package/dist/select/index.d.ts.map +1 -1
  164. package/dist/select/index.js +94 -91
  165. package/dist/separator/index.d.ts +14 -0
  166. package/dist/separator/index.d.ts.map +1 -0
  167. package/dist/separator/index.js +15 -0
  168. package/dist/side-nav/index.js +1 -1
  169. package/dist/skeleton/index.d.ts +4 -4
  170. package/dist/skeleton/index.d.ts.map +1 -1
  171. package/dist/skeleton/index.js +4 -3
  172. package/dist/slider/index.d.ts +6 -3
  173. package/dist/slider/index.d.ts.map +1 -1
  174. package/dist/slider/index.js +29 -23
  175. package/dist/sortable/index.d.ts +10 -20
  176. package/dist/sortable/index.d.ts.map +1 -1
  177. package/dist/sortable/index.js +72 -134
  178. package/dist/sortable/shared.d.ts +56 -0
  179. package/dist/sortable/shared.d.ts.map +1 -0
  180. package/dist/sortable/shared.js +104 -0
  181. package/dist/sortable/tree-model.d.ts +46 -0
  182. package/dist/sortable/tree-model.d.ts.map +1 -0
  183. package/dist/sortable/tree-model.js +87 -0
  184. package/dist/sortable/tree.d.ts +31 -0
  185. package/dist/sortable/tree.d.ts.map +1 -0
  186. package/dist/sortable/tree.js +150 -0
  187. package/dist/sparkline/index.d.ts +1 -1
  188. package/dist/sparkline/index.d.ts.map +1 -1
  189. package/dist/sparkline/index.js +26 -25
  190. package/dist/spinner/index.d.ts +4 -3
  191. package/dist/spinner/index.d.ts.map +1 -1
  192. package/dist/spinner/index.js +2 -1
  193. package/dist/status-pill/index.d.ts.map +1 -1
  194. package/dist/status-pill/index.js +1 -1
  195. package/dist/stepper/index.d.ts +1 -1
  196. package/dist/stepper/index.d.ts.map +1 -1
  197. package/dist/stepper/index.js +31 -30
  198. package/dist/tab-bar/index.js +1 -1
  199. package/dist/table/index.d.ts +5 -5
  200. package/dist/table/index.d.ts.map +1 -1
  201. package/dist/table/index.js +66 -64
  202. package/dist/table/selection.d.ts +2 -2
  203. package/dist/table/selection.d.ts.map +1 -1
  204. package/dist/table/selection.js +41 -38
  205. package/dist/table/swipe.d.ts +1 -1
  206. package/dist/table/swipe.d.ts.map +1 -1
  207. package/dist/table/swipe.js +1 -1
  208. package/dist/table-of-contents/index.d.ts +4 -2
  209. package/dist/table-of-contents/index.d.ts.map +1 -1
  210. package/dist/table-of-contents/index.js +27 -25
  211. package/dist/tabs/index.d.ts.map +1 -1
  212. package/dist/tabs/index.js +90 -88
  213. package/dist/tag-input/index.d.ts +3 -1
  214. package/dist/tag-input/index.d.ts.map +1 -1
  215. package/dist/tag-input/index.js +61 -52
  216. package/dist/textarea/index.js +4 -4
  217. package/dist/theme-toggle/index.d.ts +9 -8
  218. package/dist/theme-toggle/index.d.ts.map +1 -1
  219. package/dist/theme-toggle/index.js +30 -28
  220. package/dist/theme.css +90 -12
  221. package/dist/time-field/index.d.ts +31 -0
  222. package/dist/time-field/index.d.ts.map +1 -0
  223. package/dist/time-field/index.js +175 -0
  224. package/dist/timeline/index.js +1 -1
  225. package/dist/toast/index.d.ts +1 -1
  226. package/dist/toast/index.d.ts.map +1 -1
  227. package/dist/toast/index.js +127 -125
  228. package/dist/toggle/index.d.ts +2 -2
  229. package/dist/toggle/index.d.ts.map +1 -1
  230. package/dist/toggle/index.js +8 -6
  231. package/dist/toggle-group/index.d.ts +35 -0
  232. package/dist/toggle-group/index.d.ts.map +1 -0
  233. package/dist/toggle-group/index.js +53 -0
  234. package/dist/toolbar/index.d.ts +19 -0
  235. package/dist/toolbar/index.d.ts.map +1 -0
  236. package/dist/toolbar/index.js +36 -0
  237. package/dist/tooltip/index.d.ts.map +1 -1
  238. package/dist/tooltip/index.js +40 -74
  239. package/dist/tree/index.d.ts.map +1 -1
  240. package/dist/tree/index.js +105 -102
  241. package/dist/trend/index.d.ts +2 -2
  242. package/dist/trend/index.d.ts.map +1 -1
  243. package/dist/trend/index.js +20 -19
  244. package/dist/utils/color.d.ts +35 -0
  245. package/dist/utils/color.d.ts.map +1 -0
  246. package/dist/utils/color.js +65 -0
  247. package/dist/utils/cva.js +0 -1
  248. package/dist/utils/cx.js +0 -1
  249. package/dist/utils/date.d.ts +6 -0
  250. package/dist/utils/date.d.ts.map +1 -1
  251. package/dist/utils/date.js +1 -2
  252. package/dist/utils/direction.d.ts +7 -0
  253. package/dist/utils/direction.d.ts.map +1 -0
  254. package/dist/utils/direction.js +6 -0
  255. package/dist/utils/form-value.d.ts +15 -0
  256. package/dist/utils/form-value.d.ts.map +1 -0
  257. package/dist/utils/form-value.js +29 -0
  258. package/dist/utils/fx.js +0 -1
  259. package/dist/utils/merge.js +0 -1
  260. package/dist/utils/messages.d.ts +137 -0
  261. package/dist/utils/messages.d.ts.map +1 -0
  262. package/dist/utils/messages.js +133 -0
  263. package/dist/utils/money.js +0 -1
  264. package/dist/utils/month.js +0 -1
  265. package/dist/utils/motion.js +0 -1
  266. package/dist/utils/refs.d.ts +6 -0
  267. package/dist/utils/refs.d.ts.map +1 -0
  268. package/dist/utils/refs.js +13 -0
  269. package/dist/utils/repeat.d.ts +3 -1
  270. package/dist/utils/repeat.d.ts.map +1 -1
  271. package/dist/utils/repeat.js +28 -25
  272. package/dist/utils/roving.d.ts +17 -0
  273. package/dist/utils/roving.d.ts.map +1 -0
  274. package/dist/utils/roving.js +35 -0
  275. package/dist/utils/section-link.js +0 -1
  276. package/dist/utils/slot.d.ts.map +1 -1
  277. package/dist/utils/slot.js +7 -11
  278. package/dist/utils/status-icons.js +7 -7
  279. package/dist/utils/styles.d.ts +9 -2
  280. package/dist/utils/styles.d.ts.map +1 -1
  281. package/dist/utils/styles.js +6 -3
  282. package/dist/utils/theme-wave.d.ts.map +1 -1
  283. package/dist/utils/theme-wave.js +70 -70
  284. package/dist/utils/theme.d.ts.map +1 -1
  285. package/dist/utils/theme.js +56 -60
  286. package/dist/utils/useAnchoredPopup.d.ts +7 -4
  287. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  288. package/dist/utils/useAnchoredPopup.js +18 -11
  289. package/dist/utils/useControllable.d.ts +9 -0
  290. package/dist/utils/useControllable.d.ts.map +1 -0
  291. package/dist/utils/useControllable.js +15 -0
  292. package/dist/utils/useCopyToClipboard.d.ts +13 -0
  293. package/dist/utils/useCopyToClipboard.d.ts.map +1 -0
  294. package/dist/utils/useCopyToClipboard.js +26 -0
  295. package/dist/utils/useHoverPopup.d.ts +39 -0
  296. package/dist/utils/useHoverPopup.d.ts.map +1 -0
  297. package/dist/utils/useHoverPopup.js +64 -0
  298. package/dist/zen.css +1 -1
  299. package/package.json +1 -1
@@ -1,45 +1,40 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { useEffect as t, useRef as n, useState as r } from "react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
3
+ import { useMessages as t } from "../locale-provider/index.js";
4
+ import { useCopyToClipboard as n } from "../utils/useCopyToClipboard.js";
5
+ import { useEffect as r, useRef as i, useState as a } from "react";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
7
  //#region packages/code-block/index.tsx
6
- function o({ code: o, language: s, highlight: c, copyable: l = !0, variant: u = "glass", className: d, ...f }) {
7
- let p = o.trim(), [m, h] = r(!1);
8
- t(() => {
9
- if (!m) return;
10
- let e = setTimeout(() => h(!1), 1500);
11
- return () => clearTimeout(e);
12
- }, [m]);
13
- let g = n(null), [_, v] = r(!1);
14
- return t(() => {
15
- let e = g.current;
8
+ function c({ code: c, language: l, highlight: u, copyable: d = !0, variant: f = "glass", className: p, ...m }) {
9
+ let h = t(), g = c.trim(), { copy: _, copied: v } = n(), y = i(null), [b, x] = a(!1);
10
+ return r(() => {
11
+ let e = y.current;
16
12
  if (!e || typeof ResizeObserver > "u") return;
17
- let t = new ResizeObserver(() => v(e.scrollWidth > e.clientWidth || e.scrollHeight > e.clientHeight));
13
+ let t = new ResizeObserver(() => x(e.scrollWidth > e.clientWidth || e.scrollHeight > e.clientHeight));
18
14
  return t.observe(e), () => t.disconnect();
19
- }, []), /* @__PURE__ */ a("div", {
20
- className: e("zen__code-block group relative flex flex-col", u === "glass" && "glass glow-edge overflow-hidden rounded-xl", d),
21
- "data-language": s,
22
- ...f,
23
- children: [/* @__PURE__ */ i("pre", {
24
- ref: g,
25
- tabIndex: _ ? 0 : void 0,
26
- className: "text-foreground focus-visible:ring-ring/50 m-0! min-h-0 overflow-auto rounded-none! bg-transparent! p-5! font-mono text-[13px]! leading-6 font-normal! outline-hidden focus-visible:ring-2 focus-visible:ring-inset",
27
- children: c ? /* @__PURE__ */ i("code", {
15
+ }, []), /* @__PURE__ */ s("div", {
16
+ className: e("zen__code-block group relative flex flex-col", f === "glass" && "glass glow-edge overflow-hidden rounded-xl", p),
17
+ "data-language": l,
18
+ ...m,
19
+ children: [/* @__PURE__ */ o("pre", {
20
+ ref: y,
21
+ tabIndex: b ? 0 : void 0,
22
+ dir: "ltr",
23
+ className: "text-foreground focus-ring m-0! min-h-0 overflow-auto rounded-none! bg-transparent! p-5! font-mono text-[13px]! leading-6 font-normal! outline-hidden focus-visible:ring-inset",
24
+ children: u ? /* @__PURE__ */ o("code", {
28
25
  className: "bg-transparent! p-0! text-inherit!",
29
- dangerouslySetInnerHTML: { __html: c(p, s) }
30
- }) : /* @__PURE__ */ i("code", {
26
+ dangerouslySetInnerHTML: { __html: u(g, l) }
27
+ }) : /* @__PURE__ */ o("code", {
31
28
  className: "bg-transparent! p-0! text-inherit!",
32
- children: p
29
+ children: g
33
30
  })
34
- }), l && /* @__PURE__ */ i("button", {
31
+ }), d && /* @__PURE__ */ o("button", {
35
32
  type: "button",
36
- onClick: async () => {
37
- await navigator.clipboard?.writeText(p), h(!0);
38
- },
39
- className: e("zen__code-copy inline-flex items-center justify-center text-muted-foreground hover:bg-tint/[0.07] hover:text-foreground focus-visible:ring-ring/50 absolute top-2.5 right-2.5 cursor-pointer rounded-lg px-2.5 py-1 text-xs font-medium outline-hidden transition-[opacity,background-color,color] focus-visible:ring-2", "opacity-0 group-hover:opacity-100 focus-visible:opacity-100 pointer-coarse:min-h-11 pointer-coarse:min-w-11 [@media(hover:none)]:bg-card/90 [@media(hover:none)]:opacity-100", m && "text-primary opacity-100"),
40
- children: m ? "Copied" : "Copy"
33
+ onClick: () => _(g),
34
+ className: e("zen__code-copy inline-flex items-center justify-center text-muted-foreground hover:bg-tint/[0.07] hover:text-foreground absolute top-2.5 end-2.5 cursor-pointer rounded-lg px-2.5 py-1 text-xs font-medium outline-hidden transition-[opacity,background-color,color] focus-ring", "opacity-0 group-hover:opacity-100 focus-visible:opacity-100 pointer-coarse:min-h-11 pointer-coarse:min-w-11 [@media(hover:none)]:bg-card/90 [@media(hover:none)]:opacity-100", v && "text-primary opacity-100"),
35
+ children: v ? h.copied : h.copy
41
36
  })]
42
37
  });
43
38
  }
44
39
  //#endregion
45
- export { o as default };
40
+ export { c as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/code-input/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAY,MAAM,OAAO,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAC9B,MAAU,EACV,KAAK,EAAE,UAAU,EACjB,YAAiB,EACjB,aAAa,EACb,UAAU,EACV,OAAc,EACd,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,cAAc,+BAgEhB;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,WAAW,CAAC;IACzG,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/code-input/index.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAoB,MAAM,OAAO,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAC9B,MAAU,EACV,KAAK,EAAE,UAAU,EACjB,YAAiB,EACjB,aAAa,EACb,UAAU,EACV,OAAc,EACd,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,cAAc,+BAmEhB;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,WAAW,CAAC;IACzG,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -1,44 +1,50 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { useFieldProps as t } from "../field/index.js";
4
- import { useState as n } from "react";
5
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ import { useMergedRefs as t } from "../utils/refs.js";
4
+ import { useControllable as n } from "../utils/useControllable.js";
5
+ import { useFieldProps as r } from "../field/index.js";
6
+ import { useFormReset as i } from "../utils/form-value.js";
7
+ import { useRef as a, useState as o } from "react";
8
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
9
  //#region packages/code-input/index.tsx
7
- function a({ length: a = 6, value: o, defaultValue: s = "", onValueChange: c, onComplete: l, allowed: u = /\d/, className: d, disabled: f, ...p }) {
8
- let [m, h] = n(s), g = o ?? m, [_, v] = n(!1), y = t(p), b = u.source === "\\d";
9
- return /* @__PURE__ */ i("div", {
10
- className: e("zen__code-input relative inline-flex gap-2", f && "opacity-50", d),
11
- children: [/* @__PURE__ */ r("input", {
10
+ function l({ length: l = 6, value: u, defaultValue: d = "", onValueChange: f, onComplete: p, allowed: m = /\d/, className: h, disabled: g, ..._ }) {
11
+ let [v, y, b] = n(u, d, f), x = a(null), S = t(x, _.ref);
12
+ i(x, b);
13
+ let [C, w] = o(!1), T = r(_), E = m.source === "\\d";
14
+ return /* @__PURE__ */ c("div", {
15
+ className: e("zen__code-input relative inline-flex gap-2", g && "opacity-50", h),
16
+ children: [/* @__PURE__ */ s("input", {
12
17
  autoComplete: "one-time-code",
13
- inputMode: b ? "numeric" : "text",
18
+ inputMode: E ? "numeric" : "text",
14
19
  spellCheck: !1,
15
- maxLength: a,
16
- ...p,
17
- ...y,
18
- disabled: f,
19
- value: g,
20
+ maxLength: l,
21
+ ..._,
22
+ ...T,
23
+ ref: S,
24
+ disabled: g,
25
+ value: v,
20
26
  onChange: (e) => {
21
- let t = e.target.value.split("").filter((e) => u.test(e)).join("").slice(0, a);
22
- o === void 0 && h(t), c?.(t), t.length === a && g.length !== a && l?.(t);
27
+ let t = e.target.value.split("").filter((e) => m.test(e)).join("").slice(0, l);
28
+ _.onChange?.(e), y(t), t.length === l && v.length !== l && p?.(t);
23
29
  },
24
30
  onFocus: (e) => {
25
- p.onFocus?.(e), v(!0);
31
+ _.onFocus?.(e), w(!0);
26
32
  let t = e.target.value.length;
27
33
  e.target.setSelectionRange(t, t);
28
34
  },
29
35
  onBlur: (e) => {
30
- p.onBlur?.(e), v(!1);
36
+ _.onBlur?.(e), w(!1);
31
37
  },
32
38
  className: "absolute inset-0 z-10 cursor-text font-mono text-transparent caret-transparent opacity-0 outline-hidden selection:bg-transparent disabled:cursor-not-allowed"
33
- }), Array.from({ length: a }, (t, n) => {
34
- let o = _ && (n === g.length || n === a - 1 && g.length === a);
35
- return /* @__PURE__ */ i("span", {
39
+ }), Array.from({ length: l }, (t, n) => {
40
+ let r = C && (n === v.length || n === l - 1 && v.length === l);
41
+ return /* @__PURE__ */ c("span", {
36
42
  "aria-hidden": !0,
37
- className: e("glow-border bg-tint/[0.035] relative grid h-12 w-10 place-items-center rounded-lg border font-mono text-lg tabular-nums [--glow-border-color:oklch(var(--glow)/0.22)]", "transition-[border-color,box-shadow,background-color] duration-200", o && "border-glow/60 bg-tint/[0.05] shadow-glow-focus [--glow-border-color:transparent]", y["aria-invalid"] && "border-destructive/60"),
38
- children: [g[n], o && n === g.length && /* @__PURE__ */ r("span", { className: "zen__code-caret bg-foreground absolute h-5 w-px" })]
43
+ className: e("glow-border bg-tint/[0.035] relative grid h-12 w-10 place-items-center rounded-lg border font-mono text-lg tabular-nums [--glow-border-color:oklch(var(--glow)/0.22)]", "transition-[border-color,box-shadow,background-color] duration-200", r && "border-glow/60 bg-tint/[0.05] shadow-glow-focus [--glow-border-color:transparent]", T["aria-invalid"] && "border-destructive/60"),
44
+ children: [v[n], r && n === v.length && /* @__PURE__ */ s("span", { className: "zen__code-caret bg-foreground absolute h-5 w-px" })]
39
45
  }, n);
40
46
  })]
41
47
  });
42
48
  }
43
49
  //#endregion
44
- export { a as default };
50
+ export { l as default };
@@ -1,5 +1,5 @@
1
1
  import { BadgeProps } from '../badge';
2
- import { ReactNode } from 'react';
2
+ import { ComponentProps, ReactNode } from 'react';
3
3
  /**
4
4
  * A row showing as many items as fit on one line, and the rest behind a "+N"
5
5
  * button that opens them in a popover. It measures the items as rendered (any
@@ -7,8 +7,9 @@ import { ReactNode } from 'react';
7
7
  * is the room it's given, not its items': size the row with className (e.g.
8
8
  * w-full, max-w-md, gap-1).
9
9
  */
10
- export default function Collapse<TData>({ items, data, children, moreLabel, badgeVariant, badgeClassName, className, }: CollapseProps<TData>): import('react').JSX.Element;
11
- export interface CollapseProps<TData> {
10
+ export default function Collapse<TData>({ items, data, children, moreLabel, badgeVariant, badgeClassName, className, ref, ...rest }: CollapseProps<TData>): import('react').JSX.Element;
11
+ /** Other props (data-*, an id) go on the row. */
12
+ export interface CollapseProps<TData> extends Omit<ComponentProps<'div'>, 'children'> {
12
13
  items: string[];
13
14
  /** Extra data per item, passed to `children` with it. */
14
15
  data?: TData[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/collapse/index.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAgD,MAAM,OAAO,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,EACpC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAc,EACd,YAA0B,EAC1B,cAAc,EACd,SAAS,GACZ,EAAE,aAAa,CAAC,KAAK,CAAC,+BAqGtB;AAED,MAAM,WAAW,aAAa,CAAC,KAAK;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC;IACvE,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/collapse/index.tsx"],"names":[],"mappings":"AACA,OAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAgD,MAAM,OAAO,CAAC;AAEhG;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,EACpC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAc,EACd,YAA0B,EAC1B,cAAc,EACd,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACV,EAAE,aAAa,CAAC,KAAK,CAAC,+BAwGtB;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAa,CAAC,KAAK,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACjF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC;IACvE,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1,82 +1,85 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import t from "../badge/index.js";
4
- import n, { PopoverContent as r, PopoverTrigger as i } from "../popover/index.js";
5
- import { useEffect as a, useLayoutEffect as o, useRef as s, useState as c } from "react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
3
+ import { useMergedRefs as t } from "../utils/refs.js";
4
+ import { useMessages as n } from "../locale-provider/index.js";
5
+ import r from "../badge/index.js";
6
+ import i, { PopoverContent as a, PopoverTrigger as o } from "../popover/index.js";
7
+ import { useEffect as s, useLayoutEffect as c, useRef as l, useState as u } from "react";
8
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
9
  //#region packages/collapse/index.tsx
8
- function d({ items: d, data: f, children: p, moreLabel: m = "", badgeVariant: h = "secondary", badgeClassName: g, className: _ }) {
9
- let v = s(null), [y, b] = c(null), x = s({
10
+ function p({ items: p, data: m, children: h, moreLabel: g = "", badgeVariant: _ = "secondary", badgeClassName: v, className: y, ref: b, ...x }) {
11
+ let S = n(), C = l(null), w = t(C, b), [T, E] = u(null), D = l({
10
12
  items: [],
11
13
  more: 0,
12
14
  gap: 0
13
- }), S = d.join("\0");
14
- o(() => b(null), [S]), o(() => {
15
- let e = v.current;
15
+ }), O = p.join("\0");
16
+ c(() => E(null), [O]), c(() => {
17
+ let e = C.current;
16
18
  if (!e) return;
17
19
  let t = () => {
18
- let { items: t, more: n, gap: r } = x.current, i = e.clientWidth;
20
+ let { items: t, more: n, gap: r } = D.current, i = e.clientWidth;
19
21
  if (t.reduce((e, t) => e + t, 0) + r * Math.max(0, t.length - 1) <= i) return t.length;
20
22
  let a = n, o = 0;
21
23
  for (; o < t.length && a + t[o] + r <= i;) a += t[o++] + r;
22
24
  return o;
23
25
  };
24
- if (y === null) {
26
+ if (T === null) {
25
27
  let n = Array.from(e.querySelectorAll(":scope > [data-collapse-item]")), r = e.querySelector(":scope > [data-collapse-more]");
26
- x.current = {
28
+ D.current = {
27
29
  items: n.map((e) => e.offsetWidth),
28
30
  more: r?.offsetWidth ?? 0,
29
31
  gap: parseFloat(getComputedStyle(e).columnGap) || 0
30
- }, b(t());
32
+ }, E(t());
31
33
  return;
32
34
  }
33
35
  if (typeof ResizeObserver > "u") return;
34
- let n = new ResizeObserver(() => b(t()));
36
+ let n = new ResizeObserver(() => E(t()));
35
37
  return n.observe(e), () => n.disconnect();
36
- }, [y, S]), a(() => {
38
+ }, [T, O]), s(() => {
37
39
  let e = !0;
38
- return document.fonts?.ready.then(() => e && b(null)), () => {
40
+ return document.fonts?.ready.then(() => e && E(null)), () => {
39
41
  e = !1;
40
42
  };
41
43
  }, []);
42
- let C = y ?? d.length, w = d.slice(C), T = (e) => `+${e}${m ? ` ${m}` : ""}`;
43
- return /* @__PURE__ */ u("div", {
44
- ref: v,
45
- className: e("zen__collapse flex min-w-0 items-center overflow-hidden [contain:inline-size]", _),
46
- children: [d.slice(0, C).map((e, t) => /* @__PURE__ */ l("span", {
44
+ let k = T ?? p.length, A = p.slice(k), j = (e) => `+${e}${g ? ` ${g}` : ""}`;
45
+ return /* @__PURE__ */ f("div", {
46
+ ...x,
47
+ ref: w,
48
+ className: e("zen__collapse flex min-w-0 items-center overflow-hidden [contain:inline-size]", y),
49
+ children: [p.slice(0, k).map((e, t) => /* @__PURE__ */ d("span", {
47
50
  "data-collapse-item": !0,
48
51
  className: "flex shrink-0",
49
- children: p(e, t, f?.[t])
50
- }, e)), y === null ? /* @__PURE__ */ l("span", {
52
+ children: h(e, t, m?.[t])
53
+ }, e)), T === null ? /* @__PURE__ */ d("span", {
51
54
  "data-collapse-more": !0,
52
55
  "aria-hidden": !0,
53
56
  className: "invisible flex shrink-0",
54
- children: /* @__PURE__ */ l(t, {
55
- variant: h,
56
- className: g,
57
- children: T(d.length)
57
+ children: /* @__PURE__ */ d(r, {
58
+ variant: _,
59
+ className: v,
60
+ children: j(p.length)
58
61
  })
59
- }) : w.length > 0 && /* @__PURE__ */ u(n, { children: [/* @__PURE__ */ l(i, {
62
+ }) : A.length > 0 && /* @__PURE__ */ f(i, { children: [/* @__PURE__ */ d(o, {
60
63
  "data-collapse-more": !0,
61
64
  onClick: (e) => e.stopPropagation(),
62
65
  className: "flex shrink-0 rounded-md",
63
- "aria-label": `Show ${T(w.length).slice(1)}`,
64
- children: /* @__PURE__ */ l(t, {
65
- variant: h,
66
- className: e("cursor-pointer", g),
67
- children: T(w.length)
66
+ "aria-label": S.showMore(j(A.length).slice(1)),
67
+ children: /* @__PURE__ */ d(r, {
68
+ variant: _,
69
+ className: e("cursor-pointer", v),
70
+ children: j(A.length)
68
71
  })
69
- }), /* @__PURE__ */ l(r, {
70
- "aria-label": T(w.length).slice(1),
71
- children: /* @__PURE__ */ l("div", {
72
+ }), /* @__PURE__ */ d(a, {
73
+ "aria-label": j(A.length).slice(1),
74
+ children: /* @__PURE__ */ d("div", {
72
75
  className: "grid max-h-60 grid-flow-row grid-cols-2 gap-3 overflow-auto p-2",
73
- children: w.map((e, t) => /* @__PURE__ */ l("span", {
76
+ children: A.map((e, t) => /* @__PURE__ */ d("span", {
74
77
  className: "flex",
75
- children: p(e, C + t, f?.[C + t])
78
+ children: h(e, k + t, m?.[k + t])
76
79
  }, e))
77
80
  })
78
81
  })] })]
79
82
  });
80
83
  }
81
84
  //#endregion
82
- export { d as default };
85
+ export { p as default };
@@ -0,0 +1,43 @@
1
+ import { FieldSize } from '../utils/styles';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * Everything ColorPicker opens: a saturation and brightness area, hue and
5
+ * alpha sliders, the hex, and your swatches. Use it inline, or in a popup of
6
+ * your own. Values are hex: "#rrggbb", or "#rrggbbaa" with `alpha`.
7
+ */
8
+ export declare function ColorPanel({ value: valueProp, defaultValue, onValueChange, onValueCommit, alpha, swatches, className, ...rest }: ColorPanelProps): import('react').JSX.Element;
9
+ /**
10
+ * A field showing a colour and its hex that opens a ColorPanel: drag or use
11
+ * the arrow keys in the area, slide the hue (and opacity, with `alpha`), type
12
+ * a hex or pick a swatch. Works in a Field like any input.
13
+ */
14
+ export default function ColorPicker({ value: valueProp, defaultValue, onValueChange, onValueCommit, alpha, swatches, name, size, id, disabled, className, style, ...rest }: ColorPickerProps): import('react').JSX.Element;
15
+ export interface ColorSwatch {
16
+ label: string;
17
+ /** Hex, like the picker's value. */
18
+ value: string;
19
+ }
20
+ interface ColorValueProps {
21
+ /** "#rrggbb", or "#rrggbbaa" with `alpha`, when you keep it. */
22
+ value?: string;
23
+ /** The first colour, when the picker keeps its own. Black by default. */
24
+ defaultValue?: string;
25
+ /** Every change, while dragging too. */
26
+ onValueChange?: (value: string) => void;
27
+ /** Once a change is made: let go of the area or a slider, a key, a hex entered, a swatch picked. */
28
+ onValueCommit?: (value: string) => void;
29
+ /** Offer opacity; values may then be "#rrggbbaa". */
30
+ alpha?: boolean;
31
+ /** Colours to pick in one press, such as your theme's. */
32
+ swatches?: ColorSwatch[];
33
+ }
34
+ export interface ColorPanelProps extends ColorValueProps, Omit<ComponentProps<'div'>, 'defaultValue'> {
35
+ }
36
+ export interface ColorPickerProps extends ColorValueProps, Omit<ComponentProps<'button'>, 'value' | 'defaultValue'> {
37
+ /** Form field name: the hex is submitted with the form. */
38
+ name?: string;
39
+ /** Height, matching Button's: sm (32px), default (40px) or lg (44px). */
40
+ size?: FieldSize;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/color-picker/index.tsx"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,SAAS,EAAgC,MAAM,mBAAmB,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAgD,MAAM,OAAO,CAAC;AAmBrF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EAAE,SAAS,EAChB,YAAwB,EACxB,aAAa,EACb,aAAa,EACb,KAAa,EACb,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACV,EAAE,eAAe,+BAkJjB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EAAE,SAAS,EAChB,YAAwB,EACxB,aAAa,EACb,aAAa,EACb,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,IAAgB,EAChB,EAAE,EACF,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACV,EAAE,gBAAgB,+BAmDlB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACrB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oGAAoG;IACpG,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;CAAG;AAExG,MAAM,WAAW,gBAAiB,SAAQ,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IAC/G,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB"}
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { useControllable as t } from "../utils/useControllable.js";
4
+ import { useAnchoredPopup as n } from "../utils/useAnchoredPopup.js";
5
+ import { useMessages as r } from "../locale-provider/index.js";
6
+ import { useFieldProps as i } from "../field/index.js";
7
+ import { FIELD_SIZE as a, POPUP as o, TRIGGER as s } from "../utils/styles.js";
8
+ import c from "../input/index.js";
9
+ import { FormValue as l } from "../utils/form-value.js";
10
+ import u from "../slider/index.js";
11
+ import { hexToHsv as d, hsvToHex as f } from "../utils/color.js";
12
+ import { FieldChevron as p } from "../utils/field-chevron.js";
13
+ import { useId as m, useState as h } from "react";
14
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
15
+ //#region packages/color-picker/index.tsx
16
+ var y = {
17
+ h: 0,
18
+ s: 0,
19
+ v: 0,
20
+ a: 1
21
+ }, b = "repeating-conic-gradient(#9ca3af 0 25%, #f3f4f6 0 50%) 0 0 / 8px 8px", x = `linear-gradient(to right, ${[
22
+ 0,
23
+ 60,
24
+ 120,
25
+ 180,
26
+ 240,
27
+ 300,
28
+ 360
29
+ ].map((e) => `hsl(${e} 100% 50%)`).join(", ")})`, S = (e) => Math.round(e * 100), C = {
30
+ ArrowLeft: [-1, 0],
31
+ ArrowRight: [1, 0],
32
+ ArrowDown: [0, -1],
33
+ ArrowUp: [0, 1]
34
+ };
35
+ function w(e, t) {
36
+ let n = d(e);
37
+ return n ? f(t ? n : {
38
+ ...n,
39
+ a: 1
40
+ }) : null;
41
+ }
42
+ function T({ value: n, defaultValue: i = "#000000", onValueChange: a, onValueCommit: o, alpha: s = !1, swatches: l, className: p, ...g }) {
43
+ let T = r(), [E, D] = t(n, i, a), O = m(), [k, A] = h(() => d(E) ?? y), [j, M] = h(E);
44
+ if (E !== j) {
45
+ M(E);
46
+ let e = w(E, s);
47
+ e && e !== f(k) && A(d(e));
48
+ }
49
+ let N = f(k), P = f({
50
+ ...k,
51
+ a: 1
52
+ }), [F, I] = h(null), L = (e) => {
53
+ let t = {
54
+ ...k,
55
+ ...e
56
+ };
57
+ return s || (t.a = 1), A(t), D(f(t)), f(t);
58
+ }, R = (e = N) => o?.(e), z = (e) => {
59
+ let t = e.currentTarget.getBoundingClientRect(), n = Math.min(1, Math.max(0, (e.clientX - t.left) / t.width)), r = 1 - Math.min(1, Math.max(0, (e.clientY - t.top) / t.height));
60
+ return L({
61
+ s: n,
62
+ v: r
63
+ });
64
+ }, B = (e) => {
65
+ let t = C[e.key];
66
+ if (!t) return;
67
+ e.preventDefault();
68
+ let n = (e.shiftKey ? 10 : 1) / 100, r = (e) => Math.min(1, Math.max(0, Math.round((e + 2 ** -52) * 100) / 100));
69
+ R(L({
70
+ s: r(k.s + t[0] * n),
71
+ v: r(k.v + t[1] * n)
72
+ }));
73
+ }, V = () => {
74
+ if (F === null) return;
75
+ let e = w(F.startsWith("#") ? F : `#${F}`, s);
76
+ I(null), e && e !== N && (A(d(e)), D(e), R(e));
77
+ };
78
+ return /* @__PURE__ */ v("div", {
79
+ className: e("zen__color-panel flex w-64 flex-col gap-3", p),
80
+ ...g,
81
+ children: [
82
+ /* @__PURE__ */ _("div", {
83
+ role: "slider",
84
+ tabIndex: 0,
85
+ "aria-label": T.saturationBrightness,
86
+ "aria-valuemin": 0,
87
+ "aria-valuemax": 100,
88
+ "aria-valuenow": S(k.s),
89
+ "aria-valuetext": T.saturationBrightnessValue(S(k.s), S(k.v)),
90
+ onPointerDown: (e) => {
91
+ e.button === 0 && (e.currentTarget.setPointerCapture?.(e.pointerId), e.currentTarget.focus(), z(e));
92
+ },
93
+ onPointerMove: (e) => e.currentTarget.hasPointerCapture?.(e.pointerId) && z(e),
94
+ onPointerUp: (e) => R(z(e)),
95
+ onKeyDown: B,
96
+ style: { background: `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, hsl(${k.h} 100% 50%))` },
97
+ className: "focus-ring relative h-40 cursor-crosshair touch-none rounded-lg shadow-[inset_0_0_0_1px_oklch(var(--tint)/0.1)] outline-hidden",
98
+ children: /* @__PURE__ */ _("span", {
99
+ "aria-hidden": !0,
100
+ style: {
101
+ left: `${k.s * 100}%`,
102
+ top: `${(1 - k.v) * 100}%`,
103
+ background: P
104
+ },
105
+ className: "pointer-events-none absolute size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_oklch(0_0_0/0.3),0_0_12px_oklch(0_0_0/0.35)]"
106
+ })
107
+ }),
108
+ /* @__PURE__ */ _(u, {
109
+ "aria-label": T.hue,
110
+ min: 0,
111
+ max: 359,
112
+ value: Math.round(k.h),
113
+ onValueChange: (e) => L({ h: e }),
114
+ onValueCommit: () => R(),
115
+ trackBackground: x,
116
+ thumbColor: `hsl(${k.h} 100% 50%)`,
117
+ valueText: T.hueValue
118
+ }),
119
+ s && /* @__PURE__ */ _(u, {
120
+ "aria-label": T.opacity,
121
+ min: 0,
122
+ max: 100,
123
+ value: S(k.a),
124
+ onValueChange: (e) => L({ a: e / 100 }),
125
+ onValueCommit: () => R(),
126
+ trackBackground: `linear-gradient(to right, transparent, ${P}), ${b}`,
127
+ thumbColor: P,
128
+ valueText: T.opacityValue
129
+ }),
130
+ /* @__PURE__ */ _(c, {
131
+ "aria-label": T.hex,
132
+ spellCheck: !1,
133
+ autoComplete: "off",
134
+ value: F ?? N,
135
+ onChange: (e) => I(e.target.value),
136
+ onBlur: V,
137
+ onKeyDown: (e) => e.key === "Enter" && V(),
138
+ className: "h-9 font-mono tabular-nums"
139
+ }),
140
+ l && l.length > 0 && /* @__PURE__ */ v("fieldset", {
141
+ className: "flex flex-wrap gap-1.5",
142
+ children: [/* @__PURE__ */ _("legend", {
143
+ className: "sr-only",
144
+ children: T.swatches
145
+ }), l.map((e) => {
146
+ let t = w(e.value, s);
147
+ return /* @__PURE__ */ v("label", {
148
+ title: e.label,
149
+ className: "relative cursor-pointer",
150
+ children: [/* @__PURE__ */ _("input", {
151
+ type: "radio",
152
+ name: O,
153
+ "aria-label": e.label,
154
+ checked: t === N,
155
+ onChange: () => {
156
+ t && (A(d(t)), D(t), R(t));
157
+ },
158
+ className: "peer sr-only"
159
+ }), /* @__PURE__ */ _("span", {
160
+ "aria-hidden": !0,
161
+ style: { background: `linear-gradient(${e.value}, ${e.value}), ${b}` },
162
+ className: "ring-offset-background peer- peer-checked:ring-foreground/70 peer-focus-ring block size-6 rounded-full shadow-[inset_0_0_0_1px_oklch(var(--tint)/0.12)] ring-offset-2 transition-shadow peer-checked:ring-2"
163
+ })]
164
+ }, e.value);
165
+ })]
166
+ })
167
+ ]
168
+ });
169
+ }
170
+ function E({ value: c, defaultValue: u = "#000000", onValueChange: d, onValueCommit: f, alpha: m, swatches: h, name: y, size: x = "default", id: S, disabled: C, className: w, style: E, ...D }) {
171
+ let O = r(), [k, A, j] = t(c, u, d), M = n(), N = i({
172
+ ...D,
173
+ id: S
174
+ });
175
+ return /* @__PURE__ */ v(g, { children: [
176
+ /* @__PURE__ */ v("button", {
177
+ type: "button",
178
+ ...D,
179
+ ...N,
180
+ id: S,
181
+ disabled: C,
182
+ ...M.triggerProps,
183
+ style: {
184
+ ...M.triggerProps.style,
185
+ ...E
186
+ },
187
+ className: e("zen__color-picker group", s, a[x], "w-full", M.open && "border-glow/60 [--glow-border-color:transparent] shadow-glow-focus", w),
188
+ children: [/* @__PURE__ */ v("span", {
189
+ className: "flex min-w-0 items-center gap-2.5",
190
+ children: [/* @__PURE__ */ _("span", {
191
+ "aria-hidden": !0,
192
+ style: { background: `linear-gradient(${k}, ${k}), ${b}` },
193
+ className: "size-5 shrink-0 rounded-md shadow-[inset_0_0_0_1px_oklch(var(--tint)/0.15)]"
194
+ }), /* @__PURE__ */ _("span", {
195
+ className: "truncate font-mono tabular-nums",
196
+ children: k
197
+ })]
198
+ }), /* @__PURE__ */ _(p, { open: M.open })]
199
+ }),
200
+ /* @__PURE__ */ _(l, {
201
+ name: y,
202
+ value: k,
203
+ onReset: j
204
+ }),
205
+ /* @__PURE__ */ _("div", {
206
+ ...M.popupProps,
207
+ role: "dialog",
208
+ "aria-label": O.chooseColour,
209
+ className: e("zen__popover", o, "p-3"),
210
+ children: /* @__PURE__ */ _(T, {
211
+ value: k,
212
+ onValueChange: A,
213
+ onValueCommit: f,
214
+ alpha: m,
215
+ swatches: h
216
+ })
217
+ })
218
+ ] });
219
+ }
220
+ //#endregion
221
+ export { T as ColorPanel, E as default };
@@ -1,3 +1,4 @@
1
+ import { FieldSize } from '../utils/styles';
1
2
  import { ComponentProps, ReactNode } from 'react';
2
3
  /**
3
4
  * Pick one or several items from a list you can search: a field that opens a
@@ -13,14 +14,14 @@ export default function Combobox<T>(props: ComboboxProps<T>): import('react').JS
13
14
  * The field: shows the choice (text, or chips when `multiple`) or the
14
15
  * placeholder, and opens the panel. Pass children to show the value your own way.
15
16
  */
16
- export declare function ComboboxTrigger({ placeholder, disabled, className, style, children, ...rest }: ComboboxTriggerProps): import('react').JSX.Element;
17
+ export declare function ComboboxTrigger({ placeholder: placeholderProp, disabled, size, className, style, children, ...rest }: ComboboxTriggerProps): import('react').JSX.Element;
17
18
  /** The panel under the field. Put ComboboxSearch and ComboboxList in it. */
18
19
  export declare function ComboboxPopup({ className, children }: {
19
20
  className?: string;
20
21
  children: ReactNode;
21
22
  }): import('react').JSX.Element;
22
23
  /** The search box: focused when the panel opens; ↑↓ move through the matches and Enter chooses. */
23
- export declare function ComboboxSearch({ placeholder, 'aria-label': ariaLabel, }: ComboboxSearchProps): import('react').JSX.Element;
24
+ export declare function ComboboxSearch({ placeholder, 'aria-label': ariaLabel }: ComboboxSearchProps): import('react').JSX.Element;
24
25
  /**
25
26
  * The matching items, rendered only while in view (so thousands stay fast).
26
27
  * Rows are `itemHeight` px tall; `renderItem` draws each (default: a
@@ -48,21 +49,28 @@ interface ComboboxBaseProps<T> {
48
49
  filter?: (item: T, query: string) => boolean;
49
50
  /** Chosen items that aren't in `items` (e.g. just created), so the field can still show them. */
50
51
  selectedItems?: readonly T[];
52
+ /** Form field name: the chosen key is submitted with the form (with `multiple`, each key). */
53
+ name?: string;
51
54
  children: ReactNode;
52
55
  }
56
+ /** `value` when you keep the choice; `defaultValue` for the first one when the combobox keeps its own. */
53
57
  export type ComboboxProps<T> = ComboboxBaseProps<T> & ({
54
58
  multiple?: false;
55
- value: string | null;
56
- onValueChange: (key: string) => void;
59
+ value?: string | null;
60
+ defaultValue?: string | null;
61
+ onValueChange?: (key: string) => void;
57
62
  } | {
58
63
  multiple: true;
59
- value: readonly string[];
60
- onValueChange: (keys: string[]) => void;
64
+ value?: readonly string[];
65
+ defaultValue?: readonly string[];
66
+ onValueChange?: (keys: string[]) => void;
61
67
  });
62
68
  export interface ComboboxTriggerProps extends Omit<ComponentProps<'div'>, 'children'> {
63
69
  /** Shown while nothing is chosen. */
64
70
  placeholder?: string;
65
71
  disabled?: boolean;
72
+ /** Height, matching Button's: sm (32px), default (40px) or lg (44px). */
73
+ size?: FieldSize;
66
74
  /** Your own display of the value (default: its text, or chips). */
67
75
  children?: ReactNode;
68
76
  }