SOPHIA XT
Design · Sophia Design Forge

The system that builds the next site

Anyone with a browser can copy the look of a single page. What does not transfer is the thing that produced it and will produce the next one at the same standard: a token layer four brands share, a pattern set with the hard cases already solved, and a command line that refuses to hand back a structure close to one already shipped. This page is that system, running.

Not the same thing as SophiaForge, which is the ticket to pull request environment. This page is the design system.

What it is
Seven packages, one token layer

The core package holds the accessible primitives: dialogs, menus, tables, form controls, a command palette. The pattern package holds the parts a real site is made of, grouped by what they are for rather than by what they look like. Backgrounds, motion and a three-dimensional module sit beside them, the themes are colour and nothing else, and a command line ties the set to a project.

One rule holds the whole thing together and every claim on this page rests on it. A component reads semantic token names and never a raw colour, so a brand change is a block of custom properties and touches no component at all. The rest of this page is that rule being exercised.

The command line
forge init write the project's forge config
forge list every component, by module
forge patterns search the pattern set by name or intent
forge add copy one component into the project
forge api print a component's props from the source
forge theme generate a token block from a locked palette
forge eject copy the modules a project uses into its own tree
forge compose pick a structure that diverges from prior work
forge template scaffold a page from a composition
forge ledger what has already been shipped, locally
forge gate refuse a build that trips the ship checks
forge conventions print the house rules a reviewer applies
Measured
packages7
source files265
pattern modules17
pattern components171
core components38
design tokens64
brand themes4
skins9

Licence changed from MIT to a proprietary notice on 16 September 2026. Client projects hold their own ejected copy, which is why that change did not reach back into work already shipped.

Counts are from the source tree as it stands: files are TypeScript, TSX, CSS and MJS outside node_modules, and a component is an exported function or constant that returns markup. The library is proprietary and is not publicly released, so these numbers are the description, not an invitation to download it.

Figure 1 · The token layer
One switch, four brands, no component touched

Dark canvas, cyan primary, violet accent. What this site runs.

Deployments
Release 4.11
Controls
Passing v4.11.2
Instruments
Surfaces
  • Requests 12,480 6.2% up 74% of goal
  • Conversions 318 1.4% up 52% of goal
  • Latency p95 184 ms 9 ms down 31% of goal
Computed tokens
bg#0a0e14
surface#111823
text#e6edf3
primary#22d3ee
accent#7c3aed
border#212d3a
focus#22d3ee
data-dfx-themesophiaxt
button fillrgb(34, 211, 238)

A theme in this system is a block of custom properties and nothing else. No component imports a colour, so there is no component to update when a brand changes.

The token values printed beside the specimen are read out of the live document with getComputedStyle after every switch, not written into this page. The last row is the resolved background colour of the primary button, which is the part that matters: the button was never told what colour to be.

Figure 2 · One system, two brands
The same markup, side by side
ServiceLens
Deployments
Release 4.11
Controls
Passing v4.11.2
Surfaces
  • Requests 12,480 6.2% up 74% of goal
  • Conversions 318 1.4% up 52% of goal
  • Latency p95 184 ms 9 ms down 31% of goal
Shoebox
Deployments
Release 4.11
Controls
Passing v4.11.2
Surfaces
  • Requests 12,480 6.2% up 74% of goal
  • Conversions 318 1.4% up 52% of goal
  • Latency p95 184 ms 9 ms down 31% of goal

Neither column was designed twice. This is one component tree rendered twice inside two wrappers that differ by one attribute. A studio that rebuilds this arrangement for each client is paying for the same layout every time and getting a slightly different one back.

Family 1 · Frames and edges
Chrome that holds a shape without a border image
Notched on one diagonal pair, with brackets inside.
Frame frames

A notched container that still has a real border. clip-path removes a border along with everything else it cuts, so this stacks a clipped border layer behind a slightly smaller clipped fill and the hairline showing between them is the outline.

viewfinder
Brackets frames

Corner brackets on their own, for wrapping something that is not a Frame: an image, a video, a canvas. Always decoration, never announced.

Cut frames

One clip, no border, so it clips its children. That is the whole reason to use it over Frame: an image inside a Frame squares its own corner off again, an image inside a Cut takes the shape.

Section with a chevron foot.
Edge frames

A shaped top or bottom on a block, holding a depth in pixels. The bite is the same size on a phone and on an ultrawide, which is what you want when the shape has to clear a fixed amount of the block.

