@dorsk/tsumikit

Svelte 5 · pure CSS · zero deps
AppShell Legacy
v0.75.0
Foundations
StyleHooks TextScaling ThemeTokens Theming Typography
Atoms
Artwork Avatar Badge Button 5 Card Checkbox Divider Dot Gauge Heading Icon Input Kbd Link Progress Scrim SegmentedProgress Select Skeleton Slider Spinner Swatch Switch Text Textarea TimeDisplay
Molecules
Accordion AttachmentList Breadcrumb Callout CapBar Carousel ChatBubble CodeBlock Combobox Composer ConfirmModal CopyButton Disclosure Drawer Dropzone EmojiPicker EmptyState Field Fieldset FileButton FilterInput FontScalePicker GitRef GlyphStack IconButton InputGroup KeyValue LoadMore Menu Meter Metric Modal OptionButton Pagination Popover Prose PullToRefresh RadialMenu RadioGroup SectionHeader SeekSlider SegmentedControl SelectButton SortableList SoundSettings 3 SplitButton StatusBar SwipeRow Tabs ThemePicker Timestamp Toaster Toggle Tooltip Truncate VolumeSlider WorkingDir
Organisms
ConversationFeed ConversationPanel DataTable FilterSearchBar
Layouts
AppShell AutoGrid Cluster Container MasterDetail NavBar NavItem NavSection ResizablePanel Stack TabBar Toolbar

StyleHooks

foundations

Not migrated yet

Shown on the legacy showcase.

TextScaling

foundations

Not migrated yet

Shown on the legacy showcase.

ThemeTokens

foundations

Not migrated yet

Shown on the legacy showcase.

Theming

foundations

Not migrated yet

Shown on the legacy showcase.

Typography

foundations

Not migrated yet

Shown on the legacy showcase.

Artwork

atoms

Not migrated yet

Shown on the legacy showcase.

Avatar

atoms

Not migrated yet

Shown on the legacy showcase.

Badge

atoms

Not migrated yet

Shown on the legacy showcase.

Button

atoms

The one control for actions: four variants, five tones, three sizes, a corner count and a stacked hotbar layout, all on a native button or link.

See also IconButtonCopyButtonSplitButtonToggle

Dialog footer

variant="primary" carries the one main action; ghost and default stand beside it.

Changes apply to all 12 members of the workspace.
svelte
<script lang="ts">
	import { Button, Cluster, Text, toasts } from '@dorsk/tsumikit';

	let saving = $state(false);
	async function save() {
		saving = true;
		await new Promise((r) => setTimeout(r, 900));
		saving = false;
		toasts.show('Workspace settings saved');
	}
</script>

<Text tone="muted" size="sm">Changes apply to all 12 members of the workspace.</Text>
<Cluster justify="flex-end">
	<Button variant="ghost">Cancel</Button>
	<Button>Reset to defaults</Button>
	<Button variant="primary" loading={saving} onclick={save}>Save changes</Button>
</Cluster>

Variants, tones and sizes

variant picks the chrome, tone the colour, size the height; pill rounds it, control matches input height.

svelte
<script lang="ts">
	import { Button, Cluster, Text } from '@dorsk/tsumikit';
</script>

<Cluster>
	<Button>Default</Button>
	<Button variant="primary">Primary</Button>
	<Button variant="ghost">Ghost</Button>
	<Button variant="danger">Delete</Button>
	<Button variant="link">Learn more</Button>
</Cluster>
<Cluster>
	<Button tone="accent">Notify me</Button>
	<Button tone="success">Approve</Button>
	<Button tone="info">Cold start</Button>
	<Button tone="warn">Retry</Button>
	<Button tone="warn" control>Send <Text numeric>0:09</Text></Button>
</Cluster>
<Cluster align="center">
	<Button size="sm">Small</Button>
	<Button size="md">Medium</Button>
	<Button size="lg">Large</Button>
	<Button control>Control height</Button>
	<Button pill>Pill</Button>
	<Button pill variant="primary" size="sm">Pill small</Button>
</Cluster>

States

disabled, loading, pressed, a corner count (hidden at 0, capped by countMax) and a block button that fills its row.

