@symbiotejs/symbiote 3.4.2 → 3.4.4
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/AI_REFERENCE.md +2 -2
- package/CHANGELOG.md +18 -0
- package/README.md +9 -8
- package/core/Symbiote.js +12 -2
- package/core/dictionary.js +1 -1
- package/node/SSR.js +24 -4
- package/package.json +1 -1
- package/types/core/Symbiote.d.ts.map +1 -1
- package/types/node/SSR.d.ts.map +1 -1
package/AI_REFERENCE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Symbiote.js — AI Context Reference (v3.x)
|
|
2
2
|
|
|
3
3
|
> **Purpose**: Authoritative reference for AI code assistants. All information is derived from source code analysis of [symbiote.js](https://github.com/symbiotejs/symbiote.js).
|
|
4
|
-
> Current version: **3.
|
|
4
|
+
> Current version: **3.4.3**. Zero dependencies. ~6.3 KB brotli / ~7 KB gzip.
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -153,7 +153,7 @@ Prefixes control which data context a binding resolves to:
|
|
|
153
153
|
| Prefix | Meaning | Example | Description |
|
|
154
154
|
|--------|---------|---------|-------------|
|
|
155
155
|
| _(none)_ | Local state | `{{count}}` | Current component's local context |
|
|
156
|
-
| `^` |
|
|
156
|
+
| `^` | Pop-up | `{{^parentProp}}` | Walk up DOM ancestry to find nearest component that has this prop in its data context (`init$` / `add$()`) |
|
|
157
157
|
| `*` | Shared context | `{{*sharedProp}}` | Shared context scoped by `ctx` attribute or CSS `--ctx` |
|
|
158
158
|
| `/` | Named context | `{{APP/myProp}}` | Global named context identified by key before `/` |
|
|
159
159
|
| `--` | CSS Data | `{{--my-css-var}}` | Read value from CSS custom property |
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.4.4
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **SSR: `isVirtual` components.** `renderToString` and `renderToStream` now detect `isVirtual` elements and serialize the replacement template nodes instead of the detached custom element wrapper. Previously, virtual components produced an empty `<tag-name></tag-name>` in SSR output.
|
|
8
|
+
|
|
9
|
+
- **SSR: `allowCustomTemplate` with `use-template` attribute.** `DocumentFragment` detection in `render()` used `constructor === DocumentFragment`, which fails in linkedom where `template.content.cloneNode()` returns a fragment with a different internal constructor. Changed to `nodeType === 11` — spec-correct and works in both browser and linkedom. Previously, custom templates were silently ignored during SSR.
|
|
10
|
+
|
|
11
|
+
## 3.4.3
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **SSR: shared context props (`*prop`) with `ctx` attribute.** `getCssData()` attempted `window.getComputedStyle()` during server-side rendering, which is unavailable in linkedom. Now returns `null` immediately when `globalThis.__SYMBIOTE_SSR` is set, skipping all computed CSS reads on the server.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **DevMode warning for CSS data bindings in SSR/ISO mode.** When `devMode = true` and the component has `ssrMode` or `isoMode`, a `console.warn` fires for each `bindCssData` call — computed styles are unavailable during SSR, so the init value is used instead.
|
|
20
|
+
|
|
3
21
|
## 3.4.2
|
|
4
22
|
|
|
5
23
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[](https://github.com/symbiotejs/symbiote.js/actions/workflows/tests.yml)
|
|
2
2
|
[](https://www.npmjs.com/package/@symbiotejs/symbiote)
|
|
3
3
|
[](https://www.npmjs.com/package/@symbiotejs/symbiote)
|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
<img src="https://rnd-pro.com/svg/symbiote/index.svg" width="200" alt="Symbiote.js">
|
|
11
11
|
|
|
12
|
-
A lightweight, standards-first UI library built on Web Components. No virtual DOM, no compiler, no build step required — works directly in the browser. A bundler is recommended for production performance, but entirely optional. **~
|
|
12
|
+
A lightweight, standards-first UI library built on Web Components. No virtual DOM, no compiler, no build step required — works directly in the browser. A bundler is recommended for production performance, but entirely optional. **~6.3kb** brotli / **~7kb** gzip.
|
|
13
13
|
|
|
14
14
|
Symbiote.js gives you the convenience of a modern framework while staying close to the native platform — HTML, CSS, and DOM APIs. Components are real custom elements that work everywhere: in any framework, in plain HTML, or in a micro-frontend architecture. And with **isomorphic mode**, the same component code works on the server and the client — server-rendered pages hydrate automatically, no diffing, no mismatch errors.
|
|
15
15
|
|
|
@@ -168,7 +168,7 @@ class TaskList extends Symbiote {
|
|
|
168
168
|
{ name: 'Write docs' },
|
|
169
169
|
];
|
|
170
170
|
init$ = {
|
|
171
|
-
// Needs to be defined in init$ for
|
|
171
|
+
// Needs to be defined in init$ for pop-up binding to work
|
|
172
172
|
onItemClick: () => {
|
|
173
173
|
console.log('clicked!');
|
|
174
174
|
},
|
|
@@ -186,7 +186,7 @@ TaskList.template = html`
|
|
|
186
186
|
|
|
187
187
|
Items have their own state scope. Use the **`^` prefix** to reach higher-level component properties and handlers — `'^onItemClick'` binds to the parent's `onItemClick`, not the item's. Properties referenced via `^` must be defined in the parent's `init$`.
|
|
188
188
|
|
|
189
|
-
###
|
|
189
|
+
### Pop-up binding (`^`)
|
|
190
190
|
|
|
191
191
|
The `^` prefix works in any nested component template — it walks up the DOM tree to find the nearest ancestor that has the property registered in its data context (`init$` or `add$()`):
|
|
192
192
|
|
|
@@ -344,11 +344,12 @@ CSS values are parsed automatically — quoted strings become strings, numbers b
|
|
|
344
344
|
|
|
345
345
|
| Library | Minified | Gzip | Brotli |
|
|
346
346
|
|---------|----------|------|--------|
|
|
347
|
-
| **Symbiote.js** (
|
|
348
|
-
| **
|
|
349
|
-
| **
|
|
347
|
+
| **Symbiote.js** (core) | 19.8 kb | 6.9 kb | **6.3 kb** |
|
|
348
|
+
| **Symbiote.js** (full, with AppRouter) | 24.0 kb | 8.3 kb | **7.5 kb** |
|
|
349
|
+
| **Lit** 3.3 | 15.5 kb | 6.0 kb | **~5.1 kb** |
|
|
350
|
+
| **React 19 + ReactDOM** | ~186 kb | ~59 kb | **~50 kb** |
|
|
350
351
|
|
|
351
|
-
Symbiote and Lit have similar base sizes, but Symbiote's **
|
|
352
|
+
Symbiote and Lit have similar base sizes, but Symbiote's **6.3 kb** core includes more built-in features: global state management, lists (itemize API), exit animations, computed properties etc. Lit needs additional packages for comparable features. React is **~8× larger** before adding a router, state manager, or SSR framework.
|
|
352
353
|
|
|
353
354
|
## Browser support
|
|
354
355
|
|
package/core/Symbiote.js
CHANGED
|
@@ -120,8 +120,9 @@ export class Symbiote extends HTMLElement {
|
|
|
120
120
|
this.#super.__tpl = document.createElement('template');
|
|
121
121
|
this.#super.__tpl.innerHTML = trustedHTML.createHTML(this.#super.template);
|
|
122
122
|
}
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
// @ts-expect-error - nodeType works for both DOM nodes and linkedom fragments
|
|
124
|
+
if (template?.nodeType === 11) {
|
|
125
|
+
fr = /** @type {DocumentFragment} */ (template);
|
|
125
126
|
} else if (template?.constructor === String) {
|
|
126
127
|
let tpl = document.createElement('template');
|
|
127
128
|
tpl.innerHTML = trustedHTML.createHTML(template);
|
|
@@ -598,6 +599,9 @@ export class Symbiote extends HTMLElement {
|
|
|
598
599
|
* @param {Boolean} [silentCheck]
|
|
599
600
|
*/
|
|
600
601
|
getCssData(propName, silentCheck = false) {
|
|
602
|
+
if (globalThis.__SYMBIOTE_SSR) {
|
|
603
|
+
return null;
|
|
604
|
+
}
|
|
601
605
|
if (!this.#cssDataCache) {
|
|
602
606
|
this.#cssDataCache = Object.create(null);
|
|
603
607
|
}
|
|
@@ -639,6 +643,12 @@ export class Symbiote extends HTMLElement {
|
|
|
639
643
|
* @param {any} [initValue] Uses empty string by default to make value useful in template
|
|
640
644
|
*/
|
|
641
645
|
bindCssData(propName, initValue = '') {
|
|
646
|
+
if (Symbiote.#devMode && (this.ssrMode || this.isoMode)) {
|
|
647
|
+
console.warn(
|
|
648
|
+
`[Symbiote dev] <${this.localName}>: CSS data binding "${propName}" will not read computed styles during SSR. `
|
|
649
|
+
+ 'The init value will be used instead.'
|
|
650
|
+
);
|
|
651
|
+
}
|
|
642
652
|
if (!this.#boundCssProps) {
|
|
643
653
|
this.#boundCssProps = new Set();
|
|
644
654
|
}
|
package/core/dictionary.js
CHANGED
package/node/SSR.js
CHANGED
|
@@ -410,8 +410,19 @@ export class SSR {
|
|
|
410
410
|
el.setAttribute(key, String(val));
|
|
411
411
|
}
|
|
412
412
|
SSR.#doc.body.appendChild(el);
|
|
413
|
-
let html
|
|
414
|
-
|
|
413
|
+
let html;
|
|
414
|
+
// isVirtual replaces the element with its template fragment:
|
|
415
|
+
if (/** @type {any} */ (el).isVirtual) {
|
|
416
|
+
let emittedStyles = new Set();
|
|
417
|
+
html = '';
|
|
418
|
+
for (let child of SSR.#doc.body.childNodes) {
|
|
419
|
+
html += serializeNode(child, emittedStyles, options.nonce);
|
|
420
|
+
}
|
|
421
|
+
} else {
|
|
422
|
+
html = serializeElement(el, new Set(), options.nonce);
|
|
423
|
+
el.remove();
|
|
424
|
+
}
|
|
425
|
+
SSR.#doc.body.innerHTML = '';
|
|
415
426
|
return html;
|
|
416
427
|
}
|
|
417
428
|
|
|
@@ -433,8 +444,17 @@ export class SSR {
|
|
|
433
444
|
el.setAttribute(key, String(val));
|
|
434
445
|
}
|
|
435
446
|
SSR.#doc.body.appendChild(el);
|
|
436
|
-
|
|
437
|
-
el.
|
|
447
|
+
// isVirtual replaces the element with its template fragment:
|
|
448
|
+
if (/** @type {any} */ (el).isVirtual) {
|
|
449
|
+
let emittedStyles = new Set();
|
|
450
|
+
for (let child of SSR.#doc.body.childNodes) {
|
|
451
|
+
yield* streamNode(child, emittedStyles, options.nonce);
|
|
452
|
+
}
|
|
453
|
+
} else {
|
|
454
|
+
yield* streamElement(el, new Set(), options.nonce);
|
|
455
|
+
el.remove();
|
|
456
|
+
}
|
|
457
|
+
SSR.#doc.body.innerHTML = '';
|
|
438
458
|
}
|
|
439
459
|
}
|
|
440
460
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@symbiotejs/symbiote",
|
|
4
|
-
"version": "3.4.
|
|
4
|
+
"version": "3.4.4",
|
|
5
5
|
"description": "Symbiote.js - zero-dependency close-to-platform frontend library to build super-powered web components",
|
|
6
6
|
"author": "team@rnd-pro.com",
|
|
7
7
|
"license": "MIT",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Symbiote.d.ts","sourceRoot":"","sources":["../../core/Symbiote.js"],"names":[],"mappings":";;AAmBA,sBADc,CAAC;IAuBb,cADW,mBAAmB,CACjB;IAGb,sCAAwB;IAExB,iCAGC;IAED,8BAEC;IAkBD,wBAAgB;
|
|
1
|
+
{"version":3,"file":"Symbiote.d.ts","sourceRoot":"","sources":["../../core/Symbiote.js"],"names":[],"mappings":";;AAmBA,sBADc,CAAC;IAuBb,cADW,mBAAmB,CACjB;IAGb,sCAAwB;IAExB,iCAGC;IAED,8BAEC;IAkBD,wBAAgB;IA0JhB,+BAJwB,CAAC,SAAZ,aAAU,uBAEZ,CAAC;;;MAuCX;IAmPD,qCAA+B;IAoC/B,iDAFa,OAAO,QAAQ,CAqB3B;IAED,wBAKC;IAGD;;aAOC;IAsHD,6BADY,SAAS,aAAa,QAOjC;IAGD,+BADY,SAAS,aAAa,QAOjC;IAGD,8BADY,SAAS,aAAa,EAIjC;IAGD,gCADY,SAAS,aAAa,EAIjC;IAnjBD,cA6BC;IArID,gCAEC;IAED,qBAAiB;IACjB,uBAAmB;IAiBnB,kBAHW,SAAS,gBAAgB,0BAmFnC;IApDG,aAAiD;IAyDnD,OADW,CAAC,CACoB;IAEhC;;MAAmC;IAEnC,oBADW,GAAG,CAAC,CAAC,EAAE,EAAE,gBAAgB,gBAAW,EAAE,KAAK,eAAU,KAAK,IAAI,CAAC,CACvC;IAEnC;;MAA8B;IAC9B,kBAAwB;IAExB,qBAAwB;IAExB,sBAAyB;IAEzB,wBAA0B;IAE1B,0BAA6B;IAI7B,iBAAoB;IAEpB,6BAAgC;IAEhC,mBAAsB;IAEtB,4BAA8B;IAIhC,yBAEC;IAGD,sBASC;IAGD,4BAKC;IAGD,6BAEC;IAoDD,IALuB,CAAC,SAAX,MAAO,CAAE,QACX,CAAC,WACD,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,wBAmB/B;IAGD,2BAGC;IAGD,uBAGC;IAQD,IALuB,CAAC,SAAX,MAAO,CAAE,qBAEX,CAAC,CAAC,CAAC,CAAC,2BAMd;IAMD,UAHW,OAAO,CAAC,CAAC,CAAC,2BAOpB;IAGD,SADc,CAAC,CA2Bd;IAMD,YAHW,OAAO,CAAC,CAAC,CAAC,mCAcpB;IAED,8BAgBC;IAdG,4CASE;IAwFF,0BAAwC;IAwB1C,uBAAyB;IAG3B,0BAEC;IAED,wBAAoB;IAUpB,yBAAuB;IACvB,6BA0BC;IA6CD,oEAeC;IAMD,yDAoBC;IAYD,0BAME;IAMF,0CAFW,GAAG,QAmBb;IAED,yBAGC;IAOD,8EAmBC;;CA+BF;;mBAntBkB,aAAa;qBACX,iBAAiB;2BACX,iBAAiB"}
|
package/types/node/SSR.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SSR.d.ts","sourceRoot":"","sources":["../../node/SSR.js"],"names":[],"mappings":"AAsQA;IAEE,8BAAmB;IACnB,8BAAmB;IAMnB;;;OAkEC;IAMD,uBAeC;IAkBD,yBAZW,MAAM,YACN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CA0B3B;IAWD,+BALW,MAAM;;iBAEN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAChB,MAAM,
|
|
1
|
+
{"version":3,"file":"SSR.d.ts","sourceRoot":"","sources":["../../node/SSR.js"],"names":[],"mappings":"AAsQA;IAEE,8BAAmB;IACnB,8BAAmB;IAMnB;;;OAkEC;IAMD,uBAeC;IAkBD,yBAZW,MAAM,YACN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CA0B3B;IAWD,+BALW,MAAM;;iBAEN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAChB,MAAM,CAyBlB;IAWD,+BALW,MAAM;;iBAEN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAChB,cAAc,CAAC,MAAM,CAAC,CAsBlC;CACF"}
|