@mdigital_ui/ui 0.4.8 → 0.5.1

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 (227) hide show
  1. package/README.md +279 -247
  2. package/dist/alert/index.d.ts.map +1 -1
  3. package/dist/alert/index.js +1 -1
  4. package/dist/autocomplete/index.d.ts.map +1 -1
  5. package/dist/autocomplete/index.js +3 -2
  6. package/dist/avatar/index.d.ts.map +1 -1
  7. package/dist/avatar/index.js +1 -1
  8. package/dist/breadcrumbs/index.js +4 -4
  9. package/dist/button/index.js +2 -2
  10. package/dist/calendar/index.d.ts.map +1 -1
  11. package/dist/calendar/index.js +2 -1
  12. package/dist/cascader/index.d.ts.map +1 -1
  13. package/dist/cascader/index.js +1 -1
  14. package/dist/checkbox/index.d.ts.map +1 -1
  15. package/dist/checkbox/index.js +1 -1
  16. package/dist/checkbox/types.d.ts +2 -0
  17. package/dist/checkbox/types.d.ts.map +1 -1
  18. package/dist/{chunk-Z3DIBMBQ.js → chunk-3K4GIXFA.js} +178 -118
  19. package/dist/chunk-3K4GIXFA.js.map +1 -0
  20. package/dist/{chunk-SJLH5ZDW.js → chunk-4QLYRAW2.js} +3 -3
  21. package/dist/{chunk-SJLH5ZDW.js.map → chunk-4QLYRAW2.js.map} +1 -1
  22. package/dist/{chunk-4TEZWGX7.js → chunk-64OCJYSH.js} +17 -8
  23. package/dist/chunk-64OCJYSH.js.map +1 -0
  24. package/dist/{chunk-5YEC6FDN.js → chunk-6CMHCCDO.js} +14 -7
  25. package/dist/chunk-6CMHCCDO.js.map +1 -0
  26. package/dist/{chunk-7RT65ZGV.js → chunk-6H2Y3QKP.js} +75 -23
  27. package/dist/chunk-6H2Y3QKP.js.map +1 -0
  28. package/dist/{chunk-UFYG3HKL.js → chunk-6K6RGQNL.js} +193 -94
  29. package/dist/chunk-6K6RGQNL.js.map +1 -0
  30. package/dist/{chunk-ROQGBDET.js → chunk-6XXAZ6P2.js} +15 -7
  31. package/dist/chunk-6XXAZ6P2.js.map +1 -0
  32. package/dist/{chunk-3Z7RLVWD.js → chunk-75T5BISG.js} +7 -13
  33. package/dist/chunk-75T5BISG.js.map +1 -0
  34. package/dist/{chunk-XAM5EKOS.js → chunk-7SKAAKBC.js} +13 -12
  35. package/dist/chunk-7SKAAKBC.js.map +1 -0
  36. package/dist/{chunk-6RZEJRTC.js → chunk-7ZUIX4NK.js} +3 -3
  37. package/dist/{chunk-6RZEJRTC.js.map → chunk-7ZUIX4NK.js.map} +1 -1
  38. package/dist/{chunk-NPK4ESMA.js → chunk-B75ICJCX.js} +9 -16
  39. package/dist/chunk-B75ICJCX.js.map +1 -0
  40. package/dist/chunk-CB7YOZWV.js +50 -0
  41. package/dist/chunk-CB7YOZWV.js.map +1 -0
  42. package/dist/{chunk-UFC3RGIN.js → chunk-DXAOZB6J.js} +4 -4
  43. package/dist/chunk-DXAOZB6J.js.map +1 -0
  44. package/dist/{chunk-75N6T3IS.js → chunk-ECBTSKES.js} +13 -10
  45. package/dist/chunk-ECBTSKES.js.map +1 -0
  46. package/dist/{chunk-J2WIZULN.js → chunk-FCIK35OY.js} +3 -3
  47. package/dist/{chunk-J2WIZULN.js.map → chunk-FCIK35OY.js.map} +1 -1
  48. package/dist/{chunk-FY2TZ2NT.js → chunk-GP7R3AFC.js} +58 -30
  49. package/dist/chunk-GP7R3AFC.js.map +1 -0
  50. package/dist/{chunk-ED4CQZ72.js → chunk-GQM5WLP5.js} +4 -4
  51. package/dist/{chunk-ED4CQZ72.js.map → chunk-GQM5WLP5.js.map} +1 -1
  52. package/dist/{chunk-TBKPQOXF.js → chunk-GSLNACUF.js} +3 -3
  53. package/dist/{chunk-TBKPQOXF.js.map → chunk-GSLNACUF.js.map} +1 -1
  54. package/dist/{chunk-OJAHIPPP.js → chunk-HGWD63IR.js} +3 -3
  55. package/dist/{chunk-OJAHIPPP.js.map → chunk-HGWD63IR.js.map} +1 -1
  56. package/dist/chunk-HKQOAEFY.js +1 -1
  57. package/dist/{chunk-PD3O6ZH4.js → chunk-JXOLZBXF.js} +19 -8
  58. package/dist/chunk-JXOLZBXF.js.map +1 -0
  59. package/dist/{chunk-CUXQZRDI.js → chunk-JZCONCJS.js} +13 -3
  60. package/dist/chunk-JZCONCJS.js.map +1 -0
  61. package/dist/{chunk-TDPJYCNI.js → chunk-KBT6UQNA.js} +14 -35
  62. package/dist/chunk-KBT6UQNA.js.map +1 -0
  63. package/dist/{chunk-VNH6R5EU.js → chunk-KR3GBSVA.js} +4 -6
  64. package/dist/chunk-KR3GBSVA.js.map +1 -0
  65. package/dist/{chunk-JWYBDNC6.js → chunk-KTK7LSKX.js} +7 -8
  66. package/dist/chunk-KTK7LSKX.js.map +1 -0
  67. package/dist/{chunk-J4SAIKKZ.js → chunk-L3ZFNHVX.js} +25 -22
  68. package/dist/chunk-L3ZFNHVX.js.map +1 -0
  69. package/dist/{chunk-PB5VGXS5.js → chunk-LBOQJHFH.js} +3 -3
  70. package/dist/{chunk-PB5VGXS5.js.map → chunk-LBOQJHFH.js.map} +1 -1
  71. package/dist/{chunk-XCK62GVU.js → chunk-LZ2MHSYF.js} +8 -5
  72. package/dist/chunk-LZ2MHSYF.js.map +1 -0
  73. package/dist/{chunk-LHZJ2GJU.js → chunk-MHRSK2QC.js} +8 -6
  74. package/dist/chunk-MHRSK2QC.js.map +1 -0
  75. package/dist/{chunk-JIXINKUJ.js → chunk-N742SARE.js} +8 -7
  76. package/dist/chunk-N742SARE.js.map +1 -0
  77. package/dist/{chunk-3XOHSE3X.js → chunk-NA6EVQ6T.js} +3 -3
  78. package/dist/{chunk-3XOHSE3X.js.map → chunk-NA6EVQ6T.js.map} +1 -1
  79. package/dist/{chunk-6ROGWFQ2.js → chunk-NKLKTAUP.js} +3 -3
  80. package/dist/{chunk-6ROGWFQ2.js.map → chunk-NKLKTAUP.js.map} +1 -1
  81. package/dist/{chunk-S6HO7HUY.js → chunk-OSD63E6O.js} +15 -19
  82. package/dist/chunk-OSD63E6O.js.map +1 -0
  83. package/dist/{chunk-QDJ5PZPP.js → chunk-PHA7SLBY.js} +3 -3
  84. package/dist/chunk-PHA7SLBY.js.map +1 -0
  85. package/dist/{chunk-6NXZWLSM.js → chunk-S4BF3Z6O.js} +4 -4
  86. package/dist/{chunk-6NXZWLSM.js.map → chunk-S4BF3Z6O.js.map} +1 -1
  87. package/dist/{chunk-C65SCJD6.js → chunk-SK6YMTMA.js} +5 -12
  88. package/dist/chunk-SK6YMTMA.js.map +1 -0
  89. package/dist/{chunk-DBPLQZJ2.js → chunk-SSISBOLO.js} +75 -22
  90. package/dist/chunk-SSISBOLO.js.map +1 -0
  91. package/dist/{chunk-LWYZCSX4.js → chunk-UBJK5623.js} +12 -11
  92. package/dist/chunk-UBJK5623.js.map +1 -0
  93. package/dist/{chunk-74AF6PO2.js → chunk-UEQ3NEVL.js} +48 -12
  94. package/dist/chunk-UEQ3NEVL.js.map +1 -0
  95. package/dist/{chunk-A4MYCEGM.js → chunk-UHHCUCEE.js} +19 -8
  96. package/dist/chunk-UHHCUCEE.js.map +1 -0
  97. package/dist/{chunk-X7JN7WPF.js → chunk-UIPDAD62.js} +3 -3
  98. package/dist/chunk-UIPDAD62.js.map +1 -0
  99. package/dist/{chunk-YUACN5GJ.js → chunk-UPBKLI62.js} +20 -13
  100. package/dist/chunk-UPBKLI62.js.map +1 -0
  101. package/dist/{chunk-3B32X5PU.js → chunk-UUXSTLOY.js} +7 -5
  102. package/dist/chunk-UUXSTLOY.js.map +1 -0
  103. package/dist/{chunk-HSMO2BR4.js → chunk-VNB7ZHCZ.js} +4 -13
  104. package/dist/chunk-VNB7ZHCZ.js.map +1 -0
  105. package/dist/{chunk-TQEMGWZ2.js → chunk-W4RYNHAG.js} +3 -3
  106. package/dist/{chunk-TQEMGWZ2.js.map → chunk-W4RYNHAG.js.map} +1 -1
  107. package/dist/{chunk-PRDJLQLB.js → chunk-XNV3YAJK.js} +5 -5
  108. package/dist/chunk-XNV3YAJK.js.map +1 -0
  109. package/dist/{chunk-I7HJBHQU.js → chunk-Y3PVWMUN.js} +7 -7
  110. package/dist/chunk-Y3PVWMUN.js.map +1 -0
  111. package/dist/clipboard/index.js +2 -2
  112. package/dist/collapse/index.js +2 -2
  113. package/dist/color-picker/index.d.ts +3 -3
  114. package/dist/color-picker/index.d.ts.map +1 -1
  115. package/dist/color-picker/index.js +3 -2
  116. package/dist/context-menu/index.d.ts +4 -6
  117. package/dist/context-menu/index.d.ts.map +1 -1
  118. package/dist/context-menu/index.js +2 -2
  119. package/dist/date-picker/PickerWrapper.d.ts +3 -3
  120. package/dist/date-picker/PickerWrapper.d.ts.map +1 -1
  121. package/dist/date-picker/index.d.ts.map +1 -1
  122. package/dist/date-picker/index.js +3 -2
  123. package/dist/descriptions/index.js +1 -1
  124. package/dist/dropdown/index.js +3 -3
  125. package/dist/hooks/useControllable.d.ts +9 -2
  126. package/dist/hooks/useControllable.d.ts.map +1 -1
  127. package/dist/hooks/useRipple.d.ts +0 -6
  128. package/dist/hooks/useRipple.d.ts.map +1 -1
  129. package/dist/index.js +46 -46
  130. package/dist/input/index.js +1 -1
  131. package/dist/input-password/index.js +2 -2
  132. package/dist/mentions/index.d.ts.map +1 -1
  133. package/dist/mentions/index.js +2 -1
  134. package/dist/menubar/index.js +2 -2
  135. package/dist/multi-select/index.d.ts.map +1 -1
  136. package/dist/multi-select/index.js +4 -4
  137. package/dist/navigation-menu/index.d.ts.map +1 -1
  138. package/dist/navigation-menu/index.js +1 -1
  139. package/dist/number-input/index.d.ts.map +1 -1
  140. package/dist/number-input/index.js +3 -3
  141. package/dist/pagination/index.js +2 -2
  142. package/dist/popover/index.d.ts +16 -1
  143. package/dist/popover/index.d.ts.map +1 -1
  144. package/dist/popover/index.js +1 -1
  145. package/dist/qr-code/index.d.ts +3 -3
  146. package/dist/qr-code/index.d.ts.map +1 -1
  147. package/dist/qr-code/index.js +1 -1
  148. package/dist/radio/index.d.ts.map +1 -1
  149. package/dist/radio/index.js +1 -1
  150. package/dist/rating/index.js +2 -2
  151. package/dist/resizable/index.d.ts +4 -3
  152. package/dist/resizable/index.d.ts.map +1 -1
  153. package/dist/resizable/index.js +1 -1
  154. package/dist/result/index.d.ts.map +1 -1
  155. package/dist/result/index.js +1 -1
  156. package/dist/select/index.d.ts.map +1 -1
  157. package/dist/select/index.js +4 -4
  158. package/dist/skeleton/index.d.ts +3 -3
  159. package/dist/skeleton/index.d.ts.map +1 -1
  160. package/dist/skeleton/index.js +1 -1
  161. package/dist/table/index.d.ts.map +1 -1
  162. package/dist/table/index.js +8 -8
  163. package/dist/table/types.d.ts +16 -2
  164. package/dist/table/types.d.ts.map +1 -1
  165. package/dist/tags-input/index.d.ts.map +1 -1
  166. package/dist/tags-input/index.js +2 -1
  167. package/dist/textarea/index.d.ts +3 -3
  168. package/dist/textarea/index.d.ts.map +1 -1
  169. package/dist/textarea/index.js +1 -1
  170. package/dist/theme/ThemeProvider.d.ts +18 -2
  171. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  172. package/dist/theme/index.d.ts +1 -1
  173. package/dist/theme/index.d.ts.map +1 -1
  174. package/dist/theme/index.js +1 -1
  175. package/dist/timeline/index.d.ts.map +1 -1
  176. package/dist/timeline/index.js +1 -1
  177. package/dist/toggle/index.d.ts.map +1 -1
  178. package/dist/toggle/index.js +2 -2
  179. package/dist/toggle-group/index.d.ts.map +1 -1
  180. package/dist/toggle-group/index.js +2 -2
  181. package/dist/tour/index.d.ts.map +1 -1
  182. package/dist/tour/index.js +1 -1
  183. package/dist/transfer/index.js +2 -2
  184. package/dist/tree-select/index.js +2 -2
  185. package/dist/typography/index.d.ts.map +1 -1
  186. package/dist/typography/index.js +1 -1
  187. package/dist/upload/index.d.ts.map +1 -1
  188. package/dist/upload/index.js +2 -2
  189. package/package.json +4 -3
  190. package/styles/datepicker.css +126 -0
  191. package/styles/global.css +1 -113
  192. package/dist/chunk-3B32X5PU.js.map +0 -1
  193. package/dist/chunk-3Z7RLVWD.js.map +0 -1
  194. package/dist/chunk-4TEZWGX7.js.map +0 -1
  195. package/dist/chunk-5YEC6FDN.js.map +0 -1
  196. package/dist/chunk-74AF6PO2.js.map +0 -1
  197. package/dist/chunk-75N6T3IS.js.map +0 -1
  198. package/dist/chunk-7RT65ZGV.js.map +0 -1
  199. package/dist/chunk-A4MYCEGM.js.map +0 -1
  200. package/dist/chunk-C65SCJD6.js.map +0 -1
  201. package/dist/chunk-CUXQZRDI.js.map +0 -1
  202. package/dist/chunk-DBPLQZJ2.js.map +0 -1
  203. package/dist/chunk-FY2TZ2NT.js.map +0 -1
  204. package/dist/chunk-HSMO2BR4.js.map +0 -1
  205. package/dist/chunk-I7HJBHQU.js.map +0 -1
  206. package/dist/chunk-J4SAIKKZ.js.map +0 -1
  207. package/dist/chunk-JIXINKUJ.js.map +0 -1
  208. package/dist/chunk-JWYBDNC6.js.map +0 -1
  209. package/dist/chunk-LHZJ2GJU.js.map +0 -1
  210. package/dist/chunk-LWYZCSX4.js.map +0 -1
  211. package/dist/chunk-NPK4ESMA.js.map +0 -1
  212. package/dist/chunk-PD3O6ZH4.js.map +0 -1
  213. package/dist/chunk-PQOIW5CM.js +0 -27
  214. package/dist/chunk-PQOIW5CM.js.map +0 -1
  215. package/dist/chunk-PRDJLQLB.js.map +0 -1
  216. package/dist/chunk-QDJ5PZPP.js.map +0 -1
  217. package/dist/chunk-ROQGBDET.js.map +0 -1
  218. package/dist/chunk-S6HO7HUY.js.map +0 -1
  219. package/dist/chunk-TDPJYCNI.js.map +0 -1
  220. package/dist/chunk-UFC3RGIN.js.map +0 -1
  221. package/dist/chunk-UFYG3HKL.js.map +0 -1
  222. package/dist/chunk-VNH6R5EU.js.map +0 -1
  223. package/dist/chunk-X7JN7WPF.js.map +0 -1
  224. package/dist/chunk-XAM5EKOS.js.map +0 -1
  225. package/dist/chunk-XCK62GVU.js.map +0 -1
  226. package/dist/chunk-YUACN5GJ.js.map +0 -1
  227. package/dist/chunk-Z3DIBMBQ.js.map +0 -1
