@adminiumjs/ui 0.3.34 → 0.3.35
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.
|
@@ -28,6 +28,22 @@ export interface ConfirmModalProps extends Omit<ModalProps, 'children' | 'size'>
|
|
|
28
28
|
/** Optional hint rendered under the field when it does not yet match. */
|
|
29
29
|
hint?: ReactNode;
|
|
30
30
|
} | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* A box for WHY (a removal's reason, for a table that asks for one). The
|
|
33
|
+
* caller holds the text. `required`: the danger button stays disabled until
|
|
34
|
+
* something other than spaces is written; otherwise it may be left empty.
|
|
35
|
+
* When absent, no box reaches the DOM.
|
|
36
|
+
*/
|
|
37
|
+
reason?: {
|
|
38
|
+
/** Label above the box, already localised (say "optional" in it when it is). */
|
|
39
|
+
label: ReactNode;
|
|
40
|
+
required: boolean;
|
|
41
|
+
value: string;
|
|
42
|
+
onChange: (value: string) => void;
|
|
43
|
+
/** The most characters it takes. */
|
|
44
|
+
maxLength?: number | undefined;
|
|
45
|
+
placeholder?: string | undefined;
|
|
46
|
+
} | undefined;
|
|
31
47
|
/** Danger button label (required — i18n). */
|
|
32
48
|
confirmLabel: string;
|
|
33
49
|
/** Cancel button label (required — i18n). */
|
|
@@ -50,5 +66,5 @@ export interface ConfirmModalProps extends Omit<ModalProps, 'children' | 'size'>
|
|
|
50
66
|
* the danger button (research/design-system.md Tier 3), optionally a second
|
|
51
67
|
* one (`secondPrompt`, D18). Typed values reset whenever the modal closes.
|
|
52
68
|
*/
|
|
53
|
-
export declare function ConfirmModal({ title, body, confirmWord, promptLabel, secondPrompt, confirmLabel, cancelLabel, closeLabel, onConfirm, busy, icon, open, onOpenChange, ...modalProps }: ConfirmModalProps): import("react").JSX.Element;
|
|
69
|
+
export declare function ConfirmModal({ title, body, confirmWord, promptLabel, secondPrompt, reason, confirmLabel, cancelLabel, closeLabel, onConfirm, busy, icon, open, onOpenChange, ...modalProps }: ConfirmModalProps): import("react").JSX.Element;
|
|
54
70
|
//# sourceMappingURL=ConfirmModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/confirm-modal/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/confirm-modal/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsBhG,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9E,4CAA4C;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,kFAAkF;IAClF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,WAAW,EAAE,SAAS,CAAC;IACvB;;;;;;;OAOG;IACH,YAAY,CAAC,EACT;QACE,qEAAqE;QACrE,KAAK,EAAE,SAAS,CAAC;QACjB,2CAA2C;QAC3C,QAAQ,EAAE,MAAM,CAAC;QACjB,yEAAyE;QACzE,IAAI,CAAC,EAAE,SAAS,CAAC;KAClB,GACD,SAAS,CAAC;IACd;;;;;OAKG;IACH,MAAM,CAAC,EACH;QACE,gFAAgF;QAChF,KAAK,EAAE,SAAS,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAClC,oCAAoC;QACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,GACD,SAAS,CAAC;IACd,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,qEAAqE;IACrE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,gEAAgE;IAChE,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,GAAG,UAAU,EACd,EAAE,iBAAiB,+BA+JnB"}
|
|
@@ -12,12 +12,15 @@ import { Modal, ModalBody, ModalFooter, ModalHeader } from '../modal/Modal.js';
|
|
|
12
12
|
*/
|
|
13
13
|
const fieldClass = cn('h-[34px] w-full rounded-md border border-border-strong bg-surface px-3 font-mono text-body text-fg', 'outline-none placeholder:text-fg-subtle disabled:opacity-40', 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-danger');
|
|
14
14
|
const labelClass = 'mb-1.5 block text-caption font-bold text-fg-muted';
|
|
15
|
+
/** The reason box: prose, not a token to match, so it reads in the page's own face. */
|
|
16
|
+
const reasonClass = cn('min-h-[64px] w-full resize-y rounded-md border border-border-strong bg-surface px-3 py-2 text-body text-fg', 'outline-none placeholder:text-fg-subtle disabled:opacity-40', 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-accent');
|
|
15
17
|
/**
|
|
16
18
|
* ConfirmModal — destructive confirmation with a type-to-confirm input gating
|
|
17
19
|
* the danger button (research/design-system.md Tier 3), optionally a second
|
|
18
20
|
* one (`secondPrompt`, D18). Typed values reset whenever the modal closes.
|
|
19
21
|
*/
|
|
20
|
-
export function ConfirmModal({ title, body, confirmWord, promptLabel, secondPrompt, confirmLabel, cancelLabel, closeLabel, onConfirm, busy, icon, open, onOpenChange, ...modalProps }) {
|
|
22
|
+
export function ConfirmModal({ title, body, confirmWord, promptLabel, secondPrompt, reason, confirmLabel, cancelLabel, closeLabel, onConfirm, busy, icon, open, onOpenChange, ...modalProps }) {
|
|
23
|
+
const reasonId = useId();
|
|
21
24
|
const inputId = useId();
|
|
22
25
|
// Each field needs its own id. Reusing `inputId` would point both `htmlFor`
|
|
23
26
|
// attributes at the first input: a screen reader then announces the override
|
|
@@ -36,7 +39,8 @@ export function ConfirmModal({ title, body, confirmWord, promptLabel, secondProm
|
|
|
36
39
|
// A gate that opens for free is worse than one that cannot open, so an empty
|
|
37
40
|
// target counts as unmet.
|
|
38
41
|
const secondMatches = secondExpected !== undefined && secondExpected !== '' && secondTyped === secondExpected;
|
|
39
|
-
const
|
|
42
|
+
const reasonGiven = reason === undefined || !reason.required || reason.value.trim() !== '';
|
|
43
|
+
const ready = typed === confirmWord && (secondPrompt === undefined || secondMatches) && reasonGiven;
|
|
40
44
|
const hint = secondPrompt?.hint;
|
|
41
45
|
const showHint = !secondMatches && hint !== undefined && hint !== null && hint !== false;
|
|
42
46
|
useEffect(() => {
|
|
@@ -68,7 +72,9 @@ export function ConfirmModal({ title, body, confirmWord, promptLabel, secondProm
|
|
|
68
72
|
if (isBusy && !next)
|
|
69
73
|
return; // don't dismiss mid-flight
|
|
70
74
|
onOpenChange?.(next);
|
|
71
|
-
}, ...modalProps, children: [_jsx(ModalHeader, { tone: "danger", icon: icon ?? _jsx(TriangleAlert, {}), title: title, subtitle: body, closeLabel: closeLabel }), _jsxs(ModalBody, { children: [
|
|
75
|
+
}, ...modalProps, children: [_jsx(ModalHeader, { tone: "danger", icon: icon ?? _jsx(TriangleAlert, {}), title: title, subtitle: body, closeLabel: closeLabel }), _jsxs(ModalBody, { children: [reason === undefined ? null : (
|
|
76
|
+
// Asked first: what is written here is kept with the removal, and the type-to-confirm below is only the gate.
|
|
77
|
+
_jsxs("div", { className: "mb-4", children: [_jsx("label", { htmlFor: reasonId, className: labelClass, children: reason.label }), _jsx("textarea", { id: reasonId, value: reason.value, disabled: isBusy, required: reason.required, "aria-required": reason.required, rows: 2, ...(reason.maxLength === undefined ? {} : { maxLength: reason.maxLength }), ...(reason.placeholder === undefined ? {} : { placeholder: reason.placeholder }), onChange: (event) => reason.onChange(event.target.value), "data-part": "confirm-reason", className: reasonClass })] })), _jsx("label", { htmlFor: inputId, className: labelClass, children: promptLabel }), _jsx("input", { id: inputId, type: "text", value: typed, disabled: isBusy, onChange: (event) => setTyped(event.target.value), autoComplete: "off", autoCapitalize: "off", autoCorrect: "off", spellCheck: false, "data-part": "confirm-input", className: fieldClass }), secondPrompt === undefined ? null : (
|
|
72
78
|
// Ruled off rather than stacked: two identical mono inputs in a
|
|
73
79
|
// 410px dialog read as the same challenge asked twice, and the
|
|
74
80
|
// operator answers the second one from muscle memory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmModal.js","sourceRoot":"","sources":["../../../src/components/confirm-modal/ConfirmModal.tsx"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGnD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAEhG;;;;GAIG;AACH,MAAM,UAAU,GAAG,EAAE,CACnB,oGAAoG,EACpG,6DAA6D,EAC7D,qFAAqF,CACtF,CAAC;AAEF,MAAM,UAAU,GAAG,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmModal.js","sourceRoot":"","sources":["../../../src/components/confirm-modal/ConfirmModal.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminiumjs/ui",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.35",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@adminium/tokens": "npm:@adminiumjs/tokens@0.3.
|
|
26
|
+
"@adminium/tokens": "npm:@adminiumjs/tokens@0.3.35",
|
|
27
27
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
28
28
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
29
29
|
"@radix-ui/react-direction": "^1.1.1",
|