Each entry says what changed in plain words and links the components it touches. A component page shows only its own entries under Changelog. Install a version with the install guide; the packages live on GitHub Packages.
Next release
- generators: the brand kit's entries (70 contract item 1):
./brand-core(logoSvg,markMisuseSvg, the outlines,LOGO_PACK,DOWNLOADS),./brand(buildLogoPack,buildColours,buildDownloads,checkDownloads),./press(renderPressPdf,PRESS_FORMATS,PRESS_ARTWORK),./documents(the quote, proposal, invoice, letter and spec-sheet components,computeTotals,formatMoney,formatDate),./signature(emailSignature) and./deck(the ten slide components,PRESENTER_SCRIPT);./pdfgainsrenderDocumentPdfandrenderDeckPdf;./oggains theannounce,quoteandstattemplates andrenderCarousel; the input schemas ship as JSON Schema ingenerated/schemas/;overprint-gengainsbrand,press,doc,signature,carousel,deckandcheck --brand. The renderers are typed stubs until their Phase 6 packages land. - brand: the mark in use is option c, Key block (D-P20), so
Mark,Logo, the favicon and the press run print it; the brand dataBRAND,BRAND_NAMES,MARK_SPECS(clear space, minimum sizes, the lockup choice) andCHANNEL_VOLUMES(70 BK-1);Logo layout="auto"picks the lockup for itsbox; "Paid" joinsSTAMP_WORDS. - tokens: the print and slide type roles (70 BB-4): DTCG groups
type.printandtype.slide, emitted as--mk-type-print-*(pt) and--mk-type-slide-*(px on the 1920 × 1080 canvas) with the classes.mk-type-print-*and.mk-type-slide-*; the spot-ink and stock sourcesrc/source/print/spot.json; a provisionaljson/print.json(CMYK builds through the macOS Generic CMYK Profile, flaggedprovisional) and its types (PrintFile,SpotFile). - fonts: the
Mk Labelstatic instance is cut at weight 600, the label role's weight (D-P24), so cards and covers print labels as the site does;fonts:buildpacks layout tables with fontTools' own serializer, so its outputs never depend on uharfbuzz being installed.
0.9.0
- P1 kits (P4-T4 to P4-T6). Print:
EditionNumber,ProofSheet,DieLine,InkDrawdownandSwatchChip(withinkPairs, the ink's sanctioned pairs in a look), and theHalftonephoto plate case. Covers: thestackandreleaseslayouts (coverStack,coverReleases,RELEASE_MARK,RELEASE_WORDS), their alt text and legends, and six fixtures of each (projectStack,projectReleases). Comic:KirbyKrackle,Newsprint,OffsetPlatesandSplashTitle. Motion:PageWipe(link activation at Press and Rave, theflipvoice) andFlexWord(the width axis on a view timeline), and the SFX width flex at Press and Rave. Sound: thepow,boom,flipandprintvoices with noise layers, the knock's synthesised fallback and the riffle (playKnocks). Ink field: the SVG still (fieldStillNodein./art, passed toInkFieldasstill) from a TS port ofmk_flow, and the poster on the print kit's shared tiles. Type: the server advance table (anybodyWidthEm,fitEm,estimateFit,FIT_CUTSin./art), which sizes SFX bursts within 1.5 % of the browser and givesFittedLineanestimatefor its first paint. The motion pre-paint script writesdata-mk-inviewonly after hydration (__mkReveal.hydrated(), called byMotionRuntime), sonext devlogs no hydration mismatch. Fonts:letterPreloaded, the letterer's opt-in preloading twin for pages that print balloons in the first view. - 3D P1 and the GPU stills (P4-T7 to P4-T9). Three: the alphabet twins at every fidelity (model, SVG, CSS 3D, GL geometry, physics shapes; Rave's MORE BLOCKS rains them), the
row,topple,twins,stack-1/2/3,line-k/r/a/mandwoodarrangements with their text alternatives, the page objectsCrate,PlanPlate,Slot,SampleCaseandBaseplate,BlockLoader,Topple404,BuildOnScroll, the house camera and an id-colour parity mode in poster frames, the wood grain in GL, specks and Shake, the phone's tap-to-play light rung with "Done", andInkFieldMaterial(the field backdrop in the stage's own canvas). Generators:overprint-gen stillsand./stills(stillFor, the manifest), 72 committed GPU stills, and the cards and block covers printing them. - generators: photos and print (P4-T10, P4-T11).
./photo-coreturns luma into halftone plate masks with the ink field's dot maths (lumaToPlatewith a polarity and a levels curve,dotRadius,cellCentre) and carries the purephotoConfigSchema../phototreats photos with sharp into light and night plates (key at 45°, colour at 75°), writesplates.manifest.jsonand a typedplates.generated.ts, checks them (checkPlates), flattens them for raster targets (flattenPlates), refuses proof screenshots with no override (D-I1) and makes synthetic test photos (syntheticPhoto).<PrintedPhoto>prints the plates as two ink layers that re-ink with the colourway, swap to the night plates on Night stock and drop plate 2 under high contrast../pdfprints through one Chromium core (printPage):renderPdffor a site's print route,htmlToPdfandprintHtmlfor a self-contained document (Phase 6's documents and decks), with the sheet helpers (SHEETS,sheetMm,pageMm,sheetPageCss,PRINT_READY_SCRIPT).<PosterSheet>(A3, Tabloid, 3 mm bleed with crop marks) and<OnePager>(A4, Letter,onePagerInputSchema) lay out in mm. The CLI runsphotos(with--checkand--base) andpdf. Fonts resolve inside a bundler that lacksimport.meta.resolve, soopengraph-image.tsxand static card routes build under Next.js Turbopack. - P1 components and desktop toys (P4-T1 to P4-T3). Base UI wrappers:
ComboboxandComboboxItem(a case- and accent-insensitive filter by default, groups, chips formultiple, "Searching…", an empty message, a live result count, andinlinefor a list printed in place),PopoverwithPopoverTrigger,PopoverContentandPopoverClose,Menuwith its eleven parts (shortcuts asKbdcaps, checkbox and radio items, group labels, separators, submenus), andToastProviderwithuseToast(a slab pill, one at a time with three waiting, 5.2 s with a drain bar that holds while the region is hovered, focused or the window is away). Server components:Breadcrumbs,Pagination(withpaginationRange),Count,ProgressBar(bar, segments, indeterminate),AvatarandAvatarGroup,Tick,EmptyState,Kbd,SkeletonandLoader. Client leaves:CharacterCount,TableSortButton(in./table) andBeforeAfter. Motion: the additiveCursorand the first-visitPressRun(in./motion).IconButton'scountnow prints aCountat its corner.LineBadgeletters follow APCA (DF-39): the 16 px badge prints its shape glyph alone, the 24 px badge an 18 px letter, 32 and 48 both (LINE_BADGE_TYPE).VisitorControlstakessound={false}and extra dials aschildren(DF-40).Section's development check accepts anArtfrom any copy of the module through aSymbol.forbrand (ART_BRAND,isArtElement; DF-48). ./deriveexportsstockRoles(with itsStockOverlayLaddertype): the accent stock laid over a look's roles, aspairsForLookand the client report read a pair row with astock, so a caller can resolve a client look's stock pairs too (the press check's rule 4 on the client looks).- stills: the last fallback path of the stills folder carries Turbopack's ignore comment too, so a Next.js app that imports
./ogor./stillsno longer traces the whole project into its server output ("Dynamic filesystem access causes tracing of the whole project"). - The P1 press repair (I4-G). React:
Comboboxgives its inline list an id and the input's name in the server markup and marks its box as the input's focus-ring host, and a highlighted row's second line prints in--mk-text; theEmptyStateandPopoverdescriptions print in the meta role (16 px, 500, so--mk-text-2clears the APCA floor);SplashTitle's Quiet heading prints on its own paper plate and wraps inside its cell; theToastviewport and specimen keep one column no wider than their box;ProofSheet's frame links draw the focus ring. Three: a still's letter path carriesdata-mk-glyph, and a letter block marks its line only while its letter faces the view. - misregistration: display type (
mk-type-display,mk-type-head-section,mk-type-head-cardand the second ink's.mk-ov) breaks a word that is wider than its column inside the box instead of overflowing it, so a long word at the display floor no longer pushes a 320 px page sideways (DF-52, WCAG 1.4.10). Lines whose words fit are unchanged. - phone-frame: video in a
PhoneFramestarts paused with a play and pause key at the frame's bottom end (the client leafPhoneVideo, on IconButton's markup, named "Play {label}" and "Pause {label}"), instead of the platform's controls (DF-33, supersedes D-N78). The video stays muted and inline and never autoplays (D-E3). - visitor-controls: the inline volume dial takes a line of its own width in
VisitorControls, so its four stops sit in a row on a desktop footer instead of shrinking into one narrow column beside the theme key (DF-51). In a narrow sheet it still wraps to its own line. - motion:
PageWipesweeps again at Press and Rave, across and off the page. The tokens print--mk-dur-wipeas a weightedcalc()of the volume weights, which a custom property read returns unresolved, so the leaf read a duration of 0 and never ran; it now resolves the duration through a transition duration (a literal time on the property still reads directly). And the bands keep no restingtranslatebeside their skew: the CSS build folded the two into onetransform, which the sweep's keyframes added to, so the bands started and ended 150 % too far left (parked in view at the end) and the docs' mid-sweep preview sat off to the left. Found by the release's flash review.
0.1.0
- Freeze the public contracts: exports maps, attribute, token and class names, file shapes, and typed stubs for every export another package imports (P0-T2).
- Fonts: Latin woff2 subsets of Anybody (upright and italic, full width and weight axes), Schibsted Grotesk (upright and italic), Shantell Sans (INFM 30, BNCE 0, SPAC 10 built in) and Geist Mono (code only), the nine static instances for Satori and resvg with their role families,
./csswith@font-faceand the--mk-font-*variables, the licences, a hash manifest and the./nextmodule of sixnext/font/localfonts (display and text upright preloaded). React: the shape alphabet on the 18 and 16 grids asGLYPH_PATHS, one server-safe icon component per glyph under./icons/*and raw SVG under./icons/svg/*. - generators: the core (P3-T10 to P3-T13).
./measurereads the static instances' advances (a small TrueType reader and a generated table, so measuring works on the server, in the browser and on the edge) and fits text without ever truncating (fitText,fitBox,FitError)../rasterrasterises with resvg-js 2.6.2 and the static fonts (fontFiles; the native build has nofontBuffers)../ogrenders the 8 card templates at 4 sizes: Satori 0.63.2 sets the text plate's lines as paths beside vector art (30's block stills cropped to their bounds, halftone fades in the template's ink, the cover module's plates, the ink field poster), Press on Bone by default, Studio for article, page and docs, Rave on Night for the edition card../coverbuilds case-study covers from project data as one pure SVG tree: the poster and comic layouts,projectPlateandarticlePlateon 21'sGridPlatewith role inks (D-N14),posterBandsSvgprinting the live field's own flow,grainTilepaper flecks,resolveSvgInks, and<CaseCover>in./react../iconswrites the favicon and app icons fromfaviconSvg. Theoverprint-genCLI runscards,iconsandcheck. - The reading layer's controls, overlays, forms and visitor prefs (P2-T1 to P2-T5): every Button is the comic hit key, with IconButton, Link and Tooltip; Input, Textarea, Select, Checkbox and CheckboxGroup, Radio and RadioGroup, Switch, Slider with the ruler, RulerReadout and SegmentedControl; Dialog, Drawer, NavSheet, Tabs, Disclosure, Faq and faqJsonLd on Base UI 1.9 where the platform falls short; Field, Fieldset, Form with the site's inline validation, ErrorSummary, Callout, Honeypot, FormTimestamp and QuoteForm; PrefsScript under 1 KB, usePref and setPref with cross-tab sync, ThemeToggle and the visitor VolumeDial; VisuallyHidden.
- The reading layer's layout, navigation, data, content and brand components (P2-T6 to P2-T10):
Sectionwith its plate andArtslot,Plate,VolumeScope,PageHero,SectionHead,Eyebrow,Card,LineCard,InfoPanel,Stack,Cluster,Grid,Container,Main,Ruleand theFittedLineclient fitter;Navbarwith theNavDisclosuremega panels,Footer,FooterMap,BuildStamp,SkipLink,ActionDockandVisitorControls; theTableparts,ComparisonTablewith the one-tier switcher,SpecStrip,Numeral,Stat,StatGroup,StatusChip,BadgeandScoreDial;ProsewithmdxComponents,Quote,CodeBlockwithCopyButton,Figure,ScreenshotFrameandPhoneFrame; and the brand: the three evolved 2 × 2 options inmarkGeometry(a Overprint by default, b Paper seam, c Key block) with the pixel-snappedpxmode and the one-ink seam variant,logoGeometrywith the 1x clear-space frame,Mark,Wordmark,Logo,MaxosMarkandLineBadge. - The print and comic kits, P0 (21 P2-T11 to P2-T15): the art core (seeded halftone, bursts, balloons, lines, krackle, printer's marks, SFX layers, the texture tiles and
gen-print-tiles), the print kit (Halftone,Overprint,PrinterMarks,Sticker,Stamp,Seal,useStampLand,Tape,Grain,Misregistrationand the.mk-ovsecond ink,GiantGlyph,ShapeGlyph), the dataCover(grid and score,coverAlt,CoverLegend), the comic registers and kit (Panel,PanelGrid,Balloon,Caption,CornerBox,EditorsNote,ContinuedIn,SFX,SfxBurst,SpeedLines,FocusLines,ImpactStar,KeyPop). - The ink field, motion and sound (P2-T16 to P2-T20).
./ink-field/chunks: the shared GLSL chunk library (mk_hash,mk_snoise,mk_flow,mk_pal4, OKLab, the round-dot, AM and FM screens,mk_paper,mk_fade) andfieldFragmentfor the four modes on a canvas or a three material../ink-field: the WebGL 2 engine with bursts that settle within 5 s, loops only with a mounted motion toggle, pulses, crossfades, the degradation ladder andrenderAt; the gate; the looks;readInks; andInkField, at most two live contexts per page, with its CSS poster and the flat fill../motion: the generated panel and title keyframes, the reveal contract and the reduced-motion block,motionPrepaintScript,MotionRuntime(readiness flags, soft navigations, the keydown finisher), the width axis, andMotionToggle../sound: the engine (knocks, stamp, pop), themk:sfxbus,SoundToggleand the four CC0 wood knock clips. - The GL stage and the pile (P3-T1 to P3-T4):
PrintMaterialand its key hull, letter decal and halftone contact shadow (./materials); the live pile with rain, grab, single-click hop, nudge, TIDY, MORE BLOCKS, Reset, the 5 s settle cap, lean, dip, memory and comic hits, the governor, demand frames, visibility, the context-loss policy, the release, the poster render and the keyboard proxies (./stage);BlocksStage,GlGatewith the gate ladder and the hand-over, and the realglPrepaintScript(./gate); the stage plate's CSS with--mk-stage-ratio(./css). - The block model, physics and the SVG and CSS fidelities (P1-T9 to P1-T12): the cast, the logo, mark and pile-a arrangements, the rain and tidy kit constants, the cannon-es
PhysicsWorldwith the hard settle cap and keep-out columns, letters baked from Anybody,BlockCss,BlockScenewith its drop, the card hop,BlockSvg,BlockStill,blockSvgStringwith resolved hex,BlockMarkandfaviconSvg. - Tokens P1 (P3-T14 to P3-T16): the client-colourway helper in
./derive(deriveColourwaywithsupportandspot,colourwayCss,toDtcg, andhexLookfor built-in and client looks; a client's own colour never moves past ΔL 0.25 for a reading role, the role prints a safe fallback and goes todisplayOnly);MakrTokens.swift(./swift, every look's colours, Display P3 fills and bands, space, radii, borders, type roles, eases, durations; SwiftUI behindcanImport) withswift:checkand the rootPackage.swift; the consumer lintoverprint-lint(./lintand the bin:consumer/mk-selector,raw-colour,token-exists,mono,uppercase,glow,loop);--mk-on-control-2(placeholder ink on the control face); thelabelrole at 14 px / 600 (floor Lc 90, printed in--mk-text); pair rows for display text, the control's second ink and the accent stocks (White, Newsprint, Pulp, Kraft, read on the stock's own ladder via a row'sstock);generated/ts/pairs.ts(PAIRS,STOCK_LADDERS, re-exported by./hex). - Real tokens (P1-T1 to P1-T5): the DTCG 2025.10 source for the core scales, six stocks (Pulp in P0) and the four colourways; the solver and the recipes of 10 §2.3 with the CVD matrix; the index cascade in
tokens.css(blocks 0 to 7: variants, the selection rule, keyword switches, Display P3, accent stocks, plates and lines),colourways/{acid,cool,jewel}.css,type.cssandtailwind.css;hex.ts,gl.ts,volumes.tsandmotion.tsgenerated with their contract names;pairs.json,report.json(64 looks, CVD, dead zone, caps),looks/*.json,volumes.json,manifest.json, and the DTCG files withresolver.json.gen,gen --checkandvalidate(Terrazzo) run from the package. - Tabs draw their 2 px baseline with plain fills (each tab under itself and the gap after it, and a filler to the list's end) instead of a background image on the list, so the list paints nothing behind its labels; it still sits at the tabs' foot and the focus ring still prints whole outside the tab. CornerBox never runs past its column: in a narrow one under wide text spacing its small line wraps instead of spilling.
- The Phase 3 merge's seams. React: the label role (14 px, now 600) prints in
--mk-textin Eyebrow, the Card and PageHero eyebrows, SpecStrip labels, the stacked table's cell headers, the Navbar panel's meta and the NavSheet group titles, because no secondary ink reaches the label's floor; placeholders, input start and end text and the select's empty choice print in the new--mk-on-control-2;Art interactivemarks no layer, so the 3D stage's own art and plate layers decide (its caption and keys never sit inside an art layer). Three:@react-three/fiberis an optional peer like@react-three/drei, because the stage is imperative three. - Focus rings and reflow in the reading layer (R-47): SegmentedControl, Tabs and CodeBlock draw LC-05's ring outside the focused key (2 px at 2 px) instead of inset; RadioGroup and CheckboxGroup keys and cards, VolumeDial stops and link Cards mark the element that draws the ring (
data-mk-focus-ring); a focusable VisuallyHidden draws the ring. StatGroup lays out by its own width (a size container), SpecStrip keeps 2 × 2 inside a narrow container and the Navbar's desktop bar also needs a 60rem header, so phone-width specimens on wide screens no longer squeeze; the Navbar bar wraps rather than spills under wide text spacing. FittedLine refits when its words' box changes (a reader's text spacing), goes below its role's floor before it wraps, and never spills. A ruler range keeps its two values apart, a slider's end figures stay inside it, ComparisonTable and the segmented ThemeToggle name their radios per instance (two on a page no longer uncheck each other), and a Stamp's second line wraps, with the big stamp at 0.6× below 30rem.