@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.
Files changed (272) hide show
  1. package/README.md +75 -0
  2. package/lib/assets/ui.css +154 -0
  3. package/lib/index.cjs +183 -0
  4. package/lib/index.mjs +65 -0
  5. package/lib/index10.cjs +33 -0
  6. package/lib/index10.cjs.map +1 -0
  7. package/lib/index10.mjs +33 -0
  8. package/lib/index10.mjs.map +1 -0
  9. package/lib/index11.cjs +16 -0
  10. package/lib/index11.cjs.map +1 -0
  11. package/lib/index11.mjs +16 -0
  12. package/lib/index11.mjs.map +1 -0
  13. package/lib/index12.cjs +16 -0
  14. package/lib/index12.cjs.map +1 -0
  15. package/lib/index12.mjs +15 -0
  16. package/lib/index12.mjs.map +1 -0
  17. package/lib/index13.cjs +57 -0
  18. package/lib/index13.cjs.map +1 -0
  19. package/lib/index13.mjs +57 -0
  20. package/lib/index13.mjs.map +1 -0
  21. package/lib/index14.cjs +10 -0
  22. package/lib/index14.cjs.map +1 -0
  23. package/lib/index14.mjs +10 -0
  24. package/lib/index14.mjs.map +1 -0
  25. package/lib/index15.cjs +30 -0
  26. package/lib/index15.cjs.map +1 -0
  27. package/lib/index15.mjs +30 -0
  28. package/lib/index15.mjs.map +1 -0
  29. package/lib/index16.cjs +28 -0
  30. package/lib/index16.cjs.map +1 -0
  31. package/lib/index16.mjs +26 -0
  32. package/lib/index16.mjs.map +1 -0
  33. package/lib/index17.cjs +43 -0
  34. package/lib/index17.cjs.map +1 -0
  35. package/lib/index17.mjs +43 -0
  36. package/lib/index17.mjs.map +1 -0
  37. package/lib/index18.cjs +59 -0
  38. package/lib/index18.cjs.map +1 -0
  39. package/lib/index18.mjs +59 -0
  40. package/lib/index18.mjs.map +1 -0
  41. package/lib/index19.cjs +67 -0
  42. package/lib/index19.cjs.map +1 -0
  43. package/lib/index19.mjs +67 -0
  44. package/lib/index19.mjs.map +1 -0
  45. package/lib/index2.cjs +33 -0
  46. package/lib/index2.mjs +13 -0
  47. package/lib/index20.cjs +79 -0
  48. package/lib/index20.cjs.map +1 -0
  49. package/lib/index20.mjs +79 -0
  50. package/lib/index20.mjs.map +1 -0
  51. package/lib/index21.cjs +105 -0
  52. package/lib/index21.cjs.map +1 -0
  53. package/lib/index21.mjs +104 -0
  54. package/lib/index21.mjs.map +1 -0
  55. package/lib/index22.cjs +50 -0
  56. package/lib/index22.cjs.map +1 -0
  57. package/lib/index22.mjs +50 -0
  58. package/lib/index22.mjs.map +1 -0
  59. package/lib/index23.cjs +143 -0
  60. package/lib/index23.cjs.map +1 -0
  61. package/lib/index23.mjs +143 -0
  62. package/lib/index23.mjs.map +1 -0
  63. package/lib/index25.cjs +177 -0
  64. package/lib/index25.cjs.map +1 -0
  65. package/lib/index25.mjs +175 -0
  66. package/lib/index25.mjs.map +1 -0
  67. package/lib/index26.cjs +108 -0
  68. package/lib/index26.cjs.map +1 -0
  69. package/lib/index26.mjs +108 -0
  70. package/lib/index26.mjs.map +1 -0
  71. package/lib/index27.cjs +120 -0
  72. package/lib/index27.cjs.map +1 -0
  73. package/lib/index27.mjs +120 -0
  74. package/lib/index27.mjs.map +1 -0
  75. package/lib/index28.cjs +54 -0
  76. package/lib/index28.cjs.map +1 -0
  77. package/lib/index28.mjs +54 -0
  78. package/lib/index28.mjs.map +1 -0
  79. package/lib/index29.cjs +100 -0
  80. package/lib/index29.cjs.map +1 -0
  81. package/lib/index29.mjs +100 -0
  82. package/lib/index29.mjs.map +1 -0
  83. package/lib/index3.cjs +38 -0
  84. package/lib/index3.cjs.map +1 -0
  85. package/lib/index3.mjs +38 -0
  86. package/lib/index3.mjs.map +1 -0
  87. package/lib/index30.cjs +27 -0
  88. package/lib/index30.cjs.map +1 -0
  89. package/lib/index30.mjs +27 -0
  90. package/lib/index30.mjs.map +1 -0
  91. package/lib/index31.cjs +72 -0
  92. package/lib/index31.cjs.map +1 -0
  93. package/lib/index31.mjs +72 -0
  94. package/lib/index31.mjs.map +1 -0
  95. package/lib/index32.cjs +19 -0
  96. package/lib/index32.cjs.map +1 -0
  97. package/lib/index32.mjs +19 -0
  98. package/lib/index32.mjs.map +1 -0
  99. package/lib/index33.cjs +25 -0
  100. package/lib/index33.cjs.map +1 -0
  101. package/lib/index33.mjs +25 -0
  102. package/lib/index33.mjs.map +1 -0
  103. package/lib/index34.cjs +55 -0
  104. package/lib/index34.cjs.map +1 -0
  105. package/lib/index34.mjs +51 -0
  106. package/lib/index34.mjs.map +1 -0
  107. package/lib/index35.cjs +25 -0
  108. package/lib/index35.cjs.map +1 -0
  109. package/lib/index35.mjs +25 -0
  110. package/lib/index35.mjs.map +1 -0
  111. package/lib/index36.cjs +54 -0
  112. package/lib/index36.cjs.map +1 -0
  113. package/lib/index36.mjs +49 -0
  114. package/lib/index36.mjs.map +1 -0
  115. package/lib/index37.cjs +130 -0
  116. package/lib/index37.cjs.map +1 -0
  117. package/lib/index37.mjs +128 -0
  118. package/lib/index37.mjs.map +1 -0
  119. package/lib/index38.cjs +106 -0
  120. package/lib/index38.cjs.map +1 -0
  121. package/lib/index38.mjs +102 -0
  122. package/lib/index38.mjs.map +1 -0
  123. package/lib/index39.cjs +137 -0
  124. package/lib/index39.cjs.map +1 -0
  125. package/lib/index39.mjs +137 -0
  126. package/lib/index39.mjs.map +1 -0
  127. package/lib/index4.cjs +24 -0
  128. package/lib/index4.cjs.map +1 -0
  129. package/lib/index4.mjs +24 -0
  130. package/lib/index4.mjs.map +1 -0
  131. package/lib/index40.cjs +130 -0
  132. package/lib/index40.cjs.map +1 -0
  133. package/lib/index40.mjs +126 -0
  134. package/lib/index40.mjs.map +1 -0
  135. package/lib/index41.cjs +60 -0
  136. package/lib/index41.cjs.map +1 -0
  137. package/lib/index41.mjs +58 -0
  138. package/lib/index41.mjs.map +1 -0
  139. package/lib/index42.cjs +105 -0
  140. package/lib/index42.cjs.map +1 -0
  141. package/lib/index42.mjs +105 -0
  142. package/lib/index42.mjs.map +1 -0
  143. package/lib/index43.cjs +47 -0
  144. package/lib/index43.cjs.map +1 -0
  145. package/lib/index43.mjs +42 -0
  146. package/lib/index43.mjs.map +1 -0
  147. package/lib/index44.cjs +40 -0
  148. package/lib/index44.cjs.map +1 -0
  149. package/lib/index44.mjs +35 -0
  150. package/lib/index44.mjs.map +1 -0
  151. package/lib/index45.cjs +91 -0
  152. package/lib/index45.cjs.map +1 -0
  153. package/lib/index45.mjs +91 -0
  154. package/lib/index45.mjs.map +1 -0
  155. package/lib/index46.cjs +180 -0
  156. package/lib/index46.cjs.map +1 -0
  157. package/lib/index46.mjs +180 -0
  158. package/lib/index46.mjs.map +1 -0
  159. package/lib/index47.cjs +61 -0
  160. package/lib/index47.cjs.map +1 -0
  161. package/lib/index47.mjs +61 -0
  162. package/lib/index47.mjs.map +1 -0
  163. package/lib/index48.cjs +165 -0
  164. package/lib/index48.cjs.map +1 -0
  165. package/lib/index48.mjs +161 -0
  166. package/lib/index48.mjs.map +1 -0
  167. package/lib/index49.cjs +83 -0
  168. package/lib/index49.cjs.map +1 -0
  169. package/lib/index49.mjs +83 -0
  170. package/lib/index49.mjs.map +1 -0
  171. package/lib/index5.cjs +39 -0
  172. package/lib/index5.cjs.map +1 -0
  173. package/lib/index5.mjs +39 -0
  174. package/lib/index5.mjs.map +1 -0
  175. package/lib/index50.cjs +100 -0
  176. package/lib/index50.cjs.map +1 -0
  177. package/lib/index50.mjs +100 -0
  178. package/lib/index50.mjs.map +1 -0
  179. package/lib/index51.cjs +116 -0
  180. package/lib/index51.cjs.map +1 -0
  181. package/lib/index51.mjs +113 -0
  182. package/lib/index51.mjs.map +1 -0
  183. package/lib/index52.cjs +93 -0
  184. package/lib/index52.cjs.map +1 -0
  185. package/lib/index52.mjs +93 -0
  186. package/lib/index52.mjs.map +1 -0
  187. package/lib/index53.cjs +120 -0
  188. package/lib/index53.cjs.map +1 -0
  189. package/lib/index53.mjs +120 -0
  190. package/lib/index53.mjs.map +1 -0
  191. package/lib/index54.cjs +53 -0
  192. package/lib/index54.cjs.map +1 -0
  193. package/lib/index54.mjs +50 -0
  194. package/lib/index54.mjs.map +1 -0
  195. package/lib/index55.cjs +130 -0
  196. package/lib/index55.cjs.map +1 -0
  197. package/lib/index55.mjs +127 -0
  198. package/lib/index55.mjs.map +1 -0
  199. package/lib/index56.cjs +36 -0
  200. package/lib/index56.cjs.map +1 -0
  201. package/lib/index56.mjs +35 -0
  202. package/lib/index56.mjs.map +1 -0
  203. package/lib/index57.cjs +47 -0
  204. package/lib/index57.cjs.map +1 -0
  205. package/lib/index57.mjs +47 -0
  206. package/lib/index57.mjs.map +1 -0
  207. package/lib/index58.cjs +97 -0
  208. package/lib/index58.cjs.map +1 -0
  209. package/lib/index58.mjs +97 -0
  210. package/lib/index58.mjs.map +1 -0
  211. package/lib/index59.cjs +120 -0
  212. package/lib/index59.cjs.map +1 -0
  213. package/lib/index59.mjs +116 -0
  214. package/lib/index59.mjs.map +1 -0
  215. package/lib/index6.cjs +29 -0
  216. package/lib/index6.cjs.map +1 -0
  217. package/lib/index6.mjs +29 -0
  218. package/lib/index6.mjs.map +1 -0
  219. package/lib/index60.cjs +34 -0
  220. package/lib/index60.cjs.map +1 -0
  221. package/lib/index60.mjs +34 -0
  222. package/lib/index60.mjs.map +1 -0
  223. package/lib/index61.cjs +62 -0
  224. package/lib/index61.cjs.map +1 -0
  225. package/lib/index61.mjs +62 -0
  226. package/lib/index61.mjs.map +1 -0
  227. package/lib/index62.cjs +213 -0
  228. package/lib/index62.cjs.map +1 -0
  229. package/lib/index62.mjs +213 -0
  230. package/lib/index62.mjs.map +1 -0
  231. package/lib/index63.cjs +42 -0
  232. package/lib/index63.cjs.map +1 -0
  233. package/lib/index63.mjs +42 -0
  234. package/lib/index63.mjs.map +1 -0
  235. package/lib/index64.cjs +86 -0
  236. package/lib/index64.cjs.map +1 -0
  237. package/lib/index64.mjs +86 -0
  238. package/lib/index64.mjs.map +1 -0
  239. package/lib/index65.cjs +156 -0
  240. package/lib/index65.cjs.map +1 -0
  241. package/lib/index65.mjs +156 -0
  242. package/lib/index65.mjs.map +1 -0
  243. package/lib/index66.cjs +107 -0
  244. package/lib/index66.cjs.map +1 -0
  245. package/lib/index66.mjs +106 -0
  246. package/lib/index66.mjs.map +1 -0
  247. package/lib/index67.cjs +52 -0
  248. package/lib/index67.cjs.map +1 -0
  249. package/lib/index67.mjs +52 -0
  250. package/lib/index67.mjs.map +1 -0
  251. package/lib/index68.cjs +125 -0
  252. package/lib/index68.cjs.map +1 -0
  253. package/lib/index68.mjs +115 -0
  254. package/lib/index68.mjs.map +1 -0
  255. package/lib/index69.cjs +34 -0
  256. package/lib/index69.cjs.map +1 -0
  257. package/lib/index69.mjs +29 -0
  258. package/lib/index69.mjs.map +1 -0
  259. package/lib/index7.cjs +17 -0
  260. package/lib/index7.cjs.map +1 -0
  261. package/lib/index7.mjs +17 -0
  262. package/lib/index7.mjs.map +1 -0
  263. package/lib/index8.cjs +86 -0
  264. package/lib/index8.cjs.map +1 -0
  265. package/lib/index8.mjs +86 -0
  266. package/lib/index8.mjs.map +1 -0
  267. package/lib/index9.cjs +29 -0
  268. package/lib/index9.cjs.map +1 -0
  269. package/lib/index9.mjs +29 -0
  270. package/lib/index9.mjs.map +1 -0
  271. package/lib/types/index.d.ts +1 -0
  272. package/package.json +68 -0
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}
@@ -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"}