@toyz/loom 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +4 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +9 -9
- package/dist/app.js.map +1 -1
- package/dist/decorators/create.d.ts +16 -25
- package/dist/decorators/create.d.ts.map +1 -1
- package/dist/decorators/create.js +25 -34
- package/dist/decorators/create.js.map +1 -1
- package/dist/decorators/events.d.ts +10 -8
- package/dist/decorators/events.d.ts.map +1 -1
- package/dist/decorators/events.js +53 -43
- package/dist/decorators/events.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/symbols.d.ts +2 -0
- package/dist/decorators/symbols.d.ts.map +1 -1
- package/dist/decorators/symbols.js +2 -0
- package/dist/decorators/symbols.js.map +1 -1
- package/dist/di/decorators.d.ts +15 -15
- package/dist/di/decorators.d.ts.map +1 -1
- package/dist/di/decorators.js +23 -33
- package/dist/di/decorators.js.map +1 -1
- package/dist/di/watch.d.ts +5 -20
- package/dist/di/watch.d.ts.map +1 -1
- package/dist/di/watch.js +5 -38
- package/dist/di/watch.js.map +1 -1
- package/dist/element/decorators.d.ts +26 -10
- package/dist/element/decorators.d.ts.map +1 -1
- package/dist/element/decorators.js +75 -31
- package/dist/element/decorators.js.map +1 -1
- package/dist/element/element.d.ts.map +1 -1
- package/dist/element/element.js +15 -3
- package/dist/element/element.js.map +1 -1
- package/dist/element/form.d.ts +63 -0
- package/dist/element/form.d.ts.map +1 -0
- package/dist/element/form.js +167 -0
- package/dist/element/form.js.map +1 -0
- package/dist/element/icon.d.ts +3 -3
- package/dist/element/icon.d.ts.map +1 -1
- package/dist/element/icon.js +131 -74
- package/dist/element/icon.js.map +1 -1
- package/dist/element/index.d.ts +8 -1
- package/dist/element/index.d.ts.map +1 -1
- package/dist/element/index.js +9 -1
- package/dist/element/index.js.map +1 -1
- package/dist/element/lazy.d.ts +31 -0
- package/dist/element/lazy.d.ts.map +1 -0
- package/dist/element/lazy.js +71 -0
- package/dist/element/lazy.js.map +1 -0
- package/dist/element/lifecycle.d.ts +27 -29
- package/dist/element/lifecycle.d.ts.map +1 -1
- package/dist/element/lifecycle.js +60 -79
- package/dist/element/lifecycle.js.map +1 -1
- package/dist/element/slots.d.ts +23 -0
- package/dist/element/slots.d.ts.map +1 -0
- package/dist/element/slots.js +54 -0
- package/dist/element/slots.js.map +1 -0
- package/dist/element/timing.d.ts +10 -7
- package/dist/element/timing.d.ts.map +1 -1
- package/dist/element/timing.js +67 -52
- package/dist/element/timing.js.map +1 -1
- package/dist/element/transition.d.ts +32 -0
- package/dist/element/transition.d.ts.map +1 -0
- package/dist/element/transition.js +70 -0
- package/dist/element/transition.js.map +1 -0
- package/dist/element/virtual.js +235 -194
- package/dist/element/virtual.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/router/decorators.d.ts +9 -38
- package/dist/router/decorators.d.ts.map +1 -1
- package/dist/router/decorators.js +7 -52
- package/dist/router/decorators.js.map +1 -1
- package/dist/router/link.d.ts +4 -4
- package/dist/router/link.d.ts.map +1 -1
- package/dist/router/link.js +134 -72
- package/dist/router/link.js.map +1 -1
- package/dist/router/outlet.d.ts +2 -2
- package/dist/router/outlet.d.ts.map +1 -1
- package/dist/router/outlet.js +188 -138
- package/dist/router/outlet.js.map +1 -1
- package/dist/router/route-lifecycle.d.ts +2 -2
- package/dist/router/route-lifecycle.d.ts.map +1 -1
- package/dist/router/route-lifecycle.js +18 -8
- package/dist/router/route-lifecycle.js.map +1 -1
- package/dist/router/route.d.ts +1 -1
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/router.js +2 -2
- package/dist/router/router.js.map +1 -1
- package/dist/store/decorators.d.ts +32 -24
- package/dist/store/decorators.d.ts.map +1 -1
- package/dist/store/decorators.js +98 -117
- package/dist/store/decorators.js.map +1 -1
- package/dist/store/watch.d.ts +24 -11
- package/dist/store/watch.d.ts.map +1 -1
- package/dist/store/watch.js +43 -16
- package/dist/store/watch.js.map +1 -1
- package/dist/testing.d.ts +55 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +99 -0
- package/dist/testing.js.map +1 -0
- package/dist/transform/transform.d.ts +7 -3
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +17 -9
- package/dist/transform/transform.js.map +1 -1
- package/dist/transform/typed.d.ts +1 -1
- package/dist/transform/typed.d.ts.map +1 -1
- package/dist/transform/typed.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — @form<T> property decorator
|
|
3
|
+
*
|
|
4
|
+
* DOM-independent form state management with validation, transforms,
|
|
5
|
+
* dirty tracking, and explicit template binding.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* @form<LoginForm>({
|
|
9
|
+
* email: { transform: toTrimmed, validate: v => v.includes("@") || "Invalid email" },
|
|
10
|
+
* password: { validate: v => v.length >= 8 || "Min 8 chars" },
|
|
11
|
+
* remember: { transform: toBoolean },
|
|
12
|
+
* })
|
|
13
|
+
* accessor login!: FormState<LoginForm>;
|
|
14
|
+
*
|
|
15
|
+
* update() {
|
|
16
|
+
* const f = this.login;
|
|
17
|
+
* return (
|
|
18
|
+
* <form>
|
|
19
|
+
* <input value={f.data.email} onInput={f.bind("email")} />
|
|
20
|
+
* <input value={f.data.password} onInput={f.bind("password")} />
|
|
21
|
+
* <button disabled={!f.valid}>Submit</button>
|
|
22
|
+
* </form>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
// ── Helpers ──
|
|
28
|
+
/**
|
|
29
|
+
* Read a form element's value, handling checkboxes.
|
|
30
|
+
*/
|
|
31
|
+
function readInputValue(input) {
|
|
32
|
+
if (input instanceof HTMLInputElement && input.type === "checkbox") {
|
|
33
|
+
return input.checked ? "true" : "false";
|
|
34
|
+
}
|
|
35
|
+
return input.value;
|
|
36
|
+
}
|
|
37
|
+
// ── Core ──
|
|
38
|
+
/**
|
|
39
|
+
* Create a FormState<T> instance — pure reactive data, no DOM dependency.
|
|
40
|
+
*/
|
|
41
|
+
export function createFormState(schema, scheduleUpdate) {
|
|
42
|
+
// Initialize all fields to empty string (or transform of empty)
|
|
43
|
+
const initial = {};
|
|
44
|
+
const current = {};
|
|
45
|
+
const errors = {};
|
|
46
|
+
const touched = new Set();
|
|
47
|
+
let validatedAll = false;
|
|
48
|
+
for (const key of Object.keys(schema)) {
|
|
49
|
+
const fieldSchema = schema[key];
|
|
50
|
+
const raw = "";
|
|
51
|
+
const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
|
|
52
|
+
initial[key] = transformed;
|
|
53
|
+
current[key] = transformed;
|
|
54
|
+
}
|
|
55
|
+
let isValid = true;
|
|
56
|
+
// Compute initial validity (without surfacing errors)
|
|
57
|
+
for (const key of Object.keys(schema)) {
|
|
58
|
+
const fieldSchema = schema[key];
|
|
59
|
+
if (fieldSchema?.validate) {
|
|
60
|
+
const result = fieldSchema.validate(current[key]);
|
|
61
|
+
if (result !== true)
|
|
62
|
+
isValid = false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Validation — only surfaces errors for touched fields (or all if validate() was called)
|
|
66
|
+
function runValidation() {
|
|
67
|
+
let allValid = true;
|
|
68
|
+
for (const key of Object.keys(schema)) {
|
|
69
|
+
const fieldSchema = schema[key];
|
|
70
|
+
if (fieldSchema?.validate) {
|
|
71
|
+
const result = fieldSchema.validate(current[key]);
|
|
72
|
+
if (result === true) {
|
|
73
|
+
delete errors[key];
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
allValid = false;
|
|
77
|
+
// Only surface error if field was touched or validate() was called
|
|
78
|
+
if (touched.has(key) || validatedAll) {
|
|
79
|
+
errors[key] = result;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
isValid = allValid;
|
|
85
|
+
return allValid;
|
|
86
|
+
}
|
|
87
|
+
// Bind handlers cache
|
|
88
|
+
const bindCache = new Map();
|
|
89
|
+
const state = {
|
|
90
|
+
get data() {
|
|
91
|
+
return current;
|
|
92
|
+
},
|
|
93
|
+
get errors() {
|
|
94
|
+
return errors;
|
|
95
|
+
},
|
|
96
|
+
get valid() {
|
|
97
|
+
return isValid;
|
|
98
|
+
},
|
|
99
|
+
get dirty() {
|
|
100
|
+
for (const key of Object.keys(schema)) {
|
|
101
|
+
if (current[key] !== initial[key])
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
},
|
|
106
|
+
reset() {
|
|
107
|
+
for (const key of Object.keys(schema)) {
|
|
108
|
+
current[key] = initial[key];
|
|
109
|
+
}
|
|
110
|
+
touched.clear();
|
|
111
|
+
validatedAll = false;
|
|
112
|
+
// Clear all errors on reset
|
|
113
|
+
for (const key of Object.keys(errors)) {
|
|
114
|
+
delete errors[key];
|
|
115
|
+
}
|
|
116
|
+
scheduleUpdate();
|
|
117
|
+
},
|
|
118
|
+
validate() {
|
|
119
|
+
validatedAll = true;
|
|
120
|
+
const result = runValidation();
|
|
121
|
+
scheduleUpdate();
|
|
122
|
+
return result;
|
|
123
|
+
},
|
|
124
|
+
bind(field) {
|
|
125
|
+
const key = field;
|
|
126
|
+
if (!bindCache.has(key)) {
|
|
127
|
+
bindCache.set(key, (e) => {
|
|
128
|
+
const input = e.target;
|
|
129
|
+
const raw = readInputValue(input);
|
|
130
|
+
const fieldSchema = schema[field];
|
|
131
|
+
const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
|
|
132
|
+
current[key] = transformed;
|
|
133
|
+
touched.add(key);
|
|
134
|
+
runValidation();
|
|
135
|
+
scheduleUpdate();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return bindCache.get(key);
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
return state;
|
|
142
|
+
}
|
|
143
|
+
// ── Decorator ──
|
|
144
|
+
/**
|
|
145
|
+
* @form<T>(schema) — Auto-accessor decorator
|
|
146
|
+
*
|
|
147
|
+
* Creates a FormState<T> eagerly at class initialization.
|
|
148
|
+
* No DOM dependency — use `.bind(field)` in your template for explicit binding.
|
|
149
|
+
*/
|
|
150
|
+
export function form(schema) {
|
|
151
|
+
return (_target, context) => {
|
|
152
|
+
const stateKey = Symbol(`form:${String(context.name)}`);
|
|
153
|
+
return {
|
|
154
|
+
get() {
|
|
155
|
+
if (!this[stateKey]) {
|
|
156
|
+
const scheduleUpdate = () => this.scheduleUpdate?.();
|
|
157
|
+
this[stateKey] = createFormState(schema, scheduleUpdate);
|
|
158
|
+
}
|
|
159
|
+
return this[stateKey];
|
|
160
|
+
},
|
|
161
|
+
set(_val) {
|
|
162
|
+
// Ignore external sets — state is managed internally
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"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"}
|
package/dist/element/icon.d.ts
CHANGED
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
import { LoomElement } from "./element";
|
|
15
15
|
export declare class LoomIcon extends LoomElement {
|
|
16
16
|
/** Icon name (must be registered via LoomIcon.register) */
|
|
17
|
-
name: string;
|
|
17
|
+
accessor name: string;
|
|
18
18
|
/** Size in pixels */
|
|
19
|
-
size: number;
|
|
19
|
+
accessor size: number;
|
|
20
20
|
/** Stroke color (CSS value) */
|
|
21
|
-
color: string;
|
|
21
|
+
accessor color: string;
|
|
22
22
|
/** Register an icon. `svgInner` is the SVG inner content (paths, circles, etc). */
|
|
23
23
|
static register(name: string, svgInner: string): void;
|
|
24
24
|
/** Register multiple icons at once. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC,qBACa,QAAS,SAAQ,WAAW;IAEvC,2DAA2D;IACrD,IAAI,SAAM;
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC,qBACa,QAAS,SAAQ,WAAW;IAEvC,2DAA2D;IACrD,QAAQ,CAAC,IAAI,SAAM;IAEzB,qBAAqB;IACf,QAAQ,CAAC,IAAI,SAAM;IAEzB,+BAA+B;IACzB,QAAQ,CAAC,KAAK,SAAkB;IAEtC,mFAAmF;IACnF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,uCAAuC;IACvC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,sCAAsC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,sCAAsC;IACtC,MAAM,KAAK,KAAK,IAAI,MAAM,EAAE,CAE3B;IAED,mFAAmF;IACnF,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAU9E,iBAAiB;IASjB,MAAM;CAiBP"}
|
package/dist/element/icon.js
CHANGED
|
@@ -11,11 +11,39 @@
|
|
|
11
11
|
* // Use anywhere in JSX
|
|
12
12
|
* <loom-icon name="bolt" size={20} color="var(--accent)" />
|
|
13
13
|
*/
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
15
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
16
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
17
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
18
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
19
|
+
var _, done = false;
|
|
20
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
21
|
+
var context = {};
|
|
22
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
23
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
24
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
25
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
26
|
+
if (kind === "accessor") {
|
|
27
|
+
if (result === void 0) continue;
|
|
28
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
29
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
30
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
31
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
32
|
+
}
|
|
33
|
+
else if (_ = accept(result)) {
|
|
34
|
+
if (kind === "field") initializers.unshift(_);
|
|
35
|
+
else descriptor[key] = _;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
39
|
+
done = true;
|
|
40
|
+
};
|
|
41
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
42
|
+
var useValue = arguments.length > 2;
|
|
43
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
44
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
45
|
+
}
|
|
46
|
+
return useValue ? value : void 0;
|
|
19
47
|
};
|
|
20
48
|
import { LoomElement } from "./element";
|
|
21
49
|
import { component } from "./decorators";
|
|
@@ -43,78 +71,107 @@ const baseStyles = css `
|
|
|
43
71
|
`;
|
|
44
72
|
/** Icon path data registry (name → SVG inner content) */
|
|
45
73
|
const registry = new Map();
|
|
46
|
-
let LoomIcon =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
74
|
+
let LoomIcon = (() => {
|
|
75
|
+
let _classDecorators = [component("loom-icon")];
|
|
76
|
+
let _classDescriptor;
|
|
77
|
+
let _classExtraInitializers = [];
|
|
78
|
+
let _classThis;
|
|
79
|
+
let _classSuper = LoomElement;
|
|
80
|
+
let _name_decorators;
|
|
81
|
+
let _name_initializers = [];
|
|
82
|
+
let _name_extraInitializers = [];
|
|
83
|
+
let _size_decorators;
|
|
84
|
+
let _size_initializers = [];
|
|
85
|
+
let _size_extraInitializers = [];
|
|
86
|
+
let _color_decorators;
|
|
87
|
+
let _color_initializers = [];
|
|
88
|
+
let _color_extraInitializers = [];
|
|
89
|
+
var LoomIcon = class extends _classSuper {
|
|
90
|
+
static { _classThis = this; }
|
|
91
|
+
static {
|
|
92
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
93
|
+
_name_decorators = [prop];
|
|
94
|
+
_size_decorators = [prop];
|
|
95
|
+
_color_decorators = [prop];
|
|
96
|
+
__esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
|
|
97
|
+
__esDecorate(this, null, _size_decorators, { kind: "accessor", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
|
|
98
|
+
__esDecorate(this, null, _color_decorators, { kind: "accessor", name: "color", static: false, private: false, access: { has: obj => "color" in obj, get: obj => obj.color, set: (obj, value) => { obj.color = value; } }, metadata: _metadata }, _color_initializers, _color_extraInitializers);
|
|
99
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
100
|
+
LoomIcon = _classThis = _classDescriptor.value;
|
|
101
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
102
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
61
103
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
104
|
+
#name_accessor_storage = __runInitializers(this, _name_initializers, "");
|
|
105
|
+
/** Icon name (must be registered via LoomIcon.register) */
|
|
106
|
+
get name() { return this.#name_accessor_storage; }
|
|
107
|
+
set name(value) { this.#name_accessor_storage = value; }
|
|
108
|
+
#size_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _size_initializers, 24));
|
|
109
|
+
/** Size in pixels */
|
|
110
|
+
get size() { return this.#size_accessor_storage; }
|
|
111
|
+
set size(value) { this.#size_accessor_storage = value; }
|
|
112
|
+
#color_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _color_initializers, "currentColor"));
|
|
113
|
+
/** Stroke color (CSS value) */
|
|
114
|
+
get color() { return this.#color_accessor_storage; }
|
|
115
|
+
set color(value) { this.#color_accessor_storage = value; }
|
|
116
|
+
/** Register an icon. `svgInner` is the SVG inner content (paths, circles, etc). */
|
|
117
|
+
static register(name, svgInner) {
|
|
118
|
+
registry.set(name, svgInner);
|
|
77
119
|
}
|
|
78
|
-
|
|
79
|
-
|
|
120
|
+
/** Register multiple icons at once. */
|
|
121
|
+
static registerAll(icons) {
|
|
122
|
+
for (const [name, svg] of Object.entries(icons)) {
|
|
123
|
+
registry.set(name, svg);
|
|
124
|
+
}
|
|
80
125
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const s = this.getAttribute("size");
|
|
85
|
-
const c = this.getAttribute("color");
|
|
86
|
-
this.style.setProperty("--_s", `${s ?? this.size}px`);
|
|
87
|
-
if (c)
|
|
88
|
-
this.style.setProperty("--_c", c);
|
|
89
|
-
super.connectedCallback();
|
|
90
|
-
}
|
|
91
|
-
update() {
|
|
92
|
-
this.shadow.adoptedStyleSheets = [baseStyles];
|
|
93
|
-
this.style.setProperty("--_s", `${this.size}px`);
|
|
94
|
-
this.style.setProperty("--_c", this.color);
|
|
95
|
-
const inner = registry.get(this.name);
|
|
96
|
-
if (!inner) {
|
|
97
|
-
const placeholder = document.createElement("span");
|
|
98
|
-
return placeholder;
|
|
126
|
+
/** Check if an icon is registered. */
|
|
127
|
+
static has(name) {
|
|
128
|
+
return registry.has(name);
|
|
99
129
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
130
|
+
/** List all registered icon names. */
|
|
131
|
+
static get names() {
|
|
132
|
+
return Array.from(registry.keys());
|
|
133
|
+
}
|
|
134
|
+
/** Immediately apply size/color from attributes — runs before connectedCallback */
|
|
135
|
+
attributeChangedCallback(name, _old, val) {
|
|
136
|
+
// Note: @component decorator wraps this method and parses @prop values
|
|
137
|
+
// before calling us. We just sync the CSS custom properties immediately.
|
|
138
|
+
if (name === "size" && val !== null) {
|
|
139
|
+
this.style.setProperty("--_s", `${val}px`);
|
|
140
|
+
}
|
|
141
|
+
else if (name === "color" && val !== null) {
|
|
142
|
+
this.style.setProperty("--_c", val);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
connectedCallback() {
|
|
146
|
+
// Set CSS vars from current attributes before first paint
|
|
147
|
+
const s = this.getAttribute("size");
|
|
148
|
+
const c = this.getAttribute("color");
|
|
149
|
+
this.style.setProperty("--_s", `${s ?? this.size}px`);
|
|
150
|
+
if (c)
|
|
151
|
+
this.style.setProperty("--_c", c);
|
|
152
|
+
super.connectedCallback();
|
|
153
|
+
}
|
|
154
|
+
update() {
|
|
155
|
+
this.shadow.adoptedStyleSheets = [baseStyles];
|
|
156
|
+
this.style.setProperty("--_s", `${this.size}px`);
|
|
157
|
+
this.style.setProperty("--_c", this.color);
|
|
158
|
+
const inner = registry.get(this.name);
|
|
159
|
+
if (!inner) {
|
|
160
|
+
const placeholder = document.createElement("span");
|
|
161
|
+
return placeholder;
|
|
162
|
+
}
|
|
163
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
164
|
+
svg.setAttribute("viewBox", "0 0 24 24");
|
|
165
|
+
svg.setAttribute("aria-hidden", "true");
|
|
166
|
+
svg.innerHTML = inner;
|
|
167
|
+
return svg;
|
|
168
|
+
}
|
|
169
|
+
constructor() {
|
|
170
|
+
super(...arguments);
|
|
171
|
+
__runInitializers(this, _color_extraInitializers);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
return LoomIcon = _classThis;
|
|
175
|
+
})();
|
|
119
176
|
export { LoomIcon };
|
|
120
177
|
//# sourceMappingURL=icon.js.map
|
package/dist/element/icon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"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"}
|
package/dist/element/index.d.ts
CHANGED
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { LoomElement } from "./element";
|
|
7
7
|
export type { VirtualListOptions } from "./virtual";
|
|
8
|
-
export { component, query, queryAll } from "./decorators";
|
|
8
|
+
export { component, query, queryAll, styles } from "./decorators";
|
|
9
9
|
export { catch_, suspend, mount, unmount } from "./lifecycle";
|
|
10
10
|
export { interval, timeout, debounce, throttle, animationFrame } from "./timing";
|
|
11
|
+
export { form } from "./form";
|
|
12
|
+
export type { FormState, FormSchema, FieldSchema } from "./form";
|
|
13
|
+
export { lazy } from "./lazy";
|
|
14
|
+
export type { LazyOptions } from "./lazy";
|
|
15
|
+
export { slot } from "./slots";
|
|
16
|
+
export { transition } from "./transition";
|
|
17
|
+
export type { TransitionOptions } from "./transition";
|
|
11
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/element/index.js
CHANGED
|
@@ -6,9 +6,17 @@
|
|
|
6
6
|
// Base element
|
|
7
7
|
export { LoomElement } from "./element";
|
|
8
8
|
// Element decorators
|
|
9
|
-
export { component, query, queryAll } from "./decorators";
|
|
9
|
+
export { component, query, queryAll, styles } from "./decorators";
|
|
10
10
|
// Lifecycle decorators
|
|
11
11
|
export { catch_, suspend, mount, unmount } from "./lifecycle";
|
|
12
12
|
// Timing decorators
|
|
13
13
|
export { interval, timeout, debounce, throttle, animationFrame } from "./timing";
|
|
14
|
+
// Form decorator
|
|
15
|
+
export { form } from "./form";
|
|
16
|
+
// Lazy loading decorator
|
|
17
|
+
export { lazy } from "./lazy";
|
|
18
|
+
// Slot decorator
|
|
19
|
+
export { slot } from "./slots";
|
|
20
|
+
// Transition decorator
|
|
21
|
+
export { transition } from "./transition";
|
|
14
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9D,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjF,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — @lazy decorator (TC39 Stage 3)
|
|
3
|
+
*
|
|
4
|
+
* Stackable class decorator that defers module loading until first mount.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* @component("settings-page")
|
|
8
|
+
* @route("/settings")
|
|
9
|
+
* @lazy(() => import("./pages/settings"))
|
|
10
|
+
* class SettingsPage extends LoomElement {}
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
declare const LAZY_LOADER: unique symbol;
|
|
14
|
+
declare const LAZY_OPTS: unique symbol;
|
|
15
|
+
declare const LAZY_LOADED: unique symbol;
|
|
16
|
+
export interface LazyOptions {
|
|
17
|
+
/** Tag name of a loading component to show while the chunk loads */
|
|
18
|
+
loading?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @lazy(loader, opts?) — Stackable class decorator
|
|
22
|
+
*
|
|
23
|
+
* Defers the real class body until first connectedCallback.
|
|
24
|
+
* The loader should return a dynamic import whose default export
|
|
25
|
+
* is the real component class.
|
|
26
|
+
*/
|
|
27
|
+
export declare function lazy(loader: () => Promise<{
|
|
28
|
+
default: unknown;
|
|
29
|
+
} | unknown>, opts?: LazyOptions): (value: Function, _context: ClassDecoratorContext) => void;
|
|
30
|
+
export { LAZY_LOADER, LAZY_OPTS, LAZY_LOADED };
|
|
31
|
+
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/element/lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,QAAA,MAAM,WAAW,eAA6B,CAAC;AAC/C,QAAA,MAAM,SAAS,eAA2B,CAAC;AAC3C,QAAA,MAAM,WAAW,eAA6B,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAClB,MAAM,EAAE,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,EACrD,IAAI,CAAC,EAAE,WAAW,IAED,OAAO,QAAQ,EAAE,UAAU,qBAAqB,UAkDlE;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — @lazy decorator (TC39 Stage 3)
|
|
3
|
+
*
|
|
4
|
+
* Stackable class decorator that defers module loading until first mount.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* @component("settings-page")
|
|
8
|
+
* @route("/settings")
|
|
9
|
+
* @lazy(() => import("./pages/settings"))
|
|
10
|
+
* class SettingsPage extends LoomElement {}
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
const LAZY_LOADER = Symbol("loom:lazy:loader");
|
|
14
|
+
const LAZY_OPTS = Symbol("loom:lazy:opts");
|
|
15
|
+
const LAZY_LOADED = Symbol("loom:lazy:loaded");
|
|
16
|
+
/**
|
|
17
|
+
* @lazy(loader, opts?) — Stackable class decorator
|
|
18
|
+
*
|
|
19
|
+
* Defers the real class body until first connectedCallback.
|
|
20
|
+
* The loader should return a dynamic import whose default export
|
|
21
|
+
* is the real component class.
|
|
22
|
+
*/
|
|
23
|
+
export function lazy(loader, opts) {
|
|
24
|
+
return function (value, _context) {
|
|
25
|
+
const ctor = value;
|
|
26
|
+
ctor[LAZY_LOADER] = loader;
|
|
27
|
+
ctor[LAZY_OPTS] = opts;
|
|
28
|
+
const origConnected = ctor.prototype.connectedCallback;
|
|
29
|
+
ctor.prototype.connectedCallback = async function () {
|
|
30
|
+
if (ctor[LAZY_LOADED]) {
|
|
31
|
+
origConnected?.call(this);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (opts?.loading) {
|
|
35
|
+
const loadingEl = document.createElement(opts.loading);
|
|
36
|
+
this.shadow.appendChild(loadingEl);
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const mod = await loader();
|
|
40
|
+
const RealClass = mod.default ?? mod;
|
|
41
|
+
const realProto = RealClass.prototype;
|
|
42
|
+
const descriptors = Object.getOwnPropertyDescriptors(realProto);
|
|
43
|
+
for (const [key, desc] of Object.entries(descriptors)) {
|
|
44
|
+
if (key === "constructor")
|
|
45
|
+
continue;
|
|
46
|
+
Object.defineProperty(ctor.prototype, key, desc);
|
|
47
|
+
}
|
|
48
|
+
const staticDescs = Object.getOwnPropertyDescriptors(RealClass);
|
|
49
|
+
for (const [key, desc] of Object.entries(staticDescs)) {
|
|
50
|
+
if (["prototype", "length", "name"].includes(key))
|
|
51
|
+
continue;
|
|
52
|
+
Object.defineProperty(ctor, key, desc);
|
|
53
|
+
}
|
|
54
|
+
ctor[LAZY_LOADED] = true;
|
|
55
|
+
this.shadow.innerHTML = "";
|
|
56
|
+
if (ctor.prototype.connectedCallback !== origConnected) {
|
|
57
|
+
ctor.prototype.connectedCallback.call(this);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
origConnected?.call(this);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error("[Loom @lazy] Failed to load module:", err);
|
|
65
|
+
this.shadow.innerHTML = `<p style="color:red">Failed to load component</p>`;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export { LAZY_LOADER, LAZY_OPTS, LAZY_LOADED };
|
|
71
|
+
//# sourceMappingURL=lazy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/element/lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAO/C;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAClB,MAAqD,EACrD,IAAkB;IAElB,OAAO,UAAU,KAAe,EAAE,QAA+B;QAC/D,MAAM,IAAI,GAAG,KAAY,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAEvD,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK;YACtC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtB,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAI,GAA8B,CAAC,OAAO,IAAI,GAAG,CAAC;gBAEjE,MAAM,SAAS,GAAI,SAAsB,CAAC,SAAS,CAAC;gBACpD,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;gBAEhE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBACtD,IAAI,GAAG,KAAK,aAAa;wBAAE,SAAS;oBACpC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACnD,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,SAAmB,CAAC,CAAC;gBAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAC5D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,KAAK,aAAa,EAAE,CAAC;oBACvD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;gBAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,mDAAmD,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
|