@alfadocs/ui-kit-debug 0.50.1 → 0.52.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/{agenda-card-BaSfVfrL.js → agenda-card-Bl-SBiCh.js} +55 -45
- package/dist/_chunks/agenda-card-Bl-SBiCh.js.map +1 -0
- package/dist/_chunks/agenda-tray-DA6qj8BL.js +203 -0
- package/dist/_chunks/agenda-tray-DA6qj8BL.js.map +1 -0
- package/dist/_chunks/{ai-consent-banner-F2md5JD3.js → ai-consent-banner-DBKV27je.js} +2 -2
- package/dist/_chunks/{ai-consent-banner-F2md5JD3.js.map → ai-consent-banner-DBKV27je.js.map} +1 -1
- package/dist/_chunks/ai-tools-rail-7tC3GT4h.js +340 -0
- package/dist/_chunks/ai-tools-rail-7tC3GT4h.js.map +1 -0
- package/dist/_chunks/{alert-CUTxnym2.js → alert-_mUKLmwA.js} +54 -44
- package/dist/_chunks/alert-_mUKLmwA.js.map +1 -0
- package/dist/_chunks/{audio-recorder-DVJXV7_k.js → audio-recorder-D6OVfNiZ.js} +2 -2
- package/dist/_chunks/{audio-recorder-DVJXV7_k.js.map → audio-recorder-D6OVfNiZ.js.map} +1 -1
- package/dist/_chunks/{booking-DljH0JkS.js → booking-BUV9fspj.js} +2 -2
- package/dist/_chunks/{booking-DljH0JkS.js.map → booking-BUV9fspj.js.map} +1 -1
- package/dist/_chunks/{document-scanner-Cxqvq7GR.js → document-scanner-biBS_f6c.js} +2 -2
- package/dist/_chunks/{document-scanner-Cxqvq7GR.js.map → document-scanner-biBS_f6c.js.map} +1 -1
- package/dist/_chunks/dropdown-menu-DwwPovMZ.js +354 -0
- package/dist/_chunks/dropdown-menu-DwwPovMZ.js.map +1 -0
- package/dist/_chunks/{editable-currency-cell-renderer-Bh48OHRv.js → editable-currency-cell-renderer-D5C5tCfu.js} +3 -3
- package/dist/_chunks/{editable-currency-cell-renderer-Bh48OHRv.js.map → editable-currency-cell-renderer-D5C5tCfu.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-BWaLWje-.js → freemium-paywall-gHGA44dW.js} +2 -2
- package/dist/_chunks/{freemium-paywall-BWaLWje-.js.map → freemium-paywall-gHGA44dW.js.map} +1 -1
- package/dist/_chunks/{header-settings-Bx0Biimh.js → header-settings-D5Z2B_Yz.js} +3 -3
- package/dist/_chunks/{header-settings-Bx0Biimh.js.map → header-settings-D5Z2B_Yz.js.map} +1 -1
- package/dist/_chunks/{logo-yituK7sE.js → logo-1FuSGx0n.js} +2 -1
- package/dist/_chunks/{logo-yituK7sE.js.map → logo-1FuSGx0n.js.map} +1 -1
- package/dist/_chunks/marketplace-app-shell-C4OYAC22.js +513 -0
- package/dist/_chunks/marketplace-app-shell-C4OYAC22.js.map +1 -0
- package/dist/_chunks/maximize-2-Cm9OUQ2m.js +17 -0
- package/dist/_chunks/maximize-2-Cm9OUQ2m.js.map +1 -0
- package/dist/_chunks/{patient-search-BJOmTmDA.js → patient-search-CArmRKeg.js} +3 -3
- package/dist/_chunks/{patient-search-BJOmTmDA.js.map → patient-search-CArmRKeg.js.map} +1 -1
- package/dist/_chunks/patient-shell-Coarf346.js +162 -0
- package/dist/_chunks/patient-shell-Coarf346.js.map +1 -0
- package/dist/_chunks/{payment-form-xmeCkxas.js → payment-form-DJ9vnzrT.js} +2 -2
- package/dist/_chunks/{payment-form-xmeCkxas.js.map → payment-form-DJ9vnzrT.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-q1D3Uion.js → pdf-viewer-4odMFuFW.js} +2 -2
- package/dist/_chunks/{pdf-viewer-q1D3Uion.js.map → pdf-viewer-4odMFuFW.js.map} +1 -1
- package/dist/_chunks/{practice-results-Cq1y8JFD.js → practice-results-CtfciF2v.js} +3 -3
- package/dist/_chunks/{practice-results-Cq1y8JFD.js.map → practice-results-CtfciF2v.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-DT_244bG.js → pregnancy-dating-BA37LSkF.js} +15 -15
- package/dist/_chunks/{pregnancy-dating-DT_244bG.js.map → pregnancy-dating-BA37LSkF.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-BmX_gkvt.js → privacy-lock-BN3L-alb.js} +2 -2
- package/dist/_chunks/{privacy-lock-BmX_gkvt.js.map → privacy-lock-BN3L-alb.js.map} +1 -1
- package/dist/_chunks/{public-footer.agent-okt8ZRc5.js → public-footer.agent-CfXuW1x6.js} +2 -2
- package/dist/_chunks/{public-footer.agent-okt8ZRc5.js.map → public-footer.agent-CfXuW1x6.js.map} +1 -1
- package/dist/_chunks/{recaptcha-widget-CFYyLSEX.js → recaptcha-widget-BCNHsgqt.js} +2 -2
- package/dist/_chunks/{recaptcha-widget-CFYyLSEX.js.map → recaptcha-widget-BCNHsgqt.js.map} +1 -1
- package/dist/_chunks/{sidebar-h78cTNLh.js → sidebar-DPEHzxLZ.js} +397 -346
- package/dist/_chunks/sidebar-DPEHzxLZ.js.map +1 -0
- package/dist/_chunks/{sign-document-CZkAf28g.js → sign-document-Bzld9jVM.js} +2 -2
- package/dist/_chunks/{sign-document-CZkAf28g.js.map → sign-document-Bzld9jVM.js.map} +1 -1
- package/dist/_chunks/{sign-in-with-alfadocs-button-CuYn_kKP.js → sign-in-with-alfadocs-button-BpAjVmsI.js} +2 -2
- package/dist/_chunks/{sign-in-with-alfadocs-button-CuYn_kKP.js.map → sign-in-with-alfadocs-button-BpAjVmsI.js.map} +1 -1
- package/dist/_chunks/{task-card-CPyQ5AXC.js → task-card-BwY9jaV1.js} +48 -42
- package/dist/_chunks/task-card-BwY9jaV1.js.map +1 -0
- package/dist/_chunks/task-tray-Cb_hK4yb.js +234 -0
- package/dist/_chunks/task-tray-Cb_hK4yb.js.map +1 -0
- package/dist/_chunks/{theme-toggle-ClATnY4Q.js → theme-toggle-DAW7uC0B.js} +3 -3
- package/dist/_chunks/{theme-toggle-ClATnY4Q.js.map → theme-toggle-DAW7uC0B.js.map} +1 -1
- package/dist/_chunks/use-edge-resize-ZnGG7gyO.js +139 -0
- package/dist/_chunks/use-edge-resize-ZnGG7gyO.js.map +1 -0
- package/dist/_chunks/use-theme-CAuo6EYT.js +159 -0
- package/dist/_chunks/use-theme-CAuo6EYT.js.map +1 -0
- package/dist/_chunks/{warning-stack-CXfoAT-_.js → warning-stack-Cv4fr5zo.js} +2 -2
- package/dist/_chunks/{warning-stack-CXfoAT-_.js.map → warning-stack-Cv4fr5zo.js.map} +1 -1
- package/dist/_chunks/{workflow-map-DzX_LI4y.js → workflow-map-BJDUNYlX.js} +3 -3
- package/dist/_chunks/{workflow-map-DzX_LI4y.js.map → workflow-map-BJDUNYlX.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/brand/product-lockup/product-lockup.d.ts +47 -12
- package/dist/brand/product-lockup/product-lockup.d.ts.map +1 -1
- package/dist/components/agenda-card/agenda-card.d.ts +19 -2
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts +24 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +8 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -1
- package/dist/components/ai-tools-rail/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/button-group/button-group.d.ts +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/form-field/form-field.d.ts +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts +15 -15
- package/dist/components/key-value-pair/key-value-pair.d.ts +1 -1
- package/dist/components/logo/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-dating/pregnancy-dating.d.ts.map +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/public-footer/index.js +1 -1
- package/dist/components/radio-group/radio-group.d.ts +1 -1
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/separator/separator.d.ts +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts +8 -0
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts +2 -2
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-card/task-card.d.ts +15 -1
- package/dist/components/task-card/task-card.d.ts.map +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.d.ts +24 -1
- package/dist/components/task-tray/task-tray.d.ts.map +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-map.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +12 -10
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-edge-resize.d.ts +78 -0
- package/dist/hooks/use-edge-resize.d.ts.map +1 -0
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/i18n/locales/ar.d.ts +4 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +7 -3
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +4 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +7 -3
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +4 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +7 -3
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +4 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +7 -3
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +4 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +7 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +4 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +7 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +4 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +7 -3
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +4 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +7 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +4 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +7 -3
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +4 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +7 -3
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +4 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +7 -3
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +4 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +7 -3
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +4 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +7 -3
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +4 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +7 -3
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +4 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +7 -3
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +4 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +7 -3
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +4 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +7 -3
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +4 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +7 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +31 -31
- package/dist/locales/ar.json +7 -3
- package/dist/locales/de.json +7 -3
- package/dist/locales/el.json +7 -3
- package/dist/locales/en.json +7 -3
- package/dist/locales/es.json +7 -3
- package/dist/locales/fr.json +7 -3
- package/dist/locales/hi.json +7 -3
- package/dist/locales/it.json +7 -3
- package/dist/locales/ja.json +7 -3
- package/dist/locales/nl.json +7 -3
- package/dist/locales/pl.json +7 -3
- package/dist/locales/pt.json +7 -3
- package/dist/locales/ro.json +7 -3
- package/dist/locales/ru.json +7 -3
- package/dist/locales/sq.json +7 -3
- package/dist/locales/sv.json +7 -3
- package/dist/locales/tr.json +7 -3
- package/dist/locales/zh.json +7 -3
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +8 -6
- package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/agenda-card-BaSfVfrL.js.map +0 -1
- package/dist/_chunks/agenda-tray-DQayYmQ0.js +0 -165
- package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +0 -1
- package/dist/_chunks/ai-tools-rail-CYLWrRmm.js +0 -280
- package/dist/_chunks/ai-tools-rail-CYLWrRmm.js.map +0 -1
- package/dist/_chunks/alert-CUTxnym2.js.map +0 -1
- package/dist/_chunks/circle-arrow-up-CC_85SuH.js +0 -16
- package/dist/_chunks/circle-arrow-up-CC_85SuH.js.map +0 -1
- package/dist/_chunks/dropdown-menu-CUEXqKis.js +0 -299
- package/dist/_chunks/dropdown-menu-CUEXqKis.js.map +0 -1
- package/dist/_chunks/marketplace-app-shell-UKSLx9K_.js +0 -428
- package/dist/_chunks/marketplace-app-shell-UKSLx9K_.js.map +0 -1
- package/dist/_chunks/patient-shell-DUmhXnFq.js +0 -174
- package/dist/_chunks/patient-shell-DUmhXnFq.js.map +0 -1
- package/dist/_chunks/sidebar-h78cTNLh.js.map +0 -1
- package/dist/_chunks/task-card-CPyQ5AXC.js.map +0 -1
- package/dist/_chunks/task-tray-B8jFv5FV.js +0 -196
- package/dist/_chunks/task-tray-B8jFv5FV.js.map +0 -1
- package/dist/_chunks/use-theme-C2dHKUAN.js +0 -145
- package/dist/_chunks/use-theme-C2dHKUAN.js.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { useState as X, useRef as T, useCallback as o } from "react";
|
|
2
|
+
import { useTranslation as B } from "react-i18next";
|
|
3
|
+
import { u as L } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
4
|
+
const S = 16, Y = 64;
|
|
5
|
+
function O({
|
|
6
|
+
edge: I,
|
|
7
|
+
targetRef: e,
|
|
8
|
+
cssProperty: d,
|
|
9
|
+
minSize: i,
|
|
10
|
+
maxSize: p,
|
|
11
|
+
defaultSize: C,
|
|
12
|
+
disabled: c = !1,
|
|
13
|
+
onResize: n
|
|
14
|
+
}) {
|
|
15
|
+
const { t: b } = B(), [f, E] = X(null), [x, P] = X(!1), h = T(null), m = T(null);
|
|
16
|
+
L(() => {
|
|
17
|
+
const t = e.current;
|
|
18
|
+
if (!t) return;
|
|
19
|
+
const r = t.getBoundingClientRect().width;
|
|
20
|
+
r > 0 && (h.current = r);
|
|
21
|
+
});
|
|
22
|
+
const y = o(
|
|
23
|
+
(t) => Math.min(p, Math.max(i, t)),
|
|
24
|
+
[i, p]
|
|
25
|
+
), s = o(() => {
|
|
26
|
+
if (f !== null) return f;
|
|
27
|
+
const t = e.current;
|
|
28
|
+
if (t) {
|
|
29
|
+
const r = t.getBoundingClientRect().width;
|
|
30
|
+
if (r > 0)
|
|
31
|
+
return h.current = r, r;
|
|
32
|
+
}
|
|
33
|
+
return h.current ?? C;
|
|
34
|
+
}, [f, C, e]), a = o(
|
|
35
|
+
(t) => {
|
|
36
|
+
var u;
|
|
37
|
+
const r = y(t);
|
|
38
|
+
return E(r), (u = e.current) == null || u.style.setProperty(d, `${r}px`), r;
|
|
39
|
+
},
|
|
40
|
+
[y, d, e]
|
|
41
|
+
), w = o(() => {
|
|
42
|
+
var t;
|
|
43
|
+
E(null), (t = e.current) == null || t.style.removeProperty(d), h.current = null, n == null || n(null);
|
|
44
|
+
}, [d, n, e]), g = o(() => {
|
|
45
|
+
const t = e.current, r = t ? getComputedStyle(t).direction === "rtl" : !1;
|
|
46
|
+
return (I === "inline-end" ? 1 : -1) * (r ? -1 : 1);
|
|
47
|
+
}, [I, e]), A = o(
|
|
48
|
+
(t) => {
|
|
49
|
+
c || !t.isPrimary || (t.currentTarget.setPointerCapture(t.pointerId), m.current = {
|
|
50
|
+
pointerId: t.pointerId,
|
|
51
|
+
startX: t.clientX,
|
|
52
|
+
startSize: s(),
|
|
53
|
+
sign: g()
|
|
54
|
+
}, P(!0));
|
|
55
|
+
},
|
|
56
|
+
[c, s, g]
|
|
57
|
+
), K = o(
|
|
58
|
+
(t) => {
|
|
59
|
+
const r = m.current;
|
|
60
|
+
!r || t.pointerId !== r.pointerId || a(r.startSize + r.sign * (t.clientX - r.startX));
|
|
61
|
+
},
|
|
62
|
+
[a]
|
|
63
|
+
), k = o(
|
|
64
|
+
(t) => {
|
|
65
|
+
const r = m.current;
|
|
66
|
+
if (!r || t.pointerId !== r.pointerId) return;
|
|
67
|
+
t.currentTarget.releasePointerCapture(t.pointerId), m.current = null, P(!1);
|
|
68
|
+
const u = a(
|
|
69
|
+
r.startSize + r.sign * (t.clientX - r.startX)
|
|
70
|
+
);
|
|
71
|
+
n == null || n(u);
|
|
72
|
+
},
|
|
73
|
+
[a, n]
|
|
74
|
+
), M = o(
|
|
75
|
+
(t) => {
|
|
76
|
+
if (c) return;
|
|
77
|
+
const r = t.shiftKey ? Y : S, u = g();
|
|
78
|
+
let l = null;
|
|
79
|
+
switch (t.key) {
|
|
80
|
+
case "ArrowRight":
|
|
81
|
+
l = s() + u * r;
|
|
82
|
+
break;
|
|
83
|
+
case "ArrowLeft":
|
|
84
|
+
l = s() - u * r;
|
|
85
|
+
break;
|
|
86
|
+
case "Home":
|
|
87
|
+
l = i;
|
|
88
|
+
break;
|
|
89
|
+
case "End":
|
|
90
|
+
l = p;
|
|
91
|
+
break;
|
|
92
|
+
case "Enter":
|
|
93
|
+
t.preventDefault(), w();
|
|
94
|
+
return;
|
|
95
|
+
default:
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (l === null) return;
|
|
99
|
+
t.preventDefault();
|
|
100
|
+
const _ = a(l);
|
|
101
|
+
n == null || n(_);
|
|
102
|
+
},
|
|
103
|
+
[
|
|
104
|
+
a,
|
|
105
|
+
s,
|
|
106
|
+
c,
|
|
107
|
+
p,
|
|
108
|
+
i,
|
|
109
|
+
n,
|
|
110
|
+
w,
|
|
111
|
+
g
|
|
112
|
+
]
|
|
113
|
+
), D = Math.round(s());
|
|
114
|
+
return {
|
|
115
|
+
separatorProps: {
|
|
116
|
+
role: "separator",
|
|
117
|
+
tabIndex: c ? -1 : 0,
|
|
118
|
+
"aria-orientation": "vertical",
|
|
119
|
+
"aria-valuemin": i,
|
|
120
|
+
"aria-valuemax": p,
|
|
121
|
+
"aria-valuenow": D,
|
|
122
|
+
"aria-valuetext": b("resizable.widthAnnounce", { width: D }),
|
|
123
|
+
"aria-disabled": c || void 0,
|
|
124
|
+
onPointerDown: A,
|
|
125
|
+
onPointerMove: K,
|
|
126
|
+
onPointerUp: k,
|
|
127
|
+
onPointerCancel: k,
|
|
128
|
+
onKeyDown: M,
|
|
129
|
+
onDoubleClick: w
|
|
130
|
+
},
|
|
131
|
+
isResizing: x,
|
|
132
|
+
isResized: f !== null,
|
|
133
|
+
reset: w
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
O as u
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=use-edge-resize-ZnGG7gyO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-edge-resize-ZnGG7gyO.js","sources":["../../src/hooks/use-edge-resize.ts"],"sourcesContent":["/**\n * Pixel-based edge-resize for fixed-width chrome surfaces (the Sidebar's\n * inline-end edge, the AiToolsRail panel's inner edge). Mirrors the\n * separator semantics of `Resizable`'s Handle — `role=\"separator\"`,\n * arrow keys with RTL flip, Shift for coarse steps, Home/End to the\n * extremes, Enter or double-click to reset — but sizes a single target\n * element in pixels instead of distributing percentages across a panel\n * group.\n *\n * The hook owns the interaction and writes the resolved width to a CSS\n * custom property on the target element (the same property the\n * component's width classes already read), so the component keeps its\n * `var(--…)`-driven classes and no inline `width` ever appears. Reset\n * removes the override entirely, returning the surface to its\n * token-driven default.\n */\nimport {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\n/** Fine / coarse keyboard steps, in px (coarse = Shift held). */\nconst KEY_STEP = 16;\nconst KEY_STEP_COARSE = 64;\n\nexport interface UseEdgeResizeOptions {\n /**\n * Which logical edge of the target carries the handle. `inline-end`\n * for a start-docked surface (Sidebar); `inline-start` for an\n * end-docked one (AiToolsRail panel with `side=\"end\"`).\n */\n edge: 'inline-start' | 'inline-end';\n /** The element being resized. The width override lands on its style. */\n targetRef: RefObject<HTMLElement | null>;\n /**\n * CSS custom property the target's width classes read\n * (e.g. `--sidebar-modern-expanded-size`). Written as `<px>px` on\n * resize, removed on reset.\n */\n cssProperty: string;\n /** Clamp floor, px. */\n minSize: number;\n /** Clamp ceiling, px. */\n maxSize: number;\n /**\n * Nominal default width, px — used for `aria-valuenow` before the\n * element has been measured (SSR / jsdom) and as the reset target.\n */\n defaultSize: number;\n /** Disables the interaction (handlers no-op, `aria-disabled` set). */\n disabled?: boolean;\n /** Fired with the committed px width; `null` means reset-to-default. */\n onResize?: (size: number | null) => void;\n}\n\nexport interface EdgeResizeSeparatorProps {\n role: 'separator';\n tabIndex: number;\n 'aria-orientation': 'vertical';\n 'aria-valuemin': number;\n 'aria-valuemax': number;\n 'aria-valuenow': number;\n 'aria-valuetext': string;\n 'aria-disabled': boolean | undefined;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerUp: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerCancel: (event: ReactPointerEvent<HTMLElement>) => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n onDoubleClick: () => void;\n}\n\nexport interface UseEdgeResizeReturn {\n /**\n * Spread onto the handle element (a plain `<div>`). Add `aria-label`,\n * and give the handle a `ds:touch-none` class — touch browsers decide\n * scroll-vs-drag at gesture start, before any pointer handler runs.\n */\n separatorProps: EdgeResizeSeparatorProps;\n /** True while a pointer drag is in flight — suppress width transitions. */\n isResizing: boolean;\n /** True once the user has overridden the token-driven default. */\n isResized: boolean;\n /** Programmatic reset to the token-driven default width. */\n reset: () => void;\n}\n\nexport function useEdgeResize({\n edge,\n targetRef,\n cssProperty,\n minSize,\n maxSize,\n defaultSize,\n disabled = false,\n onResize,\n}: UseEdgeResizeOptions): UseEdgeResizeReturn {\n const { t } = useTranslation();\n const [size, setSize] = useState<number | null>(null);\n const [isResizing, setIsResizing] = useState(false);\n const measuredRef = useRef<number | null>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startSize: number;\n sign: number;\n } | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n const el = targetRef.current;\n if (!el) return;\n const width = el.getBoundingClientRect().width;\n if (width > 0) measuredRef.current = width;\n });\n\n const clamp = useCallback(\n (px: number) => Math.min(maxSize, Math.max(minSize, px)),\n [minSize, maxSize],\n );\n\n // Live read at interaction time: the mount-time measure can catch the\n // target mid-animation (e.g. a panel still opening at width 0), so a\n // resize must start from the width the element actually has NOW.\n const currentSize = useCallback(() => {\n if (size !== null) return size;\n const el = targetRef.current;\n if (el) {\n const width = el.getBoundingClientRect().width;\n if (width > 0) {\n measuredRef.current = width;\n return width;\n }\n }\n return measuredRef.current ?? defaultSize;\n }, [size, defaultSize, targetRef]);\n\n const apply = useCallback(\n (px: number) => {\n const next = clamp(px);\n setSize(next);\n targetRef.current?.style.setProperty(cssProperty, `${next}px`);\n return next;\n },\n [clamp, cssProperty, targetRef],\n );\n\n const reset = useCallback(() => {\n setSize(null);\n targetRef.current?.style.removeProperty(cssProperty);\n measuredRef.current = null;\n onResize?.(null);\n }, [cssProperty, onResize, targetRef]);\n\n // Pointer-drag delta → width delta. The boundary the handle moves is\n // physical, so the logical edge and the writing direction both flip\n // the sign: dragging right grows a start-docked surface in LTR but\n // shrinks it in RTL, and vice versa for an end-docked one. Direction\n // is resolved at INTERACTION time from the target's computed style —\n // a mount-time read can be stale (the target may be unmounted while a\n // panel is closed, and `dir` lives on a subtree wrapper, not <html>).\n const resolveSign = useCallback(() => {\n const el = targetRef.current;\n const rtl = el ? getComputedStyle(el).direction === 'rtl' : false;\n return (edge === 'inline-end' ? 1 : -1) * (rtl ? -1 : 1);\n }, [edge, targetRef]);\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (disabled || !event.isPrimary) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startSize: currentSize(),\n sign: resolveSign(),\n };\n setIsResizing(true);\n },\n [disabled, currentSize, resolveSign],\n );\n\n const onPointerMove = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag || event.pointerId !== drag.pointerId) return;\n apply(drag.startSize + drag.sign * (event.clientX - drag.startX));\n },\n [apply],\n );\n\n const endDrag = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.currentTarget.releasePointerCapture(event.pointerId);\n dragRef.current = null;\n setIsResizing(false);\n // Re-apply from the up-event coordinates so the committed width,\n // the rendered width, and aria-valuenow all agree even when the\n // pointer-up lands at a different X than the last move.\n const committed = apply(\n drag.startSize + drag.sign * (event.clientX - drag.startX),\n );\n onResize?.(committed);\n },\n [apply, onResize],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (disabled) return;\n const step = event.shiftKey ? KEY_STEP_COARSE : KEY_STEP;\n const sign = resolveSign();\n let next: number | null = null;\n switch (event.key) {\n case 'ArrowRight':\n next = currentSize() + sign * step;\n break;\n case 'ArrowLeft':\n next = currentSize() - sign * step;\n break;\n case 'Home':\n next = minSize;\n break;\n case 'End':\n next = maxSize;\n break;\n case 'Enter':\n event.preventDefault();\n reset();\n return;\n default:\n return;\n }\n if (next === null) return;\n event.preventDefault();\n // Evaluate apply() unconditionally — `onResize?.(apply(next))`\n // would short-circuit the argument away when no callback is set.\n const committed = apply(next);\n onResize?.(committed);\n },\n [\n apply,\n currentSize,\n disabled,\n maxSize,\n minSize,\n onResize,\n reset,\n resolveSign,\n ],\n );\n\n const valueNow = Math.round(currentSize());\n\n return {\n separatorProps: {\n role: 'separator',\n tabIndex: disabled ? -1 : 0,\n 'aria-orientation': 'vertical',\n 'aria-valuemin': minSize,\n 'aria-valuemax': maxSize,\n 'aria-valuenow': valueNow,\n 'aria-valuetext': t('resizable.widthAnnounce', { width: valueNow }),\n 'aria-disabled': disabled || undefined,\n onPointerDown,\n onPointerMove,\n onPointerUp: endDrag,\n onPointerCancel: endDrag,\n onKeyDown,\n onDoubleClick: reset,\n },\n isResizing,\n isResized: size !== null,\n reset,\n };\n}\n"],"names":["KEY_STEP","KEY_STEP_COARSE","useEdgeResize","edge","targetRef","cssProperty","minSize","maxSize","defaultSize","disabled","onResize","t","useTranslation","size","setSize","useState","isResizing","setIsResizing","measuredRef","useRef","dragRef","useIsomorphicLayoutEffect","el","width","clamp","useCallback","px","currentSize","apply","next","_a","reset","resolveSign","rtl","onPointerDown","event","onPointerMove","drag","endDrag","committed","onKeyDown","step","sign","valueNow"],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { useSyncExternalStore as D, useEffect as k, useCallback as M } from "react";
|
|
2
|
+
const y = "alfadocs-ui.theme", b = "alfadocs-ui.accessibility", n = {
|
|
3
|
+
light: "theme-light",
|
|
4
|
+
dark: "theme-dark",
|
|
5
|
+
accessible: "theme-accessible"
|
|
6
|
+
}, _ = "(prefers-color-scheme: dark)", O = "(prefers-contrast: more)";
|
|
7
|
+
function m(e) {
|
|
8
|
+
if (typeof window > "u") return null;
|
|
9
|
+
try {
|
|
10
|
+
return window.localStorage.getItem(e);
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function L(e, t) {
|
|
16
|
+
if (!(typeof window > "u"))
|
|
17
|
+
try {
|
|
18
|
+
t === null ? window.localStorage.removeItem(e) : window.localStorage.setItem(e, t);
|
|
19
|
+
} catch {
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function E(e) {
|
|
23
|
+
return e === "light" || e === "dark" || e === "system";
|
|
24
|
+
}
|
|
25
|
+
function S(e) {
|
|
26
|
+
return e === "default" || e === "accessible" || e === "system";
|
|
27
|
+
}
|
|
28
|
+
function I() {
|
|
29
|
+
const e = m(y), t = m(b), r = typeof window < "u" && typeof window.matchMedia == "function", s = typeof document < "u" ? document.documentElement.classList : null, w = s ? s.contains(n.dark) ? "dark" : s.contains(n.light) ? "light" : null : null, v = s != null && s.contains(n.accessible) ? "accessible" : null;
|
|
30
|
+
return {
|
|
31
|
+
theme: E(e) ? e : w ?? "system",
|
|
32
|
+
accessibility: S(t) ? t : v ?? "system",
|
|
33
|
+
prefersDark: r ? window.matchMedia(_).matches : !1,
|
|
34
|
+
prefersMoreContrast: r ? window.matchMedia(O).matches : !1
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
let i = I();
|
|
38
|
+
const g = /* @__PURE__ */ new Set();
|
|
39
|
+
function c(e) {
|
|
40
|
+
e.theme === i.theme && e.accessibility === i.accessibility && e.prefersDark === i.prefersDark && e.prefersMoreContrast === i.prefersMoreContrast || (i = e, g.forEach((t) => t()));
|
|
41
|
+
}
|
|
42
|
+
function R(e) {
|
|
43
|
+
return g.add(e), () => {
|
|
44
|
+
g.delete(e);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function H() {
|
|
48
|
+
return i;
|
|
49
|
+
}
|
|
50
|
+
function V() {
|
|
51
|
+
return {
|
|
52
|
+
theme: "system",
|
|
53
|
+
accessibility: "system",
|
|
54
|
+
prefersDark: !1,
|
|
55
|
+
prefersMoreContrast: !1
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
let h = 0, d = null, f = null, u = null;
|
|
59
|
+
function Y(e) {
|
|
60
|
+
c({ ...i, prefersDark: e.matches });
|
|
61
|
+
}
|
|
62
|
+
function F(e) {
|
|
63
|
+
c({ ...i, prefersMoreContrast: e.matches });
|
|
64
|
+
}
|
|
65
|
+
function G(e) {
|
|
66
|
+
if (e.key === y) {
|
|
67
|
+
const t = E(e.newValue) ? e.newValue : "system";
|
|
68
|
+
c({ ...i, theme: t });
|
|
69
|
+
} else if (e.key === b) {
|
|
70
|
+
const t = S(e.newValue) ? e.newValue : "system";
|
|
71
|
+
c({ ...i, accessibility: t });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function T() {
|
|
75
|
+
if (typeof document > "u") return;
|
|
76
|
+
const e = document.documentElement.classList, t = m(y), r = m(b), s = e.contains(n.dark) ? "dark" : e.contains(n.light) ? "light" : null, w = e.contains(
|
|
77
|
+
n.accessible
|
|
78
|
+
) ? "accessible" : null;
|
|
79
|
+
c({
|
|
80
|
+
...i,
|
|
81
|
+
theme: E(t) ? t : s ?? "system",
|
|
82
|
+
accessibility: S(r) ? r : w ?? "system"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function C(e, t) {
|
|
86
|
+
return typeof e.addEventListener == "function" ? (e.addEventListener("change", t), () => e.removeEventListener("change", t)) : (e.addListener(t), () => e.removeListener(t));
|
|
87
|
+
}
|
|
88
|
+
function K() {
|
|
89
|
+
return h += 1, h > 1 || typeof window > "u" || (typeof window.matchMedia == "function" && (d = window.matchMedia(_), f = window.matchMedia(O), c({
|
|
90
|
+
...i,
|
|
91
|
+
prefersDark: d.matches,
|
|
92
|
+
prefersMoreContrast: f.matches
|
|
93
|
+
}), a = C(d, Y), l = C(f, F)), u = G, window.addEventListener("storage", u), typeof document < "u" && typeof MutationObserver < "u" && (T(), o = new MutationObserver(T), o.observe(document.documentElement, {
|
|
94
|
+
attributes: !0,
|
|
95
|
+
attributeFilter: ["class"]
|
|
96
|
+
}))), p;
|
|
97
|
+
}
|
|
98
|
+
let a = null, l = null, o = null;
|
|
99
|
+
function p() {
|
|
100
|
+
h -= 1, !(h > 0) && (a == null || a(), l == null || l(), a = null, l = null, d = null, f = null, u && typeof window < "u" && window.removeEventListener("storage", u), u = null, o == null || o.disconnect(), o = null);
|
|
101
|
+
}
|
|
102
|
+
function A(e) {
|
|
103
|
+
const t = e.theme === "system" ? e.prefersDark ? "dark" : "light" : e.theme, r = e.accessibility === "system" ? e.prefersMoreContrast : e.accessibility === "accessible";
|
|
104
|
+
return t === "dark" && r ? "dark-accessible" : t === "dark" ? "dark" : r ? "light-accessible" : "light";
|
|
105
|
+
}
|
|
106
|
+
function Q(e) {
|
|
107
|
+
switch (e) {
|
|
108
|
+
case "light":
|
|
109
|
+
return [n.light];
|
|
110
|
+
case "dark":
|
|
111
|
+
return [n.dark];
|
|
112
|
+
case "light-accessible":
|
|
113
|
+
return [n.light, n.accessible];
|
|
114
|
+
case "dark-accessible":
|
|
115
|
+
return [n.dark, n.accessible];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const U = [
|
|
119
|
+
n.light,
|
|
120
|
+
n.dark,
|
|
121
|
+
n.accessible
|
|
122
|
+
];
|
|
123
|
+
function B(e) {
|
|
124
|
+
if (typeof document > "u") return;
|
|
125
|
+
const t = document.documentElement, r = new Set(Q(e));
|
|
126
|
+
U.forEach((s) => {
|
|
127
|
+
r.has(s) ? t.classList.add(s) : t.classList.remove(s);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function W() {
|
|
131
|
+
const e = D(R, H, V);
|
|
132
|
+
k(() => K(), []), k(() => {
|
|
133
|
+
B(A(e));
|
|
134
|
+
}, [e]);
|
|
135
|
+
const t = M((s) => {
|
|
136
|
+
L(y, s === "system" ? null : s), c({ ...i, theme: s });
|
|
137
|
+
}, []), r = M((s) => {
|
|
138
|
+
L(
|
|
139
|
+
b,
|
|
140
|
+
s === "system" ? null : s
|
|
141
|
+
), c({ ...i, accessibility: s });
|
|
142
|
+
}, []);
|
|
143
|
+
return {
|
|
144
|
+
theme: e.theme,
|
|
145
|
+
accessibility: e.accessibility,
|
|
146
|
+
resolvedTheme: A(e),
|
|
147
|
+
setTheme: t,
|
|
148
|
+
setAccessibility: r
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
b as A,
|
|
153
|
+
n as T,
|
|
154
|
+
y as a,
|
|
155
|
+
A as r,
|
|
156
|
+
Q as t,
|
|
157
|
+
W as u
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=use-theme-CAuo6EYT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme-CAuo6EYT.js","sources":["../../src/hooks/use-theme.ts"],"sourcesContent":["import { useCallback, useEffect, useSyncExternalStore } from 'react';\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* */\n/* Modelled as two orthogonal axes per `src/docs/04-theming.mdx` — base */\n/* colour scheme and AAA contrast modifier — plus an explicit `system` */\n/* value meaning \"no user override, follow OS preferences\". The four */\n/* concrete applied themes called out in `hooks-gaps.mdx` are exposed */\n/* via `resolvedTheme` for code that needs to branch on the composed */\n/* result (e.g. data-visualisation libraries with their own theme */\n/* machinery). */\n/* -------------------------------------------------------------------- */\n\nexport type ThemeBase = 'light' | 'dark';\nexport type ThemePreference = ThemeBase | 'system';\nexport type AccessibilityPreference = 'default' | 'accessible' | 'system';\nexport type ResolvedTheme =\n | 'light'\n | 'dark'\n | 'light-accessible'\n | 'dark-accessible';\n\nexport interface UseThemeReturn {\n /** User's stored base-theme preference, or `'system'` when no override is set. */\n theme: ThemePreference;\n /** User's stored AAA-contrast preference, or `'system'` when no override is set. */\n accessibility: AccessibilityPreference;\n /** The theme actually applied to the DOM once the preferences + OS signals are resolved. */\n resolvedTheme: ResolvedTheme;\n /** Persist a new base-theme preference. Pass `'system'` to clear the override. */\n setTheme: (next: ThemePreference) => void;\n /** Persist a new AAA-contrast preference. Pass `'system'` to clear the override. */\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* SSR-safe named constants */\n/* */\n/* Exported so a consuming app's SSR shim can plant the correct classes */\n/* on `<html>` at render time without importing the whole hook (which */\n/* pulls in React, `useSyncExternalStore`, etc.). See the acceptance */\n/* criterion in `src/user_stories/to-do/review-findings/hooks-gaps.mdx`. */\n/* -------------------------------------------------------------------- */\n\nexport const THEME_STORAGE_KEY = 'alfadocs-ui.theme';\nexport const ACCESSIBILITY_STORAGE_KEY = 'alfadocs-ui.accessibility';\n\nexport const THEME_CLASS = {\n light: 'theme-light',\n dark: 'theme-dark',\n accessible: 'theme-accessible',\n} as const;\n\nconst COLOR_SCHEME_QUERY = '(prefers-color-scheme: dark)';\nconst CONTRAST_QUERY = '(prefers-contrast: more)';\n\n/* -------------------------------------------------------------------- */\n/* Persistence — guarded against private-mode / disabled-storage throws */\n/* -------------------------------------------------------------------- */\n\nfunction safeReadStorage(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeWriteStorage(key: string, value: string | null): void {\n if (typeof window === 'undefined') return;\n try {\n if (value === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, value);\n }\n } catch {\n /* Storage can throw in private mode or when quota is exceeded — the\n in-memory state is the source of truth, so a write failure is\n recoverable. Silent-fail matches how `usePrefersReducedMotion`\n handles `matchMedia` being unavailable. */\n }\n}\n\nfunction isValidTheme(value: unknown): value is ThemePreference {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nfunction isValidAccessibility(\n value: unknown,\n): value is AccessibilityPreference {\n return value === 'default' || value === 'accessible' || value === 'system';\n}\n\n/* -------------------------------------------------------------------- */\n/* External store — singleton so every `useTheme()` consumer in the */\n/* tree reads the same snapshot and only one `matchMedia` / storage */\n/* subscription is registered per tab. */\n/* -------------------------------------------------------------------- */\n\ninterface ThemeSnapshot {\n theme: ThemePreference;\n accessibility: AccessibilityPreference;\n prefersDark: boolean;\n prefersMoreContrast: boolean;\n}\n\nfunction readInitialSnapshot(): ThemeSnapshot {\n const storedTheme = safeReadStorage(THEME_STORAGE_KEY);\n const storedA11y = safeReadStorage(ACCESSIBILITY_STORAGE_KEY);\n\n const hasMatchMedia =\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n\n /* When storage has no explicit override, fall back to whatever theme\n classes are already on `<html>` (set by SSR, a consuming app's shell,\n or Storybook's `withThemeByClassName` decorator). Without this, a\n nested `<ThemeRoot>` driven by `resolvedTheme` would clobber the\n outer cascade with `theme-light` (the OS-preference default) and\n bomb the closest-ancestor token resolution for every child. */\n const htmlClasses =\n typeof document !== 'undefined' ? document.documentElement.classList : null;\n const htmlThemeOverride: ThemePreference | null = htmlClasses\n ? htmlClasses.contains(THEME_CLASS.dark)\n ? 'dark'\n : htmlClasses.contains(THEME_CLASS.light)\n ? 'light'\n : null\n : null;\n const htmlA11yOverride: AccessibilityPreference | null =\n htmlClasses?.contains(THEME_CLASS.accessible) ? 'accessible' : null;\n\n return {\n theme: isValidTheme(storedTheme)\n ? storedTheme\n : (htmlThemeOverride ?? 'system'),\n accessibility: isValidAccessibility(storedA11y)\n ? storedA11y\n : (htmlA11yOverride ?? 'system'),\n prefersDark: hasMatchMedia\n ? window.matchMedia(COLOR_SCHEME_QUERY).matches\n : false,\n prefersMoreContrast: hasMatchMedia\n ? window.matchMedia(CONTRAST_QUERY).matches\n : false,\n };\n}\n\nlet snapshot: ThemeSnapshot = readInitialSnapshot();\nconst listeners = new Set<() => void>();\n\nfunction commit(next: ThemeSnapshot): void {\n if (\n next.theme === snapshot.theme &&\n next.accessibility === snapshot.accessibility &&\n next.prefersDark === snapshot.prefersDark &&\n next.prefersMoreContrast === snapshot.prefersMoreContrast\n ) {\n return;\n }\n snapshot = next;\n listeners.forEach((listener) => listener());\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getSnapshot(): ThemeSnapshot {\n return snapshot;\n}\n\nfunction getServerSnapshot(): ThemeSnapshot {\n return {\n theme: 'system',\n accessibility: 'system',\n prefersDark: false,\n prefersMoreContrast: false,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Media-query subscriptions — mounted once per tab, on the first time */\n/* `useTheme` is called in the browser. Cleanup happens via a ref-count */\n/* in the subscription effect below. */\n/* -------------------------------------------------------------------- */\n\nlet mediaSubscriberCount = 0;\nlet colorSchemeMql: MediaQueryList | null = null;\nlet contrastMql: MediaQueryList | null = null;\nlet storageHandler: ((event: StorageEvent) => void) | null = null;\n\nfunction onColorSchemeChange(event: MediaQueryListEvent): void {\n commit({ ...snapshot, prefersDark: event.matches });\n}\n\nfunction onContrastChange(event: MediaQueryListEvent): void {\n commit({ ...snapshot, prefersMoreContrast: event.matches });\n}\n\nfunction onStorage(event: StorageEvent): void {\n if (event.key === THEME_STORAGE_KEY) {\n const next = isValidTheme(event.newValue) ? event.newValue : 'system';\n commit({ ...snapshot, theme: next });\n } else if (event.key === ACCESSIBILITY_STORAGE_KEY) {\n const next = isValidAccessibility(event.newValue)\n ? event.newValue\n : 'system';\n commit({ ...snapshot, accessibility: next });\n }\n}\n\n/* The `<html>` class fallback from `readInitialSnapshot` must stay LIVE:\n Storybook's `withThemeByClassName` decorator (and host apps' shells)\n rewrite the documentElement classes after this module's initial read,\n and a one-shot sample leaves the hook pinned to a stale preference —\n a nested `<ThemeRoot>` then clobbers the outer cascade (e.g. a\n `theme-light` root inside a `theme-dark` page). Stored preferences\n still win, mirroring the initial-read precedence. */\nfunction rederiveFromHtmlClasses(): void {\n if (typeof document === 'undefined') return;\n const classes = document.documentElement.classList;\n const storedTheme = safeReadStorage(THEME_STORAGE_KEY);\n const storedA11y = safeReadStorage(ACCESSIBILITY_STORAGE_KEY);\n const htmlTheme: ThemePreference | null = classes.contains(THEME_CLASS.dark)\n ? 'dark'\n : classes.contains(THEME_CLASS.light)\n ? 'light'\n : null;\n const htmlA11y: AccessibilityPreference | null = classes.contains(\n THEME_CLASS.accessible,\n )\n ? 'accessible'\n : null;\n commit({\n ...snapshot,\n theme: isValidTheme(storedTheme) ? storedTheme : (htmlTheme ?? 'system'),\n accessibility: isValidAccessibility(storedA11y)\n ? storedA11y\n : (htmlA11y ?? 'system'),\n });\n}\n\nfunction attachMqlListener(\n mql: MediaQueryList,\n handler: (event: MediaQueryListEvent) => void,\n): () => void {\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }\n // Safari < 14 fallback.\n mql.addListener(handler);\n return () => mql.removeListener(handler);\n}\n\nfunction mountMediaSubscriptions(): () => void {\n mediaSubscriberCount += 1;\n if (mediaSubscriberCount > 1) {\n return disposeOneSubscriber;\n }\n\n if (typeof window === 'undefined') {\n return disposeOneSubscriber;\n }\n\n if (typeof window.matchMedia === 'function') {\n colorSchemeMql = window.matchMedia(COLOR_SCHEME_QUERY);\n contrastMql = window.matchMedia(CONTRAST_QUERY);\n // Re-sync the module snapshot in case the OS preferences changed\n // between initial read and first effect run (hydration window).\n commit({\n ...snapshot,\n prefersDark: colorSchemeMql.matches,\n prefersMoreContrast: contrastMql.matches,\n });\n detachColorScheme = attachMqlListener(colorSchemeMql, onColorSchemeChange);\n detachContrast = attachMqlListener(contrastMql, onContrastChange);\n }\n\n // Cross-tab sync — `storage` only fires on *other* tabs, so the local\n // tab still needs setTheme to update snapshot directly (it does).\n storageHandler = onStorage;\n window.addEventListener('storage', storageHandler);\n\n // Live `<html>` class tracking — decorators / host shells may rewrite\n // the theme classes after mount; re-derive (and re-sync once now, in\n // case the classes changed inside the hydration window).\n if (\n typeof document !== 'undefined' &&\n typeof MutationObserver !== 'undefined'\n ) {\n rederiveFromHtmlClasses();\n htmlClassObserver = new MutationObserver(rederiveFromHtmlClasses);\n htmlClassObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n }\n\n return disposeOneSubscriber;\n}\n\nlet detachColorScheme: (() => void) | null = null;\nlet detachContrast: (() => void) | null = null;\nlet htmlClassObserver: MutationObserver | null = null;\n\nfunction disposeOneSubscriber(): void {\n mediaSubscriberCount -= 1;\n if (mediaSubscriberCount > 0) return;\n detachColorScheme?.();\n detachContrast?.();\n detachColorScheme = null;\n detachContrast = null;\n colorSchemeMql = null;\n contrastMql = null;\n if (storageHandler && typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n }\n storageHandler = null;\n htmlClassObserver?.disconnect();\n htmlClassObserver = null;\n}\n\n/* -------------------------------------------------------------------- */\n/* Resolution helpers */\n/* -------------------------------------------------------------------- */\n\nexport function resolveTheme(state: ThemeSnapshot): ResolvedTheme {\n const base: ThemeBase =\n state.theme === 'system'\n ? state.prefersDark\n ? 'dark'\n : 'light'\n : state.theme;\n const accessible =\n state.accessibility === 'system'\n ? state.prefersMoreContrast\n : state.accessibility === 'accessible';\n if (base === 'dark' && accessible) return 'dark-accessible';\n if (base === 'dark') return 'dark';\n if (accessible) return 'light-accessible';\n return 'light';\n}\n\nexport function themeClassList(resolved: ResolvedTheme): string[] {\n switch (resolved) {\n case 'light':\n return [THEME_CLASS.light];\n case 'dark':\n return [THEME_CLASS.dark];\n case 'light-accessible':\n return [THEME_CLASS.light, THEME_CLASS.accessible];\n case 'dark-accessible':\n return [THEME_CLASS.dark, THEME_CLASS.accessible];\n }\n}\n\nconst ALL_THEME_CLASSES = [\n THEME_CLASS.light,\n THEME_CLASS.dark,\n THEME_CLASS.accessible,\n];\n\nfunction applyToDocument(resolved: ResolvedTheme): void {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n const next = new Set(themeClassList(resolved));\n ALL_THEME_CLASSES.forEach((cls) => {\n if (next.has(cls)) {\n root.classList.add(cls);\n } else {\n root.classList.remove(cls);\n }\n });\n}\n\n/* -------------------------------------------------------------------- */\n/* Public hook */\n/* -------------------------------------------------------------------- */\n\n/**\n * Read and update the DS theme preference.\n *\n * - `theme` / `accessibility` are the stored user preferences, with\n * `'system'` meaning \"no override — follow OS\".\n * - `resolvedTheme` composes preferences + live `matchMedia` state into\n * one of the four concrete themes.\n * - `setTheme` / `setAccessibility` persist the override to\n * `localStorage` and re-apply classes to `document.documentElement`\n * synchronously. Pass `'system'` to clear.\n *\n * Singleton under the hood — every hook call shares one `matchMedia`\n * subscription, so mounting the hook many times does not multiply the\n * listener count. The hook also listens for cross-tab `storage` events\n * so a theme change in tab A is reflected in tab B without a reload.\n */\nexport function useTheme(): UseThemeReturn {\n const state = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n useEffect(() => mountMediaSubscriptions(), []);\n\n useEffect(() => {\n applyToDocument(resolveTheme(state));\n }, [state]);\n\n const setTheme = useCallback((next: ThemePreference) => {\n safeWriteStorage(THEME_STORAGE_KEY, next === 'system' ? null : next);\n commit({ ...snapshot, theme: next });\n }, []);\n\n const setAccessibility = useCallback((next: AccessibilityPreference) => {\n safeWriteStorage(\n ACCESSIBILITY_STORAGE_KEY,\n next === 'system' ? null : next,\n );\n commit({ ...snapshot, accessibility: next });\n }, []);\n\n return {\n theme: state.theme,\n accessibility: state.accessibility,\n resolvedTheme: resolveTheme(state),\n setTheme,\n setAccessibility,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Test hook — reset module-level state between tests. Not exported */\n/* from the barrel. */\n/* -------------------------------------------------------------------- */\n\nexport function __resetThemeStoreForTests(): void {\n snapshot = readInitialSnapshot();\n listeners.clear();\n mediaSubscriberCount = 0;\n detachColorScheme?.();\n detachContrast?.();\n detachColorScheme = null;\n detachContrast = null;\n colorSchemeMql = null;\n contrastMql = null;\n if (storageHandler && typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n }\n storageHandler = null;\n}\n"],"names":["THEME_STORAGE_KEY","ACCESSIBILITY_STORAGE_KEY","THEME_CLASS","COLOR_SCHEME_QUERY","CONTRAST_QUERY","safeReadStorage","key","safeWriteStorage","value","isValidTheme","isValidAccessibility","readInitialSnapshot","storedTheme","storedA11y","hasMatchMedia","htmlClasses","htmlThemeOverride","htmlA11yOverride","snapshot","listeners","commit","next","listener","subscribe","getSnapshot","getServerSnapshot","mediaSubscriberCount","colorSchemeMql","contrastMql","storageHandler","onColorSchemeChange","event","onContrastChange","onStorage","rederiveFromHtmlClasses","classes","htmlTheme","htmlA11y","attachMqlListener","mql","handler","mountMediaSubscriptions","detachColorScheme","detachContrast","htmlClassObserver","disposeOneSubscriber","resolveTheme","state","base","accessible","themeClassList","resolved","ALL_THEME_CLASSES","applyToDocument","root","cls","useTheme","useSyncExternalStore","useEffect","setTheme","useCallback","setAccessibility"],"mappings":";AA6CO,MAAMA,IAAoB,qBACpBC,IAA4B,6BAE5BC,IAAc;AAAA,EACzB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,YAAY;AACd,GAEMC,IAAqB,gCACrBC,IAAiB;AAMvB,SAASC,EAAgBC,GAA4B;AACnD,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI;AACF,WAAO,OAAO,aAAa,QAAQA,CAAG;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,EAAiBD,GAAaE,GAA4B;AACjE,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,MAAIA,MAAU,OACZ,OAAO,aAAa,WAAWF,CAAG,IAElC,OAAO,aAAa,QAAQA,GAAKE,CAAK;AAAA,IAE1C,QAAQ;AAAA,IAKR;AACF;AAEA,SAASC,EAAaD,GAA0C;AAC9D,SAAOA,MAAU,WAAWA,MAAU,UAAUA,MAAU;AAC5D;AAEA,SAASE,EACPF,GACkC;AAClC,SAAOA,MAAU,aAAaA,MAAU,gBAAgBA,MAAU;AACpE;AAeA,SAASG,IAAqC;AAC5C,QAAMC,IAAcP,EAAgBL,CAAiB,GAC/Ca,IAAaR,EAAgBJ,CAAyB,GAEtDa,IACJ,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,YAQ1DC,IACJ,OAAO,WAAa,MAAc,SAAS,gBAAgB,YAAY,MACnEC,IAA4CD,IAC9CA,EAAY,SAASb,EAAY,IAAI,IACnC,SACAa,EAAY,SAASb,EAAY,KAAK,IACpC,UACA,OACJ,MACEe,IACJF,KAAA,QAAAA,EAAa,SAASb,EAAY,cAAc,eAAe;AAEjE,SAAO;AAAA,IACL,OAAOO,EAAaG,CAAW,IAC3BA,IACCI,KAAqB;AAAA,IAC1B,eAAeN,EAAqBG,CAAU,IAC1CA,IACCI,KAAoB;AAAA,IACzB,aAAaH,IACT,OAAO,WAAWX,CAAkB,EAAE,UACtC;AAAA,IACJ,qBAAqBW,IACjB,OAAO,WAAWV,CAAc,EAAE,UAClC;AAAA,EAAA;AAER;AAEA,IAAIc,IAA0BP,EAAA;AAC9B,MAAMQ,wBAAgB,IAAA;AAEtB,SAASC,EAAOC,GAA2B;AACzC,EACEA,EAAK,UAAUH,EAAS,SACxBG,EAAK,kBAAkBH,EAAS,iBAChCG,EAAK,gBAAgBH,EAAS,eAC9BG,EAAK,wBAAwBH,EAAS,wBAIxCA,IAAWG,GACXF,EAAU,QAAQ,CAACG,MAAaA,EAAA,CAAU;AAC5C;AAEA,SAASC,EAAUD,GAAkC;AACnD,SAAAH,EAAU,IAAIG,CAAQ,GACf,MAAM;AACX,IAAAH,EAAU,OAAOG,CAAQ;AAAA,EAC3B;AACF;AAEA,SAASE,IAA6B;AACpC,SAAON;AACT;AAEA,SAASO,IAAmC;AAC1C,SAAO;AAAA,IACL,OAAO;AAAA,IACP,eAAe;AAAA,IACf,aAAa;AAAA,IACb,qBAAqB;AAAA,EAAA;AAEzB;AAQA,IAAIC,IAAuB,GACvBC,IAAwC,MACxCC,IAAqC,MACrCC,IAAyD;AAE7D,SAASC,EAAoBC,GAAkC;AAC7D,EAAAX,EAAO,EAAE,GAAGF,GAAU,aAAaa,EAAM,SAAS;AACpD;AAEA,SAASC,EAAiBD,GAAkC;AAC1D,EAAAX,EAAO,EAAE,GAAGF,GAAU,qBAAqBa,EAAM,SAAS;AAC5D;AAEA,SAASE,EAAUF,GAA2B;AAC5C,MAAIA,EAAM,QAAQ/B,GAAmB;AACnC,UAAMqB,IAAOZ,EAAasB,EAAM,QAAQ,IAAIA,EAAM,WAAW;AAC7D,IAAAX,EAAO,EAAE,GAAGF,GAAU,OAAOG,GAAM;AAAA,EACrC,WAAWU,EAAM,QAAQ9B,GAA2B;AAClD,UAAMoB,IAAOX,EAAqBqB,EAAM,QAAQ,IAC5CA,EAAM,WACN;AACJ,IAAAX,EAAO,EAAE,GAAGF,GAAU,eAAeG,GAAM;AAAA,EAC7C;AACF;AASA,SAASa,IAAgC;AACvC,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMC,IAAU,SAAS,gBAAgB,WACnCvB,IAAcP,EAAgBL,CAAiB,GAC/Ca,IAAaR,EAAgBJ,CAAyB,GACtDmC,IAAoCD,EAAQ,SAASjC,EAAY,IAAI,IACvE,SACAiC,EAAQ,SAASjC,EAAY,KAAK,IAChC,UACA,MACAmC,IAA2CF,EAAQ;AAAA,IACvDjC,EAAY;AAAA,EAAA,IAEV,eACA;AACJ,EAAAkB,EAAO;AAAA,IACL,GAAGF;AAAA,IACH,OAAOT,EAAaG,CAAW,IAAIA,IAAewB,KAAa;AAAA,IAC/D,eAAe1B,EAAqBG,CAAU,IAC1CA,IACCwB,KAAY;AAAA,EAAA,CAClB;AACH;AAEA,SAASC,EACPC,GACAC,GACY;AACZ,SAAI,OAAOD,EAAI,oBAAqB,cAClCA,EAAI,iBAAiB,UAAUC,CAAO,GAC/B,MAAMD,EAAI,oBAAoB,UAAUC,CAAO,MAGxDD,EAAI,YAAYC,CAAO,GAChB,MAAMD,EAAI,eAAeC,CAAO;AACzC;AAEA,SAASC,IAAsC;AAM7C,SALAf,KAAwB,GACpBA,IAAuB,KAIvB,OAAO,SAAW,QAIlB,OAAO,OAAO,cAAe,eAC/BC,IAAiB,OAAO,WAAWxB,CAAkB,GACrDyB,IAAc,OAAO,WAAWxB,CAAc,GAG9CgB,EAAO;AAAA,IACL,GAAGF;AAAA,IACH,aAAaS,EAAe;AAAA,IAC5B,qBAAqBC,EAAY;AAAA,EAAA,CAClC,GACDc,IAAoBJ,EAAkBX,GAAgBG,CAAmB,GACzEa,IAAiBL,EAAkBV,GAAaI,CAAgB,IAKlEH,IAAiBI,GACjB,OAAO,iBAAiB,WAAWJ,CAAc,GAM/C,OAAO,WAAa,OACpB,OAAO,mBAAqB,QAE5BK,EAAA,GACAU,IAAoB,IAAI,iBAAiBV,CAAuB,GAChEU,EAAkB,QAAQ,SAAS,iBAAiB;AAAA,IAClD,YAAY;AAAA,IACZ,iBAAiB,CAAC,OAAO;AAAA,EAAA,CAC1B,KAGIC;AACT;AAEA,IAAIH,IAAyC,MACzCC,IAAsC,MACtCC,IAA6C;AAEjD,SAASC,IAA6B;AAEpC,EADAnB,KAAwB,GACpB,EAAAA,IAAuB,OAC3BgB,KAAA,QAAAA,KACAC,KAAA,QAAAA,KACAD,IAAoB,MACpBC,IAAiB,MACjBhB,IAAiB,MACjBC,IAAc,MACVC,KAAkB,OAAO,SAAW,OACtC,OAAO,oBAAoB,WAAWA,CAAc,GAEtDA,IAAiB,MACjBe,KAAA,QAAAA,EAAmB,cACnBA,IAAoB;AACtB;AAMO,SAASE,EAAaC,GAAqC;AAChE,QAAMC,IACJD,EAAM,UAAU,WACZA,EAAM,cACJ,SACA,UACFA,EAAM,OACNE,IACJF,EAAM,kBAAkB,WACpBA,EAAM,sBACNA,EAAM,kBAAkB;AAC9B,SAAIC,MAAS,UAAUC,IAAmB,oBACtCD,MAAS,SAAe,SACxBC,IAAmB,qBAChB;AACT;AAEO,SAASC,EAAeC,GAAmC;AAChE,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,CAACjD,EAAY,KAAK;AAAA,IAC3B,KAAK;AACH,aAAO,CAACA,EAAY,IAAI;AAAA,IAC1B,KAAK;AACH,aAAO,CAACA,EAAY,OAAOA,EAAY,UAAU;AAAA,IACnD,KAAK;AACH,aAAO,CAACA,EAAY,MAAMA,EAAY,UAAU;AAAA,EAAA;AAEtD;AAEA,MAAMkD,IAAoB;AAAA,EACxBlD,EAAY;AAAA,EACZA,EAAY;AAAA,EACZA,EAAY;AACd;AAEA,SAASmD,EAAgBF,GAA+B;AACtD,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMG,IAAO,SAAS,iBAChBjC,IAAO,IAAI,IAAI6B,EAAeC,CAAQ,CAAC;AAC7C,EAAAC,EAAkB,QAAQ,CAACG,MAAQ;AACjC,IAAIlC,EAAK,IAAIkC,CAAG,IACdD,EAAK,UAAU,IAAIC,CAAG,IAEtBD,EAAK,UAAU,OAAOC,CAAG;AAAA,EAE7B,CAAC;AACH;AAsBO,SAASC,IAA2B;AACzC,QAAMT,IAAQU,EAAqBlC,GAAWC,GAAaC,CAAiB;AAE5E,EAAAiC,EAAU,MAAMjB,EAAA,GAA2B,EAAE,GAE7CiB,EAAU,MAAM;AACd,IAAAL,EAAgBP,EAAaC,CAAK,CAAC;AAAA,EACrC,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMY,IAAWC,EAAY,CAACvC,MAA0B;AACtD,IAAAd,EAAiBP,GAAmBqB,MAAS,WAAW,OAAOA,CAAI,GACnED,EAAO,EAAE,GAAGF,GAAU,OAAOG,GAAM;AAAA,EACrC,GAAG,CAAA,CAAE,GAECwC,IAAmBD,EAAY,CAACvC,MAAkC;AACtE,IAAAd;AAAA,MACEN;AAAA,MACAoB,MAAS,WAAW,OAAOA;AAAA,IAAA,GAE7BD,EAAO,EAAE,GAAGF,GAAU,eAAeG,GAAM;AAAA,EAC7C,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,OAAO0B,EAAM;AAAA,IACb,eAAeA,EAAM;AAAA,IACrB,eAAeD,EAAaC,CAAK;AAAA,IACjC,UAAAY;AAAA,IACA,kBAAAE;AAAA,EAAA;AAEJ;"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as d, jsx as e } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as U, useId as M, useState as T, useEffect as b, useMemo as G, useRef as p, useCallback as S } from "react";
|
|
3
3
|
import { c as V } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as X } from "react-i18next";
|
|
5
|
-
import { A as v } from "./alert-
|
|
5
|
+
import { A as v } from "./alert-_mUKLmwA.js";
|
|
6
6
|
import { B as Y } from "./button-DD_0Xdmr.js";
|
|
7
7
|
import { C as Z } from "./chevron-down-BX_NP2Yh.js";
|
|
8
8
|
const O = V(
|
|
@@ -217,4 +217,4 @@ nn.displayName = "WarningStack";
|
|
|
217
217
|
export {
|
|
218
218
|
nn as W
|
|
219
219
|
};
|
|
220
|
-
//# sourceMappingURL=warning-stack-
|
|
220
|
+
//# sourceMappingURL=warning-stack-Cv4fr5zo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warning-stack-CXfoAT-_.js","sources":["../../src/components/warning-stack/warning-stack.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type MutableRefObject,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Alert, type AlertProps } from '../alert/alert';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface WarningStackItem {\n id: string;\n variant?: AlertProps['variant'];\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n dismissible?: boolean;\n}\n\nconst stackVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n // `stretch: true` fills the parent layout cell — mirrors the `stretch`\n // prop on `Card` so a WarningStack rendered next to a Card in a grid\n // row ends up at matching height.\n stretch: {\n true: 'ds:h-full ds:self-stretch',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n stretch: false,\n },\n },\n);\n\n// Single column by default; two columns once the stack itself is wide\n// enough (container query — viewport width lies when the stack sits in\n// a narrow grid cell). A trailing odd item spans both columns so the\n// grid never ends on a half-width hole, which also keeps a lone item\n// full-width exactly as before.\nconst listVariants = cva(\n [\n 'ds:grid ds:grid-cols-1',\n 'ds:@3xl/warning-stack:grid-cols-2',\n 'ds:@3xl/warning-stack:[&>li:nth-child(odd):last-child]:col-span-full',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst TOGGLE_CLASSES = [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:self-start',\n].join(' ');\n\nexport interface WarningStackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'role' | 'title'>,\n VariantProps<typeof stackVariants> {\n /** Items rendered inside the stack. */\n items: WarningStackItem[];\n /** Fill the parent layout cell — use in a dashboard grid row so the\n * stack ends up with matching height to sibling Cards. */\n stretch?: boolean;\n /** Visible title rendered as an `<h2>` above the stack. Also labels the\n * region for assistive tech. When omitted, the region is labelled via a\n * visually hidden heading using `ariaLabel` (or the default \"Warnings\"). */\n title?: ReactNode;\n /** Optional short description rendered under the title. */\n description?: ReactNode;\n /** Cap on visible items before a \"Show N more\" toggle appears. */\n maxVisible?: number;\n /** Whether the stack starts collapsed when items exceed `maxVisible`. */\n defaultCollapsed?: boolean;\n /** Fires when a dismissible item's close control is activated. */\n onDismiss?: (item: WarningStackItem) => void;\n /** Accessible label for the region when `title` is not set. */\n ariaLabel?: string;\n /** Optional node rendered when the stack has zero items. */\n emptyState?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const WarningStack = forwardRef<HTMLDivElement, WarningStackProps>(\n (\n {\n items,\n title,\n description,\n maxVisible,\n defaultCollapsed = true,\n onDismiss,\n size = 'md',\n stretch = false,\n ariaLabel,\n emptyState,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelId = useId();\n const listId = useId();\n\n // Track dismissed ids internally so the <li> unmounts even when the\n // consumer doesn't mirror dismissal into `items` — otherwise the list\n // keeps a ghost entry (and the two-column grid a blank cell). Pruned\n // when an id leaves `items`, so a re-pushed item renders again.\n const [dismissedIds, setDismissedIds] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n useEffect(() => {\n setDismissedIds((prev) => {\n if (prev.size === 0) return prev;\n const ids = new Set(items.map((item) => item.id));\n const next = new Set([...prev].filter((id) => ids.has(id)));\n return next.size === prev.size ? prev : next;\n });\n }, [items]);\n\n const liveItems = useMemo(\n () => items.filter((item) => !dismissedIds.has(item.id)),\n [items, dismissedIds],\n );\n\n const overflow = maxVisible !== undefined && liveItems.length > maxVisible;\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n // Live-region announces the count when items change.\n const liveRef = useRef<HTMLDivElement>(null);\n const lastCountRef = useRef<number>(liveItems.length);\n\n useEffect(() => {\n if (!liveRef.current) return;\n const prev = lastCountRef.current;\n const next = liveItems.length;\n if (prev !== next) {\n liveRef.current.textContent = t('warningStack.countChanged', {\n count: next,\n defaultValue: '{{count}} warnings to review',\n });\n }\n lastCountRef.current = next;\n }, [liveItems.length, t]);\n\n const visible = useMemo(() => {\n if (!overflow || !collapsed) return liveItems;\n return liveItems.slice(0, maxVisible);\n }, [liveItems, overflow, collapsed, maxVisible]);\n\n const hiddenCount = overflow ? liveItems.length - (maxVisible ?? 0) : 0;\n\n // Focus hand-off: dismissing unmounts the focused close button, which\n // would otherwise drop focus to <body> (WCAG 2.4.3). Aim for the\n // dismiss control now occupying the same list position (the next\n // item), else the last remaining one, else the region itself.\n const sectionRef = useRef<HTMLElement | null>(null);\n const setSectionRef = useCallback(\n (node: HTMLElement | null) => {\n sectionRef.current = node;\n if (typeof ref === 'function') {\n ref(node as HTMLDivElement | null);\n } else if (ref) {\n (ref as MutableRefObject<HTMLDivElement | null>).current =\n node as HTMLDivElement | null;\n }\n },\n [ref],\n );\n const pendingFocusIndexRef = useRef<number | null>(null);\n useEffect(() => {\n if (pendingFocusIndexRef.current === null) return;\n const index = pendingFocusIndexRef.current;\n pendingFocusIndexRef.current = null;\n const section = sectionRef.current;\n if (!section) return;\n const dismissControls = Array.from(\n section.querySelectorAll<HTMLButtonElement>('[data-alert-dismiss]'),\n );\n const target =\n dismissControls[Math.min(index, dismissControls.length - 1)];\n if (target) target.focus();\n else section.focus();\n });\n\n const handleDismiss = useCallback(\n (item: WarningStackItem, index: number) => (open: boolean) => {\n if (open) return;\n pendingFocusIndexRef.current = index;\n setDismissedIds((prev) => new Set(prev).add(item.id));\n onDismiss?.(item);\n },\n [onDismiss],\n );\n\n const toggle = useCallback(() => setCollapsed((c) => !c), []);\n\n const regionLabel = ariaLabel ?? t('warningStack.regionLabel', 'Warnings');\n\n // Title block: a visible header when `title` is provided; otherwise a\n // visually hidden heading so the region still has a programmatic name.\n // A `<div>` rather than `<header>` wrapper keeps the `<header>` element's\n // implicit banner role from leaking out of the region.\n const header = title ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h2\n id={labelId}\n className=\"ds:text-start type-title-section ds:text-[var(--foreground)]\"\n >\n {title}\n </h2>\n {description ? (\n <p className=\"ds:text-start type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </p>\n ) : null}\n </div>\n ) : (\n <h2 id={labelId} className=\"ds:sr-only\">\n {regionLabel}\n </h2>\n );\n\n if (liveItems.length === 0) {\n if (!emptyState) return null;\n return (\n <section\n ref={setSectionRef}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n // Programmatically focusable so the last dismissal can land here.\n tabIndex={-1}\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n {emptyState}\n </section>\n );\n }\n\n return (\n <section\n ref={setSectionRef}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n tabIndex={-1}\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n <div\n ref={liveRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n {/* Container-type lives on this wrapper (never on the flex\n section itself) so the list can query its own inline size. */}\n <div className=\"ds:@container/warning-stack\">\n <ul\n id={listId}\n className={listVariants({ size })}\n // Neutral wording — the list mixes warnings with info notices\n // and promo offers.\n aria-label={t('warningStack.listLabel', 'Notices')}\n >\n {visible.map((item, index) => {\n const variant = item.variant ?? 'warning';\n return (\n <li key={item.id}>\n <Alert\n variant={variant}\n dismissible={item.dismissible}\n icon={item.icon}\n onOpenChange={handleDismiss(item, index)}\n // Fill the row so side-by-side alerts equalise height.\n className=\"ds:h-full\"\n >\n {/* `as=\"h3\"` keeps a clean heading ladder — the stack's\n h2 labels the region, then each item's h3 rises from it. */}\n <Alert.Title as=\"h3\">{item.title}</Alert.Title>\n {item.description ? (\n <Alert.Description>{item.description}</Alert.Description>\n ) : null}\n {item.actions ? (\n <Alert.Action>{item.actions}</Alert.Action>\n ) : null}\n </Alert>\n </li>\n );\n })}\n </ul>\n </div>\n\n {overflow ? (\n <Button\n type=\"button\"\n intent=\"link\"\n size=\"sm\"\n aria-expanded={!collapsed}\n aria-controls={listId}\n onClick={toggle}\n className={TOGGLE_CLASSES}\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={[\n 'ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n collapsed ? '' : 'ds:rotate-180',\n ].join(' ')}\n />\n {collapsed\n ? t('warningStack.showMore', {\n count: hiddenCount,\n defaultValue: 'Show {{count}} more warnings',\n })\n : t('warningStack.showLess', 'Show less')}\n </Button>\n ) : null}\n </section>\n );\n },\n);\n\nWarningStack.displayName = 'WarningStack';\n"],"names":["stackVariants","cva","listVariants","TOGGLE_CLASSES","WarningStack","forwardRef","items","title","description","maxVisible","defaultCollapsed","onDismiss","size","stretch","ariaLabel","emptyState","className","rest","ref","t","useTranslation","labelId","useId","listId","dismissedIds","setDismissedIds","useState","useEffect","prev","ids","item","next","id","liveItems","useMemo","overflow","collapsed","setCollapsed","liveRef","useRef","lastCountRef","visible","hiddenCount","sectionRef","setSectionRef","useCallback","node","pendingFocusIndexRef","index","section","dismissControls","target","handleDismiss","open","toggle","c","regionLabel","header","jsxs","jsx","variant","Alert","Button","ChevronDown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"warning-stack-Cv4fr5zo.js","sources":["../../src/components/warning-stack/warning-stack.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type MutableRefObject,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Alert, type AlertProps } from '../alert/alert';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface WarningStackItem {\n id: string;\n variant?: AlertProps['variant'];\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n dismissible?: boolean;\n}\n\nconst stackVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n // `stretch: true` fills the parent layout cell — mirrors the `stretch`\n // prop on `Card` so a WarningStack rendered next to a Card in a grid\n // row ends up at matching height.\n stretch: {\n true: 'ds:h-full ds:self-stretch',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n stretch: false,\n },\n },\n);\n\n// Single column by default; two columns once the stack itself is wide\n// enough (container query — viewport width lies when the stack sits in\n// a narrow grid cell). A trailing odd item spans both columns so the\n// grid never ends on a half-width hole, which also keeps a lone item\n// full-width exactly as before.\nconst listVariants = cva(\n [\n 'ds:grid ds:grid-cols-1',\n 'ds:@3xl/warning-stack:grid-cols-2',\n 'ds:@3xl/warning-stack:[&>li:nth-child(odd):last-child]:col-span-full',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst TOGGLE_CLASSES = [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:self-start',\n].join(' ');\n\nexport interface WarningStackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'role' | 'title'>,\n VariantProps<typeof stackVariants> {\n /** Items rendered inside the stack. */\n items: WarningStackItem[];\n /** Fill the parent layout cell — use in a dashboard grid row so the\n * stack ends up with matching height to sibling Cards. */\n stretch?: boolean;\n /** Visible title rendered as an `<h2>` above the stack. Also labels the\n * region for assistive tech. When omitted, the region is labelled via a\n * visually hidden heading using `ariaLabel` (or the default \"Warnings\"). */\n title?: ReactNode;\n /** Optional short description rendered under the title. */\n description?: ReactNode;\n /** Cap on visible items before a \"Show N more\" toggle appears. */\n maxVisible?: number;\n /** Whether the stack starts collapsed when items exceed `maxVisible`. */\n defaultCollapsed?: boolean;\n /** Fires when a dismissible item's close control is activated. */\n onDismiss?: (item: WarningStackItem) => void;\n /** Accessible label for the region when `title` is not set. */\n ariaLabel?: string;\n /** Optional node rendered when the stack has zero items. */\n emptyState?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const WarningStack = forwardRef<HTMLDivElement, WarningStackProps>(\n (\n {\n items,\n title,\n description,\n maxVisible,\n defaultCollapsed = true,\n onDismiss,\n size = 'md',\n stretch = false,\n ariaLabel,\n emptyState,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelId = useId();\n const listId = useId();\n\n // Track dismissed ids internally so the <li> unmounts even when the\n // consumer doesn't mirror dismissal into `items` — otherwise the list\n // keeps a ghost entry (and the two-column grid a blank cell). Pruned\n // when an id leaves `items`, so a re-pushed item renders again.\n const [dismissedIds, setDismissedIds] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n useEffect(() => {\n setDismissedIds((prev) => {\n if (prev.size === 0) return prev;\n const ids = new Set(items.map((item) => item.id));\n const next = new Set([...prev].filter((id) => ids.has(id)));\n return next.size === prev.size ? prev : next;\n });\n }, [items]);\n\n const liveItems = useMemo(\n () => items.filter((item) => !dismissedIds.has(item.id)),\n [items, dismissedIds],\n );\n\n const overflow = maxVisible !== undefined && liveItems.length > maxVisible;\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n // Live-region announces the count when items change.\n const liveRef = useRef<HTMLDivElement>(null);\n const lastCountRef = useRef<number>(liveItems.length);\n\n useEffect(() => {\n if (!liveRef.current) return;\n const prev = lastCountRef.current;\n const next = liveItems.length;\n if (prev !== next) {\n liveRef.current.textContent = t('warningStack.countChanged', {\n count: next,\n defaultValue: '{{count}} warnings to review',\n });\n }\n lastCountRef.current = next;\n }, [liveItems.length, t]);\n\n const visible = useMemo(() => {\n if (!overflow || !collapsed) return liveItems;\n return liveItems.slice(0, maxVisible);\n }, [liveItems, overflow, collapsed, maxVisible]);\n\n const hiddenCount = overflow ? liveItems.length - (maxVisible ?? 0) : 0;\n\n // Focus hand-off: dismissing unmounts the focused close button, which\n // would otherwise drop focus to <body> (WCAG 2.4.3). Aim for the\n // dismiss control now occupying the same list position (the next\n // item), else the last remaining one, else the region itself.\n const sectionRef = useRef<HTMLElement | null>(null);\n const setSectionRef = useCallback(\n (node: HTMLElement | null) => {\n sectionRef.current = node;\n if (typeof ref === 'function') {\n ref(node as HTMLDivElement | null);\n } else if (ref) {\n (ref as MutableRefObject<HTMLDivElement | null>).current =\n node as HTMLDivElement | null;\n }\n },\n [ref],\n );\n const pendingFocusIndexRef = useRef<number | null>(null);\n useEffect(() => {\n if (pendingFocusIndexRef.current === null) return;\n const index = pendingFocusIndexRef.current;\n pendingFocusIndexRef.current = null;\n const section = sectionRef.current;\n if (!section) return;\n const dismissControls = Array.from(\n section.querySelectorAll<HTMLButtonElement>('[data-alert-dismiss]'),\n );\n const target =\n dismissControls[Math.min(index, dismissControls.length - 1)];\n if (target) target.focus();\n else section.focus();\n });\n\n const handleDismiss = useCallback(\n (item: WarningStackItem, index: number) => (open: boolean) => {\n if (open) return;\n pendingFocusIndexRef.current = index;\n setDismissedIds((prev) => new Set(prev).add(item.id));\n onDismiss?.(item);\n },\n [onDismiss],\n );\n\n const toggle = useCallback(() => setCollapsed((c) => !c), []);\n\n const regionLabel = ariaLabel ?? t('warningStack.regionLabel', 'Warnings');\n\n // Title block: a visible header when `title` is provided; otherwise a\n // visually hidden heading so the region still has a programmatic name.\n // A `<div>` rather than `<header>` wrapper keeps the `<header>` element's\n // implicit banner role from leaking out of the region.\n const header = title ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h2\n id={labelId}\n className=\"ds:text-start type-title-section ds:text-[var(--foreground)]\"\n >\n {title}\n </h2>\n {description ? (\n <p className=\"ds:text-start type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </p>\n ) : null}\n </div>\n ) : (\n <h2 id={labelId} className=\"ds:sr-only\">\n {regionLabel}\n </h2>\n );\n\n if (liveItems.length === 0) {\n if (!emptyState) return null;\n return (\n <section\n ref={setSectionRef}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n // Programmatically focusable so the last dismissal can land here.\n tabIndex={-1}\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n {emptyState}\n </section>\n );\n }\n\n return (\n <section\n ref={setSectionRef}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n tabIndex={-1}\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n <div\n ref={liveRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n {/* Container-type lives on this wrapper (never on the flex\n section itself) so the list can query its own inline size. */}\n <div className=\"ds:@container/warning-stack\">\n <ul\n id={listId}\n className={listVariants({ size })}\n // Neutral wording — the list mixes warnings with info notices\n // and promo offers.\n aria-label={t('warningStack.listLabel', 'Notices')}\n >\n {visible.map((item, index) => {\n const variant = item.variant ?? 'warning';\n return (\n <li key={item.id}>\n <Alert\n variant={variant}\n dismissible={item.dismissible}\n icon={item.icon}\n onOpenChange={handleDismiss(item, index)}\n // Fill the row so side-by-side alerts equalise height.\n className=\"ds:h-full\"\n >\n {/* `as=\"h3\"` keeps a clean heading ladder — the stack's\n h2 labels the region, then each item's h3 rises from it. */}\n <Alert.Title as=\"h3\">{item.title}</Alert.Title>\n {item.description ? (\n <Alert.Description>{item.description}</Alert.Description>\n ) : null}\n {item.actions ? (\n <Alert.Action>{item.actions}</Alert.Action>\n ) : null}\n </Alert>\n </li>\n );\n })}\n </ul>\n </div>\n\n {overflow ? (\n <Button\n type=\"button\"\n intent=\"link\"\n size=\"sm\"\n aria-expanded={!collapsed}\n aria-controls={listId}\n onClick={toggle}\n className={TOGGLE_CLASSES}\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={[\n 'ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n collapsed ? '' : 'ds:rotate-180',\n ].join(' ')}\n />\n {collapsed\n ? t('warningStack.showMore', {\n count: hiddenCount,\n defaultValue: 'Show {{count}} more warnings',\n })\n : t('warningStack.showLess', 'Show less')}\n </Button>\n ) : null}\n </section>\n );\n },\n);\n\nWarningStack.displayName = 'WarningStack';\n"],"names":["stackVariants","cva","listVariants","TOGGLE_CLASSES","WarningStack","forwardRef","items","title","description","maxVisible","defaultCollapsed","onDismiss","size","stretch","ariaLabel","emptyState","className","rest","ref","t","useTranslation","labelId","useId","listId","dismissedIds","setDismissedIds","useState","useEffect","prev","ids","item","next","id","liveItems","useMemo","overflow","collapsed","setCollapsed","liveRef","useRef","lastCountRef","visible","hiddenCount","sectionRef","setSectionRef","useCallback","node","pendingFocusIndexRef","index","section","dismissControls","target","handleDismiss","open","toggle","c","regionLabel","header","jsxs","jsx","variant","Alert","Button","ChevronDown"],"mappings":";;;;;;;AAgCA,MAAMA,IAAgBC;AAAA,EACpB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA;AAAA;AAAA;AAAA,MAKN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ,GAOMC,IAAeD;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,KAAA;AAAA,EAAK;AAElC,GAEME,IAAiB;AAAA,EACrB;AACF,EAAE,KAAK,GAAG,GAiCGC,KAAeC;AAAA,EAC1B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC,IAAmB;AAAA,IACnB,WAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACVC,IAASD,EAAA,GAMT,CAACE,GAAcC,CAAe,IAAIC;AAAA,MACtC,0BAAU,IAAA;AAAA,IAAI;AAEhB,IAAAC,EAAU,MAAM;AACd,MAAAF,EAAgB,CAACG,MAAS;AACxB,YAAIA,EAAK,SAAS,EAAG,QAAOA;AAC5B,cAAMC,IAAM,IAAI,IAAIvB,EAAM,IAAI,CAACwB,MAASA,EAAK,EAAE,CAAC,GAC1CC,IAAO,IAAI,IAAI,CAAC,GAAGH,CAAI,EAAE,OAAO,CAACI,MAAOH,EAAI,IAAIG,CAAE,CAAC,CAAC;AAC1D,eAAOD,EAAK,SAASH,EAAK,OAAOA,IAAOG;AAAA,MAC1C,CAAC;AAAA,IACH,GAAG,CAACzB,CAAK,CAAC;AAEV,UAAM2B,IAAYC;AAAA,MAChB,MAAM5B,EAAM,OAAO,CAACwB,MAAS,CAACN,EAAa,IAAIM,EAAK,EAAE,CAAC;AAAA,MACvD,CAACxB,GAAOkB,CAAY;AAAA,IAAA,GAGhBW,IAAW1B,MAAe,UAAawB,EAAU,SAASxB,GAC1D,CAAC2B,GAAWC,CAAY,IAAIX,EAAShB,CAAgB,GAGrD4B,IAAUC,EAAuB,IAAI,GACrCC,IAAeD,EAAeN,EAAU,MAAM;AAEpD,IAAAN,EAAU,MAAM;AACd,UAAI,CAACW,EAAQ,QAAS;AACtB,YAAMV,IAAOY,EAAa,SACpBT,IAAOE,EAAU;AACvB,MAAIL,MAASG,MACXO,EAAQ,QAAQ,cAAcnB,EAAE,6BAA6B;AAAA,QAC3D,OAAOY;AAAA,QACP,cAAc;AAAA,MAAA,CACf,IAEHS,EAAa,UAAUT;AAAA,IACzB,GAAG,CAACE,EAAU,QAAQd,CAAC,CAAC;AAExB,UAAMsB,IAAUP,EAAQ,MAClB,CAACC,KAAY,CAACC,IAAkBH,IAC7BA,EAAU,MAAM,GAAGxB,CAAU,GACnC,CAACwB,GAAWE,GAAUC,GAAW3B,CAAU,CAAC,GAEzCiC,IAAcP,IAAWF,EAAU,UAAUxB,KAAc,KAAK,GAMhEkC,IAAaJ,EAA2B,IAAI,GAC5CK,IAAgBC;AAAA,MACpB,CAACC,MAA6B;AAC5B,QAAAH,EAAW,UAAUG,GACjB,OAAO5B,KAAQ,aACjBA,EAAI4B,CAA6B,IACxB5B,MACRA,EAAgD,UAC/C4B;AAAA,MAEN;AAAA,MACA,CAAC5B,CAAG;AAAA,IAAA,GAEA6B,IAAuBR,EAAsB,IAAI;AACvD,IAAAZ,EAAU,MAAM;AACd,UAAIoB,EAAqB,YAAY,KAAM;AAC3C,YAAMC,IAAQD,EAAqB;AACnC,MAAAA,EAAqB,UAAU;AAC/B,YAAME,IAAUN,EAAW;AAC3B,UAAI,CAACM,EAAS;AACd,YAAMC,IAAkB,MAAM;AAAA,QAC5BD,EAAQ,iBAAoC,sBAAsB;AAAA,MAAA,GAE9DE,IACJD,EAAgB,KAAK,IAAIF,GAAOE,EAAgB,SAAS,CAAC,CAAC;AAC7D,MAAIC,MAAe,MAAA,MACN,MAAA;AAAA,IACf,CAAC;AAED,UAAMC,IAAgBP;AAAA,MACpB,CAACf,GAAwBkB,MAAkB,CAACK,MAAkB;AAC5D,QAAIA,MACJN,EAAqB,UAAUC,GAC/BvB,EAAgB,CAACG,MAAS,IAAI,IAAIA,CAAI,EAAE,IAAIE,EAAK,EAAE,CAAC,GACpDnB,KAAA,QAAAA,EAAYmB;AAAA,MACd;AAAA,MACA,CAACnB,CAAS;AAAA,IAAA,GAGN2C,IAAST,EAAY,MAAMR,EAAa,CAACkB,MAAM,CAACA,CAAC,GAAG,EAAE,GAEtDC,IAAc1C,KAAaK,EAAE,4BAA4B,UAAU,GAMnEsC,IAASlD,IACb,gBAAAmD,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAItC;AAAA,UACJ,WAAU;AAAA,UAET,UAAAd;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFC,IACC,gBAAAmD,EAAC,KAAA,EAAE,WAAU,gEACV,aACH,IACE;AAAA,IAAA,EAAA,CACN,IAEA,gBAAAA,EAAC,MAAA,EAAG,IAAItC,GAAS,WAAU,cACxB,UAAAmC,GACH;AAGF,WAAIvB,EAAU,WAAW,IAClBlB,IAEH,gBAAA2C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKd;AAAA,QACL,mBAAiBvB;AAAA,QACjB,kBAAe;AAAA,QAEf,UAAU;AAAA,QACV,WAAW,CAACrB,EAAc,EAAE,MAAAY,GAAM,SAAAC,EAAA,CAAS,GAAGG,CAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAAwC;AAAA,UACA1C;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAdmB,OAoBxB,gBAAA2C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKd;AAAA,QACL,mBAAiBvB;AAAA,QACjB,kBAAe;AAAA,QACf,UAAU;AAAA,QACV,WAAW,CAACrB,EAAc,EAAE,MAAAY,GAAM,SAAAC,EAAA,CAAS,GAAGG,CAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAAwC;AAAA,UACD,gBAAAE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKrB;AAAA,cACL,aAAU;AAAA,cACV,eAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAIZ,gBAAAqB,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIpC;AAAA,cACJ,WAAWrB,EAAa,EAAE,MAAAU,GAAM;AAAA,cAGhC,cAAYO,EAAE,0BAA0B,SAAS;AAAA,cAEhD,UAAAsB,EAAQ,IAAI,CAACX,GAAMkB,MAAU;AAC5B,sBAAMY,IAAU9B,EAAK,WAAW;AAChC,yCACG,MAAA,EACC,UAAA,gBAAA4B;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,SAAAD;AAAA,oBACA,aAAa9B,EAAK;AAAA,oBAClB,MAAMA,EAAK;AAAA,oBACX,cAAcsB,EAActB,GAAMkB,CAAK;AAAA,oBAEvC,WAAU;AAAA,oBAIV,UAAA;AAAA,sBAAA,gBAAAW,EAACE,EAAM,OAAN,EAAY,IAAG,MAAM,YAAK,OAAM;AAAA,sBAChC/B,EAAK,cACJ,gBAAA6B,EAACE,EAAM,aAAN,EAAmB,UAAA/B,EAAK,aAAY,IACnC;AAAA,sBACHA,EAAK,UACJ,gBAAA6B,EAACE,EAAM,QAAN,EAAc,UAAA/B,EAAK,SAAQ,IAC1B;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA,EACN,GAlBOA,EAAK,EAmBd;AAAA,cAEJ,CAAC;AAAA,YAAA;AAAA,UAAA,GAEL;AAAA,UAECK,IACC,gBAAAuB;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,MAAK;AAAA,cACL,iBAAe,CAAC1B;AAAA,cAChB,iBAAeb;AAAA,cACf,SAAS+B;AAAA,cACT,WAAWnD;AAAA,cAEX,UAAA;AAAA,gBAAA,gBAAAwD;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,eAAY;AAAA,oBACZ,WAAW;AAAA,sBACT;AAAA,sBACA3B,IAAY,KAAK;AAAA,oBAAA,EACjB,KAAK,GAAG;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEXA,IACGjB,EAAE,yBAAyB;AAAA,kBACzB,OAAOuB;AAAA,kBACP,cAAc;AAAA,gBAAA,CACf,IACDvB,EAAE,yBAAyB,WAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAE1C;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AAEAf,GAAa,cAAc;"}
|
|
@@ -11,9 +11,9 @@ import { P as U } from "./pencil-CfQX-0Qc.js";
|
|
|
11
11
|
import { c as z } from "./createLucideIcon-CrFbzy84.js";
|
|
12
12
|
import { C as Ne } from "./circle-BkqTgYmt.js";
|
|
13
13
|
import { u as Ce } from "./registry-nPAVE19X.js";
|
|
14
|
-
import { A as V } from "./alert-
|
|
14
|
+
import { A as V } from "./alert-_mUKLmwA.js";
|
|
15
15
|
import { B as _e } from "./button-DD_0Xdmr.js";
|
|
16
|
-
import { D as N } from "./dropdown-menu-
|
|
16
|
+
import { D as N } from "./dropdown-menu-DwwPovMZ.js";
|
|
17
17
|
import { E } from "./empty-state-BLy7tigq.js";
|
|
18
18
|
import { P as ae } from "./plus-CYKNmfuA.js";
|
|
19
19
|
import { G as ne } from "./globe-BkEFMNSg.js";
|
|
@@ -1366,4 +1366,4 @@ export {
|
|
|
1366
1366
|
ee as r,
|
|
1367
1367
|
L as w
|
|
1368
1368
|
};
|
|
1369
|
-
//# sourceMappingURL=workflow-map-
|
|
1369
|
+
//# sourceMappingURL=workflow-map-BJDUNYlX.js.map
|