diff --git a/public/guides/split-step-assembly-demo.png b/public/guides/split-step-assembly-demo.png
new file mode 100644
index 0000000..abdd595
Binary files /dev/null and b/public/guides/split-step-assembly-demo.png differ
diff --git a/public/llms.txt b/public/llms.txt
index e324d16..14ef8f6 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -20,5 +20,8 @@ CAD Viewer is an open-source, in-browser CAD file viewer built on the OpenCascad
## Pricing
Free to use, no subscription required.
+## Guides
+- How to Split a STEP Assembly Into Separate Part Files (Free, Online): https://cadviewer.xyz/guides/split-step-assembly
+
## Live app
https://cadviewer.xyz/
diff --git a/public/sitemap.xml b/public/sitemap.xml
index 445da59..3ec7029 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -12,4 +12,10 @@
Supported: STEP · IGES · STL · OBJ · 3MF · BREP · GLB · DXF
diff --git a/src/pages/guides/SplitStepAssembly.module.css b/src/pages/guides/SplitStepAssembly.module.css new file mode 100644 index 0000000..3695378 --- /dev/null +++ b/src/pages/guides/SplitStepAssembly.module.css @@ -0,0 +1,290 @@ +:global(body.guide-page) { + overflow-y: auto; + height: auto; + min-height: 100vh; +} + +:global(body.guide-page #root) { + height: auto; + min-height: 100vh; +} + +.page { + min-height: 100vh; + background: #fafafa; + color: #1a1a1a; + display: flex; + justify-content: center; + padding: 4rem 1.5rem 6rem; +} + +.article { + width: min(720px, 100%); + display: flex; + flex-direction: column; + gap: clamp(3rem, 5vw, 4rem); +} + +.section { + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.breadcrumb { + display: inline-flex; + align-self: flex-start; + color: #4b5563; + font-size: 0.9rem; + text-decoration: none; +} + +.breadcrumb:hover { + color: #3b82f6; +} + +.eyebrow { + margin: 0; + color: #6b7280; + font-family: + "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + font-size: 0.75rem; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.headline { + margin: 0.5rem 0 0; + color: #1a1a1a; + font-size: 2.25rem; + line-height: 1.2; + font-weight: 700; +} + +.intro { + margin: 0; + color: #4b5563; + font-size: 1.1rem; + line-height: 1.7; +} + +.lede { + margin: 0; + color: #1f2937; + font-size: 1.1rem; + line-height: 1.7; +} + +.sectionHeading { + margin: 0; + color: #1a1a1a; + font-size: 1.5rem; + font-weight: 700; +} + +.paragraph { + margin: 0; + color: #4b5563; + font-size: 1.05rem; + line-height: 1.7; +} + +.list { + margin: 0; + padding-left: 1.25rem; + color: #4b5563; + font-size: 1.05rem; + line-height: 1.7; + display: flex; + flex-direction: column; + gap: 0.65rem; +} + +.externalLink { + color: #2563eb; + text-decoration: underline; + text-underline-offset: 2px; +} + +.externalLink:hover { + color: #1d4ed8; +} + +/* "Why you'd need to do this" cards */ +.cardList { + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-direction: column; + gap: 0.85rem; +} + +.reasonCard { + background: #f3f4f6; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 1.1rem 1.4rem; + color: #374151; + font-size: 1.02rem; + line-height: 1.6; +} + +/* Numbered step cards */ +.stepList { + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-direction: column; + gap: 0.85rem; +} + +.stepCard { + display: flex; + align-items: flex-start; + gap: 1.1rem; + background: #ffffff; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 1.25rem 1.5rem; +} + +.stepNumber { + flex: none; + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.5rem; + height: 2.5rem; + border-radius: 999px; + background: #eff6ff; + color: #3b82f6; + font-size: 1.15rem; + font-weight: 700; +} + +.stepBody { + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +.stepTitle { + margin: 0; + color: #1a1a1a; + font-size: 1.05rem; + font-weight: 700; +} + +.stepDescription { + margin: 0; + color: #4b5563; + font-size: 1rem; + line-height: 1.6; +} + +.stepImageWrap { + margin: 0.5rem 0; +} + +/* FAQ accordion */ +.faqGrid { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.faqItem { + background: #ffffff; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 0.35rem 1.5rem; +} + +.faqItem[open] { + padding-bottom: 1.25rem; +} + +.faqQuestion { + margin: 0; + padding: 1rem 0; + color: #1a1a1a; + font-size: 1.05rem; + font-weight: 600; + cursor: pointer; + list-style: none; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.faqQuestion::-webkit-details-marker { + display: none; +} + +.faqQuestion::after { + content: "+"; + flex: none; + color: #3b82f6; + font-size: 1.3rem; + font-weight: 400; + transition: transform 0.15s ease; +} + +.faqItem[open] .faqQuestion::after { + transform: rotate(45deg); +} + +.faqAnswer { + margin: 0.25rem 0 0; + color: #4b5563; + font-size: 1rem; + line-height: 1.65; +} + +.ctaRow { + margin-top: 0.25rem; +} + +.cta { + display: inline-block; + background: #3b82f6; + color: #ffffff; + border: none; + border-radius: 8px; + padding: 0.85rem 2.25rem; + font-size: 1rem; + font-weight: 600; + text-decoration: none; + box-shadow: 0 8px 24px -8px rgba(59, 130, 246, 0.45); + transition: + background 0.15s ease, + transform 0.15s ease; +} + +.cta:hover { + background: #2563eb; + transform: translateY(-1px); +} + +@media (max-width: 768px) { + .page { + padding: 2.5rem 1.25rem 4rem; + } + + .article { + gap: clamp(2.25rem, 8vw, 3rem); + } + + .headline { + font-size: 1.75rem; + } + + .stepCard { + flex-direction: column; + gap: 0.6rem; + } +} diff --git a/src/pages/guides/SplitStepAssembly.tsx b/src/pages/guides/SplitStepAssembly.tsx new file mode 100644 index 0000000..b60d4aa --- /dev/null +++ b/src/pages/guides/SplitStepAssembly.tsx @@ -0,0 +1,309 @@ +import type { ReactNode } from "react"; +import { Link } from "react-router-dom"; +import { Head } from "vite-react-ssg"; +import styles from "./SplitStepAssembly.module.css"; + +function ExternalLink({ + href, + children, +}: { + href: string; + children: ReactNode; +}) { + return ( + + {children} + + ); +} + +const WHY_REASONS = [ + "Quoting a single part — a supplier or machine shop only needs the one component you're sending out, not your entire 89-part assembly", + "3D printing one piece — you only want to print the bracket, not the whole mechanism it belongs to", + "Reusing a part — pulling one standard component out of an assembly to use in a new project", + "Sharing without exposing the whole design — sending a single part without handing over your full assembly", +]; + +const PAINFUL_WAYS: ReactNode[] = [ + <> +