@adukiorg/anza 0.3.8 → 0.4.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 (43) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/bin/anza/anza-linux-arm64 +0 -0
  3. package/bin/anza/anza-linux-x64 +0 -0
  4. package/bin/anza/anza-macos-arm64 +0 -0
  5. package/bin/anza/anza-macos-x64 +0 -0
  6. package/bin/anza/anza-windows-x64.exe +0 -0
  7. package/package.json +1 -1
  8. package/src/core/ui/define/element.js +125 -19
  9. package/src/core/ui/define/utils.js +30 -22
  10. package/src/elements/data/card/style.css +1 -1
  11. package/src/elements/data/chart/style.css +1 -1
  12. package/src/elements/data/list/style.css +1 -1
  13. package/src/elements/data/stat/style.css +1 -1
  14. package/src/elements/data/table/style.css +1 -1
  15. package/src/elements/feedback/alert/style.css +1 -1
  16. package/src/elements/feedback/empty/style.css +1 -1
  17. package/src/elements/feedback/progress/style.css +1 -1
  18. package/src/elements/feedback/toast/style.css +1 -1
  19. package/src/elements/forms/checkbox/style.css +1 -1
  20. package/src/elements/forms/field/style.css +1 -1
  21. package/src/elements/forms/input/style.css +1 -1
  22. package/src/elements/forms/radio/style.css +1 -1
  23. package/src/elements/forms/select/style.css +1 -1
  24. package/src/elements/forms/textarea/style.css +1 -1
  25. package/src/elements/forms/toggle/style.css +1 -1
  26. package/src/elements/forms/upload/style.css +1 -1
  27. package/src/elements/layout/app/style.css +1 -1
  28. package/src/elements/navigation/breadcrumb/style.css +1 -1
  29. package/src/elements/navigation/nav/style.css +1 -1
  30. package/src/elements/navigation/pagination/style.css +1 -1
  31. package/src/elements/navigation/steps/style.css +1 -1
  32. package/src/elements/navigation/tabs/style.css +1 -1
  33. package/src/elements/overlay/dialog/style.css +1 -1
  34. package/src/elements/overlay/drawer/style.css +1 -1
  35. package/src/elements/overlay/menu/style.css +1 -1
  36. package/src/elements/overlay/popover/style.css +1 -1
  37. package/src/elements/overlay/sheet/style.css +1 -1
  38. package/src/elements/overlay/tooltip/style.css +1 -1
  39. package/src/elements/primitives/avatar/style.css +1 -1
  40. package/src/elements/primitives/badge/style.css +1 -1
  41. package/src/elements/primitives/button/style.css +1 -1
  42. package/src/elements/primitives/text/style.css +1 -1
  43. package/src/styles/base.css +2 -2
