forgecad 0.6.3 → 0.7.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.
Files changed (193) hide show
  1. package/README.md +2 -11
  2. package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-DAu1C1ST.js} +250 -151
  3. package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
  4. package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-Gc_BCdqC.js} +269 -143
  5. package/dist/assets/EditorApp-D9bJvtf7.js +11338 -0
  6. package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-DG1-oUSV.css} +459 -87
  7. package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-CEO8XbV8.js} +2 -4
  8. package/dist/assets/LandingPage-CdCuEOdC.js +451 -0
  9. package/dist/assets/PricingPage-BSrxu6d7.js +232 -0
  10. package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-FUCSIRq6.js} +129 -5
  11. package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-KoR0SNKq.js} +6770 -2914
  12. package/dist/assets/{index-2hfs_ub0.css → index-CyVd1D4D.css} +227 -53
  13. package/dist/assets/{Viewport-CoB46f5R.js → index-wTEK39at.js} +31385 -6439
  14. package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
  15. package/dist/assets/{manifold-CqNMHHKO.js → manifold-B1sGWdYk.js} +4 -3
  16. package/dist/assets/{manifold-Cce9wRFz.js → manifold-D7o0N50J.js} +1 -1
  17. package/dist/assets/{manifold-D6BeHIOo.js → manifold-G5sBaXzi.js} +1 -1
  18. package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-DYcRHhv9.js} +6798 -3341
  19. package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
  20. package/dist/docs-raw/generated/assembly.md +691 -112
  21. package/dist/docs-raw/generated/concepts.md +1225 -1400
  22. package/dist/docs-raw/generated/core.md +464 -1412
  23. package/dist/docs-raw/generated/curves.md +593 -117
  24. package/dist/docs-raw/generated/lib.md +38 -748
  25. package/dist/docs-raw/generated/output.md +139 -245
  26. package/dist/docs-raw/generated/sheet-metal.md +473 -21
  27. package/dist/docs-raw/generated/sketch.md +553 -349
  28. package/dist/docs-raw/generated/viewport.md +345 -303
  29. package/dist/docs-raw/generated/wood.md +104 -0
  30. package/dist/index.html +2 -2
  31. package/dist/sitemap.xml +6 -6
  32. package/dist-cli/chunk-PZ5AY32C.js +10 -0
  33. package/dist-cli/chunk-PZ5AY32C.js.map +1 -0
  34. package/dist-cli/forgecad.js +9435 -5407
  35. package/dist-cli/forgecad.js.map +1 -0
  36. package/dist-cli/solver-FV7TJZGI.js +365 -0
  37. package/dist-cli/solver-FV7TJZGI.js.map +1 -0
  38. package/dist-skill/CONTEXT.md +3186 -7145
  39. package/dist-skill/SKILL-dev.md +21 -63
  40. package/dist-skill/SKILL.md +12 -56
  41. package/dist-skill/docs/API/core/concepts.md +16 -98
  42. package/dist-skill/docs/CLI/export.md +91 -0
  43. package/dist-skill/docs/CLI/projects.md +107 -0
  44. package/dist-skill/docs/CLI/studio_publishing.md +52 -0
  45. package/dist-skill/docs/CLI/validation.md +66 -0
  46. package/dist-skill/docs/generated/assembly.md +691 -112
  47. package/dist-skill/docs/generated/core.md +464 -1412
  48. package/dist-skill/docs/generated/curves.md +593 -117
  49. package/dist-skill/docs/generated/lib.md +38 -748
  50. package/dist-skill/docs/generated/output.md +139 -245
  51. package/dist-skill/docs/generated/sheet-metal.md +473 -21
  52. package/dist-skill/docs/generated/sketch.md +553 -349
  53. package/dist-skill/docs/generated/viewport.md +345 -303
  54. package/dist-skill/docs/generated/wood.md +104 -0
  55. package/dist-skill/docs/guides/coordinate-system.md +11 -17
  56. package/dist-skill/docs/guides/geometry-conventions.md +13 -70
  57. package/dist-skill/docs/guides/modeling-recipes.md +22 -195
  58. package/dist-skill/docs/guides/positioning.md +88 -147
  59. package/dist-skill/docs-dev/API/core/concepts.md +51 -0
  60. package/dist-skill/docs-dev/API/core/sdf-advanced.md +92 -0
  61. package/dist-skill/docs-dev/API/core/sdf-primitives.md +58 -0
  62. package/dist-skill/docs-dev/API/core/sdf-workflow.md +42 -0
  63. package/dist-skill/docs-dev/CLI/export.md +91 -0
  64. package/dist-skill/docs-dev/CLI/projects.md +107 -0
  65. package/dist-skill/docs-dev/CLI/studio_publishing.md +52 -0
  66. package/dist-skill/docs-dev/CLI/validation.md +66 -0
  67. package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
  68. package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
  69. package/dist-skill/{docs → docs-dev}/coding.md +1 -3
  70. package/dist-skill/docs-dev/generated/assembly.md +771 -0
  71. package/dist-skill/docs-dev/generated/core.md +775 -0
  72. package/dist-skill/docs-dev/generated/curves.md +688 -0
  73. package/dist-skill/docs-dev/generated/lib.md +50 -0
  74. package/dist-skill/docs-dev/generated/output.md +234 -0
  75. package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
  76. package/dist-skill/docs-dev/generated/sketch.md +801 -0
  77. package/dist-skill/docs-dev/generated/viewport.md +486 -0
  78. package/dist-skill/docs-dev/generated/wood.md +104 -0
  79. package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
  80. package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
  81. package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
  82. package/dist-skill/docs-dev/guides/positioning.md +151 -0
  83. package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
  84. package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
  85. package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
  86. package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
  87. package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
  88. package/examples/api/attachTo-basics.forge.js +5 -5
  89. package/examples/api/boolean-operations.forge.js +3 -3
  90. package/examples/api/bounding-box-visualizer.forge.js +2 -2
  91. package/examples/api/clone-duplicate.forge.js +1 -1
  92. package/examples/api/colors-union-vs-array.forge.js +6 -6
  93. package/examples/api/connector-assembly.forge.js +4 -4
  94. package/examples/api/connector-basics.forge.js +2 -2
  95. package/examples/api/extrude-options.forge.js +4 -10
  96. package/examples/api/feature-created-faces.forge.js +6 -10
  97. package/examples/api/fillet-showcase.forge.js +1 -1
  98. package/examples/api/folded-service-panel-cover.forge.js +2 -2
  99. package/examples/api/group-test.forge.js +1 -1
  100. package/examples/api/group-vs-union.forge.js +1 -1
  101. package/examples/api/highlight-debug.forge.js +4 -0
  102. package/examples/api/js-module-pillars.js +1 -1
  103. package/examples/api/js-module-scene.js +2 -2
  104. package/examples/api/mesh-import-slats.forge.js +1 -1
  105. package/examples/api/pointAlong-orientation.forge.js +1 -1
  106. package/examples/api/profile-2020-b-slot6.forge.js +0 -1
  107. package/examples/api/route-perimeter-flange.forge.js +1 -1
  108. package/examples/api/sdf-rover-demo.forge.js +10 -10
  109. package/examples/api/sketch-on-face-demo.forge.js +2 -2
  110. package/examples/api/sketch-regions.forge.js +4 -4
  111. package/examples/api/transition-curves.forge.js +1 -1
  112. package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
  113. package/examples/api/variable-sweep-test.forge.js +2 -2
  114. package/examples/api/wood-joinery.forge.js +60 -0
  115. package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
  116. package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
  117. package/examples/experiments/drone-arm.forge.js +53 -0
  118. package/examples/furniture/adjustable-table.forge.js +2 -2
  119. package/examples/furniture/bathroom.forge.js +11 -11
  120. package/examples/furniture/chair.forge.js +1 -1
  121. package/examples/generative/crystal-growth.forge.js +2 -2
  122. package/examples/generative/frost-spires.forge.js +3 -3
  123. package/examples/generative/golden-spiral-tower.forge.js +3 -3
  124. package/examples/mechanical/3d-printer.forge.js +28 -28
  125. package/examples/mechanical/5-finger-robot-hand.forge.js +15 -15
  126. package/examples/mechanical/airplane-propeller.forge.js +2 -2
  127. package/examples/mechanical/fillet-enclosure.forge.js +1 -1
  128. package/examples/mechanical/headphone-hanger-v2.forge.js +2 -2
  129. package/examples/mechanical/robot_hand.forge.js +15 -15
  130. package/examples/mechanical/robot_hand_2.forge.js +9 -9
  131. package/examples/products/bottle.forge.js +1 -1
  132. package/examples/products/chess-set.forge.js +19 -19
  133. package/examples/products/classical-piano.forge.js +11 -11
  134. package/examples/products/clock.forge.js +12 -12
  135. package/examples/products/iphone.forge.js +8 -8
  136. package/examples/products/laptop.forge.js +15 -15
  137. package/examples/products/liquid-soap-dispenser.forge.js +18 -18
  138. package/examples/products/origami-fish.forge.js +8 -6
  139. package/examples/products/spiderman-cake.forge.js +4 -4
  140. package/examples/toolbox/bolted-joint.forge.js +2 -2
  141. package/package.json +7 -4
  142. package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
  143. package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
  144. package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
  145. package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
  146. package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
  147. package/dist/assets/index-1CYp3zUp.js +0 -1455
  148. package/dist/docs-raw/CLI.md +0 -865
  149. package/dist-skill/docs/API/API.md +0 -1666
  150. package/dist-skill/docs/API/README.md +0 -37
  151. package/dist-skill/docs/API/assembly/assembly.md +0 -617
  152. package/dist-skill/docs/API/core/edge-queries.md +0 -130
  153. package/dist-skill/docs/API/core/parameters.md +0 -122
  154. package/dist-skill/docs/API/core/reserved-terms.md +0 -137
  155. package/dist-skill/docs/API/core/sdf.md +0 -326
  156. package/dist-skill/docs/API/core/skill-cli.md +0 -194
  157. package/dist-skill/docs/API/core/skill-guide.md +0 -205
  158. package/dist-skill/docs/API/core/specs.md +0 -186
  159. package/dist-skill/docs/API/core/topology.md +0 -372
  160. package/dist-skill/docs/API/entities.md +0 -268
  161. package/dist-skill/docs/API/output/bom.md +0 -58
  162. package/dist-skill/docs/API/output/brep-export.md +0 -87
  163. package/dist-skill/docs/API/output/dimensions.md +0 -67
  164. package/dist-skill/docs/API/output/export.md +0 -110
  165. package/dist-skill/docs/API/output/gcode.md +0 -195
  166. package/dist-skill/docs/API/runtime/viewport.md +0 -420
  167. package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
  168. package/dist-skill/docs/API/sketch/anchor.md +0 -37
  169. package/dist-skill/docs/API/sketch/booleans.md +0 -91
  170. package/dist-skill/docs/API/sketch/core.md +0 -73
  171. package/dist-skill/docs/API/sketch/extrude.md +0 -62
  172. package/dist-skill/docs/API/sketch/on-face.md +0 -104
  173. package/dist-skill/docs/API/sketch/operations.md +0 -78
  174. package/dist-skill/docs/API/sketch/path.md +0 -75
  175. package/dist-skill/docs/API/sketch/primitives.md +0 -146
  176. package/dist-skill/docs/API/sketch/regions.md +0 -80
  177. package/dist-skill/docs/API/sketch/text.md +0 -108
  178. package/dist-skill/docs/API/sketch/transforms.md +0 -65
  179. package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
  180. package/dist-skill/docs/CLI.md +0 -865
  181. package/dist-skill/docs/INDEX.md +0 -94
  182. package/dist-skill/docs/RELEASING.md +0 -55
  183. package/dist-skill/docs/cli-monetization.md +0 -111
  184. package/dist-skill/docs/deployment.md +0 -281
  185. package/dist-skill/docs/generated/concepts.md +0 -2112
  186. package/dist-skill/docs/internals/shape-from-slices.md +0 -152
  187. package/dist-skill/docs/platform/admin.md +0 -45
  188. package/dist-skill/docs/platform/architecture.md +0 -79
  189. package/dist-skill/docs/platform/auth.md +0 -110
  190. package/dist-skill/docs/platform/email.md +0 -67
  191. package/dist-skill/docs/platform/projects.md +0 -111
  192. package/dist-skill/docs/platform/sharing.md +0 -90
  193. package/dist-skill/docs/runbook.md +0 -345