svelte
<script lang="ts">
	import { Button, Cluster } from '@dorsk/tsumikit';

	let starred = $state(false);
</script>

<Cluster>
	<Button disabled>Disabled</Button>
	<Button variant="primary" loading>Deploying</Button>
	<Button pressed={starred} onclick={() => (starred = !starred)}>{starred ? 'Starred' : 'Star'}</Button>
	<Button count={3}>Inbox</Button>
	<Button variant="primary" count={12}>Apply filters</Button>
	<Button variant="danger" count={120}>Failed jobs</Button>
	<Button tone="warn" count={1500} countMax={999}>Queued</Button>
	<Button count={0}>Zero hides</Button>
</Cluster>
<Button block variant="primary">Continue to checkout</Button>
<Cluster>
	<Button>A label long enough to show how a button behaves when its text wraps onto a second line</Button>
	<Button shrink={false}>No shrink</Button>
</Cluster>

Hotbar slots and links

layout="stacked" puts glyph over the label with a shortcut hint; href renders a real link with the same chrome.

Open repository Back to top of section Inactive link
svelte
<script lang="ts">
	import { Button, Cluster } from '@dorsk/tsumikit';
</script>

<Cluster>
	<Button layout="stacked" size="sm" glyph="■" shortcut="1" tone="danger">Disarm</Button>
	<Button layout="stacked" size="sm" glyph="⇢" shortcut="2">Go zone</Button>
	<Button layout="stacked" size="sm" glyph="$" shortcut="3" disabled>Sell all</Button>
	<Button layout="stacked" size="sm" glyph="☰" shortcut="G" pressed count={2}>Group</Button>
	<Button layout="stacked" glyph="search" shortcut="F">Find</Button>
	<Button layout="stacked" size="lg" glyph="star" shortcut="S">Star</Button>
</Cluster>
<Cluster>
	<Button href="https://github.com/DorskFR/tsumikit" target="_blank">Open repository</Button>
	<Button as="a" href="#button" variant="ghost">Back to top of section</Button>
	<Button href="#nowhere" disabled>Inactive link</Button>
</Cluster>

Variant × tone matrix

Regression fixture: every variant against every tone; primary keeps a readable on-accent label.

svelte
<script lang="ts">
	import { Button, Cluster } from '@dorsk/tsumikit';

	const variants = ['default', 'primary', 'ghost', 'danger'] as const;
	const tones = ['none', 'accent', 'success', 'info', 'warn', 'danger'] as const;
</script>

