@hypen-space/web 0.2.12 → 0.3.1

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 (44) hide show
  1. package/dist/src/canvas/index.js.map +1 -1
  2. package/dist/src/canvas/renderer.js.map +1 -1
  3. package/dist/src/dom/applicators/effects.js +38 -2
  4. package/dist/src/dom/applicators/effects.js.map +3 -3
  5. package/dist/src/dom/applicators/events.js +280 -397
  6. package/dist/src/dom/applicators/events.js.map +5 -4
  7. package/dist/src/dom/applicators/font.js +94 -5
  8. package/dist/src/dom/applicators/font.js.map +3 -3
  9. package/dist/src/dom/applicators/index.js +590 -425
  10. package/dist/src/dom/applicators/index.js.map +10 -9
  11. package/dist/src/dom/applicators/layout.js +33 -5
  12. package/dist/src/dom/applicators/layout.js.map +3 -3
  13. package/dist/src/dom/applicators/size.js +81 -16
  14. package/dist/src/dom/applicators/size.js.map +3 -3
  15. package/dist/src/dom/components/hypenapp.js +296 -0
  16. package/dist/src/dom/components/hypenapp.js.map +10 -0
  17. package/dist/src/dom/components/index.js +263 -1
  18. package/dist/src/dom/components/index.js.map +5 -4
  19. package/dist/src/dom/element-data.js +140 -0
  20. package/dist/src/dom/element-data.js.map +10 -0
  21. package/dist/src/dom/index.js +857 -430
  22. package/dist/src/dom/index.js.map +13 -11
  23. package/dist/src/dom/renderer.js +857 -430
  24. package/dist/src/dom/renderer.js.map +13 -11
  25. package/dist/src/hypen.js +857 -430
  26. package/dist/src/hypen.js.map +13 -11
  27. package/dist/src/index.js +862 -430
  28. package/dist/src/index.js.map +15 -12
  29. package/package.json +3 -3
  30. package/src/canvas/QUICKSTART.md +5 -7
  31. package/src/canvas/README.md +2 -2
  32. package/src/canvas/renderer.ts +1 -1
  33. package/src/dom/README.md +4 -4
  34. package/src/dom/applicators/effects.ts +45 -1
  35. package/src/dom/applicators/events.ts +348 -537
  36. package/src/dom/applicators/font.ts +127 -2
  37. package/src/dom/applicators/index.ts +117 -7
  38. package/src/dom/applicators/layout.ts +40 -4
  39. package/src/dom/applicators/size.ts +101 -16
  40. package/src/dom/components/hypenapp.ts +348 -0
  41. package/src/dom/components/index.ts +2 -0
  42. package/src/dom/element-data.ts +234 -0
  43. package/src/dom/renderer.ts +12 -9
  44. package/src/index.ts +5 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypen-space/web",
3
- "version": "0.2.12",
3
+ "version": "0.3.1",
4
4
  "description": "Hypen web renderers - DOM and Canvas rendering for browsers",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -48,7 +48,7 @@
48
48
  "clean": "rm -rf dist"
49
49
  },
50
50
  "dependencies": {
51
- "@hypen-space/core": "^0.2.12"
51
+ "@hypen-space/core": "^0.3.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/bun": "latest",
@@ -79,6 +79,6 @@
79
79
  "repository": {
80
80
  "type": "git",
81
81
  "url": "https://github.com/hypen-lang/hypen-engine-rs.git",
82
- "directory": "hypen-render-bun/packages/web"
82
+ "directory": "hypen-web/packages/web"
83
83
  }
84
84
  }
@@ -5,7 +5,7 @@ Get started with the Hypen Canvas Renderer in 5 minutes.
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- bun add @hypen/core
8
+ bun add @hypen-space/core
9
9
  ```
10
10
 
11
11
  ## Basic Setup
@@ -28,8 +28,8 @@ bun add @hypen/core
28
28
  ### 2. Create App (`app.ts`)
29
29
 
30
30
  ```typescript
31
- import { Engine, app, HypenModuleInstance } from "@hypen/core";
32
- import { CanvasRenderer } from "@hypen/core/canvas";
31
+ import { Engine, app, HypenModuleInstance } from "@hypen-space/core";
32
+ import { CanvasRenderer } from "@hypen-space/core/canvas";
33
33
 
34
34
  // Define state
