forgecad 0.6.3 → 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 (234) hide show
  1. package/README.md +3 -12
  2. package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.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-D3A_g8V3.js} +329 -163
  5. package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
  6. package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
  7. package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
  8. package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
  9. package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
  10. package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
  11. package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
  12. package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
  13. package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
  14. package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
  15. package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
  16. package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
  17. package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
  18. package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
  19. package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
  20. package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
  21. package/dist/docs/index.html +2 -2
  22. package/dist/docs-raw/CLI.md +341 -718
  23. package/dist/docs-raw/generated/assembly.md +699 -112
  24. package/dist/docs-raw/generated/concepts.md +1834 -1346
  25. package/dist/docs-raw/generated/core.md +1012 -1059
  26. package/dist/docs-raw/generated/curves.md +759 -116
  27. package/dist/docs-raw/generated/lib.md +43 -748
  28. package/dist/docs-raw/generated/output.md +139 -245
  29. package/dist/docs-raw/generated/sdf.md +208 -0
  30. package/dist/docs-raw/generated/sheet-metal.md +473 -21
  31. package/dist/docs-raw/generated/sketch.md +1518 -362
  32. package/dist/docs-raw/generated/viewport.md +368 -299
  33. package/dist/docs-raw/generated/wood.md +104 -0
  34. package/dist/index.html +2 -2
  35. package/dist/landing/proof-ams-adapter.png +0 -0
  36. package/dist/landing/proof-bolt-and-nut.png +0 -0
  37. package/dist/landing/proof-fillet-enclosure.png +0 -0
  38. package/dist/landing/proof-glasses.png +0 -0
  39. package/dist/landing/proof-gyroid.png +0 -0
  40. package/dist/sitemap.xml +6 -6
  41. package/dist-cli/forgecad.js +12321 -5700
  42. package/dist-cli/forgecad.js.map +1 -0
  43. package/dist-cli/solver-46FFSK2U.js +363 -0
  44. package/dist-cli/solver-46FFSK2U.js.map +1 -0
  45. package/dist-skill/CONTEXT.md +4890 -6302
  46. package/dist-skill/SKILL-dev.md +22 -66
  47. package/dist-skill/SKILL.md +20 -59
  48. package/dist-skill/docs/API/core/concepts.md +37 -92
  49. package/dist-skill/docs/CLI.md +341 -718
  50. package/dist-skill/docs/generated/assembly.md +699 -112
  51. package/dist-skill/docs/generated/core.md +1012 -1059
  52. package/dist-skill/docs/generated/curves.md +759 -116
  53. package/dist-skill/docs/generated/lib.md +43 -748
  54. package/dist-skill/docs/generated/output.md +139 -245
  55. package/dist-skill/docs/generated/sdf.md +208 -0
  56. package/dist-skill/docs/generated/sheet-metal.md +473 -21
  57. package/dist-skill/docs/generated/sketch.md +1518 -362
  58. package/dist-skill/docs/generated/viewport.md +368 -299
  59. package/dist-skill/docs/generated/wood.md +104 -0
  60. package/dist-skill/docs/guides/coordinate-system.md +11 -17
  61. package/dist-skill/docs/guides/geometry-conventions.md +13 -70
  62. package/dist-skill/docs/guides/joint-design.md +78 -0
  63. package/dist-skill/docs/guides/modeling-recipes.md +22 -195
  64. package/dist-skill/docs/guides/positioning.md +88 -147
  65. package/dist-skill/docs-dev/API/core/concepts.md +78 -0
  66. package/dist-skill/docs-dev/CLI.md +488 -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 +2 -4
  70. package/dist-skill/docs-dev/component-model.md +164 -0
  71. package/dist-skill/docs-dev/generated/assembly.md +779 -0
  72. package/dist-skill/docs-dev/generated/core.md +1676 -0
  73. package/dist-skill/docs-dev/generated/curves.md +855 -0
  74. package/dist-skill/docs-dev/generated/lib.md +55 -0
  75. package/dist-skill/docs-dev/generated/output.md +234 -0
  76. package/dist-skill/docs-dev/generated/sdf.md +208 -0
  77. package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
  78. package/dist-skill/docs-dev/generated/sketch.md +1753 -0
  79. package/dist-skill/docs-dev/generated/viewport.md +513 -0
  80. package/dist-skill/docs-dev/generated/wood.md +104 -0
  81. package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
  82. package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
  83. package/dist-skill/docs-dev/guides/joint-design.md +78 -0
  84. package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
  85. package/dist-skill/docs-dev/guides/positioning.md +151 -0
  86. package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
  87. package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
  88. package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
  89. package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
  90. package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
  91. package/examples/api/attachTo-basics.forge.js +8 -8
  92. package/examples/api/bill-of-materials.forge.js +9 -9
  93. package/examples/api/bolt-pattern.forge.js +5 -5
  94. package/examples/api/boolean-operations.forge.js +5 -5
  95. package/examples/api/bounding-box-visualizer.forge.js +3 -3
  96. package/examples/api/clone-duplicate.forge.js +2 -2
  97. package/examples/api/colors-union-vs-array.forge.js +6 -6
  98. package/examples/api/connector-assembly.forge.js +8 -6
  99. package/examples/api/connector-basics.forge.js +7 -7
  100. package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
  101. package/examples/api/elbow-test.forge.js +3 -3
  102. package/examples/api/extrude-options.forge.js +8 -14
  103. package/examples/api/feature-created-faces.forge.js +6 -10
  104. package/examples/api/fillet-showcase.forge.js +2 -2
  105. package/examples/api/folded-service-panel-cover.forge.js +2 -2
  106. package/examples/api/gears-tier1.forge.js +5 -5
  107. package/examples/api/group-test.forge.js +3 -3
  108. package/examples/api/group-vs-union.forge.js +1 -1
  109. package/examples/api/highlight-debug.forge.js +4 -0
  110. package/examples/api/js-module-pillars.js +1 -1
  111. package/examples/api/js-module-scene.js +2 -2
  112. package/examples/api/mesh-import-slats.forge.js +4 -4
  113. package/examples/api/patterns.forge.js +3 -3
  114. package/examples/api/pointAlong-orientation.forge.js +3 -3
  115. package/examples/api/profile-2020-b-slot6.forge.js +4 -5
  116. package/examples/api/route-perimeter-flange.forge.js +1 -1
  117. package/examples/api/sdf-rover-demo.forge.js +10 -10
  118. package/examples/api/sketch-on-face-demo.forge.js +2 -2
  119. package/examples/api/sketch-regions.forge.js +4 -4
  120. package/examples/api/sketch-rounding-strategies.forge.js +1 -1
  121. package/examples/api/smooth-curve-connections.forge.js +1 -1
  122. package/examples/api/transition-curves.forge.js +4 -4
  123. package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
  124. package/examples/api/variable-sweep-test.forge.js +2 -2
  125. package/examples/api/wood-joinery.forge.js +60 -0
  126. package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
  127. package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
  128. package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
  129. package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
  130. package/examples/constraints/03-redundant-constraints.forge.js +2 -2
  131. package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
  132. package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
  133. package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
  134. package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
  135. package/examples/constraints/09-stress-spiral.forge.js +1 -1
  136. package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
  137. package/examples/constraints/11-surface-grid.forge.js +2 -2
  138. package/examples/constraints/12-surface-nested.forge.js +4 -4
  139. package/examples/constraints/13-surface-complex.forge.js +1 -1
  140. package/examples/exact-arc-housing.forge.js +12 -0
  141. package/examples/experiments/drone-arm.forge.js +53 -0
  142. package/examples/furniture/adjustable-table.forge.js +15 -15
  143. package/examples/furniture/bathroom.forge.js +26 -26
  144. package/examples/furniture/chair.forge.js +13 -13
  145. package/examples/furniture/picture-frame.forge.js +6 -6
  146. package/examples/furniture/shoe-rack-doors.forge.js +8 -8
  147. package/examples/furniture/shoe-rack.forge.js +7 -7
  148. package/examples/furniture/table-lamp.forge.js +8 -8
  149. package/examples/gcode/lissajous-vase.forge.js +4 -4
  150. package/examples/gcode/math-surface.forge.js +3 -3
  151. package/examples/gcode/parametric-vase.forge.js +4 -4
  152. package/examples/gcode/spiral-tower.forge.js +4 -4
  153. package/examples/generative/crystal-growth.forge.js +9 -9
  154. package/examples/generative/frost-spires.forge.js +9 -9
  155. package/examples/generative/golden-spiral-tower.forge.js +11 -11
  156. package/examples/generative/molten-forge.forge.js +6 -6
  157. package/examples/generative/neon-coral.forge.js +7 -7
  158. package/examples/mechanical/3d-printer.forge.js +37 -37
  159. package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
  160. package/examples/mechanical/airplane-propeller.forge.js +9 -9
  161. package/examples/mechanical/bolt-and-nut.forge.js +10 -10
  162. package/examples/mechanical/door-with-hinges.forge.js +7 -7
  163. package/examples/mechanical/fillet-enclosure.forge.js +15 -11
  164. package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
  165. package/examples/mechanical/robot_hand.forge.js +24 -24
  166. package/examples/mechanical/robot_hand_2.forge.js +26 -26
  167. package/examples/nurbs-surface.forge.js +8 -0
  168. package/examples/nurbs-tube.forge.js +7 -0
  169. package/examples/products/bottle.forge.js +8 -8
  170. package/examples/products/chess-set.forge.js +25 -25
  171. package/examples/products/classical-piano.forge.js +20 -20
  172. package/examples/products/clock.forge.js +33 -33
  173. package/examples/products/cup.forge.js +5 -5
  174. package/examples/products/iphone.forge.js +20 -20
  175. package/examples/products/laptop.forge.js +24 -24
  176. package/examples/products/laser-cut-box.forge.js +6 -6
  177. package/examples/products/laser-cut-tray.forge.js +6 -6
  178. package/examples/products/liquid-soap-dispenser.forge.js +23 -23
  179. package/examples/products/origami-fish.forge.js +14 -12
  180. package/examples/products/spiderman-cake.forge.js +6 -6
  181. package/examples/shelf/container.forge.js +5 -5
  182. package/examples/shelf/shelf-unit.forge.js +6 -6
  183. package/examples/toolbox/bolted-joint.forge.js +7 -7
  184. package/package.json +9 -4
  185. package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
  186. package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
  187. package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
  188. package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
  189. package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
  190. package/dist/assets/index-1CYp3zUp.js +0 -1455
  191. package/dist-skill/docs/API/API.md +0 -1666
  192. package/dist-skill/docs/API/README.md +0 -37
  193. package/dist-skill/docs/API/assembly/assembly.md +0 -617
  194. package/dist-skill/docs/API/core/edge-queries.md +0 -130
  195. package/dist-skill/docs/API/core/parameters.md +0 -122
  196. package/dist-skill/docs/API/core/reserved-terms.md +0 -137
  197. package/dist-skill/docs/API/core/sdf.md +0 -326
  198. package/dist-skill/docs/API/core/skill-cli.md +0 -194
  199. package/dist-skill/docs/API/core/skill-guide.md +0 -205
  200. package/dist-skill/docs/API/core/specs.md +0 -186
  201. package/dist-skill/docs/API/core/topology.md +0 -372
  202. package/dist-skill/docs/API/entities.md +0 -268
  203. package/dist-skill/docs/API/output/bom.md +0 -58
  204. package/dist-skill/docs/API/output/brep-export.md +0 -87
  205. package/dist-skill/docs/API/output/dimensions.md +0 -67
  206. package/dist-skill/docs/API/output/export.md +0 -110
  207. package/dist-skill/docs/API/output/gcode.md +0 -195
  208. package/dist-skill/docs/API/runtime/viewport.md +0 -420
  209. package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
  210. package/dist-skill/docs/API/sketch/anchor.md +0 -37
  211. package/dist-skill/docs/API/sketch/booleans.md +0 -91
  212. package/dist-skill/docs/API/sketch/core.md +0 -73
  213. package/dist-skill/docs/API/sketch/extrude.md +0 -62
  214. package/dist-skill/docs/API/sketch/on-face.md +0 -104
  215. package/dist-skill/docs/API/sketch/operations.md +0 -78
  216. package/dist-skill/docs/API/sketch/path.md +0 -75
  217. package/dist-skill/docs/API/sketch/primitives.md +0 -146
  218. package/dist-skill/docs/API/sketch/regions.md +0 -80
  219. package/dist-skill/docs/API/sketch/text.md +0 -108
  220. package/dist-skill/docs/API/sketch/transforms.md +0 -65
  221. package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
  222. package/dist-skill/docs/INDEX.md +0 -94
  223. package/dist-skill/docs/RELEASING.md +0 -55
  224. package/dist-skill/docs/cli-monetization.md +0 -111
  225. package/dist-skill/docs/deployment.md +0 -281
  226. package/dist-skill/docs/generated/concepts.md +0 -2112
  227. package/dist-skill/docs/internals/shape-from-slices.md +0 -152
  228. package/dist-skill/docs/platform/admin.md +0 -45
  229. package/dist-skill/docs/platform/architecture.md +0 -79
  230. package/dist-skill/docs/platform/auth.md +0 -110
  231. package/dist-skill/docs/platform/email.md +0 -67
  232. package/dist-skill/docs/platform/projects.md +0 -111
  233. package/dist-skill/docs/platform/sharing.md +0 -90
  234. 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
  /* ════════════════════════════════════
@@ -44,7 +58,7 @@
44
58
 
45
59
  .fc-mobile-viewport-fabs {
46
60
  position: absolute;
47
- top: calc(env(safe-area-inset-top, 0px) + 60px);
61
+ top: calc(env(safe-area-inset-top, 0px) + 8px);
48
62
  right: 14px;
49
63
  display: flex;
50
64
  flex-direction: column;
@@ -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,50 +239,11 @@
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; }
224
-
225
- /* ════════════════════════════════════
226
- CORNER BUTTONS — top-right export
227
- ════════════════════════════════════ */
228
-
229
- .fc-m-corners {
230
- position: absolute;
231
- top: calc(env(safe-area-inset-top, 0px) + 8px);
232
- right: 14px;
233
- display: flex;
234
- flex-direction: column;
235
- gap: 8px;
236
- z-index: 30;
237
- }
238
-
239
- .fc-m-corner-btn {
240
- width: 38px;
241
- height: 38px;
242
- border-radius: 11px;
243
- background: color-mix(in srgb, var(--fc-bgPanel) 88%, transparent);
244
- backdrop-filter: blur(16px);
245
- -webkit-backdrop-filter: blur(16px);
246
- border: 1px solid var(--fc-border);
247
- display: flex;
248
- align-items: center;
249
- justify-content: center;
250
- cursor: pointer;
251
- color: var(--fc-textMuted);
252
- }
253
-
254
- .fc-m-corner-btn:active {
255
- background: var(--fc-bgHover);
242
+ .fc-m-status-pill--ok .fc-m-status-divider {
243
+ background: #34d399;
256
244
  }
257
-
258
- .fc-m-corner-btn svg {
259
- width: 16px;
260
- height: 16px;
261
- stroke: currentColor;
262
- fill: none;
263
- stroke-width: 2;
264
- stroke-linecap: round;
265
- stroke-linejoin: round;
245
+ .fc-m-status-pill--error .fc-m-status-divider {
246
+ background: #ff4757;
266
247
  }
267
248
 
268
249
  /* ════════════════════════════════════
@@ -285,7 +266,9 @@
285
266
  mask-image: linear-gradient(90deg, transparent 0px, black 12px, black calc(100% - 12px), transparent 100%);
286
267
  }
287
268
 
288
- .fc-m-param-chips-wrap::-webkit-scrollbar { display: none; }
269
+ .fc-m-param-chips-wrap::-webkit-scrollbar {
270
+ display: none;
271
+ }
289
272
 
290
273
  .fc-m-param-chip {
291
274
  display: flex;
@@ -301,7 +284,9 @@
301
284
  white-space: nowrap;
302
285
  cursor: pointer;
303
286
  flex-shrink: 0;
304
- transition: background 0.1s, border-color 0.1s;
287
+ transition:
288
+ background 0.1s,
289
+ border-color 0.1s;
305
290
  }
306
291
 
307
292
  .fc-m-param-chip:active,
@@ -369,7 +354,9 @@
369
354
  padding: 0;
370
355
  }
371
356
 
372
- .fc-m-cmdbar-search-btn:active { opacity: 0.7; }
357
+ .fc-m-cmdbar-search-btn:active {
358
+ opacity: 0.7;
359
+ }
373
360
 
374
361
  .fc-m-cmdbar-search-icon {
375
362
  width: 15px;
@@ -409,14 +396,23 @@
409
396
  }
410
397
 
411
398
  .fc-m-cmdbar-filename {
399
+ display: flex;
400
+ align-items: center;
401
+ gap: 6px;
412
402
  font-size: 13px;
413
403
  color: var(--fc-textMuted);
414
- white-space: nowrap;
415
- overflow: hidden;
416
- text-overflow: ellipsis;
417
404
  width: 100%;
418
405
  font-weight: 500;
419
406
  line-height: 1.3;
407
+ min-width: 0;
408
+ }
409
+
410
+ .fc-m-cmdbar-filename-text {
411
+ flex: 1;
412
+ min-width: 0;
413
+ white-space: nowrap;
414
+ overflow: hidden;
415
+ text-overflow: ellipsis;
420
416
  }
421
417
 
422
418
  /* Legacy — keep for any old references */
@@ -477,8 +473,12 @@
477
473
  transition: opacity 0.15s;
478
474
  }
479
475
 
480
- .fc-m-cmdbar-run-btn:active { opacity: 0.8; }
481
- .fc-m-cmdbar-run-btn:disabled { opacity: 0.4; }
476
+ .fc-m-cmdbar-run-btn:active {
477
+ opacity: 0.8;
478
+ }
479
+ .fc-m-cmdbar-run-btn:disabled {
480
+ opacity: 0.4;
481
+ }
482
482
 
483
483
  .fc-m-cmdbar-run-btn svg {
484
484
  width: 13px;
@@ -642,55 +642,148 @@
642
642
  }
643
643
 
644
644
  /* ── 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; }
645
+ .fc-mobile-editor-highlight .hljs-keyword {
646
+ color: #c586c0;
647
+ }
648
+ .fc-mobile-editor-highlight .hljs-string {
649
+ color: #ce9178;
650
+ }
651
+ .fc-mobile-editor-highlight .hljs-number {
652
+ color: #b5cea8;
653
+ }
654
+ .fc-mobile-editor-highlight .hljs-comment {
655
+ color: #6a9955;
656
+ font-style: italic;
657
+ }
658
+ .fc-mobile-editor-highlight .hljs-function {
659
+ color: #dcdcaa;
660
+ }
661
+ .fc-mobile-editor-highlight .hljs-title {
662
+ color: #dcdcaa;
663
+ }
664
+ .fc-mobile-editor-highlight .hljs-params {
665
+ color: #9cdcfe;
666
+ }
667
+ .fc-mobile-editor-highlight .hljs-built_in {
668
+ color: #4ec9b0;
669
+ }
670
+ .fc-mobile-editor-highlight .hljs-literal {
671
+ color: #569cd6;
672
+ }
673
+ .fc-mobile-editor-highlight .hljs-attr {
674
+ color: #9cdcfe;
675
+ }
676
+ .fc-mobile-editor-highlight .hljs-property {
677
+ color: #9cdcfe;
678
+ }
679
+ .fc-mobile-editor-highlight .hljs-variable {
680
+ color: #9cdcfe;
681
+ }
682
+ .fc-mobile-editor-highlight .hljs-regexp {
683
+ color: #d16969;
684
+ }
685
+ .fc-mobile-editor-highlight .hljs-operator {
686
+ color: #d4d4d4;
687
+ }
688
+ .fc-mobile-editor-highlight .hljs-punctuation {
689
+ color: #d4d4d4;
690
+ }
660
691
 
661
692
  /* ── 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; }
693
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-keyword {
694
+ color: #af00db;
695
+ }
696
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-string {
697
+ color: #a31515;
698
+ }
699
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-number {
700
+ color: #098658;
701
+ }
702
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-comment {
703
+ color: #008000;
704
+ font-style: italic;
705
+ }
706
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-function {
707
+ color: #795e26;
708
+ }
709
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-title {
710
+ color: #795e26;
711
+ }
712
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-params {
713
+ color: #001080;
714
+ }
715
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-built_in {
716
+ color: #267f99;
717
+ }
718
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-literal {
719
+ color: #0000ff;
720
+ }
721
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-attr {
722
+ color: #001080;
723
+ }
724
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-property {
725
+ color: #001080;
726
+ }
727
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-variable {
728
+ color: #001080;
729
+ }
730
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-regexp {
731
+ color: #811f3f;
732
+ }
733
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-operator {
734
+ color: #3b3b3b;
735
+ }
736
+ :root[data-fc-theme="light"] .fc-mobile-editor-highlight .hljs-punctuation {
737
+ color: #3b3b3b;
738
+ }
677
739
 
678
740
  /* ── 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; }
741
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-keyword {
742
+ color: #c84053;
743
+ }
744
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-string {
745
+ color: #6f894e;
746
+ }
747
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-number {
748
+ color: #cc6d00;
749
+ }
750
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-comment {
751
+ color: #8a8980;
752
+ font-style: italic;
753
+ }
754
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-function {
755
+ color: #4d699b;
756
+ }
757
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-title {
758
+ color: #4d699b;
759
+ }
760
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-params {
761
+ color: #545464;
762
+ }
763
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-built_in {
764
+ color: #597b8c;
765
+ }
766
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-literal {
767
+ color: #c84053;
768
+ }
769
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-attr {
770
+ color: #4d699b;
771
+ }
772
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-property {
773
+ color: #4d699b;
774
+ }
775
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-variable {
776
+ color: #545464;
777
+ }
778
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-regexp {
779
+ color: #c84053;
780
+ }
781
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-operator {
782
+ color: #766b6b;
783
+ }
784
+ :root[data-fc-theme="kanagawa-lotus"] .fc-mobile-editor-highlight .hljs-punctuation {
785
+ color: #766b6b;
786
+ }
694
787
 
695
788
  /* ════════════════════════════════════
696
789
  PARAM SCRUB ZONE
@@ -725,7 +818,7 @@
725
818
  }
726
819
 
727
820
  .fc-m-scrub-zone::before {
728
- content: '';
821
+ content: "";
729
822
  position: absolute;
730
823
  inset: 0;
731
824
  background-image: repeating-linear-gradient(
@@ -842,7 +935,9 @@
842
935
  color: var(--fc-accent);
843
936
  }
844
937
 
845
- .fc-m-scrub-spacer { flex: 1; }
938
+ .fc-m-scrub-spacer {
939
+ flex: 1;
940
+ }
846
941
 
847
942
  .fc-m-scrub-type-btn {
848
943
  display: flex;
@@ -881,6 +976,144 @@
881
976
  box-shadow: 0 2px 10px color-mix(in srgb, var(--fc-accent) 30%, transparent);
882
977
  }
883
978
 
979
+ /* ── Choice sheet ── */
980
+ .fc-m-choice-overlay {
981
+ position: absolute;
982
+ inset: 0;
983
+ z-index: 60;
984
+ display: flex;
985
+ align-items: flex-end;
986
+ background: rgba(0, 0, 0, 0.45);
987
+ animation: fc-m-fade-in 0.12s ease-out;
988
+ }
989
+
990
+ .fc-m-choice-sheet {
991
+ width: 100%;
992
+ max-height: 70vh;
993
+ background: var(--fc-bgPanel);
994
+ border-radius: 18px 18px 0 0;
995
+ border-top: 1px solid var(--fc-border);
996
+ padding: 8px 0 calc(12px + env(safe-area-inset-bottom, 0px));
997
+ animation: fc-m-slide-up 0.18s cubic-bezier(0.25, 0.46, 0.45, 0.94);
998
+ display: flex;
999
+ flex-direction: column;
1000
+ }
1001
+
1002
+ .fc-m-choice-handle {
1003
+ width: 36px;
1004
+ height: 4px;
1005
+ border-radius: 999px;
1006
+ background: rgba(255, 255, 255, 0.15);
1007
+ margin: 0 auto 12px;
1008
+ }
1009
+
1010
+ .fc-m-choice-header {
1011
+ display: flex;
1012
+ align-items: flex-start;
1013
+ justify-content: space-between;
1014
+ gap: 12px;
1015
+ padding: 0 20px 12px;
1016
+ border-bottom: 1px solid var(--fc-border);
1017
+ }
1018
+
1019
+ .fc-m-choice-copy {
1020
+ min-width: 0;
1021
+ }
1022
+
1023
+ .fc-m-choice-eyebrow {
1024
+ font-size: 10px;
1025
+ font-weight: 700;
1026
+ color: var(--fc-textDim);
1027
+ text-transform: uppercase;
1028
+ letter-spacing: 0.7px;
1029
+ }
1030
+
1031
+ .fc-m-choice-title {
1032
+ font-size: 16px;
1033
+ font-weight: 700;
1034
+ color: var(--fc-text);
1035
+ margin-top: 2px;
1036
+ }
1037
+
1038
+ .fc-m-choice-subtitle {
1039
+ font-size: 12px;
1040
+ color: var(--fc-textMuted);
1041
+ margin-top: 4px;
1042
+ }
1043
+
1044
+ .fc-m-choice-done {
1045
+ flex-shrink: 0;
1046
+ height: 30px;
1047
+ padding: 0 12px;
1048
+ border-radius: 15px;
1049
+ border: 1px solid var(--fc-border);
1050
+ background: var(--fc-bgSurface, var(--fc-bgInput));
1051
+ color: var(--fc-textMuted);
1052
+ font-size: 12px;
1053
+ font-weight: 600;
1054
+ cursor: pointer;
1055
+ font-family: inherit;
1056
+ }
1057
+
1058
+ .fc-m-choice-list {
1059
+ overflow-y: auto;
1060
+ -webkit-overflow-scrolling: touch;
1061
+ }
1062
+
1063
+ .fc-m-choice-option {
1064
+ display: flex;
1065
+ align-items: center;
1066
+ justify-content: space-between;
1067
+ gap: 12px;
1068
+ width: 100%;
1069
+ padding: 16px 20px;
1070
+ border: none;
1071
+ border-bottom: 1px solid var(--fc-border);
1072
+ background: none;
1073
+ text-align: left;
1074
+ cursor: pointer;
1075
+ font-family: inherit;
1076
+ }
1077
+
1078
+ .fc-m-choice-option:active {
1079
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.04));
1080
+ }
1081
+
1082
+ .fc-m-choice-option--active {
1083
+ background: color-mix(in srgb, var(--fc-accent) 10%, transparent);
1084
+ }
1085
+
1086
+ .fc-m-choice-option-label {
1087
+ font-size: 15px;
1088
+ font-weight: 600;
1089
+ color: var(--fc-text);
1090
+ min-width: 0;
1091
+ }
1092
+
1093
+ .fc-m-choice-option-label--active {
1094
+ color: var(--fc-accent);
1095
+ }
1096
+
1097
+ .fc-m-choice-option-check {
1098
+ width: 20px;
1099
+ height: 20px;
1100
+ border-radius: 10px;
1101
+ border: 1px solid var(--fc-border);
1102
+ color: transparent;
1103
+ display: flex;
1104
+ align-items: center;
1105
+ justify-content: center;
1106
+ font-size: 12px;
1107
+ font-weight: 800;
1108
+ flex-shrink: 0;
1109
+ }
1110
+
1111
+ .fc-m-choice-option-check--active {
1112
+ background: var(--fc-accent);
1113
+ border-color: var(--fc-accent);
1114
+ color: #fff;
1115
+ }
1116
+
884
1117
  /* ── Type mode ── */
