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
@@ -102,6 +102,26 @@ button:disabled {
102
102
  .fc-btn:active {
103
103
  background: var(--fc-bgActive);
104
104
  }
105
+ /* Card-style button: stacked title + description, full-width */
106
+ .fc-btn.fc-btn-card {
107
+ display: flex;
108
+ flex-direction: column;
109
+ align-items: flex-start;
110
+ white-space: normal;
111
+ width: 100%;
112
+ text-align: left;
113
+ padding: 8px 12px;
114
+ gap: 2px;
115
+ }
116
+ .fc-btn-card .fc-btn-card-title {
117
+ font-weight: 600;
118
+ line-height: 1.3;
119
+ }
120
+ .fc-btn-card .fc-btn-card-desc {
121
+ font-size: 11px;
122
+ color: var(--fc-textDim);
123
+ line-height: 1.3;
124
+ }
105
125
  .fc-btn.active {
106
126
  background: var(--fc-accent);
107
127
  color: var(--fc-accentText);
@@ -111,6 +131,313 @@ button:disabled {
111
131
  filter: brightness(1.1);
112
132
  }
113
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
+
114
441
  /* --- fc-icon-btn: Small icon-only button --- */
115
442
  .fc-icon-btn {
116
443
  padding: 4px;
@@ -191,15 +518,15 @@ button:disabled {
191
518
  /* File button in center — acts as both filename display and command palette trigger */
192
519
  .fc-toolbar-file {
193
520
  max-width: 340px;
194
- padding: 5px 12px !important;
195
- border-radius: 8px !important;
196
- gap: 8px !important;
197
- background: var(--fc-bg) !important;
198
- border-color: var(--fc-border) !important;
521
+ padding: 5px 12px;
522
+ border-radius: 8px;
523
+ gap: 8px;
524
+ background: var(--fc-bg);
525
+ border-color: var(--fc-border);
199
526
  }
200
527
  .fc-toolbar-file:hover {
201
- background: var(--fc-bgHover) !important;
202
- border-color: var(--fc-textDim) !important;
528
+ background: var(--fc-bgHover);
529
+ border-color: var(--fc-textDim);
203
530
  }
204
531
  .fc-toolbar-filename {
205
532
  color: var(--fc-text);
@@ -224,8 +551,8 @@ button:disabled {
224
551
  .fc-toolbar-btn {
225
552
  width: 32px;
226
553
  height: 32px;
227
- padding: 0 !important;
228
- display: inline-flex !important;
554
+ padding: 0;
555
+ display: inline-flex;
229
556
  align-items: center;
230
557
  justify-content: center;
231
558
  font-size: 15px;
@@ -236,11 +563,11 @@ button:disabled {
236
563
  /* Labeled toolbar button — icon + text, for primary actions */
237
564
  .fc-toolbar-labeled {
238
565
  height: 32px;
239
- padding: 0 10px !important;
240
- display: inline-flex !important;
566
+ padding: 0 10px;
567
+ display: inline-flex;
241
568
  align-items: center;
242
569
  justify-content: center;
243
- gap: 5px !important;
570
+ gap: 5px;
244
571
  font-size: 14px;
245
572
  flex-shrink: 0;
246
573
  border-radius: 6px;
@@ -484,7 +811,9 @@ input[type="color"]::-webkit-color-swatch {
484
811
  text-decoration: none;
485
812
  font-size: 14px;
486
813
  }
487
- .fc-docs-nav-link:hover { color: var(--fc-text); }
814
+ .fc-docs-nav-link:hover {
815
+ color: var(--fc-text);
816
+ }
488
817
  .fc-docs-nav-cta {
489
818
  padding: 6px 16px;
490
819
  font-size: 14px;
@@ -495,7 +824,9 @@ input[type="color"]::-webkit-color-swatch {
495
824
  text-decoration: none;
496
825
  transition: opacity 0.15s;
497
826
  }
498
- .fc-docs-nav-cta:hover { opacity: 0.9; }
827
+ .fc-docs-nav-cta:hover {
828
+ opacity: 0.9;
829
+ }
499
830
 
500
831
  /* --- Search trigger in nav --- */
501
832
  .fc-docs-search-trigger {
@@ -509,7 +840,9 @@ input[type="color"]::-webkit-color-swatch {
509
840
  color: var(--fc-textDim);
510
841
  font-size: 13px;
511
842
  cursor: pointer;
512
- transition: border-color 0.15s, color 0.15s;
843
+ transition:
844
+ border-color 0.15s,
845
+ color 0.15s;
513
846
  }
514
847
  .fc-docs-search-trigger:hover {
515
848
  border-color: var(--fc-accent);
@@ -522,8 +855,32 @@ input[type="color"]::-webkit-color-swatch {
522
855
  background: var(--fc-bgHover);
523
856
  border: 1px solid var(--fc-border);
524
857
  border-radius: 3px;
525
- font-family: var(--fc-mono, 'SF Mono', 'Fira Code', monospace);
858
+ font-family: var(--fc-mono, "SF Mono", "Fira Code", monospace);
859
+ color: var(--fc-textDim);
860
+ }
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;
526
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;
527
884
  }
528
885
 
529
886
  /* --- Sidebar --- */
@@ -538,9 +895,20 @@ input[type="color"]::-webkit-color-swatch {
538
895
  position: sticky;
539
896
  top: 56px;
540
897
  }
541
- .fc-docs-sidebar::-webkit-scrollbar { width: 4px; }
542
- .fc-docs-sidebar::-webkit-scrollbar-track { background: transparent; }
543
- .fc-docs-sidebar::-webkit-scrollbar-thumb { background: var(--fc-border); border-radius: 2px; }
898
+ /* Desktop: hide sidebar when not open (not in flow) */
899
+ .fc-docs-sidebar:not(.open) {
900
+ display: none;
901
+ }
902
+ .fc-docs-sidebar::-webkit-scrollbar {
903
+ width: 4px;
904
+ }
905
+ .fc-docs-sidebar::-webkit-scrollbar-track {
906
+ background: transparent;
907
+ }
908
+ .fc-docs-sidebar::-webkit-scrollbar-thumb {
909
+ background: var(--fc-border);
910
+ border-radius: 2px;
911
+ }
544
912
 
545
913
  .fc-docs-sidebar-group-title {
546
914
  padding: 12px 20px 4px;
@@ -557,7 +925,10 @@ input[type="color"]::-webkit-color-swatch {
557
925
  color: var(--fc-textMuted);
558
926
  text-decoration: none;
559
927
  border-left: 2px solid transparent;
560
- transition: color 0.1s, background 0.1s, border-color 0.1s;
928
+ transition:
929
+ color 0.1s,
930
+ background 0.1s,
931
+ border-color 0.1s;
561
932
  }
562
933
  .fc-docs-sidebar-link:hover {
563
934
  color: var(--fc-text);
@@ -624,7 +995,9 @@ input[type="color"]::-webkit-color-swatch {
624
995
  border: 1px solid var(--fc-border);
625
996
  border-radius: 8px;
626
997
  text-decoration: none;
627
- transition: border-color 0.15s, background 0.15s;
998
+ transition:
999
+ border-color 0.15s,
1000
+ background 0.15s;
628
1001
  }
629
1002
  .fc-docs-index-card:hover {
630
1003
  border-color: var(--fc-accent);
@@ -644,7 +1017,7 @@ input[type="color"]::-webkit-color-swatch {
644
1017
  /* --- Doc content (markdown) --- */
645
1018
  .fc-docs-content {
646
1019
  padding: 40px 48px 80px;
647
- max-width: 800px;
1020
+ max-width: 860px;
648
1021
  margin: 0 auto;
649
1022
  line-height: 1.7;
650
1023
  color: var(--fc-text);
@@ -675,21 +1048,32 @@ input[type="color"]::-webkit-color-swatch {
675
1048
  .fc-docs-content h4 {
676
1049
  font-size: 14px;
677
1050
  font-weight: 600;
678
- margin: 20px 0 6px;
1051
+ margin: 24px 0 6px;
1052
+ padding-top: 16px;
1053
+ border-top: 1px solid color-mix(in srgb, var(--fc-border) 50%, transparent);
679
1054
  color: var(--fc-accent);
680
1055
  }
1056
+ /* First h4 after a group heading or section start — no top border */
1057
+ .fc-docs-content h3 + h4,
1058
+ .fc-docs-content strong + h4,
1059
+ .fc-docs-content p + h4:first-of-type {
1060
+ border-top: none;
1061
+ padding-top: 0;
1062
+ }
681
1063
  .fc-docs-content p {
682
1064
  margin: 0 0 12px;
683
1065
  color: var(--fc-text);
684
1066
  }
685
- .fc-docs-content ul, .fc-docs-content ol {
1067
+ .fc-docs-content ul,
1068
+ .fc-docs-content ol {
686
1069
  padding-left: 24px;
687
1070
  margin: 0 0 12px;
688
1071
  }
689
1072
  .fc-docs-content li {
690
1073
  margin-bottom: 4px;
691
1074
  }
692
- .fc-docs-content li > ul, .fc-docs-content li > ol {
1075
+ .fc-docs-content li > ul,
1076
+ .fc-docs-content li > ol {
693
1077
  margin-top: 4px;
694
1078
  margin-bottom: 0;
695
1079
  }
@@ -736,8 +1120,12 @@ input[type="color"]::-webkit-color-swatch {
736
1120
  animation: fc-docs-flash 1.5s ease-out;
737
1121
  }
738
1122
  @keyframes fc-docs-flash {
739
- 0% { background: var(--fc-bgActive); }
740
- 100% { background: transparent; }
1123
+ 0% {
1124
+ background: var(--fc-bgActive);
1125
+ }
1126
+ 100% {
1127
+ background: transparent;
1128
+ }
741
1129
  }
742
1130
 
743
1131
  /* Code blocks */
@@ -750,7 +1138,7 @@ input[type="color"]::-webkit-color-swatch {
750
1138
  font-size: 13px;
751
1139
  line-height: 1.5;
752
1140
  margin: 0 0 16px;
753
- font-family: var(--fc-mono, 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace);
1141
+ font-family: var(--fc-mono, "JetBrains Mono", "Fira Code", "SF Mono", monospace);
754
1142
  }
755
1143
  .fc-docs-code code {
756
1144
  background: none;
@@ -767,7 +1155,7 @@ input[type="color"]::-webkit-color-swatch {
767
1155
  border-radius: 4px;
768
1156
  padding: 1px 6px;
769
1157
  font-size: 0.9em;
770
- font-family: var(--fc-mono, 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace);
1158
+ font-family: var(--fc-mono, "JetBrains Mono", "Fira Code", "SF Mono", monospace);
771
1159
  color: var(--fc-accent);
772
1160
  }
773
1161
 
@@ -841,25 +1229,54 @@ input[type="color"]::-webkit-color-swatch {
841
1229
  Uses theme-aware CSS variables so tokens adapt to any app theme.
842
1230
  Default palette matches Tokyo Night. */
843
1231
  .fc-docs-content .hljs-keyword,
844
- .fc-docs-content .hljs-tag { color: var(--fc-accent); }
1232
+ .fc-docs-content .hljs-tag {
1233
+ color: var(--fc-accent);
1234
+ }
845
1235
  .fc-docs-content .hljs-string,
846
- .fc-docs-content .hljs-template-variable { color: var(--fc-success, #9ece6a); }
1236
+ .fc-docs-content .hljs-template-variable {
1237
+ color: var(--fc-success, #9ece6a);
1238
+ }
847
1239
  .fc-docs-content .hljs-number,
848
- .fc-docs-content .hljs-literal { color: var(--fc-warning, #ff9e64); }
1240
+ .fc-docs-content .hljs-literal {
1241
+ color: var(--fc-warning, #ff9e64);
1242
+ }
849
1243
  .fc-docs-content .hljs-type,
850
1244
  .fc-docs-content .hljs-title.class_,
851
- .fc-docs-content .hljs-built_in { color: var(--fc-warning, #e0af68); }
852
- .fc-docs-content .hljs-comment { color: var(--fc-textDim); font-style: italic; }
1245
+ .fc-docs-content .hljs-built_in {
1246
+ color: var(--fc-warning, #e0af68);
1247
+ }
1248
+ .fc-docs-content .hljs-comment {
1249
+ color: var(--fc-textDim);
1250
+ font-style: italic;
1251
+ }
853
1252
  .fc-docs-content .hljs-attr,
854
- .fc-docs-content .hljs-attribute { color: var(--fc-accent); }
855
- .fc-docs-content .hljs-params { color: var(--fc-text); }
856
- .fc-docs-content .hljs-title.function_ { color: var(--fc-accent); }
857
- .fc-docs-content .hljs-punctuation { color: var(--fc-textMuted); }
858
- .fc-docs-content .hljs-property { color: var(--fc-text); }
859
- .fc-docs-content .hljs-variable { color: var(--fc-text); }
860
- .fc-docs-content .hljs-regexp { color: var(--fc-error, #f7768e); }
861
- .fc-docs-content .hljs-meta { color: var(--fc-textDim); }
862
- .fc-docs-content .hljs-selector-class { color: var(--fc-accent); }
1253
+ .fc-docs-content .hljs-attribute {
1254
+ color: var(--fc-accent);
1255
+ }
1256
+ .fc-docs-content .hljs-params {
1257
+ color: var(--fc-text);
1258
+ }
1259
+ .fc-docs-content .hljs-title.function_ {
1260
+ color: var(--fc-accent);
1261
+ }
1262
+ .fc-docs-content .hljs-punctuation {
1263
+ color: var(--fc-textMuted);
1264
+ }
1265
+ .fc-docs-content .hljs-property {
1266
+ color: var(--fc-text);
1267
+ }
1268
+ .fc-docs-content .hljs-variable {
1269
+ color: var(--fc-text);
1270
+ }
1271
+ .fc-docs-content .hljs-regexp {
1272
+ color: var(--fc-error, #f7768e);
1273
+ }
1274
+ .fc-docs-content .hljs-meta {
1275
+ color: var(--fc-textDim);
1276
+ }
1277
+ .fc-docs-content .hljs-selector-class {
1278
+ color: var(--fc-accent);
1279
+ }
863
1280
 
864
1281
  /* --- Search overlay --- */
865
1282
  .fc-docs-search-overlay {
@@ -914,8 +1331,13 @@ input[type="color"]::-webkit-color-swatch {
914
1331
  max-height: 400px;
915
1332
  overflow-y: auto;
916
1333
  }
917
- .fc-docs-search-results::-webkit-scrollbar { width: 4px; }
918
- .fc-docs-search-results::-webkit-scrollbar-thumb { background: var(--fc-border); border-radius: 2px; }
1334
+ .fc-docs-search-results::-webkit-scrollbar {
1335
+ width: 4px;
1336
+ }
1337
+ .fc-docs-search-results::-webkit-scrollbar-thumb {
1338
+ background: var(--fc-border);
1339
+ border-radius: 2px;
1340
+ }
919
1341
 
920
1342
  .fc-docs-search-result {
921
1343
  padding: 10px 16px;
@@ -923,7 +1345,9 @@ input[type="color"]::-webkit-color-swatch {
923
1345
  border-bottom: 1px solid var(--fc-border);
924
1346
  transition: background 0.08s;
925
1347
  }
926
- .fc-docs-search-result:last-child { border-bottom: none; }
1348
+ .fc-docs-search-result:last-child {
1349
+ border-bottom: none;
1350
+ }
927
1351
  .fc-docs-search-result:hover,
928
1352
  .fc-docs-search-result.selected {
929
1353
  background: var(--fc-bgHover);
@@ -973,15 +1397,264 @@ input[type="color"]::-webkit-color-swatch {
973
1397
  color: var(--fc-textMuted);
974
1398
  }
975
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
+
1409
+ /* --- On-this-page right sidebar --- */
1410
+ .fc-docs-toc {
1411
+ width: 220px;
1412
+ flex-shrink: 0;
1413
+ padding: 20px 12px 20px 0;
1414
+ overflow-y: auto;
1415
+ height: calc(100vh - 56px);
1416
+ position: sticky;
1417
+ top: 56px;
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;
1424
+ }
1425
+ .fc-docs-toc::-webkit-scrollbar {
1426
+ width: 4px;
1427
+ }
1428
+ .fc-docs-toc::-webkit-scrollbar-track {
1429
+ background: transparent;
1430
+ }
1431
+ .fc-docs-toc::-webkit-scrollbar-thumb {
1432
+ background: var(--fc-border);
1433
+ border-radius: 2px;
1434
+ }
1435
+ .fc-docs-toc-title {
1436
+ padding: 0 12px 8px;
1437
+ font-size: 11px;
1438
+ font-weight: 600;
1439
+ text-transform: uppercase;
1440
+ letter-spacing: 0.05em;
1441
+ color: var(--fc-textDim);
1442
+ }
1443
+ .fc-docs-toc-link {
1444
+ display: block;
1445
+ padding: 3px 12px;
1446
+ font-size: 12px;
1447
+ line-height: 1.4;
1448
+ color: var(--fc-textMuted);
1449
+ text-decoration: none;
1450
+ border-left: 2px solid transparent;
1451
+ overflow: hidden;
1452
+ text-overflow: ellipsis;
1453
+ white-space: nowrap;
1454
+ }
1455
+ .fc-docs-toc-link.indent {
1456
+ padding-left: 24px;
1457
+ font-size: 11.5px;
1458
+ }
1459
+ .fc-docs-toc-link:hover {
1460
+ color: var(--fc-text);
1461
+ }
1462
+ .fc-docs-toc-link.active {
1463
+ color: var(--fc-accent, #58a6ff);
1464
+ border-left-color: var(--fc-accent, #58a6ff);
1465
+ }
1466
+
1467
+ /* --- Sidebar toggle buttons --- */
1468
+ .fc-docs-nav-left {
1469
+ display: flex;
1470
+ align-items: center;
1471
+ gap: 8px;
1472
+ }
1473
+ .fc-docs-sidebar-toggle {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ justify-content: center;
1477
+ width: 28px;
1478
+ height: 28px;
1479
+ border: 1px solid var(--fc-border);
1480
+ border-radius: 6px;
1481
+ background: transparent;
1482
+ color: var(--fc-textMuted);
1483
+ cursor: pointer;
1484
+ flex-shrink: 0;
1485
+ }
1486
+ .fc-docs-sidebar-toggle:hover {
1487
+ background: var(--fc-bgSurface);
1488
+ color: var(--fc-text);
1489
+ }
1490
+
976
1491
  /* --- Project Selector --- */
977
1492
  .fc-project-item:hover {
978
- background: var(--fc-bgHover, rgba(255, 255, 255, 0.06)) !important;
1493
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.06));
979
1494
  }
980
1495
 
981
- /* --- Responsive --- */
982
- @media (max-width: 768px) {
983
- .fc-docs-sidebar { display: none; }
984
- .fc-docs-content { padding: 20px 16px 60px; }
985
- .fc-docs-index { padding: 20px 16px 60px; }
986
- .fc-docs-index-grid { grid-template-columns: 1fr; }
1496
+ /* --- Responsive ---
1497
+ Desktop (>900px): sidebars in normal flow, toggled via JS.
1498
+ Mobile (<=900px): sidebar = overlay from left, TOC = bottom sheet.
1499
+ */
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 --- */
1640
+ .fc-docs-content {
1641
+ padding: 20px 16px 60px;
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
+
1652
+ .fc-docs-index {
1653
+ padding: 20px 16px 60px;
1654
+ }
1655
+ .fc-docs-index-hero { padding: 24px 0 20px; }
1656
+ .fc-docs-index-hero h1 { font-size: 24px; }
1657
+ .fc-docs-index-grid {
1658
+ grid-template-columns: 1fr;
1659
+ }
987
1660
  }