@mihcm/ui 0.14.1 → 0.15.1

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 (300) hide show
  1. package/dist/CheckboxGrid.native.d.ts.map +1 -1
  2. package/dist/CheckboxGrid.native.js +2 -1
  3. package/dist/CheckboxGrid.native.js.map +1 -1
  4. package/dist/Combobox.native.d.ts.map +1 -1
  5. package/dist/Combobox.native.js +2 -1
  6. package/dist/Combobox.native.js.map +1 -1
  7. package/dist/DataTable/column-filter.d.ts +8 -0
  8. package/dist/DataTable/column-filter.d.ts.map +1 -0
  9. package/dist/DataTable/column-filter.js +67 -0
  10. package/dist/DataTable/column-filter.js.map +1 -0
  11. package/dist/DataTable/column-header.d.ts +16 -0
  12. package/dist/DataTable/column-header.d.ts.map +1 -0
  13. package/dist/DataTable/column-header.js +11 -0
  14. package/dist/DataTable/column-header.js.map +1 -0
  15. package/dist/DataTable/column-visibility.d.ts +7 -0
  16. package/dist/DataTable/column-visibility.d.ts.map +1 -0
  17. package/dist/DataTable/column-visibility.js +35 -0
  18. package/dist/DataTable/column-visibility.js.map +1 -0
  19. package/dist/DataTable/index.d.ts +5 -0
  20. package/dist/DataTable/index.d.ts.map +1 -0
  21. package/dist/DataTable/index.js +5 -0
  22. package/dist/DataTable/index.js.map +1 -0
  23. package/dist/DataTable/pinning.d.ts +13 -0
  24. package/dist/DataTable/pinning.d.ts.map +1 -0
  25. package/dist/DataTable/pinning.js +29 -0
  26. package/dist/DataTable/pinning.js.map +1 -0
  27. package/dist/DataTable.d.ts +3 -7
  28. package/dist/DataTable.d.ts.map +1 -1
  29. package/dist/DataTable.js +7 -126
  30. package/dist/DataTable.js.map +1 -1
  31. package/dist/Dialog.native.d.ts +3 -1
  32. package/dist/Dialog.native.d.ts.map +1 -1
  33. package/dist/Dialog.native.js +2 -2
  34. package/dist/Dialog.native.js.map +1 -1
  35. package/dist/Form/building-blocks.d.ts +26 -0
  36. package/dist/Form/building-blocks.d.ts.map +1 -0
  37. package/dist/Form/building-blocks.js +29 -0
  38. package/dist/Form/building-blocks.js.map +1 -0
  39. package/dist/Form/fields-choice.d.ts +72 -0
  40. package/dist/Form/fields-choice.d.ts.map +1 -0
  41. package/dist/Form/fields-choice.js +69 -0
  42. package/dist/Form/fields-choice.js.map +1 -0
  43. package/dist/Form/fields-complex.d.ts +28 -0
  44. package/dist/Form/fields-complex.d.ts.map +1 -0
  45. package/dist/Form/fields-complex.js +38 -0
  46. package/dist/Form/fields-complex.js.map +1 -0
  47. package/dist/Form/fields-date.d.ts +46 -0
  48. package/dist/Form/fields-date.d.ts.map +1 -0
  49. package/dist/Form/fields-date.js +41 -0
  50. package/dist/Form/fields-date.js.map +1 -0
  51. package/dist/Form/fields-text.d.ts +47 -0
  52. package/dist/Form/fields-text.d.ts.map +1 -0
  53. package/dist/Form/fields-text.js +46 -0
  54. package/dist/Form/fields-text.js.map +1 -0
  55. package/dist/Form/fields-toggle.d.ts +24 -0
  56. package/dist/Form/fields-toggle.d.ts.map +1 -0
  57. package/dist/Form/fields-toggle.js +32 -0
  58. package/dist/Form/fields-toggle.js.map +1 -0
  59. package/dist/Form/helpers.d.ts +66 -0
  60. package/dist/Form/helpers.d.ts.map +1 -0
  61. package/dist/Form/helpers.js +44 -0
  62. package/dist/Form/helpers.js.map +1 -0
  63. package/dist/Form/types.d.ts +25 -0
  64. package/dist/Form/types.d.ts.map +1 -0
  65. package/dist/Form/types.js +8 -0
  66. package/dist/Form/types.js.map +1 -0
  67. package/dist/Form.d.ts +24 -298
  68. package/dist/Form.d.ts.map +1 -1
  69. package/dist/Form.js +30 -246
  70. package/dist/Form.js.map +1 -1
  71. package/dist/IconSidebar.d.ts +6 -46
  72. package/dist/IconSidebar.d.ts.map +1 -1
  73. package/dist/IconSidebar.js +6 -116
  74. package/dist/IconSidebar.js.map +1 -1
  75. package/dist/MainSidebar/back-button.d.ts +14 -0
  76. package/dist/MainSidebar/back-button.d.ts.map +1 -0
  77. package/dist/MainSidebar/back-button.js +14 -0
  78. package/dist/MainSidebar/back-button.js.map +1 -0
  79. package/dist/MainSidebar/breadcrumb.d.ts +10 -0
  80. package/dist/MainSidebar/breadcrumb.d.ts.map +1 -0
  81. package/dist/MainSidebar/breadcrumb.js +24 -0
  82. package/dist/MainSidebar/breadcrumb.js.map +1 -0
  83. package/dist/MainSidebar/columns.d.ts +3 -0
  84. package/dist/MainSidebar/columns.d.ts.map +1 -0
  85. package/dist/MainSidebar/columns.js +198 -0
  86. package/dist/MainSidebar/columns.js.map +1 -0
  87. package/dist/MainSidebar/command.d.ts +3 -0
  88. package/dist/MainSidebar/command.d.ts.map +1 -0
  89. package/dist/MainSidebar/command.js +193 -0
  90. package/dist/MainSidebar/command.js.map +1 -0
  91. package/dist/MainSidebar/drilldown.d.ts +3 -0
  92. package/dist/MainSidebar/drilldown.d.ts.map +1 -0
  93. package/dist/MainSidebar/drilldown.js +154 -0
  94. package/dist/MainSidebar/drilldown.js.map +1 -0
  95. package/dist/MainSidebar/expanded.d.ts +7 -0
  96. package/dist/MainSidebar/expanded.d.ts.map +1 -0
  97. package/dist/MainSidebar/expanded.js +102 -0
  98. package/dist/MainSidebar/expanded.js.map +1 -0
  99. package/dist/MainSidebar/floating.d.ts +3 -0
  100. package/dist/MainSidebar/floating.d.ts.map +1 -0
  101. package/dist/MainSidebar/floating.js +116 -0
  102. package/dist/MainSidebar/floating.js.map +1 -0
  103. package/dist/MainSidebar/helpers.d.ts +50 -0
  104. package/dist/MainSidebar/helpers.d.ts.map +1 -0
  105. package/dist/MainSidebar/helpers.js +150 -0
  106. package/dist/MainSidebar/helpers.js.map +1 -0
  107. package/dist/MainSidebar/hover.d.ts +3 -0
  108. package/dist/MainSidebar/hover.d.ts.map +1 -0
  109. package/dist/MainSidebar/hover.js +177 -0
  110. package/dist/MainSidebar/hover.js.map +1 -0
  111. package/dist/MainSidebar/index.d.ts +6 -0
  112. package/dist/MainSidebar/index.d.ts.map +1 -0
  113. package/dist/MainSidebar/index.js +108 -0
  114. package/dist/MainSidebar/index.js.map +1 -0
  115. package/dist/MainSidebar/mobile.d.ts +29 -0
  116. package/dist/MainSidebar/mobile.d.ts.map +1 -0
  117. package/dist/MainSidebar/mobile.js +38 -0
  118. package/dist/MainSidebar/mobile.js.map +1 -0
  119. package/dist/MainSidebar/motion.d.ts +23 -0
  120. package/dist/MainSidebar/motion.d.ts.map +1 -0
  121. package/dist/MainSidebar/motion.js +40 -0
  122. package/dist/MainSidebar/motion.js.map +1 -0
  123. package/dist/MainSidebar/rail.d.ts +24 -0
  124. package/dist/MainSidebar/rail.d.ts.map +1 -0
  125. package/dist/MainSidebar/rail.js +29 -0
  126. package/dist/MainSidebar/rail.js.map +1 -0
  127. package/dist/MainSidebar/search.d.ts +19 -0
  128. package/dist/MainSidebar/search.d.ts.map +1 -0
  129. package/dist/MainSidebar/search.js +33 -0
  130. package/dist/MainSidebar/search.js.map +1 -0
  131. package/dist/MainSidebar/types.d.ts +161 -0
  132. package/dist/MainSidebar/types.d.ts.map +1 -0
  133. package/dist/MainSidebar/types.js +2 -0
  134. package/dist/MainSidebar/types.js.map +1 -0
  135. package/dist/MainSidebar.d.ts +6 -1
  136. package/dist/MainSidebar.d.ts.map +1 -1
  137. package/dist/MainSidebar.js +6 -1
  138. package/dist/MainSidebar.js.map +1 -1
  139. package/dist/NavigationMenu.js +1 -1
  140. package/dist/NavigationMenu.js.map +1 -1
  141. package/dist/RichTextEditor/theme.d.ts +44 -0
  142. package/dist/RichTextEditor/theme.d.ts.map +1 -0
  143. package/dist/RichTextEditor/theme.js +41 -0
  144. package/dist/RichTextEditor/theme.js.map +1 -0
  145. package/dist/RichTextEditor/toolbar-icons.d.ts +21 -0
  146. package/dist/RichTextEditor/toolbar-icons.d.ts.map +1 -0
  147. package/dist/RichTextEditor/toolbar-icons.js +21 -0
  148. package/dist/RichTextEditor/toolbar-icons.js.map +1 -0
  149. package/dist/RichTextEditor/toolbar.d.ts +5 -0
  150. package/dist/RichTextEditor/toolbar.d.ts.map +1 -0
  151. package/dist/RichTextEditor/toolbar.js +116 -0
  152. package/dist/RichTextEditor/toolbar.js.map +1 -0
  153. package/dist/RichTextEditor.d.ts +16 -9
  154. package/dist/RichTextEditor.d.ts.map +1 -1
  155. package/dist/RichTextEditor.js +18 -164
  156. package/dist/RichTextEditor.js.map +1 -1
  157. package/dist/Select/content.d.ts +9 -0
  158. package/dist/Select/content.d.ts.map +1 -0
  159. package/dist/Select/content.js +80 -0
  160. package/dist/Select/content.js.map +1 -0
  161. package/dist/Select/context.d.ts +27 -0
  162. package/dist/Select/context.d.ts.map +1 -0
  163. package/dist/Select/context.js +35 -0
  164. package/dist/Select/context.js.map +1 -0
  165. package/dist/Select/item.d.ts +13 -0
  166. package/dist/Select/item.d.ts.map +1 -0
  167. package/dist/Select/item.js +39 -0
  168. package/dist/Select/item.js.map +1 -0
  169. package/dist/Select/parts.d.ts +14 -0
  170. package/dist/Select/parts.d.ts.map +1 -0
  171. package/dist/Select/parts.js +17 -0
  172. package/dist/Select/parts.js.map +1 -0
  173. package/dist/Select/react-select.d.ts +25 -0
  174. package/dist/Select/react-select.d.ts.map +1 -0
  175. package/dist/Select/react-select.js +66 -0
  176. package/dist/Select/react-select.js.map +1 -0
  177. package/dist/Select/root.d.ts +15 -0
  178. package/dist/Select/root.d.ts.map +1 -0
  179. package/dist/Select/root.js +41 -0
  180. package/dist/Select/root.js.map +1 -0
  181. package/dist/Select/trigger.d.ts +15 -0
  182. package/dist/Select/trigger.d.ts.map +1 -0
  183. package/dist/Select/trigger.js +61 -0
  184. package/dist/Select/trigger.js.map +1 -0
  185. package/dist/Select.d.ts +14 -62
  186. package/dist/Select.d.ts.map +1 -1
  187. package/dist/Select.js +14 -293
  188. package/dist/Select.js.map +1 -1
  189. package/dist/Sidebar/context.d.ts +28 -0
  190. package/dist/Sidebar/context.d.ts.map +1 -0
  191. package/dist/Sidebar/context.js +37 -0
  192. package/dist/Sidebar/context.js.map +1 -0
  193. package/dist/Sidebar/group.d.ts +13 -0
  194. package/dist/Sidebar/group.d.ts.map +1 -0
  195. package/dist/Sidebar/group.js +20 -0
  196. package/dist/Sidebar/group.js.map +1 -0
  197. package/dist/Sidebar/icons.d.ts +7 -0
  198. package/dist/Sidebar/icons.d.ts.map +1 -0
  199. package/dist/Sidebar/icons.js +12 -0
  200. package/dist/Sidebar/icons.js.map +1 -0
  201. package/dist/Sidebar/layout.d.ts +9 -0
  202. package/dist/Sidebar/layout.d.ts.map +1 -0
  203. package/dist/Sidebar/layout.js +21 -0
  204. package/dist/Sidebar/layout.js.map +1 -0
  205. package/dist/Sidebar/menu.d.ts +29 -0
  206. package/dist/Sidebar/menu.d.ts.map +1 -0
  207. package/dist/Sidebar/menu.js +55 -0
  208. package/dist/Sidebar/menu.js.map +1 -0
  209. package/dist/Sidebar/provider.d.ts +33 -0
  210. package/dist/Sidebar/provider.d.ts.map +1 -0
  211. package/dist/Sidebar/provider.js +110 -0
  212. package/dist/Sidebar/provider.js.map +1 -0
  213. package/dist/Sidebar/sidebar.d.ts +17 -0
  214. package/dist/Sidebar/sidebar.d.ts.map +1 -0
  215. package/dist/Sidebar/sidebar.js +51 -0
  216. package/dist/Sidebar/sidebar.js.map +1 -0
  217. package/dist/Sidebar/submenu.d.ts +13 -0
  218. package/dist/Sidebar/submenu.d.ts.map +1 -0
  219. package/dist/Sidebar/submenu.js +17 -0
  220. package/dist/Sidebar/submenu.js.map +1 -0
  221. package/dist/Sidebar/trigger.d.ts +9 -0
  222. package/dist/Sidebar/trigger.d.ts.map +1 -0
  223. package/dist/Sidebar/trigger.js +33 -0
  224. package/dist/Sidebar/trigger.js.map +1 -0
  225. package/dist/Sidebar.d.ts +14 -104
  226. package/dist/Sidebar.d.ts.map +1 -1
  227. package/dist/Sidebar.js +14 -300
  228. package/dist/Sidebar.js.map +1 -1
  229. package/dist/StatCard.d.ts +67 -9
  230. package/dist/StatCard.d.ts.map +1 -1
  231. package/dist/StatCard.js +111 -9
  232. package/dist/StatCard.js.map +1 -1
  233. package/dist/TransferList.native.d.ts.map +1 -1
  234. package/dist/TransferList.native.js +2 -1
  235. package/dist/TransferList.native.js.map +1 -1
  236. package/package.json +2 -2
  237. package/src/CheckboxGrid.native.tsx +2 -1
  238. package/src/Combobox.native.tsx +2 -1
  239. package/src/DataTable/column-filter.tsx +134 -0
  240. package/src/DataTable/column-header.tsx +67 -0
  241. package/src/DataTable/column-visibility.tsx +87 -0
  242. package/src/DataTable/index.ts +4 -0
  243. package/src/DataTable/pinning.ts +40 -0
  244. package/src/DataTable.tsx +14 -297
  245. package/src/Dialog.native.tsx +4 -2
  246. package/src/Form/building-blocks.tsx +97 -0
  247. package/src/Form/fields-choice.tsx +312 -0
  248. package/src/Form/fields-complex.tsx +195 -0
  249. package/src/Form/fields-date.tsx +195 -0
  250. package/src/Form/fields-text.tsx +218 -0
  251. package/src/Form/fields-toggle.tsx +123 -0
  252. package/src/Form/helpers.tsx +189 -0
  253. package/src/Form/types.ts +26 -0
  254. package/src/Form.tsx +91 -1308
  255. package/src/IconSidebar.tsx +20 -442
  256. package/src/MainSidebar/back-button.tsx +58 -0
  257. package/src/MainSidebar/breadcrumb.tsx +53 -0
  258. package/src/MainSidebar/columns.tsx +350 -0
  259. package/src/MainSidebar/command.tsx +404 -0
  260. package/src/MainSidebar/drilldown.tsx +373 -0
  261. package/src/MainSidebar/expanded.tsx +414 -0
  262. package/src/MainSidebar/floating.tsx +268 -0
  263. package/src/MainSidebar/helpers.ts +166 -0
  264. package/src/MainSidebar/hover.tsx +334 -0
  265. package/src/MainSidebar/index.tsx +191 -0
  266. package/src/MainSidebar/mobile.tsx +117 -0
  267. package/src/MainSidebar/motion.ts +64 -0
  268. package/src/MainSidebar/rail.tsx +137 -0
  269. package/src/MainSidebar/search.tsx +99 -0
  270. package/src/MainSidebar/types.ts +208 -0
  271. package/src/MainSidebar.tsx +15 -4
  272. package/src/NavigationMenu.tsx +1 -1
  273. package/src/RichTextEditor/theme.ts +43 -0
  274. package/src/RichTextEditor/toolbar-icons.tsx +40 -0
  275. package/src/RichTextEditor/toolbar.tsx +271 -0
  276. package/src/RichTextEditor.tsx +23 -371
  277. package/src/Select/content.tsx +111 -0
  278. package/src/Select/context.tsx +66 -0
  279. package/src/Select/item.tsx +97 -0
  280. package/src/Select/parts.tsx +43 -0
  281. package/src/Select/react-select.tsx +216 -0
  282. package/src/Select/root.tsx +75 -0
  283. package/src/Select/trigger.tsx +122 -0
  284. package/src/Select.tsx +34 -692
  285. package/src/Sidebar/context.tsx +72 -0
  286. package/src/Sidebar/group.tsx +69 -0
  287. package/src/Sidebar/icons.tsx +42 -0
  288. package/src/Sidebar/layout.tsx +64 -0
  289. package/src/Sidebar/menu.tsx +171 -0
  290. package/src/Sidebar/provider.tsx +224 -0
  291. package/src/Sidebar/sidebar.tsx +178 -0
  292. package/src/Sidebar/submenu.tsx +58 -0
  293. package/src/Sidebar/trigger.tsx +104 -0
  294. package/src/Sidebar.tsx +44 -927
  295. package/src/StatCard.tsx +365 -20
  296. package/src/TransferList.native.tsx +2 -1
  297. package/dist/TiptapEditor.d.ts +0 -24
  298. package/dist/TiptapEditor.d.ts.map +0 -1
  299. package/dist/TiptapEditor.js +0 -84
  300. package/dist/TiptapEditor.js.map +0 -1
