@ponti-studios/ui 1.8.0 → 2.0.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.
- package/README.md +54 -20
- package/dist/styles.css +3 -0
- package/package.json +28 -9
- package/scripts/create-project.mjs +86 -0
- package/src/components/forms/checkbox.stories.tsx +35 -0
- package/src/components/forms/checkbox.tsx +38 -0
- package/src/components/forms/index.ts +2 -0
- package/src/components/forms/label.stories.tsx +16 -0
- package/src/components/forms/label.tsx +25 -0
- package/src/components/forms/select.tsx +3 -1
- package/src/components/overlays/bottom-sheet.stories.tsx +52 -0
- package/src/components/overlays/bottom-sheet.tsx +179 -0
- package/src/components/overlays/command.tsx +1 -1
- package/src/components/overlays/dropdown-menu.tsx +6 -2
- package/src/components/overlays/index.ts +2 -0
- package/src/components/overlays/popover.tsx +12 -3
- package/src/components/overlays/tooltip.stories.tsx +29 -0
- package/src/components/overlays/tooltip.tsx +41 -0
- package/src/components/primitives/index.ts +2 -0
- package/src/components/primitives/segmented-control.stories.tsx +54 -0
- package/src/components/primitives/segmented-control.tsx +73 -0
- package/src/components/primitives/separator.stories.tsx +34 -0
- package/src/components/primitives/separator.tsx +27 -0
- package/src/index.ts +2 -0
- package/src/native/components.tsx +198 -0
- package/src/native/index.ts +2 -0
- package/src/native/theme.tsx +69 -0
- package/src/styles/build.ts +1 -0
- package/src/styles/index.css +94 -0
- package/src/styles/package.css +3 -0
- package/src/styles/tokens/generated/dark-class.css +39 -0
- package/src/styles/tokens/generated/dark.colors.generated.ts +31 -31
- package/src/styles/tokens/generated/dark.css +31 -31
- package/src/styles/tokens/generated/foundations.css +2 -2
- package/src/styles/tokens/generated/foundations.generated.ts +2 -0
- package/src/styles/tokens/generated/light.colors.generated.ts +30 -30
- package/src/styles/tokens/generated/light.css +30 -30
- package/src/styles/tokens/index.ts +6 -6
- package/src/styles/tokens/scripts/check-source.mjs +9 -6
- package/src/styles/tokens/source/dark.tokens.json +33 -32
- package/src/styles/tokens/source/foundations.tokens.json +2 -0
- package/src/styles/tokens/source/light.tokens.json +32 -31
- package/src/styles/tokens/style-dictionary.dark-class.json +16 -0
- package/templates/web-vite/index.html +13 -0
- package/templates/web-vite/package.json +27 -0
- package/templates/web-vite/src/App.tsx +31 -0
- package/templates/web-vite/src/main.tsx +12 -0
- package/templates/web-vite/src/styles.css +110 -0
- package/templates/web-vite/tsconfig.json +21 -0
- package/templates/web-vite/vite.config.ts +6 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
|
+
import { Pressable, Text, View, type PressableProps, type StyleProp, type ViewStyle } from "react-native";
|
|
3
|
+
import { useNativeTheme } from "./theme";
|
|
4
|
+
|
|
5
|
+
export type NativeButtonVariant = "primary" | "secondary" | "ghost" | "destructive";
|
|
6
|
+
export type NativeButtonSize = "small" | "medium" | "large";
|
|
7
|
+
|
|
8
|
+
export interface NativeButtonProps {
|
|
9
|
+
label: string;
|
|
10
|
+
onPress: PressableProps["onPress"];
|
|
11
|
+
variant?: NativeButtonVariant;
|
|
12
|
+
size?: NativeButtonSize;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
accessibilityLabel?: string;
|
|
16
|
+
accessibilityHint?: string;
|
|
17
|
+
leading?: ReactNode;
|
|
18
|
+
style?: StyleProp<ViewStyle>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function NativeButton({
|
|
22
|
+
label,
|
|
23
|
+
onPress,
|
|
24
|
+
variant = "primary",
|
|
25
|
+
size = "medium",
|
|
26
|
+
disabled = false,
|
|
27
|
+
loading = false,
|
|
28
|
+
accessibilityLabel,
|
|
29
|
+
accessibilityHint,
|
|
30
|
+
leading,
|
|
31
|
+
style,
|
|
32
|
+
}: NativeButtonProps) {
|
|
33
|
+
const { colors, spacing, textSizes, fontWeights, radii } = useNativeTheme();
|
|
34
|
+
const isDisabled = disabled || loading;
|
|
35
|
+
const [backgroundColor, foregroundColor] = isDisabled
|
|
36
|
+
? [colors.muted, colors.tertiary]
|
|
37
|
+
: buttonColors(variant, colors);
|
|
38
|
+
const verticalPadding = size === "small" ? spacing["2"] : size === "large" ? spacing["4"] : spacing["3"];
|
|
39
|
+
const horizontalPadding = size === "small" ? spacing["3"] : spacing["4"];
|
|
40
|
+
const fontSize = size === "small" ? textSizes.sm : size === "large" ? textSizes.lg : textSizes.base;
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<Pressable
|
|
44
|
+
accessibilityRole="button"
|
|
45
|
+
accessibilityLabel={accessibilityLabel ?? label}
|
|
46
|
+
accessibilityHint={accessibilityHint}
|
|
47
|
+
accessibilityState={{ disabled: isDisabled, busy: loading }}
|
|
48
|
+
disabled={isDisabled}
|
|
49
|
+
onPress={onPress}
|
|
50
|
+
style={[
|
|
51
|
+
{
|
|
52
|
+
minHeight: size === "large" ? spacing["14"] : spacing["12"],
|
|
53
|
+
paddingHorizontal: horizontalPadding,
|
|
54
|
+
paddingVertical: verticalPadding,
|
|
55
|
+
borderRadius: radii.lg,
|
|
56
|
+
backgroundColor,
|
|
57
|
+
alignItems: "center",
|
|
58
|
+
justifyContent: "center",
|
|
59
|
+
flexDirection: "row",
|
|
60
|
+
gap: spacing["2"],
|
|
61
|
+
},
|
|
62
|
+
style,
|
|
63
|
+
]}
|
|
64
|
+
>
|
|
65
|
+
{leading}
|
|
66
|
+
<Text style={{ color: foregroundColor, fontSize, fontWeight: fontWeights.semibold }}>{label}</Text>
|
|
67
|
+
</Pressable>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function buttonColors(variant: NativeButtonVariant, colors: ReturnType<typeof useNativeTheme>["colors"]): [string, string] {
|
|
72
|
+
switch (variant) {
|
|
73
|
+
case "primary":
|
|
74
|
+
return [colors.primary, colors["primary-foreground"]];
|
|
75
|
+
case "destructive":
|
|
76
|
+
return [colors.destructive, colors["destructive-foreground"]];
|
|
77
|
+
case "secondary":
|
|
78
|
+
return [colors.secondary, colors["text-primary"]];
|
|
79
|
+
case "ghost":
|
|
80
|
+
return ["transparent", colors["text-primary"]];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface NativeSurfaceProps {
|
|
85
|
+
children: ReactNode;
|
|
86
|
+
tone?: "card" | "muted" | "background";
|
|
87
|
+
style?: StyleProp<ViewStyle>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function NativeSurface({ children, tone = "card", style }: NativeSurfaceProps) {
|
|
91
|
+
const { colors, spacing, radii } = useNativeTheme();
|
|
92
|
+
const backgroundColor = tone === "muted" ? colors.muted : tone === "background" ? colors.background : colors.card;
|
|
93
|
+
return (
|
|
94
|
+
<View
|
|
95
|
+
style={[
|
|
96
|
+
{
|
|
97
|
+
backgroundColor,
|
|
98
|
+
borderColor: colors["border-default"],
|
|
99
|
+
borderWidth: spacing.px,
|
|
100
|
+
borderRadius: radii.xl,
|
|
101
|
+
padding: spacing["4"],
|
|
102
|
+
gap: spacing["2"],
|
|
103
|
+
},
|
|
104
|
+
style,
|
|
105
|
+
]}
|
|
106
|
+
>
|
|
107
|
+
{children}
|
|
108
|
+
</View>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export type NativeBadgeVariant = "default" | "secondary" | "accent" | "success" | "warning" | "destructive";
|
|
113
|
+
|
|
114
|
+
export interface NativeBadgeProps {
|
|
115
|
+
label: string;
|
|
116
|
+
variant?: NativeBadgeVariant;
|
|
117
|
+
accessibilityLabel?: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function NativeBadge({ label, variant = "default", accessibilityLabel }: NativeBadgeProps) {
|
|
121
|
+
const { colors, spacing, textSizes, fontWeights, radii } = useNativeTheme();
|
|
122
|
+
const [backgroundColor, foregroundColor] = badgeColors(variant, colors);
|
|
123
|
+
return (
|
|
124
|
+
<View
|
|
125
|
+
accessibilityRole="text"
|
|
126
|
+
accessibilityLabel={accessibilityLabel ?? label}
|
|
127
|
+
style={{ alignSelf: "flex-start", paddingHorizontal: spacing["2"], paddingVertical: spacing["1"], borderRadius: radii.full, backgroundColor }}
|
|
128
|
+
>
|
|
129
|
+
<Text style={{ color: foregroundColor, fontSize: textSizes.sm, fontWeight: fontWeights.medium }}>{label}</Text>
|
|
130
|
+
</View>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function badgeColors(variant: NativeBadgeVariant, colors: ReturnType<typeof useNativeTheme>["colors"]): [string, string] {
|
|
135
|
+
switch (variant) {
|
|
136
|
+
case "secondary":
|
|
137
|
+
return [colors.secondary, colors["text-primary"]];
|
|
138
|
+
case "accent":
|
|
139
|
+
return [colors.accent, colors["text-primary"]];
|
|
140
|
+
case "success":
|
|
141
|
+
return [colors.success, colors["success-foreground"]];
|
|
142
|
+
case "warning":
|
|
143
|
+
return [colors.warning, colors["warning-foreground"]];
|
|
144
|
+
case "destructive":
|
|
145
|
+
return [colors.destructive, colors["destructive-foreground"]];
|
|
146
|
+
case "default":
|
|
147
|
+
return [colors.primary, colors["primary-foreground"]];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface NativeTabItem<Value extends string = string> {
|
|
152
|
+
value: Value;
|
|
153
|
+
label: string;
|
|
154
|
+
accessibilityLabel?: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface NativeTabBarProps<Value extends string> {
|
|
158
|
+
items: readonly NativeTabItem<Value>[];
|
|
159
|
+
value: Value;
|
|
160
|
+
onChange: (value: Value) => void;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function NativeTabBar<Value extends string>({ items, value, onChange }: NativeTabBarProps<Value>) {
|
|
164
|
+
const { colors, spacing, textSizes, fontWeights, radii } = useNativeTheme();
|
|
165
|
+
return (
|
|
166
|
+
<View
|
|
167
|
+
accessibilityRole="tablist"
|
|
168
|
+
style={{ flexDirection: "row", backgroundColor: colors.card, borderTopColor: colors["border-default"], borderTopWidth: spacing.px, padding: spacing["2"], gap: spacing["1"] }}
|
|
169
|
+
>
|
|
170
|
+
{items.map((item) => {
|
|
171
|
+
const selected = item.value === value;
|
|
172
|
+
return (
|
|
173
|
+
<Pressable
|
|
174
|
+
key={item.value}
|
|
175
|
+
accessibilityRole="tab"
|
|
176
|
+
accessibilityLabel={item.accessibilityLabel ?? item.label}
|
|
177
|
+
accessibilityState={{ selected }}
|
|
178
|
+
onPress={() => onChange(item.value)}
|
|
179
|
+
style={({ pressed }) => ({
|
|
180
|
+
flex: 1,
|
|
181
|
+
minHeight: spacing["12"],
|
|
182
|
+
paddingHorizontal: spacing["2"],
|
|
183
|
+
paddingVertical: spacing["2"],
|
|
184
|
+
borderRadius: radii.lg,
|
|
185
|
+
backgroundColor: selected ? colors.accent : pressed ? colors.secondary : colors.card,
|
|
186
|
+
alignItems: "center",
|
|
187
|
+
justifyContent: "center",
|
|
188
|
+
})}
|
|
189
|
+
>
|
|
190
|
+
<Text style={{ color: selected ? colors["text-primary"] : colors["text-secondary"], fontSize: textSizes.sm, fontWeight: selected ? fontWeights.semibold : fontWeights.normal }}>
|
|
191
|
+
{item.label}
|
|
192
|
+
</Text>
|
|
193
|
+
</Pressable>
|
|
194
|
+
);
|
|
195
|
+
})}
|
|
196
|
+
</View>
|
|
197
|
+
);
|
|
198
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { NativeBadge, NativeButton, NativeSurface, NativeTabBar, type NativeBadgeProps, type NativeBadgeVariant, type NativeButtonProps, type NativeButtonSize, type NativeButtonVariant, type NativeSurfaceProps, type NativeTabBarProps, type NativeTabItem } from "./components";
|
|
2
|
+
export { NativeThemeProvider, useNativeTheme, type NativeColorPreference, type NativeTheme, type NativeThemeProviderProps } from "./theme";
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React, { createContext, useContext, useMemo } from "react";
|
|
2
|
+
import { useColorScheme, type TextStyle } from "react-native";
|
|
3
|
+
import { colorThemes, fontWeights, radii, spacing, textLineHeights, textSizes, type ColorMode, type ColorTheme } from "../styles/tokens";
|
|
4
|
+
|
|
5
|
+
export type NativeColorPreference = ColorMode | "system";
|
|
6
|
+
|
|
7
|
+
export interface NativeTheme {
|
|
8
|
+
mode: ColorMode;
|
|
9
|
+
colors: ColorTheme;
|
|
10
|
+
spacing: typeof spacing;
|
|
11
|
+
textSizes: typeof textSizes;
|
|
12
|
+
textLineHeights: typeof textLineHeights;
|
|
13
|
+
fontWeights: Readonly<Record<keyof typeof fontWeights, NonNullable<TextStyle["fontWeight"]>>>;
|
|
14
|
+
radii: typeof radii;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function nativeFontWeight(token: keyof typeof fontWeights): NonNullable<TextStyle["fontWeight"]> {
|
|
18
|
+
switch (fontWeights[token]) {
|
|
19
|
+
case "100": return "100";
|
|
20
|
+
case "200": return "200";
|
|
21
|
+
case "300": return "300";
|
|
22
|
+
case "400": return "400";
|
|
23
|
+
case "500": return "500";
|
|
24
|
+
case "600": return "600";
|
|
25
|
+
case "700": return "700";
|
|
26
|
+
case "800": return "800";
|
|
27
|
+
case "900": return "900";
|
|
28
|
+
default: throw new Error(`Unsupported native font-weight token: ${fontWeights[token]}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const nativeFontWeights: NativeTheme["fontWeights"] = {
|
|
33
|
+
thin: nativeFontWeight("thin"),
|
|
34
|
+
extralight: nativeFontWeight("extralight"),
|
|
35
|
+
light: nativeFontWeight("light"),
|
|
36
|
+
normal: nativeFontWeight("normal"),
|
|
37
|
+
medium: nativeFontWeight("medium"),
|
|
38
|
+
semibold: nativeFontWeight("semibold"),
|
|
39
|
+
bold: nativeFontWeight("bold"),
|
|
40
|
+
extrabold: nativeFontWeight("extrabold"),
|
|
41
|
+
black: nativeFontWeight("black"),
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const NativeThemeContext = createContext<NativeTheme>({
|
|
45
|
+
mode: "light",
|
|
46
|
+
colors: colorThemes.light,
|
|
47
|
+
spacing,
|
|
48
|
+
textSizes,
|
|
49
|
+
textLineHeights,
|
|
50
|
+
fontWeights: nativeFontWeights,
|
|
51
|
+
radii,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export interface NativeThemeProviderProps {
|
|
55
|
+
children: React.ReactNode;
|
|
56
|
+
colorPreference?: NativeColorPreference;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function NativeThemeProvider({ children, colorPreference = "system" }: NativeThemeProviderProps) {
|
|
60
|
+
const systemMode = useColorScheme();
|
|
61
|
+
const mode: ColorMode = colorPreference === "system" ? (systemMode === "dark" ? "dark" : "light") : colorPreference;
|
|
62
|
+
const value = useMemo<NativeTheme>(() => ({ mode, colors: colorThemes[mode], spacing, textSizes, textLineHeights, fontWeights: nativeFontWeights, radii }), [mode]);
|
|
63
|
+
|
|
64
|
+
return <NativeThemeContext.Provider value={value}>{children}</NativeThemeContext.Provider>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function useNativeTheme(): NativeTheme {
|
|
68
|
+
return useContext(NativeThemeContext);
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./package.css";
|
package/src/styles/index.css
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
@import "./tokens/generated/foundations.css";
|
|
18
18
|
@import "./tokens/generated/light.css";
|
|
19
19
|
@import "./tokens/generated/dark.css" (prefers-color-scheme: dark);
|
|
20
|
+
@import "./tokens/generated/dark-class.css";
|
|
20
21
|
@import "./animations.css";
|
|
21
22
|
@import "./nokia.css";
|
|
22
23
|
|
|
@@ -200,6 +201,85 @@
|
|
|
200
201
|
height: 100dvh;
|
|
201
202
|
}
|
|
202
203
|
|
|
204
|
+
/* Responsive dropdown surfaces keep their menu/listbox semantics while
|
|
205
|
+
* becoming thumb-reachable sheets on compact viewports. */
|
|
206
|
+
.ui-mobile-sheet-backdrop {
|
|
207
|
+
display: none;
|
|
208
|
+
}
|
|
209
|
+
.ui-mobile-sheet-positioner {
|
|
210
|
+
z-index: var(--z-index-50);
|
|
211
|
+
}
|
|
212
|
+
.ui-mobile-sheet-close {
|
|
213
|
+
display: none;
|
|
214
|
+
}
|
|
215
|
+
@media (max-width: 767px) {
|
|
216
|
+
.ui-mobile-sheet-backdrop {
|
|
217
|
+
position: fixed;
|
|
218
|
+
z-index: var(--z-index-50);
|
|
219
|
+
display: block;
|
|
220
|
+
background: color-mix(in srgb, var(--overlay-scrim) 50%, transparent);
|
|
221
|
+
inset: 0;
|
|
222
|
+
}
|
|
223
|
+
.ui-mobile-sheet-positioner {
|
|
224
|
+
position: fixed !important;
|
|
225
|
+
z-index: calc(var(--z-index-50) + 1) !important;
|
|
226
|
+
display: block;
|
|
227
|
+
width: 100% !important;
|
|
228
|
+
height: auto !important;
|
|
229
|
+
max-height: none !important;
|
|
230
|
+
transform: none !important;
|
|
231
|
+
inset: auto 0 0 !important;
|
|
232
|
+
}
|
|
233
|
+
.ui-mobile-sheet-popup {
|
|
234
|
+
width: 100% !important;
|
|
235
|
+
min-width: 0 !important;
|
|
236
|
+
max-width: none !important;
|
|
237
|
+
max-height: min(75dvh, var(--available-height, 75dvh)) !important;
|
|
238
|
+
border-start-start-radius: var(--radius-2xl) !important;
|
|
239
|
+
border-start-end-radius: var(--radius-2xl) !important;
|
|
240
|
+
border-end-start-radius: 0 !important;
|
|
241
|
+
border-end-end-radius: 0 !important;
|
|
242
|
+
padding-bottom: max(var(--spacing-scale-4), env(safe-area-inset-bottom)) !important;
|
|
243
|
+
overscroll-behavior: contain;
|
|
244
|
+
}
|
|
245
|
+
.ui-mobile-popover-popup {
|
|
246
|
+
padding-block-start: calc(var(--spacing-scale-12) + var(--spacing-scale-2)) !important;
|
|
247
|
+
}
|
|
248
|
+
.ui-mobile-sheet-close {
|
|
249
|
+
position: absolute;
|
|
250
|
+
z-index: var(--z-index-10);
|
|
251
|
+
top: var(--spacing-scale-2);
|
|
252
|
+
right: var(--spacing-scale-3);
|
|
253
|
+
display: grid;
|
|
254
|
+
width: var(--spacing-scale-12);
|
|
255
|
+
height: var(--spacing-scale-12);
|
|
256
|
+
place-items: center;
|
|
257
|
+
border: 1px solid var(--border-default);
|
|
258
|
+
border-radius: var(--radius-full);
|
|
259
|
+
color: var(--text-secondary);
|
|
260
|
+
background: var(--background);
|
|
261
|
+
cursor: pointer;
|
|
262
|
+
}
|
|
263
|
+
.ui-mobile-sheet-close svg {
|
|
264
|
+
width: var(--spacing-scale-5);
|
|
265
|
+
height: var(--spacing-scale-5);
|
|
266
|
+
}
|
|
267
|
+
[data-slot="dropdown-menu-content"] [data-slot^="dropdown-menu-item"],
|
|
268
|
+
[data-slot="select-content"] [data-slot="select-item"] {
|
|
269
|
+
min-height: var(--spacing-scale-12);
|
|
270
|
+
}
|
|
271
|
+
[data-slot="dropdown-menu-content"][data-open],
|
|
272
|
+
[data-slot="select-content"][data-open],
|
|
273
|
+
[data-slot="popover-content"][data-open] {
|
|
274
|
+
animation: sheet-slide-in-bottom 300ms var(--ease-drawer);
|
|
275
|
+
}
|
|
276
|
+
[data-slot="dropdown-menu-content"][data-closed],
|
|
277
|
+
[data-slot="select-content"][data-closed],
|
|
278
|
+
[data-slot="popover-content"][data-closed] {
|
|
279
|
+
animation: sheet-slide-out-bottom 200ms var(--ease-drawer);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
203
283
|
/* Shared layout rhythm. Product components own their layout; this does not
|
|
204
284
|
* define visual component families. */
|
|
205
285
|
.page-shell {
|
|
@@ -264,6 +344,16 @@
|
|
|
264
344
|
@apply text-muted-foreground text-xs font-medium uppercase tracking-widest;
|
|
265
345
|
}
|
|
266
346
|
|
|
347
|
+
/* Command rows: action hints stay silent until the row is highlighted,
|
|
348
|
+
* so the list scans clean and the affordance appears exactly when usable. */
|
|
349
|
+
[data-slot="command-item"] [data-slot="command-shortcut"] {
|
|
350
|
+
opacity: 0;
|
|
351
|
+
transition: opacity 120ms ease-out;
|
|
352
|
+
}
|
|
353
|
+
[data-slot="command-item"][data-highlighted] [data-slot="command-shortcut"] {
|
|
354
|
+
opacity: 1;
|
|
355
|
+
}
|
|
356
|
+
|
|
267
357
|
@layer base {
|
|
268
358
|
:root {
|
|
269
359
|
color-scheme: light;
|
|
@@ -273,6 +363,10 @@
|
|
|
273
363
|
color-scheme: dark;
|
|
274
364
|
}
|
|
275
365
|
}
|
|
366
|
+
/* Manual override: toggling `.dark` on <html> beats the OS preference. */
|
|
367
|
+
:root.dark {
|
|
368
|
+
color-scheme: dark;
|
|
369
|
+
}
|
|
276
370
|
html,
|
|
277
371
|
body {
|
|
278
372
|
background-color: var(--color-background);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Do not edit directly, this file was auto-generated.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
:root.dark {
|
|
6
|
+
--background: #0a0a0a;
|
|
7
|
+
--card: #111111;
|
|
8
|
+
--secondary: #1a1a1a;
|
|
9
|
+
--popover: #111111;
|
|
10
|
+
--muted: #141414;
|
|
11
|
+
--text-primary: #fafafa;
|
|
12
|
+
--text-secondary: #a3a3a3;
|
|
13
|
+
--tertiary: #a3a3a3;
|
|
14
|
+
--primary: #ededed;
|
|
15
|
+
--accent: #1e293b;
|
|
16
|
+
--destructive: #dc2626;
|
|
17
|
+
--success: #22c55e;
|
|
18
|
+
--warning: #f59e0b;
|
|
19
|
+
--text-success: #4ade80;
|
|
20
|
+
--text-warning: #fcd34d;
|
|
21
|
+
--success-foreground: #0a0a0a;
|
|
22
|
+
--warning-foreground: #0a0a0a;
|
|
23
|
+
--primary-foreground: #0a0a0a;
|
|
24
|
+
--accent-foreground: #93c5fd;
|
|
25
|
+
--destructive-foreground: #ffffff;
|
|
26
|
+
--text-destructive: #fca5a5;
|
|
27
|
+
--text-accent: #60a5fa;
|
|
28
|
+
--border-default: #262626;
|
|
29
|
+
--focus-ring: #3b82f6;
|
|
30
|
+
--chart-1: #3b82f6;
|
|
31
|
+
--chart-2: #ededed;
|
|
32
|
+
--chart-3: #737373;
|
|
33
|
+
--chart-4: #93c5fd;
|
|
34
|
+
--chart-5: #3f3f46;
|
|
35
|
+
--chart-positive: #22c55e;
|
|
36
|
+
--chart-negative: #ef4444;
|
|
37
|
+
--chart-neutral: #a3a3a3;
|
|
38
|
+
--overlay-scrim: #000000;
|
|
39
|
+
}
|
|
@@ -3,37 +3,37 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export default {
|
|
6
|
-
background: "#
|
|
7
|
-
card: "#
|
|
8
|
-
secondary: "#
|
|
9
|
-
popover: "#
|
|
10
|
-
muted: "#
|
|
11
|
-
"text-primary": "#
|
|
12
|
-
"text-secondary": "#
|
|
13
|
-
tertiary: "#
|
|
14
|
-
primary: "#
|
|
15
|
-
accent: "#
|
|
16
|
-
destructive: "#
|
|
17
|
-
success: "#
|
|
18
|
-
warning: "#
|
|
19
|
-
"text-success": "#
|
|
20
|
-
"text-warning": "#
|
|
21
|
-
"success-foreground": "#
|
|
22
|
-
"warning-foreground": "#
|
|
23
|
-
"primary-foreground": "#
|
|
24
|
-
"accent-foreground": "#
|
|
6
|
+
background: "#0a0a0a",
|
|
7
|
+
card: "#111111",
|
|
8
|
+
secondary: "#1a1a1a",
|
|
9
|
+
popover: "#111111",
|
|
10
|
+
muted: "#141414",
|
|
11
|
+
"text-primary": "#fafafa",
|
|
12
|
+
"text-secondary": "#a3a3a3",
|
|
13
|
+
tertiary: "#a3a3a3",
|
|
14
|
+
primary: "#ededed",
|
|
15
|
+
accent: "#1e293b",
|
|
16
|
+
destructive: "#dc2626",
|
|
17
|
+
success: "#22c55e",
|
|
18
|
+
warning: "#f59e0b",
|
|
19
|
+
"text-success": "#4ade80",
|
|
20
|
+
"text-warning": "#fcd34d",
|
|
21
|
+
"success-foreground": "#0a0a0a",
|
|
22
|
+
"warning-foreground": "#0a0a0a",
|
|
23
|
+
"primary-foreground": "#0a0a0a",
|
|
24
|
+
"accent-foreground": "#93c5fd",
|
|
25
25
|
"destructive-foreground": "#ffffff",
|
|
26
|
-
"text-destructive": "#
|
|
27
|
-
"text-accent": "#
|
|
28
|
-
"border-default": "#
|
|
29
|
-
"focus-ring": "#
|
|
30
|
-
"chart-1": "#
|
|
31
|
-
"chart-2": "#
|
|
32
|
-
"chart-3": "#
|
|
33
|
-
"chart-4": "#
|
|
34
|
-
"chart-5": "#
|
|
35
|
-
"chart-positive": "#
|
|
36
|
-
"chart-negative": "#
|
|
37
|
-
"chart-neutral": "#
|
|
26
|
+
"text-destructive": "#fca5a5",
|
|
27
|
+
"text-accent": "#60a5fa",
|
|
28
|
+
"border-default": "#262626",
|
|
29
|
+
"focus-ring": "#3b82f6",
|
|
30
|
+
"chart-1": "#3b82f6",
|
|
31
|
+
"chart-2": "#ededed",
|
|
32
|
+
"chart-3": "#737373",
|
|
33
|
+
"chart-4": "#93c5fd",
|
|
34
|
+
"chart-5": "#3f3f46",
|
|
35
|
+
"chart-positive": "#22c55e",
|
|
36
|
+
"chart-negative": "#ef4444",
|
|
37
|
+
"chart-neutral": "#a3a3a3",
|
|
38
38
|
"overlay-scrim": "#000000",
|
|
39
39
|
};
|
|
@@ -3,37 +3,37 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
:root {
|
|
6
|
-
--background: #
|
|
7
|
-
--card: #
|
|
8
|
-
--secondary: #
|
|
9
|
-
--popover: #
|
|
10
|
-
--muted: #
|
|
11
|
-
--text-primary: #
|
|
12
|
-
--text-secondary: #
|
|
13
|
-
--tertiary: #
|
|
14
|
-
--primary: #
|
|
15
|
-
--accent: #
|
|
16
|
-
--destructive: #
|
|
17
|
-
--success: #
|
|
18
|
-
--warning: #
|
|
19
|
-
--text-success: #
|
|
20
|
-
--text-warning: #
|
|
21
|
-
--success-foreground: #
|
|
22
|
-
--warning-foreground: #
|
|
23
|
-
--primary-foreground: #
|
|
24
|
-
--accent-foreground: #
|
|
6
|
+
--background: #0a0a0a;
|
|
7
|
+
--card: #111111;
|
|
8
|
+
--secondary: #1a1a1a;
|
|
9
|
+
--popover: #111111;
|
|
10
|
+
--muted: #141414;
|
|
11
|
+
--text-primary: #fafafa;
|
|
12
|
+
--text-secondary: #a3a3a3;
|
|
13
|
+
--tertiary: #a3a3a3;
|
|
14
|
+
--primary: #ededed;
|
|
15
|
+
--accent: #1e293b;
|
|
16
|
+
--destructive: #dc2626;
|
|
17
|
+
--success: #22c55e;
|
|
18
|
+
--warning: #f59e0b;
|
|
19
|
+
--text-success: #4ade80;
|
|
20
|
+
--text-warning: #fcd34d;
|
|
21
|
+
--success-foreground: #0a0a0a;
|
|
22
|
+
--warning-foreground: #0a0a0a;
|
|
23
|
+
--primary-foreground: #0a0a0a;
|
|
24
|
+
--accent-foreground: #93c5fd;
|
|
25
25
|
--destructive-foreground: #ffffff;
|
|
26
|
-
--text-destructive: #
|
|
27
|
-
--text-accent: #
|
|
28
|
-
--border-default: #
|
|
29
|
-
--focus-ring: #
|
|
30
|
-
--chart-1: #
|
|
31
|
-
--chart-2: #
|
|
32
|
-
--chart-3: #
|
|
33
|
-
--chart-4: #
|
|
34
|
-
--chart-5: #
|
|
35
|
-
--chart-positive: #
|
|
36
|
-
--chart-negative: #
|
|
37
|
-
--chart-neutral: #
|
|
26
|
+
--text-destructive: #fca5a5;
|
|
27
|
+
--text-accent: #60a5fa;
|
|
28
|
+
--border-default: #262626;
|
|
29
|
+
--focus-ring: #3b82f6;
|
|
30
|
+
--chart-1: #3b82f6;
|
|
31
|
+
--chart-2: #ededed;
|
|
32
|
+
--chart-3: #737373;
|
|
33
|
+
--chart-4: #93c5fd;
|
|
34
|
+
--chart-5: #3f3f46;
|
|
35
|
+
--chart-positive: #22c55e;
|
|
36
|
+
--chart-negative: #ef4444;
|
|
37
|
+
--chart-neutral: #a3a3a3;
|
|
38
38
|
--overlay-scrim: #000000;
|
|
39
39
|
}
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
--spacing-scale-1-5: 0.375rem;
|
|
40
40
|
--spacing-scale-2-5: 0.625rem;
|
|
41
41
|
--spacing-scale-3-5: 0.875rem;
|
|
42
|
-
--font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
42
|
+
--font-sans: Geist, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
43
43
|
--font-serif: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
44
|
-
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
|
|
44
|
+
--font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
|
|
45
45
|
--text-xs: 0.75rem;
|
|
46
46
|
--text-sm: 0.875rem;
|
|
47
47
|
--text-base: 1rem;
|
|
@@ -43,6 +43,7 @@ export default {
|
|
|
43
43
|
},
|
|
44
44
|
font: {
|
|
45
45
|
sans: [
|
|
46
|
+
"Geist",
|
|
46
47
|
"system-ui",
|
|
47
48
|
"-apple-system",
|
|
48
49
|
"BlinkMacSystemFont",
|
|
@@ -73,6 +74,7 @@ export default {
|
|
|
73
74
|
"Noto Color Emoji",
|
|
74
75
|
],
|
|
75
76
|
mono: [
|
|
77
|
+
"Geist Mono",
|
|
76
78
|
"ui-monospace",
|
|
77
79
|
"SFMono-Regular",
|
|
78
80
|
"Menlo",
|
|
@@ -3,37 +3,37 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export default {
|
|
6
|
-
background: "#
|
|
7
|
-
card: "#
|
|
8
|
-
secondary: "#
|
|
9
|
-
popover: "#
|
|
10
|
-
muted: "#
|
|
11
|
-
"text-primary": "#
|
|
12
|
-
"text-secondary": "#
|
|
13
|
-
tertiary: "#
|
|
14
|
-
primary: "#
|
|
15
|
-
accent: "#
|
|
16
|
-
destructive: "#
|
|
17
|
-
success: "#
|
|
18
|
-
warning: "#
|
|
19
|
-
"text-success": "#
|
|
20
|
-
"text-warning": "#
|
|
21
|
-
"success-foreground": "#
|
|
22
|
-
"warning-foreground": "#
|
|
6
|
+
background: "#ffffff",
|
|
7
|
+
card: "#ffffff",
|
|
8
|
+
secondary: "#f5f5f5",
|
|
9
|
+
popover: "#ffffff",
|
|
10
|
+
muted: "#fafafa",
|
|
11
|
+
"text-primary": "#111111",
|
|
12
|
+
"text-secondary": "#6b6b6b",
|
|
13
|
+
tertiary: "#6b6b6b",
|
|
14
|
+
primary: "#171717",
|
|
15
|
+
accent: "#eff6ff",
|
|
16
|
+
destructive: "#dc2626",
|
|
17
|
+
success: "#16a34a",
|
|
18
|
+
warning: "#d97706",
|
|
19
|
+
"text-success": "#15803d",
|
|
20
|
+
"text-warning": "#92400e",
|
|
21
|
+
"success-foreground": "#0a0a0a",
|
|
22
|
+
"warning-foreground": "#0a0a0a",
|
|
23
23
|
"primary-foreground": "#ffffff",
|
|
24
|
-
"accent-foreground": "#
|
|
24
|
+
"accent-foreground": "#1d4ed8",
|
|
25
25
|
"destructive-foreground": "#ffffff",
|
|
26
|
-
"text-destructive": "#
|
|
27
|
-
"text-accent": "#
|
|
28
|
-
"border-default": "#
|
|
29
|
-
"focus-ring": "#
|
|
30
|
-
"chart-1": "#
|
|
31
|
-
"chart-2": "#
|
|
32
|
-
"chart-3": "#
|
|
33
|
-
"chart-4": "#
|
|
34
|
-
"chart-5": "#
|
|
35
|
-
"chart-positive": "#
|
|
36
|
-
"chart-negative": "#
|
|
37
|
-
"chart-neutral": "#
|
|
26
|
+
"text-destructive": "#b91c1c",
|
|
27
|
+
"text-accent": "#2563eb",
|
|
28
|
+
"border-default": "#e5e5e5",
|
|
29
|
+
"focus-ring": "#2563eb",
|
|
30
|
+
"chart-1": "#2563eb",
|
|
31
|
+
"chart-2": "#111111",
|
|
32
|
+
"chart-3": "#737373",
|
|
33
|
+
"chart-4": "#93c5fd",
|
|
34
|
+
"chart-5": "#d4d4d8",
|
|
35
|
+
"chart-positive": "#15803d",
|
|
36
|
+
"chart-negative": "#dc2626",
|
|
37
|
+
"chart-neutral": "#737373",
|
|
38
38
|
"overlay-scrim": "#000000",
|
|
39
39
|
};
|