Dryui Build logo

Dryui Build

Community
rob-balfre
dryui-build

Builds and edits Svelte 5 user interfaces with DryUI components, layout hooks, theme tokens, and accessibility rules. Use when creating or modifying app UI, pages, routes, forms, dashboards, component compositions, visual polish, or design-to-code work with @dryui/ui.

Overview

Publisherrob-balfre
Repositorydryui
Skill namedryui-build
Stars
9
Forks
0
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by rob-balfre on GitHub. Read the source before you install it.

Installation

Install the Dryui Build AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/rob-balfre/dryui/tree/main/reports/skill-experiments/2026-05-11/batch-2/base
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/rob-balfre/dryui.git /tmp/dryui
mkdir -p .claude/skills
cp -r /tmp/dryui/reports/skill-experiments/2026-05-11/batch-2/base .claude/skills/dryui-build
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Dryui Build in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Dryui Build on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Dryui Build is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

DryUI Build

Build real Svelte 5 UI with DryUI. This skill is only for UI implementation and polish. It does not install DryUI, scaffold projects, run live feedback, or resolve feedback submissions.

Lint First

DryUI lint rules are the contract. If lint, the compiler, or component metadata disagrees with a visual idea, restructure the markup or CSS instead of bypassing the rule.

  • Use @dryui/ui primitives when DryUI provides one. Do not recreate controls with raw HTML.
  • DryUI does not ship a layout component. Use plain markup with data-layout and data-layout-area.
  • Page and section layout lives in src/layout.css, scoped under [data-layout='<name>'].
  • All consumer display: grid and display: flex declarations live in src/layout.css or @container blocks inside it.
  • In src/layout.css, use only lint-safe display values such as grid or flex; never add display: block, contents, flow-root, or reset-style display values.
  • Route and component <style> blocks must not contain page-level display: grid, display: flex, layout breakpoints, inline style=, or Svelte style: directives.
  • Responsive layout is mobile-first and uses @container page (...); never @media for layout breakpoints.
  • src/layout.css is structural only: display, grid, flex, container, tokenized spacing, alignment, and block-size constraints. No color, background, border, shadow, opacity, transition, transform, font, text, position, z-index, width, height, or inline-size.
  • Visual CSS belongs in app/component CSS and uses real --dry-* tokens such as --dry-color-bg-base, --dry-color-text, and --dry-color-border, or app-owned custom properties.
  • In app/component CSS, constrain replaced media and text inside media-backed grids so intrinsic image size or long headings cannot enlarge grid tracks: use inline-size: 100%, max-inline-size: 100%, min-inline-size: 0, object-fit, and readable max-width/maxMeasure where needed.
  • Set body { font-family: var(--dry-font-sans); } in src/app.css so dialogs, popovers, and top-layer UI inherit the app font.

Do not add these to get past lint or compiler pressure:

  • :global()
  • !important
  • all: unset
  • <svelte:element>
  • <!-- svelte-ignore ... -->
  • inline style=
  • style: directives
  • raw native controls when a DryUI component exists
  • width or inline-size hacks to force unrelated layout fit; media/text constraints that prevent intrinsic overflow are required

Workflow

  1. Restate the target UI in one line: user, screen, primary task, density.
  2. Inspect nearby app patterns and existing DryUI usage.
  3. Check component metadata before guessing APIs: packages/ui/src/<component>/<component>.meta.ts, then index.ts, then source.
  4. Implement with @dryui/ui, Svelte 5 runes, data-layout hooks, src/layout.css, and DryUI tokens.
  5. Run the narrowest deterministic validation for the changed files; broaden when shared UI, package contracts, or docs changed.
  6. For visual work, verify desktop and mobile browser screenshots.

Markup

  • Every interior raw element needs data-layout="<specific-name>" or data-layout-area="<area>".
  • Use data-layout-area only for children that participate in named grid areas.
  • Do not use generic layout names: ui, wrapper, box, container, div, block, el, elem, element, layout, inner, outer.
  • Do not pass class= to DryUI components. Use wrappers, component props, data-* attributes, or custom properties.
  • Prefer Button, Input, Select, DatePicker, Dialog, AlertDialog, Separator, Table, and DataGrid over native route-level controls.
  • Wrap each form control in Field.Root with Label.
  • Use AlertDialog for destructive confirmation.
  • Add aria-label to icon-only buttons and type="submit" to primary form submit buttons.