@@ -1,4 +1,5 @@
1
- import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
1
+ import { useControllable } from './chunk-CB7YOZWV.js';
2
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-6XXAZ6P2.js';
2
3
  import { cn } from './chunk-RAS6HUEI.js';
3
4
  import { cva } from 'class-variance-authority';
4
5
  import React from 'react';
@@ -56,10 +57,10 @@ function normalizeHex(v) {
56
57
  return isValidHex(clean) ? clean.toLowerCase() : "#000000";
57
58
  }
58
59
  var sizeMap = {
59
- xs: { area: "w-40 h-28", hue: "h-2", swatch: "w-4 h-4" },
60
- sm: { area: "w-48 h-32", hue: "h-2.5", swatch: "w-5 h-5" },
61
- md: { area: "w-56 h-36", hue: "h-3", swatch: "w-6 h-6" },
62
- lg: { area: "w-64 h-44", hue: "h-3.5", swatch: "w-7 h-7" }
60
+ xs: { area: "min-w-40 h-28", hue: "h-2", swatch: "w-4 h-4" },
61
+ sm: { area: "min-w-48 h-32", hue: "h-2.5", swatch: "w-5 h-5" },
62
+ md: { area: "min-w-56 h-36", hue: "h-3", swatch: "w-6 h-6" },
63
+ lg: { area: "min-w-64 h-44", hue: "h-3.5", swatch: "w-7 h-7" }
63
64
  };
