pi-kiosk-shared 2.2.49 → 2.2.50

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.
Files changed (42) hide show
  1. package/dist/auditEventCodes.d.ts +1 -1
  2. package/dist/auditEventCodes.d.ts.map +1 -1
  3. package/dist/auditEventCodes.js +10 -0
  4. package/dist/auditEventCodes.js.map +1 -1
  5. package/dist/auditEventDescriptions.d.ts.map +1 -1
  6. package/dist/auditEventDescriptions.js +40 -0
  7. package/dist/auditEventDescriptions.js.map +1 -1
  8. package/dist/auditEventLabels.d.ts.map +1 -1
  9. package/dist/auditEventLabels.js +40 -0
  10. package/dist/auditEventLabels.js.map +1 -1
  11. package/dist/auditMetadataDisplayFields.d.ts.map +1 -1
  12. package/dist/auditMetadataDisplayFields.js +35 -0
  13. package/dist/auditMetadataDisplayFields.js.map +1 -1
  14. package/dist/ui/BottomSheet/BottomSheet.d.ts +12 -1
  15. package/dist/ui/BottomSheet/BottomSheet.d.ts.map +1 -1
  16. package/dist/ui/BottomSheet/BottomSheet.js +71 -10
  17. package/dist/ui/BottomSheet/BottomSheet.js.map +1 -1
  18. package/dist/ui/Dialog/Dialog.d.ts +15 -1
  19. package/dist/ui/Dialog/Dialog.d.ts.map +1 -1
  20. package/dist/ui/Dialog/Dialog.js +68 -10
  21. package/dist/ui/Dialog/Dialog.js.map +1 -1
  22. package/dist/ui/FormField/FormField.d.ts +7 -2
  23. package/dist/ui/FormField/FormField.d.ts.map +1 -1
  24. package/dist/ui/FormField/FormField.js +25 -3
  25. package/dist/ui/FormField/FormField.js.map +1 -1
  26. package/dist/ui/Toast/Toast.d.ts +11 -1
  27. package/dist/ui/Toast/Toast.d.ts.map +1 -1
  28. package/dist/ui/Toast/Toast.js +14 -2
  29. package/dist/ui/Toast/Toast.js.map +1 -1
  30. package/dist/ui/index.d.ts +10 -0
  31. package/dist/ui/index.d.ts.map +1 -1
  32. package/dist/ui/index.js +10 -0
  33. package/dist/ui/index.js.map +1 -1
  34. package/dist/ui/overlay/overlayFocus.d.ts +26 -0
  35. package/dist/ui/overlay/overlayFocus.d.ts.map +1 -0
  36. package/dist/ui/overlay/overlayFocus.js +123 -0
  37. package/dist/ui/overlay/overlayFocus.js.map +1 -0
  38. package/dist/ui/overlay/overlayMotion.d.ts +32 -0
  39. package/dist/ui/overlay/overlayMotion.d.ts.map +1 -0
  40. package/dist/ui/overlay/overlayMotion.js +80 -0
  41. package/dist/ui/overlay/overlayMotion.js.map +1 -0
  42. package/package.json +6 -1
