@rojaostudio/ds 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 (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/brand/rojao-black-on-white.png +0 -0
  4. package/brand/rojao-black.png +0 -0
  5. package/brand/rojao-white-on-black.png +0 -0
  6. package/brand/rojao-white.png +0 -0
  7. package/dist/chunk-ORMEWXMH.js +37 -0
  8. package/dist/compat/generate.d.ts +6 -0
  9. package/dist/compat/generate.js +1 -0
  10. package/dist/compat/recipes.d.ts +1 -0
  11. package/dist/compat/recipes.js +1 -0
  12. package/dist/compat/themes.d.ts +1 -0
  13. package/dist/compat/themes.js +1 -0
  14. package/dist/compat/tokens.d.ts +1 -0
  15. package/dist/compat/tokens.js +1 -0
  16. package/dist/components/accordion.d.ts +35 -0
  17. package/dist/components/accordion.js +95 -0
  18. package/dist/components/alert.d.ts +24 -0
  19. package/dist/components/alert.js +72 -0
  20. package/dist/components/avatar.d.ts +45 -0
  21. package/dist/components/avatar.js +97 -0
  22. package/dist/components/badge.d.ts +45 -0
  23. package/dist/components/badge.js +114 -0
  24. package/dist/components/blocker-card.d.ts +42 -0
  25. package/dist/components/blocker-card.js +45 -0
  26. package/dist/components/bottom-sheet.d.ts +31 -0
  27. package/dist/components/bottom-sheet.js +120 -0
  28. package/dist/components/breadcrumb.d.ts +28 -0
  29. package/dist/components/breadcrumb.js +52 -0
  30. package/dist/components/button.d.ts +27 -0
  31. package/dist/components/button.js +124 -0
  32. package/dist/components/card.d.ts +27 -0
  33. package/dist/components/card.js +52 -0
  34. package/dist/components/chat-bubble.d.ts +16 -0
  35. package/dist/components/chat-bubble.js +55 -0
  36. package/dist/components/checkbox.d.ts +14 -0
  37. package/dist/components/checkbox.js +78 -0
  38. package/dist/components/chip-input.d.ts +26 -0
  39. package/dist/components/chip-input.js +182 -0
  40. package/dist/components/chips.d.ts +22 -0
  41. package/dist/components/chips.js +94 -0
  42. package/dist/components/choice-card.d.ts +16 -0
  43. package/dist/components/choice-card.js +60 -0
  44. package/dist/components/choice-carousel.d.ts +16 -0
  45. package/dist/components/choice-carousel.js +154 -0
  46. package/dist/components/choice-preview-card.d.ts +37 -0
  47. package/dist/components/choice-preview-card.js +39 -0
  48. package/dist/components/color-input.d.ts +20 -0
  49. package/dist/components/color-input.js +79 -0
  50. package/dist/components/combobox.d.ts +70 -0
  51. package/dist/components/combobox.js +213 -0
  52. package/dist/components/context-menu.d.ts +33 -0
  53. package/dist/components/context-menu.js +70 -0
  54. package/dist/components/copilot-hint.d.ts +18 -0
  55. package/dist/components/copilot-hint.js +63 -0
  56. package/dist/components/copy-field.d.ts +16 -0
  57. package/dist/components/copy-field.js +41 -0
  58. package/dist/components/currency-input.d.ts +32 -0
  59. package/dist/components/currency-input.js +138 -0
  60. package/dist/components/danger-zone.d.ts +20 -0
  61. package/dist/components/danger-zone.js +21 -0
  62. package/dist/components/data-table-header.d.ts +43 -0
  63. package/dist/components/data-table-header.js +205 -0
  64. package/dist/components/date-picker.d.ts +40 -0
  65. package/dist/components/date-picker.js +252 -0
  66. package/dist/components/divider.d.ts +20 -0
  67. package/dist/components/divider.js +47 -0
  68. package/dist/components/drawer.d.ts +26 -0
  69. package/dist/components/drawer.js +82 -0
  70. package/dist/components/dropzone.d.ts +19 -0
  71. package/dist/components/dropzone.js +65 -0
  72. package/dist/components/empty-state.d.ts +48 -0
  73. package/dist/components/empty-state.js +91 -0
  74. package/dist/components/fab.d.ts +38 -0
  75. package/dist/components/fab.js +100 -0
  76. package/dist/components/filter-chip.d.ts +54 -0
  77. package/dist/components/filter-chip.js +66 -0
  78. package/dist/components/floating-stepper.d.ts +44 -0
  79. package/dist/components/floating-stepper.js +53 -0
  80. package/dist/components/form-card-header.d.ts +13 -0
  81. package/dist/components/form-card-header.js +8 -0
  82. package/dist/components/icon-button.d.ts +17 -0
  83. package/dist/components/icon-button.js +80 -0
  84. package/dist/components/image-crop-modal.d.ts +59 -0
  85. package/dist/components/image-crop-modal.js +240 -0
  86. package/dist/components/image-upload.d.ts +72 -0
  87. package/dist/components/image-upload.js +271 -0
  88. package/dist/components/index.d.ts +85 -0
  89. package/dist/components/index.js +200 -0
  90. package/dist/components/input.d.ts +25 -0
  91. package/dist/components/input.js +136 -0
  92. package/dist/components/insight-card.d.ts +19 -0
  93. package/dist/components/insight-card.js +27 -0
  94. package/dist/components/label.d.ts +16 -0
  95. package/dist/components/label.js +43 -0
  96. package/dist/components/media-tile.d.ts +24 -0
  97. package/dist/components/media-tile.js +28 -0
  98. package/dist/components/menu.d.ts +50 -0
  99. package/dist/components/menu.js +80 -0
  100. package/dist/components/modal.d.ts +25 -0
  101. package/dist/components/modal.js +71 -0
  102. package/dist/components/notice.d.ts +50 -0
  103. package/dist/components/notice.js +103 -0
  104. package/dist/components/option-tile.d.ts +60 -0
  105. package/dist/components/option-tile.js +144 -0
  106. package/dist/components/page-shell.d.ts +29 -0
  107. package/dist/components/page-shell.js +36 -0
  108. package/dist/components/page-skeleton.d.ts +35 -0
  109. package/dist/components/page-skeleton.js +12 -0
  110. package/dist/components/page-tabs.d.ts +35 -0
  111. package/dist/components/page-tabs.js +55 -0
  112. package/dist/components/pagination.d.ts +31 -0
  113. package/dist/components/pagination.js +80 -0
  114. package/dist/components/paywall-banner.d.ts +37 -0
  115. package/dist/components/paywall-banner.js +42 -0
  116. package/dist/components/paywall.d.ts +44 -0
  117. package/dist/components/paywall.js +55 -0
  118. package/dist/components/phone-frame.d.ts +9 -0
  119. package/dist/components/phone-frame.js +18 -0
  120. package/dist/components/phone-input.d.ts +24 -0
  121. package/dist/components/phone-input.js +92 -0
  122. package/dist/components/pix-icon.d.ts +8 -0
  123. package/dist/components/pix-icon.js +24 -0
  124. package/dist/components/popover.d.ts +44 -0
  125. package/dist/components/popover.js +140 -0
  126. package/dist/components/pricing-card.d.ts +42 -0
  127. package/dist/components/pricing-card.js +29 -0
  128. package/dist/components/qr-display.d.ts +19 -0
  129. package/dist/components/qr-display.js +24 -0
  130. package/dist/components/radio.d.ts +33 -0
  131. package/dist/components/radio.js +97 -0
  132. package/dist/components/row-actions.d.ts +24 -0
  133. package/dist/components/row-actions.js +76 -0
  134. package/dist/components/saving-bar-context.d.ts +40 -0
  135. package/dist/components/saving-bar-context.js +125 -0
  136. package/dist/components/saving-bar.d.ts +18 -0
  137. package/dist/components/saving-bar.js +72 -0
  138. package/dist/components/search.d.ts +30 -0
  139. package/dist/components/search.js +81 -0
  140. package/dist/components/section-card.d.ts +14 -0
  141. package/dist/components/section-card.js +49 -0
  142. package/dist/components/section-header.d.ts +29 -0
  143. package/dist/components/section-header.js +7 -0
  144. package/dist/components/select.d.ts +21 -0
  145. package/dist/components/select.js +140 -0
  146. package/dist/components/selectable-card.d.ts +35 -0
  147. package/dist/components/selectable-card.js +27 -0
  148. package/dist/components/setting-row.d.ts +33 -0
  149. package/dist/components/setting-row.js +19 -0
  150. package/dist/components/settings-list.d.ts +25 -0
  151. package/dist/components/settings-list.js +22 -0
  152. package/dist/components/skeleton.d.ts +24 -0
  153. package/dist/components/skeleton.js +49 -0
  154. package/dist/components/slider.d.ts +32 -0
  155. package/dist/components/slider.js +79 -0
  156. package/dist/components/spinner.d.ts +14 -0
  157. package/dist/components/spinner.js +36 -0
  158. package/dist/components/step-progress.d.ts +12 -0
  159. package/dist/components/step-progress.js +24 -0
  160. package/dist/components/summary-bar.d.ts +31 -0
  161. package/dist/components/summary-bar.js +54 -0
  162. package/dist/components/table.d.ts +23 -0
  163. package/dist/components/table.js +80 -0
  164. package/dist/components/textarea.d.ts +21 -0
  165. package/dist/components/textarea.js +95 -0
  166. package/dist/components/themed.d.ts +36 -0
  167. package/dist/components/themed.js +22 -0
  168. package/dist/components/time-picker.d.ts +34 -0
  169. package/dist/components/time-picker.js +213 -0
  170. package/dist/components/toaster.d.ts +84 -0
  171. package/dist/components/toaster.js +284 -0
  172. package/dist/components/toggle-card-compact.d.ts +21 -0
  173. package/dist/components/toggle-card-compact.js +99 -0
  174. package/dist/components/toggle-card.d.ts +15 -0
  175. package/dist/components/toggle-card.js +76 -0
  176. package/dist/components/toggle-group.d.ts +67 -0
  177. package/dist/components/toggle-group.js +80 -0
  178. package/dist/components/toggle.d.ts +13 -0
  179. package/dist/components/toggle.js +64 -0
  180. package/dist/components/tooltip.d.ts +17 -0
  181. package/dist/components/tooltip.js +89 -0
  182. package/dist/components/typing-indicator.d.ts +8 -0
  183. package/dist/components/typing-indicator.js +27 -0
  184. package/dist/components/use-dismiss.d.ts +9 -0
  185. package/dist/components/use-dismiss.js +28 -0
  186. package/dist/components/use-focus-trap.d.ts +5 -0
  187. package/dist/components/use-focus-trap.js +54 -0
  188. package/dist/icons/index.d.ts +1 -0
  189. package/dist/icons/index.js +89 -0
  190. package/dist/targets/native/components/accordion.d.ts +18 -0
  191. package/dist/targets/native/components/accordion.js +122 -0
  192. package/dist/targets/native/components/alert.d.ts +16 -0
  193. package/dist/targets/native/components/alert.js +58 -0
  194. package/dist/targets/native/components/avatar.d.ts +25 -0
  195. package/dist/targets/native/components/avatar.js +88 -0
  196. package/dist/targets/native/components/badge.d.ts +27 -0
  197. package/dist/targets/native/components/badge.js +59 -0
  198. package/dist/targets/native/components/button.d.ts +18 -0
  199. package/dist/targets/native/components/button.js +84 -0
  200. package/dist/targets/native/components/card.d.ts +6 -0
  201. package/dist/targets/native/components/card.js +36 -0
  202. package/dist/targets/native/components/checkbox.d.ts +12 -0
  203. package/dist/targets/native/components/checkbox.js +59 -0
  204. package/dist/targets/native/components/chips.d.ts +17 -0
  205. package/dist/targets/native/components/chips.js +77 -0
  206. package/dist/targets/native/components/choice-card.d.ts +11 -0
  207. package/dist/targets/native/components/choice-card.js +52 -0
  208. package/dist/targets/native/components/context-menu.d.ts +11 -0
  209. package/dist/targets/native/components/context-menu.js +19 -0
  210. package/dist/targets/native/components/currency-input.d.ts +22 -0
  211. package/dist/targets/native/components/currency-input.js +105 -0
  212. package/dist/targets/native/components/danger-zone.d.ts +13 -0
  213. package/dist/targets/native/components/danger-zone.js +27 -0
  214. package/dist/targets/native/components/date-picker.d.ts +13 -0
  215. package/dist/targets/native/components/date-picker.js +185 -0
  216. package/dist/targets/native/components/divider.d.ts +9 -0
  217. package/dist/targets/native/components/divider.js +36 -0
  218. package/dist/targets/native/components/empty-state.d.ts +13 -0
  219. package/dist/targets/native/components/empty-state.js +10 -0
  220. package/dist/targets/native/components/fab.d.ts +25 -0
  221. package/dist/targets/native/components/fab.js +112 -0
  222. package/dist/targets/native/components/filter-chip.d.ts +22 -0
  223. package/dist/targets/native/components/filter-chip.js +70 -0
  224. package/dist/targets/native/components/form-field.d.ts +13 -0
  225. package/dist/targets/native/components/form-field.js +29 -0
  226. package/dist/targets/native/components/form-screen.d.ts +19 -0
  227. package/dist/targets/native/components/form-screen.js +88 -0
  228. package/dist/targets/native/components/google-icon.d.ts +8 -0
  229. package/dist/targets/native/components/google-icon.js +32 -0
  230. package/dist/targets/native/components/icon-button.d.ts +18 -0
  231. package/dist/targets/native/components/icon-button.js +80 -0
  232. package/dist/targets/native/components/icon.d.ts +11 -0
  233. package/dist/targets/native/components/icon.js +9 -0
  234. package/dist/targets/native/components/image-upload.d.ts +12 -0
  235. package/dist/targets/native/components/image-upload.js +95 -0
  236. package/dist/targets/native/components/index.d.ts +45 -0
  237. package/dist/targets/native/components/index.js +100 -0
  238. package/dist/targets/native/components/input.d.ts +17 -0
  239. package/dist/targets/native/components/input.js +103 -0
  240. package/dist/targets/native/components/list-item.d.ts +20 -0
  241. package/dist/targets/native/components/list-item.js +71 -0
  242. package/dist/targets/native/components/menu.d.ts +24 -0
  243. package/dist/targets/native/components/menu.js +71 -0
  244. package/dist/targets/native/components/modal.d.ts +15 -0
  245. package/dist/targets/native/components/modal.js +110 -0
  246. package/dist/targets/native/components/paywall-banner.d.ts +11 -0
  247. package/dist/targets/native/components/paywall-banner.js +46 -0
  248. package/dist/targets/native/components/paywall.d.ts +18 -0
  249. package/dist/targets/native/components/paywall.js +61 -0
  250. package/dist/targets/native/components/radio.d.ts +20 -0
  251. package/dist/targets/native/components/radio.js +71 -0
  252. package/dist/targets/native/components/search.d.ts +22 -0
  253. package/dist/targets/native/components/search.js +92 -0
  254. package/dist/targets/native/components/select.d.ts +17 -0
  255. package/dist/targets/native/components/select.js +86 -0
  256. package/dist/targets/native/components/sheet.d.ts +11 -0
  257. package/dist/targets/native/components/sheet.js +51 -0
  258. package/dist/targets/native/components/skeleton.d.ts +18 -0
  259. package/dist/targets/native/components/skeleton.js +52 -0
  260. package/dist/targets/native/components/slider.d.ts +18 -0
  261. package/dist/targets/native/components/slider.js +153 -0
  262. package/dist/targets/native/components/spinner.d.ts +7 -0
  263. package/dist/targets/native/components/spinner.js +10 -0
  264. package/dist/targets/native/components/stepper.d.ts +10 -0
  265. package/dist/targets/native/components/stepper.js +33 -0
  266. package/dist/targets/native/components/switch.d.ts +20 -0
  267. package/dist/targets/native/components/switch.js +68 -0
  268. package/dist/targets/native/components/text.d.ts +12 -0
  269. package/dist/targets/native/components/text.js +31 -0
  270. package/dist/targets/native/components/textarea.d.ts +13 -0
  271. package/dist/targets/native/components/textarea.js +92 -0
  272. package/dist/targets/native/components/theme.d.ts +18 -0
  273. package/dist/targets/native/components/theme.js +20 -0
  274. package/dist/targets/native/components/toaster.d.ts +35 -0
  275. package/dist/targets/native/components/toaster.js +159 -0
  276. package/dist/targets/native/fonts.d.ts +9 -0
  277. package/dist/targets/native/fonts.js +10 -0
  278. package/dist/targets/native/icons.d.ts +1 -0
  279. package/dist/targets/native/icons.js +1 -0
  280. package/dist/targets/native/index.d.ts +3 -0
  281. package/dist/targets/native/index.js +11 -0
  282. package/dist/targets/native/preset.cjs +69 -0
  283. package/dist/targets/native/resolve.d.ts +22 -0
  284. package/dist/targets/native/resolve.js +85 -0
  285. package/dist/targets/native/theme.css +118 -0
  286. package/dist/targets/native/theme.d.ts +117 -0
  287. package/dist/targets/native/theme.js +118 -0
  288. package/package.json +194 -0
  289. package/styles/_primitives.generated.css +284 -0
  290. package/styles/base.css +950 -0
  291. package/styles/themes/rojao.css +107 -0
@@ -0,0 +1,114 @@
1
+ import {
2
+ __objRest,
3
+ __spreadValues
4
+ } from "../chunk-ORMEWXMH.js";
5
+ import { forwardRef } from "react";
6
+ const LABEL_VARIANTS = {
7
+ default: "bg-surface-default text-fg-muted border border-stroke-default",
8
+ primary: "bg-brand-primary text-brand-on-primary",
9
+ success: "bg-success-soft text-success-text border border-success-border",
10
+ warning: "bg-warning-soft text-warning-text border border-warning-border",
11
+ danger: "bg-danger-soft text-danger-text border border-danger-border",
12
+ info: "bg-info-soft text-info-text border border-info-border",
13
+ neutral: "bg-neutral-soft text-neutral-text border border-neutral-border"
14
+ };
15
+ const STATUS_VARIANTS = {
16
+ active: { dot: "bg-success", text: "text-success-text" },
17
+ inactive: { dot: "bg-state-disabled-text", text: "text-state-disabled-text" },
18
+ pending: { dot: "bg-warning", text: "text-warning-text" },
19
+ error: { dot: "bg-danger", text: "text-danger-text" }
20
+ };
21
+ const BASE = "inline-flex items-center rounded-(--radius-badge) font-medium transition-colors";
22
+ const SIZE_CLASS = {
23
+ sm: "text-[10px]",
24
+ md: "text-caption"
25
+ };
26
+ const DOT_BG = {
27
+ brand: "bg-brand-primary",
28
+ success: "bg-success",
29
+ warning: "bg-warning",
30
+ danger: "bg-danger",
31
+ info: "bg-info",
32
+ neutral: "bg-neutral"
33
+ };
34
+ const Badge = forwardRef(function Badge2(_a, ref) {
35
+ var _b = _a, {
36
+ variant = "default",
37
+ size = "md",
38
+ count,
39
+ max = 99,
40
+ dotColor = "brand",
41
+ className = "",
42
+ children
43
+ } = _b, props = __objRest(_b, [
44
+ "variant",
45
+ "size",
46
+ "count",
47
+ "max",
48
+ "dotColor",
49
+ "className",
50
+ "children"
51
+ ]);
52
+ if (variant === "dot") {
53
+ return /* @__PURE__ */ React.createElement(
54
+ "span",
55
+ __spreadValues({
56
+ ref,
57
+ role: "status",
58
+ className: [
59
+ "inline-block rounded-full",
60
+ size === "sm" ? "size-2" : "size-2.5",
61
+ DOT_BG[dotColor],
62
+ className
63
+ ].join(" ")
64
+ }, props)
65
+ );
66
+ }
67
+ if (variant === "count") {
68
+ const display = count !== void 0 ? count > max ? `${max}+` : String(count) : children;
69
+ if (count !== void 0 && count <= 0) return null;
70
+ return /* @__PURE__ */ React.createElement(
71
+ "span",
72
+ __spreadValues({
73
+ ref,
74
+ className: [
75
+ BASE,
76
+ SIZE_CLASS[size],
77
+ size === "sm" ? "min-w-[16px] h-4 px-1" : "min-w-[20px] h-5 px-1.5",
78
+ "bg-brand-primary text-brand-on-primary justify-center tabular-nums",
79
+ className
80
+ ].join(" ")
81
+ }, props),
82
+ display
83
+ );
84
+ }
85
+ if (variant in STATUS_VARIANTS) {
86
+ const { dot, text } = STATUS_VARIANTS[variant];
87
+ return /* @__PURE__ */ React.createElement(
88
+ "span",
89
+ __spreadValues({
90
+ ref,
91
+ className: [BASE, SIZE_CLASS[size], "gap-1.5", text, className].join(" ")
92
+ }, props),
93
+ /* @__PURE__ */ React.createElement("span", { className: ["shrink-0 size-1.5 rounded-full", dot].join(" "), "aria-hidden": "true" }),
94
+ children
95
+ );
96
+ }
97
+ return /* @__PURE__ */ React.createElement(
98
+ "span",
99
+ __spreadValues({
100
+ ref,
101
+ className: [
102
+ BASE,
103
+ SIZE_CLASS[size],
104
+ size === "sm" ? "px-1.5 py-px" : "px-2 py-0.5",
105
+ LABEL_VARIANTS[variant],
106
+ className
107
+ ].join(" ")
108
+ }, props),
109
+ children
110
+ );
111
+ });
112
+ export {
113
+ Badge
114
+ };
@@ -0,0 +1,42 @@
1
+ import * as react from 'react';
2
+ import { ReactNode, ComponentType } from 'react';
3
+
4
+ /**
5
+ * BlockerCard — destaque bloqueante. Mostra que algo precisa de atenção pra
6
+ * o usuário poder seguir (limite atingido, plano expirado, feature gateada).
7
+ *
8
+ * Uso:
9
+ * <BlockerCard
10
+ * title="Limite de produtos atingido"
11
+ * description="Você usou 50/50. Faça upgrade pra cadastrar mais."
12
+ * action="Ver planos"
13
+ * actionHref="/billing"
14
+ * />
15
+ *
16
+ * Pra Next.js, passa `linkAs={Link}` pra usar next/link em vez de `<a>`.
17
+ */
18
+ type BlockerCardTone = 'danger' | 'warning' | 'info';
19
+ interface BlockerCardProps {
20
+ title: string;
21
+ description: ReactNode;
22
+ /** Label do botão de ação (opcional). */
23
+ action?: string;
24
+ /** URL/link da ação. Se ausente e `onAction` definido, vira botão. */
25
+ actionHref?: string;
26
+ /** Handler de ação (se preferir click handler em vez de href). */
27
+ onAction?: () => void;
28
+ /** Tom semântico. default = "danger". */
29
+ tone?: BlockerCardTone;
30
+ /** Eyebrow text antes do título (ex: "Bloqueio", "Limite"). */
31
+ eyebrow?: string;
32
+ /** Component de link customizado (ex: next/link). default = `<a>`. */
33
+ linkAs?: ComponentType<{
34
+ href: string;
35
+ className?: string;
36
+ children: ReactNode;
37
+ }>;
38
+ className?: string;
39
+ }
40
+ declare function BlockerCard({ title, description, action, actionHref, onAction, tone, eyebrow, linkAs: LinkAs, className, }: BlockerCardProps): react.JSX.Element;
41
+
42
+ export { BlockerCard, type BlockerCardProps, type BlockerCardTone };
@@ -0,0 +1,45 @@
1
+ import "../chunk-ORMEWXMH.js";
2
+ const TONE = {
3
+ danger: {
4
+ container: "border-danger-border bg-danger-soft",
5
+ eyebrow: "text-danger-text",
6
+ action: "border-danger-border bg-surface-default text-danger-text hover:bg-danger-soft"
7
+ },
8
+ warning: {
9
+ container: "border-warning-border bg-warning-soft",
10
+ eyebrow: "text-warning-text",
11
+ action: "border-warning-border bg-surface-default text-warning-text hover:bg-warning-soft"
12
+ },
13
+ info: {
14
+ container: "border-info-border bg-info-soft",
15
+ eyebrow: "text-info-text",
16
+ action: "border-info-border bg-surface-default text-info-text hover:bg-info-soft"
17
+ }
18
+ };
19
+ const DEFAULT_EYEBROW = {
20
+ danger: "Bloqueio",
21
+ warning: "Aten\xE7\xE3o",
22
+ info: "Aviso"
23
+ };
24
+ function DefaultLink({ href, className, children }) {
25
+ return /* @__PURE__ */ React.createElement("a", { href, className }, children);
26
+ }
27
+ function BlockerCard({
28
+ title,
29
+ description,
30
+ action,
31
+ actionHref,
32
+ onAction,
33
+ tone = "danger",
34
+ eyebrow,
35
+ linkAs: LinkAs = DefaultLink,
36
+ className = ""
37
+ }) {
38
+ const palette = TONE[tone];
39
+ const eyebrowText = eyebrow != null ? eyebrow : DEFAULT_EYEBROW[tone];
40
+ const actionClass = ["shrink-0 rounded-(--radius-card) border px-3 py-1.5 text-caption font-medium transition-colors whitespace-nowrap", palette.action].join(" ");
41
+ return /* @__PURE__ */ React.createElement("div", { className: ["rounded-(--radius-card) border p-4", palette.container, className].join(" ") }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React.createElement("span", { className: ["text-caption font-semibold uppercase tracking-wide", palette.eyebrow].join(" ") }, eyebrowText), /* @__PURE__ */ React.createElement("p", { className: "mt-0.5 font-semibold text-fg-primary text-label" }, title), /* @__PURE__ */ React.createElement("div", { className: "mt-0.5 text-label text-fg-secondary" }, description)), action && actionHref && /* @__PURE__ */ React.createElement(LinkAs, { href: actionHref, className: actionClass }, action), action && !actionHref && onAction && /* @__PURE__ */ React.createElement("button", { type: "button", onClick: onAction, className: actionClass }, action)));
42
+ }
43
+ export {
44
+ BlockerCard
45
+ };
@@ -0,0 +1,31 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ /**
5
+ * BottomSheet — drawer ancorado na borda inferior. Padrão mobile-first;
6
+ * em desktop renderiza centralizado mais estreito (responde ao viewport).
7
+ *
8
+ * Uso:
9
+ * <BottomSheet open={open} onClose={() => setOpen(false)} title="Filtros">
10
+ * <p>Conteúdo</p>
11
+ * </BottomSheet>
12
+ *
13
+ * Recursos: backdrop com fade, swipe-to-dismiss (em mobile), trap focus básico,
14
+ * ESC fecha, snap points opcionais (full / half / auto).
15
+ */
16
+ interface BottomSheetProps {
17
+ open: boolean;
18
+ onClose: () => void;
19
+ title?: string;
20
+ children: ReactNode;
21
+ /** Altura do sheet. default = "auto" (cresce até max-h). */
22
+ snap?: 'auto' | 'half' | 'full';
23
+ /** Esconde header + close button. default = false. */
24
+ hideHeader?: boolean;
25
+ /** Fecha ao clicar no backdrop. default = true. */
26
+ closeOnBackdrop?: boolean;
27
+ className?: string;
28
+ }
29
+ declare const BottomSheet: react.ForwardRefExoticComponent<BottomSheetProps & react.RefAttributes<HTMLDivElement>>;
30
+
31
+ export { BottomSheet, type BottomSheetProps };
@@ -0,0 +1,120 @@
1
+ "use client";
2
+ import "../chunk-ORMEWXMH.js";
3
+ import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { X } from "lucide-react";
6
+ import { useFocusTrap } from "./use-focus-trap.js";
7
+ const SNAP_HEIGHT = {
8
+ auto: "max-h-[90dvh]",
9
+ half: "h-1/2",
10
+ full: "h-[95dvh]"
11
+ };
12
+ const BottomSheet = forwardRef(function BottomSheet2({
13
+ open,
14
+ onClose,
15
+ title,
16
+ children,
17
+ snap = "auto",
18
+ hideHeader = false,
19
+ closeOnBackdrop = true,
20
+ className = ""
21
+ }, ref) {
22
+ const [mounted, setMounted] = useState(false);
23
+ const sheetRef = useFocusTrap(open);
24
+ useImperativeHandle(ref, () => sheetRef.current);
25
+ const dragStartY = useRef(0);
26
+ const handleDragStart = (e) => {
27
+ var _a, _b;
28
+ dragStartY.current = (_b = (_a = e.touches[0]) == null ? void 0 : _a.clientY) != null ? _b : 0;
29
+ };
30
+ const handleDragMove = (e) => {
31
+ var _a, _b;
32
+ const container = (_a = sheetRef.current) == null ? void 0 : _a.querySelector("[data-scroll-container]");
33
+ if (container && container.scrollTop > 0) return;
34
+ const y = (_b = e.touches[0]) == null ? void 0 : _b.clientY;
35
+ if (y !== void 0 && y - dragStartY.current > 80) onClose();
36
+ };
37
+ useEffect(() => {
38
+ setMounted(true);
39
+ }, []);
40
+ useEffect(() => {
41
+ if (!open) return;
42
+ const handler = (e) => {
43
+ if (e.key === "Escape") onClose();
44
+ };
45
+ document.addEventListener("keydown", handler);
46
+ document.body.style.overflow = "hidden";
47
+ return () => {
48
+ document.removeEventListener("keydown", handler);
49
+ document.body.style.overflow = "";
50
+ };
51
+ }, [open, onClose]);
52
+ if (!mounted || !open) return null;
53
+ return createPortal(
54
+ /* @__PURE__ */ React.createElement(
55
+ "div",
56
+ {
57
+ role: "dialog",
58
+ "aria-modal": "true",
59
+ "aria-labelledby": title ? "bottom-sheet-title" : void 0,
60
+ className: "fixed inset-0 z-[1000] flex items-end justify-center"
61
+ },
62
+ /* @__PURE__ */ React.createElement(
63
+ "div",
64
+ {
65
+ "data-bottom-sheet-backdrop": true,
66
+ onClick: closeOnBackdrop ? onClose : void 0,
67
+ className: "absolute inset-0 [background:var(--overlay-scrim)] rojao-bottom-sheet--backdrop-enter",
68
+ "aria-hidden": true
69
+ }
70
+ ),
71
+ /* @__PURE__ */ React.createElement(
72
+ "div",
73
+ {
74
+ ref: sheetRef,
75
+ tabIndex: -1,
76
+ className: [
77
+ "relative w-full sm:max-w-md bg-surface-default rounded-t-(--radius-toast) shadow-2xl outline-none",
78
+ "flex flex-col rojao-bottom-sheet--enter",
79
+ SNAP_HEIGHT[snap],
80
+ className
81
+ ].join(" ")
82
+ },
83
+ /* @__PURE__ */ React.createElement(
84
+ "div",
85
+ {
86
+ "data-drag-handle": true,
87
+ onTouchStart: handleDragStart,
88
+ onTouchMove: handleDragMove,
89
+ className: "flex justify-center items-center min-h-[20px] pt-2 shrink-0 touch-none cursor-grab"
90
+ },
91
+ /* @__PURE__ */ React.createElement("span", { className: "w-10 h-1 rounded-full bg-(--border-strong)", "aria-hidden": true })
92
+ ),
93
+ !hideHeader && /* @__PURE__ */ React.createElement(
94
+ "div",
95
+ {
96
+ onTouchStart: handleDragStart,
97
+ onTouchMove: handleDragMove,
98
+ className: "flex items-center justify-between px-5 pt-2 pb-3 border-b border-stroke-default shrink-0"
99
+ },
100
+ /* @__PURE__ */ React.createElement("h2", { id: "bottom-sheet-title", className: "text-body font-semibold text-fg-primary" }, title),
101
+ /* @__PURE__ */ React.createElement(
102
+ "button",
103
+ {
104
+ type: "button",
105
+ onClick: onClose,
106
+ "aria-label": "Fechar",
107
+ className: "text-fg-muted hover:text-fg-primary transition-colors p-3 -mr-3 rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus"
108
+ },
109
+ /* @__PURE__ */ React.createElement(X, { size: 18 })
110
+ )
111
+ ),
112
+ /* @__PURE__ */ React.createElement("div", { "data-scroll-container": true, className: "flex-1 overflow-y-auto px-5 py-4" }, children)
113
+ )
114
+ ),
115
+ document.body
116
+ );
117
+ });
118
+ export {
119
+ BottomSheet
120
+ };
@@ -0,0 +1,28 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface BreadcrumbItem {
5
+ label: string;
6
+ href?: string;
7
+ /** Ícone leading opcional (ex: Home no primeiro item). */
8
+ icon?: ReactNode;
9
+ }
10
+ interface BreadcrumbProps {
11
+ items: BreadcrumbItem[];
12
+ /** Separador customizado. default = ChevronRight. */
13
+ separator?: ReactNode;
14
+ /** Trunca pra mostrar só primeiro + último com `…` no meio quando > este número. */
15
+ maxItems?: number;
16
+ className?: string;
17
+ /** Tag de link (default = `<a>`). Pra Next.js, passa `Link` daqui. */
18
+ linkAs?: React.ComponentType<{
19
+ href: string;
20
+ className?: string;
21
+ children: ReactNode;
22
+ }>;
23
+ }
24
+ declare function Breadcrumb({ items, separator, maxItems, className, linkAs: LinkAs, }: BreadcrumbProps): react.JSX.Element;
25
+ /** Helper pra primeiro item sempre ter ícone Home. */
26
+ declare function homeItem(href?: string): BreadcrumbItem;
27
+
28
+ export { Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, homeItem };
@@ -0,0 +1,52 @@
1
+ import "../chunk-ORMEWXMH.js";
2
+ import { ChevronRight, Home } from "lucide-react";
3
+ function DefaultLink({ href, className, children }) {
4
+ return /* @__PURE__ */ React.createElement("a", { href, className }, children);
5
+ }
6
+ function Breadcrumb({
7
+ items,
8
+ separator,
9
+ maxItems = 4,
10
+ className = "",
11
+ linkAs: LinkAs = DefaultLink
12
+ }) {
13
+ const sep = separator != null ? separator : /* @__PURE__ */ React.createElement(ChevronRight, { size: 14, className: "text-fg-muted shrink-0" });
14
+ let displayed = items;
15
+ if (items.length > maxItems) {
16
+ displayed = [
17
+ items[0],
18
+ { ellipsis: true },
19
+ ...items.slice(items.length - 2)
20
+ ];
21
+ }
22
+ return /* @__PURE__ */ React.createElement("nav", { "aria-label": "Breadcrumb", className }, /* @__PURE__ */ React.createElement("ol", { className: "flex items-center gap-1.5 text-label flex-wrap" }, displayed.map((entry, idx) => {
23
+ const isLast = idx === displayed.length - 1;
24
+ if ("ellipsis" in entry) {
25
+ return /* @__PURE__ */ React.createElement("li", { key: `ell-${idx}`, className: "flex items-center gap-1.5" }, /* @__PURE__ */ React.createElement("span", { className: "text-fg-muted px-1", "aria-hidden": true }, "\u2026"), !isLast && sep);
26
+ }
27
+ const item = entry;
28
+ const labelEl = /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-1" }, item.icon, item.label);
29
+ return /* @__PURE__ */ React.createElement("li", { key: idx, className: "flex items-center gap-1.5" }, item.href && !isLast ? /* @__PURE__ */ React.createElement(
30
+ LinkAs,
31
+ {
32
+ href: item.href,
33
+ className: "text-fg-muted hover:text-fg-primary transition-colors"
34
+ },
35
+ labelEl
36
+ ) : /* @__PURE__ */ React.createElement(
37
+ "span",
38
+ {
39
+ className: isLast ? "text-fg-primary font-medium" : "text-fg-muted",
40
+ "aria-current": isLast ? "page" : void 0
41
+ },
42
+ labelEl
43
+ ), !isLast && sep);
44
+ })));
45
+ }
46
+ function homeItem(href = "/") {
47
+ return { label: "In\xEDcio", href, icon: /* @__PURE__ */ React.createElement(Home, { size: 14 }) };
48
+ }
49
+ export {
50
+ Breadcrumb,
51
+ homeItem
52
+ };
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode } from 'react';
3
+
4
+ type ButtonVariant = 'filled' | 'tonal' | 'outline' | 'ghost' | 'link';
5
+ type ButtonColor = 'primary' | 'secondary' | 'danger';
6
+ type ButtonSize = 'sm' | 'md' | 'lg';
7
+ declare function buttonVariants({ variant, color, size, fullWidth, className, }?: {
8
+ variant?: ButtonVariant;
9
+ color?: ButtonColor;
10
+ size?: ButtonSize;
11
+ fullWidth?: boolean;
12
+ className?: string;
13
+ }): string;
14
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
15
+ variant?: ButtonVariant;
16
+ color?: ButtonColor;
17
+ size?: ButtonSize;
18
+ loading?: boolean;
19
+ fullWidth?: boolean;
20
+ /** Ícone leading (à esquerda do texto). */
21
+ iconLeft?: ReactNode;
22
+ /** Ícone trailing (à direita do texto). */
23
+ iconRight?: ReactNode;
24
+ }
25
+ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
26
+
27
+ export { Button, type ButtonColor, type ButtonProps, type ButtonSize, type ButtonVariant, buttonVariants };
@@ -0,0 +1,124 @@
1
+ "use client";
2
+ import {
3
+ __objRest,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { forwardRef } from "react";
7
+ const variantColorClasses = {
8
+ // secondary = ação de BAIXA ÊNFASE, neutra por construção (não a 2ª cor de marca).
9
+ // Usa fg-secondary (4.5:1) + border-default (3:1) + surface-raised, que o motor
10
+ // garante contra a surface em light e dark. Uma cor de marca como traço/texto
11
+ // sobre a surface não tem garantia de contraste → sumia (navy no escuro, branco
12
+ // no claro). A 2ª cor de marca (--brand-secondary) segue viva pra FILL explícito.
13
+ filled: {
14
+ // Borda de AFFORDANCE: transparente por padrão (filled não tem borda visível). O motor só
15
+ // colore --brand-primary-border quando o fill da marca quase encosta na superfície — aí o
16
+ // hairline evita o botão "sumir" no fundo sem tocar na cor escolhida pelo lojista.
17
+ primary: "bg-brand-primary text-brand-on-primary hover:bg-brand-hover border border-[var(--brand-primary-border,transparent)]",
18
+ secondary: "bg-surface-raised text-fg-primary hover:opacity-90",
19
+ danger: "bg-danger text-fg-inverse hover:bg-danger-text"
20
+ },
21
+ tonal: {
22
+ primary: "bg-brand-primary/10 text-brand-primary hover:bg-brand-primary/20",
23
+ secondary: "bg-surface-raised/60 text-fg-secondary hover:bg-surface-raised",
24
+ danger: "bg-danger-soft text-danger-text hover:bg-danger-soft/70"
25
+ },
26
+ outline: {
27
+ primary: "ring-1 ring-inset ring-brand-primary bg-transparent text-brand-primary hover:bg-surface-raised",
28
+ secondary: "ring-1 ring-inset ring-border-default bg-transparent text-fg-secondary hover:bg-surface-raised",
29
+ danger: "ring-1 ring-inset ring-danger bg-transparent text-danger-text hover:bg-danger-soft"
30
+ },
31
+ ghost: {
32
+ primary: "bg-transparent text-brand-primary hover:bg-surface-raised",
33
+ secondary: "bg-transparent text-fg-secondary hover:bg-surface-raised",
34
+ danger: "bg-transparent text-danger-text hover:bg-danger-soft"
35
+ },
36
+ link: {
37
+ primary: "bg-transparent text-brand-primary underline-offset-4 hover:underline",
38
+ secondary: "bg-transparent text-fg-secondary underline-offset-4 hover:underline",
39
+ danger: "bg-transparent text-danger-text underline-offset-4 hover:underline"
40
+ }
41
+ };
42
+ const sizeClasses = {
43
+ sm: "box-border h-control-sm px-3 text-caption gap-1.5",
44
+ md: "box-border h-control-md px-4 text-label gap-2",
45
+ lg: "box-border h-control-lg px-5 text-body gap-2"
46
+ };
47
+ const linkSizeClasses = {
48
+ sm: "text-caption gap-1",
49
+ md: "text-label gap-1.5",
50
+ lg: "text-body gap-2"
51
+ };
52
+ function buttonVariants({
53
+ variant = "filled",
54
+ color = "primary",
55
+ size = "md",
56
+ fullWidth = false,
57
+ className = ""
58
+ } = {}) {
59
+ return [
60
+ "inline-flex items-center justify-center font-medium transition-colors",
61
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus focus-visible:ring-offset-2",
62
+ "disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none",
63
+ // Radius vem do token semântico — nunca hardcode (governança em base.css)
64
+ variant === "link" ? linkSizeClasses[size] : `rounded-(--radius-control) ${sizeClasses[size]}`,
65
+ variantColorClasses[variant][color],
66
+ fullWidth && "w-full",
67
+ className
68
+ ].filter(Boolean).join(" ");
69
+ }
70
+ const Spinner = () => /* @__PURE__ */ React.createElement(
71
+ "svg",
72
+ {
73
+ className: "animate-spin size-4 shrink-0",
74
+ xmlns: "http://www.w3.org/2000/svg",
75
+ fill: "none",
76
+ viewBox: "0 0 24 24",
77
+ "aria-hidden": "true"
78
+ },
79
+ /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
80
+ /* @__PURE__ */ React.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
81
+ );
82
+ const Button = forwardRef(function Button2(_a, ref) {
83
+ var _b = _a, {
84
+ variant = "filled",
85
+ color = "primary",
86
+ size = "md",
87
+ loading = false,
88
+ fullWidth = false,
89
+ iconLeft,
90
+ iconRight,
91
+ disabled,
92
+ className = "",
93
+ children,
94
+ type = "button"
95
+ } = _b, rest = __objRest(_b, [
96
+ "variant",
97
+ "color",
98
+ "size",
99
+ "loading",
100
+ "fullWidth",
101
+ "iconLeft",
102
+ "iconRight",
103
+ "disabled",
104
+ "className",
105
+ "children",
106
+ "type"
107
+ ]);
108
+ return /* @__PURE__ */ React.createElement(
109
+ "button",
110
+ __spreadValues({
111
+ ref,
112
+ type,
113
+ disabled: disabled || loading,
114
+ className: buttonVariants({ variant, color, size, fullWidth, className })
115
+ }, rest),
116
+ loading ? /* @__PURE__ */ React.createElement(Spinner, null) : iconLeft && /* @__PURE__ */ React.createElement("span", { className: "shrink-0 [&_svg]:size-4" }, iconLeft),
117
+ children,
118
+ iconRight && !loading && /* @__PURE__ */ React.createElement("span", { className: "shrink-0 [&_svg]:size-4" }, iconRight)
119
+ );
120
+ });
121
+ export {
122
+ Button,
123
+ buttonVariants
124
+ };
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ type CardVariant = 'outlined' | 'elevated' | 'filled' | 'flat' | 'invert';
5
+ interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
6
+ variant?: CardVariant;
7
+ /** Renderiza como botão clicável (link card). default = false. */
8
+ interactive?: boolean;
9
+ }
10
+ declare function Card({ variant, interactive, className, children, ...props }: CardProps): react.JSX.Element;
11
+ interface CardHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
12
+ title?: ReactNode;
13
+ description?: ReactNode;
14
+ action?: ReactNode;
15
+ badge?: ReactNode;
16
+ /** Ícone exibido à esquerda do título num container 40×40 bg-surface-raised. */
17
+ icon?: ReactNode;
18
+ }
19
+ declare function CardHeader({ title, description, action, badge, icon, className, children, ...props }: CardHeaderProps): react.JSX.Element;
20
+ declare function CardTitle({ className, children, ...props }: React.HTMLAttributes<HTMLHeadingElement>): react.JSX.Element;
21
+ interface CardBodyProps extends React.HTMLAttributes<HTMLDivElement> {
22
+ noPadding?: boolean;
23
+ }
24
+ declare function CardBody({ noPadding, className, children, ...props }: CardBodyProps): react.JSX.Element;
25
+ declare function CardFooter({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>): react.JSX.Element;
26
+
27
+ export { Card, CardBody, type CardBodyProps, CardFooter, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardVariant };
@@ -0,0 +1,52 @@
1
+ import {
2
+ __objRest,
3
+ __spreadValues
4
+ } from "../chunk-ORMEWXMH.js";
5
+ const VARIANT_CLASS = {
6
+ outlined: "border border-stroke-default bg-surface-default",
7
+ elevated: "border border-transparent bg-surface-default shadow-sm",
8
+ filled: "border border-transparent bg-surface-raised",
9
+ flat: "border-0 bg-transparent shadow-none",
10
+ invert: "border border-transparent bg-surface-invert text-fg-inverse"
11
+ };
12
+ function Card(_a) {
13
+ var _b = _a, { variant = "elevated", interactive = false, className = "", children } = _b, props = __objRest(_b, ["variant", "interactive", "className", "children"]);
14
+ return /* @__PURE__ */ React.createElement(
15
+ "div",
16
+ __spreadValues({
17
+ className: [
18
+ "rounded-(--radius-card) overflow-hidden",
19
+ VARIANT_CLASS[variant],
20
+ interactive && "transition-shadow hover:shadow-md cursor-pointer",
21
+ className
22
+ ].filter(Boolean).join(" ")
23
+ }, props),
24
+ children
25
+ );
26
+ }
27
+ function CardHeader(_c) {
28
+ var _d = _c, { title, description, action, badge, icon, className = "", children } = _d, props = __objRest(_d, ["title", "description", "action", "badge", "icon", "className", "children"]);
29
+ if (children) {
30
+ return /* @__PURE__ */ React.createElement("div", __spreadValues({ className: ["ds-card-header flex items-center justify-between gap-4 px-4 py-4", className].join(" ") }, props), children);
31
+ }
32
+ return /* @__PURE__ */ React.createElement("div", __spreadValues({ className: ["ds-card-header flex items-start justify-between gap-4 px-4 py-4", className].join(" ") }, props), /* @__PURE__ */ React.createElement("div", { className: "flex items-start gap-3 min-w-0 flex-1" }, icon && /* @__PURE__ */ React.createElement("div", { className: "shrink-0 size-10 rounded-(--radius-card) bg-surface-raised flex items-center justify-center text-fg-secondary" }, icon), /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement("h3", { className: "text-label font-semibold text-fg-primary leading-snug" }, title), badge), description && /* @__PURE__ */ React.createElement("p", { className: "mt-0.5 text-caption text-fg-muted" }, description))), action && /* @__PURE__ */ React.createElement("div", { className: "shrink-0" }, action));
33
+ }
34
+ function CardTitle(_e) {
35
+ var _f = _e, { className = "", children } = _f, props = __objRest(_f, ["className", "children"]);
36
+ return /* @__PURE__ */ React.createElement("h3", __spreadValues({ className: ["text-body font-semibold text-fg-primary", className].join(" ") }, props), children);
37
+ }
38
+ function CardBody(_g) {
39
+ var _h = _g, { noPadding, className = "", children } = _h, props = __objRest(_h, ["noPadding", "className", "children"]);
40
+ return /* @__PURE__ */ React.createElement("div", __spreadValues({ className: [noPadding ? "" : "px-4 pb-4 pt-4 [.ds-card-header+&]:pt-0", className].join(" ").trim() }, props), children);
41
+ }
42
+ function CardFooter(_i) {
43
+ var _j = _i, { className = "", children } = _j, props = __objRest(_j, ["className", "children"]);
44
+ return /* @__PURE__ */ React.createElement("div", __spreadValues({ className: ["flex items-center justify-end gap-3 px-4 pt-2 pb-4", className].join(" ") }, props), children);
45
+ }
46
+ export {
47
+ Card,
48
+ CardBody,
49
+ CardFooter,
50
+ CardHeader,
51
+ CardTitle
52
+ };