@almadar/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +72 -0
- package/README.md +335 -0
- package/dist/ThemeContext-lI5bo85E.d.ts +103 -0
- package/dist/components/index.d.ts +4789 -0
- package/dist/components/index.js +21566 -0
- package/dist/components/index.js.map +1 -0
- package/dist/context/index.d.ts +208 -0
- package/dist/context/index.js +443 -0
- package/dist/context/index.js.map +1 -0
- package/dist/event-bus-types-8-cjyMxw.d.ts +65 -0
- package/dist/hooks/index.d.ts +1006 -0
- package/dist/hooks/index.js +2262 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/lib/index.d.ts +291 -0
- package/dist/lib/index.js +431 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/offline-executor-CHr4uAhf.d.ts +401 -0
- package/dist/providers/index.d.ts +386 -0
- package/dist/providers/index.js +1111 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/renderer/index.d.ts +382 -0
- package/dist/renderer/index.js +808 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/stores/index.d.ts +151 -0
- package/dist/stores/index.js +196 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/useUISlots-mnggE9X9.d.ts +105 -0
- package/package.json +121 -0
- package/themes/almadar.css +196 -0
- package/themes/index.css +11 -0
- package/themes/minimalist.css +193 -0
- package/themes/wireframe.css +188 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useUISlots Hook
|
|
3
|
+
*
|
|
4
|
+
* Core hook for managing UI slot rendering in the trait-driven architecture.
|
|
5
|
+
* Traits use render_ui effects to dynamically render content into slots.
|
|
6
|
+
*
|
|
7
|
+
* Slots:
|
|
8
|
+
* - main: Primary content area
|
|
9
|
+
* - sidebar: Left/right sidebar
|
|
10
|
+
* - modal: Modal overlay
|
|
11
|
+
* - drawer: Slide-in drawer
|
|
12
|
+
* - overlay: Full-screen overlay
|
|
13
|
+
* - center: Centered popup
|
|
14
|
+
* - toast: Toast notifications
|
|
15
|
+
* - hud-top: Game HUD top bar
|
|
16
|
+
* - hud-bottom: Game HUD bottom bar
|
|
17
|
+
* - floating: Draggable floating panel
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Valid UI slot names
|
|
23
|
+
*/
|
|
24
|
+
type UISlot = 'main' | 'sidebar' | 'modal' | 'drawer' | 'overlay' | 'center' | 'toast' | 'hud-top' | 'hud-bottom' | 'floating';
|
|
25
|
+
/**
|
|
26
|
+
* Animation types for slot transitions
|
|
27
|
+
*/
|
|
28
|
+
type SlotAnimation = 'fade' | 'slide' | 'scale' | 'none';
|
|
29
|
+
/**
|
|
30
|
+
* Content rendered in a slot
|
|
31
|
+
*/
|
|
32
|
+
interface SlotContent {
|
|
33
|
+
/** Unique ID for this content */
|
|
34
|
+
id: string;
|
|
35
|
+
/** Pattern/component type to render */
|
|
36
|
+
pattern: string;
|
|
37
|
+
/** Props to pass to the pattern component */
|
|
38
|
+
props: Record<string, unknown>;
|
|
39
|
+
/** Priority for conflict resolution (higher wins) */
|
|
40
|
+
priority: number;
|
|
41
|
+
/** Animation for showing/hiding */
|
|
42
|
+
animation?: SlotAnimation;
|
|
43
|
+
/** Auto-dismiss timestamp (for toasts) */
|
|
44
|
+
autoDismissAt?: number;
|
|
45
|
+
/** Callback when dismissed */
|
|
46
|
+
onDismiss?: () => void;
|
|
47
|
+
/** Source trait that rendered this content */
|
|
48
|
+
sourceTrait?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Configuration for render_ui effect
|
|
52
|
+
*/
|
|
53
|
+
interface RenderUIConfig {
|
|
54
|
+
/** Target slot */
|
|
55
|
+
target: UISlot;
|
|
56
|
+
/** Pattern/component to render */
|
|
57
|
+
pattern: string;
|
|
58
|
+
/** Props for the pattern */
|
|
59
|
+
props?: Record<string, unknown>;
|
|
60
|
+
/** Priority (default: 0) */
|
|
61
|
+
priority?: number;
|
|
62
|
+
/** Animation type */
|
|
63
|
+
animation?: SlotAnimation;
|
|
64
|
+
/** Auto-dismiss after ms (for toasts) */
|
|
65
|
+
autoDismissMs?: number;
|
|
66
|
+
/** Callback on dismiss */
|
|
67
|
+
onDismiss?: () => void;
|
|
68
|
+
/** Source trait name */
|
|
69
|
+
sourceTrait?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Callback for slot changes
|
|
73
|
+
*/
|
|
74
|
+
type SlotChangeCallback = (slot: UISlot, content: SlotContent | null) => void;
|
|
75
|
+
/**
|
|
76
|
+
* UI Slot Manager interface
|
|
77
|
+
*/
|
|
78
|
+
interface UISlotManager {
|
|
79
|
+
/** Current content for each slot */
|
|
80
|
+
slots: Record<UISlot, SlotContent | null>;
|
|
81
|
+
/** Render content to a slot */
|
|
82
|
+
render: (config: RenderUIConfig) => string;
|
|
83
|
+
/** Clear a specific slot */
|
|
84
|
+
clear: (slot: UISlot) => void;
|
|
85
|
+
/** Clear content by ID */
|
|
86
|
+
clearById: (id: string) => void;
|
|
87
|
+
/** Clear all slots */
|
|
88
|
+
clearAll: () => void;
|
|
89
|
+
/** Subscribe to slot changes */
|
|
90
|
+
subscribe: (callback: SlotChangeCallback) => () => void;
|
|
91
|
+
/** Check if a slot has content */
|
|
92
|
+
hasContent: (slot: UISlot) => boolean;
|
|
93
|
+
/** Get content for a slot */
|
|
94
|
+
getContent: (slot: UISlot) => SlotContent | null;
|
|
95
|
+
}
|
|
96
|
+
declare const DEFAULT_SLOTS: Record<UISlot, SlotContent | null>;
|
|
97
|
+
/**
|
|
98
|
+
* Create a UI Slot Manager instance.
|
|
99
|
+
*
|
|
100
|
+
* This is the internal hook that creates the manager.
|
|
101
|
+
* Use `useUISlots()` from context in components.
|
|
102
|
+
*/
|
|
103
|
+
declare function useUISlotManager(): UISlotManager;
|
|
104
|
+
|
|
105
|
+
export { DEFAULT_SLOTS as D, type RenderUIConfig as R, type SlotContent as S, type UISlotManager as U, type UISlot as a, type SlotAnimation as b, type SlotChangeCallback as c, useUISlotManager as u };
|
package/package.json
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@almadar/ui",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "React UI components, hooks, and providers for Almadar",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/components/index.js",
|
|
7
|
+
"module": "./dist/components/index.js",
|
|
8
|
+
"types": "./dist/components/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/components/index.js",
|
|
12
|
+
"types": "./dist/components/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./components": {
|
|
15
|
+
"import": "./dist/components/index.js",
|
|
16
|
+
"types": "./dist/components/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./hooks": {
|
|
19
|
+
"import": "./dist/hooks/index.js",
|
|
20
|
+
"types": "./dist/hooks/index.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./providers": {
|
|
23
|
+
"import": "./dist/providers/index.js",
|
|
24
|
+
"types": "./dist/providers/index.d.ts"
|
|
25
|
+
},
|
|
26
|
+
"./context": {
|
|
27
|
+
"import": "./dist/context/index.js",
|
|
28
|
+
"types": "./dist/context/index.d.ts"
|
|
29
|
+
},
|
|
30
|
+
"./renderer": {
|
|
31
|
+
"import": "./dist/renderer/index.js",
|
|
32
|
+
"types": "./dist/renderer/index.d.ts"
|
|
33
|
+
},
|
|
34
|
+
"./stores": {
|
|
35
|
+
"import": "./dist/stores/index.js",
|
|
36
|
+
"types": "./dist/stores/index.d.ts"
|
|
37
|
+
},
|
|
38
|
+
"./lib": {
|
|
39
|
+
"import": "./dist/lib/index.js",
|
|
40
|
+
"types": "./dist/lib/index.d.ts"
|
|
41
|
+
},
|
|
42
|
+
"./themes/*.css": "./themes/*.css"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"themes"
|
|
47
|
+
],
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"clsx": "^2.1.0",
|
|
53
|
+
"tailwind-merge": "^2.2.0",
|
|
54
|
+
"lucide-react": "^0.344.0",
|
|
55
|
+
"katex": "^0.16.9",
|
|
56
|
+
"react-markdown": "^9.0.3",
|
|
57
|
+
"react-syntax-highlighter": "^15.5.0",
|
|
58
|
+
"rehype-katex": "^7.0.0",
|
|
59
|
+
"rehype-raw": "^7.0.0",
|
|
60
|
+
"remark-gfm": "^4.0.1",
|
|
61
|
+
"remark-math": "^6.0.0",
|
|
62
|
+
"react-force-graph-2d": "^1.28.0",
|
|
63
|
+
"@almadar/core": "1.0.0",
|
|
64
|
+
"@almadar/patterns": "1.0.0"
|
|
65
|
+
},
|
|
66
|
+
"peerDependencies": {
|
|
67
|
+
"react": "^18.0.0",
|
|
68
|
+
"react-dom": "^18.0.0",
|
|
69
|
+
"react-router-dom": "^7.0.0"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"react": "^18.3.1",
|
|
73
|
+
"react-dom": "^18.3.1",
|
|
74
|
+
"react-router-dom": "^7.13.0",
|
|
75
|
+
"@types/react": "^18.3.0",
|
|
76
|
+
"@types/react-dom": "^18.3.0",
|
|
77
|
+
"@types/react-syntax-highlighter": "^15.5.11",
|
|
78
|
+
"@storybook/addon-essentials": "^8.0.0",
|
|
79
|
+
"@storybook/addon-interactions": "^8.0.0",
|
|
80
|
+
"@storybook/addon-links": "^8.0.0",
|
|
81
|
+
"@storybook/addon-themes": "^8.0.0",
|
|
82
|
+
"@storybook/blocks": "^8.0.0",
|
|
83
|
+
"@storybook/react": "^8.0.0",
|
|
84
|
+
"@storybook/react-vite": "^8.0.0",
|
|
85
|
+
"@storybook/test": "^8.0.0",
|
|
86
|
+
"storybook": "^8.0.0",
|
|
87
|
+
"@vitejs/plugin-react": "^4.2.0",
|
|
88
|
+
"autoprefixer": "^10.4.0",
|
|
89
|
+
"postcss": "^8.4.35",
|
|
90
|
+
"tailwindcss": "^3.4.0",
|
|
91
|
+
"tsup": "^8.0.0",
|
|
92
|
+
"typescript": "^5.4.0",
|
|
93
|
+
"vite": "^5.2.0",
|
|
94
|
+
"tsx": "^4.7.0",
|
|
95
|
+
"vitest": "^1.4.0",
|
|
96
|
+
"@testing-library/react": "^14.2.0",
|
|
97
|
+
"@testing-library/jest-dom": "^6.4.0",
|
|
98
|
+
"@vitest/ui": "^1.4.0",
|
|
99
|
+
"jsdom": "^24.0.0"
|
|
100
|
+
},
|
|
101
|
+
"repository": {
|
|
102
|
+
"type": "git",
|
|
103
|
+
"url": "https://github.com/almadar-io/almadar.git",
|
|
104
|
+
"directory": "packages/almadar-ui"
|
|
105
|
+
},
|
|
106
|
+
"license": "MIT",
|
|
107
|
+
"keywords": [
|
|
108
|
+
"almadar",
|
|
109
|
+
"ui",
|
|
110
|
+
"react",
|
|
111
|
+
"components",
|
|
112
|
+
"hooks"
|
|
113
|
+
],
|
|
114
|
+
"scripts": {
|
|
115
|
+
"build": "tsup",
|
|
116
|
+
"build:watch": "tsup --watch",
|
|
117
|
+
"storybook": "storybook dev -p 6006",
|
|
118
|
+
"build-storybook": "storybook build -o storybook-static",
|
|
119
|
+
"typecheck": "tsc --noEmit"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Almadar Theme
|
|
3
|
+
*
|
|
4
|
+
* Inspired by the Almadar/KFlow branding. Features teal-to-cyan
|
|
5
|
+
* gradients, dark slate backgrounds, and glowing accent effects.
|
|
6
|
+
* Premium, futuristic aesthetic with glowing interactions.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* ==========================================================================
|
|
10
|
+
* LIGHT MODE
|
|
11
|
+
* ========================================================================== */
|
|
12
|
+
[data-theme="almadar-light"] {
|
|
13
|
+
/* Shadows - Soft teal glow */
|
|
14
|
+
--shadow-main:
|
|
15
|
+
0 4px 14px rgba(20, 184, 166, 0.12), 0 1px 3px rgba(0, 0, 0, 0.06);
|
|
16
|
+
--shadow-sm: 0 2px 4px rgba(20, 184, 166, 0.08);
|
|
17
|
+
--shadow-lg:
|
|
18
|
+
0 8px 30px rgba(20, 184, 166, 0.18), 0 4px 10px rgba(0, 0, 0, 0.06);
|
|
19
|
+
--shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
20
|
+
--shadow-none: none;
|
|
21
|
+
--shadow-hover: 0 12px 40px rgba(20, 184, 166, 0.2);
|
|
22
|
+
--shadow-active: 0 2px 8px rgba(20, 184, 166, 0.15);
|
|
23
|
+
|
|
24
|
+
/* Border radius - Modern rounded */
|
|
25
|
+
--radius-none: 0px;
|
|
26
|
+
--radius-sm: 6px;
|
|
27
|
+
--radius-md: 10px;
|
|
28
|
+
--radius-lg: 14px;
|
|
29
|
+
--radius-xl: 20px;
|
|
30
|
+
--radius-full: 9999px;
|
|
31
|
+
|
|
32
|
+
/* Border width - Clean */
|
|
33
|
+
--border-width: 1px;
|
|
34
|
+
--border-width-thin: 1px;
|
|
35
|
+
--border-width-thick: 2px;
|
|
36
|
+
|
|
37
|
+
/* Colors - Teal on light background */
|
|
38
|
+
--color-primary: #14b8a6;
|
|
39
|
+
--color-primary-hover: #0d9488;
|
|
40
|
+
--color-primary-foreground: #ffffff;
|
|
41
|
+
|
|
42
|
+
--color-secondary: #f1f5f9;
|
|
43
|
+
--color-secondary-hover: #e2e8f0;
|
|
44
|
+
--color-secondary-foreground: #0f172a;
|
|
45
|
+
|
|
46
|
+
--color-accent: #06b6d4;
|
|
47
|
+
--color-accent-foreground: #ffffff;
|
|
48
|
+
|
|
49
|
+
--color-muted: #f1f5f9;
|
|
50
|
+
--color-muted-foreground: #64748b;
|
|
51
|
+
|
|
52
|
+
--color-background: #f8fafc;
|
|
53
|
+
--color-foreground: #0f172a;
|
|
54
|
+
--color-card: #ffffff;
|
|
55
|
+
--color-card-foreground: #0f172a;
|
|
56
|
+
--color-surface: #f1f5f9;
|
|
57
|
+
--color-border: rgba(20, 184, 166, 0.3);
|
|
58
|
+
--color-input: rgba(20, 184, 166, 0.2);
|
|
59
|
+
--color-ring: #14b8a6;
|
|
60
|
+
|
|
61
|
+
/* Semantic colors */
|
|
62
|
+
--color-error: #dc2626;
|
|
63
|
+
--color-error-foreground: #ffffff;
|
|
64
|
+
--color-success: #16a34a;
|
|
65
|
+
--color-success-foreground: #ffffff;
|
|
66
|
+
--color-warning: #ca8a04;
|
|
67
|
+
--color-warning-foreground: #000000;
|
|
68
|
+
--color-info: #0ea5e9;
|
|
69
|
+
--color-info-foreground: #ffffff;
|
|
70
|
+
|
|
71
|
+
/* Typography - Modern, clean */
|
|
72
|
+
--font-family:
|
|
73
|
+
"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
74
|
+
--font-weight-normal: 400;
|
|
75
|
+
--font-weight-medium: 500;
|
|
76
|
+
--font-weight-bold: 600;
|
|
77
|
+
--letter-spacing: -0.02em;
|
|
78
|
+
--line-height: 1.6;
|
|
79
|
+
|
|
80
|
+
/* Icon styling */
|
|
81
|
+
--icon-stroke-width: 1.75;
|
|
82
|
+
--icon-color: #0d9488;
|
|
83
|
+
|
|
84
|
+
/* Transitions - Smooth */
|
|
85
|
+
--transition-fast: 150ms;
|
|
86
|
+
--transition-normal: 250ms;
|
|
87
|
+
--transition-slow: 400ms;
|
|
88
|
+
--transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
89
|
+
|
|
90
|
+
/* Hover/Active transforms */
|
|
91
|
+
--hover-scale: 1.02;
|
|
92
|
+
--hover-translate-y: -2px;
|
|
93
|
+
--hover-translate-x: 0;
|
|
94
|
+
--active-scale: 0.98;
|
|
95
|
+
--active-translate-y: 0;
|
|
96
|
+
|
|
97
|
+
/* Focus ring - Teal */
|
|
98
|
+
--focus-ring-width: 2px;
|
|
99
|
+
--focus-ring-offset: 2px;
|
|
100
|
+
--focus-ring-color: #14b8a6;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* ==========================================================================
|
|
104
|
+
* DARK MODE
|
|
105
|
+
* ========================================================================== */
|
|
106
|
+
[data-theme="almadar-dark"] {
|
|
107
|
+
/* Shadows - Glowing teal accents */
|
|
108
|
+
--shadow-main:
|
|
109
|
+
0 4px 14px rgba(20, 184, 166, 0.15), 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
110
|
+
--shadow-sm: 0 2px 4px rgba(20, 184, 166, 0.1);
|
|
111
|
+
--shadow-lg:
|
|
112
|
+
0 8px 30px rgba(20, 184, 166, 0.25), 0 4px 10px rgba(0, 0, 0, 0.1);
|
|
113
|
+
--shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
114
|
+
--shadow-none: none;
|
|
115
|
+
--shadow-hover:
|
|
116
|
+
0 12px 40px rgba(20, 184, 166, 0.35), 0 4px 12px rgba(6, 182, 212, 0.2);
|
|
117
|
+
--shadow-active: 0 2px 8px rgba(20, 184, 166, 0.2);
|
|
118
|
+
|
|
119
|
+
/* Border radius - Modern rounded */
|
|
120
|
+
--radius-none: 0px;
|
|
121
|
+
--radius-sm: 6px;
|
|
122
|
+
--radius-md: 10px;
|
|
123
|
+
--radius-lg: 14px;
|
|
124
|
+
--radius-xl: 20px;
|
|
125
|
+
--radius-full: 9999px;
|
|
126
|
+
|
|
127
|
+
/* Border width - Clean */
|
|
128
|
+
--border-width: 1px;
|
|
129
|
+
--border-width-thin: 1px;
|
|
130
|
+
--border-width-thick: 2px;
|
|
131
|
+
|
|
132
|
+
/* Colors - Teal/Cyan with dark slate */
|
|
133
|
+
--color-primary: #14b8a6;
|
|
134
|
+
--color-primary-hover: #2dd4bf;
|
|
135
|
+
--color-primary-foreground: #042f2e;
|
|
136
|
+
|
|
137
|
+
--color-secondary: #1e293b;
|
|
138
|
+
--color-secondary-hover: #334155;
|
|
139
|
+
--color-secondary-foreground: #f1f5f9;
|
|
140
|
+
|
|
141
|
+
--color-accent: #06b6d4;
|
|
142
|
+
--color-accent-foreground: #083344;
|
|
143
|
+
|
|
144
|
+
--color-muted: #1e293b;
|
|
145
|
+
--color-muted-foreground: #94a3b8;
|
|
146
|
+
|
|
147
|
+
--color-background: #0f172a;
|
|
148
|
+
--color-foreground: #f1f5f9;
|
|
149
|
+
--color-card: #1e293b;
|
|
150
|
+
--color-card-foreground: #f1f5f9;
|
|
151
|
+
--color-surface: #1e293b;
|
|
152
|
+
--color-border: rgba(20, 184, 166, 0.25);
|
|
153
|
+
--color-input: rgba(20, 184, 166, 0.3);
|
|
154
|
+
--color-ring: #14b8a6;
|
|
155
|
+
|
|
156
|
+
/* Semantic colors - Brighter for dark mode */
|
|
157
|
+
--color-error: #f87171;
|
|
158
|
+
--color-error-foreground: #000000;
|
|
159
|
+
--color-success: #4ade80;
|
|
160
|
+
--color-success-foreground: #000000;
|
|
161
|
+
--color-warning: #fbbf24;
|
|
162
|
+
--color-warning-foreground: #000000;
|
|
163
|
+
--color-info: #38bdf8;
|
|
164
|
+
--color-info-foreground: #000000;
|
|
165
|
+
|
|
166
|
+
/* Typography - Modern, clean */
|
|
167
|
+
--font-family:
|
|
168
|
+
"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
169
|
+
--font-weight-normal: 400;
|
|
170
|
+
--font-weight-medium: 500;
|
|
171
|
+
--font-weight-bold: 600;
|
|
172
|
+
--letter-spacing: -0.02em;
|
|
173
|
+
--line-height: 1.6;
|
|
174
|
+
|
|
175
|
+
/* Icon styling - Medium with teal color */
|
|
176
|
+
--icon-stroke-width: 1.75;
|
|
177
|
+
--icon-color: #14b8a6;
|
|
178
|
+
|
|
179
|
+
/* Transitions - Smooth with glow */
|
|
180
|
+
--transition-fast: 150ms;
|
|
181
|
+
--transition-normal: 250ms;
|
|
182
|
+
--transition-slow: 400ms;
|
|
183
|
+
--transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
184
|
+
|
|
185
|
+
/* Hover/Active transforms - Glowing lift */
|
|
186
|
+
--hover-scale: 1.02;
|
|
187
|
+
--hover-translate-y: -2px;
|
|
188
|
+
--hover-translate-x: 0;
|
|
189
|
+
--active-scale: 0.98;
|
|
190
|
+
--active-translate-y: 0;
|
|
191
|
+
|
|
192
|
+
/* Focus ring - Teal glow */
|
|
193
|
+
--focus-ring-width: 2px;
|
|
194
|
+
--focus-ring-offset: 2px;
|
|
195
|
+
--focus-ring-color: #14b8a6;
|
|
196
|
+
}
|
package/themes/index.css
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme index - exports all built-in theme CSS files
|
|
3
|
+
*
|
|
4
|
+
* Each theme provides both light and dark modes via:
|
|
5
|
+
* [data-theme="themename-light"] { ... }
|
|
6
|
+
* [data-theme="themename-dark"] { ... }
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
@import "./wireframe.css";
|
|
10
|
+
@import "./minimalist.css";
|
|
11
|
+
@import "./almadar.css";
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimalist Theme
|
|
3
|
+
*
|
|
4
|
+
* Clean, subtle, refined. Uses soft shadows, thin borders,
|
|
5
|
+
* and gentle curves for a premium, modern feel.
|
|
6
|
+
* Elegant hover effects and smooth transitions.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* ==========================================================================
|
|
10
|
+
* LIGHT MODE
|
|
11
|
+
* ========================================================================== */
|
|
12
|
+
[data-theme="minimalist-light"] {
|
|
13
|
+
/* Shadows - Soft, layered */
|
|
14
|
+
--shadow-main: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
15
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
16
|
+
--shadow-lg:
|
|
17
|
+
0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
|
|
18
|
+
--shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
19
|
+
--shadow-none: none;
|
|
20
|
+
--shadow-hover: 0 10px 40px -10px rgba(0, 0, 0, 0.15);
|
|
21
|
+
--shadow-active: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
22
|
+
|
|
23
|
+
/* Border radius - Gentle curves */
|
|
24
|
+
--radius-none: 0px;
|
|
25
|
+
--radius-sm: 4px;
|
|
26
|
+
--radius-md: 8px;
|
|
27
|
+
--radius-lg: 12px;
|
|
28
|
+
--radius-xl: 16px;
|
|
29
|
+
--radius-full: 9999px;
|
|
30
|
+
|
|
31
|
+
/* Border width - Thin, delicate */
|
|
32
|
+
--border-width: 1px;
|
|
33
|
+
--border-width-thin: 1px;
|
|
34
|
+
--border-width-thick: 2px;
|
|
35
|
+
|
|
36
|
+
/* Colors - Subtle contrast with soft grays */
|
|
37
|
+
--color-primary: #18181b;
|
|
38
|
+
--color-primary-hover: #27272a;
|
|
39
|
+
--color-primary-foreground: #fafafa;
|
|
40
|
+
|
|
41
|
+
--color-secondary: #fafafa;
|
|
42
|
+
--color-secondary-hover: #f4f4f5;
|
|
43
|
+
--color-secondary-foreground: #18181b;
|
|
44
|
+
|
|
45
|
+
--color-accent: #18181b;
|
|
46
|
+
--color-accent-foreground: #fafafa;
|
|
47
|
+
|
|
48
|
+
--color-muted: #f4f4f5;
|
|
49
|
+
--color-muted-foreground: #71717a;
|
|
50
|
+
|
|
51
|
+
--color-background: #ffffff;
|
|
52
|
+
--color-foreground: #18181b;
|
|
53
|
+
--color-card: #ffffff;
|
|
54
|
+
--color-card-foreground: #18181b;
|
|
55
|
+
--color-surface: #f4f4f5;
|
|
56
|
+
--color-border: #e4e4e7;
|
|
57
|
+
--color-input: #d4d4d8;
|
|
58
|
+
--color-ring: #18181b;
|
|
59
|
+
|
|
60
|
+
/* Semantic colors */
|
|
61
|
+
--color-error: #dc2626;
|
|
62
|
+
--color-error-foreground: #ffffff;
|
|
63
|
+
--color-success: #16a34a;
|
|
64
|
+
--color-success-foreground: #ffffff;
|
|
65
|
+
--color-warning: #ca8a04;
|
|
66
|
+
--color-warning-foreground: #000000;
|
|
67
|
+
--color-info: #2563eb;
|
|
68
|
+
--color-info-foreground: #ffffff;
|
|
69
|
+
|
|
70
|
+
/* Typography - Light, elegant */
|
|
71
|
+
--font-family:
|
|
72
|
+
"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
73
|
+
--font-weight-normal: 400;
|
|
74
|
+
--font-weight-medium: 500;
|
|
75
|
+
--font-weight-bold: 600;
|
|
76
|
+
--letter-spacing: -0.01em;
|
|
77
|
+
--line-height: 1.6;
|
|
78
|
+
|
|
79
|
+
/* Icon styling - Thin, refined */
|
|
80
|
+
--icon-stroke-width: 1.5;
|
|
81
|
+
--icon-color: currentColor;
|
|
82
|
+
|
|
83
|
+
/* Transitions - Smooth, elegant */
|
|
84
|
+
--transition-fast: 150ms;
|
|
85
|
+
--transition-normal: 250ms;
|
|
86
|
+
--transition-slow: 400ms;
|
|
87
|
+
--transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
88
|
+
|
|
89
|
+
/* Hover/Active transforms - Subtle lift */
|
|
90
|
+
--hover-scale: 1.01;
|
|
91
|
+
--hover-translate-y: -1px;
|
|
92
|
+
--hover-translate-x: 0;
|
|
93
|
+
--active-scale: 0.99;
|
|
94
|
+
--active-translate-y: 0;
|
|
95
|
+
|
|
96
|
+
/* Focus ring */
|
|
97
|
+
--focus-ring-width: 2px;
|
|
98
|
+
--focus-ring-offset: 2px;
|
|
99
|
+
--focus-ring-color: #18181b;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ==========================================================================
|
|
103
|
+
* DARK MODE
|
|
104
|
+
* ========================================================================== */
|
|
105
|
+
[data-theme="minimalist-dark"] {
|
|
106
|
+
/* Shadows - Darker, more pronounced */
|
|
107
|
+
--shadow-main: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
108
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
109
|
+
--shadow-lg:
|
|
110
|
+
0 10px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
|
|
111
|
+
--shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
112
|
+
--shadow-none: none;
|
|
113
|
+
--shadow-hover: 0 10px 40px -10px rgba(0, 0, 0, 0.4);
|
|
114
|
+
--shadow-active: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
115
|
+
|
|
116
|
+
/* Border radius - Gentle curves */
|
|
117
|
+
--radius-none: 0px;
|
|
118
|
+
--radius-sm: 4px;
|
|
119
|
+
--radius-md: 8px;
|
|
120
|
+
--radius-lg: 12px;
|
|
121
|
+
--radius-xl: 16px;
|
|
122
|
+
--radius-full: 9999px;
|
|
123
|
+
|
|
124
|
+
/* Border width - Thin, delicate */
|
|
125
|
+
--border-width: 1px;
|
|
126
|
+
--border-width-thin: 1px;
|
|
127
|
+
--border-width-thick: 2px;
|
|
128
|
+
|
|
129
|
+
/* Colors - Dark mode inverted */
|
|
130
|
+
--color-primary: #fafafa;
|
|
131
|
+
--color-primary-hover: #e4e4e7;
|
|
132
|
+
--color-primary-foreground: #18181b;
|
|
133
|
+
|
|
134
|
+
--color-secondary: #27272a;
|
|
135
|
+
--color-secondary-hover: #3f3f46;
|
|
136
|
+
--color-secondary-foreground: #fafafa;
|
|
137
|
+
|
|
138
|
+
--color-accent: #fafafa;
|
|
139
|
+
--color-accent-foreground: #18181b;
|
|
140
|
+
|
|
141
|
+
--color-muted: #27272a;
|
|
142
|
+
--color-muted-foreground: #a1a1aa;
|
|
143
|
+
|
|
144
|
+
--color-background: #09090b;
|
|
145
|
+
--color-foreground: #fafafa;
|
|
146
|
+
--color-card: #18181b;
|
|
147
|
+
--color-card-foreground: #fafafa;
|
|
148
|
+
--color-surface: #27272a;
|
|
149
|
+
--color-border: #27272a;
|
|
150
|
+
--color-input: #3f3f46;
|
|
151
|
+
--color-ring: #fafafa;
|
|
152
|
+
|
|
153
|
+
/* Semantic colors - Brighter for dark mode */
|
|
154
|
+
--color-error: #f87171;
|
|
155
|
+
--color-error-foreground: #000000;
|
|
156
|
+
--color-success: #4ade80;
|
|
157
|
+
--color-success-foreground: #000000;
|
|
158
|
+
--color-warning: #fbbf24;
|
|
159
|
+
--color-warning-foreground: #000000;
|
|
160
|
+
--color-info: #60a5fa;
|
|
161
|
+
--color-info-foreground: #000000;
|
|
162
|
+
|
|
163
|
+
/* Typography */
|
|
164
|
+
--font-family:
|
|
165
|
+
"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
166
|
+
--font-weight-normal: 400;
|
|
167
|
+
--font-weight-medium: 500;
|
|
168
|
+
--font-weight-bold: 600;
|
|
169
|
+
--letter-spacing: -0.01em;
|
|
170
|
+
--line-height: 1.6;
|
|
171
|
+
|
|
172
|
+
/* Icon styling */
|
|
173
|
+
--icon-stroke-width: 1.5;
|
|
174
|
+
--icon-color: currentColor;
|
|
175
|
+
|
|
176
|
+
/* Transitions */
|
|
177
|
+
--transition-fast: 150ms;
|
|
178
|
+
--transition-normal: 250ms;
|
|
179
|
+
--transition-slow: 400ms;
|
|
180
|
+
--transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
181
|
+
|
|
182
|
+
/* Hover/Active transforms */
|
|
183
|
+
--hover-scale: 1.01;
|
|
184
|
+
--hover-translate-y: -1px;
|
|
185
|
+
--hover-translate-x: 0;
|
|
186
|
+
--active-scale: 0.99;
|
|
187
|
+
--active-translate-y: 0;
|
|
188
|
+
|
|
189
|
+
/* Focus ring */
|
|
190
|
+
--focus-ring-width: 2px;
|
|
191
|
+
--focus-ring-offset: 2px;
|
|
192
|
+
--focus-ring-color: #fafafa;
|
|
193
|
+
}
|