@diwauhris/ui 1.0.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/README.md +75 -0
- package/lib/assets/ui.css +154 -0
- package/lib/index.cjs +183 -0
- package/lib/index.mjs +65 -0
- package/lib/index10.cjs +33 -0
- package/lib/index10.cjs.map +1 -0
- package/lib/index10.mjs +33 -0
- package/lib/index10.mjs.map +1 -0
- package/lib/index11.cjs +16 -0
- package/lib/index11.cjs.map +1 -0
- package/lib/index11.mjs +16 -0
- package/lib/index11.mjs.map +1 -0
- package/lib/index12.cjs +16 -0
- package/lib/index12.cjs.map +1 -0
- package/lib/index12.mjs +15 -0
- package/lib/index12.mjs.map +1 -0
- package/lib/index13.cjs +57 -0
- package/lib/index13.cjs.map +1 -0
- package/lib/index13.mjs +57 -0
- package/lib/index13.mjs.map +1 -0
- package/lib/index14.cjs +10 -0
- package/lib/index14.cjs.map +1 -0
- package/lib/index14.mjs +10 -0
- package/lib/index14.mjs.map +1 -0
- package/lib/index15.cjs +30 -0
- package/lib/index15.cjs.map +1 -0
- package/lib/index15.mjs +30 -0
- package/lib/index15.mjs.map +1 -0
- package/lib/index16.cjs +28 -0
- package/lib/index16.cjs.map +1 -0
- package/lib/index16.mjs +26 -0
- package/lib/index16.mjs.map +1 -0
- package/lib/index17.cjs +43 -0
- package/lib/index17.cjs.map +1 -0
- package/lib/index17.mjs +43 -0
- package/lib/index17.mjs.map +1 -0
- package/lib/index18.cjs +59 -0
- package/lib/index18.cjs.map +1 -0
- package/lib/index18.mjs +59 -0
- package/lib/index18.mjs.map +1 -0
- package/lib/index19.cjs +67 -0
- package/lib/index19.cjs.map +1 -0
- package/lib/index19.mjs +67 -0
- package/lib/index19.mjs.map +1 -0
- package/lib/index2.cjs +33 -0
- package/lib/index2.mjs +13 -0
- package/lib/index20.cjs +79 -0
- package/lib/index20.cjs.map +1 -0
- package/lib/index20.mjs +79 -0
- package/lib/index20.mjs.map +1 -0
- package/lib/index21.cjs +105 -0
- package/lib/index21.cjs.map +1 -0
- package/lib/index21.mjs +104 -0
- package/lib/index21.mjs.map +1 -0
- package/lib/index22.cjs +50 -0
- package/lib/index22.cjs.map +1 -0
- package/lib/index22.mjs +50 -0
- package/lib/index22.mjs.map +1 -0
- package/lib/index23.cjs +143 -0
- package/lib/index23.cjs.map +1 -0
- package/lib/index23.mjs +143 -0
- package/lib/index23.mjs.map +1 -0
- package/lib/index25.cjs +177 -0
- package/lib/index25.cjs.map +1 -0
- package/lib/index25.mjs +175 -0
- package/lib/index25.mjs.map +1 -0
- package/lib/index26.cjs +108 -0
- package/lib/index26.cjs.map +1 -0
- package/lib/index26.mjs +108 -0
- package/lib/index26.mjs.map +1 -0
- package/lib/index27.cjs +120 -0
- package/lib/index27.cjs.map +1 -0
- package/lib/index27.mjs +120 -0
- package/lib/index27.mjs.map +1 -0
- package/lib/index28.cjs +54 -0
- package/lib/index28.cjs.map +1 -0
- package/lib/index28.mjs +54 -0
- package/lib/index28.mjs.map +1 -0
- package/lib/index29.cjs +100 -0
- package/lib/index29.cjs.map +1 -0
- package/lib/index29.mjs +100 -0
- package/lib/index29.mjs.map +1 -0
- package/lib/index3.cjs +38 -0
- package/lib/index3.cjs.map +1 -0
- package/lib/index3.mjs +38 -0
- package/lib/index3.mjs.map +1 -0
- package/lib/index30.cjs +27 -0
- package/lib/index30.cjs.map +1 -0
- package/lib/index30.mjs +27 -0
- package/lib/index30.mjs.map +1 -0
- package/lib/index31.cjs +72 -0
- package/lib/index31.cjs.map +1 -0
- package/lib/index31.mjs +72 -0
- package/lib/index31.mjs.map +1 -0
- package/lib/index32.cjs +19 -0
- package/lib/index32.cjs.map +1 -0
- package/lib/index32.mjs +19 -0
- package/lib/index32.mjs.map +1 -0
- package/lib/index33.cjs +25 -0
- package/lib/index33.cjs.map +1 -0
- package/lib/index33.mjs +25 -0
- package/lib/index33.mjs.map +1 -0
- package/lib/index34.cjs +55 -0
- package/lib/index34.cjs.map +1 -0
- package/lib/index34.mjs +51 -0
- package/lib/index34.mjs.map +1 -0
- package/lib/index35.cjs +25 -0
- package/lib/index35.cjs.map +1 -0
- package/lib/index35.mjs +25 -0
- package/lib/index35.mjs.map +1 -0
- package/lib/index36.cjs +54 -0
- package/lib/index36.cjs.map +1 -0
- package/lib/index36.mjs +49 -0
- package/lib/index36.mjs.map +1 -0
- package/lib/index37.cjs +130 -0
- package/lib/index37.cjs.map +1 -0
- package/lib/index37.mjs +128 -0
- package/lib/index37.mjs.map +1 -0
- package/lib/index38.cjs +106 -0
- package/lib/index38.cjs.map +1 -0
- package/lib/index38.mjs +102 -0
- package/lib/index38.mjs.map +1 -0
- package/lib/index39.cjs +137 -0
- package/lib/index39.cjs.map +1 -0
- package/lib/index39.mjs +137 -0
- package/lib/index39.mjs.map +1 -0
- package/lib/index4.cjs +24 -0
- package/lib/index4.cjs.map +1 -0
- package/lib/index4.mjs +24 -0
- package/lib/index4.mjs.map +1 -0
- package/lib/index40.cjs +130 -0
- package/lib/index40.cjs.map +1 -0
- package/lib/index40.mjs +126 -0
- package/lib/index40.mjs.map +1 -0
- package/lib/index41.cjs +60 -0
- package/lib/index41.cjs.map +1 -0
- package/lib/index41.mjs +58 -0
- package/lib/index41.mjs.map +1 -0
- package/lib/index42.cjs +105 -0
- package/lib/index42.cjs.map +1 -0
- package/lib/index42.mjs +105 -0
- package/lib/index42.mjs.map +1 -0
- package/lib/index43.cjs +47 -0
- package/lib/index43.cjs.map +1 -0
- package/lib/index43.mjs +42 -0
- package/lib/index43.mjs.map +1 -0
- package/lib/index44.cjs +40 -0
- package/lib/index44.cjs.map +1 -0
- package/lib/index44.mjs +35 -0
- package/lib/index44.mjs.map +1 -0
- package/lib/index45.cjs +91 -0
- package/lib/index45.cjs.map +1 -0
- package/lib/index45.mjs +91 -0
- package/lib/index45.mjs.map +1 -0
- package/lib/index46.cjs +180 -0
- package/lib/index46.cjs.map +1 -0
- package/lib/index46.mjs +180 -0
- package/lib/index46.mjs.map +1 -0
- package/lib/index47.cjs +61 -0
- package/lib/index47.cjs.map +1 -0
- package/lib/index47.mjs +61 -0
- package/lib/index47.mjs.map +1 -0
- package/lib/index48.cjs +165 -0
- package/lib/index48.cjs.map +1 -0
- package/lib/index48.mjs +161 -0
- package/lib/index48.mjs.map +1 -0
- package/lib/index49.cjs +83 -0
- package/lib/index49.cjs.map +1 -0
- package/lib/index49.mjs +83 -0
- package/lib/index49.mjs.map +1 -0
- package/lib/index5.cjs +39 -0
- package/lib/index5.cjs.map +1 -0
- package/lib/index5.mjs +39 -0
- package/lib/index5.mjs.map +1 -0
- package/lib/index50.cjs +100 -0
- package/lib/index50.cjs.map +1 -0
- package/lib/index50.mjs +100 -0
- package/lib/index50.mjs.map +1 -0
- package/lib/index51.cjs +116 -0
- package/lib/index51.cjs.map +1 -0
- package/lib/index51.mjs +113 -0
- package/lib/index51.mjs.map +1 -0
- package/lib/index52.cjs +93 -0
- package/lib/index52.cjs.map +1 -0
- package/lib/index52.mjs +93 -0
- package/lib/index52.mjs.map +1 -0
- package/lib/index53.cjs +120 -0
- package/lib/index53.cjs.map +1 -0
- package/lib/index53.mjs +120 -0
- package/lib/index53.mjs.map +1 -0
- package/lib/index54.cjs +53 -0
- package/lib/index54.cjs.map +1 -0
- package/lib/index54.mjs +50 -0
- package/lib/index54.mjs.map +1 -0
- package/lib/index55.cjs +130 -0
- package/lib/index55.cjs.map +1 -0
- package/lib/index55.mjs +127 -0
- package/lib/index55.mjs.map +1 -0
- package/lib/index56.cjs +36 -0
- package/lib/index56.cjs.map +1 -0
- package/lib/index56.mjs +35 -0
- package/lib/index56.mjs.map +1 -0
- package/lib/index57.cjs +47 -0
- package/lib/index57.cjs.map +1 -0
- package/lib/index57.mjs +47 -0
- package/lib/index57.mjs.map +1 -0
- package/lib/index58.cjs +97 -0
- package/lib/index58.cjs.map +1 -0
- package/lib/index58.mjs +97 -0
- package/lib/index58.mjs.map +1 -0
- package/lib/index59.cjs +120 -0
- package/lib/index59.cjs.map +1 -0
- package/lib/index59.mjs +116 -0
- package/lib/index59.mjs.map +1 -0
- package/lib/index6.cjs +29 -0
- package/lib/index6.cjs.map +1 -0
- package/lib/index6.mjs +29 -0
- package/lib/index6.mjs.map +1 -0
- package/lib/index60.cjs +34 -0
- package/lib/index60.cjs.map +1 -0
- package/lib/index60.mjs +34 -0
- package/lib/index60.mjs.map +1 -0
- package/lib/index61.cjs +62 -0
- package/lib/index61.cjs.map +1 -0
- package/lib/index61.mjs +62 -0
- package/lib/index61.mjs.map +1 -0
- package/lib/index62.cjs +213 -0
- package/lib/index62.cjs.map +1 -0
- package/lib/index62.mjs +213 -0
- package/lib/index62.mjs.map +1 -0
- package/lib/index63.cjs +42 -0
- package/lib/index63.cjs.map +1 -0
- package/lib/index63.mjs +42 -0
- package/lib/index63.mjs.map +1 -0
- package/lib/index64.cjs +86 -0
- package/lib/index64.cjs.map +1 -0
- package/lib/index64.mjs +86 -0
- package/lib/index64.mjs.map +1 -0
- package/lib/index65.cjs +156 -0
- package/lib/index65.cjs.map +1 -0
- package/lib/index65.mjs +156 -0
- package/lib/index65.mjs.map +1 -0
- package/lib/index66.cjs +107 -0
- package/lib/index66.cjs.map +1 -0
- package/lib/index66.mjs +106 -0
- package/lib/index66.mjs.map +1 -0
- package/lib/index67.cjs +52 -0
- package/lib/index67.cjs.map +1 -0
- package/lib/index67.mjs +52 -0
- package/lib/index67.mjs.map +1 -0
- package/lib/index68.cjs +125 -0
- package/lib/index68.cjs.map +1 -0
- package/lib/index68.mjs +115 -0
- package/lib/index68.mjs.map +1 -0
- package/lib/index69.cjs +34 -0
- package/lib/index69.cjs.map +1 -0
- package/lib/index69.mjs +29 -0
- package/lib/index69.mjs.map +1 -0
- package/lib/index7.cjs +17 -0
- package/lib/index7.cjs.map +1 -0
- package/lib/index7.mjs +17 -0
- package/lib/index7.mjs.map +1 -0
- package/lib/index8.cjs +86 -0
- package/lib/index8.cjs.map +1 -0
- package/lib/index8.mjs +86 -0
- package/lib/index8.mjs.map +1 -0
- package/lib/index9.cjs +29 -0
- package/lib/index9.cjs.map +1 -0
- package/lib/index9.mjs +29 -0
- package/lib/index9.mjs.map +1 -0
- package/lib/types/index.d.ts +1 -0
- package/package.json +68 -0
package/lib/index30.cjs
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/ui-library/gallery/validation-summary/ValidationSummary.tsx
|
|
3
|
+
function ValidationSummary({ issues, heading = "Review these fields before saving", className = "" }) {
|
|
4
|
+
if (issues.length === 0) return null;
|
|
5
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6
|
+
role: "alert",
|
|
7
|
+
className: ["rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900", className].filter(Boolean).join(" "),
|
|
8
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9
|
+
className: "font-bold",
|
|
10
|
+
children: heading
|
|
11
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
12
|
+
className: "mt-2 list-disc space-y-1 pl-5",
|
|
13
|
+
children: issues.map((issue) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [
|
|
14
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
15
|
+
className: "font-semibold",
|
|
16
|
+
children: [issue.field, ":"]
|
|
17
|
+
}),
|
|
18
|
+
" ",
|
|
19
|
+
issue.message
|
|
20
|
+
] }, `${issue.field}:${issue.message}`))
|
|
21
|
+
})]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
exports.ValidationSummary = ValidationSummary;
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=index30.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index30.cjs","names":[],"sources":["../src/ui-library/gallery/validation-summary/ValidationSummary.tsx"],"sourcesContent":["/**\n * ValidationSummary — Design System Component\n *\n * Renders a list of validation errors or warnings before a form is submitted.\n * Matches the production implementation in shared/components/ValidationSummary.tsx.\n *\n * Accessibility:\n * - role=\"alert\" causes immediate announcement when injected into the DOM.\n * - <ul> with <li> items provides proper list semantics.\n * - The heading is a <div role=\"heading\" aria-level=\"3\"> to avoid disrupting\n * page outline; callers may override via headingLevel.\n * - Each issue is identified by field name + message.\n *\n * Usage:\n * const [issues, setIssues] = useState<ValidationIssue[]>([]);\n * // ... after validation:\n * setIssues([{ field: 'Employee ID', message: 'is required' }]);\n * // Render:\n * <ValidationSummary issues={issues} />\n */\n\nexport interface ValidationIssue {\n /** Human-readable field label. */\n field: string;\n /** Error description for this field. */\n message: string;\n}\n\nexport interface ValidationSummaryProps {\n /** List of validation issues. Renders nothing when empty. */\n issues: ValidationIssue[];\n /**\n * Heading text shown above the issue list.\n * Default: \"Review these fields before saving\"\n */\n heading?: string;\n /** Additional class on the root element. */\n className?: string;\n}\n\nexport function ValidationSummary({\n issues,\n heading = 'Review these fields before saving',\n className = '',\n}: ValidationSummaryProps) {\n if (issues.length === 0) return null;\n\n return (\n <div\n role=\"alert\"\n className={[\n 'rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"font-bold\">{heading}</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {issues.map((issue) => (\n <li key={`${issue.field}:${issue.message}`}>\n <span className=\"font-semibold\">{issue.field}:</span>{' '}\n {issue.message}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// Re-export type for consumer convenience\nexport type { ValidationIssue as ValidationSummaryIssue };\n"],"mappings":";;AAwCA,SAAgB,kBAAkB,EAChC,QACA,UAAU,qCACV,YAAY,MACa;CACzB,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,MAAK;EACL,WAAW,CACT,mFACA,SACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EAPb,UAAA,CASE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAU;GAAa,UAAA;EAAa,CAAA,GACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;GAAI,WAAU;GACX,UAAA,OAAO,KAAK,UACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CAAiC,MAAM,OAAM,GAAO;;IAAE;IACrD,MAAM;GACL,EAAA,GAHK,GAAG,MAAM,MAAM,GAAG,MAAM,SAG7B,CACL;EACC,CAAA,CACD;;AAET"}
|
package/lib/index30.mjs
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
//#region src/ui-library/gallery/validation-summary/ValidationSummary.tsx
|
|
3
|
+
function ValidationSummary({ issues, heading = "Review these fields before saving", className = "" }) {
|
|
4
|
+
if (issues.length === 0) return null;
|
|
5
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
6
|
+
role: "alert",
|
|
7
|
+
className: ["rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900", className].filter(Boolean).join(" "),
|
|
8
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
9
|
+
className: "font-bold",
|
|
10
|
+
children: heading
|
|
11
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
12
|
+
className: "mt-2 list-disc space-y-1 pl-5",
|
|
13
|
+
children: issues.map((issue) => /* @__PURE__ */ jsxs("li", { children: [
|
|
14
|
+
/* @__PURE__ */ jsxs("span", {
|
|
15
|
+
className: "font-semibold",
|
|
16
|
+
children: [issue.field, ":"]
|
|
17
|
+
}),
|
|
18
|
+
" ",
|
|
19
|
+
issue.message
|
|
20
|
+
] }, `${issue.field}:${issue.message}`))
|
|
21
|
+
})]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { ValidationSummary };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=index30.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index30.mjs","names":[],"sources":["../src/ui-library/gallery/validation-summary/ValidationSummary.tsx"],"sourcesContent":["/**\n * ValidationSummary — Design System Component\n *\n * Renders a list of validation errors or warnings before a form is submitted.\n * Matches the production implementation in shared/components/ValidationSummary.tsx.\n *\n * Accessibility:\n * - role=\"alert\" causes immediate announcement when injected into the DOM.\n * - <ul> with <li> items provides proper list semantics.\n * - The heading is a <div role=\"heading\" aria-level=\"3\"> to avoid disrupting\n * page outline; callers may override via headingLevel.\n * - Each issue is identified by field name + message.\n *\n * Usage:\n * const [issues, setIssues] = useState<ValidationIssue[]>([]);\n * // ... after validation:\n * setIssues([{ field: 'Employee ID', message: 'is required' }]);\n * // Render:\n * <ValidationSummary issues={issues} />\n */\n\nexport interface ValidationIssue {\n /** Human-readable field label. */\n field: string;\n /** Error description for this field. */\n message: string;\n}\n\nexport interface ValidationSummaryProps {\n /** List of validation issues. Renders nothing when empty. */\n issues: ValidationIssue[];\n /**\n * Heading text shown above the issue list.\n * Default: \"Review these fields before saving\"\n */\n heading?: string;\n /** Additional class on the root element. */\n className?: string;\n}\n\nexport function ValidationSummary({\n issues,\n heading = 'Review these fields before saving',\n className = '',\n}: ValidationSummaryProps) {\n if (issues.length === 0) return null;\n\n return (\n <div\n role=\"alert\"\n className={[\n 'rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"font-bold\">{heading}</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {issues.map((issue) => (\n <li key={`${issue.field}:${issue.message}`}>\n <span className=\"font-semibold\">{issue.field}:</span>{' '}\n {issue.message}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// Re-export type for consumer convenience\nexport type { ValidationIssue as ValidationSummaryIssue };\n"],"mappings":";;AAwCA,SAAgB,kBAAkB,EAChC,QACA,UAAU,qCACV,YAAY,MACa;CACzB,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,OACE,qBAAC,OAAD;EACE,MAAK;EACL,WAAW,CACT,mFACA,SACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EAPb,UAAA,CASE,oBAAC,OAAD;GAAK,WAAU;GAAa,UAAA;EAAa,CAAA,GACzC,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,OAAO,KAAK,UACX,qBAAC,MAAD,EAAA,UAAA;IACE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CAAiC,MAAM,OAAM,GAAO;;IAAE;IACrD,MAAM;GACL,EAAA,GAHK,GAAG,MAAM,MAAM,GAAG,MAAM,SAG7B,CACL;EACC,CAAA,CACD;;AAET"}
|
package/lib/index31.cjs
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
let lucide_react = require("lucide-react");
|
|
3
|
+
//#region src/ui-library/gallery/alert/Alert.tsx
|
|
4
|
+
var TONE_FULL = {
|
|
5
|
+
info: "border-l-4 border-sky-400 bg-sky-50 text-sky-800",
|
|
6
|
+
success: "border-l-4 border-emerald-400 bg-emerald-50 text-emerald-800",
|
|
7
|
+
warning: "border-l-4 border-amber-400 bg-amber-50 text-amber-800",
|
|
8
|
+
danger: "border-l-4 border-rose-500 bg-rose-50 text-rose-800"
|
|
9
|
+
};
|
|
10
|
+
var TONE_SUBTLE = {
|
|
11
|
+
info: "border-l-4 border-sky-400 bg-white text-sky-700",
|
|
12
|
+
success: "border-l-4 border-emerald-400 bg-white text-emerald-700",
|
|
13
|
+
warning: "border-l-4 border-amber-400 bg-white text-amber-700",
|
|
14
|
+
danger: "border-l-4 border-rose-500 bg-white text-rose-700"
|
|
15
|
+
};
|
|
16
|
+
var ICON_CLASS = {
|
|
17
|
+
info: "text-sky-500",
|
|
18
|
+
success: "text-emerald-500",
|
|
19
|
+
warning: "text-amber-500",
|
|
20
|
+
danger: "text-rose-500"
|
|
21
|
+
};
|
|
22
|
+
var TONE_ICON = {
|
|
23
|
+
info: lucide_react.Info,
|
|
24
|
+
success: lucide_react.CheckCircle2,
|
|
25
|
+
warning: lucide_react.AlertTriangle,
|
|
26
|
+
danger: lucide_react.AlertCircle
|
|
27
|
+
};
|
|
28
|
+
var DISMISS_CLASS = {
|
|
29
|
+
info: "text-sky-400 hover:bg-sky-100",
|
|
30
|
+
success: "text-emerald-400 hover:bg-emerald-100",
|
|
31
|
+
warning: "text-amber-400 hover:bg-amber-100",
|
|
32
|
+
danger: "text-rose-400 hover:bg-rose-100"
|
|
33
|
+
};
|
|
34
|
+
function Alert({ tone, title, children, icon = true, onDismiss, subtle = false, className = "" }) {
|
|
35
|
+
const Icon = TONE_ICON[tone];
|
|
36
|
+
const colorClass = subtle ? TONE_SUBTLE[tone] : TONE_FULL[tone];
|
|
37
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
38
|
+
role: "alert",
|
|
39
|
+
className: `flex gap-3 rounded-md pl-4 pr-4 py-3.5 ${colorClass} ${className}`,
|
|
40
|
+
children: [
|
|
41
|
+
icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, {
|
|
42
|
+
size: 20,
|
|
43
|
+
className: `mt-0.5 shrink-0 ${ICON_CLASS[tone]}`,
|
|
44
|
+
"aria-hidden": "true"
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
47
|
+
className: "min-w-0 flex-1 text-sm",
|
|
48
|
+
children: [title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
49
|
+
className: "font-bold leading-snug mb-0.5",
|
|
50
|
+
children: title
|
|
51
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
52
|
+
className: "font-medium leading-relaxed",
|
|
53
|
+
children
|
|
54
|
+
})]
|
|
55
|
+
}),
|
|
56
|
+
onDismiss && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
57
|
+
type: "button",
|
|
58
|
+
onClick: onDismiss,
|
|
59
|
+
"aria-label": "Dismiss",
|
|
60
|
+
className: `-mr-1 -mt-0.5 shrink-0 rounded-lg p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current ${DISMISS_CLASS[tone]}`,
|
|
61
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.X, {
|
|
62
|
+
size: 14,
|
|
63
|
+
"aria-hidden": "true"
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
exports.Alert = Alert;
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=index31.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index31.cjs","names":[],"sources":["../src/ui-library/gallery/alert/Alert.tsx"],"sourcesContent":["/**\n * Alert — Design System Component\n *\n * Inline contextual feedback. Purely presentational.\n *\n * Tones: info | success | warning | danger\n * Variants: default | subtle\n */\n\nimport type { ReactNode } from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info, X } from 'lucide-react';\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps {\n tone: AlertTone;\n title?: string;\n children: ReactNode;\n /** Show an icon matching the tone */\n icon?: boolean;\n /** Show a dismiss button */\n onDismiss?: () => void;\n /** Subtle variant uses a lighter background */\n subtle?: boolean;\n className?: string;\n}\n\n// ── Style maps ────────────────────────────────────────────────────────────────\n\n// Full background tones — keep semantic colors, add the DIWA left-rule\nconst TONE_FULL: Record<AlertTone, string> = {\n info: 'border-l-4 border-sky-400 bg-sky-50 text-sky-800',\n success: 'border-l-4 border-emerald-400 bg-emerald-50 text-emerald-800',\n warning: 'border-l-4 border-amber-400 bg-amber-50 text-amber-800',\n danger: 'border-l-4 border-rose-500 bg-rose-50 text-rose-800',\n};\n\n// Subtle: white bg, left rule is the only structural marker\nconst TONE_SUBTLE: Record<AlertTone, string> = {\n info: 'border-l-4 border-sky-400 bg-white text-sky-700',\n success: 'border-l-4 border-emerald-400 bg-white text-emerald-700',\n warning: 'border-l-4 border-amber-400 bg-white text-amber-700',\n danger: 'border-l-4 border-rose-500 bg-white text-rose-700',\n};\n\nconst ICON_CLASS: Record<AlertTone, string> = {\n info: 'text-sky-500',\n success: 'text-emerald-500',\n warning: 'text-amber-500',\n danger: 'text-rose-500',\n};\n\nconst TONE_ICON: Record<AlertTone, typeof Info> = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n};\n\nconst DISMISS_CLASS: Record<AlertTone, string> = {\n info: 'text-sky-400 hover:bg-sky-100',\n success: 'text-emerald-400 hover:bg-emerald-100',\n warning: 'text-amber-400 hover:bg-amber-100',\n danger: 'text-rose-400 hover:bg-rose-100',\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport function Alert({\n tone,\n title,\n children,\n icon = true,\n onDismiss,\n subtle = false,\n className = '',\n}: AlertProps) {\n const Icon = TONE_ICON[tone];\n const colorClass = subtle ? TONE_SUBTLE[tone] : TONE_FULL[tone];\n\n return (\n <div\n role=\"alert\"\n className={`flex gap-3 rounded-md pl-4 pr-4 py-3.5 ${colorClass} ${className}`}\n >\n {icon && (\n <Icon\n size={20}\n className={`mt-0.5 shrink-0 ${ICON_CLASS[tone]}`}\n aria-hidden=\"true\"\n />\n )}\n <div className=\"min-w-0 flex-1 text-sm\">\n {title && <p className=\"font-bold leading-snug mb-0.5\">{title}</p>}\n <div className=\"font-medium leading-relaxed\">{children}</div>\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className={`-mr-1 -mt-0.5 shrink-0 rounded-lg p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current ${DISMISS_CLASS[tone]}`}\n >\n <X size={14} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;AA8BA,IAAM,YAAuC;CAC3C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAGA,IAAM,cAAyC;CAC7C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAEA,IAAM,aAAwC;CAC5C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAEA,IAAM,YAA4C;CAChD,MAAS,aAAA;CACT,SAAS,aAAA;CACT,SAAS,aAAA;CACT,QAAS,aAAA;AACX;AAEA,IAAM,gBAA2C;CAC/C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAIA,SAAgB,MAAM,EACpB,MACA,OACA,UACA,OAAO,MACP,WACA,SAAS,OACT,YAAY,MACC;CACb,MAAM,OAAO,UAAU;CACvB,MAAM,aAAa,SAAS,YAAY,QAAQ,UAAU;CAE1D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,MAAK;EACL,WAAW,0CAA0C,WAAW,GAAG;EAFrE,UAAA;GAIG,QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;IACE,MAAM;IACN,WAAW,mBAAmB,WAAW;IACzC,eAAY;GACb,CAAA;GAEH,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAiC,UAAA;IAAS,CAAA,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KAA+B;IAAc,CAAA,CACzD;;GACJ,aACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,cAAW;IACX,WAAW,+HAA+H,cAAc;IAExJ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAA,GAAD;KAAG,MAAM;KAAI,eAAY;IAAQ,CAAA;GAC3B,CAAA;EAEP;;AAET"}
|
package/lib/index31.mjs
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AlertCircle, AlertTriangle, CheckCircle2, Info, X } from "lucide-react";
|
|
3
|
+
//#region src/ui-library/gallery/alert/Alert.tsx
|
|
4
|
+
var TONE_FULL = {
|
|
5
|
+
info: "border-l-4 border-sky-400 bg-sky-50 text-sky-800",
|
|
6
|
+
success: "border-l-4 border-emerald-400 bg-emerald-50 text-emerald-800",
|
|
7
|
+
warning: "border-l-4 border-amber-400 bg-amber-50 text-amber-800",
|
|
8
|
+
danger: "border-l-4 border-rose-500 bg-rose-50 text-rose-800"
|
|
9
|
+
};
|
|
10
|
+
var TONE_SUBTLE = {
|
|
11
|
+
info: "border-l-4 border-sky-400 bg-white text-sky-700",
|
|
12
|
+
success: "border-l-4 border-emerald-400 bg-white text-emerald-700",
|
|
13
|
+
warning: "border-l-4 border-amber-400 bg-white text-amber-700",
|
|
14
|
+
danger: "border-l-4 border-rose-500 bg-white text-rose-700"
|
|
15
|
+
};
|
|
16
|
+
var ICON_CLASS = {
|
|
17
|
+
info: "text-sky-500",
|
|
18
|
+
success: "text-emerald-500",
|
|
19
|
+
warning: "text-amber-500",
|
|
20
|
+
danger: "text-rose-500"
|
|
21
|
+
};
|
|
22
|
+
var TONE_ICON = {
|
|
23
|
+
info: Info,
|
|
24
|
+
success: CheckCircle2,
|
|
25
|
+
warning: AlertTriangle,
|
|
26
|
+
danger: AlertCircle
|
|
27
|
+
};
|
|
28
|
+
var DISMISS_CLASS = {
|
|
29
|
+
info: "text-sky-400 hover:bg-sky-100",
|
|
30
|
+
success: "text-emerald-400 hover:bg-emerald-100",
|
|
31
|
+
warning: "text-amber-400 hover:bg-amber-100",
|
|
32
|
+
danger: "text-rose-400 hover:bg-rose-100"
|
|
33
|
+
};
|
|
34
|
+
function Alert({ tone, title, children, icon = true, onDismiss, subtle = false, className = "" }) {
|
|
35
|
+
const Icon = TONE_ICON[tone];
|
|
36
|
+
const colorClass = subtle ? TONE_SUBTLE[tone] : TONE_FULL[tone];
|
|
37
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
38
|
+
role: "alert",
|
|
39
|
+
className: `flex gap-3 rounded-md pl-4 pr-4 py-3.5 ${colorClass} ${className}`,
|
|
40
|
+
children: [
|
|
41
|
+
icon && /* @__PURE__ */ jsx(Icon, {
|
|
42
|
+
size: 20,
|
|
43
|
+
className: `mt-0.5 shrink-0 ${ICON_CLASS[tone]}`,
|
|
44
|
+
"aria-hidden": "true"
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ jsxs("div", {
|
|
47
|
+
className: "min-w-0 flex-1 text-sm",
|
|
48
|
+
children: [title && /* @__PURE__ */ jsx("p", {
|
|
49
|
+
className: "font-bold leading-snug mb-0.5",
|
|
50
|
+
children: title
|
|
51
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
52
|
+
className: "font-medium leading-relaxed",
|
|
53
|
+
children
|
|
54
|
+
})]
|
|
55
|
+
}),
|
|
56
|
+
onDismiss && /* @__PURE__ */ jsx("button", {
|
|
57
|
+
type: "button",
|
|
58
|
+
onClick: onDismiss,
|
|
59
|
+
"aria-label": "Dismiss",
|
|
60
|
+
className: `-mr-1 -mt-0.5 shrink-0 rounded-lg p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current ${DISMISS_CLASS[tone]}`,
|
|
61
|
+
children: /* @__PURE__ */ jsx(X, {
|
|
62
|
+
size: 14,
|
|
63
|
+
"aria-hidden": "true"
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { Alert };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=index31.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index31.mjs","names":[],"sources":["../src/ui-library/gallery/alert/Alert.tsx"],"sourcesContent":["/**\n * Alert — Design System Component\n *\n * Inline contextual feedback. Purely presentational.\n *\n * Tones: info | success | warning | danger\n * Variants: default | subtle\n */\n\nimport type { ReactNode } from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info, X } from 'lucide-react';\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps {\n tone: AlertTone;\n title?: string;\n children: ReactNode;\n /** Show an icon matching the tone */\n icon?: boolean;\n /** Show a dismiss button */\n onDismiss?: () => void;\n /** Subtle variant uses a lighter background */\n subtle?: boolean;\n className?: string;\n}\n\n// ── Style maps ────────────────────────────────────────────────────────────────\n\n// Full background tones — keep semantic colors, add the DIWA left-rule\nconst TONE_FULL: Record<AlertTone, string> = {\n info: 'border-l-4 border-sky-400 bg-sky-50 text-sky-800',\n success: 'border-l-4 border-emerald-400 bg-emerald-50 text-emerald-800',\n warning: 'border-l-4 border-amber-400 bg-amber-50 text-amber-800',\n danger: 'border-l-4 border-rose-500 bg-rose-50 text-rose-800',\n};\n\n// Subtle: white bg, left rule is the only structural marker\nconst TONE_SUBTLE: Record<AlertTone, string> = {\n info: 'border-l-4 border-sky-400 bg-white text-sky-700',\n success: 'border-l-4 border-emerald-400 bg-white text-emerald-700',\n warning: 'border-l-4 border-amber-400 bg-white text-amber-700',\n danger: 'border-l-4 border-rose-500 bg-white text-rose-700',\n};\n\nconst ICON_CLASS: Record<AlertTone, string> = {\n info: 'text-sky-500',\n success: 'text-emerald-500',\n warning: 'text-amber-500',\n danger: 'text-rose-500',\n};\n\nconst TONE_ICON: Record<AlertTone, typeof Info> = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n};\n\nconst DISMISS_CLASS: Record<AlertTone, string> = {\n info: 'text-sky-400 hover:bg-sky-100',\n success: 'text-emerald-400 hover:bg-emerald-100',\n warning: 'text-amber-400 hover:bg-amber-100',\n danger: 'text-rose-400 hover:bg-rose-100',\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport function Alert({\n tone,\n title,\n children,\n icon = true,\n onDismiss,\n subtle = false,\n className = '',\n}: AlertProps) {\n const Icon = TONE_ICON[tone];\n const colorClass = subtle ? TONE_SUBTLE[tone] : TONE_FULL[tone];\n\n return (\n <div\n role=\"alert\"\n className={`flex gap-3 rounded-md pl-4 pr-4 py-3.5 ${colorClass} ${className}`}\n >\n {icon && (\n <Icon\n size={20}\n className={`mt-0.5 shrink-0 ${ICON_CLASS[tone]}`}\n aria-hidden=\"true\"\n />\n )}\n <div className=\"min-w-0 flex-1 text-sm\">\n {title && <p className=\"font-bold leading-snug mb-0.5\">{title}</p>}\n <div className=\"font-medium leading-relaxed\">{children}</div>\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className={`-mr-1 -mt-0.5 shrink-0 rounded-lg p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current ${DISMISS_CLASS[tone]}`}\n >\n <X size={14} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;AA8BA,IAAM,YAAuC;CAC3C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAGA,IAAM,cAAyC;CAC7C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAEA,IAAM,aAAwC;CAC5C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAEA,IAAM,YAA4C;CAChD,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAEA,IAAM,gBAA2C;CAC/C,MAAS;CACT,SAAS;CACT,SAAS;CACT,QAAS;AACX;AAIA,SAAgB,MAAM,EACpB,MACA,OACA,UACA,OAAO,MACP,WACA,SAAS,OACT,YAAY,MACC;CACb,MAAM,OAAO,UAAU;CACvB,MAAM,aAAa,SAAS,YAAY,QAAQ,UAAU;CAE1D,OACE,qBAAC,OAAD;EACE,MAAK;EACL,WAAW,0CAA0C,WAAW,GAAG;EAFrE,UAAA;GAIG,QACC,oBAAC,MAAD;IACE,MAAM;IACN,WAAW,mBAAmB,WAAW;IACzC,eAAY;GACb,CAAA;GAEH,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,SAAS,oBAAC,KAAD;KAAG,WAAU;KAAiC,UAAA;IAAS,CAAA,GACjE,oBAAC,OAAD;KAAK,WAAU;KAA+B;IAAc,CAAA,CACzD;;GACJ,aACC,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,cAAW;IACX,WAAW,+HAA+H,cAAc;IAExJ,UAAA,oBAAC,GAAD;KAAG,MAAM;KAAI,eAAY;IAAQ,CAAA;GAC3B,CAAA;EAEP;;AAET"}
|
package/lib/index32.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/ui-library/gallery/error-banner/ErrorBanner.tsx
|
|
3
|
+
var STYLES = {
|
|
4
|
+
error: "border-rose-100 bg-rose-50 text-rose-700",
|
|
5
|
+
warning: "border-amber-200 bg-amber-50 text-amber-800",
|
|
6
|
+
info: "border-sky-200 bg-sky-50 text-sky-800"
|
|
7
|
+
};
|
|
8
|
+
function ErrorBanner({ message, tone = "error", className = "" }) {
|
|
9
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10
|
+
role: tone === "error" ? "alert" : void 0,
|
|
11
|
+
"aria-live": tone !== "error" ? "polite" : void 0,
|
|
12
|
+
className: `rounded-2xl border px-5 py-4 text-sm font-bold ${STYLES[tone]} ${className}`,
|
|
13
|
+
children: message
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.ErrorBanner = ErrorBanner;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=index32.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index32.cjs","names":[],"sources":["../src/ui-library/gallery/error-banner/ErrorBanner.tsx"],"sourcesContent":["/**\n * ErrorBanner — Design System Component\n *\n * Inline feedback banner for error, warning, and info messages.\n *\n * This gallery component preserves the established visual language of\n * the production ErrorBanner from shared/components/ui.tsx:\n * - Same tone system: 'error' | 'warning' | 'info'\n * - Same visual treatment: rounded-2xl, border, px-5 py-4, text-sm font-bold\n *\n * Accessibility:\n * - role=\"alert\" for error tone (polite live region for warnings/info)\n * - aria-live for warning/info tones\n *\n * Usage:\n * <ErrorBanner message=\"Failed to save changes.\" />\n * <ErrorBanner message=\"Draft saved.\" tone=\"info\" />\n * <ErrorBanner message=\"This action cannot be undone.\" tone=\"warning\" />\n */\n\nimport type { ReactNode } from 'react';\n\nexport type ErrorBannerTone = 'error' | 'warning' | 'info';\n\nexport interface ErrorBannerProps {\n /** Primary message text */\n message: ReactNode;\n tone?: ErrorBannerTone;\n className?: string;\n}\n\nconst STYLES: Record<ErrorBannerTone, string> = {\n error: 'border-rose-100 bg-rose-50 text-rose-700',\n warning: 'border-amber-200 bg-amber-50 text-amber-800',\n info: 'border-sky-200 bg-sky-50 text-sky-800',\n};\n\nexport function ErrorBanner({ message, tone = 'error', className = '' }: ErrorBannerProps) {\n return (\n <div\n role={tone === 'error' ? 'alert' : undefined}\n aria-live={tone !== 'error' ? 'polite' : undefined}\n className={`rounded-2xl border px-5 py-4 text-sm font-bold ${STYLES[tone]} ${className}`}\n >\n {message}\n </div>\n );\n}\n"],"mappings":";;AA+BA,IAAM,SAA0C;CAC9C,OAAS;CACT,SAAS;CACT,MAAS;AACX;AAEA,SAAgB,YAAY,EAAE,SAAS,OAAO,SAAS,YAAY,MAAwB;CACzF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,MAAM,SAAS,UAAU,UAAU,KAAA;EACnC,aAAW,SAAS,UAAU,WAAW,KAAA;EACzC,WAAW,kDAAkD,OAAO,MAAM,GAAG;EAE5E,UAAA;CACE,CAAA;AAET"}
|
package/lib/index32.mjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/ui-library/gallery/error-banner/ErrorBanner.tsx
|
|
3
|
+
var STYLES = {
|
|
4
|
+
error: "border-rose-100 bg-rose-50 text-rose-700",
|
|
5
|
+
warning: "border-amber-200 bg-amber-50 text-amber-800",
|
|
6
|
+
info: "border-sky-200 bg-sky-50 text-sky-800"
|
|
7
|
+
};
|
|
8
|
+
function ErrorBanner({ message, tone = "error", className = "" }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("div", {
|
|
10
|
+
role: tone === "error" ? "alert" : void 0,
|
|
11
|
+
"aria-live": tone !== "error" ? "polite" : void 0,
|
|
12
|
+
className: `rounded-2xl border px-5 py-4 text-sm font-bold ${STYLES[tone]} ${className}`,
|
|
13
|
+
children: message
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ErrorBanner };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=index32.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index32.mjs","names":[],"sources":["../src/ui-library/gallery/error-banner/ErrorBanner.tsx"],"sourcesContent":["/**\n * ErrorBanner — Design System Component\n *\n * Inline feedback banner for error, warning, and info messages.\n *\n * This gallery component preserves the established visual language of\n * the production ErrorBanner from shared/components/ui.tsx:\n * - Same tone system: 'error' | 'warning' | 'info'\n * - Same visual treatment: rounded-2xl, border, px-5 py-4, text-sm font-bold\n *\n * Accessibility:\n * - role=\"alert\" for error tone (polite live region for warnings/info)\n * - aria-live for warning/info tones\n *\n * Usage:\n * <ErrorBanner message=\"Failed to save changes.\" />\n * <ErrorBanner message=\"Draft saved.\" tone=\"info\" />\n * <ErrorBanner message=\"This action cannot be undone.\" tone=\"warning\" />\n */\n\nimport type { ReactNode } from 'react';\n\nexport type ErrorBannerTone = 'error' | 'warning' | 'info';\n\nexport interface ErrorBannerProps {\n /** Primary message text */\n message: ReactNode;\n tone?: ErrorBannerTone;\n className?: string;\n}\n\nconst STYLES: Record<ErrorBannerTone, string> = {\n error: 'border-rose-100 bg-rose-50 text-rose-700',\n warning: 'border-amber-200 bg-amber-50 text-amber-800',\n info: 'border-sky-200 bg-sky-50 text-sky-800',\n};\n\nexport function ErrorBanner({ message, tone = 'error', className = '' }: ErrorBannerProps) {\n return (\n <div\n role={tone === 'error' ? 'alert' : undefined}\n aria-live={tone !== 'error' ? 'polite' : undefined}\n className={`rounded-2xl border px-5 py-4 text-sm font-bold ${STYLES[tone]} ${className}`}\n >\n {message}\n </div>\n );\n}\n"],"mappings":";;AA+BA,IAAM,SAA0C;CAC9C,OAAS;CACT,SAAS;CACT,MAAS;AACX;AAEA,SAAgB,YAAY,EAAE,SAAS,OAAO,SAAS,YAAY,MAAwB;CACzF,OACE,oBAAC,OAAD;EACE,MAAM,SAAS,UAAU,UAAU,KAAA;EACnC,aAAW,SAAS,UAAU,WAAW,KAAA;EACzC,WAAW,kDAAkD,OAAO,MAAM,GAAG;EAE5E,UAAA;CACE,CAAA;AAET"}
|
package/lib/index33.cjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/ui-library/gallery/progress/Progress.tsx
|
|
3
|
+
function Progress({ value, max = 100, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, className = "" }) {
|
|
4
|
+
const isIndeterminate = value === void 0;
|
|
5
|
+
const clamped = isIndeterminate ? 0 : Math.min(Math.max(value, 0), max);
|
|
6
|
+
const percent = isIndeterminate ? 0 : clamped / max * 100;
|
|
7
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8
|
+
role: "progressbar",
|
|
9
|
+
"aria-valuenow": isIndeterminate ? void 0 : clamped,
|
|
10
|
+
"aria-valuemin": 0,
|
|
11
|
+
"aria-valuemax": max,
|
|
12
|
+
"aria-label": ariaLabel,
|
|
13
|
+
"aria-labelledby": ariaLabelledby,
|
|
14
|
+
className: `h-2 w-full overflow-hidden rounded-full bg-slate-200 ${className}`,
|
|
15
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
16
|
+
className: ["h-full rounded-full bg-brand-blue transition-[width] duration-300", isIndeterminate ? "w-1/3 motion-safe:animate-pulse opacity-75" : ""].filter(Boolean).join(" "),
|
|
17
|
+
style: isIndeterminate ? void 0 : { width: `${percent}%` },
|
|
18
|
+
"aria-hidden": "true"
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.Progress = Progress;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=index33.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index33.cjs","names":[],"sources":["../src/ui-library/gallery/progress/Progress.tsx"],"sourcesContent":["/**\n * Progress — Design System Component\n *\n * Determinate and indeterminate linear progress bar.\n *\n * Accessibility:\n * - role=\"progressbar\"\n * - aria-valuenow, aria-valuemin, aria-valuemax (determinate)\n * - aria-label for screen-reader context\n * - When indeterminate: aria-valuenow is omitted\n *\n * Usage:\n * // Determinate (0–100)\n * <Progress value={65} aria-label=\"Upload progress\" />\n *\n * // Indeterminate\n * <Progress aria-label=\"Loading\" />\n *\n * // Custom max\n * <Progress value={3} max={5} aria-label=\"Step 3 of 5\" />\n */\n\nexport interface ProgressProps {\n /**\n * Current progress value.\n * Omit (or set to undefined) for indeterminate state.\n */\n value?: number;\n /** Maximum value. Default: 100 */\n max?: number;\n /** Accessible label describing what is progressing */\n 'aria-label'?: string;\n /** Accessible label from an external element */\n 'aria-labelledby'?: string;\n className?: string;\n}\n\nexport function Progress({\n value,\n max = 100,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n className = '',\n}: ProgressProps) {\n const isIndeterminate = value === undefined;\n const clamped = isIndeterminate ? 0 : Math.min(Math.max(value, 0), max);\n const percent = isIndeterminate ? 0 : (clamped / max) * 100;\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={isIndeterminate ? undefined : clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={`h-2 w-full overflow-hidden rounded-full bg-slate-200 ${className}`}\n >\n <div\n className={[\n 'h-full rounded-full bg-brand-blue transition-[width] duration-300',\n isIndeterminate ? 'w-1/3 motion-safe:animate-pulse opacity-75' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={isIndeterminate ? undefined : { width: `${percent}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n"],"mappings":";;AAqCA,SAAgB,SAAS,EACvB,OACA,MAAM,KACN,cAAc,WACd,mBAAmB,gBACnB,YAAY,MACI;CAChB,MAAM,kBAAkB,UAAU,KAAA;CAClC,MAAM,UAAU,kBAAkB,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;CACtE,MAAM,UAAU,kBAAkB,IAAK,UAAU,MAAO;CAExD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,MAAK;EACL,iBAAe,kBAAkB,KAAA,IAAY;EAC7C,iBAAe;EACf,iBAAe;EACf,cAAY;EACZ,mBAAiB;EACjB,WAAW,wDAAwD;EAEnE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GACE,WAAW,CACT,qEACA,kBAAkB,+CAA+C,EACnE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;GACX,OAAO,kBAAkB,KAAA,IAAY,EAAE,OAAO,GAAG,QAAQ,GAAG;GAC5D,eAAY;EACb,CAAA;CACE,CAAA;AAET"}
|
package/lib/index33.mjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/ui-library/gallery/progress/Progress.tsx
|
|
3
|
+
function Progress({ value, max = 100, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, className = "" }) {
|
|
4
|
+
const isIndeterminate = value === void 0;
|
|
5
|
+
const clamped = isIndeterminate ? 0 : Math.min(Math.max(value, 0), max);
|
|
6
|
+
const percent = isIndeterminate ? 0 : clamped / max * 100;
|
|
7
|
+
return /* @__PURE__ */ jsx("div", {
|
|
8
|
+
role: "progressbar",
|
|
9
|
+
"aria-valuenow": isIndeterminate ? void 0 : clamped,
|
|
10
|
+
"aria-valuemin": 0,
|
|
11
|
+
"aria-valuemax": max,
|
|
12
|
+
"aria-label": ariaLabel,
|
|
13
|
+
"aria-labelledby": ariaLabelledby,
|
|
14
|
+
className: `h-2 w-full overflow-hidden rounded-full bg-slate-200 ${className}`,
|
|
15
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
16
|
+
className: ["h-full rounded-full bg-brand-blue transition-[width] duration-300", isIndeterminate ? "w-1/3 motion-safe:animate-pulse opacity-75" : ""].filter(Boolean).join(" "),
|
|
17
|
+
style: isIndeterminate ? void 0 : { width: `${percent}%` },
|
|
18
|
+
"aria-hidden": "true"
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { Progress };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=index33.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index33.mjs","names":[],"sources":["../src/ui-library/gallery/progress/Progress.tsx"],"sourcesContent":["/**\n * Progress — Design System Component\n *\n * Determinate and indeterminate linear progress bar.\n *\n * Accessibility:\n * - role=\"progressbar\"\n * - aria-valuenow, aria-valuemin, aria-valuemax (determinate)\n * - aria-label for screen-reader context\n * - When indeterminate: aria-valuenow is omitted\n *\n * Usage:\n * // Determinate (0–100)\n * <Progress value={65} aria-label=\"Upload progress\" />\n *\n * // Indeterminate\n * <Progress aria-label=\"Loading\" />\n *\n * // Custom max\n * <Progress value={3} max={5} aria-label=\"Step 3 of 5\" />\n */\n\nexport interface ProgressProps {\n /**\n * Current progress value.\n * Omit (or set to undefined) for indeterminate state.\n */\n value?: number;\n /** Maximum value. Default: 100 */\n max?: number;\n /** Accessible label describing what is progressing */\n 'aria-label'?: string;\n /** Accessible label from an external element */\n 'aria-labelledby'?: string;\n className?: string;\n}\n\nexport function Progress({\n value,\n max = 100,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n className = '',\n}: ProgressProps) {\n const isIndeterminate = value === undefined;\n const clamped = isIndeterminate ? 0 : Math.min(Math.max(value, 0), max);\n const percent = isIndeterminate ? 0 : (clamped / max) * 100;\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={isIndeterminate ? undefined : clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={`h-2 w-full overflow-hidden rounded-full bg-slate-200 ${className}`}\n >\n <div\n className={[\n 'h-full rounded-full bg-brand-blue transition-[width] duration-300',\n isIndeterminate ? 'w-1/3 motion-safe:animate-pulse opacity-75' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={isIndeterminate ? undefined : { width: `${percent}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n"],"mappings":";;AAqCA,SAAgB,SAAS,EACvB,OACA,MAAM,KACN,cAAc,WACd,mBAAmB,gBACnB,YAAY,MACI;CAChB,MAAM,kBAAkB,UAAU,KAAA;CAClC,MAAM,UAAU,kBAAkB,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;CACtE,MAAM,UAAU,kBAAkB,IAAK,UAAU,MAAO;CAExD,OACE,oBAAC,OAAD;EACE,MAAK;EACL,iBAAe,kBAAkB,KAAA,IAAY;EAC7C,iBAAe;EACf,iBAAe;EACf,cAAY;EACZ,mBAAiB;EACjB,WAAW,wDAAwD;EAEnE,UAAA,oBAAC,OAAD;GACE,WAAW,CACT,qEACA,kBAAkB,+CAA+C,EACnE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;GACX,OAAO,kBAAkB,KAAA,IAAY,EAAE,OAAO,GAAG,QAAQ,GAAG;GAC5D,eAAY;EACb,CAAA;CACE,CAAA;AAET"}
|
package/lib/index34.cjs
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/ui-library/gallery/skeleton/Skeleton.tsx
|
|
3
|
+
function Skeleton({ className = "" }) {
|
|
4
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5
|
+
"aria-hidden": "true",
|
|
6
|
+
className: `animate-pulse rounded-lg bg-slate-200 ${className}`
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function SkeletonText({ lines = 3, className = "" }) {
|
|
10
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11
|
+
className: `space-y-2 ${className}`,
|
|
12
|
+
"aria-hidden": "true",
|
|
13
|
+
children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Skeleton, { className: `h-3.5 ${i === lines - 1 && lines > 1 ? "w-2/3" : "w-full"}` }, i))
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
var AVATAR_SIZE = {
|
|
17
|
+
sm: "h-8 w-8",
|
|
18
|
+
md: "h-10 w-10",
|
|
19
|
+
lg: "h-14 w-14"
|
|
20
|
+
};
|
|
21
|
+
function SkeletonAvatar({ size = "md", className = "" }) {
|
|
22
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
23
|
+
"aria-hidden": "true",
|
|
24
|
+
className: `animate-pulse rounded-full bg-slate-200 shrink-0 ${AVATAR_SIZE[size]} ${className}`
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function SkeletonCard({ className = "", children }) {
|
|
28
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
29
|
+
className: `rounded-2xl border border-slate-100 bg-white p-5 space-y-3 ${className}`,
|
|
30
|
+
"aria-hidden": "true",
|
|
31
|
+
children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-1/3" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SkeletonText, { lines: 2 })] })
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function SkeletonTableRow({ rows = 5, columns = [
|
|
35
|
+
"w-32",
|
|
36
|
+
"w-24",
|
|
37
|
+
"w-20",
|
|
38
|
+
"w-28"
|
|
39
|
+
] }) {
|
|
40
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: Array.from({ length: rows }, (_, r) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", {
|
|
41
|
+
"aria-hidden": "true",
|
|
42
|
+
children: columns.map((width, c) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
|
|
43
|
+
className: "px-5 py-3.5",
|
|
44
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Skeleton, { className: `h-3.5 ${width}` })
|
|
45
|
+
}, c))
|
|
46
|
+
}, r)) });
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
exports.Skeleton = Skeleton;
|
|
50
|
+
exports.SkeletonAvatar = SkeletonAvatar;
|
|
51
|
+
exports.SkeletonCard = SkeletonCard;
|
|
52
|
+
exports.SkeletonTableRow = SkeletonTableRow;
|
|
53
|
+
exports.SkeletonText = SkeletonText;
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=index34.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index34.cjs","names":[],"sources":["../src/ui-library/gallery/skeleton/Skeleton.tsx"],"sourcesContent":["/**\n * Skeleton — Design System Component\n *\n * Animated loading placeholder using Tailwind animate-pulse.\n * Purely presentational — no state, no API calls, no domain logic.\n *\n * Usage:\n * // Generic block\n * <Skeleton className=\"h-4 w-32 rounded-lg\" />\n *\n * // Composed patterns\n * <SkeletonText lines={3} />\n * <SkeletonAvatar />\n * <SkeletonTableRow columns={['w-32', 'w-24', 'w-16']} />\n *\n * Accessibility:\n * Skeleton elements are aria-hidden by default.\n * Surround a loading region with aria-busy={loading} + aria-live=\"polite\"\n * on the parent container when screen-reader announcements are needed.\n */\n\nimport type { ReactNode } from 'react';\n\n// ── Base Skeleton ─────────────────────────────────────────────────────────────\n\nexport interface SkeletonProps {\n className?: string;\n}\n\nexport function Skeleton({ className = '' }: SkeletonProps) {\n return (\n <div\n aria-hidden=\"true\"\n className={`animate-pulse rounded-lg bg-slate-200 ${className}`}\n />\n );\n}\n\n// ── SkeletonText — stacked line skeletons ─────────────────────────────────────\n\nexport interface SkeletonTextProps {\n /** Number of lines to render */\n lines?: number;\n className?: string;\n}\n\nexport function SkeletonText({ lines = 3, className = '' }: SkeletonTextProps) {\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }, (_, i) => (\n <Skeleton\n key={i}\n className={`h-3.5 ${i === lines - 1 && lines > 1 ? 'w-2/3' : 'w-full'}`}\n />\n ))}\n </div>\n );\n}\n\n// ── SkeletonAvatar ────────────────────────────────────────────────────────────\n\nexport interface SkeletonAvatarProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst AVATAR_SIZE: Record<NonNullable<SkeletonAvatarProps['size']>, string> = {\n sm: 'h-8 w-8',\n md: 'h-10 w-10',\n lg: 'h-14 w-14',\n};\n\nexport function SkeletonAvatar({ size = 'md', className = '' }: SkeletonAvatarProps) {\n return (\n <div\n aria-hidden=\"true\"\n className={`animate-pulse rounded-full bg-slate-200 shrink-0 ${AVATAR_SIZE[size]} ${className}`}\n />\n );\n}\n\n// ── SkeletonCard ──────────────────────────────────────────────────────────────\n\nexport interface SkeletonCardProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport function SkeletonCard({ className = '', children }: SkeletonCardProps) {\n return (\n <div\n className={`rounded-2xl border border-slate-100 bg-white p-5 space-y-3 ${className}`}\n aria-hidden=\"true\"\n >\n {children ?? (\n <>\n <Skeleton className=\"h-4 w-1/3\" />\n <SkeletonText lines={2} />\n </>\n )}\n </div>\n );\n}\n\n// ── SkeletonTableRow ──────────────────────────────────────────────────────────\n\nexport interface SkeletonTableRowProps {\n /** Number of rows to render */\n rows?: number;\n /** Tailwind width classes per column (e.g. ['w-32', 'w-24', 'w-16']) */\n columns?: string[];\n}\n\nexport function SkeletonTableRow({ rows = 5, columns = ['w-32', 'w-24', 'w-20', 'w-28'] }: SkeletonTableRowProps) {\n return (\n <>\n {Array.from({ length: rows }, (_, r) => (\n <tr key={r} aria-hidden=\"true\">\n {columns.map((width, c) => (\n <td key={c} className=\"px-5 py-3.5\">\n <Skeleton className={`h-3.5 ${width}`} />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n"],"mappings":";;AA6BA,SAAgB,SAAS,EAAE,YAAY,MAAqB;CAC1D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,eAAY;EACZ,WAAW,yCAAyC;CACrD,CAAA;AAEL;AAUA,SAAgB,aAAa,EAAE,QAAQ,GAAG,YAAY,MAAyB;CAC7E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAW,aAAa;EAAa,eAAY;EACnD,UAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAEE,WAAW,SAAS,MAAM,QAAQ,KAAK,QAAQ,IAAI,UAAU,WAC9D,GAFM,CAEN,CACF;CACE,CAAA;AAET;AASA,IAAM,cAAwE;CAC5E,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,eAAe,EAAE,OAAO,MAAM,YAAY,MAA2B;CACnF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,eAAY;EACZ,WAAW,oDAAoD,YAAY,MAAM,GAAG;CACrF,CAAA;AAEL;AASA,SAAgB,aAAa,EAAE,YAAY,IAAI,YAA+B;CAC5E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAW,8DAA8D;EACzE,eAAY;EAEX,UAAA,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAU,WAAU,YAAa,CAAA,GACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD,EAAc,OAAO,EAAI,CAAA,CACzB,EAAA,CAAA;CAED,CAAA;AAET;AAWA,SAAgB,iBAAiB,EAAE,OAAO,GAAG,UAAU;CAAC;CAAQ;CAAQ;CAAQ;AAAM,KAA4B;CAChH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,EAAA,UACG,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;EAAY,eAAY;EACrB,UAAA,QAAQ,KAAK,OAAO,MACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;GAAY,WAAU;GACpB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAU,WAAW,SAAS,QAAU,CAAA;EACtC,GAFK,CAEL,CACL;CACC,GANK,CAML,CACL,EACD,CAAA;AAEN"}
|
package/lib/index34.mjs
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
//#region src/ui-library/gallery/skeleton/Skeleton.tsx
|
|
3
|
+
function Skeleton({ className = "" }) {
|
|
4
|
+
return /* @__PURE__ */ jsx("div", {
|
|
5
|
+
"aria-hidden": "true",
|
|
6
|
+
className: `animate-pulse rounded-lg bg-slate-200 ${className}`
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function SkeletonText({ lines = 3, className = "" }) {
|
|
10
|
+
return /* @__PURE__ */ jsx("div", {
|
|
11
|
+
className: `space-y-2 ${className}`,
|
|
12
|
+
"aria-hidden": "true",
|
|
13
|
+
children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { className: `h-3.5 ${i === lines - 1 && lines > 1 ? "w-2/3" : "w-full"}` }, i))
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
var AVATAR_SIZE = {
|
|
17
|
+
sm: "h-8 w-8",
|
|
18
|
+
md: "h-10 w-10",
|
|
19
|
+
lg: "h-14 w-14"
|
|
20
|
+
};
|
|
21
|
+
function SkeletonAvatar({ size = "md", className = "" }) {
|
|
22
|
+
return /* @__PURE__ */ jsx("div", {
|
|
23
|
+
"aria-hidden": "true",
|
|
24
|
+
className: `animate-pulse rounded-full bg-slate-200 shrink-0 ${AVATAR_SIZE[size]} ${className}`
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function SkeletonCard({ className = "", children }) {
|
|
28
|
+
return /* @__PURE__ */ jsx("div", {
|
|
29
|
+
className: `rounded-2xl border border-slate-100 bg-white p-5 space-y-3 ${className}`,
|
|
30
|
+
"aria-hidden": "true",
|
|
31
|
+
children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-1/3" }), /* @__PURE__ */ jsx(SkeletonText, { lines: 2 })] })
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function SkeletonTableRow({ rows = 5, columns = [
|
|
35
|
+
"w-32",
|
|
36
|
+
"w-24",
|
|
37
|
+
"w-20",
|
|
38
|
+
"w-28"
|
|
39
|
+
] }) {
|
|
40
|
+
return /* @__PURE__ */ jsx(Fragment, { children: Array.from({ length: rows }, (_, r) => /* @__PURE__ */ jsx("tr", {
|
|
41
|
+
"aria-hidden": "true",
|
|
42
|
+
children: columns.map((width, c) => /* @__PURE__ */ jsx("td", {
|
|
43
|
+
className: "px-5 py-3.5",
|
|
44
|
+
children: /* @__PURE__ */ jsx(Skeleton, { className: `h-3.5 ${width}` })
|
|
45
|
+
}, c))
|
|
46
|
+
}, r)) });
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { Skeleton, SkeletonAvatar, SkeletonCard, SkeletonTableRow, SkeletonText };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=index34.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index34.mjs","names":[],"sources":["../src/ui-library/gallery/skeleton/Skeleton.tsx"],"sourcesContent":["/**\n * Skeleton — Design System Component\n *\n * Animated loading placeholder using Tailwind animate-pulse.\n * Purely presentational — no state, no API calls, no domain logic.\n *\n * Usage:\n * // Generic block\n * <Skeleton className=\"h-4 w-32 rounded-lg\" />\n *\n * // Composed patterns\n * <SkeletonText lines={3} />\n * <SkeletonAvatar />\n * <SkeletonTableRow columns={['w-32', 'w-24', 'w-16']} />\n *\n * Accessibility:\n * Skeleton elements are aria-hidden by default.\n * Surround a loading region with aria-busy={loading} + aria-live=\"polite\"\n * on the parent container when screen-reader announcements are needed.\n */\n\nimport type { ReactNode } from 'react';\n\n// ── Base Skeleton ─────────────────────────────────────────────────────────────\n\nexport interface SkeletonProps {\n className?: string;\n}\n\nexport function Skeleton({ className = '' }: SkeletonProps) {\n return (\n <div\n aria-hidden=\"true\"\n className={`animate-pulse rounded-lg bg-slate-200 ${className}`}\n />\n );\n}\n\n// ── SkeletonText — stacked line skeletons ─────────────────────────────────────\n\nexport interface SkeletonTextProps {\n /** Number of lines to render */\n lines?: number;\n className?: string;\n}\n\nexport function SkeletonText({ lines = 3, className = '' }: SkeletonTextProps) {\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }, (_, i) => (\n <Skeleton\n key={i}\n className={`h-3.5 ${i === lines - 1 && lines > 1 ? 'w-2/3' : 'w-full'}`}\n />\n ))}\n </div>\n );\n}\n\n// ── SkeletonAvatar ────────────────────────────────────────────────────────────\n\nexport interface SkeletonAvatarProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst AVATAR_SIZE: Record<NonNullable<SkeletonAvatarProps['size']>, string> = {\n sm: 'h-8 w-8',\n md: 'h-10 w-10',\n lg: 'h-14 w-14',\n};\n\nexport function SkeletonAvatar({ size = 'md', className = '' }: SkeletonAvatarProps) {\n return (\n <div\n aria-hidden=\"true\"\n className={`animate-pulse rounded-full bg-slate-200 shrink-0 ${AVATAR_SIZE[size]} ${className}`}\n />\n );\n}\n\n// ── SkeletonCard ──────────────────────────────────────────────────────────────\n\nexport interface SkeletonCardProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport function SkeletonCard({ className = '', children }: SkeletonCardProps) {\n return (\n <div\n className={`rounded-2xl border border-slate-100 bg-white p-5 space-y-3 ${className}`}\n aria-hidden=\"true\"\n >\n {children ?? (\n <>\n <Skeleton className=\"h-4 w-1/3\" />\n <SkeletonText lines={2} />\n </>\n )}\n </div>\n );\n}\n\n// ── SkeletonTableRow ──────────────────────────────────────────────────────────\n\nexport interface SkeletonTableRowProps {\n /** Number of rows to render */\n rows?: number;\n /** Tailwind width classes per column (e.g. ['w-32', 'w-24', 'w-16']) */\n columns?: string[];\n}\n\nexport function SkeletonTableRow({ rows = 5, columns = ['w-32', 'w-24', 'w-20', 'w-28'] }: SkeletonTableRowProps) {\n return (\n <>\n {Array.from({ length: rows }, (_, r) => (\n <tr key={r} aria-hidden=\"true\">\n {columns.map((width, c) => (\n <td key={c} className=\"px-5 py-3.5\">\n <Skeleton className={`h-3.5 ${width}`} />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n"],"mappings":";;AA6BA,SAAgB,SAAS,EAAE,YAAY,MAAqB;CAC1D,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,WAAW,yCAAyC;CACrD,CAAA;AAEL;AAUA,SAAgB,aAAa,EAAE,QAAQ,GAAG,YAAY,MAAyB;CAC7E,OACE,oBAAC,OAAD;EAAK,WAAW,aAAa;EAAa,eAAY;EACnD,UAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MACjC,oBAAC,UAAD,EAEE,WAAW,SAAS,MAAM,QAAQ,KAAK,QAAQ,IAAI,UAAU,WAC9D,GAFM,CAEN,CACF;CACE,CAAA;AAET;AASA,IAAM,cAAwE;CAC5E,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,eAAe,EAAE,OAAO,MAAM,YAAY,MAA2B;CACnF,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,WAAW,oDAAoD,YAAY,MAAM,GAAG;CACrF,CAAA;AAEL;AASA,SAAgB,aAAa,EAAE,YAAY,IAAI,YAA+B;CAC5E,OACE,oBAAC,OAAD;EACE,WAAW,8DAA8D;EACzE,eAAY;EAEX,UAAA,YACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,GACjC,oBAAC,cAAD,EAAc,OAAO,EAAI,CAAA,CACzB,EAAA,CAAA;CAED,CAAA;AAET;AAWA,SAAgB,iBAAiB,EAAE,OAAO,GAAG,UAAU;CAAC;CAAQ;CAAQ;CAAQ;AAAM,KAA4B;CAChH,OACE,oBAAA,UAAA,EAAA,UACG,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,oBAAC,MAAD;EAAY,eAAY;EACrB,UAAA,QAAQ,KAAK,OAAO,MACnB,oBAAC,MAAD;GAAY,WAAU;GACpB,UAAA,oBAAC,UAAD,EAAU,WAAW,SAAS,QAAU,CAAA;EACtC,GAFK,CAEL,CACL;CACC,GANK,CAML,CACL,EACD,CAAA;AAEN"}
|
package/lib/index35.cjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/ui-library/gallery/status-badge/StatusBadge.tsx
|
|
3
|
+
var TONE_STYLES = {
|
|
4
|
+
neutral: "border-slate-200 bg-slate-50 text-slate-600",
|
|
5
|
+
success: "border-emerald-100 bg-emerald-50 text-emerald-700",
|
|
6
|
+
warning: "border-amber-200 bg-amber-50 text-amber-700",
|
|
7
|
+
error: "border-rose-100 bg-rose-50 text-rose-700",
|
|
8
|
+
info: "border-sky-100 bg-sky-50 text-sky-700",
|
|
9
|
+
primary: "border-brand-blue/20 bg-blue-50 text-brand-blue"
|
|
10
|
+
};
|
|
11
|
+
function StatusBadge({ tone = "neutral", children, className = "" }) {
|
|
12
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
13
|
+
className: [
|
|
14
|
+
"inline-flex items-center rounded-lg border px-2.5 py-1",
|
|
15
|
+
"text-[10px] font-bold uppercase tracking-wider",
|
|
16
|
+
TONE_STYLES[tone],
|
|
17
|
+
className
|
|
18
|
+
].filter(Boolean).join(" "),
|
|
19
|
+
children
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.StatusBadge = StatusBadge;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=index35.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index35.cjs","names":[],"sources":["../src/ui-library/gallery/status-badge/StatusBadge.tsx"],"sourcesContent":["/**\n * StatusBadge — Design System Component\n *\n * A small pill-shaped indicator for entity lifecycle or state status.\n * Purely presentational — the tone determines the visual; the label\n * is owned entirely by the consuming feature.\n *\n * Accessibility:\n * - Rendered as a <span> (inline element, not interactive).\n * - Screen readers read the visible text. No additional ARIA needed\n * because the label itself conveys the status.\n * - Do not rely solely on color. The label text must be present.\n *\n * Usage:\n * <StatusBadge tone=\"success\">Active</StatusBadge>\n * <StatusBadge tone=\"warning\">Pending</StatusBadge>\n * <StatusBadge tone=\"neutral\">Inactive</StatusBadge>\n *\n * The consuming feature maps its domain values to tones:\n * const TONE_MAP: Record<MyStatus, StatusBadgeTone> = {\n * active: 'success',\n * inactive: 'neutral',\n * draft: 'warning',\n * archived: 'neutral',\n * };\n * <StatusBadge tone={TONE_MAP[employee.status]}>{employee.status}</StatusBadge>\n */\n\nimport type { ReactNode } from 'react';\n\nexport type StatusBadgeTone =\n | 'neutral' // grey — inactive, archived, default\n | 'success' // green — active, published, complete\n | 'warning' // amber — pending, draft, attention\n | 'error' // rose — failed, rejected, suspended\n | 'info' // blue — in-progress, processing\n | 'primary'; // indigo — special/highlighted state\n\nexport interface StatusBadgeProps {\n tone?: StatusBadgeTone;\n children: ReactNode;\n className?: string;\n}\n\nconst TONE_STYLES: Record<StatusBadgeTone, string> = {\n neutral: 'border-slate-200 bg-slate-50 text-slate-600',\n success: 'border-emerald-100 bg-emerald-50 text-emerald-700',\n warning: 'border-amber-200 bg-amber-50 text-amber-700',\n error: 'border-rose-100 bg-rose-50 text-rose-700',\n info: 'border-sky-100 bg-sky-50 text-sky-700',\n primary: 'border-brand-blue/20 bg-blue-50 text-brand-blue',\n};\n\nexport function StatusBadge({ tone = 'neutral', children, className = '' }: StatusBadgeProps) {\n return (\n <span\n className={[\n 'inline-flex items-center rounded-lg border px-2.5 py-1',\n 'text-[10px] font-bold uppercase tracking-wider',\n TONE_STYLES[tone],\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </span>\n );\n}\n"],"mappings":";;AA4CA,IAAM,cAA+C;CACnD,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAS;CACT,MAAS;CACT,SAAS;AACX;AAEA,SAAgB,YAAY,EAAE,OAAO,WAAW,UAAU,YAAY,MAAwB;CAC5F,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EACE,WAAW;GACT;GACA;GACA,YAAY;GACZ;EACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EAEV;CACG,CAAA;AAEV"}
|
package/lib/index35.mjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/ui-library/gallery/status-badge/StatusBadge.tsx
|
|
3
|
+
var TONE_STYLES = {
|
|
4
|
+
neutral: "border-slate-200 bg-slate-50 text-slate-600",
|
|
5
|
+
success: "border-emerald-100 bg-emerald-50 text-emerald-700",
|
|
6
|
+
warning: "border-amber-200 bg-amber-50 text-amber-700",
|
|
7
|
+
error: "border-rose-100 bg-rose-50 text-rose-700",
|
|
8
|
+
info: "border-sky-100 bg-sky-50 text-sky-700",
|
|
9
|
+
primary: "border-brand-blue/20 bg-blue-50 text-brand-blue"
|
|
10
|
+
};
|
|
11
|
+
function StatusBadge({ tone = "neutral", children, className = "" }) {
|
|
12
|
+
return /* @__PURE__ */ jsx("span", {
|
|
13
|
+
className: [
|
|
14
|
+
"inline-flex items-center rounded-lg border px-2.5 py-1",
|
|
15
|
+
"text-[10px] font-bold uppercase tracking-wider",
|
|
16
|
+
TONE_STYLES[tone],
|
|
17
|
+
className
|
|
18
|
+
].filter(Boolean).join(" "),
|
|
19
|
+
children
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { StatusBadge };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=index35.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index35.mjs","names":[],"sources":["../src/ui-library/gallery/status-badge/StatusBadge.tsx"],"sourcesContent":["/**\n * StatusBadge — Design System Component\n *\n * A small pill-shaped indicator for entity lifecycle or state status.\n * Purely presentational — the tone determines the visual; the label\n * is owned entirely by the consuming feature.\n *\n * Accessibility:\n * - Rendered as a <span> (inline element, not interactive).\n * - Screen readers read the visible text. No additional ARIA needed\n * because the label itself conveys the status.\n * - Do not rely solely on color. The label text must be present.\n *\n * Usage:\n * <StatusBadge tone=\"success\">Active</StatusBadge>\n * <StatusBadge tone=\"warning\">Pending</StatusBadge>\n * <StatusBadge tone=\"neutral\">Inactive</StatusBadge>\n *\n * The consuming feature maps its domain values to tones:\n * const TONE_MAP: Record<MyStatus, StatusBadgeTone> = {\n * active: 'success',\n * inactive: 'neutral',\n * draft: 'warning',\n * archived: 'neutral',\n * };\n * <StatusBadge tone={TONE_MAP[employee.status]}>{employee.status}</StatusBadge>\n */\n\nimport type { ReactNode } from 'react';\n\nexport type StatusBadgeTone =\n | 'neutral' // grey — inactive, archived, default\n | 'success' // green — active, published, complete\n | 'warning' // amber — pending, draft, attention\n | 'error' // rose — failed, rejected, suspended\n | 'info' // blue — in-progress, processing\n | 'primary'; // indigo — special/highlighted state\n\nexport interface StatusBadgeProps {\n tone?: StatusBadgeTone;\n children: ReactNode;\n className?: string;\n}\n\nconst TONE_STYLES: Record<StatusBadgeTone, string> = {\n neutral: 'border-slate-200 bg-slate-50 text-slate-600',\n success: 'border-emerald-100 bg-emerald-50 text-emerald-700',\n warning: 'border-amber-200 bg-amber-50 text-amber-700',\n error: 'border-rose-100 bg-rose-50 text-rose-700',\n info: 'border-sky-100 bg-sky-50 text-sky-700',\n primary: 'border-brand-blue/20 bg-blue-50 text-brand-blue',\n};\n\nexport function StatusBadge({ tone = 'neutral', children, className = '' }: StatusBadgeProps) {\n return (\n <span\n className={[\n 'inline-flex items-center rounded-lg border px-2.5 py-1',\n 'text-[10px] font-bold uppercase tracking-wider',\n TONE_STYLES[tone],\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </span>\n );\n}\n"],"mappings":";;AA4CA,IAAM,cAA+C;CACnD,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAS;CACT,MAAS;CACT,SAAS;AACX;AAEA,SAAgB,YAAY,EAAE,OAAO,WAAW,UAAU,YAAY,MAAwB;CAC5F,OACE,oBAAC,QAAD;EACE,WAAW;GACT;GACA;GACA,YAAY;GACZ;EACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EAEV;CACG,CAAA;AAEV"}
|