@mihcm/ui 0.14.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CheckboxGrid.native.d.ts.map +1 -1
- package/dist/CheckboxGrid.native.js +2 -1
- package/dist/CheckboxGrid.native.js.map +1 -1
- package/dist/Combobox.native.d.ts.map +1 -1
- package/dist/Combobox.native.js +2 -1
- package/dist/Combobox.native.js.map +1 -1
- package/dist/DataTable/column-filter.d.ts +8 -0
- package/dist/DataTable/column-filter.d.ts.map +1 -0
- package/dist/DataTable/column-filter.js +67 -0
- package/dist/DataTable/column-filter.js.map +1 -0
- package/dist/DataTable/column-header.d.ts +16 -0
- package/dist/DataTable/column-header.d.ts.map +1 -0
- package/dist/DataTable/column-header.js +11 -0
- package/dist/DataTable/column-header.js.map +1 -0
- package/dist/DataTable/column-visibility.d.ts +7 -0
- package/dist/DataTable/column-visibility.d.ts.map +1 -0
- package/dist/DataTable/column-visibility.js +35 -0
- package/dist/DataTable/column-visibility.js.map +1 -0
- package/dist/DataTable/index.d.ts +5 -0
- package/dist/DataTable/index.d.ts.map +1 -0
- package/dist/DataTable/index.js +5 -0
- package/dist/DataTable/index.js.map +1 -0
- package/dist/DataTable/pinning.d.ts +13 -0
- package/dist/DataTable/pinning.d.ts.map +1 -0
- package/dist/DataTable/pinning.js +29 -0
- package/dist/DataTable/pinning.js.map +1 -0
- package/dist/DataTable.d.ts +3 -7
- package/dist/DataTable.d.ts.map +1 -1
- package/dist/DataTable.js +7 -126
- package/dist/DataTable.js.map +1 -1
- package/dist/Dialog.native.d.ts +3 -1
- package/dist/Dialog.native.d.ts.map +1 -1
- package/dist/Dialog.native.js +2 -2
- package/dist/Dialog.native.js.map +1 -1
- package/dist/Form/building-blocks.d.ts +26 -0
- package/dist/Form/building-blocks.d.ts.map +1 -0
- package/dist/Form/building-blocks.js +29 -0
- package/dist/Form/building-blocks.js.map +1 -0
- package/dist/Form/fields-choice.d.ts +72 -0
- package/dist/Form/fields-choice.d.ts.map +1 -0
- package/dist/Form/fields-choice.js +69 -0
- package/dist/Form/fields-choice.js.map +1 -0
- package/dist/Form/fields-complex.d.ts +28 -0
- package/dist/Form/fields-complex.d.ts.map +1 -0
- package/dist/Form/fields-complex.js +38 -0
- package/dist/Form/fields-complex.js.map +1 -0
- package/dist/Form/fields-date.d.ts +46 -0
- package/dist/Form/fields-date.d.ts.map +1 -0
- package/dist/Form/fields-date.js +41 -0
- package/dist/Form/fields-date.js.map +1 -0
- package/dist/Form/fields-text.d.ts +47 -0
- package/dist/Form/fields-text.d.ts.map +1 -0
- package/dist/Form/fields-text.js +46 -0
- package/dist/Form/fields-text.js.map +1 -0
- package/dist/Form/fields-toggle.d.ts +24 -0
- package/dist/Form/fields-toggle.d.ts.map +1 -0
- package/dist/Form/fields-toggle.js +32 -0
- package/dist/Form/fields-toggle.js.map +1 -0
- package/dist/Form/helpers.d.ts +66 -0
- package/dist/Form/helpers.d.ts.map +1 -0
- package/dist/Form/helpers.js +44 -0
- package/dist/Form/helpers.js.map +1 -0
- package/dist/Form/types.d.ts +25 -0
- package/dist/Form/types.d.ts.map +1 -0
- package/dist/Form/types.js +8 -0
- package/dist/Form/types.js.map +1 -0
- package/dist/Form.d.ts +24 -298
- package/dist/Form.d.ts.map +1 -1
- package/dist/Form.js +30 -246
- package/dist/Form.js.map +1 -1
- package/dist/IconSidebar.d.ts +6 -46
- package/dist/IconSidebar.d.ts.map +1 -1
- package/dist/IconSidebar.js +6 -116
- package/dist/IconSidebar.js.map +1 -1
- package/dist/MainSidebar/back-button.d.ts +14 -0
- package/dist/MainSidebar/back-button.d.ts.map +1 -0
- package/dist/MainSidebar/back-button.js +14 -0
- package/dist/MainSidebar/back-button.js.map +1 -0
- package/dist/MainSidebar/breadcrumb.d.ts +10 -0
- package/dist/MainSidebar/breadcrumb.d.ts.map +1 -0
- package/dist/MainSidebar/breadcrumb.js +24 -0
- package/dist/MainSidebar/breadcrumb.js.map +1 -0
- package/dist/MainSidebar/columns.d.ts +3 -0
- package/dist/MainSidebar/columns.d.ts.map +1 -0
- package/dist/MainSidebar/columns.js +198 -0
- package/dist/MainSidebar/columns.js.map +1 -0
- package/dist/MainSidebar/command.d.ts +3 -0
- package/dist/MainSidebar/command.d.ts.map +1 -0
- package/dist/MainSidebar/command.js +193 -0
- package/dist/MainSidebar/command.js.map +1 -0
- package/dist/MainSidebar/drilldown.d.ts +3 -0
- package/dist/MainSidebar/drilldown.d.ts.map +1 -0
- package/dist/MainSidebar/drilldown.js +154 -0
- package/dist/MainSidebar/drilldown.js.map +1 -0
- package/dist/MainSidebar/expanded.d.ts +7 -0
- package/dist/MainSidebar/expanded.d.ts.map +1 -0
- package/dist/MainSidebar/expanded.js +102 -0
- package/dist/MainSidebar/expanded.js.map +1 -0
- package/dist/MainSidebar/floating.d.ts +3 -0
- package/dist/MainSidebar/floating.d.ts.map +1 -0
- package/dist/MainSidebar/floating.js +116 -0
- package/dist/MainSidebar/floating.js.map +1 -0
- package/dist/MainSidebar/helpers.d.ts +50 -0
- package/dist/MainSidebar/helpers.d.ts.map +1 -0
- package/dist/MainSidebar/helpers.js +148 -0
- package/dist/MainSidebar/helpers.js.map +1 -0
- package/dist/MainSidebar/hover.d.ts +3 -0
- package/dist/MainSidebar/hover.d.ts.map +1 -0
- package/dist/MainSidebar/hover.js +177 -0
- package/dist/MainSidebar/hover.js.map +1 -0
- package/dist/MainSidebar/index.d.ts +6 -0
- package/dist/MainSidebar/index.d.ts.map +1 -0
- package/dist/MainSidebar/index.js +108 -0
- package/dist/MainSidebar/index.js.map +1 -0
- package/dist/MainSidebar/mobile.d.ts +29 -0
- package/dist/MainSidebar/mobile.d.ts.map +1 -0
- package/dist/MainSidebar/mobile.js +38 -0
- package/dist/MainSidebar/mobile.js.map +1 -0
- package/dist/MainSidebar/motion.d.ts +23 -0
- package/dist/MainSidebar/motion.d.ts.map +1 -0
- package/dist/MainSidebar/motion.js +40 -0
- package/dist/MainSidebar/motion.js.map +1 -0
- package/dist/MainSidebar/rail.d.ts +24 -0
- package/dist/MainSidebar/rail.d.ts.map +1 -0
- package/dist/MainSidebar/rail.js +29 -0
- package/dist/MainSidebar/rail.js.map +1 -0
- package/dist/MainSidebar/search.d.ts +19 -0
- package/dist/MainSidebar/search.d.ts.map +1 -0
- package/dist/MainSidebar/search.js +33 -0
- package/dist/MainSidebar/search.js.map +1 -0
- package/dist/MainSidebar/types.d.ts +161 -0
- package/dist/MainSidebar/types.d.ts.map +1 -0
- package/dist/MainSidebar/types.js +2 -0
- package/dist/MainSidebar/types.js.map +1 -0
- package/dist/MainSidebar.d.ts +6 -1
- package/dist/MainSidebar.d.ts.map +1 -1
- package/dist/MainSidebar.js +6 -1
- package/dist/MainSidebar.js.map +1 -1
- package/dist/NavigationMenu.js +1 -1
- package/dist/NavigationMenu.js.map +1 -1
- package/dist/RichTextEditor/theme.d.ts +44 -0
- package/dist/RichTextEditor/theme.d.ts.map +1 -0
- package/dist/RichTextEditor/theme.js +41 -0
- package/dist/RichTextEditor/theme.js.map +1 -0
- package/dist/RichTextEditor/toolbar-icons.d.ts +21 -0
- package/dist/RichTextEditor/toolbar-icons.d.ts.map +1 -0
- package/dist/RichTextEditor/toolbar-icons.js +21 -0
- package/dist/RichTextEditor/toolbar-icons.js.map +1 -0
- package/dist/RichTextEditor/toolbar.d.ts +5 -0
- package/dist/RichTextEditor/toolbar.d.ts.map +1 -0
- package/dist/RichTextEditor/toolbar.js +116 -0
- package/dist/RichTextEditor/toolbar.js.map +1 -0
- package/dist/RichTextEditor.d.ts +16 -9
- package/dist/RichTextEditor.d.ts.map +1 -1
- package/dist/RichTextEditor.js +18 -164
- package/dist/RichTextEditor.js.map +1 -1
- package/dist/Select/content.d.ts +9 -0
- package/dist/Select/content.d.ts.map +1 -0
- package/dist/Select/content.js +80 -0
- package/dist/Select/content.js.map +1 -0
- package/dist/Select/context.d.ts +27 -0
- package/dist/Select/context.d.ts.map +1 -0
- package/dist/Select/context.js +35 -0
- package/dist/Select/context.js.map +1 -0
- package/dist/Select/item.d.ts +13 -0
- package/dist/Select/item.d.ts.map +1 -0
- package/dist/Select/item.js +39 -0
- package/dist/Select/item.js.map +1 -0
- package/dist/Select/parts.d.ts +14 -0
- package/dist/Select/parts.d.ts.map +1 -0
- package/dist/Select/parts.js +17 -0
- package/dist/Select/parts.js.map +1 -0
- package/dist/Select/react-select.d.ts +25 -0
- package/dist/Select/react-select.d.ts.map +1 -0
- package/dist/Select/react-select.js +66 -0
- package/dist/Select/react-select.js.map +1 -0
- package/dist/Select/root.d.ts +15 -0
- package/dist/Select/root.d.ts.map +1 -0
- package/dist/Select/root.js +41 -0
- package/dist/Select/root.js.map +1 -0
- package/dist/Select/trigger.d.ts +15 -0
- package/dist/Select/trigger.d.ts.map +1 -0
- package/dist/Select/trigger.js +61 -0
- package/dist/Select/trigger.js.map +1 -0
- package/dist/Select.d.ts +14 -62
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +14 -293
- package/dist/Select.js.map +1 -1
- package/dist/Sidebar/context.d.ts +28 -0
- package/dist/Sidebar/context.d.ts.map +1 -0
- package/dist/Sidebar/context.js +37 -0
- package/dist/Sidebar/context.js.map +1 -0
- package/dist/Sidebar/group.d.ts +13 -0
- package/dist/Sidebar/group.d.ts.map +1 -0
- package/dist/Sidebar/group.js +20 -0
- package/dist/Sidebar/group.js.map +1 -0
- package/dist/Sidebar/icons.d.ts +7 -0
- package/dist/Sidebar/icons.d.ts.map +1 -0
- package/dist/Sidebar/icons.js +12 -0
- package/dist/Sidebar/icons.js.map +1 -0
- package/dist/Sidebar/layout.d.ts +9 -0
- package/dist/Sidebar/layout.d.ts.map +1 -0
- package/dist/Sidebar/layout.js +21 -0
- package/dist/Sidebar/layout.js.map +1 -0
- package/dist/Sidebar/menu.d.ts +29 -0
- package/dist/Sidebar/menu.d.ts.map +1 -0
- package/dist/Sidebar/menu.js +55 -0
- package/dist/Sidebar/menu.js.map +1 -0
- package/dist/Sidebar/provider.d.ts +33 -0
- package/dist/Sidebar/provider.d.ts.map +1 -0
- package/dist/Sidebar/provider.js +110 -0
- package/dist/Sidebar/provider.js.map +1 -0
- package/dist/Sidebar/sidebar.d.ts +17 -0
- package/dist/Sidebar/sidebar.d.ts.map +1 -0
- package/dist/Sidebar/sidebar.js +51 -0
- package/dist/Sidebar/sidebar.js.map +1 -0
- package/dist/Sidebar/submenu.d.ts +13 -0
- package/dist/Sidebar/submenu.d.ts.map +1 -0
- package/dist/Sidebar/submenu.js +17 -0
- package/dist/Sidebar/submenu.js.map +1 -0
- package/dist/Sidebar/trigger.d.ts +9 -0
- package/dist/Sidebar/trigger.d.ts.map +1 -0
- package/dist/Sidebar/trigger.js +33 -0
- package/dist/Sidebar/trigger.js.map +1 -0
- package/dist/Sidebar.d.ts +14 -104
- package/dist/Sidebar.d.ts.map +1 -1
- package/dist/Sidebar.js +14 -300
- package/dist/Sidebar.js.map +1 -1
- package/dist/StatCard.d.ts +67 -9
- package/dist/StatCard.d.ts.map +1 -1
- package/dist/StatCard.js +111 -9
- package/dist/StatCard.js.map +1 -1
- package/dist/TransferList.native.d.ts.map +1 -1
- package/dist/TransferList.native.js +2 -1
- package/dist/TransferList.native.js.map +1 -1
- package/package.json +2 -2
- package/src/CheckboxGrid.native.tsx +2 -1
- package/src/Combobox.native.tsx +2 -1
- package/src/DataTable/column-filter.tsx +134 -0
- package/src/DataTable/column-header.tsx +67 -0
- package/src/DataTable/column-visibility.tsx +87 -0
- package/src/DataTable/index.ts +4 -0
- package/src/DataTable/pinning.ts +40 -0
- package/src/DataTable.tsx +14 -297
- package/src/Dialog.native.tsx +4 -2
- package/src/Form/building-blocks.tsx +97 -0
- package/src/Form/fields-choice.tsx +312 -0
- package/src/Form/fields-complex.tsx +195 -0
- package/src/Form/fields-date.tsx +195 -0
- package/src/Form/fields-text.tsx +218 -0
- package/src/Form/fields-toggle.tsx +123 -0
- package/src/Form/helpers.tsx +189 -0
- package/src/Form/types.ts +26 -0
- package/src/Form.tsx +91 -1308
- package/src/IconSidebar.tsx +20 -442
- package/src/MainSidebar/back-button.tsx +58 -0
- package/src/MainSidebar/breadcrumb.tsx +53 -0
- package/src/MainSidebar/columns.tsx +350 -0
- package/src/MainSidebar/command.tsx +404 -0
- package/src/MainSidebar/drilldown.tsx +373 -0
- package/src/MainSidebar/expanded.tsx +414 -0
- package/src/MainSidebar/floating.tsx +268 -0
- package/src/MainSidebar/helpers.ts +164 -0
- package/src/MainSidebar/hover.tsx +334 -0
- package/src/MainSidebar/index.tsx +191 -0
- package/src/MainSidebar/mobile.tsx +117 -0
- package/src/MainSidebar/motion.ts +64 -0
- package/src/MainSidebar/rail.tsx +137 -0
- package/src/MainSidebar/search.tsx +99 -0
- package/src/MainSidebar/types.ts +208 -0
- package/src/MainSidebar.tsx +15 -4
- package/src/NavigationMenu.tsx +1 -1
- package/src/RichTextEditor/theme.ts +43 -0
- package/src/RichTextEditor/toolbar-icons.tsx +40 -0
- package/src/RichTextEditor/toolbar.tsx +271 -0
- package/src/RichTextEditor.tsx +23 -371
- package/src/Select/content.tsx +111 -0
- package/src/Select/context.tsx +66 -0
- package/src/Select/item.tsx +97 -0
- package/src/Select/parts.tsx +43 -0
- package/src/Select/react-select.tsx +216 -0
- package/src/Select/root.tsx +75 -0
- package/src/Select/trigger.tsx +122 -0
- package/src/Select.tsx +34 -692
- package/src/Sidebar/context.tsx +72 -0
- package/src/Sidebar/group.tsx +69 -0
- package/src/Sidebar/icons.tsx +42 -0
- package/src/Sidebar/layout.tsx +64 -0
- package/src/Sidebar/menu.tsx +171 -0
- package/src/Sidebar/provider.tsx +224 -0
- package/src/Sidebar/sidebar.tsx +178 -0
- package/src/Sidebar/submenu.tsx +58 -0
- package/src/Sidebar/trigger.tsx +104 -0
- package/src/Sidebar.tsx +44 -927
- package/src/StatCard.tsx +365 -20
- package/src/TransferList.native.tsx +2 -1
- package/dist/TiptapEditor.d.ts +0 -24
- package/dist/TiptapEditor.d.ts.map +0 -1
- package/dist/TiptapEditor.js +0 -84
- 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
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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
|
-
|
|
56
|
-
|
|
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(
|
|
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(
|
|
72
|
-
|
|
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=
|
|
103
|
+
placeholderTextColor={NATIVE_PLACEHOLDER_COLOR}
|
|
103
104
|
/>
|
|
104
105
|
</View>
|
|
105
106
|
<FlatList
|
package/dist/TiptapEditor.d.ts
DELETED
|
@@ -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"}
|
package/dist/TiptapEditor.js
DELETED
|
@@ -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
|
package/dist/TiptapEditor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TiptapEditor.js","sourceRoot":"","sources":["../src/TiptapEditor.tsx"],"names":[],"mappings":"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"}
|