The kit READMEs from #365 were hard-wrapped and failed the master quality gate's reflow-check (the gate runs on master pushes, not PRs). uv.lock picks up the 0.20.0 project version from the release bump.
3.6 KiB
kit
Reusable plain-CSS/HTML building blocks that recreate the RoboCo control panel's look, for compositions that want to simulate the product rather than run a text card. Hand-rolled (no React, no Tailwind, no bundler) — this is a recreation of the panel's design language, not a port of its components. Load kit.css (and kit.js if you use the typing helper); no composition-level theme.css is needed, kit.css owns the reset + fonts.
<link rel="stylesheet" href="../../kit/kit.css" />
<script src="props.js"></script>
<script src="../../kit/kit.js"></script>
Every class is namespaced pk-. See compositions/panel-demo/ for a full worked example (task types in, a card appears, a cursor clicks it done, a toast confirms it).
Pieces
pk-frame— the app chrome: a slim sidebar (pk-frame__sidebar,pk-frame__navitem[--active]) and a top bar (pk-frame__topbar,pk-frame__search,pk-frame__statusfor the pulsing "Live" dot) around apk-frame__contentarea. Fixed sidebar/topbar sizing works at both 1080x1920 and 1080x1080 — only the content area's height changes.pk-column/pk-card— a kanban-ish list container (pk-column__header+ children) hosting task cards. A card ispk-card__title,pk-card__meta(chips +pk-card__assignee), andpk-card__status(a pill).pk-chip— a small team/priority tag:<span class="pk-chip pk-chip--purple">Frontend</span>. Variants:--purple,--blue,--green,--orange,--pink,--gray.pk-pill— a status pill:<span class="pk-pill pk-pill--progress">in progress</span>. Variants:--progress,--review,--approved,--completed. To swap one pill for another (e.g. progress -> completed), stack two pills at the same spot inside aposition: relativepk-card__statusand give the outgoing onepk-pill--swap-out(fades in then out) and the incoming onepk-pill--swap-in(fades in and stays), each with its own--pk-pill-enter-delay/--pk-pill-exit-delay(composition-absolute seconds — the same conventiondata-startuses).pk-toast— a notification card that slides in from a corner:pk-toast__icon+pk-toast__body(pk-toast__title,pk-toast__text). Position via--pk-toast-bottom(right-anchored).pk-type/pk-caret— character-by-character typing reveal. Write the target element's final text directly in the HTML, then callwindow.PanelKit.typeText(el, { delay, stagger })(fromkit.js) once, synchronously, before rendering starts — it splits the text intopk-type__charspans with staggeredanimation-delays (works with any font, no per-character width math).delayis the composition-absolute second the first character appears;staggerdefaults to 0.045s/char. Add a<span class="pk-caret"></span>next to it for the blinking caret.pk-cursor— a small CSS-shape cursor (pk-cursor__glyph) that glides along a straight path and pulses (pk-cursor__ring) on arrival. Position via--pk-cursor-x0/y0/x1/y1(content-box-relative pixels) and timing via--pk-cursor-delay(glide start) /--pk-click-delay(pulse start), all composition-absolute seconds.
Offline constraints (same as every composition)
No CDN, no npm runtime deps, no bundler — plain files only, loaded via relative paths (../../kit/... from a composition two levels down). Fonts are the vendored motion/public/fonts/*.woff2, loaded via @font-face in kit.css. Motion is CSS keyframes timed with animation-delay (seconds from frame 0 — no requestAnimationFrame, no Date.now()), so a render is frame-deterministic.