@hypen-space/web 0.4.3 → 0.4.11

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.
@@ -4,7 +4,7 @@
4
4
  * Renders Hypen patches to the DOM
5
5
  */
6
6
  import type { Patch } from "@hypen-space/core/types";
7
- import type { RouterContext } from "@hypen-space/core/app";
7
+ import type { HypenRouter } from "@hypen-space/core/router";
8
8
  import type { HypenGlobalContext } from "@hypen-space/core/context";
9
9
  import { ComponentRegistry } from "./components/index.js";
10
10
  import { ApplicatorRegistry } from "./applicators/index.js";
@@ -20,7 +20,7 @@ export declare class DOMRenderer {
20
20
  private applicators;
21
21
  private engine;
22
22
  private currentState;
23
- private routerContext;
23
+ private router;
24
24
  private globalContext;
25
25
  private componentInstances;
26
26
  private debugTracker;
@@ -28,7 +28,7 @@ export declare class DOMRenderer {
28
28
  /**
29
29
  * Set router and global context for component composition
30
30
  */
31
- setContext(routerContext: RouterContext, globalContext: HypenGlobalContext): void;
31
+ setContext(router: HypenRouter | null, globalContext: HypenGlobalContext): void;
32
32
  /**
33
33
  * Apply a batch of patches to the DOM
34
34
  */
@@ -63,6 +63,10 @@ export declare class DOMRenderer {
63
63
  * Set a property on an element
64
64
  */
65
65
  private onSetProp;
66
+ /**
67
+ * Remove a property from an element
68
+ */
69
+ private onRemoveProp;
66
70
  /**
67
71
  * Set text content
68
72
  */
@@ -2351,7 +2351,58 @@ var eventHandlers = {
2351
2351
  onFocus: createEventHandler("focus", { extractPayload: focusPayload }),
2352
2352
  onBlur: createEventHandler("blur", { extractPayload: focusPayload }),
2353
2353
  onMouseEnter: createEventHandler("mouseenter", { extractPayload: mousePayload }),
2354
- onMouseLeave: createEventHandler("mouseleave", { extractPayload: mousePayload })
2354
+ onMouseLeave: createEventHandler("mouseleave", { extractPayload: mousePayload }),
2355
+ bind: (element, value) => {
2356
+ const bindPath = typeof value === "string" ? value : null;
2357
+ if (!bindPath)
2358
+ return;
2359
+ const disposables = getElementDisposables2(element);
2360
+ const eventKey = `bind:${bindPath}`;
2361
+ if (getRegisteredEvents(element).has(eventKey))
2362
+ return;
2363
+ registerEvent(element, eventKey);
2364
+ const hypenType = element.dataset?.hypenType;
2365
+ if (hypenType === "checkbox" || hypenType === "switch") {
2366
+ const input = element.querySelector('input[type="checkbox"]');
2367
+ if (!input)
2368
+ return;
2369
+ const listener = () => {
2370
+ const engine = getEngine(element);
2371
+ if (engine) {
2372
+ engine.dispatchAction("__hypen_bind", {
2373
+ path: bindPath,
2374
+ value: input.checked
2375
+ });
2376
+ }
2377
+ };
2378
+ disposables.add(disposableListener(input, "change", listener, { passive: true }));
2379
+ } else if (element instanceof HTMLSelectElement) {
2380
+ const listener = () => {
2381
+ const engine = getEngine(element);
2382
+ if (engine) {
2383
+ engine.dispatchAction("__hypen_bind", {
2384
+ path: bindPath,
2385
+ value: element.value
2386
+ });
2387
+ }
2388
+ };
2389
+ disposables.add(disposableListener(element, "change", listener, { passive: true }));
2390
+ } else if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
2391
+ const listener = () => {
2392
+ const engine = getEngine(element);
2393
+ if (engine) {
2394
+ engine.dispatchAction("__hypen_bind", {
2395
+ path: bindPath,
2396
+ value: element.value
2397
+ });
2398
+ }
2399
+ };
2400
+ disposables.add(disposableListener(element, "input", listener, { passive: true }));
2401
+ } else {
2402
+ return;
2403
+ }
2404
+ disposables.addCallback(() => unregisterEvent(element, eventKey));
2405
+ }
2355
2406
  };
2356
2407
 
2357
2408
  // src/dom/applicators/typography.ts
@@ -2612,9 +2663,6 @@ var advancedLayoutHandlers = {
2612
2663
  alignContent: (el, value) => {
2613
2664
  el.style.alignContent = String(value);
2614
2665
  },
2615
- alignSelf: (el, value) => {
2616
- el.style.alignSelf = String(value);
2617
- },
2618
2666
  order: (el, value) => {
2619
2667
  el.style.order = String(value);
2620
2668
  },
@@ -3320,7 +3368,7 @@ class DOMRenderer {
3320
3368
  applicators;
3321
3369
  engine;
3322
3370
  currentState = {};
3323
- routerContext = null;
3371
+ router = null;
3324
3372
  globalContext = null;
3325
3373
  componentInstances = new Map;
3326
3374
  debugTracker;
@@ -3335,8 +3383,8 @@ class DOMRenderer {
3335
3383
  this.applicators.register(name, handler);
3336
3384
  }
3337
3385
  }
3338
- setContext(routerContext, globalContext) {
3339
- this.routerContext = routerContext;
3386
+ setContext(router, globalContext) {
3387
+ this.router = router;
3340
3388
  this.globalContext = globalContext;
3341
3389
  }
3342
3390
  applyPatches(patches) {
@@ -3395,6 +3443,9 @@ class DOMRenderer {
3395
3443
  case "setProp":
3396
3444
  this.onSetProp(id, patch.name, patch.value);
3397
3445
  break;
3446
+ case "removeProp":
3447
+ this.onRemoveProp(id, patch.name);
3448
+ break;
3398
3449
  case "setText":
3399
3450
  this.onSetText(id, patch.text);
3400
3451
  break;
@@ -3462,6 +3513,13 @@ class DOMRenderer {
3462
3513
  }
3463
3514
  this.applicators.apply(element, name, value);
3464
3515
  }
3516
+ onRemoveProp(id, name) {
3517
+ const element = this.nodes.get(id);
3518
+ if (!element)
3519
+ return;
3520
+ this.debugTracker.trackRerender(id, element, `removeProp:${name}`);
3521
+ this.applicators.apply(element, name, undefined);
3522
+ }
3465
3523
  onSetText(id, text) {
3466
3524
  const element = this.nodes.get(id);
3467
3525
  if (!element)
@@ -3538,4 +3596,4 @@ export {
3538
3596
  DOMRenderer
3539
3597
  };
3540
3598
 
3541
- //# debugId=CB1F5BB91A5CA1C364756E2164756E21
3599
+ //# debugId=6DB06606E56538AC64756E2164756E21