@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,42 @@
1
+ import { __exportAll } from "./index2.mjs";
2
+ //#region src/ui-library/tokens/dimension.ts
3
+ var dimension_exports = /* @__PURE__ */ __exportAll({ dimension: () => dimension });
4
+ /**
5
+ * DIWA Dimension Tokens
6
+ *
7
+ * Formalizes repeating dimension values identified in the Phase 9 audit.
8
+ * Values are numeric (pixels) or Tailwind class strings as appropriate.
9
+ *
10
+ * Resolved in Phase 11–12:
11
+ * - Dialog close icon aligned to size={16} (Phase 11).
12
+ * - ConfirmAction icon badge aligned to h-8 w-8 / rounded-lg (Phase 12).
13
+ */
14
+ var dimension = {
15
+ icon: {
16
+ /** Standard close button icon — target 16, currently Dialog uses 18 */
17
+ close: 16,
18
+ /** Icon inside 32×32 header badge */
19
+ badgeSm: 16,
20
+ /** Alert/ConfirmDialog tone icons */
21
+ alert: 20,
22
+ /** Inline small action icons */
23
+ actionSm: 14,
24
+ /** Standard action icons in toolbars, buttons */
25
+ action: 16
26
+ },
27
+ iconBadge: {
28
+ /** Standard 32×32 header icon container — h-8 w-8 */
29
+ size: "h-8 w-8" },
30
+ control: {
31
+ /** Small control height */
32
+ sm: "h-9",
33
+ /** Default control height */
34
+ md: "h-10",
35
+ /** Large control height */
36
+ lg: "h-11"
37
+ }
38
+ };
39
+ //#endregion
40
+ export { dimension, dimension_exports };
41
+
42
+ //# sourceMappingURL=index43.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index43.mjs","names":[],"sources":["../src/ui-library/tokens/dimension.ts"],"sourcesContent":["/**\n * DIWA Dimension Tokens\n *\n * Formalizes repeating dimension values identified in the Phase 9 audit.\n * Values are numeric (pixels) or Tailwind class strings as appropriate.\n *\n * Resolved in Phase 11–12:\n * - Dialog close icon aligned to size={16} (Phase 11).\n * - ConfirmAction icon badge aligned to h-8 w-8 / rounded-lg (Phase 12).\n */\n\nexport const dimension = {\n // ── Icon sizes (lucide-react `size` prop values) ──────────────────────────\n\n icon: {\n /** Standard close button icon — target 16, currently Dialog uses 18 */\n close: 16,\n /** Icon inside 32×32 header badge */\n badgeSm: 16,\n /** Alert/ConfirmDialog tone icons */\n alert: 20,\n /** Inline small action icons */\n actionSm: 14,\n /** Standard action icons in toolbars, buttons */\n action: 16,\n },\n\n // ── Icon badge containers ─────────────────────────────────────────────────\n\n iconBadge: {\n /** Standard 32×32 header icon container — h-8 w-8 */\n size: 'h-8 w-8',\n },\n\n // ── Component heights ─────────────────────────────────────────────────────\n\n control: {\n /** Small control height */\n sm: 'h-9',\n /** Default control height */\n md: 'h-10',\n /** Large control height */\n lg: 'h-11',\n },\n} as const;\n"],"mappings":";;;;;;;;;;;;;AAWA,IAAa,YAAY;CAGvB,MAAM;;EAEJ,OAAa;;EAEb,SAAa;;EAEb,OAAa;;EAEb,UAAa;;EAEb,QAAa;CACf;CAIA,WAAW;;AAET,MAAQ,UACV;CAIA,SAAS;;EAEP,IAAI;;EAEJ,IAAI;;EAEJ,IAAI;CACN;AACF"}
@@ -0,0 +1,40 @@
1
+ //#region src/ui-library/tokens/radius.ts
2
+ var radius_exports = /* @__PURE__ */ require("./index2.cjs").__exportAll({ radius: () => radius });
3
+ /**
4
+ * DIWA Radius Tokens
5
+ *
6
+ * Formalizes the border-radius vocabulary identified in the Phase 9 audit.
7
+ * Values are Tailwind utility class names.
8
+ *
9
+ * Design intent:
10
+ * - panel — full overlay/card surfaces (Modal, Dialog, Card, Drawer)
11
+ * - control — interactive form controls (Button, Input, Select)
12
+ * - pill — purely presentational (Badge pill tones, Spinner track)
13
+ * - badge-status — small status indicators with formal/rectangular feel
14
+ * - icon-badge — 32×32 icon containers in headers
15
+ *
16
+ * Note: rounded-xl previously appeared in legacy ConfirmAction inlined buttons
17
+ * (resolved in Phase 11) and the ConfirmAction icon badge (resolved in Phase 12).
18
+ */
19
+ var radius = {
20
+ /** Overlay and card panel corners — rounded-lg */
21
+ panel: "rounded-lg",
22
+ /** Form controls and action buttons — rounded-md */
23
+ control: "rounded-md",
24
+ /** Pill badges and Spinner track — rounded-full */
25
+ pill: "rounded-full",
26
+ /** Status badge tones (formal/rectangular) — rounded */
27
+ badgeStatus: "rounded",
28
+ /** 32×32 icon badge containers in overlay headers — rounded-lg */
29
+ iconBadge: "rounded-lg"
30
+ };
31
+ //#endregion
32
+ exports.radius = radius;
33
+ Object.defineProperty(exports, "radius_exports", {
34
+ enumerable: true,
35
+ get: function() {
36
+ return radius_exports;
37
+ }
38
+ });
39
+
40
+ //# sourceMappingURL=index44.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index44.cjs","names":[],"sources":["../src/ui-library/tokens/radius.ts"],"sourcesContent":["/**\n * DIWA Radius Tokens\n *\n * Formalizes the border-radius vocabulary identified in the Phase 9 audit.\n * Values are Tailwind utility class names.\n *\n * Design intent:\n * - panel — full overlay/card surfaces (Modal, Dialog, Card, Drawer)\n * - control — interactive form controls (Button, Input, Select)\n * - pill — purely presentational (Badge pill tones, Spinner track)\n * - badge-status — small status indicators with formal/rectangular feel\n * - icon-badge — 32×32 icon containers in headers\n *\n * Note: rounded-xl previously appeared in legacy ConfirmAction inlined buttons\n * (resolved in Phase 11) and the ConfirmAction icon badge (resolved in Phase 12).\n */\n\nexport const radius = {\n /** Overlay and card panel corners — rounded-lg */\n panel: 'rounded-lg',\n /** Form controls and action buttons — rounded-md */\n control: 'rounded-md',\n /** Pill badges and Spinner track — rounded-full */\n pill: 'rounded-full',\n /** Status badge tones (formal/rectangular) — rounded */\n badgeStatus: 'rounded',\n /** 32×32 icon badge containers in overlay headers — rounded-lg */\n iconBadge: 'rounded-lg',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,IAAa,SAAS;;CAEpB,OAAc;;CAEd,SAAc;;CAEd,MAAc;;CAEd,aAAc;;CAEd,WAAc;AAChB"}
@@ -0,0 +1,35 @@
1
+ import { __exportAll } from "./index2.mjs";
2
+ //#region src/ui-library/tokens/radius.ts
3
+ var radius_exports = /* @__PURE__ */ __exportAll({ radius: () => radius });
4
+ /**
5
+ * DIWA Radius Tokens
6
+ *
7
+ * Formalizes the border-radius vocabulary identified in the Phase 9 audit.
8
+ * Values are Tailwind utility class names.
9
+ *
10
+ * Design intent:
11
+ * - panel — full overlay/card surfaces (Modal, Dialog, Card, Drawer)
12
+ * - control — interactive form controls (Button, Input, Select)
13
+ * - pill — purely presentational (Badge pill tones, Spinner track)
14
+ * - badge-status — small status indicators with formal/rectangular feel
15
+ * - icon-badge — 32×32 icon containers in headers
16
+ *
17
+ * Note: rounded-xl previously appeared in legacy ConfirmAction inlined buttons
18
+ * (resolved in Phase 11) and the ConfirmAction icon badge (resolved in Phase 12).
19
+ */
20
+ var radius = {
21
+ /** Overlay and card panel corners — rounded-lg */
22
+ panel: "rounded-lg",
23
+ /** Form controls and action buttons — rounded-md */
24
+ control: "rounded-md",
25
+ /** Pill badges and Spinner track — rounded-full */
26
+ pill: "rounded-full",
27
+ /** Status badge tones (formal/rectangular) — rounded */
28
+ badgeStatus: "rounded",
29
+ /** 32×32 icon badge containers in overlay headers — rounded-lg */
30
+ iconBadge: "rounded-lg"
31
+ };
32
+ //#endregion
33
+ export { radius, radius_exports };
34
+
35
+ //# sourceMappingURL=index44.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index44.mjs","names":[],"sources":["../src/ui-library/tokens/radius.ts"],"sourcesContent":["/**\n * DIWA Radius Tokens\n *\n * Formalizes the border-radius vocabulary identified in the Phase 9 audit.\n * Values are Tailwind utility class names.\n *\n * Design intent:\n * - panel — full overlay/card surfaces (Modal, Dialog, Card, Drawer)\n * - control — interactive form controls (Button, Input, Select)\n * - pill — purely presentational (Badge pill tones, Spinner track)\n * - badge-status — small status indicators with formal/rectangular feel\n * - icon-badge — 32×32 icon containers in headers\n *\n * Note: rounded-xl previously appeared in legacy ConfirmAction inlined buttons\n * (resolved in Phase 11) and the ConfirmAction icon badge (resolved in Phase 12).\n */\n\nexport const radius = {\n /** Overlay and card panel corners — rounded-lg */\n panel: 'rounded-lg',\n /** Form controls and action buttons — rounded-md */\n control: 'rounded-md',\n /** Pill badges and Spinner track — rounded-full */\n pill: 'rounded-full',\n /** Status badge tones (formal/rectangular) — rounded */\n badgeStatus: 'rounded',\n /** 32×32 icon badge containers in overlay headers — rounded-lg */\n iconBadge: 'rounded-lg',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,IAAa,SAAS;;CAEpB,OAAc;;CAEd,SAAc;;CAEd,MAAc;;CAEd,aAAc;;CAEd,WAAc;AAChB"}
@@ -0,0 +1,91 @@
1
+ const require_Button = require("./index3.cjs");
2
+ const require_Modal = require("./index37.cjs");
3
+ const require_dimension = require("./index43.cjs");
4
+ const require_radius = require("./index44.cjs");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ let react = require("react");
7
+ let lucide_react = require("lucide-react");
8
+ //#region src/ui-library/gallery/confirm-action/ConfirmAction.tsx
9
+ /**
10
+ * ConfirmAction — Gallery-native inline confirmation wrapper.
11
+ * Copied from shared/components/ConfirmAction.tsx.
12
+ * Updated to:
13
+ * - Import Modal from gallery-local modal directory
14
+ * - Use gallery Button component (Phase 11 — replaces legacy inlined btn* strings)
15
+ * - Use a simple inline ErrorBanner instead of importing from ui.tsx
16
+ */
17
+ function ErrorBanner({ message }) {
18
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
19
+ className: "rounded-lg border border-rose-100 bg-rose-50 px-4 py-3 text-sm font-medium text-rose-700",
20
+ children: message
21
+ });
22
+ }
23
+ function ConfirmAction({ title, message, label, description, confirmLabel = "Confirm", tone = "danger", disabled = false, onConfirm, children }) {
24
+ const [open, setOpen] = (0, react.useState)(false);
25
+ const [pending, setPending] = (0, react.useState)(false);
26
+ const [error, setError] = (0, react.useState)("");
27
+ const effectiveTitle = title || label || "Confirm";
28
+ const effectiveMessage = message || description || "Are you sure?";
29
+ const run = async () => {
30
+ setPending(true);
31
+ setError("");
32
+ try {
33
+ await onConfirm();
34
+ setOpen(false);
35
+ } catch (failure) {
36
+ setError(failure instanceof Error ? failure.message : "Action failed");
37
+ } finally {
38
+ setPending(false);
39
+ }
40
+ };
41
+ const trigger = typeof children === "function" ? children({
42
+ open: () => {
43
+ if (!disabled) setOpen(true);
44
+ },
45
+ disabled
46
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
47
+ className: "inline-flex",
48
+ onClick: () => {
49
+ if (!disabled) setOpen(true);
50
+ },
51
+ children
52
+ });
53
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [trigger, open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Modal.default, {
54
+ title: effectiveTitle,
55
+ onClose: () => {
56
+ if (!pending) setOpen(false);
57
+ },
58
+ maxWidth: "max-w-md",
59
+ footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
60
+ className: "flex items-center justify-end gap-3",
61
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
62
+ variant: "outline",
63
+ onClick: () => setOpen(false),
64
+ disabled: pending,
65
+ children: "Cancel"
66
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
67
+ variant: tone === "danger" ? "danger" : "primary",
68
+ onClick: () => void run(),
69
+ disabled: pending,
70
+ children: pending ? "Working..." : confirmLabel
71
+ })]
72
+ }),
73
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
74
+ className: "space-y-4",
75
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
76
+ className: "flex items-start gap-3",
77
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
78
+ className: `mt-0.5 flex ${require_dimension.dimension.iconBadge.size} shrink-0 items-center justify-center ${require_radius.radius.iconBadge} ${tone === "danger" ? "bg-rose-50 text-rose-500" : "bg-blue-50 text-brand-blue"}`,
79
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.AlertTriangle, { size: 18 })
80
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
81
+ className: "text-sm font-medium leading-relaxed text-slate-600",
82
+ children: effectiveMessage
83
+ })]
84
+ }), error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ErrorBanner, { message: error })]
85
+ })
86
+ })] });
87
+ }
88
+ //#endregion
89
+ exports.ConfirmAction = ConfirmAction;
90
+
91
+ //# sourceMappingURL=index45.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index45.cjs","names":[],"sources":["../src/ui-library/gallery/confirm-action/ConfirmAction.tsx"],"sourcesContent":["/**\n * ConfirmAction — Gallery-native inline confirmation wrapper.\n * Copied from shared/components/ConfirmAction.tsx.\n * Updated to:\n * - Import Modal from gallery-local modal directory\n * - Use gallery Button component (Phase 11 — replaces legacy inlined btn* strings)\n * - Use a simple inline ErrorBanner instead of importing from ui.tsx\n */\nimport { useState, type ReactNode } from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport Modal from '../modal/Modal';\nimport { Button } from '../button/Button';\nimport { dimension } from '../../tokens/dimension';\nimport { radius } from '../../tokens/radius';\n\nfunction ErrorBanner({ message }: { message: string }) {\n return (\n <div className=\"rounded-lg border border-rose-100 bg-rose-50 px-4 py-3 text-sm font-medium text-rose-700\">\n {message}\n </div>\n );\n}\n\ninterface ConfirmActionRenderProps {\n open: () => void;\n disabled: boolean;\n}\n\ninterface ConfirmActionProps {\n title?: string;\n message?: ReactNode;\n label?: string;\n description?: string;\n confirmLabel?: string;\n tone?: 'danger' | 'primary';\n disabled?: boolean;\n onConfirm: () => Promise<void> | void;\n children: ((props: ConfirmActionRenderProps) => ReactNode) | ReactNode;\n}\n\nexport function ConfirmAction({\n title,\n message,\n label,\n description,\n confirmLabel = 'Confirm',\n tone = 'danger',\n disabled = false,\n onConfirm,\n children,\n}: ConfirmActionProps) {\n const [open, setOpen] = useState(false);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState('');\n\n const effectiveTitle = title || label || 'Confirm';\n const effectiveMessage = message || description || 'Are you sure?';\n\n const run = async () => {\n setPending(true);\n setError('');\n try {\n await onConfirm();\n setOpen(false);\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : 'Action failed');\n } finally {\n setPending(false);\n }\n };\n\n const trigger = typeof children === 'function'\n ? children({ open: () => { if (!disabled) setOpen(true); }, disabled })\n : (\n <span className=\"inline-flex\" onClick={() => { if (!disabled) setOpen(true); }}>\n {children}\n </span>\n );\n\n return (\n <>\n {trigger}\n {open && (\n <Modal\n title={effectiveTitle}\n onClose={() => { if (!pending) setOpen(false); }}\n maxWidth=\"max-w-md\"\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <Button\n variant=\"outline\"\n onClick={() => setOpen(false)}\n disabled={pending}\n >\n Cancel\n </Button>\n <Button\n variant={tone === 'danger' ? 'danger' : 'primary'}\n onClick={() => void run()}\n disabled={pending}\n >\n {pending ? 'Working...' : confirmLabel}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-3\">\n <span className={`mt-0.5 flex ${dimension.iconBadge.size} shrink-0 items-center justify-center ${radius.iconBadge} ${tone === 'danger' ? 'bg-rose-50 text-rose-500' : 'bg-blue-50 text-brand-blue'}`}>\n <AlertTriangle size={18} />\n </span>\n <div className=\"text-sm font-medium leading-relaxed text-slate-600\">{effectiveMessage}</div>\n </div>\n {error && <ErrorBanner message={error} />}\n </div>\n </Modal>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAS,YAAY,EAAE,WAAgC;CACrD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAU;EACZ,UAAA;CACE,CAAA;AAET;AAmBA,SAAgB,cAAc,EAC5B,OACA,SACA,OACA,aACA,eAAe,WACf,OAAO,UACP,WAAW,OACX,WACA,YACqB;CACrB,MAAM,CAAC,MAAM,YAAA,GAAW,MAAA,SAAA,CAAS,KAAK;CACtC,MAAM,CAAC,SAAS,eAAA,GAAc,MAAA,SAAA,CAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,aAAA,GAAY,MAAA,SAAA,CAAS,EAAE;CAErC,MAAM,iBAAiB,SAAS,SAAS;CACzC,MAAM,mBAAmB,WAAW,eAAe;CAEnD,MAAM,MAAM,YAAY;EACtB,WAAW,IAAI;EACf,SAAS,EAAE;EACX,IAAI;GACF,MAAM,UAAU;GAChB,QAAQ,KAAK;EACf,SAAS,SAAS;GAChB,SAAS,mBAAmB,QAAQ,QAAQ,UAAU,eAAe;EACvE,UAAU;GACR,WAAW,KAAK;EAClB;CACF;CAEA,MAAM,UAAU,OAAO,aAAa,aAChC,SAAS;EAAE,YAAY;GAAE,IAAI,CAAC,UAAU,QAAQ,IAAI;EAAG;EAAG;CAAS,CAAC,IAEpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,WAAU;EAAc,eAAe;GAAE,IAAI,CAAC,UAAU,QAAQ,IAAI;EAAG;EAC1E;CACG,CAAA;CAGV,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACG,SACA,QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,SAAD;EACE,OAAO;EACP,eAAe;GAAE,IAAI,CAAC,SAAS,QAAQ,KAAK;EAAG;EAC/C,UAAS;EACT,QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,QAAD;IACE,SAAQ;IACR,eAAe,QAAQ,KAAK;IAC5B,UAAU;IACX,UAAA;GAEO,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,QAAD;IACE,SAAS,SAAS,WAAW,WAAW;IACxC,eAAe,KAAK,IAAI;IACxB,UAAU;IAET,UAAA,UAAU,eAAe;GACpB,CAAA,CACL;;EAGP,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAW,eAAe,kBAAA,UAAU,UAAU,KAAK,wCAAwC,eAAA,OAAO,UAAU,GAAG,SAAS,WAAW,6BAA6B;KACpK,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAA,eAAD,EAAe,MAAM,GAAK,CAAA;IACtB,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KAAsD,UAAA;IAAsB,CAAA,CACxF;GACJ,CAAA,GAAA,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD,EAAa,SAAS,MAAQ,CAAA,CACrC;;CACA,CAAA,CAET,EAAA,CAAA;AAEN"}
@@ -0,0 +1,91 @@
1
+ import { Button } from "./index3.mjs";
2
+ import Modal from "./index37.mjs";
3
+ import { dimension } from "./index43.mjs";
4
+ import { radius } from "./index44.mjs";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { useState } from "react";
7
+ import { AlertTriangle } from "lucide-react";
8
+ //#region src/ui-library/gallery/confirm-action/ConfirmAction.tsx
9
+ /**
10
+ * ConfirmAction — Gallery-native inline confirmation wrapper.
11
+ * Copied from shared/components/ConfirmAction.tsx.
12
+ * Updated to:
13
+ * - Import Modal from gallery-local modal directory
14
+ * - Use gallery Button component (Phase 11 — replaces legacy inlined btn* strings)
15
+ * - Use a simple inline ErrorBanner instead of importing from ui.tsx
16
+ */
17
+ function ErrorBanner({ message }) {
18
+ return /* @__PURE__ */ jsx("div", {
19
+ className: "rounded-lg border border-rose-100 bg-rose-50 px-4 py-3 text-sm font-medium text-rose-700",
20
+ children: message
21
+ });
22
+ }
23
+ function ConfirmAction({ title, message, label, description, confirmLabel = "Confirm", tone = "danger", disabled = false, onConfirm, children }) {
24
+ const [open, setOpen] = useState(false);
25
+ const [pending, setPending] = useState(false);
26
+ const [error, setError] = useState("");
27
+ const effectiveTitle = title || label || "Confirm";
28
+ const effectiveMessage = message || description || "Are you sure?";
29
+ const run = async () => {
30
+ setPending(true);
31
+ setError("");
32
+ try {
33
+ await onConfirm();
34
+ setOpen(false);
35
+ } catch (failure) {
36
+ setError(failure instanceof Error ? failure.message : "Action failed");
37
+ } finally {
38
+ setPending(false);
39
+ }
40
+ };
41
+ const trigger = typeof children === "function" ? children({
42
+ open: () => {
43
+ if (!disabled) setOpen(true);
44
+ },
45
+ disabled
46
+ }) : /* @__PURE__ */ jsx("span", {
47
+ className: "inline-flex",
48
+ onClick: () => {
49
+ if (!disabled) setOpen(true);
50
+ },
51
+ children
52
+ });
53
+ return /* @__PURE__ */ jsxs(Fragment, { children: [trigger, open && /* @__PURE__ */ jsx(Modal, {
54
+ title: effectiveTitle,
55
+ onClose: () => {
56
+ if (!pending) setOpen(false);
57
+ },
58
+ maxWidth: "max-w-md",
59
+ footer: /* @__PURE__ */ jsxs("div", {
60
+ className: "flex items-center justify-end gap-3",
61
+ children: [/* @__PURE__ */ jsx(Button, {
62
+ variant: "outline",
63
+ onClick: () => setOpen(false),
64
+ disabled: pending,
65
+ children: "Cancel"
66
+ }), /* @__PURE__ */ jsx(Button, {
67
+ variant: tone === "danger" ? "danger" : "primary",
68
+ onClick: () => void run(),
69
+ disabled: pending,
70
+ children: pending ? "Working..." : confirmLabel
71
+ })]
72
+ }),
73
+ children: /* @__PURE__ */ jsxs("div", {
74
+ className: "space-y-4",
75
+ children: [/* @__PURE__ */ jsxs("div", {
76
+ className: "flex items-start gap-3",
77
+ children: [/* @__PURE__ */ jsx("span", {
78
+ className: `mt-0.5 flex ${dimension.iconBadge.size} shrink-0 items-center justify-center ${radius.iconBadge} ${tone === "danger" ? "bg-rose-50 text-rose-500" : "bg-blue-50 text-brand-blue"}`,
79
+ children: /* @__PURE__ */ jsx(AlertTriangle, { size: 18 })
80
+ }), /* @__PURE__ */ jsx("div", {
81
+ className: "text-sm font-medium leading-relaxed text-slate-600",
82
+ children: effectiveMessage
83
+ })]
84
+ }), error && /* @__PURE__ */ jsx(ErrorBanner, { message: error })]
85
+ })
86
+ })] });
87
+ }
88
+ //#endregion
89
+ export { ConfirmAction };
90
+
91
+ //# sourceMappingURL=index45.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index45.mjs","names":[],"sources":["../src/ui-library/gallery/confirm-action/ConfirmAction.tsx"],"sourcesContent":["/**\n * ConfirmAction — Gallery-native inline confirmation wrapper.\n * Copied from shared/components/ConfirmAction.tsx.\n * Updated to:\n * - Import Modal from gallery-local modal directory\n * - Use gallery Button component (Phase 11 — replaces legacy inlined btn* strings)\n * - Use a simple inline ErrorBanner instead of importing from ui.tsx\n */\nimport { useState, type ReactNode } from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport Modal from '../modal/Modal';\nimport { Button } from '../button/Button';\nimport { dimension } from '../../tokens/dimension';\nimport { radius } from '../../tokens/radius';\n\nfunction ErrorBanner({ message }: { message: string }) {\n return (\n <div className=\"rounded-lg border border-rose-100 bg-rose-50 px-4 py-3 text-sm font-medium text-rose-700\">\n {message}\n </div>\n );\n}\n\ninterface ConfirmActionRenderProps {\n open: () => void;\n disabled: boolean;\n}\n\ninterface ConfirmActionProps {\n title?: string;\n message?: ReactNode;\n label?: string;\n description?: string;\n confirmLabel?: string;\n tone?: 'danger' | 'primary';\n disabled?: boolean;\n onConfirm: () => Promise<void> | void;\n children: ((props: ConfirmActionRenderProps) => ReactNode) | ReactNode;\n}\n\nexport function ConfirmAction({\n title,\n message,\n label,\n description,\n confirmLabel = 'Confirm',\n tone = 'danger',\n disabled = false,\n onConfirm,\n children,\n}: ConfirmActionProps) {\n const [open, setOpen] = useState(false);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState('');\n\n const effectiveTitle = title || label || 'Confirm';\n const effectiveMessage = message || description || 'Are you sure?';\n\n const run = async () => {\n setPending(true);\n setError('');\n try {\n await onConfirm();\n setOpen(false);\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : 'Action failed');\n } finally {\n setPending(false);\n }\n };\n\n const trigger = typeof children === 'function'\n ? children({ open: () => { if (!disabled) setOpen(true); }, disabled })\n : (\n <span className=\"inline-flex\" onClick={() => { if (!disabled) setOpen(true); }}>\n {children}\n </span>\n );\n\n return (\n <>\n {trigger}\n {open && (\n <Modal\n title={effectiveTitle}\n onClose={() => { if (!pending) setOpen(false); }}\n maxWidth=\"max-w-md\"\n footer={\n <div className=\"flex items-center justify-end gap-3\">\n <Button\n variant=\"outline\"\n onClick={() => setOpen(false)}\n disabled={pending}\n >\n Cancel\n </Button>\n <Button\n variant={tone === 'danger' ? 'danger' : 'primary'}\n onClick={() => void run()}\n disabled={pending}\n >\n {pending ? 'Working...' : confirmLabel}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-3\">\n <span className={`mt-0.5 flex ${dimension.iconBadge.size} shrink-0 items-center justify-center ${radius.iconBadge} ${tone === 'danger' ? 'bg-rose-50 text-rose-500' : 'bg-blue-50 text-brand-blue'}`}>\n <AlertTriangle size={18} />\n </span>\n <div className=\"text-sm font-medium leading-relaxed text-slate-600\">{effectiveMessage}</div>\n </div>\n {error && <ErrorBanner message={error} />}\n </div>\n </Modal>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAS,YAAY,EAAE,WAAgC;CACrD,OACE,oBAAC,OAAD;EAAK,WAAU;EACZ,UAAA;CACE,CAAA;AAET;AAmBA,SAAgB,cAAc,EAC5B,OACA,SACA,OACA,aACA,eAAe,WACf,OAAO,UACP,WAAW,OACX,WACA,YACqB;CACrB,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CAErC,MAAM,iBAAiB,SAAS,SAAS;CACzC,MAAM,mBAAmB,WAAW,eAAe;CAEnD,MAAM,MAAM,YAAY;EACtB,WAAW,IAAI;EACf,SAAS,EAAE;EACX,IAAI;GACF,MAAM,UAAU;GAChB,QAAQ,KAAK;EACf,SAAS,SAAS;GAChB,SAAS,mBAAmB,QAAQ,QAAQ,UAAU,eAAe;EACvE,UAAU;GACR,WAAW,KAAK;EAClB;CACF;CAEA,MAAM,UAAU,OAAO,aAAa,aAChC,SAAS;EAAE,YAAY;GAAE,IAAI,CAAC,UAAU,QAAQ,IAAI;EAAG;EAAG;CAAS,CAAC,IAEpE,oBAAC,QAAD;EAAM,WAAU;EAAc,eAAe;GAAE,IAAI,CAAC,UAAU,QAAQ,IAAI;EAAG;EAC1E;CACG,CAAA;CAGV,OACE,qBAAA,UAAA,EAAA,UAAA,CACG,SACA,QACC,oBAAC,OAAD;EACE,OAAO;EACP,eAAe;GAAE,IAAI,CAAC,SAAS,QAAQ,KAAK;EAAG;EAC/C,UAAS;EACT,QACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,QAAD;IACE,SAAQ;IACR,eAAe,QAAQ,KAAK;IAC5B,UAAU;IACX,UAAA;GAEO,CAAA,GACR,oBAAC,QAAD;IACE,SAAS,SAAS,WAAW,WAAW;IACxC,eAAe,KAAK,IAAI;IACxB,UAAU;IAET,UAAA,UAAU,eAAe;GACpB,CAAA,CACL;;EAGP,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAM,WAAW,eAAe,UAAU,UAAU,KAAK,wCAAwC,OAAO,UAAU,GAAG,SAAS,WAAW,6BAA6B;KACpK,UAAA,oBAAC,eAAD,EAAe,MAAM,GAAK,CAAA;IACtB,CAAA,GACN,oBAAC,OAAD;KAAK,WAAU;KAAsD,UAAA;IAAsB,CAAA,CACxF;GACJ,CAAA,GAAA,SAAS,oBAAC,aAAD,EAAa,SAAS,MAAQ,CAAA,CACrC;;CACA,CAAA,CAET,EAAA,CAAA;AAEN"}
@@ -0,0 +1,180 @@
1
+ let react_jsx_runtime = require("react/jsx-runtime");
2
+ let react = require("react");
3
+ let lucide_react = require("lucide-react");
4
+ let react_dom = require("react-dom");
5
+ //#region src/ui-library/gallery/command-palette/CommandPalette.tsx
6
+ /**
7
+ * CommandPalette — Design System Component
8
+ *
9
+ * A keyboard-driven command launcher overlay. Opens via a trigger
10
+ * (typically Cmd+K / Ctrl+K), shows a search input, and renders
11
+ * grouped command items.
12
+ *
13
+ * Accessibility:
14
+ * - role="dialog" + aria-modal="true" + aria-label
15
+ * - Search input has aria-label and aria-controls pointing to results
16
+ * - Results list uses role="listbox" with role="option" items
17
+ * - aria-selected on the highlighted item
18
+ * - Keyboard: ArrowUp/Down navigates, Enter activates, Escape closes
19
+ *
20
+ * This component is presentation-only: callers provide commands and
21
+ * handle the query / selection logic.
22
+ */
23
+ function CommandPalette({ open, onClose, items, query, onQueryChange, placeholder = "Search commands…", "aria-label": ariaLabel = "Command palette" }) {
24
+ const inputRef = (0, react.useRef)(null);
25
+ const panelRef = (0, react.useRef)(null);
26
+ const listboxId = (0, react.useId)();
27
+ const [activeIndex, setActiveIndex] = (0, react.useState)(0);
28
+ (0, react.useEffect)(() => {
29
+ setActiveIndex(0);
30
+ }, [items]);
31
+ (0, react.useEffect)(() => {
32
+ if (!open) return;
33
+ const prev = document.body.style.overflow;
34
+ document.body.style.overflow = "hidden";
35
+ const timer = window.setTimeout(() => inputRef.current?.focus(), 0);
36
+ return () => {
37
+ clearTimeout(timer);
38
+ document.body.style.overflow = prev;
39
+ };
40
+ }, [open]);
41
+ (0, react.useEffect)(() => {
42
+ if (!open) return;
43
+ const handle = (e) => {
44
+ if (e.key === "Escape") {
45
+ e.preventDefault();
46
+ onClose();
47
+ } else if (e.key === "ArrowDown") {
48
+ e.preventDefault();
49
+ setActiveIndex((i) => Math.min(i + 1, items.length - 1));
50
+ } else if (e.key === "ArrowUp") {
51
+ e.preventDefault();
52
+ setActiveIndex((i) => Math.max(i - 1, 0));
53
+ } else if (e.key === "Enter") {
54
+ e.preventDefault();
55
+ items[activeIndex]?.onSelect();
56
+ onClose();
57
+ }
58
+ };
59
+ document.addEventListener("keydown", handle);
60
+ return () => document.removeEventListener("keydown", handle);
61
+ }, [
62
+ open,
63
+ items,
64
+ activeIndex,
65
+ onClose
66
+ ]);
67
+ if (!open) return null;
68
+ const groups = items.reduce((acc, item) => {
69
+ const g = item.group ?? "";
70
+ if (!acc[g]) acc[g] = [];
71
+ acc[g].push(item);
72
+ return acc;
73
+ }, {});
74
+ const groupEntries = Object.entries(groups);
75
+ return (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
76
+ className: "fixed inset-0 z-50 flex items-start justify-center pt-[10vh] px-4",
77
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
78
+ className: "absolute inset-0 bg-slate-900/50 backdrop-blur-sm",
79
+ "aria-hidden": "true",
80
+ onClick: onClose
81
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
82
+ ref: panelRef,
83
+ role: "dialog",
84
+ "aria-modal": "true",
85
+ "aria-label": ariaLabel,
86
+ className: "relative z-10 w-full max-w-lg rounded-2xl border border-slate-200 bg-white shadow-2xl overflow-hidden",
87
+ children: [
88
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
89
+ className: "flex items-center gap-3 px-4 py-3 border-b border-slate-100",
90
+ children: [
91
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Search, {
92
+ size: 16,
93
+ className: "shrink-0 text-slate-400",
94
+ "aria-hidden": "true"
95
+ }),
96
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
97
+ ref: inputRef,
98
+ type: "text",
99
+ role: "combobox",
100
+ "aria-expanded": items.length > 0,
101
+ "aria-controls": listboxId,
102
+ "aria-autocomplete": "list",
103
+ "aria-label": "Search commands",
104
+ value: query,
105
+ onChange: (e) => onQueryChange(e.target.value),
106
+ placeholder,
107
+ className: "flex-1 bg-transparent text-sm font-medium text-slate-900 outline-none placeholder:text-slate-400"
108
+ }),
109
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("kbd", {
110
+ className: "hidden shrink-0 rounded border border-slate-200 px-1.5 py-0.5 text-[10px] font-bold text-slate-400 sm:block",
111
+ children: "ESC"
112
+ })
113
+ ]
114
+ }),
115
+ items.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
116
+ id: listboxId,
117
+ role: "listbox",
118
+ "aria-label": "Commands",
119
+ className: "max-h-72 overflow-y-auto py-1",
120
+ children: groupEntries.map(([group, groupItems]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [group && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
121
+ className: "px-4 py-1.5 text-[10px] font-bold uppercase tracking-widest text-slate-400",
122
+ children: group
123
+ }), groupItems.map((item) => {
124
+ const globalIdx = items.indexOf(item);
125
+ const isActive = globalIdx === activeIndex;
126
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
127
+ role: "option",
128
+ "aria-selected": isActive,
129
+ onClick: () => {
130
+ item.onSelect();
131
+ onClose();
132
+ },
133
+ onMouseEnter: () => setActiveIndex(globalIdx),
134
+ className: `flex cursor-pointer items-center gap-3 px-4 py-2.5 transition ${isActive ? "bg-blue-50" : "hover:bg-slate-50"}`,
135
+ children: [
136
+ item.icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
137
+ className: `shrink-0 ${isActive ? "text-brand-blue" : "text-slate-400"}`,
138
+ "aria-hidden": "true",
139
+ children: item.icon
140
+ }),
141
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
142
+ className: "min-w-0 flex-1",
143
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
144
+ className: `text-sm font-semibold ${isActive ? "text-brand-blue" : "text-slate-700"}`,
145
+ children: item.label
146
+ }), item.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
147
+ className: "text-xs font-medium text-slate-400",
148
+ children: item.description
149
+ })]
150
+ }),
151
+ isActive && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("kbd", {
152
+ className: "shrink-0 rounded border border-brand-blue/25 bg-blue-50 px-1.5 py-0.5 text-[10px] font-bold text-brand-blue",
153
+ children: "↵"
154
+ })
155
+ ]
156
+ }, item.id);
157
+ })] }, group))
158
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
159
+ className: "px-4 py-8 text-center text-sm font-medium text-slate-400",
160
+ children: query ? `No results for "${query}"` : "Type to search commands"
161
+ }),
162
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
163
+ className: "flex items-center gap-3 border-t border-slate-100 px-4 py-2",
164
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Command, {
165
+ size: 11,
166
+ className: "text-slate-300",
167
+ "aria-hidden": "true"
168
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
169
+ className: "text-[10px] font-medium text-slate-400",
170
+ children: "↑↓ navigate · ↵ select · Esc close"
171
+ })]
172
+ })
173
+ ]
174
+ })]
175
+ }), document.body);
176
+ }
177
+ //#endregion
178
+ exports.CommandPalette = CommandPalette;
179
+
180
+ //# sourceMappingURL=index46.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index46.cjs","names":[],"sources":["../src/ui-library/gallery/command-palette/CommandPalette.tsx"],"sourcesContent":["/**\n * CommandPalette — Design System Component\n *\n * A keyboard-driven command launcher overlay. Opens via a trigger\n * (typically Cmd+K / Ctrl+K), shows a search input, and renders\n * grouped command items.\n *\n * Accessibility:\n * - role=\"dialog\" + aria-modal=\"true\" + aria-label\n * - Search input has aria-label and aria-controls pointing to results\n * - Results list uses role=\"listbox\" with role=\"option\" items\n * - aria-selected on the highlighted item\n * - Keyboard: ArrowUp/Down navigates, Enter activates, Escape closes\n *\n * This component is presentation-only: callers provide commands and\n * handle the query / selection logic.\n */\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Search, Command } from 'lucide-react';\n\nexport interface CommandItem {\n id: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n group?: string;\n onSelect: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose: () => void;\n /** All available commands — consumer filters by query. */\n items: CommandItem[];\n /** Current search query. */\n query: string;\n /** Called when search query changes. */\n onQueryChange: (q: string) => void;\n /** Placeholder in the search input. Default: \"Search commands…\" */\n placeholder?: string;\n /** aria-label for the dialog. Default: \"Command palette\" */\n 'aria-label'?: string;\n}\n\nexport function CommandPalette({\n open,\n onClose,\n items,\n query,\n onQueryChange,\n placeholder = 'Search commands\\u2026',\n 'aria-label': ariaLabel = 'Command palette',\n}: CommandPaletteProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n const [activeIndex, setActiveIndex] = useState(0);\n\n // Reset active index when items change\n // eslint-disable-next-line react-hooks/set-state-in-effect\n useEffect(() => { setActiveIndex(0); }, [items]);\n\n // Scroll lock + initial focus\n useEffect(() => {\n if (!open) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n const timer = window.setTimeout(() => inputRef.current?.focus(), 0);\n return () => {\n clearTimeout(timer);\n document.body.style.overflow = prev;\n };\n }, [open]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open) return;\n const handle = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, items.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n items[activeIndex]?.onSelect();\n onClose();\n }\n };\n document.addEventListener('keydown', handle);\n return () => document.removeEventListener('keydown', handle);\n }, [open, items, activeIndex, onClose]);\n\n if (!open) return null;\n\n // Group items\n const groups = items.reduce<Record<string, CommandItem[]>>((acc, item) => {\n const g = item.group ?? '';\n if (!acc[g]) acc[g] = [];\n acc[g]!.push(item);\n return acc;\n }, {});\n\n const groupEntries = Object.entries(groups);\n\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-[10vh] px-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-slate-900/50 backdrop-blur-sm\"\n aria-hidden=\"true\"\n onClick={onClose}\n />\n\n {/* Panel */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n className=\"relative z-10 w-full max-w-lg rounded-2xl border border-slate-200 bg-white shadow-2xl overflow-hidden\"\n >\n {/* Search row */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-slate-100\">\n <Search size={16} className=\"shrink-0 text-slate-400\" aria-hidden=\"true\" />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={items.length > 0}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-label=\"Search commands\"\n value={query}\n onChange={(e) => onQueryChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent text-sm font-medium text-slate-900 outline-none placeholder:text-slate-400\"\n />\n <kbd className=\"hidden shrink-0 rounded border border-slate-200 px-1.5 py-0.5 text-[10px] font-bold text-slate-400 sm:block\">\n ESC\n </kbd>\n </div>\n\n {/* Results */}\n {items.length > 0 ? (\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Commands\"\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {groupEntries.map(([group, groupItems]) => (\n <div key={group}>\n {group && (\n <div className=\"px-4 py-1.5 text-[10px] font-bold uppercase tracking-widest text-slate-400\">\n {group}\n </div>\n )}\n {groupItems.map((item) => {\n const globalIdx = items.indexOf(item);\n const isActive = globalIdx === activeIndex;\n return (\n <div\n key={item.id}\n role=\"option\"\n aria-selected={isActive}\n onClick={() => { item.onSelect(); onClose(); }}\n onMouseEnter={() => setActiveIndex(globalIdx)}\n className={`flex cursor-pointer items-center gap-3 px-4 py-2.5 transition ${\n isActive ? 'bg-blue-50' : 'hover:bg-slate-50'\n }`}\n >\n {item.icon && (\n <span className={`shrink-0 ${isActive ? 'text-brand-blue' : 'text-slate-400'}`} aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className={`text-sm font-semibold ${isActive ? 'text-brand-blue' : 'text-slate-700'}`}>\n {item.label}\n </p>\n {item.description && (\n <p className=\"text-xs font-medium text-slate-400\">{item.description}</p>\n )}\n </div>\n {isActive && (\n <kbd className=\"shrink-0 rounded border border-brand-blue/25 bg-blue-50 px-1.5 py-0.5 text-[10px] font-bold text-brand-blue\">\n ↵\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"px-4 py-8 text-center text-sm font-medium text-slate-400\">\n {query ? `No results for \"${query}\"` : 'Type to search commands'}\n </div>\n )}\n\n {/* Footer hint */}\n <div className=\"flex items-center gap-3 border-t border-slate-100 px-4 py-2\">\n <Command size={11} className=\"text-slate-300\" aria-hidden=\"true\" />\n <span className=\"text-[10px] font-medium text-slate-400\">\n ↑↓ navigate · ↵ select · Esc close\n </span>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"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"}