@sigx/vite 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +40 -0
  2. package/dist/cli.d.ts +12 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +372 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/src/Component.d.ts +131 -0
  7. package/dist/core/src/Component.d.ts.map +1 -0
  8. package/dist/core/src/Component.js +272 -0
  9. package/dist/core/src/Component.js.map +1 -0
  10. package/dist/core/src/Signals.d.ts +34 -0
  11. package/dist/core/src/Signals.d.ts.map +1 -0
  12. package/dist/core/src/Signals.js +222 -0
  13. package/dist/core/src/Signals.js.map +1 -0
  14. package/dist/core/src/Templating.d.ts +11 -0
  15. package/dist/core/src/Templating.d.ts.map +1 -0
  16. package/dist/core/src/Templating.js +81 -0
  17. package/dist/core/src/Templating.js.map +1 -0
  18. package/dist/core/src/factory/index.d.ts +20 -0
  19. package/dist/core/src/factory/index.d.ts.map +1 -0
  20. package/dist/core/src/factory/index.js +50 -0
  21. package/dist/core/src/factory/index.js.map +1 -0
  22. package/dist/core/src/index.d.ts +8 -0
  23. package/dist/core/src/index.d.ts.map +1 -0
  24. package/dist/core/src/index.js +9 -0
  25. package/dist/core/src/index.js.map +1 -0
  26. package/dist/core/src/jsx-runtime.d.ts +43 -0
  27. package/dist/core/src/jsx-runtime.d.ts.map +1 -0
  28. package/dist/core/src/jsx-runtime.js +469 -0
  29. package/dist/core/src/jsx-runtime.js.map +1 -0
  30. package/dist/core/src/messaging/index.d.ts +9 -0
  31. package/dist/core/src/messaging/index.d.ts.map +1 -0
  32. package/dist/core/src/messaging/index.js +37 -0
  33. package/dist/core/src/messaging/index.js.map +1 -0
  34. package/dist/core/src/models/index.d.ts +18 -0
  35. package/dist/core/src/models/index.d.ts.map +1 -0
  36. package/dist/core/src/models/index.js +12 -0
  37. package/dist/core/src/models/index.js.map +1 -0
  38. package/dist/core/src/sheet.d.ts +51 -0
  39. package/dist/core/src/sheet.d.ts.map +1 -0
  40. package/dist/core/src/sheet.js +151 -0
  41. package/dist/core/src/sheet.js.map +1 -0
  42. package/dist/core/src/stores/DefineInjectable.d.ts +5 -0
  43. package/dist/core/src/stores/DefineInjectable.d.ts.map +1 -0
  44. package/dist/core/src/stores/DefineInjectable.js +56 -0
  45. package/dist/core/src/stores/DefineInjectable.js.map +1 -0
  46. package/dist/core/src/stores/Store.d.ts +70 -0
  47. package/dist/core/src/stores/Store.d.ts.map +1 -0
  48. package/dist/core/src/stores/Store.js +180 -0
  49. package/dist/core/src/stores/Store.js.map +1 -0
  50. package/dist/core/src/styled.d.ts +15 -0
  51. package/dist/core/src/styled.d.ts.map +1 -0
  52. package/dist/core/src/styled.js +62 -0
  53. package/dist/core/src/styled.js.map +1 -0
  54. package/dist/core/src/utils/index.d.ts +5 -0
  55. package/dist/core/src/utils/index.d.ts.map +1 -0
  56. package/dist/core/src/utils/index.js +12 -0
  57. package/dist/core/src/utils/index.js.map +1 -0
  58. package/dist/hmr-plugin/src/index.d.ts +2 -0
  59. package/dist/hmr-plugin/src/index.d.ts.map +1 -0
  60. package/dist/hmr-plugin/src/index.js +59 -0
  61. package/dist/hmr-plugin/src/index.js.map +1 -0
  62. package/dist/hmr.d.ts +10 -0
  63. package/dist/hmr.d.ts.map +1 -0
  64. package/dist/hmr.js +99 -0
  65. package/dist/hmr.js.map +1 -0
  66. package/dist/index.d.ts +12 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +52 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/vite/src/index.d.ts +2 -0
  71. package/dist/vite/src/index.d.ts.map +1 -0
  72. package/dist/vite/src/index.js +59 -0
  73. package/dist/vite/src/index.js.map +1 -0
  74. package/package.json +53 -0