@@ -1,31 +1,89 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect } from 'react';
3
- export function Dialog({ open, onClose, title, children, closeOnOverlayClick = true, closeLabel = 'Close', className, testId = 'dialog', }) {
2
+ import { useEffect, useId, useRef } from 'react';
3
+ import { focusInitialInContainer, handleFocusTrapKeyDown, lockBodyScroll, setBackgroundInert, } from '../overlay/overlayFocus.js';
4
+ import { OVERLAY_BACKDROP_ENTERED, OVERLAY_BACKDROP_EXITED, OVERLAY_MOTION_ENTERED, OVERLAY_MOTION_EXITED, OVERLAY_MOTION_TRANSITION, useOverlayPresence, } from '../overlay/overlayMotion.js';
5
+ const DIALOG_SHELL_PAD = 'pt-[max(1rem,env(safe-area-inset-top))] pr-[max(1rem,env(safe-area-inset-right))] pb-[max(1rem,env(safe-area-inset-bottom))] pl-[max(1rem,env(safe-area-inset-left))]';
6
+ export function Dialog({ open, onClose, title, children, closeOnOverlayClick = true, closeLabel = 'Close', className, testId = 'dialog', busy = false, pending = false, describedBy, role = 'dialog', hideHeader = false, titleId: titleIdProp, }) {
7
+ const isBusy = busy || pending;
8
+ const generatedId = useId();
9
+ const titleId = titleIdProp ?? `${generatedId}-title`;
10
+ const rootRef = useRef(null);
11
+ const panelRef = useRef(null);
12
+ const restoreFocusRef = useRef(null);
13
+ const { mounted, visible } = useOverlayPresence(open);
14
+ // Initial focus when opening; capture restore target before moving focus in.
15
+ useEffect(() => {
16
+ if (!open || !mounted) {
17
+ return;
18
+ }
19
+ restoreFocusRef.current =
20
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
21
+ const panel = panelRef.current;
22
+ if (panel !== null) {
23
+ focusInitialInContainer(panel);
24
+ }
25
+ }, [open, mounted]);
26
+ // Inert + scroll lock for full mounted lifetime (including exit fade); restore focus on unmount.
27
+ useEffect(() => {
28
+ if (!mounted) {
29
+ return;
30
+ }
31
+ const unlock = lockBodyScroll();
32
+ const root = rootRef.current;
33
+ const clearInert = root !== null ? setBackgroundInert(root) : () => undefined;
34
+ return () => {
35
+ clearInert();
36
+ unlock();
37
+ const restore = restoreFocusRef.current;
38
+ if (restore !== null && typeof restore.focus === 'function') {
39
+ restore.focus();
40
+ }
41
+ };
42
+ }, [mounted]);
4
43
  useEffect(() => {
5
44
  if (!open) {
6
45
  return;
7
46
  }
8
47
  const onKey = (event) => {
48
+ const panel = panelRef.current;
49
+ if (panel !== null) {
50
+ handleFocusTrapKeyDown(panel, event);
51
+ }
9
52
  if (event.key === 'Escape') {
53
+ if (isBusy) {
54
+ event.preventDefault();
55
+ event.stopPropagation();
56
+ return;
57
+ }
10
58
  onClose();
11
59
  }
12
60
  };
13
- window.addEventListener('keydown', onKey);
14
- return () => window.removeEventListener('keydown', onKey);
15
- }, [open, onClose]);
16
- if (!open) {
61
+ window.addEventListener('keydown', onKey, true);
62
+ return () => window.removeEventListener('keydown', onKey, true);
63
+ }, [open, onClose, isBusy]);
64
+ if (!mounted) {
17
65
  return null;
18
66
  }
19
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", "data-testid": testId, children: [_jsx("button", { type: "button", className: "absolute inset-0 bg-black/40", "aria-label": closeLabel, "data-testid": `${testId}-overlay`, onClick: () => {
20
- if (closeOnOverlayClick) {
67
+ const showHeader = Boolean(title) && !hideHeader;
68
+ const labelledBy = title ? titleId : undefined;
69
+ const motionState = visible ? OVERLAY_MOTION_ENTERED : OVERLAY_MOTION_EXITED;
70
+ const backdropState = visible ? OVERLAY_BACKDROP_ENTERED : OVERLAY_BACKDROP_EXITED;
71
+ return (_jsxs("div", { ref: rootRef, className: `fixed inset-0 z-50 flex h-[100dvh] items-center justify-center ${DIALOG_SHELL_PAD}`, "data-testid": testId, children: [_jsx("button", { type: "button", className: [
72
+ 'absolute inset-0 bg-black/40',
73
+ OVERLAY_MOTION_TRANSITION,
74
+ backdropState,
75
+ ].join(' '), "aria-label": closeLabel, "data-testid": `${testId}-overlay`, tabIndex: -1, disabled: isBusy || !closeOnOverlayClick || !open, onClick: () => {
76
+ if (open && !isBusy && closeOnOverlayClick) {
21
77
  onClose();
22
78
  }
23
- } }), _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": title, className: [
79
+ } }), _jsxs("div", { ref: panelRef, role: role, "aria-modal": "true", "aria-labelledby": labelledBy, "aria-describedby": describedBy, "aria-busy": isBusy || undefined, className: [
24
80
  'relative z-10 w-full max-w-lg rounded-lg border border-[var(--color-border,var(--color-an-border))]',
25
81
  'bg-[var(--color-surface,var(--color-an-surface))] p-4 shadow-lg',
82
+ OVERLAY_MOTION_TRANSITION,
83
+ motionState,
26
84
  className,
27
85
  ]
28
86
  .filter(Boolean)
29
- .join(' '), "data-testid": `${testId}-content`, children: [title ? (_jsxs("header", { className: "mb-3 flex items-start justify-between gap-3", children: [_jsx("h2", { className: "m-0 text-lg font-semibold text-[var(--color-on-surface,var(--color-an-text))]", children: title }), _jsx("button", { type: "button", className: "rounded-md px-2 py-1 text-sm text-[var(--color-on-surface-muted)]", "aria-label": closeLabel, onClick: onClose, "data-testid": `${testId}-close`, children: "\u00D7" })] })) : null, _jsx("div", { children: children })] })] }));
87
+ .join(' '), "data-testid": `${testId}-content`, children: [showHeader ? (_jsxs("header", { className: "mb-3 flex items-start justify-between gap-3", children: [_jsx("h2", { id: titleId, className: "m-0 text-lg font-semibold text-[var(--color-on-surface,var(--color-an-text))]", children: title }), _jsx("button", { type: "button", className: "rounded-md px-2 py-1 text-sm text-[var(--color-on-surface-muted)]", "aria-label": closeLabel, onClick: onClose, disabled: isBusy || !open, "data-testid": `${testId}-close`, children: "\u00D7" })] })) : title ? (_jsx("span", { id: titleId, className: "sr-only", children: title })) : null, _jsx("div", { children: children })] })] }));
30
88
  }
