@alfadocs/ui-kit-debug 1.90.1 → 1.90.2
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/_chunks/address-autocomplete-DR4Xn23Z.js +519 -0
- package/dist/_chunks/address-autocomplete-DR4Xn23Z.js.map +1 -0
- package/dist/_chunks/{address-fields-CfnXK8RT.js → address-fields-qxQkGwPf.js} +5 -5
- package/dist/_chunks/{address-fields-CfnXK8RT.js.map → address-fields-qxQkGwPf.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-CoW22jx1.js → ai-permission-notice-VNh3W57L.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-CoW22jx1.js.map → ai-permission-notice-VNh3W57L.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-fbEQwcuW.js → anamnesis-summary-rows-EKPfVCmh.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-rows-fbEQwcuW.js.map → anamnesis-summary-rows-EKPfVCmh.js.map} +1 -1
- package/dist/_chunks/autocomplete-BXMcNoa3.js +562 -0
- package/dist/_chunks/autocomplete-BXMcNoa3.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-C4FYwmrZ.js → balance-badge-cell-D9VhFp0L.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-C4FYwmrZ.js.map → balance-badge-cell-D9VhFp0L.js.map} +1 -1
- package/dist/_chunks/{booking-C0FoW8Yx.js → booking-CcE_oviI.js} +1896 -1859
- package/dist/_chunks/booking-CcE_oviI.js.map +1 -0
- package/dist/_chunks/{calendar-appointment-editor-dialog-C1v2MNE4.js → calendar-appointment-editor-dialog-CiAGAX2t.js} +7 -7
- package/dist/_chunks/{calendar-appointment-editor-dialog-C1v2MNE4.js.map → calendar-appointment-editor-dialog-CiAGAX2t.js.map} +1 -1
- package/dist/_chunks/{checkbox-BjDv-r3o.js → checkbox-a7Sh-dXb.js} +32 -31
- package/dist/_chunks/checkbox-a7Sh-dXb.js.map +1 -0
- package/dist/_chunks/{checkbox-group-Cw2H5qaq.js → checkbox-group-eGdv9fZc.js} +2 -2
- package/dist/_chunks/{checkbox-group-Cw2H5qaq.js.map → checkbox-group-eGdv9fZc.js.map} +1 -1
- package/dist/_chunks/{city-input-CJVGswxp.js → city-input-CA59CjnV.js} +2 -2
- package/dist/_chunks/{city-input-CJVGswxp.js.map → city-input-CA59CjnV.js.map} +1 -1
- package/dist/_chunks/{combobox-CDPm_n0p.js → combobox-D-gpgEDy.js} +314 -294
- package/dist/_chunks/combobox-D-gpgEDy.js.map +1 -0
- package/dist/_chunks/{country-select-DQ8q7ypA.js → country-select-BfmX9y5i.js} +2 -2
- package/dist/_chunks/{country-select-DQ8q7ypA.js.map → country-select-BfmX9y5i.js.map} +1 -1
- package/dist/_chunks/{data-table-B_IcS0Ke.js → data-table-CqQgoNsU.js} +2 -2
- package/dist/_chunks/{data-table-B_IcS0Ke.js.map → data-table-CqQgoNsU.js.map} +1 -1
- package/dist/_chunks/{face-scheme-BgJGFDTa.js → face-scheme-BKSE98bo.js} +2 -2
- package/dist/_chunks/{face-scheme-BgJGFDTa.js.map → face-scheme-BKSE98bo.js.map} +1 -1
- package/dist/_chunks/{file-manager-C9YOT-Dn.js → file-manager-BnI1ZWZu.js} +2 -2
- package/dist/_chunks/{file-manager-C9YOT-Dn.js.map → file-manager-BnI1ZWZu.js.map} +1 -1
- package/dist/_chunks/{header-settings-BVhjndtV.js → header-settings-BeA2fnol.js} +24 -23
- package/dist/_chunks/header-settings-BeA2fnol.js.map +1 -0
- package/dist/_chunks/{heatmap-HTz3Jvzy.js → heatmap-fCxwNz2o.js} +2 -2
- package/dist/_chunks/{heatmap-HTz3Jvzy.js.map → heatmap-fCxwNz2o.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-C0ynDik7.js → link-cell-renderer-CnCgudvq.js} +3 -3
- package/dist/_chunks/{link-cell-renderer-C0ynDik7.js.map → link-cell-renderer-CnCgudvq.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-DYwbL5sD.js → login-dev-card-BZBR58mu.js} +2 -2
- package/dist/_chunks/{login-dev-card-DYwbL5sD.js.map → login-dev-card-BZBR58mu.js.map} +1 -1
- package/dist/_chunks/{map-view-Bvi06RVh.js → map-view-UrNgxBy3.js} +260 -237
- package/dist/_chunks/map-view-UrNgxBy3.js.map +1 -0
- package/dist/_chunks/{index.modern-BeRXQVdc.js → maps-core-gate-DkNqGkm3.js} +360 -319
- package/dist/_chunks/maps-core-gate-DkNqGkm3.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-x_abo_ye.js → marketplace-app-shell-CmZx0Oam.js} +2 -2
- package/dist/_chunks/{marketplace-app-shell-x_abo_ye.js.map → marketplace-app-shell-CmZx0Oam.js.map} +1 -1
- package/dist/_chunks/{notes-panel-CZO1qsD-.js → notes-panel-Dywo6R55.js} +2 -2
- package/dist/_chunks/{notes-panel-CZO1qsD-.js.map → notes-panel-Dywo6R55.js.map} +1 -1
- package/dist/_chunks/{patient-details-D0P5eog5.js → patient-details-BUr7Oemx.js} +2 -2
- package/dist/_chunks/{patient-details-D0P5eog5.js.map → patient-details-BUr7Oemx.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-R73dZJY6.js → patient-field-row-bJk8Q_qr.js} +5 -5
- package/dist/_chunks/{patient-field-row-R73dZJY6.js.map → patient-field-row-bJk8Q_qr.js.map} +1 -1
- package/dist/_chunks/patient-search-Ca9j5cWb.js +1306 -0
- package/dist/_chunks/patient-search-Ca9j5cWb.js.map +1 -0
- package/dist/_chunks/{patient-summary-card-6U74-ivO.js → patient-summary-card-CCQZ8X37.js} +2 -2
- package/dist/_chunks/{patient-summary-card-6U74-ivO.js.map → patient-summary-card-CCQZ8X37.js.map} +1 -1
- package/dist/_chunks/{periodontal-diagnosis-B9YmmVmM.js → periodontal-diagnosis-DD3hrg9X.js} +2 -2
- package/dist/_chunks/{periodontal-diagnosis-B9YmmVmM.js.map → periodontal-diagnosis-DD3hrg9X.js.map} +1 -1
- package/dist/_chunks/{permission-matrix-BoQjENGV.js → permission-matrix-BJ6sg3Zp.js} +3 -3
- package/dist/_chunks/{permission-matrix-BoQjENGV.js.map → permission-matrix-BJ6sg3Zp.js.map} +1 -1
- package/dist/_chunks/{practice-results-B61krlwu.js → practice-results-DQuOfqej.js} +2 -2
- package/dist/_chunks/{practice-results-B61krlwu.js.map → practice-results-DQuOfqej.js.map} +1 -1
- package/dist/_chunks/{province-select-CPdTwEob.js → province-select-D64whw0m.js} +2 -2
- package/dist/_chunks/{province-select-CPdTwEob.js.map → province-select-D64whw0m.js.map} +1 -1
- package/dist/_chunks/{registration-form-DmP3YUfp.js → registration-form-CRm6DaB9.js} +2 -2
- package/dist/_chunks/{registration-form-DmP3YUfp.js.map → registration-form-CRm6DaB9.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-UzQQLb-z.js → reviews-panel-B7InBORU.js} +42 -41
- package/dist/_chunks/reviews-panel-B7InBORU.js.map +1 -0
- package/dist/_chunks/{rich-text-editor-BZTyxQBd.js → rich-text-editor-BfEu57dk.js} +3 -3
- package/dist/_chunks/{rich-text-editor-BZTyxQBd.js.map → rich-text-editor-BfEu57dk.js.map} +1 -1
- package/dist/_chunks/{slot-grid-Bb13H9Rl.js → slot-grid-DrwynKeN.js} +91 -89
- package/dist/_chunks/{slot-grid-Bb13H9Rl.js.map → slot-grid-DrwynKeN.js.map} +1 -1
- package/dist/_chunks/{task-editor-BOETWbjU.js → task-editor-CI1SKUNc.js} +2 -2
- package/dist/_chunks/{task-editor-BOETWbjU.js.map → task-editor-CI1SKUNc.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-CWN-nJCZ.js → use-appointment-details-read-BytPq3Ux.js} +2 -2
- package/dist/_chunks/{use-appointment-details-read-CWN-nJCZ.js.map → use-appointment-details-read-BytPq3Ux.js.map} +1 -1
- package/dist/_chunks/{voice-control-panel-BziKE-KK.js → voice-control-panel-BP0otrID.js} +2 -2
- package/dist/_chunks/{voice-control-panel-BziKE-KK.js.map → voice-control-panel-BP0otrID.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-DulCpCRz.js → workflow-webhook-action-B_nBJ_ht.js} +2 -2
- package/dist/_chunks/{workflow-webhook-action-DulCpCRz.js.map → workflow-webhook-action-B_nBJ_ht.js.map} +1 -1
- package/dist/agent-catalog.json +2 -2
- package/dist/agent-i18n/en.json +1 -1
- package/dist/components/_shared/maps-core-gate.d.ts +18 -0
- package/dist/components/_shared/maps-core-gate.d.ts.map +1 -0
- package/dist/components/address-autocomplete/address-autocomplete.d.ts.map +1 -1
- package/dist/components/address-autocomplete/index.js +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/autocomplete/autocomplete.agent.d.ts.map +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/booking/booking.d.ts.map +1 -1
- package/dist/components/booking/details-form.d.ts.map +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/city-input/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/header-settings/header-settings.d.ts +2 -1
- package/dist/components/header-settings/header-settings.d.ts.map +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/map-view/map-view.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-search/patient-search.d.ts.map +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/periodontal-diagnosis/index.js +1 -1
- package/dist/components/permission-matrix/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/host-compat.css +1 -10
- package/dist/index.js +37 -37
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/address-autocomplete-bPR2mNBt.js +0 -498
- package/dist/_chunks/address-autocomplete-bPR2mNBt.js.map +0 -1
- package/dist/_chunks/autocomplete-CnB1mHGc.js +0 -539
- package/dist/_chunks/autocomplete-CnB1mHGc.js.map +0 -1
- package/dist/_chunks/booking-C0FoW8Yx.js.map +0 -1
- package/dist/_chunks/checkbox-BjDv-r3o.js.map +0 -1
- package/dist/_chunks/combobox-CDPm_n0p.js.map +0 -1
- package/dist/_chunks/header-settings-BVhjndtV.js.map +0 -1
- package/dist/_chunks/index.modern-BeRXQVdc.js.map +0 -1
- package/dist/_chunks/map-view-Bvi06RVh.js.map +0 -1
- package/dist/_chunks/patient-search-CCOUZABE.js +0 -1196
- package/dist/_chunks/patient-search-CCOUZABE.js.map +0 -1
- package/dist/_chunks/reviews-panel-UzQQLb-z.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as S, jsx as s } from "react/jsx-runtime";
|
|
2
2
|
import { createContext as T, useContext as _, forwardRef as M, useId as G, useRef as K, useMemo as V } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as g from "@radix-ui/react-checkbox";
|
|
4
4
|
import { c as A } from "./index-D2ZczOXr.js";
|
|
5
5
|
import { u as B } from "./use-controllable-state-BiY4xTzM.js";
|
|
6
6
|
import { T as F } from "./tooltip-uEBdD1-5.js";
|
|
@@ -65,7 +65,7 @@ const D = {
|
|
|
65
65
|
description: "Sourced from the id prop."
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
},
|
|
68
|
+
}, b = [
|
|
69
69
|
"ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]",
|
|
70
70
|
"ds:animate-[checkbox-indicator-draw_var(--animation-duration)_ease-out_forwards]"
|
|
71
71
|
].join(" ");
|
|
@@ -82,7 +82,7 @@ function P({ className: t }) {
|
|
|
82
82
|
"aria-hidden": "true",
|
|
83
83
|
"data-slot": "checkbox-check-icon",
|
|
84
84
|
className: t,
|
|
85
|
-
children: /* @__PURE__ */ s("path", { pathLength: "1", d: "M5 12l5 5L20 7", className:
|
|
85
|
+
children: /* @__PURE__ */ s("path", { pathLength: "1", d: "M5 12l5 5L20 7", className: b })
|
|
86
86
|
}
|
|
87
87
|
);
|
|
88
88
|
}
|
|
@@ -98,13 +98,14 @@ function E({ className: t }) {
|
|
|
98
98
|
"aria-hidden": "true",
|
|
99
99
|
"data-slot": "checkbox-indeterminate-icon",
|
|
100
100
|
className: t,
|
|
101
|
-
children: /* @__PURE__ */ s("path", { pathLength: "1", d: "M5 12h14", className:
|
|
101
|
+
children: /* @__PURE__ */ s("path", { pathLength: "1", d: "M5 12h14", className: b })
|
|
102
102
|
}
|
|
103
103
|
);
|
|
104
104
|
}
|
|
105
105
|
const J = A(
|
|
106
106
|
[
|
|
107
107
|
"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0",
|
|
108
|
+
"ds:min-w-[var(--spacing-lg)] ds:min-h-[var(--spacing-lg)] ds:p-[var(--spacing-2xs)]",
|
|
108
109
|
// The off-state edge is all that marks the box, so `--border` is
|
|
109
110
|
// re-pointed at the 3:1 `--control-border` here. A host still on an
|
|
110
111
|
// older token sheet lacks this class and keeps the soft edge.
|
|
@@ -125,9 +126,9 @@ const J = A(
|
|
|
125
126
|
// label wraps, because the wrapper uses `items-start` so children
|
|
126
127
|
// align to the top edge rather than the multi-line block's centre.
|
|
127
128
|
size: {
|
|
128
|
-
sm: "ds:size-3.5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-
|
|
129
|
-
md: "ds:size-4 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-
|
|
130
|
-
lg: "ds:size-5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-
|
|
129
|
+
sm: "ds:size-3.5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]",
|
|
130
|
+
md: "ds:size-4 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]",
|
|
131
|
+
lg: "ds:size-5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]"
|
|
131
132
|
}
|
|
132
133
|
},
|
|
133
134
|
defaultVariants: {
|
|
@@ -143,44 +144,44 @@ const J = A(
|
|
|
143
144
|
disabled: x,
|
|
144
145
|
disabledReason: m,
|
|
145
146
|
name: C,
|
|
146
|
-
value:
|
|
147
|
+
value: n,
|
|
147
148
|
id: u,
|
|
148
149
|
className: y,
|
|
149
150
|
...w
|
|
150
151
|
}, z) => {
|
|
151
|
-
const j = G(),
|
|
152
|
+
const j = G(), p = u ?? j, e = q(), r = e !== null && n !== void 0, [N, i] = B({
|
|
152
153
|
value: l,
|
|
153
154
|
defaultValue: !1,
|
|
154
155
|
onChange: v
|
|
155
|
-
}), c =
|
|
156
|
-
i(
|
|
157
|
-
}, L = (e == null ? void 0 : e.name) ?? C, d = (e == null ? void 0 : e.disabled) || x,
|
|
156
|
+
}), c = r ? e.value.has(n) : N ?? !1, I = r ? () => e.toggle(n) : (o) => {
|
|
157
|
+
i(o);
|
|
158
|
+
}, L = (e == null ? void 0 : e.name) ?? C, d = (e == null ? void 0 : e.disabled) || x, a = K(
|
|
158
159
|
c ?? !1
|
|
159
160
|
);
|
|
160
|
-
|
|
161
|
+
a.current = c ?? !1;
|
|
161
162
|
const R = V(
|
|
162
163
|
() => ({
|
|
163
|
-
getChecked: () =>
|
|
164
|
-
setChecked: (
|
|
165
|
-
if (
|
|
166
|
-
(
|
|
164
|
+
getChecked: () => a.current,
|
|
165
|
+
setChecked: (o) => {
|
|
166
|
+
if (r) {
|
|
167
|
+
(a.current === !0 || a.current === "indeterminate") !== (o === !0 || o === "indeterminate") && e.toggle(n);
|
|
167
168
|
return;
|
|
168
169
|
}
|
|
169
|
-
i(
|
|
170
|
+
i(o);
|
|
170
171
|
},
|
|
171
172
|
toggle: () => {
|
|
172
|
-
if (
|
|
173
|
-
e.toggle(
|
|
173
|
+
if (r) {
|
|
174
|
+
e.toggle(n);
|
|
174
175
|
return;
|
|
175
176
|
}
|
|
176
|
-
const
|
|
177
|
-
i(
|
|
177
|
+
const o = !(a.current === !0 || a.current === "indeterminate");
|
|
178
|
+
i(o);
|
|
178
179
|
}
|
|
179
180
|
}),
|
|
180
|
-
[
|
|
181
|
+
[r, e, n, i]
|
|
181
182
|
);
|
|
182
183
|
H(D, R, u);
|
|
183
|
-
const
|
|
184
|
+
const k = [
|
|
184
185
|
"ds:text-primary-foreground",
|
|
185
186
|
h === "sm" ? "ds:size-3" : h === "lg" ? "ds:size-4" : "ds:size-3.5"
|
|
186
187
|
].join(" "), O = [
|
|
@@ -191,26 +192,26 @@ const J = A(
|
|
|
191
192
|
{
|
|
192
193
|
"data-component": "checkbox",
|
|
193
194
|
"data-component-id": u,
|
|
194
|
-
"data-option-id":
|
|
195
|
+
"data-option-id": n,
|
|
195
196
|
className: "ds:inline-flex ds:items-start ds:gap-[var(--spacing-sm)]",
|
|
196
197
|
children: [
|
|
197
198
|
/* @__PURE__ */ s(
|
|
198
|
-
|
|
199
|
+
g.Root,
|
|
199
200
|
{
|
|
200
201
|
ref: z,
|
|
201
|
-
id:
|
|
202
|
+
id: p,
|
|
202
203
|
checked: c,
|
|
203
204
|
onCheckedChange: I,
|
|
204
205
|
disabled: d,
|
|
205
206
|
"aria-disabled": d || void 0,
|
|
206
207
|
name: L,
|
|
207
|
-
value:
|
|
208
|
+
value: n,
|
|
208
209
|
className: J({ size: h, className: y }),
|
|
209
210
|
...w,
|
|
210
|
-
children: /* @__PURE__ */ s(
|
|
211
|
+
children: /* @__PURE__ */ s(g.Indicator, { children: c === "indeterminate" ? /* @__PURE__ */ s(E, { className: k }) : /* @__PURE__ */ s(P, { className: k }) })
|
|
211
212
|
}
|
|
212
213
|
),
|
|
213
|
-
/* @__PURE__ */ s("label", { htmlFor:
|
|
214
|
+
/* @__PURE__ */ s("label", { htmlFor: p, className: O, children: t })
|
|
214
215
|
]
|
|
215
216
|
}
|
|
216
217
|
);
|
|
@@ -223,4 +224,4 @@ export {
|
|
|
223
224
|
W as a,
|
|
224
225
|
q as u
|
|
225
226
|
};
|
|
226
|
-
//# sourceMappingURL=checkbox-
|
|
227
|
+
//# sourceMappingURL=checkbox-a7Sh-dXb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox-a7Sh-dXb.js","sources":["../../src/components/checkbox/checkbox-group-context.ts","../../src/components/checkbox/checkbox.agent.ts","../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface CheckboxGroupContextShape {\n name?: string;\n value: Set<string>;\n toggle: (itemValue: string) => void;\n disabled: boolean;\n}\n\nexport const CheckboxGroupContext =\n createContext<CheckboxGroupContextShape | null>(null);\n\nexport function useCheckboxGroup(): CheckboxGroupContextShape | null {\n return useContext(CheckboxGroupContext);\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Checkbox. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CheckboxHandle } from './checkbox';\n\nexport const checkboxAgent: AgentAdapter<CheckboxHandle> = {\n id: 'checkbox',\n // A checkbox is a boolean toggle, not a one-of-N picker — `set_value`,\n // not `select_single` (which is reserved for choosing one item among many).\n capabilities: ['set_value'],\n state: {\n checked: {\n type: 'boolean | \"indeterminate\"',\n descriptionKey: 'ui.agent.checkbox.state.checked',\n description: 'Current checked state.',\n read: (handle) => handle.getChecked(),\n },\n },\n actions: {\n set_checked: {\n safety: 'write',\n argsType: '{ checked: boolean | \"indeterminate\" }',\n argsSchema: {\n type: 'object',\n properties: {\n checked: {\n oneOf: [{ type: 'boolean' }, { const: 'indeterminate' }],\n description:\n 'Target state: true, false, or the tri-state \"indeterminate\".',\n },\n },\n required: ['checked'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.checkbox.actions.setChecked',\n description: 'Set the checked state to a specific value.',\n examples: [{ args: { checked: true }, note: 'Tick the box.' }],\n invoke: (handle, args: { checked: boolean | 'indeterminate' }) => {\n handle.setChecked(args.checked);\n },\n },\n toggle: {\n safety: 'write',\n descriptionKey: 'ui.agent.checkbox.actions.toggle',\n description: 'Flip the checked state between checked and unchecked.',\n invoke: (handle) => {\n handle.toggle();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'checkbox',\n description: 'Marks the Checkbox wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useCheckboxGroup } from './checkbox-group-context';\nimport { Tooltip } from '../tooltip';\nimport { useAgentRegistration } from '../../agent';\nimport { checkboxAgent } from './checkbox.agent';\n\n/** Agent-readiness curated handle for Checkbox. */\nexport interface CheckboxHandle {\n getChecked: () => boolean | 'indeterminate';\n setChecked: (checked: boolean | 'indeterminate') => void;\n toggle: () => void;\n}\n\nconst drawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[checkbox-indicator-draw_var(--animation-duration)_ease-out_forwards]',\n].join(' ');\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-check-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={drawClasses} />\n </svg>\n );\n}\n\nfunction IndeterminateIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-indeterminate-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12h14\" className={drawClasses} />\n </svg>\n );\n}\n\nconst checkboxVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:min-w-[var(--spacing-lg)] ds:min-h-[var(--spacing-lg)] ds:p-[var(--spacing-2xs)]',\n // The off-state edge is all that marks the box, so `--border` is\n // re-pointed at the 3:1 `--control-border` here. A host still on an\n // older token sheet lacks this class and keeps the soft edge.\n 'ds:[--border:var(--control-border)]',\n 'ds:border ds:border-border ds:rounded-[var(--radius-sm)] ds:bg-background',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:data-[state=checked]:bg-primary ds:data-[state=checked]:border-primary',\n 'ds:data-[state=indeterminate]:bg-primary ds:data-[state=indeterminate]:border-primary',\n 'ds:relative ds:before:absolute ds:before:inset-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"]',\n ].join(' '),\n {\n variants: {\n // Per-size `mt` centers the box optically on the first line of the\n // label using the type-label line-box height — important when the\n // label wraps, because the wrapper uses `items-start` so children\n // align to the top edge rather than the multi-line block's centre.\n size: {\n sm: 'ds:size-3.5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]',\n md: 'ds:size-4 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]',\n lg: 'ds:size-5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-var(--spacing-lg))/2)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixCheckbox.Root>;\n\nexport interface CheckboxProps\n extends\n Omit<RadixRootProps, 'checked' | 'onCheckedChange' | 'children'>,\n VariantProps<typeof checkboxVariants> {\n /**\n * Visible label rendered next to the box. Accepts a string or any React\n * node — useful for consent labels that embed a privacy / T&C link.\n */\n label: ReactNode;\n checked?: boolean | 'indeterminate';\n onCheckedChange?: (checked: boolean | 'indeterminate') => void;\n size?: 'sm' | 'md' | 'lg';\n disabledReason?: string;\n value?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n label,\n checked,\n onCheckedChange,\n size = 'md',\n disabled,\n disabledReason,\n name,\n value,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const checkboxId = id ?? generatedId;\n const group = useCheckboxGroup();\n\n const inGroup = group !== null && value !== undefined;\n const [ownCheckedRaw, setOwnChecked] = useControllableState<\n boolean | 'indeterminate'\n >({\n value: checked,\n defaultValue: false,\n onChange: onCheckedChange,\n });\n const ownChecked = ownCheckedRaw ?? false;\n const effectiveChecked = inGroup ? group.value.has(value) : ownChecked;\n const effectiveOnChange = inGroup\n ? () => group.toggle(value)\n : (next: boolean | 'indeterminate') => {\n setOwnChecked(next);\n };\n const effectiveName = group?.name ?? name;\n const effectiveDisabled = group?.disabled || disabled;\n\n const checkedRef = useRef<boolean | 'indeterminate'>(\n effectiveChecked ?? false,\n );\n checkedRef.current = effectiveChecked ?? false;\n\n const agentHandle = useMemo<CheckboxHandle>(\n () => ({\n getChecked: () => checkedRef.current,\n setChecked: (next) => {\n if (inGroup) {\n // Inside a group: toggle implements set via the group context.\n const isOn =\n checkedRef.current === true ||\n checkedRef.current === 'indeterminate';\n const want = next === true || next === 'indeterminate';\n if (isOn !== want) group.toggle(value);\n return;\n }\n setOwnChecked(next);\n },\n toggle: () => {\n if (inGroup) {\n group.toggle(value);\n return;\n }\n const next =\n checkedRef.current === true ||\n checkedRef.current === 'indeterminate'\n ? false\n : true;\n setOwnChecked(next);\n },\n }),\n [inGroup, group, value, setOwnChecked],\n );\n useAgentRegistration(checkboxAgent, agentHandle, id);\n\n // `text-primary-foreground` lives on the SVG (not the <button> Root) so\n // a legacy consumer rule like `button, input, … { color: inherit }`\n // can't intercept it — the unlayered consumer rule would beat any\n // @layer utilities rule on the button itself, leaving the tick paint\n // (currentColor) inheriting the consumer's body text colour. See\n // styles.css for the matching form-element revert inside [data-component].\n const iconSizeClass = [\n 'ds:text-primary-foreground',\n size === 'sm' ? 'ds:size-3' : size === 'lg' ? 'ds:size-4' : 'ds:size-3.5',\n ].join(' ');\n\n const labelClasses = [\n 'type-label ds:text-foreground ds:select-none',\n effectiveDisabled\n ? 'ds:cursor-not-allowed ds:opacity-50'\n : 'ds:cursor-pointer',\n ].join(' ');\n\n const content = (\n <div\n data-component=\"checkbox\"\n data-component-id={id}\n data-option-id={value}\n className=\"ds:inline-flex ds:items-start ds:gap-[var(--spacing-sm)]\"\n >\n <RadixCheckbox.Root\n ref={ref}\n id={checkboxId}\n checked={effectiveChecked}\n onCheckedChange={effectiveOnChange}\n disabled={effectiveDisabled}\n aria-disabled={effectiveDisabled || undefined}\n name={effectiveName}\n value={value}\n className={checkboxVariants({ size, className })}\n {...props}\n >\n <RadixCheckbox.Indicator>\n {effectiveChecked === 'indeterminate' ? (\n <IndeterminateIcon className={iconSizeClass} />\n ) : (\n <CheckIcon className={iconSizeClass} />\n )}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n <label htmlFor={checkboxId} className={labelClasses}>\n {label}\n </label>\n </div>\n );\n\n if (effectiveDisabled && disabledReason) {\n return <Tooltip label={disabledReason}>{content}</Tooltip>;\n }\n\n return content;\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["CheckboxGroupContext","createContext","useCheckboxGroup","useContext","checkboxAgent","handle","args","drawClasses","CheckIcon","className","jsx","IndeterminateIcon","checkboxVariants","cva","Checkbox","forwardRef","label","checked","onCheckedChange","size","disabled","disabledReason","name","value","id","props","ref","generatedId","useId","checkboxId","group","inGroup","ownCheckedRaw","setOwnChecked","useControllableState","effectiveChecked","effectiveOnChange","next","effectiveName","effectiveDisabled","checkedRef","useRef","agentHandle","useMemo","useAgentRegistration","iconSizeClass","labelClasses","content","jsxs","RadixCheckbox","Tooltip"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { forwardRef as O, useId as Q, useMemo as S, useState as T, useRef as W,
|
|
|
3
3
|
import { c as Z } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as V } from "react-i18next";
|
|
5
5
|
import { u as ee } from "./use-controllable-state-BiY4xTzM.js";
|
|
6
|
-
import { C as M, a as te } from "./checkbox-
|
|
6
|
+
import { C as M, a as te } from "./checkbox-a7Sh-dXb.js";
|
|
7
7
|
import { u as se } from "./registry-DvAUVLHh.js";
|
|
8
8
|
import { C as ce } from "./circle-alert-rGDZ73Wh.js";
|
|
9
9
|
const re = {
|
|
@@ -210,4 +210,4 @@ oe.displayName = "CheckboxGroup";
|
|
|
210
210
|
export {
|
|
211
211
|
oe as C
|
|
212
212
|
};
|
|
213
|
-
//# sourceMappingURL=checkbox-group-
|
|
213
|
+
//# sourceMappingURL=checkbox-group-eGdv9fZc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-group-Cw2H5qaq.js","sources":["../../src/components/checkbox-group/checkbox-group.agent.ts","../../src/components/checkbox-group/checkbox-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CheckboxGroup. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CheckboxGroupHandle } from './checkbox-group';\n\nexport const checkboxGroupAgent: AgentAdapter<CheckboxGroupHandle> = {\n id: 'checkbox-group',\n capabilities: ['select_multiple'],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.checkboxGroup.state.selection',\n description: 'Values of currently-checked options.',\n read: (handle) => handle.getSelection(),\n },\n },\n actions: {\n set_selection: {\n safety: 'write',\n argsType: '{ ids: string[] }',\n descriptionKey: 'ui.agent.checkboxGroup.actions.setSelection',\n description:\n 'Replace the current selection with the given option values.',\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n clear_selection: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.checkboxGroup.actions.clearSelection',\n description: 'Uncheck every option in the group.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'checkbox-group',\n description: 'Marks the CheckboxGroup fieldset.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description:\n 'Stable opaque value emitted on each rendered Checkbox child within the group.',\n },\n },\n};\n","import {\n Children,\n forwardRef,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { CircleAlert } from 'lucide-react';\nimport { Checkbox } from '../checkbox/checkbox';\nimport {\n CheckboxGroupContext,\n type CheckboxGroupContextShape,\n} from '../checkbox/checkbox-group-context';\nimport { useAgentRegistration } from '../../agent';\nimport { checkboxGroupAgent } from './checkbox-group.agent';\n\n/** Agent-readiness curated handle for CheckboxGroup. */\nexport interface CheckboxGroupHandle {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n clearSelection: () => void;\n}\n\nconst checkboxGroupVariants = cva('', {\n variants: {\n orientation: {\n vertical: 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal:\n 'ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-lg)] ds:gap-y-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { orientation: 'vertical' },\n});\n\nexport interface CheckboxGroupOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps extends VariantProps<\n typeof checkboxGroupVariants\n> {\n label: string;\n value?: string[];\n onChange?: (value: string[]) => void;\n name?: string;\n /** Stable id, used to address this instance from the agent runtime. */\n id?: string;\n orientation?: 'vertical' | 'horizontal';\n disabled?: boolean;\n min?: number;\n max?: number;\n onConstraintViolation?: (type: 'min' | 'max') => void;\n withSelectAll?: boolean;\n options?: CheckboxGroupOption[];\n error?: string;\n helperText?: string;\n className?: string;\n children?: ReactNode;\n}\n\nfunction collectChildValues(children: ReactNode): string[] {\n const values: string[] = [];\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n const props = child.props as { value?: unknown };\n if (typeof props.value === 'string') values.push(props.value);\n });\n return values;\n}\n\nexport const CheckboxGroup = forwardRef<\n HTMLFieldSetElement,\n CheckboxGroupProps\n>(\n (\n {\n label,\n value: controlledValue,\n onChange,\n name,\n id,\n orientation = 'vertical',\n disabled = false,\n min,\n max,\n onConstraintViolation,\n withSelectAll = false,\n options,\n error,\n helperText,\n className,\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const baseId = useId();\n const helperId = `${baseId}-helper`;\n const errorId = `${baseId}-error`;\n const counterId = `${baseId}-counter`;\n\n const [currentValueRaw, setCurrentValue] = useControllableState<string[]>({\n value: controlledValue,\n defaultValue: [] as string[],\n onChange,\n });\n const currentValue = currentValueRaw ?? [];\n\n const valueSet = useMemo(() => new Set(currentValue), [currentValue]);\n\n const [violationMsg, setViolationMsg] = useState<string>('');\n\n const allValues = useMemo<string[]>(\n () =>\n options ? options.map((o) => o.value) : collectChildValues(children),\n [options, children],\n );\n\n const commit = (next: string[]): void => {\n setCurrentValue(next);\n };\n\n const currentValueRef = useRef<string[]>(currentValue);\n currentValueRef.current = currentValue;\n\n const agentHandle = useMemo<CheckboxGroupHandle>(\n () => ({\n getSelection: () => currentValueRef.current.slice(),\n setSelection: (ids) => commit(ids),\n clearSelection: () => commit([]),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [setCurrentValue],\n );\n useAgentRegistration(checkboxGroupAgent, agentHandle, id);\n\n const toggle = (itemValue: string): void => {\n if (valueSet.has(itemValue)) {\n if (typeof min === 'number' && currentValue.length <= min) {\n setViolationMsg(t('inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n setViolationMsg('');\n commit(currentValue.filter((v) => v !== itemValue));\n return;\n }\n if (typeof max === 'number' && currentValue.length >= max) {\n setViolationMsg(t('inputs.checkboxGroup.maxReached', { max }));\n onConstraintViolation?.('max');\n return;\n }\n setViolationMsg('');\n commit([...currentValue, itemValue]);\n };\n\n const ctxValue: CheckboxGroupContextShape = {\n name,\n value: valueSet,\n toggle,\n disabled,\n };\n\n const total = allValues.length;\n const count = currentValue.length;\n\n const parentChecked: boolean | 'indeterminate' =\n total === 0 || count === 0\n ? false\n : count >= total\n ? true\n : 'indeterminate';\n\n const handleSelectAll = (): void => {\n if (parentChecked === true) {\n if (typeof min === 'number' && min > 0) {\n setViolationMsg(t('inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n commit([]);\n setViolationMsg('');\n return;\n }\n const toCheck =\n typeof max === 'number' ? allValues.slice(0, max) : allValues;\n commit(toCheck);\n setViolationMsg('');\n };\n\n const describedBy =\n [\n helperText ? helperId : null,\n error ? errorId : null,\n total > 0 ? counterId : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const resolvedChildren =\n children ??\n (options\n ? options.map((opt) => (\n <Checkbox\n key={opt.value}\n value={opt.value}\n label={opt.label}\n disabled={opt.disabled}\n />\n ))\n : null);\n\n const fieldsetClasses = [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:min-w-0 ds:border-0 ds:p-0 ds:m-0',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <fieldset\n ref={ref}\n id={id}\n className={fieldsetClasses}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n data-component=\"checkbox-group\"\n data-component-id={id}\n >\n <legend className=\"type-label ds:text-foreground ds:p-0 ds:mb-[var(--spacing-sm)]\">\n {label}\n </legend>\n {withSelectAll ? (\n <Checkbox\n label={t('inputs.checkboxGroup.selectAll')}\n checked={parentChecked}\n onCheckedChange={handleSelectAll}\n disabled={disabled}\n />\n ) : null}\n <CheckboxGroupContext.Provider value={ctxValue}>\n <div className={checkboxGroupVariants({ orientation })}>\n {resolvedChildren}\n </div>\n </CheckboxGroupContext.Provider>\n {helperText ? (\n <p id={helperId} className=\"type-body-sm ds:text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n {error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <CircleAlert aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null}\n <span\n id={counterId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:sr-only\"\n >\n {total > 0 ? t('inputs.checkboxGroup.counter', { count, total }) : ''}\n </span>\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {violationMsg}\n </span>\n </fieldset>\n );\n },\n);\n\nCheckboxGroup.displayName = 'CheckboxGroup';\n"],"names":["checkboxGroupAgent","handle","args","checkboxGroupVariants","cva","collectChildValues","children","values","Children","child","isValidElement","props","CheckboxGroup","forwardRef","label","controlledValue","onChange","name","id","orientation","disabled","min","max","onConstraintViolation","withSelectAll","options","error","helperText","className","ref","t","useTranslation","baseId","useId","helperId","errorId","counterId","currentValueRaw","setCurrentValue","useControllableState","currentValue","valueSet","useMemo","violationMsg","setViolationMsg","useState","allValues","o","commit","next","currentValueRef","useRef","agentHandle","ids","useAgentRegistration","ctxValue","itemValue","v","total","count","parentChecked","handleSelectAll","toCheck","describedBy","resolvedChildren","opt","jsx","Checkbox","fieldsetClasses","jsxs","CheckboxGroupContext","CircleAlert"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checkbox-group-eGdv9fZc.js","sources":["../../src/components/checkbox-group/checkbox-group.agent.ts","../../src/components/checkbox-group/checkbox-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CheckboxGroup. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CheckboxGroupHandle } from './checkbox-group';\n\nexport const checkboxGroupAgent: AgentAdapter<CheckboxGroupHandle> = {\n id: 'checkbox-group',\n capabilities: ['select_multiple'],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.checkboxGroup.state.selection',\n description: 'Values of currently-checked options.',\n read: (handle) => handle.getSelection(),\n },\n },\n actions: {\n set_selection: {\n safety: 'write',\n argsType: '{ ids: string[] }',\n descriptionKey: 'ui.agent.checkboxGroup.actions.setSelection',\n description:\n 'Replace the current selection with the given option values.',\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n clear_selection: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.checkboxGroup.actions.clearSelection',\n description: 'Uncheck every option in the group.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'checkbox-group',\n description: 'Marks the CheckboxGroup fieldset.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description:\n 'Stable opaque value emitted on each rendered Checkbox child within the group.',\n },\n },\n};\n","import {\n Children,\n forwardRef,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { CircleAlert } from 'lucide-react';\nimport { Checkbox } from '../checkbox/checkbox';\nimport {\n CheckboxGroupContext,\n type CheckboxGroupContextShape,\n} from '../checkbox/checkbox-group-context';\nimport { useAgentRegistration } from '../../agent';\nimport { checkboxGroupAgent } from './checkbox-group.agent';\n\n/** Agent-readiness curated handle for CheckboxGroup. */\nexport interface CheckboxGroupHandle {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n clearSelection: () => void;\n}\n\nconst checkboxGroupVariants = cva('', {\n variants: {\n orientation: {\n vertical: 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal:\n 'ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-lg)] ds:gap-y-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { orientation: 'vertical' },\n});\n\nexport interface CheckboxGroupOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps extends VariantProps<\n typeof checkboxGroupVariants\n> {\n label: string;\n value?: string[];\n onChange?: (value: string[]) => void;\n name?: string;\n /** Stable id, used to address this instance from the agent runtime. */\n id?: string;\n orientation?: 'vertical' | 'horizontal';\n disabled?: boolean;\n min?: number;\n max?: number;\n onConstraintViolation?: (type: 'min' | 'max') => void;\n withSelectAll?: boolean;\n options?: CheckboxGroupOption[];\n error?: string;\n helperText?: string;\n className?: string;\n children?: ReactNode;\n}\n\nfunction collectChildValues(children: ReactNode): string[] {\n const values: string[] = [];\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n const props = child.props as { value?: unknown };\n if (typeof props.value === 'string') values.push(props.value);\n });\n return values;\n}\n\nexport const CheckboxGroup = forwardRef<\n HTMLFieldSetElement,\n CheckboxGroupProps\n>(\n (\n {\n label,\n value: controlledValue,\n onChange,\n name,\n id,\n orientation = 'vertical',\n disabled = false,\n min,\n max,\n onConstraintViolation,\n withSelectAll = false,\n options,\n error,\n helperText,\n className,\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const baseId = useId();\n const helperId = `${baseId}-helper`;\n const errorId = `${baseId}-error`;\n const counterId = `${baseId}-counter`;\n\n const [currentValueRaw, setCurrentValue] = useControllableState<string[]>({\n value: controlledValue,\n defaultValue: [] as string[],\n onChange,\n });\n const currentValue = currentValueRaw ?? [];\n\n const valueSet = useMemo(() => new Set(currentValue), [currentValue]);\n\n const [violationMsg, setViolationMsg] = useState<string>('');\n\n const allValues = useMemo<string[]>(\n () =>\n options ? options.map((o) => o.value) : collectChildValues(children),\n [options, children],\n );\n\n const commit = (next: string[]): void => {\n setCurrentValue(next);\n };\n\n const currentValueRef = useRef<string[]>(currentValue);\n currentValueRef.current = currentValue;\n\n const agentHandle = useMemo<CheckboxGroupHandle>(\n () => ({\n getSelection: () => currentValueRef.current.slice(),\n setSelection: (ids) => commit(ids),\n clearSelection: () => commit([]),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [setCurrentValue],\n );\n useAgentRegistration(checkboxGroupAgent, agentHandle, id);\n\n const toggle = (itemValue: string): void => {\n if (valueSet.has(itemValue)) {\n if (typeof min === 'number' && currentValue.length <= min) {\n setViolationMsg(t('inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n setViolationMsg('');\n commit(currentValue.filter((v) => v !== itemValue));\n return;\n }\n if (typeof max === 'number' && currentValue.length >= max) {\n setViolationMsg(t('inputs.checkboxGroup.maxReached', { max }));\n onConstraintViolation?.('max');\n return;\n }\n setViolationMsg('');\n commit([...currentValue, itemValue]);\n };\n\n const ctxValue: CheckboxGroupContextShape = {\n name,\n value: valueSet,\n toggle,\n disabled,\n };\n\n const total = allValues.length;\n const count = currentValue.length;\n\n const parentChecked: boolean | 'indeterminate' =\n total === 0 || count === 0\n ? false\n : count >= total\n ? true\n : 'indeterminate';\n\n const handleSelectAll = (): void => {\n if (parentChecked === true) {\n if (typeof min === 'number' && min > 0) {\n setViolationMsg(t('inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n commit([]);\n setViolationMsg('');\n return;\n }\n const toCheck =\n typeof max === 'number' ? allValues.slice(0, max) : allValues;\n commit(toCheck);\n setViolationMsg('');\n };\n\n const describedBy =\n [\n helperText ? helperId : null,\n error ? errorId : null,\n total > 0 ? counterId : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const resolvedChildren =\n children ??\n (options\n ? options.map((opt) => (\n <Checkbox\n key={opt.value}\n value={opt.value}\n label={opt.label}\n disabled={opt.disabled}\n />\n ))\n : null);\n\n const fieldsetClasses = [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:min-w-0 ds:border-0 ds:p-0 ds:m-0',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <fieldset\n ref={ref}\n id={id}\n className={fieldsetClasses}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n data-component=\"checkbox-group\"\n data-component-id={id}\n >\n <legend className=\"type-label ds:text-foreground ds:p-0 ds:mb-[var(--spacing-sm)]\">\n {label}\n </legend>\n {withSelectAll ? (\n <Checkbox\n label={t('inputs.checkboxGroup.selectAll')}\n checked={parentChecked}\n onCheckedChange={handleSelectAll}\n disabled={disabled}\n />\n ) : null}\n <CheckboxGroupContext.Provider value={ctxValue}>\n <div className={checkboxGroupVariants({ orientation })}>\n {resolvedChildren}\n </div>\n </CheckboxGroupContext.Provider>\n {helperText ? (\n <p id={helperId} className=\"type-body-sm ds:text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n {error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <CircleAlert aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null}\n <span\n id={counterId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:sr-only\"\n >\n {total > 0 ? t('inputs.checkboxGroup.counter', { count, total }) : ''}\n </span>\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {violationMsg}\n </span>\n </fieldset>\n );\n },\n);\n\nCheckboxGroup.displayName = 'CheckboxGroup';\n"],"names":["checkboxGroupAgent","handle","args","checkboxGroupVariants","cva","collectChildValues","children","values","Children","child","isValidElement","props","CheckboxGroup","forwardRef","label","controlledValue","onChange","name","id","orientation","disabled","min","max","onConstraintViolation","withSelectAll","options","error","helperText","className","ref","t","useTranslation","baseId","useId","helperId","errorId","counterId","currentValueRaw","setCurrentValue","useControllableState","currentValue","valueSet","useMemo","violationMsg","setViolationMsg","useState","allValues","o","commit","next","currentValueRef","useRef","agentHandle","ids","useAgentRegistration","ctxValue","itemValue","v","total","count","parentChecked","handleSelectAll","toCheck","describedBy","resolvedChildren","opt","jsx","Checkbox","fieldsetClasses","jsxs","CheckboxGroupContext","CircleAlert"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as p } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as G, useRef as d, useMemo as K, useCallback as m, useEffect as J } from "react";
|
|
3
3
|
import { useTranslation as O } from "react-i18next";
|
|
4
|
-
import { A as Q } from "./autocomplete-
|
|
4
|
+
import { A as Q } from "./autocomplete-BXMcNoa3.js";
|
|
5
5
|
import { T as X } from "./text-input-CaG9ApoE.js";
|
|
6
6
|
import { c as Y } from "./compose-refs-C0k0tdqF.js";
|
|
7
7
|
import { w as Z } from "./use-state-backed-input-DhRQo6gM.js";
|
|
@@ -182,4 +182,4 @@ export {
|
|
|
182
182
|
te as C,
|
|
183
183
|
ee as c
|
|
184
184
|
};
|
|
185
|
-
//# sourceMappingURL=city-input-
|
|
185
|
+
//# sourceMappingURL=city-input-CA59CjnV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"city-input-CJVGswxp.js","sources":["../../src/components/city-input/city-input.agent.ts","../../src/components/city-input/city-input.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\n\nexport interface CityInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n}\n\nexport const cityInputAgent: AgentAdapter<CityInputHandle> = {\n id: 'city-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.cityInput.state.value',\n description: 'Current city / town value.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.cityInput.state.isEmpty',\n description: 'Whether the field has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.cityInput.actions.setValue',\n description: 'Replace the city value.',\n examples: [\n { args: { value: 'Milano' }, note: 'Set the city to Milano.' },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.cityInput.actions.clear',\n description: 'Empty the field. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'city-input' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Autocomplete } from '../autocomplete/autocomplete';\nimport { TextInput } from '../text-input';\nimport type { OptionShape } from '../_shared/option';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { writeInputValue } from '../_shared/use-state-backed-input';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { cityInputAgent, type CityInputHandle } from './city-input.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A city / town field with an OPTIONAL geocoder-agnostic suggestion */\n/* seam. When `loadCities` is supplied the field is an async */\n/* Autocomplete; when it isn't, it degrades to a plain labelled text */\n/* input. The kit imports NO geocoder — the consumer owns the data */\n/* source (Google Places, Mapbox, a server endpoint, …). */\n/* ------------------------------------------------------------------ */\n\nexport interface CityLoaderContext {\n signal: AbortSignal;\n locale: string;\n /** Selected country (lowercase alpha-2), passed through to bias results. */\n country?: string;\n /** Selected province/region code, passed through to bias results. */\n province?: string;\n}\n\nexport interface CityInputProps {\n /** City / town name (free text). */\n value?: string;\n defaultValue?: string;\n onValueChange?: (city: string) => void;\n /**\n * Optional async suggestion source. Omit → the field is a plain text\n * input with no suggestions. The kit never imports a geocoder; wire your\n * own here.\n */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Fires when a suggestion is picked, with the full option. */\n onCitySelect?: (option: OptionShape) => void;\n /** Passed through to `loadCities` to bias suggestions. */\n country?: string;\n /** Passed through to `loadCities` to bias suggestions. */\n province?: string;\n /** Frequently-picked cities surfaced before the user types. */\n recents?: OptionShape[];\n debounceMs?: number;\n /** Snap the value back to the last picked suggestion on blur. */\n snapOnBlur?: boolean;\n placeholder?: string;\n /** Clear button — text-fallback mode only. */\n clearable?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n /**\n * Accessible name. Not needed inside a `<FormField>`: the field's label\n * names the input in both modes. Pass it when there is no FormField.\n */\n 'aria-label'?: string;\n /** Invalid-state fallback for use outside a `<FormField>` (inline editors). */\n 'aria-invalid'?: boolean;\n /** Error-message id fallback for use outside a `<FormField>`. */\n 'aria-describedby'?: string;\n className?: string;\n}\n\nexport const CityInput = forwardRef<HTMLInputElement, CityInputProps>(\n function CityInput(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n loadCities,\n onCitySelect,\n country,\n province,\n recents,\n debounceMs,\n snapOnBlur,\n placeholder,\n clearable,\n disabled,\n readOnly,\n required,\n name,\n id,\n size = 'md',\n tone = 'default',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n // No loader and no host `value`: TextInput stays uncontrolled, keeping\n // the city out of the `value` attribute. Other changes go through the\n // input as typing would, so TextInput's clear button stays in step.\n const plainUncontrolled = !loadCities && valueProp === undefined;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = useMemo(() => composeRefs(ref, inputRef), [ref]);\n const writeThrough = useCallback(\n (next: string) => writeInputValue(inputRef.current, next),\n [],\n );\n const commit = useCallback(\n (next: string) => {\n if (plainUncontrolled && writeThrough(next)) return;\n setValue(next);\n },\n [plainUncontrolled, setValue, writeThrough],\n );\n\n // Back from suggestion mode, the plain input mounts with the host's\n // defaultValue: show the current city. Typing keeps them in step after.\n // Not on the first mount, where the input already shows defaultValue\n // and a host's ref may have written to it since.\n const wasPlainRef = useRef(plainUncontrolled);\n useIsomorphicLayoutEffect(() => {\n if (plainUncontrolled && !wasPlainRef.current) writeThrough(value ?? '');\n wasPlainRef.current = plainUncontrolled;\n }, [plainUncontrolled]);\n\n const valueRef = useRef(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const agentHandle = useMemo<CityInputHandle>(\n () => ({\n getValue: () => valueRef.current ?? '',\n setValue: (next) => commit(next),\n clear: () => commit(''),\n }),\n [commit],\n );\n useAgentRegistration(cityInputAgent, agentHandle, id);\n\n const loadOptions = useCallback(\n (query: string, opts: { signal: AbortSignal; locale: string }) =>\n loadCities\n ? loadCities(query, { ...opts, country, province })\n : Promise.resolve<OptionShape[]>([]),\n [loadCities, country, province],\n );\n\n const resolvedPlaceholder =\n placeholder ?? t('inputs.cityInput.placeholder', 'City');\n\n return (\n <div\n data-component=\"city-input\"\n data-component-id={id}\n className={['ds:w-full', className].filter(Boolean).join(' ')}\n >\n {loadCities ? (\n <Autocomplete\n ref={ref}\n loadOptions={loadOptions}\n value={value ?? ''}\n onChange={setValue}\n onSelect={onCitySelect}\n recents={recents}\n debounceMs={debounceMs}\n snapOnBlur={snapOnBlur}\n autoComplete=\"address-level2\"\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n name={name}\n id={id}\n size={size}\n tone={tone}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n ) : (\n <TextInput\n ref={composedRef}\n {...(plainUncontrolled ? { defaultValue } : { value: value ?? '' })}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setValue(event.target.value)\n }\n onClear={() => setValue('')}\n autoComplete=\"address-level2\"\n placeholder={resolvedPlaceholder}\n clearable={clearable}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n name={name}\n id={id}\n size={size}\n tone={tone}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n )}\n </div>\n );\n },\n);\n\nCityInput.displayName = 'CityInput';\n"],"names":["cityInputAgent","handle","args","CityInput","forwardRef","valueProp","defaultValue","onValueChange","loadCities","onCitySelect","country","province","recents","debounceMs","snapOnBlur","placeholder","clearable","disabled","readOnly","required","name","id","size","tone","ariaLabel","ariaInvalid","ariaDescribedBy","className","ref","t","useTranslation","value","setValue","useControllableState","plainUncontrolled","inputRef","useRef","composedRef","useMemo","composeRefs","writeThrough","useCallback","next","writeInputValue","commit","wasPlainRef","useIsomorphicLayoutEffect","valueRef","useEffect","agentHandle","useAgentRegistration","loadOptions","query","opts","resolvedPlaceholder","jsx","Autocomplete","TextInput","event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"city-input-CA59CjnV.js","sources":["../../src/components/city-input/city-input.agent.ts","../../src/components/city-input/city-input.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\n\nexport interface CityInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n}\n\nexport const cityInputAgent: AgentAdapter<CityInputHandle> = {\n id: 'city-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.cityInput.state.value',\n description: 'Current city / town value.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.cityInput.state.isEmpty',\n description: 'Whether the field has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.cityInput.actions.setValue',\n description: 'Replace the city value.',\n examples: [\n { args: { value: 'Milano' }, note: 'Set the city to Milano.' },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.cityInput.actions.clear',\n description: 'Empty the field. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'city-input' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Autocomplete } from '../autocomplete/autocomplete';\nimport { TextInput } from '../text-input';\nimport type { OptionShape } from '../_shared/option';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { writeInputValue } from '../_shared/use-state-backed-input';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { cityInputAgent, type CityInputHandle } from './city-input.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A city / town field with an OPTIONAL geocoder-agnostic suggestion */\n/* seam. When `loadCities` is supplied the field is an async */\n/* Autocomplete; when it isn't, it degrades to a plain labelled text */\n/* input. The kit imports NO geocoder — the consumer owns the data */\n/* source (Google Places, Mapbox, a server endpoint, …). */\n/* ------------------------------------------------------------------ */\n\nexport interface CityLoaderContext {\n signal: AbortSignal;\n locale: string;\n /** Selected country (lowercase alpha-2), passed through to bias results. */\n country?: string;\n /** Selected province/region code, passed through to bias results. */\n province?: string;\n}\n\nexport interface CityInputProps {\n /** City / town name (free text). */\n value?: string;\n defaultValue?: string;\n onValueChange?: (city: string) => void;\n /**\n * Optional async suggestion source. Omit → the field is a plain text\n * input with no suggestions. The kit never imports a geocoder; wire your\n * own here.\n */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Fires when a suggestion is picked, with the full option. */\n onCitySelect?: (option: OptionShape) => void;\n /** Passed through to `loadCities` to bias suggestions. */\n country?: string;\n /** Passed through to `loadCities` to bias suggestions. */\n province?: string;\n /** Frequently-picked cities surfaced before the user types. */\n recents?: OptionShape[];\n debounceMs?: number;\n /** Snap the value back to the last picked suggestion on blur. */\n snapOnBlur?: boolean;\n placeholder?: string;\n /** Clear button — text-fallback mode only. */\n clearable?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n /**\n * Accessible name. Not needed inside a `<FormField>`: the field's label\n * names the input in both modes. Pass it when there is no FormField.\n */\n 'aria-label'?: string;\n /** Invalid-state fallback for use outside a `<FormField>` (inline editors). */\n 'aria-invalid'?: boolean;\n /** Error-message id fallback for use outside a `<FormField>`. */\n 'aria-describedby'?: string;\n className?: string;\n}\n\nexport const CityInput = forwardRef<HTMLInputElement, CityInputProps>(\n function CityInput(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n loadCities,\n onCitySelect,\n country,\n province,\n recents,\n debounceMs,\n snapOnBlur,\n placeholder,\n clearable,\n disabled,\n readOnly,\n required,\n name,\n id,\n size = 'md',\n tone = 'default',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n // No loader and no host `value`: TextInput stays uncontrolled, keeping\n // the city out of the `value` attribute. Other changes go through the\n // input as typing would, so TextInput's clear button stays in step.\n const plainUncontrolled = !loadCities && valueProp === undefined;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = useMemo(() => composeRefs(ref, inputRef), [ref]);\n const writeThrough = useCallback(\n (next: string) => writeInputValue(inputRef.current, next),\n [],\n );\n const commit = useCallback(\n (next: string) => {\n if (plainUncontrolled && writeThrough(next)) return;\n setValue(next);\n },\n [plainUncontrolled, setValue, writeThrough],\n );\n\n // Back from suggestion mode, the plain input mounts with the host's\n // defaultValue: show the current city. Typing keeps them in step after.\n // Not on the first mount, where the input already shows defaultValue\n // and a host's ref may have written to it since.\n const wasPlainRef = useRef(plainUncontrolled);\n useIsomorphicLayoutEffect(() => {\n if (plainUncontrolled && !wasPlainRef.current) writeThrough(value ?? '');\n wasPlainRef.current = plainUncontrolled;\n }, [plainUncontrolled]);\n\n const valueRef = useRef(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const agentHandle = useMemo<CityInputHandle>(\n () => ({\n getValue: () => valueRef.current ?? '',\n setValue: (next) => commit(next),\n clear: () => commit(''),\n }),\n [commit],\n );\n useAgentRegistration(cityInputAgent, agentHandle, id);\n\n const loadOptions = useCallback(\n (query: string, opts: { signal: AbortSignal; locale: string }) =>\n loadCities\n ? loadCities(query, { ...opts, country, province })\n : Promise.resolve<OptionShape[]>([]),\n [loadCities, country, province],\n );\n\n const resolvedPlaceholder =\n placeholder ?? t('inputs.cityInput.placeholder', 'City');\n\n return (\n <div\n data-component=\"city-input\"\n data-component-id={id}\n className={['ds:w-full', className].filter(Boolean).join(' ')}\n >\n {loadCities ? (\n <Autocomplete\n ref={ref}\n loadOptions={loadOptions}\n value={value ?? ''}\n onChange={setValue}\n onSelect={onCitySelect}\n recents={recents}\n debounceMs={debounceMs}\n snapOnBlur={snapOnBlur}\n autoComplete=\"address-level2\"\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n name={name}\n id={id}\n size={size}\n tone={tone}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n ) : (\n <TextInput\n ref={composedRef}\n {...(plainUncontrolled ? { defaultValue } : { value: value ?? '' })}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setValue(event.target.value)\n }\n onClear={() => setValue('')}\n autoComplete=\"address-level2\"\n placeholder={resolvedPlaceholder}\n clearable={clearable}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n name={name}\n id={id}\n size={size}\n tone={tone}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n )}\n </div>\n );\n },\n);\n\nCityInput.displayName = 'CityInput';\n"],"names":["cityInputAgent","handle","args","CityInput","forwardRef","valueProp","defaultValue","onValueChange","loadCities","onCitySelect","country","province","recents","debounceMs","snapOnBlur","placeholder","clearable","disabled","readOnly","required","name","id","size","tone","ariaLabel","ariaInvalid","ariaDescribedBy","className","ref","t","useTranslation","value","setValue","useControllableState","plainUncontrolled","inputRef","useRef","composedRef","useMemo","composeRefs","writeThrough","useCallback","next","writeInputValue","commit","wasPlainRef","useIsomorphicLayoutEffect","valueRef","useEffect","agentHandle","useAgentRegistration","loadOptions","query","opts","resolvedPlaceholder","jsx","Autocomplete","TextInput","event"],"mappings":"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"}
|