Four degrees, constant at any width.
Diagonal frames

The other half of that pair. Diagonal holds an angle in degrees and converts it through tan to a share of the viewport width, so the slope is identical at every width. Hand-rolled diagonals built on a fixed rise look right on a laptop and nearly flat on an ultrawide.

Section 02
Rule frames

A line with end ticks and an optional inline label. It costs one element and it makes a layout read as surveyed rather than decorated.

Six components, one idea: geometry belongs in the clip path, not in a PNG. Each one takes its measurements as custom properties, so a notch depth or a slope angle is a number in the markup rather than a new asset.

Family 2 · Print and paper
Treatments that came off a press, computed at paint time
Invoice
Ledger entry 4471, filed under district works, third quarter.
Tape frames

A strip of masking tape across a corner. Both short ends are torn from one irregular polygon rather than a repeated unit, because a tear that repeats stops reading as a tear. Blank tape leaves the accessibility tree; tape with a word on it is a label and keeps it.

Clipping
Torn from the foot of the page.
Torn frames

A block with one torn edge, cut from twenty-three points with irregular spacing and irregular depth so nothing in the profile recurs. Raising the depth is what fixes a stretched tear on a wide block, not a repeating unit.

Admit one
Stub 0041
Perforation frames

The tear-off edge of a ticket. The holes are masked out rather than painted in the page colour, so whatever is behind the stub shows through them. The two oversized end notches are what make it read as something meant to be torn instead of a dotted rule.

SOPHIA XT · VERIFIED BUILD ·4.11
Seal frames

A stamped badge with text set around the ring on a single textPath arc, not one span per letter. The arc starts at six o'clock and runs clockwise, which puts the midpoint of the path at twelve so the text centres over the top rather than down the right-hand side.

Product card
New
Ribbon frames

The corner banner. The usual way to clip a 45 degree band is overflow hidden on the card, which also clips focus rings, disables sticky inside it and turns the card into a scroll container. This brings its own clip box and leaves the card alone.

Plate 3
Ledger entry 4471, filed under district works, third quarter.
Halftone frames

A dot screen: one radial gradient tiled by background-size and rotated as a whole, so the dots sit on the angled lattice a press would print them on. The layer is oversized because turning a box 45 degrees leaves up to 41 percent of its container bare.

Exposure
Ledger entry 4471, filed under district works, third quarter.
Grain frames

Film grain from feTurbulence, computed at paint time. It scales to any size with no visible tile and costs nothing on the wire. Frequency is the control that matters: 0.9 is 35mm, 0.3 is a photocopy.

Feed 02
Ledger entry 4471, filed under district works, third quarter.
Scanlines frames

CRT lines at three named densities rather than a free length. Below about 2px the lines land on half a device pixel wherever the display scale is fractional, and the overlay turns into a moire that crawls as the page scrolls.

Sheet A
Ledger entry 4471, filed under district works, third quarter.
Blueprint frames

A drafting grid with heavier lines every few cells. The major spacing is a whole-number multiple of the minor cell rather than a second length, so the two grids can never fall out of phase at any value either one takes.

Legible either way
Glass frames

A frosted panel that plans for the case where backdrop-filter does not apply. When it is missing, the unsupported branch drops the transparency entirely, because a 60 percent translucent panel over a photograph is not a softer panel, it is body copy printed on a photograph.

The shortcut for all of these is a tiled PNG. A tile repeats visibly across anything bigger than a card, and it is bytes on the wire before the surface looks finished. Every treatment here is generated by the browser: turbulence, gradients, masks and one SVG arc.

Family 4 · Scene and instruments
A picture of hardware, with something running inside it
sophiaxt.com/lab
Throughput
Ingest 1.2k/s , waiting
Parse 1.2k/s , waiting
Index 980/s , running
Serve 940/s , waiting
Capacity
What the mockup is not

A device frame is a picture of a screen, so the chrome is decoration: the notch, the traffic lights, the bezel ring and the ground plane are all hidden from assistive technology and made inert. Whatever the caller puts on the screen is real content and is left alone. The screens scroll rather than clip, because a 3D transform does not stop a subtree taking focus and content parked outside a clipped box is content nobody can reach.

The tab stop on a screen is measured rather than assumed. A screen that can show all of its content gets no tab stop at all, because a page with five mockups on it would otherwise collect five stops that do nothing and say nothing.

The instrument set
LiveChart scene

