@realmorg/realm 0.0.18 → 2.0.0-alpha.2
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/README.md +75 -20
- package/dist/chunks/assemble-Dy07wr-3.js +24 -0
- package/dist/chunks/src-7--Nyd4c.js +3 -0
- package/dist/compiler.js +1 -0
- package/dist/index.js +1 -0
- package/dist/realm.css +14 -9
- package/dist/realm.js +1 -0
- package/dist/types/assemble.d.ts +10 -0
- package/dist/types/auto.d.ts +1 -0
- package/dist/types/bindings.d.ts +8 -0
- package/dist/types/compiler.d.ts +7 -0
- package/dist/types/css.d.ts +8 -0
- package/dist/types/definition.d.ts +3 -0
- package/dist/types/element.d.ts +47 -0
- package/dist/types/fetch.d.ts +3 -0
- package/dist/types/focusgroup.d.ts +2 -0
- package/dist/types/forms.d.ts +2 -0
- package/dist/types/handlers.d.ts +2 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/loader.d.ts +7 -0
- package/dist/types/log.d.ts +2 -0
- package/dist/types/map.d.ts +1 -0
- package/dist/types/props-runtime.d.ts +3 -0
- package/dist/types/props.d.ts +55 -0
- package/dist/types/reactivity.d.ts +8 -0
- package/dist/types/registry.d.ts +7 -0
- package/dist/types/sanitize.d.ts +4 -0
- package/dist/types/scan.d.ts +17 -0
- package/dist/types/scope.d.ts +20 -0
- package/dist/types/signal.d.ts +1 -0
- package/dist/types/start.d.ts +1 -0
- package/dist/types/store.d.ts +2 -0
- package/dist/types/time.d.ts +4 -0
- package/dist/types/types.d.ts +59 -0
- package/package.json +52 -25
- package/dist/realm.development.js +0 -2518
- package/dist/realm.production.min.js +0 -11
- package/dist/realm.production.min.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<a href="https://realm.
|
|
2
|
+
<a href="https://realm.js.org" target="_blank">
|
|
3
3
|
<picture>
|
|
4
4
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/realmorg/realm/HEAD/.github/dark-logo.png">
|
|
5
5
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/realmorg/realm/HEAD/.github/light-logo.png">
|
|
@@ -8,27 +8,82 @@
|
|
|
8
8
|
</a>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
-
<p align="center">
|
|
12
|
-
REALM (Reactive-Lightweight Markup Language). HTML framework for building MVP.
|
|
13
|
-
</p>
|
|
11
|
+
<p align="center">Native web components, written in plain HTML. No compiler, no build step.</p>
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
Add two tags from the CDN to any HTML page:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@realmorg/realm@alpha/dist/realm.css">
|
|
19
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@realmorg/realm@alpha/dist/realm.js"></script>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For the ready-made `ui-*` components, add the REALM UI theme and bundle:
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@realmorg/ui@alpha/dist/theme.css">
|
|
26
|
+
<import-element from="https://cdn.jsdelivr.net/npm/@realmorg/ui@alpha/dist/ui.html"></import-element>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Pin an exact version (for example `@realmorg/realm@2.0.0-alpha.1`) in production.
|
|
30
|
+
|
|
31
|
+
## A component
|
|
32
|
+
|
|
33
|
+
A REALM component is one `<custom-element>` tag holding a `<script>`, a `<style>` and markup:
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
|
|
37
|
+
<custom-element name="click-counter">
|
|
38
|
+
<script type="realm">
|
|
39
|
+
const props = defineProps({ step: prop.number().default(1) });
|
|
40
|
+
const counter = useState({ count: 0 });
|
|
41
|
+
|
|
42
|
+
function add() {
|
|
43
|
+
counter.count += props.step;
|
|
44
|
+
}
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
button { font: inherit; }
|
|
49
|
+
</style>
|
|
50
|
+
|
|
51
|
+
<button onclick="add()">Clicked <slot name="#counter.count">0</slot> times</button>
|
|
52
|
+
</custom-element>
|
|
53
|
+
|
|
54
|
+
<click-counter step="2"></click-counter>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- Values show through native `<slot name="#state.path">`. Attributes bind with `_href="#link.url"`. Events use native `onclick`.
|
|
58
|
+
- `fetch`, `into`, `render` and `busy` attributes make requests without code.
|
|
59
|
+
- Components can act as form fields, stop their listeners and requests when removed, and style themselves from reactive CSS states.
|
|
60
|
+
- About 16 KB gzipped. Works in current Chrome, Edge, Firefox and Safari.
|
|
61
|
+
|
|
62
|
+
## Packages
|
|
63
|
+
|
|
64
|
+
REALM and REALM UI load from the CDN. The Vite plugin is an optional dev tool installed from npm.
|
|
65
|
+
|
|
66
|
+
| Package | |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| `@realmorg/realm` | The runtime |
|
|
69
|
+
| `@realmorg/ui` | About 60 accessible components, built with REALM |
|
|
70
|
+
| `@realmorg/vite-plugin` | Optional, for projects that already use Vite: pre-assembles components for strict Content Security Policies and writes `custom-elements.json` |
|
|
71
|
+
|
|
72
|
+
Docs, a tutorial and live examples are at [realm.js.org](https://realm.js.org). [llms.txt](https://realm.js.org/llms.txt) lists the same docs in Markdown for code assistants.
|
|
73
|
+
|
|
74
|
+
## Development
|
|
75
|
+
|
|
76
|
+
The repository holds the runtime, the UI library, the Vite plugin, the website and example apps (a todo list, a kanban board, chess, a dashboard, a weather app and a contacts app). See `AGENTS.md` for the rules and commands, `PLAN.md` for the design, and `openspec/specs` for the specification. Every scenario in the specification has a test, and the runtime keeps 100% test coverage in Chromium, Firefox and WebKit.
|
|
23
77
|
|
|
24
|
-
|
|
25
|
-
|
|
78
|
+
```bash
|
|
79
|
+
pnpm install
|
|
80
|
+
pnpm build
|
|
81
|
+
pnpm --filter @realmorg/realm coverage
|
|
82
|
+
pnpm --filter site test
|
|
83
|
+
```
|
|
26
84
|
|
|
27
|
-
|
|
28
|
-
Realm is an HTML framework for building MVP. It is designed to be simple, lightweight, and easy to use. Realm is built on top of Native web components. No-tooling, No-bundler, less javascript. Just take care of your product and ship it fast.
|
|
85
|
+
REALM v1 is archived under the `v1-final` tag.
|
|
29
86
|
|
|
30
|
-
##
|
|
31
|
-
Please see [CONTRIBUTING.md](https://github.com/realmorg/realm/blob/main/.github/CONTRIBUTING.md).
|
|
87
|
+
## License
|
|
32
88
|
|
|
33
|
-
|
|
34
|
-
Copyright 2023 - [MIT License](https://github.com/realmorg/realm/blob/main/LICENSE).
|
|
89
|
+
MIT
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
var e=`>>>= ... === !== **= <<= >>= >>> &&= ||= ??= => == != <= >= && || ?? ?. ++ -- += -= *= /= %= &= |= ^= ** << >>`.split(` `),t=new Set(`return typeof instanceof in of new delete void throw case do else yield await`.split(` `)),n=new Set(`await break case catch class const continue debugger default delete do else export extends false finally for function if import in instanceof let new null of return static super switch this throw true try typeof var void while with yield async arguments undefined NaN Infinity globalThis eval enum implements interface package private protected public`.split(` `)),r=e=>/[A-Za-z_$\u0080-]/.test(e),i=e=>/[\w$\u0080-]/.test(e),a=e=>e?e.type===`name`?t.has(e.value):e.type===`punct`&&e.value!==`)`&&e.value!==`]`:!0,o=t=>{let n=[],o=0,s=!1,c=(e,t)=>{n.push({type:e,value:t,newline:s}),s=!1},l=(e,n)=>{let r=e+1;for(;r<t.length&&t[r]!==n;)r+=t[r]===`\\`?2:1;return r+1},u=e=>{let n=e+1;for(;n<t.length&&t[n]!=="`";)t[n]===`\\`?n+=2:t[n]===`$`&&t[n+1]===`{`?n=d(n+2):n++;return n+1},d=e=>{let n=0,r=e;for(;r<t.length;){let e=t[r];if(e===`'`||e===`"`)r=l(r,e);else if(e==="`")r=u(r);else if(e===`{`)n++,r++;else if(e===`}`){if(n===0)return r+1;n--,r++}else r++}return r};for(;o<t.length;){let d=t[o],f=t[o+1];if(d===`
|
|
2
|
+
`)s=!0,o++;else if(/\s/.test(d))o++;else if(d===`/`&&f===`/`)for(;o<t.length&&t[o]!==`
|
|
3
|
+
`;)o++;else if(d===`/`&&f===`*`){let e=t.indexOf(`*/`,o+2),n=e===-1?t.length:e+2;t.slice(o,n).includes(`
|
|
4
|
+
`)&&(s=!0),o=n}else if(d===`'`||d===`"`){let e=l(o,d);c(`string`,t.slice(o,e)),o=e}else if(d==="`"){let e=u(o);c(`template`,t.slice(o,e)),o=e}else if(/\d/.test(d)||d===`.`&&/\d/.test(f??``)){let e=o+1;for(;e<t.length&&/[\w.]/.test(t[e]);)e++;c(`number`,t.slice(o,e)),o=e}else if(r(d)){let e=o+1;for(;e<t.length&&i(t[e]);)e++;c(`name`,t.slice(o,e)),o=e}else if(d===`/`&&a(n.at(-1))){let e=o+1,n=!1;for(;e<t.length;){let r=t[e];if(r===`\\`)e++;else if(r===`[`)n=!0;else if(r===`]`)n=!1;else if(r===`/`&&!n)break;e++}for(e++;e<t.length&&/[a-z]/.test(t[e]);)e++;c(`regex`,t.slice(o,e)),o=e}else{let n=e.find(e=>t.startsWith(e,o))??d;c(`punct`,n),o+=n.length}}return n},s=/* @__PURE__ */ new Set([`(`,`[`,`{`]),c=/* @__PURE__ */ new Set([`)`,`]`,`}`]),l=(e,t)=>e?.type===`punct`&&e.value===t,u=/^(?:[.,?:=+\-*/%&|^<>!~]|=>|\?\.|\(|\[|`)/,d=(e,t)=>e?.type===`punct`&&!c.has(e.value)||t.type===`template`||t.type===`punct`&&u.test(t.value),f=(e,t,n,r)=>{let i=0,a=t;for(;a<e.length;a++){let o=e[a];if(i===0&&(o.type===`punct`&&n.has(o.value)||r&&a>t&&o.newline&&!d(e[a-1],o)))return a;if(o.type===`punct`&&s.has(o.value))i++;else if(o.type===`punct`&&c.has(o.value)){if(i===0)return a;i--}}return a},p=/* @__PURE__ */ new Set([`,`,`}`,`]`]),m=(e,t,n)=>{let r=e[t];if(!r)return t;if(r.type===`name`)return n.push(r.value),t+1;if(!l(r,`{`)&&!l(r,`[`))return t+1;let i=r.value===`{`?`}`:`]`,a=t+1;for(;a<e.length&&!l(e[a],i);){let t=e[a];l(t,`,`)?a++:(l(t,`...`)?a=m(e,a+1,n):i===`}`&&l(e[a+1],`:`)?a=m(e,a+2,n):i===`}`&&l(t,`[`)?(a=f(e,a+1,p,!1)+1,a=l(e[a],`:`)?m(e,a+1,n):a):a=m(e,a,n),l(e[a],`=`)&&(a=f(e,a+1,p,!1)))}return a+1},h=/* @__PURE__ */ new Set([`,`,`;`]),g=(e,t,n)=>{let r=t;for(;r<e.length;){if(r=m(e,r,n),l(e[r],`=`)&&(r=f(e,r+1,h,!0)),!l(e[r],`,`))return r;r++}return r},_=(e,t)=>{let n=e[t-1];return!n||n.type===`punct`&&(n.value===`;`||n.value===`}`)||e[t].newline&&!d(n,e[t])},v=e=>{let t=o(e),n=[],r=0,i=0;for(;i<t.length;){let e=t[i];if(e.type===`punct`){s.has(e.value)?r++:c.has(e.value)&&r--,i++;continue}if(r!==0||e.type!==`name`||!_(t,i)){i++;continue}let a=i;t[a]?.value===`async`&&t[a+1]?.value===`function`&&a++;let o=t[a]?.value;if(o===`function`||o===`class`){a++,l(t[a],`*`)&&a++;let e=t[a];e?.type===`name`&&n.push(e.value),i=a+1}else o===`let`||o===`const`||o===`var`?i=g(t,a+1,n):i++}return new Set(n)},y=e=>{let t=[],n=0,r=-1;for(let i=1;i<e.length-1;i++){let a=e[i];a===`\\`&&n===0?i++:n===0&&a===`$`&&e[i+1]===`{`?(n=1,r=i+2,i++):n>0&&a===`{`?n++:n>0&&a===`}`&&--n===0&&t.push(e.slice(r,i))}return t},b=(e,t=/* @__PURE__ */ new Set)=>{let r=o(e);return r.forEach((e,i)=>{if(e.type===`template`){for(let n of y(e.value))b(n,t);return}if(e.type!==`name`||n.has(e.value))return;let a=r[i-1];l(a,`.`)||l(a,`?.`)||t.add(e.value)}),t},x=/^import\s*(?:([\w$*\s{},]+?)\s*from\s*)?(["'])([^"']+)\2\s*;?/,S=/^(?:\s+|\/\/[^\n]*|\/\*[\s\S]*?\*\/)*/,C=(e,t)=>{let n=e.match(/\{([^}]*)\}/),r=e.replace(/\{[^}]*\}/,``);for(let e of r.split(`,`)){let n=e.trim().split(/\s+as\s+/).at(-1);n&&n!==`*`&&t.add(n)}for(let e of n?.[1]?.split(`,`)??[]){let n=e.trim().split(/\s+as\s+/).at(-1);n&&t.add(n)}},w=(e,t)=>{let n=[],r=/* @__PURE__ */ new Set,i=e;for(;;){let e=i.match(S)[0],a=i.slice(e.length).match(x);if(!a)break;let[o,s=``,c,l=``]=a,u=t&&/^\.{1,2}\//.test(l)?new URL(l,t).href:l;n.push(o.replace(`${c}${l}${c}`,JSON.stringify(u))),C(s,r),i=i.slice(e.length+o.length)}return{imports:n.join(`
|
|
5
|
+
`),body:i,names:r}},T=`defineProps defineMethods listen useState useChildren tick dispatch attrs observe onConnected onDisconnected onFormReset onFormDisabled onFormStateRestore defineStore lookup prop host refs signal internals setTimeout setInterval clearTimeout clearInterval untrack`.split(` `),E=`realm:on`,D=(e,t)=>`${e.join(`,`)}\u0000${t}`,O=(e,t)=>{let n=e.getAttribute(`index`);return[...t,e.getAttribute(`as`)??`item`,...n?[n]:[]]},k=(e,t=[],n=/* @__PURE__ */ new Map)=>{for(let r of e){let e=r.localName===`repeat-list`,i=e||r.hasAttribute(`repeat`)?O(r,t):t;for(let t of r.attributes)(t.name.startsWith(`realm:on`)||t.name.length>2&&t.name.startsWith(`on`))&&!e&&n.set(D(i,t.value),[[...i],t.value]);k(r.children,i,n)}return n},A=(e,t,n)=>{let r=/* @__PURE__ */ new Set([...n,...e,...T,`event`]),i=[...b(t)].filter(e=>!r.has(e));return`function (${[`event`,...e].join(`, `)}) {\n${i.map(e=>`const ${e} = lookup(${JSON.stringify(e)});`).join(`
|
|
6
|
+
`)}\n{\n${t}\n}\n}`},j=(e,t,n)=>{let{imports:r,body:i,names:a}=w(e,t),o=/* @__PURE__ */ new Set([...a,...v(i)]),s=[...o].map(e=>`case ${JSON.stringify(e)}: return ${e};`).join(`
|
|
7
|
+
`);return{imports:r,setup:`function (__realm) {
|
|
8
|
+
"use strict";
|
|
9
|
+
const { ${T.join(`, `)} } = __realm;
|
|
10
|
+
{
|
|
11
|
+
${i}
|
|
12
|
+
return {
|
|
13
|
+
get(__name) {
|
|
14
|
+
switch (__name) {
|
|
15
|
+
${s}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
handlers: [
|
|
19
|
+
${[...n.values()].map(([e,t])=>A(e,t,o)).join(`,
|
|
20
|
+
`)}
|
|
21
|
+
]
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}`,names:o}};export{o as a,j as i,k as n,D as r,E as t};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{i as e,n as t,r as n,t as r}from"./assemble-Dy07wr-3.js";var i=`[realm]`,a=/* @__PURE__ */ new Set,o=e=>console.error(i,e),s=e=>{a.has(e)||(a.add(e),console.warn(i,e))},c=(e,t,n)=>{let r=e;return r.has(t)||r.set(t,n()),r.get(t)},l=Symbol(`realm.raw`),u=Symbol(`realm.iterate`),d=100,f=/* @__PURE__ */ new WeakMap,p=/* @__PURE__ */ new WeakMap,m=/* @__PURE__ */ new Set,h,g=!1,_=e=>{h&&(e.add(h),h.deps.add(e))},v=(e,t)=>{h&&_(c(c(f,e,()=>/* @__PURE__ */ new Map),t,()=>/* @__PURE__ */ new Set))},y=e=>{if(e)for(let t of[...e])t.notify()},b=(e,t)=>y(f.get(e)?.get(t)),x=e=>{for(let t of e.deps)t.delete(e);e.deps.clear()},S=()=>{g||(g=!0,queueMicrotask(C))},C=()=>{g=!1;for(let e=0;m.size;e++){if(e===d){m.clear(),o(/* @__PURE__ */ Error(`Update loop detected: an observer keeps changing state it depends on.`));return}let t=[...m];m.clear();for(let e of t)e.run()}},w=class{fn;deps=/* @__PURE__ */ new Set;#e;#t=!1;constructor(e){this.fn=e}notify(){m.add(this),S()}run(){if(this.#t)return;this.#n();let e=h;h=this;try{let e=this.fn();typeof e==`function`&&(this.#e=e)}catch(e){o(e)}finally{h=e}}stop(){this.#t=!0,m.delete(this),this.#n()}#n(){x(this);let e=this.#e;this.#e=void 0,e?.()}},ee=class{getter;deps=/* @__PURE__ */ new Set;subscribers=/* @__PURE__ */ new Set;dirty=!0;value;error;failed=!1;constructor(e){this.getter=e}notify(){this.dirty||(this.dirty=!0,y(this.subscribers))}get(){if(_(this.subscribers),this.dirty){x(this);let e=h;h=this;try{this.value=this.getter(),this.failed=!1}catch(e){this.error=e,this.failed=!0}finally{this.dirty=!1,h=e}}if(this.failed)throw this.error;return this.value}},te=async()=>{await Promise.resolve(),C()},T=e=>{let t=new w(e);return t.run(),()=>t.stop()},E=e=>{let t=h;h=void 0;try{return e()}finally{h=t}},ne=e=>{if(typeof e!=`object`||!e)return!1;if(Array.isArray(e))return!0;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},D=e=>typeof e==`object`&&!!e&&e[l]||e,re=e=>D(e)!==e,ie=new Set(`push pop shift unshift splice sort reverse fill copyWithin`.split(` `)),ae=/* @__PURE__ */ new Set([`includes`,`indexOf`,`lastIndexOf`]),oe=(e,t,n)=>{let r=Array.prototype[t];return ie.has(t)?(...e)=>E(()=>r.apply(n,e)):(...t)=>{v(e,u);let i=r.apply(e,t.map(D));return i===-1||i===!1?r.apply(n,t):i}},se=(e,t)=>{let n=f.get(e);if(n)for(let[e,r]of n)typeof e==`string`&&Number(e)>=t&&y(r)},O=e=>{if(!ne(e)||re(e))return e;let t=p.get(e);if(t)return t;let n=/* @__PURE__ */ new Map,r=Array.isArray(e),i=new Proxy(e,{get(e,t,i){if(t===l)return e;if(r&&typeof t==`string`&&(ie.has(t)||ae.has(t)))return oe(e,t,i);let a=Object.getOwnPropertyDescriptor(e,t)?.get;if(a)return c(n,t,()=>new ee(()=>a.call(i))).get();v(e,t);let o=Reflect.get(e,t,i);return ne(o)?O(o):o},set(e,t,n,i){let a=Object.getOwnPropertyDescriptor(e,t)?.set;if(a)return a.call(i,n),!0;let o=D(n),s=Object.hasOwn(e,t),c=e[t],l=r?e.length:0;if(e[t]=o,s&&Object.is(c,o))return!0;if(b(e,t),s||b(e,u),r){let n=e.length;n!==l&&t!==`length`&&b(e,`length`),t===`length`&&(b(e,u),se(e,n))}return!0},deleteProperty(e,t){let n=Object.hasOwn(e,t);return delete e[t],n&&(b(e,t),b(e,u)),!0},has(e,t){return v(e,t),Reflect.has(e,t)},ownKeys(e){return v(e,u),r&&v(e,`length`),Reflect.ownKeys(e)}});return p.set(e,i),i},ce=new Set(`script style iframe frame frameset object embed link meta base template noscript`.split(` `)),le=new Set(`href src action formaction xlink:href poster to from values`.split(` `)),ue=/^\s*(?:javascript|vbscript|data:text\/html)/i,k=e=>new DOMParser().parseFromString(`<body>${e}`,`text/html`).body,A=e=>{for(let t of[...e.querySelectorAll(`*`)])if(ce.has(t.localName))t.remove();else for(let{name:e,value:n}of[...t.attributes])(e.startsWith(`on`)||e===`srcdoc`||le.has(e)&&ue.test(n))&&t.removeAttribute(e);return e},de=e=>{let t=document.createDocumentFragment();for(let n of[...e.childNodes])t.append(document.importNode(n,!0));return t},fe=e=>de(A(k(e))),pe=/^(!?)([#@])([A-Za-z_$][\w$]*(?:\.[\w$-]+)*)$/,me=e=>{let t=e.trim().match(pe);if(t)return{text:e,negate:t[1]===`!`,kind:t[2],path:t[3].split(`.`)}},j=(e,t,n)=>{let r=me(e??``);return r||s(`<${n.instance.host.localName}> ${t}="${e??``}" must be a reference like "#state.path" or "@prop".`),r},he=(e,t)=>{let n=e.path[0],{instance:r}=t;if(e.kind===`@`)return r.props?.[n];let i=t.vars.findLast(([e])=>e===n);if(i)return i[1].value;if(r.has(n))return r.get(n);let a=r.findInParents(n);return a||s(`<${r.host.localName}> "${e.text}" is not defined in this component or its parents.`),a?.value},M=(e,t)=>{let n=he(e,t);for(let t of e.path.slice(1))n=n?.[t];return e.negate?!n:n},ge=(e,t,n)=>{if(e.kind===`@`||e.path.length<2||e.negate){s(`<${t.instance.host.localName}> "${e.text}" can't be written. Use a state property like "#todo.items".`);return}let r=M({...e,path:e.path.slice(0,-1)},t),i=e.path.at(-1);typeof r!=`object`||!r?s(`<${t.instance.host.localName}> "${e.text}" can't be written because its parent is not an object.`):r[i]=n(r[i])},_e=e=>{let t=new AbortController;return e.addEventListener(`abort`,()=>t.abort(e.reason),{signal:t.signal}),t},ve={ms:1,s:1e3,m:6e4},N=e=>{let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m)?$/);return t?Number(t[1])*ve[t[2]??`ms`]:(s(`"${e}" is not a duration. Use values like "300ms", "2s" or "1m".`),0)},ye=(e,t,n)=>{let r=e.getAttribute(`debounce`),i=e.getAttribute(`throttle`);if(r!==null){let e=N(r),i;return n.addEventListener(`abort`,()=>clearTimeout(i)),n=>{clearTimeout(i),i=setTimeout(()=>t(n),e)}}if(i!==null){let e=N(i),n=-1/0;return r=>{let i=performance.now();i-n<e||(n=i,t(r))}}return t},be=new Set(`replace outer append prepend before after remove text merge`.split(` `)),xe={form:`submit`,a:`click`},P=/* @__PURE__ */ new Map,Se=async e=>({ok:e.ok,status:e.status,headers:e.headers,text:await e.text(),url:e.url}),Ce=(e,t)=>{let n=`${e}\u0000${[...t].join(`\0`)}`,r=P.get(n);return r||(r=fetch(e,{headers:t}).then(Se),P.set(n,r),r.finally(()=>P.delete(n)).catch(()=>{})),r},we=(e,t)=>new Promise((n,r)=>{t.addEventListener(`abort`,()=>r(t.reason),{once:!0}),e.then(n,r)}),Te=e=>{if(!e.headers.get(`content-type`)?.includes(`json`))return e.text;try{return JSON.parse(e.text)}catch{return e.text}},Ee=e=>e.hasAttribute(`fetch`)||(e.localName===`form`||e.localName===`a`)&&(e.hasAttribute(`into`)||e.hasAttribute(`render`)||e.hasAttribute(`busy`)),De=e=>e.localName===`form`?`submit`:e.localName===`input`||e.localName===`select`||e.localName===`textarea`?`change`:`click`,Oe=(e,t)=>{if(e.nodeType!==t.nodeType||e.nodeName!==t.nodeName){e.replaceWith(t);return}if(!(e instanceof Element)){e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue);return}let n=t;for(let{name:t}of[...e.attributes])n.hasAttribute(t)||e.removeAttribute(t);for(let{name:t,value:r}of[...n.attributes])e.getAttribute(t)!==r&&e.setAttribute(t,r);e.matches(`:focus`)||ke(e,n)},ke=(e,t)=>{let n=[...t.childNodes],r=[...e.childNodes];n.forEach((t,n)=>{let i=r[n];i?Oe(i,t):e.append(t)});for(let e of r.slice(n.length))e.remove()},Ae={append:(e,t)=>[...e,...t],prepend:(e,t)=>[...t,...e],update:(e,t,n)=>{let r=new Map(t.map(e=>[e[n],e]));return[...e.map(e=>{let t=r.get(e[n]);return r.delete(e[n]),t??e}),...r.values()]},remove:(e,t,n)=>{let r=new Set(t.map(e=>e[n]));return e.filter(e=>!r.has(e[n]))}},je=(e,t,n)=>{let r=j(e,`trigger`,n);if(!r)return;let i,a=T(()=>{let e=JSON.stringify(M(r,n))??``;i!==void 0&&e!==i&&E(()=>t(new CustomEvent(`change`))),i=e});n.signal.addEventListener(`abort`,a)},Me=(e,t)=>e.replaceChildren(t),Ne={replace:Me,outer:(e,t)=>e.replaceWith(t),append:(e,t)=>e.append(t),prepend:(e,t)=>e.prepend(t),before:(e,t)=>e.before(t),after:(e,t)=>e.after(t),merge:(e,t)=>ke(e,t)},Pe=(e,t,n,r)=>{if(n===`text`&&(e.textContent=t),n===`remove`&&e.remove(),n===`text`||n===`remove`)return;let i=A(k(t));r&&i.replaceChildren(...i.querySelectorAll(r)),(Ne[n]??Me)(e,de(i))},Fe=(e,t,n)=>{let r=e.getAttribute(`params`);if(r)for(let e of r.split(`,`)){let[r=``,i=``]=e.split(`:`),a=r.trim(),o=j(i.trim(),`params ${a}`,t);if(!o)continue;let s=M(o,t);n.append(a,typeof s==`object`&&s?JSON.stringify(s):String(s??``))}},Ie=(e,t)=>{if(e instanceof HTMLFormElement)return new FormData(e,t);let n=new FormData,r=e;return r.name&&`value`in r&&n.append(r.name,r.value),n},Le=(e,t)=>{let{instance:n}=t,r=n.host.localName,i=e.hasAttribute(`into`)?j(e.getAttribute(`into`),`into`,t):void 0,a=e.hasAttribute(`busy`)?j(e.getAttribute(`busy`),`busy`,t):void 0,o=e.hasAttribute(`headers`)?me(e.getAttribute(`headers`)):void 0,c=e.getAttribute(`render`),l=e.getAttribute(`render-mode`)??`replace`;be.has(l)||s(`<${r}> render-mode="${l}" is not supported.`);let u,d=(t,n,r=!1)=>e.dispatchEvent(new CustomEvent(t,{detail:n,cancelable:r})),f=n=>{a&&ge(a,t,()=>n),n?e.setAttribute(`aria-busy`,`true`):e.removeAttribute(`aria-busy`)},p=async a=>{C();let p=e instanceof HTMLFormElement?e:null,m=e instanceof HTMLAnchorElement?e:null,h=a?.getAttribute(`formaction`)??e.getAttribute(`fetch`)??(p?p.action:m.href),g=new URL(h,e.baseURI),_=(a?.getAttribute(`formmethod`)??e.getAttribute(`method`)??`get`).toUpperCase();if(!d(`loadstart`,{url:g.href,method:_},!0))return;u?.abort();let v=_e(t.signal),{signal:y}=v;u=v;let b=e.getAttribute(`timeout`),x=b?setTimeout(()=>v.abort(new DOMException(`Timed out`,`TimeoutError`)),N(b)):void 0,S=Ie(e,a);Fe(e,t,S);let w=new Headers(o&&M(o,t)||void 0);n.setLoading(1),f(!0);try{let a;if(_===`GET`){for(let[e,t]of S)g.searchParams.append(e,t);a=Ce(g.href,w)}else{let e=p?.enctype===`multipart/form-data`?S:new URLSearchParams(S);a=fetch(g,{method:_,body:e,headers:w}).then(Se)}let o=await we(a,y),u={status:o.status,data:Te(o),headers:o.headers,url:o.url};if(!o.ok){d(`error`,u);return}if(i){let n=e.getAttribute(`into-mode`)??`replace`;ge(i,t,t=>{if(n===`replace`)return u.data;let r=Array.isArray(t)?t:[],i=Array.isArray(u.data)?u.data:[u.data];return(Ae[n]??Ae.append)(r,i,e.getAttribute(`into-key`)??`id`)})}if(c!==null){let t=n.refs[c];t?Pe(t,o.text,l,e.getAttribute(`render-select`)):s(`<${r}> render="${c}" does not match any ref.`)}m&&c!==null&&history.pushState({},``,g),d(`load`,u)}catch(e){if(y.aborted){let e=y.reason;d(e.name===`TimeoutError`?`timeout`:`abort`,{url:g.href})}else d(`error`,{status:0,data:void 0,message:e.message,url:g.href})}finally{clearTimeout(x),v.abort(),n.setLoading(-1),u===v&&(u=void 0,f(!1)),d(`loadend`,{url:g.href})}},m=e=>void p(e instanceof SubmitEvent?e.submitter:null),h=ye(e,m,t.signal),g=xe[e.localName];g&&e.addEventListener(g,e=>e.preventDefault(),{signal:t.signal});let _=(e.getAttribute(`trigger`)??De(e)).split(/[\s,]+/).filter(Boolean);for(let n of _)if(n===`load`)queueMicrotask(()=>m());else if(n===`visible`){let n=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&m()});n.observe(e),t.signal.addEventListener(`abort`,()=>n.disconnect())}else/^[#@]/.test(n)?je(n,h,t):e.addEventListener(n,h,{signal:t.signal});let v=e.getAttribute(`poll`);if(v){let e=setInterval(m,N(v));t.signal.addEventListener(`abort`,()=>clearInterval(e))}},Re=`button, a[href], input, select, textarea, [tabindex]`,ze=`:disabled, [disabled], [aria-disabled="true"], [inert], [hidden]`,Be={ArrowRight:{axis:`inline`,step:1},ArrowLeft:{axis:`inline`,step:-1},ArrowDown:{axis:`block`,step:1},ArrowUp:{axis:`block`,step:-1}},Ve=e=>e.shadowRoot?.delegatesFocus?[]:He(e.shadowRoot??e),He=e=>[...e.children].flatMap(e=>e instanceof HTMLSlotElement?e.assignedElements({flatten:!0}).flatMap(e=>[e,...Ve(e)]):[e,...Ve(e)]),Ue=e=>He(e).filter(e=>(e.matches(Re)||e.shadowRoot?.delegatesFocus===!0)&&!e.matches(ze)&&e.getAttribute(`tabindex`)!==`-2`&&e.checkVisibility()),We=(e,t)=>{e.addEventListener(`keydown`,t=>{let n=new Set((e.getAttribute(`focusgroup`)??``).split(/\s+/).filter(Boolean)),r=n.has(`inline`)||n.has(`block`),i=t.key,a=Ue(e),o=a.indexOf(t.composedPath().find(e=>a.includes(e))),s=Be[i],c={Home:0,End:a.length-1}[i];if(o===-1||c===void 0&&(!s||r&&!n.has(s.axis)))return;let l=s?.axis===`inline`&&getComputedStyle(e).direction===`rtl`?-1:1,u=c??o+s.step*l,d=n.has(`wrap`)?(u+a.length)%a.length:Math.min(Math.max(u,0),a.length-1);t.preventDefault(),a[d].focus()},{signal:t})},Ge=6,Ke=/* @__PURE__ */ new Map,F=/* @__PURE__ */ new Map,I=/* @__PURE__ */ new Map,L=/* @__PURE__ */ new Set,R=/* @__PURE__ */ new Map,qe=class extends Error{url;status;constructor(e,t){super(`Could not import ${e}${t?` (HTTP ${t})`:``}`),this.url=e,this.status=t}},Je=e=>new Promise(t=>{let n=F.get(e)??0;if(n<Ge)F.set(e,n+1),t();else{let n=I.get(e)??[];n.push(()=>t()),I.set(e,n)}}),Ye=e=>{let t=I.get(e)?.shift();t?t():F.set(e,F.get(e)-1)},Xe=e=>{let t=Ke.get(e);if(t)return t;let{origin:n}=new URL(e);return t=Je(n).then(()=>fetch(e)).then(async t=>{if(!t.ok)throw new qe(e,t.status);return new DOMParser().parseFromString(await t.text(),`text/html`)}).catch(t=>{throw t instanceof qe?t:new qe(e,0)}).finally(()=>Ye(n)),Ke.set(e,t),t},Ze=async(e,t=/* @__PURE__ */ new Set)=>{let n=await Xe(e),r=/* @__PURE__ */ new Set([...t,e]),i=[...n.querySelectorAll(`import-element[from]`)].filter(e=>!e.closest(`custom-element`)).map(t=>new URL(t.getAttribute(`from`),e).href).filter(e=>!r.has(e));await Promise.all(i.map(e=>Ze(e,r))),await Promise.all([...n.querySelectorAll(`custom-element`)].map(t=>yn(t.cloneNode(!0),e,!1)))},z=e=>{if(!L.has(e)){L.add(e);for(let t of R.get(e)??[])t();R.delete(e)}},Qe=e=>new Promise(t=>{if(e.some(e=>L.has(e)||document.querySelector(e)))return t();for(let n of e)R.set(n,[...R.get(n)??[],t])}),$e=e=>{let t=e=>{e.localName.includes(`-`)&&z(e.localName);for(let t of e.querySelectorAll(`*`))t.localName.includes(`-`)&&z(t.localName)};new MutationObserver(e=>{for(let n of e)for(let e of n.addedNodes)e instanceof Element&&t(e)}).observe(e,{childList:!0,subtree:!0})},et=class extends HTMLElement{#e=!1;async connectedCallback(){if(this.#e||this.closest(`custom-element`))return;this.#e=!0;let e=this.getAttribute(`from`);if(!e){s(`<import-element> needs a from attribute.`);return}let t=new URL(e,this.baseURI).href,n=(this.getAttribute(`for`)??``).split(/\s+/).filter(Boolean);this.getAttribute(`loading`)===`lazy`&&(n.length?await Qe(n):s(`<import-element from="${e}" loading="lazy"> needs a for attribute listing the tags it defines.`));try{await Ze(t),this.isConnected&&this.dispatchEvent(new CustomEvent(`load`,{detail:{url:t}}))}catch(e){let{status:n}=e;s(e.message),this.isConnected&&this.dispatchEvent(new CustomEvent(`error`,{detail:{url:t,status:n}}))}}},tt=/* @__PURE__ */ new Set([`value`,`checked`,`selected`,`indeterminate`]),nt=/* @__PURE__ */ new Set([`draggable`,`spellcheck`,`contenteditable`]),rt=[`eq`,`neq`,`gt`,`gte`,`lt`,`lte`,`contains`],B=(e,t)=>{e.disposers.push(T(t))},V=`http://www.w3.org/2000/svg`,it=Object.fromEntries(`viewBox preserveAspectRatio gradientTransform gradientUnits patternTransform patternUnits patternContentUnits clipPathUnits markerHeight markerWidth markerUnits maskUnits maskContentUnits textLength lengthAdjust refX refY pathLength stdDeviation filterUnits primitiveUnits spreadMethod startOffset tableValues baseFrequency numOctaves stitchTiles surfaceScale specularExponent diffuseConstant kernelMatrix edgeMode xChannelSelector yChannelSelector attributeName repeatCount keyTimes keySplines calcMode`.split(` `).map(e=>[e.toLowerCase(),e])),at=/* @__PURE__ */ new Set([`progress`,`meter`]),ot=e=>e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),st=(e,t,n)=>{let r=e.namespaceURI===V?it[t]??t:t,i=e;if(r.startsWith(`--`)){let t=e.style;n==null||n===!1?t.removeProperty(r):t.setProperty(r,String(n))}else r===`value`&&n==null&&at.has(e.localName)?e.removeAttribute(r):tt.has(r)&&r in e?i[r]=r===`value`?n??``:!!n:e.localName.includes(`-`)&&typeof n==`object`&&n?i[ot(r)]=n:(r.startsWith(`aria-`)||nt.has(r))&&typeof n==`boolean`?e.setAttribute(r,String(n)):n===!0?e.setAttribute(r,``):n===!1||n==null?e.removeAttribute(r):e.setAttribute(r,String(n))},ct=(e,t,n,r)=>{let i=j(n,`_${t}`,r);i&&B(r,()=>st(e,t,M(i,r)))},lt=(e,t,r,i)=>{let{instance:a,vars:o}=i,s=a.definition.handlers.get(n(o.map(([e])=>e),r)),c=a.scope.handlers[s];if(!c)return;let l=t=>{c.call(e,t,...o.map(([,e])=>e.value))===!1&&t.preventDefault()},u=Ee(e)?l:ye(e,l,i.signal);e.addEventListener(t,u,{signal:i.signal})},ut={text:(e,t)=>e.replaceChildren(t),html:(e,t)=>e.replaceChildren(fe(t)),"html-unsafe":(e,t)=>{e.innerHTML=t}},dt=(e,t)=>{let n=k(`<svg>${e}</svg>`).firstElementChild;return[...(t?A(n):n).childNodes]},ft={html:(e,t)=>e.replaceChildren(...dt(t,!0)),"html-unsafe":(e,t)=>e.replaceChildren(...dt(t,!1))},H=e=>e==null||e===``,pt=(e,t,n)=>{let r=[`html-unsafe`,`html`].find(t=>e.hasAttribute(t))??`text`,i=[...e.childNodes];if(e.namespaceURI===V){let a=r===`text`,o=a?document.createTextNode(``):document.createElementNS(V,`g`);e.replaceWith(o);let s=ft[r];B(n,()=>{let r=M(t,n);a?o.data=H(r)?e.textContent:String(r):H(r)?o.replaceChildren(...i):s(o,String(r))});return}let a=ut[r];B(n,()=>{let r=M(t,n);H(r)?e.replaceChildren(...i):a(e,String(r))})},mt=(e,t,n,r,i)=>{let a=_e(r.signal),o={instance:r.instance,vars:i,signal:a.signal,disposers:[]},s=document.createDocumentFragment();s.append(e.cloneNode(!0)),U(s,o);let c=[...s.childNodes];return t.insertBefore(s,n),{nodes:c,dispose(){a.abort();for(let e of o.disposers)e();for(let e of c)e.remove()}}},ht=e=>{let t=document.createDocumentFragment();return t.append(...e.childNodes),t},gt={eq:(e,t)=>String(e)===t,neq:(e,t)=>String(e)!==t,gt:(e,t)=>Number(e)>Number(t),gte:(e,t)=>Number(e)>=Number(t),lt:(e,t)=>Number(e)<Number(t),lte:(e,t)=>Number(e)<=Number(t),contains:(e,t)=>Array.isArray(e)?e.some(e=>String(e)===t):String(e??``).includes(t)},_t=(e,t,n)=>t?gt[t](e,n):!!e,vt=(e,t)=>{let n=j(e.getAttribute(`when`),`<${e.localName}> when`,t),r=ht(e);if(!n)return;let i=e.localName===`is-hidden`,a=rt.find(t=>e.hasAttribute(t)),o=a?e.getAttribute(a):``,s;B(t,()=>{let c=_t(M(n,t),a,o)!==i;E(()=>{c&&!s?s=mt(r,e,null,t,t.vars):!c&&s&&(s.dispose(),s=void 0)})}),t.disposers.push(()=>s?.dispose())},yt=(e,t,n,r,i)=>{let a=j(e.getAttribute(`of`)??e.getAttribute(`repeat`),`repeat`,i);if(!a)return;let o=e.getAttribute(`as`)??`item`,c=e.getAttribute(`index`),l=e.getAttribute(`key`),u=()=>r?.parentNode??n,d=/* @__PURE__ */ new Map,f=(e,n)=>{let a=O({value:e}),s=O({value:n}),l=[...i.vars,[o,a],...c?[[c,s]]:[]];return{...mt(t,u(),r,i,l),item:a,index:s}};B(i,()=>{let e=M(a,i),t=Array.isArray(e)?[...e]:[];E(()=>{let e=/* @__PURE__ */ new Map,n=[];t.forEach((t,r)=>{let a=l?t?.[l]:r;e.has(a)&&(s(`<${i.instance.host.localName}> repeat has a duplicate key "${String(a)}".`),a=Symbol());let o=d.get(a);o?(d.delete(a),o.item.value=t,o.index.value=r):o=f(t,r),e.set(a,o),n.push(o)});for(let e of d.values())e.dispose();d=e;let a=r;for(let e of n.reverse())for(let t of e.nodes.toReversed())t.nextSibling!==a&&u().insertBefore(t,a),a=t})}),i.disposers.push(()=>{for(let e of d.values())e.dispose()})},bt=(e,t)=>{let n=document.createComment(`repeat`);e.replaceWith(n);let r=e.cloneNode(!0);for(let e of[`repeat`,`as`,`index`,`key`])r.removeAttribute(e);yt(e,r,n.parentNode,n,t)},xt=(e,t)=>{for(let{name:n,value:i}of[...e.attributes])n.length>1&&n.startsWith(`_`)?(e.removeAttribute(n),ct(e,n.slice(1),i,t)):n.startsWith(`realm:on`)?(e.removeAttribute(n),lt(e,n.slice(r.length),i,t)):n===`ref`&&(t.instance.refs[i]=e)},St=(e,t)=>{let n=e.localName;if(n===`is-visible`||n===`is-hidden`)return vt(e,t);if(n===`repeat-list`)return yt(e,ht(e),e,null,t);if(e.hasAttribute(`repeat`))return bt(e,t);n.includes(`-`)&&z(n),U(e,t),xt(e,t),Ee(e)&&Le(e,t),e.hasAttribute(`focusgroup`)&&We(e,t.signal);let r=e.getAttribute(`name`);if(n===`slot`&&r&&/^[#@!]/.test(r)){let n=j(r,`<slot> name`,t);n&&pt(e,n,t)}},U=(e,t)=>{for(let n of[...e.children])St(n,t)},Ct=/var\(\s*--((?:attr|state)-[\w-]+)/g,wt=/:state\(\s*((?:attr|state)-[\w-]+)\s*\)/g,Tt=/^(attr|state)-(.+)$/,Et=/^(attr|state)-(.+?)(?:-(is|gt|gte|lt|lte)-(.+))?$/,Dt={is:`eq`,gt:`gt`,gte:`gte`,lt:`lt`,lte:`lte`},Ot=(e,t)=>{for(let n of e.matchAll(Ct))t.variables.add(n[1]);for(let n of e.matchAll(wt))t.states.add(n[1])},kt=(e,t)=>{let n=e.host,r=O({}),i=()=>{for(let e of t)r[e]=n.getAttribute(e)};i();let a=new MutationObserver(i);return a.observe(n,{attributes:!0,attributeFilter:t}),e.disposers.push(()=>a.disconnect()),r},At=(e,t)=>{let{variables:n,states:r}=e.definition.css;if(!n.size&&!r.size)return;let i=[...[...n].map(e=>Tt.exec(e)),...[...r].map(e=>Et.exec(e))].filter(t=>t[1]===`attr`&&!e.propAttributes.has(t[2])).map(e=>e[2]),a=kt(e,[...new Set(i)]),o=(n,r)=>{if(n===`attr`){let t=e.propAttributes.get(r);return t===void 0?a[r]:e.props?.[t]}return M({text:`#${r}`,negate:!1,kind:`#`,path:r.split(`-`)},t)},s=e.host.style;for(let t of n){let[,n,r]=Tt.exec(t);e.disposers.push(T(()=>{let e=o(n,r);e==null||typeof e==`object`?s.setProperty(`--${t}`,`initial`):s.setProperty(`--${t}`,String(e))}))}for(let t of r){let[,n,r,i,a=``]=Et.exec(t),s=i?Dt[i]:void 0;e.disposers.push(T(()=>{_t(o(n,r),s,a)?e.internals.states.add(t):e.internals.states.delete(t)}))}},jt=/* @__PURE__ */ new Set([`checkbox`,`radio`]),Mt=new Set(`text email password number search tel url date time datetime-local month week`.split(` `)),Nt=e=>{let t=e.refs.control;if(!e.definition.formAssociated||!t)return;let n=e.host,r=new Set(e.propAttributes.values()),i=r.has(`checked`)&&jt.has(t.type),a=typeof e.props?.value==`number`,o=()=>t.willValidate?e.internals.setValidity(t.validity,t.validationMessage,t):e.internals.setValidity({}),s=()=>{i?n.checked=t.checked:r.has(`value`)&&(n.value=a?Number(t.value):t.value),o()},c=[...e.internals.labels].map(e=>e.textContent.trim()).join(` `);c&&!t.hasAttribute(`aria-label`)&&t.setAttribute(`aria-label`,c);let{signal:l}=e;t.addEventListener(`input`,s,{signal:l}),t.addEventListener(`change`,()=>{s(),n.dispatchEvent(new Event(`change`,{bubbles:!0}))},{signal:l}),t.addEventListener(`keydown`,n=>{let r=e.internals.form;n.key===`Enter`&&r&&Mt.has(t.type)&&(n.preventDefault(),HTMLFormElement.prototype.requestSubmit.call(r))},{signal:l}),e.disposers.push(T(()=>{e.props?.value,e.props?.checked,o()}))},Pt=crypto.randomUUID(),W=/* @__PURE__ */ new Map,G=/* @__PURE__ */ new Map,Ft={register(e,t){let n=W.get(e);W.delete(e),n?.(t)},handler(e,t){G.set(e,t)}},It=Symbol.for(`realm`),Lt=globalThis,Rt=Lt[It]??/* @__PURE__ */ new Map;Lt[It]=Rt,Rt.set(Pt,Ft);var K=/* @__PURE__ */ new Set,zt=`globalThis[Symbol.for("realm")].get(${JSON.stringify(Pt)})`,Bt=0,Vt=e=>`${e}:${++Bt}`,Ht=(e,t,n)=>{let r=document.createElement(`script`);t&&(r.type=`module`),n&&r.addEventListener(`error`,n,{once:!0});let i=document.querySelector(`script[nonce]`)?.nonce;i&&(r.nonce=i),r.textContent=e,document.head.append(r),r.remove()},q=()=>({get:()=>void 0,handlers:[]}),Ut=(e,t,n,r)=>new Promise(i=>{let a=()=>{W.delete(e)&&(s(`<${r}> has an error in its <script>. The component renders without it.`),i(q))};W.set(e,i),Ht(t,n,a),n||a()}),Wt=e=>{let t=Vt(`handler`);Ht(`${zt}.handler(${JSON.stringify(t)}, function (event) {\n${e}\n});`,!1);let n=G.get(t);return G.delete(t),n},Gt=/* @__PURE__ */ new WeakMap,Kt=(e,t)=>c(c(Gt,e,()=>/* @__PURE__ */ new Map),t,()=>({fn:null,code:null,listening:!1})),J=(e,t,n,r)=>{let i=Kt(e,t);i.fn=n,i.code=r,n&&!i.listening&&(i.listening=!0,e.addEventListener(t,t=>{i.fn?.call(e,t)===!1&&t.preventDefault()}))},qt=(e,t)=>{let n=t.slice(2);Object.defineProperty(e,t,{configurable:!0,get(){return Gt.get(this)?.get(n)?.fn??null},set(e){J(this,n,typeof e==`function`?e:null,null)}})},Jt=(e,t,n)=>{if(!e.constructor.observedAttributes.includes(t))return;let r=t.slice(2);if(n===null)return J(e,r,null,null);Kt(e,r).code!==n&&J(e,r,Wt(n)??null,n)},Yt=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,Y=e=>({ok:!0,value:e}),X=e=>({ok:!1,message:e}),Xt=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Z=class e{kind;rules;constructor(e,t={}){this.kind=e,this.rules=t}#e(t){return new e(this.kind,{...this.rules,...t})}default(e){return this.#e({default:e,hasDefault:!0})}required(){return this.#e({required:!0})}optional(){return this.#e({required:!1})}reflect(){return this.#e({reflect:!0})}attribute(e){return this.#e({attribute:e})}min(e){return this.#e({min:e})}max(e){return this.#e({max:e})}int(){return this.#e({int:!0})}pattern(e){return this.#e({pattern:e})}email(){return this.#e({format:`email`})}url(){return this.#e({format:`url`})}get fallback(){if(this.rules.hasDefault){let e=this.rules.default;return Xt(e)||Array.isArray(e)?structuredClone(e):e}return this.kind!==`boolean`&&void 0}parse(e){if(this.kind===`boolean`)return Y(e!==null);if(e===null)return this.check(void 0);switch(this.kind){case`number`:return e.trim()===``?X(`"${e}" is not a number`):this.check(Number(e));case`date`:return this.check(new Date(e));case`array`:case`object`:try{return this.check(JSON.parse(e))}catch{return X(`"${e}" is not valid JSON`)}default:return this.check(e)}}check(e){if(e==null)return this.rules.hasDefault?Y(this.fallback):this.rules.required?X(`is required`):Y(this.kind!==`boolean`&&e);let t=this.#t(e);return t?X(t):Y(e)}#t(e){let{rules:t}=this;switch(this.kind){case`string`:return typeof e==`string`?t.min!==void 0&&e.length<t.min?`must be at least ${t.min} characters`:t.max!==void 0&&e.length>t.max?`must be at most ${t.max} characters`:t.pattern&&!t.pattern.test(e)?`must match ${t.pattern}`:t.format===`email`&&!Yt.test(e)?`must be an email address`:t.format===`url`&&!URL.canParse(e)?`must be a URL`:void 0:`expected a string, got ${typeof e}`;case`number`:return typeof e!=`number`||Number.isNaN(e)?`"${String(e)}" is not a number`:t.int&&!Number.isInteger(e)?`must be an integer`:t.min!==void 0&&e<t.min?`must be at least ${t.min}`:t.max!==void 0&&e>t.max?`must be at most ${t.max}`:void 0;case`boolean`:return typeof e==`boolean`?void 0:`expected a boolean, got ${typeof e}`;case`enum`:return t.values?.includes(e)?void 0:`must be one of ${t.values?.map(e=>`"${e}"`).join(`, `)}`;case`date`:return e instanceof Date&&!Number.isNaN(e.getTime())?void 0:`is not a valid date`;case`array`:if(!Array.isArray(e))return`expected an array`;for(let[n,r]of e.entries()){let e=t.item?.check(r);if(e&&!e.ok)return`[${n}] ${e.message}`}return;case`object`:if(!Xt(e))return`expected an object`;for(let[n,r]of Object.entries(t.shape??{})){let t=r.check(e[n]);if(!t.ok)return`.${n} ${t.message}`}return}}serialize(e){return e==null||e===!1?null:e===!0?``:e instanceof Date?e.toISOString():typeof e==`object`?JSON.stringify(e):String(e)}},Zt={string:()=>new Z(`string`),number:()=>new Z(`number`),boolean:()=>new Z(`boolean`),date:()=>new Z(`date`),enum:e=>new Z(`enum`,{values:e}),array:e=>new Z(`array`,{item:e}),object:e=>new Z(`object`,{shape:e})},Qt=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),$t=(e,t)=>{if(e.props)throw Error(`<${e.host.localName}> called defineProps more than once.`);let n=e.host,r=n.localName,i=O({}),a=e.propAttributes,o=(e,t,n)=>{n.ok?i[e]=n.value:(s(`<${r}> prop "${e}" ${n.message}. Using the default.`),i[e]=t.fallback)},c=()=>{for(let[e,r]of a)o(r,t[r],t[r].parse(n.getAttribute(e)))};for(let[e,r]of Object.entries(t)){let t=r.rules.attribute??Qt(e);a.set(t,e);let s=Object.hasOwn(n,e),c=n[e];s&&delete n[e],Object.defineProperty(n,e,{configurable:!0,enumerable:!0,get:()=>i[e],set:a=>{if(o(e,r,r.check(a)),!r.rules.reflect)return;let s=r.serialize(i[e]);s===null?n.removeAttribute(t):n.setAttribute(t,s)}}),s?n[e]=c:o(e,r,r.parse(n.getAttribute(t)))}let l=new MutationObserver(e=>{for(let r of e){let e=r.attributeName,s=a.get(e),c=t[s],l=n.getAttribute(e);l!==c.serialize(i[s])&&o(s,c,c.parse(l))}});l.observe(n,{attributes:!0,attributeFilter:[...a.keys()]}),e.disposers.push(()=>{l.disconnect();for(let e of Object.keys(t))delete n[e]});let{formAssociated:u}=e.definition;if(e.props=new Proxy(i,{get(t,n,r){let i=Reflect.get(t,n,r);return n===`disabled`&&u?!!i||e.form.disabled:i},set(e,i,a){return typeof i==`string`&&Object.hasOwn(t,i)?n[i]=a:s(`<${r}> "${String(i)}" is not a declared prop.`),!0}}),u){let r=Object.hasOwn(t,`checked`);(r||Object.hasOwn(t,`value`))&&e.disposers.push(T(()=>{let t=i.value===void 0||i.value===null?null:String(i.value);e.internals.setFormValue(r?i.checked?t??`on`:null:t)})),e.formReset.push(c),e.formStateRestore.push(e=>{r?n.checked=e!==null:n.value=e})}return e.props},en=/* @__PURE__ */ new Map,tn=e=>({get:t=>e.getItem(t),set:(t,n)=>e.setItem(t,n)}),nn=e=>e===`local`?tn(localStorage):e===`session`?tn(sessionStorage):e,rn=(e,t)=>{let n=Object.getOwnPropertyDescriptor(e,t);return!n||`value`in n},an=(e,t,n={})=>{let r=en.get(e);if(r)return r;let i=O(t),a=nn(n.persist);if(en.set(e,i),!a)return i;let o=`realm:${e}`,c=a.get(o);if(c!==null)try{let e=JSON.parse(c);for(let[n,r]of Object.entries(e))rn(t,n)&&(i[n]=r)}catch{s(`Stored value for store "${e}" is not valid JSON and was ignored.`)}let l=i;return T(()=>a.set(o,JSON.stringify(Object.fromEntries(Object.keys(l).filter(e=>rn(t,e)).map(e=>[e,l[e]]))))),i},on={get:()=>void 0,handlers:[]},Q=/* @__PURE__ */ new WeakMap,$=e=>e.parentNode instanceof ShadowRoot?e.parentNode.host:e.parentNode,sn=e=>{for(let t=$(e);t;t=$(t))if(t instanceof Element&&K.has(t.localName))return t.localName},cn=class{host;definition;internals;controller=new AbortController;refs=O({});disposers=[];connected=[];disconnected=[];formReset=[];formDisabled=[];formStateRestore=[];props;propAttributes=/* @__PURE__ */ new Map;form=O({disabled:!1});childWatchers=/* @__PURE__ */ new Set;attrs;scope=on;loading=0;constructor(e,t,n){this.host=e,this.definition=t,this.internals=n}get signal(){return this.controller.signal}has(e){return this.definition.names.has(e)}get(e){return this.scope.get(e)}findInParents(e){for(let t=$(this.host);t;t=$(t)){let n=Q.get(t);if(n?.has(e))return n.host.contains(this.host)||s(`<${this.host.localName}> reads "${e}" from <${n.host.localName}>.`),{value:n.get(e)}}}lookup(e){let t=this.findInParents(e);return t?t.value:globalThis[e]}setLoading(e){this.loading+=e,this.loading>0?this.internals.states.add(`loading`):this.internals.states.delete(`loading`)}destroy(){for(let e of this.disconnected)e();this.controller.abort();for(let e of this.disposers.splice(0))e();this.host.shadowRoot?.replaceChildren(),Q.delete(this.host)}},ln=e=>{if(e.attrs)return e.attrs;let t=e.host,n=O({}),r=()=>{for(let{name:e,value:r}of t.attributes)n[e]=r;for(let e of Object.keys(n))t.hasAttribute(e)||(n[e]=null)};r();let i=new MutationObserver(r);return i.observe(t,{attributes:!0}),e.disposers.push(()=>i.disconnect()),e.attrs=new Proxy(n,{get:(e,t)=>e[t]??null,set(e,n,i){return i==null||i===!1?t.removeAttribute(n):t.setAttribute(n,i===!0?``:String(i)),r(),!0}}),e.attrs},un=e=>{let t=/* @__PURE__ */ new Set;e.addEventListener(`abort`,()=>{for(let e of t)clearTimeout(e)});let n=e=>{e!==void 0&&t.delete(e),clearTimeout(e)};return{setTimeout(e,n,...r){let i=window.setTimeout(()=>{t.delete(i),e(...r)},n);return t.add(i),i},setInterval(e,n,...r){let i=window.setInterval(e,n,...r);return t.add(i),i},clearTimeout:n,clearInterval:n}},dn=e=>({...un(e.signal),untrack:E,defineProps:t=>$t(e,t),useState:O,useChildren(t,n=[]){let r=e.host,i=O([]),a=()=>{i.length=0,i.push(...[...r.children].filter(e=>e.matches(t)))};a(),e.childWatchers.add(a);let o=new MutationObserver(a);return o.observe(r,{childList:!0,subtree:!0,characterData:!0,attributeFilter:n}),e.disposers.push(()=>o.disconnect()),i},tick:te,listen:(t,n,r=e.host)=>r.addEventListener(t,n,{signal:e.signal}),defineMethods(t){let n=e.host,r=Object.getOwnPropertyDescriptors(t);for(let[e,t]of Object.entries(r))Object.defineProperty(n,e,{...t,configurable:!0});e.disposers.push(()=>{for(let e of Object.keys(r))delete n[e]})},dispatch:(t,n,r)=>e.host.dispatchEvent(new CustomEvent(t,{bubbles:!0,composed:!0,cancelable:!0,detail:n,...r})),attrs:new Proxy({},{get:(t,n)=>ln(e)[n],set:(t,n,r)=>(ln(e)[n]=r,!0)}),observe(t){let n=T(t);return e.disposers.push(n),n},onConnected:t=>e.connected.push(t),onDisconnected:t=>e.disconnected.push(t),onFormReset:t=>e.formReset.push(t),onFormDisabled:t=>e.formDisabled.push(t),onFormStateRestore:t=>e.formStateRestore.push(t),defineStore:an,lookup:t=>e.lookup(t),prop:Zt,host:e.host,refs:e.refs,signal:e.signal,internals:e.internals}),fn=class extends HTMLElement{static definition;#e=this.attachInternals();#t;#n=!1;get#r(){return this.constructor.definition}connectedCallback(){this.#n=!1;for(let e of this.attributes)Jt(this,e.name,e.value);if(this.#t||this.closest(`custom-element`))return;let e=sn(this);if(e){customElements.whenDefined(e).then(()=>{this.isConnected&&this.connectedCallback()});return}let t=this.#r;t.slot&&!this.hasAttribute(`slot`)&&(this.slot=t.slot);let n=this.shadowRoot??this.attachShadow({mode:`open`,delegatesFocus:t.delegatesFocus});n.adoptedStyleSheets=t.sheets,t.role&&(this.#e.role=t.role);let r=new cn(this,t,this.#e);this.#t=r,Q.set(this,r),t.formAssociated&&(r.form.disabled=this.matches(`:disabled`));try{r.scope=t.setup(dn(r))}catch(e){o(e)}let i={instance:r,vars:[],signal:r.signal,disposers:r.disposers};At(r,i);let a=document.importNode(t.markup,!0);U(a,i),n.append(a),Nt(r);let s=this.parentElement&&Q.get(this.parentElement);if(s)for(let e of s.childWatchers)e();for(let e of r.connected){let t=e();typeof t==`function`&&r.disposers.push(t)}}disconnectedCallback(){this.#n=!0,queueMicrotask(()=>{this.#n&&!this.isConnected&&(this.#t?.destroy(),this.#t=void 0)})}attributeChangedCallback(e,t,n){this.isConnected&&Jt(this,e,n)}formResetCallback(){for(let e of this.#t?.formReset??[])e()}formDisabledCallback(e){this.#t&&(this.#t.form.disabled=e);for(let t of this.#t?.formDisabled??[])t(e)}formStateRestoreCallback(e,t){for(let n of this.#t?.formStateRestore??[])n(e,t)}},pn=e=>{let t=e.events.filter(e=>!(`on${e}`in HTMLElement.prototype)).map(e=>`on${e}`),n=class extends fn{static definition=e;static formAssociated=e.formAssociated;static observedAttributes=t};for(let e of t)qt(n.prototype,e);customElements.define(e.name,n)},mn=new CSSStyleSheet;mn.replaceSync(`is-visible, is-hidden, repeat-list { display: contents; } :host([hidden]), [hidden]:not([hidden='until-found']) { display: none !important; } :not(:defined):not(is-visible, is-hidden, repeat-list) { visibility: hidden; }`);var hn=/* @__PURE__ */ new Map,gn=/(?:new\s+(?:Custom)?Event|\bdispatch)\s*\(\s*(["'`])([a-z][\w-]*)\1/g,_n=(e,t)=>{let n=new CSSStyleSheet;if(e.localName===`style`)return n.replaceSync(e.textContent),n;let r=new URL(e.getAttribute(`href`)??``,t).href;return fetch(r).then(e=>e.ok?e.text():Promise.reject(/* @__PURE__ */ Error(`HTTP ${e.status}`))).then(e=>n.replace(e)).catch(e=>s(`Could not load stylesheet ${r}: ${e.message}`)),n},vn=async(e,t)=>{try{let n=await import(
|
|
2
|
+
/* @vite-ignore */
|
|
3
|
+
t);e.names=new Set(n.names),e.setup=n.default}catch(n){s(`<${e.name}> could not load its script ${t}: ${n.message}`),e.setup=q}},yn=async(n,i,a)=>{let o=n.getAttribute(`name`)??``;if(!o.includes(`-`)){s(`<custom-element name="${o}"> needs a name that contains a dash, like "todo-app".`);return}let c=n.outerHTML,l=hn.get(o);if(l){l.source!==c&&s(`<${o}> is defined twice with different sources (${l.base} and ${i}). Keeping the first.`);return}if(customElements.get(o)){s(`<${o}> is already defined by another library.`);return}let u=[],d=[mn],f={variables:/* @__PURE__ */ new Set,states:/* @__PURE__ */ new Set},p=n.ownerDocument.createDocumentFragment();for(let e of[...n.childNodes])e instanceof Element&&e.localName===`script`?u.push(e):e instanceof Element&&(e.localName===`style`||e.localName===`link`&&e.getAttribute(`rel`)===`stylesheet`)?(d.push(_n(e,i)),Ot(e.textContent,f)):p.append(e);u.length>1&&s(`<${o}> has more than one <script>. Only the first is used.`);let m=u[0];a&&m&&m.type!==`realm`&&s(`<${o}> is defined in the page, so its <script> needs type="realm". A plain <script> already ran in the page scope.`);let h=t(p.children);for(let e of p.querySelectorAll(`*`))for(let{name:t,value:n}of[...e.attributes])t.length>2&&t.startsWith(`on`)&&(e.removeAttribute(t),e.setAttribute(r+t.slice(2),n));let g=m?.textContent??``,_=m?.getAttribute(`src`),v={name:o,source:c,base:i,markup:p,sheets:d,names:/* @__PURE__ */ new Set,handlers:new Map([...h.keys()].map((e,t)=>[e,t])),events:[...new Set([...g.matchAll(gn)].map(e=>e[2]))],formAssociated:n.hasAttribute(`form-associated`),role:n.getAttribute(`role`),slot:n.getAttribute(`slot`),delegatesFocus:n.hasAttribute(`delegates-focus`),css:f,setup:void 0};if(hn.set(o,v),K.add(o),_)await vn(v,new URL(_,i).href);else if(!g.trim()&&!h.size)v.setup=q;else{let t=Vt(o),{imports:n,setup:r,names:a}=e(g,i,h);v.names=a,v.setup=await Ut(t,`${n}\n${zt}.register(${JSON.stringify(t)}, ${r});\n//# sourceURL=${i.split(`#`)[0]}#${o}`,n!==``,o)}K.delete(o),pn(v)},bn=new CSSStyleSheet;bn.replaceSync(`custom-element, import-element { display: none !important; } is-visible, is-hidden, repeat-list { display: contents; }`);var xn=!1,Sn=e=>{e.remove(),yn(e,document.baseURI,!0)},Cn=e=>{for(let t of e.querySelectorAll(`custom-element`))Sn(t)},wn=()=>{xn||(xn=!0,document.adoptedStyleSheets=[...document.adoptedStyleSheets,bn],customElements.get(`import-element`)||customElements.define(`import-element`,et),Cn(document),new MutationObserver(e=>{for(let t of e)for(let e of t.addedNodes)e instanceof Element&&(e.localName===`custom-element`?Sn(e):Cn(e))}).observe(document,{childList:!0,subtree:!0}),$e(document))};export{Ze as a,O as c,Zt as i,D as l,yn as n,T as o,an as r,C as s,wn as t,E as u};
|
package/dist/compiler.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,i as t,n}from"./chunks/assemble-Dy07wr-3.js";var r=`style, link[rel=stylesheet]`,i=e=>{let i=[...e.children],a=i.find(e=>e.localName===`script`);if(a?.hasAttribute(`src`))return;let o=i.filter(e=>e.localName!==`script`&&!e.matches(r)),s=a?.textContent??``,c=n(o);if(!s.trim()&&!c.size)return;let{imports:l,setup:u,names:d}=t(s,null,c);return{name:e.getAttribute(`name`)??``,script:a,module:`${l}\nexport const names = ${JSON.stringify([...d])};\nexport default ${u};\n`}};export{i as compileDefinition,e as tokenize};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{n as defineComponent,r as defineStore,s as flush,a as importDefinitions,o as observe,i as prop,t as start,l as toRaw,u as untrack,c as useState}from"./chunks/src-7--Nyd4c.js";
|
package/dist/realm.css
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
custom-element,
|
|
2
|
+
import-element {
|
|
3
|
+
display: none;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
is-visible,
|
|
7
|
+
is-hidden,
|
|
8
|
+
repeat-list {
|
|
9
|
+
display: contents;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:not(:defined) {
|
|
13
|
+
visibility: hidden;
|
|
14
|
+
}
|
package/dist/realm.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"./chunks/src-7--Nyd4c.js";c();export{i as defineComponent,o as defineStore,s as flush,e as importDefinitions,a as observe,n as prop,c as start,r as toRaw,l as untrack,t as useState};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const HELPERS: string[];
|
|
2
|
+
export declare const HANDLER_PREFIX = "realm:on";
|
|
3
|
+
export type HandlerList = Map<string, [string[], string]>;
|
|
4
|
+
export declare const handlerKey: (vars: readonly string[], code: string) => string;
|
|
5
|
+
export declare const collectHandlers: (elements: Iterable<Element>, vars?: readonly string[], found?: HandlerList) => HandlerList;
|
|
6
|
+
export declare const setupSource: (script: string, base: string | null, handlers: HandlerList) => {
|
|
7
|
+
imports: string;
|
|
8
|
+
setup: string;
|
|
9
|
+
names: Set<string>;
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./index";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Scope } from "./scope";
|
|
2
|
+
declare const COMPARATORS: readonly ["eq", "neq", "gt", "gte", "lt", "lte", "contains"];
|
|
3
|
+
type Comparator = (typeof COMPARATORS)[number];
|
|
4
|
+
export declare const watch: (scope: Scope, fn: () => unknown) => void;
|
|
5
|
+
export declare const applyAttribute: (el: Element, attribute: string, value: unknown) => void;
|
|
6
|
+
export declare const compare: (value: unknown, comparator: Comparator | undefined, expected: string) => boolean;
|
|
7
|
+
export declare const processTree: (root: ParentNode, scope: Scope) => void;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Instance } from "./element";
|
|
2
|
+
import { type Scope } from "./scope";
|
|
3
|
+
export interface CssBindings {
|
|
4
|
+
variables: Set<string>;
|
|
5
|
+
states: Set<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare const scanCss: (css: string, into: CssBindings) => void;
|
|
8
|
+
export declare const bindCss: (instance: Instance, scope: Scope) => void;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Definition, SetupResult } from "./types";
|
|
2
|
+
type Hook = () => unknown;
|
|
3
|
+
export declare const instances: WeakMap<Node, Instance>;
|
|
4
|
+
export declare class Instance {
|
|
5
|
+
readonly host: RealmElement;
|
|
6
|
+
readonly definition: Definition;
|
|
7
|
+
readonly internals: ElementInternals;
|
|
8
|
+
readonly controller: AbortController;
|
|
9
|
+
readonly refs: Record<string, Element>;
|
|
10
|
+
readonly disposers: (() => void)[];
|
|
11
|
+
readonly connected: Hook[];
|
|
12
|
+
readonly disconnected: Hook[];
|
|
13
|
+
readonly formReset: Hook[];
|
|
14
|
+
readonly formDisabled: ((disabled: boolean) => void)[];
|
|
15
|
+
readonly formStateRestore: ((state: unknown, mode: string) => void)[];
|
|
16
|
+
props: Record<string, unknown> | undefined;
|
|
17
|
+
readonly propAttributes: Map<string, string>;
|
|
18
|
+
readonly form: {
|
|
19
|
+
disabled: boolean;
|
|
20
|
+
};
|
|
21
|
+
readonly childWatchers: Set<() => void>;
|
|
22
|
+
attrs: Record<string, string | null> | undefined;
|
|
23
|
+
scope: SetupResult;
|
|
24
|
+
loading: number;
|
|
25
|
+
constructor(host: RealmElement, definition: Definition, internals: ElementInternals);
|
|
26
|
+
get signal(): AbortSignal;
|
|
27
|
+
has(name: string): boolean;
|
|
28
|
+
get(name: string): unknown;
|
|
29
|
+
findInParents(name: string): {
|
|
30
|
+
value: unknown;
|
|
31
|
+
} | undefined;
|
|
32
|
+
lookup(name: string): unknown;
|
|
33
|
+
setLoading(delta: number): void;
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare class RealmElement extends HTMLElement {
|
|
37
|
+
#private;
|
|
38
|
+
static definition: Definition;
|
|
39
|
+
connectedCallback(): void;
|
|
40
|
+
disconnectedCallback(): void;
|
|
41
|
+
attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
|
|
42
|
+
formResetCallback(): void;
|
|
43
|
+
formDisabledCallback(disabled: boolean): void;
|
|
44
|
+
formStateRestoreCallback(state: unknown, mode: string): void;
|
|
45
|
+
}
|
|
46
|
+
export declare const mountElementClass: (definition: Definition) => void;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { defineComponent } from "./definition";
|
|
2
|
+
export { importDefinitions } from "./loader";
|
|
3
|
+
export { prop } from "./props";
|
|
4
|
+
export { effect as observe, flush, reactive as useState, toRaw, untrack } from "./reactivity";
|
|
5
|
+
export { start } from "./start";
|
|
6
|
+
export { defineStore } from "./store";
|
|
7
|
+
export type { Context, StorageAdapter, StoreOptions } from "./types";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const importDefinitions: (url: string, chain?: ReadonlySet<string>) => Promise<void>;
|
|
2
|
+
export declare const noticeTag: (name: string) => void;
|
|
3
|
+
export declare const watchDocumentTags: (root: Document) => void;
|
|
4
|
+
export declare class ImportElement extends HTMLElement {
|
|
5
|
+
#private;
|
|
6
|
+
connectedCallback(): Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getOrCreate: <K, V>(map: Map<K, V> | WeakMap<K & object, V>, key: K, create: () => V) => V;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
type Kind = "string" | "number" | "boolean" | "enum" | "array" | "object" | "date";
|
|
2
|
+
export type Result = {
|
|
3
|
+
ok: true;
|
|
4
|
+
value: unknown;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
message: string;
|
|
8
|
+
};
|
|
9
|
+
interface Rules {
|
|
10
|
+
default?: unknown;
|
|
11
|
+
hasDefault?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
reflect?: boolean;
|
|
14
|
+
attribute?: string;
|
|
15
|
+
min?: number;
|
|
16
|
+
max?: number;
|
|
17
|
+
int?: boolean;
|
|
18
|
+
pattern?: RegExp;
|
|
19
|
+
format?: "email" | "url";
|
|
20
|
+
values?: readonly string[];
|
|
21
|
+
item?: PropType;
|
|
22
|
+
shape?: Record<string, PropType>;
|
|
23
|
+
}
|
|
24
|
+
export declare class PropType {
|
|
25
|
+
#private;
|
|
26
|
+
readonly kind: Kind;
|
|
27
|
+
readonly rules: Rules;
|
|
28
|
+
constructor(kind: Kind, rules?: Rules);
|
|
29
|
+
default(value: unknown): PropType;
|
|
30
|
+
required(): PropType;
|
|
31
|
+
optional(): PropType;
|
|
32
|
+
reflect(): PropType;
|
|
33
|
+
attribute(name: string): PropType;
|
|
34
|
+
min(value: number): PropType;
|
|
35
|
+
max(value: number): PropType;
|
|
36
|
+
int(): PropType;
|
|
37
|
+
pattern(value: RegExp): PropType;
|
|
38
|
+
email(): PropType;
|
|
39
|
+
url(): PropType;
|
|
40
|
+
get fallback(): unknown;
|
|
41
|
+
parse(text: string | null): Result;
|
|
42
|
+
check(value: unknown): Result;
|
|
43
|
+
serialize(value: unknown): string | null;
|
|
44
|
+
}
|
|
45
|
+
export declare const prop: {
|
|
46
|
+
string: () => PropType;
|
|
47
|
+
number: () => PropType;
|
|
48
|
+
boolean: () => PropType;
|
|
49
|
+
date: () => PropType;
|
|
50
|
+
enum: (values: readonly string[]) => PropType;
|
|
51
|
+
array: (item?: PropType) => PropType;
|
|
52
|
+
object: (shape?: Record<string, PropType>) => PropType;
|
|
53
|
+
};
|
|
54
|
+
export declare const toAttributeName: (key: string) => string;
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const flush: () => void;
|
|
2
|
+
export declare const tick: () => Promise<void>;
|
|
3
|
+
export declare const effect: (fn: () => unknown) => () => void;
|
|
4
|
+
export declare const untrack: <T>(fn: () => T) => T;
|
|
5
|
+
export declare const isObservable: (value: unknown) => value is object;
|
|
6
|
+
export declare const toRaw: <T>(value: T) => T;
|
|
7
|
+
export declare const isReactive: (value: unknown) => boolean;
|
|
8
|
+
export declare const reactive: <T extends object>(target: T) => T;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Handler, Setup } from "./types";
|
|
2
|
+
export declare const settingUp: Set<string>;
|
|
3
|
+
export declare const RUNTIME: string;
|
|
4
|
+
export declare const nextId: (prefix: string) => string;
|
|
5
|
+
export declare const EMPTY_SETUP: Setup;
|
|
6
|
+
export declare const runSetupScript: (id: string, code: string, module: boolean, label: string) => Promise<Setup>;
|
|
7
|
+
export declare const compileHandler: (code: string) => Handler | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type TokenType = "name" | "punct" | "string" | "number" | "regex" | "template";
|
|
2
|
+
export interface Token {
|
|
3
|
+
type: TokenType;
|
|
4
|
+
value: string;
|
|
5
|
+
newline: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const KEYWORDS: Set<string>;
|
|
8
|
+
export declare const tokenize: (source: string) => Token[];
|
|
9
|
+
export declare const topLevelNames: (source: string) => Set<string>;
|
|
10
|
+
export declare const freeNames: (code: string, names?: Set<string>) => Set<string>;
|
|
11
|
+
export interface ImportSplit {
|
|
12
|
+
imports: string;
|
|
13
|
+
body: string;
|
|
14
|
+
names: Set<string>;
|
|
15
|
+
}
|
|
16
|
+
export declare const splitImports: (source: string, base: string | null) => ImportSplit;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Instance } from "./element";
|
|
2
|
+
export interface Box {
|
|
3
|
+
value: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface Scope {
|
|
6
|
+
instance: Instance;
|
|
7
|
+
vars: ReadonlyArray<readonly [string, Box]>;
|
|
8
|
+
signal: AbortSignal;
|
|
9
|
+
disposers: (() => void)[];
|
|
10
|
+
}
|
|
11
|
+
export interface Reference {
|
|
12
|
+
text: string;
|
|
13
|
+
negate: boolean;
|
|
14
|
+
kind: "#" | "@";
|
|
15
|
+
path: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare const parseReference: (text: string) => Reference | undefined;
|
|
18
|
+
export declare const requireReference: (text: string | null, where: string, scope: Scope) => Reference | undefined;
|
|
19
|
+
export declare const readReference: (reference: Reference, scope: Scope) => unknown;
|
|
20
|
+
export declare const writeReference: (reference: Reference, scope: Scope, update: (current: unknown) => unknown) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const childController: (parent: AbortSignal) => AbortController;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const start: () => void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CssBindings } from "./css";
|
|
2
|
+
import type { PropType, prop } from "./props";
|
|
3
|
+
export type Handler = (this: Element, event: Event, ...vars: unknown[]) => unknown;
|
|
4
|
+
export interface SetupResult {
|
|
5
|
+
get(name: string): unknown;
|
|
6
|
+
handlers: Handler[];
|
|
7
|
+
}
|
|
8
|
+
export interface StoreOptions {
|
|
9
|
+
persist?: "local" | "session" | StorageAdapter;
|
|
10
|
+
}
|
|
11
|
+
export interface StorageAdapter {
|
|
12
|
+
get(key: string): string | null;
|
|
13
|
+
set(key: string, value: string): void;
|
|
14
|
+
}
|
|
15
|
+
export interface Context {
|
|
16
|
+
defineProps<T extends Record<string, PropType>>(schema: T): Record<keyof T, unknown>;
|
|
17
|
+
useState<T extends object>(initial: T): T;
|
|
18
|
+
useChildren(selector: string, attributes?: string[]): Element[];
|
|
19
|
+
tick(): Promise<void>;
|
|
20
|
+
listen(type: string, handler: (event: Event) => unknown, target?: EventTarget): void;
|
|
21
|
+
defineMethods(methods: object): void;
|
|
22
|
+
dispatch(type: string, detail?: unknown, options?: CustomEventInit): boolean;
|
|
23
|
+
attrs: Record<string, string | null>;
|
|
24
|
+
observe(fn: () => unknown): () => void;
|
|
25
|
+
onConnected(fn: () => unknown): void;
|
|
26
|
+
onDisconnected(fn: () => void): void;
|
|
27
|
+
onFormReset(fn: () => void): void;
|
|
28
|
+
onFormDisabled(fn: (disabled: boolean) => void): void;
|
|
29
|
+
onFormStateRestore(fn: (state: unknown, mode: string) => void): void;
|
|
30
|
+
defineStore<T extends object>(name: string, initial: T, options?: StoreOptions): T;
|
|
31
|
+
lookup(name: string): unknown;
|
|
32
|
+
prop: typeof prop;
|
|
33
|
+
host: HTMLElement;
|
|
34
|
+
refs: Record<string, Element>;
|
|
35
|
+
signal: AbortSignal;
|
|
36
|
+
internals: ElementInternals;
|
|
37
|
+
setTimeout(callback: (...args: unknown[]) => void, delay?: number, ...args: unknown[]): number;
|
|
38
|
+
setInterval(callback: (...args: unknown[]) => void, delay?: number, ...args: unknown[]): number;
|
|
39
|
+
clearTimeout(id?: number): void;
|
|
40
|
+
clearInterval(id?: number): void;
|
|
41
|
+
untrack<T>(fn: () => T): T;
|
|
42
|
+
}
|
|
43
|
+
export type Setup = (context: Context) => SetupResult;
|
|
44
|
+
export interface Definition {
|
|
45
|
+
name: string;
|
|
46
|
+
source: string;
|
|
47
|
+
base: string;
|
|
48
|
+
markup: DocumentFragment;
|
|
49
|
+
sheets: CSSStyleSheet[];
|
|
50
|
+
names: Set<string>;
|
|
51
|
+
handlers: Map<string, number>;
|
|
52
|
+
events: string[];
|
|
53
|
+
formAssociated: boolean;
|
|
54
|
+
role: string | null;
|
|
55
|
+
slot: string | null;
|
|
56
|
+
delegatesFocus: boolean;
|
|
57
|
+
css: CssBindings;
|
|
58
|
+
setup: Setup;
|
|
59
|
+
}
|