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
@@ -0,0 +1,856 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&family=IBM+Plex+Mono:wght@400;500&display=swap');
2
+
3
+ /* ── Variables ── */
4
+
5
+ .lpd-root {
6
+ --paper: #f3ede4;
7
+ --paper-strong: #efe5d8;
8
+ --card: rgba(255, 251, 245, 0.88);
9
+ --ink: #181411;
10
+ --muted: #665d55;
11
+ --line: rgba(24, 20, 17, 0.12);
12
+ --line-strong: rgba(24, 20, 17, 0.2);
13
+ --accent: #b85c30;
14
+ --teal: #1f6c72;
15
+ --code-bg: #171311;
16
+ --code-ink: #f8efe3;
17
+ --shadow: 0 30px 90px rgba(52, 33, 18, 0.1);
18
+ --radius: 24px;
19
+ --max: 1240px;
20
+ }
21
+
22
+ /* ── Reset + base ── */
23
+
24
+ .lpd-root {
25
+ background:
26
+ radial-gradient(circle at top left, rgba(184, 92, 48, 0.12), transparent 28%),
27
+ radial-gradient(circle at top right, rgba(31, 108, 114, 0.1), transparent 24%),
28
+ linear-gradient(180deg, #f8f2e9 0%, var(--paper) 52%, #efe6da 100%);
29
+ color: var(--ink);
30
+ font-family: 'Space Grotesk', sans-serif;
31
+ line-height: 1.45;
32
+ -webkit-font-smoothing: antialiased;
33
+ min-height: 100vh;
34
+ box-sizing: border-box;
35
+ }
36
+
37
+ .lpd-root *,
38
+ .lpd-root *::before,
39
+ .lpd-root *::after {
40
+ box-sizing: border-box;
41
+ margin: 0;
42
+ padding: 0;
43
+ }
44
+
45
+ /* ── Grid paper overlay ── */
46
+
47
+ .lpd-grid-overlay {
48
+ position: fixed;
49
+ inset: 0;
50
+ pointer-events: none;
51
+ opacity: 0.28;
52
+ background-image:
53
+ linear-gradient(to right, rgba(24, 20, 17, 0.04) 1px, transparent 1px),
54
+ linear-gradient(to bottom, rgba(24, 20, 17, 0.04) 1px, transparent 1px);
55
+ background-size: 32px 32px;
56
+ mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.4), transparent 92%);
57
+ z-index: 0;
58
+ }
59
+
60
+ .lpd-root a { color: inherit; }
61
+
62
+ /* ── Shell ── */
63
+
64
+ .lpd-shell {
65
+ max-width: var(--max);
66
+ margin: 0 auto;
67
+ padding: 0 28px 120px;
68
+ position: relative;
69
+ }
70
+
71
+ /* ── Topbar ── */
72
+
73
+ .lpd-topbar {
74
+ position: sticky;
75
+ top: 0;
76
+ z-index: 40;
77
+ backdrop-filter: blur(18px);
78
+ background: rgba(243, 237, 228, 0.78);
79
+ border-bottom: 1px solid rgba(24, 20, 17, 0.08);
80
+ }
81
+
82
+ .lpd-topbar-inner {
83
+ max-width: var(--max);
84
+ margin: 0 auto;
85
+ padding: 16px 28px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: space-between;
89
+ gap: 24px;
90
+ }
91
+
92
+ .lpd-brand {
93
+ display: inline-flex;
94
+ align-items: center;
95
+ gap: 12px;
96
+ font-size: 16px;
97
+ font-weight: 700;
98
+ letter-spacing: -0.02em;
99
+ text-decoration: none;
100
+ }
101
+
102
+ .lpd-brand-mark {
103
+ width: 14px;
104
+ height: 14px;
105
+ border-radius: 4px;
106
+ background: linear-gradient(135deg, var(--accent), #d89e67);
107
+ box-shadow: 0 0 0 6px rgba(184, 92, 48, 0.08);
108
+ }
109
+
110
+ .lpd-topnav {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 14px;
114
+ flex-wrap: wrap;
115
+ }
116
+
117
+ .lpd-topnav a {
118
+ text-decoration: none;
119
+ color: var(--muted);
120
+ font-size: 14px;
121
+ font-weight: 500;
122
+ padding: 10px 14px;
123
+ border-radius: 999px;
124
+ transition: background 0.18s ease, color 0.18s ease, transform 0.18s ease;
125
+ }
126
+
127
+ .lpd-topnav a:hover {
128
+ background: rgba(24, 20, 17, 0.05);
129
+ color: var(--ink);
130
+ transform: translateY(-1px);
131
+ }
132
+
133
+ .lpd-root a.lpd-topnav-cta,
134
+ .lpd-topnav .lpd-topnav-cta {
135
+ background: var(--ink);
136
+ color: #fff;
137
+ }
138
+
139
+ /* ── Hero ── */
140
+
141
+ .lpd-hero {
142
+ padding: 56px 0 28px;
143
+ }
144
+
145
+ .lpd-hero-grid {
146
+ display: grid;
147
+ grid-template-columns: minmax(0, 1.02fr) minmax(0, 0.98fr);
148
+ gap: 28px;
149
+ align-items: stretch;
150
+ }
151
+
152
+ .lpd-hero-copy,
153
+ .lpd-hero-visual {
154
+ border: 1px solid var(--line);
155
+ border-radius: 32px;
156
+ background: linear-gradient(180deg, rgba(255, 251, 245, 0.92), rgba(255, 247, 239, 0.75));
157
+ box-shadow: var(--shadow);
158
+ overflow: hidden;
159
+ }
160
+
161
+ .lpd-hero-copy {
162
+ padding: 34px 34px 30px;
163
+ display: flex;
164
+ flex-direction: column;
165
+ justify-content: space-between;
166
+ min-height: 620px;
167
+ }
168
+
169
+ .lpd-eyebrow {
170
+ display: inline-flex;
171
+ align-items: center;
172
+ gap: 10px;
173
+ font-size: 12px;
174
+ font-weight: 700;
175
+ letter-spacing: 0.12em;
176
+ text-transform: uppercase;
177
+ color: var(--accent);
178
+ margin-bottom: 18px;
179
+ }
180
+
181
+ .lpd-eyebrow::before {
182
+ content: "";
183
+ width: 28px;
184
+ height: 1px;
185
+ background: currentColor;
186
+ }
187
+
188
+ .lpd-hero h1 {
189
+ font-size: clamp(48px, 7vw, 82px);
190
+ line-height: 0.96;
191
+ letter-spacing: -0.055em;
192
+ max-width: 10ch;
193
+ margin-bottom: 20px;
194
+ }
195
+
196
+ .lpd-hero h1 span {
197
+ color: var(--accent);
198
+ }
199
+
200
+ .lpd-hero-lead {
201
+ max-width: 56ch;
202
+ font-size: 19px;
203
+ color: var(--muted);
204
+ line-height: 1.55;
205
+ margin-bottom: 28px;
206
+ }
207
+
208
+ .lpd-hero-rule {
209
+ border: 1px solid rgba(184, 92, 48, 0.22);
210
+ background: rgba(184, 92, 48, 0.08);
211
+ color: var(--ink);
212
+ border-radius: 20px;
213
+ padding: 18px 20px;
214
+ margin-bottom: 28px;
215
+ }
216
+
217
+ .lpd-hero-rule strong {
218
+ display: block;
219
+ font-size: 14px;
220
+ margin-bottom: 6px;
221
+ }
222
+
223
+ .lpd-hero-rule p {
224
+ font-size: 14px;
225
+ color: var(--muted);
226
+ line-height: 1.5;
227
+ }
228
+
229
+ .lpd-hero-actions {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ gap: 12px;
233
+ margin-bottom: 24px;
234
+ }
235
+
236
+ .lpd-button {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ gap: 8px;
241
+ padding: 14px 18px;
242
+ border-radius: 999px;
243
+ text-decoration: none;
244
+ font-size: 14px;
245
+ font-weight: 700;
246
+ letter-spacing: -0.02em;
247
+ transition: transform 0.18s ease, box-shadow 0.18s ease, background 0.18s ease, color 0.18s ease;
248
+ }
249
+
250
+ .lpd-button:hover {
251
+ transform: translateY(-1px);
252
+ }
253
+
254
+ .lpd-root a.lpd-button-primary,
255
+ .lpd-button-primary {
256
+ background: var(--ink);
257
+ color: #fff;
258
+ box-shadow: 0 12px 30px rgba(24, 20, 17, 0.18);
259
+ }
260
+
261
+ .lpd-button-secondary {
262
+ background: rgba(24, 20, 17, 0.05);
263
+ color: var(--ink);
264
+ border: 1px solid var(--line);
265
+ }
266
+
267
+ .lpd-hero-facts {
268
+ display: grid;
269
+ grid-template-columns: repeat(3, minmax(0, 1fr));
270
+ gap: 12px;
271
+ }
272
+
273
+ .lpd-fact {
274
+ border: 1px solid var(--line);
275
+ border-radius: 20px;
276
+ padding: 16px;
277
+ background: rgba(255, 255, 255, 0.4);
278
+ }
279
+
280
+ .lpd-fact strong {
281
+ display: block;
282
+ font-size: 18px;
283
+ letter-spacing: -0.03em;
284
+ margin-bottom: 4px;
285
+ }
286
+
287
+ .lpd-fact span {
288
+ display: block;
289
+ font-size: 12px;
290
+ color: var(--muted);
291
+ line-height: 1.45;
292
+ }
293
+
294
+ .lpd-hero-visual {
295
+ display: flex;
296
+ flex-direction: column;
297
+ background:
298
+ linear-gradient(180deg, rgba(20, 16, 14, 0.98), rgba(26, 20, 18, 0.92));
299
+ color: #f6f0e7;
300
+ }
301
+
302
+ .lpd-visual-topbar {
303
+ padding: 16px 20px;
304
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: space-between;
308
+ gap: 16px;
309
+ font-size: 12px;
310
+ color: rgba(246, 240, 231, 0.72);
311
+ font-family: 'IBM Plex Mono', monospace;
312
+ }
313
+
314
+ .lpd-visual-dots {
315
+ display: inline-flex;
316
+ gap: 6px;
317
+ }
318
+
319
+ .lpd-visual-dots span {
320
+ width: 8px;
321
+ height: 8px;
322
+ border-radius: 999px;
323
+ background: rgba(246, 240, 231, 0.38);
324
+ }
325
+
326
+ .lpd-hero-frame {
327
+ position: relative;
328
+ aspect-ratio: 1 / 1;
329
+ min-height: 480px;
330
+ background:
331
+ radial-gradient(circle at 50% 12%, rgba(184, 92, 48, 0.16), transparent 24%),
332
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 55%);
333
+ }
334
+
335
+ .lpd-hero-frame iframe {
336
+ width: 100%;
337
+ height: 100%;
338
+ border: none;
339
+ display: block;
340
+ }
341
+
342
+ .lpd-hero-static {
343
+ width: 100%;
344
+ height: 100%;
345
+ object-fit: contain;
346
+ display: block;
347
+ }
348
+
349
+ .lpd-hero-visual-copy {
350
+ padding: 20px 24px 24px;
351
+ display: grid;
352
+ gap: 16px;
353
+ }
354
+
355
+ .lpd-hero-visual-copy p {
356
+ color: rgba(246, 240, 231, 0.72);
357
+ font-size: 15px;
358
+ line-height: 1.55;
359
+ }
360
+
361
+ .lpd-hero-visual-actions {
362
+ display: flex;
363
+ flex-wrap: wrap;
364
+ gap: 10px;
365
+ }
366
+
367
+ .lpd-hero-visual-actions a {
368
+ display: inline-flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ text-decoration: none;
372
+ border-radius: 999px;
373
+ padding: 12px 14px;
374
+ font-size: 13px;
375
+ font-weight: 700;
376
+ border: 1px solid rgba(255, 255, 255, 0.14);
377
+ color: #fff;
378
+ background: rgba(255, 255, 255, 0.04);
379
+ }
380
+
381
+ /* ── Artifact strip ── */
382
+
383
+ .lpd-artifact-strip {
384
+ margin-top: 22px;
385
+ display: grid;
386
+ grid-template-columns: repeat(4, minmax(0, 1fr));
387
+ gap: 14px;
388
+ }
389
+
390
+ .lpd-artifact-card {
391
+ text-decoration: none;
392
+ color: inherit;
393
+ border: 1px solid var(--line);
394
+ border-radius: 24px;
395
+ overflow: hidden;
396
+ background: rgba(255, 255, 255, 0.52);
397
+ box-shadow: var(--shadow);
398
+ transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
399
+ display: block;
400
+ }
401
+
402
+ .lpd-artifact-card:hover {
403
+ transform: translateY(-3px);
404
+ border-color: rgba(184, 92, 48, 0.3);
405
+ box-shadow: 0 30px 90px rgba(52, 33, 18, 0.14);
406
+ }
407
+
408
+ .lpd-artifact-card img {
409
+ display: block;
410
+ width: 100%;
411
+ aspect-ratio: 1.08 / 1;
412
+ object-fit: cover;
413
+ background: var(--paper-strong);
414
+ }
415
+
416
+ .lpd-artifact-copy {
417
+ padding: 18px 18px 20px;
418
+ display: grid;
419
+ gap: 8px;
420
+ }
421
+
422
+ .lpd-artifact-copy strong {
423
+ font-size: 18px;
424
+ letter-spacing: -0.03em;
425
+ }
426
+
427
+ .lpd-artifact-copy p {
428
+ font-size: 14px;
429
+ line-height: 1.45;
430
+ color: var(--muted);
431
+ }
432
+
433
+ .lpd-source-tag {
434
+ display: inline-flex;
435
+ align-items: center;
436
+ width: fit-content;
437
+ border-radius: 999px;
438
+ padding: 7px 10px;
439
+ font-size: 11px;
440
+ letter-spacing: 0.08em;
441
+ text-transform: uppercase;
442
+ font-family: 'IBM Plex Mono', monospace;
443
+ background: rgba(24, 20, 17, 0.06);
444
+ color: var(--muted);
445
+ }
446
+
447
+ /* ── Capability band ── */
448
+
449
+ .lpd-capability-band {
450
+ margin-top: 22px;
451
+ display: flex;
452
+ flex-wrap: wrap;
453
+ gap: 10px;
454
+ }
455
+
456
+ .lpd-capability-band span {
457
+ padding: 11px 14px;
458
+ border-radius: 999px;
459
+ border: 1px solid var(--line);
460
+ background: rgba(255, 255, 255, 0.48);
461
+ font-size: 13px;
462
+ font-weight: 500;
463
+ color: var(--muted);
464
+ }
465
+
466
+ /* ── Section break ── */
467
+
468
+ .lpd-section-break {
469
+ height: 1px;
470
+ background: linear-gradient(90deg, transparent, rgba(24, 20, 17, 0.16), transparent);
471
+ margin: 20px 0 30px;
472
+ }
473
+
474
+ /* ── Proof sections ── */
475
+
476
+ .lpd-proof {
477
+ padding: 38px 0;
478
+ }
479
+
480
+ .lpd-proof-header {
481
+ display: grid;
482
+ grid-template-columns: 100px minmax(0, 1fr);
483
+ gap: 24px;
484
+ align-items: start;
485
+ margin-bottom: 22px;
486
+ }
487
+
488
+ .lpd-proof-number {
489
+ font-size: 72px;
490
+ line-height: 0.9;
491
+ letter-spacing: -0.08em;
492
+ color: rgba(24, 20, 17, 0.16);
493
+ font-weight: 700;
494
+ }
495
+
496
+ .lpd-proof-heading {
497
+ display: grid;
498
+ gap: 12px;
499
+ }
500
+
501
+ .lpd-proof-heading h2 {
502
+ font-size: clamp(34px, 4vw, 56px);
503
+ line-height: 0.98;
504
+ letter-spacing: -0.055em;
505
+ max-width: 14ch;
506
+ }
507
+
508
+ .lpd-proof-heading p {
509
+ max-width: 60ch;
510
+ color: var(--muted);
511
+ font-size: 17px;
512
+ line-height: 1.6;
513
+ }
514
+
515
+ .lpd-proof-layout {
516
+ display: grid;
517
+ grid-template-columns: minmax(0, 1.08fr) minmax(0, 0.92fr);
518
+ gap: 22px;
519
+ align-items: start;
520
+ }
521
+
522
+ .lpd-code-card,
523
+ .lpd-visual-card {
524
+ border: 1px solid var(--line);
525
+ border-radius: 28px;
526
+ overflow: hidden;
527
+ box-shadow: var(--shadow);
528
+ }
529
+
530
+ .lpd-code-card {
531
+ background: var(--code-bg);
532
+ color: var(--code-ink);
533
+ }
534
+
535
+ .lpd-card-bar {
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: space-between;
539
+ gap: 16px;
540
+ padding: 14px 18px;
541
+ font-family: 'IBM Plex Mono', monospace;
542
+ font-size: 12px;
543
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
544
+ color: rgba(248, 239, 227, 0.68);
545
+ }
546
+
547
+ .lpd-code-card pre {
548
+ margin: 0;
549
+ padding: 22px 22px 24px;
550
+ overflow-x: auto;
551
+ white-space: pre;
552
+ font-family: 'IBM Plex Mono', monospace;
553
+ font-size: 12.5px;
554
+ line-height: 1.7;
555
+ background: transparent !important;
556
+ }
557
+
558
+ .lpd-code-card pre code {
559
+ font-family: inherit;
560
+ font-size: inherit;
561
+ line-height: inherit;
562
+ background: transparent !important;
563
+ text-shadow: none !important;
564
+ }
565
+
566
+ .lpd-visual-card {
567
+ background: rgba(255, 255, 255, 0.72);
568
+ }
569
+
570
+ .lpd-visual-card img {
571
+ display: block;
572
+ width: 100%;
573
+ aspect-ratio: 1 / 1;
574
+ object-fit: cover;
575
+ background: var(--paper-strong);
576
+ }
577
+
578
+ .lpd-visual-copy {
579
+ padding: 20px 22px 22px;
580
+ display: grid;
581
+ gap: 16px;
582
+ }
583
+
584
+ .lpd-visual-copy p {
585
+ color: var(--muted);
586
+ font-size: 15px;
587
+ line-height: 1.55;
588
+ }
589
+
590
+ .lpd-fact-grid {
591
+ display: grid;
592
+ grid-template-columns: repeat(3, minmax(0, 1fr));
593
+ gap: 10px;
594
+ }
595
+
596
+ .lpd-fact-grid .lpd-fact {
597
+ padding: 14px;
598
+ background: rgba(24, 20, 17, 0.04);
599
+ border-radius: 18px;
600
+ box-shadow: none;
601
+ }
602
+
603
+ .lpd-fact-grid .lpd-fact strong {
604
+ font-size: 15px;
605
+ }
606
+
607
+ .lpd-fact-grid .lpd-fact span {
608
+ font-size: 12px;
609
+ }
610
+
611
+ .lpd-action-row {
612
+ display: flex;
613
+ flex-wrap: wrap;
614
+ gap: 10px;
615
+ }
616
+
617
+ .lpd-action-row a {
618
+ display: inline-flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ padding: 12px 14px;
622
+ border-radius: 999px;
623
+ text-decoration: none;
624
+ font-size: 13px;
625
+ font-weight: 700;
626
+ border: 1px solid var(--line-strong);
627
+ background: rgba(24, 20, 17, 0.04);
628
+ }
629
+
630
+ .lpd-root a.lpd-action-strong,
631
+ .lpd-action-row .lpd-action-strong {
632
+ background: var(--ink);
633
+ color: #fff;
634
+ border-color: var(--ink);
635
+ }
636
+
637
+ /* ── CLI workflow section ── */
638
+
639
+ .lpd-cli {
640
+ padding: 38px 0;
641
+ }
642
+
643
+ .lpd-cli-header {
644
+ display: grid;
645
+ gap: 12px;
646
+ margin-bottom: 28px;
647
+ }
648
+
649
+ .lpd-cli-header h2 {
650
+ font-size: clamp(34px, 4vw, 56px);
651
+ line-height: 0.98;
652
+ letter-spacing: -0.055em;
653
+ }
654
+
655
+ .lpd-cli-header p {
656
+ max-width: 58ch;
657
+ color: var(--muted);
658
+ font-size: 17px;
659
+ line-height: 1.6;
660
+ }
661
+
662
+ .lpd-cli-steps {
663
+ display: grid;
664
+ grid-template-columns: repeat(4, minmax(0, 1fr));
665
+ gap: 14px;
666
+ margin-bottom: 20px;
667
+ }
668
+
669
+ .lpd-cli-step {
670
+ display: grid;
671
+ gap: 10px;
672
+ }
673
+
674
+ .lpd-cli-step-label {
675
+ font-size: 13px;
676
+ font-weight: 700;
677
+ text-transform: uppercase;
678
+ letter-spacing: 0.06em;
679
+ color: var(--accent);
680
+ }
681
+
682
+ .lpd-cli-terminal {
683
+ border: 1px solid var(--line);
684
+ border-radius: 18px;
685
+ overflow: hidden;
686
+ background: var(--code-bg);
687
+ box-shadow: var(--shadow);
688
+ }
689
+
690
+ .lpd-cli-terminal-bar {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 10px;
694
+ padding: 10px 14px;
695
+ font-family: 'IBM Plex Mono', monospace;
696
+ font-size: 11px;
697
+ color: rgba(246, 240, 231, 0.52);
698
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
699
+ }
700
+
701
+ .lpd-cli-terminal pre {
702
+ margin: 0;
703
+ padding: 14px 16px 16px;
704
+ overflow-x: auto;
705
+ white-space: pre;
706
+ font-family: 'IBM Plex Mono', monospace;
707
+ font-size: 12.5px;
708
+ line-height: 1.65;
709
+ color: var(--code-ink);
710
+ background: transparent !important;
711
+ }
712
+
713
+ .lpd-cli-terminal pre code {
714
+ font-family: inherit;
715
+ font-size: inherit;
716
+ line-height: inherit;
717
+ background: transparent !important;
718
+ }
719
+
720
+ .lpd-cli-ai {
721
+ border: 1px solid var(--line);
722
+ border-radius: 22px;
723
+ padding: 20px 24px;
724
+ background: rgba(255, 255, 255, 0.52);
725
+ margin-bottom: 22px;
726
+ }
727
+
728
+ .lpd-cli-ai-copy {
729
+ display: grid;
730
+ gap: 6px;
731
+ }
732
+
733
+ .lpd-cli-ai-copy strong {
734
+ font-size: 16px;
735
+ }
736
+
737
+ .lpd-cli-ai-copy span {
738
+ color: var(--muted);
739
+ font-size: 15px;
740
+ line-height: 1.55;
741
+ }
742
+
743
+ .lpd-cli-actions {
744
+ display: flex;
745
+ flex-wrap: wrap;
746
+ gap: 10px;
747
+ }
748
+
749
+ /* ── Footer CTA ── */
750
+
751
+ .lpd-footer-cta {
752
+ margin-top: 34px;
753
+ border: 1px solid var(--line);
754
+ border-radius: 34px;
755
+ padding: 34px;
756
+ background: linear-gradient(180deg, rgba(255, 250, 244, 0.9), rgba(255, 246, 236, 0.76));
757
+ box-shadow: var(--shadow);
758
+ display: grid;
759
+ gap: 18px;
760
+ }
761
+
762
+ .lpd-footer-cta h2 {
763
+ font-size: clamp(34px, 4vw, 56px);
764
+ line-height: 0.98;
765
+ letter-spacing: -0.055em;
766
+ max-width: 14ch;
767
+ }
768
+
769
+ .lpd-footer-cta p {
770
+ font-size: 17px;
771
+ line-height: 1.6;
772
+ max-width: 58ch;
773
+ color: var(--muted);
774
+ }
775
+
776
+ .lpd-footer-cta .lpd-hero-actions {
777
+ margin-bottom: 0;
778
+ }
779
+
780
+ .lpd-footnote {
781
+ margin-top: 16px;
782
+ color: var(--muted);
783
+ font-size: 13px;
784
+ line-height: 1.55;
785
+ }
786
+
787
+ /* ── Responsive ── */
788
+
789
+ @media (max-width: 1100px) {
790
+ .lpd-hero-grid,
791
+ .lpd-proof-layout {
792
+ grid-template-columns: 1fr;
793
+ }
794
+
795
+ .lpd-hero-copy {
796
+ min-height: auto;
797
+ }
798
+
799
+ .lpd-cli-steps {
800
+ grid-template-columns: repeat(2, minmax(0, 1fr));
801
+ }
802
+ }
803
+
804
+ @media (max-width: 860px) {
805
+ .lpd-artifact-strip {
806
+ grid-template-columns: repeat(2, minmax(0, 1fr));
807
+ }
808
+
809
+ .lpd-hero-facts,
810
+ .lpd-fact-grid {
811
+ grid-template-columns: 1fr;
812
+ }
813
+
814
+ .lpd-proof-header {
815
+ grid-template-columns: 1fr;
816
+ gap: 10px;
817
+ }
818
+
819
+ .lpd-proof-number {
820
+ font-size: 46px;
821
+ }
822
+ }
823
+
824
+ @media (max-width: 640px) {
825
+ .lpd-shell,
826
+ .lpd-topbar-inner {
827
+ padding-left: 18px;
828
+ padding-right: 18px;
829
+ }
830
+
831
+ .lpd-hero {
832
+ padding-top: 28px;
833
+ }
834
+
835
+ .lpd-hero-copy,
836
+ .lpd-hero-visual,
837
+ .lpd-footer-cta {
838
+ border-radius: 24px;
839
+ }
840
+
841
+ .lpd-hero h1 {
842
+ max-width: none;
843
+ }
844
+
845
+ .lpd-artifact-strip {
846
+ grid-template-columns: 1fr;
847
+ }
848
+
849
+ .lpd-cli-steps {
850
+ grid-template-columns: 1fr;
851
+ }
852
+
853
+ .lpd-hero-frame {
854
+ min-height: 360px;
855
+ }
856
+ }