An area chart that draws itself in. The path length is summed from the points rather than read back with getTotalLength, which needs a laid-out element, so the draw works in a server render. The travelling dot is the same path again with a zero-length dash and a round cap.

ThroughputBars scene

A row of bars where the height is the data and the pulse is a separate transform on top. Cancelling the animation under reduced motion leaves each bar standing at exactly its value. Phases are spread with a negative delay so the row is already mid-pulse on the first frame.

WaveBars scene

The audio meter. The original animated height, which relayouts the whole flex line on every frame: twenty bars at 60fps is twelve hundred layout passes a second for a decoration. Here the swell is scaleY off a bottom origin, and the trough is a fraction of each bar's real level so a quiet bar stays quiet.

Ingest 1.2k/s , waiting
Parse 1.2k/s , waiting
Index 980/s , running
PipelineFlow scene

Named stages with packets crossing between them on offset-path. The path string is built from the connector length prop rather than written into the stylesheet, so a lane width and a hardcoded path cannot drift apart. A plain translate is the base rule and the motion path is layered over it.

RadialGauge scene

A real progressbar with a value, a minimum and a maximum, not a div with a number in it. The ring's end offset is a custom property computed from the value, so one keyframe serves any reading, and the digits are tabular so the readout does not jitter inside a ring that is not moving.

Sheen
  • Indexed documents 4.1M 12k up 82% of goal
  • Open sessions 1,204 38 up 47% of goal
  • Error budget 92% 1% down 92% of goal
MetricRow, LiveDot, Sheen scene

The small parts. Metric rows take the whole set because a stagger is a relation between siblings rather than a property of one. The dot is a status light with a halo on each beat. Sheen is the slow highlight that crosses a surface once in a while.

The angles are the reason this reads as an object rather than a rotated rectangle. Perspective applies to an element's children and not to the element itself, so the stage and the rig are two elements; 1700px is a long lens, and the tilt stops at about eight degrees because past fifteen the type on the screens starts to blur. The rig follows a fine pointer and never installs a listener on a touch device or under reduced motion.

Family 3 · Arrangement
Layout primitives that hold no content and no colour
2 x 2
2 x 1
1
1
4 x 1
Bento layout

Mixed-span tiles, densely packed. Spans are clamped through container queries at two steps, so the grid reflows on the width of the grid rather than the width of the window: the same tiles are four tracks here, two in a sidebar and one on a phone, and a span of three never adds an implicit fourth column and pushes the page sideways.

01
02
03
04
05
06
Reel layout

A horizontal strip that keeps its scrollbar, names its region, and takes a tab stop only when it measures content it cannot show. A tabIndex on a strip that fits is a stop in the tab order that does nothing and announces nothing.

FRAMES SCENE PANELS SHELLS SECTIONS SKINS
Marquee layout

An infinite ticker that translates a duplicated group by exactly one group width, with the separation carried inside the group. The hand-rolled version animates margin-left, relayouts the strip every frame, and desynchronises the moment the content changes.

angle · a straight slope
wave · one period, not a ripple
arc · a segment of a circle
zigzag · a saw edge
torn · the paper profile again
notch · a single bite
step · a stair
fade · no shape at all
Divider sections

Eight shapes for the edge between two sections, plus the absence of one. It is the cheapest structural decision on a page and the one a visitor actually remembers about its silhouette, which is why the composition engine treats it as a dimension of its own.

Icon icons

One 24px grid, 1.75 stroke, round caps and joins, currentColor only, decorative unless given a name. 47 glyphs drawn on the same grid rather than a vendored set, because a mixed-weight icon row is the fastest way to make a careful layout look assembled from stock parts.

Compose
Three parts, no new rules.
Glass, Frame, Rule together frames

The point of a family is that the members compose. A frosted panel inside a notched frame under a labelled rule is three components and no new CSS, and it re-themes with the token layer like everything else.

These decide where things sit and nothing else. Anything with an opinion about what goes inside it lives in a different module, which is why the same bento is correct on a hardware product page and on a documentation index.

Figure 3 · The shape layer
Nine skins over one component vocabulary
angular
What the skin did
data-skinangular
radius0px
border1px
clip-pathpolygon

Notched corners and hard edges. Reads as instrumentation.

Skins nest. The nearest one wins, so a single section can carry a different shape language without the page around it knowing.

Colour did not change between any two of these. A skin sets geometry and weight only, so it can never fight the palette a project has locked. The reference boards behind this module were a torn-paper craft club, a flat-illustration outdoor brand, an editorial landscape studio and a finance dashboard: four completely different looks built from the same nav item, button, toggle, field and icon set.

