@gjsify/canvas2d 0.22.0 → 0.23.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/README.md CHANGED
@@ -30,6 +30,39 @@ widget.onReady((canvas, ctx) => {
30
30
  window.set_child(widget);
31
31
  ```
32
32
 
33
+ ## Globals
34
+
35
+ The package root is a **side-effect-free barrel** — importing it gives you named
36
+ exports and nothing else. Browser globals are installed by the dedicated
37
+ `/register` subpath:
38
+
39
+ ```typescript
40
+ import '@gjsify/canvas2d/register'; // globalThis.ImageData, globalThis.Path2D
41
+ ```
42
+
43
+ You normally never write that import: `gjsify build` defaults to `--globals auto`,
44
+ which detects a free `ImageData` / `Path2D` reference in the bundled output and
45
+ injects the subpath for you. Application and example code should rely on that (see
46
+ the tree-shakeable-globals convention in `AGENTS.md`) — an explicit `/register`
47
+ import in app code hides auto-detection gaps.
48
+
49
+ What each entry point gives you:
50
+
51
+ | | `@gjsify/canvas2d` | `@gjsify/canvas2d/register` |
52
+ |---|---|---|
53
+ | `CanvasRenderingContext2D`, `CanvasGradient`, `CanvasPattern`, `Path2D`, `ImageData`, `parseColor`, `Canvas2DBridge` | named exports | — |
54
+ | `globalThis.ImageData`, `globalThis.Path2D` | — | ✅ |
55
+ | `globalThis.CanvasRenderingContext2D`, `globalThis.HTMLCanvasElement`, `globalThis.DOMMatrix{,ReadOnly}` and the `'2d'` context factory | — | ✅ (delegated to `@gjsify/dom-elements/register/canvas`, which owns them) |
56
+
57
+ `Canvas2DBridge` depends on the `'2d'` context factory and imports
58
+ `@gjsify/dom-elements/register/canvas` itself, so `canvas.getContext('2d')` works
59
+ on a bridge even with `--globals none`.
60
+
61
+ > **Changed after 0.22.0** — up to and including 0.22.0, `import { Canvas2DBridge } from '@gjsify/canvas2d'`
62
+ > installed `ImageData` / `Path2D` / `CanvasRenderingContext2D` on `globalThis` as an
63
+ > import side effect and registered a second, duplicate `'2d'` context factory. See
64
+ > [ADR 0012](https://github.com/gjsify/gjsify/blob/main/docs/adr/0012-framework-register-ownership.md).
65
+
33
66
  ## License
34
67
 
35
68
  MIT
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"gi://GObject";import t from"gi://GLib?version=2.0";import n from"gi://Gtk?version=4.0";import{HTMLCanvasElement as r,notifyElementResize as i}from"@gjsify/dom-elements";import{attachEventControllers as a}from"@gjsify/event-bridge";import{Event as o}from"@gjsify/dom-events";const s=e.registerClass({GTypeName:`GjsifyCanvas2DBridge`},class Canvas2DBridge extends n.DrawingArea{constructor(e){super(e),this._canvas=null,this._ctx=null,this._readyCallbacks=[],this._resizeCallbacks=[],this._tickCallbackId=null,this._frameCallback=null,this._timeOrigin=t.get_monotonic_time(),this.set_draw_func(this._onDraw.bind(this)),a(this,()=>this._canvas,{captureKeys:!0}),this.connect(`unrealize`,()=>{this._tickCallbackId!==null&&(this.remove_tick_callback(this._tickCallbackId),this._tickCallbackId=null),this._ctx&&this._ctx._dispose(),this._canvas=null,this._ctx=null})}_onDraw(e,t,n,a){if(!this._canvas){if(this._canvas=new r,this._canvas.width=n,this._canvas.height=a,this._ctx=this._canvas.getContext(`2d`),this._ctx){for(let e of this._readyCallbacks)e(this._canvas,this._ctx);this._readyCallbacks=[]}}else if(this._canvas.width!==n||this._canvas.height!==a){this._canvas.width=n,this._canvas.height=a,this._canvas.dispatchEvent(new o(`resize`)),i(this._canvas,n,a);for(let e of this._resizeCallbacks)e(n,a)}if(this._ctx){let e=this._ctx._getSurface();t.setSourceSurface(e,0,0),t.paint()}}get canvas(){return this._canvas}getContext(e){return this._ctx}onReady(e){if(this._canvas&&this._ctx){e(this._canvas,this._ctx);return}this._readyCallbacks.push(e)}onResize(e){this._resizeCallbacks.push(e)}requestAnimationFrame(e){return this._frameCallback=e,this._tickCallbackId===null&&(this._tickCallbackId=this.add_tick_callback((e,n)=>{this._tickCallbackId=null;let r=(n.get_frame_time()-this._timeOrigin)/1e3;return this._frameCallback?.(r),this.queue_draw(),t.SOURCE_REMOVE})),this.queue_draw(),0}installGlobals(){let e=globalThis;e.requestAnimationFrame=e=>this.requestAnimationFrame(e);let n=this._timeOrigin;e.performance={now:()=>(t.get_monotonic_time()-n)/1e3,timeOrigin:Date.now()}}});export{s as Canvas2DBridge};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://GObject";import t from"gi://GLib?version=2.0";import n from"gi://Gtk?version=4.0";import{HTMLCanvasElement as r,notifyElementResize as i}from"@gjsify/dom-elements";import"@gjsify/dom-elements/register/canvas";import"@gjsify/canvas2d-core/gdk";import{attachEventControllers as a}from"@gjsify/event-bridge";import{Event as o}from"@gjsify/dom-events";const s=e.registerClass({GTypeName:`GjsifyCanvas2DBridge`},class Canvas2DBridge extends n.DrawingArea{constructor(e){super(e),this._canvas=null,this._ctx=null,this._readyCallbacks=[],this._resizeCallbacks=[],this._tickCallbackId=null,this._frameCallback=null,this._timeOrigin=t.get_monotonic_time(),this.set_draw_func(this._onDraw.bind(this)),a(this,()=>this._canvas,{captureKeys:!0}),this.connect(`unrealize`,()=>{this._tickCallbackId!==null&&(this.remove_tick_callback(this._tickCallbackId),this._tickCallbackId=null),this._ctx&&this._ctx._dispose(),this._canvas=null,this._ctx=null})}_onDraw(e,t,n,a){if(!this._canvas){if(this._canvas=new r,this._canvas.width=n,this._canvas.height=a,this._ctx=this._canvas.getContext(`2d`),this._ctx){for(let e of this._readyCallbacks)e(this._canvas,this._ctx);this._readyCallbacks=[]}}else if(this._canvas.width!==n||this._canvas.height!==a){this._canvas.width=n,this._canvas.height=a,this._canvas.dispatchEvent(new o(`resize`)),i(this._canvas,n,a);for(let e of this._resizeCallbacks)e(n,a)}if(this._ctx){let e=this._ctx._getSurface();t.setSourceSurface(e,0,0),t.paint()}}get canvas(){return this._canvas}getContext(e){return this._ctx}onReady(e){if(this._canvas&&this._ctx){e(this._canvas,this._ctx);return}this._readyCallbacks.push(e)}onResize(e){this._resizeCallbacks.push(e)}requestAnimationFrame(e){return this._frameCallback=e,this._tickCallbackId===null&&(this._tickCallbackId=this.add_tick_callback((e,n)=>{this._tickCallbackId=null;let r=(n.get_frame_time()-this._timeOrigin)/1e3;return this._frameCallback?.(r),this.queue_draw(),t.SOURCE_REMOVE})),this.queue_draw(),0}installGlobals(){let e=globalThis;e.requestAnimationFrame=e=>this.requestAnimationFrame(e);let n=this._timeOrigin;e.performance={now:()=>(t.get_monotonic_time()-n)/1e3,timeOrigin:Date.now()}}});export{s as Canvas2DBridge};
package/lib/esm/index.js CHANGED
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{Canvas2DBridge as e}from"./canvas2d-bridge.js";import{CanvasGradient as t,CanvasPattern as n,CanvasRenderingContext2D as r,CanvasRenderingContext2D as i,ImageData as a,ImageData as o,Path2D as s,Path2D as c,parseColor as l}from"@gjsify/canvas2d-core";import{HTMLCanvasElement as u}from"@gjsify/dom-elements";const d=Symbol.for(`gjsify_canvas2d_context`);u.registerContextFactory(`2d`,(e,t)=>{let n=e,r=n[d];if(r)return r;let a=new i(e,t);return n[d]=a,a}),Object.defineProperty(globalThis,`CanvasRenderingContext2D`,{value:i,writable:!0,configurable:!0}),Object.defineProperty(globalThis,`ImageData`,{value:o,writable:!0,configurable:!0}),Object.defineProperty(globalThis,`Path2D`,{value:c,writable:!0,configurable:!0});export{e as Canvas2DBridge,t as CanvasGradient,n as CanvasPattern,r as CanvasRenderingContext2D,a as ImageData,s as Path2D,l as parseColor};
1
+ import{Canvas2DBridge as e}from"./canvas2d-bridge.js";import{CanvasGradient as t,CanvasPattern as n,CanvasRenderingContext2D as r,ImageData as i,Path2D as a,parseColor as o}from"@gjsify/canvas2d-core";export{e as Canvas2DBridge,t as CanvasGradient,n as CanvasPattern,r as CanvasRenderingContext2D,i as ImageData,a as Path2D,o as parseColor};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{ImageData as e,Path2D as t}from"@gjsify/canvas2d-core";import"@gjsify/dom-elements/register/canvas";function defineGlobalIfMissing(e,t){globalThis[e]===void 0&&Object.defineProperty(globalThis,e,{value:t,writable:!0,configurable:!0})}defineGlobalIfMissing(`ImageData`,e),defineGlobalIfMissing(`Path2D`,t);
@@ -4,6 +4,8 @@ import GLib from 'gi://GLib?version=2.0';
4
4
  import Gtk from 'gi://Gtk?version=4.0';
5
5
  import type Cairo from 'cairo';
6
6
  import { HTMLCanvasElement as GjsifyHTMLCanvasElement } from '@gjsify/dom-elements';
7
+ import '@gjsify/dom-elements/register/canvas';
8
+ import '@gjsify/canvas2d-core/gdk';
7
9
  import type { CanvasRenderingContext2D } from '@gjsify/canvas2d-core';
8
10
  type Canvas2DReadyCallback = (canvas: globalThis.HTMLCanvasElement, ctx: CanvasRenderingContext2D) => void;
9
11
  /**
@@ -1,3 +1,3 @@
1
- import '@gjsify/canvas2d';
1
+ import '@gjsify/dom-elements/register/canvas';
2
2
  declare const _default: () => Promise<void>;
3
3
  export default _default;
@@ -0,0 +1 @@
1
+ import '@gjsify/dom-elements/register/canvas';
@@ -0,0 +1,3 @@
1
+ import '@gjsify/canvas2d/register';
2
+ declare const _default: () => Promise<void>;
3
+ export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/canvas2d",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "Canvas 2D rendering context for GJS, backed by Cairo",
5
5
  "type": "module",
6
6
  "module": "lib/esm/index.js",
@@ -9,8 +9,15 @@
9
9
  ".": {
10
10
  "types": "./lib/types/index.d.ts",
11
11
  "default": "./lib/esm/index.js"
12
+ },
13
+ "./register": {
14
+ "types": "./lib/types/register.d.ts",
15
+ "default": "./lib/esm/register.js"
12
16
  }
13
17
  },
18
+ "sideEffects": [
19
+ "./lib/esm/register.js"
20
+ ],
14
21
  "files": [
15
22
  "lib"
16
23
  ],
@@ -40,15 +47,15 @@
40
47
  "@girs/gtk-4.0": "^4.1.0",
41
48
  "@girs/pango-1.0": "^4.1.0",
42
49
  "@girs/pangocairo-1.0": "^4.1.0",
43
- "@gjsify/canvas2d-core": "^0.22.0",
44
- "@gjsify/dom-elements": "^0.22.0",
45
- "@gjsify/dom-events": "^0.22.0",
46
- "@gjsify/event-bridge": "^0.22.0",
47
- "@gjsify/utils": "^0.22.0"
50
+ "@gjsify/canvas2d-core": "^0.23.0",
51
+ "@gjsify/dom-elements": "^0.23.0",
52
+ "@gjsify/dom-events": "^0.23.0",
53
+ "@gjsify/event-bridge": "^0.23.0",
54
+ "@gjsify/utils": "^0.23.0"
48
55
  },
49
56
  "devDependencies": {
50
- "@gjsify/cli": "^0.22.0",
51
- "@gjsify/unit": "^0.22.0",
57
+ "@gjsify/cli": "^0.23.0",
58
+ "@gjsify/unit": "^0.23.0",
52
59
  "@types/node": "^25.9.2",
53
60
  "typescript": "^6.0.3"
54
61
  },