@open-mercato/ui 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2874.77704bccbd

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 (246) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +204 -121
  3. package/dist/backend/AppShell.js +25 -28
  4. package/dist/backend/AppShell.js.map +2 -2
  5. package/dist/backend/ContextHelp.js +1 -1
  6. package/dist/backend/ContextHelp.js.map +1 -1
  7. package/dist/backend/CrudForm.js +12 -15
  8. package/dist/backend/CrudForm.js.map +2 -2
  9. package/dist/backend/DataTable.js +9 -10
  10. package/dist/backend/DataTable.js.map +2 -2
  11. package/dist/backend/FilterBar.js +6 -8
  12. package/dist/backend/FilterBar.js.map +2 -2
  13. package/dist/backend/FilterOverlay.js +10 -10
  14. package/dist/backend/FilterOverlay.js.map +2 -2
  15. package/dist/backend/FlashMessages.js +1 -1
  16. package/dist/backend/FlashMessages.js.map +2 -2
  17. package/dist/backend/JsonBuilder.js +6 -6
  18. package/dist/backend/JsonBuilder.js.map +1 -1
  19. package/dist/backend/NextStepCallout.js +1 -1
  20. package/dist/backend/NextStepCallout.js.map +1 -1
  21. package/dist/backend/PerspectiveSidebar.js +2 -2
  22. package/dist/backend/PerspectiveSidebar.js.map +2 -2
  23. package/dist/backend/ProfileDropdown.js +1 -1
  24. package/dist/backend/ProfileDropdown.js.map +1 -1
  25. package/dist/backend/RowActions.js +1 -1
  26. package/dist/backend/RowActions.js.map +1 -1
  27. package/dist/backend/UserMenu.js +2 -2
  28. package/dist/backend/UserMenu.js.map +1 -1
  29. package/dist/backend/WebhookSetupGuide.js +11 -11
  30. package/dist/backend/WebhookSetupGuide.js.map +2 -2
  31. package/dist/backend/charts/KpiCard.js +3 -3
  32. package/dist/backend/charts/KpiCard.js.map +1 -1
  33. package/dist/backend/columns/ColumnChooserPanel.js +1 -1
  34. package/dist/backend/columns/ColumnChooserPanel.js.map +2 -2
  35. package/dist/backend/custom-fields/FieldDefinitionsEditor.js +3 -3
  36. package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +2 -2
  37. package/dist/backend/dashboard/DashboardScreen.js +1 -1
  38. package/dist/backend/dashboard/DashboardScreen.js.map +1 -1
  39. package/dist/backend/date-range/DateRangeSelect.js +1 -1
  40. package/dist/backend/date-range/DateRangeSelect.js.map +1 -1
  41. package/dist/backend/date-range/InlineDateRangeSelect.js +1 -1
  42. package/dist/backend/date-range/InlineDateRangeSelect.js.map +1 -1
  43. package/dist/backend/detail/AccessDeniedMessage.js +1 -1
  44. package/dist/backend/detail/AccessDeniedMessage.js.map +1 -1
  45. package/dist/backend/detail/ActivitiesSection.js +5 -5
  46. package/dist/backend/detail/ActivitiesSection.js.map +1 -1
  47. package/dist/backend/detail/AddressEditor.js +3 -3
  48. package/dist/backend/detail/AddressEditor.js.map +2 -2
  49. package/dist/backend/detail/AddressTiles.js +3 -3
  50. package/dist/backend/detail/AddressTiles.js.map +2 -2
  51. package/dist/backend/detail/AttachmentMetadataDialog.js +1 -1
  52. package/dist/backend/detail/AttachmentMetadataDialog.js.map +1 -1
  53. package/dist/backend/detail/CustomDataSection.js +1 -1
  54. package/dist/backend/detail/CustomDataSection.js.map +1 -1
  55. package/dist/backend/detail/InlineEditors.js +5 -5
  56. package/dist/backend/detail/InlineEditors.js.map +1 -1
  57. package/dist/backend/detail/NotesSection.js +6 -6
  58. package/dist/backend/detail/NotesSection.js.map +1 -1
  59. package/dist/backend/detail/TagsSection.js +1 -1
  60. package/dist/backend/detail/TagsSection.js.map +1 -1
  61. package/dist/backend/devtools/UmesDevToolsPanel.js +6 -6
  62. package/dist/backend/devtools/UmesDevToolsPanel.js.map +2 -2
  63. package/dist/backend/devtools/components/ConflictWarnings.js +3 -3
  64. package/dist/backend/devtools/components/ConflictWarnings.js.map +2 -2
  65. package/dist/backend/devtools/components/EnricherTiming.js +2 -2
  66. package/dist/backend/devtools/components/EnricherTiming.js.map +2 -2
  67. package/dist/backend/devtools/components/EventFlow.js +5 -5
  68. package/dist/backend/devtools/components/EventFlow.js.map +2 -2
  69. package/dist/backend/devtools/components/ExtensionPointList.js +3 -3
  70. package/dist/backend/devtools/components/ExtensionPointList.js.map +2 -2
  71. package/dist/backend/devtools/components/InterceptorActivity.js +6 -6
  72. package/dist/backend/devtools/components/InterceptorActivity.js.map +2 -2
  73. package/dist/backend/forms/ActionsDropdown.js +1 -1
  74. package/dist/backend/forms/ActionsDropdown.js.map +1 -1
  75. package/dist/backend/forms/FormActionButtons.js +2 -3
  76. package/dist/backend/forms/FormActionButtons.js.map +2 -2
  77. package/dist/backend/indexes/PartialIndexBanner.js +8 -8
  78. package/dist/backend/indexes/PartialIndexBanner.js.map +2 -2
  79. package/dist/backend/inputs/ComboboxInput.js +1 -1
  80. package/dist/backend/inputs/ComboboxInput.js.map +2 -2
  81. package/dist/backend/inputs/DatePicker.js +3 -3
  82. package/dist/backend/inputs/DatePicker.js.map +1 -1
  83. package/dist/backend/inputs/DateTimePicker.js +3 -3
  84. package/dist/backend/inputs/DateTimePicker.js.map +1 -1
  85. package/dist/backend/inputs/EventSelect.js +1 -1
  86. package/dist/backend/inputs/EventSelect.js.map +2 -2
  87. package/dist/backend/inputs/LookupSelect.js +1 -1
  88. package/dist/backend/inputs/LookupSelect.js.map +1 -1
  89. package/dist/backend/inputs/SwitchableMarkdownInput.js +1 -1
  90. package/dist/backend/inputs/SwitchableMarkdownInput.js.map +1 -1
  91. package/dist/backend/inputs/TagsInput.js +2 -2
  92. package/dist/backend/inputs/TagsInput.js.map +2 -2
  93. package/dist/backend/inputs/TimeInput.js +1 -1
  94. package/dist/backend/inputs/TimeInput.js.map +1 -1
  95. package/dist/backend/inputs/TimePicker.js +3 -3
  96. package/dist/backend/inputs/TimePicker.js.map +1 -1
  97. package/dist/backend/messages/MessageObjectDetail.js +1 -1
  98. package/dist/backend/messages/MessageObjectDetail.js.map +1 -1
  99. package/dist/backend/messages/MessageObjectPreview.js +1 -1
  100. package/dist/backend/messages/MessageObjectPreview.js.map +1 -1
  101. package/dist/backend/messages/message-compose-form-groups.js +3 -3
  102. package/dist/backend/messages/message-compose-form-groups.js.map +1 -1
  103. package/dist/backend/notifications/NotificationCountBadge.js +1 -1
  104. package/dist/backend/notifications/NotificationCountBadge.js.map +2 -2
  105. package/dist/backend/notifications/NotificationPanel.js +3 -3
  106. package/dist/backend/notifications/NotificationPanel.js.map +1 -1
  107. package/dist/backend/progress/ProgressTopBar.js +4 -4
  108. package/dist/backend/progress/ProgressTopBar.js.map +2 -2
  109. package/dist/backend/schedule/ScheduleAgenda.js +1 -1
  110. package/dist/backend/schedule/ScheduleAgenda.js.map +2 -2
  111. package/dist/backend/schedule/ScheduleCalendar.js +1 -1
  112. package/dist/backend/schedule/ScheduleCalendar.js.map +1 -1
  113. package/dist/backend/schedule/ScheduleGrid.js +1 -1
  114. package/dist/backend/schedule/ScheduleGrid.js.map +2 -2
  115. package/dist/backend/version-history/VersionHistoryPanel.js +4 -4
  116. package/dist/backend/version-history/VersionHistoryPanel.js.map +2 -2
  117. package/dist/frontend/AuthFooter.js +1 -1
  118. package/dist/frontend/AuthFooter.js.map +1 -1
  119. package/dist/frontend/LanguageSwitcher.js +1 -1
  120. package/dist/frontend/LanguageSwitcher.js.map +1 -1
  121. package/dist/frontend/Layout.js +2 -2
  122. package/dist/frontend/Layout.js.map +1 -1
  123. package/dist/index.js +5 -0
  124. package/dist/index.js.map +2 -2
  125. package/dist/portal/PortalShell.js +15 -15
  126. package/dist/portal/PortalShell.js.map +2 -2
  127. package/dist/portal/components/PortalCard.js +2 -2
  128. package/dist/portal/components/PortalCard.js.map +2 -2
  129. package/dist/portal/components/PortalNotificationPanel.js +18 -18
  130. package/dist/portal/components/PortalNotificationPanel.js.map +2 -2
  131. package/dist/portal/components/PortalPageHeader.js +1 -1
  132. package/dist/portal/components/PortalPageHeader.js.map +2 -2
  133. package/dist/primitives/avatar.js +11 -1
  134. package/dist/primitives/avatar.js.map +2 -2
  135. package/dist/primitives/badge.js +1 -1
  136. package/dist/primitives/badge.js.map +1 -1
  137. package/dist/primitives/button.js +9 -5
  138. package/dist/primitives/button.js.map +2 -2
  139. package/dist/primitives/calendar.js +1 -1
  140. package/dist/primitives/calendar.js.map +1 -1
  141. package/dist/primitives/checkbox-field.js +63 -0
  142. package/dist/primitives/checkbox-field.js.map +7 -0
  143. package/dist/primitives/checkbox.js +31 -17
  144. package/dist/primitives/checkbox.js.map +2 -2
  145. package/dist/primitives/dialog.js +4 -4
  146. package/dist/primitives/dialog.js.map +1 -1
  147. package/dist/primitives/fancy-button.js +72 -0
  148. package/dist/primitives/fancy-button.js.map +7 -0
  149. package/dist/primitives/icon-button.js +20 -4
  150. package/dist/primitives/icon-button.js.map +2 -2
  151. package/dist/primitives/kbd.js +27 -0
  152. package/dist/primitives/kbd.js.map +7 -0
  153. package/dist/primitives/link-button.js +56 -0
  154. package/dist/primitives/link-button.js.map +7 -0
  155. package/dist/primitives/popover.js +1 -1
  156. package/dist/primitives/popover.js.map +1 -1
  157. package/dist/primitives/social-button.js +61 -0
  158. package/dist/primitives/social-button.js.map +7 -0
  159. package/dist/primitives/tabs.js +1 -1
  160. package/dist/primitives/tabs.js.map +1 -1
  161. package/dist/primitives/tag.js +45 -0
  162. package/dist/primitives/tag.js.map +7 -0
  163. package/dist/primitives/tooltip.js +1 -1
  164. package/dist/primitives/tooltip.js.map +1 -1
  165. package/package.json +3 -3
  166. package/src/backend/AppShell.tsx +25 -28
  167. package/src/backend/ContextHelp.tsx +1 -1
  168. package/src/backend/CrudForm.tsx +12 -15
  169. package/src/backend/DataTable.tsx +9 -10
  170. package/src/backend/FilterBar.tsx +6 -5
  171. package/src/backend/FilterOverlay.tsx +10 -10
  172. package/src/backend/FlashMessages.tsx +1 -1
  173. package/src/backend/JsonBuilder.tsx +6 -6
  174. package/src/backend/NextStepCallout.tsx +1 -1
  175. package/src/backend/PerspectiveSidebar.tsx +2 -2
  176. package/src/backend/ProfileDropdown.tsx +1 -1
  177. package/src/backend/RowActions.tsx +1 -1
  178. package/src/backend/UserMenu.tsx +2 -2
  179. package/src/backend/WebhookSetupGuide.tsx +11 -11
  180. package/src/backend/charts/KpiCard.tsx +3 -3
  181. package/src/backend/columns/ColumnChooserPanel.tsx +1 -1
  182. package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +3 -3
  183. package/src/backend/dashboard/DashboardScreen.tsx +1 -1
  184. package/src/backend/date-range/DateRangeSelect.tsx +1 -1
  185. package/src/backend/date-range/InlineDateRangeSelect.tsx +1 -1
  186. package/src/backend/detail/AccessDeniedMessage.tsx +1 -1
  187. package/src/backend/detail/ActivitiesSection.tsx +5 -5
  188. package/src/backend/detail/AddressEditor.tsx +3 -3
  189. package/src/backend/detail/AddressTiles.tsx +3 -3
  190. package/src/backend/detail/AttachmentMetadataDialog.tsx +1 -1
  191. package/src/backend/detail/CustomDataSection.tsx +1 -1
  192. package/src/backend/detail/InlineEditors.tsx +5 -5
  193. package/src/backend/detail/NotesSection.tsx +6 -6
  194. package/src/backend/detail/TagsSection.tsx +1 -1
  195. package/src/backend/devtools/UmesDevToolsPanel.tsx +6 -6
  196. package/src/backend/devtools/components/ConflictWarnings.tsx +4 -4
  197. package/src/backend/devtools/components/EnricherTiming.tsx +2 -2
  198. package/src/backend/devtools/components/EventFlow.tsx +5 -5
  199. package/src/backend/devtools/components/ExtensionPointList.tsx +3 -3
  200. package/src/backend/devtools/components/InterceptorActivity.tsx +6 -6
  201. package/src/backend/forms/ActionsDropdown.tsx +1 -1
  202. package/src/backend/forms/FormActionButtons.tsx +4 -5
  203. package/src/backend/indexes/PartialIndexBanner.tsx +8 -8
  204. package/src/backend/inputs/ComboboxInput.tsx +1 -1
  205. package/src/backend/inputs/DatePicker.tsx +3 -3
  206. package/src/backend/inputs/DateTimePicker.tsx +3 -3
  207. package/src/backend/inputs/EventSelect.tsx +1 -1
  208. package/src/backend/inputs/LookupSelect.tsx +1 -1
  209. package/src/backend/inputs/SwitchableMarkdownInput.tsx +1 -1
  210. package/src/backend/inputs/TagsInput.tsx +2 -2
  211. package/src/backend/inputs/TimeInput.tsx +1 -1
  212. package/src/backend/inputs/TimePicker.tsx +3 -3
  213. package/src/backend/messages/MessageObjectDetail.tsx +1 -1
  214. package/src/backend/messages/MessageObjectPreview.tsx +1 -1
  215. package/src/backend/messages/message-compose-form-groups.tsx +3 -3
  216. package/src/backend/notifications/NotificationCountBadge.tsx +1 -1
  217. package/src/backend/notifications/NotificationPanel.tsx +3 -3
  218. package/src/backend/progress/ProgressTopBar.tsx +4 -4
  219. package/src/backend/schedule/ScheduleAgenda.tsx +1 -1
  220. package/src/backend/schedule/ScheduleCalendar.tsx +1 -1
  221. package/src/backend/schedule/ScheduleGrid.tsx +1 -1
  222. package/src/backend/version-history/VersionHistoryPanel.tsx +4 -4
  223. package/src/frontend/AuthFooter.tsx +1 -1
  224. package/src/frontend/LanguageSwitcher.tsx +1 -1
  225. package/src/frontend/Layout.tsx +2 -2
  226. package/src/index.ts +6 -1
  227. package/src/portal/PortalShell.tsx +15 -15
  228. package/src/portal/components/PortalCard.tsx +2 -2
  229. package/src/portal/components/PortalNotificationPanel.tsx +18 -18
  230. package/src/portal/components/PortalPageHeader.tsx +1 -1
  231. package/src/primitives/avatar.tsx +22 -0
  232. package/src/primitives/badge.tsx +1 -1
  233. package/src/primitives/button.tsx +12 -5
  234. package/src/primitives/calendar.tsx +1 -1
  235. package/src/primitives/checkbox-field.tsx +85 -0
  236. package/src/primitives/checkbox.tsx +44 -18
  237. package/src/primitives/dialog.tsx +4 -4
  238. package/src/primitives/fancy-button.tsx +89 -0
  239. package/src/primitives/icon-button.tsx +19 -2
  240. package/src/primitives/kbd.tsx +38 -0
  241. package/src/primitives/link-button.tsx +55 -0
  242. package/src/primitives/popover.tsx +1 -1
  243. package/src/primitives/social-button.tsx +80 -0
  244. package/src/primitives/tabs.tsx +1 -1
  245. package/src/primitives/tag.tsx +66 -0
  246. package/src/primitives/tooltip.tsx +1 -1