Figure 4 · The motion vocabulary
Animation as a named set, not a keyframe at the call site

Arrival. Each one ends at the element's resting state.

Item 01
Item 02
Item 03
Item 04
Read from the library
animations49
families5
hover effects10
text effects4
named easings7
playingclipUp
Hover
Point at this

Every effect is bound to focus as well as hover, so a keyboard walks the page through the same states a cursor does.

Text
Structure survives a repalette

Under a reduced-motion preference the set stands down: entrances resolve to their end state, loops stop, text effects do not run. That is one rule in one stylesheet rather than a check at every call site, which is the only way it stays true after the twentieth component. One thing keeps moving on purpose. A loading spinner slows to a 2.4 second turn instead of stopping, because a spinner that has stopped reads as a hung application rather than as a preference being respected.

The reason for a vocabulary rather than a handful of favourites is the tell it removes. Left unchosen, every element on every site fades up from below, and that single default is the loudest sign of generated work on the web. The composition engine picks an entrance family per project for exactly this reason.

Figure 5 · The composition engine
Structure is where sameness survives
Skin 9
soft angular pill editorial paper neobrutal clay pixel luxe
Hero 5
SplitHero FramedHero StackHero EditorialHero BandHero
Background 5
none aurora waves grid beams
Balance 5
left-heavy right-heavy centred full-bleed split-rail
Spine 5
proof-first problem-first offer-first story-first index-first
Motion 6
reveal-only scroll-stack shared-element kinetic-type pointer-reactive none
Layout 18
bento split-pinned rail-and-column masonry reel-rows uniform-grid single-column magazine broadsheet zine-offset scroll-deck mosaic timeline-spine seeded-rhythm docs-rails catalog-rail list-detail console-regions
Entrance 6
rise settle reveal unfold drift none
Divider 9
straight angle wave arc zigzag torn notch step fade
Type 5
display-serif + grotesk-body condensed-display + humanist-body grotesk-display + serif-body mono-accent + neutral-body single-superfamily

The whole space.

Computed
dimensions10
whole space164.0 million
after rules164.0 million
share left100.0%
min distance5 of 10

The narrowing is the design judgement, not a limitation. A torn-edge finance dashboard is not diversity, it is wrong, so the archetype removes it before divergence is measured. What is left is still large enough that no studio will exhaust it, and the engine says so out loud when a constraint makes it lower the bar rather than quietly returning a near duplicate.

The minimum distance is written as a fraction of the dimension count rather than a flat number, so adding a dimension raises the bar instead of quietly lowering it.

Two sites with different palettes, the same skin, the same hero and the same section order are recognisably the same site. That is the mechanism behind every complaint that generated work looks alike, and it is not the colours. So the command line picks a composition across these ten dimensions, then measures it against every project the studio has already shipped and refuses to hand back one that is closer than half the dimensions to any of them. Given a seed the answer is reproducible, which means a composition can be audited rather than defended.

Where it runs
This site, in production, today
Surfaces on this site
  • The navigation overlay, built from Blueprint, Rule and a staggered Sequence.
  • The site header and footer chrome.
  • The home page: Marquee, Divider, ScanLine, Sheen and the hover set.
  • The R&D section: the perspective rig, the business scene and the work stack.
  • The Paper Front page, which uses the notched Frame throughout.
Beyond this site

The library carries four brand themes. Two are for this company, and one is cut for ServiceLens, the field diagnostics product listed on the work index and public at diagbuddygo.com. A theme is a token block and nothing more, which is the point: a brand can be decided before a single component is written.

Stated plainly so nobody infers more than is true: sophiaxt.com is the only production front end running these packages today. The client work on the work index was built by the same studio and, in several cases, is where these patterns were measured from, but those sites do not import the library.

Eight files on sophiaxt.com import the system directly, this page aside, and the stylesheets are loaded once at the app root. The site chrome, the navigation overlay, the home page visuals, the R&D scene and the Paper Front page are all built from it. The rest of the site inherits the token layer whether or not it imports a component.

In the library, not in this build
What ejecting leaves behind, and why that is the right default
GridField panels

The technical grid behind a panel's contents, drawn as two repeating gradients rather than a tiled image, with the pitch as a custom property. The flicker stays inside a narrow band around a fifth of full strength, because the moment the grid is legible enough to count the squares it is competing with the content sitting on it.