64
65
  var inputVariants = cva(
65
66
  "flex items-center rounded-md border border-border bg-background text-text-primary transition-colors focus-within:border-primary",
@@ -75,6 +76,36 @@ var inputVariants = cva(
75
76
  defaultVariants: { size: "md" }
76
77
  }
77
78
  );
79
+ function useDrag(onUpdate, disabled) {
80
+ const ref = React.useRef(null);
81
+ const rectRef = React.useRef(null);
82
+ const cbRef = React.useRef(onUpdate);
83
+ cbRef.current = onUpdate;
84
+ const handlePointerDown = React.useCallback(
85
+ (e) => {
86
+ if (disabled) return;
87
+ e.preventDefault();
88
+ e.stopPropagation();
89
+ e.target.setPointerCapture(e.pointerId);
90
+ rectRef.current = ref.current?.getBoundingClientRect() ?? null;
91
+ if (rectRef.current) cbRef.current(e.clientX, e.clientY, rectRef.current);
92
+ },
93
+ [disabled]
94
+ );
95
+ const handlePointerMove = React.useCallback(
96
+ (e) => {
97
+ if (!e.target.hasPointerCapture(e.pointerId)) return;
98
+ e.preventDefault();
99
+ e.stopPropagation();
100
+ if (rectRef.current) cbRef.current(e.clientX, e.clientY, rectRef.current);
101
+ },
102
+ []
103
+ );
104
+ const handlePointerUp = React.useCallback(() => {
105
+ rectRef.current = null;
106
+ }, []);
107
+ return { ref, handlePointerDown, handlePointerMove, handlePointerUp };
108
+ }
78
109
  function SaturationArea({
79
110
  hue,
80
111
  sat,
@@ -83,43 +114,59 @@ function SaturationArea({
83
114
  areaClass,
84
115
  disabled
85
116
  }) {
86
- const ref = React.useRef(null);
87
- const update = React.useCallback(
88
- (clientX, clientY) => {
89
- if (!ref.current || disabled) return;
90
- const rect = ref.current.getBoundingClientRect();
91
- const s = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
92
- const v = Math.max(0, Math.min(1, 1 - (clientY - rect.top) / rect.height));
93
- onChangeSV(s, v);
94
- },
95
- [onChangeSV, disabled]
96
- );
97
- const handlePointerDown = (e) => {
98
- if (disabled) return;
99
- e.currentTarget.setPointerCapture(e.pointerId);
100
- update(e.clientX, e.clientY);
101
- };
102
- const handlePointerMove = (e) => {
103
- if (e.currentTarget.hasPointerCapture(e.pointerId)) {
104
- update(e.clientX, e.clientY);
105
- }
106
- };
117
+ const onChangeSVRef = React.useRef(onChangeSV);
118
+ onChangeSVRef.current = onChangeSV;
119
+ const { ref, handlePointerDown, handlePointerMove, handlePointerUp } = useDrag((clientX, clientY, rect) => {
120
+ const s = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
121
+ const v = Math.max(
122
+ 0,
123
+ Math.min(1, 1 - (clientY - rect.top) / rect.height)
124
+ );
125
+ onChangeSVRef.current(s, v);
126
+ }, disabled);
107
127
  return /* @__PURE__ */ jsxs(
108
128
  "div",
109
129
  {
110
130
  ref,
111
- className: cn("colorPicker_saturation", "relative rounded-md cursor-crosshair", areaClass),
112
- style: { background: `hsl(${hue}, 100%, 50%)` },
131
+ className: cn(
132
+ "colorPicker_saturation",
133
+ "relative rounded-md cursor-crosshair select-none overflow-visible",
134
+ areaClass
135
+ ),
136
+ style: {
137
+ background: `hsl(${hue}, 100%, 50%)`,
138
+ touchAction: "none",
139
+ paddingBottom: 7
140
+ },
113
141
  onPointerDown: handlePointerDown,
114
142
  onPointerMove: handlePointerMove,
143
+ onPointerUp: handlePointerUp,
144
+ onPointerCancel: handlePointerUp,
115
145
  children: [
116
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-md", style: { background: "linear-gradient(to right, white, transparent)" } }),
117
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-md", style: { background: "linear-gradient(to top, black, transparent)" } }),
118
146
  /* @__PURE__ */ jsx(
119
147
  "div",
120
148
  {
121
- className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 -translate-y-1/2 pointer-events-none",
122
- style: { left: `${sat * 100}%`, top: `${(1 - val) * 100}%` }
149
+ className: "absolute inset-0 rounded-md",
150
+ style: { background: "linear-gradient(to right, white, transparent)" }
151
+ }
152
+ ),
153
+ /* @__PURE__ */ jsx(
154
+ "div",
155
+ {
156
+ className: "absolute inset-0 rounded-md",
157
+ style: { background: "linear-gradient(to top, black, transparent)" }
158
+ }
159
+ ),
160
+ /* @__PURE__ */ jsx(
161
+ "div",
162
+ {
163
+ className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md pointer-events-none z-10",
164
+ style: {
165
+ left: `${sat * 100}%`,
166
+ top: `${(1 - val) * 100}%`,
167
+ transform: "translate(-50%, -50%)",
168
+ willChange: "left, top"
169
+ }
123
170
  }
124
171
  )
125
172
  ]
@@ -132,37 +179,43 @@ function HueSlider({
132
179
  hueClass,
133
180
  disabled
134
181
  }) {
135
- const ref = React.useRef(null);
136
- const update = React.useCallback(
137
- (clientX) => {
138
- if (!ref.current || disabled) return;
139
- const rect = ref.current.getBoundingClientRect();
140
- const h = Math.max(0, Math.min(360, (clientX - rect.left) / rect.width * 360));
141
- onChange(h);
142
- },
143
- [onChange, disabled]
144
- );
145
- const handlePointerDown = (e) => {
146
- if (disabled) return;
147
- e.currentTarget.setPointerCapture(e.pointerId);
148
- update(e.clientX);
149
- };
150
- const handlePointerMove = (e) => {
151
- if (e.currentTarget.hasPointerCapture(e.pointerId)) update(e.clientX);
152
- };
182
+ const onChangeRef = React.useRef(onChange);
183
+ onChangeRef.current = onChange;
184
+ const { ref, handlePointerDown, handlePointerMove, handlePointerUp } = useDrag((clientX, _clientY, rect) => {
185
+ const h = Math.max(
186
+ 0,
187
+ Math.min(360, (clientX - rect.left) / rect.width * 360)
188
+ );
189
+ onChangeRef.current(h);
190
+ }, disabled);
153
191
  return /* @__PURE__ */ jsx(
154
192
  "div",
155
193
  {
156
194
  ref,
157
- className: cn("colorPicker_hue", "relative rounded-full cursor-pointer", hueClass),
158
- style: { background: "linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)" },
195
+ className: cn(
196
+ "colorPicker_hue",
197
+ "relative rounded-full cursor-pointer select-none",
198
+ hueClass
199
+ ),
200
+ style: {
201
+ background: "linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)",
202
+ touchAction: "none",
203
+ paddingTop: 7
204
+ },
159
205
  onPointerDown: handlePointerDown,
160
206
  onPointerMove: handlePointerMove,
207
+ onPointerUp: handlePointerUp,
208
+ onPointerCancel: handlePointerUp,
161
209
  children: /* @__PURE__ */ jsx(
162
210
  "div",
163
211
  {
164
- className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 top-1/2 -translate-y-1/2 pointer-events-none",
165
- style: { left: `${hue / 360 * 100}%` }
212
+ className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md pointer-events-none z-10",
213
+ style: {
214
+ left: `${hue / 360 * 100}%`,
215
+ top: "50%",
216
+ transform: "translate(-50%, -50%)",
217
+ willChange: "left"
218
+ }
166
219
  }
167
220
  )
168
221
  }
@@ -180,30 +233,64 @@ var ColorPicker = React.memo(
180
233
  className,
181
234
  classNames
182
235
  }) => {
183
- const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue));
184
- const currentValue = value !== void 0 ? normalizeHex(value) : internalValue;
185
- const [h, s, v] = React.useMemo(() => hexToHsv(currentValue), [currentValue]);
186
- const [hue, setHue] = React.useState(h);
236
+ const normalizedValue = value !== void 0 ? normalizeHex(value) : void 0;
237
+ const [currentValue, setCurrentValue] = useControllable({
238
+ value: normalizedValue,
239
+ defaultValue: normalizeHex(defaultValue),
240
+ onChange
241
+ });
242
+ const initHsv = React.useMemo(
243
+ () => hexToHsv(normalizeHex(defaultValue)),
244
+ []
245
+ );
246
+ const [hue, setHue] = React.useState(initHsv[0]);
247
+ const [liveSat, setLiveSat] = React.useState(initHsv[1]);
248
+ const [liveVal, setLiveVal] = React.useState(initHsv[2]);
249
+ const prevValueRef = React.useRef(currentValue);
187
250
  React.useEffect(() => {
188
- if (s > 0.01 || v > 0.01) setHue(h);
189
- }, [h, s, v]);
251
+ if (currentValue !== prevValueRef.current) {
252
+ prevValueRef.current = currentValue;
253
+ const [h2, s2, v2] = hexToHsv(currentValue);
254
+ if (s2 > 0.01 || v2 > 0.01) setHue(h2);
255
+ setLiveSat(s2);
256
+ setLiveVal(v2);
257
+ }
258
+ }, [currentValue]);
190
259
  const [inputText, setInputText] = React.useState(currentValue);
191
260
  React.useEffect(() => setInputText(currentValue), [currentValue]);
192
- const update = (hex) => {
193
- const valid = normalizeHex(hex);
194
- if (value === void 0) setInternalValue(valid);
195
- onChange?.(valid);
196
- };
197
- const handleSVChange = (ns, nv) => {
198
- update(hsvToHex(hue, ns, nv));
199
- };
200
- const handleHueChange = (nh) => {
201
- setHue(nh);
202
- update(hsvToHex(nh, s, v));
203
- };
261
+ const handleSVChange = React.useCallback(
262
+ (ns, nv) => {
263
+ setLiveSat(ns);
264
+ setLiveVal(nv);
265
+ const hex = normalizeHex(hsvToHex(hue, ns, nv));
266
+ prevValueRef.current = hex;
267
+ setCurrentValue(hex);
268
+ },
269
+ [hue, setCurrentValue]
270
+ );
271
+ const handleHueChange = React.useCallback(
272
+ (nh) => {
273
+ setHue(nh);
274
+ const hex = normalizeHex(hsvToHex(nh, liveSat, liveVal));
275
+ prevValueRef.current = hex;
276
+ setCurrentValue(hex);
277
+ },
278
+ [liveSat, liveVal, setCurrentValue]
279
+ );
280
+ const updateFromHex = React.useCallback(
281
+ (hex) => {
282
+ const normalized = normalizeHex(hex);
283
+ const [h2, s2, v2] = hexToHsv(normalized);
284
+ if (s2 > 0.01 || v2 > 0.01) setHue(h2);
285
+ setLiveSat(s2);
286
+ setLiveVal(v2);
287
+ setCurrentValue(normalized);
288
+ },
289
+ [setCurrentValue]
290
+ );
204
291
  const handleInputBlur = () => {
205
292
  if (isValidHex(inputText) || isValidHex(`#${inputText}`)) {
206
- update(inputText.startsWith("#") ? inputText : `#${inputText}`);
293
+ updateFromHex(inputText.startsWith("#") ? inputText : `#${inputText}`);
207
294
  } else {
208
295
  setInputText(currentValue);
209
296
  }
@@ -215,7 +302,7 @@ var ColorPicker = React.memo(
215
302
  "data-slot": "root",
216
303
  className: cn(
217
304
  "colorPicker_root",
218
- "inline-flex flex-col gap-2",
305
+ "inline-flex flex-col gap-3",
219
306
  disabled && "opacity-50 pointer-events-none",
220
307
  classNames?.root,
221
308
  className
@@ -226,8 +313,8 @@ var ColorPicker = React.memo(
226
313
  SaturationArea,
227
314
  {
228
315
  hue,
229
- sat: s,
230
- val: v,
316
+ sat: liveSat,
317
+ val: liveVal,
231
318
  onChangeSV: handleSVChange,
232
319
  areaClass: cn(sizes.area, classNames?.saturation),
233
320
  disabled
@@ -285,7 +372,7 @@ var ColorPicker = React.memo(
285
372
  "button",
286
373
  {
287
374
  type: "button",
288
- onClick: () => update(swatch),
375
+ onClick: () => updateFromHex(swatch),
289
376
  className: cn(
290
377
  "colorPicker_swatch",
291
378
  sizes.swatch,
@@ -319,12 +406,14 @@ var ColorInput = React.memo(
319
406
  className,
320
407
  classNames
321
408
  }) => {
322
- const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue));
323
- const currentValue = value !== void 0 ? normalizeHex(value) : internalValue;
409
+ const normalizedValue = value !== void 0 ? normalizeHex(value) : void 0;
410
+ const [currentValue, setCurrentValue] = useControllable({
411
+ value: normalizedValue,
412
+ defaultValue: normalizeHex(defaultValue),
413
+ onChange
414
+ });
324
415
  const update = (hex) => {
325
- const valid = normalizeHex(hex);
326
- if (value === void 0) setInternalValue(valid);
327
- onChange?.(valid);
416
+ setCurrentValue(normalizeHex(hex));
328
417
  };
329
418
  return /* @__PURE__ */ jsxs(
330
419
  "div",
@@ -339,16 +428,26 @@ var ColorInput = React.memo(
339
428
  children: [
340
429
  label && /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-primary", children: label }),
341
430
  /* @__PURE__ */ jsxs(Popover, { children: [
342
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: cn(inputVariants({ size }), disabled && "opacity-50 cursor-not-allowed", fullWidth && "w-full"), children: [
343
- /* @__PURE__ */ jsx(
344
- "div",
345
- {
346
- className: "w-5 h-5 rounded border border-border shrink-0",
347
- style: { backgroundColor: currentValue }
348
- }
349
- ),
350
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-text-primary font-mono", children: currentValue })
351
- ] }) }),
431
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
432
+ "div",
433
+ {
434
+ className: cn(
435
+ inputVariants({ size }),
436
+ disabled && "opacity-50 cursor-not-allowed",
437
+ fullWidth && "w-full"
438
+ ),
439
+ children: [
440
+ /* @__PURE__ */ jsx(
441
+ "div",
442
+ {
443
+ className: "w-5 h-5 rounded border border-border shrink-0",
444
+ style: { backgroundColor: currentValue }
445
+ }
446
+ ),
447
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-text-primary font-mono", children: currentValue })
448
+ ]
449
+ }
450
+ ) }),
352
451
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: /* @__PURE__ */ jsx(
353
452
  ColorPicker,
354
453
  {
@@ -370,5 +469,5 @@ ColorInput.displayName = "ColorInput";
370
469
  var color_picker_default = ColorPicker;
371
470
 
372
471
  export { ColorInput, ColorPicker, color_picker_default };
373
- //# sourceMappingURL=chunk-UFYG3HKL.js.map
374
- //# sourceMappingURL=chunk-UFYG3HKL.js.map
472
+ //# sourceMappingURL=chunk-6K6RGQNL.js.map
473
+ //# sourceMappingURL=chunk-6K6RGQNL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/color-picker/index.tsx"],"names":[],"mappings":"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","file":"chunk-6K6RGQNL.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React from \"react\";\n\nimport { useControllable } from \"../hooks/useControllable\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { cn } from \"../utils\";\nimport type { ColorPickerProps, ColorInputProps } from \"./types\";\n\n// ── Color utilities ──────────────────────────────────────────\nfunction hexToHsv(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n }\n const s = max === 0 ? 0 : d / max;\n return [h, s, max];\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r = 0,\n g = 0,\n b = 0;\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n const toHex = (n: number) =>\n Math.round((n + m) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction isValidHex(v: string): boolean {\n return /^#[0-9a-fA-F]{6}$/.test(v);\n}\n\nfunction normalizeHex(v: string): string {\n if (!v) return \"#000000\";\n const clean = v.startsWith(\"#\") ? v : `#${v}`;\n return isValidHex(clean) ? clean.toLowerCase() : \"#000000\";\n}\n\n// ── Size variants ────────────────────────────────────────────\nconst sizeMap = {\n xs: { area: \"min-w-40 h-28\", hue: \"h-2\", swatch: \"w-4 h-4\" },\n sm: { area: \"min-w-48 h-32\", hue: \"h-2.5\", swatch: \"w-5 h-5\" },\n md: { area: \"min-w-56 h-36\", hue: \"h-3\", swatch: \"w-6 h-6\" },\n lg: { area: \"min-w-64 h-44\", hue: \"h-3.5\", swatch: \"w-7 h-7\" },\n};\n\nconst inputVariants = cva(\n \"flex items-center rounded-md border border-border bg-background text-text-primary transition-colors focus-within:border-primary\",\n {\n variants: {\n size: {\n xs: \"h-7 px-2 text-xs gap-1.5\",\n sm: \"h-8 px-2.5 text-sm gap-2\",\n md: \"h-9 px-3 text-sm gap-2\",\n lg: \"h-10 px-3.5 text-base gap-2.5\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\n// ── Shared drag hook ─────────────────────────────────────────\nfunction useDrag(\n onUpdate: (clientX: number, clientY: number, rect: DOMRect) => void,\n disabled?: boolean,\n) {\n const ref = React.useRef<HTMLDivElement>(null);\n const rectRef = React.useRef<DOMRect | null>(null);\n const cbRef = React.useRef(onUpdate);\n cbRef.current = onUpdate;\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n rectRef.current = ref.current?.getBoundingClientRect() ?? null;\n if (rectRef.current) cbRef.current(e.clientX, e.clientY, rectRef.current);\n },\n [disabled],\n );\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (!(e.target as HTMLElement).hasPointerCapture(e.pointerId)) return;\n e.preventDefault();\n e.stopPropagation();\n if (rectRef.current) cbRef.current(e.clientX, e.clientY, rectRef.current);\n },\n [],\n );\n\n const handlePointerUp = React.useCallback(() => {\n rectRef.current = null;\n }, []);\n\n return { ref, handlePointerDown, handlePointerMove, handlePointerUp };\n}\n\n// ── Saturation Area ──────────────────────────────────────────\nfunction SaturationArea({\n hue,\n sat,\n val,\n onChangeSV,\n areaClass,\n disabled,\n}: {\n hue: number;\n sat: number;\n val: number;\n onChangeSV: (s: number, v: number) => void;\n areaClass: string;\n disabled?: boolean;\n}) {\n const onChangeSVRef = React.useRef(onChangeSV);\n onChangeSVRef.current = onChangeSV;\n\n const { ref, handlePointerDown, handlePointerMove, handlePointerUp } =\n useDrag((clientX, clientY, rect) => {\n const s = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const v = Math.max(\n 0,\n Math.min(1, 1 - (clientY - rect.top) / rect.height),\n );\n onChangeSVRef.current(s, v);\n }, disabled);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"colorPicker_saturation\",\n \"relative rounded-md cursor-crosshair select-none overflow-visible\",\n areaClass,\n )}\n style={{\n background: `hsl(${hue}, 100%, 50%)`,\n touchAction: \"none\",\n paddingBottom: 7,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div\n className=\"absolute inset-0 rounded-md\"\n style={{ background: \"linear-gradient(to right, white, transparent)\" }}\n />\n <div\n className=\"absolute inset-0 rounded-md\"\n style={{ background: \"linear-gradient(to top, black, transparent)\" }}\n />\n <div\n className=\"absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md pointer-events-none z-10\"\n style={{\n left: `${sat * 100}%`,\n top: `${(1 - val) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n willChange: \"left, top\",\n }}\n />\n </div>\n );\n}\n\n// ── Hue Slider ───────────────────────────────────────────────\nfunction HueSlider({\n hue,\n onChange,\n hueClass,\n disabled,\n}: {\n hue: number;\n onChange: (h: number) => void;\n hueClass: string;\n disabled?: boolean;\n}) {\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n\n const { ref, handlePointerDown, handlePointerMove, handlePointerUp } =\n useDrag((clientX, _clientY, rect) => {\n const h = Math.max(\n 0,\n Math.min(360, ((clientX - rect.left) / rect.width) * 360),\n );\n onChangeRef.current(h);\n }, disabled);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"colorPicker_hue\",\n \"relative rounded-full cursor-pointer select-none\",\n hueClass,\n )}\n style={{\n background:\n \"linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)\",\n touchAction: \"none\",\n paddingTop: 7,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div\n className=\"absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md pointer-events-none z-10\"\n style={{\n left: `${(hue / 360) * 100}%`,\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n willChange: \"left\",\n }}\n />\n </div>\n );\n}\n\n// ── ColorPicker ──────────────────────────────────────────────\nconst ColorPicker = React.memo<ColorPickerProps>(\n ({\n value,\n defaultValue = \"#3b82f6\",\n onChange,\n swatches,\n size = \"md\",\n disabled = false,\n label,\n className,\n classNames,\n }) => {\n const normalizedValue =\n value !== undefined ? normalizeHex(value) : undefined;\n const [currentValue, setCurrentValue] = useControllable({\n value: normalizedValue,\n defaultValue: normalizeHex(defaultValue),\n onChange,\n });\n\n const initHsv = React.useMemo(\n () => hexToHsv(normalizeHex(defaultValue)),\n [],\n );\n const [hue, setHue] = React.useState(initHsv[0]);\n const [liveSat, setLiveSat] = React.useState(initHsv[1]);\n const [liveVal, setLiveVal] = React.useState(initHsv[2]);\n\n // Sync HSV from external value changes (typing, swatches, controlled)\n const prevValueRef = React.useRef(currentValue);\n React.useEffect(() => {\n if (currentValue !== prevValueRef.current) {\n prevValueRef.current = currentValue;\n const [h2, s2, v2] = hexToHsv(currentValue!);\n if (s2 > 0.01 || v2 > 0.01) setHue(h2);\n setLiveSat(s2);\n setLiveVal(v2);\n }\n }, [currentValue]);\n\n const [inputText, setInputText] = React.useState(currentValue!);\n React.useEffect(() => setInputText(currentValue!), [currentValue]);\n\n const handleSVChange = React.useCallback(\n (ns: number, nv: number) => {\n setLiveSat(ns);\n setLiveVal(nv);\n const hex = normalizeHex(hsvToHex(hue, ns, nv));\n prevValueRef.current = hex;\n setCurrentValue(hex);\n },\n [hue, setCurrentValue],\n );\n\n const handleHueChange = React.useCallback(\n (nh: number) => {\n setHue(nh);\n const hex = normalizeHex(hsvToHex(nh, liveSat, liveVal));\n prevValueRef.current = hex;\n setCurrentValue(hex);\n },\n [liveSat, liveVal, setCurrentValue],\n );\n\n const updateFromHex = React.useCallback(\n (hex: string) => {\n const normalized = normalizeHex(hex);\n const [h2, s2, v2] = hexToHsv(normalized);\n if (s2 > 0.01 || v2 > 0.01) setHue(h2);\n setLiveSat(s2);\n setLiveVal(v2);\n setCurrentValue(normalized);\n },\n [setCurrentValue],\n );\n\n const handleInputBlur = () => {\n if (isValidHex(inputText) || isValidHex(`#${inputText}`)) {\n updateFromHex(inputText.startsWith(\"#\") ? inputText : `#${inputText}`);\n } else {\n setInputText(currentValue);\n }\n };\n\n const sizes = sizeMap[size];\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n \"colorPicker_root\",\n \"inline-flex flex-col gap-3\",\n disabled && \"opacity-50 pointer-events-none\",\n classNames?.root,\n className,\n )}\n >\n {label && (\n <span className=\"text-sm font-medium text-text-primary\">{label}</span>\n )}\n\n <SaturationArea\n hue={hue}\n sat={liveSat}\n val={liveVal}\n onChangeSV={handleSVChange}\n areaClass={cn(sizes.area, classNames?.saturation)}\n disabled={disabled}\n />\n\n <HueSlider\n hue={hue}\n onChange={handleHueChange}\n hueClass={cn(sizes.hue, classNames?.hueSlider)}\n disabled={disabled}\n />\n\n {/* Input + preview */}\n <div className=\"flex items-center gap-2\">\n <div\n data-slot=\"preview\"\n className={cn(\n \"colorPicker_preview\",\n \"w-8 h-8 rounded-md border border-border shrink-0\",\n classNames?.preview,\n )}\n style={{ backgroundColor: currentValue }}\n />\n <input\n type=\"text\"\n value={inputText}\n onChange={(e) => setInputText(e.target.value)}\n onBlur={handleInputBlur}\n onKeyDown={(e) => e.key === \"Enter\" && handleInputBlur()}\n className={cn(\n \"colorPicker_input\",\n \"flex-1 min-w-0 bg-transparent border border-border rounded-md px-2 py-1 text-sm text-text-primary outline-none focus:border-primary font-mono\",\n classNames?.input,\n )}\n disabled={disabled}\n />\n </div>\n\n {/* Swatches */}\n {swatches && swatches.length > 0 && (\n <div\n data-slot=\"swatches\"\n className={cn(\n \"colorPicker_swatches\",\n \"flex flex-wrap gap-1\",\n classNames?.swatches,\n )}\n >\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n onClick={() => updateFromHex(swatch)}\n className={cn(\n \"colorPicker_swatch\",\n sizes.swatch,\n \"rounded-md border border-border cursor-pointer transition-transform hover:scale-110\",\n currentValue === normalizeHex(swatch) &&\n \"ring-2 ring-primary ring-offset-1 ring-offset-background\",\n classNames?.swatch,\n )}\n style={{ backgroundColor: swatch }}\n aria-label={`Select color ${swatch}`}\n />\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\n// ── ColorInput ───────────────────────────────────────────────\nconst ColorInput = React.memo<ColorInputProps>(\n ({\n value,\n defaultValue = \"#3b82f6\",\n onChange,\n swatches,\n size = \"md\",\n disabled = false,\n label,\n fullWidth = true,\n className,\n classNames,\n }) => {\n const normalizedValue =\n value !== undefined ? normalizeHex(value) : undefined;\n const [currentValue, setCurrentValue] = useControllable({\n value: normalizedValue,\n defaultValue: normalizeHex(defaultValue),\n onChange,\n });\n\n const update = (hex: string) => {\n setCurrentValue(normalizeHex(hex));\n };\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n \"colorInput_root\",\n \"flex flex-col gap-1.5\",\n fullWidth ? \"w-full\" : \"inline-flex\",\n className,\n )}\n >\n {label && (\n <span className=\"text-sm font-medium text-text-primary\">{label}</span>\n )}\n\n <Popover>\n <PopoverTrigger asChild>\n <div\n className={cn(\n inputVariants({ size }),\n disabled && \"opacity-50 cursor-not-allowed\",\n fullWidth && \"w-full\",\n )}\n >\n <div\n className=\"w-5 h-5 rounded border border-border shrink-0\"\n style={{ backgroundColor: currentValue }}\n />\n <span className=\"flex-1 truncate text-text-primary font-mono\">\n {currentValue}\n </span>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <ColorPicker\n value={currentValue}\n onChange={update}\n swatches={swatches}\n size={size}\n disabled={disabled}\n classNames={classNames}\n />\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n\nColorInput.displayName = \"ColorInput\";\n\nexport type * from \"./types\";\nexport { ColorPicker, ColorInput };\nexport default ColorPicker;\n"]}
@@ -2,6 +2,7 @@ import { colorVars } from './chunk-G6QIIWKU.js';
2
2
  import { cn } from './chunk-RAS6HUEI.js';
3
3
  import * as PopoverPrimitive from '@radix-ui/react-popover';
4
4
  import { cva } from 'class-variance-authority';
5
+ import * as React from 'react';
5
6
  import { jsx } from 'react/jsx-runtime';
6
7
 
7
8
  function Popover({
@@ -50,7 +51,7 @@ var popoverContentVariants = cva(
50
51
  }
51
52
  }
52
53
  );
53
- function PopoverContent({
54
+ var PopoverContent = React.memo(({
54
55
  className,
55
56
  align = "center",
56
57
  sideOffset = 4,
@@ -58,9 +59,10 @@ function PopoverContent({
58
59
  variant = "default",
59
60
  color = "default",
60
61
  classNames,
62
+ portal = true,
61
63
  ...props
62
- }) {
63
- return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
64
+ }) => {
65
+ const content = /* @__PURE__ */ jsx(
64
66
  PopoverPrimitive.Content,
65
67
  {
66
68
  "data-slot": "popover-content",
@@ -74,8 +76,10 @@ function PopoverContent({
74
76
  ),
75
77
  ...props
76
78
  }
77
- ) });
78
- }
79
+ );
80
+ if (!portal) return content;
81
+ return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: content });
82
+ });
79
83
  function PopoverAnchor({
80
84
  ...props
81
85
  }) {
@@ -87,7 +91,11 @@ function PopoverAnchor({
87
91
  }
88
92
  );
89
93
  }
94
+ Popover.displayName = "Popover";
95
+ PopoverTrigger.displayName = "PopoverTrigger";
96
+ PopoverContent.displayName = "PopoverContent";
97
+ PopoverAnchor.displayName = "PopoverAnchor";
90
98
 
91
99
  export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
92
- //# sourceMappingURL=chunk-ROQGBDET.js.map
93
- //# sourceMappingURL=chunk-ROQGBDET.js.map
100
+ //# sourceMappingURL=chunk-6XXAZ6P2.js.map
101
+ //# sourceMappingURL=chunk-6XXAZ6P2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/popover/index.tsx"],"names":[],"mappings":";;;;;;;AAUA,SAAS,OAAA,CAAQ;AAAA,EACf,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,uBACE,GAAA;AAAA,IAAkB,gBAAA,CAAA,IAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACE,GAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAM,sBAAA,GAAyB,GAAA;AAAA,EAC7B,sqBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,aAAA;AAAA,QACJ,EAAA,EAAI,aAAA;AAAA,QACJ,EAAA,EAAI,eAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,oDAAA;AAAA,QACT,KAAA,EAAO,yCAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO;AAAA;AACT;AAEJ,CAAA;AAcA,IAAM,cAAA,GAAuB,WAAK,CAAC;AAAA,EACjC,SAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,KAAA,GAAQ,SAAA;AAAA,EACR,UAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,OAAA,mBACJ,GAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iBAAA;AAAA,QACA,sBAAA,CAAuB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,QAC/C,SAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAEpB,EAAA,uBACE,GAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACE,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ,CAAC;AAED,SAAS,aAAA,CAAc;AAAA,EACrB,GAAG;AACL,CAAA,EAAyD;AACvD,EAAA,uBACE,GAAA;AAAA,IAAkB,gBAAA,CAAA,MAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-6XXAZ6P2.js","sourcesContent":["'use client'\n\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { PopoverClassNames } from './types'\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return (\n <PopoverPrimitive.Root\n data-slot=\"popover\"\n {...props}\n />\n )\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return (\n <PopoverPrimitive.Trigger\n data-slot=\"popover-trigger\"\n {...props}\n />\n )\n}\n\nconst popoverContentVariants = cva(\n 'overflow-hidden will-change-[transform,_opacity] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:data-[side=bottom]:slide-out-to-top-2 data-[state=closed]:data-[side=left]:slide-out-to-right-2 data-[state=closed]:data-[side=right]:slide-out-to-left-2 data-[state=closed]:data-[side=top]:slide-out-to-bottom-2 z-[var(--z-popover)] w-72 origin-(--radix-popover-content-transform-origin) rounded-md border outline-none',\n {\n variants: {\n size: {\n xs: 'p-2 text-xs',\n sm: 'p-3 text-sm',\n md: 'p-4 text-base',\n lg: 'p-5 text-lg',\n },\n variant: {\n default: 'bg-background border border-slot text-text-primary',\n solid: 'bg-slot border border-slot text-slot-fg',\n soft: 'backdrop-blur-sm bg-slot-10 border border-slot-30 text-slot',\n },\n color: colorVars,\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n color: 'default',\n },\n },\n)\n\nexport interface PopoverContentProps\n extends Omit<React.ComponentProps<typeof PopoverPrimitive.Content>, 'color'>,\n VariantProps<typeof popoverContentVariants> {\n classNames?: PopoverClassNames\n /**\n * Whether to render content in a React portal.\n * Set to `false` to keep content in the DOM tree (inherits parent CSS).\n * @default true\n */\n portal?: boolean\n}\n\nconst PopoverContent = React.memo(({\n className,\n align = 'center',\n sideOffset = 4,\n size = 'md',\n variant = 'default',\n color = 'default',\n classNames,\n portal = true,\n ...props\n}: PopoverContentProps) => {\n const content = (\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'popover_content',\n popoverContentVariants({ size, variant, color }),\n className,\n classNames?.content,\n )}\n {...props}\n />\n )\n\n if (!portal) return content\n\n return (\n <PopoverPrimitive.Portal>\n {content}\n </PopoverPrimitive.Portal>\n )\n})\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return (\n <PopoverPrimitive.Anchor\n data-slot=\"popover-anchor\"\n {...props}\n />\n )\n}\n\nPopover.displayName = 'Popover'\nPopoverTrigger.displayName = 'PopoverTrigger'\nPopoverContent.displayName = 'PopoverContent'\nPopoverAnchor.displayName = 'PopoverAnchor'\n\nexport type * from './types'\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n"]}
@@ -1,6 +1,7 @@
1
+ import { useControllable } from './chunk-CB7YOZWV.js';
1
2
  import { cn, statusMessageVariants } from './chunk-RAS6HUEI.js';
2
3
  import { cva } from 'class-variance-authority';
3
- import React, { useState, useRef, useCallback, useMemo, useEffect } from 'react';
4
+ import React, { useState, useRef, useMemo, useCallback, useEffect } from 'react';
4
5
  import { jsxs, jsx } from 'react/jsx-runtime';
5
6
 
6
7
  var textareaVariants = cva(
@@ -79,8 +80,7 @@ var Mentions = React.memo(
79
80
  className,
80
81
  classNames
81
82
  }) => {
82
- const [internalValue, setInternalValue] = useState(defaultValue);
83
- const currentValue = value !== void 0 ? value : internalValue;
83
+ const [currentValue, setCurrentValue] = useControllable({ value, defaultValue: defaultValue ?? "", onChange });
84
84
  const [showDropdown, setShowDropdown] = useState(false);
85
85
  const [query, setQuery] = useState("");
86
86
  const [activeTrigger, setActiveTrigger] = useState("");
@@ -88,13 +88,7 @@ var Mentions = React.memo(
88
88
  const [highlightedIdx, setHighlightedIdx] = useState(0);
89
89
  const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0 });
90
90
  const textareaRef = useRef(null);
91
- const update = useCallback(
92
- (v) => {
93
- if (value === void 0) setInternalValue(v);
94
- onChange?.(v);
95
- },
96
- [value, onChange]
97
- );
91
+ const update = setCurrentValue;
98
92
  const filteredOptions = useMemo(() => {
99
93
  if (!query) return options;
100
94
  const q = query.toLowerCase();
@@ -133,7 +127,7 @@ var Mentions = React.memo(
133
127
  const lastTrigger = textBefore.lastIndexOf(trigger);
134
128
  if (lastTrigger >= 0) {
135
129
  const between = textBefore.substring(lastTrigger + trigger.length);
136
- const charBefore = lastTrigger > 0 ? textBefore[lastTrigger - 1] : " ";
130
+ const charBefore = lastTrigger > 0 ? textBefore[lastTrigger - 1] ?? " " : " ";
137
131
  if (/\s/.test(charBefore) || lastTrigger === 0) {
138
132
  if (!/\s/.test(between)) {
139
133
  setActiveTrigger(trigger);
@@ -254,5 +248,5 @@ Mentions.displayName = "Mentions";
254
248
  var mentions_default = Mentions;
255
249
 
256
250
  export { mentions_default };
257
- //# sourceMappingURL=chunk-3Z7RLVWD.js.map
258
- //# sourceMappingURL=chunk-3Z7RLVWD.js.map
251
+ //# sourceMappingURL=chunk-75T5BISG.js.map
252
+ //# sourceMappingURL=chunk-75T5BISG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mentions/index.tsx"],"names":[],"mappings":"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","file":"chunk-75T5BISG.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React, { useState, useRef, useCallback, useMemo, useEffect } from 'react'\n\nimport { useControllable } from '../hooks/useControllable'\nimport { cn, statusMessageVariants } from '../utils'\nimport type { MentionOption, MentionsProps } from './types'\n\nconst textareaVariants = cva(\n 'w-full rounded-md border bg-background text-text-primary placeholder:text-text-secondary/50 outline-none transition-colors disabled:opacity-50 disabled:cursor-not-allowed read-only:bg-surface read-only:cursor-default',\n {\n variants: {\n size: {\n xs: 'px-(--input-padding-x-xs) py-1.5 text-xs',\n sm: 'px-(--input-padding-x-sm) py-2 text-sm',\n md: 'px-(--input-padding-x-md) py-2 text-sm',\n lg: 'px-(--input-padding-x-lg) py-2.5 text-base',\n },\n status: {\n default: 'border-border focus:border-primary',\n error: 'border-error focus:border-error',\n },\n },\n defaultVariants: { size: 'md', status: 'default' },\n },\n)\n\nfunction getCaretCoordinates(element: HTMLTextAreaElement, position: number) {\n const div = document.createElement('div')\n const style = getComputedStyle(element)\n const props = [\n 'fontFamily', 'fontSize', 'fontWeight', 'letterSpacing', 'lineHeight',\n 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth',\n 'wordWrap', 'whiteSpace', 'overflowWrap',\n ] as const\n\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.whiteSpace = 'pre-wrap'\n div.style.wordWrap = 'break-word'\n div.style.width = `${element.offsetWidth}px`\n for (const prop of props) div.style[prop as any] = style.getPropertyValue(prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`))\n\n div.textContent = element.value.substring(0, position)\n const span = document.createElement('span')\n span.textContent = element.value.substring(position) || '.'\n div.appendChild(span)\n document.body.appendChild(div)\n\n const top = span.offsetTop - element.scrollTop\n const left = span.offsetLeft - element.scrollLeft\n document.body.removeChild(div)\n return { top, left }\n}\n\nconst Mentions = React.memo<MentionsProps>(\n ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n options = [],\n triggers = ['@'],\n loading = false,\n size = 'md',\n disabled = false,\n readOnly = false,\n placeholder,\n rows = 3,\n label,\n error,\n helperText,\n fullWidth = true,\n className,\n classNames,\n }) => {\n const [currentValue, setCurrentValue] = useControllable({ value, defaultValue: defaultValue ?? '', onChange })\n const [showDropdown, setShowDropdown] = useState(false)\n const [query, setQuery] = useState('')\n const [activeTrigger, setActiveTrigger] = useState('')\n const [triggerStart, setTriggerStart] = useState(-1)\n const [highlightedIdx, setHighlightedIdx] = useState(0)\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0 })\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const update = setCurrentValue\n\n const filteredOptions = useMemo(() => {\n if (!query) return options\n const q = query.toLowerCase()\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n )\n }, [options, query])\n\n const insertMention = useCallback(\n (option: MentionOption) => {\n const before = currentValue.substring(0, triggerStart)\n const after = currentValue.substring(textareaRef.current?.selectionStart ?? triggerStart)\n const mention = `${activeTrigger}${option.value} `\n const next = before + mention + after\n update(next)\n onSelect?.(option, activeTrigger)\n setShowDropdown(false)\n setQuery('')\n\n requestAnimationFrame(() => {\n if (textareaRef.current) {\n const pos = before.length + mention.length\n textareaRef.current.selectionStart = pos\n textareaRef.current.selectionEnd = pos\n textareaRef.current.focus()\n }\n })\n },\n [currentValue, triggerStart, activeTrigger, update, onSelect],\n )\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value\n update(v)\n\n const cursor = e.target.selectionStart\n const textBefore = v.substring(0, cursor)\n\n let found = false\n for (const trigger of triggers) {\n const lastTrigger = textBefore.lastIndexOf(trigger)\n if (lastTrigger >= 0) {\n const between = textBefore.substring(lastTrigger + trigger.length)\n const charBefore = lastTrigger > 0 ? (textBefore[lastTrigger - 1] ?? ' ') : ' '\n if (/\\s/.test(charBefore) || lastTrigger === 0) {\n if (!/\\s/.test(between)) {\n setActiveTrigger(trigger)\n setTriggerStart(lastTrigger)\n setQuery(between)\n setShowDropdown(true)\n setHighlightedIdx(0)\n found = true\n\n if (typeof window !== 'undefined' && textareaRef.current) {\n const coords = getCaretCoordinates(textareaRef.current, lastTrigger)\n setDropdownPos({ top: coords.top + 24, left: coords.left })\n }\n break\n }\n }\n }\n }\n if (!found) setShowDropdown(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!showDropdown || filteredOptions.length === 0) return\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIdx((p) => Math.min(p + 1, filteredOptions.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIdx((p) => Math.max(p - 1, 0))\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n if (filteredOptions[highlightedIdx]) insertMention(filteredOptions[highlightedIdx])\n } else if (e.key === 'Escape') {\n setShowDropdown(false)\n }\n }\n\n useEffect(() => {\n if (highlightedIdx >= filteredOptions.length) setHighlightedIdx(Math.max(0, filteredOptions.length - 1))\n }, [filteredOptions.length, highlightedIdx])\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'mentions_root',\n 'flex flex-col gap-1.5',\n fullWidth ? 'w-full' : 'inline-flex',\n classNames?.root,\n className,\n )}\n >\n {label && (\n <label data-slot=\"label\" className=\"text-sm font-medium text-text-primary\">\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={() => setTimeout(() => setShowDropdown(false), 150)}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n readOnly={readOnly}\n data-slot=\"textarea\"\n className={cn(\n 'mentions_textarea',\n textareaVariants({ size, status: error ? 'error' : 'default' }),\n 'resize-y',\n classNames?.textarea,\n )}\n />\n\n {showDropdown && filteredOptions.length > 0 && (\n <div\n data-slot=\"dropdown\"\n className={cn(\n 'mentions_dropdown',\n 'absolute z-[var(--z-popover)] rounded-md border border-border bg-background shadow-md max-h-[200px] overflow-auto min-w-[180px]',\n classNames?.dropdown,\n )}\n style={{ top: dropdownPos.top, left: Math.min(dropdownPos.left, 200) }}\n >\n {loading ? (\n <div className=\"px-3 py-2 text-sm text-text-secondary\">Loading...</div>\n ) : (\n filteredOptions.map((option, idx) => (\n <div\n key={option.value}\n onMouseDown={(e) => { e.preventDefault(); insertMention(option) }}\n onMouseEnter={() => setHighlightedIdx(idx)}\n data-slot=\"option\"\n className={cn(\n 'mentions_option',\n 'flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer transition-colors',\n idx === highlightedIdx ? 'bg-surface text-text-primary' : 'text-text-primary hover:bg-surface',\n classNames?.option,\n )}\n >\n {option.icon && <span className=\"shrink-0 w-5 h-5\">{option.icon}</span>}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate\">{option.label}</div>\n {option.description && (\n <div className=\"text-xs text-text-secondary truncate\">{option.description}</div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p data-slot=\"message\" className={cn('text-xs', error ? statusMessageVariants({ status: 'error' }) : 'text-text-secondary')}>\n {error || helperText}\n </p>\n )}\n </div>\n )\n },\n)\n\nMentions.displayName = 'Mentions'\n\nexport type * from './types'\nexport default Mentions\n"]}