d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
61 lines
3.0 KiB
TypeScript
61 lines
3.0 KiB
TypeScript
/**
|
|
* Platform-layout spacing - the single source of truth for every gutter, gap,
|
|
* inset, and reserved dimension used across the platform-page components.
|
|
*
|
|
* The padding fortress lives here. No platform component accepts a `className`,
|
|
* `style`, or any layout-override prop, and none hard-codes a spacing value
|
|
* inline. Every measurement a reviewer might want to audit - the horizontal
|
|
* gutter, the inter-section rhythm, the card-grid gaps, the card stack, and the
|
|
* fixed visual-slot dimensions - is named in this one file. To change spacing
|
|
* you edit a constant here; a consumer page literally cannot reach it.
|
|
*
|
|
* All values are Tailwind class fragments (not raw numbers) so they compose
|
|
* directly into `className` strings inside the components and stay legible.
|
|
*/
|
|
export const PLATFORM_SPACING = {
|
|
/**
|
|
* The one horizontal gutter, owned solely by `PlatformPage`. Matches the
|
|
* navbar and landing hero exactly (`px-20 max-lg:px-8 max-sm:px-5`) so platform
|
|
* content starts on the wordmark's vertical line at every breakpoint. Sections
|
|
* and cards never set their own gutter.
|
|
*/
|
|
gutter: 'px-20 max-lg:px-8 max-sm:px-5',
|
|
/**
|
|
* Inter-section vertical rhythm - the gap of the `<main>` flex column that
|
|
* `PlatformPage` owns. Sections carry no vertical margin/padding of their own,
|
|
* so this is the only knob for the space between the hero, logos, and every
|
|
* card row. Tightens on smaller screens in lockstep with the landing `<main>`
|
|
* (`gap-[120px] max-lg:gap-[88px] max-sm:gap-16`).
|
|
*/
|
|
sectionRhythm: 'gap-[120px] max-lg:gap-[88px] max-sm:gap-16',
|
|
/** Hero text top padding, matching the landing hero (`pt-[112px] max-sm:pt-12`). */
|
|
heroTopPadding: 'pt-[112px] max-sm:pt-12',
|
|
/** Vertical stack gap inside the hero header column (headline → description → CTA). */
|
|
heroStack: 'gap-[22px]',
|
|
/** Gap between the hero header column and the full-width hero visual beneath it. */
|
|
heroToVisual: 'gap-12',
|
|
/** Gap between a card row's header block and the card grid beneath it. */
|
|
cardRowHeaderToGrid: 'gap-12',
|
|
/** Vertical stack gap inside a card row's header (title → subtitle → CTA). */
|
|
cardRowHeaderStack: 'gap-5',
|
|
/** Gap between cards within a card-row grid (both axes). */
|
|
cardGridGap: 'gap-8',
|
|
/** Minimum gap between a card's text block and its visual panel. */
|
|
cardTextToVisual: 'gap-5',
|
|
/** Vertical stack gap inside a card's text block (title → description). */
|
|
cardTextStack: 'gap-2',
|
|
} as const
|
|
|
|
/**
|
|
* Reserved fixed dimensions for the component-owned visual frames. A dropped-in
|
|
* `ReactNode` renders into a frame of exactly these dimensions, so it can never
|
|
* shift surrounding layout (CLS = 0) nor change its own frame padding. The node
|
|
* fills `h-full w-full` inside; it owns nothing about the frame.
|
|
*/
|
|
export const PLATFORM_VISUAL = {
|
|
/** Full-width hero visual aspect ratio - reserves height before paint. */
|
|
heroAspect: 'aspect-[16/9]',
|
|
/** Fixed height of a card's visual panel - uniform across every card. */
|
|
cardHeight: 'h-[240px]',
|
|
} as const
|