FieldScan panels

The sweep that crosses a panel, on either axis. A layer rather than a wrapper, moved with translate3d and nothing else, so it is one composited layer over a ground that never repaints.

PourFill panels

A wash that fills a panel and dissolves. Height runs the whole timeline while opacity peaks at 35 percent and is gone by the end, and the two curves being out of phase is what makes it read as liquid arriving rather than a rectangle growing.

EdgeGlow panels

Light travelling around a rim. A conic gradient painted once onto an oversized pseudo-element, masked to a one pixel ring and rotated by transform. Animating the gradient's angle instead looks identical and re-rasterises it every frame.

RailProgress panels

The rail across the foot of a panel. A real reading is a progressbar carrying its value, minimum and maximum; an indeterminate one with no name is decoration and is hidden. The fill is scaleX driven by a custom property, never width.

MagazineGrid shells

A front page: lead, sidebar, a run of briefs, a strip. Equal tracks say every story matters the same amount, which is the one thing a front page must never say. It reflows on its own width, and nothing is reordered by CSS, so source order stays the reading order.

BroadsheetColumns shells

Newspaper columns set with column-width rather than column-count. A count divides whatever width it is given, so three columns on a phone is three columns of four words; a width lets the browser decide how many fit, with no media query.

ZineStack shells

Lanes that overlap on purpose, off-grid, for work that should not look like a template.

MosaicWall shells

A strict grid with a feature tile at a fixed interval, so the rhythm is regular and the emphasis is not.

Plinth and Vitrine scene

A pedestal with one object and a contact shadow, and the lit display case version of it. The cone of light descends from above and lands as a pool on the deck, rather than a glow behind the object, which would put the brightest part of the image where light cannot come from. The glass refuses pointer events so the links under it stay clickable.

IsoGrid scene

Tiles on an axonometric plane. True isometric is 54.736 degrees, the angle at which the three axes foreshorten equally, and also the angle at which every label becomes unreadable. The default is a dimetric compromise and the exact numbers are two props away for a diagram with no text in it.

CubeFace scene

A turning cube whose pose is accumulated rather than reset, so the tenth turn takes the shortest arc instead of unwinding 450 degrees. Five faces are turned away at any moment and every one of them is hidden and inert.

ArcMenu nav

A corner trigger that fans its items on an arc. The DOM order is the order of the items array and the arc is produced entirely by a per-item transform, so changing the sweep angle cannot change the reading order. The whole widget portals to the body, because fixed positioning is relative to the nearest transformed ancestor rather than the viewport.

SegmentedDrawer nav

Two navigation trees behind a segmented control, for the sites that genuinely have two. Both panels stay mounted with the inactive one hidden, which keeps a half-scrolled tree where the user left it.

TabBarFab nav

A bottom tab bar with the primary action raised out of the row. The action sits in the middle of the DOM as well as the middle of the bar, and the safe-area padding is not optional: without it the labels sit under the home indicator on every gesture-navigation phone.

NumberTicker dashboard

A number that animates to its value in tabular figures, continues from wherever it actually is rather than restarting at zero on every poll, and announces only the final value instead of every frame.

SplitText and Diffuse fx

Text staged in parts, and text resolving out of blur as one node. The split version caps the whole run so a forty-word paragraph does not arrive 1.6 seconds after the reader does, and the unsplit version is the one to reach for first, because every split effect costs a DOM node per word.

A project does not install this system, it ejects from it: the command line copies the modules the project imports into the project's own tree and leaves the rest. This site's copy carries nine of the seventeen modules, so the patterns below are described rather than rendered. Restoring any of them is one command, and the copy is the project's from that moment on, which is why nothing here can break a client site by shipping a new version.

The case
What copies, and what does not

A page is a public artefact. Every colour, every radius and every animation on it can be read out of the browser by anyone who wants them, and pretending otherwise would be a strange thing for a studio to claim. Copying a page is a day of work and it produces exactly one page.

The part that does not transfer is the next one. A system decides the hard cases once: the notch that keeps its border, the carousel that does not strand a keyboard, the gauge that is a real progressbar, the reduced-motion rule that holds after the twentieth component, and the structural choices that stop two clients from receiving the same site with different colours. That is what the ten minutes of reading above is actually a picture of.

Sophia Design Forge is proprietary and is not publicly released. There is no package to install and no repository to clone. It is named here because a studio should be able to show its instruments.