package/src/StatCard.tsx CHANGED
@@ -3,21 +3,29 @@
3
3
  /**
4
4
  * StatCard (web variant — React DOM).
5
5
  *
6
- * Centered icon tile + big number + label, used in the "Quick stats"
7
- * row of the MiHCM Security prototype (Active Roles / Total Users /
8
- * Modules). Four tones cover the common meanings; the icon is sized
9
- * to 18 px inside a 36×36 rounded tile.
6
+ * Seven layout variants for product KPI surfaces:
7
+ *
8
+ * - `default` — Centered icon tile + big number + label (original layout)
9
+ * - `inline` — Icon left, value + label stacked right (compact rows)
10
+ * - `delta` — Value + ↑/↓ percentage in a semantic tone
11
+ * - `trend` — Value + delta + inline SparkChart trend (Stripe / Tremor)
12
+ * - `progress` — Value + thin progress bar (current / max goal)
13
+ * - `distribution` — Value + segmented CategoryBar breakdown
14
+ * - `hero` — Single huge number, no chrome (marketing / summary callouts)
15
+ *
16
+ * All variants share `value`, `label`, optional `icon`, and the 6-tone palette.
17
+ * Variant-specific props (`delta`, `sparkline`, `max`, `segments`) are typed
18
+ * via a discriminated union so consumers can't mix prop sets by mistake.
10
19
  *
11
20
  * Wiki: docs/components/StatCard.md
12
21
  */
