Language

The words and the number and date notation the components write themselves: English by default, German in one import, and any single entry your own. Wording is a directory of named entries, not a translation call (also called i18n or localisation).

import { LanguageProvider, useWording, useFormats } from "@umriss-ui/core";

English needs nothing (ADR-0018). German ships as the subpath @umriss-ui/core/wording/de with GERMAN_WORDING and GERMAN_FORMATS, the two halves of a language; take both in one import (ADR-0019, ADR-0024).

Pass them to the language of UmrissProvider for the application, or to LanguageProvider for one section. Both merge entry by entry: what you leave out keeps its default. Every wording is typed Wording, so a whole language of your own misses no entry without a compile error.

Examples

German

Import both halves of German from @umriss-ui/core/wording/de; the components' own words and notation change, your labels stay as written.

import { useState } from "react";
import { DatePicker, FormField, LanguageProvider, NumberInput, Stack } from "@umriss-ui/core";
import { GERMAN_FORMATS, GERMAN_WORDING } from "@umriss-ui/core/wording/de";

export default function German() {
  const [date, setDate] = useState<Date | null>(new Date(2026, 2, 18));
  const [weight, setWeight] = useState<number | null>(1284.5);

  return (
    <LanguageProvider wording={GERMAN_WORDING} formats={GERMAN_FORMATS}>
      <Stack direction="row" gap={3} wrap>
        <FormField label="Delivery date">
          <DatePicker value={date} onChange={setDate} clearable />
        </FormField>
        <FormField label="Weight">
          <NumberInput value={weight} onChange={setWeight} decimals={1} suffix="kg" />
        </FormField>
      </Stack>
    </LanguageProvider>
  );
}

English and German side by side

The same surface without a provider and under German: verdicts, placeholders and number notation move, the caller's labels and data stay.

import { Combobox, FormField, Grid, LanguageProvider, Stack, Stat, Text } from "@umriss-ui/core";
import type { LimitSet } from "@umriss-ui/core";
import { GERMAN_FORMATS, GERMAN_WORDING } from "@umriss-ui/core/wording/de";

/* The p95 latency objective of the checkout service: 300 ms. */
const OBJECTIVE: LimitSet = {
  target: 250,
  limits: [
    { value: 270, side: "upper", severity: "warning" },
    { value: 300, side: "upper", severity: "alarm" },
  ],
};

const ENGINEERS = [
  { value: "priya", label: "Priya Raman" },
  { value: "jonas", label: "Jonas Keller" },
  { value: "ada", label: "Ada Mwangi" },
];

function Surface() {
  return (
    <Stack gap={3}>
      <Stat label="Checkout p95" value={312} unit="ms" limits={OBJECTIVE} />
      <Stat label="Search p95" value={null} unit="ms" limits={OBJECTIVE} />
      <Stat label="Requests today" value={1284311} decimals={0} />
      <FormField label="Assignee">
        <Combobox value={null} onChange={() => {}} clearable options={ENGINEERS} />
      </FormField>
    </Stack>
  );
}

export default function SideBySide() {
  return (
    <Grid minItemWidth="240px" gap={5}>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          Without a provider
        </Text>
        <Surface />
      </Stack>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          GERMAN_WORDING and GERMAN_FORMATS
        </Text>
        <LanguageProvider wording={GERMAN_WORDING} formats={GERMAN_FORMATS}>
          <Surface />
        </LanguageProvider>
      </Stack>
    </Grid>
  );
}

Replace single entries

Pass only the entries your application says differently; every entry you leave out keeps its default, never an empty text or a key.

import { Grid, LanguageProvider, Stack, Stat, Text } from "@umriss-ui/core";
import type { LanguageOptions, LimitSet } from "@umriss-ui/core";

/* Outside the component, so the provider does not rebuild on every render. */
const WORDING: LanguageOptions["wording"] = {
  verdictOk: "Within objective",
  verdictWarning: "Objective at risk",
  verdictAlarm: "Objective breached",
};

const OBJECTIVE: LimitSet = {
  target: 250,
  limits: [
    { value: 270, side: "upper", severity: "warning" },
    { value: 300, side: "upper", severity: "alarm" },
  ],
};

function Surface() {
  return (
    <Stack gap={3}>
      <Stat label="Sign-in p95" value={184} unit="ms" limits={OBJECTIVE} />
      <Stat label="Search p95" value={276} unit="ms" limits={OBJECTIVE} />
      <Stat label="Checkout p95" value={312} unit="ms" limits={OBJECTIVE} />
      <Stat label="Billing p95" value={null} unit="ms" limits={OBJECTIVE} />
    </Stack>
  );
}

export default function SingleEntries() {
  return (
    <Grid minItemWidth="240px" gap={5}>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          The defaults
        </Text>
        <Surface />
      </Stack>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          Three entries replaced
        </Text>
        <LanguageProvider wording={WORDING}>
          <Surface />
        </LanguageProvider>
      </Stack>
    </Grid>
  );
}

Write numbers in your own notation

Formats are a register of their own: replace number and count for Swiss notation and every word stays English.

import { Grid, LanguageProvider, Stack, Stat, Text } from "@umriss-ui/core";
import type { LanguageOptions } from "@umriss-ui/core";

/* Formatters are costly to build: one per number of decimals, made once. */
const swiss = new Map<number | undefined, Intl.NumberFormat>();
function number(n: number, decimals?: number) {
  let format = swiss.get(decimals);
  if (!format) {
    format = new Intl.NumberFormat("de-CH", { minimumFractionDigits: decimals, maximumFractionDigits: decimals ?? 10 });
    swiss.set(decimals, format);
  }
  return format.format(n);
}
const swissCount = new Intl.NumberFormat("de-CH");

const FORMATS: LanguageOptions["formats"] = {
  number,
  count: (n) => swissCount.format(n),
};

function Surface() {
  return (
    <Stack gap={3}>
      <Stat label="Engineering, actual March" value={196420.5} decimals={2} unit="CHF" />
      <Stat label="Invoices booked" value={1284} decimals={0} />
    </Stack>
  );
}

export default function OwnNotation() {
  return (
    <Grid minItemWidth="240px" gap={5}>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          The default notation
        </Text>
        <Surface />
      </Stack>
      <Stack gap={2}>
        <Text size="xs" tone="muted">
          Swiss notation, English words
        </Text>
        <LanguageProvider formats={FORMATS}>
          <Surface />
        </LanguageProvider>
      </Stack>
    </Grid>
  );
}

Use the language in your own components

Read useFormats and useWording in a component of your own, and it writes dates and numbers like the library, under any provider.

import { Button, Grid, LanguageProvider, Stack, Text, useFormats, useWording } from "@umriss-ui/core";
import { GERMAN_FORMATS, GERMAN_WORDING } from "@umriss-ui/core/wording/de";

const SPRINT_END = new Date(2026, 2, 27, 17, 0);

function SprintHeader() {
  const formats = useFormats();
  const wording = useWording();
  return (
    <Stack direction="row" gap={3} align="center" wrap>
      <Text size="sm">
        Sprint 14 ends <Text as="span" mono>{formats.dateTime(SPRINT_END, false)}</Text> ·{" "}
        <Text as="span" mono>{formats.count(1240)}</Text> points delivered this year
      </Text>
      <Button size="sm" variant="ghost">
        {wording.today}
      </Button>
    </Stack>
  );
}

export default function OwnComponents() {
  return (
    <Grid minItemWidth="280px" gap={5}>
      <SprintHeader />
      <LanguageProvider wording={GERMAN_WORDING} formats={GERMAN_FORMATS}>
        <SprintHeader />
      </LanguageProvider>
    </Grid>
  );
}

Wording

Every entry of Wording: the English of DEFAULT_WORDING beside the German of GERMAN_WORDING. A function entry receives the parameters its key names and returns the sentence beside it. Override any entry by its key; a presets entry inside presets.

Inputs

KeyEnglishGermanDescription
clearInputClear inputEingabe leerenThe cross in the text field.
clearSelectionClear selectionAuswahl leerenThe cross in the select and in the combobox.
decreaseValueDecrease valueWert verringernStepper buttons of the number field.
increaseValueIncrease valueWert erhöhen—

Combobox and multi-select