Components

Assume a DryUI component is compound until metadata or nearby usage proves otherwise. Compound components use .Root; parts stay inside the matching root.

Common compound families include Accordion, AlertDialog, Breadcrumb, Collapsible, ColorPicker, Combobox, CommandPalette, ContextMenu, DataGrid, DatePicker, Dialog, Drawer, DropdownMenu, EmptyState, Field, FileUpload, FloatButton, Pagination, Popover, RadioGroup, RichTextEditor, Select, Splitter, Stepper, Table, Tabs, TagsInput, Toast, ToggleGroup, Toolbar, Tooltip, Tour, and Transfer.

Theme

  • Import DryUI theme CSS before rendering components and choose one document theme mode: light imports default.css and leaves <html> bare; system imports both themes and sets class="theme-auto"; explicit imports both and sets data-theme="light" or data-theme="dark".
  • color-scheme is not a theme switch. Do not set color-scheme: light dark or use light-dark() as the only dark-mode implementation; DryUI dark tokens come from data-theme or .theme-auto.
  • App-owned custom properties must resolve to readable foreground/background pairs in every enabled mode. If using light-dark(), verify both resolutions and keep it out of image-overlay contrast decisions.
  • For art-directed light surfaces with fixed custom ink/cream colors, keep nav, chips, cards, and panels on app-owned light backgrounds too. Do not place fixed dark text or icons on adaptive DryUI background tokens such as --dry-color-bg-base, --dry-color-bg-raised, or --dry-color-bg-overlay, because .theme-auto on a dark OS can turn those surfaces dark while custom text stays dark.
  • Text over photos, video, canvas, charts, or gradients needs an actual contrast layer above the media and below the content, or a fixed text color chosen for that surface. A background gradient behind an <img> does not protect contrast.
  • Auto/system pages must be checked in light and dark. If both cannot be verified, keep the app light-only and leave <html> bare.
  • Override semantic tokens such as brand, danger, success, text, stroke, focus, spacing, and type aliases. Do not invent --dry-* names or nonexistent surface tokens such as --dry-color-surface, --dry-color-panel, or --dry-color-background.
  • Do not resize the whole UI by changing html or body font-size; avoid raw hex, rgb(), and raw px spacing when a DryUI token exists.

Svelte

  • Use Svelte 5 runes: $state, $derived, $props, $bindable, and $effect.
  • Prefer $derived for computed values. Do not use $effect to maintain derived state.
  • Use typed, destructured $props; use $bindable only for props that support two-way binding.
  • Use snippets instead of slots.
  • Use event props such as onclick, oninput, and onsubmit; do not mix legacy on: handlers into new code.
  • Guard browser-only APIs from SSR. Do not read window, document, localStorage, or layout measurements at module evaluation time.
  • Treat $effect as an escape hatch for browser lifecycle work, observers, listeners, maps, canvas, timers, and cleanup.

Motion

Build the no-animation version first. Use CSS transitions, Svelte transitions, View Transitions, or scroll-driven animations only after layout and accessibility are correct.

  • Respect prefers-reduced-motion.
  • Prefer opacity and transform. Do not animate layout tracks, width, height, inline-size, or critical spacing.
  • Do not use motion to hide missing loading, disabled, empty, or error states.
  • Keep view-transition-name sparse and specific.

Validation

  • For .svelte route or app work, run the local Svelte check or package check that covers the changed files.
  • For packages/ui/ component work, run bun run --filter '@dryui/ui' build.
  • For docs UI work, run the docs check/build wrapper used by the repo.
  • For skill content changes, run bun run validate:skills.
  • Report any validation you could not run and why.

Frequently asked questions

What does the Dryui Build AI skill do?

Builds and edits Svelte 5 user interfaces with DryUI components, layout hooks, theme tokens, and accessibility rules. Use when creating or modifying app UI, pages, routes, forms, dashboards, component compositions, visual polish, or design-to-code work with @dryui/ui.

Why use Dryui Build on TypingMind?

Because you install it once and use it with any model. Dryui Build is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Dryui Build in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/rob-balfre/dryui/tree/main/reports/skill-experiments/2026-05-11/batch-2/base. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Dryui Build?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Dryui Build?

As many as you like. As long as a model supports skills, you can use Dryui Build with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Dryui Build AI skill free?

Yes. It is published on GitHub by rob-balfre under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