@mieweb/ui 0.11.0-dev.17 → 0.11.0-dev.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/README.md +182 -9
- package/agent/agents/mieweb-ui-design.agent.md +77 -0
- package/agent/agents/mieweb-ui-install.agent.md +78 -0
- package/agent/agents/mieweb-ui-styling.agent.md +83 -0
- package/agent/init-agent.mjs +139 -6
- package/agent/mieweb-ui.instructions.md +18 -0
- package/agent/skills/mieweb-ui-brands/SKILL.md +51 -0
- package/agent/skills/mieweb-ui-catalog/SKILL.md +336 -0
- package/agent/skills/mieweb-ui-catalog/selection-guidance.md +709 -0
- package/agent/skills/mieweb-ui-icons/SKILL.md +53 -0
- package/agent/skills/mieweb-ui-tailwind4/SKILL.md +126 -0
- package/agent/skills/mieweb-ui-tokens/SKILL.md +236 -0
- package/dist/styles.css +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-agent-skills.mjs — do not edit by hand. Regenerate with `pnpm agent:skills`. -->
|
|
2
|
+
|
|
3
|
+
# @mieweb/ui selection guidance by family
|
|
4
|
+
|
|
5
|
+
Extracted from the catalog family pages (`src/catalog/*.mdx`): the family policy and the "Which one?" comparison. Each family's Storybook Overview page has the full version (how the pieces fit together, shared limitations).
|
|
6
|
+
|
|
7
|
+
<!-- source: src/catalog/Actions.mdx (Inputs) -->
|
|
8
|
+
# Actions
|
|
9
|
+
|
|
10
|
+
> **Two or more buttons, or one button with a long, translated or user-supplied label, always go
|
|
11
|
+
> in a `ButtonGroup`.** Its default `orientation="auto"` stacks before any label truncates.
|
|
12
|
+
|
|
13
|
+
## Which one?
|
|
14
|
+
|
|
15
|
+
| Component | Use it when | Not when |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| [Button](https://ui.mieweb.org/?path=/docs/actions-button--docs) | The user triggers an action: submit, open, save, delete | The control keeps an on/off state |
|
|
18
|
+
| [ButtonGroup](https://ui.mieweb.org/?path=/docs/actions-buttongroup--docs) | Laying out any set of Buttons (dialog footers, form actions, card CTAs) | Children are not Buttons |
|
|
19
|
+
| [Toggle](https://ui.mieweb.org/?path=/docs/actions-toggle--docs) | A pressed/unpressed option that applies immediately (toolbar, view filter) | The setting is saved with a form — use `Switch` |
|
|
20
|
+
| [CopyButton](https://ui.mieweb.org/?path=/docs/actions-copybutton--docs) | Copying a value (ID, email, key) to the clipboard, even inside clickable rows | Anything other than plain-text copy |
|
|
21
|
+
| [QuickAction](https://ui.mieweb.org/?path=/docs/actions-quickaction--docs) | A large, explained shortcut tile on a dashboard | Inline in content or forms |
|
|
22
|
+
| [RowActionToolbar](https://ui.mieweb.org/?path=/docs/actions-rowactiontoolbar--docs) | Per-row icon actions revealed on hover/focus in lists and NITRO grids | Labelled actions in a footer — use `ButtonGroup` |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
<!-- source: src/catalog/Chat.mdx (Modules) -->
|
|
27
|
+
# Chat
|
|
28
|
+
|
|
29
|
+
> **Who is talking, and what do the messages contain?** One user and one assistant, messages
|
|
30
|
+
> may carry tool calls / thinking / code blocks → `AIChat` (or the Ozwell-branded shell around it,
|
|
31
|
+
> `OzwellChat`). Several humans and/or several agents in one thread, Markdown with plugins, a
|
|
32
|
+
> conversation list → [SuperChat](https://ui.mieweb.org/?path=/docs/modules-superchat-overview--docs). Humans messaging
|
|
33
|
+
> humans with delivery status, read receipts and attachments → the `Messaging` primitives. Talking
|
|
34
|
+
> instead of typing → [Voice](https://ui.mieweb.org/?path=/docs/modules-voice-overview--docs). Reviewing AI-proposed
|
|
35
|
+
> field changes rather than chatting → `AIReconciliationPanel`.
|
|
36
|
+
|
|
37
|
+
## Which one?
|
|
38
|
+
|
|
39
|
+
| Component | Use it when | Not when |
|
|
40
|
+
| --- | --- | --- |
|
|
41
|
+
| [AIChat](https://ui.mieweb.org/?path=/docs/chat-aichat--docs) | One user ↔ one assistant; you own transport and push `AIMessage[]` with `status`, `isGenerating`; suggestions chips; `FloatingAIChat` / `AIChatModal` for a corner popup | Multiple participants or a conversation list — `SuperChatInbox`; human-to-human messaging — `Messaging`; Markdown out of the box — pass `renderTextContent` |
|
|
42
|
+
| [AIChat (Voice)](https://ui.mieweb.org/?path=/docs/chat-aichat-voice--docs) | Reference wiring of `AIChat talkToText` → `transcribeBlob` (on-device Whisper) → send, with a streamed reply when a backend is configured | Hands-free wake words, speaker gating or diarization — `HandsFreeChat`; server ASR — `transcribeServer` |
|
|
43
|
+
| [AIMessage](https://ui.mieweb.org/?path=/docs/chat-aimessage--docs) | Rendering one `AIMessage` (text / tool_use / thinking / code / image / file / audio / video blocks) inside your own thread layout; `ChatBubble` shell; `renderTextContent` seam | You need the whole chat — `AIChat`; human messages with receipts — Messaging's `MessageBubble` |
|
|
44
|
+
| [ChatComposer](https://ui.mieweb.org/?path=/docs/chat-chatcomposer--docs) | The standardized chat input for new work: textarea on top, quiet icon toolbar (`+` menu, mic, send⇄stop), optional agent + model selector rows, @mention autocomplete, reply-to preview, attachments via picker/paste/drag-drop/`addFiles` | A single-line command input — `Input` / `CommandPalette` |
|
|
45
|
+
| [MCPToolCall](https://ui.mieweb.org/?path=/docs/chat-mcptoolcall--docs) | Showing a tool invocation as a status pill that expands into result, links, error and parameters; `compact` for dense logs | Approving/cancelling calls (display-only); large `result.data` (only `summary`/links render) |
|
|
46
|
+
| [OzwellChat](https://ui.mieweb.org/?path=/docs/chat-ozwellchat--docs) | You are the Ozwell application: thinking-mode menu, message jump list, warning strip, model picker, queued follow-up editing, "Powered by Ozwell" footer | A generic assistant in your own product — `AIChat`; multi-participant — `SuperChat` |
|
|
47
|
+
| [ComposerModelSelector](https://ui.mieweb.org/?path=/docs/chat-composermodelselector--docs) | Picking an LLM per message from a short provider-grouped list inside a composer; menu opens upward within `boundaryRef`; optional effort drill-down | A normal form field — `Select` / `Dropdown`; options are not provider/model pairs; hundreds of options — `Autocomplete` |
|
|
48
|
+
| [ReconciliationPanel](https://ui.mieweb.org/?path=/docs/chat-reconciliationpanel--docs) | A person must confirm AI-extracted values (OCR, parsed intake, agent output) before they overwrite data on file; confidence-aware defaults; `onApply(accepted)` | No existing record to compare (use a form); a single yes/no — `AlertDialog`; long-text diffs |
|
|
49
|
+
| [Messaging](https://ui.mieweb.org/?path=/docs/chat-messaging--docs) | Human-to-human messaging primitives — `MessageBubble`, `MessageList` (live `role="log"`), `MessageThread` (mounts `ChatComposer`), `MessagingSplitView`; the legacy `MessageComposer` was retired in 0.10.0 (superseded by `ChatComposer`, see `MIGRATION.md#chat-composer`) | The other party is an AI with tool calls — `AIChat`; a finished multi-participant inbox — `SuperChatInbox`; real-time transport (bring your own) |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
<!-- source: src/catalog/ChoiceInputs.mdx (Inputs) -->
|
|
54
|
+
# Choice inputs
|
|
55
|
+
|
|
56
|
+
> **Is the user picking a value, or running an action?** A value the form will save → `Select`
|
|
57
|
+
> (or `Radio` when all options fit on screen, `Checkbox` when several may be on). An action or
|
|
58
|
+
> menu → `Dropdown`. A value found by typing into a large or remote list → `Autocomplete`. A
|
|
59
|
+
> setting that applies the instant it flips → `Switch`; a pressed toolbar button →
|
|
60
|
+
> [Toggle](https://ui.mieweb.org/?path=/docs/actions-toggle--docs). A one-of-N view switch in a toolbar → `PillSelect`.
|
|
61
|
+
|
|
62
|
+
## Which one?
|
|
63
|
+
|
|
64
|
+
| Component | Use it when | Not when |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| [Checkbox](https://ui.mieweb.org/?path=/docs/choice-inputs-checkbox--docs) | Zero or more independent options, saved with the form; a "select all" with `indeterminate` | It takes effect immediately — `Switch`; exactly one option — `Radio` |
|
|
67
|
+
| [Radio](https://ui.mieweb.org/?path=/docs/choice-inputs-radio--docs) | Exactly one of 2–7 options, all visible, inside a `RadioGroup` | More options or search — `Select`; toolbar space — `PillSelect` |
|
|
68
|
+
| [Switch](https://ui.mieweb.org/?path=/docs/choice-inputs-switch--docs) | An on/off setting that applies at once (`role="switch"`) | The value is submitted with a form — `Checkbox`; a toolbar pressed state — [Toggle](https://ui.mieweb.org/?path=/docs/actions-toggle--docs) |
|
|
69
|
+
| [Select](https://ui.mieweb.org/?path=/docs/choice-inputs-select--docs) | Picking a value (or several with `multiple`) from a known list of ~8+ options in a form; groups; local search | The items are actions — `Dropdown`; the list is huge or remote — `Autocomplete` |
|
|
70
|
+
| [Dropdown](https://ui.mieweb.org/?path=/docs/choice-inputs-dropdown--docs) | A menu of actions or links (`role="menu"`), row "⋯" menus, tick-box filters (`multiSelect`) | Choosing a form value — `Select`; app-wide command search — [CommandPalette](https://ui.mieweb.org/?path=/docs/navigation-commandpalette--docs) |
|
|
71
|
+
| [Autocomplete](https://ui.mieweb.org/?path=/docs/choice-inputs-autocomplete--docs) | Typing to find an item in a large, remote or creatable list (patients, drugs, articles) | A short known list — `Select`; the value must stay in the field with validation — `Select` / `Input` |
|
|
72
|
+
| [PillSelect](https://ui.mieweb.org/?path=/docs/choice-inputs-pillselect--docs) | A compact "Label: Value" pill for a one-of-N view/sort/period choice in a toolbar | A validated form field — `Select`; options should all be visible — `Radio` |
|
|
73
|
+
| [Slider](https://ui.mieweb.org/?path=/docs/choice-inputs-slider--docs) | An approximate number in a bounded range with live feedback (volume, opacity, pain score) | Exact digits matter — `Input type="number"`; two thumbs (not supported) |
|
|
74
|
+
| [CountryDropdown](https://ui.mieweb.org/?path=/docs/choice-inputs-countrydropdown--docs) | A country for an address or nationality — the list, flags and localized names are built in | It accompanies a phone number — `CountryCodeDropdown`; a curated subset — `Select` |
|
|
75
|
+
| [CountryCodeDropdown](https://ui.mieweb.org/?path=/docs/choice-inputs-countrycodedropdown--docs) | A dial-code picker beside an `Input` for international phone numbers (`validatePhoneNumber`, `formatE164`) | US/Canada only — [PhoneInput](https://ui.mieweb.org/?path=/docs/text-inputs-phoneinput--docs); the country itself — `CountryDropdown` |
|
|
76
|
+
|
|
77
|
+
Free text, phones and URLs live in [Text inputs](https://ui.mieweb.org/?path=/docs/inputs-text-inputs-overview--docs);
|
|
78
|
+
dates go to [DateInput](https://ui.mieweb.org/?path=/docs/date-time-dateinput--docs).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
<!-- source: src/catalog/ClinicalLists.mdx (Healthcare) -->
|
|
83
|
+
# Clinical lists
|
|
84
|
+
|
|
85
|
+
> **Whose list is it, and what scope?** The **chart** owns problems, medications and allergies
|
|
86
|
+
> as durable records; an **encounter** only references them. Chart-scope problems →
|
|
87
|
+
> `ProblemList`; this visit's relevance → `PresentingProblems`; the write side of a problem →
|
|
88
|
+
> `ConditionEditor`. Medications to reconcile → `MedicationList` (start with
|
|
89
|
+
> `MedicationReconciliation`); allergies with an explicit NKA → `AllergyList` (start with
|
|
90
|
+
> `AllergyManager`). Every coded pick goes through `CodeLookup`, dependency-injected. The two
|
|
91
|
+
> `…Field (eSheet)` entries are the same lists as eSheet form questions.
|
|
92
|
+
|
|
93
|
+
## Which one?
|
|
94
|
+
|
|
95
|
+
| Component | Use it when | Not when |
|
|
96
|
+
| --- | --- | --- |
|
|
97
|
+
| [ProblemList](https://ui.mieweb.org/?path=/docs/clinical-lists-problemlist--docs) | The **chart-scope** problem list: `ConditionConcern[]` with clinical status groups, assertion history, coding chips, relationships, observations; `onAction` / `onAddProblem` / `onReorder` | You need this visit's relevance — `PresentingProblems`; today's A&P — `Assessment`; to edit codes — `ConditionEditor` |
|
|
98
|
+
| [PresentingProblems](https://ui.mieweb.org/?path=/docs/clinical-lists-presentingproblems--docs) | The **encounter-scope** view: pick chart concerns relevant this visit and tag **Addressed / Relevant Hx / Noted** on the encounter reference; `scope` gates the _no known problems_ negative assertion | You are maintaining the chart list — `ProblemList`; you need orders under problems — `Assessment` |
|
|
99
|
+
| [ConditionEditor](https://ui.mieweb.org/?path=/docs/clinical-lists-conditioneditor--docs) | A row action needs a **form**: `add` / `refine` / `revise` / `relate` / `observe`, capture-first with three-state uncertainty; returns a `ConditionAssertionDraft` the host appends; `renderCodeSearch` injects `CodeLookup` | Editing a medication or an order — `MedicationEditor` / `OrderEditor`; you only display conditions |
|
|
100
|
+
| [MedicationList](https://ui.mieweb.org/?path=/docs/clinical-lists-medicationlist--docs) | **Presenting medications** grouped by reconciliation status. `MedicationReconciliation` = batteries included (NCPDP `MedicationEditor`, dialogs, quick-add, `inlineAddSearch`); `MedicationList` = presentational, you own the dialogs | Allergies — `AllergyList`; placing a new order in the plan — `Assessment` + `OrderEditor`; a header summary — `PatientHeader` medication banner |
|
|
101
|
+
| [AllergyList](https://ui.mieweb.org/?path=/docs/clinical-lists-allergylist--docs) | Allergy / intolerance list grouped by category with severity and **tri-state NKA** ("not recorded" until _Confirm: no known allergies_). `AllergyManager` = batteries included; `AllergyList` = presentational | Medications — `MedicationList`; a red pill banner only — `PatientHeader`; drug–allergy checking (nothing here cross-references) |
|
|
102
|
+
| [CodeLookup](https://ui.mieweb.org/?path=/docs/clinical-lists-codelookup--docs) | Any **coded pick** — diagnosis, drug, lab, procedure, vaccine, surveillance program — searched offline in a Web Worker over pre-built shards; embed `bare` or inject app-wide via `CodeLookupProvider` | Your own data or an API — `Autocomplete`; you cannot serve the shards or run a worker — every consumer falls back to plain text |
|
|
103
|
+
| [MedicationListField (eSheet)](https://ui.mieweb.org/?path=/docs/clinical-lists-medicationlistfield-esheet--docs) | The medication list is a **question in an eSheet form**; `registerMedicationListFieldType({ codeLookup })` once, answer stored as `{ medications }` JSON | The page is not an eSheet form — use `MedicationReconciliation` directly |
|
|
104
|
+
| [AllergyListField (eSheet)](https://ui.mieweb.org/?path=/docs/clinical-lists-allergylistfield-esheet--docs) | The allergy question in an eSheet form, storing `{ allergies, noKnownAllergies }`; `registerAllergyListFieldType({ codeLookup })` (or `registerMieEsheetFields` for both) | The page is not an eSheet form — use `AllergyManager` directly |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
<!-- source: src/catalog/CompositeForms.mdx (Inputs) -->
|
|
109
|
+
# Composite forms
|
|
110
|
+
|
|
111
|
+
> **These are whole form sections and tools assembled from the primitives — the host still owns
|
|
112
|
+
> submission and persistence.** Every component here is controlled (`value` + `onChange`, or a
|
|
113
|
+
> ref you read), has no `name`, and never talks to a server. Pick by _who defines the fields and
|
|
114
|
+
> when_: an author designing a reusable template → `ESheet Builder`; someone filling that template
|
|
115
|
+
> → `ESheet Renderer`; the end user inventing a few extra key/value pairs → `AdditionalFields`;
|
|
116
|
+
> matching a spreadsheet's columns to fields you already have → `CSVColumnMapper`; assigning a
|
|
117
|
+
> user's capabilities → `PermissionsEditor`; switching the UI language → `LanguageSelector`.
|
|
118
|
+
|
|
119
|
+
## Which one?
|
|
120
|
+
|
|
121
|
+
| Component | Use it when | Not when |
|
|
122
|
+
| --- | --- | --- |
|
|
123
|
+
| [AdditionalFields](https://ui.mieweb.org/?path=/docs/composite-forms-additionalfields--docs) | A collapsible "extras" block where the person filling the form adds free name/value rows (`KeyValueEntry[]`, `maxEntries`) | Fields should be typed, validated and reused — `ESheet Builder`; keys are a known vocabulary — per-key `Input` / `Select` |
|
|
124
|
+
| [CSVColumnMapper](https://ui.mieweb.org/?path=/docs/composite-forms-csvcolumnmapper--docs) | The mapping step of a CSV import: one card per column with a `Select` of your fields, sub-fields, ignore/include and bulk actions; `CSVFileUpload` drop zone | You need parsing or validation (bring `papaparse` and your own rules); users are adding attributes, not mapping — `AdditionalFields` |
|
|
125
|
+
| [PermissionsEditor](https://ui.mieweb.org/?path=/docs/composite-forms-permissionseditor--docs) | Assigning a hierarchy of permissions (groups › permission › child) plus optional employer scope to a user, with a summary | One role from a list — `Select` / `RadioGroup`; a flat handful of flags — `CheckboxGroup`; a roles × permissions matrix (not provided) |
|
|
126
|
+
| [LanguageSelector](https://ui.mieweb.org/?path=/docs/composite-forms-languageselector--docs) | A header/settings UI-language switcher with a built-in list, flags and native names; `LanguageSelectorNative` for mobile, `LanguageSelectorInline` for 2–5 | A country — `CountryDropdown`; a validated form value with label/error — `Select` |
|
|
127
|
+
| [ESheet Builder](https://ui.mieweb.org/?path=/docs/composite-forms-esheet-builder--docs) | An administrator designs or edits a form template (`FormDefinition` JSON) with a palette, properties and drag-and-drop | You only need to display/fill a template — `ESheet Renderer`; the schema is fixed at build time — compose primitives directly |
|
|
128
|
+
| [UserPicker](https://ui.mieweb.org/?path=/docs/composite-forms-userpicker--docs) | Assigning an owner or assignees from a list of people, with avatars and search | Choosing from non-people options — `Select` / `Autocomplete` |
|
|
129
|
+
| [LogoUploader](https://ui.mieweb.org/?path=/docs/composite-forms-logouploader--docs) | Setting one image for a record (logo, photo) with preview, size check and remove | Several files or documents — `FileManager` / `DocumentScanner` |
|
|
130
|
+
| [ESheet Renderer](https://ui.mieweb.org/?path=/docs/composite-forms-esheet-renderer--docs) | Rendering an eSheet / SurveyJS / MCP definition as live fields and reading validated answers through `getValidResponse()` | Editing the definition — `ESheet Builder`; you expect a submit button or persistence (host provides both) |
|
|
131
|
+
|
|
132
|
+
Single fields live in [Text inputs](https://ui.mieweb.org/?path=/docs/inputs-text-inputs-overview--docs),
|
|
133
|
+
[Choice inputs](https://ui.mieweb.org/?path=/docs/inputs-choice-inputs-overview--docs) and
|
|
134
|
+
[Date & time](https://ui.mieweb.org/?path=/docs/inputs-date-time-overview--docs). The eSheet clinical field types
|
|
135
|
+
(`medicationList`, `allergyList`) are documented under Healthcare › Clinical lists.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
<!-- source: src/catalog/Content.mdx (Templates) -->
|
|
140
|
+
# Content
|
|
141
|
+
|
|
142
|
+
> **The body of a marketing page.** What the product does, how it works, how it compares, what
|
|
143
|
+
> people ask, and where to read more — each as a heading plus plain-data items.
|
|
144
|
+
|
|
145
|
+
## Which one?
|
|
146
|
+
|
|
147
|
+
| Component | Use it when | Not when |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| [FeatureGridSection](https://ui.mieweb.org/?path=/docs/content-featuregridsection--docs) | Three to eight parallel capabilities or benefits, one line each | One idea needs an image and an argument — [SplitContentSection](https://ui.mieweb.org/?path=/docs/content-splitcontentsection--docs) |
|
|
150
|
+
| [SplitContentSection](https://ui.mieweb.org/?path=/docs/content-splitcontentsection--docs) | One argument made beside an image, with proof points | Several parallel points — [FeatureGridSection](https://ui.mieweb.org/?path=/docs/content-featuregridsection--docs) |
|
|
151
|
+
| [ProcessStepsSection](https://ui.mieweb.org/?path=/docs/content-processstepssection--docs) | Two to four ordered steps: "how it works", "get started" | A record's progress over time in an app — [Timeline](https://ui.mieweb.org/?path=/docs/data-display-timeline--docs) |
|
|
152
|
+
| [ComparisonSection](https://ui.mieweb.org/?path=/docs/content-comparisonsection--docs) | Your product against an alternative or the status quo, by row | Users sort or filter the rows — [DataVis NITRO](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro--docs) |
|
|
153
|
+
| [FaqSection](https://ui.mieweb.org/?path=/docs/content-faqsection--docs) | Plain-text questions and answers that should be in the HTML | Rich or single-open panels in an app — [Accordion](https://ui.mieweb.org/?path=/docs/layout-accordion--docs) |
|
|
154
|
+
| [ResourceCardsSection](https://ui.mieweb.org/?path=/docs/content-resourcecardssection--docs) | Linked cards to guides, articles, case studies, reports | Video cards with previews — [VideoCard](https://ui.mieweb.org/?path=/docs/media-videocard--docs) |
|
|
155
|
+
| [VideoSection](https://ui.mieweb.org/?path=/docs/content-videosection--docs) | One walkthrough or explainer embedded in place | Several videos to choose from — [VideoCard](https://ui.mieweb.org/?path=/docs/media-videocard--docs) |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
<!-- source: src/catalog/Conversion.mdx (Templates) -->
|
|
160
|
+
# Conversion
|
|
161
|
+
|
|
162
|
+
> **Where a marketing page asks for something.** The hero makes the first ask, the call-to-action
|
|
163
|
+
> band makes the last, and the lead form converts without leaving the page. All three render real
|
|
164
|
+
> anchors or a real `<form>` — no client state.
|
|
165
|
+
|
|
166
|
+
## Which one?
|
|
167
|
+
|
|
168
|
+
| Component | Use it when | Not when |
|
|
169
|
+
| --- | --- | --- |
|
|
170
|
+
| [HeroSection](https://ui.mieweb.org/?path=/docs/conversion-herosection--docs) | The first screen of a public page: the `h1`, the pitch, two CTAs | A screen inside an app — [PageHeader](https://ui.mieweb.org/?path=/docs/layout-pageheader--docs) |
|
|
171
|
+
| [CtaSection](https://ui.mieweb.org/?path=/docs/conversion-ctasection--docs) | The next step is another page (demo booking, pricing, contact) | Visitors should convert here — [LeadFormSection](https://ui.mieweb.org/?path=/docs/conversion-leadformsection--docs) |
|
|
172
|
+
| [LeadFormSection](https://ui.mieweb.org/?path=/docs/conversion-leadformsection--docs) | Campaign, ABM and lead-magnet pages that capture the lead in place | App forms with steps, drafts or rich validation — the Inputs tier |
|
|
173
|
+
| [PricingSection](https://ui.mieweb.org/?path=/docs/conversion-pricingsection--docs) | Two to four plans a buyer chooses between | A monthly/annual toggle — needs client state; render one section per period |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
<!-- source: src/catalog/Dashboards.mdx (Modules) -->
|
|
178
|
+
# Dashboards
|
|
179
|
+
|
|
180
|
+
> **Widget or container?** The tile is `DashboardWidget` (a `Card` with a fixed title bar and
|
|
181
|
+
> four body shapes). The thing that arranges tiles is `CustomizableDashboard` (user-draggable,
|
|
182
|
+
> hide/show, persisted) — or plain CSS grid when the layout is fixed by design.
|
|
183
|
+
> `ReportDashboard` is a finished analytics _page_, not a container. `QuickLinksCard` is a
|
|
184
|
+
> titled list of shortcuts; `DashboardCustomizePanel` is the show/hide sheet, exported
|
|
185
|
+
> standalone. The two **(Demo)** entries are Storybook-only compositions to copy from, not
|
|
186
|
+
> exports.
|
|
187
|
+
|
|
188
|
+
## Which one?
|
|
189
|
+
|
|
190
|
+
| Component | Use it when | Not when |
|
|
191
|
+
| --- | --- | --- |
|
|
192
|
+
| [DashboardWidget](https://ui.mieweb.org/?path=/docs/dashboards-dashboardwidget--docs) | A portlet tile: `title`, `icon`, `count`, `onAdd` / `headerAction`, `loading`, `accent`, `headingLevel`; body is `DashboardWidgetInfo`, `DashboardWidgetTable`, `DashboardWidgetActions` or `DashboardWidgetDataCards` | Free-form surface, media or selection — [Card](https://ui.mieweb.org/?path=/docs/layout-card--docs); a long sortable list — [Table](https://ui.mieweb.org/?path=/docs/grids-table--docs) / `DataVisNitroGrid` in a Card |
|
|
193
|
+
| [CustomizableDashboard](https://ui.mieweb.org/?path=/docs/dashboards-customizabledashboard--docs) | Users drag portlets between 3 / 2 / 1 columns, hide widgets, and have it remembered (`storageKey` or controlled `order` / `layout` / `hiddenIds`); `toolbarSlot` portals the toolbar into a `PageHeader` | The layout is fixed — CSS grid of `DashboardWidget`; a flat single list — `useDragReorder`; widgets must resize or span columns |
|
|
194
|
+
| [DashboardCustomizePanel](https://ui.mieweb.org/?path=/docs/dashboards-dashboardcustomizepanel--docs) | You render your own dashboard shell but want the same show/hide `Sheet` (`widgets`, `hiddenIds`, `onToggleWidget`, `onReset`) | You already pass `widgets` to `CustomizableDashboard` (it renders this itself); users must reorder or configure widgets in the panel |
|
|
195
|
+
| [QuickLinksCard](https://ui.mieweb.org/?path=/docs/dashboards-quicklinkscard--docs) | A titled `Card` of ≤ ~8 shortcut rows with icon, `description`, `badge`; `layout="grid"` for icon tiles | Large explained tiles — [QuickAction](https://ui.mieweb.org/?path=/docs/actions-quickaction--docs); shortcuts inside a portlet — `DashboardWidgetActions`; real `<a href>` links for routing / crawlers |
|
|
196
|
+
| [ReportDashboard](https://ui.mieweb.org/?path=/docs/dashboards-reportdashboard--docs) | The provider / employer analytics page exactly as shipped: KPI `metrics`, an "Order Volume" bar chart, `topServices` / `topEmployers`, date-range `Select`, Export | Users arrange widgets — `CustomizableDashboard`; real charts — [DataVisNitroGraph](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro-graph--docs), [Sparkline](https://ui.mieweb.org/?path=/docs/grids-sparkline--docs); non-USD / non-English; different sections |
|
|
197
|
+
| [Dashboard (Demo)](https://ui.mieweb.org/?path=/docs/dashboards-dashboard-demo--docs) | You want to see a whole signed-in shell (`Sidebar`, header, routed pages, forms, grids) composed from library parts | You need an importable component — it is not exported; a real top bar — [AppHeader](https://ui.mieweb.org/?path=/docs/layout-appheader--docs) |
|
|
198
|
+
| [Dashboard Widgets (Demo)](https://ui.mieweb.org/?path=/docs/dashboards-dashboard-widgets-demo--docs) | You want a page-scale reference of `DashboardWidget` bodies (business stats + orders; patient summary under a `PatientHeader`) | You need an importable component — it is not exported; a spec for a widget prop — the `DashboardWidget` docs |
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
<!-- source: src/catalog/DataDisplay.mdx (Components) -->
|
|
203
|
+
# Data display
|
|
204
|
+
|
|
205
|
+
> **Who decides what the chip means?** If the host already knows the state ("Active", "Draft")
|
|
206
|
+
> → `Badge`. If the number is a count the user can click into → `CountBadge`. If the colour
|
|
207
|
+
> should follow how old a date is → `FreshnessBadge`. A person → `Avatar`; long prose →
|
|
208
|
+
> `ClampedText`; a process or its history → `Timeline`; the "N of M records" line above a
|
|
209
|
+
> filtered grid → `FilterSummaryBar`. `YChart` is a Storybook-only demo and is not exported.
|
|
210
|
+
|
|
211
|
+
## Which one?
|
|
212
|
+
|
|
213
|
+
| Component | Use it when | Not when |
|
|
214
|
+
| --- | --- | --- |
|
|
215
|
+
| [Badge](https://ui.mieweb.org/?path=/docs/data-display-badge--docs) | A label for a state or category you map to a `variant` (`success`, `warning`, `danger`, …); optional `icon`; `onRemove` makes it a removable chip | It shows a count and opens something — `CountBadge`; the colour depends on a date — `FreshnessBadge`; it must toggle a pressed state — `Toggle` / `Button` |
|
|
216
|
+
| [CountBadge](https://ui.mieweb.org/?path=/docs/data-display-countbadge--docs) | A clickable "Label N" pill for queues and shortcuts; `items` opens a popover table with per-row View / Edit / Delete | A label without a count — `Badge`; rows need real columns or sorting — a grid in your own `Modal`; a notification history — `NotificationCenter` |
|
|
217
|
+
| [FreshnessBadge](https://ui.mieweb.org/?path=/docs/data-display-freshnessbadge--docs) | "Reviewed 12d ago" bucketed into fresh / aging / stale by `thresholds`; `FreshnessDot` for tight cells; `freshnessLevel` / `daysSince` for sorting | The state is a category, not an age — `Badge`; you need the full date or a future date — render the date with `Text` |
|
|
218
|
+
| [Avatar](https://ui.mieweb.org/?path=/docs/data-display-avatar--docs) | A person's image with initials / glyph fallback; overlapping sets of people are [AvatarGroup](https://ui.mieweb.org/?path=/docs/record-details-avatargroup--docs) | It is not a person or needs a non-circle shape — `<img>`; it should open a menu — wrap in a `Dropdown` trigger; you need a status dot — compose a `Badge` |
|
|
219
|
+
| [ClampedText](https://ui.mieweb.org/?path=/docs/data-display-clampedtext--docs) | Free-text notes/messages clamped to `lines` with a Show more toggle; short text stays inline | One line with an ellipsis — [Text](https://ui.mieweb.org/?path=/docs/foundations-text--docs) `truncate`; rich content — clamp your own container; the whole section should collapse — `Collapsible` |
|
|
220
|
+
| [Timeline](https://ui.mieweb.org/?path=/docs/data-display-timeline--docs) | `TimelineProgress` for a process the user watches; `TimelineEventList` for a record's activity feed; `OrderConfirmation` for the fixed success overlay | The user drives the steps — [StepIndicator](https://ui.mieweb.org/?path=/docs/navigation-stepindicator--docs); a percentage — `Progress`; a custom dialog — `Modal` |
|
|
221
|
+
| [FilterSummaryBar](https://ui.mieweb.org/?path=/docs/data-display-filtersummarybar--docs) | "1,204 of 8,911 records — 3 filters active · Clear all" above a host-filtered `DataVisNITRO` / `Table` | You need removable filter chips — `Badge` with `onRemove`; there are no filters — a plain count in `PageHeader`; the count is a shortcut — `CountBadge` |
|
|
222
|
+
| [YChart](https://ui.mieweb.org/?path=/docs/data-display-ychart--docs) | Evaluating the `ychart` submodule's YAML org-chart editor inside Storybook | Anything in an application — it is **not exported**; an org chart in an app — [OrgChart](https://ui.mieweb.org/?path=/docs/records-orgchart--docs); charts — [DataVisNitroGraph](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro-graph--docs) |
|
|
223
|
+
| [CalendarHeatmap](https://ui.mieweb.org/?path=/docs/data-display-calendarheatmap--docs) | Daily activity over weeks or months as a contribution-style grid (engagement, logins, visits) | Exact values matter or there are few data points — `Table` or a chart; a schedule — `CalendarView` |
|
|
224
|
+
|
|
225
|
+
BlueHive-specific badges live in their own families and are not alternatives here:
|
|
226
|
+
[ServiceBadge](https://ui.mieweb.org/?path=/docs/services-servicebadge--docs) (service types) and
|
|
227
|
+
[StripeBadge](https://ui.mieweb.org/?path=/docs/billing-stripebadge--docs) (payment provider).
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
<!-- source: src/catalog/DateTime.mdx (Inputs) -->
|
|
232
|
+
# Date & time
|
|
233
|
+
|
|
234
|
+
> **Dates go through `DateInput` (one date) or `DateRangePicker` (start/end) — never a raw
|
|
235
|
+
> `<input type="date">`.** Keep dates as Luxon `DateTime` with an explicit IANA zone in
|
|
236
|
+
> application code and ISO-8601 on the wire; the components below hand you strings or local
|
|
237
|
+
> `Date`s, so convert at the boundary. Picking from _available_ slots is `SchedulePicker`;
|
|
238
|
+
> showing booked appointments is `ScheduleCalendar`; recurring weekly hours are `BusinessHours`
|
|
239
|
+
> (show) and `BusinessHoursEditor` (edit).
|
|
240
|
+
|
|
241
|
+
## Which one?
|
|
242
|
+
|
|
243
|
+
| Component | Use it when | Not when |
|
|
244
|
+
| --- | --- | --- |
|
|
245
|
+
| [DateInput](https://ui.mieweb.org/?path=/docs/date-time-dateinput--docs) | One date, time, month or year in a form (`inputType`); typed `MM/DD/YYYY` with auto-format, optional calendar (`showCalendar`), built-in `mode` / `minDate` / `maxDate` checks | A start/end pair or "Last 30 days" — `DateRangePicker`; the user must pick from open slots — `SchedulePicker` |
|
|
246
|
+
| [DateRangePicker](https://ui.mieweb.org/?path=/docs/date-time-daterangepicker--docs) | Filtering a list or report by a period: presets plus a two-month custom range; `DateRangeFilter` when presets alone will do | A single validated date — `DateInput`; the range must be constrained or carry an error message (not supported) |
|
|
247
|
+
| [SchedulePicker](https://ui.mieweb.org/?path=/docs/date-time-schedulepicker--docs) | Booking: the host supplies available `dates` and `times`, the user picks one of each (`DatePicker`, `TimePicker`, `RadioOption` building blocks) | Any date may be entered — `DateInput`; you need to _see_ existing appointments — `ScheduleCalendar` |
|
|
248
|
+
| [ScheduleCalendar](https://ui.mieweb.org/?path=/docs/date-time-schedulecalendar--docs) | Staff view of appointments on an hourly day/week grid, colour-coded by `status`, with click-to-open and click-empty-hour-to-add (`onAddAppointment`) | The patient is choosing a slot — `SchedulePicker`; recurring opening hours — `BusinessHours`; you need month view, drag-reschedule or overlap layout |
|
|
249
|
+
| [BusinessHours](https://ui.mieweb.org/?path=/docs/date-time-businesshours--docs) | Displaying weekly opening hours with an Open/Closed badge — full week, `CompactHours` one-liner, or `HoursSummary` expandable | The hours are being edited — `BusinessHoursEditor`; open/closed must be exact for a location in another time zone (computed from the viewer's clock) |
|
|
250
|
+
| [BusinessHoursEditor](https://ui.mieweb.org/?path=/docs/date-time-businesshourseditor--docs) | Admin settings to define weekly hours, split shifts and notes; `variant="rules"` when several days share hours | Read-only display — `BusinessHours`; dated exceptions, holidays or time-zone selection (not modelled) |
|
|
251
|
+
|
|
252
|
+
Free text, phones and URLs live in [Text inputs](https://ui.mieweb.org/?path=/docs/inputs-text-inputs-overview--docs);
|
|
253
|
+
lists of options in [Choice inputs](https://ui.mieweb.org/?path=/docs/inputs-choice-inputs-overview--docs).
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
<!-- source: src/catalog/Editors.mdx (Modules) -->
|
|
258
|
+
# Editors
|
|
259
|
+
|
|
260
|
+
> **What is the stored format, and who edits it?** Markdown that people write (and maybe
|
|
261
|
+
> co-write) → `RichEditor`. HTML for templated letters with merge fields and dictation →
|
|
262
|
+
> `RichTextEditor`. An **email** laid out from blocks and compiled to MJML → `EmailEditor`.
|
|
263
|
+
> Markdown that is only **read** → `MarkdownRenderer`. A structured agent
|
|
264
|
+
> configuration with a YAML/JSON pane → `Q`. Plain text → [Textarea](https://ui.mieweb.org/?path=/docs/text-inputs-textarea--docs)
|
|
265
|
+
> (Text inputs).
|
|
266
|
+
|
|
267
|
+
## Which one?
|
|
268
|
+
|
|
269
|
+
| Component | Use it when | Not when |
|
|
270
|
+
| --- | --- | --- |
|
|
271
|
+
| [RichEditor](https://ui.mieweb.org/?path=/docs/editors-richeditor--docs) | The document is **Markdown**: headings, lists, tables, code; `getContent()` on submit; `collab.room` for Yjs co-editing; `CodeEditor` for source | The stored format is HTML or you need merge variables/dictation — `RichTextEditor`; the host cannot add the Kerebron peers and WASM assets |
|
|
272
|
+
| [RichTextEditor](https://ui.mieweb.org/?path=/docs/editors-richtexteditor--docs) | The document is **HTML**: bold/italic/underline, lists, alignment, `variableGroups` inserting `{{tokens}}`, Web Speech dictation; no peers | You need Markdown, real undo history, headings/tables or collaboration — `RichEditor`; plain text — `Textarea` |
|
|
273
|
+
| [EmailEditor](https://ui.mieweb.org/?path=/docs/editors-emaileditor--docs) | The document is an **email**: hero, columns, buttons, images, social, footer blocks on a drag-to-reorder canvas; `renderEmailMjml` serialises it | A single formatted body — `RichTextEditor`; sending, recipients and templates are the host's |
|
|
274
|
+
| [Markdown](https://ui.mieweb.org/?path=/docs/editors-markdown--docs) | **Displaying** Markdown: sanitised HTML, code highlighting, `mermaid` / `csv` / `survey` / `html` fences, `streaming` for token-by-token AI output | The user edits the text — `RichEditor` / `RichTextEditor`; the source is HTML |
|
|
275
|
+
| [Q](https://ui.mieweb.org/?path=/docs/editors-q--docs) | Admins configure an **agent** (prompt, tools, telephony) through a schema-generated form and see the YAML/JSON; `onSubmit(yaml)`, `onConfigChange` | Free-form prose — `RichEditor`; general clinical/business forms — ESheet (Composite forms) |
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
<!-- source: src/catalog/EncounterOrders.mdx (Healthcare) -->
|
|
280
|
+
# Encounter & orders
|
|
281
|
+
|
|
282
|
+
> **What does the page lead with, and what data does it get?** Today's conclusions and the
|
|
283
|
+
> orders placed for each problem → `Assessment` (plain props: concerns, items, orders). One
|
|
284
|
+
> order in full → `OrderEditor` (morphs by type). What is _due_ from surveillance programs
|
|
285
|
+
> and quality measures → `HealthSurveillance` (`PatientHistory` + `programs.json`). The banner
|
|
286
|
+
> at the top of a **patient** page → `PatientHeader`; of a **case** page → `CaseManagementHeader`.
|
|
287
|
+
> Canned reports from a WebChart-style backend → `WebChartReportViewer`. None of them talks to a
|
|
288
|
+
> server — every backend contract is props in, callbacks out.
|
|
289
|
+
|
|
290
|
+
## Which one?
|
|
291
|
+
|
|
292
|
+
| Component | Use it when | Not when |
|
|
293
|
+
| --- | --- | --- |
|
|
294
|
+
| [Assessment](https://ui.mieweb.org/?path=/docs/encounter-orders-assessment--docs) | The visit's **A&P**: `items` point at today's assertion of each concern; `orders` nest under problems via `concernId` (the durable IndicationLink); unified coded add row; unlinked bucket; drag to re-link | The chart problem list — `ProblemList`; relevance tagging — `PresentingProblems`; full order edits — `OrderEditor`; a due list — `HealthSurveillance` |
|
|
295
|
+
| [OrderEditor](https://ui.mieweb.org/?path=/docs/encounter-orders-ordereditor--docs) | Editing one `AssessmentOrder` in full. Morphs: `medication` → `MedicationEditor` (NCPDP); `lab` / `imaging` / `procedure` / `referral` → typed editors with coded search, priority, timing, body site / refer-to | The inline display / detail edit Assessment already offers; reconciling presenting meds — `MedicationReconciliation` |
|
|
296
|
+
| [HealthSurveillance](https://ui.mieweb.org/?path=/docs/encounter-orders-healthsurveillance--docs) | Showing what is **overdue / due / pending / done** for OSHA / DOT programs (`enrolledKeys`) and CMS eCQMs, from `evaluateDue(history, programs)`; each item is a picklist of satisfying orders → `onOrderMany` | You need the plan itself — `Assessment`; an order-history grid — the story-only `ChartOrdersGrid` demo on NITRO; rules beyond periodicity + age / sex gates |
|
|
297
|
+
| [PatientHeader](https://ui.mieweb.org/?path=/docs/encounter-orders-patientheader--docs) | The page **is the patient**: demographics, status dot, allergy / medication / alert / provider rows, flag ribbon, `CountBadge` actions, ⋮ menu with built-in Contact / Add / Edit Patient modals | The page is a case — `CaseManagementHeader`; a generic titled page — `PageHeader`; you need the full editable lists — `AllergyList` / `MedicationList` |
|
|
298
|
+
| [CaseManagementHeader](https://ui.mieweb.org/?path=/docs/encounter-orders-casemanagementheader--docs) | The page **is a case**: `CaseContextBar` (case #, status, type, editing users, `collabStatus` slot) over the patient identity row, Add Case Note / Close Case, collapsible details grid with Days Open, `alert` slot, fully translatable `labels` | The page is the patient's chart — `PatientHeader`; a generic titled page — `PageHeader` |
|
|
299
|
+
| [WebChartReportViewer](https://ui.mieweb.org/?path=/docs/encounter-orders-webchartreportviewer--docs) | Browsing **canned system reports** (grid of cards) and viewing one in a modal with a date range; result rendered by shape — HTML string, rows → `Table`, object → key/value | Interactive analysis of rows — DataVis NITRO; a single fixed dataset — `Table`; untrusted HTML results (rendered unsanitised) |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
<!-- source: src/catalog/Feedback.mdx (Components) -->
|
|
304
|
+
# Feedback
|
|
305
|
+
|
|
306
|
+
> **Use `Toast` for what the user just did, `Alert` for what they need to keep seeing, and
|
|
307
|
+
> `AlertDialog` for what they must decide.** `Toast` (polite live region), `Alert`
|
|
308
|
+
> (`role="alert"`, announces on mount) and `ConnectionStatus` (assertive) announce themselves —
|
|
309
|
+
> never wrap them in extra live regions, and avoid mounting several announcing components at once.
|
|
310
|
+
|
|
311
|
+
## Which one?
|
|
312
|
+
|
|
313
|
+
| Component | Use it when | Not when |
|
|
314
|
+
| --- | --- | --- |
|
|
315
|
+
| [Alert](https://ui.mieweb.org/?path=/docs/feedback-alert--docs) | An inline, persistent message tied to nearby content | Confirming an action — `Toast` |
|
|
316
|
+
| [Toast](https://ui.mieweb.org/?path=/docs/feedback-toast--docs) | A transient confirmation or heads-up, optionally with Undo | The text must be re-read or is essential |
|
|
317
|
+
| [AlertDialog](https://ui.mieweb.org/?path=/docs/feedback-alertdialog--docs) | A yes/no decision the user cannot skip (delete, discard) | The dialog holds a form — `Modal` |
|
|
318
|
+
| [NotificationCenter](https://ui.mieweb.org/?path=/docs/feedback-notificationcenter--docs) | A readable history with read state (bell menu, inbox) | The message is about the current action |
|
|
319
|
+
| [ConnectionStatus](https://ui.mieweb.org/?path=/docs/feedback-connectionstatus--docs) | The app cannot work until the connection returns or an update is applied | Loss of connection is tolerable |
|
|
320
|
+
| [CollabStatus](https://ui.mieweb.org/?path=/docs/feedback-collabstatus--docs) | Presence and sync state of a collaborative document, in a header chip | There is no shared document |
|
|
321
|
+
| [ErrorPage](https://ui.mieweb.org/?path=/docs/feedback-errorpage--docs) | A route cannot render at all (404, 500, offline, maintenance) | Part of the page failed — `Alert` |
|
|
322
|
+
|
|
323
|
+
Loading states are their own family: [Loading](https://ui.mieweb.org/?path=/docs/components-loading-overview--docs).
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
<!-- source: src/catalog/Files.mdx (Modules) -->
|
|
328
|
+
# Files
|
|
329
|
+
|
|
330
|
+
> **Same task — get a file from the user — three shapes.** A drag target over content you
|
|
331
|
+
> already render, invisible until a drag starts → `DropzoneOverlay` + `useDropzone`. A standing
|
|
332
|
+
> "files on this record" card with a table, storage meter and per-row actions → `FileManager`.
|
|
333
|
+
> One document that must be validated, previewed, possibly photographed, and sent to an
|
|
334
|
+
> extraction endpoint → `DocumentScanner`.
|
|
335
|
+
|
|
336
|
+
## Which one?
|
|
337
|
+
|
|
338
|
+
| Component | Use it when | Not when |
|
|
339
|
+
| --- | --- | --- |
|
|
340
|
+
| [DropzoneOverlay](https://ui.mieweb.org/?path=/docs/files-dropzoneoverlay--docs) | An existing panel should accept drops; `useDropzone` gives `isDragging`, `getRootProps`, `getInputProps`, `open()` and you render the list/progress yourself | You need a visible upload area and a file table — `FileManager`; files need validation, preview or camera — `DocumentScanner` |
|
|
341
|
+
| [FileManager](https://ui.mieweb.org/?path=/docs/files-filemanager--docs) | A record's attachment list: drop/click card, `Progress` while `isUploading`, storage used/limit, table with Preview / Download / Delete via `onPreview` etc. | Only a drag target — `DropzoneOverlay`; scanned documents with extraction — `DocumentScanner`; sortable/multi-column lists — `Table` |
|
|
342
|
+
| [DocumentScanner](https://ui.mieweb.org/?path=/docs/files-documentscanner--docs) | Intake of an ID/card/form: MIME + size validation, `FilePreview`, mobile camera or desktop `WebcamModal` with auto-capture, `onScan` → `onResult` | Plain attachments with no server extraction step — `FileManager` / `DropzoneOverlay`; multi-page capture, cropping or client-side OCR |
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
<!-- source: src/catalog/Grids.mdx (Components) -->
|
|
347
|
+
# Grids
|
|
348
|
+
|
|
349
|
+
> **Tables and data grids start with DataVis NITRO.** Use `Table` only for a few static rows the
|
|
350
|
+
> user will not sort, filter, page or export. Never hand-roll grid features on a plain table;
|
|
351
|
+
> `AGGrid` is deprecated.
|
|
352
|
+
|
|
353
|
+
## Which one?
|
|
354
|
+
|
|
355
|
+
| Component | Use it when | Not when | Entry |
|
|
356
|
+
| --- | --- | --- | --- |
|
|
357
|
+
| [DataVis NITRO](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro--docs) | Users browse, sort, filter, group or export records — any list that may grow | The data is a handful of static rows | `@mieweb/ui/datavis` |
|
|
358
|
+
| [DataVis NITRO Graph](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro-graph--docs) | The same records as an interactive chart; users may change axes or chart type | You need a tiny inline trend | `@mieweb/ui/datavis` |
|
|
359
|
+
| [Table](https://ui.mieweb.org/?path=/docs/grids-table--docs) | A few known rows shown for reading (line items, a summary block) | Anything interactive beyond a link or a row action | `@mieweb/ui` |
|
|
360
|
+
| [Pagination](https://ui.mieweb.org/?path=/docs/grids-pagination--docs) | A server-paged `Table` or card list needs page controls | The rows are already in a NITRO grid | `@mieweb/ui` |
|
|
361
|
+
| [Sparkline](https://ui.mieweb.org/?path=/docs/grids-sparkline--docs) | A glanceable, dependency-free trend strip over pre-bucketed points | Exact values or axes must be read | `@mieweb/ui` |
|
|
362
|
+
| [AGGrid](https://ui.mieweb.org/?path=/docs/deprecated-aggrid--docs) _(deprecated)_ | Never for new work | — | `@mieweb/ui/ag-grid` |
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
<!-- source: src/catalog/Layout.mdx (Components) -->
|
|
367
|
+
# Layout
|
|
368
|
+
|
|
369
|
+
> **What are you framing?** A block of related content → `Card`. Content that hides behind a
|
|
370
|
+
> heading → `Accordion` (a styled stack) or `Collapsible` (one headless toggle). A region that
|
|
371
|
+
> must scroll inside a fixed box → `ScrollArea`. A rule between things → `Separator`. The bar
|
|
372
|
+
> across the top → `AppHeader` for the signed-in app, `SiteHeader` for the public site,
|
|
373
|
+
> `PageHeader` for the title block _inside_ a page. The bottom of a public page → `SiteFooter`
|
|
374
|
+
> (or `SimpleFooter`), with `ProductVersion` for the deployed version line.
|
|
375
|
+
|
|
376
|
+
## Which one?
|
|
377
|
+
|
|
378
|
+
| Component | Use it when | Not when |
|
|
379
|
+
| --- | --- | --- |
|
|
380
|
+
| [Card](https://ui.mieweb.org/?path=/docs/layout-card--docs) | A bordered surface you lay out yourself with `CardHeader` / `CardContent` / `CardFooter` / `CardActions`, `CardMedia`, `CardStat`; `interactive` + `selected` tiles | A titled portlet with count and "+" — [DashboardWidget](https://ui.mieweb.org/?path=/docs/dashboards-dashboardwidget--docs); a titled list of shortcuts — [QuickLinksCard](https://ui.mieweb.org/?path=/docs/dashboards-quicklinkscard--docs) |
|
|
381
|
+
| [Accordion](https://ui.mieweb.org/?path=/docs/layout-accordion--docs) | 3+ labelled sections in one stack from an `items` array; `type="single"` / `"multiple"`; `headingLevel`; animated, styled, `aria-hidden` + `inert` when closed | One toggle or custom trigger/panel styling — `Collapsible`; peer views the user switches between — [Tabs](https://ui.mieweb.org/?path=/docs/navigation-tabs--docs) |
|
|
382
|
+
| [Collapsible](https://ui.mieweb.org/?path=/docs/layout-collapsible--docs) | One headless `CollapsibleTrigger` + `CollapsibleContent`; content unmounts when closed (or `forceMount`); you bring every class | A styled stack with single/multiple rules — `Accordion`; a "Show more" tail inside a Card — `CardCollapsible` |
|
|
383
|
+
| [ScrollArea](https://ui.mieweb.org/?path=/docs/layout-scrollarea--docs) | A nested region with a fixed height/width that should scroll with thin themed scrollbars; `orientation` vertical / horizontal / both | The document should scroll; you need virtualisation, scroll shadows or custom thumbs |
|
|
384
|
+
| [Separator](https://ui.mieweb.org/?path=/docs/layout-separator--docs) | A 1px rule between blocks or inline items; `decorative={false}` for a semantic `role="separator"` | Inside a Card edge-to-edge — `CardDivider`; in a header rail — `AppHeaderDivider`; between menu items — `DropdownSeparator` |
|
|
385
|
+
| [AppHeader](https://ui.mieweb.org/?path=/docs/layout-appheader--docs) | The sticky top bar of the **signed-in app** beside a `Sidebar`: `AppHeaderBrand`, `AppHeaderTitle`, `AppHeaderSearch` (⌘K trigger), `AppHeaderIconButton`, `AppHeaderUserMenu` | A public page with nav links and Log In / Sign Up — `SiteHeader`; the title block inside the page — `PageHeader`; you need the dropdowns themselves — wrap the triggers in `Dropdown` / `NotificationCenter` |
|
|
386
|
+
| [SiteHeader](https://ui.mieweb.org/?path=/docs/layout-siteheader--docs) | The **fixed, brand-coloured public-site bar**: logo, `links`, `AuthButtons` ↔ `UserMenu` on `user`, built-in mobile menu; `CompactHeader` for back-button sub-pages | The app shell with search and account triggers — `AppHeader`; router links or active-route styling — [Sidebar](https://ui.mieweb.org/?path=/docs/overlays-sidebar--docs) |
|
|
387
|
+
| [PageHeader](https://ui.mieweb.org/?path=/docs/layout-pageheader--docs) | The **`<h1>` title block inside a page**: `title`, `subtitle`, `icon`, `actions`, and `children` for a `Breadcrumb` or `TabsList` | The app-wide bar — `AppHeader`; a record banner — [PatientHeader](https://ui.mieweb.org/?path=/docs/encounter-orders-patientheader--docs), [CaseManagementHeader](https://ui.mieweb.org/?path=/docs/encounter-orders-casemanagementheader--docs), [ProviderDetailHeader](https://ui.mieweb.org/?path=/docs/providers-providerdetailheader--docs); a tile title — `CardTitle` |
|
|
388
|
+
| [SiteFooter](https://ui.mieweb.org/?path=/docs/layout-sitefooter--docs) | The public `<footer>`: brand, `linkGroups`, social icons, newsletter, `LegalLinks`, disclaimers; `SimpleFooter` for a one-line © strip | Only a version line — `ProductVersion`; router links — every link is a plain `<a>` |
|
|
389
|
+
| [ProductVersion](https://ui.mieweb.org/?path=/docs/layout-productversion--docs) | "Name vX.Y.Z (build) · © year author" for footers and About pages, optionally linking to a changelog; `ProductVersionBadge` for a tiny env chip | A generic status label — [Badge](https://ui.mieweb.org/?path=/docs/data-display-badge--docs); the whole footer — `SiteFooter` |
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
<!-- source: src/catalog/Loading.mdx (Components) -->
|
|
394
|
+
# Loading
|
|
395
|
+
|
|
396
|
+
> **Known shape → `Skeleton`. Unknown shape, short wait → `Spinner`. Measurable → `Progress`.
|
|
397
|
+
> Whole route → `LoadingPage`.** Skeletons are hidden from screen readers, so announce loading
|
|
398
|
+
> elsewhere when you use them.
|
|
399
|
+
|
|
400
|
+
## Which one?
|
|
401
|
+
|
|
402
|
+
| Component | Use it when | Not when |
|
|
403
|
+
| --- | --- | --- |
|
|
404
|
+
| [Spinner](https://ui.mieweb.org/?path=/docs/loading-spinner--docs) | A short wait whose result has no predictable layout (submit, search) | The layout is known — `Skeleton` |
|
|
405
|
+
| [Skeleton](https://ui.mieweb.org/?path=/docs/loading-skeleton--docs) | The loaded view's shape is known and layout shift must be avoided | The wait is a fraction of a second |
|
|
406
|
+
| [Progress](https://ui.mieweb.org/?path=/docs/loading-progress--docs) | You can report a real percentage (upload, import, quota) | Progress cannot be measured |
|
|
407
|
+
| [LoadingPage](https://ui.mieweb.org/?path=/docs/loading-loadingpage--docs) | A whole route or panel has nothing to show yet; `LoadingOverlay` to block a region | Only one region is pending |
|
|
408
|
+
|
|
409
|
+
Related, in other families: `Button isLoading` (inline spinner), `ReadingProgressBar`
|
|
410
|
+
(scroll position, Navigation), `StepIndicator` (steps, Navigation), `ErrorPage` (Feedback).
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
<!-- source: src/catalog/Media.mdx (Modules) -->
|
|
415
|
+
# Media
|
|
416
|
+
|
|
417
|
+
> **Is the user recording, playing, or reading along?** Capturing a take → `AudioRecorder`
|
|
418
|
+
> (a panel with review) or `RecordButton` (one button that hands off a `Blob`). Playing a clip
|
|
419
|
+
> → `AudioPlayer` (styled, audio-only, seconds) or `MediaPlayer` (native `<audio>`/`<video>`,
|
|
420
|
+
> milliseconds). Reading along → `TranscriptView` (read-only, click-to-seek). Editing the
|
|
421
|
+
> words of a recording → `MediaEditor`, which already contains a `MediaPlayer`. The
|
|
422
|
+
> **MediaEditor Live Demo** is a Storybook page, not a component.
|
|
423
|
+
|
|
424
|
+
## Which one?
|
|
425
|
+
|
|
426
|
+
| Component | Use it when | Not when |
|
|
427
|
+
| --- | --- | --- |
|
|
428
|
+
| [AudioPlayer](https://ui.mieweb.org/?path=/docs/media-audioplayer--docs) | A small, themed player for one audio clip: `inline` / `compact` / `waveform` variants, `AudioPlayerRef` in **seconds**, `preload={false}` for lists | The source may be video or you want native controls and captions — `MediaPlayer`; you are capturing — `AudioRecorder` / `RecordButton` |
|
|
429
|
+
| [MediaPlayer](https://ui.mieweb.org/?path=/docs/media-mediaplayer--docs) | Native `<audio>`/`<video>` with `controls`, `kind` inferred from the extension, `MediaPlayerRef` in **milliseconds** to sync a transcript | You want a compact styled audio control or a waveform — `AudioPlayer`; the words are edited — `MediaEditor` |
|
|
430
|
+
| [MediaFeed](https://ui.mieweb.org/?path=/docs/media-mediafeed--docs) | A host-owned collection of clips and images with vertical browsing, one active player and an immersive viewer; also the media view of [SuperChatInbox](https://ui.mieweb.org/?path=/docs/superchat-inbox--docs) | A single clip — `MediaPlayer`; a linked video thumbnail — `VideoCard`; text discussion — the normal SuperChat thread |
|
|
431
|
+
| [TranscriptView](https://ui.mieweb.org/?path=/docs/media-transcriptview--docs) | Read-only word- or segment-level transcript that highlights `currentTimeMs` and reports `onSeek(ms)`; speaker rows via `speakerLabels` / `mergeSameSpeaker` | The user changes words or the cut — `MediaEditor`; you have no media position to follow |
|
|
432
|
+
| [MediaEditor](https://ui.mieweb.org/?path=/docs/media-mediaeditor--docs) | Word-timestamped `Transcript` the user tightens: delete/cut/paste words, split silences, filler removal, speed markers; state persisted via `onEditorStateChange` | Read-only playback — `TranscriptView` + `MediaPlayer`; segment-only timestamps (no per-word times) |
|
|
433
|
+
| [MediaEditor Live Demo](https://ui.mieweb.org/?path=/docs/media-mediaeditor-live-demo--docs) | Trying `MediaEditor` on your own file: on-device Whisper transcription, then the editor with the Script panel | Anything you ship — use `MediaEditor` with your own transcription source |
|
|
434
|
+
| [AudioRecorder](https://ui.mieweb.org/?path=/docs/media-audiorecorder--docs) | A deliberate take with pause/resume, `maxDuration`, waveform playback and delete before the host receives the `Blob` (`onRecordingComplete`) | A single mic icon in a composer — `RecordButton`; you cannot ship `wavesurfer.js`; a speaker-labelled visit transcript — [VisitScribe](https://ui.mieweb.org/?path=/docs/voice-visit-scribe--docs) |
|
|
435
|
+
| [RecordButton](https://ui.mieweb.org/?path=/docs/media-recordbutton--docs) | One round button for talk-to-text / voice messages: six visual states, `transcriptionState` overlay, controlled `state` when you own the recorder | The user should review the take first — `AudioRecorder`; you want a real waveform (its bars are a CSS animation) |
|
|
436
|
+
| [DictationButton](https://ui.mieweb.org/?path=/docs/media-dictationbutton--docs) | Voice typing: records one speaker, transcribes (on-device Whisper by default, or a host `transcribe`) and returns **editable text** via `onText` — never sends | The host needs the audio `Blob` — `RecordButton`; several speakers — [VisitScribe](https://ui.mieweb.org/?path=/docs/voice-visit-scribe--docs) |
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
<!-- source: src/catalog/Navigation.mdx (Components) -->
|
|
441
|
+
# Navigation
|
|
442
|
+
|
|
443
|
+
> **Where is the user going?** Between peer views of one page → `Tabs`. Up a hierarchy →
|
|
444
|
+
> `Breadcrumb`. Between sections of the page they are on → `TableOfContents` (sidebar
|
|
445
|
+
> outline) or `SectionSpyNav` (sticky band), with `ReadingProgressBar` for how far they've
|
|
446
|
+
> read. Through an ordered flow → `StepIndicator` (just the rail) or `OnboardingWizard` (the
|
|
447
|
+
> whole takeover). Anywhere, by typing → `CommandPalette`. Between routes with a persistent
|
|
448
|
+
> rail → [Sidebar](https://ui.mieweb.org/?path=/docs/overlays-sidebar--docs) (Overlays).
|
|
449
|
+
|
|
450
|
+
## Which one?
|
|
451
|
+
|
|
452
|
+
| Component | Use it when | Not when |
|
|
453
|
+
| --- | --- | --- |
|
|
454
|
+
| [Tabs](https://ui.mieweb.org/?path=/docs/navigation-tabs--docs) | 2–7 sibling views of one record/page; selection is local state (`value` / `defaultValue`); `tablist` / `tab` / `tabpanel` semantics | App navigation between routes — [Sidebar](https://ui.mieweb.org/?path=/docs/overlays-sidebar--docs); a compact toolbar filter — `PillSelect`; readable stacked sections — `Accordion`; ordered steps — `StepIndicator` |
|
|
455
|
+
| [Breadcrumb](https://ui.mieweb.org/?path=/docs/navigation-breadcrumb--docs) | The page is ≥ 2 levels deep in a tree the user climbs back up; `maxItems` bounds long paths; `renderLink` for your router | Peer views — `Tabs`; primary navigation — `Sidebar` / `AppHeader`; one level deep — a Back `Button` |
|
|
456
|
+
| [TableOfContents](https://ui.mieweb.org/?path=/docs/navigation-tableofcontents--docs) | A two-column long page with a sticky **nested** outline; auto-discovers `h2, h3` with ids inside `contentRef`, or takes `items` | Single-column with a few flat sections — `SectionSpyNav`; progress only — `ReadingProgressBar`; items are pages — `Sidebar` |
|
|
457
|
+
| [SectionSpyNav](https://ui.mieweb.org/?path=/docs/navigation-sectionspynav--docs) | A sticky horizontal band under the header for 3–8 **flat** sections, optional tiered `cta` | Nested headings with a sidebar — `TableOfContents`; content scrolls in a container (viewport-only spy); links leave the page — `AppHeader` |
|
|
458
|
+
| [ReadingProgressBar](https://ui.mieweb.org/?path=/docs/navigation-readingprogressbar--docs) | A decorative top-of-viewport bar for how far the reader has scrolled the document | A value the host owns (upload, task) — [Progress](https://ui.mieweb.org/?path=/docs/loading-progress--docs); the reader needs to jump — add a TOC or `SectionSpyNav`; content scrolls in a container |
|
|
459
|
+
| [StepIndicator](https://ui.mieweb.org/?path=/docs/navigation-stepindicator--docs) | The numbered rail of a wizard **you** build; `currentStep` + `onStepClick`, `orientation`, `hasError` / `optional` per step | You want the whole flow — `OnboardingWizard`; the user only watches — [TimelineProgress](https://ui.mieweb.org/?path=/docs/data-display-timeline--docs); a percentage — `Progress` |
|
|
460
|
+
| [OnboardingWizard](https://ui.mieweb.org/?path=/docs/navigation-onboardingwizard--docs) | A full-screen setup takeover with header, Back / Next / Skip / Finish, `Progress`, `loading` and `error` states; controlled by `currentStep` | Steps live inside a page — `StepIndicator`; a dialog — `Modal` + `StepIndicator`; not BlueHive — override the branding and `OnboardingCompletion` copy |
|
|
461
|
+
| [CommandPalette](https://ui.mieweb.org/?path=/docs/navigation-commandpalette--docs) | ⌘K / Ctrl+K search-and-run across the app; features register items through `useCommandPalette` | Actions for one element — `Dropdown`; a form value — `Autocomplete`; showing shortcuts — `KeyboardShortcutsOverlay` |
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
<!-- source: src/catalog/Overlays.mdx (Components) -->
|
|
466
|
+
# Overlays
|
|
467
|
+
|
|
468
|
+
> **Does the user have to deal with it now?** Yes → `Modal` (or `AlertDialog` for a decision).
|
|
469
|
+
> Beside the page → `Sheet`. Set it aside and come back → `DockablePanel`. Move it around →
|
|
470
|
+
> `FloatingWindow`. Just a hint → one of the three tips.
|
|
471
|
+
|
|
472
|
+
## Which one?
|
|
473
|
+
|
|
474
|
+
| Component | Use it when | Not when | Modal? |
|
|
475
|
+
| --- | --- | --- | --- |
|
|
476
|
+
| [Modal](https://ui.mieweb.org/?path=/docs/overlays-modal--docs) | A focused task interrupts the page: edit, pick, view details | A yes/no decision — `AlertDialog` | yes |
|
|
477
|
+
| [Sheet](https://ui.mieweb.org/?path=/docs/overlays-sheet--docs) | Secondary detail or filters slide in from an edge; mobile menus | The task should fully take over | yes |
|
|
478
|
+
| [DockablePanel](https://ui.mieweb.org/?path=/docs/overlays-dockablepanel--docs) | A long form/editor the user parks as a strip and resumes, dirty-guarded | A quick task | full only |
|
|
479
|
+
| [FloatingWindow](https://ui.mieweb.org/?path=/docs/overlays-floatingwindow--docs) | A draggable, resizable tool window kept open while reading the page | Touch / small screens | no |
|
|
480
|
+
| [Sidebar](https://ui.mieweb.org/?path=/docs/overlays-sidebar--docs) | Persistent app navigation; becomes a drawer on small screens | Transient panels — `Sheet` | drawer only |
|
|
481
|
+
| [Tooltip](https://ui.mieweb.org/?path=/docs/overlays-tooltip--docs) | A few words describing a control on hover/focus | Links or structure inside | no |
|
|
482
|
+
| [GlossaryTooltip](https://ui.mieweb.org/?path=/docs/overlays-glossarytooltip--docs) | A pinnable definition card for domain terms in prose | Citing where a value comes from | no |
|
|
483
|
+
| [SourceTip](https://ui.mieweb.org/?path=/docs/overlays-sourcetip--docs) | A pinnable provenance card: what backs this number/claim | Defining a term | no |
|
|
484
|
+
| [KeyboardShortcutsOverlay](https://ui.mieweb.org/?path=/docs/overlays-keyboardshortcutsoverlay--docs) | The `?` help dialog listing shortcuts (`Kbd` chips) | Running commands — `CommandPalette` | yes |
|
|
485
|
+
| [CookieConsent](https://ui.mieweb.org/?path=/docs/overlays-cookieconsent--docs) | A fixed consent banner with accept/decline and policy links | Any other message — `Alert` / `Toast` | no |
|
|
486
|
+
|
|
487
|
+
`AlertDialog` lives in [Feedback](https://ui.mieweb.org/?path=/docs/components-feedback-overview--docs) but is built on
|
|
488
|
+
`Modal`.
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
<!-- source: src/catalog/Pages.mdx (Templates) -->
|
|
493
|
+
# Pages
|
|
494
|
+
|
|
495
|
+
> **A marketing page is data.** `LandingPage` renders an array of `blocks` — each a section's
|
|
496
|
+
> props tagged with a `type` — so an industry hub, a service page or a campaign page is a content
|
|
497
|
+
> file, not a component. Everything in the Templates tier is plain data in, static HTML out, and
|
|
498
|
+
> safe to render from a React Server Component via `@mieweb/ui/templates`.
|
|
499
|
+
|
|
500
|
+
## Which one?
|
|
501
|
+
|
|
502
|
+
| Component | Use it when | Not when |
|
|
503
|
+
| --- | --- | --- |
|
|
504
|
+
| [LandingPage](https://ui.mieweb.org/?path=/docs/pages-landingpage--docs) | A page is a stack of standard sections and you want to describe it as data | The page is mostly bespoke layout — compose the sections, or build one with `SectionShell` |
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
<!-- source: src/catalog/Presentations.mdx (Modules) -->
|
|
509
|
+
# Presentations
|
|
510
|
+
|
|
511
|
+
> **One idea per screen, read in order, shared as a link.** Board updates, growth reviews and
|
|
512
|
+
> talks published as pages. Both live on optional entries so their weight stays out of apps
|
|
513
|
+
> that don't present.
|
|
514
|
+
|
|
515
|
+
## Which one?
|
|
516
|
+
|
|
517
|
+
| Component | Use it when | Not when |
|
|
518
|
+
| --- | --- | --- |
|
|
519
|
+
| [Deck](https://ui.mieweb.org/?path=/docs/presentations-deck--docs) | A full-screen slide deck from JSON slides (`@mieweb/ui/deck`) | A report people scan and search — the [Reports](https://ui.mieweb.org/?path=/docs/templates-reports-overview--docs) sections |
|
|
520
|
+
| [PointMap](https://ui.mieweb.org/?path=/docs/presentations-pointmap--docs) | Points or regional bubbles on a real map (`@mieweb/ui/maps`) | Comparing every state equally — TileCartogramSection |
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
<!-- source: src/catalog/RecordDetails.mdx (Components) -->
|
|
525
|
+
# Record details
|
|
526
|
+
|
|
527
|
+
> **The pieces that describe one record** — a contact, company, clinic, patient or deal.
|
|
528
|
+
> `RecordHeader` names it, `PropertyList` lists its fields, and the rest add the details a
|
|
529
|
+
> record page keeps needing: who's here, what's hidden, how complete it is, how it's rated.
|
|
530
|
+
|
|
531
|
+
## Which one?
|
|
532
|
+
|
|
533
|
+
| Component | Use it when | Not when |
|
|
534
|
+
| --- | --- | --- |
|
|
535
|
+
| [RecordHeader](https://ui.mieweb.org/?path=/docs/record-details-recordheader--docs) | The top of a record page: avatar or logo, name, status badges, meta, actions | A page that isn't about one record — `PageHeader`; a patient — `PatientHeader` |
|
|
536
|
+
| [PropertyList](https://ui.mieweb.org/?path=/docs/record-details-propertylist--docs) | Label/value fields, optionally editable in place, copyable or grouped | Rows the user sorts or filters — DataVis NITRO; a form submitted at once — form inputs |
|
|
537
|
+
| [AvatarGroup](https://ui.mieweb.org/?path=/docs/record-details-avatargroup--docs) | Several people at once — owners, participants, who is viewing or editing | One person — `Avatar` |
|
|
538
|
+
| [PhiMask](https://ui.mieweb.org/?path=/docs/record-details-phimask--docs) | A sensitive value (SSN, DOB, member ID) that stays hidden until revealed | Access control — masking is display only; the server must not send what the user may not see |
|
|
539
|
+
| [CompletenessMeter](https://ui.mieweb.org/?path=/docs/record-details-completenessmeter--docs) | Showing how much of a record is filled in and what's missing | Task progress over time — `Progress` / `ActionPlan` |
|
|
540
|
+
| [Rating](https://ui.mieweb.org/?path=/docs/record-details-rating--docs) | A star score, read-only or as an input | A numeric metric — `Badge` or a stat |
|
|
541
|
+
| [ReviewCard](https://ui.mieweb.org/?path=/docs/record-details-reviewcard--docs) | One review with author, date, rating, body and an optional reply | A feed of mixed events — `ActivityFeed` |
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
<!-- source: src/catalog/Records.mdx (Modules) -->
|
|
546
|
+
# Records
|
|
547
|
+
|
|
548
|
+
> **The collections around one record, and the frame that holds them.** `RecordLayout` places
|
|
549
|
+
> the header, fields and tabs; the modules fill the tabs and side columns with what happened
|
|
550
|
+
> (`ActivityFeed`), what changed (`FieldHistory`), what's related (`AssociationList`), what's
|
|
551
|
+
> next (`ActionPlan`) and who's who (`OrgChart`). Each renders data you pass in and reports
|
|
552
|
+
> changes through callbacks — none of them fetches.
|
|
553
|
+
|
|
554
|
+
## Which one?
|
|
555
|
+
|
|
556
|
+
| Component | Use it when | Not when |
|
|
557
|
+
| --- | --- | --- |
|
|
558
|
+
| [RecordLayout](https://ui.mieweb.org/?path=/docs/records-recordlayout--docs) | A record page: header, fields sidebar, tabbed main column, optional aside | A dashboard the user rearranges — `CustomizableDashboard` |
|
|
559
|
+
| [ActivityFeed](https://ui.mieweb.org/?path=/docs/records-activityfeed--docs) | Mixed events (calls, notes, emails, meetings) grouped by day, with filters and pins | Steps in a fixed process — `Timeline`; field-level changes — `FieldHistory` |
|
|
560
|
+
| [FieldHistory](https://ui.mieweb.org/?path=/docs/records-fieldhistory--docs) | Who changed which field, from what to what, and when | Business events — `ActivityFeed` |
|
|
561
|
+
| [AssociationList](https://ui.mieweb.org/?path=/docs/records-associationlist--docs) | Related records (contacts at a company, deals for a contact) with add/remove | Many rows the user sorts or filters — DataVis NITRO |
|
|
562
|
+
| [ActionPlan](https://ui.mieweb.org/?path=/docs/records-actionplan--docs) | A shared checklist with owners, due dates and overdue flags | A project board — `BoardView`; a dated schedule — `GanttView` |
|
|
563
|
+
| [OrgChart](https://ui.mieweb.org/?path=/docs/records-orgchart--docs) | Reporting lines or a location hierarchy, with search, filter and a list view | A flat list of people — `AssociationList` |
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
<!-- source: src/catalog/Reports.mdx (Templates) -->
|
|
568
|
+
# Reports
|
|
569
|
+
|
|
570
|
+
> **Published data a reader can check.** A report is only as credible as its provenance: label
|
|
571
|
+
> every figure live, modeled or maturing, cite its source, and say who wrote it. These sections
|
|
572
|
+
> are `LandingPage` blocks, so a report is a content file — see the `benchmark-report` preset.
|
|
573
|
+
|
|
574
|
+
## Which one?
|
|
575
|
+
|
|
576
|
+
| Component | Use it when | Not when |
|
|
577
|
+
| --- | --- | --- |
|
|
578
|
+
| [MetricStatusBadge](https://ui.mieweb.org/?path=/docs/reports-metricstatusbadge--docs) | Tagging a figure or section live / modeled / maturing | The label is a workflow state — [Badge](https://ui.mieweb.org/?path=/docs/data-display-badge--docs) |
|
|
579
|
+
| [ReportLegend](https://ui.mieweb.org/?path=/docs/reports-reportlegend--docs) | Explaining those tags near the top of the report | Every figure has one source — say so in the methodology |
|
|
580
|
+
| [BenchmarkTableSection](https://ui.mieweb.org/?path=/docs/reports-benchmarktablesection--docs) | Several measures across many items | Readers must sort or filter — DataVis NITRO |
|
|
581
|
+
| [RankedListSection](https://ui.mieweb.org/?path=/docs/reports-rankedlistsection--docs) | A ranking where order matters more than exact values | Each item has several measures — BenchmarkTableSection |
|
|
582
|
+
| [TileCartogramSection](https://ui.mieweb.org/?path=/docs/reports-tilecartogramsection--docs) | A figure by state where small states matter | Real location matters — [PointMap](https://ui.mieweb.org/?path=/docs/presentations-pointmap--docs) |
|
|
583
|
+
| [MetricListSection](https://ui.mieweb.org/?path=/docs/reports-metriclistsection--docs) | Metrics you define now and measure later | All values are known — StatsSection `cards` |
|
|
584
|
+
| [ReportMethodology](https://ui.mieweb.org/?path=/docs/reports-reportmethodology--docs) | Sources, how to cite, cadence and data downloads | Per-sentence citations — the site's footnote system |
|
|
585
|
+
| [ReportByline](https://ui.mieweb.org/?path=/docs/reports-reportbyline--docs) | Authors and publish/update dates | A blog post with its own byline |
|
|
586
|
+
| [LinkGroupsSection](https://ui.mieweb.org/?path=/docs/reports-linkgroupssection--docs) | Linking out to the pages behind the numbers | Each link needs an image — ResourceCardsSection |
|
|
587
|
+
| [PdfEmbedSection](https://ui.mieweb.org/?path=/docs/reports-pdfembedsection--docs) | An inline PDF edition with download | The PDF is gated — LeadFormSection with `highlights` |
|
|
588
|
+
|
|
589
|
+
The rest of a report comes from the other families: `HeroSection` with `meta` for the dateline,
|
|
590
|
+
`StatsSection variant="ruled"` on the brand tone for key findings, `FeatureGridSection` for the
|
|
591
|
+
executive summary (numbers as lettermark icons) and outlook, and `LeadFormSection` with
|
|
592
|
+
`highlights` as the gate for a downloadable edition.
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
<!-- source: src/catalog/Showcase.mdx (Components) -->
|
|
597
|
+
# Showcase
|
|
598
|
+
|
|
599
|
+
> **Hero and front-door set pieces.** These components exist to make a first
|
|
600
|
+
> impression — a global footprint, an orbiting ecosystem, an explorable product
|
|
601
|
+
> ring. They are self-running, motion-driven and decorative by design: if the
|
|
602
|
+
> visitor must _read, compare or navigate_ the content, reach for Data display,
|
|
603
|
+
> Navigation or a plain layout instead.
|
|
604
|
+
|
|
605
|
+
## Which one?
|
|
606
|
+
|
|
607
|
+
| Component | Use it when | Not when |
|
|
608
|
+
| --- | --- | --- |
|
|
609
|
+
| [Globe](https://ui.mieweb.org/?path=/docs/showcase-globe--docs) | A hero shows a **global footprint** — offices, customers, deployments — with hub arcs | Values must be read or compared — chart it with the DataVis components |
|
|
610
|
+
| [OrbitRing](https://ui.mieweb.org/?path=/docs/showcase-orbitring--docs) | Partner/integration logos should **orbit** your product mark as a living ecosystem | The items carry data or must be browsed — a logo wall or `Card` grid |
|
|
611
|
+
| [RadialExplorer](https://ui.mieweb.org/?path=/docs/showcase-radialexplorer--docs) | Visitors **preview each module** in place: tiles around a core, media + CTA per pick | Users navigate to the sections rather than preview them — `MegaMenu` or links |
|
|
612
|
+
|
|
613
|
+
---
|
|
614
|
+
|
|
615
|
+
<!-- source: src/catalog/SocialProof.mdx (Templates) -->
|
|
616
|
+
# Social proof
|
|
617
|
+
|
|
618
|
+
> **Evidence that other people chose this.** Numbers, names and quotes — each a claim the page has
|
|
619
|
+
> to stand behind, so cite figures and only publish quotes and logos you have permission to use.
|
|
620
|
+
|
|
621
|
+
## Which one?
|
|
622
|
+
|
|
623
|
+
| Component | Use it when | Not when |
|
|
624
|
+
| --- | --- | --- |
|
|
625
|
+
| [StatsSection](https://ui.mieweb.org/?path=/docs/social-proof-statssection--docs) | Two to four headline figures back the pitch | Figures must count up on scroll — render `AnimatedNumber` from a client component |
|
|
626
|
+
| [LogoCloudSection](https://ui.mieweb.org/?path=/docs/social-proof-logocloudsection--docs) | A quick "trusted by" or "connects to" strip | Logos orbiting your mark as a hero visual — [OrbitRing](https://ui.mieweb.org/?path=/docs/showcase-orbitring--docs) |
|
|
627
|
+
| [TestimonialSection](https://ui.mieweb.org/?path=/docs/social-proof-testimonialsection--docs) | Quotes from customers in the buyer's position | A rotating carousel — keep that client-side in the app |
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
<!-- source: src/catalog/TextInputs.mdx (Inputs) -->
|
|
632
|
+
# Text inputs
|
|
633
|
+
|
|
634
|
+
> **What is the value?** Free text on one line → `Input`; several lines → `Textarea`. A phone
|
|
635
|
+
> number → `PhoneInput` (or `PhoneInputGroup` for a typed list); a URL → `WebsiteInput` (or
|
|
636
|
+
> `WebsiteInputGroup`) — never a raw `type="tel"` / `type="url"`. A postal address → `AddressForm`
|
|
637
|
+
> to edit, `Address` to show. Every field gets an associated label: the `label` prop where the
|
|
638
|
+
> component has one, `Label` + `htmlFor` where it does not.
|
|
639
|
+
|
|
640
|
+
## Which one?
|
|
641
|
+
|
|
642
|
+
| Component | Use it when | Not when |
|
|
643
|
+
| --- | --- | --- |
|
|
644
|
+
| [Input](https://ui.mieweb.org/?path=/docs/text-inputs-input--docs) | One line of free text or a native type (`email`, `password`, `number`) | Phone / URL / date / fixed options — see the specialists |
|
|
645
|
+
| [Textarea](https://ui.mieweb.org/?path=/docs/text-inputs-textarea--docs) | A sentence or more; a visible character budget (`showCount`) | Formatted or collaborative text — `RichEditor` |
|
|
646
|
+
| [Label](https://ui.mieweb.org/?path=/docs/text-inputs-label--docs) | Labelling a control with no `label` prop (raw `<select>`, custom) | The control already takes `label` |
|
|
647
|
+
| [PhoneInput](https://ui.mieweb.org/?path=/docs/text-inputs-phoneinput--docs) | Exactly one US/Canada number stored as 10 digits | Several typed numbers — `PhoneInputGroup`; international |
|
|
648
|
+
| [PhoneInputGroup](https://ui.mieweb.org/?path=/docs/text-inputs-phoneinputgroup--docs) | A record holds several numbers and the type (cell, work, fax) matters | One number; rows need extra fields |
|
|
649
|
+
| [WebsiteInput](https://ui.mieweb.org/?path=/docs/text-inputs-websiteinput--docs) | A website or social link, syntax-checked on blur (`WebsiteInputGroup` for a typed list) | Anything that is not a URL |
|
|
650
|
+
| [Address](https://ui.mieweb.org/?path=/docs/text-inputs-address--docs) | Showing a stored address (`block` / `inline` / `compact`, maps link) | Editing it — `AddressForm` |
|
|
651
|
+
| [AddressForm](https://ui.mieweb.org/?path=/docs/text-inputs-addressform--docs) | Collecting a full US address, optionally filled by Google Places | One field, non-US layouts, a state picker |
|
|
652
|
+
| [InlineEdit](https://ui.mieweb.org/?path=/docs/text-inputs-inlineedit--docs) | Editing one saved value in place on a record page (click, edit, Enter to save) | A form the user submits as a whole — `Input` in a form |
|
|
653
|
+
| [TagEditor](https://ui.mieweb.org/?path=/docs/text-inputs-tageditor--docs) | Free-form tags the user types, with optional suggestions | A fixed set of choices — `PillSelect` |
|
|
654
|
+
|
|
655
|
+
Dates go to [DateInput](https://ui.mieweb.org/?path=/docs/date-time-dateinput--docs); fixed option sets to
|
|
656
|
+
[Select](https://ui.mieweb.org/?path=/docs/choice-inputs-select--docs) or
|
|
657
|
+
[Autocomplete](https://ui.mieweb.org/?path=/docs/choice-inputs-autocomplete--docs).
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
<!-- source: src/catalog/Views.mdx (Modules) -->
|
|
662
|
+
# Views
|
|
663
|
+
|
|
664
|
+
> **One set of accessors, every view.** A page that shows a collection of things describes
|
|
665
|
+
> that collection once — `getId`, `getTitle`, `getStatus`, `getStart`, `getEnd`, `getGroup` —
|
|
666
|
+
> and every view in this family reads through it. Switching from a list to a board to a Gantt
|
|
667
|
+
> is a prop, not another component to build. The views are **headless**: they never fetch,
|
|
668
|
+
> subscribe, or navigate. Data arrives as `items`; changes leave through `on*` callbacks.
|
|
669
|
+
|
|
670
|
+
## Which one?
|
|
671
|
+
|
|
672
|
+
Members land incrementally. [ViewSwitcher](https://ui.mieweb.org/?path=/docs/views-viewswitcher--docs),
|
|
673
|
+
[ListView](https://ui.mieweb.org/?path=/docs/views-listview--docs), [BoardView](https://ui.mieweb.org/?path=/docs/views-boardview--docs),
|
|
674
|
+
[CalendarView](https://ui.mieweb.org/?path=/docs/views-calendarview--docs),
|
|
675
|
+
[GanttView](https://ui.mieweb.org/?path=/docs/views-ganttview--docs) and
|
|
676
|
+
[ViewSet](https://ui.mieweb.org/?path=/docs/views-viewset--docs) have all shipped.
|
|
677
|
+
|
|
678
|
+
Most pages want `ViewSet` and nothing else from this table: it renders the switcher and the
|
|
679
|
+
views, and leaves you the slots. Reach for an individual view when a page draws exactly one
|
|
680
|
+
layout forever.
|
|
681
|
+
|
|
682
|
+
| Component | Use it when | Not when |
|
|
683
|
+
| --- | --- | --- |
|
|
684
|
+
| [ViewSwitcher](https://ui.mieweb.org/?path=/docs/views-viewswitcher--docs) | Users pick between the layouts below; persisted per user or driven by a URL param | Two unrelated pages, not two views of one collection — [Tabs](https://ui.mieweb.org/?path=/docs/navigation-tabs--docs) |
|
|
685
|
+
| [ListView](https://ui.mieweb.org/?path=/docs/views-listview--docs) | A scannable vertical list, optionally grouped by status or group, with a row slot you own | Rows need sorting, filtering, paging or export — [DataVis NITRO](https://ui.mieweb.org/?path=/docs/grids-datavis-nitro--docs) |
|
|
686
|
+
| [BoardView](https://ui.mieweb.org/?path=/docs/views-boardview--docs) | Items move between named stages and the stage is the primary fact | Stages are fixed and items never move — [ListView](https://ui.mieweb.org/?path=/docs/views-listview--docs) grouped by status |
|
|
687
|
+
| [CalendarView](https://ui.mieweb.org/?path=/docs/views-calendarview--docs) | Items land on, or span, calendar days and the month grid is the point | Timed appointments in day/week slots — [ScheduleCalendar](https://ui.mieweb.org/?path=/docs/date-time-schedulecalendar--docs) |
|
|
688
|
+
| [GanttView](https://ui.mieweb.org/?path=/docs/views-ganttview--docs) | Items have a start and an end and overlap matters across a date range — including as a roadmap | One record's progress through steps — [Timeline](https://ui.mieweb.org/?path=/docs/data-display-timeline--docs) |
|
|
689
|
+
| [ViewSet](https://ui.mieweb.org/?path=/docs/views-viewset--docs) | A whole page: switcher, the enabled views, and shared filter / overview / detail / toolbar slots | You render exactly one layout forever — use that view directly |
|
|
690
|
+
|
|
691
|
+
**A roadmap is not its own component.** It is
|
|
692
|
+
[GanttView](https://ui.mieweb.org/?path=/docs/views-ganttview--docs) at `cadence="month"` or `"quarter"` with
|
|
693
|
+
`groupByLane`. A `RoadmapView` was planned and dropped: it would have been the same chart
|
|
694
|
+
with wider columns, and two near-identical timeline components is exactly the duplication
|
|
695
|
+
this family exists to remove. The `roadmap` view id remains, so a switcher can still offer
|
|
696
|
+
"Roadmap" as a labelled option. For an editorial, hand-authored calendar year — a
|
|
697
|
+
compliance calendar on a marketing page — reach for
|
|
698
|
+
[YearTimeline](https://ui.mieweb.org/?path=/docs/data-display-yeartimeline--docs) instead: it is
|
|
699
|
+
authored a year at a time rather than driven from records through accessors.
|
|
700
|
+
|
|
701
|
+
**Tables are not a view here.** A tabular layout of the same collection is
|
|
702
|
+
`DataVisNitroGrid` (see [Grids](https://ui.mieweb.org/?path=/docs/components-grids-overview--docs)); `ViewSet`
|
|
703
|
+
renders it in the `table` slot rather than wrapping it. Tables and data grids start with
|
|
704
|
+
DataVis NITRO.
|
|
705
|
+
|
|
706
|
+
**Overview is not a view either.** It is domain content — KPI tiles, charts, next actions —
|
|
707
|
+
so `ViewSet` exposes an `overview` slot that a page fills with
|
|
708
|
+
[CustomizableDashboard](https://ui.mieweb.org/?path=/docs/dashboards-customizabledashboard--docs) and
|
|
709
|
+
[DashboardWidget](https://ui.mieweb.org/?path=/docs/dashboards-dashboardwidget--docs).
|