@howssatoshi/quantumcss 1.8.0 → 1.11.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.
Files changed (49) hide show
  1. package/README.md +11 -10
  2. package/dist/quantum.min.css +10 -1
  3. package/examples/admin-panel.html +317 -600
  4. package/examples/analytics-dashboard.html +136 -299
  5. package/examples/blog.css +297 -0
  6. package/examples/blog.html +216 -0
  7. package/examples/chat-messaging.html +43 -70
  8. package/examples/email-client.css +582 -0
  9. package/examples/email-client.html +432 -0
  10. package/examples/gaming-portal.css +352 -0
  11. package/examples/gaming-portal.html +239 -0
  12. package/examples/images/eric.png +0 -0
  13. package/examples/index.html +342 -259
  14. package/examples/kitchen-sink.html +332 -94
  15. package/examples/music-streaming.html +32 -91
  16. package/examples/news.html +199 -0
  17. package/examples/nova-shop.css +984 -0
  18. package/examples/portfolio.html +235 -0
  19. package/examples/shopping.html +812 -0
  20. package/examples/starlight.html +11 -9
  21. package/examples/task.md +12 -0
  22. package/examples/travel.html +514 -0
  23. package/examples/video-streaming.html +310 -92
  24. package/package.json +9 -3
  25. package/src/cli.js +5 -5
  26. package/src/defaults.js +19 -16
  27. package/src/generator.js +12 -3
  28. package/src/starlight.js +20 -15
  29. package/src/styles/quantum-animations.css +13 -13
  30. package/src/styles/quantum-base.css +110 -58
  31. package/src/styles/quantum-components.css +2379 -349
  32. package/src/styles/quantum-icons.css +345 -0
  33. package/src/styles/starlight.css +2702 -1054
  34. package/dist/index.html +0 -232
  35. package/dist/quantum.css +0 -2374
  36. package/examples/blog-template.html +0 -287
  37. package/examples/email-template.html +0 -712
  38. package/examples/gaming-template.html +0 -340
  39. package/examples/gradient-test.html +0 -124
  40. package/examples/news-template.html +0 -317
  41. package/examples/portfolio-resume.html +0 -647
  42. package/examples/shopping/images/headset.jpg +0 -0
  43. package/examples/shopping/images/sneakers.jpg +0 -0
  44. package/examples/shopping/images/windbreaker.jpg +0 -0
  45. package/examples/shopping/index.html +0 -338
  46. package/examples/theme-test.html +0 -159
  47. package/examples/travel/index.html +0 -275
  48. package/examples/verify_fixes.html +0 -52
  49. package/examples/verify_presets.html +0 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@howssatoshi/quantumcss",
3
- "version": "1.8.0",
3
+ "version": "1.11.0",
4
4
  "description": "Advanced utility-first CSS framework with JIT generation and modern components",
5
5
  "main": "dist/quantum.min.css",
6
6
  "bin": {
@@ -19,7 +19,9 @@
19
19
  "watch": "node scripts/build.js --watch",
20
20
  "docs": "node scripts/build.js --docs",
21
21
  "generate": "node src/cli.js",
22
- "generate:watch": "node src/cli.js --watch"
22
+ "generate:watch": "node src/cli.js --watch",
23
+ "harvest:icons": "node scripts/harvest-icons.js",
24
+ "release": "node scripts/release.js"
23
25
  },
24
26
  "repository": {
25
27
  "type": "git",
@@ -44,8 +46,12 @@
44
46
  "node": ">=14.0.0"
45
47
  },
46
48
  "dependencies": {
49
+ "autoprefixer": "^10.4.27",
47
50
  "chokidar": "^5.0.0",
48
- "glob": "^13.0.0"
51
+ "cssnano": "^7.1.3",
52
+ "glob": "^13.0.0",
53
+ "parse5": "^8.0.0",
54
+ "postcss": "^8.5.8"
49
55
  },
