@opencosmos/ui 1.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 (260) hide show
  1. package/.claude/CLAUDE.md +239 -0
  2. package/README.md +161 -0
  3. package/dist/cli.mjs +151 -0
  4. package/dist/dates.d.mts +20 -0
  5. package/dist/dates.d.ts +20 -0
  6. package/dist/dates.js +240 -0
  7. package/dist/dates.js.map +1 -0
  8. package/dist/dates.mjs +203 -0
  9. package/dist/dates.mjs.map +1 -0
  10. package/dist/dnd.d.mts +126 -0
  11. package/dist/dnd.d.ts +126 -0
  12. package/dist/dnd.js +274 -0
  13. package/dist/dnd.js.map +1 -0
  14. package/dist/dnd.mjs +250 -0
  15. package/dist/dnd.mjs.map +1 -0
  16. package/dist/fontThemes-Dh8mtXES.d.mts +868 -0
  17. package/dist/fontThemes-Dh8mtXES.d.ts +868 -0
  18. package/dist/forms.d.mts +38 -0
  19. package/dist/forms.d.ts +38 -0
  20. package/dist/forms.js +198 -0
  21. package/dist/forms.js.map +1 -0
  22. package/dist/forms.mjs +159 -0
  23. package/dist/forms.mjs.map +1 -0
  24. package/dist/hooks-1b8WaQf1.d.mts +225 -0
  25. package/dist/hooks-CKW8vE9H.d.ts +225 -0
  26. package/dist/hooks.d.mts +3 -0
  27. package/dist/hooks.d.ts +3 -0
  28. package/dist/hooks.js +971 -0
  29. package/dist/hooks.js.map +1 -0
  30. package/dist/hooks.mjs +943 -0
  31. package/dist/hooks.mjs.map +1 -0
  32. package/dist/index-DscTIrZ2.d.mts +29 -0
  33. package/dist/index-DscTIrZ2.d.ts +29 -0
  34. package/dist/index.d.mts +3382 -0
  35. package/dist/index.d.ts +3382 -0
  36. package/dist/index.js +15146 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/index.mjs +14802 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/providers-CXPDMsl7.d.mts +30 -0
  41. package/dist/providers-Dn_Msjvz.d.ts +30 -0
  42. package/dist/providers.d.mts +3 -0
  43. package/dist/providers.d.ts +3 -0
  44. package/dist/providers.js +1885 -0
  45. package/dist/providers.js.map +1 -0
  46. package/dist/providers.mjs +1859 -0
  47. package/dist/providers.mjs.map +1 -0
  48. package/dist/tables.d.mts +10 -0
  49. package/dist/tables.d.ts +10 -0
  50. package/dist/tables.js +248 -0
  51. package/dist/tables.js.map +1 -0
  52. package/dist/tables.mjs +218 -0
  53. package/dist/tables.mjs.map +1 -0
  54. package/dist/tokens.d.mts +1065 -0
  55. package/dist/tokens.d.ts +1065 -0
  56. package/dist/tokens.js +2637 -0
  57. package/dist/tokens.js.map +1 -0
  58. package/dist/tokens.mjs +2555 -0
  59. package/dist/tokens.mjs.map +1 -0
  60. package/dist/utils-CIIM7dAC.d.ts +986 -0
  61. package/dist/utils-Cs04sxth.d.mts +986 -0
  62. package/dist/utils.d.mts +4 -0
  63. package/dist/utils.d.ts +4 -0
  64. package/dist/utils.js +874 -0
  65. package/dist/utils.js.map +1 -0
  66. package/dist/utils.mjs +806 -0
  67. package/dist/utils.mjs.map +1 -0
  68. package/dist/validation-Bj1ye-v_.d.mts +114 -0
  69. package/dist/validation-Bj1ye-v_.d.ts +114 -0
  70. package/dist/webgl.d.mts +104 -0
  71. package/dist/webgl.d.ts +104 -0
  72. package/dist/webgl.js +226 -0
  73. package/dist/webgl.js.map +1 -0
  74. package/dist/webgl.mjs +195 -0
  75. package/dist/webgl.mjs.map +1 -0
  76. package/package.json +267 -0
  77. package/src/cli.ts +206 -0
  78. package/src/component-registry.ts +183 -0
  79. package/src/components/actions/Button.test.tsx +61 -0
  80. package/src/components/actions/Button.tsx +70 -0
  81. package/src/components/actions/Link.tsx +78 -0
  82. package/src/components/actions/Magnetic.tsx +68 -0
  83. package/src/components/actions/Toggle.test.tsx +40 -0
  84. package/src/components/actions/Toggle.tsx +47 -0
  85. package/src/components/actions/ToggleGroup.tsx +70 -0
  86. package/src/components/actions/index.ts +5 -0
  87. package/src/components/backgrounds/FaultyTerminal.tsx +426 -0
  88. package/src/components/backgrounds/OrbBackground.tsx +424 -0
  89. package/src/components/backgrounds/WarpBackground.tsx +358 -0
  90. package/src/components/backgrounds/index.ts +3 -0
  91. package/src/components/blocks/Hero.tsx +142 -0
  92. package/src/components/blocks/social/OpenGraphCard.tsx +243 -0
  93. package/src/components/cursor/SplashCursor.tsx +1315 -0
  94. package/src/components/cursor/TargetCursor.tsx +187 -0
  95. package/src/components/cursor/index.ts +2 -0
  96. package/src/components/data-display/AspectImage.tsx +73 -0
  97. package/src/components/data-display/Avatar.test.tsx +35 -0
  98. package/src/components/data-display/Avatar.tsx +55 -0
  99. package/src/components/data-display/Badge.test.tsx +43 -0
  100. package/src/components/data-display/Badge.tsx +84 -0
  101. package/src/components/data-display/Brand.tsx +123 -0
  102. package/src/components/data-display/Calendar.tsx +70 -0
  103. package/src/components/data-display/Card.test.tsx +92 -0
  104. package/src/components/data-display/Card.tsx +115 -0
  105. package/src/components/data-display/Code.tsx +210 -0
  106. package/src/components/data-display/CollapsibleCodeBlock.tsx +238 -0
  107. package/src/components/data-display/DataTable.tsx +119 -0
  108. package/src/components/data-display/DescriptionList.tsx +41 -0
  109. package/src/components/data-display/GitHubIcon.tsx +44 -0
  110. package/src/components/data-display/Heading.test.tsx +36 -0
  111. package/src/components/data-display/Heading.tsx +83 -0
  112. package/src/components/data-display/StatCard.tsx +195 -0
  113. package/src/components/data-display/Table.tsx +133 -0
  114. package/src/components/data-display/Text.test.tsx +48 -0
  115. package/src/components/data-display/Text.tsx +144 -0
  116. package/src/components/data-display/Timeline.tsx +194 -0
  117. package/src/components/data-display/TreeView.tsx +226 -0
  118. package/src/components/data-display/Typewriter.tsx +119 -0
  119. package/src/components/data-display/VariableWeightText.tsx +130 -0
  120. package/src/components/data-display/index.ts +19 -0
  121. package/src/components/feedback/Alert.test.tsx +44 -0
  122. package/src/components/feedback/Alert.tsx +65 -0
  123. package/src/components/feedback/EmptyState.tsx +113 -0
  124. package/src/components/feedback/Progress.test.tsx +60 -0
  125. package/src/components/feedback/Progress.tsx +30 -0
  126. package/src/components/feedback/ProgressBar.tsx +158 -0
  127. package/src/components/feedback/Skeleton.test.tsx +39 -0
  128. package/src/components/feedback/Skeleton.tsx +45 -0
  129. package/src/components/feedback/Sonner.tsx +28 -0
  130. package/src/components/feedback/Spinner.test.tsx +33 -0
  131. package/src/components/feedback/Spinner.tsx +99 -0
  132. package/src/components/feedback/Stepper.tsx +307 -0
  133. package/src/components/feedback/Toast/Toast.tsx +243 -0
  134. package/src/components/feedback/Toast/index.ts +2 -0
  135. package/src/components/feedback/index.ts +9 -0
  136. package/src/components/forms/Checkbox.test.tsx +40 -0
  137. package/src/components/forms/Checkbox.tsx +31 -0
  138. package/src/components/forms/ColorPicker.tsx +118 -0
  139. package/src/components/forms/Combobox.tsx +96 -0
  140. package/src/components/forms/DragDrop.tsx +440 -0
  141. package/src/components/forms/FileUpload.tsx +252 -0
  142. package/src/components/forms/FilterButton.tsx +65 -0
  143. package/src/components/forms/Form.tsx +197 -0
  144. package/src/components/forms/Input.test.tsx +46 -0
  145. package/src/components/forms/Input.tsx +43 -0
  146. package/src/components/forms/InputOTP.tsx +81 -0
  147. package/src/components/forms/Label.test.tsx +20 -0
  148. package/src/components/forms/Label.tsx +25 -0
  149. package/src/components/forms/RadioGroup.tsx +51 -0
  150. package/src/components/forms/SearchBar.tsx +215 -0
  151. package/src/components/forms/Select.test.tsx +118 -0
  152. package/src/components/forms/Select.tsx +274 -0
  153. package/src/components/forms/Slider.tsx +29 -0
  154. package/src/components/forms/Switch.test.tsx +76 -0
  155. package/src/components/forms/Switch.tsx +30 -0
  156. package/src/components/forms/TextField.tsx +152 -0
  157. package/src/components/forms/Textarea.test.tsx +41 -0
  158. package/src/components/forms/Textarea.tsx +29 -0
  159. package/src/components/forms/ThemeSwitcher.tsx +290 -0
  160. package/src/components/forms/ThemeToggle.tsx +151 -0
  161. package/src/components/forms/index.ts +19 -0
  162. package/src/components/layout/Accordion.test.tsx +66 -0
  163. package/src/components/layout/Accordion.tsx +64 -0
  164. package/src/components/layout/AspectRatio.tsx +7 -0
  165. package/src/components/layout/Carousel.tsx +277 -0
  166. package/src/components/layout/Collapsible.test.tsx +40 -0
  167. package/src/components/layout/Collapsible.tsx +31 -0
  168. package/src/components/layout/Container.test.tsx +45 -0
  169. package/src/components/layout/Container.tsx +99 -0
  170. package/src/components/layout/CustomizerPanel.tsx +400 -0
  171. package/src/components/layout/DatePicker.tsx +57 -0
  172. package/src/components/layout/Footer/Footer.tsx +175 -0
  173. package/src/components/layout/Footer/index.ts +2 -0
  174. package/src/components/layout/GlassSurface.tsx +82 -0
  175. package/src/components/layout/Grid.test.tsx +31 -0
  176. package/src/components/layout/Grid.tsx +130 -0
  177. package/src/components/layout/Header/Header.tsx +450 -0
  178. package/src/components/layout/Header/index.ts +2 -0
  179. package/src/components/layout/PageLayout.tsx +180 -0
  180. package/src/components/layout/PageTemplate.tsx +158 -0
  181. package/src/components/layout/Resizable.tsx +48 -0
  182. package/src/components/layout/ScrollArea.tsx +53 -0
  183. package/src/components/layout/Separator.test.tsx +28 -0
  184. package/src/components/layout/Separator.tsx +29 -0
  185. package/src/components/layout/Sidebar.tsx +171 -0
  186. package/src/components/layout/Stack.test.tsx +41 -0
  187. package/src/components/layout/Stack.tsx +89 -0
  188. package/src/components/layout/glass-surface.css +60 -0
  189. package/src/components/layout/index.ts +18 -0
  190. package/src/components/motion/AnimatedBeam.tsx +159 -0
  191. package/src/components/navigation/Breadcrumb.test.tsx +57 -0
  192. package/src/components/navigation/Breadcrumb.tsx +119 -0
  193. package/src/components/navigation/Breadcrumbs.tsx +221 -0
  194. package/src/components/navigation/Command.tsx +159 -0
  195. package/src/components/navigation/Menubar.tsx +115 -0
  196. package/src/components/navigation/NavLink.tsx +55 -0
  197. package/src/components/navigation/NavigationMenu.tsx +125 -0
  198. package/src/components/navigation/Pagination.tsx +121 -0
  199. package/src/components/navigation/SecondaryNav.tsx +100 -0
  200. package/src/components/navigation/Tabs.test.tsx +47 -0
  201. package/src/components/navigation/Tabs.tsx +60 -0
  202. package/src/components/navigation/TertiaryNav.tsx +90 -0
  203. package/src/components/navigation/index.ts +10 -0
  204. package/src/components/overlays/AlertDialog.test.tsx +69 -0
  205. package/src/components/overlays/AlertDialog.tsx +166 -0
  206. package/src/components/overlays/ContextMenu.tsx +243 -0
  207. package/src/components/overlays/Dialog.test.tsx +79 -0
  208. package/src/components/overlays/Dialog.tsx +158 -0
  209. package/src/components/overlays/Drawer.tsx +128 -0
  210. package/src/components/overlays/Dropdown.tsx +253 -0
  211. package/src/components/overlays/DropdownMenu.tsx +242 -0
  212. package/src/components/overlays/HoverCard.tsx +32 -0
  213. package/src/components/overlays/Modal.tsx +250 -0
  214. package/src/components/overlays/NotificationCenter.tsx +364 -0
  215. package/src/components/overlays/Popover.test.tsx +40 -0
  216. package/src/components/overlays/Popover.tsx +46 -0
  217. package/src/components/overlays/Sheet.tsx +163 -0
  218. package/src/components/overlays/Tooltip.test.tsx +33 -0
  219. package/src/components/overlays/Tooltip.tsx +32 -0
  220. package/src/components/overlays/index.ts +12 -0
  221. package/src/dates.ts +2 -0
  222. package/src/dnd.ts +1 -0
  223. package/src/forms.ts +1 -0
  224. package/src/globals.css +187 -0
  225. package/src/hooks/index.ts +6 -0
  226. package/src/hooks/useForm.ts +247 -0
  227. package/src/hooks/useMotionPreference.test.ts +102 -0
  228. package/src/hooks/useMotionPreference.ts +78 -0
  229. package/src/hooks/useTheme.ts +58 -0
  230. package/src/hooks.ts +9 -0
  231. package/src/index.ts +168 -0
  232. package/src/lib/animations.ts +356 -0
  233. package/src/lib/breadcrumbs.ts +94 -0
  234. package/src/lib/colors.ts +493 -0
  235. package/src/lib/store/customizer.ts +482 -0
  236. package/src/lib/store/index.ts +3 -0
  237. package/src/lib/store/theme.ts +55 -0
  238. package/src/lib/syntax-parser/index.ts +50 -0
  239. package/src/lib/syntax-parser/patterns.ts +64 -0
  240. package/src/lib/syntax-parser/tokenizer.ts +117 -0
  241. package/src/lib/syntax-parser/types.ts +27 -0
  242. package/src/lib/utils.ts +6 -0
  243. package/src/lib/validation.ts +204 -0
  244. package/src/lib/webgl/Color.ts +11 -0
  245. package/src/lib/webgl/Mesh.ts +41 -0
  246. package/src/lib/webgl/Program.ts +118 -0
  247. package/src/lib/webgl/Renderer.ts +51 -0
  248. package/src/lib/webgl/Triangle.ts +27 -0
  249. package/src/lib/webgl/Vec3.ts +18 -0
  250. package/src/lib/webgl/index.ts +13 -0
  251. package/src/nativewind-env.d.ts +1 -0
  252. package/src/providers/ThemeProvider.tsx +461 -0
  253. package/src/providers/index.ts +1 -0
  254. package/src/providers.ts +7 -0
  255. package/src/tables.ts +1 -0
  256. package/src/test/setup.ts +39 -0
  257. package/src/theme.css +158 -0
  258. package/src/tokens.ts +7 -0
  259. package/src/utils.ts +12 -0
  260. package/src/webgl.ts +1 -0
