@mdigital_ui/ui 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alert/index.d.ts.map +1 -1
- package/dist/alert/index.js +1 -1
- package/dist/autocomplete/index.d.ts.map +1 -1
- package/dist/autocomplete/index.js +3 -2
- package/dist/avatar/index.d.ts.map +1 -1
- package/dist/avatar/index.js +1 -1
- package/dist/breadcrumbs/index.js +4 -4
- package/dist/button/index.js +2 -2
- package/dist/calendar/index.d.ts.map +1 -1
- package/dist/calendar/index.js +2 -1
- package/dist/cascader/index.d.ts.map +1 -1
- package/dist/cascader/index.js +1 -1
- package/dist/checkbox/index.d.ts.map +1 -1
- package/dist/checkbox/index.js +1 -1
- package/dist/checkbox/types.d.ts +2 -0
- package/dist/checkbox/types.d.ts.map +1 -1
- package/dist/{chunk-Z3DIBMBQ.js → chunk-3K4GIXFA.js} +178 -118
- package/dist/chunk-3K4GIXFA.js.map +1 -0
- package/dist/{chunk-SJLH5ZDW.js → chunk-4QLYRAW2.js} +3 -3
- package/dist/{chunk-SJLH5ZDW.js.map → chunk-4QLYRAW2.js.map} +1 -1
- package/dist/{chunk-4TEZWGX7.js → chunk-64OCJYSH.js} +17 -8
- package/dist/chunk-64OCJYSH.js.map +1 -0
- package/dist/{chunk-5YEC6FDN.js → chunk-6CMHCCDO.js} +14 -7
- package/dist/chunk-6CMHCCDO.js.map +1 -0
- package/dist/{chunk-7RT65ZGV.js → chunk-6H2Y3QKP.js} +75 -23
- package/dist/chunk-6H2Y3QKP.js.map +1 -0
- package/dist/{chunk-UFYG3HKL.js → chunk-6K6RGQNL.js} +193 -94
- package/dist/chunk-6K6RGQNL.js.map +1 -0
- package/dist/{chunk-ROQGBDET.js → chunk-6XXAZ6P2.js} +15 -7
- package/dist/chunk-6XXAZ6P2.js.map +1 -0
- package/dist/{chunk-3Z7RLVWD.js → chunk-75T5BISG.js} +7 -13
- package/dist/chunk-75T5BISG.js.map +1 -0
- package/dist/{chunk-XAM5EKOS.js → chunk-7SKAAKBC.js} +13 -12
- package/dist/chunk-7SKAAKBC.js.map +1 -0
- package/dist/{chunk-6RZEJRTC.js → chunk-7ZUIX4NK.js} +3 -3
- package/dist/{chunk-6RZEJRTC.js.map → chunk-7ZUIX4NK.js.map} +1 -1
- package/dist/{chunk-NPK4ESMA.js → chunk-B75ICJCX.js} +9 -16
- package/dist/chunk-B75ICJCX.js.map +1 -0
- package/dist/chunk-CB7YOZWV.js +50 -0
- package/dist/chunk-CB7YOZWV.js.map +1 -0
- package/dist/{chunk-UFC3RGIN.js → chunk-DXAOZB6J.js} +4 -4
- package/dist/chunk-DXAOZB6J.js.map +1 -0
- package/dist/{chunk-75N6T3IS.js → chunk-ECBTSKES.js} +13 -10
- package/dist/chunk-ECBTSKES.js.map +1 -0
- package/dist/{chunk-J2WIZULN.js → chunk-FCIK35OY.js} +3 -3
- package/dist/{chunk-J2WIZULN.js.map → chunk-FCIK35OY.js.map} +1 -1
- package/dist/{chunk-FY2TZ2NT.js → chunk-GP7R3AFC.js} +58 -30
- package/dist/chunk-GP7R3AFC.js.map +1 -0
- package/dist/{chunk-ED4CQZ72.js → chunk-GQM5WLP5.js} +4 -4
- package/dist/{chunk-ED4CQZ72.js.map → chunk-GQM5WLP5.js.map} +1 -1
- package/dist/{chunk-TBKPQOXF.js → chunk-GSLNACUF.js} +3 -3
- package/dist/{chunk-TBKPQOXF.js.map → chunk-GSLNACUF.js.map} +1 -1
- package/dist/{chunk-OJAHIPPP.js → chunk-HGWD63IR.js} +3 -3
- package/dist/{chunk-OJAHIPPP.js.map → chunk-HGWD63IR.js.map} +1 -1
- package/dist/chunk-HKQOAEFY.js +1 -1
- package/dist/{chunk-PD3O6ZH4.js → chunk-JXOLZBXF.js} +19 -8
- package/dist/chunk-JXOLZBXF.js.map +1 -0
- package/dist/{chunk-CUXQZRDI.js → chunk-JZCONCJS.js} +13 -3
- package/dist/chunk-JZCONCJS.js.map +1 -0
- package/dist/{chunk-TDPJYCNI.js → chunk-KBT6UQNA.js} +14 -35
- package/dist/chunk-KBT6UQNA.js.map +1 -0
- package/dist/{chunk-VNH6R5EU.js → chunk-KR3GBSVA.js} +4 -6
- package/dist/chunk-KR3GBSVA.js.map +1 -0
- package/dist/{chunk-JWYBDNC6.js → chunk-KTK7LSKX.js} +7 -8
- package/dist/chunk-KTK7LSKX.js.map +1 -0
- package/dist/{chunk-X3VT5SSK.js → chunk-L3ZFNHVX.js} +153 -171
- package/dist/chunk-L3ZFNHVX.js.map +1 -0
- package/dist/{chunk-PB5VGXS5.js → chunk-LBOQJHFH.js} +3 -3
- package/dist/{chunk-PB5VGXS5.js.map → chunk-LBOQJHFH.js.map} +1 -1
- package/dist/{chunk-XCK62GVU.js → chunk-LZ2MHSYF.js} +8 -5
- package/dist/chunk-LZ2MHSYF.js.map +1 -0
- package/dist/{chunk-LHZJ2GJU.js → chunk-MHRSK2QC.js} +8 -6
- package/dist/chunk-MHRSK2QC.js.map +1 -0
- package/dist/{chunk-JIXINKUJ.js → chunk-N742SARE.js} +8 -7
- package/dist/chunk-N742SARE.js.map +1 -0
- package/dist/{chunk-3XOHSE3X.js → chunk-NA6EVQ6T.js} +3 -3
- package/dist/{chunk-3XOHSE3X.js.map → chunk-NA6EVQ6T.js.map} +1 -1
- package/dist/{chunk-6ROGWFQ2.js → chunk-NKLKTAUP.js} +3 -3
- package/dist/{chunk-6ROGWFQ2.js.map → chunk-NKLKTAUP.js.map} +1 -1
- package/dist/{chunk-S6HO7HUY.js → chunk-OSD63E6O.js} +15 -19
- package/dist/chunk-OSD63E6O.js.map +1 -0
- package/dist/{chunk-QDJ5PZPP.js → chunk-PHA7SLBY.js} +3 -3
- package/dist/chunk-PHA7SLBY.js.map +1 -0
- package/dist/{chunk-6NXZWLSM.js → chunk-S4BF3Z6O.js} +4 -4
- package/dist/{chunk-6NXZWLSM.js.map → chunk-S4BF3Z6O.js.map} +1 -1
- package/dist/{chunk-C65SCJD6.js → chunk-SK6YMTMA.js} +5 -12
- package/dist/chunk-SK6YMTMA.js.map +1 -0
- package/dist/{chunk-DBPLQZJ2.js → chunk-SSISBOLO.js} +75 -22
- package/dist/chunk-SSISBOLO.js.map +1 -0
- package/dist/{chunk-LWYZCSX4.js → chunk-UBJK5623.js} +12 -11
- package/dist/chunk-UBJK5623.js.map +1 -0
- package/dist/{chunk-74AF6PO2.js → chunk-UEQ3NEVL.js} +48 -12
- package/dist/chunk-UEQ3NEVL.js.map +1 -0
- package/dist/{chunk-A4MYCEGM.js → chunk-UHHCUCEE.js} +19 -8
- package/dist/chunk-UHHCUCEE.js.map +1 -0
- package/dist/{chunk-X7JN7WPF.js → chunk-UIPDAD62.js} +3 -3
- package/dist/chunk-UIPDAD62.js.map +1 -0
- package/dist/{chunk-YUACN5GJ.js → chunk-UPBKLI62.js} +20 -13
- package/dist/chunk-UPBKLI62.js.map +1 -0
- package/dist/{chunk-DIUOGEL3.js → chunk-UUXSTLOY.js} +171 -190
- package/dist/chunk-UUXSTLOY.js.map +1 -0
- package/dist/{chunk-HSMO2BR4.js → chunk-VNB7ZHCZ.js} +4 -13
- package/dist/chunk-VNB7ZHCZ.js.map +1 -0
- package/dist/{chunk-TQEMGWZ2.js → chunk-W4RYNHAG.js} +3 -3
- package/dist/{chunk-TQEMGWZ2.js.map → chunk-W4RYNHAG.js.map} +1 -1
- package/dist/{chunk-PRDJLQLB.js → chunk-XNV3YAJK.js} +5 -5
- package/dist/chunk-XNV3YAJK.js.map +1 -0
- package/dist/{chunk-I7HJBHQU.js → chunk-Y3PVWMUN.js} +7 -7
- package/dist/chunk-Y3PVWMUN.js.map +1 -0
- package/dist/clipboard/index.js +2 -2
- package/dist/collapse/index.js +2 -2
- package/dist/color-picker/index.d.ts +3 -3
- package/dist/color-picker/index.d.ts.map +1 -1
- package/dist/color-picker/index.js +3 -2
- package/dist/context-menu/index.d.ts +4 -6
- package/dist/context-menu/index.d.ts.map +1 -1
- package/dist/context-menu/index.js +2 -2
- package/dist/date-picker/PickerWrapper.d.ts +3 -3
- package/dist/date-picker/PickerWrapper.d.ts.map +1 -1
- package/dist/date-picker/index.d.ts.map +1 -1
- package/dist/date-picker/index.js +3 -2
- package/dist/descriptions/index.js +1 -1
- package/dist/dropdown/index.js +3 -3
- package/dist/hooks/useControllable.d.ts +9 -2
- package/dist/hooks/useControllable.d.ts.map +1 -1
- package/dist/hooks/useRipple.d.ts +0 -6
- package/dist/hooks/useRipple.d.ts.map +1 -1
- package/dist/index.js +47 -47
- package/dist/input/index.js +1 -1
- package/dist/input-password/index.js +2 -2
- package/dist/mentions/index.d.ts.map +1 -1
- package/dist/mentions/index.js +2 -1
- package/dist/menubar/index.js +2 -2
- package/dist/multi-select/index.d.ts.map +1 -1
- package/dist/multi-select/index.js +4 -4
- package/dist/navigation-menu/index.d.ts.map +1 -1
- package/dist/navigation-menu/index.js +1 -1
- package/dist/number-input/index.d.ts.map +1 -1
- package/dist/number-input/index.js +3 -3
- package/dist/pagination/index.js +2 -2
- package/dist/popover/index.d.ts +16 -1
- package/dist/popover/index.d.ts.map +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/qr-code/index.d.ts +3 -3
- package/dist/qr-code/index.d.ts.map +1 -1
- package/dist/qr-code/index.js +1 -1
- package/dist/radio/index.d.ts.map +1 -1
- package/dist/radio/index.js +1 -1
- package/dist/rating/index.js +2 -2
- package/dist/resizable/index.d.ts +4 -3
- package/dist/resizable/index.d.ts.map +1 -1
- package/dist/resizable/index.js +1 -1
- package/dist/result/index.d.ts.map +1 -1
- package/dist/result/index.js +1 -1
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +4 -4
- package/dist/skeleton/index.d.ts +3 -3
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +8 -8
- package/dist/table/types.d.ts +16 -2
- package/dist/table/types.d.ts.map +1 -1
- package/dist/tags-input/index.d.ts.map +1 -1
- package/dist/tags-input/index.js +2 -1
- package/dist/textarea/index.d.ts +3 -3
- package/dist/textarea/index.d.ts.map +1 -1
- package/dist/textarea/index.js +1 -1
- package/dist/theme/ThemeProvider.d.ts +18 -2
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/timeline/index.d.ts.map +1 -1
- package/dist/timeline/index.js +1 -1
- package/dist/toggle/index.d.ts.map +1 -1
- package/dist/toggle/index.js +2 -2
- package/dist/toggle-group/index.d.ts.map +1 -1
- package/dist/toggle-group/index.js +2 -2
- package/dist/tour/index.d.ts.map +1 -1
- package/dist/tour/index.js +1 -1
- package/dist/transfer/index.js +2 -2
- package/dist/tree-select/index.js +2 -2
- package/dist/typography/index.d.ts.map +1 -1
- package/dist/typography/index.js +1 -1
- package/dist/upload/index.d.ts.map +1 -1
- package/dist/upload/index.js +2 -2
- package/package.json +4 -3
- package/styles/datepicker.css +126 -0
- package/styles/global.css +1 -113
- package/dist/chunk-3Z7RLVWD.js.map +0 -1
- package/dist/chunk-4TEZWGX7.js.map +0 -1
- package/dist/chunk-5YEC6FDN.js.map +0 -1
- package/dist/chunk-74AF6PO2.js.map +0 -1
- package/dist/chunk-75N6T3IS.js.map +0 -1
- package/dist/chunk-7RT65ZGV.js.map +0 -1
- package/dist/chunk-A4MYCEGM.js.map +0 -1
- package/dist/chunk-C65SCJD6.js.map +0 -1
- package/dist/chunk-CUXQZRDI.js.map +0 -1
- package/dist/chunk-DBPLQZJ2.js.map +0 -1
- package/dist/chunk-DIUOGEL3.js.map +0 -1
- package/dist/chunk-FY2TZ2NT.js.map +0 -1
- package/dist/chunk-HSMO2BR4.js.map +0 -1
- package/dist/chunk-I7HJBHQU.js.map +0 -1
- package/dist/chunk-JIXINKUJ.js.map +0 -1
- package/dist/chunk-JWYBDNC6.js.map +0 -1
- package/dist/chunk-LHZJ2GJU.js.map +0 -1
- package/dist/chunk-LWYZCSX4.js.map +0 -1
- package/dist/chunk-NPK4ESMA.js.map +0 -1
- package/dist/chunk-PD3O6ZH4.js.map +0 -1
- package/dist/chunk-PQOIW5CM.js +0 -27
- package/dist/chunk-PQOIW5CM.js.map +0 -1
- package/dist/chunk-PRDJLQLB.js.map +0 -1
- package/dist/chunk-QDJ5PZPP.js.map +0 -1
- package/dist/chunk-ROQGBDET.js.map +0 -1
- package/dist/chunk-S6HO7HUY.js.map +0 -1
- package/dist/chunk-TDPJYCNI.js.map +0 -1
- package/dist/chunk-UFC3RGIN.js.map +0 -1
- package/dist/chunk-UFYG3HKL.js.map +0 -1
- package/dist/chunk-VNH6R5EU.js.map +0 -1
- package/dist/chunk-X3VT5SSK.js.map +0 -1
- package/dist/chunk-X7JN7WPF.js.map +0 -1
- package/dist/chunk-XAM5EKOS.js.map +0 -1
- package/dist/chunk-XCK62GVU.js.map +0 -1
- package/dist/chunk-YUACN5GJ.js.map +0 -1
- package/dist/chunk-Z3DIBMBQ.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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(
|
|
112
|
-
|
|
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
|
|
122
|
-
style: {
|
|
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
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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(
|
|
158
|
-
|
|
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
|
|
165
|
-
style: {
|
|
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
|
|
184
|
-
const currentValue =
|
|
185
|
-
|
|
186
|
-
|
|
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 (
|
|
189
|
-
|
|
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
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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-
|
|
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:
|
|
230
|
-
val:
|
|
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: () =>
|
|
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
|
|
323
|
-
const currentValue =
|
|
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
|
-
|
|
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(
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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-
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
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,
|
|
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 [
|
|
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 =
|
|
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-
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|