@adukiorg/anza 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/bin/anza/anza-linux-arm64 +0 -0
- package/bin/anza/anza-linux-x64 +0 -0
- package/bin/anza/anza-macos-arm64 +0 -0
- package/bin/anza/anza-macos-x64 +0 -0
- package/bin/anza/anza-windows-x64.exe +0 -0
- package/package.json +1 -1
- package/src/core/ui/define/element.js +36 -28
- package/src/core/ui/define/utils.js +39 -25
- package/src/elements/data/card/style.css +1 -1
- package/src/elements/data/chart/style.css +1 -1
- package/src/elements/data/list/style.css +1 -1
- package/src/elements/data/stat/style.css +1 -1
- package/src/elements/data/table/style.css +1 -1
- package/src/elements/feedback/alert/style.css +1 -1
- package/src/elements/feedback/empty/style.css +1 -1
- package/src/elements/feedback/progress/style.css +1 -1
- package/src/elements/feedback/toast/style.css +1 -1
- package/src/elements/forms/checkbox/style.css +1 -1
- package/src/elements/forms/field/style.css +1 -1
- package/src/elements/forms/input/style.css +1 -1
- package/src/elements/forms/radio/style.css +1 -1
- package/src/elements/forms/select/style.css +1 -1
- package/src/elements/forms/textarea/style.css +1 -1
- package/src/elements/forms/toggle/style.css +1 -1
- package/src/elements/forms/upload/style.css +1 -1
- package/src/elements/layout/app/style.css +1 -1
- package/src/elements/navigation/breadcrumb/style.css +1 -1
- package/src/elements/navigation/nav/style.css +1 -1
- package/src/elements/navigation/pagination/style.css +1 -1
- package/src/elements/navigation/steps/style.css +1 -1
- package/src/elements/navigation/tabs/style.css +1 -1
- package/src/elements/overlay/dialog/style.css +1 -1
- package/src/elements/overlay/drawer/style.css +1 -1
- package/src/elements/overlay/menu/style.css +1 -1
- package/src/elements/overlay/popover/style.css +1 -1
- package/src/elements/overlay/sheet/style.css +1 -1
- package/src/elements/overlay/tooltip/style.css +1 -1
- package/src/elements/primitives/avatar/style.css +1 -1
- package/src/elements/primitives/badge/style.css +1 -1
- package/src/elements/primitives/button/style.css +1 -1
- package/src/elements/primitives/text/style.css +1 -1
- package/src/styles/base.css +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,34 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
+
## [0.4.1] — 2026-06-14
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **URL Detection Bug**: Fixed a critical bug in both the JS runtime (`utils.js`, `element.js`) and the Rust compiler (`parse.rs`) where inline CSS strings starting with `/*` or `<!--` were mistakenly identified as file URLs. This bug was bypassing inline CSS injection when providing CSS string arrays.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## [0.4.0] — 2026-06-14
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- 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.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Replaced CSS Custom Highlight API implementation with PrismJS for `view-code` syntax highlighting.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## [0.3.9] — 2026-06-13
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
- Updated core component rendering to correctly process nested syntax logic and perform full syntax highlighting.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
20
48
|
## [0.3.7] — 2026-06-13
|
|
21
49
|
|
|
22
50
|
### Changed
|
|
Binary file
|
package/bin/anza/anza-linux-x64
CHANGED
|
Binary file
|
|
Binary file
|
package/bin/anza/anza-macos-x64
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -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
|
|
|
@@ -49,41 +49,49 @@ export function element(tag, spec, base) {
|
|
|
49
49
|
warnMissingBase(tag, 'style', spec.style, base);
|
|
50
50
|
warnMissingBase(tag, 'template', spec.template, base);
|
|
51
51
|
|
|
52
|
+
const isStyleUrl = s => typeof s === 'string' && (s.endsWith('.css') || ((s.startsWith('./') || s.startsWith('/')) && !s.startsWith('/*') && !s.includes('{')));
|
|
53
|
+
const isTemplateUrl = s => typeof s === 'string' && (s.endsWith('.html') || ((s.startsWith('./') || s.startsWith('/')) && !s.startsWith('<!--') && !s.includes('<')));
|
|
54
|
+
|
|
52
55
|
// Resolve absolute URLs relative to import.meta.url (base)
|
|
53
|
-
const
|
|
54
|
-
? new URL(
|
|
55
|
-
:
|
|
56
|
-
|
|
56
|
+
const styleUrls = Array.isArray(spec.style)
|
|
57
|
+
? spec.style.filter(s => s && base && isStyleUrl(s)).map(s => new URL(s, base).href)
|
|
58
|
+
: (spec.style && base && isStyleUrl(spec.style)
|
|
59
|
+
? [new URL(spec.style, base).href]
|
|
60
|
+
: []);
|
|
61
|
+
|
|
62
|
+
const templateUrl = spec.template && base && isTemplateUrl(spec.template)
|
|
57
63
|
? new URL(spec.template, base).href
|
|
58
64
|
: null;
|
|
59
65
|
|
|
60
66
|
// Initiate resource fetching exactly once per component registration (R-06)
|
|
61
67
|
let resolved = null;
|
|
62
|
-
let resourcesPromise = preloadResources(tag,
|
|
68
|
+
let resourcesPromise = preloadResources(tag, styleUrls, templateUrl, spec.template, spec.style).then(res => {
|
|
63
69
|
resolved = res;
|
|
64
70
|
return res;
|
|
65
71
|
});
|
|
66
72
|
|
|
67
73
|
// Handle hot reloading of constructable stylesheets (one global listener per unique styleUrl - R-05)
|
|
68
|
-
if (
|
|
74
|
+
if (styleUrls.length > 0 && typeof window !== 'undefined') {
|
|
69
75
|
if (!window.__native_hmr_listeners__) {
|
|
70
76
|
window.__native_hmr_listeners__ = new Set();
|
|
71
77
|
}
|
|
72
|
-
|
|
73
|
-
window.__native_hmr_listeners__.
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
for (const styleUrl of styleUrls) {
|
|
79
|
+
if (!window.__native_hmr_listeners__.has(styleUrl)) {
|
|
80
|
+
window.__native_hmr_listeners__.add(styleUrl);
|
|
81
|
+
const hmrHandler = async (e) => {
|
|
82
|
+
const { path: changedPath, css } = e.detail;
|
|
83
|
+
const absoluteChangedUrl = new URL(changedPath, window.location.origin).href;
|
|
84
|
+
|
|
85
|
+
if (styleUrl === absoluteChangedUrl || styleUrl.endsWith(changedPath)) {
|
|
86
|
+
const sheet = assetCache.get(styleUrl);
|
|
87
|
+
if (sheet && typeof sheet.replaceSync === 'function') {
|
|
88
|
+
sheet.replaceSync(css);
|
|
89
|
+
console.log(`[HMR] Shared AdoptedStyleSheet hot-swapped for <${tag}>`);
|
|
90
|
+
}
|
|
83
91
|
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
};
|
|
93
|
+
window.addEventListener('anza:hmr:css', hmrHandler);
|
|
94
|
+
}
|
|
87
95
|
}
|
|
88
96
|
}
|
|
89
97
|
|
|
@@ -100,7 +108,7 @@ export function element(tag, spec, base) {
|
|
|
100
108
|
|
|
101
109
|
if (templateUrl === absoluteChangedUrl || templateUrl.endsWith(changedPath)) {
|
|
102
110
|
// Re-parse HTML into the cached resolved object
|
|
103
|
-
resourcesPromise = preloadResources(tag,
|
|
111
|
+
resourcesPromise = preloadResources(tag, styleUrls, null, html, spec.style).then(res => {
|
|
104
112
|
resolved = res;
|
|
105
113
|
// Now re-bind instances!
|
|
106
114
|
const instances = window.__native_hmr_instances__?.get(tag) || [];
|
|
@@ -169,7 +177,7 @@ export function element(tag, spec, base) {
|
|
|
169
177
|
if (!res) {
|
|
170
178
|
res = await resourcesPromise;
|
|
171
179
|
}
|
|
172
|
-
const { templateNode,
|
|
180
|
+
const { templateNode, stylesheets, cssText, tagsDescriptor } = res;
|
|
173
181
|
|
|
174
182
|
if (!this.ctrl || this.ctrl.signal.aborted || !this.isConnected) {
|
|
175
183
|
return;
|
|
@@ -186,9 +194,9 @@ export function element(tag, spec, base) {
|
|
|
186
194
|
this.shadowRoot.appendChild(templateNode.cloneNode(true));
|
|
187
195
|
}
|
|
188
196
|
|
|
189
|
-
if (
|
|
197
|
+
if (stylesheets && stylesheets.length > 0) {
|
|
190
198
|
// Constructable stylesheets path
|
|
191
|
-
this.shadowRoot.adoptedStyleSheets =
|
|
199
|
+
this.shadowRoot.adoptedStyleSheets = stylesheets;
|
|
192
200
|
} else if (cssText) {
|
|
193
201
|
// Fallback: inject <style> for browsers without adoptedStyleSheets
|
|
194
202
|
const style = document.createElement('style');
|
|
@@ -263,13 +271,13 @@ export function element(tag, spec, base) {
|
|
|
263
271
|
if (!res) {
|
|
264
272
|
res = await resourcesPromise;
|
|
265
273
|
}
|
|
266
|
-
const { templateNode,
|
|
274
|
+
const { templateNode, stylesheets, cssText, tagsDescriptor } = res;
|
|
267
275
|
|
|
268
276
|
if (templateNode) {
|
|
269
277
|
this.shadowRoot.appendChild(templateNode.cloneNode(true));
|
|
270
278
|
}
|
|
271
|
-
if (
|
|
272
|
-
this.shadowRoot.adoptedStyleSheets =
|
|
279
|
+
if (stylesheets && stylesheets.length > 0) {
|
|
280
|
+
this.shadowRoot.adoptedStyleSheets = stylesheets;
|
|
273
281
|
} else if (cssText) {
|
|
274
282
|
const style = document.createElement('style');
|
|
275
283
|
style.textContent = cssText;
|
|
@@ -8,52 +8,66 @@ const supportsSheets =
|
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Preloads style and HTML template resources asynchronously exactly once.
|
|
11
|
-
* Returns { templateNode,
|
|
12
|
-
* When constructable stylesheets are unsupported,
|
|
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,
|
|
15
|
+
export async function preloadResources(tag, styleUrls, templateUrl, inlineTemplate, inlineStyle) {
|
|
16
16
|
let templateNode = null;
|
|
17
|
-
let
|
|
18
|
-
let
|
|
17
|
+
let stylesheets = [];
|
|
18
|
+
let cssTextAcc = '';
|
|
19
19
|
let tagsDescriptor = null;
|
|
20
20
|
|
|
21
21
|
// Compile / Fetch styles
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
28
|
+
stylesheets.push(cached);
|
|
27
29
|
} else {
|
|
28
|
-
|
|
30
|
+
cssTextAcc += cached + '\n';
|
|
29
31
|
}
|
|
30
32
|
} else {
|
|
31
33
|
try {
|
|
32
|
-
const res = await fetch(
|
|
34
|
+
const res = await fetch(url);
|
|
33
35
|
if (res.ok) {
|
|
34
36
|
const css = await res.text();
|
|
35
37
|
if (supportsSheets) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
assetCache.set(
|
|
38
|
+
const sheet = new CSSStyleSheet();
|
|
39
|
+
sheet.replaceSync(css);
|
|
40
|
+
assetCache.set(url, sheet);
|
|
41
|
+
stylesheets.push(sheet);
|
|
39
42
|
} else {
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
if (inlineStyle) {
|
|
54
|
+
const inlineStyles = Array.isArray(inlineStyle) ? inlineStyle : [inlineStyle];
|
|
55
|
+
// Filter out ones that are likely URLs (they were fetched above)
|
|
56
|
+
const isUrl = s => typeof s === 'string' && (s.endsWith('.css') || ((s.startsWith('./') || s.startsWith('/')) && !s.startsWith('/*') && !s.includes('{')));
|
|
57
|
+
const inlines = inlineStyles.filter(s => !isUrl(s));
|
|
58
|
+
for (const style of inlines) {
|
|
59
|
+
if (supportsSheets) {
|
|
60
|
+
const sheet = new CSSStyleSheet();
|
|
61
|
+
sheet.replaceSync(style);
|
|
62
|
+
stylesheets.push(sheet);
|
|
63
|
+
} else {
|
|
64
|
+
cssTextAcc += style + '\n';
|
|
65
|
+
}
|
|
54
66
|
}
|
|
55
67
|
}
|
|
56
68
|
|
|
69
|
+
const cssText = cssTextAcc.trim() ? cssTextAcc : null;
|
|
70
|
+
|
|
57
71
|
// Compile / Fetch Template markup
|
|
58
72
|
if (templateUrl) {
|
|
59
73
|
if (assetCache.has(templateUrl)) {
|
|
@@ -91,7 +105,7 @@ export async function preloadResources(tag, styleUrl, templateUrl, inlineTemplat
|
|
|
91
105
|
templateNode = createTemplateFragment(inlineTemplate);
|
|
92
106
|
}
|
|
93
107
|
|
|
94
|
-
return { templateNode,
|
|
108
|
+
return { templateNode, stylesheets, cssText, tagsDescriptor };
|
|
95
109
|
}
|
|
96
110
|
|
|
97
111
|
/**
|
|
@@ -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-
|
|
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),
|
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
8
|
+
--text-family: var(--font-sans);
|
|
9
9
|
--text-height: var(--line-height-normal);
|
|
10
10
|
--text-color: var(--color-content-primary);
|
|
11
11
|
}
|
package/src/styles/base.css
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
@layer base {
|
|
10
10
|
:root {
|
|
11
|
-
font-family: var(--font-
|
|
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-
|
|
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);
|