forgecad 0.7.0 → 0.8.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 (158) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/{AdminPage-DAu1C1ST.js → AdminPage-D4bocK4E.js} +1 -1
  3. package/dist/assets/{DocsPage-Gc_BCdqC.js → DocsPage-D3A_g8V3.js} +85 -45
  4. package/dist/assets/{EditorApp-DG1-oUSV.css → EditorApp-BWYUSpUN.css} +133 -51
  5. package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
  6. package/dist/assets/{EmbedViewer-CEO8XbV8.js → EmbedViewer-kWjKaC_t.js} +1 -1
  7. package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
  8. package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
  9. package/dist/assets/{PricingPage-BSrxu6d7.js → PricingPage-BsU5vzEx.js} +1 -1
  10. package/dist/assets/{SettingsPage-FUCSIRq6.js → SettingsPage-PqvpAKIs.js} +1 -1
  11. package/dist/assets/{evalWorker-KoR0SNKq.js → evalWorker-C-hzNUMy.js} +2218 -286
  12. package/dist/assets/{index-wTEK39at.js → index-Pz321YAt.js} +7416 -1481
  13. package/dist/assets/{index-CyVd1D4D.css → index-ay13WNfa.css} +501 -2
  14. package/dist/assets/{manifold-B1sGWdYk.js → manifold-BcbjWLIo.js} +3 -3
  15. package/dist/assets/{manifold-D7o0N50J.js → manifold-DBckbFgx.js} +1 -1
  16. package/dist/assets/{manifold-G5sBaXzi.js → manifold-O2AAGXyj.js} +1 -1
  17. package/dist/assets/{reportWorker-DYcRHhv9.js → reportWorker-Dxr-5A7w.js} +2003 -259
  18. package/dist/docs/index.html +2 -2
  19. package/dist/docs-raw/CLI.md +488 -0
  20. package/dist/docs-raw/generated/assembly.md +19 -11
  21. package/dist/docs-raw/generated/concepts.md +1023 -360
  22. package/dist/docs-raw/generated/core.md +1165 -264
  23. package/dist/docs-raw/generated/curves.md +168 -1
  24. package/dist/docs-raw/generated/lib.md +10 -5
  25. package/dist/docs-raw/generated/output.md +1 -1
  26. package/dist/docs-raw/generated/sdf.md +208 -0
  27. package/dist/docs-raw/generated/sketch.md +1281 -329
  28. package/dist/docs-raw/generated/viewport.md +29 -2
  29. package/dist/index.html +2 -2
  30. package/dist/landing/proof-ams-adapter.png +0 -0
  31. package/dist/landing/proof-bolt-and-nut.png +0 -0
  32. package/dist/landing/proof-fillet-enclosure.png +0 -0
  33. package/dist/landing/proof-glasses.png +0 -0
  34. package/dist/landing/proof-gyroid.png +0 -0
  35. package/dist/sitemap.xml +6 -6
  36. package/dist-cli/forgecad.js +3148 -555
  37. package/dist-cli/forgecad.js.map +1 -1
  38. package/dist-cli/{solver-FV7TJZGI.js → solver-46FFSK2U.js} +1 -3
  39. package/dist-cli/{solver-FV7TJZGI.js.map → solver-46FFSK2U.js.map} +1 -1
  40. package/dist-skill/CONTEXT.md +3700 -1153
  41. package/dist-skill/SKILL-dev.md +15 -17
  42. package/dist-skill/SKILL.md +14 -9
  43. package/dist-skill/docs/API/core/concepts.md +28 -1
  44. package/dist-skill/docs/CLI.md +488 -0
  45. package/dist-skill/docs/generated/assembly.md +19 -11
  46. package/dist-skill/docs/generated/core.md +1165 -264
  47. package/dist-skill/docs/generated/curves.md +168 -1
  48. package/dist-skill/docs/generated/lib.md +10 -5
  49. package/dist-skill/docs/generated/output.md +1 -1
  50. package/dist-skill/docs/generated/sdf.md +208 -0
  51. package/dist-skill/docs/generated/sketch.md +1281 -329
  52. package/dist-skill/docs/generated/viewport.md +29 -2
  53. package/dist-skill/docs/guides/joint-design.md +78 -0
  54. package/dist-skill/docs-dev/API/core/concepts.md +28 -1
  55. package/dist-skill/docs-dev/CLI.md +488 -0
  56. package/dist-skill/docs-dev/coding.md +1 -1
  57. package/dist-skill/docs-dev/component-model.md +164 -0
  58. package/dist-skill/docs-dev/generated/assembly.md +19 -11
  59. package/dist-skill/docs-dev/generated/core.md +1165 -264
  60. package/dist-skill/docs-dev/generated/curves.md +168 -1
  61. package/dist-skill/docs-dev/generated/lib.md +10 -5
  62. package/dist-skill/docs-dev/generated/output.md +1 -1
  63. package/dist-skill/docs-dev/generated/sdf.md +208 -0
  64. package/dist-skill/docs-dev/generated/sketch.md +1281 -329
  65. package/dist-skill/docs-dev/generated/viewport.md +29 -2
  66. package/dist-skill/docs-dev/guides/joint-design.md +78 -0
  67. package/examples/api/attachTo-basics.forge.js +3 -3
  68. package/examples/api/bill-of-materials.forge.js +9 -9
  69. package/examples/api/bolt-pattern.forge.js +5 -5
  70. package/examples/api/boolean-operations.forge.js +2 -2
  71. package/examples/api/bounding-box-visualizer.forge.js +1 -1
  72. package/examples/api/clone-duplicate.forge.js +1 -1
  73. package/examples/api/connector-assembly.forge.js +4 -2
  74. package/examples/api/connector-basics.forge.js +5 -5
  75. package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
  76. package/examples/api/elbow-test.forge.js +3 -3
  77. package/examples/api/extrude-options.forge.js +4 -4
  78. package/examples/api/fillet-showcase.forge.js +1 -1
  79. package/examples/api/gears-tier1.forge.js +5 -5
  80. package/examples/api/group-test.forge.js +2 -2
  81. package/examples/api/mesh-import-slats.forge.js +3 -3
  82. package/examples/api/patterns.forge.js +3 -3
  83. package/examples/api/pointAlong-orientation.forge.js +2 -2
  84. package/examples/api/profile-2020-b-slot6.forge.js +4 -4
  85. package/examples/api/sketch-rounding-strategies.forge.js +1 -1
  86. package/examples/api/smooth-curve-connections.forge.js +1 -1
  87. package/examples/api/transition-curves.forge.js +3 -3
  88. package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
  89. package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
  90. package/examples/constraints/03-redundant-constraints.forge.js +2 -2
  91. package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
  92. package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
  93. package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
  94. package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
  95. package/examples/constraints/09-stress-spiral.forge.js +1 -1
  96. package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
  97. package/examples/constraints/11-surface-grid.forge.js +2 -2
  98. package/examples/constraints/12-surface-nested.forge.js +4 -4
  99. package/examples/constraints/13-surface-complex.forge.js +1 -1
  100. package/examples/exact-arc-housing.forge.js +12 -0
  101. package/examples/furniture/adjustable-table.forge.js +13 -13
  102. package/examples/furniture/bathroom.forge.js +15 -15
  103. package/examples/furniture/chair.forge.js +12 -12
  104. package/examples/furniture/picture-frame.forge.js +6 -6
  105. package/examples/furniture/shoe-rack-doors.forge.js +8 -8
  106. package/examples/furniture/shoe-rack.forge.js +7 -7
  107. package/examples/furniture/table-lamp.forge.js +8 -8
  108. package/examples/gcode/lissajous-vase.forge.js +4 -4
  109. package/examples/gcode/math-surface.forge.js +3 -3
  110. package/examples/gcode/parametric-vase.forge.js +4 -4
  111. package/examples/gcode/spiral-tower.forge.js +4 -4
  112. package/examples/generative/crystal-growth.forge.js +7 -7
  113. package/examples/generative/frost-spires.forge.js +6 -6
  114. package/examples/generative/golden-spiral-tower.forge.js +8 -8
  115. package/examples/generative/molten-forge.forge.js +6 -6
  116. package/examples/generative/neon-coral.forge.js +7 -7
  117. package/examples/mechanical/3d-printer.forge.js +9 -9
  118. package/examples/mechanical/5-finger-robot-hand.forge.js +4 -4
  119. package/examples/mechanical/airplane-propeller.forge.js +7 -7
  120. package/examples/mechanical/bolt-and-nut.forge.js +10 -10
  121. package/examples/mechanical/door-with-hinges.forge.js +7 -7
  122. package/examples/mechanical/fillet-enclosure.forge.js +14 -10
  123. package/examples/mechanical/headphone-hanger-v2.forge.js +9 -9
  124. package/examples/mechanical/robot_hand.forge.js +10 -10
  125. package/examples/mechanical/robot_hand_2.forge.js +17 -17
  126. package/examples/nurbs-surface.forge.js +8 -0
  127. package/examples/nurbs-tube.forge.js +7 -0
  128. package/examples/products/bottle.forge.js +7 -7
  129. package/examples/products/chess-set.forge.js +6 -6
  130. package/examples/products/classical-piano.forge.js +9 -9
  131. package/examples/products/clock.forge.js +21 -21
  132. package/examples/products/cup.forge.js +5 -5
  133. package/examples/products/iphone.forge.js +12 -12
  134. package/examples/products/laptop.forge.js +9 -9
  135. package/examples/products/laser-cut-box.forge.js +6 -6
  136. package/examples/products/laser-cut-tray.forge.js +6 -6
  137. package/examples/products/liquid-soap-dispenser.forge.js +5 -5
  138. package/examples/products/origami-fish.forge.js +6 -6
  139. package/examples/products/spiderman-cake.forge.js +2 -2
  140. package/examples/shelf/container.forge.js +5 -5
  141. package/examples/shelf/shelf-unit.forge.js +6 -6
  142. package/examples/toolbox/bolted-joint.forge.js +5 -5
  143. package/package.json +3 -1
  144. package/dist/assets/EditorApp-D9bJvtf7.js +0 -11338
  145. package/dist/assets/LandingPage-CdCuEOdC.js +0 -451
  146. package/dist-cli/chunk-PZ5AY32C.js +0 -10
  147. package/dist-cli/chunk-PZ5AY32C.js.map +0 -1
  148. package/dist-skill/docs/CLI/export.md +0 -91
  149. package/dist-skill/docs/CLI/projects.md +0 -107
  150. package/dist-skill/docs/CLI/studio_publishing.md +0 -52
  151. package/dist-skill/docs/CLI/validation.md +0 -66
  152. package/dist-skill/docs-dev/API/core/sdf-advanced.md +0 -92
  153. package/dist-skill/docs-dev/API/core/sdf-primitives.md +0 -58
  154. package/dist-skill/docs-dev/API/core/sdf-workflow.md +0 -42
  155. package/dist-skill/docs-dev/CLI/export.md +0 -91
  156. package/dist-skill/docs-dev/CLI/projects.md +0 -107
  157. package/dist-skill/docs-dev/CLI/studio_publishing.md +0 -52
  158. package/dist-skill/docs-dev/CLI/validation.md +0 -66
