juxscript 1.1.140 → 1.1.142

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "totalComponents": 69,
3
- "generatedAt": "2026-02-13T18:07:31.535Z",
3
+ "generatedAt": "2026-02-13T19:58:10.948Z",
4
4
  "components": [
5
5
  {
6
6
  "file": "alert.js",
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChG,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;IACpD,OAAO,CAAC,cAAc,CAAkC;gBAE5C,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAmB/C,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAQhD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO1B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAI3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAO/C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAgBzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQtC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAW7B,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CA4DnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAElE"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChG,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;IACpD,OAAO,CAAC,cAAc,CAAkC;gBAE5C,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAmB/C,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAQhD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO1B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAI3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAO/C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAgBzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQtC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAW7B,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAqFnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAElE"}
@@ -120,16 +120,50 @@ export class Button extends BaseComponent {
120
120
  }
121
121
  render(targetId) {
122
122
  const container = this._setupContainer(targetId);
123
- const { label, content, variant, size, disabled, icon, iconPosition, loading, style, class: className } = this.state;
123
+ const { content, icon, iconPosition, variant, size, style, class: className } = this.state;
124
124
  const button = document.createElement('button');
125
- this._buttonElement = button;
126
- button.className = `jux-button jux-button-${variant} jux-button-${size}`;
125
+ // ONLY set base class (no variant/size classes)
126
+ button.className = 'jux-button';
127
127
  button.id = this._id;
128
- button.disabled = disabled || loading;
128
+ // Add user classes
129
129
  if (className)
130
130
  button.className += ` ${className}`;
131
- if (style)
132
- button.setAttribute('style', style);
131
+ // ✅ Apply variant via CSS variables (inline style)
132
+ let inlineStyle = style || '';
133
+ // Map variant to CSS variable overrides
134
+ if (variant === 'success') {
135
+ inlineStyle += `--jux-accent-bg: var(--jux-success-bg); --jux-accent-to: var(--jux-success-to);`;
136
+ }
137
+ else if (variant === 'danger') {
138
+ inlineStyle += `--jux-accent-bg: var(--jux-danger-bg); --jux-accent-to: var(--jux-danger-to);`;
139
+ }
140
+ else if (variant === 'warning') {
141
+ inlineStyle += `--jux-accent-bg: var(--jux-warning-bg); --jux-accent-to: var(--jux-warning-to);`;
142
+ }
143
+ else if (variant === 'info') {
144
+ inlineStyle += `--jux-accent-bg: var(--jux-info-bg); --jux-accent-to: var(--jux-info-to);`;
145
+ }
146
+ else if (variant === 'secondary') {
147
+ inlineStyle += `--jux-accent-bg: var(--jux-brand-accent-bg); --jux-accent-to: var(--jux-brand-accent-to);`;
148
+ }
149
+ else if (variant === 'ghost') {
150
+ inlineStyle += `background: transparent; border-color: transparent; color: var(--jux-brand-color);`;
151
+ }
152
+ else if (variant === 'outline') {
153
+ inlineStyle += `background: transparent; color: var(--jux-brand-color); border-color: var(--jux-brand-color);`;
154
+ }
155
+ // 'primary' uses default --jux-brand-bg from foundation.css
156
+ // Map size to CSS variable overrides
157
+ if (size === 'small') {
158
+ inlineStyle += `--jux-pad: calc(0.375rem * var(--jux-size-xs)) calc(0.75rem * var(--jux-size-xs)); font-size: calc(var(--jux-base-font) * var(--jux-size-xs));`;
159
+ }
160
+ else if (size === 'large') {
161
+ inlineStyle += `--jux-pad: calc(0.5rem * var(--jux-size-lg)) calc(1rem * var(--jux-size-lg)); font-size: calc(var(--jux-base-font) * var(--jux-size-lg));`;
162
+ }
163
+ // 'medium' uses default --jux-base-pad from foundation.css
164
+ if (inlineStyle) {
165
+ button.setAttribute('style', inlineStyle);
166
+ }
133
167
  if (icon && iconPosition === 'left') {
134
168
  const iconEl = document.createElement('span');
135
169
  iconEl.className = 'jux-button-icon';
@@ -141,12 +175,12 @@ export class Button extends BaseComponent {
141
175
  if (content) {
142
176
  textEl.innerHTML = content;
143
177
  }
144
- else if (label) {
145
- textEl.textContent = loading ? 'Loading...' : label;
178
+ else if (this.state.label) {
179
+ textEl.textContent = this.state.loading ? 'Loading...' : this.state.label;
146
180
  }
147
181
  else {
148
182
  // Fallback to auto-generated label from ID
149
- textEl.textContent = loading ? 'Loading...' : formatIdAsLabel(this._id);
183
+ textEl.textContent = this.state.loading ? 'Loading...' : formatIdAsLabel(this._id);
150
184
  }
151
185
  button.appendChild(textEl);
152
186
  if (icon && iconPosition === 'right') {
@@ -156,18 +190,12 @@ export class Button extends BaseComponent {
156
190
  button.appendChild(iconEl);
157
191
  }
158
192
  button.addEventListener('click', (e) => {
159
- if (!disabled && !loading) {
193
+ if (!this.state.disabled && !this.state.loading) {
160
194
  this._triggerCallback('click', e);
161
195
  }
162
196
  });
163
197
  this._wireStandardEvents(button);
164
- this._wireAllSyncs();
165
198
  container.appendChild(button);
166
- requestAnimationFrame(() => {
167
- if (window.lucide) {
168
- window.lucide.createIcons();
169
- }
170
- });
171
199
  return this;
172
200
  }
173
201
  }
@@ -172,16 +172,50 @@ export class Button extends BaseComponent<ButtonState> {
172
172
 
173
173
  render(targetId?: string | HTMLElement | BaseComponent<any>): this {
174
174
  const container = this._setupContainer(targetId);
175
- const { label, content, variant, size, disabled, icon, iconPosition, loading, style, class: className } = this.state;
175
+
176
+ const { content, icon, iconPosition, variant, size, style, class: className } = this.state;
176
177
 
177
178
  const button = document.createElement('button');
178
- this._buttonElement = button;
179
- button.className = `jux-button jux-button-${variant} jux-button-${size}`;
179
+
180
+ // ONLY set base class (no variant/size classes)
181
+ button.className = 'jux-button';
180
182
  button.id = this._id;
181
- button.disabled = disabled || loading;
182
183
 
184
+ // ✅ Add user classes
183
185
  if (className) button.className += ` ${className}`;
184
- if (style) button.setAttribute('style', style);
186
+
187
+ // ✅ Apply variant via CSS variables (inline style)
188
+ let inlineStyle = style || '';
189
+
190
+ // Map variant to CSS variable overrides
191
+ if (variant === 'success') {
192
+ inlineStyle += `--jux-accent-bg: var(--jux-success-bg); --jux-accent-to: var(--jux-success-to);`;
193
+ } else if (variant === 'danger') {
194
+ inlineStyle += `--jux-accent-bg: var(--jux-danger-bg); --jux-accent-to: var(--jux-danger-to);`;
195
+ } else if (variant === 'warning') {
196
+ inlineStyle += `--jux-accent-bg: var(--jux-warning-bg); --jux-accent-to: var(--jux-warning-to);`;
197
+ } else if (variant === 'info') {
198
+ inlineStyle += `--jux-accent-bg: var(--jux-info-bg); --jux-accent-to: var(--jux-info-to);`;
199
+ } else if (variant === 'secondary') {
200
+ inlineStyle += `--jux-accent-bg: var(--jux-brand-accent-bg); --jux-accent-to: var(--jux-brand-accent-to);`;
201
+ } else if (variant === 'ghost') {
202
+ inlineStyle += `background: transparent; border-color: transparent; color: var(--jux-brand-color);`;
203
+ } else if (variant === 'outline') {
204
+ inlineStyle += `background: transparent; color: var(--jux-brand-color); border-color: var(--jux-brand-color);`;
205
+ }
206
+ // 'primary' uses default --jux-brand-bg from foundation.css
207
+
208
+ // Map size to CSS variable overrides
209
+ if (size === 'small') {
210
+ inlineStyle += `--jux-pad: calc(0.375rem * var(--jux-size-xs)) calc(0.75rem * var(--jux-size-xs)); font-size: calc(var(--jux-base-font) * var(--jux-size-xs));`;
211
+ } else if (size === 'large') {
212
+ inlineStyle += `--jux-pad: calc(0.5rem * var(--jux-size-lg)) calc(1rem * var(--jux-size-lg)); font-size: calc(var(--jux-base-font) * var(--jux-size-lg));`;
213
+ }
214
+ // 'medium' uses default --jux-base-pad from foundation.css
215
+
216
+ if (inlineStyle) {
217
+ button.setAttribute('style', inlineStyle);
218
+ }
185
219
 
186
220
  if (icon && iconPosition === 'left') {
187
221
  const iconEl = document.createElement('span');
@@ -195,11 +229,11 @@ export class Button extends BaseComponent<ButtonState> {
195
229
  // ✅ Priority: content (HTML) > label (text) > loading state
196
230
  if (content) {
197
231
  textEl.innerHTML = content;
198
- } else if (label) {
199
- textEl.textContent = loading ? 'Loading...' : label;
232
+ } else if (this.state.label) {
233
+ textEl.textContent = this.state.loading ? 'Loading...' : this.state.label;
200
234
  } else {
201
235
  // Fallback to auto-generated label from ID
202
- textEl.textContent = loading ? 'Loading...' : formatIdAsLabel(this._id);
236
+ textEl.textContent = this.state.loading ? 'Loading...' : formatIdAsLabel(this._id);
203
237
  }
204
238
 
205
239
  button.appendChild(textEl);
@@ -212,22 +246,13 @@ export class Button extends BaseComponent<ButtonState> {
212
246
  }
213
247
 
214
248
  button.addEventListener('click', (e) => {
215
- if (!disabled && !loading) {
249
+ if (!this.state.disabled && !this.state.loading) {
216
250
  this._triggerCallback('click', e);
217
251
  }
218
252
  });
219
253
 
220
254
  this._wireStandardEvents(button);
221
- this._wireAllSyncs();
222
-
223
255
  container.appendChild(button);
224
-
225
- requestAnimationFrame(() => {
226
- if ((window as any).lucide) {
227
- (window as any).lucide.createIcons();
228
- }
229
- });
230
-
231
256
  return this;
232
257
  }
233
258
  }
@@ -0,0 +1,416 @@
1
+ /* ══════════════════════════════════════════════════════════════════
2
+ CSS CUSTOM PROPERTIES (DESIGN TOKENS)
3
+ Generative Color System with Burn Calculations + Complete Foundation
4
+
5
+ ⚙️ USER CONFIGURATION (Lines 13-80) - Override these to theme your app
6
+ 🔧 SYSTEM CONFIGURATION (Lines 81+) - Auto-generated, don't touch
7
+ ══════════════════════════════════════════════════════════════════ */
8
+
9
+ :root {
10
+ /* ═════════════════════════════════════════════════════════════════
11
+ * 🎨 BRAND COLORS - Your Primary Customization Point
12
+ * Change these to match your brand identity
13
+ * ═════════════════════════════════════════════════════════════════ */
14
+
15
+ /* Brand Primary (buttons, links, primary actions) */
16
+ --jux-brand-from: #18181b;
17
+ --jux-brand-to: #000000;
18
+
19
+ /* Brand Accent (highlights, secondary actions, badges) */
20
+ --jux-brand-accent-from: #3b82f6;
21
+ --jux-brand-accent-to: #1e40af;
22
+
23
+ /* Surfaces (backgrounds, cards, panels) */
24
+ --jux-surface-from: #ffffff;
25
+ --jux-surface-to: #09090b;
26
+
27
+ /* Text (headings, paragraphs, labels) */
28
+ --jux-text-from: #09090b;
29
+ --jux-text-to: #ffffff;
30
+
31
+ /* Borders (input outlines, dividers) */
32
+ --jux-border-from: #e4e4e7;
33
+ --jux-border-to: #71717a;
34
+
35
+ /* ═════════════════════════════════════════════════════════════════
36
+ * 🔥 BURN FACTORS - Interaction Intensities
37
+ * ═════════════════════════════════════════════════════════════════ */
38
+ --jux-burn-subtle: 0.03;
39
+ --jux-burn-hover: 0.06;
40
+ --jux-burn-active: 0.12;
41
+ --jux-burn-muted: 0.25;
42
+ --jux-burn-strong: 0.50;
43
+
44
+ /* ═════════════════════════════════════════════════════════════════
45
+ * 📏 SPACING SCALE (Base units for padding, gap, margins)
46
+ * ═════════════════════════════════════════════════════════════════ */
47
+ --jux-space-xs: 0.25rem; /* 4px */
48
+ --jux-space-sm: 0.5rem; /* 8px */
49
+ --jux-space-md: 1rem; /* 16px */
50
+ --jux-space-lg: 1.5rem; /* 24px */
51
+ --jux-space-xl: 2rem; /* 32px */
52
+ --jux-space-2xl: 3rem; /* 48px */
53
+ --jux-space-3xl: 4rem; /* 64px */
54
+
55
+ /* ═════════════════════════════════════════════════════════════════
56
+ * 🔤 TYPOGRAPHY SCALE
57
+ * ═════════════════════════════════════════════════════════════════ */
58
+
59
+ /* Font Families */
60
+ --jux-font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
61
+ --jux-font-serif: Georgia, Cambria, "Times New Roman", Times, serif;
62
+ --jux-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
63
+
64
+ /* Font Sizes */
65
+ --jux-text-xs: 0.75rem; /* 12px */
66
+ --jux-text-sm: 0.875rem; /* 14px */
67
+ --jux-text-base: 1rem; /* 16px */
68
+ --jux-text-lg: 1.125rem; /* 18px */
69
+ --jux-text-xl: 1.25rem; /* 20px */
70
+ --jux-text-2xl: 1.5rem; /* 24px */
71
+ --jux-text-3xl: 1.875rem; /* 30px */
72
+ --jux-text-4xl: 2.25rem; /* 36px */
73
+ --jux-text-5xl: 3rem; /* 48px */
74
+
75
+ /* Font Weights */
76
+ --jux-weight-thin: 100;
77
+ --jux-weight-light: 300;
78
+ --jux-weight-normal: 400;
79
+ --jux-weight-medium: 500;
80
+ --jux-weight-semibold: 600;
81
+ --jux-weight-bold: 700;
82
+ --jux-weight-black: 900;
83
+
84
+ /* Line Heights */
85
+ --jux-leading-tight: 1.25;
86
+ --jux-leading-snug: 1.375;
87
+ --jux-leading-normal: 1.5;
88
+ --jux-leading-relaxed: 1.625;
89
+ --jux-leading-loose: 2;
90
+
91
+ /* ═════════════════════════════════════════════════════════════════
92
+ * 📐 SHAPE & SIZE SCALE
93
+ * ═════════════════════════════════════════════════════════════════ */
94
+
95
+ /* Border Radius */
96
+ --jux-radius-sharp: 0;
97
+ --jux-radius-sm: 0.25rem;
98
+ --jux-radius-md: 0.375rem;
99
+ --jux-radius-lg: 0.5rem;
100
+ --jux-radius-xl: 0.75rem;
101
+ --jux-radius-2xl: 1rem;
102
+ --jux-radius-full: 9999px;
103
+
104
+ /* Border Width */
105
+ --jux-stroke-thin: 1px;
106
+ --jux-stroke-base: 2px;
107
+ --jux-stroke-thick: 4px;
108
+
109
+ /* Size Multipliers */
110
+ --jux-size-xs: 0.75;
111
+ --jux-size-sm: 0.875;
112
+ --jux-size-md: 1;
113
+ --jux-size-lg: 1.25;
114
+ --jux-size-xl: 1.5;
115
+
116
+ /* ═════════════════════════════════════════════════════════════════
117
+ * 🤖 SYSTEM CONFIGURATION - AUTO-GENERATED
118
+ * These are computed from your brand colors above
119
+ * DO NOT MODIFY - Override brand colors instead
120
+ * ═════════════════════════════════════════════════════════════════ */
121
+
122
+ /* Generated Brand Colors */
123
+ --jux-brand-color: var(--jux-brand-from);
124
+ --jux-brand-bg: var(--jux-brand-from);
125
+ --jux-brand-color-hover: color-mix(in srgb,
126
+ var(--jux-brand-from) calc(100% - var(--jux-burn-hover) * 100%),
127
+ var(--jux-brand-to) calc(var(--jux-burn-hover) * 100%)
128
+ );
129
+ --jux-brand-color-active: color-mix(in srgb,
130
+ var(--jux-brand-from) calc(100% - var(--jux-burn-active) * 100%),
131
+ var(--jux-brand-to) calc(var(--jux-burn-active) * 100%)
132
+ );
133
+
134
+ /* Generated Brand Accent Colors */
135
+ --jux-brand-accent-color: var(--jux-brand-accent-from);
136
+ --jux-brand-accent-bg: var(--jux-brand-accent-from);
137
+ --jux-brand-accent-color-hover: color-mix(in srgb,
138
+ var(--jux-brand-accent-from) calc(100% - var(--jux-burn-hover) * 100%),
139
+ var(--jux-brand-accent-to) calc(var(--jux-burn-hover) * 100%)
140
+ );
141
+ --jux-brand-accent-color-active: color-mix(in srgb,
142
+ var(--jux-brand-accent-from) calc(100% - var(--jux-burn-active) * 100%),
143
+ var(--jux-brand-accent-to) calc(var(--jux-burn-active) * 100%)
144
+ );
145
+
146
+ /* Generated Surface Colors */
147
+ --jux-surface-bg: var(--jux-surface-from);
148
+ --jux-surface-bg-alt: color-mix(in srgb,
149
+ var(--jux-surface-from) calc(100% - var(--jux-burn-subtle) * 100%),
150
+ var(--jux-surface-to) calc(var(--jux-burn-subtle) * 100%)
151
+ );
152
+ --jux-surface-bg-hover: color-mix(in srgb,
153
+ var(--jux-surface-from) calc(100% - var(--jux-burn-hover) * 100%),
154
+ var(--jux-surface-to) calc(var(--jux-burn-hover) * 100%)
155
+ );
156
+ --jux-surface-bg-active: color-mix(in srgb,
157
+ var(--jux-surface-from) calc(100% - var(--jux-burn-active) * 100%),
158
+ var(--jux-surface-to) calc(var(--jux-burn-active) * 100%)
159
+ );
160
+
161
+ /* Generated Text Colors */
162
+ --jux-text-color: var(--jux-text-from);
163
+ --jux-text-color-secondary: color-mix(in srgb,
164
+ var(--jux-text-from) calc(100% - var(--jux-burn-muted) * 100%),
165
+ var(--jux-text-to) calc(var(--jux-burn-muted) * 100%)
166
+ );
167
+ --jux-text-color-tertiary: color-mix(in srgb,
168
+ var(--jux-text-from) calc(100% - var(--jux-burn-strong) * 100%),
169
+ var(--jux-text-to) calc(var(--jux-burn-strong) * 100%)
170
+ );
171
+
172
+ /* Generated Border Colors */
173
+ --jux-border-color: var(--jux-border-from);
174
+ --jux-border-color-strong: color-mix(in srgb,
175
+ var(--jux-border-from) calc(100% - var(--jux-burn-hover) * 100%),
176
+ var(--jux-border-to) calc(var(--jux-burn-hover) * 100%)
177
+ );
178
+
179
+ /* Semantic Colors (Optional - Use for app-level alerts/feedback) */
180
+ --jux-success-from: #10b981;
181
+ --jux-success-to: #065f46;
182
+ --jux-success-color: var(--jux-success-from);
183
+ --jux-success-bg: var(--jux-success-from);
184
+ --jux-success-bg-light: color-mix(in srgb, var(--jux-success-from) 20%, #ffffff 80%);
185
+ --jux-success-bg-dark: var(--jux-success-to);
186
+
187
+ --jux-warning-from: #f59e0b;
188
+ --jux-warning-to: #92400e;
189
+ --jux-warning-color: var(--jux-warning-from);
190
+ --jux-warning-bg: var(--jux-warning-from);
191
+ --jux-warning-bg-light: color-mix(in srgb, var(--jux-warning-from) 20%, #ffffff 80%);
192
+ --jux-warning-bg-dark: var(--jux-warning-to);
193
+
194
+ --jux-danger-from: #ef4444;
195
+ --jux-danger-to: #991b1b;
196
+ --jux-danger-color: var(--jux-danger-from);
197
+ --jux-danger-bg: var(--jux-danger-from);
198
+ --jux-danger-bg-light: color-mix(in srgb, var(--jux-danger-from) 20%, #ffffff 80%);
199
+ --jux-danger-bg-dark: var(--jux-danger-to);
200
+
201
+ --jux-info-from: #3b82f6;
202
+ --jux-info-to: #1e40af;
203
+ --jux-info-color: var(--jux-info-from);
204
+ --jux-info-bg: var(--jux-info-from);
205
+ --jux-info-bg-light: color-mix(in srgb, var(--jux-info-from) 20%, #ffffff 80%);
206
+ --jux-info-bg-dark: var(--jux-info-to);
207
+
208
+ /* Spatial Axis Engine (Ghost Logic Fallbacks) */
209
+ --jux-gap: var(--jux-gap-override, var(--jux-gap-token, 0px));
210
+ --jux-pad: var(--jux-pad-override, var(--jux-pad-token, 0px));
211
+ --jux-align: flex-start;
212
+
213
+ /* Default Radius & Stroke */
214
+ --jux-radius: var(--jux-radius-override, var(--jux-radius-md));
215
+ --jux-stroke: var(--jux-stroke-base);
216
+
217
+ /* Default Typography */
218
+ --jux-font-family: var(--jux-font-sans);
219
+ --jux-font-weight: var(--jux-weight-normal);
220
+ --jux-font-size: var(--jux-text-base);
221
+ --jux-line-height: var(--jux-leading-normal);
222
+ }
223
+
224
+ /* ══════════════════════════════════════════════════════════════════
225
+ GEOMETRIC DESCRIPTOR CLASSES (Mobile First)
226
+ ══════════════════════════════════════════════════════════════════ */
227
+
228
+ /* ─────────────────────────────────────────────────────────────────
229
+ * PADDING DESCRIPTORS
230
+ * ───────────────────────────────────────────────────────────────── */
231
+ .pad-none { --jux-pad-token: 0; }
232
+ .pad-xs { --jux-pad-token: var(--jux-space-xs); }
233
+ .pad-sm { --jux-pad-token: var(--jux-space-sm); }
234
+ .pad-md { --jux-pad-token: var(--jux-space-md); }
235
+ .pad-lg { --jux-pad-token: var(--jux-space-lg); }
236
+ .pad-xl { --jux-pad-token: var(--jux-space-xl); }
237
+ .pad-2xl { --jux-pad-token: var(--jux-space-2xl); }
238
+ .pad-3xl { --jux-pad-token: var(--jux-space-3xl); }
239
+
240
+ /* ─────────────────────────────────────────────────────────────────
241
+ * GAP DESCRIPTORS
242
+ * ───────────────────────────────────────────────────────────────── */
243
+ .gap-none { --jux-gap-token: 0; }
244
+ .gap-xs { --jux-gap-token: var(--jux-space-xs); }
245
+ .gap-sm { --jux-gap-token: var(--jux-space-sm); }
246
+ .gap-md { --jux-gap-token: var(--jux-space-md); }
247
+ .gap-lg { --jux-gap-token: var(--jux-space-lg); }
248
+ .gap-xl { --jux-gap-token: var(--jux-space-xl); }
249
+ .gap-2xl { --jux-gap-token: var(--jux-space-2xl); }
250
+ .gap-3xl { --jux-gap-token: var(--jux-space-3xl); }
251
+
252
+ /* ─────────────────────────────────────────────────────────────────
253
+ * RADIUS DESCRIPTORS
254
+ * ───────────────────────────────────────────────────────────────── */
255
+ .radius-sharp { --jux-radius-override: var(--jux-radius-sharp); }
256
+ .radius-sm { --jux-radius-override: var(--jux-radius-sm); }
257
+ .radius-md { --jux-radius-override: var(--jux-radius-md); }
258
+ .radius-lg { --jux-radius-override: var(--jux-radius-lg); }
259
+ .radius-xl { --jux-radius-override: var(--jux-radius-xl); }
260
+ .radius-2xl { --jux-radius-override: var(--jux-radius-2xl); }
261
+ .radius-full { --jux-radius-override: var(--jux-radius-full); }
262
+
263
+ /* ─────────────────────────────────────────────────────────────────
264
+ * FONT WEIGHT DESCRIPTORS
265
+ * ───────────────────────────────────────────────────────────────── */
266
+ .weight-thin { font-weight: var(--jux-weight-thin); }
267
+ .weight-light { font-weight: var(--jux-weight-light); }
268
+ .weight-normal { font-weight: var(--jux-weight-normal); }
269
+ .weight-medium { font-weight: var(--jux-weight-medium); }
270
+ .weight-semibold { font-weight: var(--jux-weight-semibold); }
271
+ .weight-bold { font-weight: var(--jux-weight-bold); }
272
+ .weight-black { font-weight: var(--jux-weight-black); }
273
+
274
+ /* ─────────────────────────────────────────────────────────────────
275
+ * FONT SIZE DESCRIPTORS
276
+ * ───────────────────────────────────────────────────────────────── */
277
+ .text-xs { font-size: var(--jux-text-xs); }
278
+ .text-sm { font-size: var(--jux-text-sm); }
279
+ .text-base { font-size: var(--jux-text-base); }
280
+ .text-lg { font-size: var(--jux-text-lg); }
281
+ .text-xl { font-size: var(--jux-text-xl); }
282
+ .text-2xl { font-size: var(--jux-text-2xl); }
283
+ .text-3xl { font-size: var(--jux-text-3xl); }
284
+ .text-4xl { font-size: var(--jux-text-4xl); }
285
+ .text-5xl { font-size: var(--jux-text-5xl); }
286
+
287
+ /* ─────────────────────────────────────────────────────────────────
288
+ * FONT FAMILY DESCRIPTORS
289
+ * ───────────────────────────────────────────────────────────────── */
290
+ .font-sans { font-family: var(--jux-font-sans); }
291
+ .font-serif { font-family: var(--jux-font-serif); }
292
+ .font-mono { font-family: var(--jux-font-mono); }
293
+
294
+ /* ──────────────────────────────────────────────────────────────────
295
+ * DESKTOP SCALE-UP (@media: 1024px+)
296
+ * ────────────────────────────────────────────────────────────────── */
297
+ @media (min-width: 1024px) {
298
+ .pad-xs { --jux-pad-token: calc(var(--jux-space-xs) * 1.25); }
299
+ .pad-sm { --jux-pad-token: calc(var(--jux-space-sm) * 1.25); }
300
+ .pad-md { --jux-pad-token: calc(var(--jux-space-md) * 1.25); }
301
+ .pad-lg { --jux-pad-token: calc(var(--jux-space-lg) * 1.25); }
302
+ .pad-xl { --jux-pad-token: calc(var(--jux-space-xl) * 1.25); }
303
+ .pad-2xl { --jux-pad-token: calc(var(--jux-space-2xl) * 1.25); }
304
+ .pad-3xl { --jux-pad-token: calc(var(--jux-space-3xl) * 1.25); }
305
+
306
+ .gap-xs { --jux-gap-token: calc(var(--jux-space-xs) * 1.25); }
307
+ .gap-sm { --jux-gap-token: calc(var(--jux-space-sm) * 1.25); }
308
+ .gap-md { --jux-gap-token: calc(var(--jux-space-md) * 1.25); }
309
+ .gap-lg { --jux-gap-token: calc(var(--jux-space-lg) * 1.25); }
310
+ .gap-xl { --jux-gap-token: calc(var(--jux-space-xl) * 1.25); }
311
+ .gap-2xl { --jux-gap-token: calc(var(--jux-space-2xl) * 1.25); }
312
+ .gap-3xl { --jux-gap-token: calc(var(--jux-space-3xl) * 1.25); }
313
+ }
314
+
315
+ /* ══════════════════════════════════════════════════════════════════
316
+ BUTTON (Ultra-Minimal - Pure Token Usage)
317
+ ══════════════════════════════════════════════════════════════════ */
318
+
319
+ .jux-button {
320
+ /* Colors */
321
+ background: var(--jux-brand-bg);
322
+ color: #fff;
323
+ border: var(--jux-stroke) solid var(--jux-border-color);
324
+
325
+ /* Shape */
326
+ border-radius: var(--jux-radius);
327
+
328
+ /* Size */
329
+ padding: var(--jux-pad, var(--jux-space-md));
330
+ font-size: var(--jux-font-size);
331
+ font-weight: var(--jux-weight-medium);
332
+ font-family: var(--jux-font-family);
333
+
334
+ /* Layout */
335
+ display: inline-flex;
336
+ align-items: center;
337
+ gap: var(--jux-space-sm);
338
+
339
+ /* Interaction */
340
+ cursor: pointer;
341
+ user-select: none;
342
+ transition: all 0.15s ease;
343
+ line-height: 1;
344
+ text-decoration: none;
345
+ }
346
+
347
+ /* States use burn calculations */
348
+ .jux-button:hover:not(:disabled) {
349
+ background: var(--jux-brand-color-hover);
350
+ }
351
+
352
+ .jux-button:active:not(:disabled) {
353
+ background: var(--jux-brand-color-active);
354
+ }
355
+
356
+ .jux-button:focus {
357
+ outline: none;
358
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jux-brand-bg) 30%, transparent 70%);
359
+ }
360
+
361
+ .jux-button:disabled {
362
+ opacity: var(--jux-burn-strong);
363
+ cursor: not-allowed;
364
+ }
365
+
366
+ /* ══════════════════════════════════════════════════════════════════
367
+ BUTTON VARIANT CLASSES (Optional)
368
+ ══════════════════════════════════════════════════════════════════ */
369
+
370
+ .jux-button-success {
371
+ --jux-accent-bg: var(--jux-success-bg);
372
+ --jux-accent-to: var(--jux-success-to);
373
+ }
374
+
375
+ .jux-button-danger {
376
+ --jux-accent-bg: var(--jux-danger-bg);
377
+ --jux-accent-to: var(--jux-danger-to);
378
+ }
379
+
380
+ .jux-button-warning {
381
+ --jux-accent-bg: var(--jux-warning-bg);
382
+ --jux-accent-to: var(--jux-warning-to);
383
+ }
384
+
385
+ .jux-button-info {
386
+ --jux-accent-bg: var(--jux-info-bg);
387
+ --jux-accent-to: var(--jux-info-to);
388
+ }
389
+
390
+ .jux-button-secondary {
391
+ --jux-accent-bg: var(--jux-brand-accent-bg);
392
+ --jux-accent-to: var(--jux-brand-accent-to);
393
+ }
394
+
395
+ .jux-button-ghost {
396
+ background: transparent;
397
+ border-color: transparent;
398
+ color: var(--jux-brand-color);
399
+ }
400
+
401
+ .jux-button-outline {
402
+ background: transparent;
403
+ color: var(--jux-brand-color);
404
+ border-color: var(--jux-brand-color);
405
+ }
406
+
407
+ /* Size classes */
408
+ .jux-button-small {
409
+ --jux-pad: calc(0.375rem * var(--jux-size-xs)) calc(0.75rem * var(--jux-size-xs));
410
+ font-size: calc(var(--jux-base-font) * var(--jux-size-xs));
411
+ }
412
+
413
+ .jux-button-large {
414
+ --jux-pad: calc(0.5rem * var(--jux-size-lg)) calc(1rem * var(--jux-size-lg));
415
+ font-size: calc(var(--jux-base-font) * var(--jux-size-lg));
416
+ }