murasaki 0.2.1 → 0.4.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.
@@ -0,0 +1,4 @@
1
+ export { createElement, createRoot, Fragment, jsx, jsxDEV, jsxs, useEffect, useRef, useState, } from './runtime.ts';
2
+ export { useNotification, useClipboard, useShell } from './native.ts';
3
+ export type { NotifyOptions } from './native.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,GAAG,EACH,MAAM,EACN,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,4 @@
1
+ // Public surface for `import { ... } from 'murasaki/jsx/dom'`.
2
+ export { createElement, createRoot, Fragment, jsx, jsxDEV, jsxs, useEffect, useRef, useState, } from "./runtime.js";
3
+ export { useNotification, useClipboard, useShell } from "./native.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jsx/dom/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,GAAG,EACH,MAAM,EACN,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,45 @@
1
+ export type NotifyOptions = {
2
+ title: string;
3
+ body?: string;
4
+ sound?: boolean;
5
+ };
6
+ type Bridge = {
7
+ notify(opts: NotifyOptions): Promise<void>;
8
+ clipboardWrite(text: string): Promise<void>;
9
+ clipboardRead(): Promise<string>;
10
+ openExternal(target: string): Promise<void>;
11
+ };
12
+ declare global {
13
+ interface Window {
14
+ murasaki?: Bridge;
15
+ }
16
+ }
17
+ /**
18
+ * Returns a function that shows an OS notification.
19
+ *
20
+ * const notify = useNotification()
21
+ * notify({ title: 'Hello', body: 'from murasaki' })
22
+ */
23
+ export declare function useNotification(): (opts: NotifyOptions) => Promise<void>;
24
+ /**
25
+ * Returns { read, write } for the system clipboard.
26
+ *
27
+ * const clipboard = useClipboard()
28
+ * clipboard.write('hello')
29
+ * const text = await clipboard.read()
30
+ */
31
+ export declare function useClipboard(): {
32
+ read(): Promise<string>;
33
+ write(text: string): Promise<void>;
34
+ };
35
+ /**
36
+ * Returns { openExternal } — opens URLs / files in the system default app.
37
+ *
38
+ * const shell = useShell()
39
+ * shell.openExternal('https://murasaki.dev')
40
+ */
41
+ export declare function useShell(): {
42
+ openExternal(target: string): Promise<void>;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/native.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;CACF;AAOD;;;;;GAKG;AACH,wBAAgB,eAAe,KACf,MAAM,aAAa,KAAG,OAAO,CAAC,IAAI,CAAC,CASlD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY;YAEV,OAAO,CAAC,MAAM,CAAC;gBAUX,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAU3C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ;yBAEO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAUpD"}
@@ -0,0 +1,88 @@
1
+ // Client-side React-style hooks for native APIs.
2
+ //
3
+ // All of these proxy to the Node side via window.murasaki.*, which the
4
+ // dev runner exposes through @webviewjs/webview's webview.expose().
5
+ //
6
+ // Safe to import server-side — every hook detects the missing bridge
7
+ // and degrades to no-op (notify/openExternal/clipboardWrite) or empty
8
+ // value (clipboardRead → '').
9
+ function bridge() {
10
+ if (typeof window === 'undefined')
11
+ return null;
12
+ return window.murasaki ?? null;
13
+ }
14
+ /**
15
+ * Returns a function that shows an OS notification.
16
+ *
17
+ * const notify = useNotification()
18
+ * notify({ title: 'Hello', body: 'from murasaki' })
19
+ */
20
+ export function useNotification() {
21
+ return async (opts) => {
22
+ const b = bridge();
23
+ if (!b)
24
+ return;
25
+ try {
26
+ await b.notify(opts);
27
+ }
28
+ catch (e) {
29
+ console.warn('[murasaki] notify failed:', e);
30
+ }
31
+ };
32
+ }
33
+ /**
34
+ * Returns { read, write } for the system clipboard.
35
+ *
36
+ * const clipboard = useClipboard()
37
+ * clipboard.write('hello')
38
+ * const text = await clipboard.read()
39
+ */
40
+ export function useClipboard() {
41
+ return {
42
+ async read() {
43
+ const b = bridge();
44
+ if (!b)
45
+ return '';
46
+ try {
47
+ return await b.clipboardRead();
48
+ }
49
+ catch (e) {
50
+ console.warn('[murasaki] clipboard.read failed:', e);
51
+ return '';
52
+ }
53
+ },
54
+ async write(text) {
55
+ const b = bridge();
56
+ if (!b)
57
+ return;
58
+ try {
59
+ await b.clipboardWrite(text);
60
+ }
61
+ catch (e) {
62
+ console.warn('[murasaki] clipboard.write failed:', e);
63
+ }
64
+ },
65
+ };
66
+ }
67
+ /**
68
+ * Returns { openExternal } — opens URLs / files in the system default app.
69
+ *
70
+ * const shell = useShell()
71
+ * shell.openExternal('https://murasaki.dev')
72
+ */
73
+ export function useShell() {
74
+ return {
75
+ async openExternal(target) {
76
+ const b = bridge();
77
+ if (!b)
78
+ return;
79
+ try {
80
+ await b.openExternal(target);
81
+ }
82
+ catch (e) {
83
+ console.warn('[murasaki] openExternal failed:', e);
84
+ }
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/jsx/dom/native.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,8BAA8B;AAqB9B,SAAS,MAAM;IACb,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAC9C,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,EAAE,IAAmB,EAAiB,EAAE;QAClD,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;QAClB,IAAI,CAAC,CAAC;YAAE,OAAM;QACd,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAA;YACjB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;YAChC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;gBACpD,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAM;YACd,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,MAAc;YAC/B,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAM;YACd,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ type Props = Record<string, unknown>;
2
+ type Component = (props: Props) => Child;
3
+ type Child = string | number | bigint | boolean | null | undefined | JSXNodeLike | Child[];
4
+ interface JSXNodeLike {
5
+ readonly __isJSXNode: true;
6
+ tag: string | Component;
7
+ props: Props;
8
+ children: Child[];
9
+ toString?: () => string;
10
+ }
11
+ declare class JSXNode implements JSXNodeLike {
12
+ tag: string | Component;
13
+ props: Props;
14
+ children: Child[];
15
+ readonly __isJSXNode: true;
16
+ constructor(tag: string | Component, props: Props, children: Child[]);
17
+ }
18
+ export declare function jsx(tag: string | Component, props: Props | null): JSXNode;
19
+ export declare const jsxs: typeof jsx;
20
+ export declare const jsxDEV: typeof jsx;
21
+ export declare const createElement: typeof jsx;
22
+ export declare function Fragment(props: {
23
+ children?: Child;
24
+ }): Child;
25
+ export declare function useState<T>(initial: T | (() => T)): [T, (next: T | ((prev: T) => T)) => void];
26
+ export declare function useEffect(fn: () => void | (() => void), deps?: unknown[]): void;
27
+ export declare function useRef<T>(initial: T): {
28
+ current: T;
29
+ };
30
+ export declare function createRoot(container: HTMLElement): {
31
+ render(tree: Child): void;
32
+ };
33
+ export { JSXNode };
34
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/jsx/dom/runtime.ts"],"names":[],"mappings":"AAkBA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACpC,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAA;AACxC,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,EAAE,CAAA;AAE1F,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,KAAK,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB;AAED,cAAM,OAAQ,YAAW,WAAW;IAGzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK,EAAE;IAJ1B,QAAQ,CAAC,WAAW,EAAG,IAAI,CAAS;gBAE3B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,EAAE;CAE3B;AAOD,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAUzE;AACD,eAAO,MAAM,IAAI,YAAM,CAAA;AACvB,eAAO,MAAM,MAAM,YAAM,CAAA;AACzB,eAAO,MAAM,aAAa,YAAM,CAAA;AAEhC,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAE3D;AAqCD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAmB7F;AAGD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CA2B/E;AAGD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CASpD;AA0KD,wBAAgB,UAAU,CAAC,SAAS,EAAE,WAAW;iBAEhC,KAAK;EAgBrB;AAKD,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -0,0 +1,303 @@
1
+ // murasaki/jsx/dom — client-side runtime.
2
+ //
3
+ // Design notes (MVP):
4
+ // - Naive: every state change triggers a full re-render of the root.
5
+ // No virtual-DOM diff, no fiber. Good enough for desktop apps where
6
+ // trees are tiny and re-render is sub-millisecond.
7
+ // - Hooks: useState / useEffect / useRef. Indexed by "component slot"
8
+ // in render order — same as React's call-order rule, so the usual
9
+ // "no hooks in conditionals" applies.
10
+ // - Events: any prop starting with "on" + a function becomes a DOM
11
+ // event listener. Names normalize: onClick → "click", onChange → "change".
12
+ // - HMR friendly: createRoot re-uses the same container, just clears + remounts.
13
+ //
14
+ // This file is browser-only. It uses `document`, `window`, etc., so it must
15
+ // only be loaded via the client bundle — never imported on the Node side.
16
+ class JSXNode {
17
+ tag;
18
+ props;
19
+ children;
20
+ __isJSXNode = true;
21
+ constructor(tag, props, children) {
22
+ this.tag = tag;
23
+ this.props = props;
24
+ this.children = children;
25
+ }
26
+ }
27
+ function isJSXNode(v) {
28
+ return typeof v === 'object' && v !== null && v.__isJSXNode === true;
29
+ }
30
+ // ── jsx() factory ────────────────────────────────────────────────────
31
+ export function jsx(tag, props) {
32
+ const p = (props ?? {});
33
+ const rawChildren = p.children;
34
+ const children = Array.isArray(rawChildren)
35
+ ? rawChildren
36
+ : rawChildren != null
37
+ ? [rawChildren]
38
+ : [];
39
+ const { children: _drop, ...rest } = p;
40
+ return new JSXNode(tag, rest, children);
41
+ }
42
+ export const jsxs = jsx;
43
+ export const jsxDEV = jsx;
44
+ export const createElement = jsx;
45
+ export function Fragment(props) {
46
+ return props.children ?? null;
47
+ }
48
+ let currentRoot = null;
49
+ function getOrInitSlot(key) {
50
+ const slots = currentRoot.slots;
51
+ let slot = slots.get(key);
52
+ if (!slot) {
53
+ slot = { states: [], effects: [], refs: [] };
54
+ slots.set(key, slot);
55
+ }
56
+ return slot;
57
+ }
58
+ // ── useState ─────────────────────────────────────────────────────────
59
+ // Behavior on the server (no active root): returns the initial value with
60
+ // a no-op setter, so user code can be imported and SSR-rendered safely.
61
+ export function useState(initial) {
62
+ const root = currentRoot;
63
+ if (!root || !root.currentSlot) {
64
+ const v = typeof initial === 'function' ? initial() : initial;
65
+ return [v, () => { }];
66
+ }
67
+ const slot = root.currentSlot;
68
+ const idx = root.stateIdx++;
69
+ if (idx >= slot.states.length) {
70
+ slot.states[idx] = typeof initial === 'function' ? initial() : initial;
71
+ }
72
+ const set = (next) => {
73
+ const prev = slot.states[idx];
74
+ const value = typeof next === 'function' ? next(prev) : next;
75
+ if (Object.is(prev, value))
76
+ return;
77
+ slot.states[idx] = value;
78
+ scheduleRender(root);
79
+ };
80
+ return [slot.states[idx], set];
81
+ }
82
+ // ── useEffect (basic: deps-based; no-op on server) ──────────────────
83
+ export function useEffect(fn, deps) {
84
+ const root = currentRoot;
85
+ if (!root || !root.currentSlot)
86
+ return;
87
+ const slot = root.currentSlot;
88
+ const idx = root.effectIdx++;
89
+ const prev = slot.effects[idx];
90
+ const changed = !prev ||
91
+ !deps ||
92
+ !prev.deps ||
93
+ deps.length !== prev.deps.length ||
94
+ deps.some((d, i) => !Object.is(d, prev.deps?.[i]));
95
+ if (changed) {
96
+ slot.effects[idx] = {
97
+ deps,
98
+ cleanup: prev?.cleanup,
99
+ pending: () => {
100
+ prev?.cleanup?.();
101
+ const ret = fn();
102
+ if (typeof ret === 'function') {
103
+ slot.effects[idx].cleanup = ret;
104
+ }
105
+ else {
106
+ slot.effects[idx].cleanup = undefined;
107
+ }
108
+ },
109
+ };
110
+ }
111
+ }
112
+ // ── useRef (no-op-ish on server: returns a fresh ref every render) ──
113
+ export function useRef(initial) {
114
+ const root = currentRoot;
115
+ if (!root || !root.currentSlot)
116
+ return { current: initial };
117
+ const slot = root.currentSlot;
118
+ const idx = root.refIdx++;
119
+ if (idx >= slot.refs.length) {
120
+ slot.refs[idx] = { current: initial };
121
+ }
122
+ return slot.refs[idx];
123
+ }
124
+ // ── Schedule a re-render (microtask coalesce) ────────────────────────
125
+ function scheduleRender(root) {
126
+ if (root.rendering) {
127
+ root.pendingRender = true;
128
+ return;
129
+ }
130
+ root.pendingRender = true;
131
+ queueMicrotask(() => {
132
+ if (root.pendingRender) {
133
+ root.pendingRender = false;
134
+ mount(root);
135
+ }
136
+ });
137
+ }
138
+ // ── Attribute helpers ────────────────────────────────────────────────
139
+ const ATTR_ALIAS = {
140
+ className: 'class',
141
+ htmlFor: 'for',
142
+ charSet: 'charset',
143
+ };
144
+ function camelToKebab(k) {
145
+ if (k[0] === '-' || !/[A-Z]/.test(k))
146
+ return k;
147
+ return k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
148
+ }
149
+ function styleObjToCss(obj) {
150
+ let out = '';
151
+ for (const [k, v] of Object.entries(obj)) {
152
+ if (v == null || v === false)
153
+ continue;
154
+ let val;
155
+ if (typeof v === 'number')
156
+ val = `${v}px`;
157
+ else if (typeof v === 'string')
158
+ val = v;
159
+ else
160
+ continue;
161
+ out += `${out ? ';' : ''}${camelToKebab(k)}:${val}`;
162
+ }
163
+ return out;
164
+ }
165
+ // ── DOM materializer ────────────────────────────────────────────────
166
+ function appendChild(parent, child, slotKey) {
167
+ if (child == null || child === false || child === true)
168
+ return;
169
+ if (typeof child === 'string' || typeof child === 'number' || typeof child === 'bigint') {
170
+ parent.appendChild(document.createTextNode(String(child)));
171
+ return;
172
+ }
173
+ if (Array.isArray(child)) {
174
+ child.forEach((c, i) => appendChild(parent, c, `${slotKey}.${i}`));
175
+ return;
176
+ }
177
+ if (isJSXNode(child)) {
178
+ parent.appendChild(toDOM(child, slotKey));
179
+ }
180
+ }
181
+ function toDOM(node, slotKey) {
182
+ const { tag, props, children } = node;
183
+ // Component / Fragment
184
+ if (typeof tag === 'function') {
185
+ const root = currentRoot;
186
+ const prevSlot = root.currentSlot;
187
+ const prevKey = root.currentSlotKey;
188
+ const prevStateIdx = root.stateIdx;
189
+ const prevEffectIdx = root.effectIdx;
190
+ const prevRefIdx = root.refIdx;
191
+ const key = `${slotKey}|${tag.name || 'Anon'}`;
192
+ root.currentSlotKey = key;
193
+ root.currentSlot = getOrInitSlot(key);
194
+ root.stateIdx = 0;
195
+ root.effectIdx = 0;
196
+ root.refIdx = 0;
197
+ const result = tag({ ...props, children: children.length === 1 ? children[0] : children });
198
+ root.currentSlot = prevSlot;
199
+ root.currentSlotKey = prevKey;
200
+ root.stateIdx = prevStateIdx;
201
+ root.effectIdx = prevEffectIdx;
202
+ root.refIdx = prevRefIdx;
203
+ const frag = document.createDocumentFragment();
204
+ appendChild(frag, result, key);
205
+ return frag;
206
+ }
207
+ // Intrinsic element
208
+ const el = document.createElement(tag);
209
+ for (const k in props) {
210
+ const v = props[k];
211
+ if (k === 'children' || k === 'key' || k === 'ref')
212
+ continue;
213
+ if (v == null || v === false)
214
+ continue;
215
+ // Event handler: onClick, onChange, onInput, ...
216
+ if (k.length > 2 && k[0] === 'o' && k[1] === 'n' && typeof v === 'function') {
217
+ const eventName = k.slice(2).toLowerCase();
218
+ el.addEventListener(eventName, v);
219
+ continue;
220
+ }
221
+ // dangerouslySetInnerHTML
222
+ if (k === 'dangerouslySetInnerHTML') {
223
+ const html = v.__html;
224
+ if (typeof html === 'string')
225
+ el.innerHTML = html;
226
+ continue;
227
+ }
228
+ // Style object
229
+ if (k === 'style' && typeof v === 'object') {
230
+ el.setAttribute('style', styleObjToCss(v));
231
+ continue;
232
+ }
233
+ const name = ATTR_ALIAS[k] || k;
234
+ if (v === true) {
235
+ el.setAttribute(name, '');
236
+ }
237
+ else {
238
+ el.setAttribute(name, String(v));
239
+ }
240
+ }
241
+ children.forEach((c, i) => appendChild(el, c, `${slotKey}>${tag}.${i}`));
242
+ return el;
243
+ }
244
+ // ── Mount (initial + re-render) ──────────────────────────────────────
245
+ function mount(root) {
246
+ root.rendering = true;
247
+ currentRoot = root;
248
+ root.currentSlotKey = '';
249
+ root.currentSlot = null;
250
+ root.stateIdx = 0;
251
+ root.effectIdx = 0;
252
+ root.refIdx = 0;
253
+ // Render tree
254
+ const tree = root.render();
255
+ // Wipe container + re-fill
256
+ root.container.textContent = '';
257
+ appendChild(root.container, tree, 'root');
258
+ // Flush pending effects (post-render)
259
+ for (const slot of root.slots.values()) {
260
+ for (const effect of slot.effects) {
261
+ if (effect.pending) {
262
+ try {
263
+ effect.pending();
264
+ }
265
+ catch (e) {
266
+ console.error(e);
267
+ }
268
+ effect.pending = undefined;
269
+ }
270
+ }
271
+ }
272
+ currentRoot = null;
273
+ root.rendering = false;
274
+ if (root.pendingRender) {
275
+ root.pendingRender = false;
276
+ queueMicrotask(() => mount(root));
277
+ }
278
+ }
279
+ // ── Public createRoot ────────────────────────────────────────────────
280
+ export function createRoot(container) {
281
+ return {
282
+ render(tree) {
283
+ const root = {
284
+ container,
285
+ render: () => tree,
286
+ slots: new Map(),
287
+ currentSlotKey: '',
288
+ currentSlot: null,
289
+ stateIdx: 0,
290
+ effectIdx: 0,
291
+ refIdx: 0,
292
+ rendering: false,
293
+ pendingRender: false,
294
+ };
295
+ mount(root);
296
+ },
297
+ };
298
+ }
299
+ // ── Helper for bundle entry points ──────────────────────────────────
300
+ // The dev runner generates an entry that imports the user's page module,
301
+ // calls jsx() on its default export, and hands it to createRoot.
302
+ export { JSXNode };
303
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/jsx/dom/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Route } from './routes.ts';
2
+ type BundleInput = {
3
+ routes: Route[];
4
+ rootLayoutFile: string | null;
5
+ };
6
+ export declare function bundleClient({ routes, rootLayoutFile }: BundleInput): Promise<string>;
7
+ export {};
8
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAsB,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA4F3F"}
@@ -0,0 +1,98 @@
1
+ // Generates the client-side JavaScript bundle that hydrates the WebView.
2
+ //
3
+ // We synthesize an entry that:
4
+ // 1. imports every page module (from src/app/.../page.tsx)
5
+ // 2. imports the root layout (if present)
6
+ // 3. wires hash-based routing
7
+ // 4. calls createRoot on #murasaki-root and re-renders on hashchange
8
+ //
9
+ // esbuild bundles the synthesized entry through the user's filesystem
10
+ // (resolveDir = projectRoot), pulling in murasaki/jsx/dom and the user's
11
+ // own code. The output is an IIFE that runs as soon as the <script> loads.
12
+ import * as esbuild from 'esbuild';
13
+ import { projectRoot } from "../env.js";
14
+ export async function bundleClient({ routes, rootLayoutFile }) {
15
+ // Each route gets a numbered Page import so we can wire them by URL path.
16
+ const pageImports = routes
17
+ .map((r, i) => `import Page${i} from ${JSON.stringify(r.pageFile)}`)
18
+ .join('\n');
19
+ const layoutImport = rootLayoutFile
20
+ ? `import RootLayout from ${JSON.stringify(rootLayoutFile)}`
21
+ : '';
22
+ // path → Page component map
23
+ const routesMap = routes.map((r, i) => ` ${JSON.stringify(r.path)}: Page${i},`).join('\n');
24
+ const wrap = rootLayoutFile ? 'jsx(RootLayout, { children: jsx(Page, null) })' : 'jsx(Page, null)';
25
+ const entry = `
26
+ ${pageImports}
27
+ ${layoutImport}
28
+ import { createRoot, jsx } from 'murasaki/jsx/dom'
29
+
30
+ const ROUTES = {
31
+ ${routesMap}
32
+ }
33
+
34
+ function currentPath() {
35
+ const h = (typeof location !== 'undefined' && location.hash) || ''
36
+ return h.startsWith('#') ? (h.slice(1) || '/') : '/'
37
+ }
38
+
39
+ const container = document.getElementById('murasaki-root')
40
+ if (!container) {
41
+ throw new Error('[murasaki] mount point #murasaki-root not found')
42
+ }
43
+ container.textContent = ''
44
+
45
+ let _root
46
+ function render() {
47
+ const path = currentPath()
48
+ const Page = ROUTES[path] || ROUTES['/']
49
+ if (!Page) {
50
+ container.textContent = '404'
51
+ return
52
+ }
53
+ const tree = ${wrap}
54
+ if (!_root) _root = createRoot(container)
55
+ _root.render(tree)
56
+ }
57
+
58
+ render()
59
+ window.addEventListener('hashchange', render)
60
+
61
+ // Intercept anchor clicks marked with data-murasaki-link
62
+ document.addEventListener('click', function (e) {
63
+ let t = e.target
64
+ while (t && t.nodeType === 1) {
65
+ if (t.tagName === 'A' && t.hasAttribute('data-murasaki-link')) {
66
+ e.preventDefault()
67
+ const href = t.getAttribute('data-murasaki-link')
68
+ if ('#' + href !== location.hash) location.hash = href
69
+ else render()
70
+ return
71
+ }
72
+ t = t.parentNode
73
+ }
74
+ })
75
+ `;
76
+ const result = await esbuild.build({
77
+ stdin: {
78
+ contents: entry,
79
+ loader: 'tsx',
80
+ resolveDir: projectRoot,
81
+ sourcefile: '<murasaki-client-entry>.tsx',
82
+ },
83
+ bundle: true,
84
+ write: false,
85
+ format: 'iife',
86
+ target: ['safari16', 'chrome120', 'firefox120'],
87
+ jsx: 'automatic',
88
+ jsxImportSource: 'murasaki',
89
+ minify: false,
90
+ sourcemap: 'inline',
91
+ logLevel: 'silent',
92
+ });
93
+ if (result.errors.length) {
94
+ throw new Error(`[murasaki] client bundle failed:\n${result.errors.map((e) => e.text).join('\n')}`);
95
+ }
96
+ return result.outputFiles[0].text;
97
+ }
98
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,+BAA+B;AAC/B,6DAA6D;AAC7D,4CAA4C;AAC5C,gCAAgC;AAChC,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,2EAA2E;AAE3E,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAQvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAe;IACxE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;SACnE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;QAC5D,CAAC,CAAC,EAAE,CAAA;IAEN,4BAA4B;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3F,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAElG,MAAM,KAAK,GAAG;EACd,WAAW;EACX,YAAY;;;;EAIZ,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAsBM,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBpB,CAAA;IAEC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,6BAA6B;SAC1C;QACD,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC;QAC/C,GAAG,EAAE,WAAW;QAChB,eAAe,EAAE,UAAU;QAC3B,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnC,CAAC"}
@@ -0,0 +1,19 @@
1
+ type NotifyOptions = {
2
+ title: string;
3
+ body?: string;
4
+ sound?: boolean;
5
+ };
6
+ export declare const nativeBridge: {
7
+ /** Show an OS notification. */
8
+ notify(opts: NotifyOptions): Promise<void>;
9
+ /** Copy text to the system clipboard. */
10
+ clipboardWrite(text: string): Promise<void>;
11
+ /** Read text from the system clipboard. */
12
+ clipboardRead(): Promise<string>;
13
+ /** Open a URL or file path in the system default handler (browser, etc). */
14
+ openExternal(target: string): Promise<void>;
15
+ /** Murasaki version (debug/probe). */
16
+ version: string;
17
+ };
18
+ export {};
19
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/runtime/native.ts"],"names":[],"mappings":"AAWA,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAoCD,eAAO,MAAM,YAAY;IACvB,+BAA+B;iBACZ,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhD,yCAAyC;yBACd,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,2CAA2C;qBACpB,OAAO,CAAC,MAAM,CAAC;IAYtC,4EAA4E;yBACjD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,sCAAsC;;CAEvC,CAAA"}
@@ -0,0 +1,111 @@
1
+ // Native bridge exposed to the WebView under `window.murasaki`.
2
+ //
3
+ // Each function here becomes callable from client code via
4
+ // await window.murasaki.<name>(args)
5
+ // (the underlying transport is @webviewjs/webview's `webview.expose`).
6
+ //
7
+ // macOS-first; Windows/Linux paths are best-effort. All values & arguments
8
+ // must be JSON-serializable.
9
+ import { spawn } from 'node:child_process';
10
+ function runSilent(cmd, args, stdin) {
11
+ return new Promise((resolve, reject) => {
12
+ const proc = spawn(cmd, args, { stdio: ['pipe', 'ignore', 'ignore'] });
13
+ proc.on('error', reject);
14
+ proc.on('exit', (code) => {
15
+ if (code === 0)
16
+ resolve();
17
+ else
18
+ reject(new Error(`${cmd} exited with code ${code}`));
19
+ });
20
+ if (stdin !== undefined) {
21
+ proc.stdin.write(stdin);
22
+ proc.stdin.end();
23
+ }
24
+ });
25
+ }
26
+ function runCapture(cmd, args) {
27
+ return new Promise((resolve, reject) => {
28
+ const proc = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'ignore'] });
29
+ let out = '';
30
+ proc.stdout.on('data', (chunk) => {
31
+ out += chunk.toString();
32
+ });
33
+ proc.on('error', reject);
34
+ proc.on('exit', (code) => {
35
+ if (code === 0)
36
+ resolve(out);
37
+ else
38
+ reject(new Error(`${cmd} exited with code ${code}`));
39
+ });
40
+ });
41
+ }
42
+ function escapeAppleScript(s) {
43
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
44
+ }
45
+ export const nativeBridge = {
46
+ /** Show an OS notification. */
47
+ async notify(opts) {
48
+ if (process.platform === 'darwin') {
49
+ const title = escapeAppleScript(opts.title);
50
+ const body = escapeAppleScript(opts.body ?? '');
51
+ const sound = opts.sound ? ' sound name "default"' : '';
52
+ const script = `display notification "${body}" with title "${title}"${sound}`;
53
+ await runSilent('osascript', ['-e', script]);
54
+ return;
55
+ }
56
+ if (process.platform === 'win32') {
57
+ // Best-effort PowerShell toast
58
+ const escaped = opts.title.replace(/"/g, '\\"');
59
+ const body = (opts.body ?? '').replace(/"/g, '\\"');
60
+ const ps = `New-BurntToastNotification -Text "${escaped}","${body}"`;
61
+ await runSilent('powershell', ['-Command', ps]);
62
+ return;
63
+ }
64
+ // Linux
65
+ const args = [];
66
+ if (opts.body)
67
+ args.push(opts.title, opts.body);
68
+ else
69
+ args.push(opts.title);
70
+ await runSilent('notify-send', args);
71
+ },
72
+ /** Copy text to the system clipboard. */
73
+ async clipboardWrite(text) {
74
+ if (process.platform === 'darwin')
75
+ return runSilent('pbcopy', [], text);
76
+ if (process.platform === 'win32')
77
+ return runSilent('clip', [], text);
78
+ // Linux: try wl-copy (Wayland) then xclip (X11)
79
+ try {
80
+ return await runSilent('wl-copy', [], text);
81
+ }
82
+ catch {
83
+ return runSilent('xclip', ['-selection', 'clipboard'], text);
84
+ }
85
+ },
86
+ /** Read text from the system clipboard. */
87
+ async clipboardRead() {
88
+ if (process.platform === 'darwin')
89
+ return runCapture('pbpaste', []);
90
+ if (process.platform === 'win32') {
91
+ return runCapture('powershell', ['-Command', 'Get-Clipboard']);
92
+ }
93
+ try {
94
+ return await runCapture('wl-paste', ['--no-newline']);
95
+ }
96
+ catch {
97
+ return runCapture('xclip', ['-selection', 'clipboard', '-o']);
98
+ }
99
+ },
100
+ /** Open a URL or file path in the system default handler (browser, etc). */
101
+ async openExternal(target) {
102
+ const cmd = process.platform === 'darwin' ? 'open'
103
+ : process.platform === 'win32' ? 'cmd'
104
+ : 'xdg-open';
105
+ const args = process.platform === 'win32' ? ['/c', 'start', '', target] : [target];
106
+ return runSilent(cmd, args);
107
+ },
108
+ /** Murasaki version (debug/probe). */
109
+ version: '0.3.0',
110
+ };
111
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/runtime/native.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,2DAA2D;AAC3D,uCAAuC;AACvC,uEAAuE;AACvE,EAAE;AACF,2EAA2E;AAC3E,6BAA6B;AAE7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAQ1C,SAAS,SAAS,CAAC,GAAW,EAAE,IAAc,EAAE,KAAc;IAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QACtE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACxB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;;gBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;QACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,IAAc;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QACtE,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACxB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAA;;gBACvB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,+BAA+B;IAC/B,KAAK,CAAC,MAAM,CAAC,IAAmB;QAC9B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAA;YACvD,MAAM,MAAM,GAAG,yBAAyB,IAAI,iBAAiB,KAAK,IAAI,KAAK,EAAE,CAAA;YAC7E,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,+BAA+B;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAC/C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACnD,MAAM,EAAE,GAAG,qCAAqC,OAAO,MAAM,IAAI,GAAG,CAAA;YACpE,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAA;YAC/C,OAAM;QACR,CAAC;QACD,QAAQ;QACR,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1B,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QACpE,gDAAgD;QAChD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,aAAa;QACjB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QACnE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,UAAU,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK;gBACtC,CAAC,CAAC,UAAU,CAAA;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,sCAAsC;IACtC,OAAO,EAAE,OAAO;CACjB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAkJ/C,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAUvD"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAmJ/C,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAUvD"}
@@ -22,6 +22,7 @@ import { existsSync, readFileSync } from 'node:fs';
22
22
  import { pathToFileURL } from 'node:url';
23
23
  import { APP_DIR, APP_GLOBALS_CSS, LEGACY_APP_PATH, LEGACY_GLOBALS_CSS, LEGACY_LAYOUT_PATH, } from "../env.js";
24
24
  import { jsx, raw, renderToString } from "../jsx/runtime.js";
25
+ import { bundleClient } from "./bundle.js";
25
26
  import { discoverRoutes } from "./routes.js";
26
27
  const NO_APP_HTML = '<!doctype html><html><body style="font-family:system-ui;padding:40px;">' +
27
28
  '<h1 style="color:#A855F7">No app found</h1>' +
@@ -177,17 +178,34 @@ async function renderAppRouter() {
177
178
  const rootLayoutFile = rootLayoutPath && rootLayoutPath.endsWith('/app/layout.tsx') ? rootLayoutPath : null;
178
179
  const rootLayoutMod = rootLayoutFile ? await loadModule(rootLayoutFile) : null;
179
180
  const metadata = rootLayoutMod?.metadata;
180
- // 2. Render each page (wrapped in its nested layouts, excluding root)
181
+ // 2. Server pre-render each page (gives a usable first paint before the
182
+ // client bundle boots — pre-hydration shell). Each block goes inside
183
+ // the mount root and is replaced by the client renderer on boot.
181
184
  const blocks = [];
182
185
  for (const route of routes) {
183
186
  const inner = await renderPageInner(route, rootLayoutFile);
184
187
  blocks.push(`<div data-murasaki-route="${escapeHtml(route.path)}" hidden>${inner}</div>`);
185
188
  }
186
- const switcher = raw(blocks.join('') + NAV_SCRIPT);
187
- // 3. Render root layout with switcher as children
188
- const bodyContent = await renderRootLayout(rootLayoutMod, switcher);
189
+ // 3. Wrap the server-rendered content + nav script in the mount container.
190
+ // The client bundle will clear this container on boot and re-render
191
+ // interactively (useState/onClick actually fire after that).
192
+ const mountInner = blocks.join('') + NAV_SCRIPT;
193
+ const mountRoot = `<div id="murasaki-root">${mountInner}</div>`;
194
+ // 4. Build + inline client bundle (esbuild, IIFE)
195
+ let clientScript = '';
196
+ try {
197
+ const code = await bundleClient({ routes, rootLayoutFile });
198
+ clientScript = `<script type="module" data-murasaki="client">${code}</script>`;
199
+ }
200
+ catch (e) {
201
+ // Render an inline error overlay so the WebView shows what broke
202
+ const msg = escapeHtml(String(e?.message ?? e));
203
+ clientScript = `<script>document.body.insertAdjacentHTML('beforeend','<pre style=\\'position:fixed;inset:0;background:#1a0a33;color:#A855F7;padding:24px;font-family:SF Mono,Menlo,monospace;font-size:13px;overflow:auto;z-index:9999\\'>client bundle failed:\\n${msg.replace(/[\\'\\\\]/g, '\\\\$&')}</pre>')</script>`;
204
+ }
205
+ // 5. Render root layout with mount root + client script as children
206
+ const bodyContent = await renderRootLayout(rootLayoutMod, raw(mountRoot + clientScript));
189
207
  let html = '<!doctype html>' + bodyContent;
190
- // 4. Inject metadata + globals.css
208
+ // 6. Inject metadata + globals.css
191
209
  html = injectHead(html, metadata, loadGlobalsCss());
192
210
  return { html, metadata };
193
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAS/C,eAAO,MAAM,GAAG,aAAqD,CAAA;AA+BrE,wBAAgB,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,CAElD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAahD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAI9B"}
1
+ {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,eAAO,MAAM,GAAG,aAAqD,CAAA;AA+BrE,wBAAgB,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,CAElD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBhD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAI9B"}
@@ -6,6 +6,7 @@
6
6
  import { Application, ControlFlow } from '@webviewjs/webview';
7
7
  import { printClosed, printError, printHint, printReloaded } from "../cli/log.js";
8
8
  import { DEFAULT_WIN_SIZE, DEFAULT_WIN_TITLE, projectRoot } from "../env.js";
9
+ import { nativeBridge } from "./native.js";
9
10
  import { renderApp } from "./render.js";
10
11
  const config = {
11
12
  title: DEFAULT_WIN_TITLE,
@@ -58,6 +59,13 @@ export async function openWindow() {
58
59
  height: config.height,
59
60
  });
60
61
  webview = win.createWebview({ html });
62
+ // Expose native bridge under window.murasaki for client hooks.
63
+ try {
64
+ webview.expose('murasaki', nativeBridge);
65
+ }
66
+ catch (e) {
67
+ printError(`Native bridge expose failed: ${e.message}`);
68
+ }
61
69
  }
62
70
  export function closeWindow() {
63
71
  if (!win)
@@ -1 +1 @@
1
- {"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/runtime/window.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "murasaki",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "The desktop framework for Next.js developers. Node-powered. WebView-thin. No Rust. No Chromium.",
5
5
  "keywords": [
6
6
  "desktop",
@@ -42,6 +42,10 @@
42
42
  "./jsx-dev-runtime": {
43
43
  "types": "./dist/jsx/jsx-dev-runtime.d.ts",
44
44
  "default": "./dist/jsx/jsx-dev-runtime.js"
45
+ },
46
+ "./jsx/dom": {
47
+ "types": "./dist/jsx/dom/index.d.ts",
48
+ "default": "./dist/jsx/dom/index.js"
45
49
  }
46
50
  },
47
51
  "files": [
@@ -61,6 +65,7 @@
61
65
  },
62
66
  "dependencies": {
63
67
  "@webviewjs/webview": "^0.3.2",
68
+ "esbuild": "^0.28.1",
64
69
  "tsx": "^4.22.4"
65
70
  },
66
71
  "devDependencies": {