@@ -13,10 +13,10 @@ function CheckIcon({ className }) {
13
13
  return /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) });
14
14
  }
15
15
  const SEVERITY_STYLES = {
16
- info: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
17
- success: "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",
18
- warning: "bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400",
19
- error: "bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400"
16
+ info: "bg-status-info-bg text-status-info-text",
17
+ success: "bg-status-success-bg text-status-success-text",
18
+ warning: "bg-status-warning-bg text-status-warning-text",
19
+ error: "bg-status-error-bg text-status-error-text"
20
20
  };
21
21
  function PortalNotificationPanel({
22
22
  open,
@@ -51,17 +51,17 @@ function PortalNotificationPanel({
51
51
  return t("portal.notifications.daysAgo", "{d}d ago", { d: days });
52
52
  };
53
53
  return /* @__PURE__ */ jsxs(Fragment, { children: [
54
- /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-50 bg-black/20 backdrop-blur-sm", onClick: onClose }),
54
+ /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-modal bg-black/20 backdrop-blur-sm", onClick: onClose }),
55
55
  /* @__PURE__ */ jsxs(
56
56
  "div",
57
57
  {
58
58
  ref: panelRef,
59
- className: "fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-2xl",
59
+ className: "fixed right-0 top-0 z-modal flex h-full w-full max-w-md flex-col border-l bg-background shadow-2xl",
60
60
  children: [
61
61
  /* @__PURE__ */ jsxs("div", { className: "flex h-16 items-center justify-between border-b px-5", children: [
62
62
  /* @__PURE__ */ jsxs("div", { children: [
63
- /* @__PURE__ */ jsx("h2", { className: "text-[15px] font-semibold", children: t("portal.notifications.title", "Notifications") }),
64
- unreadCount > 0 ? /* @__PURE__ */ jsx("p", { className: "text-[11px] text-muted-foreground", children: t("portal.notifications.unreadSummary", "{count} unread", { count: unreadCount }) }) : null
63
+ /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold", children: t("portal.notifications.title", "Notifications") }),
64
+ unreadCount > 0 ? /* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: t("portal.notifications.unreadSummary", "{count} unread", { count: unreadCount }) }) : null
65
65
  ] }),
66
66
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
67
67
  unreadCount > 0 ? /* @__PURE__ */ jsxs(
@@ -70,7 +70,7 @@ function PortalNotificationPanel({
70
70
  type: "button",
71
71
  variant: "ghost",
72
72
  size: "sm",
73
- className: "text-[12px] text-muted-foreground",
73
+ className: "text-xs text-muted-foreground",
74
74
  onClick: () => onMarkAllRead(),
75
75
  children: [
76
76
  /* @__PURE__ */ jsx(CheckIcon, { className: "mr-1 size-3.5" }),
@@ -86,10 +86,10 @@ function PortalNotificationPanel({
86
86
  {
87
87
  type: "button",
88
88
  onClick: () => setTab(tabId),
89
- className: `border-b-2 px-3 py-2.5 text-[13px] font-medium transition-colors ${tab === tabId ? "border-foreground text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"}`,
89
+ className: `border-b-2 px-3 py-2.5 text-sm font-medium transition-colors ${tab === tabId ? "border-foreground text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"}`,
90
90
  children: [
91
91
  tabId === "all" ? t("portal.notifications.tab.all", "All") : t("portal.notifications.tab.unread", "Unread"),
92
- tabId === "unread" && unreadCount > 0 ? /* @__PURE__ */ jsx("span", { className: "ml-1.5 inline-flex size-5 items-center justify-center rounded-full bg-foreground text-[10px] font-bold text-background", children: unreadCount }) : null
92
+ tabId === "unread" && unreadCount > 0 ? /* @__PURE__ */ jsx("span", { className: "ml-1.5 inline-flex size-5 items-center justify-center rounded-full bg-foreground text-overline font-bold text-background", children: unreadCount }) : null
93
93
  ]
94
94
  },
95
95
  tabId
@@ -99,13 +99,13 @@ function PortalNotificationPanel({
99
99
  {
100
100
  className: `flex gap-3 border-b px-5 py-4 transition-colors ${notification.status === "unread" ? "bg-muted/30" : ""}`,
101
101
  children: [
102
- /* @__PURE__ */ jsx("div", { className: `mt-1 flex size-8 shrink-0 items-center justify-center rounded-lg text-[10px] font-bold ${SEVERITY_STYLES[notification.severity] ?? SEVERITY_STYLES.info}`, children: notification.severity.charAt(0).toUpperCase() }),
102
+ /* @__PURE__ */ jsx("div", { className: `mt-1 flex size-8 shrink-0 items-center justify-center rounded-lg text-overline font-bold ${SEVERITY_STYLES[notification.severity] ?? SEVERITY_STYLES.info}`, children: notification.severity.charAt(0).toUpperCase() }),
103
103
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
104
104
  /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
105
- /* @__PURE__ */ jsx("p", { className: "text-[13px] font-medium leading-snug", children: notification.title }),
106
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[11px] text-muted-foreground/60", children: formatTime(notification.createdAt) })
105
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium leading-snug", children: notification.title }),
106
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-overline text-muted-foreground/60", children: formatTime(notification.createdAt) })
107
107
  ] }),
108
- notification.body ? /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-[12px] leading-relaxed text-muted-foreground", children: notification.body }) : null,
108
+ notification.body ? /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs leading-relaxed text-muted-foreground", children: notification.body }) : null,
109
109
  /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
110
110
  notification.status === "unread" ? /* @__PURE__ */ jsx(
111
111
  Button,
@@ -113,7 +113,7 @@ function PortalNotificationPanel({
113
113
  type: "button",
114
114
  variant: "ghost",
115
115
  size: "sm",
116
- className: "h-auto px-2 py-1 text-[11px] text-muted-foreground",
116
+ className: "h-auto px-2 py-1 text-overline text-muted-foreground",
117
117
  onClick: () => onMarkAsRead(notification.id),
118
118
  children: t("portal.notifications.markRead", "Mark read")
119
119
  }
@@ -124,7 +124,7 @@ function PortalNotificationPanel({
124
124
  type: "button",
125
125
  variant: "ghost",
126
126
  size: "sm",
127
- className: "h-auto px-2 py-1 text-[11px] text-muted-foreground",
127
+ className: "h-auto px-2 py-1 text-overline text-muted-foreground",
128
128
  onClick: () => onDismiss(notification.id),
129
129
  children: t("portal.notifications.dismiss", "Dismiss")
130
130
  }
@@ -133,7 +133,7 @@ function PortalNotificationPanel({
133
133
  "a",
134
134
  {
135
135
  href: notification.linkHref,
136
- className: "ml-auto text-[11px] font-medium text-foreground underline underline-offset-2 hover:opacity-80",
136
+ className: "ml-auto text-overline font-medium text-foreground underline underline-offset-2 hover:opacity-80",
137
137
  onClick: () => {
138
138
  if (notification.status === "unread") onMarkAsRead(notification.id);
139
139
  onClose();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/portal/components/PortalNotificationPanel.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { Button } from '../../primitives/button'\nimport { IconButton } from '../../primitives/icon-button'\nimport type { NotificationDto } from '@open-mercato/shared/modules/notifications/types'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\n\nfunction XIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\nconst SEVERITY_STYLES: Record<string, string> = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n error: 'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400',\n}\n\ntype Tab = 'all' | 'unread'\n\ntype PortalNotificationPanelProps = {\n open: boolean\n onClose: () => void\n notifications: NotificationDto[]\n unreadCount: number\n onMarkAsRead: (id: string) => Promise<void>\n onDismiss: (id: string) => Promise<void>\n onMarkAllRead: () => Promise<void>\n t: TranslateFn\n}\n\nexport function PortalNotificationPanel({\n open,\n onClose,\n notifications,\n unreadCount,\n onMarkAsRead,\n onDismiss,\n onMarkAllRead,\n t,\n}: PortalNotificationPanelProps) {\n const [tab, setTab] = React.useState<Tab>('all')\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n // Close on Escape\n React.useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open, onClose])\n\n if (!open) return null\n\n const filtered = tab === 'unread'\n ? notifications.filter((n) => n.status === 'unread')\n : notifications\n\n const formatTime = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime()\n const mins = Math.floor(diff / 60000)\n if (mins < 1) return t('portal.notifications.justNow', 'Just now')\n if (mins < 60) return t('portal.notifications.minutesAgo', '{m}m ago', { m: mins })\n const hours = Math.floor(mins / 60)\n if (hours < 24) return t('portal.notifications.hoursAgo', '{h}h ago', { h: hours })\n const days = Math.floor(hours / 24)\n return t('portal.notifications.daysAgo', '{d}d ago', { d: days })\n }\n\n return (\n <>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-50 bg-black/20 backdrop-blur-sm\" onClick={onClose} />\n\n {/* Panel */}\n <div\n ref={panelRef}\n className=\"fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-2xl\"\n >\n {/* Header */}\n <div className=\"flex h-16 items-center justify-between border-b px-5\">\n <div>\n <h2 className=\"text-[15px] font-semibold\">{t('portal.notifications.title', 'Notifications')}</h2>\n {unreadCount > 0 ? (\n <p className=\"text-[11px] text-muted-foreground\">\n {t('portal.notifications.unreadSummary', '{count} unread', { count: unreadCount })}\n </p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n {unreadCount > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-[12px] text-muted-foreground\"\n onClick={() => onMarkAllRead()}\n >\n <CheckIcon className=\"mr-1 size-3.5\" />\n {t('portal.notifications.markAllRead', 'Mark all read')}\n </Button>\n ) : null}\n <IconButton variant=\"ghost\" size=\"sm\" type=\"button\" onClick={onClose} aria-label=\"Close\">\n <XIcon className=\"size-4\" />\n </IconButton>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex gap-0 border-b px-5\">\n {(['all', 'unread'] as Tab[]).map((tabId) => (\n <button\n key={tabId}\n type=\"button\"\n onClick={() => setTab(tabId)}\n className={`border-b-2 px-3 py-2.5 text-[13px] font-medium transition-colors ${\n tab === tabId\n ? 'border-foreground text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {tabId === 'all'\n ? t('portal.notifications.tab.all', 'All')\n : t('portal.notifications.tab.unread', 'Unread')}\n {tabId === 'unread' && unreadCount > 0 ? (\n <span className=\"ml-1.5 inline-flex size-5 items-center justify-center rounded-full bg-foreground text-[10px] font-bold text-background\">\n {unreadCount}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n\n {/* List */}\n <div className=\"flex-1 overflow-y-auto\">\n {filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 py-16 text-center\">\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tab === 'unread'\n ? t('portal.notifications.emptyUnread', 'All caught up!')\n : t('portal.notifications.empty', 'No notifications yet')}\n </p>\n </div>\n ) : (\n filtered.map((notification) => (\n <div\n key={notification.id}\n className={`flex gap-3 border-b px-5 py-4 transition-colors ${\n notification.status === 'unread' ? 'bg-muted/30' : ''\n }`}\n >\n {/* Severity dot */}\n <div className={`mt-1 flex size-8 shrink-0 items-center justify-center rounded-lg text-[10px] font-bold ${SEVERITY_STYLES[notification.severity] ?? SEVERITY_STYLES.info}`}>\n {notification.severity.charAt(0).toUpperCase()}\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-[13px] font-medium leading-snug\">\n {notification.title}\n </p>\n <span className=\"shrink-0 text-[11px] text-muted-foreground/60\">\n {formatTime(notification.createdAt)}\n </span>\n </div>\n {notification.body ? (\n <p className=\"mt-0.5 text-[12px] leading-relaxed text-muted-foreground\">\n {notification.body}\n </p>\n ) : null}\n\n {/* Actions */}\n <div className=\"mt-2 flex items-center gap-2\">\n {notification.status === 'unread' ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-1 text-[11px] text-muted-foreground\"\n onClick={() => onMarkAsRead(notification.id)}\n >\n {t('portal.notifications.markRead', 'Mark read')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-1 text-[11px] text-muted-foreground\"\n onClick={() => onDismiss(notification.id)}\n >\n {t('portal.notifications.dismiss', 'Dismiss')}\n </Button>\n {notification.linkHref ? (\n <a\n href={notification.linkHref}\n className=\"ml-auto text-[11px] font-medium text-foreground underline underline-offset-2 hover:opacity-80\"\n onClick={() => {\n if (notification.status === 'unread') onMarkAsRead(notification.id)\n onClose()\n }}\n >\n {t('portal.notifications.view', 'View')}\n </a>\n ) : null}\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { Button } from '../../primitives/button'\nimport { IconButton } from '../../primitives/icon-button'\nimport type { NotificationDto } from '@open-mercato/shared/modules/notifications/types'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\n\nfunction XIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\nconst SEVERITY_STYLES: Record<string, string> = {\n info: 'bg-status-info-bg text-status-info-text',\n success: 'bg-status-success-bg text-status-success-text',\n warning: 'bg-status-warning-bg text-status-warning-text',\n error: 'bg-status-error-bg text-status-error-text',\n}\n\ntype Tab = 'all' | 'unread'\n\ntype PortalNotificationPanelProps = {\n open: boolean\n onClose: () => void\n notifications: NotificationDto[]\n unreadCount: number\n onMarkAsRead: (id: string) => Promise<void>\n onDismiss: (id: string) => Promise<void>\n onMarkAllRead: () => Promise<void>\n t: TranslateFn\n}\n\nexport function PortalNotificationPanel({\n open,\n onClose,\n notifications,\n unreadCount,\n onMarkAsRead,\n onDismiss,\n onMarkAllRead,\n t,\n}: PortalNotificationPanelProps) {\n const [tab, setTab] = React.useState<Tab>('all')\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n // Close on Escape\n React.useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open, onClose])\n\n if (!open) return null\n\n const filtered = tab === 'unread'\n ? notifications.filter((n) => n.status === 'unread')\n : notifications\n\n const formatTime = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime()\n const mins = Math.floor(diff / 60000)\n if (mins < 1) return t('portal.notifications.justNow', 'Just now')\n if (mins < 60) return t('portal.notifications.minutesAgo', '{m}m ago', { m: mins })\n const hours = Math.floor(mins / 60)\n if (hours < 24) return t('portal.notifications.hoursAgo', '{h}h ago', { h: hours })\n const days = Math.floor(hours / 24)\n return t('portal.notifications.daysAgo', '{d}d ago', { d: days })\n }\n\n return (\n <>\n {/* Backdrop */}\n <div className=\"fixed inset-0 z-modal bg-black/20 backdrop-blur-sm\" onClick={onClose} />\n\n {/* Panel */}\n <div\n ref={panelRef}\n className=\"fixed right-0 top-0 z-modal flex h-full w-full max-w-md flex-col border-l bg-background shadow-2xl\"\n >\n {/* Header */}\n <div className=\"flex h-16 items-center justify-between border-b px-5\">\n <div>\n <h2 className=\"text-base font-semibold\">{t('portal.notifications.title', 'Notifications')}</h2>\n {unreadCount > 0 ? (\n <p className=\"text-overline text-muted-foreground\">\n {t('portal.notifications.unreadSummary', '{count} unread', { count: unreadCount })}\n </p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n {unreadCount > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs text-muted-foreground\"\n onClick={() => onMarkAllRead()}\n >\n <CheckIcon className=\"mr-1 size-3.5\" />\n {t('portal.notifications.markAllRead', 'Mark all read')}\n </Button>\n ) : null}\n <IconButton variant=\"ghost\" size=\"sm\" type=\"button\" onClick={onClose} aria-label=\"Close\">\n <XIcon className=\"size-4\" />\n </IconButton>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex gap-0 border-b px-5\">\n {(['all', 'unread'] as Tab[]).map((tabId) => (\n <button\n key={tabId}\n type=\"button\"\n onClick={() => setTab(tabId)}\n className={`border-b-2 px-3 py-2.5 text-sm font-medium transition-colors ${\n tab === tabId\n ? 'border-foreground text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {tabId === 'all'\n ? t('portal.notifications.tab.all', 'All')\n : t('portal.notifications.tab.unread', 'Unread')}\n {tabId === 'unread' && unreadCount > 0 ? (\n <span className=\"ml-1.5 inline-flex size-5 items-center justify-center rounded-full bg-foreground text-overline font-bold text-background\">\n {unreadCount}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n\n {/* List */}\n <div className=\"flex-1 overflow-y-auto\">\n {filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 py-16 text-center\">\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tab === 'unread'\n ? t('portal.notifications.emptyUnread', 'All caught up!')\n : t('portal.notifications.empty', 'No notifications yet')}\n </p>\n </div>\n ) : (\n filtered.map((notification) => (\n <div\n key={notification.id}\n className={`flex gap-3 border-b px-5 py-4 transition-colors ${\n notification.status === 'unread' ? 'bg-muted/30' : ''\n }`}\n >\n {/* Severity dot */}\n <div className={`mt-1 flex size-8 shrink-0 items-center justify-center rounded-lg text-overline font-bold ${SEVERITY_STYLES[notification.severity] ?? SEVERITY_STYLES.info}`}>\n {notification.severity.charAt(0).toUpperCase()}\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-sm font-medium leading-snug\">\n {notification.title}\n </p>\n <span className=\"shrink-0 text-overline text-muted-foreground/60\">\n {formatTime(notification.createdAt)}\n </span>\n </div>\n {notification.body ? (\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n {notification.body}\n </p>\n ) : null}\n\n {/* Actions */}\n <div className=\"mt-2 flex items-center gap-2\">\n {notification.status === 'unread' ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-1 text-overline text-muted-foreground\"\n onClick={() => onMarkAsRead(notification.id)}\n >\n {t('portal.notifications.markRead', 'Mark read')}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-1 text-overline text-muted-foreground\"\n onClick={() => onDismiss(notification.id)}\n >\n {t('portal.notifications.dismiss', 'Dismiss')}\n </Button>\n {notification.linkHref ? (\n <a\n href={notification.linkHref}\n className=\"ml-auto text-overline font-medium text-foreground underline underline-offset-2 hover:opacity-80\"\n onClick={() => {\n if (notification.status === 'unread') onMarkAsRead(notification.id)\n onClose()\n }}\n >\n {t('portal.notifications.view', 'View')}\n </a>\n ) : null}\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  function PortalPageHeader({ title, description, label, action }) {
4
4
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4", children: [
5
5
  /* @__PURE__ */ jsxs("div", { children: [
6
- label ? /* @__PURE__ */ jsx("p", { className: "mb-1 text-[11px] font-medium uppercase tracking-widest text-muted-foreground/60", children: label }) : null,
6
+ label ? /* @__PURE__ */ jsx("p", { className: "mb-1 text-overline font-medium uppercase tracking-widest text-muted-foreground/60", children: label }) : null,
7
7
  /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
8
8
  description ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground sm:text-base", children: description }) : null
9
9
  ] }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/portal/components/PortalPageHeader.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport type { ReactNode } from 'react'\n\ntype PortalPageHeaderProps = {\n title: string\n description?: string\n label?: string\n action?: ReactNode\n}\n\n/**\n * Portal page header with large title and optional action slot.\n * Matches the landing page's hero section typography \u2014 large,\n * tight tracking, with muted description.\n */\nexport function PortalPageHeader({ title, description, label, action }: PortalPageHeaderProps) {\n return (\n <div className=\"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4\">\n <div>\n {label ? (\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-widest text-muted-foreground/60\">\n {label}\n </p>\n ) : null}\n <h1 className=\"text-2xl font-bold tracking-tight sm:text-3xl\">{title}</h1>\n {description ? (\n <p className=\"mt-1 text-sm text-muted-foreground sm:text-base\">{description}</p>\n ) : null}\n </div>\n {action ? <div className=\"mt-3 shrink-0 sm:mt-0\">{action}</div> : null}\n </div>\n )\n}\n"],
5
- "mappings": ";AAkBM,SAEI,KAFJ;AAHC,SAAS,iBAAiB,EAAE,OAAO,aAAa,OAAO,OAAO,GAA0B;AAC7F,SACE,qBAAC,SAAI,WAAU,+EACb;AAAA,yBAAC,SACE;AAAA,cACC,oBAAC,OAAE,WAAU,mFACV,iBACH,IACE;AAAA,MACJ,oBAAC,QAAG,WAAU,iDAAiD,iBAAM;AAAA,MACpE,cACC,oBAAC,OAAE,WAAU,mDAAmD,uBAAY,IAC1E;AAAA,OACN;AAAA,IACC,SAAS,oBAAC,SAAI,WAAU,yBAAyB,kBAAO,IAAS;AAAA,KACpE;AAEJ;",
4
+ "sourcesContent": ["\"use client\"\nimport type { ReactNode } from 'react'\n\ntype PortalPageHeaderProps = {\n title: string\n description?: string\n label?: string\n action?: ReactNode\n}\n\n/**\n * Portal page header with large title and optional action slot.\n * Matches the landing page's hero section typography \u2014 large,\n * tight tracking, with muted description.\n */\nexport function PortalPageHeader({ title, description, label, action }: PortalPageHeaderProps) {\n return (\n <div className=\"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4\">\n <div>\n {label ? (\n <p className=\"mb-1 text-overline font-medium uppercase tracking-widest text-muted-foreground/60\">\n {label}\n </p>\n ) : null}\n <h1 className=\"text-2xl font-bold tracking-tight sm:text-3xl\">{title}</h1>\n {description ? (\n <p className=\"mt-1 text-sm text-muted-foreground sm:text-base\">{description}</p>\n ) : null}\n </div>\n {action ? <div className=\"mt-3 shrink-0 sm:mt-0\">{action}</div> : null}\n </div>\n )\n}\n"],
5
+ "mappings": ";AAkBM,SAEI,KAFJ;AAHC,SAAS,iBAAiB,EAAE,OAAO,aAAa,OAAO,OAAO,GAA0B;AAC7F,SACE,qBAAC,SAAI,WAAU,+EACb;AAAA,yBAAC,SACE;AAAA,cACC,oBAAC,OAAE,WAAU,qFACV,iBACH,IACE;AAAA,MACJ,oBAAC,QAAG,WAAU,iDAAiD,iBAAM;AAAA,MACpE,cACC,oBAAC,OAAE,WAAU,mDAAmD,uBAAY,IAC1E;AAAA,OACN;AAAA,IACC,SAAS,oBAAC,SAAI,WAAU,yBAAyB,kBAAO,IAAS;AAAA,KACpE;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { cn } from "@open-mercato/shared/lib/utils";
@@ -52,8 +52,18 @@ const Avatar = React.forwardRef(
52
52
  }
53
53
  );
54
54
  Avatar.displayName = "Avatar";
55
+ function AvatarStack({ children, max = 4, size = "md", className }) {
56
+ const items = React.Children.toArray(children);
57
+ const visible = items.slice(0, max);
58
+ const overflow = items.length - max;
59
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center [&>*:not(:first-child)]:-ml-2 [&>*]:ring-2 [&>*]:ring-background", className), children: [
60
+ visible,
61
+ overflow > 0 && /* @__PURE__ */ jsx(Avatar, { label: `+${overflow}`, size, variant: "monochrome", className: "-ml-2" })
62
+ ] });
63
+ }
55
64
  export {
56
65
  Avatar,
66
+ AvatarStack,
57
67
  avatarVariants
58
68
  };
59
69
  //# sourceMappingURL=avatar.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/avatar.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst avatarVariants = cva(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full font-semibold select-none',\n {\n variants: {\n size: {\n xs: 'size-5 text-xs',\n sm: 'size-7 text-xs',\n md: 'size-9 text-sm',\n lg: 'size-12 text-base',\n xl: 'size-16 text-xl',\n },\n variant: {\n default: 'bg-primary/10 text-primary',\n monochrome: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n },\n)\n\nfunction computeInitials(label: string): string {\n const trimmed = label.trim()\n if (!trimmed.length) return '?'\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase()\n }\n const first = parts[0][0] ?? ''\n const last = parts[parts.length - 1][0] ?? ''\n return (first + last).toUpperCase()\n}\n\nexport type AvatarProps = {\n label: string\n src?: string | null\n icon?: React.ReactNode\n ariaLabel?: string\n} & VariantProps<typeof avatarVariants> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'role' | 'aria-label'>\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, label, src, icon, size, variant, ariaLabel, ...rest }, ref) => {\n const initials = React.useMemo(() => computeInitials(label), [label])\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={ariaLabel ?? label}\n className={cn(avatarVariants({ size, variant }), className)}\n {...rest}\n >\n {src ? (\n <img src={src} alt=\"\" className=\"size-full object-cover\" aria-hidden=\"true\" />\n ) : icon ? (\n <span aria-hidden=\"true\" className=\"flex items-center justify-center [&>svg]:size-[55%]\">\n {icon}\n </span>\n ) : (\n <span aria-hidden=\"true\">{initials}</span>\n )}\n </div>\n )\n },\n)\n\nAvatar.displayName = 'Avatar'\n\nexport { avatarVariants }\n"],
5
- "mappings": "AA2DU;AA3DV,YAAY,WAAW;AACvB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,QAAQ,QAAQ,MAAM,KAAK,EAAE,OAAO,OAAO;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA,EAC1C;AACA,QAAM,QAAQ,MAAM,CAAC,EAAE,CAAC,KAAK;AAC7B,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK;AAC3C,UAAQ,QAAQ,MAAM,YAAY;AACpC;AAUO,MAAM,SAAS,MAAM;AAAA,EAC1B,CAAC,EAAE,WAAW,OAAO,KAAK,MAAM,MAAM,SAAS,WAAW,GAAG,KAAK,GAAG,QAAQ;AAC3E,UAAM,WAAW,MAAM,QAAQ,MAAM,gBAAgB,KAAK,GAAG,CAAC,KAAK,CAAC;AACpE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,aAAa;AAAA,QACzB,WAAW,GAAG,eAAe,EAAE,MAAM,QAAQ,CAAC,GAAG,SAAS;AAAA,QACzD,GAAG;AAAA,QAEH,gBACC,oBAAC,SAAI,KAAU,KAAI,IAAG,WAAU,0BAAyB,eAAY,QAAO,IAC1E,OACF,oBAAC,UAAK,eAAY,QAAO,WAAU,uDAChC,gBACH,IAEA,oBAAC,UAAK,eAAY,QAAQ,oBAAS;AAAA;AAAA,IAEvC;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;",
4
+ "sourcesContent": ["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst avatarVariants = cva(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full font-semibold select-none',\n {\n variants: {\n size: {\n xs: 'size-5 text-xs',\n sm: 'size-7 text-xs',\n md: 'size-9 text-sm',\n lg: 'size-12 text-base',\n xl: 'size-16 text-xl',\n },\n variant: {\n default: 'bg-primary/10 text-primary',\n monochrome: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n },\n)\n\nfunction computeInitials(label: string): string {\n const trimmed = label.trim()\n if (!trimmed.length) return '?'\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase()\n }\n const first = parts[0][0] ?? ''\n const last = parts[parts.length - 1][0] ?? ''\n return (first + last).toUpperCase()\n}\n\nexport type AvatarProps = {\n label: string\n src?: string | null\n icon?: React.ReactNode\n ariaLabel?: string\n} & VariantProps<typeof avatarVariants> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'role' | 'aria-label'>\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, label, src, icon, size, variant, ariaLabel, ...rest }, ref) => {\n const initials = React.useMemo(() => computeInitials(label), [label])\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={ariaLabel ?? label}\n className={cn(avatarVariants({ size, variant }), className)}\n {...rest}\n >\n {src ? (\n <img src={src} alt=\"\" className=\"size-full object-cover\" aria-hidden=\"true\" />\n ) : icon ? (\n <span aria-hidden=\"true\" className=\"flex items-center justify-center [&>svg]:size-[55%]\">\n {icon}\n </span>\n ) : (\n <span aria-hidden=\"true\">{initials}</span>\n )}\n </div>\n )\n },\n)\n\nAvatar.displayName = 'Avatar'\n\nexport { avatarVariants }\n\nexport type AvatarStackProps = {\n children: React.ReactNode\n max?: number\n size?: VariantProps<typeof avatarVariants>['size']\n className?: string\n}\n\nexport function AvatarStack({ children, max = 4, size = 'md', className }: AvatarStackProps) {\n const items = React.Children.toArray(children)\n const visible = items.slice(0, max)\n const overflow = items.length - max\n\n return (\n <div className={cn('flex items-center [&>*:not(:first-child)]:-ml-2 [&>*]:ring-2 [&>*]:ring-background', className)}>\n {visible}\n {overflow > 0 && (\n <Avatar label={`+${overflow}`} size={size} variant=\"monochrome\" className=\"-ml-2\" />\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "AA2DU,cA8BN,YA9BM;AA3DV,YAAY,WAAW;AACvB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,QAAQ,QAAQ,MAAM,KAAK,EAAE,OAAO,OAAO;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA,EAC1C;AACA,QAAM,QAAQ,MAAM,CAAC,EAAE,CAAC,KAAK;AAC7B,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK;AAC3C,UAAQ,QAAQ,MAAM,YAAY;AACpC;AAUO,MAAM,SAAS,MAAM;AAAA,EAC1B,CAAC,EAAE,WAAW,OAAO,KAAK,MAAM,MAAM,SAAS,WAAW,GAAG,KAAK,GAAG,QAAQ;AAC3E,UAAM,WAAW,MAAM,QAAQ,MAAM,gBAAgB,KAAK,GAAG,CAAC,KAAK,CAAC;AACpE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,aAAa;AAAA,QACzB,WAAW,GAAG,eAAe,EAAE,MAAM,QAAQ,CAAC,GAAG,SAAS;AAAA,QACzD,GAAG;AAAA,QAEH,gBACC,oBAAC,SAAI,KAAU,KAAI,IAAG,WAAU,0BAAyB,eAAY,QAAO,IAC1E,OACF,oBAAC,UAAK,eAAY,QAAO,WAAU,uDAChC,gBACH,IAEA,oBAAC,UAAK,eAAY,QAAQ,oBAAS;AAAA;AAAA,IAEvC;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;AAWd,SAAS,YAAY,EAAE,UAAU,MAAM,GAAG,OAAO,MAAM,UAAU,GAAqB;AAC3F,QAAM,QAAQ,MAAM,SAAS,QAAQ,QAAQ;AAC7C,QAAM,UAAU,MAAM,MAAM,GAAG,GAAG;AAClC,QAAM,WAAW,MAAM,SAAS;AAEhC,SACE,qBAAC,SAAI,WAAW,GAAG,sFAAsF,SAAS,GAC/G;AAAA;AAAA,IACA,WAAW,KACV,oBAAC,UAAO,OAAO,IAAI,QAAQ,IAAI,MAAY,SAAQ,cAAa,WAAU,SAAQ;AAAA,KAEtF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@ import * as React from "react";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { cn } from "@open-mercato/shared/lib/utils";
5
5
  const badgeVariants = cva(
6
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
6
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
7
7
  {
8
8
  variants: {
9
9
  variant: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/badge.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n destructive: 'border-transparent bg-destructive text-destructive-foreground shadow',\n outline: 'text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n success: 'border-status-success-border bg-status-success-bg text-status-success-text',\n warning: 'border-status-warning-border bg-status-warning-bg text-status-warning-text',\n info: 'border-status-info-border bg-status-info-bg text-status-info-text',\n neutral: 'border-status-neutral-border bg-status-neutral-bg text-status-neutral-text',\n error: 'border-status-error-border bg-status-error-bg text-status-error-text',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport type BadgeProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof badgeVariants>\n\nexport const Badge = React.forwardRef<HTMLDivElement, BadgeProps>(({ className, variant, ...props }, ref) => (\n <div ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\n))\n\nBadge.displayName = 'Badge'\n\nexport { badgeVariants }\n"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n destructive: 'border-transparent bg-destructive text-destructive-foreground shadow',\n outline: 'text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n success: 'border-status-success-border bg-status-success-bg text-status-success-text',\n warning: 'border-status-warning-border bg-status-warning-bg text-status-warning-text',\n info: 'border-status-info-border bg-status-info-bg text-status-info-text',\n neutral: 'border-status-neutral-border bg-status-neutral-bg text-status-neutral-text',\n error: 'border-status-error-border bg-status-error-bg text-status-error-text',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport type BadgeProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof badgeVariants>\n\nexport const Badge = React.forwardRef<HTMLDivElement, BadgeProps>(({ className, variant, ...props }, ref) => (\n <div ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\n))\n\nBadge.displayName = 'Badge'\n\nexport { badgeVariants }\n"],
5
5
  "mappings": "AA8BE;AA9BF,YAAY,WAAW;AACvB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAIO,MAAM,QAAQ,MAAM,WAAuC,CAAC,EAAE,WAAW,SAAS,GAAG,MAAM,GAAG,QACnG,oBAAC,SAAI,KAAU,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAAO,CACjF;AAED,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
@@ -3,12 +3,15 @@ import { Slot } from "@radix-ui/react-slot";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { cn } from "@open-mercato/shared/lib/utils";
5
5
  const buttonVariants = cva(
6
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
6
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled disabled:border-border-disabled disabled:shadow-none disabled:[background-image:none] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:outline-none focus-visible:shadow-focus aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
7
7
  {
8
8
  variants: {
9
9
  variant: {
10
- default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
11
- destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
10
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary-hover",
11
+ destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 aria-invalid:ring-destructive dark:aria-invalid:ring-destructive dark:bg-destructive/10",
12
+ "destructive-outline": "border border-destructive/30 bg-background text-destructive shadow-xs hover:bg-destructive/10 dark:border-destructive/40 dark:hover:bg-destructive/15",
13
+ "destructive-soft": "bg-destructive/10 text-destructive hover:bg-destructive/15 dark:bg-destructive/15 dark:hover:bg-destructive/20",
14
+ "destructive-ghost": "text-destructive hover:bg-destructive/10 dark:hover:bg-destructive/15",
12
15
  outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
13
16
  secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
14
17
  ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
@@ -17,8 +20,9 @@ const buttonVariants = cva(
17
20
  },
18
21
  size: {
19
22
  default: "h-9 px-4 py-2 has-[>svg]:px-3",
20
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
21
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
23
+ sm: "h-8 gap-1.5 px-3 has-[>svg]:px-2.5",
24
+ lg: "h-10 px-6 has-[>svg]:px-4",
25
+ "2xs": "h-7 gap-1 px-2 py-0.5 has-[>svg]:px-1.5 text-xs",
22
26
  icon: "size-9"
23
27
  }
24
28
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/button.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n muted: 'text-muted-foreground hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button'\n return <Comp data-slot=\"button\" className={cn(buttonVariants({ variant, size, className }))} {...props} />\n}\n\nexport { buttonVariants }\n\n"],
5
- "mappings": "AA2CS;AA1CT,SAAS,YAAY;AACrB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAC+D;AAC7D,QAAM,OAAO,UAAU,OAAO;AAC9B,SAAO,oBAAC,QAAK,aAAU,UAAS,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC,GAAI,GAAG,OAAO;AAC1G;",
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled disabled:border-border-disabled disabled:shadow-none disabled:[background-image:none] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:outline-none focus-visible:shadow-focus aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary-hover',\n destructive:\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 aria-invalid:ring-destructive dark:aria-invalid:ring-destructive dark:bg-destructive/10',\n 'destructive-outline':\n 'border border-destructive/30 bg-background text-destructive shadow-xs hover:bg-destructive/10 dark:border-destructive/40 dark:hover:bg-destructive/15',\n 'destructive-soft':\n 'bg-destructive/10 text-destructive hover:bg-destructive/15 dark:bg-destructive/15 dark:hover:bg-destructive/20',\n 'destructive-ghost':\n 'text-destructive hover:bg-destructive/10 dark:hover:bg-destructive/15',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n muted: 'text-muted-foreground hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 px-6 has-[>svg]:px-4',\n '2xs': 'h-7 gap-1 px-2 py-0.5 has-[>svg]:px-1.5 text-xs',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button'\n return <Comp data-slot=\"button\" className={cn(buttonVariants({ variant, size, className }))} {...props} />\n}\n\nexport { buttonVariants }\n\n"],
5
+ "mappings": "AAkDS;AAjDT,SAAS,YAAY;AACrB,SAAS,WAA8B;AACvC,SAAS,UAAU;AAEnB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,uBACE;AAAA,QACF,oBACE;AAAA,QACF,qBACE;AAAA,QACF,SACE;AAAA,QACF,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAC+D;AAC7D,QAAM,OAAO,UAAU,OAAO;AAC9B,SAAO,oBAAC,QAAK,aAAU,UAAS,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC,GAAI,GAAG,OAAO;AAC1G;",
6
6
  "names": []
7
7
  }
@@ -31,7 +31,7 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
31
31
  ),
32
32
  month_grid: "w-full border-collapse space-y-1",
33
33
  weekdays: "flex",
34
- weekday: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
34
+ weekday: "text-muted-foreground rounded-md w-9 font-normal text-xs",
35
35
  weeks: "w-full border-collapse space-y-1",
36
36
  week: "flex w-full mt-2",
37
37
  day: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/calendar.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { DayPicker } from 'react-day-picker'\nimport type { DayPickerProps } from 'react-day-picker'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nexport type CalendarProps = DayPickerProps\n\nexport function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-4',\n month: 'space-y-4',\n month_caption: 'flex justify-center pt-1 relative items-center',\n caption_label: 'text-sm font-medium',\n nav: 'flex items-center gap-1',\n button_previous: cn(\n 'absolute left-1 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm font-medium',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n 'hover:bg-accent hover:text-accent-foreground border-0'\n ),\n button_next: cn(\n 'absolute right-1 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm font-medium',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n 'hover:bg-accent hover:text-accent-foreground border-0'\n ),\n month_grid: 'w-full border-collapse space-y-1',\n weekdays: 'flex',\n weekday: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]',\n weeks: 'w-full border-collapse space-y-1',\n week: 'flex w-full mt-2',\n day: 'h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',\n day_button: cn(\n 'h-9 w-9 p-0 font-normal aria-selected:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none',\n 'hover:bg-accent hover:text-accent-foreground'\n ),\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md',\n today: 'bg-accent text-accent-foreground rounded-md',\n outside:\n 'day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30',\n disabled: 'text-muted-foreground opacity-50',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) =>\n orientation === 'left' ? (\n <ChevronLeft className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n ),\n }}\n {...props}\n />\n )\n}\n"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { DayPicker } from 'react-day-picker'\nimport type { DayPickerProps } from 'react-day-picker'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nexport type CalendarProps = DayPickerProps\n\nexport function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-4',\n month: 'space-y-4',\n month_caption: 'flex justify-center pt-1 relative items-center',\n caption_label: 'text-sm font-medium',\n nav: 'flex items-center gap-1',\n button_previous: cn(\n 'absolute left-1 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm font-medium',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n 'hover:bg-accent hover:text-accent-foreground border-0'\n ),\n button_next: cn(\n 'absolute right-1 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm font-medium',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n 'hover:bg-accent hover:text-accent-foreground border-0'\n ),\n month_grid: 'w-full border-collapse space-y-1',\n weekdays: 'flex',\n weekday: 'text-muted-foreground rounded-md w-9 font-normal text-xs',\n weeks: 'w-full border-collapse space-y-1',\n week: 'flex w-full mt-2',\n day: 'h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',\n day_button: cn(\n 'h-9 w-9 p-0 font-normal aria-selected:opacity-100',\n 'inline-flex items-center justify-center rounded-md text-sm',\n 'ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none',\n 'hover:bg-accent hover:text-accent-foreground'\n ),\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md',\n today: 'bg-accent text-accent-foreground rounded-md',\n outside:\n 'day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30',\n disabled: 'text-muted-foreground opacity-50',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) =>\n orientation === 'left' ? (\n <ChevronLeft className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n ),\n }}\n {...props}\n />\n )\n}\n"],
5
5
  "mappings": ";AA4DY;AAzDZ,SAAS,iBAAiB;AAE1B,SAAS,aAAa,oBAAoB;AAC1C,SAAS,UAAU;AAIZ,SAAS,SAAS,EAAE,WAAW,YAAY,kBAAkB,MAAM,GAAG,MAAM,GAAkB;AACnG,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,OAAO,SAAS;AAAA,MAC9B,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,eAAe;AAAA,QACf,eAAe;AAAA,QACf,KAAK;AAAA,QACL,iBAAiB;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,KAAK;AAAA,QACL,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,UACE;AAAA,QACF,OAAO;AAAA,QACP,SACE;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,GAAG;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,SAAS,CAAC,EAAE,YAAY,MACtB,gBAAgB,SACd,oBAAC,eAAY,WAAU,WAAU,IAEjC,oBAAC,gBAAa,WAAU,WAAU;AAAA,MAExC;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,63 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "@open-mercato/shared/lib/utils";
4
+ import { Checkbox } from "./checkbox.js";
5
+ const CheckboxField = React.forwardRef(({
6
+ id: idProp,
7
+ label,
8
+ sublabel,
9
+ description,
10
+ badge,
11
+ link,
12
+ flip = false,
13
+ containerClassName,
14
+ contentClassName,
15
+ size = "md",
16
+ className,
17
+ disabled,
18
+ ...checkboxProps
19
+ }, ref) => {
20
+ const reactId = React.useId();
21
+ const id = idProp ?? `checkbox-field-${reactId}`;
22
+ const checkbox = /* @__PURE__ */ jsx(
23
+ Checkbox,
24
+ {
25
+ ref,
26
+ id,
27
+ size,
28
+ disabled,
29
+ className: cn("mt-0.5", className),
30
+ ...checkboxProps
31
+ }
32
+ );
33
+ const content = /* @__PURE__ */ jsxs("div", { className: cn("flex flex-1 min-w-0 flex-col gap-2.5", contentClassName), children: [
34
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
35
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1", children: [
36
+ /* @__PURE__ */ jsx(
37
+ "label",
38
+ {
39
+ htmlFor: id,
40
+ className: cn(
41
+ "text-sm font-medium leading-5 text-foreground select-none",
42
+ disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer"
43
+ ),
44
+ children: label
45
+ }
46
+ ),
47
+ sublabel ? /* @__PURE__ */ jsx("span", { className: "text-xs leading-4 text-muted-foreground select-none", children: sublabel }) : null,
48
+ badge ? /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", children: badge }) : null
49
+ ] }),
50
+ description ? /* @__PURE__ */ jsx("p", { className: "text-xs leading-4 text-muted-foreground", children: description }) : null
51
+ ] }),
52
+ link ? /* @__PURE__ */ jsx("div", { className: "flex", children: link }) : null
53
+ ] });
54
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-start gap-2", flip && "flex-row-reverse", containerClassName), children: [
55
+ flip ? content : checkbox,
56
+ flip ? checkbox : content
57
+ ] });
58
+ });
59
+ CheckboxField.displayName = "CheckboxField";
60
+ export {
61
+ CheckboxField
62
+ };
63
+ //# sourceMappingURL=checkbox-field.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/primitives/checkbox-field.tsx"],
4
+ "sourcesContent": ["import * as React from \"react\"\nimport { cn } from \"@open-mercato/shared/lib/utils\"\nimport { Checkbox, type CheckboxProps } from \"./checkbox\"\n\nexport type CheckboxFieldProps = Omit<CheckboxProps, \"id\"> & {\n id?: string\n label: React.ReactNode\n sublabel?: React.ReactNode\n description?: React.ReactNode\n badge?: React.ReactNode\n link?: React.ReactNode\n /** When true, renders the checkbox on the right of the label content. */\n flip?: boolean\n /** Additional className for the outer wrapper. */\n containerClassName?: string\n /** Additional className for the right-side content stack. */\n contentClassName?: string\n}\n\nexport const CheckboxField = React.forwardRef<\n React.ElementRef<typeof Checkbox>,\n CheckboxFieldProps\n>(({\n id: idProp,\n label,\n sublabel,\n description,\n badge,\n link,\n flip = false,\n containerClassName,\n contentClassName,\n size = \"md\",\n className,\n disabled,\n ...checkboxProps\n}, ref) => {\n const reactId = React.useId()\n const id = idProp ?? `checkbox-field-${reactId}`\n\n const checkbox = (\n <Checkbox\n ref={ref}\n id={id}\n size={size}\n disabled={disabled}\n className={cn(\"mt-0.5\", className)}\n {...checkboxProps}\n />\n )\n\n const content = (\n <div className={cn(\"flex flex-1 min-w-0 flex-col gap-2.5\", contentClassName)}>\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <label\n htmlFor={id}\n className={cn(\n \"text-sm font-medium leading-5 text-foreground select-none\",\n disabled ? \"cursor-not-allowed opacity-60\" : \"cursor-pointer\"\n )}\n >\n {label}\n </label>\n {sublabel ? (\n <span className=\"text-xs leading-4 text-muted-foreground select-none\">{sublabel}</span>\n ) : null}\n {badge ? <span className=\"inline-flex shrink-0\">{badge}</span> : null}\n </div>\n {description ? (\n <p className=\"text-xs leading-4 text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {link ? <div className=\"flex\">{link}</div> : null}\n </div>\n )\n\n return (\n <div className={cn(\"flex items-start gap-2\", flip && \"flex-row-reverse\", containerClassName)}>\n {flip ? content : checkbox}\n {flip ? checkbox : content}\n </div>\n )\n})\nCheckboxField.displayName = \"CheckboxField\"\n"],
5
+ "mappings": "AAyCI,cAaI,YAbJ;AAzCJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,gBAAoC;AAiBtC,MAAM,gBAAgB,MAAM,WAGjC,CAAC;AAAA,EACD,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,QAAQ;AACT,QAAM,UAAU,MAAM,MAAM;AAC5B,QAAM,KAAK,UAAU,kBAAkB,OAAO;AAE9C,QAAM,WACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,UAAU,SAAS;AAAA,MAChC,GAAG;AAAA;AAAA,EACN;AAGF,QAAM,UACJ,qBAAC,SAAI,WAAW,GAAG,wCAAwC,gBAAgB,GACzE;AAAA,yBAAC,SAAI,WAAU,uBACb;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,WAAW,kCAAkC;AAAA,YAC/C;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACC,WACC,oBAAC,UAAK,WAAU,uDAAuD,oBAAS,IAC9E;AAAA,QACH,QAAQ,oBAAC,UAAK,WAAU,wBAAwB,iBAAM,IAAU;AAAA,SACnE;AAAA,MACC,cACC,oBAAC,OAAE,WAAU,2CAA2C,uBAAY,IAClE;AAAA,OACN;AAAA,IACC,OAAO,oBAAC,SAAI,WAAU,QAAQ,gBAAK,IAAS;AAAA,KAC/C;AAGF,SACE,qBAAC,SAAI,WAAW,GAAG,0BAA0B,QAAQ,oBAAoB,kBAAkB,GACxF;AAAA,WAAO,UAAU;AAAA,IACjB,OAAO,WAAW;AAAA,KACrB;AAEJ,CAAC;AACD,cAAc,cAAc;",
6
+ "names": []
7
+ }
@@ -1,28 +1,42 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
4
- import { Check } from "lucide-react";
4
+ import { Check, Minus } from "lucide-react";
5
+ import { cva } from "class-variance-authority";
5
6
  import { cn } from "@open-mercato/shared/lib/utils";
6
- const Checkbox = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7
- CheckboxPrimitive.Root,
7
+ const checkboxVariants = cva(
8
+ "peer shrink-0 rounded-[4px] border border-input bg-background shadow-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-indigo/40 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-accent-indigo data-[state=checked]:text-accent-indigo-foreground data-[state=checked]:border-accent-indigo data-[state=indeterminate]:bg-accent-indigo data-[state=indeterminate]:text-accent-indigo-foreground data-[state=indeterminate]:border-accent-indigo hover:border-accent-indigo/60 transition-colors",
8
9
  {
9
- ref,
10
- className: cn(
11
- "peer size-4 shrink-0 rounded-sm border border-input bg-background shadow-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary",
12
- className
13
- ),
14
- ...props,
15
- children: /* @__PURE__ */ jsx(
16
- CheckboxPrimitive.Indicator,
17
- {
18
- className: cn("flex items-center justify-center text-current"),
19
- children: /* @__PURE__ */ jsx(Check, { className: "size-3.5" })
10
+ variants: {
11
+ size: {
12
+ sm: "size-4",
13
+ md: "size-5"
20
14
  }
21
- )
15
+ },
16
+ defaultVariants: {
17
+ size: "sm"
18
+ }
22
19
  }
23
- ));
20
+ );
21
+ const indicatorIconBySize = {
22
+ sm: "size-3.5",
23
+ md: "size-4"
24
+ };
25
+ const Checkbox = React.forwardRef(({ className, size, ...props }, ref) => {
26
+ const iconClass = indicatorIconBySize[size ?? "sm"];
27
+ return /* @__PURE__ */ jsx(
28
+ CheckboxPrimitive.Root,
29
+ {
30
+ ref,
31
+ className: cn(checkboxVariants({ size, className })),
32
+ ...props,
33
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: cn("flex items-center justify-center text-current"), children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx(Minus, { className: iconClass, "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Check, { className: iconClass, "aria-hidden": "true" }) })
34
+ }
35
+ );
36
+ });
24
37
  Checkbox.displayName = CheckboxPrimitive.Root.displayName;
25
38
  export {
26
- Checkbox
39
+ Checkbox,
40
+ checkboxVariants
27
41
  };
28
42
  //# sourceMappingURL=checkbox.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/primitives/checkbox.tsx"],
4
- "sourcesContent": ["import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"@open-mercato/shared/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer size-4 shrink-0 rounded-sm border border-input bg-background shadow-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n"],
5
- "mappings": "AAqBM;AArBN,YAAY,WAAW;AACvB,YAAY,uBAAuB;AACnC,SAAS,aAAa;AAEtB,SAAS,UAAU;AAEnB,MAAM,WAAW,MAAM,WAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,kBAAkB;AAAA,EAAlB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,MAAC,kBAAkB;AAAA,MAAlB;AAAA,QACC,WAAW,GAAG,+CAA+C;AAAA,QAE7D,8BAAC,SAAM,WAAU,YAAW;AAAA;AAAA,IAC9B;AAAA;AACF,CACD;AACD,SAAS,cAAc,kBAAkB,KAAK;",
4
+ "sourcesContent": ["import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check, Minus } from \"lucide-react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@open-mercato/shared/lib/utils\"\n\nconst checkboxVariants = cva(\n \"peer shrink-0 rounded-[4px] border border-input bg-background shadow-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-indigo/40 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-accent-indigo data-[state=checked]:text-accent-indigo-foreground data-[state=checked]:border-accent-indigo data-[state=indeterminate]:bg-accent-indigo data-[state=indeterminate]:text-accent-indigo-foreground data-[state=indeterminate]:border-accent-indigo hover:border-accent-indigo/60 transition-colors\",\n {\n variants: {\n size: {\n sm: \"size-4\",\n md: \"size-5\",\n },\n },\n defaultVariants: {\n size: \"sm\",\n },\n }\n)\n\nconst indicatorIconBySize = {\n sm: \"size-3.5\",\n md: \"size-4\",\n} as const\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, size, ...props }, ref) => {\n const iconClass = indicatorIconBySize[size ?? \"sm\"]\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(checkboxVariants({ size, className }))}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={cn(\"flex items-center justify-center text-current\")}>\n {props.checked === \"indeterminate\" ? (\n <Minus className={iconClass} aria-hidden=\"true\" />\n ) : (\n <Check className={iconClass} aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n})\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox, checkboxVariants }\n"],
5
+ "mappings": "AA2CU;AA3CV,YAAY,WAAW;AACvB,YAAY,uBAAuB;AACnC,SAAS,OAAO,aAAa;AAC7B,SAAS,WAA8B;AAEvC,SAAS,UAAU;AAEnB,MAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,sBAAsB;AAAA,EAC1B,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,MAAM,WAAW,MAAM,WAGrB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACxC,QAAM,YAAY,oBAAoB,QAAQ,IAAI;AAClD,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC;AAAA,MACA,WAAW,GAAG,iBAAiB,EAAE,MAAM,UAAU,CAAC,CAAC;AAAA,MAClD,GAAG;AAAA,MAEJ,8BAAC,kBAAkB,WAAlB,EAA4B,WAAW,GAAG,+CAA+C,GACvF,gBAAM,YAAY,kBACjB,oBAAC,SAAM,WAAW,WAAW,eAAY,QAAO,IAEhD,oBAAC,SAAM,WAAW,WAAW,eAAY,QAAO,GAEpD;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,SAAS,cAAc,kBAAkB,KAAK;",
6
6
  "names": []
7
7
  }
@@ -14,7 +14,7 @@ const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__P
14
14
  {
15
15
  ref,
16
16
  className: cn(
17
- "fixed inset-0 z-50 bg-black/50 backdrop-blur-sm transition-opacity data-[state=open]:animate-in data-[state=closed]:animate-out",
17
+ "fixed inset-0 z-modal bg-black/50 backdrop-blur-sm transition-opacity data-[state=open]:animate-in data-[state=closed]:animate-out",
18
18
  className
19
19
  ),
20
20
  ...props
@@ -41,9 +41,9 @@ const DialogContent = React.forwardRef(({ className, children, ...props }, ref)
41
41
  ref,
42
42
  "data-dialog-content": "",
43
43
  className: cn(
44
- "fixed inset-x-0 bottom-0 z-50 flex min-h-[50vh] max-h-[70vh] w-full translate-x-0 translate-y-0 flex-col gap-4 overflow-y-auto rounded-t-2xl border-t bg-card p-6 shadow-lg",
44
+ "fixed inset-x-0 bottom-0 z-modal flex min-h-[50vh] max-h-[70vh] w-full translate-x-0 translate-y-0 flex-col gap-4 overflow-y-auto rounded-t-2xl border-t bg-card p-6 shadow-lg",
45
45
  "sm:inset-auto sm:left-1/2 sm:top-1/2 sm:min-h-0 sm:h-auto sm:w-full sm:max-w-lg sm:max-h-[90vh] sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:border",
46
- "focus:outline-none data-[state=open]:animate-in data-[state=closed]:animate-out",
46
+ "focus-visible:outline-none data-[state=open]:animate-in data-[state=closed]:animate-out",
47
47
  className
48
48
  ),
49
49
  ...props,
@@ -52,7 +52,7 @@ const DialogContent = React.forwardRef(({ className, children, ...props }, ref)
52
52
  DialogClose,
53
53
  {
54
54
  "data-dialog-close": "",
55
- className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
55
+ className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
56
56
  "aria-label": t("ui.dialog.close.ariaLabel", "Close"),
57
57
  children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
58
58
  }