minm-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +15 -0
- package/src/components/UiAreaChart.vue +117 -0
- package/src/components/UiBadge.vue +34 -0
- package/src/components/UiBarChart.vue +50 -0
- package/src/components/UiButton.vue +54 -0
- package/src/components/UiCard.vue +28 -0
- package/src/components/UiDonutChart.vue +73 -0
- package/src/components/UiDrawer.vue +65 -0
- package/src/components/UiEmptyState.vue +17 -0
- package/src/components/UiIcon.vue +76 -0
- package/src/components/UiInput.vue +50 -0
- package/src/components/UiModal.vue +63 -0
- package/src/components/UiPagination.vue +70 -0
- package/src/components/UiSelect.vue +53 -0
- package/src/components/UiSkeleton.vue +17 -0
- package/src/components/UiSpinner.vue +11 -0
- package/src/components/UiStatTile.vue +49 -0
- package/src/components/UiTable.vue +139 -0
- package/src/components/UiTextarea.vue +35 -0
- package/src/components/UiToaster.vue +47 -0
- package/src/composables/useToast.ts +43 -0
- package/src/index.ts +24 -0
- package/src/styles/tokens.css +199 -0
- package/src/types.ts +9 -0
- package/tailwind-preset.cjs +94 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
Confast design tokens
|
|
3
|
+
Brand: "spruce" — a teal-shifted evergreen, thematic to cabins/forest and
|
|
4
|
+
kept deliberately distinct from the semantic success green.
|
|
5
|
+
Theme model: role tokens on :root, redefined for dark via both
|
|
6
|
+
prefers-color-scheme and [data-theme] so the manual toggle always wins.
|
|
7
|
+
========================================================================= */
|
|
8
|
+
|
|
9
|
+
:root {
|
|
10
|
+
/* --- Brand scale (spruce) --- */
|
|
11
|
+
--brand-50: #ecfdf6;
|
|
12
|
+
--brand-100: #d1fae7;
|
|
13
|
+
--brand-200: #a7f3d4;
|
|
14
|
+
--brand-300: #6ee7bb;
|
|
15
|
+
--brand-400: #34d3a0;
|
|
16
|
+
--brand-500: #10b285;
|
|
17
|
+
--brand-600: #0e7c66;
|
|
18
|
+
--brand-700: #0c6353;
|
|
19
|
+
--brand-800: #0d4f43;
|
|
20
|
+
--brand-900: #0c4139;
|
|
21
|
+
--brand-950: #04251f;
|
|
22
|
+
|
|
23
|
+
/* --- Neutral slate (faint green-cool bias) --- */
|
|
24
|
+
--slate-25: #fafbfb;
|
|
25
|
+
--slate-50: #f6f8f7;
|
|
26
|
+
--slate-100: #eceff0;
|
|
27
|
+
--slate-200: #dde3e3;
|
|
28
|
+
--slate-300: #c3cdcd;
|
|
29
|
+
--slate-400: #93a1a1;
|
|
30
|
+
--slate-500: #667474;
|
|
31
|
+
--slate-600: #4c5959;
|
|
32
|
+
--slate-700: #3a4545;
|
|
33
|
+
--slate-800: #232c2c;
|
|
34
|
+
--slate-900: #151b1b;
|
|
35
|
+
--slate-950: #0c1010;
|
|
36
|
+
|
|
37
|
+
/* --- Semantic (independent of brand accent) --- */
|
|
38
|
+
--success: #16a34a;
|
|
39
|
+
--success-bg: #dcfce7;
|
|
40
|
+
--warning: #d97706;
|
|
41
|
+
--warning-bg: #fef3c7;
|
|
42
|
+
--danger: #dc2626;
|
|
43
|
+
--danger-bg: #fee2e2;
|
|
44
|
+
--info: #2563eb;
|
|
45
|
+
--info-bg: #dbeafe;
|
|
46
|
+
|
|
47
|
+
/* --- Role tokens (LIGHT) --- */
|
|
48
|
+
--bg: var(--slate-50);
|
|
49
|
+
--surface: #ffffff;
|
|
50
|
+
--surface-2: var(--slate-50);
|
|
51
|
+
--surface-hover: var(--slate-100);
|
|
52
|
+
--border: var(--slate-200);
|
|
53
|
+
--border-strong: var(--slate-300);
|
|
54
|
+
--text: var(--slate-900);
|
|
55
|
+
--text-muted: var(--slate-500);
|
|
56
|
+
--text-subtle: var(--slate-400);
|
|
57
|
+
--accent: var(--brand-600);
|
|
58
|
+
--accent-hover: var(--brand-700);
|
|
59
|
+
--accent-fg: #ffffff;
|
|
60
|
+
--accent-soft: var(--brand-50);
|
|
61
|
+
--accent-soft-fg: var(--brand-700);
|
|
62
|
+
--ring: color-mix(in srgb, var(--brand-500) 45%, transparent);
|
|
63
|
+
|
|
64
|
+
/* --- Elevation --- */
|
|
65
|
+
--shadow-sm: 0 1px 2px 0 rgb(12 16 16 / 0.05);
|
|
66
|
+
--shadow: 0 1px 3px 0 rgb(12 16 16 / 0.08), 0 1px 2px -1px rgb(12 16 16 / 0.06);
|
|
67
|
+
--shadow-md: 0 4px 12px -2px rgb(12 16 16 / 0.10), 0 2px 6px -3px rgb(12 16 16 / 0.08);
|
|
68
|
+
--shadow-lg: 0 12px 28px -6px rgb(12 16 16 / 0.16), 0 6px 12px -8px rgb(12 16 16 / 0.12);
|
|
69
|
+
|
|
70
|
+
/* --- Radii --- */
|
|
71
|
+
--radius-sm: 6px;
|
|
72
|
+
--radius: 10px;
|
|
73
|
+
--radius-md: 14px;
|
|
74
|
+
--radius-lg: 20px;
|
|
75
|
+
--radius-full: 9999px;
|
|
76
|
+
|
|
77
|
+
color-scheme: light;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Dark theme via OS preference … */
|
|
81
|
+
@media (prefers-color-scheme: dark) {
|
|
82
|
+
:root {
|
|
83
|
+
--bg: var(--slate-950);
|
|
84
|
+
--surface: var(--slate-900);
|
|
85
|
+
--surface-2: #101616;
|
|
86
|
+
--surface-hover: var(--slate-800);
|
|
87
|
+
--border: color-mix(in srgb, var(--slate-700) 70%, transparent);
|
|
88
|
+
--border-strong: var(--slate-600);
|
|
89
|
+
--text: #eef2f1;
|
|
90
|
+
--text-muted: var(--slate-400);
|
|
91
|
+
--text-subtle: var(--slate-500);
|
|
92
|
+
--accent: var(--brand-400);
|
|
93
|
+
--accent-hover: var(--brand-300);
|
|
94
|
+
--accent-fg: #04251f;
|
|
95
|
+
--accent-soft: color-mix(in srgb, var(--brand-500) 16%, transparent);
|
|
96
|
+
--accent-soft-fg: var(--brand-200);
|
|
97
|
+
--ring: color-mix(in srgb, var(--brand-400) 50%, transparent);
|
|
98
|
+
|
|
99
|
+
--success-bg: color-mix(in srgb, var(--success) 20%, transparent);
|
|
100
|
+
--warning-bg: color-mix(in srgb, var(--warning) 20%, transparent);
|
|
101
|
+
--danger-bg: color-mix(in srgb, var(--danger) 20%, transparent);
|
|
102
|
+
--info-bg: color-mix(in srgb, var(--info) 22%, transparent);
|
|
103
|
+
|
|
104
|
+
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);
|
|
105
|
+
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.5), 0 1px 2px -1px rgb(0 0 0 / 0.4);
|
|
106
|
+
--shadow-md: 0 6px 16px -4px rgb(0 0 0 / 0.55);
|
|
107
|
+
--shadow-lg: 0 16px 36px -8px rgb(0 0 0 / 0.6);
|
|
108
|
+
|
|
109
|
+
color-scheme: dark;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* … and explicit toggle, which must beat the media query in both directions. */
|
|
114
|
+
:root[data-theme="dark"] {
|
|
115
|
+
--bg: var(--slate-950);
|
|
116
|
+
--surface: var(--slate-900);
|
|
117
|
+
--surface-2: #101616;
|
|
118
|
+
--surface-hover: var(--slate-800);
|
|
119
|
+
--border: color-mix(in srgb, var(--slate-700) 70%, transparent);
|
|
120
|
+
--border-strong: var(--slate-600);
|
|
121
|
+
--text: #eef2f1;
|
|
122
|
+
--text-muted: var(--slate-400);
|
|
123
|
+
--text-subtle: var(--slate-500);
|
|
124
|
+
--accent: var(--brand-400);
|
|
125
|
+
--accent-hover: var(--brand-300);
|
|
126
|
+
--accent-fg: #04251f;
|
|
127
|
+
--accent-soft: color-mix(in srgb, var(--brand-500) 16%, transparent);
|
|
128
|
+
--accent-soft-fg: var(--brand-200);
|
|
129
|
+
--ring: color-mix(in srgb, var(--brand-400) 50%, transparent);
|
|
130
|
+
--success-bg: color-mix(in srgb, var(--success) 20%, transparent);
|
|
131
|
+
--warning-bg: color-mix(in srgb, var(--warning) 20%, transparent);
|
|
132
|
+
--danger-bg: color-mix(in srgb, var(--danger) 20%, transparent);
|
|
133
|
+
--info-bg: color-mix(in srgb, var(--info) 22%, transparent);
|
|
134
|
+
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);
|
|
135
|
+
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.5), 0 1px 2px -1px rgb(0 0 0 / 0.4);
|
|
136
|
+
--shadow-md: 0 6px 16px -4px rgb(0 0 0 / 0.55);
|
|
137
|
+
--shadow-lg: 0 16px 36px -8px rgb(0 0 0 / 0.6);
|
|
138
|
+
color-scheme: dark;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
:root[data-theme="light"] {
|
|
142
|
+
--bg: var(--slate-50);
|
|
143
|
+
--surface: #ffffff;
|
|
144
|
+
--surface-2: var(--slate-50);
|
|
145
|
+
--surface-hover: var(--slate-100);
|
|
146
|
+
--border: var(--slate-200);
|
|
147
|
+
--border-strong: var(--slate-300);
|
|
148
|
+
--text: var(--slate-900);
|
|
149
|
+
--text-muted: var(--slate-500);
|
|
150
|
+
--text-subtle: var(--slate-400);
|
|
151
|
+
--accent: var(--brand-600);
|
|
152
|
+
--accent-hover: var(--brand-700);
|
|
153
|
+
--accent-fg: #ffffff;
|
|
154
|
+
--accent-soft: var(--brand-50);
|
|
155
|
+
--accent-soft-fg: var(--brand-700);
|
|
156
|
+
--ring: color-mix(in srgb, var(--brand-500) 45%, transparent);
|
|
157
|
+
color-scheme: light;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Base element styling driven entirely by tokens. */
|
|
161
|
+
*,
|
|
162
|
+
*::before,
|
|
163
|
+
*::after { box-sizing: border-box; }
|
|
164
|
+
|
|
165
|
+
body {
|
|
166
|
+
margin: 0;
|
|
167
|
+
background: var(--bg);
|
|
168
|
+
color: var(--text);
|
|
169
|
+
font-family: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
|
|
170
|
+
"Helvetica Neue", Arial, "Apple Color Emoji", sans-serif;
|
|
171
|
+
-webkit-font-smoothing: antialiased;
|
|
172
|
+
text-rendering: optimizeLegibility;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Numeric alignment helper for tables/metrics. */
|
|
176
|
+
.tabular { font-variant-numeric: tabular-nums; }
|
|
177
|
+
|
|
178
|
+
/* Consistent, visible keyboard focus. */
|
|
179
|
+
:focus-visible {
|
|
180
|
+
outline: 2px solid var(--accent);
|
|
181
|
+
outline-offset: 2px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Themed, slim scrollbars. */
|
|
185
|
+
* { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
|
|
186
|
+
*::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
187
|
+
*::-webkit-scrollbar-thumb {
|
|
188
|
+
background: var(--border-strong);
|
|
189
|
+
border-radius: 9999px;
|
|
190
|
+
border: 2px solid transparent;
|
|
191
|
+
background-clip: content-box;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@media (prefers-reduced-motion: reduce) {
|
|
195
|
+
*, *::before, *::after {
|
|
196
|
+
animation-duration: 0.001ms !important;
|
|
197
|
+
transition-duration: 0.001ms !important;
|
|
198
|
+
}
|
|
199
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Tailwind preset for all Confast web apps.
|
|
3
|
+
* Colors map to the CSS variables defined in src/styles/tokens.css so utilities
|
|
4
|
+
* like `bg-surface`, `text-muted`, `bg-accent` are theme-aware automatically.
|
|
5
|
+
*/
|
|
6
|
+
module.exports = {
|
|
7
|
+
darkMode: ['class', '[data-theme="dark"]'],
|
|
8
|
+
theme: {
|
|
9
|
+
extend: {
|
|
10
|
+
colors: {
|
|
11
|
+
brand: {
|
|
12
|
+
50: 'var(--brand-50)',
|
|
13
|
+
100: 'var(--brand-100)',
|
|
14
|
+
200: 'var(--brand-200)',
|
|
15
|
+
300: 'var(--brand-300)',
|
|
16
|
+
400: 'var(--brand-400)',
|
|
17
|
+
500: 'var(--brand-500)',
|
|
18
|
+
600: 'var(--brand-600)',
|
|
19
|
+
700: 'var(--brand-700)',
|
|
20
|
+
800: 'var(--brand-800)',
|
|
21
|
+
900: 'var(--brand-900)',
|
|
22
|
+
950: 'var(--brand-950)',
|
|
23
|
+
},
|
|
24
|
+
bg: 'var(--bg)',
|
|
25
|
+
surface: 'var(--surface)',
|
|
26
|
+
'surface-2': 'var(--surface-2)',
|
|
27
|
+
'surface-hover': 'var(--surface-hover)',
|
|
28
|
+
border: 'var(--border)',
|
|
29
|
+
'border-strong': 'var(--border-strong)',
|
|
30
|
+
content: 'var(--text)',
|
|
31
|
+
muted: 'var(--text-muted)',
|
|
32
|
+
subtle: 'var(--text-subtle)',
|
|
33
|
+
accent: 'var(--accent)',
|
|
34
|
+
'accent-hover': 'var(--accent-hover)',
|
|
35
|
+
'accent-fg': 'var(--accent-fg)',
|
|
36
|
+
'accent-soft': 'var(--accent-soft)',
|
|
37
|
+
'accent-soft-fg': 'var(--accent-soft-fg)',
|
|
38
|
+
success: 'var(--success)',
|
|
39
|
+
'success-bg': 'var(--success-bg)',
|
|
40
|
+
warning: 'var(--warning)',
|
|
41
|
+
'warning-bg': 'var(--warning-bg)',
|
|
42
|
+
danger: 'var(--danger)',
|
|
43
|
+
'danger-bg': 'var(--danger-bg)',
|
|
44
|
+
info: 'var(--info)',
|
|
45
|
+
'info-bg': 'var(--info-bg)',
|
|
46
|
+
},
|
|
47
|
+
borderColor: {
|
|
48
|
+
DEFAULT: 'var(--border)',
|
|
49
|
+
},
|
|
50
|
+
borderRadius: {
|
|
51
|
+
sm: 'var(--radius-sm)',
|
|
52
|
+
DEFAULT: 'var(--radius)',
|
|
53
|
+
md: 'var(--radius-md)',
|
|
54
|
+
lg: 'var(--radius-lg)',
|
|
55
|
+
full: 'var(--radius-full)',
|
|
56
|
+
},
|
|
57
|
+
boxShadow: {
|
|
58
|
+
sm: 'var(--shadow-sm)',
|
|
59
|
+
DEFAULT: 'var(--shadow)',
|
|
60
|
+
md: 'var(--shadow-md)',
|
|
61
|
+
lg: 'var(--shadow-lg)',
|
|
62
|
+
},
|
|
63
|
+
fontFamily: {
|
|
64
|
+
sans: [
|
|
65
|
+
'Inter', 'ui-sans-serif', 'system-ui', '-apple-system', 'Segoe UI',
|
|
66
|
+
'Roboto', 'Helvetica Neue', 'Arial', 'sans-serif',
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
ringColor: {
|
|
70
|
+
DEFAULT: 'var(--ring)',
|
|
71
|
+
},
|
|
72
|
+
keyframes: {
|
|
73
|
+
'fade-in': { from: { opacity: '0' }, to: { opacity: '1' } },
|
|
74
|
+
'slide-up': {
|
|
75
|
+
from: { opacity: '0', transform: 'translateY(8px)' },
|
|
76
|
+
to: { opacity: '1', transform: 'translateY(0)' },
|
|
77
|
+
},
|
|
78
|
+
'slide-in-right': {
|
|
79
|
+
from: { transform: 'translateX(100%)' },
|
|
80
|
+
to: { transform: 'translateX(0)' },
|
|
81
|
+
},
|
|
82
|
+
shimmer: {
|
|
83
|
+
'100%': { transform: 'translateX(100%)' },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
animation: {
|
|
87
|
+
'fade-in': 'fade-in 0.2s ease-out',
|
|
88
|
+
'slide-up': 'slide-up 0.25s cubic-bezier(0.16,1,0.3,1)',
|
|
89
|
+
'slide-in-right': 'slide-in-right 0.25s cubic-bezier(0.16,1,0.3,1)',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
plugins: [],
|
|
94
|
+
};
|