juxscript 1.1.141 → 1.1.143

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-13T19:23:15.719Z",
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;CAwDnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAElE"}
@@ -120,14 +120,15 @@ 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, 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 only
129
129
  if (className)
130
130
  button.className += ` ${className}`;
131
+ // ✅ Apply style (NO variant/size logic - pure cascade)
131
132
  if (style)
132
133
  button.setAttribute('style', style);
133
134
  if (icon && iconPosition === 'left') {
@@ -141,12 +142,12 @@ export class Button extends BaseComponent {
141
142
  if (content) {
142
143
  textEl.innerHTML = content;
143
144
  }
144
- else if (label) {
145
- textEl.textContent = loading ? 'Loading...' : label;
145
+ else if (this.state.label) {
146
+ textEl.textContent = this.state.loading ? 'Loading...' : this.state.label;
146
147
  }
147
148
  else {
148
149
  // Fallback to auto-generated label from ID
149
- textEl.textContent = loading ? 'Loading...' : formatIdAsLabel(this._id);
150
+ textEl.textContent = this.state.loading ? 'Loading...' : formatIdAsLabel(this._id);
150
151
  }
151
152
  button.appendChild(textEl);
152
153
  if (icon && iconPosition === 'right') {
@@ -156,18 +157,13 @@ export class Button extends BaseComponent {
156
157
  button.appendChild(iconEl);
157
158
  }
158
159
  button.addEventListener('click', (e) => {
159
- if (!disabled && !loading) {
160
+ if (!this.state.disabled && !this.state.loading) {
160
161
  this._triggerCallback('click', e);
161
162
  }
162
163
  });
163
164
  this._wireStandardEvents(button);
164
- this._wireAllSyncs();
165
165
  container.appendChild(button);
166
- requestAnimationFrame(() => {
167
- if (window.lucide) {
168
- window.lucide.createIcons();
169
- }
170
- });
166
+ this._buttonElement = button;
171
167
  return this;
172
168
  }
173
169
  }
@@ -172,15 +172,19 @@ 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, 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 only
183
185
  if (className) button.className += ` ${className}`;
186
+
187
+ // ✅ Apply style (NO variant/size logic - pure cascade)
184
188
  if (style) button.setAttribute('style', style);
185
189
 
186
190
  if (icon && iconPosition === 'left') {
@@ -195,11 +199,11 @@ export class Button extends BaseComponent<ButtonState> {
195
199
  // ✅ Priority: content (HTML) > label (text) > loading state
196
200
  if (content) {
197
201
  textEl.innerHTML = content;
198
- } else if (label) {
199
- textEl.textContent = loading ? 'Loading...' : label;
202
+ } else if (this.state.label) {
203
+ textEl.textContent = this.state.loading ? 'Loading...' : this.state.label;
200
204
  } else {
201
205
  // Fallback to auto-generated label from ID
202
- textEl.textContent = loading ? 'Loading...' : formatIdAsLabel(this._id);
206
+ textEl.textContent = this.state.loading ? 'Loading...' : formatIdAsLabel(this._id);
203
207
  }
204
208
 
205
209
  button.appendChild(textEl);
@@ -212,22 +216,14 @@ export class Button extends BaseComponent<ButtonState> {
212
216
  }
213
217
 
214
218
  button.addEventListener('click', (e) => {
215
- if (!disabled && !loading) {
219
+ if (!this.state.disabled && !this.state.loading) {
216
220
  this._triggerCallback('click', e);
217
221
  }
218
222
  });
219
223
 
220
224
  this._wireStandardEvents(button);
221
- this._wireAllSyncs();
222
-
223
225
  container.appendChild(button);
224
-
225
- requestAnimationFrame(() => {
226
- if ((window as any).lucide) {
227
- (window as any).lucide.createIcons();
228
- }
229
- });
230
-
226
+ this._buttonElement = button;
231
227
  return this;
232
228
  }
233
229
  }
@@ -0,0 +1,366 @@
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;
48
+ --jux-space-sm: 0.5rem;
49
+ --jux-space-md: 1rem;
50
+ --jux-space-lg: 1.5rem;
51
+ --jux-space-xl: 2rem;
52
+ --jux-space-2xl: 3rem;
53
+ --jux-space-3xl: 4rem;
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;
66
+ --jux-text-sm: 0.875rem;
67
+ --jux-text-base: 1rem;
68
+ --jux-text-lg: 1.125rem;
69
+ --jux-text-xl: 1.25rem;
70
+ --jux-text-2xl: 1.5rem;
71
+ --jux-text-3xl: 1.875rem;
72
+ --jux-text-4xl: 2.25rem;
73
+ --jux-text-5xl: 3rem;
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
+ /* ══════════════════════════════════════════════════════════════════
118
+ 🤖 SYSTEM CONFIGURATION - AUTO-GENERATED
119
+ These are computed from your brand colors above
120
+ ✅ MOVED TO html SCOPE - Re-computes on [data-swag] change
121
+ ══════════════════════════════════════════════════════════════════ */
122
+
123
+ html {
124
+ /* Generated Brand Colors */
125
+ --jux-brand-color: var(--jux-brand-from);
126
+ --jux-brand-bg: var(--jux-brand-from);
127
+ --jux-brand-color-hover: color-mix(in srgb,
128
+ var(--jux-brand-from) calc(100% - var(--jux-burn-hover) * 100%),
129
+ var(--jux-brand-to) calc(var(--jux-burn-hover) * 100%)
130
+ );
131
+ --jux-brand-color-active: color-mix(in srgb,
132
+ var(--jux-brand-from) calc(100% - var(--jux-burn-active) * 100%),
133
+ var(--jux-brand-to) calc(var(--jux-burn-active) * 100%)
134
+ );
135
+
136
+ /* Generated Brand Accent Colors */
137
+ --jux-brand-accent-color: var(--jux-brand-accent-from);
138
+ --jux-brand-accent-bg: var(--jux-brand-accent-from);
139
+ --jux-brand-accent-color-hover: color-mix(in srgb,
140
+ var(--jux-brand-accent-from) calc(100% - var(--jux-burn-hover) * 100%),
141
+ var(--jux-brand-accent-to) calc(var(--jux-burn-hover) * 100%)
142
+ );
143
+ --jux-brand-accent-color-active: color-mix(in srgb,
144
+ var(--jux-brand-accent-from) calc(100% - var(--jux-burn-active) * 100%),
145
+ var(--jux-brand-accent-to) calc(var(--jux-burn-active) * 100%)
146
+ );
147
+
148
+ /* Generated Surface Colors */
149
+ --jux-surface-bg: var(--jux-surface-from);
150
+ --jux-surface-bg-alt: color-mix(in srgb,
151
+ var(--jux-surface-from) calc(100% - var(--jux-burn-subtle) * 100%),
152
+ var(--jux-surface-to) calc(var(--jux-burn-subtle) * 100%)
153
+ );
154
+ --jux-surface-bg-hover: color-mix(in srgb,
155
+ var(--jux-surface-from) calc(100% - var(--jux-burn-hover) * 100%),
156
+ var(--jux-surface-to) calc(var(--jux-burn-hover) * 100%)
157
+ );
158
+ --jux-surface-bg-active: color-mix(in srgb,
159
+ var(--jux-surface-from) calc(100% - var(--jux-burn-active) * 100%),
160
+ var(--jux-surface-to) calc(var(--jux-burn-active) * 100%)
161
+ );
162
+
163
+ /* Generated Text Colors */
164
+ --jux-text-color: var(--jux-text-from);
165
+ --jux-text-color-secondary: color-mix(in srgb,
166
+ var(--jux-text-from) calc(100% - var(--jux-burn-muted) * 100%),
167
+ var(--jux-text-to) calc(var(--jux-burn-muted) * 100%)
168
+ );
169
+ --jux-text-color-tertiary: color-mix(in srgb,
170
+ var(--jux-text-from) calc(100% - var(--jux-burn-strong) * 100%),
171
+ var(--jux-text-to) calc(var(--jux-burn-strong) * 100%)
172
+ );
173
+
174
+ /* Generated Border Colors */
175
+ --jux-border-color: var(--jux-border-from);
176
+ --jux-border-color-strong: color-mix(in srgb,
177
+ var(--jux-border-from) calc(100% - var(--jux-burn-hover) * 100%),
178
+ var(--jux-border-to) calc(var(--jux-burn-hover) * 100%)
179
+ );
180
+
181
+ /* Semantic Colors (Optional - Use for app-level alerts/feedback) */
182
+ --jux-success-from: #10b981;
183
+ --jux-success-to: #065f46;
184
+ --jux-success-color: var(--jux-success-from);
185
+ --jux-success-bg: var(--jux-success-from);
186
+ --jux-success-bg-light: color-mix(in srgb, var(--jux-success-from) 20%, #ffffff 80%);
187
+ --jux-success-bg-dark: var(--jux-success-to);
188
+
189
+ --jux-warning-from: #f59e0b;
190
+ --jux-warning-to: #92400e;
191
+ --jux-warning-color: var(--jux-warning-from);
192
+ --jux-warning-bg: var(--jux-warning-from);
193
+ --jux-warning-bg-light: color-mix(in srgb, var(--jux-warning-from) 20%, #ffffff 80%);
194
+ --jux-warning-bg-dark: var(--jux-warning-to);
195
+
196
+ --jux-danger-from: #ef4444;
197
+ --jux-danger-to: #991b1b;
198
+ --jux-danger-color: var(--jux-danger-from);
199
+ --jux-danger-bg: var(--jux-danger-from);
200
+ --jux-danger-bg-light: color-mix(in srgb, var(--jux-danger-from) 20%, #ffffff 80%);
201
+ --jux-danger-bg-dark: var(--jux-danger-to);
202
+
203
+ --jux-info-from: #3b82f6;
204
+ --jux-info-to: #1e40af;
205
+ --jux-info-color: var(--jux-info-from);
206
+ --jux-info-bg: var(--jux-info-from);
207
+ --jux-info-bg-light: color-mix(in srgb, var(--jux-info-from) 20%, #ffffff 80%);
208
+ --jux-info-bg-dark: var(--jux-info-to);
209
+
210
+ /* Spatial Axis Engine (Ghost Logic Fallbacks) */
211
+ --jux-gap: var(--jux-gap-override, var(--jux-gap-token, 0px));
212
+ --jux-pad: var(--jux-pad-override, var(--jux-pad-token, 0px));
213
+ --jux-align: flex-start;
214
+
215
+ /* Default Radius & Stroke */
216
+ --jux-radius: var(--jux-radius-override, var(--jux-radius-md));
217
+ --jux-stroke: var(--jux-stroke-base);
218
+
219
+ /* Default Typography */
220
+ --jux-font-family: var(--jux-font-sans);
221
+ --jux-font-weight: var(--jux-weight-normal);
222
+ --jux-font-size: var(--jux-text-base);
223
+ --jux-line-height: var(--jux-leading-normal);
224
+ }
225
+
226
+ /* ══════════════════════════════════════════════════════════════════
227
+ GEOMETRIC DESCRIPTOR CLASSES (Mobile First)
228
+ ══════════════════════════════════════════════════════════════════ */
229
+
230
+ /* ─────────────────────────────────────────────────────────────────
231
+ * PADDING DESCRIPTORS
232
+ * ───────────────────────────────────────────────────────────────── */
233
+ .pad-none { --jux-pad-token: 0; }
234
+ .pad-xs { --jux-pad-token: var(--jux-space-xs); }
235
+ .pad-sm { --jux-pad-token: var(--jux-space-sm); }
236
+ .pad-md { --jux-pad-token: var(--jux-space-md); }
237
+ .pad-lg { --jux-pad-token: var(--jux-space-lg); }
238
+ .pad-xl { --jux-pad-token: var(--jux-space-xl); }
239
+ .pad-2xl { --jux-pad-token: var(--jux-space-2xl); }
240
+ .pad-3xl { --jux-pad-token: var(--jux-space-3xl); }
241
+
242
+ /* ─────────────────────────────────────────────────────────────────
243
+ * GAP DESCRIPTORS
244
+ * ───────────────────────────────────────────────────────────────── */
245
+ .gap-none { --jux-gap-token: 0; }
246
+ .gap-xs { --jux-gap-token: var(--jux-space-xs); }
247
+ .gap-sm { --jux-gap-token: var(--jux-space-sm); }
248
+ .gap-md { --jux-gap-token: var(--jux-space-md); }
249
+ .gap-lg { --jux-gap-token: var(--jux-space-lg); }
250
+ .gap-xl { --jux-gap-token: var(--jux-space-xl); }
251
+ .gap-2xl { --jux-gap-token: var(--jux-space-2xl); }
252
+ .gap-3xl { --jux-gap-token: var(--jux-space-3xl); }
253
+
254
+ /* ─────────────────────────────────────────────────────────────────
255
+ * RADIUS DESCRIPTORS
256
+ * ───────────────────────────────────────────────────────────────── */
257
+ .radius-sharp { --jux-radius-override: var(--jux-radius-sharp); }
258
+ .radius-sm { --jux-radius-override: var(--jux-radius-sm); }
259
+ .radius-md { --jux-radius-override: var(--jux-radius-md); }
260
+ .radius-lg { --jux-radius-override: var(--jux-radius-lg); }
261
+ .radius-xl { --jux-radius-override: var(--jux-radius-xl); }
262
+ .radius-2xl { --jux-radius-override: var(--jux-radius-2xl); }
263
+ .radius-full { --jux-radius-override: var(--jux-radius-full); }
264
+
265
+ /* ─────────────────────────────────────────────────────────────────
266
+ * FONT WEIGHT DESCRIPTORS
267
+ * ───────────────────────────────────────────────────────────────── */
268
+ .weight-thin { font-weight: var(--jux-weight-thin); }
269
+ .weight-light { font-weight: var(--jux-weight-light); }
270
+ .weight-normal { font-weight: var(--jux-weight-normal); }
271
+ .weight-medium { font-weight: var(--jux-weight-medium); }
272
+ .weight-semibold { font-weight: var(--jux-weight-semibold); }
273
+ .weight-bold { font-weight: var(--jux-weight-bold); }
274
+ .weight-black { font-weight: var(--jux-weight-black); }
275
+
276
+ /* ─────────────────────────────────────────────────────────────────
277
+ * FONT SIZE DESCRIPTORS
278
+ * ───────────────────────────────────────────────────────────────── */
279
+ .text-xs { font-size: var(--jux-text-xs); }
280
+ .text-sm { font-size: var(--jux-text-sm); }
281
+ .text-base { font-size: var(--jux-text-base); }
282
+ .text-lg { font-size: var(--jux-text-lg); }
283
+ .text-xl { font-size: var(--jux-text-xl); }
284
+ .text-2xl { font-size: var(--jux-text-2xl); }
285
+ .text-3xl { font-size: var(--jux-text-3xl); }
286
+ .text-4xl { font-size: var(--jux-text-4xl); }
287
+ .text-5xl { font-size: var(--jux-text-5xl); }
288
+
289
+ /* ─────────────────────────────────────────────────────────────────
290
+ * FONT FAMILY DESCRIPTORS
291
+ * ───────────────────────────────────────────────────────────────── */
292
+ .font-sans { font-family: var(--jux-font-sans); }
293
+ .font-serif { font-family: var(--jux-font-serif); }
294
+ .font-mono { font-family: var(--jux-font-mono); }
295
+
296
+ /* ──────────────────────────────────────────────────────────────────
297
+ * DESKTOP SCALE-UP (@media: 1024px+)
298
+ * ────────────────────────────────────────────────────────────────── */
299
+ @media (min-width: 1024px) {
300
+ .pad-xs { --jux-pad-token: calc(var(--jux-space-xs) * 1.25); }
301
+ .pad-sm { --jux-pad-token: calc(var(--jux-space-sm) * 1.25); }
302
+ .pad-md { --jux-pad-token: calc(var(--jux-space-md) * 1.25); }
303
+ .pad-lg { --jux-pad-token: calc(var(--jux-space-lg) * 1.25); }
304
+ .pad-xl { --jux-pad-token: calc(var(--jux-space-xl) * 1.25); }
305
+ .pad-2xl { --jux-pad-token: calc(var(--jux-space-2xl) * 1.25); }
306
+ .pad-3xl { --jux-pad-token: calc(var(--jux-space-3xl) * 1.25); }
307
+
308
+ .gap-xs { --jux-gap-token: calc(var(--jux-space-xs) * 1.25); }
309
+ .gap-sm { --jux-gap-token: calc(var(--jux-space-sm) * 1.25); }
310
+ .gap-md { --jux-gap-token: calc(var(--jux-space-md) * 1.25); }
311
+ .gap-lg { --jux-gap-token: calc(var(--jux-space-lg) * 1.25); }
312
+ .gap-xl { --jux-gap-token: calc(var(--jux-space-xl) * 1.25); }
313
+ .gap-2xl { --jux-gap-token: calc(var(--jux-space-2xl) * 1.25); }
314
+ .gap-3xl { --jux-gap-token: calc(var(--jux-space-3xl) * 1.25); }
315
+ }
316
+
317
+ /* ══════════════════════════════════════════════════════════════════
318
+ BUTTON (Ultra-Minimal - Pure Token Usage)
319
+ ══════════════════════════════════════════════════════════════════ */
320
+
321
+ .jux-button {
322
+ /* Colors */
323
+ background: var(--jux-brand-bg);
324
+ color: #fff;
325
+ border: var(--jux-stroke) solid var(--jux-border-color);
326
+
327
+ /* Shape */
328
+ border-radius: var(--jux-radius);
329
+
330
+ /* Size */
331
+ padding: var(--jux-pad, var(--jux-space-md));
332
+ font-size: var(--jux-font-size);
333
+ font-weight: var(--jux-weight-medium);
334
+ font-family: var(--jux-font-family);
335
+
336
+ /* Layout */
337
+ display: inline-flex;
338
+ align-items: center;
339
+ gap: var(--jux-space-sm);
340
+
341
+ /* Interaction */
342
+ cursor: pointer;
343
+ user-select: none;
344
+ transition: all 0.15s ease;
345
+ line-height: 1;
346
+ text-decoration: none;
347
+ }
348
+
349
+ /* States use burn calculations */
350
+ .jux-button:hover:not(:disabled) {
351
+ background: var(--jux-brand-color-hover);
352
+ }
353
+
354
+ .jux-button:active:not(:disabled) {
355
+ background: var(--jux-brand-color-active);
356
+ }
357
+
358
+ .jux-button:focus {
359
+ outline: none;
360
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jux-brand-bg) 30%, transparent 70%);
361
+ }
362
+
363
+ .jux-button:disabled {
364
+ opacity: var(--jux-burn-strong);
365
+ cursor: not-allowed;
366
+ }
@@ -0,0 +1,434 @@
1
+ /* ══════════════════════════════════════════════════════════════════
2
+ JUX THEME SYSTEM
3
+ Combines MODE (dark/light) + SWAG (brand aesthetic)
4
+
5
+ Usage:
6
+ <html data-mode="dark" data-swag="apple">
7
+
8
+ Swag Options: gumroad | stripe | google | apple | meta | notion
9
+ Mode Options: light | dark
10
+ ══════════════════════════════════════════════════════════════════ */
11
+
12
+ /* ══════════════════════════════════════════════════════════════════
13
+ 🍎 APPLE - Minimalist, Elegant, Rounded
14
+ ══════════════════════════════════════════════════════════════════ */
15
+
16
+ [data-swag="apple"][data-mode="light"] {
17
+ /* Brand Colors */
18
+ --jux-brand-from: #007aff;
19
+ --jux-brand-to: #0051d5;
20
+ --jux-brand-accent-from: #34c759;
21
+ --jux-brand-accent-to: #248a3d;
22
+
23
+ /* Surfaces */
24
+ --jux-surface-from: #ffffff;
25
+ --jux-surface-to: #f5f5f7;
26
+
27
+ /* Text */
28
+ --jux-text-from: #1d1d1f;
29
+ --jux-text-to: #86868b;
30
+
31
+ /* Borders */
32
+ --jux-border-from: #d2d2d7;
33
+ --jux-border-to: #86868b;
34
+
35
+ /* Radius - Very rounded (Apple style) */
36
+ --jux-radius-sharp: 0;
37
+ --jux-radius-sm: 0.5rem;
38
+ --jux-radius-md: 0.75rem;
39
+ --jux-radius-lg: 1rem;
40
+ --jux-radius-xl: 1.25rem;
41
+ --jux-radius-2xl: 1.5rem;
42
+ --jux-radius-full: 9999px;
43
+
44
+ /* Spacing - Generous (Apple loves whitespace) */
45
+ --jux-space-xs: 0.5rem;
46
+ --jux-space-sm: 0.75rem;
47
+ --jux-space-md: 1.25rem;
48
+ --jux-space-lg: 2rem;
49
+ --jux-space-xl: 3rem;
50
+ --jux-space-2xl: 4rem;
51
+ --jux-space-3xl: 6rem;
52
+
53
+ /* Typography - San Francisco inspired */
54
+ --jux-font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", sans-serif;
55
+ --jux-weight-normal: 400;
56
+ --jux-weight-medium: 500;
57
+ --jux-weight-semibold: 600;
58
+ --jux-weight-bold: 700;
59
+
60
+ /* Burn Factors - Subtle (Apple is understated) */
61
+ --jux-burn-subtle: 0.02;
62
+ --jux-burn-hover: 0.05;
63
+ --jux-burn-active: 0.08;
64
+ --jux-burn-muted: 0.3;
65
+ --jux-burn-strong: 0.6;
66
+ }
67
+
68
+ [data-swag="apple"][data-mode="dark"] {
69
+ --jux-brand-from: #0a84ff;
70
+ --jux-brand-to: #0062cc;
71
+ --jux-brand-accent-from: #32d74b;
72
+ --jux-brand-accent-to: #248a3d;
73
+
74
+ --jux-surface-from: #000000;
75
+ --jux-surface-to: #1c1c1e;
76
+
77
+ --jux-text-from: #ffffff;
78
+ --jux-text-to: #98989d;
79
+
80
+ --jux-border-from: #38383a;
81
+ --jux-border-to: #545456;
82
+
83
+ /* Radius, spacing, typography inherited from light mode */
84
+ }
85
+
86
+ /* ══════════════════════════════════════════════════════════════════
87
+ 🔵 GOOGLE - Bold, Colorful, Material Design
88
+ ══════════════════════════════════════════════════════════════════ */
89
+
90
+ [data-swag="google"][data-mode="light"] {
91
+ --jux-brand-from: #4285f4;
92
+ --jux-brand-to: #1a73e8;
93
+ --jux-brand-accent-from: #34a853;
94
+ --jux-brand-accent-to: #0d652d;
95
+
96
+ --jux-surface-from: #ffffff;
97
+ --jux-surface-to: #f8f9fa;
98
+
99
+ --jux-text-from: #202124;
100
+ --jux-text-to: #5f6368;
101
+
102
+ --jux-border-from: #dadce0;
103
+ --jux-border-to: #5f6368;
104
+
105
+ /* Radius - Less rounded (Material) */
106
+ --jux-radius-sharp: 0;
107
+ --jux-radius-sm: 0.25rem;
108
+ --jux-radius-md: 0.5rem;
109
+ --jux-radius-lg: 0.75rem;
110
+ --jux-radius-xl: 1rem;
111
+ --jux-radius-2xl: 1.25rem;
112
+ --jux-radius-full: 9999px;
113
+
114
+ /* Spacing - Standard Material */
115
+ --jux-space-xs: 0.25rem;
116
+ --jux-space-sm: 0.5rem;
117
+ --jux-space-md: 1rem;
118
+ --jux-space-lg: 1.5rem;
119
+ --jux-space-xl: 2rem;
120
+ --jux-space-2xl: 3rem;
121
+ --jux-space-3xl: 4rem;
122
+
123
+ /* Typography - Roboto */
124
+ --jux-font-sans: "Roboto", "Helvetica", "Arial", sans-serif;
125
+ --jux-weight-normal: 400;
126
+ --jux-weight-medium: 500;
127
+ --jux-weight-semibold: 600;
128
+ --jux-weight-bold: 700;
129
+
130
+ /* Burn Factors - Pronounced (Google loves color) */
131
+ --jux-burn-subtle: 0.04;
132
+ --jux-burn-hover: 0.08;
133
+ --jux-burn-active: 0.15;
134
+ --jux-burn-muted: 0.25;
135
+ --jux-burn-strong: 0.5;
136
+ }
137
+
138
+ [data-swag="google"][data-mode="dark"] {
139
+ --jux-brand-from: #8ab4f8;
140
+ --jux-brand-to: #4285f4;
141
+ --jux-brand-accent-from: #81c995;
142
+ --jux-brand-accent-to: #34a853;
143
+
144
+ --jux-surface-from: #202124;
145
+ --jux-surface-to: #292a2d;
146
+
147
+ --jux-text-from: #e8eaed;
148
+ --jux-text-to: #9aa0a6;
149
+
150
+ --jux-border-from: #3c4043;
151
+ --jux-border-to: #5f6368;
152
+ }
153
+
154
+ /* ══════════════════════════════════════════════════════════════════
155
+ 💳 STRIPE - Professional, Precise, Trustworthy
156
+ ══════════════════════════════════════════════════════════════════ */
157
+
158
+ [data-swag="stripe"][data-mode="light"] {
159
+ --jux-brand-from: #635bff;
160
+ --jux-brand-to: #0a2540;
161
+ --jux-brand-accent-from: #00d4ff;
162
+ --jux-brand-accent-to: #0073e6;
163
+
164
+ --jux-surface-from: #ffffff;
165
+ --jux-surface-to: #f6f9fc;
166
+
167
+ --jux-text-from: #0a2540;
168
+ --jux-text-to: #425466;
169
+
170
+ --jux-border-from: #e3e8ee;
171
+ --jux-border-to: #cbd2d9;
172
+
173
+ /* Radius - Sharp to moderate (professional) */
174
+ --jux-radius-sharp: 0;
175
+ --jux-radius-sm: 0.25rem;
176
+ --jux-radius-md: 0.375rem;
177
+ --jux-radius-lg: 0.5rem;
178
+ --jux-radius-xl: 0.75rem;
179
+ --jux-radius-2xl: 1rem;
180
+ --jux-radius-full: 9999px;
181
+
182
+ /* Spacing - Tight, efficient */
183
+ --jux-space-xs: 0.25rem;
184
+ --jux-space-sm: 0.5rem;
185
+ --jux-space-md: 1rem;
186
+ --jux-space-lg: 1.5rem;
187
+ --jux-space-xl: 2rem;
188
+ --jux-space-2xl: 3rem;
189
+ --jux-space-3xl: 4rem;
190
+
191
+ /* Typography - Camphor (fallback to system) */
192
+ --jux-font-sans: "Camphor", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
193
+ --jux-weight-normal: 400;
194
+ --jux-weight-medium: 500;
195
+ --jux-weight-semibold: 600;
196
+ --jux-weight-bold: 700;
197
+
198
+ /* Burn Factors - Subtle, professional */
199
+ --jux-burn-subtle: 0.02;
200
+ --jux-burn-hover: 0.04;
201
+ --jux-burn-active: 0.08;
202
+ --jux-burn-muted: 0.3;
203
+ --jux-burn-strong: 0.5;
204
+ }
205
+
206
+ [data-swag="stripe"][data-mode="dark"] {
207
+ --jux-brand-from: #7a73ff;
208
+ --jux-brand-to: #635bff;
209
+ --jux-brand-accent-from: #00d4ff;
210
+ --jux-brand-accent-to: #0073e6;
211
+
212
+ --jux-surface-from: #0a2540;
213
+ --jux-surface-to: #1a365d;
214
+
215
+ --jux-text-from: #ffffff;
216
+ --jux-text-to: #adbdcc;
217
+
218
+ --jux-border-from: #1a365d;
219
+ --jux-border-to: #2d4a6f;
220
+ }
221
+
222
+ /* ══════════════════════════════════════════════════════════════════
223
+ 🎨 GUMROAD - Bold, Playful, Creative
224
+ ══════════════════════════════════════════════════════════════════ */
225
+
226
+ [data-swag="gumroad"][data-mode="light"] {
227
+ --jux-brand-from: #ff90e8;
228
+ --jux-brand-to: #ff5ac4;
229
+ --jux-brand-accent-from: #36d9b8;
230
+ --jux-brand-accent-to: #1ead8a;
231
+
232
+ --jux-surface-from: #ffffff;
233
+ --jux-surface-to: #f9f9f9;
234
+
235
+ --jux-text-from: #000000;
236
+ --jux-text-to: #999999;
237
+
238
+ --jux-border-from: #e6e6e6;
239
+ --jux-border-to: #cccccc;
240
+
241
+ /* Radius - Playful, more rounded */
242
+ --jux-radius-sharp: 0;
243
+ --jux-radius-sm: 0.5rem;
244
+ --jux-radius-md: 0.75rem;
245
+ --jux-radius-lg: 1rem;
246
+ --jux-radius-xl: 1.5rem;
247
+ --jux-radius-2xl: 2rem;
248
+ --jux-radius-full: 9999px;
249
+
250
+ /* Spacing - Generous (creative needs room) */
251
+ --jux-space-xs: 0.5rem;
252
+ --jux-space-sm: 0.75rem;
253
+ --jux-space-md: 1.25rem;
254
+ --jux-space-lg: 2rem;
255
+ --jux-space-xl: 3rem;
256
+ --jux-space-2xl: 4rem;
257
+ --jux-space-3xl: 6rem;
258
+
259
+ /* Typography - Mabry (fallback to rounded sans) */
260
+ --jux-font-sans: "Mabry", "Circular", -apple-system, sans-serif;
261
+ --jux-weight-normal: 400;
262
+ --jux-weight-medium: 500;
263
+ --jux-weight-semibold: 600;
264
+ --jux-weight-bold: 700;
265
+
266
+ /* Burn Factors - Vibrant transitions */
267
+ --jux-burn-subtle: 0.05;
268
+ --jux-burn-hover: 0.1;
269
+ --jux-burn-active: 0.15;
270
+ --jux-burn-muted: 0.25;
271
+ --jux-burn-strong: 0.4;
272
+ }
273
+
274
+ [data-swag="gumroad"][data-mode="dark"] {
275
+ --jux-brand-from: #ff90e8;
276
+ --jux-brand-to: #ff5ac4;
277
+ --jux-brand-accent-from: #36d9b8;
278
+ --jux-brand-accent-to: #1ead8a;
279
+
280
+ --jux-surface-from: #000000;
281
+ --jux-surface-to: #1a1a1a;
282
+
283
+ --jux-text-from: #ffffff;
284
+ --jux-text-to: #999999;
285
+
286
+ --jux-border-from: #333333;
287
+ --jux-border-to: #666666;
288
+ }
289
+
290
+ /* ══════════════════════════════════════════════════════════════════
291
+ 🔷 META - Modern, Bold, Blue
292
+ ══════════════════════════════════════════════════════════════════ */
293
+
294
+ [data-swag="meta"][data-mode="light"] {
295
+ --jux-brand-from: #0866ff;
296
+ --jux-brand-to: #0554e5;
297
+ --jux-brand-accent-from: #0bc15c;
298
+ --jux-brand-accent-to: #089e48;
299
+
300
+ --jux-surface-from: #ffffff;
301
+ --jux-surface-to: #f0f2f5;
302
+
303
+ --jux-text-from: #050505;
304
+ --jux-text-to: #65676b;
305
+
306
+ --jux-border-from: #ced0d4;
307
+ --jux-border-to: #bcc0c4;
308
+
309
+ /* Radius - Moderate, friendly */
310
+ --jux-radius-sharp: 0;
311
+ --jux-radius-sm: 0.375rem;
312
+ --jux-radius-md: 0.5rem;
313
+ --jux-radius-lg: 0.75rem;
314
+ --jux-radius-xl: 1rem;
315
+ --jux-radius-2xl: 1.25rem;
316
+ --jux-radius-full: 9999px;
317
+
318
+ /* Spacing - Balanced */
319
+ --jux-space-xs: 0.25rem;
320
+ --jux-space-sm: 0.5rem;
321
+ --jux-space-md: 1rem;
322
+ --jux-space-lg: 1.5rem;
323
+ --jux-space-xl: 2rem;
324
+ --jux-space-2xl: 3rem;
325
+ --jux-space-3xl: 4rem;
326
+
327
+ /* Typography - Optimistic Display */
328
+ --jux-font-sans: "Optimistic Display", -apple-system, BlinkMacSystemFont, sans-serif;
329
+ --jux-weight-normal: 400;
330
+ --jux-weight-medium: 500;
331
+ --jux-weight-semibold: 600;
332
+ --jux-weight-bold: 700;
333
+
334
+ /* Burn Factors - Standard */
335
+ --jux-burn-subtle: 0.03;
336
+ --jux-burn-hover: 0.06;
337
+ --jux-burn-active: 0.12;
338
+ --jux-burn-muted: 0.25;
339
+ --jux-burn-strong: 0.5;
340
+ }
341
+
342
+ [data-swag="meta"][data-mode="dark"] {
343
+ --jux-brand-from: #2e89ff;
344
+ --jux-brand-to: #0866ff;
345
+ --jux-brand-accent-from: #0bc15c;
346
+ --jux-brand-accent-to: #089e48;
347
+
348
+ --jux-surface-from: #18191a;
349
+ --jux-surface-to: #242526;
350
+
351
+ --jux-text-from: #e4e6eb;
352
+ --jux-text-to: #b0b3b8;
353
+
354
+ --jux-border-from: #3a3b3c;
355
+ --jux-border-to: #4e4f50;
356
+ }
357
+
358
+ /* ══════════════════════════════════════════════════════════════════
359
+ 📝 NOTION - Clean, Minimal, Functional
360
+ ══════════════════════════════════════════════════════════════════ */
361
+
362
+ [data-swag="notion"][data-mode="light"] {
363
+ --jux-brand-from: #000000;
364
+ --jux-brand-to: #2e2e2e;
365
+ --jux-brand-accent-from: #0f7b6c;
366
+ --jux-brand-accent-to: #0a5a4f;
367
+
368
+ --jux-surface-from: #ffffff;
369
+ --jux-surface-to: #f7f6f3;
370
+
371
+ --jux-text-from: #37352f;
372
+ --jux-text-to: #9b9a97;
373
+
374
+ --jux-border-from: #e9e9e7;
375
+ --jux-border-to: #d3d1cb;
376
+
377
+ /* Radius - Minimal */
378
+ --jux-radius-sharp: 0;
379
+ --jux-radius-sm: 0.1875rem;
380
+ --jux-radius-md: 0.25rem;
381
+ --jux-radius-lg: 0.375rem;
382
+ --jux-radius-xl: 0.5rem;
383
+ --jux-radius-2xl: 0.75rem;
384
+ --jux-radius-full: 9999px;
385
+
386
+ /* Spacing - Compact, efficient */
387
+ --jux-space-xs: 0.25rem;
388
+ --jux-space-sm: 0.5rem;
389
+ --jux-space-md: 0.75rem;
390
+ --jux-space-lg: 1rem;
391
+ --jux-space-xl: 1.5rem;
392
+ --jux-space-2xl: 2rem;
393
+ --jux-space-3xl: 3rem;
394
+
395
+ /* Typography - Inter-like */
396
+ --jux-font-sans: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
397
+ --jux-weight-normal: 400;
398
+ --jux-weight-medium: 500;
399
+ --jux-weight-semibold: 600;
400
+ --jux-weight-bold: 700;
401
+
402
+ /* Burn Factors - Very subtle (Notion is understated) */
403
+ --jux-burn-subtle: 0.02;
404
+ --jux-burn-hover: 0.04;
405
+ --jux-burn-active: 0.08;
406
+ --jux-burn-muted: 0.35;
407
+ --jux-burn-strong: 0.6;
408
+ }
409
+
410
+ [data-swag="notion"][data-mode="dark"] {
411
+ --jux-brand-from: #ffffff;
412
+ --jux-brand-to: #e0e0e0;
413
+ --jux-brand-accent-from: #0f7b6c;
414
+ --jux-brand-accent-to: #0a5a4f;
415
+
416
+ --jux-surface-from: #191919;
417
+ --jux-surface-to: #2f2f2f;
418
+
419
+ --jux-text-from: #ffffff;
420
+ --jux-text-to: #9b9a97;
421
+
422
+ --jux-border-from: #373737;
423
+ --jux-border-to: #4a4a4a;
424
+ }
425
+
426
+ /* ══════════════════════════════════════════════════════════════════
427
+ 🎯 DEFAULT FALLBACK - Neutral, System-Based
428
+ ══════════════════════════════════════════════════════════════════ */
429
+
430
+ :root:not([data-swag]),
431
+ [data-swag="default"] {
432
+ /* Inherits from foundation.css defaults */
433
+ /* This ensures the system works even if no theme is selected */
434
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.141",
3
+ "version": "1.1.143",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",