@@ -131,6 +131,313 @@ button:disabled {
131
131
  filter: brightness(1.1);
132
132
  }
133
133
 
134
+ /* --- App crash recovery --- */
135
+ .fc-crash-shell {
136
+ position: relative;
137
+ min-height: 100vh;
138
+ padding: calc(env(safe-area-inset-top, 0px) + 24px) 16px calc(env(safe-area-inset-bottom, 0px) + 24px);
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: center;
142
+ overflow: auto;
143
+ background:
144
+ radial-gradient(circle at top left, color-mix(in srgb, var(--fc-accent) 20%, transparent), transparent 38%),
145
+ radial-gradient(circle at bottom right, color-mix(in srgb, var(--fc-error) 22%, transparent), transparent 34%),
146
+ linear-gradient(180deg, var(--fc-bg), var(--fc-bgOverlay));
147
+ color: var(--fc-text);
148
+ }
149
+
150
+ .fc-crash-orb {
151
+ position: fixed;
152
+ border-radius: 999px;
153
+ filter: blur(42px);
154
+ opacity: 0.5;
155
+ pointer-events: none;
156
+ }
157
+
158
+ .fc-crash-orb--one {
159
+ width: 220px;
160
+ height: 220px;
161
+ top: 8vh;
162
+ left: -60px;
163
+ background: color-mix(in srgb, var(--fc-accent) 55%, transparent);
164
+ }
165
+
166
+ .fc-crash-orb--two {
167
+ width: 260px;
168
+ height: 260px;
169
+ right: -80px;
170
+ bottom: 6vh;
171
+ background: color-mix(in srgb, var(--fc-error) 42%, transparent);
172
+ }
173
+
174
+ .fc-crash-panel {
175
+ position: relative;
176
+ width: min(720px, 100%);
177
+ padding: 22px;
178
+ border-radius: 24px;
179
+ border: 1px solid var(--fc-border);
180
+ background: color-mix(in srgb, var(--fc-bgPanel) 88%, transparent);
181
+ box-shadow:
182
+ 0 24px 80px rgba(0, 0, 0, 0.28),
183
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
184
+ backdrop-filter: blur(18px);
185
+ -webkit-backdrop-filter: blur(18px);
186
+ }
187
+
188
+ .fc-crash-badge {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: 6px;
192
+ min-height: 28px;
193
+ padding: 0 10px;
194
+ margin-bottom: 16px;
195
+ border-radius: 999px;
196
+ background: color-mix(in srgb, var(--fc-errorBg) 76%, transparent);
197
+ border: 1px solid color-mix(in srgb, var(--fc-error) 34%, var(--fc-border));
198
+ color: var(--fc-error);
199
+ font-size: 12px;
200
+ font-weight: 700;
201
+ letter-spacing: 0.04em;
202
+ text-transform: uppercase;
203
+ }
204
+
205
+ .fc-crash-hero {
206
+ display: flex;
207
+ align-items: flex-start;
208
+ gap: 16px;
209
+ }
210
+
211
+ .fc-crash-icon {
212
+ width: 56px;
213
+ height: 56px;
214
+ border-radius: 18px;
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ flex-shrink: 0;
219
+ font-size: 28px;
220
+ background:
221
+ linear-gradient(135deg, color-mix(in srgb, var(--fc-error) 24%, transparent), color-mix(in srgb, var(--fc-accent) 18%, transparent)),
222
+ var(--fc-bg);
223
+ border: 1px solid color-mix(in srgb, var(--fc-error) 18%, var(--fc-border));
224
+ }
225
+
226
+ .fc-crash-title {
227
+ margin-bottom: 8px;
228
+ font-size: clamp(24px, 4vw, 32px);
229
+ line-height: 1.05;
230
+ font-weight: 800;
231
+ letter-spacing: -0.03em;
232
+ }
233
+
234
+ .fc-crash-copy {
235
+ max-width: 56ch;
236
+ color: var(--fc-textMuted);
237
+ font-size: 14px;
238
+ line-height: 1.6;
239
+ }
240
+
241
+ .fc-crash-error-card {
242
+ margin-top: 18px;
243
+ padding: 16px;
244
+ border-radius: 18px;
245
+ border: 1px solid color-mix(in srgb, var(--fc-error) 22%, var(--fc-border));
246
+ background: linear-gradient(180deg, color-mix(in srgb, var(--fc-errorBg) 80%, transparent), color-mix(in srgb, var(--fc-bgPanel) 82%, transparent));
247
+ }
248
+
249
+ .fc-crash-error-label {
250
+ margin-bottom: 6px;
251
+ color: var(--fc-textDim);
252
+ font-size: 11px;
253
+ font-weight: 700;
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.08em;
256
+ }
257
+
258
+ .fc-crash-error-message {
259
+ color: var(--fc-text);
260
+ font-size: 15px;
261
+ line-height: 1.55;
262
+ word-break: break-word;
263
+ }
264
+
265
+ .fc-crash-actions {
266
+ display: flex;
267
+ flex-wrap: wrap;
268
+ gap: 10px;
269
+ margin-top: 18px;
270
+ }
271
+
272
+ .fc-crash-btn {
273
+ min-height: 42px;
274
+ padding: 0 16px;
275
+ border-radius: 12px;
276
+ border: 1px solid var(--fc-border);
277
+ font-size: 14px;
278
+ font-weight: 700;
279
+ font-family: inherit;
280
+ cursor: pointer;
281
+ }
282
+
283
+ .fc-crash-btn--primary {
284
+ background: var(--fc-accent);
285
+ color: var(--fc-accentText);
286
+ border-color: var(--fc-accent);
287
+ }
288
+
289
+ .fc-crash-btn--secondary {
290
+ background: var(--fc-bgSurface);
291
+ color: var(--fc-text);
292
+ }
293
+
294
+ .fc-crash-btn--ghost {
295
+ background: transparent;
296
+ color: var(--fc-textMuted);
297
+ }
298
+
299
+ .fc-crash-editor-card {
300
+ margin-top: 18px;
301
+ padding: 16px;
302
+ border-radius: 20px;
303
+ border: 1px solid var(--fc-border);
304
+ background: color-mix(in srgb, var(--fc-bg) 84%, transparent);
305
+ }
306
+
307
+ .fc-crash-editor-header {
308
+ display: flex;
309
+ align-items: flex-start;
310
+ justify-content: space-between;
311
+ gap: 14px;
312
+ margin-bottom: 12px;
313
+ }
314
+
315
+ .fc-crash-editor-title {
316
+ margin-bottom: 4px;
317
+ font-size: 15px;
318
+ font-weight: 700;
319
+ }
320
+
321
+ .fc-crash-editor-copy {
322
+ color: var(--fc-textMuted);
323
+ font-size: 13px;
324
+ line-height: 1.5;
325
+ }
326
+
327
+ .fc-crash-editor-filepicker {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 6px;
331
+ min-width: min(220px, 100%);
332
+ color: var(--fc-textDim);
333
+ font-size: 12px;
334
+ font-weight: 700;
335
+ }
336
+
337
+ .fc-crash-editor-filepicker select {
338
+ min-height: 38px;
339
+ }
340
+
341
+ .fc-crash-editor {
342
+ width: 100%;
343
+ min-height: 250px;
344
+ padding: 14px;
345
+ border-radius: 16px;
346
+ border: 1px solid var(--fc-border);
347
+ background: var(--fc-bgInput);
348
+ color: var(--fc-text);
349
+ font-family:
350
+ ui-monospace,
351
+ SFMono-Regular,
352
+ Menlo,
353
+ Monaco,
354
+ Consolas,
355
+ Liberation Mono,
356
+ monospace;
357
+ font-size: 13px;
358
+ line-height: 1.55;
359
+ resize: vertical;
360
+ white-space: pre;
361
+ tab-size: 2;
362
+ }
363
+
364
+ .fc-crash-editor-note {
365
+ margin-top: 10px;
366
+ color: var(--fc-textDim);
367
+ font-size: 12px;
368
+ line-height: 1.5;
369
+ }
370
+
371
+ .fc-crash-run-error {
372
+ margin-top: 16px;
373
+ padding: 12px 14px;
374
+ border-radius: 14px;
375
+ background: color-mix(in srgb, var(--fc-errorBg) 60%, transparent);
376
+ border: 1px solid color-mix(in srgb, var(--fc-error) 20%, var(--fc-border));
377
+ color: var(--fc-textMuted);
378
+ font-size: 13px;
379
+ line-height: 1.5;
380
+ }
381
+
382
+ .fc-crash-details {
383
+ margin-top: 16px;
384
+ border-top: 1px solid var(--fc-border);
385
+ padding-top: 14px;
386
+ }
387
+
388
+ .fc-crash-details summary {
389
+ color: var(--fc-textMuted);
390
+ font-size: 13px;
391
+ font-weight: 700;
392
+ cursor: pointer;
393
+ user-select: none;
394
+ }
395
+
396
+ .fc-crash-details-pre {
397
+ margin: 12px 0 0;
398
+ padding: 14px;
399
+ border-radius: 14px;
400
+ border: 1px solid var(--fc-border);
401
+ background: color-mix(in srgb, var(--fc-bg) 88%, transparent);
402
+ color: var(--fc-textDim);
403
+ font-size: 12px;
404
+ line-height: 1.55;
405
+ white-space: pre-wrap;
406
+ word-break: break-word;
407
+ }
408
+
409
+ @media (max-width: 640px) {
410
+ .fc-crash-panel {
411
+ padding: 18px;
412
+ border-radius: 20px;
413
+ }
414
+
415
+ .fc-crash-hero,
416
+ .fc-crash-editor-header {
417
+ flex-direction: column;
418
+ }
419
+
420
+ .fc-crash-icon {
421
+ width: 48px;
422
+ height: 48px;
423
+ border-radius: 16px;
424
+ font-size: 24px;
425
+ }
426
+
427
+ .fc-crash-actions {
428
+ flex-direction: column;
429
+ }
430
+
431
+ .fc-crash-btn,
432
+ .fc-crash-editor-filepicker {
433
+ width: 100%;
434
+ }
435
+
436
+ .fc-crash-editor {
437
+ min-height: 220px;
438
+ }
439
+ }
440
+
134
441
  /* --- fc-icon-btn: Small icon-only button --- */