13
- import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
14
- import { cva, type VariantProps } from 'class-variance-authority';
15
- import { Text } from './Text.js';
22
+ import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react';
16
23
  import { cn } from './internal/cn.js';
24
+ import { Text } from './Text.js';
25
+ import { CategoryBar, type CategoryBarItem } from './CategoryBar.js';
26
+ import { SparkChart, type SparkChartTone } from './SparkChart.js';
17
27
 
18
- export const statCardVariants = cva(
19
- 'rounded-card border border-secondary bg-card py-4 px-3 text-center',
20
- );
28
+ /* ── Tone tokens ──────────────────────────────────────────────────── */
21
29
 
22
30
  const TILE_TONE = {
23
31
  primary: 'bg-primary-50 text-primary dark:bg-primary-950 dark:text-primary-300',
@@ -37,27 +45,160 @@ const VALUE_TONE = {
37
45
  neutral: 'text-foreground',
38
46
  } as const;
39
47
 
48
+ const SEGMENT_TONE = {
49
+ primary: 'bg-primary',
50
+ accent: 'bg-accent',
51
+ success: 'bg-success',
52
+ warning: 'bg-warning',
53
+ danger: 'bg-destructive',
54
+ neutral: 'bg-muted-foreground',
55
+ } as const;
56
+
40
57
  export type StatCardTone = keyof typeof TILE_TONE;
41
58
 
42
- export interface StatCardProps
43
- extends HTMLAttributes<HTMLDivElement>,
44
- VariantProps<typeof statCardVariants> {
59
+ /* ── Delta ────────────────────────────────────────────────────────── */
60
+
61
+ export interface StatCardDelta {
62
+ /** Magnitude — e.g. `8.4` renders as `+8.4%`. */
63
+ value: number;
64
+ /** Direction of change. `flat` skips the arrow. */
65
+ direction: 'up' | 'down' | 'flat';
66
+ /** Override the auto-formatted display (default: `+8.4%` / `-3.1%`). */
67
+ formatted?: string;
68
+ /**
69
+ * Whether an `up` direction means a positive outcome. Defaults to `true`.
70
+ * Set `false` for metrics where down-is-better (failed jobs, error rate).
71
+ */
72
+ positiveIsGood?: boolean;
73
+ }
74
+
75
+ function deltaToneClass(delta: StatCardDelta) {
76
+ if (delta.direction === 'flat') return 'text-muted-foreground';
77
+ const positiveIsGood = delta.positiveIsGood ?? true;
78
+ const isGood = (delta.direction === 'up') === positiveIsGood;
79
+ return isGood ? 'text-success' : 'text-destructive';
80
+ }
81
+
82
+ function deltaDisplay(delta: StatCardDelta) {
83
+ if (delta.formatted) return delta.formatted;
84
+ const sign = delta.direction === 'up' ? '+' : delta.direction === 'down' ? '-' : '±';
85
+ return `${sign}${Math.abs(delta.value)}%`;
86
+ }
87
+
88
+ function DeltaIndicator({ delta }: { delta: StatCardDelta }) {
89
+ const Arrow = delta.direction === 'up' ? UpArrow : delta.direction === 'down' ? DownArrow : null;
90
+ return (
91
+ <span
92
+ className={cn(
93
+ 'inline-flex items-center gap-0.5 text-xs font-medium tabular-nums',
94
+ deltaToneClass(delta),
95
+ )}
96
+ >
97
+ {Arrow ? <Arrow /> : null}
98
+ {deltaDisplay(delta)}
99
+ </span>
100
+ );
101
+ }
102
+
103
+ function UpArrow() {
104
+ return (
105
+ <svg viewBox="0 0 12 12" className="size-3" fill="none" stroke="currentColor" strokeWidth={2} aria-hidden="true">
106
+ <path d="M6 10V2M3 5l3-3 3 3" strokeLinecap="round" strokeLinejoin="round" />
107
+ </svg>
108
+ );
109
+ }
110
+
111
+ function DownArrow() {
112
+ return (
113
+ <svg viewBox="0 0 12 12" className="size-3" fill="none" stroke="currentColor" strokeWidth={2} aria-hidden="true">
114
+ <path d="M6 2v8M3 7l3 3 3-3" strokeLinecap="round" strokeLinejoin="round" />
115
+ </svg>
116
+ );
117
+ }
118
+
119
+ /* ── Shared shell ─────────────────────────────────────────────────── */
120
+
121
+ const cardShell = 'rounded-card border border-secondary bg-card';
122
+
123
+ /* ── Discriminated union of props ─────────────────────────────────── */
124
+
125
+ interface BaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
45
126
  /** Big number / metric. */
46
127
  value: ReactNode;
47
- /** Caption shown below the value. */
128
+ /** Caption shown beside / below the value. */
48
129
  label: ReactNode;
49
- /** Optional icon, sized to 18 px inside the tile. */
130
+ /** Optional icon. Honoured by `default` and `inline`; ignored by other variants. */
50
131
  icon?: ReactNode;
51
132
  /** Color tone. Defaults to `primary`. */
52
133
  tone?: StatCardTone;
53
134
  }
54
135
 
55
- export const StatCard = forwardRef<HTMLDivElement, StatCardProps>(function StatCard(
56
- { className, value, label, icon, tone = 'primary', ...props },
136
+ type DefaultVariantProps = BaseProps & { variant?: 'default' };
137
+ type InlineVariantProps = BaseProps & { variant: 'inline' };
138
+ type DeltaVariantProps = BaseProps & { variant: 'delta'; delta: StatCardDelta };
139
+ type TrendVariantProps = BaseProps & {
140
+ variant: 'trend';
141
+ /** Series for the inline SparkChart. */
142
+ sparkline: number[];
143
+ /** Optional delta rendered alongside the value. */
144
+ delta?: StatCardDelta;
145
+ /** SparkChart tone override. Defaults to the card's `tone` (when mappable). */
146
+ sparklineTone?: SparkChartTone;
147
+ };
148
+ type ProgressVariantProps = BaseProps & {
149
+ variant: 'progress';
150
+ /** Maximum value used to compute the progress fill. */
151
+ max: number;
152
+ /** Visible label for the progress meta line (default: `"{value} / {max}"`). */
153
+ valueLabel?: string;
154
+ };
155
+ type DistributionVariantProps = BaseProps & {
156
+ variant: 'distribution';
157
+ /** CategoryBar segments — each `{ label, value, className }`. */
158
+ segments: CategoryBarItem[];
159
+ };
160
+ type HeroVariantProps = BaseProps & { variant: 'hero' };
161
+
162
+ export type StatCardProps =
163
+ | DefaultVariantProps
164
+ | InlineVariantProps
165
+ | DeltaVariantProps
166
+ | TrendVariantProps
167
+ | ProgressVariantProps
168
+ | DistributionVariantProps
169
+ | HeroVariantProps;
170
+
171
+ /* ── Component dispatch ───────────────────────────────────────────── */
172
+
173
+ export const StatCard = forwardRef<HTMLDivElement, StatCardProps>(function StatCard(props, ref) {
174
+ switch (props.variant) {
175
+ case 'inline':
176
+ return <InlineCard ref={ref} {...props} />;
177
+ case 'delta':
178
+ return <DeltaCard ref={ref} {...props} />;
179
+ case 'trend':
180
+ return <TrendCard ref={ref} {...props} />;
181
+ case 'progress':
182
+ return <ProgressCard ref={ref} {...props} />;
183
+ case 'distribution':
184
+ return <DistributionCard ref={ref} {...props} />;
185
+ case 'hero':
186
+ return <HeroCard ref={ref} {...props} />;
187
+ case 'default':
188
+ case undefined:
189
+ default:
190
+ return <DefaultCard ref={ref} {...props} />;
191
+ }
192
+ });
193
+
194
+ /* ── 1. Default — centered icon tile ──────────────────────────────── */
195
+
196
+ const DefaultCard = forwardRef<HTMLDivElement, DefaultVariantProps>(function DefaultCard(
197
+ { className, value, label, icon, tone = 'primary', variant: _v, ...rest },
57
198
  ref,
58
199
  ) {
59
200
  return (
60
- <div ref={ref} className={cn(statCardVariants(), className)} {...props}>
201
+ <div ref={ref} className={cn(cardShell, 'px-3 py-4 text-center', className)} {...rest}>
61
202
  {icon ? (
62
203
  <div
63
204
  className={cn(
@@ -68,8 +209,212 @@ export const StatCard = forwardRef<HTMLDivElement, StatCardProps>(function StatC
68
209
  <span className="grid size-4.5 place-items-center [&_svg]:size-full">{icon}</span>
69
210
  </div>
70
211
  ) : null}
71
- <Text size="stat" weight="bold" className={cn('block', VALUE_TONE[tone])}>{value}</Text>
72
- <Text size="label" tone="muted" className="mt-0.5 block">{label}</Text>
212
+ <Text as="div" size="stat" weight="bold" className={cn(VALUE_TONE[tone])}>
213
+ {value}
214
+ </Text>
215
+ <Text as="div" size="label" tone="muted" className="mt-0.5">
216
+ {label}
217
+ </Text>
218
+ </div>
219
+ );
220
+ });
221
+
222
+ /* ── 2. Inline — horizontal icon + stacked value/label ────────────── */
223
+
224
+ const InlineCard = forwardRef<HTMLDivElement, InlineVariantProps>(function InlineCard(
225
+ { className, value, label, icon, tone = 'primary', variant: _v, ...rest },
226
+ ref,
227
+ ) {
228
+ return (
229
+ <div
230
+ ref={ref}
231
+ className={cn(cardShell, 'flex items-center gap-3 px-4 py-3', className)}
232
+ {...rest}
233
+ >
234
+ {icon ? (
235
+ <div className={cn('grid size-10 shrink-0 place-items-center rounded-card', TILE_TONE[tone])}>
236
+ <span className="grid size-5 place-items-center [&_svg]:size-full">{icon}</span>
237
+ </div>
238
+ ) : null}
239
+ <div className="flex min-w-0 flex-col">
240
+ <Text as="div" size="stat-sm" weight="bold" className={cn('truncate', VALUE_TONE[tone])}>
241
+ {value}
242
+ </Text>
243
+ <Text as="div" size="label" tone="muted" className="truncate">
244
+ {label}
245
+ </Text>
246
+ </div>
73
247
  </div>
74
248
  );
75
249
  });
250
+
251
+ /* ── 3. Delta — value + ↑/↓ percentage ────────────────────────────── */
252
+
253
+ const DeltaCard = forwardRef<HTMLDivElement, DeltaVariantProps>(function DeltaCard(
254
+ { className, value, label, tone = 'neutral', delta, variant: _v, icon: _i, ...rest },
255
+ ref,
256
+ ) {
257
+ return (
258
+ <div ref={ref} className={cn(cardShell, 'px-4 py-3', className)} {...rest}>
259
+ <Text as="div" size="label" tone="muted" className="uppercase tracking-wider">
260
+ {label}
261
+ </Text>
262
+ <div className="mt-1 flex items-baseline gap-2">
263
+ <Text as="span" size="stat" weight="bold" className={cn('tabular-nums leading-tight', VALUE_TONE[tone])}>
264
+ {value}
265
+ </Text>
266
+ <DeltaIndicator delta={delta} />
267
+ </div>
268
+ </div>
269
+ );
270
+ });
271
+
272
+ /* ── 4. Trend — value + delta + SparkChart ────────────────────────── */
273
+
274
+ const SPARK_TONE_FOR: Partial<Record<StatCardTone, SparkChartTone>> = {
275
+ primary: 'primary',
276
+ accent: 'accent',
277
+ success: 'success',
278
+ warning: 'warning',
279
+ danger: 'danger',
280
+ };
281
+
282
+ const TrendCard = forwardRef<HTMLDivElement, TrendVariantProps>(function TrendCard(
283
+ {
284
+ className,
285
+ value,
286
+ label,
287
+ tone = 'primary',
288
+ delta,
289
+ sparkline,
290
+ sparklineTone,
291
+ variant: _v,
292
+ icon: _i,
293
+ ...rest
294
+ },
295
+ ref,
296
+ ) {
297
+ const resolvedSparkTone: SparkChartTone = sparklineTone ?? SPARK_TONE_FOR[tone] ?? 'primary';
298
+ return (
299
+ <div ref={ref} className={cn(cardShell, 'flex items-center gap-4 px-4 py-3', className)} {...rest}>
300
+ <div className="min-w-0 flex-1">
301
+ <Text as="div" size="label" tone="muted" className="uppercase tracking-wider">
302
+ {label}
303
+ </Text>
304
+ <div className="mt-1 flex items-baseline gap-2">
305
+ <Text as="span" size="stat" weight="bold" className={cn('tabular-nums leading-tight', VALUE_TONE[tone])}>
306
+ {value}
307
+ </Text>
308
+ {delta ? <DeltaIndicator delta={delta} /> : null}
309
+ </div>
310
+ </div>
311
+ <SparkChart
312
+ data={sparkline}
313
+ tone={resolvedSparkTone}
314
+ showArea
315
+ width={96}
316
+ height={40}
317
+ className="shrink-0"
318
+ aria-hidden="true"
319
+ />
320
+ </div>
321
+ );
322
+ });
323
+
324
+ /* ── 5. Progress — value of max + thin bar ────────────────────────── */
325
+
326
+ const ProgressCard = forwardRef<HTMLDivElement, ProgressVariantProps>(function ProgressCard(
327
+ {
328
+ className,
329
+ value,
330
+ label,
331
+ tone = 'primary',
332
+ max,
333
+ valueLabel,
334
+ variant: _v,
335
+ icon: _i,
336
+ ...rest
337
+ },
338
+ ref,
339
+ ) {
340
+ const numericValue = typeof value === 'number' ? value : Number(value) || 0;
341
+ const pct = max > 0 ? Math.max(0, Math.min(100, (numericValue / max) * 100)) : 0;
342
+ const display = valueLabel ?? `${value} / ${max}`;
343
+ return (
344
+ <div ref={ref} className={cn(cardShell, 'space-y-2.5 px-4 py-3', className)} {...rest}>
345
+ <div className="flex items-baseline justify-between gap-2">
346
+ <Text as="div" size="label" tone="muted" className="uppercase tracking-wider">
347
+ {label}
348
+ </Text>
349
+ <Text as="span" size="label" tone="muted" className="tabular-nums">
350
+ {Math.round(pct)}%
351
+ </Text>
352
+ </div>
353
+ <Text as="div" size="stat" weight="bold" className={cn('tabular-nums leading-tight', VALUE_TONE[tone])}>
354
+ {display}
355
+ </Text>
356
+ <div
357
+ role="progressbar"
358
+ aria-valuemin={0}
359
+ aria-valuemax={max}
360
+ aria-valuenow={numericValue}
361
+ aria-label={typeof label === 'string' ? label : undefined}
362
+ className="h-1.5 w-full overflow-hidden rounded-full bg-muted"
363
+ >
364
+ <div
365
+ className={cn('h-full rounded-full transition-[width] duration-500', SEGMENT_TONE[tone])}
366
+ style={{ width: `${pct}%` } as CSSProperties}
367
+ />
368
+ </div>
369
+ </div>
370
+ );
371
+ });
372
+
373
+ /* ── 6. Distribution — value + segmented CategoryBar ──────────────── */
374
+
375
+ const DistributionCard = forwardRef<HTMLDivElement, DistributionVariantProps>(function DistributionCard(
376
+ { className, value, label, tone = 'primary', segments, variant: _v, icon: _i, ...rest },
377
+ ref,
378
+ ) {
379
+ return (
380
+ <div ref={ref} className={cn(cardShell, 'space-y-3 px-4 py-3', className)} {...rest}>
381
+ <div>
382
+ <Text as="div" size="label" tone="muted" className="uppercase tracking-wider">
383
+ {label}
384
+ </Text>
385
+ <Text as="div" size="stat" weight="bold" className={cn('mt-1 tabular-nums leading-tight', VALUE_TONE[tone])}>
386
+ {value}
387
+ </Text>
388
+ </div>
389
+ <CategoryBar data={segments} legendPosition="bottom" />
390
+ </div>
391
+ );
392
+ });
393
+
394
+ /* ── 7. Hero — single huge number ─────────────────────────────────── */
395
+
396
+ const HeroCard = forwardRef<HTMLDivElement, HeroVariantProps>(function HeroCard(
397
+ { className, value, label, tone = 'primary', variant: _v, icon: _i, ...rest },
398
+ ref,
399
+ ) {
400
+ return (
401
+ <div ref={ref} className={cn(cardShell, 'px-6 py-8 text-center', className)} {...rest}>
402
+ <Text
403
+ as="div"
404
+ size="5xl"
405
+ weight="bold"
406
+ className={cn('tabular-nums leading-none', VALUE_TONE[tone])}
407
+ >
408
+ {value}
409
+ </Text>
410
+ <Text as="div" size="sm" tone="muted" className="mt-2 uppercase tracking-wider">
411
+ {label}
412
+ </Text>
413
+ </div>
414
+ );
415
+ });
416
+
417
+ /* ── Backward-compat re-export for any consumer pulling the cva ──── */
418
+
419
+ export const statCardVariants = () =>
420
+ 'rounded-card border border-secondary bg-card py-4 px-3 text-center';
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { forwardRef, useMemo, useState } from 'react';
12
12
  import { FlatList, Pressable, Text, TextInput, View, type ViewProps } from 'react-native';
13
+ import { NATIVE_PLACEHOLDER_COLOR } from '@mihcm/theme';
13
14
  import { cn } from './internal/cn.js';
14
15
 
15
16
  export type TransferListAssignment = Record<string, boolean>;
@@ -99,7 +100,7 @@ export const TransferList = forwardRef<View, TransferListProps>(
99
100
  placeholder={filterPlaceholder}
100
101
  accessibilityLabel={`Filter ${label}`}
101
102
  className="rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground"
102
- placeholderTextColor="#9ca3af"
103
+ placeholderTextColor={NATIVE_PLACEHOLDER_COLOR}
103
104
  />
104
105
  </View>
105
106
  <FlatList
@@ -1,24 +0,0 @@
1
- /**
2
- * TiptapEditor (web variant).
3
- *
4
- * Optional rich text editor powered by Tiptap. The existing
5
- * RichTextEditor remains available for Lexical consumers.
6
- *
7
- * Wiki: docs/components/TiptapEditor.md
8
- */
9
- import { type HTMLAttributes, type ReactNode } from 'react';
10
- import { type Editor } from '@tiptap/react';
11
- export interface TiptapEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'children'> {
12
- value?: string;
13
- defaultValue?: string;
14
- onChange?: (html: string, editor: Editor) => void;
15
- placeholder?: string;
16
- editable?: boolean;
17
- minHeight?: string;
18
- toolbar?: boolean;
19
- toolbarMode?: 'basic' | 'full';
20
- toolbarSlot?: ReactNode | ((editor: Editor) => ReactNode);
21
- editorClassName?: string;
22
- }
23
- export declare const TiptapEditor: import("react").ForwardRefExoticComponent<TiptapEditorProps & import("react").RefAttributes<HTMLDivElement>>;
24
- //# sourceMappingURL=TiptapEditor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TiptapEditor.d.ts","sourceRoot":"","sources":["../src/TiptapEditor.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,OAAO,EAAyB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACnF,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAWtE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAC7C,cAAc,CAAC,cAAc,CAAC,EAC9B,UAAU,GAAG,UAAU,CACxB;IACC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAwED,eAAO,MAAM,YAAY,8GAgOvB,CAAC"}
@@ -1,84 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- /**
4
- * TiptapEditor (web variant).
5
- *
6
- * Optional rich text editor powered by Tiptap. The existing
7
- * RichTextEditor remains available for Lexical consumers.
8
- *
9
- * Wiki: docs/components/TiptapEditor.md
10
- */
11
- import { forwardRef, useEffect } from 'react';
12
- import { EditorContent, useEditor } from '@tiptap/react';
13
- import StarterKit from '@tiptap/starter-kit';
14
- import LinkExtension from '@tiptap/extension-link';
15
- import Placeholder from '@tiptap/extension-placeholder';
16
- import { Table } from '@tiptap/extension-table';
17
- import TableCell from '@tiptap/extension-table-cell';
18
- import TableHeader from '@tiptap/extension-table-header';
19
- import TableRow from '@tiptap/extension-table-row';
20
- import { cn } from './internal/cn.js';
21
- import { Button } from './Button.js';
22
- function ToolbarButton({ active, children, onClick, disabled, }) {
23
- return (_jsx(Button, { type: "button", size: "sm", variant: active ? 'default' : 'outline', disabled: disabled, onClick: onClick, "aria-pressed": active || undefined, children: children }));
24
- }
25
- const SAFE_LINK_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'tel:']);
26
- function isSafeLinkHref(href) {
27
- try {
28
- const parsed = new URL(href, 'https://mihcm.local');
29
- return SAFE_LINK_PROTOCOLS.has(parsed.protocol);
30
- }
31
- catch {
32
- return false;
33
- }
34
- }
35
- function setEditorLink(editor) {
36
- const previousUrl = editor.getAttributes('link').href;
37
- const nextUrl = window.prompt('Link URL', previousUrl ?? 'https://');
38
- if (nextUrl === null) {
39
- return;
40
- }
41
- const trimmedUrl = nextUrl.trim();
42
- if (!trimmedUrl) {
43
- editor.chain().focus().extendMarkRange('link').unsetLink().run();
44
- return;
45
- }
46
- if (!isSafeLinkHref(trimmedUrl)) {
47
- return;
48
- }
49
- editor.chain().focus().extendMarkRange('link').setLink({ href: trimmedUrl }).run();
50
- }
51
- function InsertTableButton({ editor }) {
52
- return (_jsx(ToolbarButton, { onClick: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(), children: "Table" }));
53
- }
54
- export const TiptapEditor = forwardRef(function TiptapEditor({ value, defaultValue = '', onChange, placeholder = 'Start writing...', editable = true, minHeight = '12rem', toolbar = true, toolbarMode = 'full', toolbarSlot, className, editorClassName, ...props }, ref) {
55
- const editor = useEditor({
56
- extensions: [
57
- StarterKit,
58
- LinkExtension.configure({ openOnClick: false, autolink: true }),
59
- Placeholder.configure({ placeholder }),
60
- Table.configure({ resizable: true }),
61
- TableRow,
62
- TableHeader,
63
- TableCell,
64
- ],
65
- content: value ?? defaultValue,
66
- editable,
67
- immediatelyRender: false,
68
- onUpdate: ({ editor: currentEditor }) => onChange?.(currentEditor.getHTML(), currentEditor),
69
- });
70
- useEffect(() => {
71
- editor?.setEditable(editable);
72
- }, [editable, editor]);
73
- useEffect(() => {
74
- if (!editor || value === undefined || editor.getHTML() === value) {
75
- return;
76
- }
77
- editor.commands.setContent(value, { emitUpdate: false });
78
- }, [editor, value]);
79
- if (!editor) {
80
- return (_jsx("div", { ref: ref, className: cn('rounded-xl border border-border bg-card p-4 text-sm text-muted-foreground shadow-mi-card', className), ...props, children: "Loading editor..." }));
81
- }
82
- return (_jsxs("div", { ref: ref, className: cn('overflow-hidden rounded-xl border border-border bg-card shadow-mi-card', className), ...props, children: [toolbar ? (_jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b border-border bg-muted/40 p-2", children: [_jsx(ToolbarButton, { active: editor.isActive('paragraph'), onClick: () => editor.chain().focus().setParagraph().run(), children: "Paragraph" }), _jsx(ToolbarButton, { active: editor.isActive('heading', { level: 1 }), onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), children: "H1" }), _jsx(ToolbarButton, { active: editor.isActive('heading', { level: 2 }), onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), children: "H2" }), _jsx(ToolbarButton, { active: editor.isActive('heading', { level: 3 }), onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), children: "H3" }), _jsx(ToolbarButton, { active: editor.isActive('bold'), onClick: () => editor.chain().focus().toggleBold().run(), children: "Bold" }), _jsx(ToolbarButton, { active: editor.isActive('italic'), onClick: () => editor.chain().focus().toggleItalic().run(), children: "Italic" }), _jsx(ToolbarButton, { active: editor.isActive('strike'), onClick: () => editor.chain().focus().toggleStrike().run(), children: "Strike" }), _jsx(ToolbarButton, { active: editor.isActive('code'), onClick: () => editor.chain().focus().toggleCode().run(), children: "Code" }), _jsx(ToolbarButton, { active: editor.isActive('bulletList'), onClick: () => editor.chain().focus().toggleBulletList().run(), children: "Bullets" }), _jsx(ToolbarButton, { active: editor.isActive('orderedList'), onClick: () => editor.chain().focus().toggleOrderedList().run(), children: "Numbered" }), toolbarMode === 'full' ? (_jsxs(_Fragment, { children: [_jsx(ToolbarButton, { active: editor.isActive('blockquote'), onClick: () => editor.chain().focus().toggleBlockquote().run(), children: "Quote" }), _jsx(ToolbarButton, { active: editor.isActive('codeBlock'), onClick: () => editor.chain().focus().toggleCodeBlock().run(), children: "Code block" }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHorizontalRule().run(), children: "Rule" }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHardBreak().run(), children: "Break" }), _jsx(ToolbarButton, { active: editor.isActive('link'), onClick: () => setEditorLink(editor), children: "Link" }), _jsx(ToolbarButton, { disabled: !editor.isActive('link'), onClick: () => editor.chain().focus().extendMarkRange('link').unsetLink().run(), children: "Unlink" }), _jsx(InsertTableButton, { editor: editor }), _jsx(ToolbarButton, { disabled: !editor.can().addColumnAfter(), onClick: () => editor.chain().focus().addColumnAfter().run(), children: "Column +" }), _jsx(ToolbarButton, { disabled: !editor.can().deleteColumn(), onClick: () => editor.chain().focus().deleteColumn().run(), children: "Column -" }), _jsx(ToolbarButton, { disabled: !editor.can().addRowAfter(), onClick: () => editor.chain().focus().addRowAfter().run(), children: "Row +" }), _jsx(ToolbarButton, { disabled: !editor.can().deleteRow(), onClick: () => editor.chain().focus().deleteRow().run(), children: "Row -" }), _jsx(ToolbarButton, { disabled: !editor.can().deleteTable(), onClick: () => editor.chain().focus().deleteTable().run(), children: "Delete table" }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().unsetAllMarks().clearNodes().run(), children: "Clear" })] })) : null, _jsx(ToolbarButton, { disabled: !editor.can().undo(), onClick: () => editor.chain().focus().undo().run(), children: "Undo" }), _jsx(ToolbarButton, { disabled: !editor.can().redo(), onClick: () => editor.chain().focus().redo().run(), children: "Redo" }), typeof toolbarSlot === 'function' ? toolbarSlot(editor) : toolbarSlot] })) : null, _jsx(EditorContent, { editor: editor, className: cn('prose prose-sm max-w-none p-4 text-foreground outline-none prose-headings:text-foreground prose-p:my-2 prose-a:text-primary', '[&_.ProseMirror]:outline-none', editorClassName), style: { minHeight } })] }));
83
- });
84
- //# sourceMappingURL=TiptapEditor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TiptapEditor.js","sourceRoot":"","sources":["../src/TiptapEditor.tsx"],"names":[],"mappings":"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"}