{#each variants as variant (variant)}
	<Cluster>
		{#each tones as tone (tone)}
			<Button {variant} {tone}>{variant}/{tone}</Button>
		{/each}
	</Cluster>
{/each}

Card

atoms

Not migrated yet

Shown on the legacy showcase.

Checkbox

atoms

Not migrated yet

Shown on the legacy showcase.

Divider

atoms

Not migrated yet

Shown on the legacy showcase.

Dot

atoms

Not migrated yet

Shown on the legacy showcase.

Gauge

atoms

Not migrated yet

Shown on the legacy showcase.

Heading

atoms

Not migrated yet

Shown on the legacy showcase.

Icon

atoms

Not migrated yet

Shown on the legacy showcase.

Input

atoms

Not migrated yet

Shown on the legacy showcase.

Kbd

atoms

Not migrated yet

Shown on the legacy showcase.

Link

atoms

Not migrated yet

Shown on the legacy showcase.

Progress

atoms

Not migrated yet

Shown on the legacy showcase.

Scrim

atoms

Not migrated yet

No example exists for this component yet.

SegmentedProgress

atoms

Not migrated yet

Shown on the legacy showcase.

Select

atoms

Not migrated yet

Shown on the legacy showcase.

Skeleton

atoms

Not migrated yet

Shown on the legacy showcase.

Slider

atoms

Not migrated yet

Shown on the legacy showcase.

Spinner

atoms

Not migrated yet

Shown on the legacy showcase.

Swatch

atoms

Not migrated yet

Shown on the legacy showcase.

Switch

atoms

Not migrated yet

Shown on the legacy showcase.

Text

atoms

Not migrated yet

Shown on the legacy showcase.

Textarea

atoms

Not migrated yet

Shown on the legacy showcase.

TimeDisplay

atoms

Not migrated yet

Shown on the legacy showcase.

Accordion

molecules

Not migrated yet

Shown on the legacy showcase.

AttachmentList

molecules

Not migrated yet

Shown on the legacy showcase.

Breadcrumb

molecules

Not migrated yet

Shown on the legacy showcase.

Callout

molecules

Not migrated yet

Shown on the legacy showcase.

CapBar

molecules

Not migrated yet

Shown on the legacy showcase.

Carousel

molecules

Not migrated yet

Shown on the legacy showcase.

ChatBubble

molecules

Not migrated yet

Shown on the legacy showcase.

CodeBlock

molecules

Not migrated yet

Shown on the legacy showcase.

Combobox

molecules

Not migrated yet

Shown on the legacy showcase.

Composer

molecules

Not migrated yet

Shown on the legacy showcase.

ConfirmModal

molecules

Not migrated yet

Shown on the legacy showcase.

CopyButton

molecules

Not migrated yet

Shown on the legacy showcase.

Disclosure

molecules

Not migrated yet

Shown on the legacy showcase.

Drawer

molecules

Not migrated yet

Shown on the legacy showcase.

Dropzone

molecules

Not migrated yet

Shown on the legacy showcase.

EmojiPicker

molecules

Not migrated yet

Shown on the legacy showcase.

EmptyState

molecules

Not migrated yet

Shown on the legacy showcase.

Field

molecules

Not migrated yet

Shown on the legacy showcase.

Fieldset

molecules

Not migrated yet

Shown on the legacy showcase.

FileButton

molecules

Not migrated yet

Shown on the legacy showcase.

FilterInput

molecules

Not migrated yet

Shown on the legacy showcase.

FontScalePicker

molecules

Not migrated yet

Shown on the legacy showcase.

GitRef

molecules

Not migrated yet

Shown on the legacy showcase.

GlyphStack

molecules

Not migrated yet

Shown on the legacy showcase.

IconButton

molecules

Not migrated yet

Shown on the legacy showcase.

InputGroup

molecules

Not migrated yet

Shown on the legacy showcase.

KeyValue

molecules

Not migrated yet

Shown on the legacy showcase.

LoadMore

molecules

Not migrated yet

Shown on the legacy showcase.

Menu

molecules

Not migrated yet

Shown on the legacy showcase.

Meter

molecules

Not migrated yet

No example exists for this component yet.

Metric

molecules

Not migrated yet

Shown on the legacy showcase.

Modal

molecules

Not migrated yet

Shown on the legacy showcase.

OptionButton

molecules

Not migrated yet

Shown on the legacy showcase.

Pagination

molecules

Not migrated yet

Shown on the legacy showcase.

Popover

molecules

Not migrated yet

Shown on the legacy showcase.

Prose

molecules

Not migrated yet

Shown on the legacy showcase.

PullToRefresh

molecules

Not migrated yet

Shown on the legacy showcase.

RadialMenu

molecules

Not migrated yet

Shown on the legacy showcase.

RadioGroup

molecules

Not migrated yet

Shown on the legacy showcase.

SectionHeader

molecules

Not migrated yet

Shown on the legacy showcase.

SeekSlider

molecules

Not migrated yet

Shown on the legacy showcase.

SegmentedControl

molecules

Not migrated yet

Shown on the legacy showcase.

SelectButton

molecules

Not migrated yet

Shown on the legacy showcase.

SortableList

molecules

Not migrated yet

Shown on the legacy showcase.

SoundSettings

molecules

Opt-in UI sound: a speaker popover with the on/off switch, a volume slider, a preview button and the reason nothing plays.

See also VolumeSliderThemePickerFontScalePicker

Settings toolbar

size="sm" beside the theme and text-size pickers; the switch state and volume persist.

Preferences
svelte
<script lang="ts">
	import { FontScalePicker, SoundSettings, Text, ThemePicker, Toolbar } from '@dorsk/tsumikit';
</script>

<Toolbar label="Preferences" density="compact">
	<Text size="sm" tone="muted">Preferences</Text>
	<SoundSettings size="sm" />
	<FontScalePicker box="sm" />
	<ThemePicker box="sm" />
</Toolbar>

Sizes

size="sm" and "md" set the trigger box and the panel density; variant and tone pass to the trigger.

svelte
<script lang="ts">
	import { SoundSettings } from '@dorsk/tsumikit';
</script>

<SoundSettings size="sm" />
<SoundSettings size="md" />
<SoundSettings size="md" variant="primary" label="Audio" />

Palette

sound.play(name) for every SoundName; silent until sounds are on.

Turn sounds on to audition the palette.
svelte
<script lang="ts">
	import { Button, Cluster, SoundSettings, Text, sound, type SoundName } from '@dorsk/tsumikit';

	const palette: { name: SoundName; hint: string }[] = [
		{ name: 'click', hint: 'buttons, selections' },
		{ name: 'toggle-on', hint: 'switch on' },
		{ name: 'toggle-off', hint: 'switch off' },
		{ name: 'open', hint: 'modal, menu, drawer' },
		{ name: 'close', hint: 'dismiss' },
		{ name: 'success', hint: 'ok toast, copied' },
		{ name: 'error', hint: 'error toast' },
		{ name: 'tick', hint: 'slider step' },
	];
</script>

<Cluster align="center">
	<SoundSettings size="sm" />
	<Text size="sm" tone="muted">
		{sound.muted === 'off'
			? 'Turn sounds on to audition the palette.'
			: sound.muted === 'reduced-motion'
				? 'Reduced motion: only success and error play.'
				: `Volume ${Math.round(sound.volume * 100)}%`}
	</Text>
</Cluster>
<Cluster>
	{#each palette as { name, hint } (name)}
		<Button sound={false} title={hint} onclick={() => sound.play(name)}>{name}</Button>
	{/each}
</Cluster>

SplitButton

molecules

Not migrated yet

Shown on the legacy showcase.

StatusBar

molecules

Not migrated yet

Shown on the legacy showcase.

SwipeRow

molecules

Not migrated yet

Shown on the legacy showcase.

Tabs

molecules

Not migrated yet

Shown on the legacy showcase.

ThemePicker

molecules

Not migrated yet

Shown on the legacy showcase.

Timestamp

molecules

Not migrated yet

Shown on the legacy showcase.

Toaster

molecules

Not migrated yet

Shown on the legacy showcase.

Toggle

molecules

Not migrated yet

Shown on the legacy showcase.

Tooltip

molecules

Not migrated yet

Shown on the legacy showcase.

Truncate

molecules

Not migrated yet

Shown on the legacy showcase.

VolumeSlider

molecules

Not migrated yet

Shown on the legacy showcase.

WorkingDir

molecules

Not migrated yet

Shown on the legacy showcase.

ConversationFeed

organisms

Not migrated yet

Shown on the legacy showcase.

ConversationPanel

organisms

Not migrated yet

Shown on the legacy showcase.

DataTable

organisms

Not migrated yet

Shown on the legacy showcase.

FilterSearchBar

organisms

Not migrated yet

Shown on the legacy showcase.

AppShell

layouts

Not migrated yet

Shown on the AppShell page.

AutoGrid

layouts

Not migrated yet

Shown on the legacy showcase.

Cluster

layouts

Not migrated yet

Shown on the legacy showcase.

Container

layouts

Not migrated yet

Shown on the AppShell page.

MasterDetail

layouts

Not migrated yet

Shown on the legacy showcase.

NavBar

layouts

Not migrated yet

Shown on the legacy showcase.

NavItem

layouts

Not migrated yet

Shown on the legacy showcase.

NavSection

layouts

Not migrated yet

Shown on the AppShell page.

ResizablePanel

layouts

Not migrated yet

Shown on the legacy showcase.

Stack

layouts

Not migrated yet

Shown on the legacy showcase.

TabBar

layouts

Not migrated yet

Shown on the legacy showcase.

Toolbar

layouts

Not migrated yet

No example exists for this component yet.
MIT · @dorsk/tsumikit