@wrnrlr/prelude 0.0.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.
- package/.github/workflows/publish.yml +16 -0
- package/LICENSE +1 -0
- package/deno.json +23 -0
- package/example/counter.html +24 -0
- package/example/greeting.html +25 -0
- package/example/paint.html +22 -0
- package/example/show.html +18 -0
- package/example/todo.html +70 -0
- package/index.html +230 -0
- package/package.json +12 -0
- package/presets.css +284 -0
- package/public/banner.svg +6 -0
- package/public/logo.svg +5 -0
- package/readme.md +86 -0
- package/src/canvas.js +114 -0
- package/src/components.js +20 -0
- package/src/constants.ts +515 -0
- package/src/controlflow.js +163 -0
- package/src/hyperscript.ts +237 -0
- package/src/mod.ts +45 -0
- package/src/reactive.ts +359 -0
- package/src/runtime.ts +434 -0
- package/test/hyperscript.js +102 -0
- package/test/reactive.js +98 -0
- package/test/runtime.js +7 -0
- package/typedoc.jsonc +31 -0
package/presets.css
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
@font-face {font-family:BasicIcons;src:url(/static/fa.woff2) format('woff2');}
|
|
2
|
+
*, ::before, ::after {box-sizing: border-box; margin: 0; min-width: 0}
|
|
3
|
+
html {
|
|
4
|
+
height: 100%;
|
|
5
|
+
hanging-punctuation: first last;
|
|
6
|
+
font-family:system-ui,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji';
|
|
7
|
+
line-height: 1.15; -webkit-text-size-adjust: 100%;
|
|
8
|
+
-moz-tab-size: 4; tab-size: 4;
|
|
9
|
+
font-size: 18px;
|
|
10
|
+
color: var(--neutral-950);
|
|
11
|
+
background-color: var(--neutral-50);
|
|
12
|
+
}
|
|
13
|
+
body {height: 100%}
|
|
14
|
+
hr {height: 0;color: inherit;}
|
|
15
|
+
abbr[title] {text-decoration: underline dotted}
|
|
16
|
+
b,strong {font-weight: bolder}
|
|
17
|
+
code,kbd,samp,pre {font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size: 1em;}
|
|
18
|
+
small {font-size: 80%;}
|
|
19
|
+
sub,sup {font-size: 75%;line-height: 0;position: relative;vertical-align: baseline;}
|
|
20
|
+
sub {bottom: -0.25em}
|
|
21
|
+
sup {top: -0.5em}
|
|
22
|
+
table {border-collapse: collapse; text-indent: 0; border-color: inherit;}
|
|
23
|
+
button,input,optgroup,select,textarea {font-family:inherit;font-size:100%;line-height:1.15;}
|
|
24
|
+
button, select {text-transform: none}
|
|
25
|
+
button, [type='button'], [type='reset'], [type='submit'] {-webkit-appearance: button}
|
|
26
|
+
::-moz-focus-inner {border-style: none;padding: 0;}
|
|
27
|
+
:-moz-focusring {outline: 1px dotted ButtonText;}
|
|
28
|
+
:-moz-ui-invalid {box-shadow: none;}
|
|
29
|
+
legend {padding: 0}
|
|
30
|
+
progress {vertical-align: baseline}
|
|
31
|
+
::-webkit-inner-spin-button, ::-webkit-outer-spin-button {height: auto;margin: 0}
|
|
32
|
+
[type='search'] {-webkit-appearance: textfield; outline-offset: -2px;}
|
|
33
|
+
::-webkit-search-decoration {-webkit-appearance: none;}
|
|
34
|
+
::-webkit-file-upload-button {-webkit-appearance: button;font: inherit;}
|
|
35
|
+
|
|
36
|
+
h1,h2,h3,h4,h5,h6 {text-wrap:balance}
|
|
37
|
+
p {max-width:62ch;text-wrap:pretty}
|
|
38
|
+
dialog {padding:0;border-width:0}
|
|
39
|
+
button,input {padding:0;border-width:0;background-color:transparent}
|
|
40
|
+
input:focus,button:focus {outline:none}
|
|
41
|
+
summary {display: list-item;}
|
|
42
|
+
|
|
43
|
+
:root {
|
|
44
|
+
--slate-50: #f8fafc;
|
|
45
|
+
--slate-100: #f1f5f9;
|
|
46
|
+
--slate-200: #e2e8f0;
|
|
47
|
+
--slate-300: #cbd5e1;
|
|
48
|
+
--slate-400: #94a3b8;
|
|
49
|
+
--slate-500: #64748b;
|
|
50
|
+
--slate-600: #475569;
|
|
51
|
+
--slate-700: #334155;
|
|
52
|
+
--slate-800: #1e293b;
|
|
53
|
+
--slate-900: #0f172a;
|
|
54
|
+
--slate-950: #020617;
|
|
55
|
+
|
|
56
|
+
--gray-50: #f9fafb;
|
|
57
|
+
--gray-100: #f3f4f6;
|
|
58
|
+
--gray-200: #e5e7eb;
|
|
59
|
+
--gray-300: #d1d5db;
|
|
60
|
+
--gray-400: #9ca3af;
|
|
61
|
+
--gray-500: #6b7280;
|
|
62
|
+
--gray-600: #4b5563;
|
|
63
|
+
--gray-700: #374151;
|
|
64
|
+
--gray-800: #1f2937;
|
|
65
|
+
--gray-900: #111827;
|
|
66
|
+
--gray-950: #030712;
|
|
67
|
+
|
|
68
|
+
--red-50: #f9fafb;
|
|
69
|
+
--red-100: #f3f4f6;
|
|
70
|
+
--red-200: #e5e7eb;
|
|
71
|
+
--red-300: #d1d5db;
|
|
72
|
+
--red-400: #9ca3af;
|
|
73
|
+
--red-500: #6b7280;
|
|
74
|
+
--red-600: #4b5563;
|
|
75
|
+
--red-700: #374151;
|
|
76
|
+
--red-800: #1f2937;
|
|
77
|
+
--red-900: #111827;
|
|
78
|
+
--red-950: #030712;
|
|
79
|
+
|
|
80
|
+
/* red */
|
|
81
|
+
--red-50: #fef2f2;
|
|
82
|
+
--red-100: #fee2e2;
|
|
83
|
+
--red-200: #fecaca;
|
|
84
|
+
--red-300: #fca5a5;
|
|
85
|
+
--red-400: #f87171;
|
|
86
|
+
--red-500: #ef4444;
|
|
87
|
+
--red-600: #dc2626;
|
|
88
|
+
--red-700: #b91c1c;
|
|
89
|
+
--red-800: #991b1b;
|
|
90
|
+
--red-900: #7f1d1d;
|
|
91
|
+
--red-950: #450a0a;
|
|
92
|
+
|
|
93
|
+
--orange-50: #fff7ed;
|
|
94
|
+
--orange-100: #ffedd5;
|
|
95
|
+
--orange-200: #fed7aa;
|
|
96
|
+
--orange-300: #fdba74;
|
|
97
|
+
--orange-400: #fb923c;
|
|
98
|
+
--orange-500: #f97316;
|
|
99
|
+
--orange-600: #ea580c;
|
|
100
|
+
--orange-700: #c2410c;
|
|
101
|
+
--orange-800: #9a3412;
|
|
102
|
+
--orange-900: #7c2d12;
|
|
103
|
+
--orange-950: #431407;
|
|
104
|
+
|
|
105
|
+
--yellow-50: #fefce8;
|
|
106
|
+
--yellow-100: #fef9c3;
|
|
107
|
+
--yellow-200: #fef08a;
|
|
108
|
+
--yellow-300: #fde047;
|
|
109
|
+
--yellow-400: #facc15;
|
|
110
|
+
--yellow-500: #eab308;
|
|
111
|
+
--yellow-600: #ca8a04;
|
|
112
|
+
--yellow-700: #a16207;
|
|
113
|
+
--yellow-800: #854d0e;
|
|
114
|
+
--yellow-900: #713f12;
|
|
115
|
+
--yellow-950: #422006;
|
|
116
|
+
|
|
117
|
+
--lime-50: #f7fee7;
|
|
118
|
+
--lime-100: #ecfccb;
|
|
119
|
+
--lime-200: #d9f99d;
|
|
120
|
+
--lime-300: #bef264;
|
|
121
|
+
--lime-400: #a3e635;
|
|
122
|
+
--lime-500: #84cc16;
|
|
123
|
+
--lime-600: #65a30d;
|
|
124
|
+
--lime-700: #4d7c0f;
|
|
125
|
+
--lime-800: #3f6212;
|
|
126
|
+
--lime-900: #365314;
|
|
127
|
+
--lime-950: #1a2e05;
|
|
128
|
+
|
|
129
|
+
--green-50: #f0fdf4;
|
|
130
|
+
--green-100: #dcfce7;
|
|
131
|
+
--green-200: #bbf7d0;
|
|
132
|
+
--green-300: #86efac;
|
|
133
|
+
--green-400: #4ade80;
|
|
134
|
+
--green-500: #22c55e;
|
|
135
|
+
--green-600: #16a34a;
|
|
136
|
+
--green-700: #15803d;
|
|
137
|
+
--green-800: #166534;
|
|
138
|
+
--green-900: #14532d;
|
|
139
|
+
--green-950: #052e16;
|
|
140
|
+
|
|
141
|
+
--emrald-50: #ecfdf5;
|
|
142
|
+
--emrald-100: #d1fae5;
|
|
143
|
+
--emrald-200: #a7f3d0;
|
|
144
|
+
--emrald-300: #6ee7b7;
|
|
145
|
+
--emrald-400: #34d399;
|
|
146
|
+
--emrald-500: #10b981;
|
|
147
|
+
--emrald-600: #059669;
|
|
148
|
+
--emrald-700: #047857;
|
|
149
|
+
--emrald-800: #065f46;
|
|
150
|
+
--emrald-900: #064e3b;
|
|
151
|
+
--emrald-950: #022c22;
|
|
152
|
+
|
|
153
|
+
--teal-50: #f0fdfa;
|
|
154
|
+
--teal-100: #ccfbf1;
|
|
155
|
+
--teal-200: #99f6e4;
|
|
156
|
+
--teal-300: #5eead4;
|
|
157
|
+
--teal-400: #2dd4bf;
|
|
158
|
+
--teal-500: #14b8a6;
|
|
159
|
+
--teal-600: #0d9488;
|
|
160
|
+
--teal-700: #0f766e;
|
|
161
|
+
--teal-800: #115e59;
|
|
162
|
+
--teal-900: #134e4a;
|
|
163
|
+
--teal-950: #042f2e;
|
|
164
|
+
|
|
165
|
+
--cyan-50: #ecfeff;
|
|
166
|
+
--cyan-100: #cffafe;
|
|
167
|
+
--cyan-200: #a5f3fc;
|
|
168
|
+
--cyan-300: #67e8f9;
|
|
169
|
+
--cyan-400: #22d3ee;
|
|
170
|
+
--cyan-500: #06b6d4;
|
|
171
|
+
--cyan-600: #0891b2;
|
|
172
|
+
--cyan-700: #0e7490;
|
|
173
|
+
--cyan-800: #155e75;
|
|
174
|
+
--cyan-900: #164e63;
|
|
175
|
+
--cyan-950: #083344;
|
|
176
|
+
|
|
177
|
+
--sky-50: #f0f9ff;
|
|
178
|
+
--sky-100: #e0f2fe;
|
|
179
|
+
--sky-200: #bae6fd;
|
|
180
|
+
--sky-300: #7dd3fc;
|
|
181
|
+
--sky-400: #38bdf8;
|
|
182
|
+
--sky-500: #0ea5e9;
|
|
183
|
+
--sky-600: #0284c7;
|
|
184
|
+
--sky-700: #0369a1;
|
|
185
|
+
--sky-800: #075985;
|
|
186
|
+
--sky-900: #0c4a6e;
|
|
187
|
+
--sky-950: #082f49;
|
|
188
|
+
|
|
189
|
+
--blue-50: #eff6ff;
|
|
190
|
+
--blue-100: #dbeafe;
|
|
191
|
+
--blue-200: #bfdbfe;
|
|
192
|
+
--blue-300: #93c5fd;
|
|
193
|
+
--blue-400: #60a5fa;
|
|
194
|
+
--blue-500: #3b82f6;
|
|
195
|
+
--blue-600: #2563eb;
|
|
196
|
+
--blue-700: #1d4ed8;
|
|
197
|
+
--blue-800: #1e40af;
|
|
198
|
+
--blue-900: #1e3a8a;
|
|
199
|
+
--blue-950: #172554;
|
|
200
|
+
|
|
201
|
+
--indigo-50: #eef2ff;
|
|
202
|
+
--indigo-100: #e0e7ff;
|
|
203
|
+
--indigo-200: #c7d2fe;
|
|
204
|
+
--indigo-300: #a5b4fc;
|
|
205
|
+
--indigo-400: #818cf8;
|
|
206
|
+
--indigo-500: #6366f1;
|
|
207
|
+
--indigo-600: #4f46e5;
|
|
208
|
+
--indigo-700: #4338ca;
|
|
209
|
+
--indigo-800: #3730a3;
|
|
210
|
+
--indigo-900: #312e81;
|
|
211
|
+
--indigo-950: #1e1b4b;
|
|
212
|
+
|
|
213
|
+
--violet-50: #f5f3ff;
|
|
214
|
+
--violet-100: #ede9fe;
|
|
215
|
+
--violet-200: #ddd6fe;
|
|
216
|
+
--violet-300: #c4b5fd;
|
|
217
|
+
--violet-400: #a78bfa;
|
|
218
|
+
--violet-500: #8b5cf6;
|
|
219
|
+
--violet-600: #7c3aed;
|
|
220
|
+
--violet-700: #6d28d9;
|
|
221
|
+
--violet-800: #5b21b6;
|
|
222
|
+
--violet-900: #4c1d95;
|
|
223
|
+
--violet-950: #2e1065;
|
|
224
|
+
|
|
225
|
+
--purple-50: #faf5ff;
|
|
226
|
+
--purple-100: #f3e8ff;
|
|
227
|
+
--purple-200: #e9d5ff;
|
|
228
|
+
--purple-300: #d8b4fe;
|
|
229
|
+
--purple-400: #c084fc;
|
|
230
|
+
--purple-500: #a855f7;
|
|
231
|
+
--purple-600: #9333ea;
|
|
232
|
+
--purple-700: #7e22ce;
|
|
233
|
+
--purple-800: #6b21a8;
|
|
234
|
+
--purple-900: #581c87;
|
|
235
|
+
--purple-950: #3b0764;
|
|
236
|
+
|
|
237
|
+
--fuchsia-50: #fdf4ff;
|
|
238
|
+
--fuchsia-100: #fae8ff;
|
|
239
|
+
--fuchsia-200: #f5d0fe;
|
|
240
|
+
--fuchsia-300: #f0abfc;
|
|
241
|
+
--fuchsia-400: #e879f9;
|
|
242
|
+
--fuchsia-500: #d946ef;
|
|
243
|
+
--fuchsia-600: #c026d3;
|
|
244
|
+
--fuchsia-700: #a21caf;
|
|
245
|
+
--fuchsia-800: #86198f;
|
|
246
|
+
--fuchsia-900: #701a75;
|
|
247
|
+
--fuchsia-950: #4a044e;
|
|
248
|
+
|
|
249
|
+
--pink-50: #fdf2f8;
|
|
250
|
+
--pink-100: #fce7f3;
|
|
251
|
+
--pink-200: #fbcfe8;
|
|
252
|
+
--pink-300: #f9a8d4;
|
|
253
|
+
--pink-400: #f472b6;
|
|
254
|
+
--pink-500: #ec4899;
|
|
255
|
+
--pink-600: #db2777;
|
|
256
|
+
--pink-700: #be185d;
|
|
257
|
+
--pink-800: #9d174d;
|
|
258
|
+
--pink-900: #831843;
|
|
259
|
+
--pink-950: #500724;
|
|
260
|
+
|
|
261
|
+
--rose-50: #fff1f2;
|
|
262
|
+
--rose-100: #ffe4e6;
|
|
263
|
+
--rose-200: #fecdd3;
|
|
264
|
+
--rose-300: #fda4af;
|
|
265
|
+
--rose-400: #fb7185;
|
|
266
|
+
--rose-500: #f43f5e;
|
|
267
|
+
--rose-600: #e11d48;
|
|
268
|
+
--rose-700: #be123c;
|
|
269
|
+
--rose-800: #9f1239;
|
|
270
|
+
--rose-900: #881337;
|
|
271
|
+
--rose-950: #4c0519;
|
|
272
|
+
|
|
273
|
+
--neutral-50: #fafafa;
|
|
274
|
+
--neutral-100: #f5f5f5;
|
|
275
|
+
--neutral-200: #e5e5e5;
|
|
276
|
+
--neutral-300: #d4d4d4;
|
|
277
|
+
--neutral-400: #a3a3a3;
|
|
278
|
+
--neutral-500: #737373;
|
|
279
|
+
--neutral-600: #525252;
|
|
280
|
+
--neutral-700: #404040;
|
|
281
|
+
--neutral-800: #262626;
|
|
282
|
+
--neutral-900: #171717;
|
|
283
|
+
--neutral-950: #0a0a0a;
|
|
284
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!-- Generated by Pixelmator Pro 3.2.3 -->
|
|
3
|
+
<svg width="1984" height="709" viewBox="0 0 1984 709" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
4
|
+
<text id="Prelude" xml:space="preserve" x="765" y="492" font-family="Noto Serif" font-size="320" fill="#000000">Prelude</text>
|
|
5
|
+
<path id="Rectangle" fill="none" stroke="#000000" stroke-width="32" stroke-linecap="round" stroke-linejoin="round" d="M 201 548 L 613 548 L 613 159.754944 C 613 159.754944 146.066666 449.268463 410.340546 449.268463 C 670.90271 449.268463 201 159.754944 201 159.754944 L 201 548 Z"/>
|
|
6
|
+
</svg>
|
package/public/logo.svg
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!-- Generated by Pixelmator Pro 3.2.3 -->
|
|
3
|
+
<svg width="709" height="709" viewBox="0 0 709 709" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
4
|
+
<path id="Rectangle" fill="none" stroke="#444444" stroke-width="40" stroke-linecap="round" stroke-linejoin="round" d="M 76 617 L 631 617 L 631 94 C 631 94 26 450 358 450 C 682 450 76 94 76 94 L 76 617 Z"/>
|
|
5
|
+
</svg>
|
package/readme.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# PreludeJS
|
|
2
|
+
|
|
3
|
+
## Get Started
|
|
4
|
+
|
|
5
|
+
Run directly in the browser using ESM
|
|
6
|
+
```js
|
|
7
|
+
import {h, signal, render} from 'https://esm.sh/@wrnrlr/prelude'
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Install from NPM to run with Node or Bun
|
|
11
|
+
```js
|
|
12
|
+
import {h, signal, render} from 'wrnrlr/prelude'
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Use Deno's JSR
|
|
16
|
+
```js
|
|
17
|
+
import {h, signal, render} from 'jsr:wrnrlr/prelude'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
A simple js frontend library
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
import {h,signal,render} from 'https://jsr.org/wrnrlr/prelude.ts'
|
|
24
|
+
|
|
25
|
+
function Counter() {
|
|
26
|
+
const n = signal(1)
|
|
27
|
+
return [n,h('button',{onclick(e){n(n=>n+1)}},'+')]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
render(Counter, document.body)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Signals
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
const a = signal(1)
|
|
37
|
+
const b = signal(2)
|
|
38
|
+
effect(() => console.log('a+b', a()+b()))
|
|
39
|
+
const c = () => a()+b()
|
|
40
|
+
effect(() => console.log('c', c()))
|
|
41
|
+
a(i => i+1)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Hyperscript
|
|
45
|
+
|
|
46
|
+
The `h` function allows one to write html in javascript with a DSL specifically designed
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
h('div',{},[
|
|
50
|
+
h('label','Name'),h('input',{})
|
|
51
|
+
])
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Event Handler
|
|
55
|
+
|
|
56
|
+
An event handler MUST have an argument even if this is not being used,
|
|
57
|
+
otherwise hyperscript will confuse it for a signal.
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
// Ok
|
|
61
|
+
h('button', {onClick: e => console.log('Ok')}, 'Hi')
|
|
62
|
+
h('button', {onClick: _ => console.log('Ok')}, 'Hi')
|
|
63
|
+
// This event handler will be ignored
|
|
64
|
+
h('button', {onClick: () => console.log('Wrong')}, '')
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Conditional Rendering
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
h(Show, {when:show}, 'Hi')
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Rendering Lists
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
h(List, {each:show}, 'Hi')
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Inversion of Control
|
|
80
|
+
Prelude supports dependency injection with the `contect` and `useContext` APIs.
|
|
81
|
+
|
|
82
|
+
## Advanced DataTable
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
h(Table)
|
|
86
|
+
```
|
package/src/canvas.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import {signal,effect,memo,context,useContext, onMount} from './reactive.ts'
|
|
2
|
+
import {$RUNTIME} from './runtime.ts'
|
|
3
|
+
import {h} from './mod.ts'
|
|
4
|
+
|
|
5
|
+
function CanvasRuntime() {
|
|
6
|
+
let render,insert,spread,assign,element,text,isChild
|
|
7
|
+
return {render,insert,spread,assign,element,text,isChild}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const CountCtx = context()
|
|
11
|
+
|
|
12
|
+
const useCount = () => useContext(CountCtx)
|
|
13
|
+
|
|
14
|
+
function CountProvider(props) {
|
|
15
|
+
const count = signal(0)
|
|
16
|
+
return h(CountCtx, {value:[count]}, props.children)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const Ctx = context()
|
|
20
|
+
const useCanvas = () => useContext(Ctx)
|
|
21
|
+
|
|
22
|
+
function Canvas(props) {
|
|
23
|
+
const canvas = signal()
|
|
24
|
+
const ctx = signal()
|
|
25
|
+
effect(() => ctx(canvas()?.getContext('2d')))
|
|
26
|
+
return h(Ctx, {value:[canvas,ctx]},
|
|
27
|
+
h('canvas', {ref:canvas}, props.children))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function toCanvas(fn) {
|
|
31
|
+
// fn[$RUNTIME] = CanvasRuntime
|
|
32
|
+
return fn
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const Path = context()
|
|
36
|
+
const usePath = () => useContext(Path)
|
|
37
|
+
|
|
38
|
+
const Stroke = props => {
|
|
39
|
+
const ref = signal()
|
|
40
|
+
const [_,ctx] = useCanvas()
|
|
41
|
+
const path = signal(null)
|
|
42
|
+
let children
|
|
43
|
+
onMount(()=>path(new Path2D()))
|
|
44
|
+
effect(()=>console.log('Stroke',ref))
|
|
45
|
+
effect(() => {
|
|
46
|
+
if (!children) {
|
|
47
|
+
children = signal()
|
|
48
|
+
}
|
|
49
|
+
const kids = children()
|
|
50
|
+
if (kids) return
|
|
51
|
+
})
|
|
52
|
+
return h(Path, {ref, value:[path]}, props?.children)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const Fill = toCanvas(() => {
|
|
56
|
+
const ctx = useCanvas()
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const Line = props => {
|
|
60
|
+
let value, path, path2d
|
|
61
|
+
// if (props.value) value = memo(() => [l.x0, l.y0, l.x1, l.y1])
|
|
62
|
+
if (props.children) value = props.children.call ? props.children : () => props.children
|
|
63
|
+
if (props.fill || props.stroke) {
|
|
64
|
+
path2d = new Path2D()
|
|
65
|
+
// ctx =
|
|
66
|
+
}
|
|
67
|
+
if (!value) value = props.value
|
|
68
|
+
let ctx = path2d ?? usePath()
|
|
69
|
+
if (!path2d&&ctx) { path = ctx[0] }
|
|
70
|
+
let render = path2d ?
|
|
71
|
+
() => {
|
|
72
|
+
path2d.moveTo(v[0],v[1])
|
|
73
|
+
path2d.lineTo(v[2],v[3])
|
|
74
|
+
} : () => {
|
|
75
|
+
const p = path()
|
|
76
|
+
p.moveTo(v[0],v[1])
|
|
77
|
+
p.lineTo(v[2],v[3])
|
|
78
|
+
}
|
|
79
|
+
// effect(()=>console.log('Line',path(), value()))
|
|
80
|
+
// effect(()=>{path().lineTo(...value())})
|
|
81
|
+
return ops => {
|
|
82
|
+
console.log('render line')
|
|
83
|
+
// ops.push()
|
|
84
|
+
return {
|
|
85
|
+
shape() {return path2d},
|
|
86
|
+
render,
|
|
87
|
+
hit() {},
|
|
88
|
+
size() {},
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const Quadratic = toCanvas(q => {
|
|
94
|
+
const path = usePath()
|
|
95
|
+
return () => path.quadraticCurveTo(q.x0,q.y0,q.x1,q.y1,q.x2,q.y2)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const Bezier = toCanvas(b => {
|
|
99
|
+
const path = usePath()
|
|
100
|
+
return () => path.bezierCurveTo(b.x0,b.y0,b.x1,b.y1,b.x2,b.y2,b.x3,b.y3)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
const Arc = toCanvas(a => {
|
|
104
|
+
const path = usePath()
|
|
105
|
+
return () => path.arc(a.x, a.y, a.radius, a.startAngle, a.endAngle, a.counterclockwise)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
export const Group = {}
|
|
109
|
+
export const Pattern = {}
|
|
110
|
+
export const Text = {}
|
|
111
|
+
export const Rectangle = {}
|
|
112
|
+
export const Image = {}
|
|
113
|
+
|
|
114
|
+
export {CanvasRuntime,Canvas,Stroke,Fill,Line,Quadratic,Bezier,Arc}
|