@@ -0,0 +1,272 @@
1
+ // component.ts
2
+ import { render, registerComponentSchema, jsx } from "./jsx-runtime.js";
3
+ import { effect, signal, reactive } from "./Signals.js";
4
+ // Dev mode - can be set to false in production builds
5
+ const DEV = true;
6
+ let currentComponentContext = null;
7
+ export function getCurrentInstance() {
8
+ return currentComponentContext;
9
+ }
10
+ /**
11
+ * Adopt stylesheets for the current component.
12
+ * Works for both Shadow DOM and Light DOM components.
13
+ *
14
+ * @param sheets One or more CSSStyleSheet objects created via `css` tag
15
+ */
16
+ export function adoptStyles(...sheets) {
17
+ const ctx = getCurrentInstance();
18
+ if (!ctx) {
19
+ console.warn("adoptStyles called outside of component setup");
20
+ return;
21
+ }
22
+ if (ctx.shadow) {
23
+ // Shadow DOM: just adopt them
24
+ ctx.shadow.adoptedStyleSheets = [...ctx.shadow.adoptedStyleSheets, ...sheets];
25
+ }
26
+ else {
27
+ // Light DOM: adopt to document, but avoid duplicates
28
+ // Note: This affects the global document, so styles should be scoped or unique
29
+ const doc = document;
30
+ const existing = new Set(doc.adoptedStyleSheets);
31
+ const newSheets = sheets.filter(s => !existing.has(s));
32
+ if (newSheets.length > 0) {
33
+ doc.adoptedStyleSheets = [...doc.adoptedStyleSheets, ...newSheets];
34
+ }
35
+ }
36
+ }
37
+ export function onMount(fn) {
38
+ if (currentComponentContext) {
39
+ currentComponentContext.onMount(fn);
40
+ }
41
+ else {
42
+ console.warn("onMount called outside of component setup");
43
+ }
44
+ }
45
+ export function onCleanup(fn) {
46
+ if (currentComponentContext) {
47
+ currentComponentContext.onCleanup(fn);
48
+ }
49
+ else {
50
+ console.warn("onCleanup called outside of component setup");
51
+ }
52
+ }
53
+ const plugins = [];
54
+ export function registerComponentPlugin(plugin) {
55
+ plugins.push(plugin);
56
+ }
57
+ const setupRegistry = new Map();
58
+ /**
59
+ * Helper to create a proxy that tracks property access
60
+ * This allows us to auto-detect which props are used without explicit prop arrays
61
+ */
62
+ function createPropsProxy(target, onAccess) {
63
+ return new Proxy(target, {
64
+ get(obj, prop) {
65
+ if (typeof prop === 'string' && onAccess) {
66
+ onAccess(prop);
67
+ }
68
+ return obj[prop];
69
+ }
70
+ });
71
+ }
72
+ /**
73
+ * Define a component with automatic type registration.
74
+ * Returns a JSX factory function that can be used directly in JSX.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Mix props and events in any order with intersection
79
+ * export const MyComponent = defineComponent<
80
+ * DefineProp<"name", string, true> & DefineEvent<"change", string>
81
+ * >("my-component", ({ props, emit }) => { ... });
82
+ *
83
+ * // Or reverse order
84
+ * export const MyComponent = defineComponent<
85
+ * DefineEvent<"change", string> & DefineProp<"name", string, true>
86
+ * >("my-component", ({ props, emit }) => { ... });
87
+ * ```
88
+ */
89
+ export function defineComponent(tagName, setup, options = { shadow: true }) {
90
+ // Store/Update setup in registry for HMR support
91
+ setupRegistry.set(tagName, setup);
92
+ // Allow plugins to intercept component definition
93
+ for (const plugin of plugins) {
94
+ if (plugin.onDefine?.(tagName, setup)) {
95
+ return null; // Plugin handled it
96
+ }
97
+ }
98
+ class BaseComponent extends HTMLElement {
99
+ constructor() {
100
+ super();
101
+ this.__issigx = true;
102
+ this._mountCallbacks = [];
103
+ this._cleanupCallbacks = [];
104
+ this._dispose = null;
105
+ this._props = reactive({});
106
+ this._registeredProps = new Set();
107
+ if (options.shadow !== false) {
108
+ this.attachShadow({ mode: "open" });
109
+ }
110
+ // We'll set up property getters/setters dynamically as props are set
111
+ // This allows the type system to drive everything without runtime prop arrays
112
+ }
113
+ connectedCallback() {
114
+ // Check if we are just moving in the DOM
115
+ if (this.__isMoving)
116
+ return;
117
+ // Notify plugins
118
+ plugins.forEach(p => p.onConnect?.(tagName, this));
119
+ // Delay initialization to allow property bindings to be set first
120
+ // Properties are set synchronously during render, but after connectedCallback
121
+ setTimeout(() => this._init(), 0);
122
+ }
123
+ _registerProp(propName) {
124
+ if (this._registeredProps.has(propName))
125
+ return;
126
+ this._registeredProps.add(propName);
127
+ // Capture existing value if it was set before we defined the property
128
+ // (e.g. by jsx-runtime setting it as a property on the instance)
129
+ if (Object.prototype.hasOwnProperty.call(this, propName)) {
130
+ const existingValue = this[propName];
131
+ this._props[propName] = existingValue;
132
+ }
133
+ Object.defineProperty(this, propName, {
134
+ get() {
135
+ return this._props[propName];
136
+ },
137
+ set(value) {
138
+ this._props[propName] = value;
139
+ },
140
+ enumerable: true,
141
+ configurable: true,
142
+ });
143
+ }
144
+ _init() {
145
+ const el = this;
146
+ const shadow = this.shadowRoot;
147
+ // Track which props are accessed during setup to auto-register them
148
+ const accessedProps = new Set();
149
+ const propsProxy = createPropsProxy(this._props, (key) => {
150
+ accessedProps.add(key);
151
+ this._registerProp(key);
152
+ });
153
+ // Create typed emit function
154
+ const emit = (eventName, ...args) => {
155
+ const detail = args.length > 0 ? args[0] : undefined;
156
+ const event = new CustomEvent(eventName, {
157
+ detail,
158
+ bubbles: true,
159
+ composed: true,
160
+ });
161
+ el.dispatchEvent(event);
162
+ };
163
+ const getParent = (node) => {
164
+ // Try to find VNode attached to the element
165
+ let vnode = node?.__vnode;
166
+ if (vnode) {
167
+ // Walk up VNode tree to find the highest VNode with a DOM node
168
+ while (vnode && vnode.parent) {
169
+ vnode = vnode.parent;
170
+ if (vnode.dom) {
171
+ node = vnode.dom;
172
+ // If we hit a sigx component in the VNode tree, that is our parent!
173
+ if (node.__issigx) {
174
+ return node;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ // Standard DOM traversal from here (ShadowRoot boundary)
180
+ let current = node;
181
+ while (current) {
182
+ // Skip the starting node if it's the component itself (already handled or just starting)
183
+ if (current !== node && current.__issigx) {
184
+ return current;
185
+ }
186
+ if (current instanceof ShadowRoot) {
187
+ current = current.host;
188
+ // The host is always a component (or element), check it
189
+ if (current.__issigx) {
190
+ return current;
191
+ }
192
+ }
193
+ else {
194
+ current = current.parentNode;
195
+ }
196
+ }
197
+ return null;
198
+ };
199
+ const parent = getParent(this);
200
+ this.__parentComponent = parent;
201
+ const ctx = {
202
+ el,
203
+ shadow,
204
+ signal,
205
+ reactive,
206
+ props: propsProxy,
207
+ emit: emit,
208
+ parent,
209
+ onMount: (fn) => this._mountCallbacks.push(fn),
210
+ onCleanup: (fn) => this._cleanupCallbacks.push(fn)
211
+ };
212
+ // Use the latest setup from registry (supports HMR)
213
+ const currentSetup = setupRegistry.get(tagName) || setup;
214
+ const prevContext = currentComponentContext;
215
+ currentComponentContext = ctx;
216
+ let view;
217
+ try {
218
+ view = currentSetup(ctx);
219
+ }
220
+ finally {
221
+ currentComponentContext = prevContext;
222
+ }
223
+ let isFirstRun = true;
224
+ this._dispose = effect(() => {
225
+ const prev = currentComponentContext;
226
+ currentComponentContext = ctx;
227
+ try {
228
+ const tpl = view();
229
+ // Render to shadow root if available, otherwise to the element itself
230
+ render(tpl, shadow || el);
231
+ if (isFirstRun) {
232
+ isFirstRun = false;
233
+ const mountCtx = { el, shadow };
234
+ this._mountCallbacks.forEach((fn) => fn(mountCtx));
235
+ }
236
+ }
237
+ finally {
238
+ currentComponentContext = prev;
239
+ }
240
+ });
241
+ // Register schema for dev mode validation
242
+ if (DEV && accessedProps.size > 0) {
243
+ registerComponentSchema(tagName, Array.from(accessedProps));
244
+ }
245
+ }
246
+ disconnectedCallback() {
247
+ // Check if we are just moving in the DOM
248
+ if (this.__isMoving)
249
+ return;
250
+ // Notify plugins
251
+ plugins.forEach(p => p.onDisconnect?.(tagName, this));
252
+ const el = this;
253
+ const shadow = this.shadowRoot;
254
+ const ctx = { el, shadow };
255
+ this._cleanupCallbacks.forEach((fn) => fn(ctx));
256
+ this._cleanupCallbacks = [];
257
+ this._mountCallbacks = [];
258
+ this._dispose?.();
259
+ this._dispose = null;
260
+ // Clean up VDOM
261
+ render(null, shadow || el);
262
+ }
263
+ }
264
+ customElements.define(tagName, BaseComponent);
265
+ // Return JSX factory function that can be used as <PropTest count={5} />
266
+ const factory = ((props) => jsx(tagName, props));
267
+ factory.__tag = tagName;
268
+ factory.__props = null;
269
+ factory.__events = null;
270
+ return factory;
271
+ }
272
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.js","sourceRoot":"","sources":["../../../../core/src/Component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type EffectFn = () => void;
2
+ export interface ReactiveEffect extends EffectFn {
3
+ deps: Set<ReactiveEffect>[];
4
+ }
5
+ export declare function batch(fn: () => void): void;
6
+ export interface Signal<T> {
7
+ value: T;
8
+ }
9
+ export declare function signal<T>(initial: T): Signal<T>;
10
+ export declare function effect(fn: EffectFn): () => void;
11
+ /**
12
+ * Create a reactive object where all property accesses are tracked
13
+ */
14
+ export declare function reactive<T extends object>(target: T): T;
15
+ export type WatchSource<T = any> = Signal<T> | (() => T);
16
+ export type WatchCallback<V = any, OV = any> = (value: V, oldValue: OV, onCleanup: (fn: () => void) => void) => any;
17
+ export interface WatchOptions<Immediate = boolean> {
18
+ immediate?: Immediate;
19
+ deep?: boolean | number;
20
+ once?: boolean;
21
+ }
22
+ export interface WatchHandle {
23
+ (): void;
24
+ pause: () => void;
25
+ resume: () => void;
26
+ stop: () => void;
27
+ }
28
+ export declare function watch<T>(source: WatchSource<T>, cb: WatchCallback<T>, options?: WatchOptions): WatchHandle;
29
+ export type EffectScope = {
30
+ run<T>(fn: () => T): T | undefined;
31
+ stop(fromParent?: boolean): void;
32
+ };
33
+ export declare function effectScope(detached?: boolean): EffectScope;
34
+ //# sourceMappingURL=Signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signals.d.ts","sourceRoot":"","sources":["../../../../core/src/Signals.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAElC,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC5C,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;CAC/B;AAMD,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,QAcnC;AA0CD,MAAM,WAAW,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,CAAC;CACZ;AAMD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAqC/C;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,CAE/C;AAaD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAkEvD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC;AACpH,MAAM,WAAW,YAAY,CAAC,SAAS,GAAG,OAAO;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,CAgC1G;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACpC,CAAA;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,WAAW,CAc3D"}
@@ -0,0 +1,222 @@
1
+ // signals.ts
2
+ let activeEffect = null;
3
+ let batchDepth = 0;
4
+ const pendingEffects = new Set();
5
+ export function batch(fn) {
6
+ batchDepth++;
7
+ try {
8
+ fn();
9
+ }
10
+ finally {
11
+ batchDepth--;
12
+ if (batchDepth === 0) {
13
+ const effects = Array.from(pendingEffects);
14
+ pendingEffects.clear();
15
+ for (const effect of effects) {
16
+ effect();
17
+ }
18
+ }
19
+ }
20
+ }
21
+ function runEffect(fn) {
22
+ const effect = function () {
23
+ cleanup(effect);
24
+ activeEffect = effect;
25
+ fn();
26
+ activeEffect = null;
27
+ };
28
+ effect.deps = [];
29
+ effect();
30
+ // disposer
31
+ return () => cleanup(effect);
32
+ }
33
+ function cleanup(effect) {
34
+ if (!effect.deps)
35
+ return;
36
+ for (const dep of effect.deps) {
37
+ dep.delete(effect);
38
+ }
39
+ effect.deps.length = 0;
40
+ }
41
+ function track(depSet) {
42
+ if (!activeEffect)
43
+ return;
44
+ depSet.add(activeEffect);
45
+ activeEffect.deps.push(depSet);
46
+ }
47
+ function trigger(depSet) {
48
+ const effects = Array.from(depSet);
49
+ for (const effect of effects) {
50
+ if (batchDepth > 0) {
51
+ pendingEffects.add(effect);
52
+ }
53
+ else {
54
+ effect();
55
+ }
56
+ }
57
+ }
58
+ function isObject(val) {
59
+ return val !== null && typeof val === 'object';
60
+ }
61
+ export function signal(initial) {
62
+ let value = (isObject(initial) ? reactive(initial) : initial);
63
+ const dep = new Set();
64
+ // We use a target that has the 'value' property so that 'in' checks work
65
+ const target = { value: null };
66
+ return new Proxy(target, {
67
+ get(target, prop) {
68
+ if (prop === 'value') {
69
+ track(dep);
70
+ return value;
71
+ }
72
+ // Support primitive conversion for templates
73
+ if (prop === Symbol.toPrimitive || prop === 'toString' || prop === 'valueOf') {
74
+ return () => {
75
+ track(dep);
76
+ return value;
77
+ };
78
+ }
79
+ return Reflect.get(target, prop);
80
+ },
81
+ set(target, prop, newValue) {
82
+ if (prop === 'value') {
83
+ const newValToStore = (isObject(newValue) ? reactive(newValue) : newValue);
84
+ if (Object.is(newValToStore, value))
85
+ return true;
86
+ value = newValToStore;
87
+ trigger(dep);
88
+ return true;
89
+ }
90
+ return Reflect.set(target, prop, newValue);
91
+ },
92
+ has(target, prop) {
93
+ if (prop === 'value')
94
+ return true;
95
+ return Reflect.has(target, prop);
96
+ }
97
+ });
98
+ }
99
+ export function effect(fn) {
100
+ return runEffect(fn);
101
+ }
102
+ const arrayInstrumentations = {};
103
+ ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(method => {
104
+ arrayInstrumentations[method] = function (...args) {
105
+ let res;
106
+ batch(() => {
107
+ res = Array.prototype[method].apply(this, args);
108
+ });
109
+ return res;
110
+ };
111
+ });
112
+ /**
113
+ * Create a reactive object where all property accesses are tracked
114
+ */
115
+ export function reactive(target) {
116
+ const depsMap = new Map();
117
+ const reactiveCache = new WeakMap();
118
+ return new Proxy(target, {
119
+ get(obj, prop) {
120
+ if (Array.isArray(obj) && typeof prop === 'string' && arrayInstrumentations.hasOwnProperty(prop)) {
121
+ return arrayInstrumentations[prop];
122
+ }
123
+ const value = Reflect.get(obj, prop);
124
+ // Track this property access
125
+ let dep = depsMap.get(prop);
126
+ if (!dep) {
127
+ dep = new Set();
128
+ depsMap.set(prop, dep);
129
+ }
130
+ track(dep);
131
+ // If the value is an object, make it reactive too (with caching)
132
+ if (value && typeof value === 'object') {
133
+ let cached = reactiveCache.get(value);
134
+ if (!cached) {
135
+ cached = reactive(value);
136
+ reactiveCache.set(value, cached);
137
+ }
138
+ return cached;
139
+ }
140
+ return value;
141
+ },
142
+ set(obj, prop, newValue) {
143
+ const oldLength = Array.isArray(obj) ? obj.length : 0;
144
+ const oldValue = Reflect.get(obj, prop);
145
+ const result = Reflect.set(obj, prop, newValue);
146
+ // Only trigger if value actually changed
147
+ if (!Object.is(oldValue, newValue)) {
148
+ const dep = depsMap.get(prop);
149
+ if (dep) {
150
+ trigger(dep);
151
+ }
152
+ // Special handling for Arrays
153
+ if (Array.isArray(obj)) {
154
+ // If we set an index and length changed, trigger length dependency
155
+ if (prop !== 'length' && obj.length !== oldLength) {
156
+ const lengthDep = depsMap.get('length');
157
+ if (lengthDep) {
158
+ trigger(lengthDep);
159
+ }
160
+ }
161
+ // If we set length, trigger indices that are now out of bounds
162
+ if (prop === 'length' && typeof newValue === 'number' && newValue < oldLength) {
163
+ for (let i = newValue; i < oldLength; i++) {
164
+ const idxDep = depsMap.get(String(i));
165
+ if (idxDep)
166
+ trigger(idxDep);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ });
174
+ }
175
+ export function watch(source, cb, options) {
176
+ let oldValue;
177
+ let isFirst = true;
178
+ let cleanupFn = null;
179
+ const runner = effect(() => {
180
+ const newValue = typeof source === 'function' ? source() : source.value;
181
+ if (isFirst) {
182
+ if (options?.immediate) {
183
+ if (cleanupFn)
184
+ cleanupFn();
185
+ cb(newValue, oldValue, (fn) => cleanupFn = fn);
186
+ }
187
+ isFirst = false;
188
+ }
189
+ else {
190
+ if (cleanupFn)
191
+ cleanupFn();
192
+ cb(newValue, oldValue, (fn) => cleanupFn = fn);
193
+ }
194
+ oldValue = newValue;
195
+ });
196
+ const stop = () => {
197
+ runner();
198
+ if (cleanupFn)
199
+ cleanupFn();
200
+ };
201
+ const handle = stop;
202
+ handle.stop = stop;
203
+ handle.pause = () => { }; // Not implemented
204
+ handle.resume = () => { }; // Not implemented
205
+ return handle;
206
+ }
207
+ export function effectScope(detached) {
208
+ const effects = [];
209
+ let active = true;
210
+ return {
211
+ run(fn) {
212
+ if (!active)
213
+ return undefined;
214
+ return fn();
215
+ },
216
+ stop() {
217
+ active = false;
218
+ effects.forEach(e => e());
219
+ }
220
+ };
221
+ }
222
+ //# sourceMappingURL=Signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signals.js","sourceRoot":"","sources":["../../../../core/src/Signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type TemplateResult = string;
2
+ export type EventHandler = (event: Event) => void;
3
+ /**
4
+ * Tagged template function for creating HTML templates.
5
+ * @param strings - Template string parts
6
+ * @param values - Interpolated values
7
+ * @returns HTML string
8
+ */
9
+ export declare function html(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult;
10
+ export declare function render(templateResult: TemplateResult, container: Element | ShadowRoot): void;
11
+ //# sourceMappingURL=Templating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Templating.d.ts","sourceRoot":"","sources":["../../../../core/src/Templating.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAclD;;;;;GAKG;AACH,wBAAgB,IAAI,CAChB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,GACrB,cAAc,CA4BhB;AAED,wBAAgB,MAAM,CAClB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,OAAO,GAAG,UAAU,GAChC,IAAI,CAuCN"}
@@ -0,0 +1,81 @@
1
+ // templating.ts
2
+ // Special marker for event handlers
3
+ const EVENT_MARKER = "__event__";
4
+ let eventId = 0;
5
+ const eventRegistry = new Map();
6
+ /**
7
+ * Check if a value is a signal (has value property)
8
+ */
9
+ function isSignal(v) {
10
+ return v !== null && typeof v === "object" && "value" in v;
11
+ }
12
+ /**
13
+ * Tagged template function for creating HTML templates.
14
+ * @param strings - Template string parts
15
+ * @param values - Interpolated values
16
+ * @returns HTML string
17
+ */
18
+ export function html(strings, ...values) {
19
+ let out = "";
20
+ strings.forEach((str, i) => {
21
+ out += str;
22
+ if (i < values.length) {
23
+ let v = values[i];
24
+ // Auto-unwrap signals - check before checking for functions
25
+ if (isSignal(v)) {
26
+ v = v.value;
27
+ }
28
+ // Check if this is an event handler (function in an attribute position)
29
+ // Match @eventname=" at the end of the string
30
+ if (typeof v === "function" && /@\w+\s*=\s*"$/.test(str)) {
31
+ const id = `${EVENT_MARKER}${eventId++}`;
32
+ eventRegistry.set(id, v);
33
+ out += id;
34
+ }
35
+ else if (Array.isArray(v)) {
36
+ out += v.join("");
37
+ }
38
+ else if (v !== null && v !== undefined) {
39
+ out += String(v);
40
+ }
41
+ }
42
+ });
43
+ return out;
44
+ }
45
+ export function render(templateResult, container) {
46
+ // Clear old event listeners
47
+ const oldHandlers = container.__handlers__;
48
+ if (oldHandlers) {
49
+ oldHandlers.forEach((handler) => {
50
+ container.removeEventListener(handler.type, handler.fn, true);
51
+ });
52
+ }
53
+ container.innerHTML = templateResult;
54
+ // Attach new event listeners
55
+ const handlers = [];
56
+ const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);
57
+ let node;
58
+ while ((node = walker.nextNode())) {
59
+ const el = node;
60
+ Array.from(el.attributes).forEach((attr) => {
61
+ if (attr.name.startsWith("@")) {
62
+ const eventType = attr.name.slice(1); // Remove @
63
+ const handlerId = attr.value;
64
+ if (handlerId.startsWith(EVENT_MARKER)) {
65
+ const handler = eventRegistry.get(handlerId);
66
+ if (handler) {
67
+ const fn = (e) => {
68
+ if (e.target === el)
69
+ handler(e);
70
+ };
71
+ container.addEventListener(eventType, fn, true);
72
+ handlers.push({ type: eventType, fn });
73
+ el.removeAttribute(attr.name);
74
+ }
75
+ }
76
+ }
77
+ });
78
+ }
79
+ container.__handlers__ = handlers;
80
+ }
81
+ //# sourceMappingURL=Templating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Templating.js","sourceRoot":"","sources":["../../../../core/src/Templating.ts"],"names":[],"mappings":"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"}