formanitor 0.2.2 → 0.2.4
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/BpeChartWidget-HATASHAC.mjs +7 -0
- package/dist/BpeChartWidget-HATASHAC.mjs.map +1 -0
- package/dist/BpeChartWidget-VZRH7M7L.cjs +28 -0
- package/dist/BpeChartWidget-VZRH7M7L.cjs.map +1 -0
- package/dist/{DateTimeWidget-3AUBZYYK.mjs → DateTimeWidget-KRX4O6OD.mjs} +5 -4
- package/dist/DateTimeWidget-KRX4O6OD.mjs.map +1 -0
- package/dist/{DateTimeWidget-OS7ER5F6.cjs → DateTimeWidget-RJ7SATVA.cjs} +6 -5
- package/dist/DateTimeWidget-RJ7SATVA.cjs.map +1 -0
- package/dist/{DateWidget-KCTE6N5G.mjs → DateWidget-JEKDKPNS.mjs} +4 -3
- package/dist/DateWidget-JEKDKPNS.mjs.map +1 -0
- package/dist/{DateWidget-UNLX544Z.cjs → DateWidget-T7IQUWEA.cjs} +8 -7
- package/dist/DateWidget-T7IQUWEA.cjs.map +1 -0
- package/dist/DentalChartWidget-LYLOFWZU.cjs +21 -0
- package/dist/DentalChartWidget-LYLOFWZU.cjs.map +1 -0
- package/dist/DentalChartWidget-P2YPKAMO.mjs +8 -0
- package/dist/DentalChartWidget-P2YPKAMO.mjs.map +1 -0
- package/dist/{EditableTable-VQ72UEFF.cjs → EditableTable-OW5LC6OC.cjs} +6 -5
- package/dist/EditableTable-OW5LC6OC.cjs.map +1 -0
- package/dist/{EditableTable-XFCPKSUY.mjs → EditableTable-VZ66IXYI.mjs} +5 -4
- package/dist/EditableTable-VZ66IXYI.mjs.map +1 -0
- package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs +438 -0
- package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs.map +1 -0
- package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs +440 -0
- package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs.map +1 -0
- package/dist/{FollowupWidget-MAYTHM2E.cjs → FollowupWidget-2STSJSDY.cjs} +8 -7
- package/dist/FollowupWidget-2STSJSDY.cjs.map +1 -0
- package/dist/{FollowupWidget-BFZ6P2JE.mjs → FollowupWidget-GCGPWZVY.mjs} +4 -3
- package/dist/FollowupWidget-GCGPWZVY.mjs.map +1 -0
- package/dist/{OBGPathwayWidget-X67XKRIH.mjs → OBGPathwayWidget-QJNWUIEM.mjs} +4 -3
- package/dist/OBGPathwayWidget-QJNWUIEM.mjs.map +1 -0
- package/dist/{OBGPathwayWidget-XGN3HEWS.cjs → OBGPathwayWidget-YRU36UL7.cjs} +13 -12
- package/dist/OBGPathwayWidget-YRU36UL7.cjs.map +1 -0
- package/dist/{ObstetricHistoryWidget-Z4VAXH3E.mjs → ObstetricHistoryWidget-EW6JLNQ7.mjs} +4 -3
- package/dist/ObstetricHistoryWidget-EW6JLNQ7.mjs.map +1 -0
- package/dist/{ObstetricHistoryWidget-RP7NY4PV.cjs → ObstetricHistoryWidget-OOWCVFRB.cjs} +10 -9
- package/dist/ObstetricHistoryWidget-OOWCVFRB.cjs.map +1 -0
- package/dist/PregnancyStatusWidget-QTTVFBOE.cjs +96 -0
- package/dist/PregnancyStatusWidget-QTTVFBOE.cjs.map +1 -0
- package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs +94 -0
- package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs.map +1 -0
- package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs → SuggestionTextareaWidget-FWRZ46MV.cjs} +5 -5
- package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs.map → SuggestionTextareaWidget-FWRZ46MV.cjs.map} +1 -1
- package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs → SuggestionTextareaWidget-UNL3FZRI.mjs} +3 -3
- package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs.map → SuggestionTextareaWidget-UNL3FZRI.mjs.map} +1 -1
- package/dist/TreatmentPlanWidget-665HLKYV.mjs +317 -0
- package/dist/TreatmentPlanWidget-665HLKYV.mjs.map +1 -0
- package/dist/TreatmentPlanWidget-TATWSPLY.cjs +319 -0
- package/dist/TreatmentPlanWidget-TATWSPLY.cjs.map +1 -0
- package/dist/{chunk-4PMNVBJD.mjs → chunk-2OMQV2ZB.mjs} +4 -3
- package/dist/chunk-2OMQV2ZB.mjs.map +1 -0
- package/dist/chunk-5RT3S67O.cjs +30 -0
- package/dist/chunk-5RT3S67O.cjs.map +1 -0
- package/dist/chunk-6YUVILN5.mjs +42 -0
- package/dist/chunk-6YUVILN5.mjs.map +1 -0
- package/dist/{chunk-YEFM2ERQ.cjs → chunk-7OQFO6TM.cjs} +8 -7
- package/dist/chunk-7OQFO6TM.cjs.map +1 -0
- package/dist/chunk-BBD3Y37O.cjs +220 -0
- package/dist/chunk-BBD3Y37O.cjs.map +1 -0
- package/dist/chunk-EJ7MKHER.mjs +45 -0
- package/dist/chunk-EJ7MKHER.mjs.map +1 -0
- package/dist/{chunk-XN2QLBLT.mjs → chunk-G6Y4UJPN.mjs} +5 -4
- package/dist/chunk-G6Y4UJPN.mjs.map +1 -0
- package/dist/{chunk-AZSAPO2V.cjs → chunk-HXY3IX3G.cjs} +3 -44
- package/dist/chunk-HXY3IX3G.cjs.map +1 -0
- package/dist/{chunk-BMNY7F6H.mjs → chunk-JM7WNDNT.mjs} +4 -21
- package/dist/chunk-JM7WNDNT.mjs.map +1 -0
- package/dist/chunk-MQHZ7HD2.mjs +215 -0
- package/dist/chunk-MQHZ7HD2.mjs.map +1 -0
- package/dist/{chunk-ML47UEDU.cjs → chunk-O4FSJPU3.cjs} +2 -27
- package/dist/chunk-O4FSJPU3.cjs.map +1 -0
- package/dist/chunk-Q66LXMRR.mjs +28 -0
- package/dist/chunk-Q66LXMRR.mjs.map +1 -0
- package/dist/chunk-RILRMRXB.cjs +50 -0
- package/dist/chunk-RILRMRXB.cjs.map +1 -0
- package/dist/chunk-SQ2KNAUD.cjs +64 -0
- package/dist/chunk-SQ2KNAUD.cjs.map +1 -0
- package/dist/{chunk-TVFUWRTE.cjs → chunk-TCQQUJCL.cjs} +5 -4
- package/dist/chunk-TCQQUJCL.cjs.map +1 -0
- package/dist/chunk-UKSP3B3W.mjs +600 -0
- package/dist/chunk-UKSP3B3W.mjs.map +1 -0
- package/dist/chunk-X4AJCTON.cjs +607 -0
- package/dist/chunk-X4AJCTON.cjs.map +1 -0
- package/dist/chunk-ZZX3IG2T.mjs +25 -0
- package/dist/chunk-ZZX3IG2T.mjs.map +1 -0
- package/dist/index.cjs +107 -47
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +69 -3
- package/dist/index.d.ts +69 -3
- package/dist/index.mjs +73 -43
- package/dist/index.mjs.map +1 -1
- package/dist/read-only-table.d.cts +1 -1
- package/dist/read-only-table.d.ts +1 -1
- package/dist/smart.d.cts +1 -1
- package/dist/smart.d.ts +1 -1
- package/dist/{types-CYtJk8H9.d.ts → types-BbOnd5IN.d.cts} +53 -3
- package/dist/{types-CYtJk8H9.d.cts → types-BbOnd5IN.d.ts} +53 -3
- package/package.json +1 -1
- package/dist/DateTimeWidget-3AUBZYYK.mjs.map +0 -1
- package/dist/DateTimeWidget-OS7ER5F6.cjs.map +0 -1
- package/dist/DateWidget-KCTE6N5G.mjs.map +0 -1
- package/dist/DateWidget-UNLX544Z.cjs.map +0 -1
- package/dist/EditableTable-VQ72UEFF.cjs.map +0 -1
- package/dist/EditableTable-XFCPKSUY.mjs.map +0 -1
- package/dist/FollowupWidget-BFZ6P2JE.mjs.map +0 -1
- package/dist/FollowupWidget-MAYTHM2E.cjs.map +0 -1
- package/dist/OBGPathwayWidget-X67XKRIH.mjs.map +0 -1
- package/dist/OBGPathwayWidget-XGN3HEWS.cjs.map +0 -1
- package/dist/ObstetricHistoryWidget-RP7NY4PV.cjs.map +0 -1
- package/dist/ObstetricHistoryWidget-Z4VAXH3E.mjs.map +0 -1
- package/dist/chunk-4HDMR2LX.mjs +0 -69
- package/dist/chunk-4HDMR2LX.mjs.map +0 -1
- package/dist/chunk-4PMNVBJD.mjs.map +0 -1
- package/dist/chunk-AZSAPO2V.cjs.map +0 -1
- package/dist/chunk-BMNY7F6H.mjs.map +0 -1
- package/dist/chunk-ML47UEDU.cjs.map +0 -1
- package/dist/chunk-TVFUWRTE.cjs.map +0 -1
- package/dist/chunk-XN2QLBLT.mjs.map +0 -1
- package/dist/chunk-YEFM2ERQ.cjs.map +0 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
4
|
+
var chunkTB33A4PD_cjs = require('./chunk-TB33A4PD.cjs');
|
|
5
|
+
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
6
|
+
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
var BPE_SCORES = ["0", "1", "2", "3", "4", "*"];
|
|
11
|
+
var SCORE_LABEL = {
|
|
12
|
+
"0": "0 \u2013 Healthy",
|
|
13
|
+
"1": "1 \u2013 Bleeding on probing",
|
|
14
|
+
"2": "2 \u2013 Calculus / plaque retentive factor",
|
|
15
|
+
"3": "3 \u2013 Pocket 3.5\u20135.5 mm",
|
|
16
|
+
"4": "4 \u2013 Pocket \u22656 mm",
|
|
17
|
+
"*": "* \u2013 Furcation involvement"
|
|
18
|
+
};
|
|
19
|
+
var SEXTANTS = [
|
|
20
|
+
{ key: "upper_right", label: "UR", arch: "upper", teeth: "17\u201314" },
|
|
21
|
+
{ key: "upper_anterior", label: "UA", arch: "upper", teeth: "13\u201323" },
|
|
22
|
+
{ key: "upper_left", label: "UL", arch: "upper", teeth: "24\u201327" },
|
|
23
|
+
{ key: "lower_right", label: "LR", arch: "lower", teeth: "44\u201347" },
|
|
24
|
+
{ key: "lower_anterior", label: "LA", arch: "lower", teeth: "33\u201343" },
|
|
25
|
+
{ key: "lower_left", label: "LL", arch: "lower", teeth: "34\u201337" }
|
|
26
|
+
];
|
|
27
|
+
function normalizeBpeChart(raw) {
|
|
28
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
29
|
+
const o = raw;
|
|
30
|
+
if (o.scores || o.bleeding) {
|
|
31
|
+
return {
|
|
32
|
+
scores: o.scores ?? {},
|
|
33
|
+
bleeding: o.bleeding ?? {}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { scores: raw, bleeding: {} };
|
|
37
|
+
}
|
|
38
|
+
return { scores: {}, bleeding: {} };
|
|
39
|
+
}
|
|
40
|
+
function ArchGrid({
|
|
41
|
+
arch,
|
|
42
|
+
data,
|
|
43
|
+
onScoreChange,
|
|
44
|
+
onBleedingChange,
|
|
45
|
+
disabled
|
|
46
|
+
}) {
|
|
47
|
+
const sextants = SEXTANTS.filter((s) => s.arch === arch);
|
|
48
|
+
const isUpper = arch === "upper";
|
|
49
|
+
const editable = !!onScoreChange;
|
|
50
|
+
const boxesRow = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
|
|
51
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 shrink-0" }),
|
|
52
|
+
sextants.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
className: "relative flex h-12 w-14 shrink-0 items-center justify-center rounded-md border-2 border-gray-200 bg-white text-xl font-bold",
|
|
56
|
+
children: editable ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
57
|
+
"select",
|
|
58
|
+
{
|
|
59
|
+
value: data.scores[s.key] ?? "",
|
|
60
|
+
disabled,
|
|
61
|
+
onChange: (e) => onScoreChange(s.key, e.target.value || void 0),
|
|
62
|
+
title: s.label,
|
|
63
|
+
className: "absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent text-center text-xl font-bold text-gray-700 focus:outline-none",
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "\u2014" }),
|
|
66
|
+
BPE_SCORES.map((sc) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: sc, children: sc }, sc))
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"span",
|
|
71
|
+
{
|
|
72
|
+
className: "text-gray-700 select-none",
|
|
73
|
+
title: data.scores[s.key] ? `${s.label}: ${SCORE_LABEL[data.scores[s.key]]}` : `${s.label}: not recorded`,
|
|
74
|
+
children: data.scores[s.key] ?? "\u2014"
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
s.key
|
|
79
|
+
))
|
|
80
|
+
] });
|
|
81
|
+
const labelsRow = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 shrink-0" }),
|
|
83
|
+
sextants.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
84
|
+
"div",
|
|
85
|
+
{
|
|
86
|
+
className: "w-14 shrink-0 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground",
|
|
87
|
+
children: s.label
|
|
88
|
+
},
|
|
89
|
+
s.key
|
|
90
|
+
))
|
|
91
|
+
] });
|
|
92
|
+
const bleedingRow = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-16 shrink-0 text-right text-xs text-muted-foreground pr-1", children: "Bleeding" }),
|
|
94
|
+
sextants.map((s) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-14 shrink-0 justify-center", children: editable ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
95
|
+
"input",
|
|
96
|
+
{
|
|
97
|
+
type: "checkbox",
|
|
98
|
+
checked: !!data.bleeding[s.key],
|
|
99
|
+
disabled,
|
|
100
|
+
onChange: (e) => onBleedingChange?.(s.key, e.target.checked),
|
|
101
|
+
title: `Bleeding on probing \u2013 ${s.label}`,
|
|
102
|
+
className: chunkFHHISVCH_cjs.cn(
|
|
103
|
+
"h-3.5 w-3.5 cursor-pointer accent-rose-500",
|
|
104
|
+
disabled && "pointer-events-none opacity-50"
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
108
|
+
"div",
|
|
109
|
+
{
|
|
110
|
+
className: chunkFHHISVCH_cjs.cn(
|
|
111
|
+
"h-3.5 w-3.5 rounded-sm border border-gray-300",
|
|
112
|
+
data.bleeding[s.key] ? "bg-rose-500 border-rose-500" : "bg-white"
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
) }, s.key))
|
|
116
|
+
] });
|
|
117
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-1", children: isUpper ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
118
|
+
bleedingRow,
|
|
119
|
+
boxesRow,
|
|
120
|
+
labelsRow
|
|
121
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
122
|
+
labelsRow,
|
|
123
|
+
boxesRow,
|
|
124
|
+
bleedingRow
|
|
125
|
+
] }) });
|
|
126
|
+
}
|
|
127
|
+
var BpeChartWidget = ({ fieldId }) => {
|
|
128
|
+
const { fieldDef, value, setValue, setTouched, disabled } = chunkTB33A4PD_cjs.useField(fieldId);
|
|
129
|
+
const data = react.useMemo(() => normalizeBpeChart(value), [value]);
|
|
130
|
+
const handleScoreChange = (key, score) => {
|
|
131
|
+
const next = { ...data, scores: { ...data.scores } };
|
|
132
|
+
if (score === void 0) delete next.scores[key];
|
|
133
|
+
else next.scores[key] = score;
|
|
134
|
+
setValue(next);
|
|
135
|
+
setTouched();
|
|
136
|
+
};
|
|
137
|
+
const handleBleedingChange = (key, v) => {
|
|
138
|
+
const next = { ...data, bleeding: { ...data.bleeding } };
|
|
139
|
+
if (!v) delete next.bleeding[key];
|
|
140
|
+
else next.bleeding[key] = true;
|
|
141
|
+
setValue(next);
|
|
142
|
+
setTouched();
|
|
143
|
+
};
|
|
144
|
+
if (!fieldDef) return null;
|
|
145
|
+
const showLabel = chunk5E3APMY6_cjs.isLabelVisible(fieldDef);
|
|
146
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(fieldDef, "space-y-3"), children: [
|
|
147
|
+
showLabel && /* @__PURE__ */ jsxRuntime.jsxs(chunkJMGUUFOJ_cjs.Label, { className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef), children: [
|
|
148
|
+
fieldDef.label,
|
|
149
|
+
" ",
|
|
150
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef })
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-border/60 bg-card shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3", children: [
|
|
153
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
154
|
+
ArchGrid,
|
|
155
|
+
{
|
|
156
|
+
arch: "upper",
|
|
157
|
+
data,
|
|
158
|
+
onScoreChange: handleScoreChange,
|
|
159
|
+
onBleedingChange: handleBleedingChange,
|
|
160
|
+
disabled
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-2", children: [
|
|
164
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" }),
|
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Occlusal plane" }),
|
|
166
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
|
|
167
|
+
] }),
|
|
168
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
169
|
+
ArchGrid,
|
|
170
|
+
{
|
|
171
|
+
arch: "lower",
|
|
172
|
+
data,
|
|
173
|
+
onScoreChange: handleScoreChange,
|
|
174
|
+
onBleedingChange: handleBleedingChange,
|
|
175
|
+
disabled
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
] }) }) })
|
|
179
|
+
] });
|
|
180
|
+
};
|
|
181
|
+
function BpeChartReadOnly({
|
|
182
|
+
data: rawData,
|
|
183
|
+
label,
|
|
184
|
+
className
|
|
185
|
+
}) {
|
|
186
|
+
const data = react.useMemo(() => normalizeBpeChart(rawData), [rawData]);
|
|
187
|
+
const hasData = SEXTANTS.some((s) => data.scores[s.key] !== void 0);
|
|
188
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `rounded-xl border border-border/60 bg-card shadow-sm ${className ?? ""}`, children: [
|
|
189
|
+
label && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-border/60 px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-foreground", children: label }) }),
|
|
190
|
+
!hasData ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-6 text-center text-sm text-muted-foreground", children: "No BPE scores recorded" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3", children: [
|
|
192
|
+
/* @__PURE__ */ jsxRuntime.jsx(ArchGrid, { arch: "upper", data }),
|
|
193
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-2", children: [
|
|
194
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" }),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Occlusal plane" }),
|
|
196
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(ArchGrid, { arch: "lower", data })
|
|
199
|
+
] }) }),
|
|
200
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border/60 px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: SEXTANTS.filter((s) => data.scores[s.key]).map((s) => /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-foreground", children: [
|
|
201
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium", children: [
|
|
202
|
+
s.label,
|
|
203
|
+
":"
|
|
204
|
+
] }),
|
|
205
|
+
" ",
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground", children: [
|
|
207
|
+
SCORE_LABEL[data.scores[s.key]],
|
|
208
|
+
data.bleeding[s.key] ? " \xB7 BOP" : ""
|
|
209
|
+
] })
|
|
210
|
+
] }, s.key)) }) })
|
|
211
|
+
] })
|
|
212
|
+
] });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
exports.BPE_SCORES = BPE_SCORES;
|
|
216
|
+
exports.BpeChartReadOnly = BpeChartReadOnly;
|
|
217
|
+
exports.BpeChartWidget = BpeChartWidget;
|
|
218
|
+
exports.SEXTANTS = SEXTANTS;
|
|
219
|
+
//# sourceMappingURL=chunk-BBD3Y37O.cjs.map
|
|
220
|
+
//# sourceMappingURL=chunk-BBD3Y37O.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/BpeChartWidget.tsx"],"names":["jsxs","jsx","cn","Fragment","useField","useMemo","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","FieldRequiredIndicator"],"mappings":"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","file":"chunk-BBD3Y37O.cjs","sourcesContent":["import React, { useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { cn } from '../../core/utils';\n\n// ─── BPE constants ────────────────────────────────────────────────────────────\n\nexport const BPE_SCORES = ['0', '1', '2', '3', '4', '*'] as const;\nexport type BpeScore = (typeof BPE_SCORES)[number];\n\nconst SCORE_LABEL: Record<BpeScore, string> = {\n '0': '0 – Healthy',\n '1': '1 – Bleeding on probing',\n '2': '2 – Calculus / plaque retentive factor',\n '3': '3 – Pocket 3.5–5.5 mm',\n '4': '4 – Pocket ≥6 mm',\n '*': '* – Furcation involvement',\n};\n\nexport const SEXTANTS = [\n { key: 'upper_right', label: 'UR', arch: 'upper' as const, teeth: '17–14' },\n { key: 'upper_anterior', label: 'UA', arch: 'upper' as const, teeth: '13–23' },\n { key: 'upper_left', label: 'UL', arch: 'upper' as const, teeth: '24–27' },\n { key: 'lower_right', label: 'LR', arch: 'lower' as const, teeth: '44–47' },\n { key: 'lower_anterior', label: 'LA', arch: 'lower' as const, teeth: '33–43' },\n { key: 'lower_left', label: 'LL', arch: 'lower' as const, teeth: '34–37' },\n] as const;\n\nexport type SextantKey = (typeof SEXTANTS)[number]['key'];\n\nexport type BpeChartData = {\n scores: Partial<Record<SextantKey, BpeScore>>;\n bleeding: Partial<Record<SextantKey, boolean>>;\n};\n\nfunction normalizeBpeChart(raw: unknown): BpeChartData {\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n if (o.scores || o.bleeding) {\n return {\n scores: (o.scores ?? {}) as Partial<Record<SextantKey, BpeScore>>,\n bleeding: (o.bleeding ?? {}) as Partial<Record<SextantKey, boolean>>,\n };\n }\n return { scores: raw as Partial<Record<SextantKey, BpeScore>>, bleeding: {} };\n }\n return { scores: {}, bleeding: {} };\n}\n\n// ─── Arch grid ────────────────────────────────────────────────────────────────\n// Layout:\n// Upper: [boxes row] → [labels row] → [bleeding row]\n// Lower: [bleeding row] → [labels row] → [boxes row]\n// Each row shares a fixed left spacer matching the \"Bleeding\" label width so\n// checkboxes align under their respective sextant boxes.\n\nfunction ArchGrid({\n arch,\n data,\n onScoreChange,\n onBleedingChange,\n disabled,\n}: {\n arch: 'upper' | 'lower';\n data: BpeChartData;\n onScoreChange?: (key: SextantKey, score: BpeScore | undefined) => void;\n onBleedingChange?: (key: SextantKey, v: boolean) => void;\n disabled?: boolean;\n}) {\n const sextants = SEXTANTS.filter((s) => s.arch === arch);\n const isUpper = arch === 'upper';\n const editable = !!onScoreChange;\n\n const boxesRow = (\n <div className=\"flex gap-2\">\n {/* spacer matching \"Bleeding\" label column */}\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"relative flex h-12 w-14 shrink-0 items-center justify-center rounded-md border-2 border-gray-200 bg-white text-xl font-bold\"\n >\n {editable ? (\n <select\n value={data.scores[s.key] ?? ''}\n disabled={disabled}\n onChange={(e) =>\n onScoreChange!(s.key, (e.target.value || undefined) as BpeScore | undefined)\n }\n title={s.label}\n className=\"absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent text-center text-xl font-bold text-gray-700 focus:outline-none\"\n >\n <option value=\"\">—</option>\n {BPE_SCORES.map((sc) => (\n <option key={sc} value={sc}>{sc}</option>\n ))}\n </select>\n ) : (\n <span\n className=\"text-gray-700 select-none\"\n title={data.scores[s.key] ? `${s.label}: ${SCORE_LABEL[data.scores[s.key]!]}` : `${s.label}: not recorded`}\n >\n {data.scores[s.key] ?? '—'}\n </span>\n )}\n </div>\n ))}\n </div>\n );\n\n const labelsRow = (\n <div className=\"flex gap-2\">\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"w-14 shrink-0 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground\"\n >\n {s.label}\n </div>\n ))}\n </div>\n );\n\n const bleedingRow = (\n <div className=\"flex items-center gap-2\">\n <span className=\"w-16 shrink-0 text-right text-xs text-muted-foreground pr-1\">\n Bleeding\n </span>\n {sextants.map((s) => (\n <div key={s.key} className=\"flex w-14 shrink-0 justify-center\">\n {editable ? (\n <input\n type=\"checkbox\"\n checked={!!data.bleeding[s.key]}\n disabled={disabled}\n onChange={(e) => onBleedingChange?.(s.key, e.target.checked)}\n title={`Bleeding on probing – ${s.label}`}\n className={cn(\n 'h-3.5 w-3.5 cursor-pointer accent-rose-500',\n disabled && 'pointer-events-none opacity-50',\n )}\n />\n ) : (\n <div\n className={cn(\n 'h-3.5 w-3.5 rounded-sm border border-gray-300',\n data.bleeding[s.key] ? 'bg-rose-500 border-rose-500' : 'bg-white',\n )}\n />\n )}\n </div>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {isUpper ? (\n <>\n {bleedingRow}\n {boxesRow}\n {labelsRow}\n </>\n ) : (\n <>\n {labelsRow}\n {boxesRow}\n {bleedingRow}\n </>\n )}\n </div>\n );\n}\n\n// ─── Editable widget ──────────────────────────────────────────────────────────\n\nexport const BpeChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, disabled } = useField(fieldId);\n const data = useMemo(() => normalizeBpeChart(value), [value]);\n\n const handleScoreChange = (key: SextantKey, score: BpeScore | undefined) => {\n const next: BpeChartData = { ...data, scores: { ...data.scores } };\n if (score === undefined) delete next.scores[key];\n else next.scores[key] = score;\n setValue(next);\n setTouched();\n };\n\n const handleBleedingChange = (key: SextantKey, v: boolean) => {\n const next: BpeChartData = { ...data, bleeding: { ...data.bleeding } };\n if (!v) delete next.bleeding[key];\n else next.bleeding[key] = true;\n setValue(next);\n setTouched();\n };\n\n if (!fieldDef) return null;\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-3')}>\n {showLabel && (\n <Label className={fieldLabelClass(fieldDef)}>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n )}\n\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid\n arch=\"upper\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n <ArchGrid\n arch=\"lower\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// ─── Read-only view ───────────────────────────────────────────────────────────\n\nexport function BpeChartReadOnly({\n data: rawData,\n label,\n className,\n}: {\n data: unknown;\n label?: string;\n className?: string;\n}) {\n const data = useMemo(() => normalizeBpeChart(rawData), [rawData]);\n const hasData = SEXTANTS.some((s) => data.scores[s.key] !== undefined);\n\n return (\n <div className={`rounded-xl border border-border/60 bg-card shadow-sm ${className ?? ''}`}>\n {label && (\n <div className=\"border-b border-border/60 px-4 py-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">{label}</h3>\n </div>\n )}\n\n {!hasData ? (\n <div className=\"px-4 py-6 text-center text-sm text-muted-foreground\">\n No BPE scores recorded\n </div>\n ) : (\n <>\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid arch=\"upper\" data={data} />\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n <ArchGrid arch=\"lower\" data={data} />\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <div className=\"space-y-0.5\">\n {SEXTANTS.filter((s) => data.scores[s.key]).map((s) => (\n <p key={s.key} className=\"text-xs text-foreground\">\n <span className=\"font-medium\">{s.label}:</span>{' '}\n <span className=\"text-muted-foreground\">\n {SCORE_LABEL[data.scores[s.key]!]}\n {data.bleeding[s.key] ? ' · BOP' : ''}\n </span>\n </p>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function Panel({
|
|
6
|
+
title,
|
|
7
|
+
right,
|
|
8
|
+
children
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-md border border-[#D0D0D0] bg-white", children: [
|
|
11
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-[#D0D0D0] bg-[#FEE8EC]/50 px-3 py-1.5", children: [
|
|
12
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-slate-700", children: title }),
|
|
13
|
+
right
|
|
14
|
+
] }),
|
|
15
|
+
/* @__PURE__ */ jsx("div", { className: "p-3 text-xs", children })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
function ChipRow({
|
|
19
|
+
options,
|
|
20
|
+
selected,
|
|
21
|
+
onToggle,
|
|
22
|
+
disabled
|
|
23
|
+
}) {
|
|
24
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: options.map((o) => {
|
|
25
|
+
const on = !!selected[o.key];
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
"button",
|
|
28
|
+
{
|
|
29
|
+
type: "button",
|
|
30
|
+
onClick: () => onToggle(o.key),
|
|
31
|
+
disabled,
|
|
32
|
+
className: cn(
|
|
33
|
+
"rounded-full border px-3 py-1 text-[11px] transition-colors",
|
|
34
|
+
on ? "border-rose-500 bg-rose-50 text-rose-700" : "border-slate-300 bg-white text-slate-600 hover:bg-slate-50"
|
|
35
|
+
),
|
|
36
|
+
children: o.label
|
|
37
|
+
},
|
|
38
|
+
o.key
|
|
39
|
+
);
|
|
40
|
+
}) });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { ChipRow, Panel };
|
|
44
|
+
//# sourceMappingURL=chunk-EJ7MKHER.mjs.map
|
|
45
|
+
//# sourceMappingURL=chunk-EJ7MKHER.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/_obgPanels.tsx"],"names":[],"mappings":";;;;AAGO,SAAS,KAAA,CAAM;AAAA,EACpB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yFAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7D;AAAA,KAAA,EACH,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAe,QAAA,EAAS;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,IAAA,MAAM,EAAA,GAAK,CAAC,CAAC,QAAA,CAAS,EAAE,GAAG,CAAA;AAC3B,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAAA,QAC7B,QAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,6DAAA;AAAA,UACA,KACI,0CAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA,CAAA,CAAE;AAAA,OAAA;AAAA,MAXE,CAAA,CAAE;AAAA,KAYT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ","file":"chunk-EJ7MKHER.mjs","sourcesContent":["import React from 'react';\nimport { cn } from '../../core/utils';\n\nexport function Panel({\n title,\n right,\n children,\n}: {\n title: string;\n right?: React.ReactNode;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"overflow-hidden rounded-md border border-[#D0D0D0] bg-white\">\n <div className=\"flex items-center justify-between border-b border-[#D0D0D0] bg-[#FEE8EC]/50 px-3 py-1.5\">\n <span className=\"text-xs font-semibold text-slate-700\">{title}</span>\n {right}\n </div>\n <div className=\"p-3 text-xs\">{children}</div>\n </div>\n );\n}\n\nexport function ChipRow({\n options,\n selected,\n onToggle,\n disabled,\n}: {\n options: { key: string; label: string }[];\n selected: Record<string, boolean>;\n onToggle: (key: string) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((o) => {\n const on = !!selected[o.key];\n return (\n <button\n key={o.key}\n type=\"button\"\n onClick={() => onToggle(o.key)}\n disabled={disabled}\n className={cn(\n 'rounded-full border px-3 py-1 text-[11px] transition-colors',\n on\n ? 'border-rose-500 bg-rose-50 text-rose-700'\n : 'border-slate-300 bg-white text-slate-600 hover:bg-slate-50',\n )}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -19,8 +19,9 @@ var TextWidget = ({ fieldId }) => {
|
|
|
19
19
|
const hasVoice = !!(fieldDef?.voice && store.getVoice());
|
|
20
20
|
const showError = !!error && (touched || state.submitAttempted);
|
|
21
21
|
if (!fieldDef) return null;
|
|
22
|
-
const
|
|
23
|
-
const isTextarea = fieldDef.type
|
|
22
|
+
const TEXTAREA_TYPES = /* @__PURE__ */ new Set(["textarea", "social_history"]);
|
|
23
|
+
const isTextarea = TEXTAREA_TYPES.has(fieldDef.type);
|
|
24
|
+
const Component = isTextarea ? Textarea : Input;
|
|
24
25
|
const height = isTextarea && "height" in fieldDef ? fieldDef.height : void 0;
|
|
25
26
|
const theme = getThemeConfig(
|
|
26
27
|
isTextarea ? "textarea" : "text",
|
|
@@ -133,5 +134,5 @@ var SelectWidget = ({ fieldId }) => {
|
|
|
133
134
|
};
|
|
134
135
|
|
|
135
136
|
export { SelectWidget, TextWidget };
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
137
|
+
//# sourceMappingURL=chunk-G6Y4UJPN.mjs.map
|
|
138
|
+
//# sourceMappingURL=chunk-G6Y4UJPN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/Text.tsx","../src/ui/widgets/Select.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-G6Y4UJPN.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Input } from '../shadcn/input';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const TextWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const TEXTAREA_TYPES = new Set(['textarea', 'social_history']);\n const isTextarea = TEXTAREA_TYPES.has(fieldDef.type);\n const Component = isTextarea ? Textarea : Input;\n const height = isTextarea && 'height' in fieldDef ? fieldDef.height : undefined;\n const theme = getThemeConfig(\n isTextarea ? 'textarea' : 'text',\n fieldDef.theme\n );\n\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = showLabel\n ? theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n )\n : null;\n\n const placeholder =\n typeof fieldDef.placeholder === 'string' && fieldDef.placeholder.trim()\n ? fieldDef.placeholder\n : undefined;\n\n return (\n <div\n className={fieldWrapperClass(\n fieldDef,\n wrapperClass,\n isTextarea ? 'flex h-full min-h-0 flex-col' : undefined,\n )}\n >\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {labelEl}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : (\n labelEl\n )}\n <Component\n id={fieldId}\n value={value || ''}\n onChange={(e) => setValue(fieldDef.type === 'number' ? Number(e.target.value) : e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n type={fieldDef.type === 'number' ? 'number' : 'text'}\n className={fieldControlClass(\n fieldDef,\n inputClass,\n isTextarea && height == null ? 'min-h-[80px] flex-1' : undefined,\n )}\n placeholder={placeholder}\n aria-label={!showLabel ? fieldDef.label : undefined}\n {...(isTextarea && { height })}\n />\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n","import React, { useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport type { SelectFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const SelectWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const [options, setOptions] = useState<{ label: string; value: any }[]>([]);\n const [loading, setLoading] = useState(false);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n useEffect(() => {\n if (!fieldDef) return;\n const def = fieldDef as SelectFieldDef; // Cast safe due to Renderer check\n\n if (def.options) {\n setOptions(def.options);\n } else if (def.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then(opts => {\n setOptions(opts);\n })\n .finally(() => setLoading(false));\n }\n }, [fieldDef]);\n\n if (!fieldDef) return null;\n\n const schemaPlaceholder =\n typeof fieldDef.placeholder === 'string' && fieldDef.placeholder.trim()\n ? fieldDef.placeholder\n : undefined;\n const selectPlaceholder = loading ? 'Loading...' : schemaPlaceholder ?? 'Select...';\n\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n\n <Select \n disabled={disabled || loading} \n value={value ? String(value) : undefined} \n onValueChange={(val) => {\n // Try to find original value type (number vs string)\n const opt = options.find(o => String(o.value) === val);\n setValue(opt ? opt.value : val);\n setTouched();\n }}\n >\n <SelectTrigger\n id={fieldId}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500' : '',\n )}\n >\n <SelectValue placeholder={selectPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n \n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
|
|
@@ -3,32 +3,10 @@
|
|
|
3
3
|
var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.cjs');
|
|
4
4
|
var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
|
|
5
5
|
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
6
|
-
|
|
6
|
+
require('react');
|
|
7
7
|
var lucideReact = require('lucide-react');
|
|
8
8
|
var reactDayPicker = require('react-day-picker');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
-
var PopoverPrimitive = require('@radix-ui/react-popover');
|
|
11
|
-
|
|
12
|
-
function _interopNamespace(e) {
|
|
13
|
-
if (e && e.__esModule) return e;
|
|
14
|
-
var n = Object.create(null);
|
|
15
|
-
if (e) {
|
|
16
|
-
Object.keys(e).forEach(function (k) {
|
|
17
|
-
if (k !== 'default') {
|
|
18
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
get: function () { return e[k]; }
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
n.default = e;
|
|
27
|
-
return Object.freeze(n);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
|
|
31
|
-
var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
|
|
32
10
|
|
|
33
11
|
function CalendarDropdown(props) {
|
|
34
12
|
const { options, value, onChange } = props;
|
|
@@ -149,26 +127,7 @@ function Calendar({
|
|
|
149
127
|
);
|
|
150
128
|
}
|
|
151
129
|
Calendar.displayName = "Calendar";
|
|
152
|
-
var Popover = PopoverPrimitive__namespace.Root;
|
|
153
|
-
var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
|
|
154
|
-
var PopoverContent = React2__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
155
|
-
PopoverPrimitive__namespace.Content,
|
|
156
|
-
{
|
|
157
|
-
ref,
|
|
158
|
-
align,
|
|
159
|
-
sideOffset,
|
|
160
|
-
className: chunkFHHISVCH_cjs.cn(
|
|
161
|
-
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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",
|
|
162
|
-
className
|
|
163
|
-
),
|
|
164
|
-
...props
|
|
165
|
-
}
|
|
166
|
-
) }));
|
|
167
|
-
PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
|
|
168
130
|
|
|
169
131
|
exports.Calendar = Calendar;
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
exports.PopoverTrigger = PopoverTrigger;
|
|
173
|
-
//# sourceMappingURL=chunk-AZSAPO2V.cjs.map
|
|
174
|
-
//# sourceMappingURL=chunk-AZSAPO2V.cjs.map
|
|
132
|
+
//# sourceMappingURL=chunk-HXY3IX3G.cjs.map
|
|
133
|
+
//# sourceMappingURL=chunk-HXY3IX3G.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/calendar.tsx"],"names":["Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","DayPicker","cn","buttonVariants","ChevronLeft","ChevronRight"],"mappings":"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","file":"chunk-HXY3IX3G.cjs","sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker } from \"react-day-picker\"\n\nimport { cn } from \"../../core/utils\"\nimport { buttonVariants } from \"./button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\n\ntype RdpDropdownOption = {\n value: string | number\n label: string\n disabled?: boolean\n}\n\ntype RdpDropdownProps = {\n options?: RdpDropdownOption[]\n value?: string | number\n onChange?: React.ChangeEventHandler<HTMLSelectElement>\n \"aria-label\"?: string\n}\n\nfunction CalendarDropdown(props: RdpDropdownProps) {\n const { options, value, onChange } = props\n\n const handleValueChange = (newValue: string) => {\n if (!onChange) return\n const syntheticEvent = {\n target: { value: newValue },\n } as unknown as React.ChangeEvent<HTMLSelectElement>\n onChange(syntheticEvent)\n }\n\n return (\n <Select value={value?.toString()} onValueChange={handleValueChange}>\n <SelectTrigger className=\"h-7 px-2 text-sm\" aria-label={props[\"aria-label\"]}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((option) => (\n <SelectItem\n key={option.value.toString()}\n value={option.value.toString()}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n const captionLayout = props.captionLayout ?? \"dropdown\"\n const isDropdownCaption =\n captionLayout === \"dropdown\" ||\n captionLayout === \"dropdown-months\" ||\n captionLayout === \"dropdown-years\"\n\n // Provide a broad default year range for dropdown captions.\n // Callers can override by passing `startMonth` / `endMonth`.\n const startMonth =\n props.startMonth ?? (isDropdownCaption ? new Date(1900, 0) : undefined)\n const endMonth =\n props.endMonth ?? (isDropdownCaption ? new Date(2100, 11) : undefined)\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n captionLayout={captionLayout}\n hideNavigation={props.hideNavigation ?? isDropdownCaption}\n navLayout={props.navLayout ?? (isDropdownCaption ? \"around\" : undefined)}\n startMonth={startMonth}\n endMonth={endMonth}\n className={cn(\"p-3 relative\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\n month: \"space-y-4\",\n caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: cn(\n \"text-sm font-medium\",\n isDropdownCaption && \"sr-only\"\n ),\n dropdowns: \"flex items-center gap-2\",\n months_dropdown:\n \"h-7 rounded-md border border-input bg-background px-2 text-sm\",\n years_dropdown:\n \"h-7 rounded-md border border-input bg-background px-2 text-sm\",\n nav: \"space-x-1 flex items-center\",\n nav_button: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"\n ),\n nav_button_previous: isDropdownCaption ? \"\" : \"absolute left-1\",\n nav_button_next: isDropdownCaption ? \"\" : \"absolute right-1\",\n table: \"w-full border-collapse space-y-1\",\n head_row: \"flex\",\n head_cell:\n \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n row: \"flex w-full mt-2\",\n cell: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n day_range_end: \"day-range-end\",\n day_selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n day_today: \"bg-accent text-accent-foreground\",\n day_outside:\n \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n day_disabled: \"text-muted-foreground opacity-50\",\n day_range_middle:\n \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n day_hidden: \"invisible\",\n\n // v9 keys with explicit positioning relative to the NEW container\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n isDropdownCaption ? \"\" : \"absolute left-1 top-3\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n isDropdownCaption ? \"\" : \"absolute right-1 top-3\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday: \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day_button: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n range_end: \"day-range-end\",\n selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n today: \"bg-accent text-accent-foreground\",\n outside: \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n disabled: \"text-muted-foreground opacity-50\",\n range_middle: \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n hidden: \"invisible\",\n \n ...classNames,\n }}\n components={{\n IconLeft: () => <ChevronLeft className=\"h-4 w-4\" />,\n IconRight: () => <ChevronRight className=\"h-4 w-4\" />,\n // @ts-expect-error react-day-picker v9 component typing differences\n Dropdown: CalendarDropdown,\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'left' ? ChevronLeft : ChevronRight\n return <Icon className=\"h-4 w-4\" />\n }\n }}\n {...props}\n />\n )\n}\nCalendar.displayName = \"Calendar\"\n\nexport { Calendar }\n"]}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-AZHTIUOL.mjs';
|
|
2
2
|
import { buttonVariants } from './chunk-GXXWMHAA.mjs';
|
|
3
3
|
import { cn } from './chunk-VPU66PI6.mjs';
|
|
4
|
-
import
|
|
4
|
+
import 'react';
|
|
5
5
|
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
6
6
|
import { DayPicker } from 'react-day-picker';
|
|
7
7
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
-
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
9
8
|
|
|
10
9
|
function CalendarDropdown(props) {
|
|
11
10
|
const { options, value, onChange } = props;
|
|
@@ -126,23 +125,7 @@ function Calendar({
|
|
|
126
125
|
);
|
|
127
126
|
}
|
|
128
127
|
Calendar.displayName = "Calendar";
|
|
129
|
-
var Popover = PopoverPrimitive.Root;
|
|
130
|
-
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
131
|
-
var PopoverContent = React2.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
132
|
-
PopoverPrimitive.Content,
|
|
133
|
-
{
|
|
134
|
-
ref,
|
|
135
|
-
align,
|
|
136
|
-
sideOffset,
|
|
137
|
-
className: cn(
|
|
138
|
-
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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",
|
|
139
|
-
className
|
|
140
|
-
),
|
|
141
|
-
...props
|
|
142
|
-
}
|
|
143
|
-
) }));
|
|
144
|
-
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
145
128
|
|
|
146
|
-
export { Calendar
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
148
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
export { Calendar };
|
|
130
|
+
//# sourceMappingURL=chunk-JM7WNDNT.mjs.map
|
|
131
|
+
//# sourceMappingURL=chunk-JM7WNDNT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/calendar.tsx"],"names":[],"mappings":"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","file":"chunk-JM7WNDNT.mjs","sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker } from \"react-day-picker\"\n\nimport { cn } from \"../../core/utils\"\nimport { buttonVariants } from \"./button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\n\ntype RdpDropdownOption = {\n value: string | number\n label: string\n disabled?: boolean\n}\n\ntype RdpDropdownProps = {\n options?: RdpDropdownOption[]\n value?: string | number\n onChange?: React.ChangeEventHandler<HTMLSelectElement>\n \"aria-label\"?: string\n}\n\nfunction CalendarDropdown(props: RdpDropdownProps) {\n const { options, value, onChange } = props\n\n const handleValueChange = (newValue: string) => {\n if (!onChange) return\n const syntheticEvent = {\n target: { value: newValue },\n } as unknown as React.ChangeEvent<HTMLSelectElement>\n onChange(syntheticEvent)\n }\n\n return (\n <Select value={value?.toString()} onValueChange={handleValueChange}>\n <SelectTrigger className=\"h-7 px-2 text-sm\" aria-label={props[\"aria-label\"]}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((option) => (\n <SelectItem\n key={option.value.toString()}\n value={option.value.toString()}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n const captionLayout = props.captionLayout ?? \"dropdown\"\n const isDropdownCaption =\n captionLayout === \"dropdown\" ||\n captionLayout === \"dropdown-months\" ||\n captionLayout === \"dropdown-years\"\n\n // Provide a broad default year range for dropdown captions.\n // Callers can override by passing `startMonth` / `endMonth`.\n const startMonth =\n props.startMonth ?? (isDropdownCaption ? new Date(1900, 0) : undefined)\n const endMonth =\n props.endMonth ?? (isDropdownCaption ? new Date(2100, 11) : undefined)\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n captionLayout={captionLayout}\n hideNavigation={props.hideNavigation ?? isDropdownCaption}\n navLayout={props.navLayout ?? (isDropdownCaption ? \"around\" : undefined)}\n startMonth={startMonth}\n endMonth={endMonth}\n className={cn(\"p-3 relative\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\n month: \"space-y-4\",\n caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: cn(\n \"text-sm font-medium\",\n isDropdownCaption && \"sr-only\"\n ),\n dropdowns: \"flex items-center gap-2\",\n months_dropdown:\n \"h-7 rounded-md border border-input bg-background px-2 text-sm\",\n years_dropdown:\n \"h-7 rounded-md border border-input bg-background px-2 text-sm\",\n nav: \"space-x-1 flex items-center\",\n nav_button: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"\n ),\n nav_button_previous: isDropdownCaption ? \"\" : \"absolute left-1\",\n nav_button_next: isDropdownCaption ? \"\" : \"absolute right-1\",\n table: \"w-full border-collapse space-y-1\",\n head_row: \"flex\",\n head_cell:\n \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n row: \"flex w-full mt-2\",\n cell: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n day_range_end: \"day-range-end\",\n day_selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n day_today: \"bg-accent text-accent-foreground\",\n day_outside:\n \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n day_disabled: \"text-muted-foreground opacity-50\",\n day_range_middle:\n \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n day_hidden: \"invisible\",\n\n // v9 keys with explicit positioning relative to the NEW container\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n isDropdownCaption ? \"\" : \"absolute left-1 top-3\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n isDropdownCaption ? \"\" : \"absolute right-1 top-3\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday: \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day_button: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n range_end: \"day-range-end\",\n selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n today: \"bg-accent text-accent-foreground\",\n outside: \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n disabled: \"text-muted-foreground opacity-50\",\n range_middle: \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n hidden: \"invisible\",\n \n ...classNames,\n }}\n components={{\n IconLeft: () => <ChevronLeft className=\"h-4 w-4\" />,\n IconRight: () => <ChevronRight className=\"h-4 w-4\" />,\n // @ts-expect-error react-day-picker v9 component typing differences\n Dropdown: CalendarDropdown,\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'left' ? ChevronLeft : ChevronRight\n return <Icon className=\"h-4 w-4\" />\n }\n }}\n {...props}\n />\n )\n}\nCalendar.displayName = \"Calendar\"\n\nexport { Calendar }\n"]}
|