35
35
  type AppState = {
@@ -39,9 +39,8 @@ type AppState = {
39
39
  // Define module
40
40
  const appModule = app
41
41
  .defineState<AppState>({ count: 0 })
42
- .onAction("increment", async (action, state, next) => {
42
+ .onAction("increment", async ({ state }) => {
43
43
  state.count++;
44
- next();
45
44
  })
46
45
  .build();
47
46
 
@@ -342,12 +341,11 @@ Object.assign(state, {
342
341
  ```typescript
343
342
  let timeoutId: number;
344
343
 
345
- .onAction("search", async (action, state, next) => {
344
+ .onAction("search", async ({ action, state }) => {
346
345
  clearTimeout(timeoutId);
347
346
  timeoutId = setTimeout(() => {
348
347
  // Do expensive search
349
348
  state.results = search(action.query);
350
- next();
351
349
  }, 300);
352
350
  })
353
351
  ```
@@ -14,8 +14,8 @@ The Canvas Renderer is a complete alternative to the DOM renderer that draws all
14
14
  ## Quick Start
15
15
 
16
16
  ```typescript
17
- import { Engine, app } from "@hypen/core";
18
- import { CanvasRenderer } from "@hypen/core/canvas";
17
+ import { Engine, app } from "@hypen-space/core";
18
+ import { CanvasRenderer } from "@hypen-space/core/canvas";
19
19
 
20
20
  // Setup canvas
21
21
  const canvas = document.getElementById("app") as HTMLCanvasElement;
@@ -4,7 +4,7 @@
4
4
  * Main renderer class that orchestrates layout, painting, and events
5
5
  */
6
6
 
7
- import type { Renderer, Patch } from "@hypen/core";
7
+ import type { Renderer, Patch } from "@hypen-space/core";
8
8
 
9
9
  // Interface for the engine that canvas renderer needs
10
10
  interface IEngine {
package/src/dom/README.md CHANGED
@@ -38,8 +38,8 @@ src/dom/
38
38
  ### Browser Import
39
39
 
40
40
  ```typescript
41
- import { Engine, app, HypenModuleInstance } from "@hypen/core";
42
- import { DOMRenderer } from "@hypen/core/dom";
41
+ import { Engine, app, HypenModuleInstance } from "@hypen-space/core";
42
+ import { DOMRenderer } from "@hypen-space/core/dom";
43
43
 
44
44
  const engine = new Engine();
45
45
  await engine.init();
@@ -54,10 +54,10 @@ engine.setRenderCallback((patches) => {
54
54
 
55
55
  ```typescript
56
56
  // This will fail in Node.js/Bun (no DOM)
57
- import { DOMRenderer } from "@hypen/core/dom"; // ❌ Error
57
+ import { DOMRenderer } from "@hypen-space/core/dom"; // ❌ Error
58
58
 
59
59
  // Use server-safe renderer instead
60
- import { ConsoleRenderer } from "@hypen/core"; // ✅ Works
60
+ import { ConsoleRenderer } from "@hypen-space/core"; // ✅ Works
61
61
  ```
62
62
 
63
63
  ## Components
@@ -7,7 +7,51 @@ import type { ApplicatorHandler } from "./index.js";
7
7
  export const effectsHandlers: Record<string, ApplicatorHandler> = {
8
8
  // Shadow effects
9
9
  boxShadow: (el, value) => {
10
- el.style.boxShadow = String(value);
10
+ if (typeof value === "string") {
11
+ el.style.boxShadow = value;
12
+ } else if (typeof value === "object" && value !== null) {
13
+ // Object format: { x, y, blur, spread, color, inset }
14
+ const obj = value as Record<string, any>;
15
+ const x = typeof obj.x === "number" ? `${obj.x}px` : (obj.x ?? obj.offsetX ?? "0px");
16
+ const y = typeof obj.y === "number" ? `${obj.y}px` : (obj.y ?? obj.offsetY ?? "0px");
17
+ const blur = typeof obj.blur === "number" ? `${obj.blur}px` : (obj.blur ?? obj.radius ?? "0px");
18
+ const spread = typeof obj.spread === "number" ? `${obj.spread}px` : (obj.spread ?? "0px");
19
+ const color = obj.color ?? "rgba(0,0,0,0.2)";
20
+ const inset = obj.inset ? "inset " : "";
21
+ el.style.boxShadow = `${inset}${x} ${y} ${blur} ${spread} ${color}`;
22
+ } else if (typeof value === "number") {
23
+ // Just blur/elevation as number
24
+ el.style.boxShadow = `0 ${value}px ${value * 2}px rgba(0,0,0,0.2)`;
25
+ }
26
+ },
27
+
28
+ // Compound shadow with explicit offset support
29
+ shadow: (el, value) => {
30
+ if (typeof value === "object" && value !== null) {
31
+ const obj = value as Record<string, any>;
32
+ const x = typeof obj.x === "number" ? `${obj.x}px` : (obj.x ?? obj.offsetX ?? "0px");
33
+ const y = typeof obj.y === "number" ? `${obj.y}px` : (obj.y ?? obj.offsetY ?? "0px");
34
+ const blur = typeof obj.blur === "number" ? `${obj.blur}px` : (obj.blur ?? obj.radius ?? "4px");
35
+ const color = obj.color ?? "rgba(0,0,0,0.2)";
36
+ el.style.boxShadow = `${x} ${y} ${blur} ${color}`;
37
+ } else if (typeof value === "number") {
38
+ // Elevation-style: shadow grows with value
39
+ el.style.boxShadow = `0 ${value}px ${value * 2}px rgba(0,0,0,0.2)`;
40
+ } else {
41
+ el.style.boxShadow = String(value);
42
+ }
43
+ },
44
+
45
+ // Elevation (Material Design style)
46
+ elevation: (el, value) => {
47
+ const level = typeof value === "number" ? value : parseInt(String(value), 10);
48
+ if (!isNaN(level) && level >= 0) {
49
+ // Map elevation to box-shadow similar to Material Design
50
+ const y = level * 0.5;
51
+ const blur = level * 1.5;
52
+ const opacity = Math.min(0.1 + level * 0.02, 0.4);
53
+ el.style.boxShadow = `0 ${y}px ${blur}px rgba(0,0,0,${opacity})`;
54
+ }
11
55
  },
12
56
 
13
57
  textShadow: (el, value) => {