50
56
  "devDependencies": {
51
57
  "@eslint/js": "^9.39.2",
package/src/cli.js CHANGED
@@ -115,12 +115,12 @@ function build(outputPath = 'dist/quantum.css') {
115
115
  function scaffold(template, targetPath = 'index.html') {
116
116
  const templatesDir = path.resolve(__dirname, '../examples');
117
117
  const templateMap = {
118
- gaming: 'gaming-template.html',
119
- blog: 'blog-template.html',
120
- travel: 'travel/index.html',
121
- shopping: 'shopping/index.html',
118
+ gaming: 'gaming-portal.html',
119
+ blog: 'blog.html',
120
+ travel: 'travel.html',
121
+ shopping: 'shopping.html',
122
122
  starlight: 'starlight.html',
123
- news: 'news-template.html',
123
+ news: 'news.html',
124
124
  docs: 'kitchen-sink.html'
125
125
  };
126
126
 
package/src/defaults.js CHANGED
@@ -35,6 +35,7 @@ const defaultTheme = {
35
35
  starlight: {
36
36
  blue: '#00d4ff', peach: '#ffb38a', orange: '#ff7e5f', deep: '#08081a',
37
37
  },
38
+ accent: '#00d4ff',
38
39
  transparent: 'transparent',
39
40
  },
40
41
  spacing: {
@@ -149,7 +150,7 @@ const utilityMaps = {
149
150
  value: ['rgba(255, 255, 255, 0.03)', 'blur(16px)', 'blur(16px)', '1px', 'solid', 'rgba(255, 255, 255, 0.1)']
150
151
  },
151
152
  'bg-starlight': { property: 'background', value: 'linear-gradient(135deg, var(--q-color-starlight-peach) 0%, var(--q-color-starlight-blue) 100%)' },
152
- 'text-gradient-starlight': {
153
+ 'text-gradient': {
153
154
  property: ['background', '-webkit-background-clip', '-webkit-text-fill-color', 'display'],
154
155
  value: ['linear-gradient(to right, var(--q-color-starlight-peach), var(--q-color-starlight-blue))', 'text', 'transparent', 'inline-block']
155
156
  },
@@ -162,10 +163,10 @@ const utilityMaps = {
162
163
  value: ['rgba(255, 255, 255, 0.05)', 'blur(16px)', 'blur(16px)', 'rgba(255, 255, 255, 0.1)', '1px', 'solid']
163
164
  },
164
165
  'theme-glass-dark': {
165
- property: ['background-color', 'backdrop-filter', '-webkit-backdrop-filter', 'border-color', 'border-width', 'border-style'],
166
- value: ['rgba(255, 255, 255, 0.05)', 'blur(16px)', 'blur(16px)', 'rgba(255, 255, 255, 0.1)', '1px', 'solid']
166
+ property: ['background-color', 'border-color', 'border-width', 'border-style'],
167
+ value: ['rgba(255, 255, 255, 0.05)', 'rgba(255, 255, 255, 0.1)', '1px', 'solid']
167
168
  },
168
- 'starlight-dialog-bg': {
169
+ 'dialog-bg': {
169
170
  property: ['background-color', 'backdrop-filter', '-webkit-backdrop-filter'],
170
171
  value: ['rgba(8, 8, 26, 0.05) !important', 'blur(24px) !important', 'blur(24px) !important']
171
172
  },
@@ -186,22 +187,24 @@ const utilityMaps = {
186
187
  'search-container': 'relative block w-full h-12',
187
188
  'search-input': 'pl-12 w-full h-12',
188
189
  'search-icon': 'absolute left-4 top-1_2 -translate-y-1_2 pointer-events-none z-10 w-5 h-5',
189
- 'nav-glass': 'nav-base theme-glass-dark',
190
+ 'nav-glass': 'nav-base theme-glass-dark border-b',
190
191
  'starlight-card': 'card-base theme-glass-dark',
191
192
  'starlight-card-interactive': 'card-base theme-glass-dark hover:border-white_20 hover:-translate-y-1 transition-all duration-300',
192
- 'starlight-nav': 'nav-base theme-glass-dark w-full',
193
- 'starlight-navbar': 'nav-base theme-glass-dark w-full sticky top-0 z-50 border-b border-white_10',
193
+ 'nav-header': 'nav-base theme-glass-dark w-full sticky top-0 z-50 border-b',
194
+ 'starlight-nav': 'nav-header',
195
+ 'starlight-navbar': 'nav-header border-white_10',
194
196
  'starlight-hero': 'container mx-auto px-6 py-16 md:py-24 text-center relative overflow-hidden',
195
197
  'starlight-footer': 'border-t border-white_10 py-12 mt-20 bg-black_20 backdrop-blur-md',
196
- 'starlight-sidebar-nav': 'flex flex-col h-full p-6 bg-black_40 backdrop-blur-xl border-r border-white_10',
198
+ 'aside-nav': 'flex flex-col h-full backdrop-blur-xl border-r border-white_10',
199
+ 'starlight-sidebar-nav': 'aside-nav p-6',
197
200
  'nav-reverse': { property: 'flex-direction', value: 'row-reverse' },
198
201
  'nav-center': { property: 'display', value: 'grid' },
199
202
  'hamburger-left': { property: 'order', value: '-1' },
200
- 'starlight-search': 'search-container theme-glass-dark rounded-xl',
201
- 'starlight-dashboard': 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8',
202
- 'starlight-gallery': 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4',
203
- 'starlight-form': 'card-base theme-glass-dark grid grid-cols-1 md:grid-cols-2 gap-8 items-start',
204
- 'starlight-dialog': 'dialog-base modal-fixed theme-glass-dark starlight-dialog-bg ani-scale-in',
203
+ 'search': 'search-container theme-glass-dark rounded-xl',
204
+ 'dashboard': 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8',
205
+ 'gallery': 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4',
206
+ 'form': 'card-base theme-glass-dark grid grid-cols-1 md:grid-cols-2 gap-8 items-start',
207
+ 'dialog': 'dialog-base modal-fixed theme-glass-dark dialog-bg ani-scale-in',
205
208
  'starlight-sidebar': 'flex flex-col h-screen w-72 fixed left-0 top-0 bg-black_40 backdrop-blur-xl border-r border-white_10 p-6 z-40',
206
209
  'starlight-feed-card': 'flex flex-col bg-white_03 backdrop-blur-md border border-white_10 rounded-2xl p-6 transition-all duration-300 ease',
207
210
  'starlight-auth-form': 'flex flex-col max-w-md mx-auto bg-white_05 backdrop-blur-xl border border-white_10 rounded-2xl p-10 shadow-2xl',
@@ -262,9 +265,9 @@ const utilityMaps = {
262
265
  'starlight-breadcrumb-separator': 'text-white_40',
263
266
  'starlight-breadcrumb-current': 'font-medium',
264
267
 
265
- 'starlight-gallery-grid': 'grid gap-4',
266
- 'starlight-gallery-item': 'relative aspect-video rounded-lg overflow-hidden',
267
- 'starlight-gallery-overlay': 'absolute inset-0 flex items-end p-4 bg-gradient-to-t from-black_80 to-transparent opacity-0 transition-opacity',
268
+ 'gallery-grid': 'grid gap-4',
269
+ 'gallery-item': 'relative aspect-video rounded-lg overflow-hidden',
270
+ 'gallery-overlay': 'absolute inset-0 flex items-end p-4 bg-gradient-to-t from-black_80 to-transparent opacity-0 transition-opacity',
268
271
 
269
272
  'starlight-progress': 'flex items-center gap-3',
270
273
  'starlight-progress-bar': 'flex-1 h-2 bg-white_10 rounded-full overflow-hidden',
package/src/generator.js CHANGED
@@ -122,6 +122,9 @@ function generateCSS(configPath) {
122
122
  regex: new RegExp(`\\s${v}="([^"]+)"`, 'g')
123
123
  }));
124
124
 
125
+ const jitLimit = (config.jit && config.jit.limit) || 10000;
126
+ const jitWarnAt = (config.jit && config.jit.warnAt) || (jitLimit * 0.8);
127
+
125
128
  files.forEach(file => {
126
129
  try {
127
130
  const content = fs.readFileSync(file, 'utf8');
@@ -129,7 +132,9 @@ function generateCSS(configPath) {
129
132
  // 1. Match standard class="..."
130
133
  let match;
131
134
  while ((match = classAttrRegex.exec(content)) !== null) {
132
- match[1].split(/\s+/).forEach(cls => { if (cls) rawClasses.add(cls); });
135
+ match[1].split(/\s+/).forEach(cls => {
136
+ if (cls && rawClasses.size < jitLimit) rawClasses.add(cls);
137
+ });
133
138
  }
134
139
 
135
140
  // 2. Match attribute lanes (e.g., md="flex gap-4")
@@ -137,7 +142,7 @@ function generateCSS(configPath) {
137
142
  regex.lastIndex = 0;
138
143
  while ((match = regex.exec(content)) !== null) {
139
144
  match[1].split(/\s+/).forEach(cls => {
140
- if (cls) {
145
+ if (cls && rawClasses.size < jitLimit) {
141
146
  // We convert attribute-based utilities to a canonical internal format
142
147
  // using the __ separator, which getRulesForClass already understands.
143
148
  rawClasses.add(`${variant}__${cls}`);
@@ -150,6 +155,10 @@ function generateCSS(configPath) {
150
155
  }
151
156
  });
152
157
 
158
+ if (rawClasses.size >= jitWarnAt) {
159
+ console.warn(`⚠️ JIT Warning: Generated ${rawClasses.size} utilities, approaching limit of ${jitLimit}.`);
160
+ }
161
+
153
162
  const utilities = new Set();
154
163
  const responsiveUtils = {
155
164
  sm: new Set(), md: new Set(), lg: new Set(), xl: new Set(), '2xl': new Set(),
@@ -162,7 +171,7 @@ function generateCSS(configPath) {
162
171
  * @returns {string} The escaped selector
163
172
  */
164
173
  const escapeSelector = (cls) => {
165
- return cls.replace(/([:.[\]\\])/g, '\\$1');
174
+ return cls.replace(/([:.[\]\\/])/g, '\\$1');
166
175
  };
167
176
 
168
177
  const sideMap = {
package/src/starlight.js CHANGED
@@ -439,7 +439,7 @@ const Starlight = {
439
439
  iconSelector: {
440
440
  light: '.sun-icon, [data-theme-icon="light"]',
441
441
  dark: '.moon-icon, [data-theme-icon="dark"]',
442
- auto: '.system-icon, [data-theme-icon="auto"]'
442
+ auto: '.q-icon-display, [data-theme-icon="auto"]'
443
443
  },
444
444
  autoDetect: true
445
445
  };
@@ -457,25 +457,30 @@ const Starlight = {
457
457
  * @param {string} effectiveTheme - The actual theme being displayed
458
458
  */
459
459
  const updateIcons = (theme, effectiveTheme) => {
460
- const hasAutoIcon = document.querySelector(config.iconSelector.auto) !== null;
460
+ const autoIconSelector = config.iconSelector.auto;
461
+ const hasAutoIcon = autoIconSelector && document.querySelector(autoIconSelector) !== null;
461
462
 
463
+ if (theme === 'auto' && hasAutoIcon) {
464
+ // Auto mode with auto icon: show only auto icon
465
+ document.querySelectorAll(autoIconSelector).forEach(icon => {
466
+ icon.classList.remove('hidden');
467
+ });
468
+ // Hide light/dark icons
469
+ const lightSelector = config.iconSelector.light;
470
+ const darkSelector = config.iconSelector.dark;
471
+ document.querySelectorAll(`${lightSelector}, ${darkSelector}`).forEach(icon => {
472
+ icon.classList.add('hidden');
473
+ });
474
+ return;
475
+ }
476
+
477
+ // Otherwise use normal theme-based visibility
462
478
  config.themes.forEach(t => {
463
479
  const selector = config.iconSelector[t];
464
480
  if (selector) {
465
481
  document.querySelectorAll(selector).forEach(icon => {
466
- if (theme === 'auto') {
467
- // In auto mode, show system icon if it exists, otherwise show the effective theme icon
468
- const isAutoIcon = t === 'auto';
469
- const isEffectiveIcon = t === effectiveTheme;
470
-
471
- if (hasAutoIcon) {
472
- icon.classList.toggle('hidden', !isAutoIcon);
473
- } else {
474
- icon.classList.toggle('hidden', !isEffectiveIcon);
475
- }
476
- } else {
477
- icon.classList.toggle('hidden', t !== theme);
478
- }
482
+ const isEffective = theme === 'auto' ? t === effectiveTheme : t === theme;
483
+ icon.classList.toggle('hidden', !isEffective);
479
484
  });
480
485
  }
481
486
  });
@@ -53,42 +53,42 @@
53
53
  .ani-svg-draw {
54
54
  stroke-dasharray: 1000;
55
55
  stroke-dashoffset: 1000;
56
- animation: svg-draw var(--q-duration-slow) var(--q-ease-emphasized) forwards;
56
+ animation: svg-draw 3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
57
57
  }
58
58
 
59
59
  .ani-float {
60
- animation: float-y 6s var(--q-ease-in-out) infinite;
60
+ animation: float-y 6s ease-in-out infinite;
61
61
  }
62
62
 
63
63
  .ani-fade-in {
64
- animation: fadeIn var(--q-duration-base) var(--q-ease-out) forwards;
64
+ animation: fadeIn 0.3s ease-out forwards;
65
65
  }
66
66
 
67
67
  .ani-slide-up {
68
- animation: slideUp var(--q-duration-base) var(--q-ease-out) forwards;
68
+ animation: slideUp 0.3s ease-out forwards;
69
69
  }
70
70
 
71
71
  .ani-slide-down {
72
- animation: slideDown var(--q-duration-base) var(--q-ease-out) forwards;
72
+ animation: slideDown 0.3s ease-out forwards;
73
73
  }
74
74
 
75
75
  .ani-scale-in {
76
- animation: scaleIn var(--q-duration-fast) var(--q-ease-out) forwards;
76
+ animation: scaleIn 0.2s ease-out forwards;
77
77
  }
78
78
 
79
79
  .ani-spin {
80
- animation: spin 1s var(--q-ease-linear) infinite;
80
+ animation: spin 1s linear infinite;
81
81
  }
82
82
 
83
83
  /* Staggered Animations */
84
- .ani-stagger-1 { animation-delay: var(--q-duration-fast); }
85
- .ani-stagger-2 { animation-delay: var(--q-duration-base); }
86
- .ani-stagger-3 { animation-delay: var(--q-duration-slow); }
87
- .ani-stagger-4 { animation-delay: 500ms; }
88
- .ani-stagger-5 { animation-delay: var(--q-duration-slower); }
84
+ .ani-stagger-1 { animation-delay: 0.1s; }
85
+ .ani-stagger-2 { animation-delay: 0.2s; }
86
+ .ani-stagger-3 { animation-delay: 0.3s; }
87
+ .ani-stagger-4 { animation-delay: 0.4s; }
88
+ .ani-stagger-5 { animation-delay: 0.5s; }
89
89
 
90
90
  /* Speed Modifiers */
91
- .ani-fast { animation-duration: var(--q-duration-fast) !important; }
91
+ .ani-fast { animation-duration: 0.5s !important; }
92
92
  .ani-slow { animation-duration: 8s !important; }
93
93
  .ani-slower { animation-duration: 15s !important; }
94
94
 
@@ -1,12 +1,8 @@
1
1
  /*!
2
- * QuantumCSS Core
3
- * Layer: Core / Tokens & Base
4
- *
5
- * ARCHITECTURAL CONTRACT:
6
- * 1. Core layer MUST NEVER reference brand-specific tokens (e.g., --q-color-starlight).
7
- * 2. Core layer MUST ONLY use semantic tokens (e.g., --q-color-primary, --q-color-bg).
8
- * 3. Aesthetics (gradients, specific colors) are injected by the Theme layer.
9
- * 4. This file contains the non-optional compliance and reset layers.
2
+ * QuantumCSS + Starlight UI
3
+ * Advanced utility-first framework with ethereal cosmic aesthetics
4
+ * Version: 1.7.3
5
+ * Features: Modern CSS, JIT Engine, Starlight Components, Dark Mode
10
6
  */
11
7
 
12
8
  @import 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap';
@@ -33,29 +29,6 @@
33
29
  --q-color-error: #ef4444;
34
30
  --q-color-neutral: #6b7280;
35
31
 
36
- /* Semantic Color Tokens (Core Layer) */
37
- --q-color-bg: var(--q-bg-primary);
38
- --q-color-bg-muted: color-mix(in srgb, var(--q-color-bg), var(--q-color-neutral) 5%);
39
- --q-color-surface: var(--q-card-bg);
40
- --q-color-surface-elevated: color-mix(in srgb, var(--q-color-surface), white 2%);
41
- --q-color-border: var(--q-card-border);
42
- --q-color-border-strong: color-mix(in srgb, var(--q-color-border), white 10%);
43
-
44
- --q-color-text: var(--q-text-primary);
45
- --q-color-text-muted: var(--q-text-secondary);
46
- --q-color-text-inverse: #000;
47
-
48
- --q-color-primary-hover: var(--q-color-primary-600);
49
- --q-color-success-soft: color-mix(in srgb, var(--q-color-success) 15%, transparent);
50
- --q-color-warning-soft: color-mix(in srgb, var(--q-color-warning) 15%, transparent);
51
- --q-color-danger: var(--q-color-error);
52
- --q-color-danger-soft: color-mix(in srgb, var(--q-color-danger) 15%, transparent);
53
- --q-color-info: var(--q-color-primary);
54
- --q-color-info-soft: color-mix(in srgb, var(--q-color-info) 15%, transparent);
55
-
56
- --q-color-link: var(--q-color-primary);
57
- --q-color-link-hover: var(--q-color-primary-hover);
58
-
59
32
  /* Typography */
60
33
  --q-font-sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
61
34
  --q-font-serif: Georgia, Cambria, serif;
@@ -94,18 +67,19 @@
94
67
  --q-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%);
95
68
  --q-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 25%);
96
69
 
97
- /* Animation & Motion Tokens */
98
- --q-duration-instant: 0ms;
99
- --q-duration-fast: 150ms;
100
- --q-duration-base: 250ms;
101
- --q-duration-slow: 400ms;
102
- --q-duration-slower: 700ms;
103
-
70
+ /* Animation */
71
+ --q-duration-75: 75ms;
72
+ --q-duration-100: 100ms;
73
+ --q-duration-150: 150ms;
74
+ --q-duration-200: 200ms;
75
+ --q-duration-300: 300ms;
76
+ --q-duration-500: 500ms;
77
+ --q-duration-700: 700ms;
78
+ --q-duration-1000: 1000ms;
104
79
  --q-ease-linear: linear;
105
80
  --q-ease-in: cubic-bezier(0.4, 0, 1, 1);
106
81
  --q-ease-out: cubic-bezier(0, 0, 0.2, 1);
107
82
  --q-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
108
- --q-ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
109
83
 
110
84
  /* --- Starlight Specific Tokens --- */
111
85
  --q-color-starlight: var(--q-color-starlight-blue);
@@ -138,9 +112,9 @@
138
112
  --q-glass-blur: blur(16px);
139
113
 
140
114
  /* Transitions */
141
- --q-transition-fast: var(--q-duration-fast) var(--q-ease-in-out);
142
- --q-transition-base: var(--q-duration-base) var(--q-ease-in-out);
143
- --q-transition-slow: var(--q-duration-slow) var(--q-ease-in-out);
115
+ --q-transition-fast: 150ms ease-in-out;
116
+ --q-transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1);
117
+ --q-transition-slow: 400ms ease-in-out;
144
118
  }
145
119
 
146
120
  /* High Contrast (Accessibility) Mode Support */
@@ -201,7 +175,7 @@ html {
201
175
  font-size: 16px;
202
176
  -webkit-font-smoothing: antialiased;
203
177
  -moz-osx-font-smoothing: grayscale;
204
- background-color: var(--q-color-starlight-deep);
178
+ background-color: var(--q-bg-primary);
205
179
  scrollbar-width: thin;
206
180
  scrollbar-color: var(--q-color-starlight-blue) transparent;
207
181
  }
@@ -210,6 +184,10 @@ body {
210
184
  line-height: inherit;
211
185
  }
212
186
 
187
+ ul, ol {
188
+ list-style: none;
189
+ }
190
+
213
191
  input, textarea, select, button {
214
192
  font-family: inherit;
215
193
  font-size: inherit;
@@ -584,6 +562,7 @@ textarea {
584
562
  .font-semibold { font-weight: 600; }
585
563
  .font-bold { font-weight: 700; }
586
564
  .font-extrabold { font-weight: 800; }
565
+ .font-black { font-weight: 900; }
587
566
 
588
567
  .text-left { text-align: left; }
589
568
  .text-center { text-align: center; }
@@ -591,8 +570,10 @@ textarea {
591
570
  .text-justify { text-align: justify; }
592
571
 
593
572
  /* Color Utilities */
594
- .text-primary { color: var(--q-color-primary); }
595
- .text-secondary { color: var(--q-color-secondary); }
573
+ .text-primary { color: var(--q-text-primary); }
574
+ .text-secondary { color: var(--q-text-secondary); }
575
+ .text-muted { color: var(--q-text-muted); }
576
+ .text-accent { color: var(--q-color-primary); }
596
577
  .text-success { color: var(--q-color-success); }
597
578
  .text-warning { color: var(--q-color-warning); }
598
579
  .text-error { color: var(--q-color-error); }
@@ -600,7 +581,9 @@ textarea {
600
581
  .text-white { color: #fff; }
601
582
  .text-black { color: #000; }
602
583
 
603
- .bg-primary { background-color: var(--q-color-primary); }
584
+ .bg-primary { background-color: var(--q-bg-primary); }
585
+ .bg-surface { background-color: var(--q-color-surface); }
586
+ .bg-accent { background-color: var(--q-color-primary); }
604
587
  .bg-secondary { background-color: var(--q-color-secondary); }
605
588
  .bg-success { background-color: var(--q-color-success); }
606
589
  .bg-warning { background-color: var(--q-color-warning); }
@@ -772,13 +755,13 @@ textarea {
772
755
  .transition-all {
773
756
  transition-property: all;
774
757
  transition-timing-function: var(--q-ease-in-out);
775
- transition-duration: var(--q-duration-fast);
758
+ transition-duration: var(--q-duration-150);
776
759
  }
777
760
 
778
761
  .transition-colors {
779
762
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
780
763
  transition-timing-function: var(--q-ease-in-out);
781
- transition-duration: var(--q-duration-fast);
764
+ transition-duration: var(--q-duration-150);
782
765
  }
783
766
 
784
767
  /* Transform Utilities */
@@ -832,6 +815,8 @@ textarea {
832
815
 
833
816
  /* Z-Index Utilities */
834
817
  .z-auto { z-index: auto; }
818
+ .z-n10 { z-index: -10; }
819
+ .z-n1 { z-index: -1; }
835
820
  .z-0 { z-index: 0; }
836
821
  .z-10 { z-index: 10; }
837
822
  .z-20 { z-index: 20; }
@@ -885,12 +870,14 @@ textarea {
885
870
  color: var(--q-color-primary-600);
886
871
  }
887
872
 
888
- /* Reduced Motion Compliance Layer */
873
+ /* Reduced Motion Support */
889
874
  @media (prefers-reduced-motion: reduce) {
890
- * {
891
- animation-duration: 0ms !important;
875
+ *,
876
+ *::before,
877
+ *::after {
878
+ animation-duration: 0.01ms !important;
892
879
  animation-iteration-count: 1 !important;
893
- transition-duration: 0ms !important;
880
+ transition-duration: 0.01ms !important;
894
881
  scroll-behavior: auto !important;
895
882
  }
896
883
  }
@@ -937,6 +924,39 @@ html[data-theme="light"] {
937
924
  --q-text-primary: var(--q-light-text);
938
925
  --q-text-secondary: var(--q-light-text-muted);
939
926
  --q-text-muted: var(--q-light-text-muted);
927
+
928
+ --q-card-bg: color-mix(in srgb, #fff, transparent 5%);
929
+ --q-card-border: color-mix(in srgb, #000, transparent 90%);
930
+ --q-card-shadow: 0 10px 40px rgb(0 0 0 / 10%);
931
+
932
+ --q-btn-primary-bg: linear-gradient(135deg, var(--q-color-starlight-peach) 40%, var(--q-color-starlight-blue) 100%);
933
+ --q-btn-primary-hover-bg: linear-gradient(135deg, var(--q-color-starlight-peach) 50%, var(--q-color-starlight-blue) 110%);
934
+ --q-btn-primary-color: #fff;
935
+
936
+ --q-input-bg: #fff;
937
+ --q-input-border: #cbd5e1;
938
+
939
+ --q-dropdown-bg: rgba(255, 255, 255, 0.98);
940
+ --q-dropdown-border: color-mix(in srgb, #000, transparent 82%);
941
+ --q-dropdown-shadow: 0 15px 50px rgba(0, 0, 0, 0.12);
942
+
943
+ --q-glass-bg: color-mix(in srgb, #fff, transparent 15%);
944
+ --q-glass-border: color-mix(in srgb, #000, transparent 82%);
945
+
946
+ --q-color-bg: var(--q-bg-primary);
947
+ --q-color-surface: var(--q-card-bg);
948
+ --q-color-border: var(--q-card-border);
949
+ --q-color-border-strong: color-mix(in srgb, var(--q-color-border), black 15%);
950
+ --q-color-text: var(--q-text-primary);
951
+
952
+ --q-color-bg-muted: color-mix(in srgb, var(--q-color-bg), black 10%);
953
+
954
+ --q-skeleton-bg: color-mix(in srgb, var(--q-color-bg), black 10%);
955
+ --q-skeleton-shimmer: color-mix(in srgb, var(--q-color-bg), black 5%);
956
+
957
+ /* Highlights & Highlights Transparency */
958
+ --q-highlight-bg: color-mix(in srgb, var(--q-color-primary), transparent 80%);
959
+ --q-highlight-border: color-mix(in srgb, var(--q-color-primary), transparent 60%);
940
960
 
941
961
  scrollbar-color: var(--q-color-starlight-blue) transparent;
942
962
  }
@@ -946,16 +966,49 @@ html[data-theme="dark"] {
946
966
 
947
967
  --q-bg-primary: var(--q-color-starlight-deep);
948
968
  --q-text-primary: #f1f5f9;
969
+
970
+ --q-card-bg: color-mix(in srgb, #fff, transparent 94%);
971
+ --q-card-border: color-mix(in srgb, #fff, transparent 88%);
972
+ --q-card-shadow: 0 25px 50px -12px rgb(0 0 0 / 60%);
973
+
974
+ --q-btn-primary-bg: #00d4ff;
975
+ --q-btn-primary-hover-bg: #00b8e6;
976
+ --q-btn-primary-color: #fff;
977
+
978
+ --q-input-bg: color-mix(in srgb, #fff, transparent 92%);
979
+ --q-input-border: color-mix(in srgb, #fff, transparent 75%);
980
+
981
+ --q-dropdown-bg: color-mix(in srgb, #08081a, transparent 15%);
982
+ --q-dropdown-border: color-mix(in srgb, #fff, transparent 80%);
983
+ --q-dropdown-shadow: 0 30px 60px rgba(0, 0, 0, 0.5);
984
+
985
+ --q-glass-bg: color-mix(in srgb, #fff, transparent 90%);
986
+ --q-glass-border: color-mix(in srgb, #fff, transparent 85%);
987
+
988
+ --q-color-bg: var(--q-bg-primary);
989
+ --q-color-surface: var(--q-card-bg);
990
+ --q-color-border: var(--q-card-border);
991
+ --q-color-border-strong: color-mix(in srgb, var(--q-color-border), white 15%);
992
+ --q-color-text: var(--q-text-primary);
993
+
994
+ --q-color-bg-muted: color-mix(in srgb, var(--q-color-bg), white 10%);
995
+
996
+ --q-skeleton-bg: color-mix(in srgb, var(--q-color-surface), white 5%);
997
+ --q-skeleton-shimmer: color-mix(in srgb, var(--q-color-surface), white 10%);
998
+
999
+ /* Highlights & Highlights Transparency */
1000
+ --q-highlight-bg: color-mix(in srgb, var(--q-color-primary), transparent 60%);
1001
+ --q-highlight-border: color-mix(in srgb, var(--q-color-primary), transparent 40%);
949
1002
  }
950
1003
 
951
1004
  /* Force theme colors on body to override template-specific hardcoded styles */
952
1005
  html[data-theme="light"] body {
953
- background: var(--q-light-bg) !important;
1006
+ background-color: var(--q-light-bg) !important;
954
1007
  color: var(--q-light-text);
955
1008
  }
956
1009
 
957
1010
  html[data-theme="dark"] body {
958
- background: var(--q-color-starlight-deep) !important;
1011
+ background-color: var(--q-color-starlight-deep) !important;
959
1012
  color: #f1f5f9;
960
1013
  }
961
1014
 
@@ -1000,12 +1053,11 @@ html[data-theme="light"] :focus, html[data-theme="light"] :focus-visible {
1000
1053
  body {
1001
1054
  margin: 0;
1002
1055
  min-height: 100vh;
1003
- background-color: var(--q-bg-primary);
1056
+ background-color: transparent;
1004
1057
  color: var(--q-text-primary);
1005
1058
  transition: background-color var(--q-transition-slow), color var(--q-transition-slow);
1006
-
1007
-
1008
-
1059
+ position: relative;
1060
+ z-index: 1;
1009
1061
  }
1010
1062
 
1011
1063