Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

165 lines
8.4 KiB
TypeScript

import { ChipTag, cn } from '@sim/emcn'
import { ShieldCheck } from '@sim/emcn/icons'
import { FeatureGraphicShell } from '@/app/(landing)/enterprise/components/feature-graphics/feature-graphic-shell'
import styles from '@/app/(landing)/enterprise/components/feature-graphics/standards-graphic.module.css'
/**
* Enterprise standards told as a certification seal, with no window
* framing: a shield-check medallion at the center wearing the deploy
* tile's Deploy-button chrome — the same `--text-muted` fill with
* `--text-inverse` ink — so the two dark tiles' hero elements read as
* siblings. It is ringed by two concentric hairlines like a certificate
* mark, with the outer ring dissolving through a mask the way the row's
* older elements fade. The tile's two claims anchor the seal from either
* side over short hairline connectors with port dots (the access tile's
* junction vocabulary): a `SOC 2` chip and an `Open source` chip, whose
* mono `--surface-5` fills read as light pills on the dark ground
* exactly like the deploy tile's ChipTag. Each chip is anchored by its
* connector-facing edge to the connector's endpoint (not centered on a
* fixed x), so both junctions stay flush regardless of label width. A `Verified` pill beneath the seal carries the emphasized
* state on the deploy tile's `--text-muted` chip fill with `--text-inverse`
* ink (ChipTag's solid variant would vanish here — its fill is the tile's
* own `--text-secondary`). The seal blooms the row's shared 6s ring pulse
* (from `standards-graphic.module.css`, removed under
* `prefers-reduced-motion`).
*
* Inks follow the deploy tile's dark-surface palette: hairlines and dots
* mix `--text-muted-inverse` toward transparent (45% on the working
* lines, fainter on the decorative rings), and the port dots fill with
* the tile's `--text-secondary` so the connector reads as passing
* beneath them.
*
* The two connectors are SVG paths normalized to `pathLength=1` so they
* draw in with the page's dash vocabulary (the deploy tile's stagger):
* SOC 2 draws into the seal first, the seal draws out to Open source a
* beat later, both hold, then un-draw forward and loop on the shared 6s
* timeline. Under `prefers-reduced-motion` they render fully drawn with
* no animation.
*
* Each ring also carries a comet arc — the deploy tile's white connector
* sweep made circular: a fixed 50° arc over the hairline, stroked with a
* `userSpaceOnUse` linear gradient that is bright at the clockwise
* leading tip and fades to transparent along the trailing side, inside a
* group that rotates around the seal center (a rotating group rather
* than a dash offset, because a dash wrapping the circle's path start
* renders a stray seam-cap artifact). The two orbits share one 14s
* period but the outer runs phase-shifted half a revolution, so the
* sweeps are never synchronized; the outer sweep sits inside the same
* fade mask as its hairline so it dissolves through the bottom of the
* tile like the ring it traces. Under `prefers-reduced-motion` the
* sweeps are hidden entirely.
*
* The feature tile's visual slot bleeds `2rem` right (`1.5rem` under
* `max-lg`) but not left, so the canvas sits inside a matching
* right-padded box to land on the tile's visible center instead of the
* bled slot's center. The canvas itself is centered with a transform
* (`left-1/2` + `-translate-x-1/2`) rather than flex `justify-center`
* because an overflowing fixed-size flex item start-aligns instead of
* centering once the tile gets narrower than the canvas. On the narrow
* grid bands where the tile drops below the canvas width (small
* two-column screens and the 3-up row just past `lg`) the canvas scales
* down via transform so the SOC 2 / Open source chips are never cropped.
*/
export function StandardsGraphic() {
return (
<FeatureGraphicShell>
<div aria-hidden='true' className='absolute inset-0 pr-8 max-lg:pr-6'>
<div className='relative h-full'>
<div className='-translate-x-1/2 -translate-y-1/2 absolute top-1/2 left-1/2 h-[250px] w-[320px] max-sm:scale-100 max-md:scale-[0.8] lg:max-[1180px]:scale-[0.8]'>
<div className='absolute top-0 left-[48px] size-[224px] rounded-full border border-[color:color-mix(in_srgb,var(--text-muted-inverse)_22%,transparent)] [mask-image:linear-gradient(to_bottom,black_30%,transparent_92%)]' />
<div className='absolute top-[36px] left-[84px] size-[152px] rounded-full border border-[color:color-mix(in_srgb,var(--text-muted-inverse)_35%,transparent)]' />
<svg
className='absolute inset-0'
fill='none'
viewBox='0 0 320 250'
width={320}
height={250}
>
<defs>
<linearGradient
id='standards-sweep-inner'
gradientUnits='userSpaceOnUse'
x1='235.5'
y1='112'
x2='208.53'
y2='169.84'
>
<stop offset='0' stopColor='var(--text-inverse)' stopOpacity='0' />
<stop offset='1' stopColor='var(--text-inverse)' stopOpacity='0.9' />
</linearGradient>
<linearGradient
id='standards-sweep-outer'
gradientUnits='userSpaceOnUse'
x1='271.5'
y1='112'
x2='231.67'
y2='197.41'
>
<stop offset='0' stopColor='var(--text-inverse)' stopOpacity='0' />
<stop offset='1' stopColor='var(--text-inverse)' stopOpacity='0.9' />
</linearGradient>
</defs>
<g className='[mask-image:linear-gradient(to_bottom,black_30%,transparent_92%)]'>
<g className={cn(styles.ringSweep, styles.ringSweepOuter)}>
<path
d='M 271.5 112 A 111.5 111.5 0 0 1 231.67 197.41'
stroke='url(#standards-sweep-outer)'
strokeWidth='1'
strokeLinecap='round'
/>
</g>
</g>
<g className={styles.ringSweep}>
<path
d='M 235.5 112 A 75.5 75.5 0 0 1 208.53 169.84'
stroke='url(#standards-sweep-inner)'
strokeWidth='1'
strokeLinecap='round'
/>
</g>
<path
d='M 90 112.5 L 122 112.5'
pathLength={1}
className={styles.connector}
stroke='color-mix(in srgb, var(--text-muted-inverse) 45%, transparent)'
strokeWidth='1'
/>
<path
d='M 198 112.5 L 230 112.5'
pathLength={1}
className={cn(styles.connector, styles.connectorTrailing)}
stroke='color-mix(in srgb, var(--text-muted-inverse) 45%, transparent)'
strokeWidth='1'
/>
</svg>
<span className='absolute top-[108px] left-[118px] size-2 rounded-full border border-[color:color-mix(in_srgb,var(--text-muted-inverse)_70%,transparent)] bg-[var(--text-secondary)]' />
<span className='absolute top-[108px] left-[194px] size-2 rounded-full border border-[color:color-mix(in_srgb,var(--text-muted-inverse)_70%,transparent)] bg-[var(--text-secondary)]' />
<div
className={cn(
'absolute top-[74px] left-[122px] flex size-[76px] items-center justify-center rounded-full bg-[var(--text-muted)] shadow-sm',
styles.sealPulse
)}
>
<ShieldCheck className='size-7 text-[var(--text-inverse)]' />
</div>
<span className='-translate-x-full -translate-y-1/2 absolute top-[112px] left-[90px] whitespace-nowrap'>
<ChipTag variant='mono'>SOC 2</ChipTag>
</span>
<span className='-translate-y-1/2 absolute top-[112px] left-[230px] whitespace-nowrap'>
<ChipTag variant='mono'>Open source</ChipTag>
</span>
<span className='-translate-x-1/2 absolute top-[172px] left-1/2 flex h-5 items-center rounded-md bg-[var(--text-muted)] px-1.5 font-medium text-[var(--text-inverse)] text-caption'>
Verified
</span>
</div>
</div>
</div>
</FeatureGraphicShell>
)
}