31
89
  //# sourceMappingURL=Dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../../src/ui/Dialog/Dialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAgBlD,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,mBAAmB,GAAG,IAAI,EAC1B,UAAU,GAAG,OAAO,EACpB,SAAS,EACT,MAAM,GAAG,QAAQ,GACL;IACZ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,yDAAyD,iBAAc,MAAM,aAC1F,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8BAA8B,gBAC5B,UAAU,iBACT,GAAG,MAAM,UAAU,EAChC,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,mBAAmB,EAAE,CAAC;wBACxB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,GACD,EACF,eACE,IAAI,EAAC,QAAQ,gBACF,MAAM,gBACL,KAAK,EACjB,SAAS,EAAE;oBACT,qGAAqG;oBACrG,iEAAiE;oBACjE,SAAS;iBACV;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,GAAG,CAAC,iBACC,GAAG,MAAM,UAAU,aAE/B,KAAK,CAAC,CAAC,CAAC,CACP,kBAAQ,SAAS,EAAC,6CAA6C,aAC7D,aAAI,SAAS,EAAC,+EAA+E,YAC1F,KAAK,GACH,EACL,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mEAAmE,gBACjE,UAAU,EACtB,OAAO,EAAE,OAAO,iBACH,GAAG,MAAM,QAAQ,uBAGvB,IACF,CACV,CAAC,CAAC,CAAC,IAAI,EACR,wBAAM,QAAQ,GAAO,IACjB,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../../src/ui/Dialog/Dialog.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
- import { type InputHTMLAttributes } from 'react';
1
+ import { type InputHTMLAttributes, type ReactNode } from 'react';
2
2
  export type FormFieldSurface = 'admin' | 'customer' | 'kiosk' | 'pickup';
