Wireframe Kit
Coded wireframes — screens as data, no PNGs. 44 reusable blocks and 17 full-screen templates for documenting any project's user flows. Theme-aware and resolution-independent; drop the blocks into a ScreenSpec.wire.
Screen templates
Copy a full screen and adapt it.
Onboarding & auth
Single onboarding slide with illustration, copy and CTA.
Email + password sign-in with social and reset links.
Account creation with a live password-strength meter.
Enter the code sent by SMS/email, with resend.
Browse & discover
Greeting, search, category chips, promo and a product grid.
Search results with segmented sort and a scrollable list.
Focused search with recent terms and suggestions.
Detail & commerce
Gallery, title, rating, price, options and add-to-cart.
Line items with quantity steppers and an order summary.
Address, shipping method, payment and place-order.
Order confirmation with a delivery timeline.
Account
Profile header, stats and a menu list.
Grouped preferences with toggles and a picker.
Data & messaging
KPI tiles, a chart and a recent-activity list.
Conversation thread with an input row.
Grouped notification list with unread markers.
A friendly empty state with a primary action.
Block reference
Every primitive in the kit, with the snippet to write it.
Text & media
Headings, copy, images and profile blocks.
logoLogo / iconCrossed circle or square — the classic image placeholder.
{ kind: "logo" }headingHeadingReal heading text, left/center/right.
{ kind: "heading", text: "Welcome back", align: "center" }linesText linesPlaceholder paragraph bars; widths are % of the row.
{ kind: "lines", widths: [100, 90, 70] }imageImageCrossed image box, aspect-ratio or fixed height.
{ kind: "image" }bannerBannerHero/promo image with an optional centered label.
{ kind: "banner", text: "Summer sale −40%" }avatarAvatar rowProfile header: avatar, name and subtitle.
{ kind: "avatar", name: "Amina K.", subtitle: "Premium member" }Inputs & forms
Everything the user types, taps or toggles.
inputText fieldLabeled input; supports filled and error states.
{ kind: "input", label: "Email" }textareaText areaMulti-line input with a set number of lines.
{ kind: "textarea", label: "Message", lines: 3 }selectSelect / pickerDropdown field with a value and chevron.
{ kind: "select", label: "Country", value: "Algeria" }searchSearch fieldSearch input with a magnifier and placeholder.
{ kind: "search", label: "Search products" }buttonButtonPrimary/secondary; loading swaps to three dots.
{ kind: "button", label: "Continue" }linkLinkSmall inline text link.
{ kind: "link", text: "Forgot password?", align: "center" }checkboxCheckboxesMulti-select rows; `checked` lists ticked indices.
{ kind: "checkbox", items: ["Email", "SMS", "Push"], checked: [0, 2] }radioRadio groupSingle-select rows; `active` is the chosen index.
{ kind: "radio", items: ["Home", "Work", "Other"], active: 1 }switchToggle rowsSettings switches; `on` lists enabled indices.
{ kind: "switch", items: ["Notifications", "Dark mode"], on: [0] }sliderSliderRange slider with a knob; value 0–100.
{ kind: "slider", label: "Budget", value: 60 }stepperQuantity stepper− value + control for quantities.
{ kind: "stepper", label: "Quantity", value: 2 }otpOTP codeVerification code boxes; `filled` = digits entered.
{ kind: "otp", count: 4, filled: 2 }chipsFilter chipsRow of selectable chips.
{ kind: "chips", items: ["All", "Food", "Drinks", "Deals"], active: 0 }meterMeterSegmented strength/progress with a caption.
{ kind: "meter", segments: 3, filled: 2, label: "Password strength: medium", tone: "warning" }Data display
Cards, lists, metrics and richer content.
cardCardContent card with optional image, title and body.
{ kind: "card", title: "Wireless headphones", lines: 2, image: true }listListAvatar + text rows; optional trailing value.
{ kind: "list", items: 3, trailing: true }gridGridImage cards with caption bars, 2 or 3 columns.
{ kind: "grid", cols: 2, items: 4 }statsStat tilesKPI row — value over label.
{ kind: "stats", items: [{ value: "1.2k", label: "Followers" }, { value: "318", label: "Following" }, { value: "4.9", label: "Rating" }] }ratingRatingStar rating out of `count`.
{ kind: "rating", value: 4, count: 5 }pricePrice rowAmount with optional old price and quantity stepper.
{ kind: "price", amount: "$49.00", note: "$79.00", stepper: true }badgeStatus badgesRow of coloured status pills.
{ kind: "badge", items: [{ text: "In stock", tone: "success" }, { text: "Low", tone: "warning" }, { text: "Sold out", tone: "error" }] }timelineTimelineVertical steps; up to `active` are done.
{ kind: "timeline", items: ["Ordered", "Shipped", "Out for delivery", "Delivered"], active: 1 }accordionAccordionExpandable rows; the `open` index shows body.
{ kind: "accordion", items: ["Shipping & returns", "Size guide", "Reviews"], open: 0 }chatChatMessage bubbles — out (right) vs in (left).
{ kind: "chat", bubbles: [{ side: "in", text: "Hi! Is this available?" }, { side: "out", text: "Yes — in stock." }] }mapMapMap placeholder with a centered pin.
{ kind: "map" }chartChartBar or line chart placeholder.
{ kind: "chart", variant: "bars" }tableTableSimple table with an optional header row.
{ kind: "table", rows: 3, cols: 3 }States & layout
Feedback, empty/loading states and spacing.
toastToast / bannerInline feedback with a tone (success/error/info/warning).
{ kind: "toast", text: "Saved successfully", tone: "success" }emptyEmpty stateIcon, message and an optional action button.
{ kind: "empty", text: "Your cart is empty", button: "Browse products" }spinnerSpinnerCentered loading indicator with a label.
{ kind: "spinner", label: "Loading…" }spacerSpacerVertical gap; `grow` pushes the rest to the bottom.
{ kind: "spacer", size: 2 }dividerDividerHairline separator between sections.
{ kind: "divider" }