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
@@ -13,6 +13,20 @@
13
13
  font-family: system-ui, -apple-system, sans-serif;
14
14
  -webkit-tap-highlight-color: transparent;
15
15
  touch-action: manipulation;
16
+ -webkit-user-select: none;
17
+ user-select: none;
18
+ }
19
+
20
+ /* Allow text selection inside the code editor and text inputs */
21
+ .fc-mobile [data-fc-editor-surface="monaco"],
22
+ .fc-mobile [data-fc-editor-surface="monaco"] * {
23
+ -webkit-user-select: text;
24
+ user-select: text;
25
+ }
26
+ .fc-mobile input,
27
+ .fc-mobile textarea {
28
+ -webkit-user-select: text;
29
+ user-select: text;
16
30
  }
17
31
 
18
32
  /* ════════════════════════════════════
@@ -181,7 +195,9 @@
181
195
  backdrop-filter: blur(16px);
182
196
  -webkit-backdrop-filter: blur(16px);
183
197
  cursor: pointer;
184
- transition: background 0.2s, border-color 0.2s;
198
+ transition:
199
+ background 0.2s,
200
+ border-color 0.2s;
185
201
  }
186
202
 
187
203
  .fc-m-status-pill--ok {
@@ -209,8 +225,12 @@
209
225
  flex-shrink: 0;
210
226
  }
211
227
 
212
- .fc-m-status-pill--ok .fc-m-status-dot { background: #34d399; }
213
- .fc-m-status-pill--error .fc-m-status-dot { background: #ff4757; }
228
+ .fc-m-status-pill--ok .fc-m-status-dot {
229
+ background: #34d399;
230
+ }
231
+ .fc-m-status-pill--error .fc-m-status-dot {
232
+ background: #ff4757;
233
+ }
214
234
 
215
235
  .fc-m-status-divider {
216
236
  width: 1px;
@@ -219,8 +239,12 @@
219
239
  flex-shrink: 0;
220
240
  opacity: 0.3;
221
241
  }
222
- .fc-m-status-pill--ok .fc-m-status-divider { background: #34d399; }
223
- .fc-m-status-pill--error .fc-m-status-divider { background: #ff4757; }
242
+ .fc-m-status-pill--ok .fc-m-status-divider {
243
+ background: #34d399;
244
+ }
245
+ .fc-m-status-pill--error .fc-m-status-divider {
246
+ background: #ff4757;
247
+ }
224
248
 
225
249
  /* ════════════════════════════════════
226
250
  CORNER BUTTONS — top-right export
@@ -285,7 +309,9 @@
285
309
  mask-image: linear-gradient(90deg, transparent 0px, black 12px, black calc(100% - 12px), transparent 100%);
286
310
  }
287
311
 
288
- .fc-m-param-chips-wrap::-webkit-scrollbar { display: none; }
312
+ .fc-m-param-chips-wrap::-webkit-scrollbar {
313
+ display: none;
314
+ }
289
315
 
290
316
  .fc-m-param-chip {
291
317
  display: flex;
@@ -301,7 +327,9 @@
301
327
  white-space: nowrap;
302
328
  cursor: pointer;
303
329
  flex-shrink: 0;
304
- transition: background 0.1s, border-color 0.1s;
330
+ transition:
331
+ background 0.1s,
332
+ border-color 0.1s;
305
333
  }
306
334
 
307
335
  .fc-m-param-chip:active,
@@ -369,7 +397,9 @@
369
397
  padding: 0;
370
398
  }
371
399
 
372
- .fc-m-cmdbar-search-btn:active { opacity: 0.7; }
400
+ .fc-m-cmdbar-search-btn:active {
401
+ opacity: 0.7;
402
+ }
373
403
 
374
404
  .fc-m-cmdbar-search-icon {
375
405
  width: 15px;
@@ -477,8 +507,12 @@
477
507
  transition: opacity 0.15s;
478
508
  }
479
509
 
480
- .fc-m-cmdbar-run-btn:active { opacity: 0.8; }
481
- .fc-m-cmdbar-run-btn:disabled { opacity: 0.4; }
510
+ .fc-m-cmdbar-run-btn:active {
511
+ opacity: 0.8;
512
+ }
513
+ .fc-m-cmdbar-run-btn:disabled {
514
+ opacity: 0.4;
515
+ }
482
516
 
483
517
  .fc-m-cmdbar-run-btn svg {
484
518
  width: 13px;
@@ -642,55 +676,148 @@
642
676
  }
643
677
 
644
678
  /* ── highlight.js token colours — dark themes (default) ── */