KeyEnglishGermanDescription
comboboxPlaceholderSearch or selectSuchen oder wählen—
noMatchesNo matchesKeine TrefferEmpty state of both lists.
multiSelectPlaceholderSelectAuswählen—
multiSelectSearchPlaceholderSearchSuchen—
searchOptionsSearch optionsOptionen durchsuchen—
optionsOptionsOptionenGroup name of the option list.
optionScopeViewAnsichtGroup name of the scope switch.
optionScopeAllAllAlle—
optionScopeSelected(count)`Selected (${count})``Gewählte (${count})`The second scope, with the count in the text.
selectAllAllAlle—
selectNoneNoneKeine—
invertSelectionInvertUmkehren—
nothingSelectedNothing selectedNichts ausgewählt—
removeSelectedValue(beschriftung)`Remove ${beschriftung}``${label} entfernen`The cross on a selected value in the trigger.
manageMoreSelected(count)`Manage all ${count} selected``Alle ${count} Gewählten verwalten`The "+N" counter in the trigger.
multiSelectSummary(gewaehlt, total)`${gewaehlt} / ${total}``${selected} / ${total}`The summary in the panel: "3 / 12". The sentence structure belongs to the language, even where it is only a slash here.
optionCount(count)(count === 1 ? "1 option" : `${count} options`)(count === 1 ? "1 Option" : `${count} Optionen`)How many options stand, when a list opens or its filter changes; never zero - an empty list says its own empty text. Named, like the three below, after the moment it is spoken in: an announcement labels no element.
optionActive(label, state)[label, group, selected && "selected", disabled && "unavailable"].filter(Boolean).join(", ")[label, group, selected && "ausgewählt", disabled && "nicht verfügbar"].filter(Boolean).join(", ")The option the keys moved onto, with what VoiceOver leaves out.
optionAdded(label)`${label} added``${label} hinzugefügt`A value the multi-select took or gave away where no checkbox had the focus to say it - Enter in the search, a chip, Backspace.
optionRemoved(label)`${label} removed``${label} entfernt`—

Command palette

KeyEnglishGermanDescription
palettePlaceholderSearch …Suchen …What stands in the empty field.
paletteFieldSearchSuchenAccessible name of the field. Deliberately kept apart from the placeholder - whoever labels the field differently does not thereby rename the window.
palettePanelCommand paletteBefehlspaletteAccessible name of the window.
paletteListFindsFundeAccessible name of the list of finds.
paletteNoFindsNothing foundNichts gefundenThe one line when the query finds nothing.
paletteFindCount(count)(count === 1 ? "1 find" : `${count} finds`)(count === 1 ? "1 Fund" : `${count} Funde`)What the screen reader hears when the number of finds changes.
paletteMoreFinds(count)(count === 1 ? "1 more find" : `${count} more finds`)(count === 1 ? "1 weiterer Fund" : `${count} weitere Funde`)The last line when more finds exist than maxFinds lets stand.
paletteHintMoveselectwählenThe three key hints in the footer, each the text beside the key.
paletteHintChooseopenöffnen—
paletteHintClosecloseschließen—
paletteKeyEscEscEscThe legend on the Escape key. The arrows and the return key are glyphs and therefore do not stand here; "Esc" is a word and is called something else elsewhere.

Date and time