@@ -1,1455 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EditorApp-CnC2k4cW.css"])))=>i.map(i=>d[i]);
2
- var __defProp = Object.defineProperty;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- import { c as create, r as reactExports, R as React, j as jsxRuntimeExports, B as BrowserRouter, a as Routes, b as Route, N as Navigate, d as clientExports } from "./vendor-react-Dt7-aaJH.js";
6
- const scriptRel = /* @__PURE__ */ (function detectScriptRel() {
7
- const relList = typeof document !== "undefined" && document.createElement("link").relList;
8
- return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload";
9
- })();
10
- const assetsURL = function(dep) {
11
- return "/" + dep;
12
- };
13
- const seen = {};
14
- const __vitePreload = function preload(baseModule, deps, importerUrl) {
15
- let promise = Promise.resolve();
16
- if (deps && deps.length > 0) {
17
- let allSettled2 = function(promises) {
18
- return Promise.all(
19
- promises.map(
20
- (p) => Promise.resolve(p).then(
21
- (value) => ({ status: "fulfilled", value }),
22
- (reason) => ({ status: "rejected", reason })
23
- )
24
- )
25
- );
26
- };
27
- document.getElementsByTagName("link");
28
- const cspNonceMeta = document.querySelector(
29
- "meta[property=csp-nonce]"
30
- );
31
- const cspNonce = (cspNonceMeta == null ? void 0 : cspNonceMeta.nonce) || (cspNonceMeta == null ? void 0 : cspNonceMeta.getAttribute("nonce"));
32
- promise = allSettled2(
33
- deps.map((dep) => {
34
- dep = assetsURL(dep);
35
- if (dep in seen) return;
36
- seen[dep] = true;
37
- const isCss = dep.endsWith(".css");
38
- const cssSelector = isCss ? '[rel="stylesheet"]' : "";
39
- if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) {
40
- return;
41
- }
42
- const link = document.createElement("link");
43
- link.rel = isCss ? "stylesheet" : scriptRel;
44
- if (!isCss) {
45
- link.as = "script";
46
- }
47
- link.crossOrigin = "";
48
- link.href = dep;
49
- if (cspNonce) {
50
- link.setAttribute("nonce", cspNonce);
51
- }
52
- document.head.appendChild(link);
53
- if (isCss) {
54
- return new Promise((res, rej) => {
55
- link.addEventListener("load", res);
56
- link.addEventListener(
57
- "error",
58
- () => rej(new Error(`Unable to preload CSS for ${dep}`))
59
- );
60
- });
61
- }
62
- })
63
- );
64
- }
65
- function handlePreloadError(err) {
66
- const e = new Event("vite:preloadError", {
67
- cancelable: true
68
- });
69
- e.payload = err;
70
- window.dispatchEvent(e);
71
- if (!e.defaultPrevented) {
72
- throw err;
73
- }
74
- }
75
- return promise.then((res) => {
76
- for (const item of res || []) {
77
- if (item.status !== "rejected") continue;
78
- handlePreloadError(item.reason);
79
- }
80
- return baseModule().catch(handlePreloadError);
81
- });
82
- };
83
- function getCsrfToken() {
84
- const match = document.cookie.match(/(?:^|;\s*)fc-csrf-token=([^;]+)/);
85
- return match == null ? void 0 : match[1];
86
- }
87
- class AuthApiError extends Error {
88
- constructor(message, status, body) {
89
- super(message);
90
- this.status = status;
91
- this.body = body;
92
- this.name = "AuthApiError";
93
- }
94
- }
95
- let refreshPromise = null;
96
- async function doFetch(url, init) {
97
- var _a;
98
- const headers = {};
99
- if ((init == null ? void 0 : init.body) !== void 0) headers["Content-Type"] = "application/json";
100
- const method = (_a = init == null ? void 0 : init.method) == null ? void 0 : _a.toUpperCase();
101
- if (method && method !== "GET" && method !== "HEAD") {
102
- const csrf = getCsrfToken();
103
- if (csrf) headers["X-CSRF-Token"] = csrf;
104
- }
105
- const res = await fetch(url, {
106
- ...init,
107
- credentials: "include",
108
- headers: { ...headers, ...init == null ? void 0 : init.headers }
109
- });
110
- const body = await res.json();
111
- return { res, body };
112
- }
113
- async function authFetch(url, init) {
114
- const { res, body } = await doFetch(url, init);
115
- if (res.ok) return body;
116
- const isAuthEndpoint = url.includes("/api/auth/refresh") || url.includes("/api/auth/login") || url.includes("/api/auth/register");
117
- if (res.status === 401 && !isAuthEndpoint) {
118
- if (!refreshPromise) {
119
- refreshPromise = doFetch("/api/auth/refresh", { method: "POST" }).then(({ res: rRes, body: rBody }) => {
120
- refreshPromise = null;
121
- if (!rRes.ok) throw new AuthApiError(rBody.error || "Refresh failed", rRes.status);
122
- return rBody;
123
- }).catch((err) => {
124
- refreshPromise = null;
125
- throw err;
126
- });
127
- }
128
- try {
129
- await refreshPromise;
130
- const retry = await doFetch(url, init);
131
- if (retry.res.ok) return retry.body;
132
- throw new AuthApiError(retry.body.error || "Request failed after refresh", retry.res.status, retry.body);
133
- } catch {
134
- }
135
- }
136
- throw new AuthApiError(body.error || "Request failed", res.status, body);
137
- }
138
- const authApi = {
139
- login(email, password) {
140
- return authFetch("/api/auth/login", {
141
- method: "POST",
142
- body: JSON.stringify({ email, password })
143
- });
144
- },
145
- register(email, password, name) {
146
- return authFetch("/api/auth/register", {
147
- method: "POST",
148
- body: JSON.stringify({ email, password, name })
149
- });
150
- },
151
- session() {
152
- return authFetch("/api/auth/session");
153
- },
154
- refresh() {
155
- return authFetch("/api/auth/refresh", { method: "POST" });
156
- },
157
- logout() {
158
- return authFetch("/api/auth/logout", { method: "POST" });
159
- },
160
- providers() {
161
- return authFetch("/api/auth/providers");
162
- },
163
- forgotPassword(email) {
164
- return authFetch("/api/auth/forgot-password", {
165
- method: "POST",
166
- body: JSON.stringify({ email })
167
- });
168
- },
169
- resetPassword(token, password) {
170
- return authFetch("/api/auth/reset-password", {
171
- method: "POST",
172
- body: JSON.stringify({ token, password })
173
- });
174
- },
175
- oauthCallback(provider, code) {
176
- return authFetch(`/api/auth/callback/${provider}`, {
177
- method: "POST",
178
- body: JSON.stringify({ code })
179
- });
180
- },
181
- verifyEmail(token) {
182
- return authFetch(`/api/auth/verify-email?token=${encodeURIComponent(token)}`);
183
- },
184
- resendVerification() {
185
- return authFetch("/api/auth/resend-verification", { method: "POST" });
186
- }
187
- };
188
- let _userId;
189
- const setCurrentUserId = (id) => {
190
- _userId = id;
191
- };
192
- const userScopedKey = (base) => `${base}-${_userId ?? "anon"}`;
193
- let _deserializeRunResult = null;
194
- async function getDeserialize() {
195
- if (!_deserializeRunResult) {
196
- const mod = await __vitePreload(() => import("./deserializeRunResult-BLAFoiE0.js").then((n) => n.bu), true ? [] : void 0);
197
- _deserializeRunResult = mod.deserializeRunResult;
198
- }
199
- return _deserializeRunResult;
200
- }
201
- const RUN_RESULT_CACHE_MAX = 8;
202
- const SESSION_STORAGE_KEY_BASE = "forgecad-run-cache";
203
- const CACHE_VERSION = 1;
204
- const sessionStorageKey = () => userScopedKey(SESSION_STORAGE_KEY_BASE);
205
- const MAX_PERSIST_BYTES = 4 * 1024 * 1024;
206
- const runResultCache = /* @__PURE__ */ new Map();
207
- function typedArrayToArray(ta) {
208
- return Array.from(ta);
209
- }
210
- function shapeDataToJson(sd) {
211
- return {
212
- ...sd,
213
- meshTriVerts: typedArrayToArray(sd.meshTriVerts),
214
- meshVertProperties: typedArrayToArray(sd.meshVertProperties),
215
- meshMergeFromVert: typedArrayToArray(sd.meshMergeFromVert),
216
- meshMergeToVert: typedArrayToArray(sd.meshMergeToVert),
217
- geometryPositions: typedArrayToArray(sd.geometryPositions),
218
- geometryNormals: typedArrayToArray(sd.geometryNormals),
219
- geometryEdgePositions: typedArrayToArray(sd.geometryEdgePositions)
220
- };
221
- }
222
- function jsonToShapeData(raw) {
223
- return {
224
- ...raw,
225
- meshTriVerts: new Uint32Array(raw.meshTriVerts),
226
- meshVertProperties: new Float32Array(raw.meshVertProperties),
227
- meshMergeFromVert: new Uint32Array(raw.meshMergeFromVert),
228
- meshMergeToVert: new Uint32Array(raw.meshMergeToVert),
229
- geometryPositions: new Float32Array(raw.geometryPositions),
230
- geometryNormals: new Float32Array(raw.geometryNormals),
231
- geometryEdgePositions: new Float32Array(raw.geometryEdgePositions)
232
- };
233
- }
234
- function serializedResultToJson(sr) {
235
- return {
236
- ...sr,
237
- objects: sr.objects.map((obj) => ({
238
- ...obj,
239
- shapeData: obj.shapeData ? shapeDataToJson(obj.shapeData) : null
240
- }))
241
- };
242
- }
243
- function jsonToSerializedResult(raw) {
244
- return {
245
- ...raw,
246
- objects: raw.objects.map((obj) => ({
247
- ...obj,
248
- shapeData: obj.shapeData ? jsonToShapeData(obj.shapeData) : null
249
- }))
250
- };
251
- }
252
- function persistCache() {
253
- try {
254
- const entries = {};
255
- for (const [key, entry] of runResultCache) {
256
- entries[key] = {
257
- code: entry.code,
258
- files: entry.files,
259
- paramOverrides: entry.paramOverrides,
260
- quality: entry.quality,
261
- backend: entry.backend,
262
- serialized: serializedResultToJson(entry.serialized)
263
- };
264
- }
265
- const json = JSON.stringify({ v: CACHE_VERSION, entries });
266
- if (json.length > MAX_PERSIST_BYTES) {
267
- try {
268
- sessionStorage.removeItem(sessionStorageKey());
269
- } catch {
270
- }
271
- return;
272
- }
273
- sessionStorage.setItem(sessionStorageKey(), json);
274
- } catch {
275
- }
276
- }
277
- async function rehydrateCacheFromKey(key) {
278
- try {
279
- const raw = sessionStorage.getItem(key);
280
- if (!raw) return;
281
- const parsed = JSON.parse(raw);
282
- if (!parsed || parsed.v !== CACHE_VERSION || !parsed.entries) return;
283
- const deserialize = await getDeserialize();
284
- for (const [filePath, pe] of Object.entries(parsed.entries)) {
285
- const serialized = jsonToSerializedResult(pe.serialized);
286
- const result = deserialize(serialized);
287
- runResultCache.set(filePath, {
288
- code: pe.code,
289
- files: pe.files,
290
- paramOverrides: pe.paramOverrides,
291
- quality: pe.quality,
292
- backend: pe.backend,
293
- result,
294
- serialized
295
- });
296
- }
297
- } catch {
298
- try {
299
- sessionStorage.removeItem(key);
300
- } catch {
301
- }
302
- }
303
- }
304
- async function rehydrateCacheForUser(userId) {
305
- runResultCache.clear();
306
- await rehydrateCacheFromKey(`${SESSION_STORAGE_KEY_BASE}-${userId}`);
307
- }
308
- function clearUserCache() {
309
- runResultCache.clear();
310
- try {
311
- sessionStorage.removeItem(sessionStorageKey());
312
- } catch {
313
- }
314
- }
315
- function lookupCache(filePath, code, files, paramOverrides, quality, backend) {
316
- const key = `${filePath}::${backend}`;
317
- const entry = runResultCache.get(key);
318
- if (!entry) return null;
319
- if (entry.code !== code || entry.quality !== quality || JSON.stringify(entry.paramOverrides) !== JSON.stringify(paramOverrides) || JSON.stringify(entry.files) !== JSON.stringify(files))
320
- return null;
321
- return entry.result;
322
- }
323
- function storeCache(filePath, code, files, paramOverrides, quality, backend, result, serialized) {
324
- const key = `${filePath}::${backend}`;
325
- runResultCache.delete(key);
326
- runResultCache.set(key, { code, files, paramOverrides, quality, backend, result, serialized });
327
- if (runResultCache.size > RUN_RESULT_CACHE_MAX) {
328
- runResultCache.delete(runResultCache.keys().next().value);
329
- }
330
- persistCache();
331
- }
332
- const ACTIVE_PROJECT_KEY = "fc-active-project-id";
333
- function loadSavedProjectId() {
334
- try {
335
- return localStorage.getItem(ACTIVE_PROJECT_KEY);
336
- } catch {
337
- return null;
338
- }
339
- }
340
- function persistProjectId(id) {
341
- try {
342
- if (id) localStorage.setItem(ACTIVE_PROJECT_KEY, id);
343
- else localStorage.removeItem(ACTIVE_PROJECT_KEY);
344
- } catch {
345
- }
346
- }
347
- const switchListeners = [];
348
- function slugify(name) {
349
- return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "project";
350
- }
351
- const useProjectStore = create((set, get) => ({
352
- projects: [],
353
- activeProjectId: loadSavedProjectId(),
354
- viewingProject: null,
355
- loading: false,
356
- error: null,
357
- async fetchProjects() {
358
- var _a;
359
- set({ loading: true, error: null });
360
- try {
361
- const data = await authFetch("/api/projects");
362
- const projects = data.projects;
363
- let activeId = get().activeProjectId;
364
- if (!activeId || !projects.find((p) => p.id === activeId)) {
365
- activeId = ((_a = projects[0]) == null ? void 0 : _a.id) ?? null;
366
- }
367
- set({ projects, activeProjectId: activeId, loading: false });
368
- persistProjectId(activeId);
369
- } catch (err) {
370
- set({ loading: false, error: err.message || "Failed to fetch projects" });
371
- }
372
- },
373
- switchProject(projectId) {
374
- const { projects, activeProjectId } = get();
375
- if (projectId === activeProjectId) return;
376
- if (!projects.find((p) => p.id === projectId)) return;
377
- set({ activeProjectId: projectId });
378
- persistProjectId(projectId);
379
- for (const fn of switchListeners) fn(projectId);
380
- },
381
- async createProject(name) {
382
- const baseSlug = slugify(name);
383
- let slug = baseSlug;
384
- let data = null;
385
- for (let attempt = 0; attempt < 10; attempt++) {
386
- try {
387
- data = await authFetch(
388
- "/api/projects",
389
- {
390
- method: "POST",
391
- body: JSON.stringify({ name, slug, visibility: "private" })
392
- }
393
- );
394
- break;
395
- } catch (err) {
396
- if (err.status === 409 && attempt < 9) {
397
- slug = `${baseSlug}-${attempt + 2}`.slice(0, 64);
398
- continue;
399
- }
400
- throw err;
401
- }
402
- }
403
- if (!data) throw new Error("Failed to create project after multiple slug attempts");
404
- const newProject = {
405
- id: data.project.id,
406
- slug: data.project.slug,
407
- name: data.project.name,
408
- visibility: data.project.visibility,
409
- role: "owner",
410
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
411
- };
412
- set((s) => ({ projects: [...s.projects, newProject] }));
413
- return newProject;
414
- },
415
- async openSharedProject(projectId) {
416
- const res = await fetch(`/api/projects/${projectId}`, { credentials: "include" });
417
- if (!res.ok) {
418
- const body = await res.json().catch(() => ({ error: "Failed to fetch project" }));
419
- throw new Error(body.error || `Failed to fetch project (${res.status})`);
420
- }
421
- const { project, role } = await res.json();
422
- const viewing = {
423
- id: project.id,
424
- name: project.name,
425
- role: role || "viewer",
426
- visibility: project.visibility
427
- };
428
- set({ viewingProject: viewing, activeProjectId: projectId });
429
- persistProjectId(projectId);
430
- for (const fn of switchListeners) fn(projectId);
431
- return viewing;
432
- },
433
- async renameProject(projectId, name) {
434
- await authFetch(`/api/projects/${projectId}`, {
435
- method: "PATCH",
436
- body: JSON.stringify({ name })
437
- });
438
- set((s) => ({
439
- projects: s.projects.map((p) => p.id === projectId ? { ...p, name } : p)
440
- }));
441
- },
442
- async setVisibility(projectId, visibility) {
443
- await authFetch(`/api/projects/${projectId}`, {
444
- method: "PATCH",
445
- body: JSON.stringify({ visibility })
446
- });
447
- set((s) => ({
448
- projects: s.projects.map((p) => p.id === projectId ? { ...p, visibility } : p)
449
- }));
450
- },
451
- async deleteProject(projectId) {
452
- await authFetch(`/api/projects/${projectId}`, { method: "DELETE" });
453
- const remaining = get().projects.filter((p) => p.id !== projectId);
454
- set({ projects: remaining });
455
- if (get().activeProjectId === projectId) {
456
- if (remaining.length > 0) {
457
- const next = remaining[0].id;
458
- set({ activeProjectId: next });
459
- persistProjectId(next);
460
- } else {
461
- const newProject = await get().createProject("My Project");
462
- set({ activeProjectId: newProject.id });
463
- persistProjectId(newProject.id);
464
- }
465
- }
466
- }
467
- }));
468
- const REFRESH_INTERVAL_MS = 13 * 60 * 1e3;
469
- let refreshTimer = null;
470
- function startRefreshTimer() {
471
- stopRefreshTimer();
472
- refreshTimer = setInterval(async () => {
473
- try {
474
- const { user } = await authApi.refresh();
475
- useAuthStore.setState({ user });
476
- } catch {
477
- stopRefreshTimer();
478
- useAuthStore.setState({ user: void 0, loading: false, error: null });
479
- }
480
- }, REFRESH_INTERVAL_MS);
481
- }
482
- function stopRefreshTimer() {
483
- if (refreshTimer !== null) {
484
- clearInterval(refreshTimer);
485
- refreshTimer = null;
486
- }
487
- }
488
- function isNetworkError(err) {
489
- if (err instanceof TypeError && (err.message.includes("fetch") || err.message.includes("network"))) return true;
490
- if (err instanceof AuthApiError) return false;
491
- return !(err instanceof AuthApiError);
492
- }
493
- const useAuthStore = create((set) => ({
494
- user: null,
495
- loading: true,
496
- error: null,
497
- backendAvailable: true,
498
- async checkSession() {
499
- set({ loading: true, error: null });
500
- try {
501
- const { user } = await authApi.session();
502
- setCurrentUserId(user.id);
503
- rehydrateCacheForUser(user.id);
504
- set({ user, loading: false, backendAvailable: true });
505
- startRefreshTimer();
506
- } catch (err) {
507
- if (isNetworkError(err)) {
508
- set({ user: void 0, loading: false, backendAvailable: false });
509
- return;
510
- }
511
- try {
512
- const { user } = await authApi.refresh();
513
- setCurrentUserId(user.id);
514
- rehydrateCacheForUser(user.id);
515
- set({ user, loading: false, backendAvailable: true });
516
- startRefreshTimer();
517
- } catch (refreshErr) {
518
- if (isNetworkError(refreshErr)) {
519
- set({ user: void 0, loading: false, backendAvailable: false });
520
- return;
521
- }
522
- set({ user: void 0, loading: false, backendAvailable: true });
523
- }
524
- }
525
- },
526
- async login(email, password) {
527
- set({ loading: true, error: null });
528
- try {
529
- const { user } = await authApi.login(email, password);
530
- setCurrentUserId(user.id);
531
- rehydrateCacheForUser(user.id);
532
- set({ user, loading: false });
533
- startRefreshTimer();
534
- useProjectStore.setState({ projects: [], activeProjectId: null });
535
- useProjectStore.getState().fetchProjects();
536
- } catch (err) {
537
- set({ loading: false, error: err.message || "Login failed" });
538
- throw err;
539
- }
540
- },
541
- async register(email, password, name) {
542
- set({ loading: true, error: null });
543
- try {
544
- const { user } = await authApi.register(email, password, name);
545
- setCurrentUserId(user.id);
546
- rehydrateCacheForUser(user.id);
547
- set({ user, loading: false });
548
- startRefreshTimer();
549
- useProjectStore.setState({ projects: [], activeProjectId: null });
550
- useProjectStore.getState().fetchProjects();
551
- } catch (err) {
552
- set({ loading: false, error: err.message || "Registration failed" });
553
- throw err;
554
- }
555
- },
556
- async logout() {
557
- stopRefreshTimer();
558
- try {
559
- await authApi.logout();
560
- } finally {
561
- clearUserCache();
562
- setCurrentUserId(void 0);
563
- set({ user: void 0, loading: false, error: null });
564
- useProjectStore.setState({ projects: [], activeProjectId: null, error: null });
565
- try {
566
- localStorage.removeItem("fc-active-project-id");
567
- } catch {
568
- }
569
- }
570
- }
571
- }));
572
- const authStore = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
573
- __proto__: null,
574
- useAuthStore
575
- }, Symbol.toStringTag, { value: "Module" }));
576
- var lzString = { exports: {} };
577
- var hasRequiredLzString;
578
- function requireLzString() {
579
- if (hasRequiredLzString) return lzString.exports;
580
- hasRequiredLzString = 1;
581
- (function(module) {
582
- var LZString = (function() {
583
- var f = String.fromCharCode;
584
- var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
585
- var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$";
586
- var baseReverseDic = {};
587
- function getBaseValue(alphabet, character) {
588
- if (!baseReverseDic[alphabet]) {
589
- baseReverseDic[alphabet] = {};
590
- for (var i = 0; i < alphabet.length; i++) {
591
- baseReverseDic[alphabet][alphabet.charAt(i)] = i;
592
- }
593
- }
594
- return baseReverseDic[alphabet][character];
595
- }
596
- var LZString2 = {
597
- compressToBase64: function(input) {
598
- if (input == null) return "";
599
- var res = LZString2._compress(input, 6, function(a) {
600
- return keyStrBase64.charAt(a);
601
- });
602
- switch (res.length % 4) {
603
- // To produce valid Base64
604
- default:
605
- // When could this happen ?
606
- case 0:
607
- return res;
608
- case 1:
609
- return res + "===";
610
- case 2:
611
- return res + "==";
612
- case 3:
613
- return res + "=";
614
- }
615
- },
616
- decompressFromBase64: function(input) {
617
- if (input == null) return "";
618
- if (input == "") return null;
619
- return LZString2._decompress(input.length, 32, function(index) {
620
- return getBaseValue(keyStrBase64, input.charAt(index));
621
- });
622
- },
623
- compressToUTF16: function(input) {
624
- if (input == null) return "";
625
- return LZString2._compress(input, 15, function(a) {
626
- return f(a + 32);
627
- }) + " ";
628
- },
629
- decompressFromUTF16: function(compressed) {
630
- if (compressed == null) return "";
631
- if (compressed == "") return null;
632
- return LZString2._decompress(compressed.length, 16384, function(index) {
633
- return compressed.charCodeAt(index) - 32;
634
- });
635
- },
636
- //compress into uint8array (UCS-2 big endian format)
637
- compressToUint8Array: function(uncompressed) {
638
- var compressed = LZString2.compress(uncompressed);
639
- var buf = new Uint8Array(compressed.length * 2);
640
- for (var i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
641
- var current_value = compressed.charCodeAt(i);
642
- buf[i * 2] = current_value >>> 8;
643
- buf[i * 2 + 1] = current_value % 256;
644
- }
645
- return buf;
646
- },
647
- //decompress from uint8array (UCS-2 big endian format)
648
- decompressFromUint8Array: function(compressed) {
649
- if (compressed === null || compressed === void 0) {
650
- return LZString2.decompress(compressed);
651
- } else {
652
- var buf = new Array(compressed.length / 2);
653
- for (var i = 0, TotalLen = buf.length; i < TotalLen; i++) {
654
- buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1];
655
- }
656
- var result = [];
657
- buf.forEach(function(c) {
658
- result.push(f(c));
659
- });
660
- return LZString2.decompress(result.join(""));
661
- }
662
- },
663
- //compress into a string that is already URI encoded
664
- compressToEncodedURIComponent: function(input) {
665
- if (input == null) return "";
666
- return LZString2._compress(input, 6, function(a) {
667
- return keyStrUriSafe.charAt(a);
668
- });
669
- },
670
- //decompress from an output of compressToEncodedURIComponent
671
- decompressFromEncodedURIComponent: function(input) {
672
- if (input == null) return "";
673
- if (input == "") return null;
674
- input = input.replace(/ /g, "+");
675
- return LZString2._decompress(input.length, 32, function(index) {
676
- return getBaseValue(keyStrUriSafe, input.charAt(index));
677
- });
678
- },
679
- compress: function(uncompressed) {
680
- return LZString2._compress(uncompressed, 16, function(a) {
681
- return f(a);
682
- });
683
- },
684
- _compress: function(uncompressed, bitsPerChar, getCharFromInt) {
685
- if (uncompressed == null) return "";
686
- var i, value, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0, ii;
687
- for (ii = 0; ii < uncompressed.length; ii += 1) {
688
- context_c = uncompressed.charAt(ii);
689
- if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {
690
- context_dictionary[context_c] = context_dictSize++;
691
- context_dictionaryToCreate[context_c] = true;
692
- }
693
- context_wc = context_w + context_c;
694
- if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) {
695
- context_w = context_wc;
696
- } else {
697
- if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
698
- if (context_w.charCodeAt(0) < 256) {
699
- for (i = 0; i < context_numBits; i++) {
700
- context_data_val = context_data_val << 1;
701
- if (context_data_position == bitsPerChar - 1) {
702
- context_data_position = 0;
703
- context_data.push(getCharFromInt(context_data_val));
704
- context_data_val = 0;
705
- } else {
706
- context_data_position++;
707
- }
708
- }
709
- value = context_w.charCodeAt(0);
710
- for (i = 0; i < 8; i++) {
711
- context_data_val = context_data_val << 1 | value & 1;
712
- if (context_data_position == bitsPerChar - 1) {
713
- context_data_position = 0;
714
- context_data.push(getCharFromInt(context_data_val));
715
- context_data_val = 0;
716
- } else {
717
- context_data_position++;
718
- }
719
- value = value >> 1;
720
- }
721
- } else {
722
- value = 1;
723
- for (i = 0; i < context_numBits; i++) {
724
- context_data_val = context_data_val << 1 | value;
725
- if (context_data_position == bitsPerChar - 1) {
726
- context_data_position = 0;
727
- context_data.push(getCharFromInt(context_data_val));
728
- context_data_val = 0;
729
- } else {
730
- context_data_position++;
731
- }
732
- value = 0;
733
- }
734
- value = context_w.charCodeAt(0);
735
- for (i = 0; i < 16; i++) {
736
- context_data_val = context_data_val << 1 | value & 1;
737
- if (context_data_position == bitsPerChar - 1) {
738
- context_data_position = 0;
739
- context_data.push(getCharFromInt(context_data_val));
740
- context_data_val = 0;
741
- } else {
742
- context_data_position++;
743
- }
744
- value = value >> 1;
745
- }
746
- }
747
- context_enlargeIn--;
748
- if (context_enlargeIn == 0) {
749
- context_enlargeIn = Math.pow(2, context_numBits);
750
- context_numBits++;
751
- }
752
- delete context_dictionaryToCreate[context_w];
753
- } else {
754
- value = context_dictionary[context_w];
755
- for (i = 0; i < context_numBits; i++) {
756
- context_data_val = context_data_val << 1 | value & 1;
757
- if (context_data_position == bitsPerChar - 1) {
758
- context_data_position = 0;
759
- context_data.push(getCharFromInt(context_data_val));
760
- context_data_val = 0;
761
- } else {
762
- context_data_position++;
763
- }
764
- value = value >> 1;
765
- }
766
- }
767
- context_enlargeIn--;
768
- if (context_enlargeIn == 0) {
769
- context_enlargeIn = Math.pow(2, context_numBits);
770
- context_numBits++;
771
- }
772
- context_dictionary[context_wc] = context_dictSize++;
773
- context_w = String(context_c);
774
- }
775
- }
776
- if (context_w !== "") {
777
- if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
778
- if (context_w.charCodeAt(0) < 256) {
779
- for (i = 0; i < context_numBits; i++) {
780
- context_data_val = context_data_val << 1;
781
- if (context_data_position == bitsPerChar - 1) {
782
- context_data_position = 0;
783
- context_data.push(getCharFromInt(context_data_val));
784
- context_data_val = 0;
785
- } else {
786
- context_data_position++;
787
- }
788
- }
789
- value = context_w.charCodeAt(0);
790
- for (i = 0; i < 8; i++) {
791
- context_data_val = context_data_val << 1 | value & 1;
792
- if (context_data_position == bitsPerChar - 1) {
793
- context_data_position = 0;
794
- context_data.push(getCharFromInt(context_data_val));
795
- context_data_val = 0;
796
- } else {
797
- context_data_position++;
798
- }
799
- value = value >> 1;
800
- }
801
- } else {
802
- value = 1;
803
- for (i = 0; i < context_numBits; i++) {
804
- context_data_val = context_data_val << 1 | value;
805
- if (context_data_position == bitsPerChar - 1) {
806
- context_data_position = 0;
807
- context_data.push(getCharFromInt(context_data_val));
808
- context_data_val = 0;
809
- } else {
810
- context_data_position++;
811
- }
812
- value = 0;
813
- }
814
- value = context_w.charCodeAt(0);
815
- for (i = 0; i < 16; i++) {
816
- context_data_val = context_data_val << 1 | value & 1;
817
- if (context_data_position == bitsPerChar - 1) {
818
- context_data_position = 0;
819
- context_data.push(getCharFromInt(context_data_val));
820
- context_data_val = 0;
821
- } else {
822
- context_data_position++;
823
- }
824
- value = value >> 1;
825
- }
826
- }
827
- context_enlargeIn--;
828
- if (context_enlargeIn == 0) {
829
- context_enlargeIn = Math.pow(2, context_numBits);
830
- context_numBits++;
831
- }
832
- delete context_dictionaryToCreate[context_w];
833
- } else {
834
- value = context_dictionary[context_w];
835
- for (i = 0; i < context_numBits; i++) {
836
- context_data_val = context_data_val << 1 | value & 1;
837
- if (context_data_position == bitsPerChar - 1) {
838
- context_data_position = 0;
839
- context_data.push(getCharFromInt(context_data_val));
840
- context_data_val = 0;
841
- } else {
842
- context_data_position++;
843
- }
844
- value = value >> 1;
845
- }
846
- }
847
- context_enlargeIn--;
848
- if (context_enlargeIn == 0) {
849
- context_enlargeIn = Math.pow(2, context_numBits);
850
- context_numBits++;
851
- }
852
- }
853
- value = 2;
854
- for (i = 0; i < context_numBits; i++) {
855
- context_data_val = context_data_val << 1 | value & 1;
856
- if (context_data_position == bitsPerChar - 1) {
857
- context_data_position = 0;
858
- context_data.push(getCharFromInt(context_data_val));
859
- context_data_val = 0;
860
- } else {
861
- context_data_position++;
862
- }
863
- value = value >> 1;
864
- }
865
- while (true) {
866
- context_data_val = context_data_val << 1;
867
- if (context_data_position == bitsPerChar - 1) {
868
- context_data.push(getCharFromInt(context_data_val));
869
- break;
870
- } else context_data_position++;
871
- }
872
- return context_data.join("");
873
- },
874
- decompress: function(compressed) {
875
- if (compressed == null) return "";
876
- if (compressed == "") return null;
877
- return LZString2._decompress(compressed.length, 32768, function(index) {
878
- return compressed.charCodeAt(index);
879
- });
880
- },
881
- _decompress: function(length, resetValue, getNextValue) {
882
- var dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], i, w, bits, resb, maxpower, power, c, data = { val: getNextValue(0), position: resetValue, index: 1 };
883
- for (i = 0; i < 3; i += 1) {
884
- dictionary[i] = i;
885
- }
886
- bits = 0;
887
- maxpower = Math.pow(2, 2);
888
- power = 1;
889
- while (power != maxpower) {
890
- resb = data.val & data.position;
891
- data.position >>= 1;
892
- if (data.position == 0) {
893
- data.position = resetValue;
894
- data.val = getNextValue(data.index++);
895
- }
896
- bits |= (resb > 0 ? 1 : 0) * power;
897
- power <<= 1;
898
- }
899
- switch (bits) {
900
- case 0:
901
- bits = 0;
902
- maxpower = Math.pow(2, 8);
903
- power = 1;
904
- while (power != maxpower) {
905
- resb = data.val & data.position;
906
- data.position >>= 1;
907
- if (data.position == 0) {
908
- data.position = resetValue;
909
- data.val = getNextValue(data.index++);
910
- }
911
- bits |= (resb > 0 ? 1 : 0) * power;
912
- power <<= 1;
913
- }
914
- c = f(bits);
915
- break;
916
- case 1:
917
- bits = 0;
918
- maxpower = Math.pow(2, 16);
919
- power = 1;
920
- while (power != maxpower) {
921
- resb = data.val & data.position;
922
- data.position >>= 1;
923
- if (data.position == 0) {
924
- data.position = resetValue;
925
- data.val = getNextValue(data.index++);
926
- }
927
- bits |= (resb > 0 ? 1 : 0) * power;
928
- power <<= 1;
929
- }
930
- c = f(bits);
931
- break;
932
- case 2:
933
- return "";
934
- }
935
- dictionary[3] = c;
936
- w = c;
937
- result.push(c);
938
- while (true) {
939
- if (data.index > length) {
940
- return "";
941
- }
942
- bits = 0;
943
- maxpower = Math.pow(2, numBits);
944
- power = 1;
945
- while (power != maxpower) {
946
- resb = data.val & data.position;
947
- data.position >>= 1;
948
- if (data.position == 0) {
949
- data.position = resetValue;
950
- data.val = getNextValue(data.index++);
951
- }
952
- bits |= (resb > 0 ? 1 : 0) * power;
953
- power <<= 1;
954
- }
955
- switch (c = bits) {
956
- case 0:
957
- bits = 0;
958
- maxpower = Math.pow(2, 8);
959
- power = 1;
960
- while (power != maxpower) {
961
- resb = data.val & data.position;
962
- data.position >>= 1;
963
- if (data.position == 0) {
964
- data.position = resetValue;
965
- data.val = getNextValue(data.index++);
966
- }
967
- bits |= (resb > 0 ? 1 : 0) * power;
968
- power <<= 1;
969
- }
970
- dictionary[dictSize++] = f(bits);
971
- c = dictSize - 1;
972
- enlargeIn--;
973
- break;
974
- case 1:
975
- bits = 0;
976
- maxpower = Math.pow(2, 16);
977
- power = 1;
978
- while (power != maxpower) {
979
- resb = data.val & data.position;
980
- data.position >>= 1;
981
- if (data.position == 0) {
982
- data.position = resetValue;
983
- data.val = getNextValue(data.index++);
984
- }
985
- bits |= (resb > 0 ? 1 : 0) * power;
986
- power <<= 1;
987
- }
988
- dictionary[dictSize++] = f(bits);
989
- c = dictSize - 1;
990
- enlargeIn--;
991
- break;
992
- case 2:
993
- return result.join("");
994
- }
995
- if (enlargeIn == 0) {
996
- enlargeIn = Math.pow(2, numBits);
997
- numBits++;
998
- }
999
- if (dictionary[c]) {
1000
- entry = dictionary[c];
1001
- } else {
1002
- if (c === dictSize) {
1003
- entry = w + w.charAt(0);
1004
- } else {
1005
- return null;
1006
- }
1007
- }
1008
- result.push(entry);
1009
- dictionary[dictSize++] = w + entry.charAt(0);
1010
- enlargeIn--;
1011
- w = entry;
1012
- if (enlargeIn == 0) {
1013
- enlargeIn = Math.pow(2, numBits);
1014
- numBits++;
1015
- }
1016
- }
1017
- }
1018
- };
1019
- return LZString2;
1020
- })();
1021
- if (module != null) {
1022
- module.exports = LZString;
1023
- } else if (typeof angular !== "undefined" && angular != null) {
1024
- angular.module("LZString", []).factory("LZString", function() {
1025
- return LZString;
1026
- });
1027
- }
1028
- })(lzString);
1029
- return lzString.exports;
1030
- }
1031
- var lzStringExports = requireLzString();
1032
- const SHARED_PREFIX = "code/";
1033
- const BUNDLE_PREFIX = "bundle/";
1034
- function encodeSharedModel(filename, code) {
1035
- const compressed = lzStringExports.compressToEncodedURIComponent(code);
1036
- return `#${SHARED_PREFIX}${encodeURIComponent(filename)}/${compressed}`;
1037
- }
1038
- function decodeSharedHash(hash) {
1039
- const raw = hash.startsWith("#") ? hash.slice(1) : hash;
1040
- if (!raw.startsWith(SHARED_PREFIX)) return null;
1041
- const rest = raw.slice(SHARED_PREFIX.length);
1042
- const slashIdx = rest.indexOf("/");
1043
- if (slashIdx === -1) return null;
1044
- const filename = decodeURIComponent(rest.slice(0, slashIdx));
1045
- const compressed = rest.slice(slashIdx + 1);
1046
- const code = lzStringExports.decompressFromEncodedURIComponent(compressed);
1047
- if (!code) return null;
1048
- return { filename, code };
1049
- }
1050
- function encodeSharedBundle(bundle) {
1051
- const parts = [bundle.entry];
1052
- for (const [name, code] of Object.entries(bundle.files)) {
1053
- parts.push(name, code);
1054
- }
1055
- const packed = parts.join("\0");
1056
- const compressed = lzStringExports.compressToEncodedURIComponent(packed);
1057
- return `#${BUNDLE_PREFIX}${compressed}`;
1058
- }
1059
- function decodeSharedBundle(hash) {
1060
- const raw = hash.startsWith("#") ? hash.slice(1) : hash;
1061
- if (!raw.startsWith(BUNDLE_PREFIX)) return null;
1062
- const compressed = raw.slice(BUNDLE_PREFIX.length);
1063
- const packed = lzStringExports.decompressFromEncodedURIComponent(compressed);
1064
- if (!packed) return null;
1065
- const parts = packed.split("\0");
1066
- if (parts.length < 3 || parts.length % 2 === 0) return null;
1067
- const entry = parts[0];
1068
- const files = {};
1069
- for (let i = 1; i < parts.length; i += 2) {
1070
- files[parts[i]] = parts[i + 1];
1071
- }
1072
- if (!files[entry]) return null;
1073
- return { entry, files };
1074
- }
1075
- function buildBundleShareUrl(bundle) {
1076
- return `${PROD_BASE}${encodeSharedBundle(bundle)}`;
1077
- }
1078
- function buildBundleEmbedUrl(bundle) {
1079
- return `${PROD_BASE}?embed=1${encodeSharedBundle(bundle)}`;
1080
- }
1081
- const PROD_BASE = "https://forgecad.io/app";
1082
- function buildShareUrl(filename, code) {
1083
- return `${PROD_BASE}${encodeSharedModel(filename, code)}`;
1084
- }
1085
- function buildEmbedUrl(filename, code) {
1086
- return `${PROD_BASE}?embed=1${encodeSharedModel(filename, code)}`;
1087
- }
1088
- function buildGistShareUrl(gistId) {
1089
- return `${PROD_BASE}?gist=${encodeURIComponent(gistId)}`;
1090
- }
1091
- function buildEmbedSnippet(embedUrl, width = 800, height = 500) {
1092
- return `<iframe src="${embedUrl}" width="${width}" height="${height}" style="border:none; border-radius:8px;" allowfullscreen></iframe>`;
1093
- }
1094
- function getQueryParams() {
1095
- return new URLSearchParams(window.location.search);
1096
- }
1097
- function isEmbedMode() {
1098
- return getQueryParams().get("embed") === "1";
1099
- }
1100
- function getGistId() {
1101
- return getQueryParams().get("gist");
1102
- }
1103
- function getExternalUrl() {
1104
- return getQueryParams().get("url");
1105
- }
1106
- async function fetchUrlModel(url) {
1107
- const res = await fetch(url);
1108
- if (!res.ok) throw new Error(`Failed to fetch model: ${res.status} ${res.statusText}`);
1109
- const code = await res.text();
1110
- const pathname = new URL(url).pathname;
1111
- const filename = pathname.split("/").pop() || "model.forge.js";
1112
- return { filename, code };
1113
- }
1114
- async function fetchGistModel(gistId) {
1115
- const res = await fetch(`https://api.github.com/gists/${gistId}`);
1116
- if (!res.ok) throw new Error(`Failed to fetch gist: ${res.status} ${res.statusText}`);
1117
- const data = await res.json();
1118
- const files = data.files;
1119
- const entries = Object.values(files);
1120
- const forgeFile = entries.find((f) => f.filename.endsWith(".forge.js")) || entries.find((f) => f.filename.endsWith(".sketch.js")) || entries[0];
1121
- if (!forgeFile) throw new Error("Gist contains no files");
1122
- return { filename: forgeFile.filename, code: forgeFile.content };
1123
- }
1124
- const share = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1125
- __proto__: null,
1126
- buildBundleEmbedUrl,
1127
- buildBundleShareUrl,
1128
- buildEmbedSnippet,
1129
- buildEmbedUrl,
1130
- buildGistShareUrl,
1131
- buildShareUrl,
1132
- decodeSharedBundle,
1133
- decodeSharedHash,
1134
- encodeSharedBundle,
1135
- encodeSharedModel,
1136
- fetchGistModel,
1137
- fetchUrlModel,
1138
- getExternalUrl,
1139
- getGistId,
1140
- getQueryParams,
1141
- isEmbedMode
1142
- }, Symbol.toStringTag, { value: "Module" }));
1143
- reactExports.lazy(() => __vitePreload(() => import("./LandingPage-C5n9hDXI.js"), true ? [] : void 0).then((m) => ({ default: m.LandingPage })));
1144
- const DocsPage = reactExports.lazy(() => __vitePreload(() => import("./DocsPage-CKRV2iq2.js"), true ? [] : void 0).then((m) => ({ default: m.DocsPage })));
1145
- reactExports.lazy(() => __vitePreload(() => import("./BlogPage-P_AJP0v9.js"), true ? [] : void 0).then((m) => ({ default: m.BlogPage })));
1146
- reactExports.lazy(() => __vitePreload(() => import("./AdminPage-CeqCUUgu.js"), true ? [] : void 0).then((m) => ({ default: m.AdminPage })));
1147
- reactExports.lazy(() => __vitePreload(() => import("./PublishedModelPage-Dt7PCVBj.js"), true ? [] : void 0).then((m) => ({ default: m.PublishedModelPage })));
1148
- reactExports.lazy(() => __vitePreload(() => import("./SettingsPage-BqCh9JcC.js"), true ? [] : void 0).then((m) => ({ default: m.SettingsPage })));
1149
- const EditorApp = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-B-vQvgam.js"), true ? __vite__mapDeps([0]) : void 0).then((m) => ({ default: m.EditorApp })));
1150
- const EmbedViewer = reactExports.lazy(() => __vitePreload(() => import("./EmbedViewer-DBlzmQ5i.js"), true ? [] : void 0).then((m) => ({ default: m.EmbedViewer })));
1151
- const embedMode = isEmbedMode();
1152
- class ErrorBoundary extends React.Component {
1153
- constructor() {
1154
- super(...arguments);
1155
- __publicField(this, "state", { error: null });
1156
- }
1157
- static getDerivedStateFromError(error) {
1158
- return { error };
1159
- }
1160
- render() {
1161
- if (this.state.error) {
1162
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1163
- "div",
1164
- {
1165
- style: {
1166
- display: "flex",
1167
- alignItems: "center",
1168
- justifyContent: "center",
1169
- height: "100vh",
1170
- color: "var(--fc-textDim)"
1171
- },
1172
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { textAlign: "center", maxWidth: 400, padding: 24 }, children: [
1173
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 48, marginBottom: 16 }, children: "⚒" }),
1174
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 16, fontWeight: 600, color: "var(--fc-text)", marginBottom: 8 }, children: "Something went wrong" }),
1175
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 13, color: "var(--fc-textMuted)", marginBottom: 20, lineHeight: 1.5 }, children: this.state.error.message || "The page failed to load. This can happen on slow connections." }),
1176
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1177
- "button",
1178
- {
1179
- onClick: () => window.location.reload(),
1180
- style: {
1181
- padding: "10px 24px",
1182
- fontSize: 14,
1183
- fontWeight: 600,
1184
- background: "var(--fc-accent)",
1185
- color: "var(--fc-accentText)",
1186
- border: "none",
1187
- borderRadius: 6,
1188
- cursor: "pointer"
1189
- },
1190
- children: "Reload"
1191
- }
1192
- )
1193
- ] })
1194
- }
1195
- );
1196
- }
1197
- return this.props.children;
1198
- }
1199
- }
1200
- function PageLoader() {
1201
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1202
- "div",
1203
- {
1204
- style: {
1205
- display: "flex",
1206
- alignItems: "center",
1207
- justifyContent: "center",
1208
- height: "100vh",
1209
- color: "var(--fc-textDim)"
1210
- },
1211
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { textAlign: "center" }, children: [
1212
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 48, marginBottom: 16, animation: "fc-pulse 2s ease-in-out infinite" }, children: "⚒" }),
1213
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 13 }, children: "Loading..." })
1214
- ] })
1215
- }
1216
- );
1217
- }
1218
- function LocalEditor() {
1219
- return /* @__PURE__ */ jsxRuntimeExports.jsx(EditorApp, {});
1220
- }
1221
- function App() {
1222
- if (embedMode) {
1223
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(PageLoader, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(EmbedViewer, {}) }) });
1224
- }
1225
- {
1226
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(BrowserRouter, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(PageLoader, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Routes, { children: [
1227
- /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/", element: /* @__PURE__ */ jsxRuntimeExports.jsx(LocalEditor, {}) }),
1228
- /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/docs", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DocsPage, {}) }),
1229
- /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/docs/:slug", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DocsPage, {}) }),
1230
- /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/app", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/", replace: true }) }),
1231
- /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "*", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/", replace: true }) })
1232
- ] }) }) }) });
1233
- }
1234
- }
1235
- const dark = {
1236
- bg: "#0d1117",
1237
- bgPanel: "#161b22",
1238
- bgSurface: "#1c2128",
1239
- bgHover: "#242b35",
1240
- bgActive: "#2d333b",
1241
- bgInput: "#0a0e14",
1242
- bgOverlay: "#131920",
1243
- text: "#d2dce6",
1244
- textMuted: "#8b949e",
1245
- textDim: "#636e7b",
1246
- border: "#30363d",
1247
- borderLight: "#21262d",
1248
- accent: "#58a6ff",
1249
- accentText: "#ffffff",
1250
- error: "#f85149",
1251
- errorBg: "#301a1f",
1252
- success: "#3fb950",
1253
- successBg: "#122117",
1254
- warning: "#d29922",
1255
- viewportBg: "#161b22",
1256
- gridCell: "#30363d",
1257
- gridSection: "#484f58",
1258
- sketchEdge: "#e6edf3",
1259
- sketchPoint: "#ffffff",
1260
- sketchConstruction: "#636e7b",
1261
- sketchSurface: "#58a6ff",
1262
- sketchConstraint: "#3fb950",
1263
- sketchConstraintDim: "#3fb950",
1264
- sketchConflicting: "#f85149",
1265
- sketchRedundant: "#d29922",
1266
- sketchSelected: "#f0883e",
1267
- sketchFullyConstrained: "#3fb950",
1268
- sketchUnderConstrained: "#58a6ff",
1269
- sketchOverConstrained: "#f85149"
1270
- };
1271
- const light = {
1272
- bg: "#f0f4f8",
1273
- bgPanel: "#f8fafc",
1274
- bgSurface: "#e8edf2",
1275
- bgHover: "#dfe5ec",
1276
- bgActive: "#d2dae3",
1277
- bgInput: "#f8fafc",
1278
- bgOverlay: "#eef2f6",
1279
- text: "#1e293b",
1280
- textMuted: "#506175",
1281
- textDim: "#8494a7",
1282
- border: "#d5dde5",
1283
- borderLight: "#e2e8ef",
1284
- accent: "#2563eb",
1285
- accentText: "#ffffff",
1286
- error: "#dc2626",
1287
- errorBg: "#fde8e8",
1288
- success: "#16a34a",
1289
- successBg: "#e5f6ec",
1290
- warning: "#d97706",
1291
- viewportBg: "#e4eaf0",
1292
- gridCell: "#c5ced8",
1293
- gridSection: "#9baab8",
1294
- sketchEdge: "#1e293b",
1295
- sketchPoint: "#0f172a",
1296
- sketchConstruction: "#8494a7",
1297
- sketchSurface: "#2563eb",
1298
- sketchConstraint: "#16a34a",
1299
- sketchConstraintDim: "#16a34a",
1300
- sketchConflicting: "#dc2626",
1301
- sketchRedundant: "#d97706",
1302
- sketchSelected: "#ca8a04",
1303
- sketchFullyConstrained: "#16a34a",
1304
- sketchUnderConstrained: "#2563eb",
1305
- sketchOverConstrained: "#dc2626"
1306
- };
1307
- const gruvbox = {
1308
- bg: "#282828",
1309
- bgPanel: "#1d2021",
1310
- bgSurface: "#3c3836",
1311
- bgHover: "#504945",
1312
- bgActive: "#665c54",
1313
- bgInput: "#1d2021",
1314
- bgOverlay: "#282828",
1315
- text: "#ebdbb2",
1316
- textMuted: "#a89984",
1317
- textDim: "#928374",
1318
- border: "#504945",
1319
- borderLight: "#3c3836",
1320
- accent: "#fe8019",
1321
- accentText: "#282828",
1322
- error: "#fb4934",
1323
- errorBg: "#3c1f1e",
1324
- success: "#b8bb26",
1325
- successBg: "#1d2a1d",
1326
- warning: "#fabd2f",
1327
- viewportBg: "#1d2021",
1328
- gridCell: "#504945",
1329
- gridSection: "#7c6f64",
1330
- sketchEdge: "#ebdbb2",
1331
- sketchPoint: "#fbf1c7",
1332
- sketchConstruction: "#7c6f64",
1333
- sketchSurface: "#458588",
1334
- sketchConstraint: "#b8bb26",
1335
- sketchConstraintDim: "#b8bb26",
1336
- sketchConflicting: "#fb4934",
1337
- sketchRedundant: "#fabd2f",
1338
- sketchSelected: "#fe8019",
1339
- sketchFullyConstrained: "#b8bb26",
1340
- sketchUnderConstrained: "#83a598",
1341
- sketchOverConstrained: "#fb4934"
1342
- };
1343
- const tokyoNight = {
1344
- bg: "#1a1b26",
1345
- bgPanel: "#16161e",
1346
- bgSurface: "#24283b",
1347
- bgHover: "#292e42",
1348
- bgActive: "#33467c",
1349
- bgInput: "#16161e",
1350
- bgOverlay: "#1a1b26",
1351
- text: "#c0caf5",
1352
- textMuted: "#9aa5ce",
1353
- textDim: "#565f89",
1354
- border: "#292e42",
1355
- borderLight: "#24283b",
1356
- accent: "#7aa2f7",
1357
- accentText: "#1a1b26",
1358
- error: "#f7768e",
1359
- errorBg: "#2d1520",
1360
- success: "#9ece6a",
1361
- successBg: "#1a2a1a",
1362
- warning: "#e0af68",
1363
- viewportBg: "#16161e",
1364
- gridCell: "#292e42",
1365
- gridSection: "#3b4261",
1366
- sketchEdge: "#c0caf5",
1367
- sketchPoint: "#dfe5fa",
1368
- sketchConstruction: "#565f89",
1369
- sketchSurface: "#7aa2f7",
1370
- sketchConstraint: "#9ece6a",
1371
- sketchConstraintDim: "#9ece6a",
1372
- sketchConflicting: "#f7768e",
1373
- sketchRedundant: "#e0af68",
1374
- sketchSelected: "#ff9e64",
1375
- sketchFullyConstrained: "#9ece6a",
1376
- sketchUnderConstrained: "#7aa2f7",
1377
- sketchOverConstrained: "#f7768e"
1378
- };
1379
- const kanagawaLotus = {
1380
- bg: "#f2ecbc",
1381
- bgPanel: "#f7f3d7",
1382
- bgSurface: "#e7dba0",
1383
- bgHover: "#d9d08e",
1384
- bgActive: "#c9b97a",
1385
- bgInput: "#f7f3d7",
1386
- bgOverlay: "#f2ecbc",
1387
- text: "#545464",
1388
- textMuted: "#766b6b",
1389
- textDim: "#8a8980",
1390
- border: "#d7d194",
1391
- borderLight: "#e0daa0",
1392
- accent: "#c84053",
1393
- accentText: "#f7f3d7",
1394
- error: "#c84053",
1395
- errorBg: "#f5d5d5",
1396
- success: "#6f894e",
1397
- successBg: "#e0ecd0",
1398
- warning: "#cc6d00",
1399
- viewportBg: "#e7dba0",
1400
- gridCell: "#c9c08a",
1401
- gridSection: "#a8a070",
1402
- sketchEdge: "#545464",
1403
- sketchPoint: "#3a3a4a",
1404
- sketchConstruction: "#8a8980",
1405
- sketchSurface: "#597b8c",
1406
- sketchConstraint: "#6f894e",
1407
- sketchConstraintDim: "#6f894e",
1408
- sketchConflicting: "#c84053",
1409
- sketchRedundant: "#cc6d00",
1410
- sketchSelected: "#d27e19",
1411
- sketchFullyConstrained: "#6f894e",
1412
- sketchUnderConstrained: "#4d699b",
1413
- sketchOverConstrained: "#c84053"
1414
- };
1415
- const themes = { dark, light, gruvbox, "tokyo-night": tokyoNight, "kanagawa-lotus": kanagawaLotus };
1416
- function applyTheme(name) {
1417
- const t = themes[name];
1418
- const root = document.documentElement;
1419
- for (const [key, value] of Object.entries(t)) {
1420
- root.style.setProperty(`--fc-${key}`, value);
1421
- }
1422
- root.dataset.fcTheme = name;
1423
- }
1424
- applyTheme(localStorage.getItem("fc-theme") || "dark");
1425
- clientExports.createRoot(document.getElementById("root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(App, {}));
1426
- export {
1427
- AuthApiError as A,
1428
- __vitePreload as _,
1429
- authFetch as a,
1430
- authApi as b,
1431
- useProjectStore as c,
1432
- fetchUrlModel as d,
1433
- buildGistShareUrl as e,
1434
- fetchGistModel as f,
1435
- buildBundleShareUrl as g,
1436
- buildBundleEmbedUrl as h,
1437
- isEmbedMode as i,
1438
- buildShareUrl as j,
1439
- buildEmbedUrl as k,
1440
- buildEmbedSnippet as l,
1441
- applyTheme as m,
1442
- decodeSharedHash as n,
1443
- decodeSharedBundle as o,
1444
- getExternalUrl as p,
1445
- getGistId as q,
1446
- getCsrfToken as r,
1447
- userScopedKey as s,
1448
- themes as t,
1449
- useAuthStore as u,
1450
- lookupCache as v,
1451
- storeCache as w,
1452
- runResultCache as x,
1453
- authStore as y,
1454
- share as z
1455
- };