645
- .fc-mobile-editor-highlight .hljs-keyword { color: #c586c0; }
646
- .fc-mobile-editor-highlight .hljs-string { color: #ce9178; }
647
- .fc-mobile-editor-highlight .hljs-number { color: #b5cea8; }
648
- .fc-mobile-editor-highlight .hljs-comment { color: #6a9955; font-style: italic; }
649
- .fc-mobile-editor-highlight .hljs-function { color: #dcdcaa; }
650
- .fc-mobile-editor-highlight .hljs-title { color: #dcdcaa; }
651
- .fc-mobile-editor-highlight .hljs-params { color: #9cdcfe; }
652
- .fc-mobile-editor-highlight .hljs-built_in { color: #4ec9b0; }
653
- .fc-mobile-editor-highlight .hljs-literal { color: #569cd6; }
654
- .fc-mobile-editor-highlight .hljs-attr { color: #9cdcfe; }
655
- .fc-mobile-editor-highlight .hljs-property { color: #9cdcfe; }
656
- .fc-mobile-editor-highlight .hljs-variable { color: #9cdcfe; }
657
- .fc-mobile-editor-highlight .hljs-regexp { color: #d16969; }
658
- .fc-mobile-editor-highlight .hljs-operator { color: #d4d4d4; }
659
- .fc-mobile-editor-highlight .hljs-punctuation { color: #d4d4d4; }
679
+ .fc-mobile-editor-highlight .hljs-keyword {
680
+ color: #c586c0;
681
+ }
682
+ .fc-mobile-editor-highlight .hljs-string {
683
+ color: #ce9178;
684
+ }
685
+ .fc-mobile-editor-highlight .hljs-number {
686
+ color: #b5cea8;
687
+ }
688
+ .fc-mobile-editor-highlight .hljs-comment {
689
+ color: #6a9955;
690
+ font-style: italic;
691
+ }
692
+ .fc-mobile-editor-highlight .hljs-function {
693
+ color: #dcdcaa;
694
+ }
695
+ .fc-mobile-editor-highlight .hljs-title {
696
+ color: #dcdcaa;
697
+ }
698
+ .fc-mobile-editor-highlight .hljs-params {
699
+ color: #9cdcfe;
700
+ }
701
+ .fc-mobile-editor-highlight .hljs-built_in {
702
+ color: #4ec9b0;
703
+ }
704
+ .fc-mobile-editor-highlight .hljs-literal {
705
+ color: #569cd6;
706
+ }
707
+ .fc-mobile-editor-highlight .hljs-attr {
708
+ color: #9cdcfe;
709
+ }
710
+ .fc-mobile-editor-highlight .hljs-property {
711
+ color: #9cdcfe;
712
+ }
713
+ .fc-mobile-editor-highlight .hljs-variable {
714
+ color: #9cdcfe;
715
+ }
716
+ .fc-mobile-editor-highlight .hljs-regexp {
717
+ color: #d16969;
718
+ }
719
+ .fc-mobile-editor-highlight .hljs-operator {
720
+ color: #d4d4d4;
721
+ }
722
+ .fc-mobile-editor-highlight .hljs-punctuation {
723
+ color: #d4d4d4;
724
+ }
660
725
 
661
726
  /* ── highlight.js token colours — light themes ── */
662
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-keyword { color: #af00db; }
663
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-string { color: #a31515; }
664
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-number { color: #098658; }
665
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-comment { color: #008000; font-style: italic; }
666
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-function { color: #795e26; }
667
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-title { color: #795e26; }
668
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-params { color: #001080; }
669
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-built_in { color: #267f99; }
670
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-literal { color: #0000ff; }
671
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-attr { color: #001080; }
672
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-property { color: #001080; }
673
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-variable { color: #001080; }
674
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-regexp { color: #811f3f; }
675
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-operator { color: #3b3b3b; }
676
- :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-punctuation { color: #3b3b3b; }
727
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-keyword {
728
+ color: #af00db;
729
+ }
730
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-string {
731
+ color: #a31515;
732
+ }
733
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-number {
734
+ color: #098658;
735
+ }
736
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-comment {
737
+ color: #008000;
738
+ font-style: italic;
739
+ }
740
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-function {
741
+ color: #795e26;
742
+ }
743
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-title {
744
+ color: #795e26;
745
+ }
746
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-params {
747
+ color: #001080;
748
+ }
749
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-built_in {
750
+ color: #267f99;
751
+ }
752
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-literal {
753
+ color: #0000ff;
754
+ }
755
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-attr {
756
+ color: #001080;
757
+ }
758
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-property {
759
+ color: #001080;
760
+ }
761
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-variable {
762
+ color: #001080;
763
+ }
764
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-regexp {
765
+ color: #811f3f;
766
+ }
767
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-operator {
768
+ color: #3b3b3b;
769
+ }
770
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-punctuation {
771
+ color: #3b3b3b;
772
+ }
677
773
 
678
774
  /* ── highlight.js token colours — kanagawa-lotus ── */
679
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-keyword { color: #c84053; }
680
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-string { color: #6f894e; }
681
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-number { color: #cc6d00; }
682
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-comment { color: #8a8980; font-style: italic; }
683
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-function { color: #4d699b; }
684
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-title { color: #4d699b; }
685
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-params { color: #545464; }
686
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-built_in { color: #597b8c; }
687
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-literal { color: #c84053; }
688
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-attr { color: #4d699b; }
689
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-property { color: #4d699b; }
690
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-variable { color: #545464; }
691
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-regexp { color: #c84053; }
692
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-operator { color: #766b6b; }
693
- :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-punctuation { color: #766b6b; }
775
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-keyword {
776
+ color: #c84053;
777
+ }
778
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-string {
779
+ color: #6f894e;
780
+ }
781
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-number {
782
+ color: #cc6d00;
783
+ }
784
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-comment {
785
+ color: #8a8980;
786
+ font-style: italic;
787
+ }
788
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-function {
789
+ color: #4d699b;
790
+ }
791
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-title {
792
+ color: #4d699b;
793
+ }
794
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-params {
795
+ color: #545464;
796
+ }
797
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-built_in {
798
+ color: #597b8c;
799
+ }
800
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-literal {
801
+ color: #c84053;
802
+ }
803
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-attr {
804
+ color: #4d699b;
805
+ }
806
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-property {
807
+ color: #4d699b;
808
+ }
809
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-variable {
810
+ color: #545464;
811
+ }
812
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-regexp {
813
+ color: #c84053;
814
+ }
815
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-operator {
816
+ color: #766b6b;
817
+ }
818
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-punctuation {
819
+ color: #766b6b;
820
+ }
694
821
 
695
822
  /* ════════════════════════════════════
696
823
  PARAM SCRUB ZONE
@@ -725,7 +852,7 @@
725
852
  }
726
853
 
727
854
  .fc-m-scrub-zone::before {
728
- content: '';
855
+ content: "";
729
856
  position: absolute;
730
857
  inset: 0;
731
858
  background-image: repeating-linear-gradient(
@@ -842,7 +969,9 @@
842
969
  color: var(--fc-accent);
843
970
  }
844
971
 
845
- .fc-m-scrub-spacer { flex: 1; }
972
+ .fc-m-scrub-spacer {
973
+ flex: 1;
974
+ }
846
975
 
847
976
  .fc-m-scrub-type-btn {
848
977
  display: flex;
@@ -881,6 +1010,144 @@
881
1010
  box-shadow: 0 2px 10px color-mix(in srgb, var(--fc-accent) 30%, transparent);
882
1011
  }
883
1012
 
1013
+ /* ── Choice sheet ── */
1014
+ .fc-m-choice-overlay {
1015
+ position: absolute;
1016
+ inset: 0;
1017
+ z-index: 60;
1018
+ display: flex;
1019
+ align-items: flex-end;
1020
+ background: rgba(0, 0, 0, 0.45);
1021
+ animation: fc-m-fade-in 0.12s ease-out;
1022
+ }
1023
+
1024
+ .fc-m-choice-sheet {
1025
+ width: 100%;
1026
+ max-height: 70vh;
1027
+ background: var(--fc-bgPanel);
1028
+ border-radius: 18px 18px 0 0;
1029
+ border-top: 1px solid var(--fc-border);
1030
+ padding: 8px 0 calc(12px + env(safe-area-inset-bottom, 0px));
1031
+ animation: fc-m-slide-up 0.18s cubic-bezier(0.25, 0.46, 0.45, 0.94);
1032
+ display: flex;
1033
+ flex-direction: column;
1034
+ }
1035
+
1036
+ .fc-m-choice-handle {
1037
+ width: 36px;
1038
+ height: 4px;
1039
+ border-radius: 999px;
1040
+ background: rgba(255, 255, 255, 0.15);
1041
+ margin: 0 auto 12px;
1042
+ }
1043
+
1044
+ .fc-m-choice-header {
1045
+ display: flex;
1046
+ align-items: flex-start;
1047
+ justify-content: space-between;
1048
+ gap: 12px;
1049
+ padding: 0 20px 12px;
1050
+ border-bottom: 1px solid var(--fc-border);
1051
+ }
1052
+
1053
+ .fc-m-choice-copy {
1054
+ min-width: 0;
1055
+ }
1056
+
1057
+ .fc-m-choice-eyebrow {
1058
+ font-size: 10px;
1059
+ font-weight: 700;
1060
+ color: var(--fc-textDim);
1061
+ text-transform: uppercase;
1062
+ letter-spacing: 0.7px;
1063
+ }
1064
+
1065
+ .fc-m-choice-title {
1066
+ font-size: 16px;
1067
+ font-weight: 700;
1068
+ color: var(--fc-text);
1069
+ margin-top: 2px;
1070
+ }
1071
+
1072
+ .fc-m-choice-subtitle {
1073
+ font-size: 12px;
1074
+ color: var(--fc-textMuted);
1075
+ margin-top: 4px;
1076
+ }
1077
+
1078
+ .fc-m-choice-done {
1079
+ flex-shrink: 0;
1080
+ height: 30px;
1081
+ padding: 0 12px;
1082
+ border-radius: 15px;
1083
+ border: 1px solid var(--fc-border);
1084
+ background: var(--fc-bgSurface, var(--fc-bgInput));
1085
+ color: var(--fc-textMuted);
1086
+ font-size: 12px;
1087
+ font-weight: 600;
1088
+ cursor: pointer;
1089
+ font-family: inherit;
1090
+ }
1091
+
1092
+ .fc-m-choice-list {
1093
+ overflow-y: auto;
1094
+ -webkit-overflow-scrolling: touch;
1095
+ }
1096
+
1097
+ .fc-m-choice-option {
1098
+ display: flex;
1099
+ align-items: center;
1100
+ justify-content: space-between;
1101
+ gap: 12px;
1102
+ width: 100%;
1103
+ padding: 16px 20px;
1104
+ border: none;
1105
+ border-bottom: 1px solid var(--fc-border);
1106
+ background: none;
1107
+ text-align: left;
1108
+ cursor: pointer;
1109
+ font-family: inherit;
1110
+ }
1111
+
1112
+ .fc-m-choice-option:active {
1113
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.04));
1114
+ }
1115
+
1116
+ .fc-m-choice-option--active {
1117
+ background: color-mix(in srgb, var(--fc-accent) 10%, transparent);
1118
+ }
1119
+
1120
+ .fc-m-choice-option-label {
1121
+ font-size: 15px;
1122
+ font-weight: 600;
1123
+ color: var(--fc-text);
1124
+ min-width: 0;
1125
+ }
1126
+
1127
+ .fc-m-choice-option-label--active {
1128
+ color: var(--fc-accent);
1129
+ }
1130
+
1131
+ .fc-m-choice-option-check {
1132
+ width: 20px;
1133
+ height: 20px;
1134
+ border-radius: 10px;
1135
+ border: 1px solid var(--fc-border);
1136
+ color: transparent;
1137
+ display: flex;
1138
+ align-items: center;
1139
+ justify-content: center;
1140
+ font-size: 12px;
1141
+ font-weight: 800;
1142
+ flex-shrink: 0;
1143
+ }
1144
+
1145
+ .fc-m-choice-option-check--active {
1146
+ background: var(--fc-accent);
1147
+ border-color: var(--fc-accent);
1148
+ color: #fff;
1149
+ }
1150
+
884
1151
  /* ── Type mode ── */
885
1152
  .fc-m-type-overlay {
886
1153
  position: absolute;
@@ -1080,7 +1347,9 @@
1080
1347
  line-height: 1.6;
1081
1348
  }
1082
1349
 
1083
- .fc-m-error-ctx-line { color: var(--fc-textDim); }
1350
+ .fc-m-error-ctx-line {
1351
+ color: var(--fc-textDim);
1352
+ }
1084
1353
  .fc-m-error-ctx-line--active {
1085
1354
  color: #ff8080;
1086
1355
  background: rgba(255, 71, 87, 0.08);
@@ -1146,11 +1415,18 @@
1146
1415
  font-family: inherit;
1147
1416
  }
1148
1417
 
1149
- .fc-mobile-filepicker-item:active { background: var(--fc-bgHover); }
1150
- .fc-mobile-filepicker-item[data-active="true"] { color: var(--fc-accent); font-weight: 600; }
1418
+ .fc-mobile-filepicker-item:active {
1419
+ background: var(--fc-bgHover);
1420
+ }
1421
+ .fc-mobile-filepicker-item[data-active="true"] {
1422
+ color: var(--fc-accent);
1423
+ font-weight: 600;
1424
+ }
1151
1425
 
1152
1426
  /* ── File picker: project section + new file ── */
1153
- .fc-m-filepicker-projects { padding: 4px 0 0; }
1427
+ .fc-m-filepicker-projects {
1428
+ padding: 4px 0 0;
1429
+ }
1154
1430
 
1155
1431
  .fc-m-filepicker-section-label {
1156
1432
  padding: 8px 16px 4px;
@@ -1182,7 +1458,9 @@
1182
1458
  border-radius: 6px;
1183
1459
  }
1184
1460
 
1185
- .fc-m-filepicker-new-btn:active { opacity: 0.7; }
1461
+ .fc-m-filepicker-new-btn:active {
1462
+ opacity: 0.7;
1463
+ }
1186
1464
 
1187
1465
  .fc-m-filepicker-new-row {
1188
1466
  display: flex;
@@ -1206,7 +1484,9 @@
1206
1484
  min-width: 0;
1207
1485
  }
1208
1486
 
1209
- .fc-m-filepicker-new-input:focus { border-color: var(--fc-accent); }
1487
+ .fc-m-filepicker-new-input:focus {
1488
+ border-color: var(--fc-accent);
1489
+ }
1210
1490
 
1211
1491
  .fc-m-filepicker-new-confirm {
1212
1492
  height: 38px;
@@ -1222,7 +1502,9 @@
1222
1502
  flex-shrink: 0;
1223
1503
  }
1224
1504
 
1225
- .fc-m-filepicker-new-confirm:disabled { opacity: 0.4; }
1505
+ .fc-m-filepicker-new-confirm:disabled {
1506
+ opacity: 0.4;
1507
+ }
1226
1508
 
1227
1509
  /* ── Cancel button in rename / new-file row ── */
1228
1510
  .fc-m-filepicker-cancel-btn {
@@ -1293,11 +1575,20 @@
1293
1575
  font-family: inherit;
1294
1576
  }
1295
1577
 
1296
- .fc-m-action-sheet-btn:last-child { border-bottom: none; }
1297
- .fc-m-action-sheet-btn:active { background: var(--fc-bgHover); }
1578
+ .fc-m-action-sheet-btn:last-child {
1579
+ border-bottom: none;
1580
+ }
1581
+ .fc-m-action-sheet-btn:active {
1582
+ background: var(--fc-bgHover);
1583
+ }
1298
1584
 
1299
- .fc-m-action-sheet-btn--danger { color: #e05252; }
1300
- .fc-m-action-sheet-btn--cancel { color: var(--fc-textDim); font-size: 15px; }
1585
+ .fc-m-action-sheet-btn--danger {
1586
+ color: #e05252;
1587
+ }
1588
+ .fc-m-action-sheet-btn--cancel {
1589
+ color: var(--fc-textDim);
1590
+ font-size: 15px;
1591
+ }
1301
1592
 
1302
1593
  .fc-m-action-sheet-divider {
1303
1594
  height: 6px;
@@ -1322,16 +1613,24 @@
1322
1613
  font-family: inherit;
1323
1614
  }
1324
1615
 
1325
- .fc-mobile-export-item:active { background: var(--fc-bgHover); }
1326
- .fc-mobile-export-item:disabled { opacity: 0.5; }
1616
+ .fc-mobile-export-item:active {
1617
+ background: var(--fc-bgHover);
1618
+ }
1619
+ .fc-mobile-export-item:disabled {
1620
+ opacity: 0.5;
1621
+ }
1327
1622
 
1328
1623
  /* ════════════════════════════════════
1329
1624
  JOINT CONTROLS (inside a sheet)
1330
1625
  ════════════════════════════════════ */
1331
1626
 
1332
- .fc-mobile-joints { padding: 4px 0 8px; }
1627
+ .fc-mobile-joints {
1628
+ padding: 4px 0 8px;
1629
+ }
1333
1630
 
1334
- .fc-mobile-joints-section { padding: 10px 16px; }
1631
+ .fc-mobile-joints-section {
1632
+ padding: 10px 16px;
1633
+ }
1335
1634
  .fc-mobile-joints-section + .fc-mobile-joints-section {
1336
1635
  border-top: 1px solid var(--fc-border);
1337
1636
  }
@@ -1387,7 +1686,9 @@
1387
1686
  color: #fff;
1388
1687
  }
1389
1688
 
1390
- .fc-mobile-joints-playbtn:disabled { opacity: 0.4; }
1689
+ .fc-mobile-joints-playbtn:disabled {
1690
+ opacity: 0.4;
1691
+ }
1391
1692
 
1392
1693
  .fc-mobile-joints-slider {
1393
1694
  flex: 1;
@@ -1409,7 +1710,9 @@
1409
1710
  margin-top: 4px;
1410
1711
  }
1411
1712
 
1412
- .fc-mobile-joint-item { margin-bottom: 8px; }
1713
+ .fc-mobile-joint-item {
1714
+ margin-bottom: 8px;
1715
+ }
1413
1716
 
1414
1717
  .fc-mobile-joint-header {
1415
1718
  display: flex;
@@ -1418,7 +1721,10 @@
1418
1721
  margin-bottom: 2px;
1419
1722
  }
1420
1723
 
1421
- .fc-mobile-joint-name { font-size: 12px; color: var(--fc-text); }
1724
+ .fc-mobile-joint-name {
1725
+ font-size: 12px;
1726
+ color: var(--fc-text);
1727
+ }
1422
1728
 
1423
1729
  .fc-mobile-joint-value {
1424
1730
  font-size: 11px;
@@ -1481,7 +1787,9 @@
1481
1787
  border-radius: 6px;
1482
1788
  }
1483
1789
 
1484
- .fc-mobile-cmdpal-back:active { background: var(--fc-bgHover); }
1790
+ .fc-mobile-cmdpal-back:active {
1791
+ background: var(--fc-bgHover);
1792
+ }
1485
1793
 
1486
1794
  .fc-mobile-cmdpal-close {
1487
1795
  background: none;
@@ -1517,7 +1825,9 @@
1517
1825
  min-width: 0;
1518
1826
  }
1519
1827
 
1520
- .fc-mobile-cmdpal-input::placeholder { color: var(--fc-textDim); }
1828
+ .fc-mobile-cmdpal-input::placeholder {
1829
+ color: var(--fc-textDim);
1830
+ }
1521
1831
 
1522
1832
  .fc-mobile-cmdpal-clear {
1523
1833
  display: flex;
@@ -1556,7 +1866,9 @@
1556
1866
  font-family: inherit;
1557
1867
  }
1558
1868
 
1559
- .fc-mobile-cmdpal-item:active { background: var(--fc-bgHover); }
1869
+ .fc-mobile-cmdpal-item:active {
1870
+ background: var(--fc-bgHover);
1871
+ }
1560
1872
 
1561
1873
  .fc-mobile-cmdpal-item-icon {
1562
1874
  font-size: 18px;
@@ -1599,12 +1911,16 @@
1599
1911
  ════════════════════════════════════ */
1600
1912
 
1601
1913
  @keyframes fc-m-spin {
1602
- to { transform: rotate(360deg); }
1914
+ to {
1915
+ transform: rotate(360deg);
1916
+ }
1603
1917
  }
1604
1918
 
1605
1919
  /* Keep old name for backward compat in existing components */
1606
1920
  @keyframes fc-mobile-spin {
1607
- to { transform: rotate(360deg); }
1921
+ to {
1922
+ transform: rotate(360deg);
1923
+ }
1608
1924
  }
1609
1925
 
1610
1926
  .fc-mobile-spinner {
@@ -1634,13 +1950,21 @@
1634
1950
  ════════════════════════════════════ */
1635
1951
 
1636
1952
  @keyframes fc-m-fade-in {
1637
- from { opacity: 0; }
1638
- to { opacity: 1; }
1953
+ from {
1954
+ opacity: 0;
1955
+ }
1956
+ to {
1957
+ opacity: 1;
1958
+ }
1639
1959
  }
1640
1960
 
1641
1961
  @keyframes fc-m-slide-up {
1642
- from { transform: translateY(100%); }
1643
- to { transform: translateY(0); }
1962
+ from {
1963
+ transform: translateY(100%);
1964
+ }
1965
+ to {
1966
+ transform: translateY(0);
1967
+ }
1644
1968
  }
1645
1969
 
1646
1970
  /* ════════════════════════════════════
@@ -1673,8 +1997,13 @@
1673
1997
  }
1674
1998
 
1675
1999
  @keyframes fc-m-pulse {
1676
- 0%, 100% { opacity: 1; }
1677
- 50% { opacity: 0.5; }
2000
+ 0%,
2001
+ 100% {
2002
+ opacity: 1;
2003
+ }
2004
+ 50% {
2005
+ opacity: 0.5;
2006
+ }
1678
2007
  }
1679
2008
 
1680
2009
  .fc-m-status-inline-spinner {
@@ -1960,7 +2289,7 @@
1960
2289
  }
1961
2290
 
1962
2291
  .fc-m-explorer-toggle::after {
1963
- content: '';
2292
+ content: "";
1964
2293
  position: absolute;
1965
2294
  top: 2px;
1966
2295
  left: 2px;
@@ -2281,6 +2610,49 @@
2281
2610
  font-weight: 500;
2282
2611
  }
2283
2612
 
2613
+ .fc-m-listsheet-choice-btn {
2614
+ display: flex;
2615
+ align-items: center;
2616
+ gap: 8px;
2617
+ width: 100%;
2618
+ padding: 10px 12px;
2619
+ border-radius: 10px;
2620
+ border: 1px solid var(--fc-border);
2621
+ background: var(--fc-bgSurface, var(--fc-bgInput));
2622
+ color: var(--fc-text);
2623
+ cursor: pointer;
2624
+ font-family: inherit;
2625
+ }
2626
+
2627
+ .fc-m-listsheet-choice-btn:active {
2628
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.04));
2629
+ }
2630
+
2631
+ .fc-m-listsheet-choice-name {
2632
+ flex: 1;
2633
+ min-width: 0;
2634
+ font-size: 11px;
2635
+ color: var(--fc-textMuted);
2636
+ font-weight: 500;
2637
+ text-align: left;
2638
+ }
2639
+
2640
+ .fc-m-listsheet-choice-value {
2641
+ font-size: 12px;
2642
+ font-weight: 700;
2643
+ color: var(--fc-accent);
2644
+ max-width: 50%;
2645
+ overflow: hidden;
2646
+ text-overflow: ellipsis;
2647
+ white-space: nowrap;
2648
+ }
2649
+
2650
+ .fc-m-listsheet-choice-chevron {
2651
+ font-size: 16px;
2652
+ line-height: 1;
2653
+ color: var(--fc-textDim);
2654
+ }
2655
+
2284
2656
  .fc-m-listsheet-scrub-slider {
2285
2657
  flex: 1;
2286
2658
  -webkit-appearance: none;