@alfadocs/ui-kit 1.81.0 → 1.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{anamnesis-summary-rows-BYtpwCyn.js → anamnesis-summary-rows-6gMuu0ZK.js} +2 -2
- package/dist/_chunks/{balance-badge-cell-NoEPeFdj.js → balance-badge-cell-BHXJS8Ga.js} +2 -2
- package/dist/_chunks/booking-dsgiuhKg.js +4304 -0
- package/dist/_chunks/{link-cell-renderer-Dwp_DCYT.js → link-cell-renderer-C0ynDik7.js} +2 -2
- package/dist/_chunks/login-dev-card-DYwbL5sD.js +385 -0
- package/dist/_chunks/{multi-select-IOVnOGlP.js → multi-select-i5MFRpXg.js} +153 -146
- package/dist/_chunks/{otp-input-BgEZi0py.js → otp-input-gV1446Dw.js} +70 -70
- package/dist/_chunks/{registration-form-e9oYscB7.js → registration-form-DmP3YUfp.js} +2 -2
- package/dist/agent-catalog.json +5 -5
- package/dist/agent-i18n/en.json +2 -2
- package/dist/components/booking/booking-types.d.ts +35 -2
- package/dist/components/booking/code-step.d.ts +4 -2
- package/dist/components/booking/details-form.d.ts +2 -0
- package/dist/components/booking/handover.d.ts +12 -0
- package/dist/components/booking/index.js +1 -1
- package/dist/components/booking/reserved.d.ts +24 -0
- package/dist/components/booking/use-booking-payment.d.ts +3 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/otp-input/otp-input.d.ts +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +8 -0
- package/dist/i18n/locales/ar.js +8 -0
- package/dist/i18n/locales/de.d.ts +8 -0
- package/dist/i18n/locales/de.js +8 -0
- package/dist/i18n/locales/el.d.ts +8 -0
- package/dist/i18n/locales/el.js +8 -0
- package/dist/i18n/locales/en.d.ts +8 -0
- package/dist/i18n/locales/en.js +8 -0
- package/dist/i18n/locales/es.d.ts +8 -0
- package/dist/i18n/locales/es.js +8 -0
- package/dist/i18n/locales/fr.d.ts +8 -0
- package/dist/i18n/locales/fr.js +8 -0
- package/dist/i18n/locales/hi.d.ts +8 -0
- package/dist/i18n/locales/hi.js +8 -0
- package/dist/i18n/locales/it.d.ts +8 -0
- package/dist/i18n/locales/it.js +8 -0
- package/dist/i18n/locales/ja.d.ts +8 -0
- package/dist/i18n/locales/ja.js +8 -0
- package/dist/i18n/locales/nl.d.ts +8 -0
- package/dist/i18n/locales/nl.js +8 -0
- package/dist/i18n/locales/pl.d.ts +8 -0
- package/dist/i18n/locales/pl.js +8 -0
- package/dist/i18n/locales/pt.d.ts +8 -0
- package/dist/i18n/locales/pt.js +8 -0
- package/dist/i18n/locales/ro.d.ts +8 -0
- package/dist/i18n/locales/ro.js +8 -0
- package/dist/i18n/locales/ru.d.ts +8 -0
- package/dist/i18n/locales/ru.js +8 -0
- package/dist/i18n/locales/sq.d.ts +8 -0
- package/dist/i18n/locales/sq.js +8 -0
- package/dist/i18n/locales/sv.d.ts +8 -0
- package/dist/i18n/locales/sv.js +8 -0
- package/dist/i18n/locales/tr.d.ts +8 -0
- package/dist/i18n/locales/tr.js +8 -0
- package/dist/i18n/locales/zh.d.ts +8 -0
- package/dist/i18n/locales/zh.js +8 -0
- package/dist/index.js +8 -8
- package/dist/locales/ar.json +8 -0
- package/dist/locales/de.json +8 -0
- package/dist/locales/el.json +8 -0
- package/dist/locales/en.json +8 -0
- package/dist/locales/es.json +8 -0
- package/dist/locales/fr.json +8 -0
- package/dist/locales/hi.json +8 -0
- package/dist/locales/it.json +8 -0
- package/dist/locales/ja.json +8 -0
- package/dist/locales/nl.json +8 -0
- package/dist/locales/pl.json +8 -0
- package/dist/locales/pt.json +8 -0
- package/dist/locales/ro.json +8 -0
- package/dist/locales/ru.json +8 -0
- package/dist/locales/sq.json +8 -0
- package/dist/locales/sv.json +8 -0
- package/dist/locales/tr.json +8 -0
- package/dist/locales/zh.json +8 -0
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/login-form/login-form.d.ts +7 -0
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/booking-CxrB0e6d.js +0 -4079
- package/dist/_chunks/login-dev-card-CvLHj-_N.js +0 -353
|
@@ -46,8 +46,8 @@ const he = {
|
|
|
46
46
|
examples: [{ args: { value: "123456" } }],
|
|
47
47
|
descriptionKey: "ui.agent.otpInput.actions.setValue",
|
|
48
48
|
description: "Replace the entered digits.",
|
|
49
|
-
invoke: (a,
|
|
50
|
-
a.setValue(
|
|
49
|
+
invoke: (a, o) => {
|
|
50
|
+
a.setValue(o.value);
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
53
|
clear: {
|
|
@@ -103,18 +103,18 @@ const he = {
|
|
|
103
103
|
}
|
|
104
104
|
);
|
|
105
105
|
function z(a) {
|
|
106
|
-
return a.replace(/[\u0660-\u0669]/g, (
|
|
106
|
+
return a.replace(/[\u0660-\u0669]/g, (o) => String(o.charCodeAt(0) - 1632)).replace(/[\u06F0-\u06F9]/g, (o) => String(o.charCodeAt(0) - 1776));
|
|
107
107
|
}
|
|
108
108
|
const ye = 3, we = 10;
|
|
109
109
|
function Ie(a) {
|
|
110
|
-
const
|
|
111
|
-
return Math.max(ye, Math.min(we,
|
|
110
|
+
const o = Number.isFinite(a) ? Math.floor(a) : 6;
|
|
111
|
+
return Math.max(ye, Math.min(we, o));
|
|
112
112
|
}
|
|
113
|
-
function k(a,
|
|
114
|
-
return (g === "alphanumeric" ? a.replace(/[^A-Za-z0-9]/g, "").toUpperCase() : z(a).replace(/\D/g, "")).slice(0,
|
|
113
|
+
function k(a, o, g) {
|
|
114
|
+
return (g === "alphanumeric" ? a.replace(/[^A-Za-z0-9]/g, "").toUpperCase() : z(a).replace(/\D/g, "")).slice(0, o);
|
|
115
115
|
}
|
|
116
|
-
function ke(a,
|
|
117
|
-
const p = k(a,
|
|
116
|
+
function ke(a, o, g) {
|
|
117
|
+
const p = k(a, o, g), d = new Array(o).fill("");
|
|
118
118
|
for (let m = 0; m < p.length; m += 1)
|
|
119
119
|
d[m] = p[m];
|
|
120
120
|
return d;
|
|
@@ -122,7 +122,7 @@ function ke(a, n, g) {
|
|
|
122
122
|
const Ve = se(
|
|
123
123
|
({
|
|
124
124
|
length: a = 6,
|
|
125
|
-
value:
|
|
125
|
+
value: o,
|
|
126
126
|
defaultValue: g,
|
|
127
127
|
onChange: p,
|
|
128
128
|
onComplete: d,
|
|
@@ -137,29 +137,29 @@ const Ve = se(
|
|
|
137
137
|
mode: i = "numeric"
|
|
138
138
|
}, q) => {
|
|
139
139
|
const { t: x } = ue("ui"), r = Ie(a), v = fe(), G = ne(), B = V ? G : void 0, [W, H] = pe({
|
|
140
|
-
value:
|
|
140
|
+
value: o,
|
|
141
141
|
defaultValue: k(g ?? "", r, i)
|
|
142
142
|
}), h = k(W ?? "", r, i), X = ke(h, r, i), y = v.disabled || !!m, O = v.invalid || !!$, J = O ? "error" : "default", P = R([]), D = R(h.length === r), f = R(h);
|
|
143
143
|
f.current = h;
|
|
144
144
|
const Q = () => {
|
|
145
|
-
const
|
|
146
|
-
return
|
|
145
|
+
const e = h.length;
|
|
146
|
+
return e >= r ? r - 1 : e;
|
|
147
147
|
}, [b, A] = oe(Q);
|
|
148
148
|
ie(() => {
|
|
149
149
|
b >= r && A(r - 1);
|
|
150
150
|
}, [b, r]);
|
|
151
151
|
const l = S(
|
|
152
|
-
(t) => {
|
|
153
|
-
const
|
|
154
|
-
A(
|
|
155
|
-
const s = P.current[
|
|
156
|
-
s && (s.focus(), s.select());
|
|
152
|
+
(e, t) => {
|
|
153
|
+
const n = Math.max(0, Math.min(r - 1, e));
|
|
154
|
+
A(n);
|
|
155
|
+
const s = P.current[n];
|
|
156
|
+
s && (s.focus(t), s.select());
|
|
157
157
|
},
|
|
158
158
|
[r]
|
|
159
159
|
), u = S(
|
|
160
|
-
(
|
|
161
|
-
const
|
|
162
|
-
H(
|
|
160
|
+
(e) => {
|
|
161
|
+
const t = k(e, r, i);
|
|
162
|
+
H(t), f.current = t, p == null || p(t), t.length === r ? D.current || (D.current = !0, d == null || d(t)) : D.current = !1;
|
|
163
163
|
},
|
|
164
164
|
[H, r, i, p, d]
|
|
165
165
|
);
|
|
@@ -167,67 +167,67 @@ const Ve = se(
|
|
|
167
167
|
enabled: U && !y,
|
|
168
168
|
onCode: u
|
|
169
169
|
});
|
|
170
|
-
const Y = (
|
|
171
|
-
const
|
|
172
|
-
if (
|
|
173
|
-
if (
|
|
174
|
-
const N = c.slice(0,
|
|
170
|
+
const Y = (e) => (t) => {
|
|
171
|
+
const n = t.target.value, s = i === "alphanumeric" ? n.replace(/[^A-Za-z0-9]/g, "").toUpperCase() : z(n).replace(/\D/g, ""), c = f.current;
|
|
172
|
+
if (s.length === 0) {
|
|
173
|
+
if (n === "" && e < c.length) {
|
|
174
|
+
const N = c.slice(0, e) + c.slice(e + 1);
|
|
175
175
|
u(N);
|
|
176
176
|
}
|
|
177
177
|
return;
|
|
178
178
|
}
|
|
179
|
-
const w = c.slice(0,
|
|
179
|
+
const w = c.slice(0, e), C = c.slice(e + s.length), F = (w + s + C).slice(0, r);
|
|
180
180
|
u(F);
|
|
181
|
-
const L = Math.min(
|
|
181
|
+
const L = Math.min(e + s.length, r - 1);
|
|
182
182
|
l(L);
|
|
183
|
-
}, ee = (
|
|
184
|
-
const
|
|
185
|
-
if (
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
u(
|
|
183
|
+
}, ee = (e) => (t) => {
|
|
184
|
+
const n = f.current;
|
|
185
|
+
if (t.key === "Backspace") {
|
|
186
|
+
if (n[e]) {
|
|
187
|
+
t.preventDefault();
|
|
188
|
+
const s = n.slice(0, e) + n.slice(e + 1);
|
|
189
|
+
u(s);
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
|
-
if (
|
|
193
|
-
|
|
194
|
-
const
|
|
195
|
-
u(
|
|
192
|
+
if (e > 0) {
|
|
193
|
+
t.preventDefault();
|
|
194
|
+
const s = n.slice(0, e - 1) + n.slice(e);
|
|
195
|
+
u(s), l(e - 1);
|
|
196
196
|
}
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
|
-
if (
|
|
200
|
-
|
|
199
|
+
if (t.key === "ArrowLeft") {
|
|
200
|
+
t.preventDefault(), e > 0 && l(e - 1);
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
-
if (
|
|
204
|
-
|
|
203
|
+
if (t.key === "ArrowRight") {
|
|
204
|
+
t.preventDefault(), e < r - 1 && l(e + 1);
|
|
205
205
|
return;
|
|
206
206
|
}
|
|
207
|
-
if (
|
|
208
|
-
|
|
207
|
+
if (t.key === "Home") {
|
|
208
|
+
t.preventDefault(), l(0);
|
|
209
209
|
return;
|
|
210
210
|
}
|
|
211
|
-
|
|
212
|
-
}, te = (
|
|
213
|
-
const
|
|
211
|
+
t.key === "End" && (t.preventDefault(), l(r - 1));
|
|
212
|
+
}, te = (e) => (t) => {
|
|
213
|
+
const s = t.clipboardData.getData("text").replace(/\s+/g, ""), c = i === "alphanumeric" ? s.replace(/[^A-Za-z0-9]/g, "").toUpperCase() : z(s);
|
|
214
214
|
if (i === "alphanumeric" ? c.length === 0 : !/^[0-9]+$/.test(c))
|
|
215
215
|
return;
|
|
216
|
-
|
|
217
|
-
const w = f.current, C = w.slice(0,
|
|
216
|
+
t.preventDefault();
|
|
217
|
+
const w = f.current, C = w.slice(0, e), F = w.slice(e + c.length), L = (C + c + F).slice(0, r);
|
|
218
218
|
u(L);
|
|
219
|
-
const N = Math.min(
|
|
219
|
+
const N = Math.min(e + c.length, r - 1);
|
|
220
220
|
l(N);
|
|
221
|
-
}, re = (
|
|
222
|
-
A(
|
|
221
|
+
}, re = (e) => (t) => {
|
|
222
|
+
A(e), t.currentTarget.select();
|
|
223
223
|
}, T = v.id;
|
|
224
224
|
ge(v, `${T}-0`);
|
|
225
225
|
const M = ce(
|
|
226
226
|
() => ({
|
|
227
227
|
getValue: () => f.current,
|
|
228
|
-
setValue: (
|
|
228
|
+
setValue: (e) => u(e),
|
|
229
229
|
clear: () => u(""),
|
|
230
|
-
focus: () => l(b),
|
|
230
|
+
focus: (e) => l(b, e),
|
|
231
231
|
isComplete: () => f.current.length === r
|
|
232
232
|
}),
|
|
233
233
|
[u, l, b, r]
|
|
@@ -254,38 +254,38 @@ const Ve = se(
|
|
|
254
254
|
"data-component": "otp-input",
|
|
255
255
|
"data-component-id": E,
|
|
256
256
|
className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]",
|
|
257
|
-
children: X.map((
|
|
258
|
-
const
|
|
257
|
+
children: X.map((e, t) => {
|
|
258
|
+
const n = !y && t === b;
|
|
259
259
|
return /* @__PURE__ */ I(
|
|
260
260
|
"input",
|
|
261
261
|
{
|
|
262
|
-
ref: (
|
|
263
|
-
P.current[
|
|
262
|
+
ref: (s) => {
|
|
263
|
+
P.current[t] = s;
|
|
264
264
|
},
|
|
265
|
-
id: `${T}-${
|
|
265
|
+
id: `${T}-${t}`,
|
|
266
266
|
type: "text",
|
|
267
267
|
inputMode: i === "alphanumeric" ? "text" : "numeric",
|
|
268
268
|
pattern: i === "alphanumeric" ? "[A-Za-z0-9]*" : "[0-9]*",
|
|
269
269
|
autoCapitalize: i === "alphanumeric" ? "characters" : void 0,
|
|
270
|
-
autoComplete:
|
|
270
|
+
autoComplete: t === 0 ? "one-time-code" : "off",
|
|
271
271
|
maxLength: 1,
|
|
272
|
-
value:
|
|
272
|
+
value: e,
|
|
273
273
|
disabled: y,
|
|
274
|
-
tabIndex:
|
|
274
|
+
tabIndex: n ? 0 : -1,
|
|
275
275
|
"aria-label": x(
|
|
276
276
|
i === "alphanumeric" ? "inputs.otp.charLabel" : "inputs.otp.digitLabel",
|
|
277
277
|
{
|
|
278
|
-
current:
|
|
278
|
+
current: t + 1,
|
|
279
279
|
total: r
|
|
280
280
|
}
|
|
281
281
|
),
|
|
282
|
-
onChange: Y(
|
|
283
|
-
onKeyDown: ee(
|
|
284
|
-
onPaste: te(
|
|
285
|
-
onFocus: re(
|
|
282
|
+
onChange: Y(t),
|
|
283
|
+
onKeyDown: ee(t),
|
|
284
|
+
onPaste: te(t),
|
|
285
|
+
onFocus: re(t),
|
|
286
286
|
className: be({ tone: J })
|
|
287
287
|
},
|
|
288
|
-
|
|
288
|
+
t
|
|
289
289
|
);
|
|
290
290
|
})
|
|
291
291
|
}
|
|
@@ -298,4 +298,4 @@ Ve.displayName = "OTPInput";
|
|
|
298
298
|
export {
|
|
299
299
|
Ve as O
|
|
300
300
|
};
|
|
301
|
-
//# sourceMappingURL=otp-input-
|
|
301
|
+
//# sourceMappingURL=otp-input-gV1446Dw.js.map
|
|
@@ -24,7 +24,7 @@ import { a as Vr, i as qn } from "./safe-href-5dbsfbQn.js";
|
|
|
24
24
|
import { u as Or } from "./use-field-match-C8ug3sdQ.js";
|
|
25
25
|
import { B as Tn } from "./brand-mark-DLk9kD8g.js";
|
|
26
26
|
import { u as Dn, b as Bn, a as On } from "./use-registration-submit-CLGHxwoT.js";
|
|
27
|
-
import { O as Mn } from "./otp-input-
|
|
27
|
+
import { O as Mn } from "./otp-input-gV1446Dw.js";
|
|
28
28
|
import { C as _n } from "./circle-check-BN6rz4NV.js";
|
|
29
29
|
import { P as en } from "./pencil-B1sKKyuT.js";
|
|
30
30
|
import { L as jn } from "./log-in-OQUEoGhX.js";
|
|
@@ -1334,4 +1334,4 @@ export {
|
|
|
1334
1334
|
Gr as R,
|
|
1335
1335
|
cs as a
|
|
1336
1336
|
};
|
|
1337
|
-
//# sourceMappingURL=registration-form-
|
|
1337
|
+
//# sourceMappingURL=registration-form-DmP3YUfp.js.map
|
package/dist/agent-catalog.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"packageVersion": "1.
|
|
3
|
+
"packageVersion": "1.83.0",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"kind": "component",
|
|
@@ -1449,7 +1449,7 @@
|
|
|
1449
1449
|
{
|
|
1450
1450
|
"name": "currentStep",
|
|
1451
1451
|
"type": "number",
|
|
1452
|
-
"description": "The step the flow is on: 1 insurance, 2 specialty, 3 service, 4 provider, 5 date, 6 time, 7 patient details, payment or optional SMS code verification, 8 confirmation after all required steps succeed. Read this back after `goto_step` to see where the clamp landed.",
|
|
1452
|
+
"description": "The step the flow is on: 1 insurance, 2 specialty, 3 service, 4 provider, 5 date, 6 time, 7 patient details, payment or optional SMS code verification, 8 confirmation after all required steps succeed, including the \"Time reserved\" view that opens a host address after a short delay. Read this back after `goto_step` to see where the clamp landed.",
|
|
1453
1453
|
"descriptionKey": "ui.agent.booking.state.currentStep"
|
|
1454
1454
|
}
|
|
1455
1455
|
],
|
|
@@ -1460,7 +1460,7 @@
|
|
|
1460
1460
|
"idempotent": true,
|
|
1461
1461
|
"errors": [
|
|
1462
1462
|
"Refused while a payment session is open (step 7): the consumer must cancel the hold first.",
|
|
1463
|
-
"Refused while SMS code verification is pending (step 7): the submitted booking remains active. The host owns cancellation."
|
|
1463
|
+
"Refused while SMS code verification is pending (step 7): the locked form and code box stay, and the submitted booking remains active. The host owns cancellation."
|
|
1464
1464
|
],
|
|
1465
1465
|
"description": "Clear the booking value back to an empty state. Use to abandon an in-progress flow.",
|
|
1466
1466
|
"descriptionKey": "ui.agent.booking.actions.reset"
|
|
@@ -1512,7 +1512,7 @@
|
|
|
1512
1512
|
"root": {
|
|
1513
1513
|
"attr": "data-component",
|
|
1514
1514
|
"value": "booking",
|
|
1515
|
-
"description": "Marks the Booking root region. The host prop hideEmail (boolean, default false) hides the email field, skips its validation and omits email from submission. The host prop emailOptional (boolean, default false) keeps email visible and optional unless used for confirmation. Email is marked and validated as required when selected in the channel picker or singleConfirmationChannel radio, or when the effective confirmation channel is email. With a hidden picker, the form and success screen use the sole enabled channel, or email when multiple channels are enabled. This includes payment and blocked-payment flows, which omit stored selections from submission. Omitting confirmationChannels also defaults to email. Selecting SMS without email makes the field optional again. The optional/required marker updates visually when the channel changes, with no announcement of that change. Validation updates immediately using the existing email error. With emailOptional, surrounding spaces are trimmed before validation, even when email is required for confirmation. Optional blank values are omitted from submission; filled values are sent trimmed. hideEmail takes precedence over emailOptional. Neither prop changes confirmation channels; pair with confirmationChannels [\"sms\"] for SMS-only confirmation with no channel picker. The optional codeStep prop adds SMS verification after submission and payment; the step remains 7 until verification succeeds
|
|
1515
|
+
"description": "Marks the Booking root region. The host prop hideEmail (boolean, default false) hides the email field, skips its validation and omits email from submission. The host prop emailOptional (boolean, default false) keeps email visible and optional unless used for confirmation. Email is marked and validated as required when selected in the channel picker or singleConfirmationChannel radio, or when the effective confirmation channel is email. With a hidden picker, the form and success screen use the sole enabled channel, or email when multiple channels are enabled. This includes payment and blocked-payment flows, which omit stored selections from submission. Omitting confirmationChannels also defaults to email. Selecting SMS without email makes the field optional again. The optional/required marker updates visually when the channel changes, with no announcement of that change. Validation updates immediately using the existing email error. With emailOptional, surrounding spaces are trimmed before validation, even when email is required for confirmation. Optional blank values are omitted from submission; filled values are sent trimmed. hideEmail takes precedence over emailOptional. Neither prop changes confirmation channels; pair with confirmationChannels [\"sms\"] for SMS-only confirmation with no channel picker. The optional codeStep prop adds SMS verification after submission and before any payment: the submitted form stays in place but locked (controls disabled, text still readable, not hidden), the code box opens below it, and a Change button, for the patient only (no agent action unlocks it), unlocks the form for a new booking request (the host keeps the earlier request until it expires; the kit cannot cancel it). With payment, a correct code opens the payment stage, and the step remains 7 until payment succeeds; without payment it remains 7 until verification succeeds. It then becomes 8. Patient contact details and verification codes are never exposed through this adapter."
|
|
1516
1516
|
},
|
|
1517
1517
|
"instanceId": {
|
|
1518
1518
|
"attr": "data-component-id",
|
|
@@ -20249,7 +20249,7 @@
|
|
|
20249
20249
|
{
|
|
20250
20250
|
"name": "sign_in",
|
|
20251
20251
|
"safety": "write",
|
|
20252
|
-
"description": "Sign in (`data-action=\"submit\"`). The person types the email and the password themselves; the form does not submit until the email is
|
|
20252
|
+
"description": "Sign in (`data-action=\"submit\"`). The person types the email and the password themselves; the form does not submit until the email field is filled in and the password is not empty; text with an `@` must be a valid email address, and text without one is accepted as a username only when the host sets `allowUsername`; it lists what is wrong in its error summary and moves focus there. The host then signs the person in: through its `onSubmit` handler, or as a native form post to its own field names.",
|
|
20253
20253
|
"descriptionKey": "ui.agent.loginForm.workflows.signIn",
|
|
20254
20254
|
"uiActions": [],
|
|
20255
20255
|
"apiActions": [
|
package/dist/agent-i18n/en.json
CHANGED
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"booking": {
|
|
154
154
|
"state": {
|
|
155
155
|
"variant": "Active variant — one of `inline-list`, `accordion`, `calendar`, `flexible`, `progress`.",
|
|
156
|
-
"currentStep": "The step the flow is on: 1 insurance, 2 specialty, 3 service, 4 provider, 5 date, 6 time, 7 patient details, payment or optional SMS code verification, 8 confirmation after all required steps succeed. Read this back after `goto_step` to see where the clamp landed."
|
|
156
|
+
"currentStep": "The step the flow is on: 1 insurance, 2 specialty, 3 service, 4 provider, 5 date, 6 time, 7 patient details, payment or optional SMS code verification, 8 confirmation after all required steps succeed, including the \"Time reserved\" view that opens a host address after a short delay. Read this back after `goto_step` to see where the clamp landed."
|
|
157
157
|
},
|
|
158
158
|
"actions": {
|
|
159
159
|
"reset": "Clear the booking value back to an empty state. Use to abandon an in-progress flow.",
|
|
@@ -1897,7 +1897,7 @@
|
|
|
1897
1897
|
"loginForm": {
|
|
1898
1898
|
"workflows": {
|
|
1899
1899
|
"readForm": "Read the sign-in form and what is wrong with it. Each field sits in a wrapper with `data-field` (`email`, `password`, and `remember-me` when the host turns it on). A field with a problem has `aria-invalid=\"true\"` on its control and its message in a `data-slot=\"error\"` element inside the wrapper. After a refused submit the fields with a problem are also listed in `data-component=\"error-summary\"` at the top of the form, one item per field (`data-error-field`). A message about the whole form, such as a refused sign-in, is in `data-field=\"form\"`; it never says which of the two values was wrong. Never read or repeat the password.",
|
|
1900
|
-
"signIn": "Sign in (`data-action=\"submit\"`). The person types the email and the password themselves; the form does not submit until the email is
|
|
1900
|
+
"signIn": "Sign in (`data-action=\"submit\"`). The person types the email and the password themselves; the form does not submit until the email field is filled in and the password is not empty; text with an `@` must be a valid email address, and text without one is accepted as a username only when the host sets `allowUsername`; it lists what is wrong in its error summary and moves focus there. The host then signs the person in: through its `onSubmit` handler, or as a native form post to its own field names.",
|
|
1901
1901
|
"rememberMe": "Tick or untick \"Remember me on this computer\" (`data-field=\"remember-me\"`, a checkbox, unticked by default). Present only when the host turns it on. It reports the choice to the host, which decides what it means; it changes nothing until the form is submitted.",
|
|
1902
1902
|
"forgotPassword": "Go to the page that asks for a password reset link (`data-action=\"forgot-password\"`). Present only when the host gives its address.",
|
|
1903
1903
|
"register": "Go to a registration page: `data-action=\"register-doctor\"` or `data-action=\"register-patient\"`, under the sign-in button. Each is present only when the host gives its address.",
|
|
@@ -39,7 +39,16 @@ export interface BookingSubmitResult {
|
|
|
39
39
|
}
|
|
40
40
|
export type BookingPaymentState = {
|
|
41
41
|
sessionId: string;
|
|
42
|
-
status: 'ready' | 'cancelled'
|
|
42
|
+
status: 'ready' | 'cancelled';
|
|
43
|
+
} | {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
status: 'paid';
|
|
46
|
+
/**
|
|
47
|
+
* An http(s) address to open after payment. Booking then shows
|
|
48
|
+
* "Time reserved" and opens it (see `handoverDelayMs`). Without it the
|
|
49
|
+
* paid receipt shows as before.
|
|
50
|
+
*/
|
|
51
|
+
redirectUrl?: string;
|
|
43
52
|
} | {
|
|
44
53
|
sessionId: string;
|
|
45
54
|
status: 'processing';
|
|
@@ -282,13 +291,26 @@ export interface BookingHandle {
|
|
|
282
291
|
*/
|
|
283
292
|
goToStep: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7) => void;
|
|
284
293
|
}
|
|
285
|
-
/**
|
|
294
|
+
/**
|
|
295
|
+
* Opt into SMS verification after submission and before any required payment.
|
|
296
|
+
* The submitted form stays in place, locked, with the code box below it. A
|
|
297
|
+
* "Change" button unlocks the form; the next submit calls `onSubmit` again as
|
|
298
|
+
* a new booking request. The host's earlier request stays held on the
|
|
299
|
+
* platform until it expires: the kit cannot cancel it. With a payment, a
|
|
300
|
+
* correct code opens the payment stage; the code is never asked after paying.
|
|
301
|
+
*/
|
|
286
302
|
export interface BookingCodeStep {
|
|
287
303
|
/** Number of characters, default 5. OTPInput clamps this to 3–10. */
|
|
288
304
|
length?: number;
|
|
289
305
|
/** Resolve ok only after the host has verified the code and confirmed the booking. */
|
|
290
306
|
onVerify: (code: string) => Promise<{
|
|
291
307
|
ok: true;
|
|
308
|
+
/**
|
|
309
|
+
* An http(s) address to open after the code. Booking then shows
|
|
310
|
+
* "Time reserved" and opens it (see `handoverDelayMs`). Ignored when
|
|
311
|
+
* a payment follows. Without it the confirmation view shows as before.
|
|
312
|
+
*/
|
|
313
|
+
redirectUrl?: string;
|
|
292
314
|
} | {
|
|
293
315
|
ok: false;
|
|
294
316
|
reason: 'wrong' | 'expired' | 'too-many-attempts';
|
|
@@ -371,6 +393,17 @@ export interface BookingProps extends Omit<ComponentPropsWithoutRef<'div'>, 'ari
|
|
|
371
393
|
* @default 'highlighted'
|
|
372
394
|
*/
|
|
373
395
|
paymentNoticeStyle?: 'plain' | 'highlighted';
|
|
396
|
+
/**
|
|
397
|
+
* Wait before opening a `redirectUrl`, in milliseconds. Not under
|
|
398
|
+
* motion: the redirect happens after this delay with reduced motion too.
|
|
399
|
+
* @default 3000
|
|
400
|
+
*/
|
|
401
|
+
handoverDelayMs?: number;
|
|
402
|
+
/**
|
|
403
|
+
* Opens a `redirectUrl`. Defaults to `window.location.assign`. Pass one to
|
|
404
|
+
* route inside an app, or to stub navigation in tests and stories.
|
|
405
|
+
*/
|
|
406
|
+
onNavigate?: (url: string) => void;
|
|
374
407
|
/** Publish paid only after the server verifies payment AND saves the appointment. */
|
|
375
408
|
paymentState?: BookingPaymentState;
|
|
376
409
|
/** Render PaymentForm here. The consumer owns Stripe credentials and completion calls. */
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { BookingCodeStep } from './booking-types';
|
|
2
2
|
/** Submit-phase UI. The host owns code generation, validation and SMS delivery. */
|
|
3
|
-
export declare function BookingCodeVerification({ length, onVerify, onResend, resendSeconds, phoneHint, onVerified, }: BookingCodeStep & {
|
|
4
|
-
onVerified: () => void;
|
|
3
|
+
export declare function BookingCodeVerification({ length, onVerify, onResend, resendSeconds, phoneHint, onVerified, onBusyChange, }: BookingCodeStep & {
|
|
4
|
+
onVerified: (redirectUrl?: string) => void;
|
|
5
|
+
/** Reports a running verify or resend, so the host form can hold "Change". */
|
|
6
|
+
onBusyChange?: (busy: boolean) => void;
|
|
5
7
|
}): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
//# sourceMappingURL=code-step.d.ts.map
|
|
@@ -62,6 +62,8 @@ export interface BookingDetailsFormProps {
|
|
|
62
62
|
* re-submit immediately.
|
|
63
63
|
*/
|
|
64
64
|
submitError?: ReactNode;
|
|
65
|
+
/** Read-only review while a code step is open: no alert, hint or submit button. */
|
|
66
|
+
locked?: boolean;
|
|
65
67
|
}
|
|
66
68
|
export declare const BookingDetailsForm: import("react").ForwardRefExoticComponent<BookingDetailsFormProps & import("react").RefAttributes<HTMLFormElement>>;
|
|
67
69
|
//# sourceMappingURL=details-form.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Wait before the "Time reserved" view opens the host's address. */
|
|
2
|
+
export declare const DEFAULT_HANDOVER_DELAY_MS = 3000;
|
|
3
|
+
/**
|
|
4
|
+
* The address to open after a verified booking, or undefined when it must
|
|
5
|
+
* not be used. Only a full http(s) address passes: a relative path,
|
|
6
|
+
* `javascript:`, `data:` or `mailto:` never does. The URL parser strips the
|
|
7
|
+
* whitespace and line breaks a browser would ignore, so they cannot hide a
|
|
8
|
+
* scheme.
|
|
9
|
+
*/
|
|
10
|
+
export declare function safeHandoverUrl(url: string | undefined): string | undefined;
|
|
11
|
+
export declare function resolveHandoverDelay(delayMs: number | undefined): number;
|
|
12
|
+
//# sourceMappingURL=handover.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
interface BookingReservedProps {
|
|
3
|
+
/** An address already checked with `safeHandoverUrl`. */
|
|
4
|
+
url: string;
|
|
5
|
+
delayMs: number;
|
|
6
|
+
/** Replaces `window.location.assign`. */
|
|
7
|
+
onNavigate?: (url: string) => void;
|
|
8
|
+
/** Short date, already formatted for the locale. */
|
|
9
|
+
date?: string;
|
|
10
|
+
/** Clock time, already formatted for the locale. */
|
|
11
|
+
time: string;
|
|
12
|
+
/** Service and professional, already joined. */
|
|
13
|
+
details?: ReactNode;
|
|
14
|
+
/** True when focus is inside Booking, or a removed control dropped it. */
|
|
15
|
+
shouldTakeFocus: (root: HTMLElement) => boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* "Time reserved": shown after a correct SMS code or a verified payment when
|
|
19
|
+
* the host gave an address. Opens it after `delayMs`, or at once from the
|
|
20
|
+
* button.
|
|
21
|
+
*/
|
|
22
|
+
export declare function BookingReserved({ url, delayMs, onNavigate, date, time, details, shouldTakeFocus, }: BookingReservedProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=reserved.d.ts.map
|
|
@@ -6,12 +6,14 @@ export declare function useBookingPayment({ services, value, availableSlots, onS
|
|
|
6
6
|
activeSession: BookingPaymentSession | undefined;
|
|
7
7
|
submit: (details: BookingDetails) => Promise<void>;
|
|
8
8
|
reset: () => void;
|
|
9
|
-
completeCode: () => void;
|
|
9
|
+
completeCode: (redirectUrl?: string) => void;
|
|
10
10
|
status: "idle" | "submitting" | "payment" | "code" | "success" | "error";
|
|
11
11
|
snapshot?: BookingSubmitPayload;
|
|
12
12
|
session?: BookingPaymentSession;
|
|
13
13
|
cancelled?: boolean;
|
|
14
14
|
codeStep?: BookingCodeStep;
|
|
15
15
|
codeVerified?: boolean;
|
|
16
|
+
/** Address to open from the "Time reserved" view, as the host gave it. */
|
|
17
|
+
redirectUrl?: string;
|
|
16
18
|
};
|
|
17
19
|
//# sourceMappingURL=use-booking-payment.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { D as r, E as l, T as t, a as s, b as d, c as o, d as n, e as i, f as R, i as C, g as T } from "../../_chunks/data-table-BlONA1rP.js";
|
|
2
2
|
import { B as g, C as D, a as b, E as x, b as c, R as p, T as u, c as m, r as E, u as f } from "../../_chunks/editable-currency-cell-renderer-rWYiF4EI.js";
|
|
3
|
-
import { D as h, a as A, b as w, I as y, L as I, N as L, c as N, S as P, d as W, e as B, T as U, f as _, g as k, U as v } from "../../_chunks/link-cell-renderer-
|
|
3
|
+
import { D as h, a as A, b as w, I as y, L as I, N as L, c as N, S as P, d as W, e as B, T as U, f as _, g as k, U as v } from "../../_chunks/link-cell-renderer-C0ynDik7.js";
|
|
4
4
|
import { A as X, a as j } from "../../_chunks/actions-cell-renderer-B1yaOfQM.js";
|
|
5
5
|
export {
|
|
6
6
|
X as ActionsCellRenderer,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as s, C as l, N as n, P as t, a as C, T as i, b as o, g as T, u as p } from "../../_chunks/balance-badge-cell-
|
|
1
|
+
import { B as s, C as l, N as n, P as t, a as C, T as i, b as o, g as T, u as p } from "../../_chunks/balance-badge-cell-BHXJS8Ga.js";
|
|
2
2
|
export {
|
|
3
3
|
s as BalanceBadgeCell,
|
|
4
4
|
l as CarePlanStatusCell,
|
|
@@ -2419,6 +2419,14 @@ export declare const arUi: {
|
|
|
2419
2419
|
readonly intro: "لإيصال الدفع الصادر باسم المريض.";
|
|
2420
2420
|
};
|
|
2421
2421
|
};
|
|
2422
|
+
readonly reserved: {
|
|
2423
|
+
readonly heading: "تم حجز الموعد مؤقتًا";
|
|
2424
|
+
readonly when: "{{date}}، {{time}}";
|
|
2425
|
+
readonly redirecting: "جارٍ نقلك إلى منطقة المرضى للتأكيد…";
|
|
2426
|
+
readonly goNow: "انتقل الآن";
|
|
2427
|
+
readonly stay: "ابقَ في هذه الصفحة";
|
|
2428
|
+
readonly stayed: "انتقل إلى منطقة المرضى عندما تكون مستعدًا للتأكيد.";
|
|
2429
|
+
};
|
|
2422
2430
|
};
|
|
2423
2431
|
readonly patientSearch: {
|
|
2424
2432
|
readonly regionLabel: "ابحث عن موعد";
|
package/dist/i18n/locales/ar.js
CHANGED
|
@@ -2411,6 +2411,14 @@ const e = {
|
|
|
2411
2411
|
heading: "بيانات الفوترة",
|
|
2412
2412
|
intro: "لإيصال الدفع الصادر باسم المريض."
|
|
2413
2413
|
}
|
|
2414
|
+
},
|
|
2415
|
+
reserved: {
|
|
2416
|
+
heading: "تم حجز الموعد مؤقتًا",
|
|
2417
|
+
when: "{{date}}، {{time}}",
|
|
2418
|
+
redirecting: "جارٍ نقلك إلى منطقة المرضى للتأكيد…",
|
|
2419
|
+
goNow: "انتقل الآن",
|
|
2420
|
+
stay: "ابقَ في هذه الصفحة",
|
|
2421
|
+
stayed: "انتقل إلى منطقة المرضى عندما تكون مستعدًا للتأكيد."
|
|
2414
2422
|
}
|
|
2415
2423
|
},
|
|
2416
2424
|
patientSearch: {
|
|
@@ -2407,6 +2407,14 @@ export declare const deUi: {
|
|
|
2407
2407
|
readonly intro: "Für die Zahlungsquittung, ausgestellt auf den Namen des Patienten.";
|
|
2408
2408
|
};
|
|
2409
2409
|
};
|
|
2410
|
+
readonly reserved: {
|
|
2411
|
+
readonly heading: "Termin reserviert";
|
|
2412
|
+
readonly when: "{{date}}, {{time}}";
|
|
2413
|
+
readonly redirecting: "Wir bringen Sie zum Patientenbereich, damit Sie bestätigen können …";
|
|
2414
|
+
readonly goNow: "Jetzt öffnen";
|
|
2415
|
+
readonly stay: "Auf dieser Seite bleiben";
|
|
2416
|
+
readonly stayed: "Gehen Sie zum Patientenbereich, wenn Sie bereit zur Bestätigung sind.";
|
|
2417
|
+
};
|
|
2410
2418
|
};
|
|
2411
2419
|
readonly patientSearch: {
|
|
2412
2420
|
readonly regionLabel: "Termin suchen";
|
package/dist/i18n/locales/de.js
CHANGED
|
@@ -2399,6 +2399,14 @@ const e = {
|
|
|
2399
2399
|
heading: "Rechnungsdaten",
|
|
2400
2400
|
intro: "Für die Zahlungsquittung, ausgestellt auf den Namen des Patienten."
|
|
2401
2401
|
}
|
|
2402
|
+
},
|
|
2403
|
+
reserved: {
|
|
2404
|
+
heading: "Termin reserviert",
|
|
2405
|
+
when: "{{date}}, {{time}}",
|
|
2406
|
+
redirecting: "Wir bringen Sie zum Patientenbereich, damit Sie bestätigen können …",
|
|
2407
|
+
goNow: "Jetzt öffnen",
|
|
2408
|
+
stay: "Auf dieser Seite bleiben",
|
|
2409
|
+
stayed: "Gehen Sie zum Patientenbereich, wenn Sie bereit zur Bestätigung sind."
|
|
2402
2410
|
}
|
|
2403
2411
|
},
|
|
2404
2412
|
patientSearch: {
|
|
@@ -2404,6 +2404,14 @@ export declare const elUi: {
|
|
|
2404
2404
|
readonly intro: "Για την απόδειξη πληρωμής, στο όνομα του ασθενούς.";
|
|
2405
2405
|
};
|
|
2406
2406
|
};
|
|
2407
|
+
readonly reserved: {
|
|
2408
|
+
readonly heading: "Η ώρα κρατήθηκε";
|
|
2409
|
+
readonly when: "{{date}}, {{time}}";
|
|
2410
|
+
readonly redirecting: "Σας μεταφέρουμε στην περιοχή ασθενών για επιβεβαίωση…";
|
|
2411
|
+
readonly goNow: "Μετάβαση τώρα";
|
|
2412
|
+
readonly stay: "Παραμονή σε αυτή τη σελίδα";
|
|
2413
|
+
readonly stayed: "Μεταβείτε στην περιοχή ασθενών όταν είστε έτοιμοι να επιβεβαιώσετε.";
|
|
2414
|
+
};
|
|
2407
2415
|
};
|
|
2408
2416
|
readonly patientSearch: {
|
|
2409
2417
|
readonly regionLabel: "Αναζήτηση ραντεβού";
|
package/dist/i18n/locales/el.js
CHANGED
|
@@ -2399,6 +2399,14 @@ const e = {
|
|
|
2399
2399
|
heading: "Στοιχεία χρέωσης",
|
|
2400
2400
|
intro: "Για την απόδειξη πληρωμής, στο όνομα του ασθενούς."
|
|
2401
2401
|
}
|
|
2402
|
+
},
|
|
2403
|
+
reserved: {
|
|
2404
|
+
heading: "Η ώρα κρατήθηκε",
|
|
2405
|
+
when: "{{date}}, {{time}}",
|
|
2406
|
+
redirecting: "Σας μεταφέρουμε στην περιοχή ασθενών για επιβεβαίωση…",
|
|
2407
|
+
goNow: "Μετάβαση τώρα",
|
|
2408
|
+
stay: "Παραμονή σε αυτή τη σελίδα",
|
|
2409
|
+
stayed: "Μεταβείτε στην περιοχή ασθενών όταν είστε έτοιμοι να επιβεβαιώσετε."
|
|
2402
2410
|
}
|
|
2403
2411
|
},
|
|
2404
2412
|
patientSearch: {
|
|
@@ -2530,6 +2530,14 @@ export declare const enUi: {
|
|
|
2530
2530
|
};
|
|
2531
2531
|
};
|
|
2532
2532
|
};
|
|
2533
|
+
readonly reserved: {
|
|
2534
|
+
readonly heading: "Time reserved";
|
|
2535
|
+
readonly when: "{{date}}, {{time}}";
|
|
2536
|
+
readonly redirecting: "Taking you to the patient area to confirm…";
|
|
2537
|
+
readonly goNow: "Go now";
|
|
2538
|
+
readonly stay: "Stay on this page";
|
|
2539
|
+
readonly stayed: "Go to the patient area when you are ready to confirm.";
|
|
2540
|
+
};
|
|
2533
2541
|
};
|
|
2534
2542
|
readonly patientSearch: {
|
|
2535
2543
|
readonly regionLabel: "Search appointments";
|