KeyEnglishGermanDescription
datePlaceholderSelect dateDatum wählen—
datePanelSelect dateDatum wählenAccessible name of the panel. Deliberately kept apart from the placeholder: whoever labels the field differently does not thereby rename the dialog.
dateClearClear dateDatum leeren—
dateTimePlaceholderSelect date and timeDatum und Zeit wählen—
dateTimePanelSelect date and timeDatum und Zeit wählen—
dateTimeClearClear date and timeDatum und Zeit leeren—
dateRangePlaceholderSelect rangeZeitraum wählen—
dateRangePanelSelect rangeZeitraum wählen—
dateRangeClearClear rangeZeitraum leeren—
dateTimeRangePanelSelect range with timeZeitraum mit Uhrzeit wählenAccessible name of the panel in the range with time of day.
dateTimeRangeClearClear range with timeZeitraum mit Uhrzeit leerenThe clearing x of the range with time - kept apart from the range without, so that an application can call the two differently.
previousMonthPrevious monthVoriger Monat—
nextMonthNext monthNächster Monat—
quickSelectQuick selectSchnellwahlGroup name of the preset column.
todayTodayHeute—
nowNowJetzt—
clearClearLeeren—
applyApplyÜbernehmen—
allDayAll dayGanztägig—
timeOfDayTimeUhrzeit—
hourHourStunde—
minuteMinuteMinute—
secondSecondSekunde—
sideFromFromVonHeader of the two time columns in the range with time of day.
sideToToBis—
startHourStart hourStartstundeAccessible name of the time fields, per side.
startMinuteStart minuteStartminute—
startSecondStart secondStartsekunde—
endHourEnd hourEndstunde—
endMinuteEnd minuteEndminute—
endSecondEnd secondEndsekunde—
timeFieldIncrease(feld)`Increase ${feld}``${field} erhöhen`Stepper buttons of a time field; the label comes from above.
timeFieldDecrease(feld)`Decrease ${feld}``${field} verringern`—
chooseStartDateSelect start dateStartdatum wählenFooter of the range panels.
chooseEndDateSelect end date – backwards is allowedEnddatum wählen – rückwärts ist erlaubt—
days(count)`${count} ${count === 1 ? "day" : "days"}``${count} ${count === 1 ? "Tag" : "Tage"}`"3 days" or "1 day" - the plural belongs to the language.
daysSelected(count)`${count} ${count === 1 ? "day" : "days"} selected``${count} ${count === 1 ? "Tag" : "Tage"} gewählt`"3 days selected"
rangePreview(from, to, count)`${from} – ${to} · ${count} ${count === 1 ? "day" : "days"}``${from} – ${to}\u2009·\u2009${count} ${count === 1 ? "Tag" : "Tage"}`"17.03. – 19.03. · 3 days" while dragging; the dates come from the formats.
daysAllDay(count)`${count} ${count === 1 ? "day" : "days"} (all day)``${count} ${count === 1 ? "Tag" : "Tage"} (ganztägig)`"3 days (all day)"
duration(teile)`Duration: ${teile.join(" ")}``Dauer: ${parts.join(" ")}`"Duration: 1 day 2 hrs 30 min"
hoursShort(count)`${count} ${count === 1 ? "hr" : "hrs"}``${count} Std`—
minutesShort(count)`${count} min``${count} Min`—
timeMissingHint(timeOfDay)`This time does not exist on this day (start of daylight saving time). ${timeOfDay} is used instead.``Diese Uhrzeit existiert an diesem Tag nicht (Beginn der Sommerzeit). Es wird ${timeOfDay} Uhr verwendet.`Daylight-saving change: the hour that does not exist.
timeMissingHintSide(side, timeOfDay)`${side}: This time does not exist on this day (start of daylight saving time). ${timeOfDay} is used instead.``${side}: Diese Uhrzeit existiert an diesem Tag nicht (Beginn der Sommerzeit). Es wird ${timeOfDay} Uhr verwendet.`The same, with the side put in front ("From"/"To").
timeAmbiguousHintThis time occurs twice on this day (end of daylight saving time):Diese Uhrzeit kommt an diesem Tag zweimal vor (Ende der Sommerzeit):Daylight-saving change: the hour that occurs twice.
timeAmbiguousHintSide(side)`${side}: This time occurs twice on this day (end of daylight saving time):``${side}: Diese Uhrzeit kommt an diesem Tag zweimal vor (Ende der Sommerzeit):`—
timeEarlier(versatz)`Earlier (${versatz})``Frühere (${offset})`—
timeLater(versatz)`Later (${versatz})``Spätere (${offset})`—
weekdays["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]The calendar's weekday headers, starting at Monday.
presets.todayTodayHeuteThe quick-select ranges, in the order of PRESET_LABELS.
presets.yesterdayYesterdayGesternThe quick-select ranges, in the order of PRESET_LABELS.
presets.last7DaysLast 7 daysLetzte 7 TageThe quick-select ranges, in the order of PRESET_LABELS.
presets.last30DaysLast 30 daysLetzte 30 TageThe quick-select ranges, in the order of PRESET_LABELS.
presets.thisMonthThis monthDieser MonatThe quick-select ranges, in the order of PRESET_LABELS.
presets.previousMonthPrevious monthVoriger MonatThe quick-select ranges, in the order of PRESET_LABELS.
presets.thisQuarterThis quarterDieses QuartalThe quick-select ranges, in the order of PRESET_LABELS.
presets.thisYearThis yearDieses JahrThe quick-select ranges, in the order of PRESET_LABELS.

Table

KeyEnglishGermanDescription
paginationPaginationSeitennavigation—
rowsRowsZeilen—
rowsPerPageRows per pageZeilen pro Seite—
pageOfPages(page, total, formatted)`Page ${formatted?.page ?? page} of ${formatted?.total ?? total}``Seite ${formatted?.page ?? page} von ${formatted?.total ?? total}`"Page 2 of 7". formatted carries both numbers in the provider's formats, where the caller has them - a table over a server has "Page 1 of 100,000".
previousPageBackZurück—
nextPageNextWeiter—
filterResetResetZurücksetzenThe two buttons in the column filter's footer.
filterDoneDoneFertig—

@umriss-ui/table

KeyEnglishGermanDescription
columnsColumnsSpaltenThe column menu's button.
arrangeColumnsShow, hide and arrange columnsSpalten ein- und ausblenden, anordnenAccessible name of the list in the column menu.
columnForward(column)`Move ${column} forward``${column} nach vorn`The two buttons that move a column in the column menu.
columnBackward(column)`Move ${column} backward``${column} nach hinten`—
pinColumnToStart(column)`Pin ${column} to start``${column} am Anfang fixieren`The column menu's pin keys: to a side, and back when it is pinned there.
pinColumnToEnd(column)`Pin ${column} to end``${column} am Ende fixieren`—
unpinColumn(column)`Unpin ${column}``Fixierung von ${column} lösen`—
columnForwardHintMove forwardNach vornThe tooltips over those four keys: short, without the column, which stands in the same line. The keys' names above keep it for a screen reader.
columnBackwardHintMove backwardNach hinten—
pinToStartHintPin to startAm Anfang fixieren—
pinToEndHintPin to endAm Ende fixieren—
unpinHintUnpinFixierung lösen—
exportLabelExportExportierenThe export button.
exportPageLabelExport pageSeite exportierenThe export button of a table in server mode, which holds and writes one page.
exportFileNametable.csvtabelle.csvThe export's file name, where the application names none.
tableSearchPlaceholderSearch …Suchen …Placeholder and accessible name of the search field.
tableSearchLabelSearch tableTabelle durchsuchen—
filterColumn(column)`Filter ${column}``${column} filtern`The filter button of a column: "Filter Region".
filterHintFilterFilternThe tooltip over that button.
selectRow(row)`Select ${row}``${row} auswählen`The selection of one row, named after its row header.
selectAllRowsSelect allAlle auswählenThe selection of every row in the filtered set.
selectAllOnPageSelect all on this pageAlle auf dieser Seite auswählenThe same checkbox in server mode, where the table holds one page of a server's.
expandRowNamed(row)`Expand ${row}``${row} aufklappen`The expand button, named after the row header.
collapseRowNamed(row)`Collapse ${row}``${row} zuklappen`—
rowActionsActionsAktionenHeader of the actions column - for the screen reader, not visible.
rowAction(aktion, row)`${aktion}: ${row}``${action}: ${row}`One action on a row: "Open: A-2041".
rowActionsMenu(row)`Actions: ${row}``Aktionen: ${row}`The menu holding a row's actions.
editCell(column, row)`Edit ${column}: ${row}``${column} bearbeiten: ${row}`The editor of a cell in a table's grid mode, named after its column and its row: "Edit Budget: Marketing".
newRowNew rowNeue ZeileThe button above a grid that opens an empty row to fill in, and the name of that row while it has none (ADR-0036).
saveRowSaveSpeichernA row draft's buttons, named with the row through rowAction.
discardRowDiscardVerwerfen—
deleteRowDeleteLöschenA row's delete button, and its question once pressed: Delete? Delete / Keep.
deleteRowAskDelete?Löschen?—
keepRowKeepBehalten—
saveOrDiscardFirstSave or discard this row firstErst diese Zeile speichern oder verwerfenSaid where someone tries to leave a row draft unsaved.
cellAbsentValueNo valueKein WertWhat the screen reader hears for an absent value. Visibly a muted dash stands there.
booleanYesYesJaA boolean without a presentation of its own.
booleanNoNoNein—
footerSumSumSummeThe kind of a footer number, read out before the number.
footerAverageAverageDurchschnitt—
footerMinimumMinimumMinimum—
footerMaximumMaximumMaximum—
footerRangeRangeSpanne—
footerCountCountAnzahl—
footerDistinctDistinct valuesVerschiedene Werte—
footerAggregateAggregateAggregatAn aggregate the application computes itself.
groupingGroupingGruppierungThe grouping section of the column menu, and the menu entry per column.
groupBy(label)`Group by ${label}``Nach ${label} gruppieren`—
groupedByGrouped byGruppiert nachThe grouping's tag in the table toolbar: "Grouped by" Region › Customer.
removeGroupingRemove groupingGruppierung aufheben—
removeGroupingLevel(label)`Stop grouping by ${label}``Nicht mehr nach ${label} gruppieren`—
foldAllFold allAlle zuklappen—
unfoldAllUnfold allAlle aufklappen—
groupNoValueNo valueKein WertThe group of rows without a value.
groupContinuedcontinuedFortsetzungBeside a group repeated at the top of a page that begins inside it.
foldGroup(name, count)`Fold ${name}, ${count}``${name} zuklappen, ${count}`The fold of a group, with its value and its count.
unfoldGroup(name, count)`Unfold ${name}, ${count}``${name} aufklappen, ${count}`—
foldBranch(row)`Fold rows under ${row}``Zeilen unter ${row} zuklappen`The fold of a branch in a table with tree rows, named after its row - not expandRowNamed, which names the row detail's expander on the same row.
unfoldBranch(row)`Unfold rows under ${row}``Zeilen unter ${row} aufklappen`—
levelColumnLevelEbeneThe first column of a tree's export.
pathRowon the path to a matchauf dem Weg zu einem TrefferA row shown only because a descendant matches the search or a filter.
footerTopLevelTop level onlyNur oberste EbeneThe footer of a tree: it sums the top level, since a parent holds its children.
selectGroup(name)`Select ${name}``${name} auswählen`The box that selects every row of a group.
calendarWeek(week, year)`Week ${week}, ${year}``KW ${week}/${year}`A group of the week key: "Week 42, 2026".
entries(count, formatted)(count === 1 ? "1 entry" : `${formatted} entries`)(count === 1 ? "1 Eintrag" : `${formatted} Einträge`)"128 entries" in the pagination bar; the plural belongs to the language.
selectedCount(count, formatted)`${formatted} selected``${formatted} ausgewählt`"3 selected" in the pagination bar and the table toolbar.
copiedRows(count, formatted)(count === 1 ? "1 row copied" : `${formatted} rows copied`)(count === 1 ? "1 Zeile kopiert" : `${formatted} Zeilen kopiert`)Said to a screen reader after Ctrl+C copied rows: "3 rows copied".
copiedCellCell copiedZelle kopiertSaid after Ctrl+C copied the active cell of a grid.
copyFailedCould not copyKopieren nicht möglichSaid when the clipboard refused or is not there.
noEntriesNo entriesKeine EinträgeEmpty because there are no rows.
nothingMatchesFiltersNothing matches the search and filtersNichts passt zu Suche und FilternEmpty because search and filters leave nothing - something else.
treeSearchPlaceholderSearch the tree …Im Baum suchen …—
treeNoMatchesNothing matches the search.Nichts passt zur Suche.—
conditionsActive filtersAktive FilterGroup name of the conditions in the table toolbar.
removeConditionNamed(label, value)`Remove ${label}: ${value}``${label}: ${value} entfernen`The button that removes a condition: "Remove Region: EU, US".
editConditionNamed(label, value)`Edit ${label}: ${value}``${label}: ${value} bearbeiten`The condition itself, which opens its filter: "Edit Region: EU, US".
moreValues(count, formatted)`+${formatted}``+${formatted}`The remainder of a long list in a condition: "+1".
filterFromFromVonThe two fields of the range filter.
filterToToBis—
rangeFromTo(from, to)`${from}–${to}``${from}–${to}`The condition of a range filter: "100–500", "from 100", "to 500".
rangeFrom(from)`from ${from}``ab ${from}`—
rangeTo(to)`to ${to}``bis ${to}`—
rangeInvalid“From” lies after “To”.„Von“ liegt hinter „Bis“.When "From" lies behind "To". The condition stays the last valid one.
resetAllResetZurücksetzenClears search and conditions - in the table toolbar and in the empty body.
filteredOfTotal(matches, total)`${matches} of ${total}``${matches} von ${total}`"43 of 1.204" - the numbers come from the formats.

Stat, verdict, freshness

KeyEnglishGermanDescription
verdictOkOKIn OrdnungThe four outcomes of an assessment, as a word beside the value. Colour alone carries no meaning - the word stands here for that reason.
verdictWarningWarning limit exceededWarngrenze überschritten—
verdictAlarmAlarm limit exceededAlarmgrenze überschritten—
verdictUnknownNo valueKein Wert—
statAbsentValue——What stands in the value field when there is no value. No dash, no zero: either could be a value.
targetTargetZiel—
deviationAbove(betrag)`${betrag} above target``${amount} über Ziel`"3,2 above target" or "1,5 below target" - the amount comes from the formats, which is where the comma is from.
deviationBelow(betrag)`${betrag} below target``${amount} unter Ziel`—
deviationOnTargeton targetauf Ziel—
freshnessFreshFreshAktuellThe three freshness states. They are a DIFFERENT axis from the verdict: a stale value keeps its verdict (ADR-0010).
freshnessStaleStaleVeraltet—
freshnessDisconnectedNo connectionKeine Verbindung—
asOfAgo(duration)`As of: ${duration}``Stand: ${duration}`"As of: 3 minutes ago", where the duration comes from the formats.

Overlays and states

KeyEnglishGermanDescription
closeCloseSchließen—
closeToastClose messageMeldung schließen—
toastDeckCount(count)`${count} messages, show all``${count} Meldungen, alle zeigen`The count on the front toast of a closed deck; pressing it shows them all.
toastRegionMessages (Alt+T)Meldungen (Alt+T)The name of the toasts' region, which Alt+T moves the focus into.
confirmConfirmBestätigen—
cancelCancelAbbrechen—
loadingLoadingWird geladen—
fillLevelFill levelFüllstandGeneric name of a fill-level bar, where the caller names none.
progressProgressFortschrittGeneric name of a progress bar, where the caller names none.
breadcrumbBreadcrumbPfadThe accessible name of a breadcrumb's navigation landmark.
breadcrumbFoldedShow the levels in betweenEbenen dazwischen zeigenThe key that opens a breadcrumb's folded middle levels as a menu.
splitterResize the panesGröße der Bereiche ändernThe separator between a splitter's panes, where the caller names none - a caller who can should name the first pane instead (APG).
stepDoneDoneErledigtA stepper's step that is behind it, said beside its label to a screen reader; the current step is aria-current and needs no word.
stepUpcomingUpcomingAusstehendA step still ahead.
stepFailedFailedFehlgeschlagenA step that failed - behind the current one or the current one itself.
chooseFileChoose a fileDatei auswählenThe key of a file input that takes one file - and its name where no field names it.
chooseFilesChoose filesDateien auswählenThe same key where it takes several.
dropFileor drop it hereoder hier ablegenThe words beside the key that say the zone takes a drop.
dropFilesor drop them hereoder hier ablegen—
removeFile(name)`Remove ${name}``${name} entfernen`The cross beside a chosen file.
fileNotAccepted(name)`${name} is not an accepted type``${name} ist kein zugelassener Dateityp`A dropped file the input's accept does not take.
showShowEinblenden—
hideHideAusblenden—
moreActionsMore actionsWeitere Aktionen—
removeRemoveEntfernenThe cross on a tag without text content.
removeTag(beschriftung)`Remove ${beschriftung}``${label} entfernen`The cross on a tag with text content.

@umriss-ui/schedule

KeyEnglishGermanDescription
scheduleOverlapOverlapÜberschneidungThe two findings, named on the ghost of a drag.
scheduleViolatedDependencyViolated dependencyAbhängigkeit verletzt—
scheduleGhostTimes(from, to)`${from}–${to}``${from}–${to}`The new times on the ghost: "08:15–10:00" - the times come from the formats.
scheduleLeadInLead-inVorlaufThe parts of a subtask and a dependency, named in the tooltip.
scheduleLeadOutLead-outNachlauf—
scheduleDependencyDependencyAbhängigkeit—
scheduleRoute(from, to)`${from} → ${to}``${from} → ${to}`"A-2041-1 → A-2041-2": the two subtasks a dependency joins.
scheduleOverlapWith(other)`Overlap with ${other}``Überschneidung mit ${other}`"Overlap with A-2043-2" - the other subtask on the lane.
scheduleViolatedBy(amount)`Violated dependency, ${amount} short``Abhängigkeit verletzt, ${amount} zu knapp`"Violated dependency, 15 min short" - the amount from minutesShort.
scheduleLaneRefusedNot this laneNicht hierherOn the ghost of a drag over a lane the subtask may not go to.
scheduleBlockedTimeBlocked timeSperrzeitOn the ghost of a drag held back from a lane's blocked time.
scheduleInBlockedTime(label)(label === undefined ? "In blocked time" : `In blocked time (${label})`)(label === undefined ? "In der Sperrzeit" : `In der Sperrzeit (${label})`)"In blocked time (Leave)" - a subtask covering its lane's blocked time, with the blocked time's label where it has one.
scheduleMilestone(name)`Milestone: ${name}``Meilenstein: ${name}`"Milestone: Release" - a milestone named by its label (or id), so that the tooltip and the spoken readout say what kind of thing it is.
scheduleFoldGroupFold groupGruppe einklappenThe chevron of a lane group's header, which folds it into one row and unfolds it again. The group's own label stands beside the button, so the name is what the ACTION is, not which group it acts on.
scheduleUnfoldGroupUnfold groupGruppe ausklappen—
scheduleLaneCount(count)(count === 1 ? "1 lane" : `${count} lanes`)(count === 1 ? "1 Bahn" : `${count} Bahnen`)How many lanes a group holds, beside its name in the header.
scheduleRoleDescriptionscheduleBelegungsplanWhat a screen reader calls the plot that takes the keys (aria-roledescription, schedule-a11y S1).
scheduleSummary(summary)`${lanes === 1 ? "1 lane" : `${lanes} lanes`}, ${subtasks === 1 ? "1 subtask" : `${subtasks} subtasks`} in view from ${from} to ${to}. ` + `${overlaps === 1 ? "1 overlap" : `${overlaps} overlaps`}, ${violated === 1 ? "1 violated dependency" : `${violated} violated dependencies`}` + (blocked === 0 ? "." : `, ${blocked === 1 ? "1 subtask" : `${blocked} subtasks`} in blocked time.`) + (milestones === 0 ? "" : ` ${milestones === 1 ? "1 milestone" : `${milestones} milestones`}.`)`${lanes === 1 ? "1 Bahn" : `${lanes} Bahnen`}, ${subtasks === 1 ? "1 Teilaufgabe" : `${subtasks} Teilaufgaben`} im Blick von ${from} bis ${to}. ` + `${overlaps === 1 ? "1 Überschneidung" : `${overlaps} Überschneidungen`}, ${violated === 1 ? "1 verletzte Abhängigkeit" : `${violated} verletzte Abhängigkeiten`}` + (blocked === 0 ? "." : `, ${blocked === 1 ? "1 Teilaufgabe in einer Sperrzeit" : `${blocked} Teilaufgaben in Sperrzeiten`}.`) + (milestones === 0 ? "" : ` ${milestones === 1 ? "1 Meilenstein" : `${milestones} Meilensteine`}.`)The plot's description (S6): the lanes, the subtasks in view, the visible span with both ends formatted, and the findings of the plan by kind.
scheduleKeyHelpLeft and right arrows move along the lane, up and down change the lane, Home and End go to its first and last, Page Up and Page Down jump a tenth of the view. Right bracket or T follows a dependency out, left bracket or Shift and T goes back. Space or Enter selects. Alt with left or right proposes a move, Alt and Shift a new end. Escape clears.Pfeil links und rechts gehen die Bahn entlang, Pfeil hoch und runter wechseln die Bahn, Pos1 und Ende springen zur ersten und letzten Teilaufgabe, Bild auf und Bild ab springen ein Zehntel der Ansicht. Schließende eckige Klammer oder T folgt einer Abhängigkeit hinaus, öffnende eckige Klammer oder Umschalt und T geht zurück. Leertaste oder Eingabe wählt aus. Alt mit Pfeil links oder rechts schlägt eine Verschiebung vor, Alt und Umschalt ein neues Ende. Escape lässt die aktive Teilaufgabe los.The keys that walk the plot, select and edit - read after the summary.

@umriss-ui/dashboard

KeyEnglishGermanDescription
dashboardEditEditBearbeitenThe editing bar's buttons and the label that says the mode is on.
dashboardEditingEditing the dashboardDashboard wird bearbeitet—
dashboardCancelCancelAbbrechen—
dashboardDoneDoneFertig—
dashboardUndoUndoRückgängig—
dashboardRedoRedoWiederholen—
dashboardResetResetZurücksetzen—
dashboardMenu(title)`Actions for ${title}``Aktionen für ${title}`The name of a widget's menu button: the widget's title is the thing.
dashboardPlace(place, of)`Place ${place} of ${of}``Platz ${place} von ${of}`At the top of the menu, and in the name of a head the arrow keys move.
dashboardHead(title, place, of)`${title}, place ${place} of ${of}``${title}, Platz ${place} von ${of}`—
dashboardMoveStartMove to startAn den Anfang—
dashboardMoveEarlierMove earlierWeiter nach vorn—
dashboardMoveLaterMove laterWeiter nach hinten—
dashboardMoveEndMove to endAns Ende—
dashboardRemoveRemoveEntfernen—
dashboardSizes.smallSmallKleinThe closed set of size names, worded once for every widget type.
dashboardSizes.mediumMediumMittelThe closed set of size names, worded once for every widget type.
dashboardSizes.wideWideBreitThe closed set of size names, worded once for every widget type.
dashboardSizes.tallTallHochThe closed set of size names, worded once for every widget type.
dashboardSizes.largeLargeGroßThe closed set of size names, worded once for every widget type.
dashboardSizes.fullFull widthVolle BreiteThe closed set of size names, worded once for every widget type.
dashboardSizeEntry(size, share, current)`${current ? "✓ " : ""}${size}${share ? `, ${share} wide` : ""}``${current ? "✓ " : ""}${size}${share ? `, ${share} breit` : ""}`A size's entry in a widget's menu: its name and its share of the width (share is "¼" or "5/12", empty for the whole width); current marks the size the widget stands at.
dashboardHeadingLabelHeadingÜberschriftThe built-in heading type: its name, its sentence in the catalogue, the text a new heading starts with and the label of its text field.
dashboardHeadingSentenceA title across the full width.Ein Titel über die volle Breite.—
dashboardHeadingTextNew sectionNeuer Abschnitt—
dashboardHeadingFieldTextText—
dashboardLeftEditing endedBearbeiten beendetSaid when "Done" leaves the mode and nothing was changed.
dashboardMoved(title, from, to, of)`${title}: moved from place ${from} to place ${to} of ${of}``${title}: von Platz ${from} auf Platz ${to} von ${of} verschoben`What is spoken after a change.
dashboardDragCancelled(title)`${title}: move cancelled``${title}: Verschieben abgebrochen`—
dashboardResized(title, size)`${title}: size ${size}``${title}: Größe ${size}`—
dashboardRemoved(title)`${title} removed. Undo brings it back.``${title} entfernt. „Rückgängig“ holt es zurück.`—
dashboardKeptChanges keptÄnderungen übernommen—
dashboardCancelledChanges discardedÄnderungen verworfen—
dashboardAddWidgetAdd widgetWidget hinzufügenThe catalogue and the options.
dashboardCatalogueAdd a widgetWidget hinzufügen—
dashboardCatalogueSentenceEach widget is added at the end.Jedes Widget wird am Ende eingefügt.—
dashboardAddAddHinzufügen—
dashboardAddType(label)`Add ${label}``${label} hinzufügen`—
dashboardFootprint(columns, rows)`${columns} of 12 columns, ${rows} rows``${columns} von 12 Spalten, ${rows} Zeilen`—
dashboardAdded(title, place, of)`${title} added, place ${place} of ${of}``${title} hinzugefügt, Platz ${place} von ${of}`—
dashboardOptionsOptionsOptionen—
dashboardOptionsChanged(title)`${title}: options changed``${title}: Optionen geändert`—
dashboardEmptyThis dashboard is empty.Dieses Dashboard ist leer.—
dashboardEmptyEditingThis dashboard is empty. Choose Add widget to begin.Dieses Dashboard ist leer. Wählen Sie „Widget hinzufügen“, um zu beginnen.—
dashboardFailedThis widget cannot show anything.Dieses Widget kann nichts anzeigen.—
dashboardUndoneUndoneRückgängig gemacht—
dashboardRedoneRedoneWiederholt—
dashboardResetDoneReset to the defaultAuf die Vorgabe zurückgesetzt—

@umriss-ui/calculation

KeyEnglishGermanDescription
calculationSumSymbol++The four operators as symbols in a formula line.
calculationDifferenceSymbol−−—
calculationProductSymbol××—
calculationQuotientSymbol÷÷—
calculationSumWordplusplusThe same four as words, in the accessible sentence of a line.
calculationDifferenceWordminusminus—
calculationProductWordtimesmal—
calculationQuotientWorddivided bygeteilt durch—
calculationEqualsequalsgleichBetween the parts of the sentence: "Availability equals ...".
calculationApproximatelyapproximatelyungefährBefore a result marked "≈" in the sentence.
calculationApproximateNoteThe rounded figures do not give this exactly; it is computed from the unrounded ones.Die gerundeten Zahlen ergeben das nicht genau; gerechnet ist mit den ungerundeten.Beside a result marked "≈": why the rounded operands do not give it.
calculationPercentpercentProzentHow a percentage is read out: "91.6 percent".
calculationMissing(label)`${label} is missing``${label} fehlt`Why a quantity has no number - the label is the given at the root of it, or the divisor that is zero.
calculationDivisionByZero(label)`Division by zero: ${label} is 0``Division durch null: ${label} ist 0`—
calculationAboveTarget(target)`above target ${target}``über Ziel ${target}`The target beside the result, with the target's number and unit.
calculationBelowTarget(target)`below target ${target}``unter Ziel ${target}`—
calculationOnTarget(target)`on target ${target}``auf Ziel ${target}`—
calculationWorstInside(verdict)`Inside: ${verdict}``Darin: ${verdict}`The quiet marker on a folded quantity whose derivation holds a worse verdict than its own; the verdict word comes from verdict*.
calculationSource(source)`Source: ${source}``Quelle: ${source}`Where a given number came from.
calculationShowDerivation(label)`Show how ${label} is derived``Herleitung von ${label} zeigen`The disclosure button of a derivation, named after the quantity.
calculationHideDerivation(label)`Hide how ${label} is derived``Herleitung von ${label} verbergen`—
calculationOperandCount(count)`${count} operands``${count} Operanden`On a folded line whose operator has more operands than are written out beneath it (ADR-0028): how many there are.
calculationNoOperandsno entrieskeine EinträgeOn the line of a sum with no operands, where its formula would stand (ADR-0049).

Charts wording

Every entry of ChartsWording from @umriss-ui/charts, which a chart takes through its wording prop: the English of DEFAULT_CHARTS_WORDING beside the German of GERMAN_CHARTS_WORDING, imported from @umriss-ui/charts/wording/de.

KeyEnglishGermanDescription
localeen-GBde-DEThe BCP 47 tag every number and every date or time label of the chart is formatted in (en-GB, de-DE). The one input for the locale: the browser's language is not read. The clock stays 24-hour in both.
roleDescriptionchartDiagrammWhat a screen reader calls the plot area that takes the keys (aria-roledescription).
emptyNo dataKeine DatenShown in the plot area when no visible series has a point to show.
seriesList(names)`${names.length === 1 ? "1 series" : `${names.length} series`}: ${names.join(", ")}.``${names.length === 1 ? "1 Serie" : `${names.length} Serien`}: ${names.join(", ")}.`The summary's visible series, by name.
visibleRange(from, to)`From ${from} to ${to}.``Von ${from} bis ${to}.`The summary's visible stretch of the x axis, both ends formatted.
seriesExtent(name, min, max)`${name} from ${min} to ${max}.``${name} von ${min} bis ${max}.`The summary's lowest and highest value of one series in that stretch.
limitList(limits)`Limits: ${limits.map((l) => `${l.name} ${l.value}`).join(", ")}.``Grenzen: ${limits.map((l) => `${l.name} ${l.value}`).join(", ")}.`The summary's labelled limits, each with its value in its axis' format (a band's two edges as one value).
readout(x, rows)[`${x}.`, ...rows.map((r) => `${r.name} ${r.value}${r.x === "" ? "" : ` at ${r.x}`}.`)].join(" ")[`${x}.`, ...rows.map((r) => `${r.name} ${r.value}${r.x === "" ? "" : ` bei ${r.x}`}.`)].join(" ")What is read after a key: the position, then each series with its value (and its own x where it stands on another x axis), the emphasised one first.
stackTotalTotalSummeThe last row of a stack in the tooltip and the readout: the sum of its members at the point.
percent(value)`${value}%``${value} %`A share in a normalised stack, its number already formatted.
walkHelpLeft and right arrows move through the values, up and down change the series, Home and End go to the first and the last, Escape clears.Pfeil links und rechts gehen durch die Werte, Pfeil hoch und runter wechseln die Serie, Pos1 und Ende springen zum ersten und letzten Wert, Escape hebt die Markierung auf.The keys that walk the chart.
selectHelpEnter chooses the point.Enter wählt den Punkt.The key that reports the Active point - only where onSelect is given.
zoomHelpPlus and minus zoom, Shift with left or right pans, 0 goes back to the axis' own span.Plus und Minus zoomen, Umschalt mit Pfeil links oder rechts verschiebt, 0 kehrt zum eigenen Bereich der Achse zurück.The keys that zoom and pan it - only where the chart can be zoomed.
legendHelpIn the legend, Enter hides or shows a series, Shift+Enter shows only it.In der Legende blendet Enter eine Serie aus oder ein, Umschalt+Enter zeigt nur sie.The keys of the legend's entries - only where it has one to press.
allShownNothing would be left to see, so every series is shown.Sonst wäre nichts mehr zu sehen, darum werden alle Serien gezeigt.Read out where hiding would leave nothing to see, and every series is shown instead.
showAllShow allAlles zeigenThe control over a zoomed plot that brings every zoomed axis back to its own domain (component-view 04).
showDataShow dataDaten zeigenThe data table's disclosure key, closed and open.
hideDataHide dataDaten verbergen—
positionColumnPositionPositionThe heading of the table's x column where its axis has no label, and of a matrix' row column where its y axis has none.
rowColumnRowZeile—
tableCaption(from, to)`Values from ${from} to ${to}.``Werte von ${from} bis ${to}.`The table's caption: the visible stretch it lists, both ends formatted.
upperWhiskerUpper whiskerOberer WhiskerA box's numbers, top to bottom as drawn: the tooltip's rows, the readout's parts and the data table's columns (box-plot B9).
upperQuartileUpper quartileOberes Quartil—
medianMedianMedian—
lowerQuartileLower quartileUnteres Quartil—
lowerWhiskerLower whiskerUnterer Whisker—
outliersOutliersAusreißerA box's outliers: the row's name, and the row's value - their count and the first few values, the rest counted (box-plot B9).
meanMeanMittelwertA box's optional readings: its mean, its notch's two bounds as one row, and how many values stand behind it.
notchNotchNotch—
countnn—
outlierList(values, more)`${values.length + more}: ${values.join(", ")}${more > 0 ? ` and ${more} more` : ""}``${values.length + more}: ${values.join(", ")}${more > 0 ? ` und ${more} weitere` : ""}`—
downsampled(readings)`Downsampled from ${readings.toLocaleString("en-GB")} readings: the first, lowest, highest and last value of each stretch.``Ausgedünnt aus ${readings.toLocaleString("de-DE")} Messwerten: erster, kleinster, größter und letzter Wert je Abschnitt.`Added to the caption where the table shows the downsampled course: how many readings its rows stand for.

Formats

Every entry of Formats: DEFAULT_FORMATS beside GERMAN_FORMATS. Each set as it writes Tuesday, 17 March 2026 at 09:05:03 in Berlin (the time without seconds), the number 1204.5 to one decimal, the count 1204, the share 0.74, three minutes ago, and Zebra, Émile and Apple in order.

KeyEnglishGermanDescription
date(d)17/03/202617.03.2026Date as displayed: 17/03/2026
dateShort(d)17/0317.03.Short form without the year, in the range footer: 17/03
month(d)March 2026März 2026The calendar's month header: March 2026
dateLong(d)Tuesday, 17 March 2026Dienstag, 17. März 2026Accessible name of a calendar cell: Tuesday, 17 March 2026
time(d, withSeconds)09:0509:05Time of day, optionally with seconds: 09:05 or 09:05:03
dateTime(d, withSeconds)17/03/2026, 09:0517.03.2026, 09:05Date and time together: 17/03/2026, 09:05
offset(d)GMT+1GMT+1Short form of the UTC offset: GMT+2
number(n, decimals)1,204.51.204,5A number in the set's notation. Without a digit count the value stands to the tenth decimal place; with one it is padded and rounded to exactly that many places.
count(n)1,2041.204A count. Kept apart from number because it makes a different promise: a count is whole, and Intl's own rounding (at most three decimal places) is right for it and wrong for a measurement.
percent(share)74%74 %A share from 0 to 1 as whole per cent: 74 %
compareText(a, b)Apple, Émile, ZebraApple, Émile, ZebraThe ordering of two texts by the set's collation.
relative(ms)3 minutes agovor 3 MinutenAn elapsed duration as a phrase: "3 minutes ago". The amount comes in milliseconds, counted back from now.

When to use something else

Keyboard

The keys of Button, NumberInput, Combobox and DatePicker apply here.

API

LanguageOptions

NameTypeDefaultDescription
formatsPartial<Formats>—How numbers, dates and durations are written. Overridden entry by entry; what is left out keeps writing as DEFAULT_FORMATS does - in English notation, whatever the wording says (ADR-0024).

Shown in: German, English and German side by side, Write numbers in your own notation and 2 more

wordingPartial<Omit<Wording, "presets">> & { presets?: Partial<Wording["presets"]> }—The presets are a register of their own and are likewise overridden entry by entry.

Shown in: German, English and German side by side, Replace single entries and 2 more

Types on this page

Formats

Everything the library knows about formatting.

NameTypeDefaultDescription
daterequired(d: Date) => string—Date as displayed: 17/03/2026

Shown in: A span of days (DateRangePicker)

dateShortrequired(d: Date) => string—Short form without the year, in the range footer: 17/03
monthrequired(d: Date) => string—The calendar's month header: March 2026
dateLongrequired(d: Date) => string—Accessible name of a calendar cell: Tuesday, 17 March 2026
timerequired(d: Date, withSeconds: boolean) => string—Time of day, optionally with seconds: 09:05 or 09:05:03
dateTimerequired(d: Date, withSeconds: boolean) => string—Date and time together: 17/03/2026, 09:05

Shown in: Use the language in your own components, Pick a day (DatePicker), Set an instant (DateTimePicker) and 1 more

offsetrequired(d: Date) => string—Short form of the UTC offset: GMT+2

Shown in: Set an instant (DateTimePicker)

numberrequired(n: number, decimals?: number) => string—A number in the set's notation. Without a digit count the value stands to the tenth decimal place; with one it is padded and rounded to exactly that many places.

Shown in: Write numbers in your own notation, Price an invoice line (NumberInput), Split a budget (Slider)

countrequired(n: number) => string—A count. Kept apart from number because it makes a different promise: a count is whole, and Intl's own rounding (at most three decimal places) is right for it and wrong for a measurement.

Shown in: Write numbers in your own notation, Use the language in your own components

percentrequired(share: number) => string—A share from 0 to 1 as whole per cent: 74 %
compareTextrequired(a: string, b: string) => number—The ordering of two texts by the set's collation.
relativerequired(ms: number) => string—An elapsed duration as a phrase: "3 minutes ago". The amount comes in milliseconds, counted back from now.

Wording

Everything the library puts out as text.

NameTypeDefaultDescription
clearInputrequiredstring—The cross in the text field.
clearSelectionrequiredstring—The cross in the select and in the combobox.
decreaseValuerequiredstring—Stepper buttons of the number field.
increaseValuerequiredstring—
comboboxPlaceholderrequiredstring—
noMatchesrequiredstring—Empty state of both lists.
multiSelectPlaceholderrequiredstring—
multiSelectSearchPlaceholderrequiredstring—
searchOptionsrequiredstring—
optionsrequiredstring—Group name of the option list.
optionScoperequiredstring—Group name of the scope switch.
optionScopeAllrequiredstring—
optionScopeSelectedrequired(count: number) => string—The second scope, with the count in the text.
selectAllrequiredstring—
selectNonerequiredstring—
invertSelectionrequiredstring—
nothingSelectedrequiredstring—
removeSelectedValuerequired(beschriftung: string) => string—The cross on a selected value in the trigger.
manageMoreSelectedrequired(count: number) => string—The "+N" counter in the trigger.
multiSelectSummaryrequired(gewaehlt: number, total: number) => string—The summary in the panel: "3 / 12". The sentence structure belongs to the language, even where it is only a slash here.
optionCountrequired(count: number) => string—How many options stand, when a list opens or its filter changes; never zero - an empty list says its own empty text. Named, like the three below, after the moment it is spoken in: an announcement labels no element.
optionActiverequired( label: string, state: { selected?: boolean; disabled?: boolean; group?: string }, ) => string—The option the keys moved onto, with what VoiceOver leaves out.
optionAddedrequired(label: string) => string—A value the multi-select took or gave away where no checkbox had the focus to say it - Enter in the search, a chip, Backspace.
optionRemovedrequired(label: string) => string—
palettePlaceholderrequiredstring—What stands in the empty field.
paletteFieldrequiredstring—Accessible name of the field. Deliberately kept apart from the placeholder - whoever labels the field differently does not thereby rename the window.
palettePanelrequiredstring—Accessible name of the window.
paletteListrequiredstring—Accessible name of the list of finds.
paletteNoFindsrequiredstring—The one line when the query finds nothing.
paletteFindCountrequired(count: number) => string—What the screen reader hears when the number of finds changes.
paletteMoreFindsrequired(count: number) => string—The last line when more finds exist than maxFinds lets stand.
paletteHintMoverequiredstring—The three key hints in the footer, each the text beside the key.
paletteHintChooserequiredstring—
paletteHintCloserequiredstring—
paletteKeyEscrequiredstring—The legend on the Escape key. The arrows and the return key are glyphs and therefore do not stand here; "Esc" is a word and is called something else elsewhere.
datePlaceholderrequiredstring—
datePanelrequiredstring—Accessible name of the panel. Deliberately kept apart from the placeholder: whoever labels the field differently does not thereby rename the dialog.
dateClearrequiredstring—
dateTimePlaceholderrequiredstring—
dateTimePanelrequiredstring—
dateTimeClearrequiredstring—
dateRangePlaceholderrequiredstring—
dateRangePanelrequiredstring—
dateRangeClearrequiredstring—
dateTimeRangePanelrequiredstring—Accessible name of the panel in the range with time of day.
dateTimeRangeClearrequiredstring—The clearing x of the range with time - kept apart from the range without, so that an application can call the two differently.
previousMonthrequiredstring—
nextMonthrequiredstring—
quickSelectrequiredstring—Group name of the preset column.
todayrequiredstring—

Shown in: Use the language in your own components

nowrequiredstring—
clearrequiredstring—
applyrequiredstring—
allDayrequiredstring—
timeOfDayrequiredstring—
hourrequiredstring—
minuterequiredstring—
secondrequiredstring—
sideFromrequiredstring—Header of the two time columns in the range with time of day.
sideTorequiredstring—
startHourrequiredstring—Accessible name of the time fields, per side.
startMinuterequiredstring—
startSecondrequiredstring—
endHourrequiredstring—
endMinuterequiredstring—
endSecondrequiredstring—
timeFieldIncreaserequired(feld: string) => string—Stepper buttons of a time field; the label comes from above.
timeFieldDecreaserequired(feld: string) => string—
chooseStartDaterequiredstring—Footer of the range panels.
chooseEndDaterequiredstring—
daysrequired(count: number) => string—"3 days" or "1 day" - the plural belongs to the language.
daysSelectedrequired(count: number) => string—"3 days selected"
rangePreviewrequired(from: string, to: string, count: number) => string—"17.03. – 19.03. · 3 days" while dragging; the dates come from the formats.
daysAllDayrequired(count: number) => string—"3 days (all day)"
durationrequired(teile: readonly string[]) => string—"Duration: 1 day 2 hrs 30 min"
hoursShortrequired(count: number) => string—
minutesShortrequired(count: number) => string—
timeMissingHintrequired(timeOfDay: string) => string—Daylight-saving change: the hour that does not exist.
timeMissingHintSiderequired(side: string, timeOfDay: string) => string—The same, with the side put in front ("From"/"To").
timeAmbiguousHintrequiredstring—Daylight-saving change: the hour that occurs twice.
timeAmbiguousHintSiderequired(side: string) => string—
timeEarlierrequired(versatz: string) => string—
timeLaterrequired(versatz: string) => string—
weekdaysrequiredreadonly string[]—The calendar's weekday headers, starting at Monday.
presetsrequired{ today: string; yesterday: string; last7Days: string; last30Days: string; thisMonth: string; previousMonth: string; thisQuarter: string; thisYear: string; }—The quick-select ranges, in the order of PRESET_LABELS.
paginationrequiredstring—
rowsrequiredstring—
rowsPerPagerequiredstring—
pageOfPagesrequired(page: number, total: number, formatted?: { page: string; total: string }) => string—"Page 2 of 7". formatted carries both numbers in the provider's formats, where the caller has them - a table over a server has "Page 1 of 100,000".
previousPagerequiredstring—
nextPagerequiredstring—
filterResetrequiredstring—The two buttons in the column filter's footer.
filterDonerequiredstring—
columnsrequiredstring—The column menu's button.
arrangeColumnsrequiredstring—Accessible name of the list in the column menu.
columnForwardrequired(column: string) => string—The two buttons that move a column in the column menu.
columnBackwardrequired(column: string) => string—
pinColumnToStartrequired(column: string) => string—The column menu's pin keys: to a side, and back when it is pinned there.
pinColumnToEndrequired(column: string) => string—
unpinColumnrequired(column: string) => string—
columnForwardHintrequiredstring—The tooltips over those four keys: short, without the column, which stands in the same line. The keys' names above keep it for a screen reader.
columnBackwardHintrequiredstring—
pinToStartHintrequiredstring—
pinToEndHintrequiredstring—
unpinHintrequiredstring—
exportLabelrequiredstring—The export button.
exportPageLabelrequiredstring—The export button of a table in server mode, which holds and writes one page.
exportFileNamerequiredstring—The export's file name, where the application names none.
tableSearchPlaceholderrequiredstring—Placeholder and accessible name of the search field.
tableSearchLabelrequiredstring—
filterColumnrequired(column: string) => string—The filter button of a column: "Filter Region".
filterHintrequiredstring—The tooltip over that button.
selectRowrequired(row: string) => string—The selection of one row, named after its row header.
selectAllRowsrequiredstring—The selection of every row in the filtered set.
selectAllOnPagerequiredstring—The same checkbox in server mode, where the table holds one page of a server's.
expandRowNamedrequired(row: string) => string—The expand button, named after the row header.
collapseRowNamedrequired(row: string) => string—
rowActionsrequiredstring—Header of the actions column - for the screen reader, not visible.
rowActionrequired(aktion: string, row: string) => string—One action on a row: "Open: A-2041".
rowActionsMenurequired(row: string) => string—The menu holding a row's actions.
editCellrequired(column: string, row: string) => string—The editor of a cell in a table's grid mode, named after its column and its row: "Edit Budget: Marketing".
newRowrequiredstring—The button above a grid that opens an empty row to fill in, and the name of that row while it has none (ADR-0036).
saveRowrequiredstring—A row draft's buttons, named with the row through rowAction.
discardRowrequiredstring—
deleteRowrequiredstring—A row's delete button, and its question once pressed: Delete? Delete / Keep.
deleteRowAskrequiredstring—
keepRowrequiredstring—
saveOrDiscardFirstrequiredstring—Said where someone tries to leave a row draft unsaved.
cellAbsentValuerequiredstring—What the screen reader hears for an absent value. Visibly a muted dash stands there.
booleanYesrequiredstring—A boolean without a presentation of its own.
booleanNorequiredstring—
footerSumrequiredstring—The kind of a footer number, read out before the number.
footerAveragerequiredstring—
footerMinimumrequiredstring—
footerMaximumrequiredstring—
footerRangerequiredstring—
footerCountrequiredstring—
footerDistinctrequiredstring—
footerAggregaterequiredstring—An aggregate the application computes itself.
groupingrequiredstring—The grouping section of the column menu, and the menu entry per column.
groupByrequired(label: string) => string—
groupedByrequiredstring—The grouping's tag in the table toolbar: "Grouped by" Region › Customer.
removeGroupingrequiredstring—
removeGroupingLevelrequired(label: string) => string—
foldAllrequiredstring—
unfoldAllrequiredstring—
groupNoValuerequiredstring—The group of rows without a value.
groupContinuedrequiredstring—Beside a group repeated at the top of a page that begins inside it.
foldGrouprequired(name: string, count: string) => string—The fold of a group, with its value and its count.
unfoldGrouprequired(name: string, count: string) => string—
foldBranchrequired(row: string) => string—The fold of a branch in a table with tree rows, named after its row - not expandRowNamed, which names the row detail's expander on the same row.
unfoldBranchrequired(row: string) => string—
levelColumnrequiredstring—The first column of a tree's export.
pathRowrequiredstring—A row shown only because a descendant matches the search or a filter.
footerTopLevelrequiredstring—The footer of a tree: it sums the top level, since a parent holds its children.
selectGrouprequired(name: string) => string—The box that selects every row of a group.
calendarWeekrequired(week: number, year: number) => string—A group of the week key: "Week 42, 2026".
entriesrequired(count: number, formatted: string) => string—"128 entries" in the pagination bar; the plural belongs to the language.
selectedCountrequired(count: number, formatted: string) => string—"3 selected" in the pagination bar and the table toolbar.
copiedRowsrequired(count: number, formatted: string) => string—Said to a screen reader after Ctrl+C copied rows: "3 rows copied".
copiedCellrequiredstring—Said after Ctrl+C copied the active cell of a grid.
copyFailedrequiredstring—Said when the clipboard refused or is not there.
noEntriesrequiredstring—Empty because there are no rows.
nothingMatchesFiltersrequiredstring—Empty because search and filters leave nothing - something else.
treeSearchPlaceholderrequiredstring—
treeNoMatchesrequiredstring—
conditionsrequiredstring—Group name of the conditions in the table toolbar.
removeConditionNamedrequired(label: string, value: string) => string—The button that removes a condition: "Remove Region: EU, US".
editConditionNamedrequired(label: string, value: string) => string—The condition itself, which opens its filter: "Edit Region: EU, US".
moreValuesrequired(count: number, formatted: string) => string—The remainder of a long list in a condition: "+1".
filterFromrequiredstring—The two fields of the range filter.
filterTorequiredstring—
rangeFromTorequired(from: string, to: string) => string—The condition of a range filter: "100–500", "from 100", "to 500".
rangeFromrequired(from: string) => string—
rangeTorequired(to: string) => string—
rangeInvalidrequiredstring—When "From" lies behind "To". The condition stays the last valid one.
resetAllrequiredstring—Clears search and conditions - in the table toolbar and in the empty body.
filteredOfTotalrequired(matches: string, total: string) => string—"43 of 1.204" - the numbers come from the formats.
verdictOkrequiredstring—The four outcomes of an assessment, as a word beside the value. Colour alone carries no meaning - the word stands here for that reason.

Shown in: Replace single entries

verdictWarningrequiredstring—

Shown in: Replace single entries

verdictAlarmrequiredstring—

Shown in: Replace single entries

verdictUnknownrequiredstring—
statAbsentValuerequiredstring—What stands in the value field when there is no value. No dash, no zero: either could be a value.
targetrequiredstring—
deviationAboverequired(betrag: string) => string—"3,2 above target" or "1,5 below target" - the amount comes from the formats, which is where the comma is from.
deviationBelowrequired(betrag: string) => string—
deviationOnTargetrequiredstring—
freshnessFreshrequiredstring—The three freshness states. They are a DIFFERENT axis from the verdict: a stale value keeps its verdict (ADR-0010).
freshnessStalerequiredstring—
freshnessDisconnectedrequiredstring—
asOfAgorequired(duration: string) => string—"As of: 3 minutes ago", where the duration comes from the formats.
closerequiredstring—
closeToastrequiredstring—
toastDeckCountrequired(count: number) => string—The count on the front toast of a closed deck; pressing it shows them all.
toastRegionrequiredstring—The name of the toasts' region, which Alt+T moves the focus into.
confirmrequiredstring—
cancelrequiredstring—
loadingrequiredstring—
fillLevelrequiredstring—Generic name of a fill-level bar, where the caller names none.
progressrequiredstring—Generic name of a progress bar, where the caller names none.
breadcrumbrequiredstring—The accessible name of a breadcrumb's navigation landmark.
breadcrumbFoldedrequiredstring—The key that opens a breadcrumb's folded middle levels as a menu.
splitterrequiredstring—The separator between a splitter's panes, where the caller names none - a caller who can should name the first pane instead (APG).
stepDonerequiredstring—A stepper's step that is behind it, said beside its label to a screen reader; the current step is aria-current and needs no word.
stepUpcomingrequiredstring—A step still ahead.
stepFailedrequiredstring—A step that failed - behind the current one or the current one itself.
chooseFilerequiredstring—The key of a file input that takes one file - and its name where no field names it.
chooseFilesrequiredstring—The same key where it takes several.
dropFilerequiredstring—The words beside the key that say the zone takes a drop.
dropFilesrequiredstring—
removeFilerequired(name: string) => string—The cross beside a chosen file.
fileNotAcceptedrequired(name: string) => string—A dropped file the input's accept does not take.
showrequiredstring—
hiderequiredstring—
moreActionsrequiredstring—
removerequiredstring—The cross on a tag without text content.
removeTagrequired(beschriftung: string) => string—The cross on a tag with text content.
scheduleOverlaprequiredstring—The two findings, named on the ghost of a drag.
scheduleViolatedDependencyrequiredstring—
scheduleGhostTimesrequired(from: string, to: string) => string—The new times on the ghost: "08:15–10:00" - the times come from the formats.
scheduleLeadInrequiredstring—The parts of a subtask and a dependency, named in the tooltip.
scheduleLeadOutrequiredstring—
scheduleDependencyrequiredstring—
scheduleRouterequired(from: string, to: string) => string—"A-2041-1 → A-2041-2": the two subtasks a dependency joins.
scheduleOverlapWithrequired(other: string) => string—"Overlap with A-2043-2" - the other subtask on the lane.
scheduleViolatedByrequired(amount: string) => string—"Violated dependency, 15 min short" - the amount from minutesShort.
scheduleLaneRefusedrequiredstring—On the ghost of a drag over a lane the subtask may not go to.
scheduleBlockedTimerequiredstring—On the ghost of a drag held back from a lane's blocked time.
scheduleInBlockedTimerequired(label: string | undefined) => string—"In blocked time (Leave)" - a subtask covering its lane's blocked time, with the blocked time's label where it has one.
scheduleMilestonerequired(name: string) => string—"Milestone: Release" - a milestone named by its label (or id), so that the tooltip and the spoken readout say what kind of thing it is.
scheduleFoldGrouprequiredstring—The chevron of a lane group's header, which folds it into one row and unfolds it again. The group's own label stands beside the button, so the name is what the ACTION is, not which group it acts on.
scheduleUnfoldGrouprequiredstring—
scheduleLaneCountrequired(count: number) => string—How many lanes a group holds, beside its name in the header.
scheduleRoleDescriptionrequiredstring—What a screen reader calls the plot that takes the keys (aria-roledescription, schedule-a11y S1).
scheduleSummaryrequired(summary: { lanes: number; subtasks: number; from: string; to: string; overlaps: number; violated: number; /** Subtasks in blocked time; said only where there are any. */ blocked: number; /** Milestones of the plan; said only where there are any. */ milestones: number; }) => string—The plot's description (S6): the lanes, the subtasks in view, the visible span with both ends formatted, and the findings of the plan by kind.
scheduleKeyHelprequiredstring—The keys that walk the plot, select and edit - read after the summary.
dashboardEditrequiredstring—The editing bar's buttons and the label that says the mode is on.
dashboardEditingrequiredstring—
dashboardCancelrequiredstring—
dashboardDonerequiredstring—
dashboardUndorequiredstring—
dashboardRedorequiredstring—
dashboardResetrequiredstring—
dashboardMenurequired(title: string) => string—The name of a widget's menu button: the widget's title is the thing.
dashboardPlacerequired(place: number, of: number) => string—At the top of the menu, and in the name of a head the arrow keys move.
dashboardHeadrequired(title: string, place: number, of: number) => string—
dashboardMoveStartrequiredstring—
dashboardMoveEarlierrequiredstring—
dashboardMoveLaterrequiredstring—
dashboardMoveEndrequiredstring—
dashboardRemoverequiredstring—
dashboardSizesrequired{ small: string; medium: string; wide: string; tall: string; large: string; full: string }—The closed set of size names, worded once for every widget type.
dashboardSizeEntryrequired(size: string, share: string, current: boolean) => string—A size's entry in a widget's menu: its name and its share of the width (share is "¼" or "5/12", empty for the whole width); current marks the size the widget stands at.
dashboardHeadingLabelrequiredstring—The built-in heading type: its name, its sentence in the catalogue, the text a new heading starts with and the label of its text field.
dashboardHeadingSentencerequiredstring—
dashboardHeadingTextrequiredstring—
dashboardHeadingFieldrequiredstring—
dashboardLeftrequiredstring—Said when "Done" leaves the mode and nothing was changed.
dashboardMovedrequired(title: string, from: number, to: number, of: number) => string—What is spoken after a change.
dashboardDragCancelledrequired(title: string) => string—
dashboardResizedrequired(title: string, size: string) => string—
dashboardRemovedrequired(title: string) => string—
dashboardKeptrequiredstring—
dashboardCancelledrequiredstring—
dashboardAddWidgetrequiredstring—The catalogue and the options.
dashboardCataloguerequiredstring—
dashboardCatalogueSentencerequiredstring—
dashboardAddrequiredstring—
dashboardAddTyperequired(label: string) => string—
dashboardFootprintrequired(columns: number, rows: number) => string—
dashboardAddedrequired(title: string, place: number, of: number) => string—
dashboardOptionsrequiredstring—
dashboardOptionsChangedrequired(title: string) => string—
dashboardEmptyrequiredstring—
dashboardEmptyEditingrequiredstring—
dashboardFailedrequiredstring—
dashboardUndonerequiredstring—
dashboardRedonerequiredstring—
dashboardResetDonerequiredstring—
calculationSumSymbolrequiredstring—The four operators as symbols in a formula line.
calculationDifferenceSymbolrequiredstring—
calculationProductSymbolrequiredstring—
calculationQuotientSymbolrequiredstring—
calculationSumWordrequiredstring—The same four as words, in the accessible sentence of a line.
calculationDifferenceWordrequiredstring—
calculationProductWordrequiredstring—
calculationQuotientWordrequiredstring—
calculationEqualsrequiredstring—Between the parts of the sentence: "Availability equals ...".
calculationApproximatelyrequiredstring—Before a result marked "≈" in the sentence.
calculationApproximateNoterequiredstring—Beside a result marked "≈": why the rounded operands do not give it.
calculationPercentrequiredstring—How a percentage is read out: "91.6 percent".
calculationMissingrequired(label: string) => string—Why a quantity has no number - the label is the given at the root of it, or the divisor that is zero.
calculationDivisionByZerorequired(label: string) => string—
calculationAboveTargetrequired(target: string) => string—The target beside the result, with the target's number and unit.
calculationBelowTargetrequired(target: string) => string—
calculationOnTargetrequired(target: string) => string—
calculationWorstInsiderequired(verdict: string) => string—The quiet marker on a folded quantity whose derivation holds a worse verdict than its own; the verdict word comes from verdict*.
calculationSourcerequired(source: string) => string—Where a given number came from.
calculationShowDerivationrequired(label: string) => string—The disclosure button of a derivation, named after the quantity.
calculationHideDerivationrequired(label: string) => string—
calculationOperandCountrequired(count: number) => string—On a folded line whose operator has more operands than are written out beneath it (ADR-0028): how many there are.
calculationNoOperandsrequiredstring—On the line of a sum with no operands, where its formula would stand (ADR-0049).

Known limits

What umriss deliberately does not build, and why: ADR-0032.

Every page of @umriss-ui/core

Getting started

Customising

Layout

Typography

Actions

Forms

Choosing

Dates and times

Feedback

Overlays

Navigation

Data display

API index