135
442
  .fc-icon-btn {
136
443
  padding: 4px;
@@ -552,6 +859,30 @@ input[type="color"]::-webkit-color-swatch {
552
859
  color: var(--fc-textDim);
553
860
  }
554
861
 
862
+ /* --- Theme toggle --- */
863
+ .fc-docs-theme-toggle {
864
+ display: flex;
865
+ align-items: center;
866
+ justify-content: center;
867
+ width: 32px;
868
+ height: 32px;
869
+ background: var(--fc-bgSurface);
870
+ border: 1px solid var(--fc-border);
871
+ border-radius: 6px;
872
+ color: var(--fc-textDim);
873
+ cursor: pointer;
874
+ transition: border-color 0.15s, color 0.15s;
875
+ }
876
+ .fc-docs-theme-toggle:hover {
877
+ border-color: var(--fc-accent);
878
+ color: var(--fc-textMuted);
879
+ }
880
+
881
+ /* --- Sidebar backdrop (mobile only, visible via media query) --- */
882
+ .fc-docs-sidebar-backdrop {
883
+ display: none;
884
+ }
885
+
555
886
  /* --- Sidebar --- */
556
887
  .fc-docs-sidebar {
557
888
  width: 260px;
@@ -564,6 +895,10 @@ input[type="color"]::-webkit-color-swatch {
564
895
  position: sticky;
565
896
  top: 56px;
566
897
  }
898
+ /* Desktop: hide sidebar when not open (not in flow) */
899
+ .fc-docs-sidebar:not(.open) {
900
+ display: none;
901
+ }
567
902
  .fc-docs-sidebar::-webkit-scrollbar {
568
903
  width: 4px;
569
904
  }
@@ -1062,6 +1397,15 @@ input[type="color"]::-webkit-color-swatch {
1062
1397
  color: var(--fc-textMuted);
1063
1398
  }
1064
1399
 
1400
+ /* --- TOC backdrop (mobile only, visible via media query) --- */
1401
+ .fc-docs-toc-backdrop {
1402
+ display: none;
1403
+ }
1404
+ /* --- TOC handle (mobile bottom sheet, hidden on desktop) --- */
1405
+ .fc-docs-toc-handle {
1406
+ display: none;
1407
+ }
1408
+
1065
1409
  /* --- On-this-page right sidebar --- */
1066
1410
  .fc-docs-toc {
1067
1411
  width: 220px;
@@ -1072,6 +1416,11 @@ input[type="color"]::-webkit-color-swatch {
1072
1416
  position: sticky;
1073
1417
  top: 56px;
1074
1418
  border-left: 1px solid var(--fc-border);
1419
+ background: var(--fc-bgPanel);
1420
+ }
1421
+ /* Desktop: hide TOC when not open */
1422
+ .fc-docs-toc:not(.open) {
1423
+ display: none;
1075
1424
  }
1076
1425
  .fc-docs-toc::-webkit-scrollbar {
1077
1426
  width: 4px;
@@ -1145,16 +1494,166 @@ input[type="color"]::-webkit-color-swatch {
1145
1494
  }
1146
1495
 
1147
1496
  /* --- Responsive ---
1148
- Sidebars are toggled via JS (initial state based on viewport width).
1149
- Only content padding and grid adjustments use media queries.
1497
+ Desktop (>900px): sidebars in normal flow, toggled via JS.
1498
+ Mobile (<=900px): sidebar = overlay from left, TOC = bottom sheet.
1150
1499
  */
1151
1500
  @media (max-width: 900px) {
1501
+ /* --- Prevent horizontal scroll --- */
1502
+ .fc-docs-layout {
1503
+ overflow-x: hidden;
1504
+ }
1505
+
1506
+ /* --- Compact nav --- */
1507
+ .fc-docs-nav {
1508
+ height: 48px;
1509
+ padding: 0 12px;
1510
+ }
1511
+ .fc-docs-nav-left { gap: 6px; min-width: 0; }
1512
+ .fc-docs-nav-links { gap: 8px; min-width: 0; }
1513
+ .fc-docs-nav-logo span:last-child { font-size: 14px; }
1514
+ .fc-docs-body { padding-top: 48px; }
1515
+ .fc-docs-main { height: calc(100vh - 48px); }
1516
+
1517
+ /* Hide text-based nav links — you're already on docs */
1518
+ .fc-docs-nav-active,
1519
+ .fc-docs-nav-link {
1520
+ display: none;
1521
+ }
1522
+
1523
+ /* Search trigger: icon only, hide label and kbd */
1524
+ .fc-docs-search-trigger span,
1525
+ .fc-docs-search-trigger kbd {
1526
+ display: none;
1527
+ }
1528
+ .fc-docs-search-trigger {
1529
+ padding: 5px 8px;
1530
+ min-width: 32px;
1531
+ justify-content: center;
1532
+ }
1533
+
1534
+ /* CTA button: compact */
1535
+ .fc-docs-nav-cta {
1536
+ padding: 5px 10px;
1537
+ font-size: 12px;
1538
+ }
1539
+
1540
+ /* --- Sidebar overlay mode --- */
1541
+ .fc-docs-sidebar-backdrop {
1542
+ display: block;
1543
+ position: fixed;
1544
+ inset: 0;
1545
+ background: rgba(0, 0, 0, 0.5);
1546
+ backdrop-filter: blur(2px);
1547
+ z-index: 150;
1548
+ opacity: 0;
1549
+ pointer-events: none;
1550
+ transition: opacity 0.2s ease;
1551
+ }
1552
+ .fc-docs-sidebar-backdrop.open {
1553
+ opacity: 1;
1554
+ pointer-events: auto;
1555
+ }
1556
+
1557
+ .fc-docs-sidebar,
1558
+ .fc-docs-sidebar:not(.open) {
1559
+ display: block; /* Override desktop display:none — mobile uses transform */
1560
+ position: fixed;
1561
+ top: 0;
1562
+ left: 0;
1563
+ bottom: 0;
1564
+ width: 280px;
1565
+ max-width: 85vw;
1566
+ height: 100vh;
1567
+ z-index: 160;
1568
+ transform: translateX(-100%);
1569
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1570
+ padding-top: 56px;
1571
+ -webkit-overflow-scrolling: touch;
1572
+ }
1573
+ .fc-docs-sidebar.open {
1574
+ transform: translateX(0);
1575
+ }
1576
+ /* Bigger tap targets on mobile */
1577
+ .fc-docs-sidebar-link {
1578
+ padding: 8px 20px 8px 24px;
1579
+ font-size: 14px;
1580
+ }
1581
+
1582
+ /* --- TOC bottom sheet mode --- */
1583
+ .fc-docs-toc-backdrop {
1584
+ display: block;
1585
+ position: fixed;
1586
+ inset: 0;
1587
+ background: rgba(0, 0, 0, 0.5);
1588
+ backdrop-filter: blur(2px);
1589
+ z-index: 150;
1590
+ opacity: 0;
1591
+ pointer-events: none;
1592
+ transition: opacity 0.2s ease;
1593
+ }
1594
+ .fc-docs-toc-backdrop.open {
1595
+ opacity: 1;
1596
+ pointer-events: auto;
1597
+ }
1598
+
1599
+ .fc-docs-toc,
1600
+ .fc-docs-toc:not(.open) {
1601
+ display: block; /* Override desktop display:none — mobile uses transform */
1602
+ position: fixed;
1603
+ bottom: 0;
1604
+ left: 0;
1605
+ right: 0;
1606
+ top: auto;
1607
+ width: 100%;
1608
+ max-height: 60vh;
1609
+ height: auto;
1610
+ border-left: none;
1611
+ border-top: 1px solid var(--fc-border);
1612
+ border-radius: 16px 16px 0 0;
1613
+ z-index: 160;
1614
+ transform: translateY(100%);
1615
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1616
+ padding: 12px 0 24px;
1617
+ -webkit-overflow-scrolling: touch;
1618
+ }
1619
+ .fc-docs-toc.open {
1620
+ transform: translateY(0);
1621
+ }
1622
+ .fc-docs-toc-handle {
1623
+ display: block;
1624
+ width: 36px;
1625
+ height: 4px;
1626
+ background: var(--fc-textDim);
1627
+ border-radius: 2px;
1628
+ margin: 0 auto 12px;
1629
+ }
1630
+ .fc-docs-toc-link {
1631
+ padding: 6px 20px;
1632
+ font-size: 14px;
1633
+ }
1634
+ .fc-docs-toc-link.indent {
1635
+ padding-left: 36px;
1636
+ font-size: 13px;
1637
+ }
1638
+
1639
+ /* --- Content adjustments --- */
1152
1640
  .fc-docs-content {
1153
1641
  padding: 20px 16px 60px;
1154
1642
  }
1643
+ .fc-docs-content h1 { font-size: 24px; }
1644
+ .fc-docs-content h2 { font-size: 18px; }
1645
+ /* Tables scroll horizontally instead of the page */
1646
+ .fc-docs-content .fc-docs-table {
1647
+ display: block;
1648
+ overflow-x: auto;
1649
+ -webkit-overflow-scrolling: touch;
1650
+ }
1651
+
1155
1652
  .fc-docs-index {
1156
1653
  padding: 20px 16px 60px;
1157
1654
  }
1655
+ .fc-docs-index-hero { padding: 24px 0 20px; }
1656
+ .fc-docs-index-hero h1 { font-size: 24px; }
1158
1657
  .fc-docs-index-grid {
1159
1658
  grid-template-columns: 1fr;
1160
1659
  }
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CyVd1D4D.css"])))=>i.map(i=>d[i]);
2
- import { _ as __vitePreload } from "./index-wTEK39at.js";
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-ay13WNfa.css"])))=>i.map(i=>d[i]);
2
+ import { _ as __vitePreload } from "./index-Pz321YAt.js";
3
3
  var Module = (() => {
4
4
  var _scriptName = import.meta.url;
5
5
  return (async function(moduleArg = {}) {
@@ -15,7 +15,7 @@ var Module = (() => {
15
15
  var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer";
16
16
  if (ENVIRONMENT_IS_NODE) {
17
17
  const { createRequire } = await __vitePreload(async () => {
18
- const { createRequire: createRequire2 } = await import("./index-wTEK39at.js").then((n) => n.am);
18
+ const { createRequire: createRequire2 } = await import("./index-Pz321YAt.js").then((n) => n.an);
19
19
  return { createRequire: createRequire2 };
20
20
  }, true ? __vite__mapDeps([0]) : void 0);
21
21
  var require2 = createRequire(import.meta.url);
@@ -12,7 +12,7 @@ var Module = (() => {
12
12
  var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined";
13
13
  var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer";
14
14
  if (ENVIRONMENT_IS_NODE) {
15
- const { createRequire } = await import("./reportWorker-DYcRHhv9.js").then(function(n) {
15
+ const { createRequire } = await import("./reportWorker-Dxr-5A7w.js").then(function(n) {
16
16
  return n._;
17
17
  });
18
18
  var require2 = createRequire(import.meta.url);
@@ -12,7 +12,7 @@ var Module = (() => {
12
12
  var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined";
13
13
  var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer";
14
14
  if (ENVIRONMENT_IS_NODE) {
15
- const { createRequire } = await import("./evalWorker-KoR0SNKq.js").then(function(n) {
15
+ const { createRequire } = await import("./evalWorker-C-hzNUMy.js").then(function(n) {
16
16
  return n._;
17
17
  });
18
18
  var require2 = createRequire(import.meta.url);