3
- export interface FormFieldProps extends InputHTMLAttributes<HTMLInputElement> {
3
+ export interface FormFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'children'> {
4
4
  readonly label: string;
5
5
  readonly surface?: FormFieldSurface;
6
6
  readonly helperText?: string;
7
7
  readonly errorText?: string;
8
+ /**
9
+ * Custom control (e.g. Textarea). Receives `id`, `aria-*`, and invalid styling
10
+ * props via clone. When omitted, FormField renders a default `<input>`.
11
+ */
12
+ readonly children?: ReactNode;
8
13
  }
9
14
  export declare const FormField: import("react").ForwardRefExoticComponent<FormFieldProps & import("react").RefAttributes<HTMLInputElement>>;
10
15
  //# sourceMappingURL=FormField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/ui/FormField/FormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGpE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAuDzE,MAAM,WAAW,cAAe,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,SAAS,6GAgDrB,CAAC"}
1
+ {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/ui/FormField/FormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAuDzE,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC7F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AASD,eAAO,MAAM,SAAS,6GAiFrB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { forwardRef, useId } from 'react';
2
+ import { cloneElement, forwardRef, isValidElement, useId, } from 'react';
3
3
  import { tv } from '../tvShim.js';
4
4
  const adminField = tv({
5
5
  slots: {
@@ -52,7 +52,7 @@ const consumerField = tv({
52
52
  },
53
53
  defaultVariants: { invalid: false },
54
54
  });
55
- export const FormField = forwardRef(({ label, surface = 'customer', helperText, errorText, id: providedId, ...rest }, ref) => {
55
+ export const FormField = forwardRef(({ label, surface = 'customer', helperText, errorText, id: providedId, required, children, ...rest }, ref) => {
56
56
  const generatedId = useId();
57
57
  const id = providedId ?? `field-${generatedId}`;
58
58
  const helperId = `${id}-helper`;
@@ -68,7 +68,29 @@ export const FormField = forwardRef(({ label, surface = 'customer', helperText,
68
68
  else if (helperText !== undefined) {
69
69
  describedBy = helperId;
70
70
  }
71
- return (_jsxs("div", { className: slots.wrapper(), children: [_jsx("label", { htmlFor: id, className: slots.label(), children: label }), _jsx("input", { ref: ref, id: id, "aria-invalid": invalid ? 'true' : 'false', "aria-describedby": describedBy, className: slots.input(), ...rest }), invalid ? (_jsx("span", { id: errorId, role: "alert", className: slots.error(), children: errorText })) : null, !invalid && helperText !== undefined ? (_jsx("span", { id: helperId, className: slots.helper(), children: helperText })) : null] }));
71
+ const controlA11y = {
72
+ id,
73
+ 'aria-invalid': invalid ? 'true' : 'false',
74
+ ...(describedBy !== undefined ? { 'aria-describedby': describedBy } : {}),
75
+ ...(required === true ? { 'aria-required': 'true' } : {}),
76
+ };
77
+ let control;
78
+ if (children !== undefined && children !== null) {
79
+ if (isValidElement(children)) {
80
+ const child = children;
81
+ control = cloneElement(child, {
82
+ ...controlA11y,
83
+ ...(invalid ? { invalid: true } : {}),
84
+ });
85
+ }
86
+ else {
87
+ control = children;
88
+ }
89
+ }
90
+ else {
91
+ control = (_jsx("input", { ref: ref, className: slots.input(), required: required, ...rest, ...controlA11y }));
92
+ }
93
+ return (_jsxs("div", { className: slots.wrapper(), children: [_jsxs("label", { htmlFor: id, className: slots.label(), children: [label, required === true ? ' *' : null] }), control, invalid ? (_jsx("span", { id: errorId, role: "alert", className: slots.error(), children: errorText })) : null, !invalid && helperText !== undefined ? (_jsx("span", { id: helperId, className: slots.helper(), children: helperText })) : null] }));
72
94
  });
73
95
  FormField.displayName = 'FormField';
74
96
  //# sourceMappingURL=FormField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../../src/ui/FormField/FormField.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../../src/ui/FormField/FormField.tsx"],"names":[],"mappings":"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"}
@@ -6,9 +6,19 @@ export interface ToastProps extends HTMLAttributes<HTMLDivElement> {
6
6
  readonly onDismiss?: () => void;
7
7
  readonly dismissLabel?: string;
8
8
  readonly testId?: string;
9
+ /**
10
+ * Controlled presence (default true). When false, applies EXITED motion classes;
11
+ * keep the node mounted until the parent removes it after `OVERLAY_EXIT_MS`.
12
+ */
13
+ readonly open?: boolean;
14
+ /** Force EXITED motion state (host-owned exit hold; alternative to `open={false}`). */
15
+ readonly exiting?: boolean;
9
16
  }
10
17
  /**
11
18
  * CMP-0011 Toast (= Snackbar) — presentational item; host owns queue/viewport.
19
+ * Live region: polite for success/info/default; assertive for danger/warn.
20
+ * Short enter/exit via motion tokens; motion-reduce disables transition.
21
+ * Toast does not self-unmount on exit — parent removes after `OVERLAY_EXIT_MS`.
12
22
  */
13
- export declare function Toast({ message, variant, onDismiss, dismissLabel, className, testId, ...rest }: ToastProps): JSX.Element;
23
+ export declare function Toast({ message, variant, onDismiss, dismissLabel, className, testId, open, exiting, ...rest }: ToastProps): JSX.Element;
14
24
  //# sourceMappingURL=Toast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/ui/Toast/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAYD;;GAEG;AACH,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAmB,EACnB,SAAS,EACT,YAAwB,EACxB,SAAS,EACT,MAAgB,EAChB,GAAG,IAAI,EACR,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CA6B1B"}
1
+ {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/ui/Toast/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAQ5C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAgBD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAmB,EACnB,SAAS,EACT,YAAwB,EACxB,SAAS,EACT,MAAgB,EAChB,IAAW,EACX,OAAe,EACf,GAAG,IAAI,EACR,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAqC1B"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { OVERLAY_MOTION_ENTERED, OVERLAY_MOTION_EXITED, OVERLAY_MOTION_TRANSITION, useOverlayPresence, } from '../overlay/overlayMotion.js';
2
3
  const VARIANT_CLASS = {
3
4
  default: 'border-[var(--color-border)] bg-[var(--color-surface)] text-[var(--color-on-surface)]',
4
5
  success: 'border-[var(--color-success,var(--color-an-success))] bg-[color-mix(in_oklab,var(--color-success,var(--color-an-success))_12%,transparent)] text-[var(--color-success,var(--color-an-success))]',
@@ -6,13 +7,24 @@ const VARIANT_CLASS = {
6
7
  danger: 'border-[var(--color-danger,var(--color-an-danger))] bg-[color-mix(in_oklab,var(--color-danger,var(--color-an-danger))_12%,transparent)] text-[var(--color-danger,var(--color-an-danger))]',
7
8
  info: 'border-[var(--color-info,#0ea5e9)] bg-[color-mix(in_oklab,var(--color-info,#0ea5e9)_12%,transparent)] text-[var(--color-info,#0ea5e9)]',
8
9
  };
10
+ function toastAriaLive(variant) {
11
+ return variant === 'danger' || variant === 'warn' ? 'assertive' : 'polite';
12
+ }
9
13
  /**
10
14
  * CMP-0011 Toast (= Snackbar) — presentational item; host owns queue/viewport.
15
+ * Live region: polite for success/info/default; assertive for danger/warn.
16
+ * Short enter/exit via motion tokens; motion-reduce disables transition.
17
+ * Toast does not self-unmount on exit — parent removes after `OVERLAY_EXIT_MS`.
11
18
  */
12
- export function Toast({ message, variant = 'default', onDismiss, dismissLabel = 'Dismiss', className, testId = 'toast', ...rest }) {
13
- return (_jsxs("div", { role: "status", className: [
19
+ export function Toast({ message, variant = 'default', onDismiss, dismissLabel = 'Dismiss', className, testId = 'toast', open = true, exiting = false, ...rest }) {
20
+ const ariaLive = toastAriaLive(variant);
21
+ const { visible } = useOverlayPresence(open && !exiting);
22
+ const motionState = exiting || !visible ? OVERLAY_MOTION_EXITED : OVERLAY_MOTION_ENTERED;
23
+ return (_jsxs("div", { role: ariaLive === 'assertive' ? 'alert' : 'status', "aria-live": ariaLive, "aria-atomic": "true", className: [
14
24
  'flex items-start gap-3 rounded-md border px-3 py-2 text-sm shadow-sm',
15
25
  VARIANT_CLASS[variant],
26
+ OVERLAY_MOTION_TRANSITION,
27
+ motionState,
16
28
  className,
17
29
  ]
18
30
  .filter(Boolean)
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/ui/Toast/Toast.tsx"],"names":[],"mappings":";AAYA,MAAM,aAAa,GAAiC;IAClD,OAAO,EAAE,uFAAuF;IAChG,OAAO,EACL,iMAAiM;IACnM,IAAI,EAAE,wLAAwL;IAC9L,MAAM,EACJ,2LAA2L;IAC7L,IAAI,EAAE,wIAAwI;CAC/I,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,GAAG,SAAS,EACnB,SAAS,EACT,YAAY,GAAG,SAAS,EACxB,SAAS,EACT,MAAM,GAAG,OAAO,EAChB,GAAG,IAAI,EACI;IACX,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE;YACT,sEAAsE;YACtE,aAAa,CAAC,OAAO,CAAC;YACtB,SAAS;SACV;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,iBACC,MAAM,kBACL,OAAO,KACjB,IAAI,aAER,YAAG,SAAS,EAAC,YAAY,YAAE,OAAO,GAAK,EACtC,SAAS,CAAC,CAAC,CAAC,CACX,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0CAA0C,gBACxC,YAAY,EACxB,OAAO,EAAE,SAAS,iBACL,GAAG,MAAM,UAAU,YAE/B,YAAY,GACN,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/ui/Toast/Toast.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAmBrC,MAAM,aAAa,GAAiC;IAClD,OAAO,EAAE,uFAAuF;IAChG,OAAO,EACL,iMAAiM;IACnM,IAAI,EAAE,wLAAwL;IAC9L,MAAM,EACJ,2LAA2L;IAC7L,IAAI,EAAE,wIAAwI;CAC/I,CAAC;AAEF,SAAS,aAAa,CAAC,OAAqB;IAC1C,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,GAAG,SAAS,EACnB,SAAS,EACT,YAAY,GAAG,SAAS,EACxB,SAAS,EACT,MAAM,GAAG,OAAO,EAChB,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,KAAK,EACf,GAAG,IAAI,EACI;IACX,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACvE,OAAO,CACL,eACE,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,eACxC,QAAQ,iBACP,MAAM,EAClB,SAAS,EAAE;YACT,sEAAsE;YACtE,aAAa,CAAC,OAAO,CAAC;YACtB,yBAAyB;YACzB,WAAW;YACX,SAAS;SACV;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,iBACC,MAAM,kBACL,OAAO,KACjB,IAAI,aAER,YAAG,SAAS,EAAC,YAAY,YAAE,OAAO,GAAK,EACtC,SAAS,CAAC,CAAC,CAAC,CACX,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0CAA0C,gBACxC,YAAY,EACxB,OAAO,EAAE,SAAS,iBACL,GAAG,MAAM,UAAU,YAE/B,YAAY,GACN,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -12,4 +12,14 @@ export { useTurnstileExecute, type UseTurnstileExecuteResult } from './Turnstile
12
12
  export { TurnstileExecuteWidget, type TurnstileExecuteWidgetProps, } from './Turnstile/TurnstileExecuteWidget.js';
13
13
  export { ProviderIcon, PROVIDER_ICON_ASSET_IDS, resolveProviderIconAssetId, type ProviderIconAssetId, type ProviderIconProps, type ProviderIconSize, } from './ProviderIcon/index.js';
14
14
  export { NavStepper, type NavStepperProps, type NavStepperStep, } from './NavStepper/NavStepper.js';
15
+ export { Dialog, type DialogProps } from './Dialog/Dialog.js';
16
+ export { BottomSheet, Drawer, type BottomSheetProps, type DrawerProps, } from './BottomSheet/BottomSheet.js';
17
+ export { Toast, type ToastProps, type ToastVariant } from './Toast/Toast.js';
18
+ export { Skeleton, SkeletonText, type SkeletonProps, type SkeletonTextProps, } from './Skeleton/Skeleton.js';
19
+ export { Loader, type LoaderProps } from './Loader/Loader.js';
20
+ export { Textarea, type TextareaProps } from './Textarea/Textarea.js';
21
+ export { Icon, ICON_SIZES, type IconProps, type IconSize } from './Icon/index.js';
22
+ export { IconButton, type IconButtonProps } from './IconButton/index.js';
23
+ export { handleFocusTrapKeyDown, listFocusable, focusInitialInContainer, lockBodyScroll, setBackgroundInert, } from './overlay/overlayFocus.js';
24
+ export { OVERLAY_EXIT_MS } from './overlay/overlayMotion.js';
15
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACzG,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACzG,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,WAAW,EACX,MAAM,EACN,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/ui/index.js CHANGED
@@ -12,4 +12,14 @@ export { useTurnstileExecute } from './Turnstile/useTurnstileExecute.js';
12
12
  export { TurnstileExecuteWidget, } from './Turnstile/TurnstileExecuteWidget.js';
13
13
  export { ProviderIcon, PROVIDER_ICON_ASSET_IDS, resolveProviderIconAssetId, } from './ProviderIcon/index.js';
14
14
  export { NavStepper, } from './NavStepper/NavStepper.js';
15
+ export { Dialog } from './Dialog/Dialog.js';
16
+ export { BottomSheet, Drawer, } from './BottomSheet/BottomSheet.js';
17
+ export { Toast } from './Toast/Toast.js';
18
+ export { Skeleton, SkeletonText, } from './Skeleton/Skeleton.js';
19
+ export { Loader } from './Loader/Loader.js';
20
+ export { Textarea } from './Textarea/Textarea.js';
21
+ export { Icon, ICON_SIZES } from './Icon/index.js';
22
+ export { IconButton } from './IconButton/index.js';
23
+ export { handleFocusTrapKeyDown, listFocusable, focusInitialInContainer, lockBodyScroll, setBackgroundInert, } from './overlay/overlayFocus.js';
24
+ export { OVERLAY_EXIT_MS } from './overlay/overlayMotion.js';
15
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAkB,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,cAAc,GAKf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GAOpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAA+B,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,eAAe,EAA6B,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAkC,MAAM,oCAAoC,CAAC;AACzG,OAAO,EACL,sBAAsB,GAEvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,GAGX,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAkB,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,cAAc,GAKf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GAOpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAA+B,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,eAAe,EAA6B,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAkC,MAAM,oCAAoC,CAAC;AACzG,OAAO,EACL,sBAAsB,GAEvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,GAGX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,WAAW,EACX,MAAM,GAGP,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,EAAsC,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EACL,QAAQ,EACR,YAAY,GAGb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAsB,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAiC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared overlay focus helpers for Dialog / BottomSheet (Wave A harden).
3
+ * Trap Tab within container; restore focus on close; optional body scroll lock.
4
+ */
5
+ export declare function listFocusable(container: HTMLElement): HTMLElement[];
6
+ /** Tab / Shift+Tab cycle within a dialog container. */
7
+ export declare function handleFocusTrapKeyDown(container: HTMLElement, event: KeyboardEvent): void;
8
+ /**
9
+ * Focus the preferred control when open, else `[data-initial-focus]`, else first focusable.
10
+ * Prefer marking the primary/confirm action with `data-initial-focus` so Cancel can stay
11
+ * first in visual/DOM order (e.g. left on sm+) without stealing initial focus.
12
+ */
13
+ export declare function focusInitialInContainer(container: HTMLElement, preferred?: HTMLElement | null): void;
14
+ /** Nested-safe body scroll lock while any overlay is open. */
15
+ export declare function lockBodyScroll(): () => void;
16
+ /**
17
+ * Mark page/backdrop siblings `inert` while an overlay is mounted.
18
+ * Walks from `document.body`, leaves the keepAlive subtree interactive,
19
+ * and inerts every node that is not keepAlive or an ancestor of it.
20
+ * Callers (Dialog / BottomSheet) should hold the returned cleanup for the full
21
+ * `useOverlayPresence` mounted lifetime — including exit fade — not clear when
22
+ * `open` flips false.
23
+ * Returns a cleanup that clears only the inert flags this call applied.
24
+ */
25
+ export declare function setBackgroundInert(keepAlive: HTMLElement): () => void;
26
+ //# sourceMappingURL=overlayFocus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayFocus.d.ts","sourceRoot":"","sources":["../../../src/ui/overlay/overlayFocus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,WAAW,EAAE,CAInE;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAuBzF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,WAAW,EACtB,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,GAC7B,IAAI,CAuBN;AAKD,8DAA8D;AAC9D,wBAAgB,cAAc,IAAI,MAAM,IAAI,CAgB3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,IAAI,CAqCrE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Shared overlay focus helpers for Dialog / BottomSheet (Wave A harden).
3
+ * Trap Tab within container; restore focus on close; optional body scroll lock.
4
+ */
5
+ const FOCUSABLE_SELECTOR = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
6
+ export function listFocusable(container) {
7
+ return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((element) => !element.hasAttribute('disabled') && element.tabIndex !== -1);
8
+ }
9
+ /** Tab / Shift+Tab cycle within a dialog container. */
10
+ export function handleFocusTrapKeyDown(container, event) {
11
+ if (event.key !== 'Tab') {
12
+ return;
13
+ }
14
+ const focusables = listFocusable(container);
15
+ if (focusables.length === 0) {
16
+ return;
17
+ }
18
+ const first = focusables[0];
19
+ const last = focusables[focusables.length - 1];
20
+ if (first === undefined || last === undefined) {
21
+ return;
22
+ }
23
+ const active = document.activeElement;
24
+ if (event.shiftKey && active === first) {
25
+ event.preventDefault();
26
+ last.focus();
27
+ return;
28
+ }
29
+ if (!event.shiftKey && active === last) {
30
+ event.preventDefault();
31
+ first.focus();
32
+ }
33
+ }
34
+ /**
35
+ * Focus the preferred control when open, else `[data-initial-focus]`, else first focusable.
36
+ * Prefer marking the primary/confirm action with `data-initial-focus` so Cancel can stay
37
+ * first in visual/DOM order (e.g. left on sm+) without stealing initial focus.
38
+ */
39
+ export function focusInitialInContainer(container, preferred) {
40
+ const focusables = listFocusable(container);
41
+ if (preferred != null && focusables.includes(preferred)) {
42
+ preferred.focus();
43
+ return;
44
+ }
45
+ const marked = container.querySelector('[data-initial-focus]');
46
+ if (marked !== null && focusables.includes(marked)) {
47
+ marked.focus();
48
+ return;
49
+ }
50
+ const first = focusables[0];
51
+ if (first !== undefined) {
52
+ first.focus();
53
+ return;
54
+ }
55
+ if (!container.hasAttribute('tabindex')) {
56
+ container.tabIndex = -1;
57
+ }
58
+ container.focus();
59
+ }
60
+ let scrollLockCount = 0;
61
+ let previousBodyOverflow = null;
62
+ /** Nested-safe body scroll lock while any overlay is open. */
63
+ export function lockBodyScroll() {
64
+ if (typeof document === 'undefined') {
65
+ return () => undefined;
66
+ }
67
+ if (scrollLockCount === 0) {
68
+ previousBodyOverflow = document.body.style.overflow;
69
+ document.body.style.overflow = 'hidden';
70
+ }
71
+ scrollLockCount += 1;
72
+ return () => {
73
+ scrollLockCount = Math.max(0, scrollLockCount - 1);
74
+ if (scrollLockCount === 0 && previousBodyOverflow !== null) {
75
+ document.body.style.overflow = previousBodyOverflow;
76
+ previousBodyOverflow = null;
77
+ }
78
+ };
79
+ }
80
+ /**
81
+ * Mark page/backdrop siblings `inert` while an overlay is mounted.
82
+ * Walks from `document.body`, leaves the keepAlive subtree interactive,
83
+ * and inerts every node that is not keepAlive or an ancestor of it.
84
+ * Callers (Dialog / BottomSheet) should hold the returned cleanup for the full
85
+ * `useOverlayPresence` mounted lifetime — including exit fade — not clear when
86
+ * `open` flips false.
87
+ * Returns a cleanup that clears only the inert flags this call applied.
88
+ */
89
+ export function setBackgroundInert(keepAlive) {
90
+ if (typeof document === 'undefined' || document.body === null) {
91
+ return () => undefined;
92
+ }
93
+ const applied = [];
94
+ const visit = (parent) => {
95
+ for (const child of Array.from(parent.children)) {
96
+ if (!(child instanceof HTMLElement)) {
97
+ continue;
98
+ }
99
+ if (child === keepAlive) {
100
+ continue;
101
+ }
102
+ if (child.contains(keepAlive)) {
103
+ visit(child);
104
+ continue;
105
+ }
106
+ if (child.hasAttribute('inert')) {
107
+ continue;
108
+ }
109
+ child.setAttribute('inert', '');
110
+ // Reflect IDL when the environment supports it (jsdom may omit).
111
+ child.inert = true;
112
+ applied.push(child);
113
+ }
114
+ };
115
+ visit(document.body);
116
+ return () => {
117
+ for (const element of applied) {
118
+ element.removeAttribute('inert');
119
+ element.inert = false;
120
+ }
121
+ };
122
+ }
123
+ //# sourceMappingURL=overlayFocus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayFocus.js","sourceRoot":"","sources":["../../../src/ui/overlay/overlayFocus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Short overlay enter/exit motion (Dialog / BottomSheet / Toast).
3
+ * Tokens from shared theme.css; fallbacks match Spec defaults when unset.
4
+ */
5
+ export declare const OVERLAY_MOTION_TRANSITION = "transition-[opacity,transform] duration-[var(--motion-duration-base,150ms)] ease-[var(--motion-easing-standard,ease)] motion-reduce:transition-none";
6
+ /** Settled (visible) panel/toast surface. */
7
+ export declare const OVERLAY_MOTION_ENTERED = "opacity-100 translate-y-0 scale-100";
8
+ /** Pre-enter / exiting panel (brief opacity + transform). */
9
+ export declare const OVERLAY_MOTION_EXITED = "opacity-0 translate-y-1 scale-[0.98]";
10
+ /** Backdrop fade only. */
11
+ export declare const OVERLAY_BACKDROP_ENTERED = "opacity-100";
12
+ export declare const OVERLAY_BACKDROP_EXITED = "opacity-0";
13
+ /** Exit delay covers --motion-duration-base (200ms in theme) + small buffer. */
14
+ export declare const OVERLAY_EXIT_MS = 220;
15
+ export declare function prefersReducedMotion(): boolean;
16
+ export interface OverlayPresence {
17
+ /** Keep in DOM while enter/exit runs. */
18
+ readonly mounted: boolean;
19
+ /** True after enter frame / false while exiting. */
20
+ readonly visible: boolean;
21
+ }
22
+ /**
23
+ * Mount-gated presence for controlled overlays (`open`).
24
+ * Open mounts synchronously; exit holds DOM for OVERLAY_EXIT_MS (skipped when reduce).
25
+ */
26
+ export declare function useOverlayPresence(open: boolean): OverlayPresence;
27
+ /**
28
+ * One-shot enter for presentational surfaces that mount when shown
29
+ * (prefer `useOverlayPresence` when exit hold is needed, e.g. Toast `open`).
30
+ */
31
+ export declare function useEnterMotion(): boolean;
32
+ //# sourceMappingURL=overlayMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayMotion.d.ts","sourceRoot":"","sources":["../../../src/ui/overlay/overlayMotion.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,yBAAyB,wJACiH,CAAC;AAExJ,6CAA6C;AAC7C,eAAO,MAAM,sBAAsB,wCAAwC,CAAC;AAE5E,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAE5E,0BAA0B;AAC1B,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AACtD,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD,gFAAgF;AAChF,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAED,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,CAqCjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAiBxC"}
@@ -0,0 +1,80 @@
1
+ import { useEffect, useState } from 'react';
2
+ /**
3
+ * Short overlay enter/exit motion (Dialog / BottomSheet / Toast).
4
+ * Tokens from shared theme.css; fallbacks match Spec defaults when unset.
5
+ */
6
+ export const OVERLAY_MOTION_TRANSITION = 'transition-[opacity,transform] duration-[var(--motion-duration-base,150ms)] ease-[var(--motion-easing-standard,ease)] motion-reduce:transition-none';
7
+ /** Settled (visible) panel/toast surface. */
8
+ export const OVERLAY_MOTION_ENTERED = 'opacity-100 translate-y-0 scale-100';
9
+ /** Pre-enter / exiting panel (brief opacity + transform). */
10
+ export const OVERLAY_MOTION_EXITED = 'opacity-0 translate-y-1 scale-[0.98]';
11
+ /** Backdrop fade only. */
12
+ export const OVERLAY_BACKDROP_ENTERED = 'opacity-100';
13
+ export const OVERLAY_BACKDROP_EXITED = 'opacity-0';
14
+ /** Exit delay covers --motion-duration-base (200ms in theme) + small buffer. */
15
+ export const OVERLAY_EXIT_MS = 220;
16
+ export function prefersReducedMotion() {
17
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
18
+ return false;
19
+ }
20
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
21
+ }
22
+ /**
23
+ * Mount-gated presence for controlled overlays (`open`).
24
+ * Open mounts synchronously; exit holds DOM for OVERLAY_EXIT_MS (skipped when reduce).
25
+ */
26
+ export function useOverlayPresence(open) {
27
+ const [held, setHeld] = useState(open);
28
+ const [visible, setVisible] = useState(() => open && prefersReducedMotion());
29
+ if (open && !held) {
30
+ setHeld(true);
31
+ }
32
+ useEffect(() => {
33
+ if (open) {
34
+ if (prefersReducedMotion()) {
35
+ setVisible(true);
36
+ return;
37
+ }
38
+ setVisible(false);
39
+ const id = requestAnimationFrame(() => {
40
+ setVisible(true);
41
+ });
42
+ return () => {
43
+ cancelAnimationFrame(id);
44
+ };
45
+ }
46
+ setVisible(false);
47
+ if (prefersReducedMotion()) {
48
+ setHeld(false);
49
+ return;
50
+ }
51
+ const timer = window.setTimeout(() => {
52
+ setHeld(false);
53
+ }, OVERLAY_EXIT_MS);
54
+ return () => {
55
+ window.clearTimeout(timer);
56
+ };
57
+ }, [open]);
58
+ return { mounted: open || held, visible };
59
+ }
60
+ /**
61
+ * One-shot enter for presentational surfaces that mount when shown
62
+ * (prefer `useOverlayPresence` when exit hold is needed, e.g. Toast `open`).
63
+ */
64
+ export function useEnterMotion() {
65
+ const [entered, setEntered] = useState(() => prefersReducedMotion());
66
+ useEffect(() => {
67
+ if (prefersReducedMotion()) {
68
+ setEntered(true);
69
+ return;
70
+ }
71
+ const id = requestAnimationFrame(() => {
72
+ setEntered(true);
73
+ });
74
+ return () => {
75
+ cancelAnimationFrame(id);
76
+ };
77
+ }, []);
78
+ return entered;
79
+ }
80
+ //# sourceMappingURL=overlayMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayMotion.js","sourceRoot":"","sources":["../../../src/ui/overlay/overlayMotion.ts"],"names":[],"mappings":"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"}