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
@@ -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);
@@ -191,15 +211,15 @@ button:disabled {
191
211
  /* File button in center — acts as both filename display and command palette trigger */
192
212
  .fc-toolbar-file {
193
213
  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;
214
+ padding: 5px 12px;
215
+ border-radius: 8px;
216
+ gap: 8px;
217
+ background: var(--fc-bg);
218
+ border-color: var(--fc-border);
199
219
  }
200
220
  .fc-toolbar-file:hover {
201
- background: var(--fc-bgHover) !important;
202
- border-color: var(--fc-textDim) !important;
221
+ background: var(--fc-bgHover);
222
+ border-color: var(--fc-textDim);
203
223
  }
204
224
  .fc-toolbar-filename {
205
225
  color: var(--fc-text);
@@ -224,8 +244,8 @@ button:disabled {
224
244
  .fc-toolbar-btn {
225
245
  width: 32px;
226
246
  height: 32px;
227
- padding: 0 !important;
228
- display: inline-flex !important;
247
+ padding: 0;
248
+ display: inline-flex;
229
249
  align-items: center;
230
250
  justify-content: center;
231
251
  font-size: 15px;
@@ -236,11 +256,11 @@ button:disabled {
236
256
  /* Labeled toolbar button — icon + text, for primary actions */
237
257
  .fc-toolbar-labeled {
238
258
  height: 32px;
239
- padding: 0 10px !important;
240
- display: inline-flex !important;
259
+ padding: 0 10px;
260
+ display: inline-flex;
241
261
  align-items: center;
242
262
  justify-content: center;
243
- gap: 5px !important;
263
+ gap: 5px;
244
264
  font-size: 14px;
245
265
  flex-shrink: 0;
246
266
  border-radius: 6px;
@@ -484,7 +504,9 @@ input[type="color"]::-webkit-color-swatch {
484
504
  text-decoration: none;
485
505
  font-size: 14px;
486
506
  }
487
- .fc-docs-nav-link:hover { color: var(--fc-text); }
507
+ .fc-docs-nav-link:hover {
508
+ color: var(--fc-text);
509
+ }
488
510
  .fc-docs-nav-cta {
489
511
  padding: 6px 16px;
490
512
  font-size: 14px;
@@ -495,7 +517,9 @@ input[type="color"]::-webkit-color-swatch {
495
517
  text-decoration: none;
496
518
  transition: opacity 0.15s;
497
519
  }
498
- .fc-docs-nav-cta:hover { opacity: 0.9; }
520
+ .fc-docs-nav-cta:hover {
521
+ opacity: 0.9;
522
+ }
499
523
 
500
524
  /* --- Search trigger in nav --- */
501
525
  .fc-docs-search-trigger {
@@ -509,7 +533,9 @@ input[type="color"]::-webkit-color-swatch {
509
533
  color: var(--fc-textDim);
510
534
  font-size: 13px;
511
535
  cursor: pointer;
512
- transition: border-color 0.15s, color 0.15s;
536
+ transition:
537
+ border-color 0.15s,
538
+ color 0.15s;
513
539
  }
514
540
  .fc-docs-search-trigger:hover {
515
541
  border-color: var(--fc-accent);
@@ -522,7 +548,7 @@ input[type="color"]::-webkit-color-swatch {
522
548
  background: var(--fc-bgHover);
523
549
  border: 1px solid var(--fc-border);
524
550
  border-radius: 3px;
525
- font-family: var(--fc-mono, 'SF Mono', 'Fira Code', monospace);
551
+ font-family: var(--fc-mono, "SF Mono", "Fira Code", monospace);
526
552
  color: var(--fc-textDim);
527
553
  }
528
554
 
@@ -538,9 +564,16 @@ input[type="color"]::-webkit-color-swatch {
538
564
  position: sticky;
539
565
  top: 56px;
540
566
  }
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; }
567
+ .fc-docs-sidebar::-webkit-scrollbar {
568
+ width: 4px;
569
+ }
570
+ .fc-docs-sidebar::-webkit-scrollbar-track {
571
+ background: transparent;
572
+ }
573
+ .fc-docs-sidebar::-webkit-scrollbar-thumb {
574
+ background: var(--fc-border);
575
+ border-radius: 2px;
576
+ }
544
577
 
545
578
  .fc-docs-sidebar-group-title {
546
579
  padding: 12px 20px 4px;
@@ -557,7 +590,10 @@ input[type="color"]::-webkit-color-swatch {
557
590
  color: var(--fc-textMuted);
558
591
  text-decoration: none;
559
592
  border-left: 2px solid transparent;
560
- transition: color 0.1s, background 0.1s, border-color 0.1s;
593
+ transition:
594
+ color 0.1s,
595
+ background 0.1s,
596
+ border-color 0.1s;
561
597
  }
562
598
  .fc-docs-sidebar-link:hover {
563
599
  color: var(--fc-text);
@@ -624,7 +660,9 @@ input[type="color"]::-webkit-color-swatch {
624
660
  border: 1px solid var(--fc-border);
625
661
  border-radius: 8px;
626
662
  text-decoration: none;
627
- transition: border-color 0.15s, background 0.15s;
663
+ transition:
664
+ border-color 0.15s,
665
+ background 0.15s;
628
666
  }
629
667
  .fc-docs-index-card:hover {
630
668
  border-color: var(--fc-accent);
@@ -644,7 +682,7 @@ input[type="color"]::-webkit-color-swatch {
644
682
  /* --- Doc content (markdown) --- */
645
683
  .fc-docs-content {
646
684
  padding: 40px 48px 80px;
647
- max-width: 800px;
685
+ max-width: 860px;
648
686
  margin: 0 auto;
649
687
  line-height: 1.7;
650
688
  color: var(--fc-text);
@@ -675,21 +713,32 @@ input[type="color"]::-webkit-color-swatch {
675
713
  .fc-docs-content h4 {
676
714
  font-size: 14px;
677
715
  font-weight: 600;
678
- margin: 20px 0 6px;
716
+ margin: 24px 0 6px;
717
+ padding-top: 16px;
718
+ border-top: 1px solid color-mix(in srgb, var(--fc-border) 50%, transparent);
679
719
  color: var(--fc-accent);
680
720
  }
721
+ /* First h4 after a group heading or section start — no top border */
722
+ .fc-docs-content h3 + h4,
723
+ .fc-docs-content strong + h4,
724
+ .fc-docs-content p + h4:first-of-type {
725
+ border-top: none;
726
+ padding-top: 0;
727
+ }
681
728
  .fc-docs-content p {
682
729
  margin: 0 0 12px;
683
730
  color: var(--fc-text);
684
731
  }
685
- .fc-docs-content ul, .fc-docs-content ol {
732
+ .fc-docs-content ul,
733
+ .fc-docs-content ol {
686
734
  padding-left: 24px;
687
735
  margin: 0 0 12px;
688
736
  }
689
737
  .fc-docs-content li {
690
738
  margin-bottom: 4px;
691
739
  }
692
- .fc-docs-content li > ul, .fc-docs-content li > ol {
740
+ .fc-docs-content li > ul,
741
+ .fc-docs-content li > ol {
693
742
  margin-top: 4px;
694
743
  margin-bottom: 0;
695
744
  }
@@ -736,8 +785,12 @@ input[type="color"]::-webkit-color-swatch {
736
785
  animation: fc-docs-flash 1.5s ease-out;
737
786
  }
738
787
  @keyframes fc-docs-flash {
739
- 0% { background: var(--fc-bgActive); }
740
- 100% { background: transparent; }
788
+ 0% {
789
+ background: var(--fc-bgActive);
790
+ }
791
+ 100% {
792
+ background: transparent;
793
+ }
741
794
  }
742
795
 
743
796
  /* Code blocks */
@@ -750,7 +803,7 @@ input[type="color"]::-webkit-color-swatch {
750
803
  font-size: 13px;
751
804
  line-height: 1.5;
752
805
  margin: 0 0 16px;
753
- font-family: var(--fc-mono, 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace);
806
+ font-family: var(--fc-mono, "JetBrains Mono", "Fira Code", "SF Mono", monospace);
754
807
  }
755
808
  .fc-docs-code code {
756
809
  background: none;
@@ -767,7 +820,7 @@ input[type="color"]::-webkit-color-swatch {
767
820
  border-radius: 4px;
768
821
  padding: 1px 6px;
769
822
  font-size: 0.9em;
770
- font-family: var(--fc-mono, 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace);
823
+ font-family: var(--fc-mono, "JetBrains Mono", "Fira Code", "SF Mono", monospace);
771
824
  color: var(--fc-accent);
772
825
  }
773
826
 
@@ -841,25 +894,54 @@ input[type="color"]::-webkit-color-swatch {
841
894
  Uses theme-aware CSS variables so tokens adapt to any app theme.
842
895
  Default palette matches Tokyo Night. */
843
896
  .fc-docs-content .hljs-keyword,
844
- .fc-docs-content .hljs-tag { color: var(--fc-accent); }
897
+ .fc-docs-content .hljs-tag {
898
+ color: var(--fc-accent);
899
+ }
845
900
  .fc-docs-content .hljs-string,
846
- .fc-docs-content .hljs-template-variable { color: var(--fc-success, #9ece6a); }
901
+ .fc-docs-content .hljs-template-variable {
902
+ color: var(--fc-success, #9ece6a);
903
+ }
847
904
  .fc-docs-content .hljs-number,
848
- .fc-docs-content .hljs-literal { color: var(--fc-warning, #ff9e64); }
905
+ .fc-docs-content .hljs-literal {
906
+ color: var(--fc-warning, #ff9e64);
907
+ }
849
908
  .fc-docs-content .hljs-type,
850
909
  .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; }
910
+ .fc-docs-content .hljs-built_in {
911
+ color: var(--fc-warning, #e0af68);
912
+ }
913
+ .fc-docs-content .hljs-comment {
914
+ color: var(--fc-textDim);
915
+ font-style: italic;
916
+ }
853
917
  .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); }
918
+ .fc-docs-content .hljs-attribute {
919
+ color: var(--fc-accent);
920
+ }
921
+ .fc-docs-content .hljs-params {
922
+ color: var(--fc-text);
923
+ }
924
+ .fc-docs-content .hljs-title.function_ {
925
+ color: var(--fc-accent);
926
+ }
927
+ .fc-docs-content .hljs-punctuation {
928
+ color: var(--fc-textMuted);
929
+ }
930
+ .fc-docs-content .hljs-property {
931
+ color: var(--fc-text);
932
+ }
933
+ .fc-docs-content .hljs-variable {
934
+ color: var(--fc-text);
935
+ }
936
+ .fc-docs-content .hljs-regexp {
937
+ color: var(--fc-error, #f7768e);
938
+ }
939
+ .fc-docs-content .hljs-meta {
940
+ color: var(--fc-textDim);
941
+ }
942
+ .fc-docs-content .hljs-selector-class {
943
+ color: var(--fc-accent);
944
+ }
863
945
 
864
946
  /* --- Search overlay --- */
865
947
  .fc-docs-search-overlay {
@@ -914,8 +996,13 @@ input[type="color"]::-webkit-color-swatch {
914
996
  max-height: 400px;
915
997
  overflow-y: auto;
916
998
  }
917
- .fc-docs-search-results::-webkit-scrollbar { width: 4px; }
918
- .fc-docs-search-results::-webkit-scrollbar-thumb { background: var(--fc-border); border-radius: 2px; }
999
+ .fc-docs-search-results::-webkit-scrollbar {
1000
+ width: 4px;
1001
+ }
1002
+ .fc-docs-search-results::-webkit-scrollbar-thumb {
1003
+ background: var(--fc-border);
1004
+ border-radius: 2px;
1005
+ }
919
1006
 
920
1007
  .fc-docs-search-result {
921
1008
  padding: 10px 16px;
@@ -923,7 +1010,9 @@ input[type="color"]::-webkit-color-swatch {
923
1010
  border-bottom: 1px solid var(--fc-border);
924
1011
  transition: background 0.08s;
925
1012
  }
926
- .fc-docs-search-result:last-child { border-bottom: none; }
1013
+ .fc-docs-search-result:last-child {
1014
+ border-bottom: none;
1015
+ }
927
1016
  .fc-docs-search-result:hover,
928
1017
  .fc-docs-search-result.selected {
929
1018
  background: var(--fc-bgHover);
@@ -973,15 +1062,100 @@ input[type="color"]::-webkit-color-swatch {
973
1062
  color: var(--fc-textMuted);
974
1063
  }
975
1064
 
1065
+ /* --- On-this-page right sidebar --- */
1066
+ .fc-docs-toc {
1067
+ width: 220px;
1068
+ flex-shrink: 0;
1069
+ padding: 20px 12px 20px 0;
1070
+ overflow-y: auto;
1071
+ height: calc(100vh - 56px);
1072
+ position: sticky;
1073
+ top: 56px;
1074
+ border-left: 1px solid var(--fc-border);
1075
+ }
1076
+ .fc-docs-toc::-webkit-scrollbar {
1077
+ width: 4px;
1078
+ }
1079
+ .fc-docs-toc::-webkit-scrollbar-track {
1080
+ background: transparent;
1081
+ }
1082
+ .fc-docs-toc::-webkit-scrollbar-thumb {
1083
+ background: var(--fc-border);
1084
+ border-radius: 2px;
1085
+ }
1086
+ .fc-docs-toc-title {
1087
+ padding: 0 12px 8px;
1088
+ font-size: 11px;
1089
+ font-weight: 600;
1090
+ text-transform: uppercase;
1091
+ letter-spacing: 0.05em;
1092
+ color: var(--fc-textDim);
1093
+ }
1094
+ .fc-docs-toc-link {
1095
+ display: block;
1096
+ padding: 3px 12px;
1097
+ font-size: 12px;
1098
+ line-height: 1.4;
1099
+ color: var(--fc-textMuted);
1100
+ text-decoration: none;
1101
+ border-left: 2px solid transparent;
1102
+ overflow: hidden;
1103
+ text-overflow: ellipsis;
1104
+ white-space: nowrap;
1105
+ }
1106
+ .fc-docs-toc-link.indent {
1107
+ padding-left: 24px;
1108
+ font-size: 11.5px;
1109
+ }
1110
+ .fc-docs-toc-link:hover {
1111
+ color: var(--fc-text);
1112
+ }
1113
+ .fc-docs-toc-link.active {
1114
+ color: var(--fc-accent, #58a6ff);
1115
+ border-left-color: var(--fc-accent, #58a6ff);
1116
+ }
1117
+
1118
+ /* --- Sidebar toggle buttons --- */
1119
+ .fc-docs-nav-left {
1120
+ display: flex;
1121
+ align-items: center;
1122
+ gap: 8px;
1123
+ }
1124
+ .fc-docs-sidebar-toggle {
1125
+ display: flex;
1126
+ align-items: center;
1127
+ justify-content: center;
1128
+ width: 28px;
1129
+ height: 28px;
1130
+ border: 1px solid var(--fc-border);
1131
+ border-radius: 6px;
1132
+ background: transparent;
1133
+ color: var(--fc-textMuted);
1134
+ cursor: pointer;
1135
+ flex-shrink: 0;
1136
+ }
1137
+ .fc-docs-sidebar-toggle:hover {
1138
+ background: var(--fc-bgSurface);
1139
+ color: var(--fc-text);
1140
+ }
1141
+
976
1142
  /* --- Project Selector --- */
977
1143
  .fc-project-item:hover {
978
- background: var(--fc-bgHover, rgba(255, 255, 255, 0.06)) !important;
1144
+ background: var(--fc-bgHover, rgba(255, 255, 255, 0.06));
979
1145
  }
980
1146
 
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; }
1147
+ /* --- Responsive ---
1148
+ Sidebars are toggled via JS (initial state based on viewport width).
1149
+ Only content padding and grid adjustments use media queries.
1150
+ */
1151
+ @media (max-width: 900px) {
1152
+ .fc-docs-content {
1153
+ padding: 20px 16px 60px;
1154
+ }
1155
+ .fc-docs-index {
1156
+ padding: 20px 16px 60px;
1157
+ }
1158
+ .fc-docs-index-grid {
1159
+ grid-template-columns: 1fr;
1160
+ }
987
1161
  }