package/CHANGELOG.md CHANGED
@@ -17,6 +17,26 @@ Versioning follows [Semantic Versioning](https://semver.org/).
17
17
 
18
18
  ---
19
19
 
20
+ ## [0.4.0] — 2026-06-14
21
+
22
+ ### Added
23
+
24
+ - Natively support arrays of multiple CSS imports in component definitions (`template: { html, css: ['./a.css', './b.css'] }`) across both the JavaScript library runtime and the Rust compiler.
25
+
26
+ ### Changed
27
+
28
+ - Replaced CSS Custom Highlight API implementation with PrismJS for `view-code` syntax highlighting.
29
+
30
+ ---
31
+
32
+ ## [0.3.9] — 2026-06-13
33
+
34
+ ### Changed
35
+
36
+ - Updated core component rendering to correctly process nested syntax logic and perform full syntax highlighting.
37
+
38
+ ---
39
+
20
40
  ## [0.3.7] — 2026-06-13
21
41
 
22
42
  ### Changed
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adukiorg/anza",
3
- "version": "0.3.8",
3
+ "version": "0.4.0",
4
4
  "description": "Anza web platform library — reactive state, networking, offline, animations, custom elements. Instant build step. Pure browser ESM.",
5
5
  "author": "fescii",
6
6
  "license": "MIT",
@@ -1,7 +1,7 @@
1
1
  import { BaseElement } from '../base.js';
2
2
  import { scheduleFrame, yieldTask } from '../schedule.js';
3
3
  import { router } from '../../router/index.js';
4
- import { specRegistry, internalsMap, initializedMap, pendingUpdatesMap, updateScheduledMap } from './state.js';
4
+ import { specRegistry, internalsMap, initializedMap, pendingUpdatesMap, updateScheduledMap, assetCache } from './state.js';
5
5
  import { preloadResources } from './utils.js';
6
6
  import { createComponentContext } from './proxy.js';
7
7
 
@@ -50,40 +50,74 @@ export function element(tag, spec, base) {
50
50
  warnMissingBase(tag, 'template', spec.template, base);
51
51
 
52
52
  // Resolve absolute URLs relative to import.meta.url (base)
53
- const styleUrl = spec.style && base && (spec.style.endsWith('.css') || spec.style.startsWith('./') || spec.style.startsWith('/'))
54
- ? new URL(spec.style, base).href
55
- : null;
53
+ const styleUrls = Array.isArray(spec.style)
54
+ ? spec.style.filter(s => s && base && (s.endsWith('.css') || s.startsWith('./') || s.startsWith('/'))).map(s => new URL(s, base).href)
55
+ : (spec.style && base && (spec.style.endsWith('.css') || spec.style.startsWith('./') || spec.style.startsWith('/'))
56
+ ? [new URL(spec.style, base).href]
57
+ : []);
58
+
56
59
  const templateUrl = spec.template && base && (spec.template.endsWith('.html') || spec.template.startsWith('./') || spec.template.startsWith('/'))
57
60
  ? new URL(spec.template, base).href
58
61
  : null;
59
62
 
60
63
  // Initiate resource fetching exactly once per component registration (R-06)
61
64
  let resolved = null;
62
- const resourcesPromise = preloadResources(tag, styleUrl, templateUrl, spec.template, spec.style).then(res => {
65
+ let resourcesPromise = preloadResources(tag, styleUrls, templateUrl, spec.template, spec.style).then(res => {
63
66
  resolved = res;
64
67
  return res;
65
68
  });
66
69
 
67
70
  // Handle hot reloading of constructable stylesheets (one global listener per unique styleUrl - R-05)
68
- if (styleUrl && typeof window !== 'undefined') {
71
+ if (styleUrls.length > 0 && typeof window !== 'undefined') {
69
72
  if (!window.__native_hmr_listeners__) {
70
73
  window.__native_hmr_listeners__ = new Set();
71
74
  }
72
- if (!window.__native_hmr_listeners__.has(styleUrl)) {
73
- window.__native_hmr_listeners__.add(styleUrl);
75
+ for (const styleUrl of styleUrls) {
76
+ if (!window.__native_hmr_listeners__.has(styleUrl)) {
77
+ window.__native_hmr_listeners__.add(styleUrl);
78
+ const hmrHandler = async (e) => {
79
+ const { path: changedPath, css } = e.detail;
80
+ const absoluteChangedUrl = new URL(changedPath, window.location.origin).href;
81
+
82
+ if (styleUrl === absoluteChangedUrl || styleUrl.endsWith(changedPath)) {
83
+ const sheet = assetCache.get(styleUrl);
84
+ if (sheet && typeof sheet.replaceSync === 'function') {
85
+ sheet.replaceSync(css);
86
+ console.log(`[HMR] Shared AdoptedStyleSheet hot-swapped for <${tag}>`);
87
+ }
88
+ }
89
+ };
90
+ window.addEventListener('anza:hmr:css', hmrHandler);
91
+ }
92
+ }
93
+ }
94
+
95
+ // Handle hot reloading of HTML templates
96
+ if (templateUrl && typeof window !== 'undefined') {
97
+ if (!window.__native_hmr_html_listeners__) {
98
+ window.__native_hmr_html_listeners__ = new Set();
99
+ }
100
+ if (!window.__native_hmr_html_listeners__.has(templateUrl)) {
101
+ window.__native_hmr_html_listeners__.add(templateUrl);
74
102
  const hmrHandler = async (e) => {
75
- const { path: changedPath, css } = e.detail;
103
+ const { path: changedPath, html } = e.detail;
76
104
  const absoluteChangedUrl = new URL(changedPath, window.location.origin).href;
77
105
 
78
- if (styleUrl === absoluteChangedUrl || styleUrl.endsWith(changedPath)) {
79
- const res = await resourcesPromise;
80
- if (res.stylesheet) {
81
- res.stylesheet.replaceSync(css);
82
- console.log(`[HMR] Shared AdoptedStyleSheet hot-swapped for <${tag}>`);
83
- }
106
+ if (templateUrl === absoluteChangedUrl || templateUrl.endsWith(changedPath)) {
107
+ // Re-parse HTML into the cached resolved object
108
+ resourcesPromise = preloadResources(tag, styleUrls, null, html, spec.style).then(res => {
109
+ resolved = res;
110
+ // Now re-bind instances!
111
+ const instances = window.__native_hmr_instances__?.get(tag) || [];
112
+ for (const instance of instances) {
113
+ if (instance.__hmr_rebind) instance.__hmr_rebind();
114
+ }
115
+ console.log(`[HMR] Template hot-swapped for <${tag}>`);
116
+ return res;
117
+ });
84
118
  }
85
119
  };
86
- window.addEventListener('anza:hmr:css', hmrHandler);
120
+ window.addEventListener('anza:hmr:html', hmrHandler);
87
121
  }
88
122
  }
89
123
 
@@ -98,6 +132,11 @@ export function element(tag, spec, base) {
98
132
  pendingUpdatesMap.set(this, new Map());
99
133
  updateScheduledMap.set(this, false);
100
134
 
135
+ if (typeof window !== 'undefined') {
136
+ if (!window.__native_hmr_instances__) window.__native_hmr_instances__ = new Map();
137
+ if (!window.__native_hmr_instances__.has(tag)) window.__native_hmr_instances__.set(tag, new Set());
138
+ }
139
+
101
140
  if (spec.form) {
102
141
  const internals = this.attachInternals();
103
142
  internalsMap.set(this, internals);
@@ -126,12 +165,16 @@ export function element(tag, spec, base) {
126
165
  // AbortController bootstrap inside BaseElement
127
166
  super.connectedCallback();
128
167
 
168
+ if (typeof window !== 'undefined') {
169
+ window.__native_hmr_instances__?.get(tag)?.add(this);
170
+ }
171
+
129
172
  // Wait for resolved resources to compile (synchronously if already cached)
130
173
  let res = resolved;
131
174
  if (!res) {
132
175
  res = await resourcesPromise;
133
176
  }
134
- const { templateNode, stylesheet, cssText, tagsDescriptor } = res;
177
+ const { templateNode, stylesheets, cssText, tagsDescriptor } = res;
135
178
 
136
179
  if (!this.ctrl || this.ctrl.signal.aborted || !this.isConnected) {
137
180
  return;
@@ -148,9 +191,9 @@ export function element(tag, spec, base) {
148
191
  this.shadowRoot.appendChild(templateNode.cloneNode(true));
149
192
  }
150
193
 
151
- if (stylesheet) {
194
+ if (stylesheets && stylesheets.length > 0) {
152
195
  // Constructable stylesheets path
153
- this.shadowRoot.adoptedStyleSheets = [stylesheet];
196
+ this.shadowRoot.adoptedStyleSheets = stylesheets;
154
197
  } else if (cssText) {
155
198
  // Fallback: inject <style> for browsers without adoptedStyleSheets
156
199
  const style = document.createElement('style');
@@ -190,6 +233,9 @@ export function element(tag, spec, base) {
190
233
  }
191
234
 
192
235
  disconnectedCallback() {
236
+ if (typeof window !== 'undefined') {
237
+ window.__native_hmr_instances__?.get(tag)?.delete(this);
238
+ }
193
239
  if (spec.unmount) {
194
240
  spec.unmount({
195
241
  el: this,
@@ -202,6 +248,66 @@ export function element(tag, spec, base) {
202
248
  super.disconnectedCallback();
203
249
  }
204
250
 
251
+ async __hmr_rebind() {
252
+ // 1. Unmount component safely
253
+ if (spec.unmount) {
254
+ spec.unmount({
255
+ el: this,
256
+ tags: this._tags,
257
+ refs: this._refs,
258
+ watch: this._watch,
259
+ internals: internalsMap.get(this)
260
+ });
261
+ }
262
+
263
+ // 2. Clear Shadow DOM
264
+ this.shadowRoot.innerHTML = '';
265
+
266
+ // 3. Clone new template
267
+ let res = resolved;
268
+ if (!res) {
269
+ res = await resourcesPromise;
270
+ }
271
+ const { templateNode, stylesheets, cssText, tagsDescriptor } = res;
272
+
273
+ if (templateNode) {
274
+ this.shadowRoot.appendChild(templateNode.cloneNode(true));
275
+ }
276
+ if (stylesheets && stylesheets.length > 0) {
277
+ this.shadowRoot.adoptedStyleSheets = stylesheets;
278
+ } else if (cssText) {
279
+ const style = document.createElement('style');
280
+ style.textContent = cssText;
281
+ this.shadowRoot.prepend(style);
282
+ }
283
+
284
+ // 4. Recreate component context to rebind DOM events and tags
285
+ const context = createComponentContext({
286
+ el: this,
287
+ shadowRoot: this.shadowRoot,
288
+ ctrl: this.ctrl,
289
+ descriptor: tagsDescriptor,
290
+ internals: internalsMap.get(this)
291
+ });
292
+ this._ctx = context;
293
+ this._tags = context.tags;
294
+ this._on = context.on;
295
+ this._refs = context.refs;
296
+ this._watch = context.watch;
297
+
298
+ // 5. Trigger mount again
299
+ if (spec.mount) {
300
+ try {
301
+ const mountRes = spec.mount(context);
302
+ if (mountRes instanceof Promise) {
303
+ mountRes.catch(console.error);
304
+ }
305
+ } catch (err) {
306
+ console.error('[Native UI] mount failed during HMR:', err);
307
+ }
308
+ }
309
+ }
310
+
205
311
  attributeChangedCallback(name, oldVal, newVal) {
206
312
  if (oldVal === newVal) return;
207
313
 
@@ -8,52 +8,60 @@ const supportsSheets =
8
8
 
9
9
  /**
10
10
  * Preloads style and HTML template resources asynchronously exactly once.
11
- * Returns { templateNode, stylesheet, cssText, tagsDescriptor }.
12
- * When constructable stylesheets are unsupported, stylesheet is null and
13
- * cssText carries the raw CSS for <style> injection.
11
+ * Returns { templateNode, stylesheets, cssText, tagsDescriptor }.
12
+ * When constructable stylesheets are unsupported, stylesheets is an empty array and
13
+ * cssText carries the concatenated raw CSS for <style> injection.
14
14
  */
15
- export async function preloadResources(tag, styleUrl, templateUrl, inlineTemplate, inlineStyle) {
15
+ export async function preloadResources(tag, styleUrls, templateUrl, inlineTemplate, inlineStyle) {
16
16
  let templateNode = null;
17
- let stylesheet = null;
18
- let cssText = null;
17
+ let stylesheets = [];
18
+ let cssTextAcc = '';
19
19
  let tagsDescriptor = null;
20
20
 
21
21
  // Compile / Fetch styles
22
- if (styleUrl) {
23
- if (assetCache.has(styleUrl)) {
24
- const cached = assetCache.get(styleUrl);
22
+ const urls = Array.isArray(styleUrls) ? styleUrls : (styleUrls ? [styleUrls] : []);
23
+
24
+ await Promise.all(urls.map(async (url) => {
25
+ if (assetCache.has(url)) {
26
+ const cached = assetCache.get(url);
25
27
  if (supportsSheets) {
26
- stylesheet = cached;
28
+ stylesheets.push(cached);
27
29
  } else {
28
- cssText = cached;
30
+ cssTextAcc += cached + '\n';
29
31
  }
30
32
  } else {
31
33
  try {
32
- const res = await fetch(styleUrl);
34
+ const res = await fetch(url);
33
35
  if (res.ok) {
34
36
  const css = await res.text();
35
37
  if (supportsSheets) {
36
- stylesheet = new CSSStyleSheet();
37
- stylesheet.replaceSync(css);
38
- assetCache.set(styleUrl, stylesheet);
38
+ const sheet = new CSSStyleSheet();
39
+ sheet.replaceSync(css);
40
+ assetCache.set(url, sheet);
41
+ stylesheets.push(sheet);
39
42
  } else {
40
- cssText = css;
41
- assetCache.set(styleUrl, css);
43
+ assetCache.set(url, css);
44
+ cssTextAcc += css + '\n';
42
45
  }
43
46
  }
44
47
  } catch (err) {
45
- console.error(`Failed to load style resource for element ${tag}:`, err);
48
+ console.error(`Failed to load style resource ${url} for element ${tag}:`, err);
46
49
  }
47
50
  }
48
- } else if (inlineStyle) {
51
+ }));
52
+
53
+ if (inlineStyle) {
49
54
  if (supportsSheets) {
50
- stylesheet = new CSSStyleSheet();
51
- stylesheet.replaceSync(inlineStyle);
55
+ const sheet = new CSSStyleSheet();
56
+ sheet.replaceSync(inlineStyle);
57
+ stylesheets.push(sheet);
52
58
  } else {
53
- cssText = inlineStyle;
59
+ cssTextAcc += inlineStyle + '\n';
54
60
  }
55
61
  }
56
62
 
63
+ const cssText = cssTextAcc.trim() ? cssTextAcc : null;
64
+
57
65
  // Compile / Fetch Template markup
58
66
  if (templateUrl) {
59
67
  if (assetCache.has(templateUrl)) {
@@ -6,7 +6,7 @@
6
6
  border-radius: var(--radius-lg);
7
7
  box-shadow: var(--shadow-sm);
8
8
  overflow: hidden;
9
- font-family: var(--font-family-sans);
9
+ font-family: var(--font-sans);
10
10
  transition:
11
11
  transform var(--duration-fast) var(--ease-out),
12
12
  box-shadow var(--duration-fast) var(--ease-out),
@@ -3,7 +3,7 @@
3
3
  width: 100%;
4
4
  height: calc(var(--space-24) * 3);
5
5
  position: relative;
6
- font-family: var(--font-family-sans);
6
+ font-family: var(--font-sans);
7
7
  }
8
8
 
9
9
  canvas {
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  width: 100%;
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  }
7
7
 
8
8
  .list {
@@ -6,7 +6,7 @@
6
6
  border-radius: var(--radius-lg);
7
7
  padding: var(--space-6);
8
8
  box-shadow: var(--shadow-sm);
9
- font-family: var(--font-family-sans);
9
+ font-family: var(--font-sans);
10
10
  box-sizing: border-box;
11
11
  width: 100%;
12
12
  }
@@ -13,7 +13,7 @@
13
13
  width: 100%;
14
14
  border-collapse: collapse;
15
15
  border-spacing: 0;
16
- font-family: var(--font-family-sans);
16
+ font-family: var(--font-sans);
17
17
  font-size: var(--font-size-sm);
18
18
  color: var(--color-content-primary);
19
19
  text-align: left;
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  width: 100%;
5
5
  /* Component Tokens — Semantic Reference Only */
6
6
  --alert-radius: var(--radius-md);
@@ -5,7 +5,7 @@
5
5
  justify-content: center;
6
6
  text-align: center;
7
7
  padding: var(--space-12) var(--space-6);
8
- font-family: var(--font-family-sans);
8
+ font-family: var(--font-sans);
9
9
  box-sizing: border-box;
10
10
  width: 100%;
11
11
  }
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--space-1);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  width: 100%;
7
7
  /* Component Tokens — Semantic Reference Only */
8
8
  --progress-bg: var(--color-border-default);
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  .toast {
@@ -2,7 +2,7 @@
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  gap: var(--space-2);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  cursor: pointer;
7
7
  user-select: none;
8
8
  /* Component Tokens — Semantic Reference Only */
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--space-1-5);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  width: 100%;
7
7
  }
8
8
 
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--space-1);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  }
7
7
 
8
8
  input {
@@ -2,7 +2,7 @@
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  gap: var(--space-2);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  cursor: pointer;
7
7
  user-select: none;
8
8
  /* Component Tokens — Semantic Reference Only */
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--space-1);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  position: relative;
7
7
  /* Component Tokens — Semantic Reference Only */
8
8
  --select-bg: var(--color-surface-page);
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--space-1);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  }
7
7
 
8
8
  textarea {
@@ -2,7 +2,7 @@
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  gap: var(--space-2);
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  cursor: pointer;
7
7
  user-select: none;
8
8
  /* Component Tokens — Semantic Reference Only */
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  width: 100%;
5
5
  /* Component Tokens — Semantic Reference Only */
6
6
  --upload-bg: var(--color-surface-page);
@@ -5,7 +5,7 @@
5
5
  width: 100%;
6
6
  background: var(--color-surface-page);
7
7
  color: var(--color-content-primary);
8
- font-family: var(--font-family-sans);
8
+ font-family: var(--font-sans);
9
9
  }
10
10
 
11
11
  .app-frame {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  ol {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  nav {
@@ -3,7 +3,7 @@
3
3
  align-items: center;
4
4
  justify-content: center;
5
5
  gap: var(--space-2);
6
- font-family: var(--font-family-sans);
6
+ font-family: var(--font-sans);
7
7
  width: 100%;
8
8
  }
9
9
 
@@ -3,7 +3,7 @@
3
3
  align-items: center;
4
4
  justify-content: space-between;
5
5
  width: 100%;
6
- font-family: var(--font-family-sans);
6
+ font-family: var(--font-sans);
7
7
  position: relative;
8
8
  }
9
9
 
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  width: 100%;
5
- font-family: var(--font-family-sans);
5
+ font-family: var(--font-sans);
6
6
  }
7
7
 
8
8
  .tablist {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: inline-block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  dialog {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: inline-block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  dialog {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: inline-block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  [popover] {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: inline-block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  [popover] {
@@ -1,6 +1,6 @@
1
1
  :host {
2
2
  display: inline-block;
3
- font-family: var(--font-family-sans);
3
+ font-family: var(--font-sans);
4
4
  }
5
5
 
6
6
  dialog {
@@ -22,7 +22,7 @@
22
22
  padding: var(--space-1) var(--space-2);
23
23
  border-radius: var(--radius-sm);
24
24
  font-size: var(--font-size-xs);
25
- font-family: var(--font-family-sans);
25
+ font-family: var(--font-sans);
26
26
  white-space: nowrap;
27
27
  box-shadow: var(--shadow-sm);
28
28
  transition:
@@ -10,7 +10,7 @@
10
10
  overflow: hidden;
11
11
  background: var(--color-interactive-disabled);
12
12
  color: var(--color-content-secondary);
13
- font-family: var(--font-family-sans);
13
+ font-family: var(--font-sans);
14
14
  font-size: calc(var(--avatar-size, var(--space-8)) * 0.4);
15
15
  font-weight: var(--font-weight-medium);
16
16
  user-select: none;
@@ -4,7 +4,7 @@
4
4
  display: inline-flex;
5
5
  /* Component Tokens — Semantic Reference Only */
6
6
  --badge-radius: var(--radius-full);
7
- --badge-font: var(--font-family-sans);
7
+ --badge-font: var(--font-sans);
8
8
  --badge-weight: var(--font-weight-semibold);
9
9
  --badge-size: var(--font-size-xs);
10
10
 
@@ -10,7 +10,7 @@
10
10
  --btn-bg-disabled: var(--color-interactive-disabled);
11
11
  --btn-color: var(--color-content-inverse);
12
12
  --btn-radius: var(--radius-md);
13
- --btn-font: var(--font-family-sans);
13
+ --btn-font: var(--font-sans);
14
14
  --btn-size: var(--font-size-sm);
15
15
  --btn-weight: var(--font-weight-medium);
16
16
  --btn-padding-y: var(--space-2);
@@ -5,7 +5,7 @@
5
5
  /* Component Tokens — Semantic Reference Only */
6
6
  --text-size: var(--font-size-base);
7
7
  --text-weight: var(--font-weight-regular);
8
- --text-family: var(--font-family-sans);
8
+ --text-family: var(--font-sans);
9
9
  --text-height: var(--line-height-normal);
10
10
  --text-color: var(--color-content-primary);
11
11
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  @layer base {
10
10
  :root {
11
- font-family: var(--font-family-sans);
11
+ font-family: var(--font-sans);
12
12
  font-size: var(--font-size-base);
13
13
  color-scheme: light dark;
14
14
  }
@@ -24,7 +24,7 @@
24
24
 
25
25
  /* Typography Defaults */
26
26
  h1, h2, h3, h4, h5, h6 {
27
- font-family: var(--font-family-sans);
27
+ font-family: var(--font-sans);
28
28
  color: var(--color-content-primary);
29
29
  font-weight: var(--font-weight-semibold);
30
30
  line-height: var(--line-height-tight);