Selvage
Selvage is the tulip hoop on the frame, used as an interface.
Download DESIGN.md
Tokens and rules, ready for an agent to follow.
Preview
Typography
Each face set in this language's own words.
Selvage
Selvage
Selvage is the tulip hoop on the frame, used as an interface.
Selvage is the tulip hoop on the frame, used as an interface.
Specification
Philosophy
summary
Selvage is the tulip hoop on the frame, used as an interface. One beech embroidery hoop sits on a flat flax table: cream linen drum-tight, a folk tulip worked in madder, indigo and saffron, one leaf still half a blue line, a needle parked beside it. It is the only thing in a view with light and shadow, and it means the order on the frame now. Around it everything is flat and small: Rosario for what you read, Corben for names and one big word, saffron for the thing to do, madder for the thing happening now.
It values
- One object is the interface: the tulip hoop, photographed as a real thing with a use, and it is the only lit or raised element in a view.
- Progress looks like the work: stitched where it is done, still a pale blue line where it is not.
- Depth is a verb. The thread pulls taut only while you point at it; the hoop's shadow is its only standing depth.
- Three flosses used like highlighters: saffron for the action, madder for what is on the frame, indigo for the thread itself.
- The studio's own words are the content: order numbers, floss numbers, the ship day, half a leaf to go.
It refuses
- A weave pattern over the ground or inside panels.
- Fabric tabs stuck to the edges of boxes, or dashes framing every card.
- Cards, panels and boxed lists in place of space.
- All three flosses spread across the chrome at once.
- A monospace face for data the body face can set in lining figures.
- Borders, rules and hairlines in place of value and space.
visual character
- The hoop stands whole on the #E6E1D5 flax table once per page, at about 55 to 60% of the hero width on the landing and 600px wide on the embodiment, with table on every side and its own warm two-layer shadow falling down and right.
- A steel needle threaded with indigo floss is drawn over the photograph in its pixel space, lit from the same top-left light, with its own small warm shadow on the linen.
- One big word per view, Corben 400 at 72 to 136px with -0.02em tracking, sits on one baseline with a small grey Rosario lead-in; when that word is the ship day, a row of eight madder running stitches marks it.
- Saffron #C99A1F is spent only on the one action per view, a flat round-ended button with ink text; madder #AB382C marks only On the frame, the logo knot and the ship-day stitch.
- Nothing is boxed: packing lists, kit lists, hours and forms sit straight on the table, rows parted by space; the only filled shapes are linen wells, one open overlay and the leaf photograph at 24px.
lineage
A revision of Selvage (generation 2), rebuilt the elevated (Inspora) way from the approved specimen. It keeps the embroidery world, the linen ground family, indigo ink and the madder, indigo and saffron flosses, and the hoop as the signature. It drops the woven grid, the fabric edge tabs, the running-stitch frames on every card, the mono face and the Fraunces and Inter pairing.
Tokens
colors14
derived8
- madder
- var(--error): the on-the-frame state and the ship-day stitch
- pencil
- color-mix(in srgb, var(--info) 38%, var(--surface)): the pale blue line of work not yet done
- floss dark
- color-mix(in srgb, var(--floss) 72%, black)
- floss light
- color-mix(in srgb, var(--floss) 62%, white)
- floss sheen
- color-mix(in srgb, var(--floss) 30%, white)
- steel
- four stops mixed from var(--text) and white (2, 14, 45 and 80 percent ink) for the needle
- contact
- color-mix(in srgb, var(--shade) 62%, black): the tight contact shadow
- note
- The eleven role colours drive the page. floss and shade belong to the photographed hoop, so the drawn needle and floss keep matching the photograph when a palette is swapped; every other shade is mixed in CSS.
typography14
- heading font
- Corben
- body font
- Rosario
- heading weight
- 400
- body weight
- 400
- emphasis weight
- 500
- button weight
- 600
- heading transform
- none
- letter spacing
- -0.02em on Corben; 0 on Rosario
- line height
- 1.6
- base size
- 17px
- numerals
- Rosario lining tabular figures for order numbers, prices, floss numbers and times
- scale
- 14.5px, 17px, 21px, 28px, 40px, 64px, clamp(72px, 9.4vw, 136px)
- roles
- display Corben 400: the wordmark, section titles, kit names and the one big word of a view (Friday.)body Rosario 400 at 17px for copy and control labels, 500 for the facts inside a sentence, 600 for labels and button textcaption Rosario 400 at 14.5px for captions, order numbers, dates and help
- google fonts url
- https://fonts.googleapis.com/css2?family=Corben&family=Rosario:wght@400;500;600&display=swap
radii3
- none
- 0
- lg
- 24px
- full
- 9999px
shadows4
- hoop
- Photographed with the hoop: a tight dark contact shadow under the lower-right ring and a wide warm ambient one, both falling down and right from a top-left light.
- needle
- drop-shadow 0.8px 1.4px 0.7px contact at 45% plus 3.2px 5.4px 2.6px shade at 28%, in the hoop photo's pixel space
- overlay
- 0 1px 2px shade at 22%, 10px 18px 36px -14px shade at 42%: open overlays only (menu, dialog, toast)
- note
- One key light from the top left. Shadows are warm brown from the shade token, never grey, and only the hoop and an open overlay carry one.
spacing2
- base
- 8px
- scale
- 4px, 8px, 12px, 16px, 24px, 32px, 48px, 64px, 88px, 136px
surfaces5
- treatment
- one-object-on-a-flat-flax-table
- material
- The tulip hoop is the only material object: pale beech rings with a brass tension screw on brass straps, cream linen drum-tight, a folk tulip in madder, indigo and saffron floss, one leaf half filled. It is a studio photograph cut out with its own warm shadow; the needle and indigo floss are drawn over it in the same light so they can move.
- table
- The page ground bg is the flax table. On the landing the hero image is the empty table itself, softly lit from the top left, and the cut-out hoop stands on it.
- card style
- No cards or panels. Lists, forms, hours and specimens sit straight on the table, grouped by space and a Corben title. The linen surface appears only as a control well, a hover tint, an open overlay or the one sheet in a view.
- photograph
- A later view shows a part of the hoop, never the whole again: the half-worked leaf close up, at a 24px radius.
borders3
- default width
- 0
- style
- none
- character
- No borders, rules, outlines or hairlines. Rows part by space; wells are linen on flax. Focus is a 2px ink outline, 3px out from the control. The running stitch is not a border: it marks the ship day under the big word and appears under a link on hover.
motion4
- duration
- 550ms
- easing
- linear(0, .62 18%, 1.08 34%, .97 52%, 1.01 70%, 1)
- reveal
- 900ms cubic-bezier(.2,.7,.2,1), rising 26px, 100ms apart
- philosophy
- Motion is a physical verb: pull the thread. Pointing at the hoop or the saffron button slides the needle out along its own axis and draws the indigo floss taut from the unfinished leaf, with a small overshoot. The madder stitches under the ship day arrive one by one; a floss track runs out to its length. The settled state renders with no JavaScript; an inline script adds .anim to <html> to gate start states, and prefers-reduced-motion skips all travel while state changes still happen.
controls3
- height
- 50px
- radius
- 9999px for one-line controls, 24px for a textarea
- wells
- surface on the table
Rules
composition
- Give every view one object moment: the hoop whole on the table, or a part of it (the half-worked leaf) close up. Everything else in that view stays flat.
- Stand the hoop on the table with air on every side and its own shadow; never put it in a card, a panel or behind a scrim.
- Order a page like a product page: the hoop and its caption, the one big word with its lead-in, two-tone copy, one saffron action, then the week's list.
- Separate by space and value, never by boxes or lines: lists and forms sit straight on the table; a filled linen surface appears only as a well, a hover tint or one open overlay.
- Show the whole hoop once per page; later views move in on a part of it.
- Keep saffron to one action per view and madder to the one thing on the frame.
hierarchy
- One big word per view in Corben 400 at the display step; everything else stays between 14.5 and 40px.
- Corben 400 at -0.02em for the wordmark (21px), kit names (21px) and section titles (40px, 28px on phones).
- Rosario 400 at 17px for copy, in two tones: the facts in ink at 500, the rest in slate.
- Rosario at 14.5px for captions, order numbers, dates and help, with lining tabular figures.
- Status is a 9px dot and a word, never a coloured field; On the frame is madder at 600.
density
Calm product-page density: one object and one big word per view, 136px between sections on desktop and 96px on phones, 50px controls, list rows about 54px tall parted by space, and prose held to about 34em.
signature patterns
- The tulip hoop: a studio photograph (assets/hoop.webp) cut out with its own warm contact and ambient shadow and set on the flax table, with an SVG needle and indigo floss drawn over it in the photograph's 976 by 810 pixel space.
- Pull the thread: pointing at the hoop or the saffron button moves the needle 23.12 by -11.89 units along its axis and morphs the floss path taut from the leaf over 550ms on linear(0, .62 18%, 1.08 34%, .97 52%, 1.01 70%, 1); the caption changes from half a leaf to go.
- The ship-day stitch: eight short madder strokes with a faint linen highlight under the one big word, arriving 90ms apart on first load.
- The thread key: 9px floss dots with their numbers (321, 820, 783) in the caption under the hoop, the same dots marking status in lists.
- Worked or not yet: progress drawn as indigo floss where the work is done and a thin pale blue line where it is not, in step lines and stock tracks.
- Links sew a running stitch under themselves on hover and focus.
Layout
grid
- type
- object-first product page
- max width
- 1180px content on the landing and 1240px on the embodiment, 1320 to 1360px from 1800px wide
- gutter
- 40px desktop, 20px phone
- column behavior
- The landing hero is two columns, minmax(0,5fr) copy and minmax(0,6fr) hoop; later views use the same split for photo and list, a four-column step line and a four-column kit list. Every track is minmax(0,1fr)-safe and every grid child min-width:0.
whitespace
- section gap
- 136 to 140px desktop, 96 to 100px phone
- card gap
- no cards; 15px row padding in lists, 26px in the kit list, 56 to 72px between groups
- content padding
- content sits on the table aligned to the grid edge; overlays pad 26 to 32px
- approach
- The table is empty space on purpose: the hoop needs air on every side, and each view has one focal point.
density
- default
- comfortable
- comfortable
- button height 50pxinput height 50pxrow height about 54px list rows
responsive
Phones (390px) stack to one column with the hoop first, hide all nav links but one, hide the meta column of the kit list and the customer and floss columns of tables, and let the hoop take the full width. Tablets (768 to 1100px) keep the two-column splits and fold the step line into two columns. Ultra-wide caps and centres the content and lets the hoop grow to 920px; only the landing hero spans the full width.
breakpoints
- mobile
- 390px
- phone max
- 600px
- tablet
- 860 to 1100px
- desktop
- 1280px
- wide
- 1440px
- ultrawide
- 1800px and 2560px
Guidance
Do
- Put the hoop at the centre of the first view, whole, on the flat table with air all round.
- Set one big word per view and let the rest stay small and quiet.
- Spend saffron on one action per view and madder on the one thing on the frame.
- Separate rows by space and value, and keep at most one filled surface in a view.
- Write in the studio's own words: order numbers, floss numbers, the ship day, what is left to stitch.
- Style every control explicitly: round linen wells, round switches and checks, a 2px ink focus ring.
Avoid
- Don't put a weave pattern on the ground or inside panels.
- Don't stick fabric tabs on box edges or frame cards with stitches.
- Don't draw borders, rules or hairlines between rows.
- Don't box content in cards or panels, or light more than one thing in a view.
- Don't show the whole hoop twice on one page, or pair a secondary button with the saffron one; use a quiet link.
- Don't put emoji or symbol glyphs on buttons.
Imagery
pairs with
woven-sampler-embroidery
summary
Studio product photographs of Selvage's one object and its parts on a flat flax table: a pale beech embroidery hoop with a brass screw, cream linen drum-tight, a folk tulip in satin stitch and French knots in madder, indigo and saffron cotton floss, one leaf half worked and still a pale blue transfer line, a steel needle. One soft key light from the top left, warm brown two-layer shadows falling down and right, true neutral colour.
subjects
- the tulip hoop whole, from 25 degrees above
- the half-worked leaf with the needle parked, close up
- the brass tension screw on its straps
- three skeins of 321, 820 and 783 floss
- the empty flax table, lit from the top left
usage
One full-bleed hero per landing: the empty flax table, softly lit from the top left, with the cut-out hoop standing on it beside the headline. Inside pages use the cut-out hoop once and then close-ups of its parts, never the whole hoop twice. The Sampler art style lives inside the hoop: the stitching itself follows its satin stitch, French knots and couched outlines in matte cotton floss. The photographs around it are studio product photography, which Sampler's own prompt rules out for full illustrations; use Sampler's full prompt for any illustration that is not the object (a kit's design, a stitch card). No text, no people, no hands, no props beside the object.
Katagami spec file
# Selvage
## Philosophy
Selvage is the tulip hoop on the frame, used as an interface. One beech embroidery hoop sits on a flat flax table: cream linen drum-tight, a folk tulip worked in madder, indigo and saffron, one leaf still half a blue line, a needle parked beside it. It is the only thing in a view with light and shadow, and it means the order on the frame now. Around it everything is flat and small: Rosario for what you read, Corben for names and one big word, saffron for the thing to do, madder for the thing happening now.
### Values
- One object is the interface: the tulip hoop, photographed as a real thing with a use, and it is the only lit or raised element in a view.
- Progress looks like the work: stitched where it is done, still a pale blue line where it is not.
- Depth is a verb. The thread pulls taut only while you point at it; the hoop's shadow is its only standing depth.
- Three flosses used like highlighters: saffron for the action, madder for what is on the frame, indigo for the thread itself.
- The studio's own words are the content: order numbers, floss numbers, the ship day, half a leaf to go.
### Anti-Values
- A weave pattern over the ground or inside panels.
- Fabric tabs stuck to the edges of boxes, or dashes framing every card.
- Cards, panels and boxed lists in place of space.
- All three flosses spread across the chrome at once.
- A monospace face for data the body face can set in lining figures.
- Borders, rules and hairlines in place of value and space.
### Visual Character
- The hoop stands whole on the #E6E1D5 flax table once per page, at about 55 to 60% of the hero width on the landing and 600px wide on the embodiment, with table on every side and its own warm two-layer shadow falling down and right.
- A steel needle threaded with indigo floss is drawn over the photograph in its pixel space, lit from the same top-left light, with its own small warm shadow on the linen.
- One big word per view, Corben 400 at 72 to 136px with -0.02em tracking, sits on one baseline with a small grey Rosario lead-in; when that word is the ship day, a row of eight madder running stitches marks it.
- Saffron #C99A1F is spent only on the one action per view, a flat round-ended button with ink text; madder #AB382C marks only On the frame, the logo knot and the ship-day stitch.
- Nothing is boxed: packing lists, kit lists, hours and forms sit straight on the table, rows parted by space; the only filled shapes are linen wells, one open overlay and the leaf photograph at 24px.
### Lineage
> A revision of Selvage (generation 2), rebuilt the elevated (Inspora) way from the approved specimen. It keeps the embroidery world, the linen ground family, indigo ink and the madder, indigo and saffron flosses, and the hoop as the signature. It drops the woven grid, the fabric edge tabs, the running-stitch frames on every card, the mono face and the Fraunces and Inter pairing.
## Tokens
### Colors
| Name | Value |
|------|-------|
| bg | `#E6E1D5` |
| surface | `#F2EFE8` |
| text | `#1E2A44` |
| muted | `#595E6B` |
| border | `#D2CCBF` |
| accent | `#C99A1F` |
| on_accent | `#1E2A44` |
| success | `#44603A` |
| warning | `#7A5B0E` |
| error | `#AB382C` |
| info | `#2D4A7C` |
| madder | `#AB382C` |
| floss | `#2D4A7C` |
| shade | `#5A3E22` |
### Derived
- **Madder**: var(--error): the on-the-frame state and the ship-day stitch
- **Pencil**: color-mix(in srgb, var(--info) 38%, var(--surface)): the pale blue line of work not yet done
- **Floss Dark**: color-mix(in srgb, var(--floss) 72%, black)
- **Floss Light**: color-mix(in srgb, var(--floss) 62%, white)
- **Floss Sheen**: color-mix(in srgb, var(--floss) 30%, white)
- **Steel**: four stops mixed from var(--text) and white (2, 14, 45 and 80 percent ink) for the needle
- **Contact**: color-mix(in srgb, var(--shade) 62%, black): the tight contact shadow
- **Note**: The eleven role colours drive the page. floss and shade belong to the photographed hoop, so the drawn needle and floss keep matching the photograph when a palette is swapped; every other shade is mixed in CSS.
### Typography
- **Heading Font**: Corben
- **Body Font**: Rosario
- **Heading Weight**: 400
- **Body Weight**: 400
- **Emphasis Weight**: 500
- **Button Weight**: 600
- **Heading Transform**: none
- **Letter Spacing**: -0.02em on Corben; 0 on Rosario
- **Line Height**: 1.6
- **Base Size**: 17px
- **Numerals**: Rosario lining tabular figures for order numbers, prices, floss numbers and times
- **Scale**: ["14.5px","17px","21px","28px","40px","64px","clamp(72px, 9.4vw, 136px)"]
- **Roles**: {"display":"Corben 400: the wordmark, section titles, kit names and the one big word of a view (Friday.)","body":"Rosario 400 at 17px for copy and control labels, 500 for the facts inside a sentence, 600 for labels and button text","caption":"Rosario 400 at 14.5px for captions, order numbers, dates and help"}
- **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Corben&family=Rosario:wght@400;500;600&display=swap
### Radii
- **None**: 0
- **Lg**: 24px
- **Full**: 9999px
### Shadows
- **Hoop**: Photographed with the hoop: a tight dark contact shadow under the lower-right ring and a wide warm ambient one, both falling down and right from a top-left light.
- **Needle**: drop-shadow 0.8px 1.4px 0.7px contact at 45% plus 3.2px 5.4px 2.6px shade at 28%, in the hoop photo's pixel space
- **Overlay**: 0 1px 2px shade at 22%, 10px 18px 36px -14px shade at 42%: open overlays only (menu, dialog, toast)
- **Note**: One key light from the top left. Shadows are warm brown from the shade token, never grey, and only the hoop and an open overlay carry one.
### Spacing
- **Base**: 8px
- **Scale**: ["4px","8px","12px","16px","24px","32px","48px","64px","88px","136px"]
### Surfaces
- **Treatment**: one-object-on-a-flat-flax-table
- **Material**: The tulip hoop is the only material object: pale beech rings with a brass tension screw on brass straps, cream linen drum-tight, a folk tulip in madder, indigo and saffron floss, one leaf half filled. It is a studio photograph cut out with its own warm shadow; the needle and indigo floss are drawn over it in the same light so they can move.
- **Table**: The page ground bg is the flax table. On the landing the hero image is the empty table itself, softly lit from the top left, and the cut-out hoop stands on it.
- **Card Style**: No cards or panels. Lists, forms, hours and specimens sit straight on the table, grouped by space and a Corben title. The linen surface appears only as a control well, a hover tint, an open overlay or the one sheet in a view.
- **Photograph**: A later view shows a part of the hoop, never the whole again: the half-worked leaf close up, at a 24px radius.
### Borders
- **Default Width**: 0
- **Style**: none
- **Character**: No borders, rules, outlines or hairlines. Rows part by space; wells are linen on flax. Focus is a 2px ink outline, 3px out from the control. The running stitch is not a border: it marks the ship day under the big word and appears under a link on hover.
### Motion
- **Duration**: 550ms
- **Easing**: linear(0, .62 18%, 1.08 34%, .97 52%, 1.01 70%, 1)
- **Reveal**: 900ms cubic-bezier(.2,.7,.2,1), rising 26px, 100ms apart
- **Philosophy**: Motion is a physical verb: pull the thread. Pointing at the hoop or the saffron button slides the needle out along its own axis and draws the indigo floss taut from the unfinished leaf, with a small overshoot. The madder stitches under the ship day arrive one by one; a floss track runs out to its length. The settled state renders with no JavaScript; an inline script adds .anim to <html> to gate start states, and prefers-reduced-motion skips all travel while state changes still happen.
### Controls
- **Height**: 50px
- **Radius**: 9999px for one-line controls, 24px for a textarea
- **Wells**: surface on the table
## Rules
### Composition
- Give every view one object moment: the hoop whole on the table, or a part of it (the half-worked leaf) close up. Everything else in that view stays flat.
- Stand the hoop on the table with air on every side and its own shadow; never put it in a card, a panel or behind a scrim.
- Order a page like a product page: the hoop and its caption, the one big word with its lead-in, two-tone copy, one saffron action, then the week's list.
- Separate by space and value, never by boxes or lines: lists and forms sit straight on the table; a filled linen surface appears only as a well, a hover tint or one open overlay.
- Show the whole hoop once per page; later views move in on a part of it.
- Keep saffron to one action per view and madder to the one thing on the frame.
### Hierarchy
- One big word per view in Corben 400 at the display step; everything else stays between 14.5 and 40px.
- Corben 400 at -0.02em for the wordmark (21px), kit names (21px) and section titles (40px, 28px on phones).
- Rosario 400 at 17px for copy, in two tones: the facts in ink at 500, the rest in slate.
- Rosario at 14.5px for captions, order numbers, dates and help, with lining tabular figures.
- Status is a 9px dot and a word, never a coloured field; On the frame is madder at 600.
### Density
Calm product-page density: one object and one big word per view, 136px between sections on desktop and 96px on phones, 50px controls, list rows about 54px tall parted by space, and prose held to about 34em.
### Signature Patterns
- The tulip hoop: a studio photograph (assets/hoop.webp) cut out with its own warm contact and ambient shadow and set on the flax table, with an SVG needle and indigo floss drawn over it in the photograph's 976 by 810 pixel space.
- Pull the thread: pointing at the hoop or the saffron button moves the needle 23.12 by -11.89 units along its axis and morphs the floss path taut from the leaf over 550ms on linear(0, .62 18%, 1.08 34%, .97 52%, 1.01 70%, 1); the caption changes from half a leaf to go.
- The ship-day stitch: eight short madder strokes with a faint linen highlight under the one big word, arriving 90ms apart on first load.
- The thread key: 9px floss dots with their numbers (321, 820, 783) in the caption under the hoop, the same dots marking status in lists.
- Worked or not yet: progress drawn as indigo floss where the work is done and a thin pale blue line where it is not, in step lines and stock tracks.
- Links sew a running stitch under themselves on hover and focus.
## Layout
### Grid
- **Type**: object-first product page
- **Max Width**: 1180px content on the landing and 1240px on the embodiment, 1320 to 1360px from 1800px wide
- **Gutter**: 40px desktop, 20px phone
- **Column Behavior**: The landing hero is two columns, minmax(0,5fr) copy and minmax(0,6fr) hoop; later views use the same split for photo and list, a four-column step line and a four-column kit list. Every track is minmax(0,1fr)-safe and every grid child min-width:0.
### Whitespace
- **Section Gap**: 136 to 140px desktop, 96 to 100px phone
- **Card Gap**: no cards; 15px row padding in lists, 26px in the kit list, 56 to 72px between groups
- **Content Padding**: content sits on the table aligned to the grid edge; overlays pad 26 to 32px
- **Approach**: The table is empty space on purpose: the hoop needs air on every side, and each view has one focal point.
### Density
- **Default**: comfortable
- **Comfortable**: {"button_height":"50px","input_height":"50px","row_height":"about 54px list rows"}
### Responsive
Phones (390px) stack to one column with the hoop first, hide all nav links but one, hide the meta column of the kit list and the customer and floss columns of tables, and let the hoop take the full width. Tablets (768 to 1100px) keep the two-column splits and fold the step line into two columns. Ultra-wide caps and centres the content and lets the hoop grow to 920px; only the landing hero spans the full width.
### Breakpoints
- **Mobile**: 390px
- **Phone Max**: 600px
- **Tablet**: 860 to 1100px
- **Desktop**: 1280px
- **Wide**: 1440px
- **Ultrawide**: 1800px and 2560px
## Guidance
### Do
- Put the hoop at the centre of the first view, whole, on the flat table with air all round.
- Set one big word per view and let the rest stay small and quiet.
- Spend saffron on one action per view and madder on the one thing on the frame.
- Separate rows by space and value, and keep at most one filled surface in a view.
- Write in the studio's own words: order numbers, floss numbers, the ship day, what is left to stitch.
- Style every control explicitly: round linen wells, round switches and checks, a 2px ink focus ring.
### Don't
- Don't put a weave pattern on the ground or inside panels.
- Don't stick fabric tabs on box edges or frame cards with stitches.
- Don't draw borders, rules or hairlines between rows.
- Don't box content in cards or panels, or light more than one thing in a view.
- Don't show the whole hoop twice on one page, or pair a secondary button with the saffron one; use a quiet link.
- Don't put emoji or symbol glyphs on buttons.
### Accessibility
WCAG AA on the flax table #E6E1D5: ink #1E2A44 is 11.0:1, slate #595E6B is 5.0:1, madder #AB382C is 4.8:1, indigo #2D4A7C is 6.8:1, sage #44603A is 5.4:1 and ochre #7A5B0E clears 4.8:1; ink on saffron is 5.5:1; every role colour is higher on linen #F2EFE8. Focus is a visible 2px ink outline on every control. Status never relies on colour alone: every dot has a word. The hoop has a full alt text; the drawn needle is aria-hidden. prefers-reduced-motion skips the pull, the sewing-in and the reveals; state changes still happen.
## Imagery Direction
### Pairs With
woven-sampler-embroidery
### Summary
Studio product photographs of Selvage's one object and its parts on a flat flax table: a pale beech embroidery hoop with a brass screw, cream linen drum-tight, a folk tulip in satin stitch and French knots in madder, indigo and saffron cotton floss, one leaf half worked and still a pale blue transfer line, a steel needle. One soft key light from the top left, warm brown two-layer shadows falling down and right, true neutral colour.
### Subjects
- the tulip hoop whole, from 25 degrees above
- the half-worked leaf with the needle parked, close up
- the brass tension screw on its straps
- three skeins of 321, 820 and 783 floss
- the empty flax table, lit from the top left
### Usage
One full-bleed hero per landing: the empty flax table, softly lit from the top left, with the cut-out hoop standing on it beside the headline. Inside pages use the cut-out hoop once and then close-ups of its parts, never the whole hoop twice. The Sampler art style lives inside the hoop: the stitching itself follows its satin stitch, French knots and couched outlines in matte cotton floss. The photographs around it are studio product photography, which Sampler's own prompt rules out for full illustrations; use Sampler's full prompt for any illustration that is not the object (a kit's design, a stitch card). No text, no people, no hands, no props beside the object.
DESIGN.md file
---
version: "alpha"
name: "Selvage"
description: "Selvage is the tulip hoop on the frame, used as an interface. One beech embroidery hoop sits on a flat flax table: cream linen drum-tight, a folk tulip worked in madder, indigo and saffron, one leaf still half a blue line, a needle parke..."
colors:
bg: "#E6E1D5"
surface: "#F2EFE8"
text: "#1E2A44"
muted: "#595E6B"
border: "#D2CCBF"
accent: "#C99A1F"
on_accent: "#1E2A44"
success: "#44603A"
warning: "#7A5B0E"
error: "#AB382C"
info: "#2D4A7C"
madder: "#AB382C"
floss: "#2D4A7C"
shade: "#5A3E22"
typography:
headline-lg:
fontFamily: "Corben"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Corben"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "Rosario"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.6
letterSpacing: "-0.02em"
label-md:
fontFamily: "Rosario"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
lg: "24px"
full: "9999px"
spacing:
base: "8px"
xs: "4px"
sm: "8px"
md: "12px"
lg: "16px"
xl: "24px"
2xl: "32px"
3xl: "48px"
4xl: "64px"
step-8: "88px"
step-9: "136px"
components:
color-reference-bg:
backgroundColor: "{colors.bg}"
color-reference-surface:
backgroundColor: "{colors.surface}"
color-reference-text:
backgroundColor: "{colors.text}"
color-reference-muted:
backgroundColor: "{colors.muted}"
color-reference-border:
backgroundColor: "{colors.border}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-on_accent:
backgroundColor: "{colors.on_accent}"
color-reference-success:
backgroundColor: "{colors.success}"
color-reference-warning:
backgroundColor: "{colors.warning}"
color-reference-error:
backgroundColor: "{colors.error}"
color-reference-info:
backgroundColor: "{colors.info}"
color-reference-madder:
backgroundColor: "{colors.madder}"
color-reference-floss:
backgroundColor: "{colors.floss}"
color-reference-shade:
backgroundColor: "{colors.shade}"
button-primary:
backgroundColor: "{colors.accent}"
textColor: "{colors.on_accent}"
typography: "{typography.label-md}"
rounded: "{rounded.lg}"
padding: "{spacing.md}"
card-surface:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.lg}"
padding: "{spacing.md}"
input-default:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.lg}"
height: "44px"
---
# Selvage
## Overview
Selvage is the tulip hoop on the frame, used as an interface. One beech embroidery hoop sits on a flat flax table: cream linen drum-tight, a folk tulip worked in madder, indigo and saffron, one leaf still half a blue line, a needle parked beside it. It is the only thing in a view with light and shadow, and it means the order on the frame now. Around it everything is flat and small: Rosario for what you read, Corben for names and one big word, saffron for the thing to do, madder for the thing happening now.
### Values
- One object is the interface: the tulip hoop, photographed as a real thing with a use, and it is the only lit or raised element in a view.
- Progress looks like the work: stitched where it is done, still a pale blue line where it is not.
- Depth is a verb. The thread pulls taut only while you point at it; the hoop's shadow is its only standing depth.
- Three flosses used like highlighters: saffron for the action, madder for what is on the frame, indigo for the thread itself.
- The studio's own words are the content: order numbers, floss numbers, the ship day, half a leaf to go.
### Anti-Values
- A weave pattern over the ground or inside panels.
- Fabric tabs stuck to the edges of boxes, or dashes framing every card.
- Cards, panels and boxed lists in place of space.
- All three flosses spread across the chrome at once.
- A monospace face for data the body face can set in lining figures.
- Borders, rules and hairlines in place of value and space.
### Visual Character
- The hoop stands whole on the #E6E1D5 flax table once per page, at about 55 to 60% of the hero width on the landing and 600px wide on the embodiment, with table on every side and its own warm two-layer shadow falling down and right.
- A steel needle threaded with indigo floss is drawn over the photograph in its pixel space, lit from the same top-left light, with its own small warm shadow on the linen.
- One big word per view, Corben 400 at 72 to 136px with -0.02em tracking, sits on one baseline with a small grey Rosario lead-in; when that word is the ship day, a row of eight madder running stitches marks it.
- Saffron #C99A1F is spent only on the one action per view, a flat round-ended button with ink text; madder #AB382C marks only On the frame, the logo knot and the ship-day stitch.
- Nothing is boxed: packing lists, kit lists, hours and forms sit straight on the table, rows parted by space; the only filled shapes are linen wells, one open overlay and the leaf photograph at 24px.
### Lineage
> A revision of Selvage (generation 2), rebuilt the elevated (Inspora) way from the approved specimen. It keeps the embroidery world, the linen ground family, indigo ink and the madder, indigo and saffron flosses, and the hoop as the signature. It drops the woven grid, the fabric edge tabs, the running-stitch frames on every card, the mono face and the Fraunces and Inter pairing.
## Colors
Use the YAML color tokens as the normative palette. The prose below names the roles agents should preserve when generating UI.
| Token | Value |
|-------|-------|
| bg | `#E6E1D5` |
| surface | `#F2EFE8` |
| text | `#1E2A44` |
| muted | `#595E6B` |
| border | `#D2CCBF` |
| accent | `#C99A1F` |
| on_accent | `#1E2A44` |
| success | `#44603A` |
| warning | `#7A5B0E` |
| error | `#AB382C` |
| info | `#2D4A7C` |
| madder | `#AB382C` |
| floss | `#2D4A7C` |
| shade | `#5A3E22` |
## Typography
Load the fonts from Google Fonts: https://fonts.googleapis.com/css2?family=Corben&family=Rosario:wght@400;500;600&display=swap
- **Headline-Lg**: Corben, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Corben, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: Rosario, 17px, weight 400, line-height 1.6.
- **Label-Md**: Rosario, 0.75rem, weight 600, line-height 1.
## Layout
### Spacing Tokens
- **Base**: `8px`
- **Xs**: `4px`
- **Sm**: `8px`
- **Md**: `12px`
- **Lg**: `16px`
- **Xl**: `24px`
- **2xl**: `32px`
- **3xl**: `48px`
- **4xl**: `64px`
- **Step-8**: `88px`
- **Step-9**: `136px`
### Grid
- **Type**: object-first product page
- **Max Width**: 1180px content on the landing and 1240px on the embodiment, 1320 to 1360px from 1800px wide
- **Gutter**: 40px desktop, 20px phone
- **Column Behavior**: The landing hero is two columns, minmax(0,5fr) copy and minmax(0,6fr) hoop; later views use the same split for photo and list, a four-column step line and a four-column kit list. Every track is minmax(0,1fr)-safe and every grid child min-width:0.
### Whitespace
- **Section Gap**: 136 to 140px desktop, 96 to 100px phone
- **Card Gap**: no cards; 15px row padding in lists, 26px in the kit list, 56 to 72px between groups
- **Content Padding**: content sits on the table aligned to the grid edge; overlays pad 26 to 32px
- **Approach**: The table is empty space on purpose: the hoop needs air on every side, and each view has one focal point.
### Density
- **Default**: comfortable
- **Comfortable**: {"button_height":"50px","input_height":"50px","row_height":"about 54px list rows"}
### Responsive
Phones (390px) stack to one column with the hoop first, hide all nav links but one, hide the meta column of the kit list and the customer and floss columns of tables, and let the hoop take the full width. Tablets (768 to 1100px) keep the two-column splits and fold the step line into two columns. Ultra-wide caps and centres the content and lets the hoop grow to 920px; only the landing hero spans the full width.
### Breakpoints
- **Mobile**: 390px
- **Phone Max**: 600px
- **Tablet**: 860 to 1100px
- **Desktop**: 1280px
- **Wide**: 1440px
- **Ultrawide**: 1800px and 2560px
## Elevation & Depth
### Shadows
- **Hoop**: Photographed with the hoop: a tight dark contact shadow under the lower-right ring and a wide warm ambient one, both falling down and right from a top-left light.
- **Needle**: drop-shadow 0.8px 1.4px 0.7px contact at 45% plus 3.2px 5.4px 2.6px shade at 28%, in the hoop photo's pixel space
- **Overlay**: 0 1px 2px shade at 22%, 10px 18px 36px -14px shade at 42%: open overlays only (menu, dialog, toast)
- **Note**: One key light from the top left. Shadows are warm brown from the shade token, never grey, and only the hoop and an open overlay carry one.
## Shapes
### Rounded
- **None**: `0px`
- **Lg**: `24px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: one-object-on-a-flat-flax-table
- **Material**: The tulip hoop is the only material object: pale beech rings with a brass tension screw on brass straps, cream linen drum-tight, a folk tulip in madder, indigo and saffron floss, one leaf half filled. It is a studio photograph cut out with its own warm shadow; the needle and indigo floss are drawn over it in the same light so they can move.
- **Table**: The page ground bg is the flax table. On the landing the hero image is the empty table itself, softly lit from the top left, and the cut-out hoop stands on it.
- **Card Style**: No cards or panels. Lists, forms, hours and specimens sit straight on the table, grouped by space and a Corben title. The linen surface appears only as a control well, a hover tint, an open overlay or the one sheet in a view.
- **Photograph**: A later view shows a part of the hoop, never the whole again: the half-worked leaf close up, at a 24px radius.
### Borders
- **Default Width**: 0
- **Style**: none
- **Character**: No borders, rules, outlines or hairlines. Rows part by space; wells are linen on flax. Focus is a 2px ink outline, 3px out from the control. The running stitch is not a border: it marks the ship day under the big word and appears under a link on hover.
## Components
### Composition
- Give every view one object moment: the hoop whole on the table, or a part of it (the half-worked leaf) close up. Everything else in that view stays flat.
- Stand the hoop on the table with air on every side and its own shadow; never put it in a card, a panel or behind a scrim.
- Order a page like a product page: the hoop and its caption, the one big word with its lead-in, two-tone copy, one saffron action, then the week's list.
- Separate by space and value, never by boxes or lines: lists and forms sit straight on the table; a filled linen surface appears only as a well, a hover tint or one open overlay.
- Show the whole hoop once per page; later views move in on a part of it.
- Keep saffron to one action per view and madder to the one thing on the frame.
### Hierarchy
- One big word per view in Corben 400 at the display step; everything else stays between 14.5 and 40px.
- Corben 400 at -0.02em for the wordmark (21px), kit names (21px) and section titles (40px, 28px on phones).
- Rosario 400 at 17px for copy, in two tones: the facts in ink at 500, the rest in slate.
- Rosario at 14.5px for captions, order numbers, dates and help, with lining tabular figures.
- Status is a 9px dot and a word, never a coloured field; On the frame is madder at 600.
### Density
Calm product-page density: one object and one big word per view, 136px between sections on desktop and 96px on phones, 50px controls, list rows about 54px tall parted by space, and prose held to about 34em.
### Signature Patterns
- The tulip hoop: a studio photograph (assets/hoop.webp) cut out with its own warm contact and ambient shadow and set on the flax table, with an SVG needle and indigo floss drawn over it in the photograph's 976 by 810 pixel space.
- Pull the thread: pointing at the hoop or the saffron button moves the needle 23.12 by -11.89 units along its axis and morphs the floss path taut from the leaf over 550ms on linear(0, .62 18%, 1.08 34%, .97 52%, 1.01 70%, 1); the caption changes from half a leaf to go.
- The ship-day stitch: eight short madder strokes with a faint linen highlight under the one big word, arriving 90ms apart on first load.
- The thread key: 9px floss dots with their numbers (321, 820, 783) in the caption under the hoop, the same dots marking status in lists.
- Worked or not yet: progress drawn as indigo floss where the work is done and a thin pale blue line where it is not, in step lines and stock tracks.
- Links sew a running stitch under themselves on hover and focus.
## shadcn/ui Usage
When the target app uses shadcn/ui, copy DESIGN.md with shadcn instead of the plain DESIGN.md. It contains the same Katagami design-language source plus the shadcn/ui primitives, imports, theme variables, component recipes, and preview-shot guidance.
DESIGN.md with shadcn: `/language/en-01a0ecb5-468b-7363-b03a-dba6f795c759/DESIGN.with-shadcn.md`.
Machine-readable companions for automation: `/language/en-01a0ecb5-468b-7363-b03a-dba6f795c759/shadcn.json` (registry theme), `/language/en-01a0ecb5-468b-7363-b03a-dba6f795c759/shadcn-components.md` (component recipes) and `/language/en-01a0ecb5-468b-7363-b03a-dba6f795c759/shadcn-shots.json` (preview shots). The human-facing handoff is still DESIGN.md with shadcn.
Install recommended primitives with `npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table`.
Use these primitives in shadcn apps:
- button
- card
- input
- textarea
- select
- dialog
- sheet
- tabs
- badge
- separator
- checkbox
- switch
- slider
- tooltip
- dropdown-menu
- table
Implementation rule for agents: import shadcn primitives from `@/components/ui/*`, apply the generated CSS variables first, then compose the language-specific recipes from the companion MD. Katagami remains the source of truth; shadcn names are the implementation surface.
## Do's and Don'ts
- Do Put the hoop at the centre of the first view, whole, on the flat table with air all round.
- Do Set one big word per view and let the rest stay small and quiet.
- Do Spend saffron on one action per view and madder on the one thing on the frame.
- Do Separate rows by space and value, and keep at most one filled surface in a view.
- Do Write in the studio's own words: order numbers, floss numbers, the ship day, what is left to stitch.
- Do Style every control explicitly: round linen wells, round switches and checks, a 2px ink focus ring.
- Don't Don't put a weave pattern on the ground or inside panels.
- Don't Don't stick fabric tabs on box edges or frame cards with stitches.
- Don't Don't draw borders, rules or hairlines between rows.
- Don't Don't box content in cards or panels, or light more than one thing in a view.
- Don't Don't show the whole hoop twice on one page, or pair a secondary button with the saffron one; use a quiet link.
- Don't Don't put emoji or symbol glyphs on buttons.
### Accessibility
WCAG AA on the flax table #E6E1D5: ink #1E2A44 is 11.0:1, slate #595E6B is 5.0:1, madder #AB382C is 4.8:1, indigo #2D4A7C is 6.8:1, sage #44603A is 5.4:1 and ochre #7A5B0E clears 4.8:1; ink on saffron is 5.5:1; every role colour is higher on linen #F2EFE8. Focus is a visible 2px ink outline on every control. Status never relies on colour alone: every dot has a word. The hoop has a full alt text; the drawn needle is aria-hidden. prefers-reduced-motion skips the pull, the sewing-in and the reveals; state changes still happen.
## Imagery Direction
### Pairs With
woven-sampler-embroidery
### Summary
Studio product photographs of Selvage's one object and its parts on a flat flax table: a pale beech embroidery hoop with a brass screw, cream linen drum-tight, a folk tulip in satin stitch and French knots in madder, indigo and saffron cotton floss, one leaf half worked and still a pale blue transfer line, a steel needle. One soft key light from the top left, warm brown two-layer shadows falling down and right, true neutral colour.
### Subjects
- the tulip hoop whole, from 25 degrees above
- the half-worked leaf with the needle parked, close up
- the brass tension screw on its straps
- three skeins of 321, 820 and 783 floss
- the empty flax table, lit from the top left
### Usage
One full-bleed hero per landing: the empty flax table, softly lit from the top left, with the cut-out hoop standing on it beside the headline. Inside pages use the cut-out hoop once and then close-ups of its parts, never the whole hoop twice. The Sampler art style lives inside the hoop: the stitching itself follows its satin stitch, French knots and couched outlines in matte cotton floss. The photographs around it are studio product photography, which Sampler's own prompt rules out for full illustrations; use Sampler's full prompt for any illustration that is not the object (a kit's design, a stitch card). No text, no people, no hands, no props beside the object.
shadcn/ui theme file
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "selvage",
"type": "registry:theme",
"title": "Selvage shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#E6E1D5",
"foreground": "#1E2A44",
"card": "#F2EFE8",
"card-foreground": "#1E2A44",
"popover": "#F2EFE8",
"popover-foreground": "#1E2A44",
"primary": "#1E2A44",
"primary-foreground": "#ffffff",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#595E6B",
"muted-foreground": "#1E2A44",
"accent": "#C99A1F",
"accent-foreground": "#ffffff",
"destructive": "#AB382C",
"border": "#D2CCBF",
"input": "#D2CCBF",
"ring": "#C99A1F",
"chart-1": "#1E2A44",
"chart-2": "#f4f4f5",
"chart-3": "#C99A1F",
"chart-4": "#44603A",
"chart-5": "#7A5B0E",
"sidebar": "#F2EFE8",
"sidebar-foreground": "#1E2A44",
"sidebar-primary": "#1E2A44",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#2D4A7C",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#D2CCBF",
"sidebar-ring": "#C99A1F",
"radius": "24px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#1E2A44",
"primary-foreground": "#ffffff",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#C99A1F",
"accent-foreground": "#ffffff",
"destructive": "#AB382C",
"border": "#303642",
"input": "#303642",
"ring": "#C99A1F",
"chart-1": "#1E2A44",
"chart-2": "#f4f4f5",
"chart-3": "#C99A1F",
"chart-4": "#44603A",
"chart-5": "#7A5B0E",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#1E2A44",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#C99A1F",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#C99A1F",
"radius": "24px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-01a0ecb5-468b-7363-b03a-dba6f795c759",
"slug": "selvage",
"componentManifest": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"installCommand": "npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table",
"nativeTokenNames": {
"colors": [
"accent",
"bg",
"border",
"error",
"floss",
"info",
"madder",
"muted",
"on_accent",
"shade",
"success",
"surface",
"text",
"warning"
],
"derived": [
"contact",
"floss_dark",
"floss_light",
"floss_sheen",
"madder",
"note",
"pencil",
"steel"
],
"typography": [
"base_size",
"body_font",
"body_weight",
"button_weight",
"emphasis_weight",
"google_fonts_url",
"heading_font",
"heading_transform",
"heading_weight",
"letter_spacing",
"line_height",
"numerals",
"roles",
"scale"
],
"radii": [
"full",
"lg",
"none"
],
"shadows": [
"hoop",
"needle",
"note",
"overlay"
],
"spacing": [
"base",
"scale"
],
"surfaces": [
"card_style",
"material",
"photograph",
"table",
"treatment"
],
"borders": [
"character",
"default_width",
"style"
],
"motion": [
"duration",
"easing",
"philosophy",
"reveal"
],
"controls": [
"height",
"radius",
"wells"
]
}
}
}
```