zudo-text

検索したい単語を入力

いつでも検索バーを開ける

l-domain-vocabulary

Look up the canonical zudo-text domain vocabulary before writing any user-visible wording — command palette labels, settings headings and field labels, button/menu text, aria-labels, tooltips, disable...

Domain Vocabulary

The words this app shows the user. Code identifiers are deliberately NOT governed by this skill — see Identifiers are not in scope.

Sources of truth for the shipped strings:

  • Command palette — tauri-app/renderer/data/app-commands.tsx

  • Shortcut group labels — tauri-app/renderer/components/settings/sections/shortcut-groups.ts

  • Settings labels — packages/settings-sections/src/sections/general-settings.tsx, settings-search-metadata.ts

  • Frame titles / provider display names — tauri-app/renderer/view-providers/*.tsx

  • User docs — doc/src/content/docs/{manual,guide,overview}/**, manual/src/content/docs/** (the Japanese end-user manual)

The core rule

A control is never named after the frame it lives in.

If a command moves, toggles, or configures a part of a frame, its label must name that part, qualified by the frame — not the frame alone. Move Note Tray: Top is wrong because it reads as "move the whole Note Tray frame"; the command actually moves the toolbar inside that frame. The correct shape is Move Note Tray Toolbar: Top.

The same rule applies to aria-label, tooltips, disabledReason text, and settings headings. When in doubt, read the label out loud with no UI in front of you and ask: what exactly would I expect to move?

Canonical terms — Note Tray area

TermNamesMust NOT be used for
Note TrayThe frame type / view provider core.inbox. Backs both the Inbox pin (directory: "inbox") and the Archives pin (directory: "archives"). Its frame title is literally Note Tray (or Note Tray — <dir>).The toolbar inside it. Any single note. The editor or preview pane.
Note Tray toolbarThe bar of note pills + document actions rendered inside the Note Tray frame header (the DraftBar component). Has four positions and, on a vertical rail, a collapsed/expanded presentation.The frame. The app-level top toolbar. The action cluster alone.
noteOne entry in a Note Tray — a numbered N.md or a named non-numeric .md file.A "draft". A "message". A "document".
pillThe collapsed presentation of a note in the toolbar — a numbered rounded-rect (top/bottom) or circle (left/right).The expanded presentation.
title rowThe expanded presentation — a full-width row showing the note number plus its derived title. Left/right rail only.The collapsed pill.
railThe toolbar in its left or right position (vertical).The horizontal form.
stripThe toolbar in its top or bottom position (horizontal).The vertical form.
action clusterThe document-actions group (schema badge, publish, view-mode toggle, archive, configured "Move to…" buttons) at the trailing edge of a strip / foot of a rail.The whole toolbar.
Pile ViewThe search/browse surface opened from any Note Tray.The Note Tray itself.

Short forms. Once "Note Tray toolbar" has been established in the same paragraph or dialog section, plain "the toolbar" is fine. Never shorten to "the tray" (that means the frame) or "the bar" in a new context (ambiguous with the app toolbar and the EFE tab bar).

Retired spellings — never reintroduce

RetiredUse insteadWhy
Draft Bar / draft barNote Tray toolbarDoubly stale: the component is not "the draft bar" in any shipped UI, and draft itself was retired in favour of note by epic #3426.
DraftBar (in user docs)Note Tray toolbarA code identifier leaking into user-facing prose. Fine in doc/src/content/docs/{architecture,packages,development}/**, which document the code.
draft as the noun for a Note Tray entrynoteEpic #3426. Scoped narrowly: only the tray-entry sense is retired. draft remains valid elsewhere — a frameset draft mode, draft CSS in the Theme Creator, a draft status in a frontmatter schema, "drafting a message" as a verb. Surviving draft* identifiers are frozen (see below) and do not license the word in new strings.
draft buffernote — or slot for the numbered position#4103. A Note Tray entry is always a persisted, autosaved note (a real file such as inbox/N.md locally; an encrypted workspace entry in cloud-workspace mode), never a memory-only buffer, so there is no unsaved-buffer concept to name. A modifier grants no exemption from the retired draft noun above. Where editor-side in-memory state genuinely needs naming (the kanban docked-card editor), say "unsaved changes" — a state, not an entity noun.
Move Note Tray: <Pos>Move Note Tray Toolbar: <Pos>Names the frame for a control that moves the toolbar. This is the exact bug #4095 reported.
"utilbar" / "util bar"toolbarUser shorthand from #4095, not English and not in the codebase. The user was asking for a qualifier, not for that token.
vault / VaultworkspaceEpic #4991: the account-level data container was renamed app-wide, user-facing and internal, from "vault" to "workspace" — never reintroduce "vault" in new user-facing strings, command-palette labels, or docs prose. Applies everywhere in the app, not just the Note Tray area. As with draft* below, surviving vault* code identifiers not yet swept by a later wave of the rename are frozen residuals, not license to use the word in new strings.
Directory View as a frame/providerExternal File Editor's embedded directory tree or, after the frame is established, directory tree / file treeDirectory View was retired as a standalone provider. The setting/shortcut identifiers are frozen compatibility names, not user vocabulary.

Casing

Note Tray is always Title Case in every surface — it is the provider's display name. Only the qualifier varies:

  • The Note Tray toolbar's own command-palette labels are Title Case, because their neighbours already are: Move Note Tray Toolbar: Bottom, Cycle Note Tray Toolbar Position, Tidy Up Notes, Timeline View, Switch to Nth Note.

  • Everywhere else — settings headings, field labels, aria-label, tooltips, disabledReason, docs prose — the qualifier is lowercase: Note Tray toolbar, Note Tray toolbar position, Note Tray layout.

This is not a claim that the whole palette is Title Case. app-commands.tsx also holds plenty of sentence-case labels (Check diff, Slide settings, Toggle scroll sync, Toggle minimap). Match the casing of the entries a new command sits among; do not retitle unrelated commands to "fix" them.

Identifiers are not in scope

This skill governs strings the user reads. It does not govern:

  • Component / prop / hook / constant names — DraftBar, draftBarPosition, draftBarOrder, draftBarExpanded, DRAFT_BAR_POSITIONS, setDraftBarPosition

  • Settings keys — AppSettings.layout.draftBarPosition, draftBarOrder, draftBarExpanded

  • Command ids — set-draft-bar-position-top, cycle-draft-bar-position, toggle-draft-bar-expanded

  • Shortcut keys — cycleDraftBarPosition, toggleDraftBarExpanded

  • Event names — draft-bar:set-position, draft-bar:cycle-position, draft-bar:toggle-expanded

  • data-testid values, e2e spec filenames and describe() titles, file paths (draft-bar.tsx)

  • Settings-search keyword aliases (keywords: ["draft bar"]) — those exist precisely so a user who remembers the old name still finds the control

Command ids key persisted user settings (shortcut bindings, palette ordering). Renaming them is a breaking change to user data for zero user benefit, and the repo's pre-release "no migration code" rule makes such a rename possible but not valuable. A string/identifier mismatch is normal and expected here.

Corollary: a legacy identifier is never evidence that the legacy word is still acceptable in a label.

Before you write a user-facing string — checklist

  1. Does the string name a part of a frame? Then qualify it with the frame's name; do not use the frame's name alone.

  2. Is the noun in the retired list? Replace it.

  3. Does the same control already have a name somewhere else (settings heading, aria-label, settings-search label, docs)? Reuse the same words. One control, one name across the palette, Settings, a11y, and the manual. Casing follows the destination surface, per CasingMove Note Tray Toolbar: Top in the palette and Note Tray toolbar position in Settings are the same name correctly cased, not a mismatch to reconcile.

  4. If you changed a label, did you change it in both commandMetadata and buildAppCommands()? The repo's Feature Implementation Checklist requires both; a mismatch silently desyncs the settings UI from the runtime palette.

  5. Did you update the user manual to the same words? doc/src/content/docs/manual/command-palette.mdx lists palette entries verbatim.

  6. Does any unit test or e2e spec assert the old string? grep the exact literal before you finish.

Worked example — #4095 → #4099 → #4100

One surface answered to three names at once:

SurfaceSaid
Command paletteMove Note Tray: Top — the frame's name
Settings → GeneralNote Tray toolbar
User manualDraft Bar

The user's report (#4095 topic 4) was not "the words Note Tray are wrong" — it was that the palette used the frame's name for a control that moves something inside the frame:

"the UI says 'Note Tray' here, but 'Note Tray' is a word that points the frame type. so maybe about this case, Move Note Tray utilbar to... might be proper."

So the fix was to add the qualifier, not to replace the noun: Move Note Tray Toolbar: Top. "Note Tray toolbar" won over "Note Tray utilbar" and "Draft Bar" on precedent — it was already the settings key (AppSettings.layout.noteTrayToolbar), the Settings → General heading, every settings-search id (note-tray-toolbar-*), the provider description, the e2e spec name (note-tray-toolbar-controls.spec.ts), and the epic title itself.

Decision record: #4099. Mechanical application: #4100.

Vocabulary outside the Note Tray area

Documented here for reference; renaming these is out of scope for the Note Tray toolbar epic. File a follow-up issue (label agent-found) rather than renaming opportunistically.

TermNames
framesetThe persisted window layout — a tree of splits ending in leaves. One singleton per window.
frame / leafOne pane in the frameset. A leaf hosts exactly one view provider instance.
pinA sidebar entry that acts as a template for a frameset. Inbox and Archives are the two built-in pins; both activate the core.inbox (Note Tray) provider at different directories.
SpaceThe user-facing name for the splittable working area.
External File Editor (core.external-file-editor, including its embedded file tree), Mind MapSibling frame types. Same rule applies: their internal controls must not be labelled with the frame's name alone (the EFE tab strip is the closest analogue to the Note Tray toolbar).
Doc CloudThe core.doc-cloud frame/provider and Settings section. Not the embedded outline, a page tab, or Content preview.
Doc Cloud outlineThe service-style category/page tree pane embedded in Doc Cloud. Use Collapse Doc Cloud outline / Expand Doc Cloud outline for its seam button. Never call it a frame, file chooser, or Directory View.
Doc Cloud page tabOne remote page opened inside the same Doc Cloud frame. A tab is not a frameset leaf.
Content previewThe labelled Doc Cloud rendering surface. The qualifier is load-bearing: it promises content/Markdown parity, not the published site's theme or chrome.
ProjectsThe Doc Cloud project-list surface and fallback when a default slug is unavailable. Capitalize when naming the UI destination.
calling tokenThe pasted Doc Cloud bearer credential. Connect with token is the working primary action; “browser handoff” is future copy, not a current sign-in control. Never say API key or expose grant/expiry claims the service cannot introspect.
ROOT / LEAF / text app / writing appGenerator vocabulary. Defined in the root CLAUDE.md § Vocabulary — that section, not this skill, is the source of truth for those four.