package/dist/webgl.js ADDED
@@ -0,0 +1,226 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/webgl.ts
22
+ var webgl_exports = {};
23
+ __export(webgl_exports, {
24
+ Color: () => Color,
25
+ Mesh: () => Mesh,
26
+ Program: () => Program,
27
+ Renderer: () => Renderer,
28
+ Triangle: () => Triangle,
29
+ Vec3: () => Vec3
30
+ });
31
+ module.exports = __toCommonJS(webgl_exports);
32
+
33
+ // src/lib/webgl/Renderer.ts
34
+ var Renderer = class {
35
+ constructor({ alpha = false, premultipliedAlpha = true, dpr = 1 } = {}) {
36
+ const canvas = document.createElement("canvas");
37
+ this.dpr = dpr;
38
+ const attrs = {
39
+ alpha,
40
+ premultipliedAlpha,
41
+ antialias: false,
42
+ preserveDrawingBuffer: false
43
+ };
44
+ const gl = canvas.getContext("webgl2", attrs) ?? canvas.getContext("webgl", attrs);
45
+ if (!gl) throw new Error("WebGL not supported");
46
+ this.gl = gl;
47
+ }
48
+ setSize(width, height) {
49
+ const canvas = this.gl.canvas;
50
+ canvas.width = width * this.dpr;
51
+ canvas.height = height * this.dpr;
52
+ canvas.style.width = width + "px";
53
+ canvas.style.height = height + "px";
54
+ this.gl.viewport(0, 0, canvas.width, canvas.height);
55
+ }
56
+ render({ scene }) {
57
+ scene.draw();
58
+ }
59
+ };
60
+
61
+ // src/lib/webgl/Program.ts
62
+ function compile(gl, type, source) {
63
+ const shader = gl.createShader(type);
64
+ gl.shaderSource(shader, source);
65
+ gl.compileShader(shader);
66
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
67
+ const info = gl.getShaderInfoLog(shader);
68
+ gl.deleteShader(shader);
69
+ throw new Error(`Shader compile error: ${info}`);
70
+ }
71
+ return shader;
72
+ }
73
+ var Program = class {
74
+ constructor(gl, { vertex, fragment, uniforms = {} }) {
75
+ this.gl = gl;
76
+ this.uniforms = uniforms;
77
+ const vs = compile(gl, gl.VERTEX_SHADER, vertex);
78
+ const fs = compile(gl, gl.FRAGMENT_SHADER, fragment);
79
+ this.program = gl.createProgram();
80
+ gl.attachShader(this.program, vs);
81
+ gl.attachShader(this.program, fs);
82
+ gl.linkProgram(this.program);
83
+ if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {
84
+ const info = gl.getProgramInfoLog(this.program);
85
+ throw new Error(`Program link error: ${info}`);
86
+ }
87
+ gl.deleteShader(vs);
88
+ gl.deleteShader(fs);
89
+ this.uniformLocations = /* @__PURE__ */ new Map();
90
+ for (const name in uniforms) {
91
+ const loc = gl.getUniformLocation(this.program, name);
92
+ if (loc !== null) {
93
+ this.uniformLocations.set(name, loc);
94
+ }
95
+ }
96
+ this.attributeLocations = /* @__PURE__ */ new Map();
97
+ const numAttribs = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);
98
+ for (let i = 0; i < numAttribs; i++) {
99
+ const attrib = gl.getActiveAttrib(this.program, i);
100
+ if (attrib) {
101
+ this.attributeLocations.set(attrib.name, gl.getAttribLocation(this.program, attrib.name));
102
+ }
103
+ }
104
+ }
105
+ use() {
106
+ this.gl.useProgram(this.program);
107
+ }
108
+ getAttribLocation(name) {
109
+ return this.attributeLocations.get(name) ?? -1;
110
+ }
111
+ uploadUniforms() {
112
+ const gl = this.gl;
113
+ for (const [name, loc] of this.uniformLocations) {
114
+ const value = this.uniforms[name]?.value;
115
+ if (value === void 0 || value === null) continue;
116
+ if (typeof value === "boolean") {
117
+ gl.uniform1i(loc, value ? 1 : 0);
118
+ } else if (typeof value === "number") {
119
+ gl.uniform1f(loc, value);
120
+ } else if (value instanceof Float32Array) {
121
+ switch (value.length) {
122
+ case 1:
123
+ gl.uniform1fv(loc, value);
124
+ break;
125
+ case 2:
126
+ gl.uniform2fv(loc, value);
127
+ break;
128
+ case 3:
129
+ gl.uniform3fv(loc, value);
130
+ break;
131
+ case 4:
132
+ gl.uniform4fv(loc, value);
133
+ break;
134
+ }
135
+ } else if (value && value.data instanceof Float32Array) {
136
+ const arr = value.data;
137
+ switch (arr.length) {
138
+ case 2:
139
+ gl.uniform2fv(loc, arr);
140
+ break;
141
+ case 3:
142
+ gl.uniform3fv(loc, arr);
143
+ break;
144
+ case 4:
145
+ gl.uniform4fv(loc, arr);
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ };
152
+
153
+ // src/lib/webgl/Mesh.ts
154
+ var Mesh = class {
155
+ constructor(gl, { geometry, program }) {
156
+ this.gl = gl;
157
+ this.geometry = geometry;
158
+ this.program = program;
159
+ }
160
+ draw() {
161
+ const { gl, geometry, program } = this;
162
+ program.use();
163
+ program.uploadUniforms();
164
+ const posLoc = program.getAttribLocation("position");
165
+ if (posLoc >= 0) {
166
+ gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);
167
+ gl.enableVertexAttribArray(posLoc);
168
+ gl.vertexAttribPointer(posLoc, geometry.positionSize, gl.FLOAT, false, 0, 0);
169
+ }
170
+ const uvLoc = program.getAttribLocation("uv");
171
+ if (uvLoc >= 0) {
172
+ gl.bindBuffer(gl.ARRAY_BUFFER, geometry.uvBuffer);
173
+ gl.enableVertexAttribArray(uvLoc);
174
+ gl.vertexAttribPointer(uvLoc, geometry.uvSize, gl.FLOAT, false, 0, 0);
175
+ }
176
+ gl.drawArrays(gl.TRIANGLES, 0, geometry.count);
177
+ }
178
+ };
179
+
180
+ // src/lib/webgl/Triangle.ts
181
+ var Triangle = class {
182
+ constructor(gl) {
183
+ this.positionSize = 2;
184
+ this.uvSize = 2;
185
+ this.count = 3;
186
+ this.gl = gl;
187
+ const positions = new Float32Array([-1, -1, 3, -1, -1, 3]);
188
+ this.positionBuffer = gl.createBuffer();
189
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
190
+ gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
191
+ const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);
192
+ this.uvBuffer = gl.createBuffer();
193
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer);
194
+ gl.bufferData(gl.ARRAY_BUFFER, uvs, gl.STATIC_DRAW);
195
+ }
196
+ };
197
+
198
+ // src/lib/webgl/Vec3.ts
199
+ var Vec3 = class {
200
+ constructor(x = 0, y = 0, z = 0) {
201
+ this.data = new Float32Array([x, y, z]);
202
+ }
203
+ set(x, y, z) {
204
+ this.data[0] = x;
205
+ this.data[1] = y;
206
+ this.data[2] = z;
207
+ return this;
208
+ }
209
+ };
210
+
211
+ // src/lib/webgl/Color.ts
212
+ var Color = class {
213
+ constructor(r = 0, g = 0, b = 0) {
214
+ this.data = new Float32Array([r, g, b]);
215
+ }
216
+ };
217
+ // Annotate the CommonJS export names for ESM import in node:
218
+ 0 && (module.exports = {
219
+ Color,
220
+ Mesh,
221
+ Program,
222
+ Renderer,
223
+ Triangle,
224
+ Vec3
225
+ });
226
+ //# sourceMappingURL=webgl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/webgl.ts","../src/lib/webgl/Renderer.ts","../src/lib/webgl/Program.ts","../src/lib/webgl/Mesh.ts","../src/lib/webgl/Triangle.ts","../src/lib/webgl/Vec3.ts","../src/lib/webgl/Color.ts"],"sourcesContent":["export { Renderer, Program, Mesh, Triangle, Vec3, Color } from './lib/webgl';\n","/**\n * Minimal WebGL Renderer that creates a canvas and context.\n * Replaces OGL's Renderer — provides context creation, resize, and render dispatch.\n */\nimport type { Mesh } from './Mesh';\n\ninterface RendererOptions {\n alpha?: boolean;\n premultipliedAlpha?: boolean;\n dpr?: number;\n}\n\n/** WebGLRenderingContext with canvas narrowed to HTMLCanvasElement. */\nexport type GL = WebGLRenderingContext & { readonly canvas: HTMLCanvasElement };\n\nexport class Renderer {\n gl: GL;\n private dpr: number;\n\n constructor({ alpha = false, premultipliedAlpha = true, dpr = 1 }: RendererOptions = {}) {\n const canvas = document.createElement('canvas');\n this.dpr = dpr;\n\n const attrs: WebGLContextAttributes = {\n alpha,\n premultipliedAlpha,\n antialias: false,\n preserveDrawingBuffer: false,\n };\n\n const gl =\n (canvas.getContext('webgl2', attrs) as GL | null) ??\n (canvas.getContext('webgl', attrs) as GL | null);\n\n if (!gl) throw new Error('WebGL not supported');\n this.gl = gl;\n }\n\n setSize(width: number, height: number): void {\n const canvas = this.gl.canvas;\n canvas.width = width * this.dpr;\n canvas.height = height * this.dpr;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n this.gl.viewport(0, 0, canvas.width, canvas.height);\n }\n\n render({ scene }: { scene: Mesh }): void {\n scene.draw();\n }\n}\n","/**\n * Minimal shader Program for compiling GLSL and managing uniforms.\n * Replaces OGL's Program — handles compilation, linking, and uniform uploads.\n *\n * Supported uniform value types:\n * number → gl.uniform1f\n * boolean → gl.uniform1i (0 or 1, for GLSL bool)\n * Float32Array → gl.uniform{2,3,4}fv (by length)\n * Vec3 / Color → gl.uniform3fv (they extend Float32Array)\n */\n\ninterface UniformDef {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n}\n\ninterface ProgramOptions {\n vertex: string;\n fragment: string;\n uniforms?: Record<string, UniformDef>;\n}\n\nfunction compile(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compile error: ${info}`);\n }\n return shader;\n}\n\nexport class Program {\n gl: WebGLRenderingContext;\n program: WebGLProgram;\n uniforms: Record<string, UniformDef>;\n private uniformLocations: Map<string, WebGLUniformLocation>;\n private attributeLocations: Map<string, number>;\n\n constructor(gl: WebGLRenderingContext, { vertex, fragment, uniforms = {} }: ProgramOptions) {\n this.gl = gl;\n this.uniforms = uniforms;\n\n const vs = compile(gl, gl.VERTEX_SHADER, vertex);\n const fs = compile(gl, gl.FRAGMENT_SHADER, fragment);\n\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(this.program);\n throw new Error(`Program link error: ${info}`);\n }\n\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n\n // Cache uniform locations (only for uniforms the shader actually uses)\n this.uniformLocations = new Map();\n for (const name in uniforms) {\n const loc = gl.getUniformLocation(this.program, name);\n if (loc !== null) {\n this.uniformLocations.set(name, loc);\n }\n }\n\n // Cache attribute locations\n this.attributeLocations = new Map();\n const numAttribs = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n for (let i = 0; i < numAttribs; i++) {\n const attrib = gl.getActiveAttrib(this.program, i);\n if (attrib) {\n this.attributeLocations.set(attrib.name, gl.getAttribLocation(this.program, attrib.name));\n }\n }\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n getAttribLocation(name: string): number {\n return this.attributeLocations.get(name) ?? -1;\n }\n\n uploadUniforms(): void {\n const gl = this.gl;\n for (const [name, loc] of this.uniformLocations) {\n const value = this.uniforms[name]?.value;\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'boolean') {\n gl.uniform1i(loc, value ? 1 : 0);\n } else if (typeof value === 'number') {\n gl.uniform1f(loc, value);\n } else if (value instanceof Float32Array) {\n switch (value.length) {\n case 1: gl.uniform1fv(loc, value); break;\n case 2: gl.uniform2fv(loc, value); break;\n case 3: gl.uniform3fv(loc, value); break;\n case 4: gl.uniform4fv(loc, value); break;\n }\n } else if (value && value.data instanceof Float32Array) {\n // Vec3, Color — classes that wrap a Float32Array in .data\n const arr = value.data as Float32Array;\n switch (arr.length) {\n case 2: gl.uniform2fv(loc, arr); break;\n case 3: gl.uniform3fv(loc, arr); break;\n case 4: gl.uniform4fv(loc, arr); break;\n }\n }\n }\n }\n}\n","/**\n * Minimal Mesh that binds geometry attributes and draws.\n * Replaces OGL's Mesh — combines a Triangle geometry with a Program.\n */\nimport type { Triangle } from './Triangle';\nimport type { Program } from './Program';\n\nexport class Mesh {\n gl: WebGLRenderingContext;\n geometry: Triangle;\n program: Program;\n\n constructor(gl: WebGLRenderingContext, { geometry, program }: { geometry: Triangle; program: Program }) {\n this.gl = gl;\n this.geometry = geometry;\n this.program = program;\n }\n\n draw(): void {\n const { gl, geometry, program } = this;\n\n program.use();\n program.uploadUniforms();\n\n const posLoc = program.getAttribLocation('position');\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, geometry.positionSize, gl.FLOAT, false, 0, 0);\n }\n\n const uvLoc = program.getAttribLocation('uv');\n if (uvLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.uvBuffer);\n gl.enableVertexAttribArray(uvLoc);\n gl.vertexAttribPointer(uvLoc, geometry.uvSize, gl.FLOAT, false, 0, 0);\n }\n\n gl.drawArrays(gl.TRIANGLES, 0, geometry.count);\n }\n}\n","/**\n * Full-screen triangle geometry for fragment-shader-only rendering.\n * Replaces OGL's Triangle — a single oversized triangle that clips to the viewport.\n */\nexport class Triangle {\n gl: WebGLRenderingContext;\n positionBuffer: WebGLBuffer;\n uvBuffer: WebGLBuffer;\n positionSize = 2;\n uvSize = 2;\n count = 3;\n\n constructor(gl: WebGLRenderingContext) {\n this.gl = gl;\n\n // Oversized triangle covering the full viewport when clipped\n const positions = new Float32Array([-1, -1, 3, -1, -1, 3]);\n this.positionBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);\n this.uvBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, uvs, gl.STATIC_DRAW);\n }\n}\n","/**\n * Minimal Vec3 implementation for WebGL shader uniforms.\n * Replaces OGL's Vec3 — only the constructor and .set() are needed.\n */\nexport class Vec3 {\n data: Float32Array;\n\n constructor(x = 0, y = 0, z = 0) {\n this.data = new Float32Array([x, y, z]);\n }\n\n set(x: number, y: number, z: number): this {\n this.data[0] = x;\n this.data[1] = y;\n this.data[2] = z;\n return this;\n }\n}\n","/**\n * Minimal Color implementation for WebGL shader uniforms.\n * Replaces OGL's Color — stores three floats (r, g, b).\n */\nexport class Color {\n data: Float32Array;\n\n constructor(r = 0, g = 0, b = 0) {\n this.data = new Float32Array([r, g, b]);\n }\n}\n"],"mappings":"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","names":[]}
package/dist/webgl.mjs ADDED
@@ -0,0 +1,195 @@
1
+ "use client";
2
+
3
+ // src/lib/webgl/Renderer.ts
4
+ var Renderer = class {
5
+ constructor({ alpha = false, premultipliedAlpha = true, dpr = 1 } = {}) {
6
+ const canvas = document.createElement("canvas");
7
+ this.dpr = dpr;
8
+ const attrs = {
9
+ alpha,
10
+ premultipliedAlpha,
11
+ antialias: false,
12
+ preserveDrawingBuffer: false
13
+ };
14
+ const gl = canvas.getContext("webgl2", attrs) ?? canvas.getContext("webgl", attrs);
15
+ if (!gl) throw new Error("WebGL not supported");
16
+ this.gl = gl;
17
+ }
18
+ setSize(width, height) {
19
+ const canvas = this.gl.canvas;
20
+ canvas.width = width * this.dpr;
21
+ canvas.height = height * this.dpr;
22
+ canvas.style.width = width + "px";
23
+ canvas.style.height = height + "px";
24
+ this.gl.viewport(0, 0, canvas.width, canvas.height);
25
+ }
26
+ render({ scene }) {
27
+ scene.draw();
28
+ }
29
+ };
30
+
31
+ // src/lib/webgl/Program.ts
32
+ function compile(gl, type, source) {
33
+ const shader = gl.createShader(type);
34
+ gl.shaderSource(shader, source);
35
+ gl.compileShader(shader);
36
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
37
+ const info = gl.getShaderInfoLog(shader);
38
+ gl.deleteShader(shader);
39
+ throw new Error(`Shader compile error: ${info}`);
40
+ }
41
+ return shader;
42
+ }
43
+ var Program = class {
44
+ constructor(gl, { vertex, fragment, uniforms = {} }) {
45
+ this.gl = gl;
46
+ this.uniforms = uniforms;
47
+ const vs = compile(gl, gl.VERTEX_SHADER, vertex);
48
+ const fs = compile(gl, gl.FRAGMENT_SHADER, fragment);
49
+ this.program = gl.createProgram();
50
+ gl.attachShader(this.program, vs);
51
+ gl.attachShader(this.program, fs);
52
+ gl.linkProgram(this.program);
53
+ if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {
54
+ const info = gl.getProgramInfoLog(this.program);
55
+ throw new Error(`Program link error: ${info}`);
56
+ }
57
+ gl.deleteShader(vs);
58
+ gl.deleteShader(fs);
59
+ this.uniformLocations = /* @__PURE__ */ new Map();
60
+ for (const name in uniforms) {
61
+ const loc = gl.getUniformLocation(this.program, name);
62
+ if (loc !== null) {
63
+ this.uniformLocations.set(name, loc);
64
+ }
65
+ }
66
+ this.attributeLocations = /* @__PURE__ */ new Map();
67
+ const numAttribs = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);
68
+ for (let i = 0; i < numAttribs; i++) {
69
+ const attrib = gl.getActiveAttrib(this.program, i);
70
+ if (attrib) {
71
+ this.attributeLocations.set(attrib.name, gl.getAttribLocation(this.program, attrib.name));
72
+ }
73
+ }
74
+ }
75
+ use() {
76
+ this.gl.useProgram(this.program);
77
+ }
78
+ getAttribLocation(name) {
79
+ return this.attributeLocations.get(name) ?? -1;
80
+ }
81
+ uploadUniforms() {
82
+ const gl = this.gl;
83
+ for (const [name, loc] of this.uniformLocations) {
84
+ const value = this.uniforms[name]?.value;
85
+ if (value === void 0 || value === null) continue;
86
+ if (typeof value === "boolean") {
87
+ gl.uniform1i(loc, value ? 1 : 0);
88
+ } else if (typeof value === "number") {
89
+ gl.uniform1f(loc, value);
90
+ } else if (value instanceof Float32Array) {
91
+ switch (value.length) {
92
+ case 1:
93
+ gl.uniform1fv(loc, value);
94
+ break;
95
+ case 2:
96
+ gl.uniform2fv(loc, value);
97
+ break;
98
+ case 3:
99
+ gl.uniform3fv(loc, value);
100
+ break;
101
+ case 4:
102
+ gl.uniform4fv(loc, value);
103
+ break;
104
+ }
105
+ } else if (value && value.data instanceof Float32Array) {
106
+ const arr = value.data;
107
+ switch (arr.length) {
108
+ case 2:
109
+ gl.uniform2fv(loc, arr);
110
+ break;
111
+ case 3:
112
+ gl.uniform3fv(loc, arr);
113
+ break;
114
+ case 4:
115
+ gl.uniform4fv(loc, arr);
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ };
122
+
123
+ // src/lib/webgl/Mesh.ts
124
+ var Mesh = class {
125
+ constructor(gl, { geometry, program }) {
126
+ this.gl = gl;
127
+ this.geometry = geometry;
128
+ this.program = program;
129
+ }
130
+ draw() {
131
+ const { gl, geometry, program } = this;
132
+ program.use();
133
+ program.uploadUniforms();
134
+ const posLoc = program.getAttribLocation("position");
135
+ if (posLoc >= 0) {
136
+ gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);
137
+ gl.enableVertexAttribArray(posLoc);
138
+ gl.vertexAttribPointer(posLoc, geometry.positionSize, gl.FLOAT, false, 0, 0);
139
+ }
140
+ const uvLoc = program.getAttribLocation("uv");
141
+ if (uvLoc >= 0) {
142
+ gl.bindBuffer(gl.ARRAY_BUFFER, geometry.uvBuffer);
143
+ gl.enableVertexAttribArray(uvLoc);
144
+ gl.vertexAttribPointer(uvLoc, geometry.uvSize, gl.FLOAT, false, 0, 0);
145
+ }
146
+ gl.drawArrays(gl.TRIANGLES, 0, geometry.count);
147
+ }
148
+ };
149
+
150
+ // src/lib/webgl/Triangle.ts
151
+ var Triangle = class {
152
+ constructor(gl) {
153
+ this.positionSize = 2;
154
+ this.uvSize = 2;
155
+ this.count = 3;
156
+ this.gl = gl;
157
+ const positions = new Float32Array([-1, -1, 3, -1, -1, 3]);
158
+ this.positionBuffer = gl.createBuffer();
159
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
160
+ gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
161
+ const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);
162
+ this.uvBuffer = gl.createBuffer();
163
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer);
164
+ gl.bufferData(gl.ARRAY_BUFFER, uvs, gl.STATIC_DRAW);
165
+ }
166
+ };
167
+
168
+ // src/lib/webgl/Vec3.ts
169
+ var Vec3 = class {
170
+ constructor(x = 0, y = 0, z = 0) {
171
+ this.data = new Float32Array([x, y, z]);
172
+ }
173
+ set(x, y, z) {
174
+ this.data[0] = x;
175
+ this.data[1] = y;
176
+ this.data[2] = z;
177
+ return this;
178
+ }
179
+ };
180
+
181
+ // src/lib/webgl/Color.ts
182
+ var Color = class {
183
+ constructor(r = 0, g = 0, b = 0) {
184
+ this.data = new Float32Array([r, g, b]);
185
+ }
186
+ };
187
+ export {
188
+ Color,
189
+ Mesh,
190
+ Program,
191
+ Renderer,
192
+ Triangle,
193
+ Vec3
194
+ };
195
+ //# sourceMappingURL=webgl.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/webgl/Renderer.ts","../src/lib/webgl/Program.ts","../src/lib/webgl/Mesh.ts","../src/lib/webgl/Triangle.ts","../src/lib/webgl/Vec3.ts","../src/lib/webgl/Color.ts"],"sourcesContent":["/**\n * Minimal WebGL Renderer that creates a canvas and context.\n * Replaces OGL's Renderer — provides context creation, resize, and render dispatch.\n */\nimport type { Mesh } from './Mesh';\n\ninterface RendererOptions {\n alpha?: boolean;\n premultipliedAlpha?: boolean;\n dpr?: number;\n}\n\n/** WebGLRenderingContext with canvas narrowed to HTMLCanvasElement. */\nexport type GL = WebGLRenderingContext & { readonly canvas: HTMLCanvasElement };\n\nexport class Renderer {\n gl: GL;\n private dpr: number;\n\n constructor({ alpha = false, premultipliedAlpha = true, dpr = 1 }: RendererOptions = {}) {\n const canvas = document.createElement('canvas');\n this.dpr = dpr;\n\n const attrs: WebGLContextAttributes = {\n alpha,\n premultipliedAlpha,\n antialias: false,\n preserveDrawingBuffer: false,\n };\n\n const gl =\n (canvas.getContext('webgl2', attrs) as GL | null) ??\n (canvas.getContext('webgl', attrs) as GL | null);\n\n if (!gl) throw new Error('WebGL not supported');\n this.gl = gl;\n }\n\n setSize(width: number, height: number): void {\n const canvas = this.gl.canvas;\n canvas.width = width * this.dpr;\n canvas.height = height * this.dpr;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n this.gl.viewport(0, 0, canvas.width, canvas.height);\n }\n\n render({ scene }: { scene: Mesh }): void {\n scene.draw();\n }\n}\n","/**\n * Minimal shader Program for compiling GLSL and managing uniforms.\n * Replaces OGL's Program — handles compilation, linking, and uniform uploads.\n *\n * Supported uniform value types:\n * number → gl.uniform1f\n * boolean → gl.uniform1i (0 or 1, for GLSL bool)\n * Float32Array → gl.uniform{2,3,4}fv (by length)\n * Vec3 / Color → gl.uniform3fv (they extend Float32Array)\n */\n\ninterface UniformDef {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n}\n\ninterface ProgramOptions {\n vertex: string;\n fragment: string;\n uniforms?: Record<string, UniformDef>;\n}\n\nfunction compile(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compile error: ${info}`);\n }\n return shader;\n}\n\nexport class Program {\n gl: WebGLRenderingContext;\n program: WebGLProgram;\n uniforms: Record<string, UniformDef>;\n private uniformLocations: Map<string, WebGLUniformLocation>;\n private attributeLocations: Map<string, number>;\n\n constructor(gl: WebGLRenderingContext, { vertex, fragment, uniforms = {} }: ProgramOptions) {\n this.gl = gl;\n this.uniforms = uniforms;\n\n const vs = compile(gl, gl.VERTEX_SHADER, vertex);\n const fs = compile(gl, gl.FRAGMENT_SHADER, fragment);\n\n this.program = gl.createProgram()!;\n gl.attachShader(this.program, vs);\n gl.attachShader(this.program, fs);\n gl.linkProgram(this.program);\n\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(this.program);\n throw new Error(`Program link error: ${info}`);\n }\n\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n\n // Cache uniform locations (only for uniforms the shader actually uses)\n this.uniformLocations = new Map();\n for (const name in uniforms) {\n const loc = gl.getUniformLocation(this.program, name);\n if (loc !== null) {\n this.uniformLocations.set(name, loc);\n }\n }\n\n // Cache attribute locations\n this.attributeLocations = new Map();\n const numAttribs = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n for (let i = 0; i < numAttribs; i++) {\n const attrib = gl.getActiveAttrib(this.program, i);\n if (attrib) {\n this.attributeLocations.set(attrib.name, gl.getAttribLocation(this.program, attrib.name));\n }\n }\n }\n\n use(): void {\n this.gl.useProgram(this.program);\n }\n\n getAttribLocation(name: string): number {\n return this.attributeLocations.get(name) ?? -1;\n }\n\n uploadUniforms(): void {\n const gl = this.gl;\n for (const [name, loc] of this.uniformLocations) {\n const value = this.uniforms[name]?.value;\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'boolean') {\n gl.uniform1i(loc, value ? 1 : 0);\n } else if (typeof value === 'number') {\n gl.uniform1f(loc, value);\n } else if (value instanceof Float32Array) {\n switch (value.length) {\n case 1: gl.uniform1fv(loc, value); break;\n case 2: gl.uniform2fv(loc, value); break;\n case 3: gl.uniform3fv(loc, value); break;\n case 4: gl.uniform4fv(loc, value); break;\n }\n } else if (value && value.data instanceof Float32Array) {\n // Vec3, Color — classes that wrap a Float32Array in .data\n const arr = value.data as Float32Array;\n switch (arr.length) {\n case 2: gl.uniform2fv(loc, arr); break;\n case 3: gl.uniform3fv(loc, arr); break;\n case 4: gl.uniform4fv(loc, arr); break;\n }\n }\n }\n }\n}\n","/**\n * Minimal Mesh that binds geometry attributes and draws.\n * Replaces OGL's Mesh — combines a Triangle geometry with a Program.\n */\nimport type { Triangle } from './Triangle';\nimport type { Program } from './Program';\n\nexport class Mesh {\n gl: WebGLRenderingContext;\n geometry: Triangle;\n program: Program;\n\n constructor(gl: WebGLRenderingContext, { geometry, program }: { geometry: Triangle; program: Program }) {\n this.gl = gl;\n this.geometry = geometry;\n this.program = program;\n }\n\n draw(): void {\n const { gl, geometry, program } = this;\n\n program.use();\n program.uploadUniforms();\n\n const posLoc = program.getAttribLocation('position');\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, geometry.positionSize, gl.FLOAT, false, 0, 0);\n }\n\n const uvLoc = program.getAttribLocation('uv');\n if (uvLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, geometry.uvBuffer);\n gl.enableVertexAttribArray(uvLoc);\n gl.vertexAttribPointer(uvLoc, geometry.uvSize, gl.FLOAT, false, 0, 0);\n }\n\n gl.drawArrays(gl.TRIANGLES, 0, geometry.count);\n }\n}\n","/**\n * Full-screen triangle geometry for fragment-shader-only rendering.\n * Replaces OGL's Triangle — a single oversized triangle that clips to the viewport.\n */\nexport class Triangle {\n gl: WebGLRenderingContext;\n positionBuffer: WebGLBuffer;\n uvBuffer: WebGLBuffer;\n positionSize = 2;\n uvSize = 2;\n count = 3;\n\n constructor(gl: WebGLRenderingContext) {\n this.gl = gl;\n\n // Oversized triangle covering the full viewport when clipped\n const positions = new Float32Array([-1, -1, 3, -1, -1, 3]);\n this.positionBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);\n this.uvBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, uvs, gl.STATIC_DRAW);\n }\n}\n","/**\n * Minimal Vec3 implementation for WebGL shader uniforms.\n * Replaces OGL's Vec3 — only the constructor and .set() are needed.\n */\nexport class Vec3 {\n data: Float32Array;\n\n constructor(x = 0, y = 0, z = 0) {\n this.data = new Float32Array([x, y, z]);\n }\n\n set(x: number, y: number, z: number): this {\n this.data[0] = x;\n this.data[1] = y;\n this.data[2] = z;\n return this;\n }\n}\n","/**\n * Minimal Color implementation for WebGL shader uniforms.\n * Replaces OGL's Color — stores three floats (r, g, b).\n */\nexport class Color {\n data: Float32Array;\n\n constructor(r = 0, g = 0, b = 0) {\n this.data = new Float32Array([r, g, b]);\n }\n}\n"],"mappings":"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","names":[]}