885
1118
  .fc-m-type-overlay {
886
1119
  position: absolute;
@@ -1080,7 +1313,9 @@
1080
1313
  line-height: 1.6;
1081
1314
  }
1082
1315
 
1083
- .fc-m-error-ctx-line { color: var(--fc-textDim); }
1316
+ .fc-m-error-ctx-line {
1317
+ color: var(--fc-textDim);
1318
+ }
1084
1319
  .fc-m-error-ctx-line--active {
1085
1320
  color: #ff8080;
1086
1321
  background: rgba(255, 71, 87, 0.08);
@@ -1146,11 +1381,131 @@
1146
1381
  font-family: inherit;
1147
1382
  }
1148
1383
 
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; }
1384
+ .fc-mobile-filepicker-item:active {
1385
+ background: var(--fc-bgHover);
1386
+ }
1387
+ .fc-mobile-filepicker-item[data-active="true"] {
1388
+ color: var(--fc-accent);
1389
+ font-weight: 600;
1390
+ }
1391
+
1392
+ /* ── Share sheet ── */
1393
+ .fc-m-share-sheet {
1394
+ max-height: 78vh;
1395
+ }
1396
+
1397
+ .fc-m-share-section {
1398
+ padding: 14px 16px;
1399
+ border-bottom: 1px solid var(--fc-border);
1400
+ }
1401
+
1402
+ .fc-m-share-section:last-child {
1403
+ border-bottom: none;
1404
+ }
1405
+
1406
+ .fc-m-share-label {
1407
+ margin-bottom: 8px;
1408
+ font-size: 11px;
1409
+ font-weight: 700;
1410
+ color: var(--fc-textDim);
1411
+ text-transform: uppercase;
1412
+ letter-spacing: 0.6px;
1413
+ }
1414
+
1415
+ .fc-m-share-card {
1416
+ display: block;
1417
+ width: 100%;
1418
+ padding: 14px;
1419
+ background: var(--fc-bgCard, var(--fc-bgInput, var(--fc-bg)));
1420
+ border: 1px solid var(--fc-border);
1421
+ border-radius: 12px;
1422
+ color: var(--fc-text);
1423
+ text-align: left;
1424
+ cursor: pointer;
1425
+ font-family: inherit;
1426
+ }
1427
+
1428
+ .fc-m-share-card:active {
1429
+ background: var(--fc-bgHover);
1430
+ }
1431
+
1432
+ .fc-m-share-card-title {
1433
+ display: block;
1434
+ font-size: 14px;
1435
+ font-weight: 600;
1436
+ }
1437
+
1438
+ .fc-m-share-card-desc {
1439
+ display: block;
1440
+ margin-top: 4px;
1441
+ font-size: 12px;
1442
+ line-height: 1.4;
1443
+ color: var(--fc-textDim);
1444
+ }
1445
+
1446
+ .fc-m-share-url {
1447
+ width: 100%;
1448
+ padding: 11px 12px;
1449
+ background: var(--fc-bgCard, var(--fc-bgInput, var(--fc-bg)));
1450
+ border: 1px solid var(--fc-border);
1451
+ border-radius: 10px;
1452
+ color: var(--fc-text);
1453
+ font-size: 12px;
1454
+ font-family: var(--fc-mono, "SF Mono", "Menlo", monospace);
1455
+ box-sizing: border-box;
1456
+ }
1457
+
1458
+ .fc-m-share-meta,
1459
+ .fc-m-share-note {
1460
+ margin-top: 10px;
1461
+ font-size: 12px;
1462
+ line-height: 1.4;
1463
+ color: var(--fc-textDim);
1464
+ }
1465
+
1466
+ .fc-m-share-actions {
1467
+ display: grid;
1468
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1469
+ gap: 8px;
1470
+ margin-top: 10px;
1471
+ }
1472
+
1473
+ .fc-m-share-btn {
1474
+ min-width: 0;
1475
+ height: 38px;
1476
+ padding: 0 12px;
1477
+ border-radius: 10px;
1478
+ background: var(--fc-bgCard, var(--fc-bgInput, var(--fc-bg)));
1479
+ border: 1px solid var(--fc-border);
1480
+ color: var(--fc-text);
1481
+ font-size: 13px;
1482
+ font-weight: 600;
1483
+ cursor: pointer;
1484
+ font-family: inherit;
1485
+ }
1486
+
1487
+ .fc-m-share-btn:active {
1488
+ background: var(--fc-bgHover);
1489
+ }
1490
+
1491
+ .fc-m-share-btn--primary {
1492
+ background: color-mix(in srgb, var(--fc-accent) 14%, transparent);
1493
+ border-color: color-mix(in srgb, var(--fc-accent) 28%, transparent);
1494
+ color: var(--fc-accent);
1495
+ }
1496
+
1497
+ .fc-m-share-btn--danger {
1498
+ color: var(--fc-error, #e74c3c);
1499
+ }
1500
+
1501
+ .fc-m-share-btn--full {
1502
+ grid-column: 1 / -1;
1503
+ }
1151
1504
 
1152
1505
  /* ── File picker: project section + new file ── */
1153
- .fc-m-filepicker-projects { padding: 4px 0 0; }
1506
+ .fc-m-filepicker-projects {
1507
+ padding: 4px 0 0;
1508
+ }
1154
1509
 
1155
1510
  .fc-m-filepicker-section-label {
1156
1511
  padding: 8px 16px 4px;
@@ -1182,7 +1537,9 @@
1182
1537
  border-radius: 6px;
1183
1538
  }
1184
1539
 
1185
- .fc-m-filepicker-new-btn:active { opacity: 0.7; }
1540
+ .fc-m-filepicker-new-btn:active {
1541
+ opacity: 0.7;
1542
+ }
1186
1543
 
1187
1544
  .fc-m-filepicker-new-row {
1188
1545
  display: flex;
@@ -1206,7 +1563,9 @@
1206
1563
  min-width: 0;
1207
1564
  }
1208
1565
 
1209
- .fc-m-filepicker-new-input:focus { border-color: var(--fc-accent); }
1566
+ .fc-m-filepicker-new-input:focus {
1567
+ border-color: var(--fc-accent);
1568
+ }
1210
1569
 
1211
1570
  .fc-m-filepicker-new-confirm {
1212
1571
  height: 38px;
@@ -1222,7 +1581,9 @@
1222
1581
  flex-shrink: 0;
1223
1582
  }
1224
1583
 
1225
- .fc-m-filepicker-new-confirm:disabled { opacity: 0.4; }
1584
+ .fc-m-filepicker-new-confirm:disabled {
1585
+ opacity: 0.4;
1586
+ }
1226
1587
 
1227
1588
  /* ── Cancel button in rename / new-file row ── */
1228
1589
  .fc-m-filepicker-cancel-btn {
@@ -1293,11 +1654,20 @@
1293
1654
  font-family: inherit;
1294
1655
  }
1295
1656
 
1296
- .fc-m-action-sheet-btn:last-child { border-bottom: none; }
1297
- .fc-m-action-sheet-btn:active { background: var(--fc-bgHover); }
1657
+ .fc-m-action-sheet-btn:last-child {
1658
+ border-bottom: none;
1659
+ }
1660
+ .fc-m-action-sheet-btn:active {
1661
+ background: var(--fc-bgHover);
1662
+ }
1298
1663
 
1299
- .fc-m-action-sheet-btn--danger { color: #e05252; }
1300
- .fc-m-action-sheet-btn--cancel { color: var(--fc-textDim); font-size: 15px; }
1664
+ .fc-m-action-sheet-btn--danger {
1665
+ color: #e05252;
1666
+ }
1667
+ .fc-m-action-sheet-btn--cancel {
1668
+ color: var(--fc-textDim);
1669
+ font-size: 15px;
1670
+ }
1301
1671
 
1302
1672
  .fc-m-action-sheet-divider {
1303
1673
  height: 6px;
@@ -1322,16 +1692,24 @@
1322
1692
  font-family: inherit;
1323
1693
  }
1324
1694
 
1325
- .fc-mobile-export-item:active { background: var(--fc-bgHover); }
1326
- .fc-mobile-export-item:disabled { opacity: 0.5; }
1695
+ .fc-mobile-export-item:active {
1696
+ background: var(--fc-bgHover);
1697
+ }
1698
+ .fc-mobile-export-item:disabled {
1699
+ opacity: 0.5;
1700
+ }
1327
1701
 
1328
1702
  /* ════════════════════════════════════
1329
1703
  JOINT CONTROLS (inside a sheet)
1330
1704
  ════════════════════════════════════ */
1331
1705
 
1332
- .fc-mobile-joints { padding: 4px 0 8px; }
1706
+ .fc-mobile-joints {
1707
+ padding: 4px 0 8px;
1708
+ }
1333
1709
 
1334
- .fc-mobile-joints-section { padding: 10px 16px; }
1710
+ .fc-mobile-joints-section {
1711
+ padding: 10px 16px;
1712
+ }
1335
1713
  .fc-mobile-joints-section + .fc-mobile-joints-section {
1336
1714
  border-top: 1px solid var(--fc-border);
1337
1715
  }
@@ -1387,7 +1765,9 @@
1387
1765
  color: #fff;
1388
1766
  }
1389
1767
 
1390
- .fc-mobile-joints-playbtn:disabled { opacity: 0.4; }
1768
+ .fc-mobile-joints-playbtn:disabled {
1769
+ opacity: 0.4;
1770
+ }
1391
1771
 
1392
1772
  .fc-mobile-joints-slider {
1393
1773
  flex: 1;
@@ -1409,7 +1789,9 @@
1409
1789
  margin-top: 4px;
1410
1790
  }
1411
1791
 
1412
- .fc-mobile-joint-item { margin-bottom: 8px; }
1792
+ .fc-mobile-joint-item {
1793
+ margin-bottom: 8px;
1794
+ }
1413
1795
 
1414
1796
  .fc-mobile-joint-header {
1415
1797
  display: flex;
@@ -1418,7 +1800,10 @@
1418
1800
  margin-bottom: 2px;
1419
1801
  }
1420
1802
 
1421
- .fc-mobile-joint-name { font-size: 12px; color: var(--fc-text); }
1803
+ .fc-mobile-joint-name {
1804
+ font-size: 12px;
1805
+ color: var(--fc-text);
1806
+ }
1422
1807
 
1423
1808
  .fc-mobile-joint-value {
1424
1809
  font-size: 11px;
@@ -1481,7 +1866,9 @@
1481
1866
  border-radius: 6px;
1482
1867
  }
1483
1868
 
1484
- .fc-mobile-cmdpal-back:active { background: var(--fc-bgHover); }
1869
+ .fc-mobile-cmdpal-back:active {
1870
+ background: var(--fc-bgHover);
1871
+ }
1485
1872
 
1486
1873
  .fc-mobile-cmdpal-close {
1487
1874
  background: none;
@@ -1517,7 +1904,9 @@
1517
1904
  min-width: 0;
1518
1905
  }
1519
1906
 
1520
- .fc-mobile-cmdpal-input::placeholder { color: var(--fc-textDim); }
1907
+ .fc-mobile-cmdpal-input::placeholder {
1908
+ color: var(--fc-textDim);
1909
+ }
1521
1910
 
1522
1911
  .fc-mobile-cmdpal-clear {
1523
1912
  display: flex;
@@ -1556,7 +1945,9 @@
1556
1945
  font-family: inherit;
1557
1946
  }
1558
1947
 
1559
- .fc-mobile-cmdpal-item:active { background: var(--fc-bgHover); }
1948
+ .fc-mobile-cmdpal-item:active {
1949
+ background: var(--fc-bgHover);
1950
+ }
1560
1951
 
1561
1952
  .fc-mobile-cmdpal-item-icon {
1562
1953
  font-size: 18px;
@@ -1599,12 +1990,16 @@
1599
1990
  ════════════════════════════════════ */
1600
1991
 
1601
1992
  @keyframes fc-m-spin {
1602
- to { transform: rotate(360deg); }
1993
+ to {
1994
+ transform: rotate(360deg);
1995
+ }
1603
1996
  }
1604
1997
 
1605
1998
  /* Keep old name for backward compat in existing components */
1606
1999
  @keyframes fc-mobile-spin {
1607
- to { transform: rotate(360deg); }
2000
+ to {
2001
+ transform: rotate(360deg);
2002
+ }
1608
2003
  }
1609
2004
 
1610
2005
  .fc-mobile-spinner {
@@ -1634,13 +2029,21 @@
1634
2029
  ════════════════════════════════════ */
1635
2030
 
1636
2031
  @keyframes fc-m-fade-in {
1637
- from { opacity: 0; }
1638
- to { opacity: 1; }
2032
+ from {
2033
+ opacity: 0;
2034
+ }
2035
+ to {
2036
+ opacity: 1;
2037
+ }
1639
2038
  }
1640
2039
 
1641
2040
  @keyframes fc-m-slide-up {
1642
- from { transform: translateY(100%); }
1643
- to { transform: translateY(0); }
2041
+ from {
2042
+ transform: translateY(100%);
2043
+ }
2044
+ to {
2045
+ transform: translateY(0);
2046
+ }
1644
2047
  }
1645
2048
 
1646
2049
  /* ════════════════════════════════════
@@ -1652,12 +2055,14 @@
1652
2055
  align-items: center;
1653
2056
  gap: 5px;
1654
2057
  flex-shrink: 0;
2058
+ line-height: 1;
2059
+ transform: translateY(-0.5px);
1655
2060
  }
1656
2061
 
1657
2062
  .fc-m-status-inline-dot {
1658
- width: 6px;
1659
- height: 6px;
1660
- border-radius: 3px;
2063
+ width: 7px;
2064
+ height: 7px;
2065
+ border-radius: 999px;
1661
2066
  flex-shrink: 0;
1662
2067
  }
1663
2068
 
@@ -1673,8 +2078,13 @@
1673
2078
  }
1674
2079
 
1675
2080
  @keyframes fc-m-pulse {
1676
- 0%, 100% { opacity: 1; }
1677
- 50% { opacity: 0.5; }
2081
+ 0%,
2082
+ 100% {
2083
+ opacity: 1;
2084
+ }
2085
+ 50% {
2086
+ opacity: 0.5;
2087
+ }
1678
2088
  }
1679
2089
 
1680
2090
  .fc-m-status-inline-spinner {
@@ -1690,10 +2100,11 @@
1690
2100
  font-size: 9px;
1691
2101
  color: #f06b6b;
1692
2102
  opacity: 0.8;
2103
+ min-width: 0;
1693
2104
  white-space: nowrap;
1694
2105
  overflow: hidden;
1695
2106
  text-overflow: ellipsis;
1696
- max-width: 180px;
2107
+ max-width: 10ch;
1697
2108
  }
1698
2109
 
1699
2110
  /* ════════════════════════════════════
@@ -1960,7 +2371,7 @@
1960
2371
  }
1961
2372
 
1962
2373
  .fc-m-explorer-toggle::after {
1963
- content: '';
2374
+ content: "";
1964
2375
  position: absolute;
1965
2376
  top: 2px;
1966
2377
  left: 2px;
@@ -2281,6 +2692,49 @@
2281
2692
  font-weight: 500;
2282
2693
  }
2283
2694
 
2695
+ .fc-m-listsheet-choice-btn {
2696
+ display: flex;
2697
+ align-items: center;
2698
+ gap: 8px;
2699
+ width: 100%;
2700
+ padding: 10px 12px;
2701
+ border-radius: 10px;
2702
+ border: 1px solid var(--fc-border);
2703
+ background: var(--fc-bgSurface, var(--fc-bgInput));
2704
+ color: var(--fc-text);
2705
+ cursor: pointer;
2706
+ font-family: inherit;
2707
+ }
2708
+
2709
+ .fc-m-listsheet-choice-btn:active {
2710
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.04));
2711
+ }
2712
+
2713
+ .fc-m-listsheet-choice-name {
2714
+ flex: 1;
2715
+ min-width: 0;
2716
+ font-size: 11px;
2717
+ color: var(--fc-textMuted);
2718
+ font-weight: 500;
2719
+ text-align: left;
2720
+ }
2721
+
2722
+ .fc-m-listsheet-choice-value {
2723
+ font-size: 12px;
2724
+ font-weight: 700;
2725
+ color: var(--fc-accent);
2726
+ max-width: 50%;
2727
+ overflow: hidden;
2728
+ text-overflow: ellipsis;
2729
+ white-space: nowrap;
2730
+ }
2731
+
2732
+ .fc-m-listsheet-choice-chevron {
2733
+ font-size: 16px;
2734
+ line-height: 1;
2735
+ color: var(--fc-textDim);
2736
+ }
2737
+
2284
2738
  .fc-m-listsheet-scrub-slider {
2285
2739
  flex: 1;
2286
2740
  -webkit-appearance: none;