minka-ds 0.3.7 → 0.3.9
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 +1 -1
- package/src/components/ui/button-group.tsx +1 -1
- package/src/components/ui/input-group.tsx +1 -1
- package/src/components/ui/input.tsx +1 -1
- package/src/components/ui/search-bar.tsx +47 -106
- package/src/components/ui/tab-count.tsx +1 -1
- package/tokens/primitives.css +19 -19
- package/tokens/semantic.css +306 -0
package/package.json
CHANGED
|
@@ -55,7 +55,7 @@ function ButtonGroupText({
|
|
|
55
55
|
return (
|
|
56
56
|
<Comp
|
|
57
57
|
className={cn(
|
|
58
|
-
"flex items-center gap-2 [border-radius:var(--radius-button)] border border-[var(--color-border-default)] bg-[var(--color-bg-raised)] px-4 text-label text-[var(--color-text-muted)] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
|
|
58
|
+
"flex h-9 items-center gap-2 [border-radius:var(--radius-button)] border border-[var(--color-border-default)] bg-[var(--color-bg-raised)] px-4 text-label text-[var(--color-text-muted)] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
|
|
59
59
|
className
|
|
60
60
|
)}
|
|
61
61
|
{...props}
|
|
@@ -120,7 +120,7 @@ function InputGroupText({ className, ...props }: React.ComponentProps<"span">) {
|
|
|
120
120
|
return (
|
|
121
121
|
<span
|
|
122
122
|
className={cn(
|
|
123
|
-
"flex items-center gap-2 text-body-sm text-[var(--color-text-muted)] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
|
|
123
|
+
"flex items-center gap-2 px-3 text-body-sm text-[var(--color-text-muted)] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
|
|
124
124
|
className
|
|
125
125
|
)}
|
|
126
126
|
{...props}
|
|
@@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
|
8
8
|
type={type}
|
|
9
9
|
data-slot="input"
|
|
10
10
|
className={cn(
|
|
11
|
-
"h-9 w-full min-w-0 [border-radius:var(--radius-input)] border border-[var(--color-border-default)] bg-
|
|
11
|
+
"h-9 w-full min-w-0 [border-radius:var(--radius-input)] border border-[var(--color-border-default)] bg-[var(--color-bg-raised)] px-3 py-1 text-body-sm shadow-xs transition-[color,box-shadow] outline-none selection:bg-[var(--color-action-primary-default)] selection:text-[var(--color-action-primary-foreground)] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-label-sm file:text-[var(--color-text-default)] placeholder:text-[var(--color-text-hint)] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
12
12
|
"focus-visible:border-[var(--color-border-focus)] focus-visible:ring-[3px] focus-visible:ring-[var(--color-border-focus)]/50",
|
|
13
13
|
"aria-invalid:border-[var(--color-border-error)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--color-border-error)]/20",
|
|
14
14
|
className
|
|
@@ -6,7 +6,6 @@ import type { DateRange } from "react-day-picker"
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "../../lib/utils"
|
|
8
8
|
import type { DateTimeRange } from "./date-time-range-picker"
|
|
9
|
-
import { Button } from "./button"
|
|
10
9
|
import { FilterChip } from "./filter-chip"
|
|
11
10
|
import { FilterCombobox } from "./filter-combobox"
|
|
12
11
|
import type { FilterCategory, CategoryValue } from "./filter-combobox"
|
|
@@ -90,9 +89,8 @@ function SearchBar({
|
|
|
90
89
|
children,
|
|
91
90
|
className,
|
|
92
91
|
}: SearchBarProps) {
|
|
93
|
-
const hasActiveFilters
|
|
94
|
-
const
|
|
95
|
-
const showFilterBar = hasActiveFilters || alwaysShowFilterBar
|
|
92
|
+
const hasActiveFilters = Object.values(activeFilters).some(v => v.length > 0)
|
|
93
|
+
const showFilterBar = hasActiveFilters || alwaysShowFilterBar
|
|
96
94
|
|
|
97
95
|
return (
|
|
98
96
|
<div data-search-bar className={cn("relative flex flex-col", className)}>
|
|
@@ -116,31 +114,14 @@ function SearchBar({
|
|
|
116
114
|
onFocus={onFocus}
|
|
117
115
|
autoComplete="off"
|
|
118
116
|
/>
|
|
119
|
-
{(!!value || (
|
|
117
|
+
{(!!value || (!value && !!kbdHint)) && (
|
|
120
118
|
<InputGroupAddon align="inline-end">
|
|
121
119
|
{value && (
|
|
122
120
|
<InputGroupButton size="sm" variant="ghost" onClick={() => onChange("")} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-default)]">
|
|
123
121
|
<XIcon className="size-4" />
|
|
124
122
|
</InputGroupButton>
|
|
125
123
|
)}
|
|
126
|
-
{!value && kbdHint &&
|
|
127
|
-
{hasFilterCategories && !hasActiveFilters && !alwaysShowFilterBar && (
|
|
128
|
-
<>
|
|
129
|
-
{!value && kbdHint && <Kbd>{kbdHint}</Kbd>}
|
|
130
|
-
<span className="h-4 w-px bg-[var(--color-border-default)]" />
|
|
131
|
-
<FilterCombobox
|
|
132
|
-
categories={filterCategories}
|
|
133
|
-
onApply={onApplyFilter ?? (() => {})}
|
|
134
|
-
activeFilters={activeFilters}
|
|
135
|
-
dropdownAlign="right"
|
|
136
|
-
trigger={({ onClick }) => (
|
|
137
|
-
<InputGroupButton size="sm" variant="ghost" onClick={onClick} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-default)]">
|
|
138
|
-
Advanced search
|
|
139
|
-
</InputGroupButton>
|
|
140
|
-
)}
|
|
141
|
-
/>
|
|
142
|
-
</>
|
|
143
|
-
)}
|
|
124
|
+
{!value && kbdHint && <Kbd>{kbdHint}</Kbd>}
|
|
144
125
|
</InputGroupAddon>
|
|
145
126
|
)}
|
|
146
127
|
</InputGroup>
|
|
@@ -148,98 +129,58 @@ function SearchBar({
|
|
|
148
129
|
{/* Filter bar */}
|
|
149
130
|
{showFilterBar && (
|
|
150
131
|
<div className="flex flex-wrap items-center gap-3 [border-bottom-left-radius:var(--radius-card)] [border-bottom-right-radius:var(--radius-card)] border border-t-0 border-[var(--color-border-default)] bg-[var(--color-bg-raised)] px-3 py-2.5">
|
|
151
|
-
{
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
activeFilters={activeFilters}
|
|
166
|
-
trigger={({ onClick }) => (
|
|
167
|
-
<FilterChip
|
|
168
|
-
label={cat.label}
|
|
169
|
-
values={activeVals.map(v => ({
|
|
170
|
-
label: filterValueLabel(cat.id, v),
|
|
171
|
-
onRemove: cat.type === "datetime" ? undefined : () => onRemoveFilter?.(cat.id, v),
|
|
172
|
-
}))}
|
|
173
|
-
onLabelClick={onClick}
|
|
174
|
-
/>
|
|
175
|
-
)}
|
|
176
|
-
/>
|
|
177
|
-
)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return (
|
|
181
|
-
<FilterCombobox
|
|
182
|
-
key={cat.id}
|
|
183
|
-
categories={[cat]}
|
|
184
|
-
onApply={onApplyFilter ?? (() => {})}
|
|
185
|
-
activeFilters={activeFilters}
|
|
186
|
-
trigger={({ onClick }) => (
|
|
187
|
-
<button
|
|
188
|
-
type="button"
|
|
189
|
-
onClick={onClick}
|
|
190
|
-
className="inline-flex items-center gap-1 rounded-full border border-[var(--color-border-default)] px-2 py-0.5 text-caption text-[var(--color-text-muted)] hover:text-[var(--color-text-default)] hover:border-[var(--color-border-hover,var(--color-border-default))] transition-colors"
|
|
191
|
-
>
|
|
192
|
-
{cat.label}
|
|
193
|
-
<PlusIcon className="size-3 shrink-0" />
|
|
194
|
-
</button>
|
|
195
|
-
)}
|
|
196
|
-
/>
|
|
197
|
-
)
|
|
198
|
-
})}
|
|
199
|
-
{hasActiveFilters && (
|
|
200
|
-
<FilterChip
|
|
201
|
-
variant="clear-all"
|
|
202
|
-
className="ml-auto"
|
|
203
|
-
onClear={onClearFilters ?? (() => {})}
|
|
204
|
-
/>
|
|
205
|
-
)}
|
|
206
|
-
</>
|
|
207
|
-
) : (
|
|
208
|
-
// Legacy mode: active chips + generic Add button
|
|
209
|
-
<>
|
|
210
|
-
{Object.entries(activeFilters)
|
|
211
|
-
.filter(([, vals]) => vals.length > 0)
|
|
212
|
-
.map(([categoryId, values]) => {
|
|
213
|
-
const cat = filterCategories.find(c => c.id === categoryId)
|
|
214
|
-
return (
|
|
132
|
+
{/* One trigger per category, active ones show chips */}
|
|
133
|
+
<span className="text-caption text-[var(--color-text-default)] shrink-0">Filters:</span>
|
|
134
|
+
{filterCategories.map(cat => {
|
|
135
|
+
const activeVals = activeFilters[cat.id] ?? []
|
|
136
|
+
const hasActive = activeVals.length > 0
|
|
137
|
+
|
|
138
|
+
if (hasActive) {
|
|
139
|
+
return (
|
|
140
|
+
<FilterCombobox
|
|
141
|
+
key={cat.id}
|
|
142
|
+
categories={[cat]}
|
|
143
|
+
onApply={onApplyFilter ?? (() => {})}
|
|
144
|
+
activeFilters={activeFilters}
|
|
145
|
+
trigger={({ onClick }) => (
|
|
215
146
|
<FilterChip
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
onRemove: () => onRemoveFilter?.(categoryId, v),
|
|
147
|
+
label={cat.label}
|
|
148
|
+
values={activeVals.map(v => ({
|
|
149
|
+
label: filterValueLabel(cat.id, v),
|
|
150
|
+
onRemove: cat.type === "datetime" ? undefined : () => onRemoveFilter?.(cat.id, v),
|
|
221
151
|
}))}
|
|
222
|
-
onLabelClick={
|
|
152
|
+
onLabelClick={onClick}
|
|
223
153
|
/>
|
|
224
|
-
)
|
|
225
|
-
|
|
154
|
+
)}
|
|
155
|
+
/>
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return (
|
|
226
160
|
<FilterCombobox
|
|
227
|
-
|
|
161
|
+
key={cat.id}
|
|
162
|
+
categories={[cat]}
|
|
228
163
|
onApply={onApplyFilter ?? (() => {})}
|
|
229
164
|
activeFilters={activeFilters}
|
|
230
165
|
trigger={({ onClick }) => (
|
|
231
|
-
<
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
166
|
+
<button
|
|
167
|
+
type="button"
|
|
168
|
+
onClick={onClick}
|
|
169
|
+
className="inline-flex items-center gap-1 rounded-full border border-[var(--color-border-default)] px-2 py-0.5 text-caption text-[var(--color-text-muted)] hover:text-[var(--color-text-default)] hover:border-[var(--color-border-hover,var(--color-border-default))] transition-colors"
|
|
170
|
+
>
|
|
171
|
+
{cat.label}
|
|
172
|
+
<PlusIcon className="size-3 shrink-0" />
|
|
173
|
+
</button>
|
|
235
174
|
)}
|
|
236
175
|
/>
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
176
|
+
)
|
|
177
|
+
})}
|
|
178
|
+
{hasActiveFilters && (
|
|
179
|
+
<FilterChip
|
|
180
|
+
variant="clear-all"
|
|
181
|
+
className="ml-auto"
|
|
182
|
+
onClear={onClearFilters ?? (() => {})}
|
|
183
|
+
/>
|
|
243
184
|
)}
|
|
244
185
|
</div>
|
|
245
186
|
)}
|
|
@@ -10,7 +10,7 @@ function TabCount({ count, className }: TabCountProps) {
|
|
|
10
10
|
return (
|
|
11
11
|
<span
|
|
12
12
|
className={cn(
|
|
13
|
-
"inline-flex items-center justify-center rounded-full bg-[var(--color-bg-disabled)] text-[var(--color-text-default)] text-[10px] font-semibold leading-none
|
|
13
|
+
"inline-flex items-center justify-center rounded-full bg-[var(--color-bg-disabled)] text-[var(--color-text-default)] text-[10px] font-semibold leading-none min-w-4 h-4 px-1 shrink-0",
|
|
14
14
|
className
|
|
15
15
|
)}
|
|
16
16
|
>
|
package/tokens/primitives.css
CHANGED
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
--primitive-beige-950: oklch(0.230 0.020 98);
|
|
36
36
|
|
|
37
37
|
--primitive-red-50: oklch(0.95 0.03 28);
|
|
38
|
-
--primitive-red-100: oklch(0.
|
|
38
|
+
--primitive-red-100: oklch(0.933859 0.034874 39.988);
|
|
39
39
|
--primitive-red-200: oklch(0.89 0.07 28);
|
|
40
40
|
--primitive-red-300: oklch(0.84 0.11 28);
|
|
41
41
|
--primitive-red-400: oklch(0.79 0.16 28);
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
--primitive-yellow-900: oklch(0.3 0.07 98);
|
|
71
71
|
--primitive-yellow-950: oklch(0.25 0.06 98);
|
|
72
72
|
|
|
73
|
-
--primitive-lulo-50: oklch(0.
|
|
73
|
+
--primitive-lulo-50: oklch(0.9654 0.1157 112.05);
|
|
74
74
|
--primitive-lulo-100: oklch(0.918 0.136 116);
|
|
75
75
|
--primitive-lulo-200: oklch(0.869 0.173 114);
|
|
76
76
|
--primitive-lulo-300: oklch(0.82 0.21 112);
|
|
@@ -99,12 +99,12 @@
|
|
|
99
99
|
--primitive-aquamarine-200: oklch(0.85 0.24 167);
|
|
100
100
|
--primitive-aquamarine-300: oklch(0.8 0.22 167);
|
|
101
101
|
--primitive-aquamarine-400: oklch(0.74 0.21 167);
|
|
102
|
-
--primitive-aquamarine-500: oklch(0.
|
|
103
|
-
--primitive-aquamarine-600: oklch(0.
|
|
104
|
-
--primitive-aquamarine-700: oklch(0.
|
|
105
|
-
--primitive-aquamarine-800: oklch(0.
|
|
106
|
-
--primitive-aquamarine-900: oklch(0.
|
|
107
|
-
--primitive-aquamarine-950: oklch(0.
|
|
102
|
+
--primitive-aquamarine-500: oklch(0.642 0.165 167);
|
|
103
|
+
--primitive-aquamarine-600: oklch(0.544 0.120 167);
|
|
104
|
+
--primitive-aquamarine-700: oklch(0.446 0.075 168);
|
|
105
|
+
--primitive-aquamarine-800: oklch(0.3479 0.0291 167.95);
|
|
106
|
+
--primitive-aquamarine-900: oklch(0.268 0.022 168);
|
|
107
|
+
--primitive-aquamarine-950: oklch(0.218 0.016 168);
|
|
108
108
|
|
|
109
109
|
--primitive-sea-50: oklch(0.94 0.04 220);
|
|
110
110
|
--primitive-sea-100: oklch(0.92 0.06 220);
|
|
@@ -118,17 +118,17 @@
|
|
|
118
118
|
--primitive-sea-900: oklch(0.29 0.07 220);
|
|
119
119
|
--primitive-sea-950: oklch(0.24 0.06 220);
|
|
120
120
|
|
|
121
|
-
--primitive-slate-50: oklch(0.
|
|
122
|
-
--primitive-slate-100: oklch(0.
|
|
123
|
-
--primitive-slate-200: oklch(0.
|
|
124
|
-
--primitive-slate-300: oklch(0.
|
|
125
|
-
--primitive-slate-400: oklch(0.762 0.
|
|
126
|
-
--primitive-slate-500: oklch(0.
|
|
127
|
-
--primitive-slate-600: oklch(0.
|
|
128
|
-
--primitive-slate-700: oklch(0.
|
|
129
|
-
--primitive-slate-800: oklch(0.
|
|
130
|
-
--primitive-slate-900: oklch(0.
|
|
131
|
-
--primitive-slate-950: oklch(0.
|
|
121
|
+
--primitive-slate-50: oklch(0.965 0.010 225);
|
|
122
|
+
--primitive-slate-100: oklch(0.930 0.018 226);
|
|
123
|
+
--primitive-slate-200: oklch(0.880 0.030 228);
|
|
124
|
+
--primitive-slate-300: oklch(0.825 0.044 229);
|
|
125
|
+
--primitive-slate-400: oklch(0.762 0.055 231);
|
|
126
|
+
--primitive-slate-500: oklch(0.6916 0.0616 232.57);
|
|
127
|
+
--primitive-slate-600: oklch(0.580 0.045 243);
|
|
128
|
+
--primitive-slate-700: oklch(0.468 0.030 254);
|
|
129
|
+
--primitive-slate-800: oklch(0.3555 0.0149 264.37);
|
|
130
|
+
--primitive-slate-900: oklch(0.270 0.012 268);
|
|
131
|
+
--primitive-slate-950: oklch(0.215 0.010 270);
|
|
132
132
|
|
|
133
133
|
--primitive-blue-50: oklch(0.95 0.03 257);
|
|
134
134
|
--primitive-blue-100: oklch(0.93 0.04 257);
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Minka DS — Semantic tokens (source of truth)
|
|
3
|
+
*
|
|
4
|
+
* Requires primitives.css to be imported first.
|
|
5
|
+
*
|
|
6
|
+
* Usage in your app's globals.css:
|
|
7
|
+
* @import "minka-ds/tokens/primitives.css";
|
|
8
|
+
* @import "minka-ds/tokens/semantic.css";
|
|
9
|
+
*
|
|
10
|
+
* Your existing globals.css definitions will override these if kept —
|
|
11
|
+
* compare and remove your local copy when ready to migrate.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/* ── Light mode ──────────────────────────────────────────────────── */
|
|
15
|
+
:root {
|
|
16
|
+
/* shadcn surface slots */
|
|
17
|
+
--background: var(--color-bg-base);
|
|
18
|
+
--foreground: var(--color-text-default);
|
|
19
|
+
--card: var(--color-bg-raised);
|
|
20
|
+
--card-foreground: var(--color-text-default);
|
|
21
|
+
--popover: var(--color-bg-overlay);
|
|
22
|
+
--popover-foreground: var(--color-text-default);
|
|
23
|
+
|
|
24
|
+
/* interactive */
|
|
25
|
+
--primary: var(--color-action-primary-default);
|
|
26
|
+
--primary-foreground: var(--color-action-primary-foreground);
|
|
27
|
+
--secondary: var(--color-action-secondary-default);
|
|
28
|
+
--secondary-foreground: var(--color-action-secondary-foreground);
|
|
29
|
+
--accent: var(--color-action-ghost-hover);
|
|
30
|
+
--accent-foreground: var(--color-action-ghost-foreground);
|
|
31
|
+
|
|
32
|
+
/* muted */
|
|
33
|
+
--muted: var(--color-bg-disabled);
|
|
34
|
+
--muted-foreground: var(--color-text-muted);
|
|
35
|
+
|
|
36
|
+
/* status */
|
|
37
|
+
--destructive: var(--color-action-destructive-default);
|
|
38
|
+
--destructive-foreground: var(--color-action-destructive-foreground);
|
|
39
|
+
|
|
40
|
+
/* borders & inputs */
|
|
41
|
+
--border: var(--color-border-default);
|
|
42
|
+
--input: var(--color-border-default);
|
|
43
|
+
--ring: var(--color-border-focus);
|
|
44
|
+
|
|
45
|
+
/* radius */
|
|
46
|
+
--radius: var(--primitive-radius-lg);
|
|
47
|
+
|
|
48
|
+
/* component radius aliases */
|
|
49
|
+
--radius-button: var(--primitive-radius-md);
|
|
50
|
+
--radius-input: var(--primitive-radius-md);
|
|
51
|
+
--radius-card: var(--primitive-radius-lg);
|
|
52
|
+
--radius-modal: var(--primitive-radius-xl);
|
|
53
|
+
--radius-popover: var(--primitive-radius-lg);
|
|
54
|
+
--radius-tooltip: var(--primitive-radius-xs);
|
|
55
|
+
--radius-badge: var(--primitive-radius-full);
|
|
56
|
+
--radius-tag: var(--primitive-radius-sm);
|
|
57
|
+
--radius-avatar: var(--primitive-radius-full);
|
|
58
|
+
|
|
59
|
+
/* charts */
|
|
60
|
+
--chart-1: var(--primitive-neutral-300);
|
|
61
|
+
--chart-2: var(--primitive-neutral-500);
|
|
62
|
+
--chart-3: var(--primitive-neutral-600);
|
|
63
|
+
--chart-4: var(--primitive-neutral-700);
|
|
64
|
+
--chart-5: var(--primitive-neutral-800);
|
|
65
|
+
|
|
66
|
+
/* sidebar */
|
|
67
|
+
--sidebar: var(--color-bg-base);
|
|
68
|
+
--sidebar-foreground: var(--color-text-default);
|
|
69
|
+
--sidebar-primary: var(--color-action-primary-default);
|
|
70
|
+
--sidebar-primary-foreground: var(--color-action-primary-foreground);
|
|
71
|
+
--sidebar-accent: var(--color-action-ghost-hover);
|
|
72
|
+
--sidebar-accent-foreground: var(--color-action-ghost-foreground);
|
|
73
|
+
--sidebar-border: var(--color-border-subtle);
|
|
74
|
+
--sidebar-ring: var(--color-border-focus);
|
|
75
|
+
|
|
76
|
+
/* product backgrounds */
|
|
77
|
+
--color-bg-canvas: var(--primitive-neutral-100);
|
|
78
|
+
--color-bg-base: var(--primitive-neutral-50);
|
|
79
|
+
--color-bg-table-hover: color-mix(in srgb, var(--primitive-neutral-50) 50%, transparent);
|
|
80
|
+
--color-bg-table-selected: var(--primitive-slate-50);
|
|
81
|
+
--color-bg-raised: var(--primitive-neutral-0);
|
|
82
|
+
--color-bg-overlay: var(--primitive-neutral-0);
|
|
83
|
+
--color-bg-inverted: var(--primitive-neutral-900);
|
|
84
|
+
--color-bg-disabled: var(--primitive-neutral-100);
|
|
85
|
+
--color-bg-success: var(--primitive-green-50);
|
|
86
|
+
--color-bg-error: var(--primitive-red-50);
|
|
87
|
+
--color-bg-warning: var(--primitive-yellow-50);
|
|
88
|
+
--color-bg-info: var(--primitive-slate-50);
|
|
89
|
+
--color-bg-backdrop: oklch(0 0 0 / 50%);
|
|
90
|
+
--color-bg-backdrop-heavy: oklch(0 0 0 / 70%);
|
|
91
|
+
--color-bg-glass: oklch(1 0 0 / 80%);
|
|
92
|
+
--color-bg-glass-subtle: oklch(1 0 0 / 60%);
|
|
93
|
+
|
|
94
|
+
/* product text */
|
|
95
|
+
--color-text-default: var(--primitive-neutral-950);
|
|
96
|
+
--color-text-muted: var(--primitive-neutral-600);
|
|
97
|
+
--color-text-hint: var(--primitive-neutral-400);
|
|
98
|
+
--color-text-disabled: var(--primitive-neutral-300);
|
|
99
|
+
--color-text-inverse: var(--primitive-neutral-0);
|
|
100
|
+
--color-text-inverse-muted: var(--primitive-neutral-500);
|
|
101
|
+
--color-text-link: var(--primitive-blue-600);
|
|
102
|
+
--color-text-link-hover: var(--primitive-blue-700);
|
|
103
|
+
--color-text-link-active: var(--primitive-blue-800);
|
|
104
|
+
--color-text-link-visited: var(--primitive-purple-600);
|
|
105
|
+
--color-text-success: var(--primitive-green-700);
|
|
106
|
+
--color-text-error: var(--primitive-red-600);
|
|
107
|
+
--color-text-warning: var(--primitive-yellow-700);
|
|
108
|
+
--color-text-info: var(--primitive-slate-600);
|
|
109
|
+
|
|
110
|
+
/* product borders */
|
|
111
|
+
--color-border-subtle: var(--primitive-neutral-100);
|
|
112
|
+
--color-border-default: var(--primitive-neutral-200);
|
|
113
|
+
--color-border-strong: var(--primitive-neutral-300);
|
|
114
|
+
--color-border-inverse: var(--primitive-neutral-900);
|
|
115
|
+
--color-border-focus: var(--primitive-slate-500);
|
|
116
|
+
--color-border-disabled: var(--primitive-neutral-200);
|
|
117
|
+
--color-border-success: var(--primitive-green-500);
|
|
118
|
+
--color-border-error: var(--primitive-red-500);
|
|
119
|
+
--color-border-warning: var(--primitive-yellow-500);
|
|
120
|
+
--color-border-info: var(--primitive-slate-500);
|
|
121
|
+
|
|
122
|
+
/* product actions */
|
|
123
|
+
--color-action-primary-default: var(--primitive-slate-700);
|
|
124
|
+
--color-action-primary-hover: var(--primitive-slate-800);
|
|
125
|
+
--color-action-primary-pressed: var(--primitive-slate-900);
|
|
126
|
+
--color-action-primary-disabled: var(--primitive-neutral-200);
|
|
127
|
+
--color-action-primary-foreground: var(--primitive-neutral-0);
|
|
128
|
+
|
|
129
|
+
--color-action-secondary-default: var(--primitive-neutral-100);
|
|
130
|
+
--color-action-secondary-hover: var(--primitive-neutral-200);
|
|
131
|
+
--color-action-secondary-pressed: var(--primitive-neutral-300);
|
|
132
|
+
--color-action-secondary-disabled: var(--primitive-neutral-100);
|
|
133
|
+
--color-action-secondary-foreground: var(--primitive-neutral-900);
|
|
134
|
+
|
|
135
|
+
--color-action-ghost-default: transparent;
|
|
136
|
+
--color-action-ghost-hover: var(--primitive-neutral-100);
|
|
137
|
+
--color-action-ghost-pressed: var(--primitive-neutral-200);
|
|
138
|
+
--color-action-ghost-disabled: transparent;
|
|
139
|
+
--color-action-ghost-foreground: var(--primitive-neutral-900);
|
|
140
|
+
|
|
141
|
+
--color-action-destructive-default: var(--primitive-red-500);
|
|
142
|
+
--color-action-destructive-hover: var(--primitive-red-600);
|
|
143
|
+
--color-action-destructive-pressed: var(--primitive-red-700);
|
|
144
|
+
--color-action-destructive-disabled: var(--primitive-neutral-200);
|
|
145
|
+
--color-action-destructive-foreground: var(--primitive-neutral-0);
|
|
146
|
+
|
|
147
|
+
/* product feedback */
|
|
148
|
+
--color-feedback-success: var(--primitive-green-700);
|
|
149
|
+
--color-feedback-error: var(--primitive-red-600);
|
|
150
|
+
--color-feedback-warning: var(--primitive-yellow-400);
|
|
151
|
+
--color-feedback-info: var(--primitive-slate-600);
|
|
152
|
+
|
|
153
|
+
/* brand colors */
|
|
154
|
+
--color-brand-beige: var(--primitive-beige-100);
|
|
155
|
+
--color-brand-yellow: var(--primitive-lulo-50);
|
|
156
|
+
--color-brand-rose: var(--primitive-red-100);
|
|
157
|
+
--color-brand-coral: var(--primitive-red-500);
|
|
158
|
+
--color-brand-blue: var(--primitive-slate-500);
|
|
159
|
+
--color-brand-darkforest: var(--primitive-aquamarine-800);
|
|
160
|
+
--color-brand-navy: var(--primitive-slate-800);
|
|
161
|
+
--color-brand-bronze: var(--primitive-bronze-900);
|
|
162
|
+
|
|
163
|
+
/* z-index aliases */
|
|
164
|
+
--z-sticky: var(--primitive-z-raised);
|
|
165
|
+
--z-dropdown: var(--primitive-z-dropdown);
|
|
166
|
+
--z-popover: var(--primitive-z-overlay);
|
|
167
|
+
--z-backdrop: var(--primitive-z-overlay);
|
|
168
|
+
--z-modal: var(--primitive-z-modal);
|
|
169
|
+
--z-floating: var(--primitive-z-floating);
|
|
170
|
+
--z-toast: var(--primitive-z-toast);
|
|
171
|
+
--z-tooltip: var(--primitive-z-tooltip);
|
|
172
|
+
|
|
173
|
+
/* shadows */
|
|
174
|
+
--shadow-card: var(--primitive-shadow-xs);
|
|
175
|
+
--shadow-popover: var(--primitive-shadow-md);
|
|
176
|
+
--shadow-modal: var(--primitive-shadow-lg);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* ── Dark mode ───────────────────────────────────────────────────── */
|
|
180
|
+
.dark {
|
|
181
|
+
/* shadcn surface slots */
|
|
182
|
+
--background: var(--color-bg-canvas);
|
|
183
|
+
--foreground: var(--color-text-default);
|
|
184
|
+
--card: var(--color-bg-raised);
|
|
185
|
+
--card-foreground: var(--color-text-default);
|
|
186
|
+
--popover: var(--color-bg-overlay);
|
|
187
|
+
--popover-foreground: var(--color-text-default);
|
|
188
|
+
|
|
189
|
+
/* interactive */
|
|
190
|
+
--primary: var(--color-action-primary-default);
|
|
191
|
+
--primary-foreground: var(--color-action-primary-foreground);
|
|
192
|
+
--secondary: var(--color-action-secondary-default);
|
|
193
|
+
--secondary-foreground: var(--color-action-secondary-foreground);
|
|
194
|
+
--accent: var(--color-action-ghost-hover);
|
|
195
|
+
--accent-foreground: var(--color-action-ghost-foreground);
|
|
196
|
+
|
|
197
|
+
/* muted */
|
|
198
|
+
--muted: var(--color-bg-disabled);
|
|
199
|
+
--muted-foreground: var(--color-text-muted);
|
|
200
|
+
|
|
201
|
+
/* status */
|
|
202
|
+
--destructive: var(--color-action-destructive-default);
|
|
203
|
+
--destructive-foreground: var(--color-action-destructive-foreground);
|
|
204
|
+
|
|
205
|
+
/* borders & inputs */
|
|
206
|
+
--border: var(--color-border-default);
|
|
207
|
+
--input: var(--color-border-default);
|
|
208
|
+
--ring: var(--color-border-focus);
|
|
209
|
+
|
|
210
|
+
/* charts */
|
|
211
|
+
--chart-1: var(--primitive-neutral-300);
|
|
212
|
+
--chart-2: var(--primitive-neutral-500);
|
|
213
|
+
--chart-3: var(--primitive-neutral-600);
|
|
214
|
+
--chart-4: var(--primitive-neutral-700);
|
|
215
|
+
--chart-5: var(--primitive-neutral-800);
|
|
216
|
+
|
|
217
|
+
/* sidebar */
|
|
218
|
+
--sidebar: var(--color-bg-base);
|
|
219
|
+
--sidebar-foreground: var(--color-text-default);
|
|
220
|
+
--sidebar-primary: var(--color-action-primary-default);
|
|
221
|
+
--sidebar-primary-foreground: var(--color-action-primary-foreground);
|
|
222
|
+
--sidebar-accent: var(--color-action-ghost-hover);
|
|
223
|
+
--sidebar-accent-foreground: var(--color-action-ghost-foreground);
|
|
224
|
+
--sidebar-border: var(--color-border-subtle);
|
|
225
|
+
--sidebar-ring: var(--color-border-focus);
|
|
226
|
+
|
|
227
|
+
/* product backgrounds */
|
|
228
|
+
--color-bg-canvas: var(--primitive-neutral-950);
|
|
229
|
+
--color-bg-base: var(--primitive-neutral-900);
|
|
230
|
+
--color-bg-raised: var(--primitive-neutral-800);
|
|
231
|
+
--color-bg-overlay: var(--primitive-neutral-700);
|
|
232
|
+
--color-bg-inverted: var(--primitive-neutral-50);
|
|
233
|
+
--color-bg-disabled: var(--primitive-neutral-800);
|
|
234
|
+
--color-bg-success: var(--primitive-green-900);
|
|
235
|
+
--color-bg-error: var(--primitive-red-900);
|
|
236
|
+
--color-bg-warning: var(--primitive-yellow-900);
|
|
237
|
+
--color-bg-info: var(--primitive-slate-900);
|
|
238
|
+
--color-bg-backdrop: oklch(0 0 0 / 50%);
|
|
239
|
+
--color-bg-backdrop-heavy: oklch(0 0 0 / 70%);
|
|
240
|
+
--color-bg-glass: oklch(0 0 0 / 80%);
|
|
241
|
+
--color-bg-glass-subtle: oklch(0 0 0 / 60%);
|
|
242
|
+
|
|
243
|
+
/* product text */
|
|
244
|
+
--color-text-default: var(--primitive-neutral-50);
|
|
245
|
+
--color-text-muted: var(--primitive-neutral-400);
|
|
246
|
+
--color-text-hint: var(--primitive-neutral-600);
|
|
247
|
+
--color-text-disabled: var(--primitive-neutral-700);
|
|
248
|
+
--color-text-inverse: var(--primitive-neutral-950);
|
|
249
|
+
--color-text-inverse-muted: var(--primitive-neutral-600);
|
|
250
|
+
--color-text-link: var(--primitive-blue-300);
|
|
251
|
+
--color-text-link-hover: var(--primitive-blue-200);
|
|
252
|
+
--color-text-link-active: var(--primitive-blue-100);
|
|
253
|
+
--color-text-link-visited: var(--primitive-purple-300);
|
|
254
|
+
--color-text-success: var(--primitive-green-400);
|
|
255
|
+
--color-text-error: var(--primitive-red-400);
|
|
256
|
+
--color-text-warning: var(--primitive-yellow-400);
|
|
257
|
+
--color-text-info: var(--primitive-slate-400);
|
|
258
|
+
|
|
259
|
+
/* product borders */
|
|
260
|
+
--color-border-subtle: var(--primitive-neutral-800);
|
|
261
|
+
--color-border-default: var(--primitive-neutral-700);
|
|
262
|
+
--color-border-strong: var(--primitive-neutral-500);
|
|
263
|
+
--color-border-inverse: var(--primitive-neutral-100);
|
|
264
|
+
--color-border-focus: var(--primitive-slate-400);
|
|
265
|
+
--color-border-disabled: var(--primitive-neutral-700);
|
|
266
|
+
--color-border-success: var(--primitive-green-500);
|
|
267
|
+
--color-border-error: var(--primitive-red-500);
|
|
268
|
+
--color-border-warning: var(--primitive-yellow-500);
|
|
269
|
+
--color-border-info: var(--primitive-slate-400);
|
|
270
|
+
|
|
271
|
+
/* product actions */
|
|
272
|
+
--color-action-primary-default: var(--primitive-slate-100);
|
|
273
|
+
--color-action-primary-hover: var(--primitive-slate-50);
|
|
274
|
+
--color-action-primary-pressed: var(--primitive-slate-200);
|
|
275
|
+
--color-action-primary-disabled: var(--primitive-neutral-700);
|
|
276
|
+
--color-action-primary-foreground: var(--primitive-slate-900);
|
|
277
|
+
|
|
278
|
+
--color-action-secondary-default: var(--primitive-neutral-800);
|
|
279
|
+
--color-action-secondary-hover: var(--primitive-neutral-700);
|
|
280
|
+
--color-action-secondary-pressed: var(--primitive-neutral-600);
|
|
281
|
+
--color-action-secondary-disabled: var(--primitive-neutral-800);
|
|
282
|
+
--color-action-secondary-foreground: var(--primitive-neutral-50);
|
|
283
|
+
|
|
284
|
+
--color-action-ghost-default: transparent;
|
|
285
|
+
--color-action-ghost-hover: var(--primitive-neutral-800);
|
|
286
|
+
--color-action-ghost-pressed: var(--primitive-neutral-700);
|
|
287
|
+
--color-action-ghost-disabled: transparent;
|
|
288
|
+
--color-action-ghost-foreground: var(--primitive-neutral-50);
|
|
289
|
+
|
|
290
|
+
--color-action-destructive-default: var(--primitive-red-500);
|
|
291
|
+
--color-action-destructive-hover: var(--primitive-red-400);
|
|
292
|
+
--color-action-destructive-pressed: var(--primitive-red-600);
|
|
293
|
+
--color-action-destructive-disabled: var(--primitive-neutral-700);
|
|
294
|
+
--color-action-destructive-foreground: var(--primitive-neutral-0);
|
|
295
|
+
|
|
296
|
+
/* product feedback */
|
|
297
|
+
--color-feedback-success: var(--primitive-green-400);
|
|
298
|
+
--color-feedback-error: var(--primitive-red-400);
|
|
299
|
+
--color-feedback-warning: var(--primitive-yellow-300);
|
|
300
|
+
--color-feedback-info: var(--primitive-slate-400);
|
|
301
|
+
|
|
302
|
+
/* shadows */
|
|
303
|
+
--shadow-card: none;
|
|
304
|
+
--shadow-popover: var(--primitive-shadow-lg);
|
|
305
|
+
--shadow-modal: var(--primitive-shadow-xl);
|
|
306
|
+
}
|