@campxdev/react-native-blueprint 0.1.1 → 0.1.3
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/lib/module/app/_layout.js +1 -1
- package/lib/module/app/_layout.js.map +1 -1
- package/lib/module/components/ui/index.js +1 -0
- package/lib/module/components/ui/index.js.map +1 -1
- package/lib/module/global.css +417 -0
- package/lib/module/types/global.d.js +6 -0
- package/lib/module/types/global.d.js.map +1 -0
- package/lib/module/types/rn-primitives.d.js +6 -0
- package/lib/module/types/rn-primitives.d.js.map +1 -0
- package/lib/typescript/src/app/_layout.d.ts +7 -8
- package/lib/typescript/src/components/ui/Accordion.d.ts +103 -11
- package/lib/typescript/src/components/ui/Alert-Dialog.d.ts +167 -10
- package/lib/typescript/src/components/ui/Alert-Dialog.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Alert.d.ts +59 -10
- package/lib/typescript/src/components/ui/Avatar.d.ts +1350 -10
- package/lib/typescript/src/components/ui/Badge.d.ts +203 -10
- package/lib/typescript/src/components/ui/Bottom-Sheet.d.ts +43 -11
- package/lib/typescript/src/components/ui/Button.d.ts +175 -10
- package/lib/typescript/src/components/ui/Card.d.ts +853 -10
- package/lib/typescript/src/components/ui/Checkbox.d.ts +36 -11
- package/lib/typescript/src/components/ui/Collapsible.d.ts +1 -147
- package/lib/typescript/src/components/ui/Collapsible.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Context-Menu.d.ts +149 -10
- package/lib/typescript/src/components/ui/Context-Menu.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Custom-Card.d.ts +863 -10
- package/lib/typescript/src/components/ui/Dialog.d.ts +125 -10
- package/lib/typescript/src/components/ui/Dialog.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Dropdown-Menu.d.ts +283 -10
- package/lib/typescript/src/components/ui/Dropdown-Menu.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Greeting-Card.d.ts +152 -10
- package/lib/typescript/src/components/ui/Hover-Card.d.ts +67 -10
- package/lib/typescript/src/components/ui/Hover-Card.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Icon.d.ts +43 -11
- package/lib/typescript/src/components/ui/Input.d.ts +51 -10
- package/lib/typescript/src/components/ui/Label.d.ts +104 -10
- package/lib/typescript/src/components/ui/Menubar.d.ts +174 -10
- package/lib/typescript/src/components/ui/NavBar.d.ts +271 -9
- package/lib/typescript/src/components/ui/Popover.d.ts +70 -10
- package/lib/typescript/src/components/ui/Popover.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Progress.d.ts +27 -11
- package/lib/typescript/src/components/ui/Radio-Group.d.ts +47 -11
- package/lib/typescript/src/components/ui/Select.d.ts +106 -10
- package/lib/typescript/src/components/ui/Separator.d.ts +165 -10
- package/lib/typescript/src/components/ui/Skeleton.d.ts +40 -11
- package/lib/typescript/src/components/ui/Slider.d.ts +52 -8
- package/lib/typescript/src/components/ui/Switch.d.ts +34 -11
- package/lib/typescript/src/components/ui/Table.d.ts +69 -10
- package/lib/typescript/src/components/ui/Tabs.d.ts +51 -11
- package/lib/typescript/src/components/ui/Text.d.ts +115 -10
- package/lib/typescript/src/components/ui/Textarea.d.ts +60 -10
- package/lib/typescript/src/components/ui/Theme-Toggle.d.ts +193 -10
- package/lib/typescript/src/components/ui/Toast.d.ts +54 -10
- package/lib/typescript/src/components/ui/Toggle-Group.d.ts +48 -10
- package/lib/typescript/src/components/ui/Toggle.d.ts +52 -10
- package/lib/typescript/src/components/ui/Tooltip.d.ts +70 -10
- package/lib/typescript/src/components/ui/Tooltip.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/index.d.ts +7 -2
- package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +7 -93
- package/lib/typescript/src/lib/ThemeProvider.d.ts +136 -13
- package/lib/typescript/src/lib/cornerRadius.d.ts +112 -21
- package/lib/typescript/src/lib/fonts.d.ts +21 -30
- package/lib/typescript/src/lib/theme.d.ts +86 -8
- package/lib/typescript/src/lib/utils.d.ts +111 -1
- package/package.json +2 -9
- package/src/app/_layout.tsx +1 -1
- package/src/components/ui/index.ts +1 -0
- package/src/global.css +417 -0
- package/src/types/global.d.ts +44 -0
- package/src/types/rn-primitives.d.ts +70 -0
- package/lib/typescript/babel.config.d.ts +0 -13
- package/lib/typescript/babel.config.d.ts.map +0 -1
- package/lib/typescript/metro.config.d.ts +0 -3
- package/lib/typescript/metro.config.d.ts.map +0 -1
- package/lib/typescript/src/components/ui/Floating-Action-Button.d.ts +0 -11
- package/lib/typescript/src/components/ui.d.ts +0 -49
- package/lib/typescript/tailwind.config.d.ts +0 -3
- package/lib/typescript/tailwind.config.d.ts.map +0 -1
|
@@ -1,9 +1,87 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { type Theme } from '@react-navigation/native';
|
|
2
|
+
/**
|
|
3
|
+
* Custom theme colors based on your Figma design tokens
|
|
4
|
+
* Using your categorized color system:
|
|
5
|
+
* 1. Surfaces - Page and card backgrounds
|
|
6
|
+
* 2. Text - All text colors with opacity variants
|
|
7
|
+
* 3. Primary - Main buttons and CTAs
|
|
8
|
+
* 4. Secondary - Secondary buttons
|
|
9
|
+
* 5. Tertiary/Accent - Highlights and selections
|
|
10
|
+
* 6. Borders - All borders and dividers
|
|
11
|
+
* 7. Highlights - Status/semantic colors
|
|
12
|
+
* 8. Brand - Brand accent colors (use sparingly)
|
|
13
|
+
*/
|
|
14
|
+
export declare const THEME: {
|
|
15
|
+
light: {
|
|
16
|
+
background: string;
|
|
17
|
+
card: string;
|
|
18
|
+
popover: string;
|
|
19
|
+
muted: string;
|
|
20
|
+
foreground: string;
|
|
21
|
+
cardForeground: string;
|
|
22
|
+
popoverForeground: string;
|
|
23
|
+
mutedForeground: string;
|
|
24
|
+
primary: string;
|
|
25
|
+
primaryForeground: string;
|
|
26
|
+
secondary: string;
|
|
27
|
+
secondaryForeground: string;
|
|
28
|
+
accent: string;
|
|
29
|
+
accentForeground: string;
|
|
30
|
+
border: string;
|
|
31
|
+
input: string;
|
|
32
|
+
ring: string;
|
|
33
|
+
destructive: string;
|
|
34
|
+
destructiveForeground: string;
|
|
35
|
+
success: string;
|
|
36
|
+
info: string;
|
|
37
|
+
warning: string;
|
|
38
|
+
brand1: string;
|
|
39
|
+
brand2: string;
|
|
40
|
+
brand3: string;
|
|
41
|
+
chart1: string;
|
|
42
|
+
chart2: string;
|
|
43
|
+
chart3: string;
|
|
44
|
+
chart4: string;
|
|
45
|
+
chart5: string;
|
|
46
|
+
radius: string;
|
|
47
|
+
};
|
|
48
|
+
dark: {
|
|
49
|
+
background: string;
|
|
50
|
+
card: string;
|
|
51
|
+
popover: string;
|
|
52
|
+
muted: string;
|
|
53
|
+
foreground: string;
|
|
54
|
+
cardForeground: string;
|
|
55
|
+
popoverForeground: string;
|
|
56
|
+
mutedForeground: string;
|
|
57
|
+
primary: string;
|
|
58
|
+
primaryForeground: string;
|
|
59
|
+
secondary: string;
|
|
60
|
+
secondaryForeground: string;
|
|
61
|
+
accent: string;
|
|
62
|
+
accentForeground: string;
|
|
63
|
+
border: string;
|
|
64
|
+
input: string;
|
|
65
|
+
ring: string;
|
|
66
|
+
destructive: string;
|
|
67
|
+
destructiveForeground: string;
|
|
68
|
+
success: string;
|
|
69
|
+
info: string;
|
|
70
|
+
warning: string;
|
|
71
|
+
brand1: string;
|
|
72
|
+
brand2: string;
|
|
73
|
+
brand3: string;
|
|
74
|
+
chart1: string;
|
|
75
|
+
chart2: string;
|
|
76
|
+
chart3: string;
|
|
77
|
+
chart4: string;
|
|
78
|
+
chart5: string;
|
|
79
|
+
radius: string;
|
|
80
|
+
};
|
|
9
81
|
};
|
|
82
|
+
/**
|
|
83
|
+
* React Navigation theme configuration
|
|
84
|
+
* Maps our custom theme to React Navigation's theme structure
|
|
85
|
+
*/
|
|
86
|
+
export declare const NAV_THEME: Record<'light' | 'dark', Theme>;
|
|
87
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -1 +1,111 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ClassValue } from 'clsx';
|
|
2
|
+
/**
|
|
3
|
+
* Utility function to merge Tailwind CSS classes with proper precedence
|
|
4
|
+
*
|
|
5
|
+
* Combines clsx (for conditional classes) and tailwind-merge (for deduplication)
|
|
6
|
+
* to create a single, optimized class string. Later classes override earlier ones.
|
|
7
|
+
*
|
|
8
|
+
* @param {...ClassValue[]} inputs - Class values to merge (strings, objects, arrays)
|
|
9
|
+
* @returns {string} Merged and deduplicated class string
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // Basic usage
|
|
14
|
+
* cn('px-2 py-1', 'px-4') // => 'py-1 px-4'
|
|
15
|
+
*
|
|
16
|
+
* // With conditionals
|
|
17
|
+
* cn('text-base', isDark && 'text-white', 'font-bold')
|
|
18
|
+
* // => 'text-base text-white font-bold' (if isDark is true)
|
|
19
|
+
*
|
|
20
|
+
* // With objects
|
|
21
|
+
* cn({
|
|
22
|
+
* 'bg-primary': isPrimary,
|
|
23
|
+
* 'bg-secondary': !isPrimary
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Common component pattern
|
|
27
|
+
* cn('base-classes', variant === 'large' && 'large-classes', className)
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function cn(...inputs: ClassValue[]): string;
|
|
31
|
+
/**
|
|
32
|
+
* Applies dark mode classes with optional runtime control
|
|
33
|
+
*
|
|
34
|
+
* Provides three modes of operation:
|
|
35
|
+
* 1. Static mode (darkMode undefined): Returns classes with `dark:` prefix for automatic switching
|
|
36
|
+
* 2. Dark mode (darkMode true): Strips `dark:` prefix and returns only dark classes
|
|
37
|
+
* 3. Light mode (darkMode false): Returns only base classes
|
|
38
|
+
*
|
|
39
|
+
* This function is useful when you need to programmatically control dark mode
|
|
40
|
+
* instead of relying on Tailwind's automatic dark mode detection.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} baseClasses - Classes to apply in light mode
|
|
43
|
+
* @param {string} darkClasses - Classes to apply in dark mode (with or without `dark:` prefix)
|
|
44
|
+
* @param {boolean} [darkMode] - Optional dark mode override (true/false/undefined)
|
|
45
|
+
* @returns {string} Merged class string based on mode
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* // Static mode - use Tailwind's automatic detection
|
|
50
|
+
* cnWithDark('bg-white', 'dark:bg-black')
|
|
51
|
+
* // => 'bg-white dark:bg-black'
|
|
52
|
+
*
|
|
53
|
+
* // Programmatic dark mode
|
|
54
|
+
* const { isDark } = useTheme();
|
|
55
|
+
* cnWithDark('bg-white', 'dark:bg-black', isDark)
|
|
56
|
+
* // => 'bg-black' (if isDark is true)
|
|
57
|
+
* // => 'bg-white' (if isDark is false)
|
|
58
|
+
*
|
|
59
|
+
* // With multiple classes
|
|
60
|
+
* cnWithDark(
|
|
61
|
+
* 'bg-white text-black border-gray-200',
|
|
62
|
+
* 'dark:bg-black dark:text-white dark:border-gray-800',
|
|
63
|
+
* isDark
|
|
64
|
+
* )
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @see {@link cn} for basic class merging
|
|
68
|
+
* @see {@link useTheme} for accessing theme state
|
|
69
|
+
*/
|
|
70
|
+
export declare function cnWithDark(baseClasses: string, darkClasses: string, darkMode?: boolean): string;
|
|
71
|
+
/**
|
|
72
|
+
* Get color value based on theme mode
|
|
73
|
+
*
|
|
74
|
+
* Simple utility to select between light and dark color values based on the
|
|
75
|
+
* current theme. Primarily used for native platforms where Tailwind CSS
|
|
76
|
+
* classes don't work with inline styles.
|
|
77
|
+
*
|
|
78
|
+
* @param {string} lightColor - Color value for light mode (CSS color, HSL, RGB, hex)
|
|
79
|
+
* @param {string} darkColor - Color value for dark mode (CSS color, HSL, RGB, hex)
|
|
80
|
+
* @param {boolean} [darkMode] - Whether dark mode is active (defaults to light if undefined)
|
|
81
|
+
* @returns {string} The appropriate color value for the current mode
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```tsx
|
|
85
|
+
* import { useTheme } from './ThemeProvider';
|
|
86
|
+
*
|
|
87
|
+
* function MyComponent() {
|
|
88
|
+
* const { isDark } = useTheme();
|
|
89
|
+
*
|
|
90
|
+
* // Get color for inline styles
|
|
91
|
+
* const textColor = getThemeColor('#000000', '#ffffff', isDark);
|
|
92
|
+
* const bgColor = getThemeColor('hsl(0, 0%, 100%)', 'hsl(0, 0%, 10%)', isDark);
|
|
93
|
+
*
|
|
94
|
+
* return (
|
|
95
|
+
* <View style={{ backgroundColor: bgColor }}>
|
|
96
|
+
* <NativeText style={{ color: textColor }}>
|
|
97
|
+
* Theme-aware text
|
|
98
|
+
* </NativeText>
|
|
99
|
+
* </View>
|
|
100
|
+
* );
|
|
101
|
+
* }
|
|
102
|
+
*
|
|
103
|
+
* // Without theme context (defaults to light)
|
|
104
|
+
* const color = getThemeColor('#000', '#fff'); // => '#000'
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @see {@link useTheme} for accessing theme state
|
|
108
|
+
* @see {@link getThemeColorValue} from theme-config for more advanced usage
|
|
109
|
+
*/
|
|
110
|
+
export declare function getThemeColor(lightColor: string, darkColor: string, darkMode?: boolean): string;
|
|
111
|
+
//# sourceMappingURL=utils.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@campxdev/react-native-blueprint",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "This is a react-native package for mobile apps",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -37,8 +37,7 @@
|
|
|
37
37
|
"typecheck": "tsc",
|
|
38
38
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
39
39
|
"clean": "del-cli lib",
|
|
40
|
-
"prepare": "bob build
|
|
41
|
-
"build:full": "bob build",
|
|
40
|
+
"prepare": "bob build",
|
|
42
41
|
"release": "release-it --only-version"
|
|
43
42
|
},
|
|
44
43
|
"keywords": [
|
|
@@ -141,12 +140,6 @@
|
|
|
141
140
|
{
|
|
142
141
|
"esm": true
|
|
143
142
|
}
|
|
144
|
-
],
|
|
145
|
-
[
|
|
146
|
-
"typescript",
|
|
147
|
-
{
|
|
148
|
-
"project": "tsconfig.build.json"
|
|
149
|
-
}
|
|
150
143
|
]
|
|
151
144
|
]
|
|
152
145
|
},
|
package/src/app/_layout.tsx
CHANGED
package/src/global.css
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
/* === 1. SURFACES === */
|
|
7
|
+
--background: 210 17% 97%; /* #F7F8FA */
|
|
8
|
+
--card: 0 0% 100%; /* #FFFFFF */
|
|
9
|
+
--popover: 0 0% 100%; /* #FFFFFF */
|
|
10
|
+
--muted: 0 0% 100%; /* #FFFFFF - Same as card for consistency */
|
|
11
|
+
|
|
12
|
+
/* === 2. TEXT === */
|
|
13
|
+
--foreground: 0 0% 7%; /* #121212 */
|
|
14
|
+
--card-foreground: 0 0% 7%; /* #121212 */
|
|
15
|
+
--popover-foreground: 0 0% 7%; /* #121212 */
|
|
16
|
+
--muted-foreground: 0 0% 7% / 0.7; /* #121212 at 70% opacity */
|
|
17
|
+
|
|
18
|
+
/* === 3. PRIMARY (Main buttons, CTAs) === */
|
|
19
|
+
--primary: 200 13% 11%; /* #161A1D - Near black */
|
|
20
|
+
--primary-foreground: 0 0% 100%; /* #FFFFFF */
|
|
21
|
+
|
|
22
|
+
/* === 4. SECONDARY (Secondary buttons) === */
|
|
23
|
+
--secondary: 218 14% 53%; /* #64748B */
|
|
24
|
+
--secondary-foreground: 0 0% 100%; /* #FFFFFF */
|
|
25
|
+
|
|
26
|
+
/* === 5. TERTIARY/ACCENT (Highlights, selections) === */
|
|
27
|
+
--accent: 356 76% 57%; /* #E43341 - Crimson */
|
|
28
|
+
--accent-foreground: 0 0% 100%; /* #FFFFFF */
|
|
29
|
+
|
|
30
|
+
/* === 6. BORDERS === */
|
|
31
|
+
--border: 214 32% 84%; /* #CBD5E1 */
|
|
32
|
+
--input: 214 32% 84%; /* #CBD5E1 */
|
|
33
|
+
--ring: 200 13% 11%; /* #161A1D - Same as primary */
|
|
34
|
+
|
|
35
|
+
/* === 7. HIGHLIGHTS === */
|
|
36
|
+
--destructive: 356 87% 57%; /* #F2353C - Red */
|
|
37
|
+
--destructive-foreground: 0 0% 100%;
|
|
38
|
+
--success: 88 37% 52%; /* #88B053 - Green */
|
|
39
|
+
--info: 189 45% 51%; /* #4BAABE - Blue */
|
|
40
|
+
--warning: 28 81% 57%; /* #ED9035 - Orange */
|
|
41
|
+
|
|
42
|
+
/* === 8. BRAND COLORS (Custom - use manually) === */
|
|
43
|
+
--brand-1: 252 97% 25%; /* #1E027F - Deep violet */
|
|
44
|
+
--brand-2: 356 76% 57%; /* #E43341 - Crimson */
|
|
45
|
+
--brand-3: 304 69% 33%; /* #931C88 - Magenta */
|
|
46
|
+
|
|
47
|
+
/* === CHART COLORS === */
|
|
48
|
+
--chart-1: 88 37% 52%; /* #88B053 - Green */
|
|
49
|
+
--chart-2: 189 45% 51%; /* #4BAABE - Blue */
|
|
50
|
+
--chart-3: 28 81% 57%; /* #ED9035 - Orange */
|
|
51
|
+
--chart-4: 254 46% 42%; /* #573DAB - Purple */
|
|
52
|
+
--chart-5: 348 78% 60%; /* #EA4A6B - Pink */
|
|
53
|
+
|
|
54
|
+
/* === SIDEBAR === */
|
|
55
|
+
--sidebar: 0 0% 100%; /* #FFFFFF */
|
|
56
|
+
--sidebar-foreground: 0 0% 7%; /* #121212 */
|
|
57
|
+
--sidebar-primary: 214 14% 64%; /* #94A3B8 */
|
|
58
|
+
--sidebar-primary-foreground: 0 0% 100%;
|
|
59
|
+
--sidebar-accent: 356 76% 57%; /* #E43341 */
|
|
60
|
+
--sidebar-accent-foreground: 0 0% 100%;
|
|
61
|
+
--sidebar-border: 214 32% 84%; /* #CBD5E1 */
|
|
62
|
+
--sidebar-ring: 214 14% 64%; /* #94A3B8 */
|
|
63
|
+
|
|
64
|
+
/* === FONTS === */
|
|
65
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
66
|
+
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
|
|
67
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
68
|
+
|
|
69
|
+
/* === PRIMITIVE SPACING TOKENS (From Figma) === */
|
|
70
|
+
/* These are your base spacing values - rarely changed directly */
|
|
71
|
+
--space-0: 0px; /* S0 */
|
|
72
|
+
--space-1: 2px; /* S1 */
|
|
73
|
+
--space-2: 4px; /* S2 */
|
|
74
|
+
--space-3: 8px; /* S3 */
|
|
75
|
+
--space-4: 12px; /* S4 */
|
|
76
|
+
--space-5: 16px; /* S5 */
|
|
77
|
+
--space-6: 20px; /* S6 */
|
|
78
|
+
--space-7: 24px; /* S7 */
|
|
79
|
+
--space-8: 32px; /* S8 */
|
|
80
|
+
--space-9: 48px; /* S9 */
|
|
81
|
+
--space-10: 52px; /* S10 */
|
|
82
|
+
|
|
83
|
+
/* === SEMANTIC SPACING TOKENS === */
|
|
84
|
+
/* These reference primitives and are what components actually use */
|
|
85
|
+
/* Change these to globally update spacing across all components */
|
|
86
|
+
--spacing-none: var(--space-0);
|
|
87
|
+
--spacing-xs: var(--space-2); /* Tight spacing - small gaps */
|
|
88
|
+
--spacing-sm: var(--space-3); /* Small spacing - compact layouts */
|
|
89
|
+
--spacing-md: var(--space-5); /* Medium spacing - default gaps */
|
|
90
|
+
--spacing-lg: var(--space-7); /* Large spacing - breathing room */
|
|
91
|
+
--spacing-xl: var(--space-8); /* Extra large - section spacing */
|
|
92
|
+
--spacing-2xl: var(--space-9); /* 2X large - major sections */
|
|
93
|
+
|
|
94
|
+
/* Component-specific spacing (can be changed independently) */
|
|
95
|
+
--spacing-button-x: var(--space-5); /* Button horizontal padding */
|
|
96
|
+
--spacing-button-y: var(--space-4); /* Button vertical padding */
|
|
97
|
+
--spacing-card: var(--space-5); /* Card padding */
|
|
98
|
+
--spacing-input-x: var(--space-4); /* Input horizontal padding */
|
|
99
|
+
--spacing-input-y: var(--space-3); /* Input vertical padding */
|
|
100
|
+
|
|
101
|
+
/* === PRIMITIVE RADIUS TOKENS (From Your Design System) === */
|
|
102
|
+
/* Your exact radius values: 0, 2, 4, 8, 12, 20, 24, 32, 48 */
|
|
103
|
+
--radius-0: 0px; /* R0 */
|
|
104
|
+
--radius-1: 2px; /* R1 */
|
|
105
|
+
--radius-2: 4px; /* R2 */
|
|
106
|
+
--radius-3: 8px; /* R3 */
|
|
107
|
+
--radius-4: 12px; /* R4 */
|
|
108
|
+
--radius-5: 20px; /* R5 */
|
|
109
|
+
--radius-6: 24px; /* R6 */
|
|
110
|
+
--radius-7: 32px; /* R7 */
|
|
111
|
+
--radius-8: 48px; /* R8 */
|
|
112
|
+
|
|
113
|
+
/* === SEMANTIC RADIUS TOKENS === */
|
|
114
|
+
/* Pre-defined names for convenience - you can use primitives directly in components */
|
|
115
|
+
--radius-none: var(--radius-0); /* 0px */
|
|
116
|
+
--radius-sm: var(--radius-2); /* 4px */
|
|
117
|
+
--radius-md: var(--radius-4); /* 12px */
|
|
118
|
+
--radius-lg: var(--radius-5); /* 20px */
|
|
119
|
+
--radius-xl: var(--radius-6); /* 24px */
|
|
120
|
+
--radius-2xl: var(--radius-7); /* 32px */
|
|
121
|
+
--radius-full: 9999px; /* Fully rounded - pills, avatars */
|
|
122
|
+
|
|
123
|
+
/* Corner smoothing value (0-1, where 1 = 100% smoothing) */
|
|
124
|
+
--corner-smoothing: 1.0; /* 100% Apple-style smoothing for all corners */
|
|
125
|
+
|
|
126
|
+
/* === ICON SIZES (From Figma) === */
|
|
127
|
+
--icon-sm: 16px; /* WH3 - Small icons */
|
|
128
|
+
--icon-md: 20px; /* WH2 - Medium icons */
|
|
129
|
+
--icon-lg: 24px; /* WH1 - Large icons */
|
|
130
|
+
|
|
131
|
+
/* === SHADOWS === */
|
|
132
|
+
--shadow-x: 0;
|
|
133
|
+
--shadow-y: 1px;
|
|
134
|
+
--shadow-blur: 3px;
|
|
135
|
+
--shadow-spread: 0px;
|
|
136
|
+
--shadow-opacity: 0.1;
|
|
137
|
+
--shadow-color: 0 0% 0%;
|
|
138
|
+
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
|
|
139
|
+
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
|
|
140
|
+
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10);
|
|
141
|
+
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10);
|
|
142
|
+
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10);
|
|
143
|
+
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10);
|
|
144
|
+
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10);
|
|
145
|
+
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
|
|
146
|
+
|
|
147
|
+
/* === LEGACY (kept for backwards compatibility) === */
|
|
148
|
+
--radius: var(--radius-3); /* Default radius - use semantic tokens instead */
|
|
149
|
+
--spacing: var(--space-2); /* Default spacing - use semantic tokens instead */
|
|
150
|
+
--tracking-normal: 0em;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.dark {
|
|
154
|
+
/* === 1. SURFACES === */
|
|
155
|
+
--background: 200 13% 10%; /* #161A1D */
|
|
156
|
+
--card: 180 14% 13%; /* #1D2727 */
|
|
157
|
+
--popover: 180 14% 13%; /* #1D2727 */
|
|
158
|
+
--muted: 180 14% 13%; /* #1D2727 - Same as card for consistency */
|
|
159
|
+
|
|
160
|
+
/* === 2. TEXT === */
|
|
161
|
+
--foreground: 0 0% 100%; /* #FFFFFF */
|
|
162
|
+
--card-foreground: 0 0% 100%; /* #FFFFFF */
|
|
163
|
+
--popover-foreground: 0 0% 100%; /* #FFFFFF */
|
|
164
|
+
--muted-foreground: 0 0% 100% / 0.7; /* #FFFFFF at 70% opacity */
|
|
165
|
+
|
|
166
|
+
/* === 3. PRIMARY (Main buttons, CTAs) === */
|
|
167
|
+
--primary: 210 13% 85%; /* #D0D5D9 - Light grey (softer than white) */
|
|
168
|
+
--primary-foreground: 200 13% 11%; /* #161A1D - Dark text */
|
|
169
|
+
|
|
170
|
+
/* === 4. SECONDARY (Secondary buttons) === */
|
|
171
|
+
--secondary: 218 14% 53%; /* #64748B */
|
|
172
|
+
--secondary-foreground: 0 0% 100%; /* #FFFFFF */
|
|
173
|
+
|
|
174
|
+
/* === 5. TERTIARY/ACCENT (Highlights, selections) === */
|
|
175
|
+
--accent: 356 76% 57%; /* #E43341 - Crimson */
|
|
176
|
+
--accent-foreground: 0 0% 100%; /* #FFFFFF */
|
|
177
|
+
|
|
178
|
+
/* === 6. BORDERS === */
|
|
179
|
+
--border: 215 25% 27%; /* #334155 - Balanced slate-700 */
|
|
180
|
+
--input: 215 25% 27%; /* #334155 */
|
|
181
|
+
--ring: 210 13% 85%; /* #D0D5D9 - Same as primary */
|
|
182
|
+
|
|
183
|
+
/* === 7. HIGHLIGHTS === */
|
|
184
|
+
--destructive: 356 87% 57%; /* #F2353C - Red */
|
|
185
|
+
--destructive-foreground: 0 0% 100%;
|
|
186
|
+
--success: 88 37% 52%; /* #88B053 - Green */
|
|
187
|
+
--info: 189 45% 51%; /* #4BAABE - Blue */
|
|
188
|
+
--warning: 28 81% 57%; /* #ED9035 - Orange */
|
|
189
|
+
|
|
190
|
+
/* === 8. BRAND COLORS (Custom - use manually) === */
|
|
191
|
+
--brand-1: 244 100% 73%; /* #8075FF - Cool violet */
|
|
192
|
+
--brand-2: 356 76% 57%; /* #E43341 - Crimson */
|
|
193
|
+
--brand-3: 291 46% 61%; /* #C160D4 - Light magenta */
|
|
194
|
+
|
|
195
|
+
/* === CHART COLORS === */
|
|
196
|
+
--chart-1: 88 37% 52%; /* #88B053 - Green */
|
|
197
|
+
--chart-2: 189 45% 51%; /* #4BAABE - Blue */
|
|
198
|
+
--chart-3: 28 81% 57%; /* #ED9035 - Orange */
|
|
199
|
+
--chart-4: 254 46% 42%; /* #573DAB - Purple */
|
|
200
|
+
--chart-5: 348 78% 60%; /* #EA4A6B - Pink */
|
|
201
|
+
|
|
202
|
+
/* === SIDEBAR === */
|
|
203
|
+
--sidebar: 180 14% 13%; /* #1D2727 */
|
|
204
|
+
--sidebar-foreground: 0 0% 100%; /* #FFFFFF */
|
|
205
|
+
--sidebar-primary: 214 14% 64%; /* #94A3B8 */
|
|
206
|
+
--sidebar-primary-foreground: 200 13% 10%; /* #161A1D */
|
|
207
|
+
--sidebar-accent: 356 76% 57%; /* #E43341 */
|
|
208
|
+
--sidebar-accent-foreground: 0 0% 100%;
|
|
209
|
+
--sidebar-border: 215 25% 27%; /* #334155 */
|
|
210
|
+
--sidebar-ring: 214 14% 64%; /* #94A3B8 */
|
|
211
|
+
|
|
212
|
+
/* === FONTS === */
|
|
213
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
214
|
+
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
|
|
215
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
216
|
+
|
|
217
|
+
/* === PRIMITIVE SPACING TOKENS (From Figma) === */
|
|
218
|
+
/* Spacing values are the same in light and dark mode */
|
|
219
|
+
--space-0: 0px; /* S0 */
|
|
220
|
+
--space-1: 2px; /* S1 */
|
|
221
|
+
--space-2: 4px; /* S2 */
|
|
222
|
+
--space-3: 8px; /* S3 */
|
|
223
|
+
--space-4: 12px; /* S4 */
|
|
224
|
+
--space-5: 16px; /* S5 */
|
|
225
|
+
--space-6: 20px; /* S6 */
|
|
226
|
+
--space-7: 24px; /* S7 */
|
|
227
|
+
--space-8: 32px; /* S8 */
|
|
228
|
+
--space-9: 48px; /* S9 */
|
|
229
|
+
--space-10: 52px; /* S10 */
|
|
230
|
+
|
|
231
|
+
/* === SEMANTIC SPACING TOKENS === */
|
|
232
|
+
--spacing-none: var(--space-0);
|
|
233
|
+
--spacing-xs: var(--space-2);
|
|
234
|
+
--spacing-sm: var(--space-3);
|
|
235
|
+
--spacing-md: var(--space-5);
|
|
236
|
+
--spacing-lg: var(--space-7);
|
|
237
|
+
--spacing-xl: var(--space-8);
|
|
238
|
+
--spacing-2xl: var(--space-9);
|
|
239
|
+
|
|
240
|
+
/* Component-specific spacing */
|
|
241
|
+
--spacing-button-x: var(--space-5);
|
|
242
|
+
--spacing-button-y: var(--space-4);
|
|
243
|
+
--spacing-card: var(--space-5);
|
|
244
|
+
--spacing-input-x: var(--space-4);
|
|
245
|
+
--spacing-input-y: var(--space-3);
|
|
246
|
+
|
|
247
|
+
/* === PRIMITIVE RADIUS TOKENS (From Your Design System) === */
|
|
248
|
+
/* Radius values are the same in light and dark mode */
|
|
249
|
+
--radius-0: 0px; /* R0 */
|
|
250
|
+
--radius-1: 2px; /* R1 */
|
|
251
|
+
--radius-2: 4px; /* R2 */
|
|
252
|
+
--radius-3: 8px; /* R3 */
|
|
253
|
+
--radius-4: 12px; /* R4 */
|
|
254
|
+
--radius-5: 20px; /* R5 */
|
|
255
|
+
--radius-6: 24px; /* R6 */
|
|
256
|
+
--radius-7: 32px; /* R7 */
|
|
257
|
+
--radius-8: 48px; /* R8 */
|
|
258
|
+
|
|
259
|
+
/* === SEMANTIC RADIUS TOKENS === */
|
|
260
|
+
--radius-none: var(--radius-0); /* 0px */
|
|
261
|
+
--radius-sm: var(--radius-2); /* 4px */
|
|
262
|
+
--radius-md: var(--radius-4); /* 12px */
|
|
263
|
+
--radius-lg: var(--radius-5); /* 20px */
|
|
264
|
+
--radius-xl: var(--radius-6); /* 24px */
|
|
265
|
+
--radius-2xl: var(--radius-7); /* 32px */
|
|
266
|
+
--radius-full: 9999px; /* Fully rounded */
|
|
267
|
+
|
|
268
|
+
/* Corner smoothing value */
|
|
269
|
+
--corner-smoothing: 1.0; /* 100% smoothing */
|
|
270
|
+
|
|
271
|
+
/* === ICON SIZES (From Figma) === */
|
|
272
|
+
--icon-sm: 16px; /* WH3 */
|
|
273
|
+
--icon-md: 20px; /* WH2 */
|
|
274
|
+
--icon-lg: 24px; /* WH1 */
|
|
275
|
+
|
|
276
|
+
/* === SHADOWS === */
|
|
277
|
+
--shadow-x: 0;
|
|
278
|
+
--shadow-y: 1px;
|
|
279
|
+
--shadow-blur: 3px;
|
|
280
|
+
--shadow-spread: 0px;
|
|
281
|
+
--shadow-opacity: 0.1;
|
|
282
|
+
--shadow-color: 0 0% 0%;
|
|
283
|
+
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
|
|
284
|
+
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
|
|
285
|
+
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10);
|
|
286
|
+
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10);
|
|
287
|
+
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10);
|
|
288
|
+
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10);
|
|
289
|
+
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10);
|
|
290
|
+
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
|
|
291
|
+
|
|
292
|
+
/* === LEGACY (kept for backwards compatibility) === */
|
|
293
|
+
--radius: var(--radius-3);
|
|
294
|
+
--spacing: var(--space-2);
|
|
295
|
+
--tracking-normal: 0em;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
@theme inline {
|
|
299
|
+
--color-background: var(--background);
|
|
300
|
+
--color-foreground: var(--foreground);
|
|
301
|
+
--color-card: var(--card);
|
|
302
|
+
--color-card-foreground: var(--card-foreground);
|
|
303
|
+
--color-popover: var(--popover);
|
|
304
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
305
|
+
--color-primary: var(--primary);
|
|
306
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
307
|
+
--color-secondary: var(--secondary);
|
|
308
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
309
|
+
--color-muted: var(--muted);
|
|
310
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
311
|
+
--color-accent: var(--accent);
|
|
312
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
313
|
+
--color-destructive: var(--destructive);
|
|
314
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
315
|
+
--color-border: var(--border);
|
|
316
|
+
--color-input: var(--input);
|
|
317
|
+
--color-ring: var(--ring);
|
|
318
|
+
|
|
319
|
+
/* Brand colors */
|
|
320
|
+
--color-brand-1: var(--brand-1);
|
|
321
|
+
--color-brand-2: var(--brand-2);
|
|
322
|
+
--color-brand-3: var(--brand-3);
|
|
323
|
+
|
|
324
|
+
/* Highlight colors */
|
|
325
|
+
--color-success: var(--success);
|
|
326
|
+
--color-info: var(--info);
|
|
327
|
+
--color-warning: var(--warning);
|
|
328
|
+
|
|
329
|
+
/* Chart colors */
|
|
330
|
+
--color-chart-1: var(--chart-1);
|
|
331
|
+
--color-chart-2: var(--chart-2);
|
|
332
|
+
--color-chart-3: var(--chart-3);
|
|
333
|
+
--color-chart-4: var(--chart-4);
|
|
334
|
+
--color-chart-5: var(--chart-5);
|
|
335
|
+
|
|
336
|
+
/* Sidebar colors */
|
|
337
|
+
--color-sidebar: var(--sidebar);
|
|
338
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
339
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
340
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
341
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
342
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
343
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
344
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
345
|
+
|
|
346
|
+
--font-sans: var(--font-sans);
|
|
347
|
+
--font-mono: var(--font-mono);
|
|
348
|
+
--font-serif: var(--font-serif);
|
|
349
|
+
|
|
350
|
+
/* Primitive spacing tokens (S0-S10 from Figma) */
|
|
351
|
+
--space-0: var(--space-0);
|
|
352
|
+
--space-1: var(--space-1);
|
|
353
|
+
--space-2: var(--space-2);
|
|
354
|
+
--space-3: var(--space-3);
|
|
355
|
+
--space-4: var(--space-4);
|
|
356
|
+
--space-5: var(--space-5);
|
|
357
|
+
--space-6: var(--space-6);
|
|
358
|
+
--space-7: var(--space-7);
|
|
359
|
+
--space-8: var(--space-8);
|
|
360
|
+
--space-9: var(--space-9);
|
|
361
|
+
--space-10: var(--space-10);
|
|
362
|
+
|
|
363
|
+
/* Semantic spacing tokens */
|
|
364
|
+
--spacing-none: var(--spacing-none);
|
|
365
|
+
--spacing-xs: var(--spacing-xs);
|
|
366
|
+
--spacing-sm: var(--spacing-sm);
|
|
367
|
+
--spacing-md: var(--spacing-md);
|
|
368
|
+
--spacing-lg: var(--spacing-lg);
|
|
369
|
+
--spacing-xl: var(--spacing-xl);
|
|
370
|
+
--spacing-2xl: var(--spacing-2xl);
|
|
371
|
+
|
|
372
|
+
/* Component-specific spacing */
|
|
373
|
+
--spacing-button-x: var(--spacing-button-x);
|
|
374
|
+
--spacing-button-y: var(--spacing-button-y);
|
|
375
|
+
--spacing-card: var(--spacing-card);
|
|
376
|
+
--spacing-input-x: var(--spacing-input-x);
|
|
377
|
+
--spacing-input-y: var(--spacing-input-y);
|
|
378
|
+
|
|
379
|
+
/* Primitive radius tokens (R0-R8) */
|
|
380
|
+
--radius-0: var(--radius-0);
|
|
381
|
+
--radius-1: var(--radius-1);
|
|
382
|
+
--radius-2: var(--radius-2);
|
|
383
|
+
--radius-3: var(--radius-3);
|
|
384
|
+
--radius-4: var(--radius-4);
|
|
385
|
+
--radius-5: var(--radius-5);
|
|
386
|
+
--radius-6: var(--radius-6);
|
|
387
|
+
--radius-7: var(--radius-7);
|
|
388
|
+
--radius-8: var(--radius-8);
|
|
389
|
+
|
|
390
|
+
/* Semantic radius tokens */
|
|
391
|
+
--radius-none: var(--radius-none);
|
|
392
|
+
--radius-sm: var(--radius-sm);
|
|
393
|
+
--radius-md: var(--radius-md);
|
|
394
|
+
--radius-lg: var(--radius-lg);
|
|
395
|
+
--radius-xl: var(--radius-xl);
|
|
396
|
+
--radius-2xl: var(--radius-2xl);
|
|
397
|
+
--radius-full: var(--radius-full);
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
/* Corner smoothing */
|
|
401
|
+
--corner-smoothing: var(--corner-smoothing);
|
|
402
|
+
|
|
403
|
+
/* Icon sizes */
|
|
404
|
+
--icon-sm: var(--icon-sm);
|
|
405
|
+
--icon-md: var(--icon-md);
|
|
406
|
+
--icon-lg: var(--icon-lg);
|
|
407
|
+
|
|
408
|
+
/* Shadows */
|
|
409
|
+
--shadow-2xs: var(--shadow-2xs);
|
|
410
|
+
--shadow-xs: var(--shadow-xs);
|
|
411
|
+
--shadow-sm: var(--shadow-sm);
|
|
412
|
+
--shadow: var(--shadow);
|
|
413
|
+
--shadow-md: var(--shadow-md);
|
|
414
|
+
--shadow-lg: var(--shadow-lg);
|
|
415
|
+
--shadow-xl: var(--shadow-xl);
|
|
416
|
+
--shadow-2xl: var(--shadow-2xl);
|
|
417
|
+
}
|