@nadicodeai/ui 12.1.95 → 12.1.97
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/AGENTS.md +5 -1
- package/dist/components/accordion.d.ts +13 -0
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +13 -0
- package/dist/components/account-menu.d.ts +62 -18
- package/dist/components/account-menu.d.ts.map +1 -1
- package/dist/components/account-menu.js +32 -8
- package/dist/components/action-menu.d.ts +61 -5
- package/dist/components/action-menu.d.ts.map +1 -1
- package/dist/components/action-menu.js +31 -2
- package/dist/components/action-status.d.ts +13 -3
- package/dist/components/action-status.d.ts.map +1 -1
- package/dist/components/action-status.js +13 -3
- package/dist/components/activity-calendar.d.ts +14 -0
- package/dist/components/activity-calendar.d.ts.map +1 -1
- package/dist/components/activity-calendar.js +14 -0
- package/dist/components/activity-feed.d.ts +62 -0
- package/dist/components/activity-feed.d.ts.map +1 -0
- package/dist/components/activity-feed.js +54 -0
- package/dist/components/agent-card.d.ts +15 -0
- package/dist/components/agent-card.d.ts.map +1 -1
- package/dist/components/agent-card.js +15 -0
- package/dist/components/agent-list-row.d.ts +11 -7
- package/dist/components/agent-list-row.d.ts.map +1 -1
- package/dist/components/agent-list-row.js +10 -8
- package/dist/components/agent-orb-appearance.d.ts +5 -4
- package/dist/components/agent-orb-appearance.d.ts.map +1 -1
- package/dist/components/agent-orb.d.ts +16 -0
- package/dist/components/agent-orb.d.ts.map +1 -1
- package/dist/components/agent-orb.js +17 -0
- package/dist/components/agent-profile.d.ts +39 -10
- package/dist/components/agent-profile.d.ts.map +1 -1
- package/dist/components/agent-profile.js +40 -10
- package/dist/components/alert-dialog.d.ts +14 -0
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +14 -0
- package/dist/components/alert.d.ts +14 -0
- package/dist/components/alert.d.ts.map +1 -1
- package/dist/components/alert.js +14 -0
- package/dist/components/app-mark.d.ts +14 -4
- package/dist/components/app-mark.d.ts.map +1 -1
- package/dist/components/app-mark.js +16 -4
- package/dist/components/approval-row.d.ts +15 -2
- package/dist/components/approval-row.d.ts.map +1 -1
- package/dist/components/approval-row.js +15 -2
- package/dist/components/aspect-ratio.d.ts +10 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -1
- package/dist/components/aspect-ratio.js +13 -1
- package/dist/components/avatar.d.ts +15 -0
- package/dist/components/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +15 -0
- package/dist/components/badge.d.ts +11 -1
- package/dist/components/badge.d.ts.map +1 -1
- package/dist/components/badge.js +10 -5
- package/dist/components/brand-field.d.ts +10 -0
- package/dist/components/brand-field.d.ts.map +1 -1
- package/dist/components/brand-field.js +10 -0
- package/dist/components/brand.d.ts +14 -0
- package/dist/components/brand.d.ts.map +1 -1
- package/dist/components/brand.js +18 -4
- package/dist/components/breadcrumb.d.ts +20 -2
- package/dist/components/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb.js +13 -3
- package/dist/components/button-group.d.ts +21 -0
- package/dist/components/button-group.d.ts.map +1 -1
- package/dist/components/button-group.js +21 -0
- package/dist/components/button.d.ts +20 -0
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +20 -0
- package/dist/components/calendar.d.ts +15 -0
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +15 -0
- package/dist/components/card-row.d.ts +15 -5
- package/dist/components/card-row.d.ts.map +1 -1
- package/dist/components/card-row.js +15 -5
- package/dist/components/card.d.ts +16 -0
- package/dist/components/card.d.ts.map +1 -1
- package/dist/components/card.js +16 -0
- package/dist/components/carousel.d.ts +12 -0
- package/dist/components/carousel.d.ts.map +1 -1
- package/dist/components/carousel.js +12 -0
- package/dist/components/catalog-drawer.d.ts +29 -0
- package/dist/components/catalog-drawer.d.ts.map +1 -0
- package/dist/components/catalog-drawer.js +31 -0
- package/dist/components/catalog-entry.d.ts +49 -26
- package/dist/components/catalog-entry.d.ts.map +1 -1
- package/dist/components/catalog-entry.js +5 -27
- package/dist/components/channel-view.d.ts +23 -0
- package/dist/components/channel-view.d.ts.map +1 -1
- package/dist/components/channel-view.js +13 -4
- package/dist/components/chart-area-stacked.d.ts +11 -1
- package/dist/components/chart-area-stacked.d.ts.map +1 -1
- package/dist/components/chart-area-stacked.js +12 -2
- package/dist/components/chart-axis.d.ts.map +1 -1
- package/dist/components/chart-axis.js +2 -0
- package/dist/components/chart-bar-horizontal.d.ts +11 -1
- package/dist/components/chart-bar-horizontal.d.ts.map +1 -1
- package/dist/components/chart-bar-horizontal.js +15 -2
- package/dist/components/chart-bar-multiple.d.ts +9 -4
- package/dist/components/chart-bar-multiple.d.ts.map +1 -1
- package/dist/components/chart-bar-multiple.js +10 -5
- package/dist/components/chart-bar-stacked.d.ts +11 -1
- package/dist/components/chart-bar-stacked.d.ts.map +1 -1
- package/dist/components/chart-bar-stacked.js +12 -2
- package/dist/components/chart-card.d.ts +38 -24
- package/dist/components/chart-card.d.ts.map +1 -1
- package/dist/components/chart-card.js +21 -8
- package/dist/components/chart-date-range-control.d.ts +15 -10
- package/dist/components/chart-date-range-control.d.ts.map +1 -1
- package/dist/components/chart-date-range-control.js +16 -12
- package/dist/components/chart-date-range.d.ts +2 -1
- package/dist/components/chart-date-range.d.ts.map +1 -1
- package/dist/components/chart-date-range.js +5 -2
- package/dist/components/chart-entity-colors.d.ts +7 -0
- package/dist/components/chart-entity-colors.d.ts.map +1 -1
- package/dist/components/chart-entity-colors.js +7 -0
- package/dist/components/chart-sparkline.d.ts +10 -0
- package/dist/components/chart-sparkline.d.ts.map +1 -1
- package/dist/components/chart-sparkline.js +8 -7
- package/dist/components/chart.d.ts +10 -0
- package/dist/components/chart.d.ts.map +1 -1
- package/dist/components/chart.js +27 -4
- package/dist/components/checkbox.d.ts +15 -0
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +15 -0
- package/dist/components/code-block.d.ts +15 -0
- package/dist/components/code-block.d.ts.map +1 -1
- package/dist/components/code-block.js +15 -0
- package/dist/components/collapsible.d.ts +12 -0
- package/dist/components/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible.js +12 -0
- package/dist/components/collection-filters.d.ts +15 -2
- package/dist/components/collection-filters.d.ts.map +1 -1
- package/dist/components/collection-filters.js +13 -1
- package/dist/components/collection-page.d.ts +29 -115
- package/dist/components/collection-page.d.ts.map +1 -1
- package/dist/components/collection-page.js +24 -139
- package/dist/components/collection-search.d.ts +14 -0
- package/dist/components/collection-search.d.ts.map +1 -1
- package/dist/components/collection-search.js +14 -0
- package/dist/components/collection-sort.d.ts +13 -3
- package/dist/components/collection-sort.d.ts.map +1 -1
- package/dist/components/collection-sort.js +17 -4
- package/dist/components/collection-toolbar.d.ts +13 -0
- package/dist/components/collection-toolbar.d.ts.map +1 -1
- package/dist/components/collection-toolbar.js +13 -0
- package/dist/components/combobox.d.ts +17 -0
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +17 -0
- package/dist/components/command.d.ts +16 -0
- package/dist/components/command.d.ts.map +1 -1
- package/dist/components/command.js +16 -0
- package/dist/components/company-card/renderer.js +2 -2
- package/dist/components/company-card.d.ts +16 -4
- package/dist/components/company-card.d.ts.map +1 -1
- package/dist/components/company-card.js +22 -10
- package/dist/components/confirm-dialog.d.ts +24 -14
- package/dist/components/confirm-dialog.d.ts.map +1 -1
- package/dist/components/confirm-dialog.js +16 -10
- package/dist/components/context-menu.d.ts +10 -0
- package/dist/components/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu.js +10 -0
- package/dist/components/copy-button.d.ts +10 -0
- package/dist/components/copy-button.d.ts.map +1 -1
- package/dist/components/copy-button.js +10 -0
- package/dist/components/dashboard-shell.d.ts +14 -0
- package/dist/components/dashboard-shell.d.ts.map +1 -1
- package/dist/components/dashboard-shell.js +15 -1
- package/dist/components/data-table.d.ts +23 -1
- package/dist/components/data-table.d.ts.map +1 -1
- package/dist/components/data-table.js +63 -31
- package/dist/components/desktop-shell.d.ts +15 -0
- package/dist/components/desktop-shell.d.ts.map +1 -1
- package/dist/components/desktop-shell.js +15 -0
- package/dist/components/dialog.d.ts +16 -0
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +16 -0
- package/dist/components/diff-count.d.ts +11 -0
- package/dist/components/diff-count.d.ts.map +1 -1
- package/dist/components/diff-count.js +11 -0
- package/dist/components/disclosure-row.d.ts +12 -0
- package/dist/components/disclosure-row.d.ts.map +1 -1
- package/dist/components/disclosure-row.js +12 -0
- package/dist/components/disclosure.d.ts +15 -5
- package/dist/components/disclosure.d.ts.map +1 -1
- package/dist/components/disclosure.js +15 -5
- package/dist/components/drawer.d.ts +13 -0
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +13 -0
- package/dist/components/dropdown-menu.d.ts +17 -5
- package/dist/components/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu.js +20 -7
- package/dist/components/empty-art.d.ts +1 -1
- package/dist/components/empty-art.d.ts.map +1 -1
- package/dist/components/empty-art.js +8 -0
- package/dist/components/empty-state.d.ts +24 -10
- package/dist/components/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state.js +23 -1
- package/dist/components/entry-scene.d.ts +33 -20
- package/dist/components/entry-scene.d.ts.map +1 -1
- package/dist/components/entry-scene.js +40 -9
- package/dist/components/expandable-block.d.ts +10 -0
- package/dist/components/expandable-block.d.ts.map +1 -1
- package/dist/components/expandable-block.js +10 -0
- package/dist/components/field.d.ts +17 -0
- package/dist/components/field.d.ts.map +1 -1
- package/dist/components/field.js +17 -0
- package/dist/components/file-diff.d.ts +12 -0
- package/dist/components/file-diff.d.ts.map +1 -1
- package/dist/components/file-diff.js +12 -0
- package/dist/components/file-type-icon.d.ts +12 -0
- package/dist/components/file-type-icon.d.ts.map +1 -1
- package/dist/components/file-type-icon.js +46 -31
- package/dist/components/footer.d.ts +14 -0
- package/dist/components/footer.d.ts.map +1 -1
- package/dist/components/footer.js +14 -0
- package/dist/components/form-dialog.d.ts +10 -0
- package/dist/components/form-dialog.d.ts.map +1 -1
- package/dist/components/form-dialog.js +10 -0
- package/dist/components/form-drawer.d.ts +24 -11
- package/dist/components/form-drawer.d.ts.map +1 -1
- package/dist/components/form-drawer.js +13 -3
- package/dist/components/form.d.ts +17 -0
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/form.js +25 -5
- package/dist/components/glass-control.d.ts +13 -0
- package/dist/components/glass-control.d.ts.map +1 -1
- package/dist/components/glass-control.js +13 -0
- package/dist/components/heatmap/calendar-heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/calendar-heatmap.js +6 -4
- package/dist/components/hive-scene.d.ts +14 -0
- package/dist/components/hive-scene.d.ts.map +1 -1
- package/dist/components/hive-scene.js +14 -0
- package/dist/components/house-icons.d.ts +15 -0
- package/dist/components/house-icons.d.ts.map +1 -1
- package/dist/components/house-icons.js +19 -1
- package/dist/components/hover-card.d.ts +15 -0
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +15 -0
- package/dist/components/identity-mark.d.ts +55 -0
- package/dist/components/identity-mark.d.ts.map +1 -0
- package/dist/components/identity-mark.js +66 -0
- package/dist/components/input-group.d.ts +16 -0
- package/dist/components/input-group.d.ts.map +1 -1
- package/dist/components/input-group.js +17 -0
- package/dist/components/input-otp.d.ts +15 -0
- package/dist/components/input-otp.d.ts.map +1 -1
- package/dist/components/input-otp.js +15 -0
- package/dist/components/input.d.ts +15 -0
- package/dist/components/input.d.ts.map +1 -1
- package/dist/components/input.js +15 -0
- package/dist/components/item.d.ts +16 -0
- package/dist/components/item.d.ts.map +1 -1
- package/dist/components/item.js +16 -0
- package/dist/components/kbd.d.ts +14 -0
- package/dist/components/kbd.d.ts.map +1 -1
- package/dist/components/kbd.js +14 -0
- package/dist/components/kpi-card.d.ts +21 -13
- package/dist/components/kpi-card.d.ts.map +1 -1
- package/dist/components/kpi-card.js +14 -3
- package/dist/components/label-system.d.ts +12 -0
- package/dist/components/label-system.d.ts.map +1 -1
- package/dist/components/label-system.js +12 -0
- package/dist/components/label.d.ts +15 -0
- package/dist/components/label.d.ts.map +1 -1
- package/dist/components/label.js +15 -0
- package/dist/components/library-shelf.d.ts +35 -0
- package/dist/components/library-shelf.d.ts.map +1 -0
- package/dist/components/library-shelf.js +40 -0
- package/dist/components/memory-item.d.ts +12 -0
- package/dist/components/memory-item.d.ts.map +1 -1
- package/dist/components/memory-item.js +12 -0
- package/dist/components/menu-choice-row.d.ts +13 -5
- package/dist/components/menu-choice-row.d.ts.map +1 -1
- package/dist/components/menu-choice-row.js +12 -6
- package/dist/components/menubar.d.ts +13 -0
- package/dist/components/menubar.d.ts.map +1 -1
- package/dist/components/menubar.js +13 -0
- package/dist/components/message-notice.d.ts +16 -0
- package/dist/components/message-notice.d.ts.map +1 -1
- package/dist/components/message-notice.js +18 -2
- package/dist/components/model-identity.d.ts +16 -3
- package/dist/components/model-identity.d.ts.map +1 -1
- package/dist/components/model-identity.js +16 -3
- package/dist/components/model-mark.d.ts +15 -2
- package/dist/components/model-mark.d.ts.map +1 -1
- package/dist/components/model-mark.js +36 -23
- package/dist/components/nadia-presence.d.ts +10 -4
- package/dist/components/nadia-presence.d.ts.map +1 -1
- package/dist/components/nadia-presence.js +10 -4
- package/dist/components/native-select.d.ts +16 -0
- package/dist/components/native-select.d.ts.map +1 -1
- package/dist/components/native-select.js +21 -0
- package/dist/components/navigation-menu.d.ts +14 -0
- package/dist/components/navigation-menu.d.ts.map +1 -1
- package/dist/components/navigation-menu.js +14 -0
- package/dist/components/notice-banner.d.ts +10 -3
- package/dist/components/notice-banner.d.ts.map +1 -1
- package/dist/components/notice-banner.js +9 -3
- package/dist/components/numbered-steps.d.ts +33 -0
- package/dist/components/numbered-steps.d.ts.map +1 -0
- package/dist/components/numbered-steps.js +23 -0
- package/dist/components/object-page.d.ts +37 -0
- package/dist/components/object-page.d.ts.map +1 -0
- package/dist/components/object-page.js +19 -0
- package/dist/components/object-workspace.d.ts +26 -36
- package/dist/components/object-workspace.d.ts.map +1 -1
- package/dist/components/object-workspace.js +27 -24
- package/dist/components/overview-page.d.ts +24 -0
- package/dist/components/overview-page.d.ts.map +1 -0
- package/dist/components/overview-page.js +26 -0
- package/dist/components/page-actions.d.ts +28 -23
- package/dist/components/page-actions.d.ts.map +1 -1
- package/dist/components/page-actions.js +20 -14
- package/dist/components/page-header.d.ts +11 -5
- package/dist/components/page-header.d.ts.map +1 -1
- package/dist/components/page-header.js +11 -5
- package/dist/components/pagination.d.ts +15 -0
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +15 -0
- package/dist/components/pairing-code.d.ts +15 -4
- package/dist/components/pairing-code.d.ts.map +1 -1
- package/dist/components/pairing-code.js +15 -4
- package/dist/components/pending-label.d.ts +12 -4
- package/dist/components/pending-label.d.ts.map +1 -1
- package/dist/components/pending-label.js +12 -4
- package/dist/components/picture-label.d.ts +15 -7
- package/dist/components/picture-label.d.ts.map +1 -1
- package/dist/components/picture-label.js +15 -7
- package/dist/components/platform-mark.d.ts +12 -3
- package/dist/components/platform-mark.d.ts.map +1 -1
- package/dist/components/platform-mark.js +12 -3
- package/dist/components/plugin-slot-boundary.d.ts +15 -0
- package/dist/components/plugin-slot-boundary.d.ts.map +1 -1
- package/dist/components/plugin-slot-boundary.js +18 -1
- package/dist/components/popover.d.ts +15 -0
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +15 -0
- package/dist/components/portal-sidebar-frame.d.ts +26 -12
- package/dist/components/portal-sidebar-frame.d.ts.map +1 -1
- package/dist/components/portal-sidebar-frame.js +26 -0
- package/dist/components/product-message.d.ts.map +1 -1
- package/dist/components/product-message.js +1 -0
- package/dist/components/progress.d.ts +10 -8
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +17 -16
- package/dist/components/qr-code.d.ts +9 -3
- package/dist/components/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code.js +9 -3
- package/dist/components/radio-group.d.ts +15 -0
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +15 -0
- package/dist/components/reading-column.d.ts +11 -0
- package/dist/components/reading-column.d.ts.map +1 -1
- package/dist/components/reading-column.js +11 -0
- package/dist/components/record-identity.d.ts +12 -7
- package/dist/components/record-identity.d.ts.map +1 -1
- package/dist/components/record-identity.js +12 -7
- package/dist/components/record-list.d.ts +119 -0
- package/dist/components/record-list.d.ts.map +1 -0
- package/dist/components/record-list.js +161 -0
- package/dist/components/record-sheet.d.ts +36 -0
- package/dist/components/record-sheet.d.ts.map +1 -0
- package/dist/components/record-sheet.js +19 -0
- package/dist/components/record-time.d.ts +27 -11
- package/dist/components/record-time.d.ts.map +1 -1
- package/dist/components/record-time.js +35 -14
- package/dist/components/resizable.d.ts +10 -0
- package/dist/components/resizable.d.ts.map +1 -1
- package/dist/components/resizable.js +10 -0
- package/dist/components/row-edit-form.d.ts +8 -5
- package/dist/components/row-edit-form.d.ts.map +1 -1
- package/dist/components/row-edit-form.js +8 -5
- package/dist/components/run-timeline.d.ts +24 -11
- package/dist/components/run-timeline.d.ts.map +1 -1
- package/dist/components/run-timeline.js +13 -6
- package/dist/components/scope-switcher.d.ts +11 -0
- package/dist/components/scope-switcher.d.ts.map +1 -1
- package/dist/components/scope-switcher.js +20 -9
- package/dist/components/scroll-area.d.ts +12 -0
- package/dist/components/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area.js +12 -0
- package/dist/components/select.d.ts +16 -0
- package/dist/components/select.d.ts.map +1 -1
- package/dist/components/select.js +16 -0
- package/dist/components/separator.d.ts +11 -0
- package/dist/components/separator.d.ts.map +1 -1
- package/dist/components/separator.js +11 -0
- package/dist/components/settings-facts.d.ts +18 -1
- package/dist/components/settings-facts.d.ts.map +1 -1
- package/dist/components/settings-facts.js +20 -1
- package/dist/components/settings-page.d.ts +20 -0
- package/dist/components/settings-page.d.ts.map +1 -0
- package/dist/components/settings-page.js +16 -0
- package/dist/components/settings-section.d.ts +38 -8
- package/dist/components/settings-section.d.ts.map +1 -1
- package/dist/components/settings-section.js +33 -7
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.d.ts.map +1 -1
- package/dist/components/sheet.js +16 -0
- package/dist/components/sidebar-sections.d.ts +40 -0
- package/dist/components/sidebar-sections.d.ts.map +1 -0
- package/dist/components/sidebar-sections.js +35 -0
- package/dist/components/sidebar.d.ts +14 -1
- package/dist/components/sidebar.d.ts.map +1 -1
- package/dist/components/sidebar.js +24 -5
- package/dist/components/skeleton.d.ts +10 -0
- package/dist/components/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton.js +11 -1
- package/dist/components/slider.d.ts +14 -0
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +14 -0
- package/dist/components/sonner.d.ts +18 -0
- package/dist/components/sonner.d.ts.map +1 -1
- package/dist/components/sonner.js +23 -2
- package/dist/components/status-badge.d.ts +13 -2
- package/dist/components/status-badge.d.ts.map +1 -1
- package/dist/components/status-badge.js +21 -9
- package/dist/components/status-dot.d.ts +12 -0
- package/dist/components/status-dot.d.ts.map +1 -1
- package/dist/components/status-dot.js +12 -0
- package/dist/components/status-row.d.ts +14 -0
- package/dist/components/status-row.d.ts.map +1 -1
- package/dist/components/status-row.js +14 -0
- package/dist/components/switch.d.ts +15 -0
- package/dist/components/switch.d.ts.map +1 -1
- package/dist/components/switch.js +15 -0
- package/dist/components/table-card.d.ts +16 -3
- package/dist/components/table-card.d.ts.map +1 -1
- package/dist/components/table-card.js +16 -3
- package/dist/components/table-value.d.ts +24 -2
- package/dist/components/table-value.d.ts.map +1 -1
- package/dist/components/table-value.js +25 -3
- package/dist/components/table.d.ts +16 -0
- package/dist/components/table.d.ts.map +1 -1
- package/dist/components/table.js +17 -1
- package/dist/components/tabs.d.ts +27 -0
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +27 -0
- package/dist/components/tag.d.ts +12 -2
- package/dist/components/tag.d.ts.map +1 -1
- package/dist/components/tag.js +12 -2
- package/dist/components/text-link.d.ts +17 -0
- package/dist/components/text-link.d.ts.map +1 -1
- package/dist/components/text-link.js +17 -0
- package/dist/components/textarea.d.ts +14 -0
- package/dist/components/textarea.d.ts.map +1 -1
- package/dist/components/textarea.js +14 -0
- package/dist/components/theme-mode-switcher.d.ts +21 -0
- package/dist/components/theme-mode-switcher.d.ts.map +1 -1
- package/dist/components/theme-mode-switcher.js +23 -1
- package/dist/components/toggle-group.d.ts +13 -0
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +16 -1
- package/dist/components/toggle.d.ts +14 -0
- package/dist/components/toggle.d.ts.map +1 -1
- package/dist/components/toggle.js +14 -0
- package/dist/components/tool-icon.d.ts +14 -4
- package/dist/components/tool-icon.d.ts.map +1 -1
- package/dist/components/tool-icon.js +28 -19
- package/dist/components/tooltip.d.ts +15 -0
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +15 -0
- package/dist/components/trend-badge.d.ts +16 -1
- package/dist/components/trend-badge.d.ts.map +1 -1
- package/dist/components/trend-badge.js +16 -7
- package/dist/components/update-card.d.ts +36 -0
- package/dist/components/update-card.d.ts.map +1 -0
- package/dist/components/update-card.js +28 -0
- package/dist/components/usage-meter.d.ts +15 -0
- package/dist/components/usage-meter.d.ts.map +1 -1
- package/dist/components/usage-meter.js +20 -1
- package/dist/components/waiting-line.d.ts +13 -10
- package/dist/components/waiting-line.d.ts.map +1 -1
- package/dist/components/waiting-line.js +13 -10
- package/dist/eslint/index.js +9 -0
- package/dist/eslint/rules/empty-state-owner.js +145 -0
- package/dist/eslint/rules/jsx-class-utility.js +5 -0
- package/dist/eslint/rules/menu-owner.js +75 -0
- package/dist/eslint/rules/no-choice-control-wrapper.js +2 -0
- package/dist/eslint/rules/no-decorative-icon.js +164 -0
- package/dist/eslint/rules/no-deprecated-zod-api.js +1 -0
- package/dist/eslint/rules/no-shadcn-appearance-override.js +1 -0
- package/dist/eslint/rules/no-subject-derived-expectation.js +1 -1
- package/dist/eslint/rules/no-write-in-subscription.js +1 -0
- package/dist/eslint/rules/page-composition.js +232 -0
- package/dist/eslint/rules/rendered-import.js +121 -0
- package/dist/eslint/strict-design-system.js +1 -1
- package/dist/hooks/use-hydrated.d.ts +2 -0
- package/dist/hooks/use-hydrated.d.ts.map +1 -0
- package/dist/hooks/use-hydrated.js +7 -0
- package/dist/index.d.ts +15 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -10
- package/dist/internal/agent-orb.d.ts.map +1 -1
- package/dist/internal/agent-orb.js +2 -1
- package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
- package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
- package/dist/internal/assistant-ui/reasoning.js +3 -1
- package/dist/internal/assistant-ui/thread.js +3 -1
- package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-fallback.js +13 -13
- package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-group.js +3 -1
- package/dist/internal/catalog-list.d.ts +14 -0
- package/dist/internal/catalog-list.d.ts.map +1 -0
- package/dist/internal/catalog-list.js +53 -0
- package/dist/internal/empty.d.ts +6 -9
- package/dist/internal/empty.d.ts.map +1 -1
- package/dist/internal/empty.js +24 -22
- package/dist/internal/footer-strip.d.ts +0 -4
- package/dist/internal/footer-strip.d.ts.map +1 -1
- package/dist/internal/footer-strip.js +0 -4
- package/dist/internal/record-menu-items.d.ts +19 -0
- package/dist/internal/record-menu-items.d.ts.map +1 -0
- package/dist/internal/record-menu-items.js +20 -0
- package/dist/internal/settings-save.d.ts +43 -0
- package/dist/internal/settings-save.d.ts.map +1 -0
- package/dist/internal/settings-save.js +147 -0
- package/dist/lib/theme-mode.d.ts +1 -1
- package/dist/lib/theme-mode.js +2 -2
- package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -1
- package/dist/lib/use-copy-to-clipboard.js +1 -0
- package/dist/showcase/assets.d.ts +8 -0
- package/dist/showcase/assets.d.ts.map +1 -0
- package/dist/showcase/assets.js +13 -0
- package/dist/showcase/foundations.d.ts +2 -0
- package/dist/showcase/foundations.d.ts.map +1 -0
- package/dist/showcase/foundations.js +61 -0
- package/dist/showcase/samples.d.ts +21 -0
- package/dist/showcase/samples.d.ts.map +1 -0
- package/dist/showcase/samples.js +48 -0
- package/dist/showcase/showcase.d.ts +10 -0
- package/dist/showcase/showcase.d.ts.map +1 -0
- package/dist/showcase/showcase.js +44 -0
- package/dist/showcase/specimens/actions.d.ts +7 -0
- package/dist/showcase/specimens/actions.d.ts.map +1 -0
- package/dist/showcase/specimens/actions.js +15 -0
- package/dist/showcase/specimens/charts.d.ts +17 -0
- package/dist/showcase/specimens/charts.d.ts.map +1 -0
- package/dist/showcase/specimens/charts.js +104 -0
- package/dist/showcase/specimens/choices.d.ts +21 -0
- package/dist/showcase/specimens/choices.d.ts.map +1 -0
- package/dist/showcase/specimens/choices.js +68 -0
- package/dist/showcase/specimens/compositions.d.ts +39 -0
- package/dist/showcase/specimens/compositions.d.ts.map +1 -0
- package/dist/showcase/specimens/compositions.js +270 -0
- package/dist/showcase/specimens/data.d.ts +31 -0
- package/dist/showcase/specimens/data.d.ts.map +1 -0
- package/dist/showcase/specimens/data.js +111 -0
- package/dist/showcase/specimens/feedback.d.ts +23 -0
- package/dist/showcase/specimens/feedback.d.ts.map +1 -0
- package/dist/showcase/specimens/feedback.js +64 -0
- package/dist/showcase/specimens/index.d.ts +164 -0
- package/dist/showcase/specimens/index.d.ts.map +1 -0
- package/dist/showcase/specimens/index.js +24 -0
- package/dist/showcase/specimens/inputs.d.ts +22 -0
- package/dist/showcase/specimens/inputs.d.ts.map +1 -0
- package/dist/showcase/specimens/inputs.js +60 -0
- package/dist/showcase/specimens/menus.d.ts +20 -0
- package/dist/showcase/specimens/menus.d.ts.map +1 -0
- package/dist/showcase/specimens/menus.js +65 -0
- package/dist/showcase/specimens/navigation.d.ts +22 -0
- package/dist/showcase/specimens/navigation.d.ts.map +1 -0
- package/dist/showcase/specimens/navigation.js +103 -0
- package/dist/showcase/specimens/other.d.ts +26 -0
- package/dist/showcase/specimens/other.d.ts.map +1 -0
- package/dist/showcase/specimens/other.js +73 -0
- package/dist/showcase/specimens/specimen.d.ts +5 -0
- package/dist/showcase/specimens/specimen.d.ts.map +1 -0
- package/dist/showcase/specimens/specimen.js +1 -0
- package/dist/showcase/specimens/status.d.ts +22 -0
- package/dist/showcase/specimens/status.d.ts.map +1 -0
- package/dist/showcase/specimens/status.js +44 -0
- package/dist/showcase/usage.generated.d.ts +16 -0
- package/dist/showcase/usage.generated.d.ts.map +1 -0
- package/dist/showcase/usage.generated.js +1788 -0
- package/dist/standalone/index.js +2 -2
- package/dist/standalone/orb-page.js +1 -0
- package/dist/styles/components.css +21 -0
- package/package.json +8 -3
- package/dist/components/automation-section.d.ts +0 -78
- package/dist/components/automation-section.d.ts.map +0 -1
- package/dist/components/automation-section.js +0 -75
- package/dist/components/catalog-tile.d.ts +0 -19
- package/dist/components/catalog-tile.d.ts.map +0 -1
- package/dist/components/catalog-tile.js +0 -13
- package/dist/components/feedback-state.d.ts +0 -14
- package/dist/components/feedback-state.d.ts.map +0 -1
- package/dist/components/feedback-state.js +0 -65
- package/dist/components/installer-shell.d.ts +0 -25
- package/dist/components/installer-shell.d.ts.map +0 -1
- package/dist/components/installer-shell.js +0 -32
- package/dist/components/settings-form.d.ts +0 -9
- package/dist/components/settings-form.d.ts.map +0 -1
- package/dist/components/settings-form.js +0 -85
|
@@ -0,0 +1,1788 @@
|
|
|
1
|
+
// Generated by scripts/generate-usage.mjs from the components' doc comments.
|
|
2
|
+
// Do not edit: `npm run generate:usage -w @nadicodeai/ui` rewrites it.
|
|
3
|
+
export const USAGE_FAMILIES = [
|
|
4
|
+
"Compositions",
|
|
5
|
+
"Actions",
|
|
6
|
+
"Inputs",
|
|
7
|
+
"Choices",
|
|
8
|
+
"Status",
|
|
9
|
+
"Navigation",
|
|
10
|
+
"Data",
|
|
11
|
+
"Feedback",
|
|
12
|
+
"Menus",
|
|
13
|
+
"Charts",
|
|
14
|
+
"Other",
|
|
15
|
+
];
|
|
16
|
+
export const USAGE = [
|
|
17
|
+
{
|
|
18
|
+
name: "ActivityFeed",
|
|
19
|
+
module: "activity-feed",
|
|
20
|
+
family: "Compositions",
|
|
21
|
+
summary: "What happened to a record, and when: one row per event under its day, newest first.",
|
|
22
|
+
when: "A record's history: a Customer's, a Partner's or an Installation's Activity tab in the Portal, the company wiki's updates in Nadia. Each answers \"what happened, and when?\".",
|
|
23
|
+
instead: 'The steps of one Agent run, read in order, are a RunTimeline; a list of records a person finds and acts on is a CollectionPage; a single "last changed" fact is a RecordTime.',
|
|
24
|
+
behaviour: "The search, filters and window sit right above the rows, kept in the URL by the product. Days stand newest first, each a title and a muted date over one card of rows; a row is the time of day, the actor's 24 px mark, the sentence with a status badge only for an exception, and one muted line of detail. \"Show older events\" follows the last day; there is never a page count. States, first that holds: failed, loading (still rows in the row's shape), no match with Clear filters, nothing yet in one line, the days. Under 900 px the time moves under the sentence. It draws no card header: the tab is the title.",
|
|
25
|
+
words: 'The sentence names the actor in `<strong>`, the action in the past tense and the object as a link that keeps the text\'s colour: "Marco Rinaldi created the Agent Acme Quotes". Day titles are "Today", "Yesterday", then the weekday; dates are the product\'s own ("14 October"). Nothing yet: "No events yet." and what will appear. No match: "No events match these filters.".',
|
|
26
|
+
access: "The toolbar is named by `label`; each day's title is a level-3 heading over a list of its events; while loading, one status named by `loadingLabel` stands for the rows; each time is a `<time>` with its exact moment for assistive technology. A system event has no mark, so nothing empty is announced.",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "AgentProfileCard",
|
|
30
|
+
module: "agent-profile",
|
|
31
|
+
family: "Compositions",
|
|
32
|
+
summary: "The card an Agent's Profile opens with in every product.",
|
|
33
|
+
when: "The head of an Agent's Profile: who she is, what she does, her state, and her model and reasoning beside them.",
|
|
34
|
+
instead: "An Agent in a gallery is `AgentCard`; in a list `AgentListRow`. Another object's page is `ObjectPage`.",
|
|
35
|
+
behaviour: "Her orb at 64, her name with the pencil, her description and her facts on the left; her model and reasoning on the right; the card's footer saves both sides. The pencil turns her name and description into fields in place. A fact being read draws its place; a missing one keeps its label and a dash.",
|
|
36
|
+
words: "Each product brings its own data, fields and words; the shape, sizes and order are this component's. Her state is a word: *Working*, *Waiting for you*.",
|
|
37
|
+
access: "Her name is the page's `h1`, kept as the heading while she is edited; the pencil is named (*Edit Nadia*); the orb is decorative beside her name.",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "CatalogDrawer",
|
|
41
|
+
module: "catalog-drawer",
|
|
42
|
+
family: "Compositions",
|
|
43
|
+
summary: "A catalogue to choose from in the right-side drawer, each entry added from its own row.",
|
|
44
|
+
when: "A person picks one or more things from a list too long for a dialog, the page still behind it: add a skill, add an app to a new Agent.",
|
|
45
|
+
instead: 'The shelf of everything the company holds, on its own page, is a `LibraryShelf`; a setup in steps is a `FormDrawer` with `job="steps"`; a new record from a few fields is a `FormDialog`.',
|
|
46
|
+
behaviour: "The header holds the title, the description and Close; the body holds the search, then the entries in one column under their section titles. It draws one state at a time: the failure with its retry, three still entries while the catalogue loads, no match with a way to clear the search, nothing at all, or the entries. An entry already held shows a muted check and its word in place of Add. The footer's one button closes the drawer.",
|
|
47
|
+
words: 'The title names the job: "Add a skill". The search names what it finds: "Search the hub". Each entry\'s button is "Add"; the held word is "Added"; the footer\'s is "Done".',
|
|
48
|
+
access: "A modal dialog named by its title; focus starts in the search, Escape and Close close it, and focus returns to the opener. The loading entries are one status named by `loadingLabel`.",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "CollectionFilters",
|
|
52
|
+
module: "collection-filters",
|
|
53
|
+
family: "Compositions",
|
|
54
|
+
summary: "The filters in a collection's toolbar: one Add filter button, a chip for each facet in force, and the facets most often narrowed to waiting as dashed chips.",
|
|
55
|
+
when: "A collection or a feed a person narrows by a property its records share: a status, an owner, a kind. It stands in the toolbar after the search and before the sort.",
|
|
56
|
+
instead: "Finding one record by its name is the search. Changing the order is the sort. Switching between sibling collections is the page's tabs.",
|
|
57
|
+
behaviour: "Add filter opens a picker of the facets, then of a facet's values, each searchable; Backspace in an empty search goes back to the facets. A facet in force is a chip that reopens its values, with a button that removes it. A suggested value waits as a dashed chip while its facet is unset and applies in one click. Focus returns to Add filter when a facet is removed. The product keeps each facet's value, in the URL where it has one.",
|
|
58
|
+
words: 'Every string is the product\'s: `copy` names Add filter, the two searches, the empty result, Back and Remove; each facet names itself, its values and its "All" choice.',
|
|
59
|
+
access: "Each chip is a group named by its facet; its remove button reads Remove with the facet's name. The pickers are searchable lists named by what they search.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "CollectionPage",
|
|
63
|
+
module: "collection-page",
|
|
64
|
+
family: "Compositions",
|
|
65
|
+
summary: "A page whose job is a list of records: its title with the page's actions on one row, its sibling collections, one toolbar, then one line per record.",
|
|
66
|
+
when: "A list of records a person finds one of and acts on: Customers, Agents, Skills, Apps, MCP servers, Mailboxes.",
|
|
67
|
+
instead: "Figures compared across records are a DataTable with headings; a list inside another page's section is a RecordList with its heading.",
|
|
68
|
+
behaviour: "Nothing sits under the title. The title row holds at most one secondary, the primary, then the three dots, which open only for two commands or more. A primary that is also the first use's action waits until there are records; while a different primary stays, the first use's action is an outline button. One toolbar holds the search, which grows, then the filters, then the sort; it shows while there are records or a search or filter is set, and is glass only where the rows scroll under it. While a new search, filter or sort is read, the toolbar is busy and, after a second, shows the one waiting line, while the last rows stay. The rows, their states and their loading are the RecordList's; no match is offered only while a search or filter is set.",
|
|
69
|
+
words: 'Every string is the product\'s. The title names the collection in the plural ("Agents"); the search says what it finds ("Find a skill"); no match says what found nothing and offers to clear it ("Clear search", "Clear filters").',
|
|
70
|
+
access: "The title is the page's h1 when the composition draws it. The toolbar is named by `label` and busy while `pending`; the rows are the RecordList's table, named by `label`.",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "CollectionToolbar",
|
|
74
|
+
module: "collection-toolbar",
|
|
75
|
+
family: "Compositions",
|
|
76
|
+
summary: "A collection's control bar: its filters, its search and its sort, over its own rows.",
|
|
77
|
+
when: "The row above a collection's rows that holds its search, filters, sort and status.",
|
|
78
|
+
instead: "A page action never sits here: it is `PageActions` on the title's row. Finding across the product is `CommandDialog`.",
|
|
79
|
+
behaviour: 'Glass on the floating height, held at the top of the scrolling content while the rows pass under it; inside a titled `TableCard`, or with `surface="plain"`, the plain row. A search alone is always the plain row.',
|
|
80
|
+
words: "The label names the collection's tools: *Customer filters*.",
|
|
81
|
+
access: '`role="toolbar"` named by `label`.',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "ConfirmDialog",
|
|
85
|
+
module: "confirm-dialog",
|
|
86
|
+
family: "Compositions",
|
|
87
|
+
summary: "A consequence confirmed before it happens, in a blocking alert dialog.",
|
|
88
|
+
when: "An action removes, disconnects or deletes something, or otherwise cannot be taken back: remove a mailbox, delete an Agent.",
|
|
89
|
+
instead: "An action that can be undone runs at once and offers its undo in a toast; a form of a few fields is a `FormDialog`; a choice from a catalogue is a `CatalogDrawer`.",
|
|
90
|
+
behaviour: "The title names the record, the description the consequence; a failed confirm keeps the dialog open with the catalogue's message and its actions under the description. Cancel then the confirm at the footer's trailing edge, the confirm in the error colour when `destructive`. While `loading` both hold, Escape does not close it, and the confirm says its pending word. The backdrop does not dismiss it.",
|
|
91
|
+
words: 'The title is a statement naming the record, never a question: "Remove pec@acme.it". The description says what stops and what stays. The confirm repeats the verb and the noun, "Remove mailbox", never just "Delete" or "OK".',
|
|
92
|
+
access: '`role="alertdialog"` named by its title and described by its consequence; focus starts on Cancel, Escape cancels, and focus returns to the opener.',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "EntryScene",
|
|
96
|
+
module: "entry-scene",
|
|
97
|
+
family: "Compositions",
|
|
98
|
+
summary: "Nadia's entry screen, contained: the approved picture of the surface behind, the wordmark at the upper left, Nadia's ribbon and her words centred as one group. The screen is black in every theme.",
|
|
99
|
+
when: "Nadia's installer and the desktop's sign-in, start, update and failure screens, which paint the same screen; a page that shows that screen beside other things.",
|
|
100
|
+
instead: "The Portal's entry pages are its funnel frame with the shared entry header; Alveare Server's entry is the HiveScene; a wait inside the product is a WaitingLine.",
|
|
101
|
+
behaviour: "It holds no state and decides nothing: which view is open, the words and when the screen ends belong to whoever mounts it. It fills a box of the window's own shape (`aspectRatio`), so the picture's figure stands on the window's floor (`pictureFeet`). A failure quiets the picture and never removes it. Its children stand in order: the message, the actions, the progress line, the stage list.",
|
|
102
|
+
words: 'The heading names the surface and is never seen. Instructions and status are one plain sentence that changes only when the real stage changes ("Loading your tools").',
|
|
103
|
+
access: "One level-1 heading for the screen, read but not shown; a message that reports work in progress is a status.",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "FormDialog",
|
|
107
|
+
module: "form-dialog",
|
|
108
|
+
family: "Compositions",
|
|
109
|
+
summary: "A new record, or one or two values from a command, in a centred dialog.",
|
|
110
|
+
when: "A person adds a record through a few fields, or changes one or two values a command asks for: new customer, add a mailbox, add an MCP server.",
|
|
111
|
+
instead: 'A record already in a list edits in its row with `RowEditForm`; a choice from a catalogue is a `CatalogDrawer`; a setup in steps with a wait is a `FormDrawer` with `job="steps"`; a consequence is confirmed in a `ConfirmDialog`.',
|
|
112
|
+
behaviour: "Centred over a scrim without blur: the title and its help, the fields in a body that scrolls, then the footer with Cancel and the primary at its trailing edge. A refusal or a failed save sits above the footer and the fields keep what was typed. While its save runs it holds open, Cancel and the primary hold, and the waiting line runs under them.",
|
|
113
|
+
words: 'The title names the job and its object: "New customer", "Add a mailbox". The primary repeats it: "Create customer", "Add mailbox", never "OK" or "Submit".',
|
|
114
|
+
access: "A modal dialog named by its title; focus starts in its first field or `initialFocus`, Escape and Close close it unless the save runs, and focus returns to the opener or `finalFocus`.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "FormDrawer",
|
|
118
|
+
module: "form-drawer",
|
|
119
|
+
family: "Compositions",
|
|
120
|
+
summary: "The right-side drawer for a catalogue or a setup in steps, at one width.",
|
|
121
|
+
when: "Choosing from a catalogue too long for a dialog (through `CatalogDrawer`), or setting something up in several steps with a wait: connect a messaging channel, Telegram's code.",
|
|
122
|
+
instead: "A new record from a few fields is a `FormDialog`; a record already in a list edits in its row with `RowEditForm`; a fact on the record's own page changes in place in its section; a consequence is confirmed in a `ConfirmDialog`.",
|
|
123
|
+
behaviour: 'Opens from the right edge at one width, 560 px (the full width on a compact screen), with the page still behind it; 12 px corners on the edges not flush with the window. The header holds the step ("Step 2 of 3") over the title, the description and Close; the body scrolls between the header and a recessed footer that stays, Cancel then the primary at its trailing edge. Cancel holds while a save runs.',
|
|
124
|
+
words: 'The title names the job and its object: "Connect Telegram", "Add a skill". The step reads "Step N of M". The primary says what it does: "Connect", "Continue", never "OK".',
|
|
125
|
+
access: "A modal dialog named by its title; focus moves inside on open and returns to the opener on close, or to `finalFocus` when the opener is gone. Escape and Close close it; the step is read before the title.",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: "LibraryShelf",
|
|
129
|
+
module: "library-shelf",
|
|
130
|
+
family: "Compositions",
|
|
131
|
+
summary: "A Library shelf: the one line saying what it holds, the search, then the reusable things a person adds, as two-column entries or Agent template cards.",
|
|
132
|
+
when: "A page of reusable things a person adds to an Agent: Skills, Plugins, Agent templates.",
|
|
133
|
+
instead: "Records a person already has and acts on are a CollectionPage; choosing from a catalogue without leaving the page is a CatalogDrawer.",
|
|
134
|
+
behaviour: "Shows, the first that holds: the failure; still entries while the shelf loads; noMatch while the search finds nothing; empty when the shelf holds nothing; then each section's title over its entries, two to a row from md, or the templates three to a row. Each entry has its kind's tile, its name (the link to its page), one line, one fact, one Add control or the word saying it is already added, then its menu. A failed add puts its message in the entry's line and its next steps beside its controls. The search shows unless the shelf is empty.",
|
|
135
|
+
words: "The product words every string: the definition (one sentence on what the shelf holds), the search's label (\"Search skills\"), the loading label, each entry's name, line, Add label and added word, the empty, noMatch and failed messages.",
|
|
136
|
+
access: "Each section is a region named by its h2; entries are list items; loading is a status named by loadingLabel and aria-busy; a failed add is announced as an alert; each entry's menu is named by its label.",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: "ObjectPage",
|
|
140
|
+
module: "object-page",
|
|
141
|
+
family: "Compositions",
|
|
142
|
+
summary: "One object's page: its mark, name, one line and key facts on the page ground, its commands on the name's row, then its sections as cards.",
|
|
143
|
+
when: "One thing a person opened from a list and now reads or acts on: a customer, a partner, an Installation, a Library entry.",
|
|
144
|
+
instead: "A list of records is a CollectionPage; a page of settings only is a SettingsPage; an Agent opens on its AgentProfileCard, the documented exception.",
|
|
145
|
+
behaviour: "The header sits on the page, never in a card: the mark at 64, the name, one line, the facts in one row, and at the trailing edge one secondary action then the three dots; below `md` the actions wrap under the name. The sections follow, 24 apart, each drawing its own states.",
|
|
146
|
+
words: 'The name as the object is called everywhere else; the line says what it is and whose ("Customer of Partner Alpha · since 3 August 2026"); a fact\'s label is a noun ("Plan"), its value the figure; the menu\'s trigger reads "More for {name}".',
|
|
147
|
+
access: "With `headingProps` the name is the page's h1; without them it is text, for a product whose chrome already titles the page. The facts are a description list; the mark is decorative beside the name.",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "ObjectSection",
|
|
151
|
+
module: "object-workspace",
|
|
152
|
+
family: "Compositions",
|
|
153
|
+
summary: "A section of an object's page: a card that owns one decision about the object.",
|
|
154
|
+
when: "A part of an ObjectPage a person reads or changes on its own: a customer's Company details, an Agent's Instructions, a Library entry's source.",
|
|
155
|
+
instead: "Values a person edits and saves together are a SettingsSection; a list of the object's records is a RecordList with its heading; a passing condition is a MessageNotice.",
|
|
156
|
+
behaviour: "A resting card: its title and an optional line, at the trailing edge `meta` (muted) then `action` as an outline button, then its body. No icon in the header.",
|
|
157
|
+
words: 'The title names what the section holds ("Company", "Instructions"); the action is a verb on it ("Edit"); `meta` is a short count or time ("2 of 5 Agents").',
|
|
158
|
+
access: "The title is a heading one level under the page (h2), deeper only under another heading through `headingLevel`.",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: "OverviewPage",
|
|
162
|
+
module: "overview-page",
|
|
163
|
+
family: "Compositions",
|
|
164
|
+
summary: 'The page that answers "what needs attention?": is anything wrong, and where.',
|
|
165
|
+
when: "The landing page of an area a person checks: the Portal's Dashboard, Analytics, Statements, System health, an Agent's Usage.",
|
|
166
|
+
instead: "A list of records a person finds one of is a `CollectionPage`; one record is an `ObjectPage`. Never a stack of previews of every section: each exception links to its owner instead.",
|
|
167
|
+
behaviour: "The reading period on the title row, then the figures in one row of equal `KpiCard`s (four columns from md, fewer when fewer, one column below), then the chart cards, then the exceptions, 16 px apart. It has no states of its own: each card and the exceptions' `RecordList` draw theirs.",
|
|
168
|
+
words: 'The product words every figure, chart and exception. A figure\'s label names its measure ("Active Agents", "Spend"), the chart\'s title names its reading ("Usage"), and the exceptions\' heading says what they are ("Needs attention").',
|
|
169
|
+
access: "Each chart card is a named section at the page's heading level, and the exceptions carry their own heading; figures are text, never colour alone.",
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "PageHeader",
|
|
173
|
+
module: "page-header",
|
|
174
|
+
family: "Compositions",
|
|
175
|
+
summary: "The top of a product page: its title, and the page's actions on the title's row.",
|
|
176
|
+
when: "The top of every collection and working page: the title at heading size, `PageActions` at the trailing edge of its row.",
|
|
177
|
+
instead: "An object's own header is `ObjectPage`'s. The path above it is the top bar's `Breadcrumb`; filters, search and sort sit in the toolbar below.",
|
|
178
|
+
behaviour: "Nothing explains the page under its title. The actions arrive through the `PageActions` slot, so the page draws its commands once.",
|
|
179
|
+
words: "The title is the page's name as the sidebar writes it: *Customers*, *Agents*.",
|
|
180
|
+
access: "The title is the page's `h1`; DOM order is visual order.",
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "RecordList",
|
|
184
|
+
module: "record-list",
|
|
185
|
+
family: "Compositions",
|
|
186
|
+
summary: "One line per record, on one resting card: its identity mark and name over what it is, a few comparable facts, a status only for the exception, when it happened, the row's one command, and its three dots last.",
|
|
187
|
+
when: "A list of records inside another page: an Overview's exceptions, an object page's \"Needs attention\", any section that lists records a person opens or acts on. A page whose whole job is the list is a `CollectionPage`, which draws this.",
|
|
188
|
+
instead: "Figures compared across records, read by their column headings, are a `DataTable`. Events in time are an `ActivityFeed`. Reusable things a person adds from a catalogue are a `LibraryShelf`.",
|
|
189
|
+
behaviour: "Each row reads left to right at fixed measures: the mark and name (at most a third of the row), facts on one line, the status in its 150 px slot only when the record is the exception, the time right-aligned in tabular figures with the exact moment on hover, the row command at most 192 px wide with its label cut short, then the three dots, or a muted chevron when the row only opens. On a card too narrow for them (768 px, or 1024 px for seven columns or more or a row command), the facts, the status and the time move under the record's line, leaving out a fact or status the record does not have, and the name and its commands keep theirs. A menu of one command that is not destructive, with no row command, is that command's outline button. With `open` the whole row is one target. A failed or refused action of the record replaces its detail line, with its next steps beside its commands; the record being edited opens its form under its own line. While the records load, three still skeleton rows hold the place; then, first that holds: the failed read, no match, the empty state, the rows. A list with no records and no empty state draws nothing.",
|
|
190
|
+
words: 'Every string is the product\'s: `label` names the list, a time\'s `phrase` writes its sentence ("Updated {when}"), `missing` is what a screen reader hears for a record with no time, the menu\'s `label` reads "More for {record}". A status is the exception\'s word ("Needs attention"), never "Active" on every row.',
|
|
191
|
+
access: "A table named by `label`, its column headings read by assistive technology only. The row link carries `open.label`; the three dots carry the menu's `label`, and the menu's first line names the record. The loading rows are a busy status named by `loadingLabel`.",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "RecordSheet",
|
|
195
|
+
module: "record-sheet",
|
|
196
|
+
family: "Compositions",
|
|
197
|
+
summary: "One record from a list, looked at in a sheet at the right edge, then back to the list.",
|
|
198
|
+
when: "A list's record holds more than its row shows and is only read, not changed: a Stripe event in Billing, a usage row.",
|
|
199
|
+
instead: "A record changed from its list edits in its row with `RowEditForm`; a record with sections and commands of its own has its own page, an `ObjectPage`; a choice from a catalogue is a `CatalogDrawer`.",
|
|
200
|
+
behaviour: "Opens from the right, 420 px wide and 8 px from the window, the list still behind it, with 12 px corners on its free edges. The header holds the record's name, one muted line and Close; the body scrolls through its facts as labelled values, then the read-only payload with its copy button; the footer holds one command to the record's owner. It has no states of its own: it opens only on a record.",
|
|
201
|
+
words: "The title is the record's own name, as its row shows it. The footer's command names where it goes: \"Open Beta Studio\".",
|
|
202
|
+
access: "A modal dialog named by its title; Escape and Close close it, and focus returns to the row it opened from (`finalFocus`). The payload is a read-only text area named by its label.",
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: "RowEditForm",
|
|
206
|
+
module: "row-edit-form",
|
|
207
|
+
family: "Compositions",
|
|
208
|
+
summary: "A record's form opened inside its own row, the rows above and below staying where they are.",
|
|
209
|
+
when: "A person changes a record they see in a list: edit a mailbox, a task, an MCP server, a channel. It is a `RecordList`'s `editor` or a `DataTable`'s `rowEditor`.",
|
|
210
|
+
instead: "A new record from a few fields is a `FormDialog`; a fact on the record's own page changes in place in its section; a choice from a catalogue is a `CatalogDrawer`.",
|
|
211
|
+
behaviour: "The fields open under the record's line; a refusal or a failed save sits above the footer. The footer, one tone below, holds an optional hint at its leading edge, then Cancel and the save rightmost. Save stays off until a field changes: the caller sets `submit.disabled` from its own fields. Cancel holds while the save runs, and the waiting line runs under them.",
|
|
212
|
+
words: 'The save says what it does, "Save"; Cancel is "Cancel". The hint is a way on, such as where to find a token, never a restatement of a field\'s label.',
|
|
213
|
+
access: "A form in the row's place, which the caller moves focus into. The running save is marked busy, and the line saying why the save cannot run yet is its description (`submit.describedBy`).",
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "SettingsPage",
|
|
217
|
+
module: "settings-page",
|
|
218
|
+
family: "Compositions",
|
|
219
|
+
summary: "A page of settings: a centred column of section cards, each saving its own values.",
|
|
220
|
+
when: "A place whose job is changing how something behaves: an account's profile, a company's identity, Nadia's notifications.",
|
|
221
|
+
instead: "One object's page with a settings card among its sections is an ObjectPage; Theme and Language, which apply on change, stay in the account menu.",
|
|
222
|
+
behaviour: "The sections stack 20 apart in a centred column at most 56rem wide. The page draws no header and no save of its own: each SettingsSection saves from its footer.",
|
|
223
|
+
words: '`title` names the place as the navigation does ("Profile"); the sections\' titles and lines carry the rest.',
|
|
224
|
+
access: "`title` becomes a visually hidden h1 for a product whose chrome shows the place without a heading; leave it out where the chrome already draws the h1.",
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: "SettingsSection",
|
|
228
|
+
module: "settings-section",
|
|
229
|
+
family: "Compositions",
|
|
230
|
+
summary: "A card of related settings that says what changing them does and saves them from its own footer.",
|
|
231
|
+
when: "A few related values a person changes and saves together, on a SettingsPage or as a section of an ObjectPage: Personal details, Company identity, Notifications.",
|
|
232
|
+
instead: "Read-only values are a SettingsFactsSection; Theme and Language, which apply on change, live in the account menu; a record's edit in a list is a RowEditForm.",
|
|
233
|
+
behaviour: "With `save`: Save stays disabled until a field differs from what is saved, says `pendingLabel` while saving with Cancel held beside it, then the footer shows the ok check and `savedLabel` until the next change. A failure keeps every value and shows under its field until that field changes, or above the footer until the next save. A `cancel` that runs work of its own says its `pendingLabel` while `pending`. Without `save`, the footer holds `footerHint` and `footer`, and is left out when both are.",
|
|
234
|
+
words: 'The title names the values ("Personal details"); the description says what changing them does, in one line; the hint says where the save applies ("Saved for every device you sign in on."); Save, Saving and Saved come from the product\'s catalogue.',
|
|
235
|
+
access: "The title is the section's h2 and names the form that saves it. The footer's hint and saved line are one status, announced politely; a failure under a field marks the control invalid and describes it.",
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: "Button",
|
|
239
|
+
module: "button",
|
|
240
|
+
family: "Actions",
|
|
241
|
+
summary: "The package's one button: five looks at 36 px, the label naming the result.",
|
|
242
|
+
when: "A command that changes something or opens a surface. One `default` per surface: the thing this page or dialog is for.",
|
|
243
|
+
instead: "Going somewhere is a link drawn with `buttonVariants`, and a link inside a sentence is `TextLink`, blue and underlined. A record's secondary commands go in `ActionMenu`. An on/off value is a `Switch`.",
|
|
244
|
+
behaviour: "Enter and Space run it. A press settles at 97% scale in 180 ms, except on a trigger that opens a popup. Disabled is 50% and ignores the pointer, and its reason is written beside it. On touch the target grows to 44 px while the drawing stays 36. `sm` and `xs` are for a control nested in dense content, such as a composer or an input group, never for chrome.",
|
|
245
|
+
words: "Sentence case, verb + noun naming the result: *Invite member*, *Remove mailbox*; never OK, Submit or Confirm. Italian runs about a third longer (*Rimuovi casella*), so a footer leaves room and a label never wraps.",
|
|
246
|
+
access: 'A native `button`, `type="button"` unless it submits. An icon-only button carries an `aria-label` naming action and target. Focus is the 2 px ink outline at 2 px offset, drawn once by the base layer, never repainted.',
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: "ButtonGroup",
|
|
250
|
+
module: "button-group",
|
|
251
|
+
family: "Actions",
|
|
252
|
+
summary: "Two or three buttons that share one edge and read as one control.",
|
|
253
|
+
when: "Two or three buttons that act on one thing and read as one control: an applied filter with its remove, a pager. A split action (*Download PDF* with its chevron for CSV and Excel) is a group of a `Button` and a `DropdownMenu` trigger.",
|
|
254
|
+
instead: "Choosing one value of several is a `RadioGroup` drawn as a segmented control, or a `ToggleGroup`. Unrelated actions stay separate buttons 8 px apart. A destructive command never sits in a split, neither as the default nor in its menu.",
|
|
255
|
+
behaviour: "One shared edge between members and rounded outer corners only. The focused member rises above its neighbours so its whole outline shows. Each member keeps its own tab stop. In a split, the left half runs the default and the chevron opens the menu with the default listed first and checked.",
|
|
256
|
+
words: "Each member is labelled on its own. The group's name says what it holds: *Status filter*, *Pages*. A split's default names its variant (*Download PDF*); its chevron names the family: *More download formats*.",
|
|
257
|
+
access: '`role="group"` with an `aria-label`. An icon member names its action and target: *Remove filter: Status*. A split\'s chevron has `aria-haspopup="menu"`, `aria-expanded` and its own `aria-label`.',
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "CopyButton",
|
|
261
|
+
module: "copy-button",
|
|
262
|
+
family: "Actions",
|
|
263
|
+
summary: "Copies an exact value someone will paste elsewhere.",
|
|
264
|
+
when: "An exact value someone will paste elsewhere: an Agent ID, a server address, a command. A shell prompt shown before a command stays outside the copied value.",
|
|
265
|
+
instead: "Several lines of code are a `CodeBlock`. Ordinary prose never gets copy chrome. A secret needs its reveal policy first.",
|
|
266
|
+
behaviour: "Copies the full underlying value even when the shown one is shortened. The check shows for 2 s, and only after the clipboard confirms. A failure shows the alert mark and the button stays for a retry. Sizes: `icon` (36), `icon-sm` (32) after a value, `icon-xs` (24) inside a field.",
|
|
267
|
+
words: 'Three catalogue strings: `copyLabel` names the target ("Copy Agent ID"), `copiedLabel` ("Copied"), `copyFailedLabel` ("Couldn\'t copy").',
|
|
268
|
+
access: '`aria-label` is the copy label and does not change. The result is read once from a hidden `role="status"`. The button stays focusable while it works.',
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: "PageActions",
|
|
272
|
+
module: "page-actions",
|
|
273
|
+
family: "Actions",
|
|
274
|
+
summary: "A page's actions, drawn on its title's row. Only the page shown last owns the row: a page kept hidden for a quick return gives the row back. Outside a `PageActionsHostProvider`, they render where they stand.",
|
|
275
|
+
when: "The actions of a collection, an object or an overview page, on the title's row at its trailing edge. A Configuration page has none: each section saves from its footer.",
|
|
276
|
+
instead: "A row's actions are the row's one button and its `ActionMenu`. A collection toolbar holds search and filters, never a page action.",
|
|
277
|
+
behaviour: "Takes `period`, `secondary`, `primary` and `menu` and draws their order and variants itself: the period, outline, default, then the three dots last. The menu needs two commands or more; a single extra command is the secondary. A destination outside the product ends in the arrow. A running command keeps its place and icon, says its pending word and holds.",
|
|
278
|
+
words: 'The primary is the page\'s main job as verb and noun: "Invite member", "New Agent". The pending word is its -ing form: "Inviting member". The menu names the page\'s record at its top and keeps the destructive command last, after a divider.',
|
|
279
|
+
access: 'DOM order is visual order. A command whose label does not name its target carries `accessibleName`. A running command is `aria-busy` and keeps focus. The three dots carry "More for {record}"; the menu returns focus to them when it closes.',
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: "Calendar",
|
|
283
|
+
module: "calendar",
|
|
284
|
+
family: "Inputs",
|
|
285
|
+
summary: "A month grid for choosing a day or a range of days.",
|
|
286
|
+
when: "A date or a window whose day and month matter. A chart or a report's window is one `DateRangeControl` in its toolbar, which opens this calendar from its *Custom* preset.",
|
|
287
|
+
instead: "A row of range buttons is never drawn; the presets live in one select. A time of day or a recurring schedule is its own field, not a calendar.",
|
|
288
|
+
behaviour: "The first click starts a range, the second ends it. 28 px days, Monday first in Italian, ends in ink, today in the muted fill. Arrow keys move by day, Page Up and Down by month.",
|
|
289
|
+
words: "Dates are written in the reader's locale (*7 Oct – 13 Oct*, *7–13 ott*), never the ISO pair a URL stores.",
|
|
290
|
+
access: "A grid of day buttons, each named with its full date. Focus goes into the grid when it opens and back to its trigger when it closes, and the chosen range is read out.",
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: "CollectionSearch",
|
|
294
|
+
module: "collection-search",
|
|
295
|
+
family: "Inputs",
|
|
296
|
+
summary: "The search a collection toolbar fills its row with.",
|
|
297
|
+
when: "Finding a record inside one collection, at the start of its toolbar.",
|
|
298
|
+
instead: "Finding anything across the product is `CommandDialog`. Narrowing by a facet is `CollectionFilters`. A free value in a form is `Input`.",
|
|
299
|
+
behaviour: "Results stay on screen while a search updates. Escape clears only while the box holds the interaction and has a value; otherwise it closes the overlay as usual.",
|
|
300
|
+
words: "The search's label is what it finds, also shown as its placeholder: *Find a skill*, *Search the hub*.",
|
|
301
|
+
access: 'The input carries `aria-label` from `label` and `type="search"`; the search mark is decorative.',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: "Field",
|
|
305
|
+
module: "field",
|
|
306
|
+
family: "Inputs",
|
|
307
|
+
summary: "A control with its label, its help and its error, tied together.",
|
|
308
|
+
when: "Every control with a name: it ties the label, the help and the error to the control. Inside a settings section `SettingsField` does it and hands the control its `controlProps`. A rich choice tile is a `FieldLabel` holding a `Field` with its radio or checkbox.",
|
|
309
|
+
instead: "A group of radios or checkboxes is a `FieldSet` with a `FieldLegend`. A whole save group is `SettingsSection`.",
|
|
310
|
+
behaviour: "Label, then help, then the error, then the control, 8 px apart. Invalid turns the label and message red and puts the red edge and outline on the control. Validate on submit or on leaving a field, then update the message as the value is corrected.",
|
|
311
|
+
words: "The help says what the setting changes, in one sentence. The error says how to fix it, not what went wrong: *Enter a full address, like name@company.it.* A disabled field says why.",
|
|
312
|
+
access: '`FieldError` is `role="alert"`. The control carries `id`, `aria-invalid`, `aria-describedby` (help, then error), `disabled` and `required`.',
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: "Form",
|
|
316
|
+
module: "form",
|
|
317
|
+
family: "Inputs",
|
|
318
|
+
summary: "A react-hook-form form whose fields bind their label, help and message for the reader.",
|
|
319
|
+
when: "A client form whose values, validation and submit run through react-hook-form: `FormField` binds a control, `FormMessage` shows its error.",
|
|
320
|
+
instead: "A settings group that saves on its own is `SettingsSection`. A short form in a dialog is `FormDialog`; one in a row is `RowEditForm`. A form with no client validation is a plain `form` with `Field`.",
|
|
321
|
+
behaviour: 'Validation runs on submit and on leaving a field, then updates while the value is corrected. A failed save keeps every value. The submit is `type="submit"`, so Enter in a field submits.',
|
|
322
|
+
words: "Messages come from the product's catalogue or schema: how to fix the value, not what went wrong.",
|
|
323
|
+
access: "`FormControl` gives the control its `id`, `aria-invalid` and `aria-describedby` (help, then message); `FormMessage` is read when it appears.",
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: "Input",
|
|
327
|
+
module: "input",
|
|
328
|
+
family: "Inputs",
|
|
329
|
+
summary: "One line of free text, edged in the input grey.",
|
|
330
|
+
when: "One free-form value on one line: a name, an address, a number.",
|
|
331
|
+
instead: "Text with a fixed prefix, an icon or a button inside is `InputGroup`. Several lines are `Textarea`. A known set of values is a select, radios or a combobox.",
|
|
332
|
+
behaviour: "36 px, edged in the `input` role's grey with no shadow, 6 px corners. Focus is the 2 px outline. Invalid keeps a red edge and a red outline even without focus. Disabled is 50% on a half-grey fill. The value survives a failed save.",
|
|
333
|
+
words: "The label is a noun in sentence case with no colon. The placeholder is an example (*Bizeta Arredamenti*), never the label or an instruction. In a configuration section the box stops at 20 rem under its label.",
|
|
334
|
+
access: "A visible `label` tied by `id`, the help and the error joined through `aria-describedby`, `aria-invalid` when wrong. Use the right `type`, `autocomplete` and `inputMode`.",
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
name: "InputGroup",
|
|
338
|
+
module: "input-group",
|
|
339
|
+
family: "Inputs",
|
|
340
|
+
summary: "One input box with something fixed inside it: a mark, a prefix, a button.",
|
|
341
|
+
when: "A single-line value with something fixed inside the box: a search mark, a clear button, a prefix like *https://*, a copy button.",
|
|
342
|
+
instead: "A collection's search is `CollectionSearch`, never a hand-built group. A plain value is `Input`. Many known values to filter is `Combobox`.",
|
|
343
|
+
behaviour: "The group draws the edge and the focus outline for the input inside it. The clear button empties the value and puts focus back in the box. Escape clears only while the box holds the interaction and has a value; otherwise it closes the overlay as usual.",
|
|
344
|
+
words: "Prefix and suffix are literal text, never the label. An inline button names what it does: *Clear search*, *Copy address*.",
|
|
345
|
+
access: '`role="group"` around the box. The input inside keeps its own label. Inline buttons are named: *Clear search*, *Copy address*.',
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
name: "InputOTP",
|
|
349
|
+
module: "input-otp",
|
|
350
|
+
family: "Inputs",
|
|
351
|
+
summary: "A fixed-length code typed into one slot per character.",
|
|
352
|
+
when: "A fixed-length code a person types: the two-factor code at the Portal's sign-in.",
|
|
353
|
+
instead: "A code a person only compares between two screens is `PairingCode`. A long token is `Input` with a copy or paste action.",
|
|
354
|
+
behaviour: "One real input behind the slots: paste fills them all, Backspace walks back. The active slot carries the focus outline and a still caret. A wrong code turns the group red and keeps the digits so the person can correct them. Resend follows the product's real policy.",
|
|
355
|
+
words: "The label says where the code comes from. The error says what to do: *That code didn't match. Check the newest code in your app.*",
|
|
356
|
+
access: 'One labelled input with `autocomplete="one-time-code"` and `inputMode="numeric"`. The separator is decorative to the reader.',
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
name: "Label",
|
|
360
|
+
module: "label",
|
|
361
|
+
family: "Inputs",
|
|
362
|
+
summary: "The visible name of one control.",
|
|
363
|
+
when: "A control standing on its own that needs a visible name: a checkbox's sentence, a switch's setting.",
|
|
364
|
+
instead: "A control inside a form takes `FieldLabel` through `Field`; a group of controls takes `FieldLegend`. A short tag of metadata is `MetaLabel`.",
|
|
365
|
+
behaviour: "Sits beside or above its control and dims with it when the control is disabled. Clicking it moves to its control.",
|
|
366
|
+
words: "A noun or a positive statement in sentence case, no colon: *Approvals*, *Send a copy to the person who asked*.",
|
|
367
|
+
access: "A `label` tied to its control by `htmlFor`. Never replaced by a placeholder or overridden by another `aria-label`.",
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: "NativeSelect",
|
|
371
|
+
module: "native-select",
|
|
372
|
+
family: "Inputs",
|
|
373
|
+
summary: "The platform's own select, drawn as our input box.",
|
|
374
|
+
when: "A long fixed list inside a native form, where the platform's own picker serves best: a time zone, a country.",
|
|
375
|
+
instead: "Two or three options are radios or a segmented control. Up to about ten, drawn in our style, is `Select`. A list people type into is `Combobox`.",
|
|
376
|
+
behaviour: "Same box as `Input`, the chevron 10 px from the edge in the muted grey. It opens the system's list, with native keyboard and typing. As an uncontrolled field it keeps a saved value instead of snapping back to the page's first default.",
|
|
377
|
+
words: "The label names the thing chosen (*Time zone*). A placeholder option is distinct from a real one and never preselected as if chosen.",
|
|
378
|
+
access: "A real `select` with a visible label; option groups are `optgroup`. The chevron is decorative.",
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: "SettingsField",
|
|
382
|
+
module: "settings-section",
|
|
383
|
+
family: "Inputs",
|
|
384
|
+
summary: "One setting: its label and help above its control, and what went wrong under it.",
|
|
385
|
+
when: "A value inside a SettingsSection: a name, an address, a choice, a switch.",
|
|
386
|
+
instead: "A field of a drawer's or a dialog's form is a Field from the form's own owner; a read-only value is a fact in a SettingsFactsSection.",
|
|
387
|
+
behaviour: 'The control is 20rem wide under its label and help by default; a switch row passes `orientation="horizontal"` and sits at the end of its label\'s row at its own width. A validation `error`, or a failed save about this field, shows under the control and marks it invalid.',
|
|
388
|
+
words: 'The label is a noun for the value ("Display name"); the help is one line saying what it is for or where it shows; an error says what to do next.',
|
|
389
|
+
access: "The control receives its id, `aria-invalid` and `aria-describedby` through `controlProps`, so the label, help and error are read with it.",
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
name: "Slider",
|
|
393
|
+
module: "slider",
|
|
394
|
+
family: "Inputs",
|
|
395
|
+
summary: "A bounded number chosen by a thumb's position on a track.",
|
|
396
|
+
when: "A bounded number where the position matters more than the digit: a limit, a share.",
|
|
397
|
+
instead: "An exact number is `Input`; pair the two when precision counts. A few named levels are radios.",
|
|
398
|
+
behaviour: "A 4 px track, the filled part in ink, a 12 px thumb edged in the input grey. Hover, drag and focus outline the thumb. Arrows step, Page Up and Down jump, Home and End reach the bounds. The thumb's touch target is 44 px.",
|
|
399
|
+
words: "The label names the quantity; the current value and its unit are always written beside it (*€ 400*). The help states the bounds and the step.",
|
|
400
|
+
access: '`role="slider"` with a name, min, max and `aria-valuetext` carrying the unit.',
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
name: "Textarea",
|
|
404
|
+
module: "textarea",
|
|
405
|
+
family: "Inputs",
|
|
406
|
+
summary: "Several lines of free text that grow with their content.",
|
|
407
|
+
when: "Several lines of free text: an Agent's instructions, a description, notes.",
|
|
408
|
+
instead: "One line is `Input`. Code or a value to copy is `CodeBlock`, read-only.",
|
|
409
|
+
behaviour: "At least 64 px, then it grows with its content (`field-sizing: content`). The same edge, focus, invalid and disabled as `Input`. Whitespace is kept exactly; nothing trims it. A character count shows only when a real limit exists.",
|
|
410
|
+
words: "The label names the content (*Instructions*); the help says who reads it and when. The placeholder is a short example, not a paragraph.",
|
|
411
|
+
access: "A visible label tied by `id`; help and error through `aria-describedby`. In a dialog, the footer's Save stays reachable while the box grows.",
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: "Checkbox",
|
|
415
|
+
module: "checkbox",
|
|
416
|
+
family: "Choices",
|
|
417
|
+
summary: "A box that is checked, unchecked or mixed.",
|
|
418
|
+
when: "Independent yes-or-no choices in a form, an acknowledgment before a step, selecting rows.",
|
|
419
|
+
instead: "A setting that is on or off is a `Switch`. One of several is a `RadioGroup`. Several values from a long list is a multi-select.",
|
|
420
|
+
behaviour: "Unchecked is only the input-grey edge, showing the surface beneath. Checked fills with ink and a 14 px check; mixed shows a minus and is worked out from the rows below. The label toggles it too, and on touch the target is 44 px. A required acknowledgment is checked on submit.",
|
|
421
|
+
words: "The label says what is true when checked, positively: *Send a copy to the person who asked*, not *Don't send*. A related set gets a legend.",
|
|
422
|
+
access: '`role="checkbox"` with `aria-checked` true, false or mixed. A row\'s box is named for its record: *Select pec@acme.it*. A set sits in a `FieldSet` with its legend.',
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
name: "CollectionSort",
|
|
426
|
+
module: "collection-sort",
|
|
427
|
+
family: "Choices",
|
|
428
|
+
summary: "The order a collection's rows are read in, at the toolbar's trailing edge.",
|
|
429
|
+
when: "A collection whose rows can be read in more than one order: newest, name, cost.",
|
|
430
|
+
instead: "Sorting by a column of a comparison table is `DataTable`'s own header. Narrowing rows is `CollectionFilters`.",
|
|
431
|
+
behaviour: "An outline button names the order in force; its menu offers the others as radio rows with the current one checked. Choosing the current order changes nothing. It renders nothing without options.",
|
|
432
|
+
words: "The label says what the control does (*Sort by*); each option names an order: *Newest first*, *Name*.",
|
|
433
|
+
access: "The trigger reads the label and the current order: *Sort by: Newest first*. The options are menu radio items.",
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: "Combobox",
|
|
437
|
+
module: "combobox",
|
|
438
|
+
family: "Choices",
|
|
439
|
+
summary: "Type to find one value, or several, in a known set.",
|
|
440
|
+
when: "Typing to find in a known set: assign an Agent, choose a time zone, add several Agents at once with `multiple`.",
|
|
441
|
+
instead: "A short fixed list is a `Select`. Free text is an `Input`. Narrowing a collection is `CollectionFilters`.",
|
|
442
|
+
behaviour: "Typing filters the list. Loading and no match are different states; the chosen value stays while results load. Enter picks the highlighted row and never submits the form around it. Clear empties the box and keeps focus there. With `multiple`, each choice is a chip with its own remove; Backspace in an empty box removes the last.",
|
|
443
|
+
words: "The hint is scoped: *Find an Agent*. No match quotes the query: *No Agent matches “Xy”.* A chip reads as the record's name.",
|
|
444
|
+
access: "A visible label; combobox and listbox roles; each chip's remove is named: *Remove Acme Quotes*. An Agent's orb in a row is a decorative mark beside her name.",
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
name: "ModelSelect",
|
|
448
|
+
module: "agent-profile",
|
|
449
|
+
family: "Choices",
|
|
450
|
+
summary: "A model chosen from a list, each read with its maker's mark.",
|
|
451
|
+
when: "Choosing the model an Agent runs on, from the models the product offers.",
|
|
452
|
+
instead: "A model shown, not chosen, is `ModelIdentity`. A list people search across many makers is a `Combobox`.",
|
|
453
|
+
behaviour: "A `Select` whose trigger and every option read the model as `ModelIdentity` does: the maker's mark, one name, the muted maker. It shows `placeholder` until a model is chosen.",
|
|
454
|
+
words: "Model names come from `modelDisplayName`, or the product's own `nameOf` when its runtime names models itself. The placeholder says what to choose: *Choose a model*.",
|
|
455
|
+
access: "The trigger takes a visible label; listbox and option roles from Base UI; the marks are decorative beside the names.",
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
name: "RadioGroup",
|
|
459
|
+
module: "radio-group",
|
|
460
|
+
family: "Choices",
|
|
461
|
+
summary: "One option of a few, all shown at once.",
|
|
462
|
+
when: "One of 2 to 6 options that exclude each other, all shown at once.",
|
|
463
|
+
instead: "Options that each need a sentence are choice tiles. Seven or more is a `Select`; a list to search is a `Combobox`. Another view of the same thing is `Tabs`.",
|
|
464
|
+
behaviour: "One tab stop for the group; the arrows move and choose. The chosen circle fills with ink and a white 8 px dot. Preselect the safe option when there is one; leave a consequential choice empty until the person makes it.",
|
|
465
|
+
words: "Options are parallel phrases in sentence case with no end punctuation: *Only me*, *Everyone in the company*. The legend names the setting; it does not ask a question.",
|
|
466
|
+
access: '`role="radiogroup"` named by its legend, each radio by its label. A disabled option shows why in its own help line.',
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
name: "SegmentedChoice",
|
|
470
|
+
module: "agent-profile",
|
|
471
|
+
family: "Choices",
|
|
472
|
+
summary: "One choice among a few short levels, drawn as segments that share a row.",
|
|
473
|
+
when: "One of two to five short levels a person compares at a glance, such as an Agent's reasoning: Default, Low, Medium, High.",
|
|
474
|
+
instead: "Options that each need a sentence are choice tiles. Seven or more is a `Select`. The theme is `ThemeModeSwitcher`.",
|
|
475
|
+
behaviour: "A `RadioGroup` drawn with the toggle classes: one outline, one seam between members, the chosen one in the selection fill. Arrows move and choose; it applies through the form it sits in.",
|
|
476
|
+
words: "Each segment is one or two words of equal weight, in sentence case.",
|
|
477
|
+
access: "A `radiogroup` named by its label; each segment a radio named by its word.",
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
name: "Select",
|
|
481
|
+
module: "select",
|
|
482
|
+
family: "Choices",
|
|
483
|
+
summary: "A short fixed list in our style, opened from a trigger that shows the choice.",
|
|
484
|
+
when: "Four to about ten fixed options in our style, each short enough to need no sentence: how often a task runs.",
|
|
485
|
+
instead: "Two or three options are radios or a segmented control. A list to type into is a `Combobox`. Inside a native form a long list is `NativeSelect`.",
|
|
486
|
+
behaviour: "The trigger shows the chosen value; the list floats under it with 12 px corners and a check at the chosen row's end. Arrows, typing, Enter, Escape. A placeholder reads in the muted grey and is never an option.",
|
|
487
|
+
words: "Options are parallel phrases in sentence case: *Every hour*, *Every weekday*. The trigger never says *Select…*.",
|
|
488
|
+
access: "A visible label tied to the trigger; listbox and option roles from Base UI; focus returns to the trigger on close.",
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
name: "Switch",
|
|
492
|
+
module: "switch",
|
|
493
|
+
family: "Choices",
|
|
494
|
+
summary: "A setting that is on or off.",
|
|
495
|
+
when: "A setting that is either on or off, inside a settings section that saves.",
|
|
496
|
+
instead: "Choosing or agreeing to something is a `Checkbox`. A tool button that stays pressed is a `Toggle`. Choosing between named values is a `RadioGroup`.",
|
|
497
|
+
behaviour: "Off is the input grey, on is ink; the thumb travels 16 px. Space flips it. On a settings page the change waits for the section's Save, which lights up; only Theme and Language in the account menu apply at once. A failed save leaves the switch showing the true state.",
|
|
498
|
+
words: "The label names what on means: *Approvals*, with help saying when. Never *Enable approvals*, and no On/Off text beside the switch.",
|
|
499
|
+
access: '`role="switch"` with `aria-checked`. The name is the visible label and stays the same in both states. `sm` only inside a dense row.',
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
name: "ThemeModeSwitcher",
|
|
503
|
+
module: "theme-mode-switcher",
|
|
504
|
+
family: "Choices",
|
|
505
|
+
summary: "The three appearances side by side, each with its glyph and its name.",
|
|
506
|
+
when: "An Appearance setting on a settings page, where the choice has room to show its names.",
|
|
507
|
+
instead: "Inside a menu, the same choice is ThemeModeMenu; a choice that is not the appearance is a RadioGroup or a ToggleGroup.",
|
|
508
|
+
behaviour: "Exclusive: one mode is selected, and choosing one applies it at once with no Save. The order is System, Light, Dark everywhere.",
|
|
509
|
+
words: 'The setting\'s name, then each mode\'s name from the product\'s catalogue: "System", "Light", "Dark".',
|
|
510
|
+
access: "A radio group named by `aria-label`; each mode is a radio with its name, moved through with the arrow keys.",
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
name: "Toggle",
|
|
514
|
+
module: "toggle",
|
|
515
|
+
family: "Choices",
|
|
516
|
+
summary: "A button that stays pressed.",
|
|
517
|
+
when: "A button that stays pressed, where pressing is the action: pin a chat, mute a thread, show hidden rows in a toolbar.",
|
|
518
|
+
instead: "A setting saved with its section is a `Switch`. Choosing one value of several is a `RadioGroup`, drawn segmented when it is short.",
|
|
519
|
+
behaviour: "Space or Enter flips `aria-pressed`. Pressed takes the accent fill and weight 600; the label does not change. Hover is the muted fill. Disabled is 50%.",
|
|
520
|
+
words: "The label is the action and stays the same in both states: *Pin*, never *Pinned* or *Unpin*.",
|
|
521
|
+
access: "A `button` with `aria-pressed`. An icon-only toggle names what it does: *Pin chat*.",
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
name: "ToggleGroup",
|
|
525
|
+
module: "toggle-group",
|
|
526
|
+
family: "Choices",
|
|
527
|
+
summary: "Pressed buttons that belong together.",
|
|
528
|
+
when: "Pressed buttons that belong together: a list or grid view, which details a chat shows.",
|
|
529
|
+
instead: "A segmented control that sets a value, such as the theme or a period, is a `RadioGroup` drawn with the toggle classes, as `ThemeModeSwitcher` does. Panels of one object are `Tabs`.",
|
|
530
|
+
behaviour: "Spacing 0 joins the members into one outline with one seam; spacing 2 keeps them 8 px apart. Single or multiple pressed. Arrow keys move between members; Space presses.",
|
|
531
|
+
words: "Text members are short words of equal weight. Icon members always carry a name: *List*, *Grid*.",
|
|
532
|
+
access: '`role="group"` with a name; each member a button with `aria-pressed`.',
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
name: "ActionStatus",
|
|
536
|
+
module: "action-status",
|
|
537
|
+
family: "Status",
|
|
538
|
+
summary: "A control's three words on one action: what it does, what it is doing, what it did.",
|
|
539
|
+
when: "A control that reports its own action: what it does, what it is doing, what it did. Waits under about a second.",
|
|
540
|
+
instead: "The record's resulting state is a `StatusBadge`. A wait past a second adds one waiting line beside the work. An Agent's work is her orb.",
|
|
541
|
+
behaviour: "Saving keeps the idle icon, the size and the place; only the word changes. The caller sets `disabled` and `aria-busy`. Done shows the check.",
|
|
542
|
+
words: "Verb and noun idle (*Save changes*), the verb in progress (*Saving*), the result (*Saved*). No ellipsis. Italian: *Salva modifiche*, *Salvataggio*, *Salvato*.",
|
|
543
|
+
access: 'The button\'s name is the current word. The result is announced once in a `role="status"` region; a failure as an alert.',
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
name: "AgentOrb",
|
|
547
|
+
module: "agent-orb",
|
|
548
|
+
family: "Status",
|
|
549
|
+
summary: "An Agent, anywhere: her orb, the only thing that moves on its own.",
|
|
550
|
+
when: "An Agent, anywhere: 20 in the sidebar, 32 in a row, 64 on her Profile card, 96 in an Agent card, 160 on entry. There is no other Agent picture.",
|
|
551
|
+
instead: 'A person is an `Avatar`. The system\'s own wait is the waiting line, never an orb. An orb in artwork takes `motion="ambient"` and claims no activity.',
|
|
552
|
+
behaviour: "The only thing that moves on its own. Idle turns and breathes; working and thinking show their cue; waiting holds; blocked makes one effort and stops; done celebrates once. Reduced motion: still, busy breathes in opacity.",
|
|
553
|
+
words: "Text sits beside the orb, never on it. Where the exact state matters a word names it: *Working*, *Waiting for you*.",
|
|
554
|
+
access: '`role="img"` labelled with the Agent\'s name, and her state where it matters; `decorative` when her name is already beside it.',
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
name: "AppMark",
|
|
558
|
+
module: "app-mark",
|
|
559
|
+
family: "Status",
|
|
560
|
+
summary: "An app, a channel or anything else a record connects, in the tile every such mark shares.",
|
|
561
|
+
when: "A connected app or channel beside its name: a toolkit in the Library, a messaging channel on an Agent. 28 px in a row.",
|
|
562
|
+
instead: "A model's maker is `ModelMark`. A Library skill is its `IdentityMark` tile. An Agent is her orb. A platform alone, with no tile, is `PlatformMark`.",
|
|
563
|
+
behaviour: "Draws the catalogue's logo (`composioLogo(toolkit)`), else the platform's mark, else the app's initial; never a guessed logo. The logo takes its dark drawing in a dark theme. The glyph is 62% of the tile.",
|
|
564
|
+
words: "None of its own; the app's name stands beside it.",
|
|
565
|
+
access: 'Decorative beside the name. A bare mark takes `label` and becomes `role="img"` with that name.',
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
name: "ArchIcon",
|
|
569
|
+
module: "house-icons",
|
|
570
|
+
family: "Status",
|
|
571
|
+
summary: "The house's own icons, the arch, the approvals arch and the Agent, as Lucide components.",
|
|
572
|
+
when: "Wherever an icon names the company (`ArchIcon`), the work waiting on a person (`ApprovalsIcon`), or Agents as a section (`AgentIcon`). 12, 16, 20 and 24 px; 20 in persistent navigation.",
|
|
573
|
+
instead: "Lucide for everything else. A particular Agent is her orb, not the agent icon. No Lucide glyph, a circle or a bot, stands in for these three.",
|
|
574
|
+
behaviour: "Rendered exactly as Lucide: 1.5 px line (1.25 at 12), round caps and joins, no fill except the agent's dot, the text colour. Interchangeable with any Lucide icon wherever a `LucideIcon` is expected.",
|
|
575
|
+
words: "Always beside its label in navigation: *Agents*, *Approvals*.",
|
|
576
|
+
access: "Decorative beside text. An icon-only control carries its own `aria-label`.",
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
name: "Avatar",
|
|
580
|
+
module: "avatar",
|
|
581
|
+
family: "Status",
|
|
582
|
+
summary: "A person or a team: their picture, else their initials.",
|
|
583
|
+
when: "A person or a team: the account at the foot of the sidebar, a member list, who changed something. The picture stands in for a person's own photo.",
|
|
584
|
+
instead: "An Agent is always its `AgentOrb`, never an avatar. A company is its initials in a 6 px tile inside `RecordIdentity`.",
|
|
585
|
+
behaviour: "A picture that fails falls back to initials, then to the person glyph while the owner is unknown; never blank. A group overlaps 8 px with a 2 px ring of the ground. The profile's 80 px upload button is `AvatarUploadButton`.",
|
|
586
|
+
words: "Two uppercase initials from the name, else from the email. The overflow is a count: *+2*.",
|
|
587
|
+
access: "Beside a visible name it is `aria-hidden`. Alone, its alt is the person's name. A group is labelled: *5 members*.",
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
name: "Badge",
|
|
591
|
+
module: "badge",
|
|
592
|
+
family: "Status",
|
|
593
|
+
summary: 'Short metadata beside its subject: a role, a plan, "Beta".',
|
|
594
|
+
when: 'Short metadata beside its subject: a role ("Owner"), a plan, "Beta". 20 px high, 6 px corners, 12 px label at 500. The category fills (teal, purple, pink) name a kind.',
|
|
595
|
+
instead: "For a state use `StatusBadge`, which picks the tone and its mark: the gray, green, red, amber and blue fills are its alone. For one categorical fact in a row use `Tag`. For a change in a figure, `TrendBadge`.",
|
|
596
|
+
behaviour: "A static label. It becomes a link only through `render` with a real anchor, which then takes the hover. Never a click handler, never nested, never a paragraph.",
|
|
597
|
+
words: 'One to three words, sentence case, a noun: "Business plan", not "This is on Business".',
|
|
598
|
+
access: "Read in place as text. A coloured variant still carries its word.",
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
name: "BrandWordmark",
|
|
602
|
+
module: "brand",
|
|
603
|
+
family: "Status",
|
|
604
|
+
summary: "The company logo: nadicode in full.",
|
|
605
|
+
when: "Wherever the company is named by its logo: the Portal's sidebar, the website's header, a footer. `BrandMark`, the plain n, where the name does not fit.",
|
|
606
|
+
instead: "A product's own mark (Nadia, Alveare) is that product's. A platform's is `PlatformMark`. The company named in a sentence is text.",
|
|
607
|
+
behaviour: "The letters take the text colour of what they sit in, so one form serves every ground. The dot is the logo's own colour, which turns to the brighter cobalt under any dark ancestor.",
|
|
608
|
+
words: "None beyond its name, *nadicode*, written as the glossary defines it.",
|
|
609
|
+
access: '`role="img"` named *nadicode* by default; pass `alt=""` where the name is already beside it, and it is hidden.',
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
name: "FileTypeIcon",
|
|
613
|
+
module: "file-type-icon",
|
|
614
|
+
family: "Status",
|
|
615
|
+
summary: "A file's kind as a Lucide icon, from its path or its language.",
|
|
616
|
+
when: "Beside a file's name: a file an Agent wrote, a code block's language, an attachment.",
|
|
617
|
+
instead: "An app is `AppMark`; a Library entry is its `IdentityMark`. A file's content is `CodeBlock` or `FileDiff`.",
|
|
618
|
+
behaviour: "Maps a path's extension or a language name to one icon: terminal, document, braces, settings, database, diff, palette, regex, globe, package, share; anything else is the code icon.",
|
|
619
|
+
words: "None; the file's name stands beside it.",
|
|
620
|
+
access: "Always `aria-hidden`.",
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
name: "IdentityMark",
|
|
624
|
+
module: "identity-mark",
|
|
625
|
+
family: "Status",
|
|
626
|
+
summary: "What says which thing a record is, at a fixed size at the start of its row, its object's head or its feed line: an Agent's orb, an app's logo, a company's initials, a person's picture, or a record kind's icon on its tile.",
|
|
627
|
+
when: "The first thing in a record's row (32), at the head of its object page (64), in a feed or a sidebar identity line (24), on a Library entry (40): wherever it tells a person which thing they are looking at.",
|
|
628
|
+
instead: "An icon beside a card's title, a KPI's label or a section heading only repeats the words and is left out. A picture for a first use or a whole-page moment is the empty state's or the page's own. A model is its `ModelIdentity`.",
|
|
629
|
+
behaviour: "Static, except an Agent's orb, which moves with her state. An Agent is always her orb from the orb engine, never an avatar or a painted circle, and `frame` lets the product wrap that orb, such as in the transition that carries her to her page; an app keeps its own logo on the white tile; a company is two initials on the ringed card tile; a person is their picture, then their initials; a record with no picture of its own takes its kind's navigation icon, on the purple ground for a skill and the blue one for a plugin.",
|
|
630
|
+
words: "None of its own: the record's name stands beside it. Initials are the first letters of the name's first two words.",
|
|
631
|
+
access: "Decorative beside the record's name. Alone, as in a narrow rail, `label` names it.",
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
name: "MetaLabel",
|
|
635
|
+
module: "label-system",
|
|
636
|
+
family: "Status",
|
|
637
|
+
summary: "A small muted label of metadata, and its mono sibling for a command's suffix.",
|
|
638
|
+
when: "A short fixed fact set beside a name in dense chrome: *Built in*, *Read only*. `CommandSuffix` holds a count or a key after a command.",
|
|
639
|
+
instead: "A state is `StatusBadge`; a category is `Tag`; a plan or role is `Badge`. A bound shortcut is `Kbd`.",
|
|
640
|
+
behaviour: "20 px, 6 px corners, the muted fill, never interactive, never wraps.",
|
|
641
|
+
words: "One or two words in sentence case.",
|
|
642
|
+
access: "Read in place as text.",
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
name: "ModelIdentity",
|
|
646
|
+
module: "model-identity",
|
|
647
|
+
family: "Status",
|
|
648
|
+
summary: "A model as every surface reads it: the maker's mark, one name, the muted maker.",
|
|
649
|
+
when: "Any place a model is shown: a ranked list, a routing table, a settings row, an option in `ModelSelect`.",
|
|
650
|
+
instead: "A maker's mark with a name already in hand is `ModelMark`. Choosing a model is `ModelSelect`.",
|
|
651
|
+
behaviour: "The caller passes the id and nothing else about its shape: the split, the name form and the mark all belong here. An id with no maker prefix falls back to the neutral tile.",
|
|
652
|
+
words: "The maker's own spelling when the table has it (*Claude Opus 5*), else the id without its maker prefix; a product whose runtime names models passes that `name`.",
|
|
653
|
+
access: "The name is text; the mark beside it is decorative.",
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
name: "ModelMark",
|
|
657
|
+
module: "model-mark",
|
|
658
|
+
family: "Status",
|
|
659
|
+
summary: "A model's maker as LobeHub draws it, in the tile every mark shares, with the model's name beside it when one is given.",
|
|
660
|
+
when: "A maker's mark beside a name the caller already has, such as a usage row reporting an author slug.",
|
|
661
|
+
instead: "A model read from its id is `ModelIdentity`, which splits the id and names it. An app is `AppMark`. A platform is `PlatformMark`.",
|
|
662
|
+
behaviour: "Looks the maker up in LobeHub's set by its slug, through the one table of names that differ. While the mark loads the tile keeps its size; a maker with no mark keeps its initials. The glyph is 62% of the tile, 24 px by default.",
|
|
663
|
+
words: "The model's name as the product reads it; the maker is never spelled by this component.",
|
|
664
|
+
access: 'Decorative beside the name. A bare mark takes `label` and becomes `role="img"`; with no name it stays hidden.',
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
name: "PlatformMark",
|
|
668
|
+
module: "platform-mark",
|
|
669
|
+
family: "Status",
|
|
670
|
+
summary: "A platform's genuine mark: an operating system, a messaging channel or a sign-in provider.",
|
|
671
|
+
when: "Naming a platform beside its word: *Continue with Google*, a Telegram channel, the macOS download.",
|
|
672
|
+
instead: "A connected app in its tile is `AppMark`. A model's maker is `ModelMark`. The company is `BrandMark`.",
|
|
673
|
+
behaviour: "Drawn at once on the server and in the browser from Iconify's `logos` set, one module per mark; Alveare by its own. A silhouette takes the text colour; a coloured mark keeps its paint.",
|
|
674
|
+
words: "None of its own; the platform's name always stands beside it.",
|
|
675
|
+
access: "Always `aria-hidden`: the name beside it is the reading.",
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
name: "RecordIdentity",
|
|
679
|
+
module: "record-identity",
|
|
680
|
+
family: "Status",
|
|
681
|
+
summary: 'A record\'s identity in a row (DESIGN.md "Tables and missing values"): its mark at 32, its name, and under it one muted `detail` line saying what the record is or where it comes from, so the row reads without a column heading.',
|
|
682
|
+
when: "The first cell of every collection row: the mark, the name, and one muted line saying what the record is or where it comes from, so the row reads without a heading.",
|
|
683
|
+
instead: "An Agent in a gallery is `AgentListRow`; a model is `ModelIdentity`. A descriptive item with prose and actions is `Item`.",
|
|
684
|
+
behaviour: "The name holds one line and ends in an ellipsis, whole in its title, with a `hint` such as an ID read after it. `wraps` only when the name is the whole record, such as a memory. The detail breaks between words, so a failure inside the row is read whole. The table owns the link.",
|
|
685
|
+
words: 'The name as the record calls itself. Detail: kind, then relation, three to six words: "Company skill · every Agent has it".',
|
|
686
|
+
access: "The name is the row link's text; the mark is decorative; the title carries the full name.",
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
name: "StatusBadge",
|
|
690
|
+
module: "status-badge",
|
|
691
|
+
family: "Status",
|
|
692
|
+
summary: "A record's state: a mark and a word in one of five tones.",
|
|
693
|
+
when: "A record's state, when it sets the row apart: failed, waiting on a person, a step in motion, paused, connected. Gray is every terminal state that needs no action.",
|
|
694
|
+
instead: "For a category (an installation, a partner) use `Tag`. For a control reporting its own action use `ActionStatus`. For a mark beside a word that already names the state, `StatusDot`.",
|
|
695
|
+
behaviour: "Still: a status never moves and is never a button. Each app keeps one value-to-tone map in one module; nothing else picks a status colour. A healthy record shows no badge.",
|
|
696
|
+
words: "A state, not a verb: *Failed*, *Waiting for you*. Sentence case, one to three words, no trailing ellipsis. Italian runs a third longer: *In attesa di te*.",
|
|
697
|
+
access: "The word is the name; the mark is `aria-hidden` and repeats the tone as a shape, so colour never carries the state alone. Not focusable.",
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
name: "StatusDot",
|
|
701
|
+
module: "status-dot",
|
|
702
|
+
family: "Status",
|
|
703
|
+
summary: "A small still dot beside a word that already names the state.",
|
|
704
|
+
when: "A small mark in dense chrome, beside a word that already names the state: a channel, a machine in a list.",
|
|
705
|
+
instead: "A status that stands alone is a `StatusBadge`. Something in motion is the waiting line or an Agent's orb; the dot has no info tone.",
|
|
706
|
+
behaviour: "Still; never pulses. Tones are `good`, `muted`, `warn`, `bad`, at full strength.",
|
|
707
|
+
words: "None of its own. The word beside it says the state.",
|
|
708
|
+
access: "Always `aria-hidden`. If the word is missing, the state is missing.",
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
name: "Tag",
|
|
712
|
+
module: "tag",
|
|
713
|
+
family: "Status",
|
|
714
|
+
summary: "One categorical fact in a row, as a pill.",
|
|
715
|
+
when: "One categorical fact in a row: the installation, the partner, the company a record belongs to. A 24 px pill with its 12 px mark.",
|
|
716
|
+
instead: "For a state use `StatusBadge`; a tag never carries one. For a removable filter use `CollectionFilters`. For a way to the thing, a link.",
|
|
717
|
+
behaviour: "Static, truncates inside its width. The same category keeps the same tone across a surface and after sorting. Dashed and muted when it states an absence.",
|
|
718
|
+
words: "The thing's own name. A quiet tag names the absence in two or three words (*Direct customer*); the note says whose (*Your account*).",
|
|
719
|
+
access: "Text; the mark is decorative. Never focusable unless wrapped by a real link.",
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
name: "AgentListRow",
|
|
723
|
+
module: "agent-list-row",
|
|
724
|
+
family: "Navigation",
|
|
725
|
+
summary: "One Agent in a list of them: the orb, the name, and the line that says what the Agent is doing now or what it is for.",
|
|
726
|
+
when: "Nadia's Agents in her window's sidebar, and a website scene that shows a list of Agents.",
|
|
727
|
+
instead: "An Agent as a record among others in a page's list is a RecordList row with an agent IdentityMark; an Agent's own page heads with ObjectPage.",
|
|
728
|
+
behaviour: "It is the row's presentation alone: the consumer owns the control around it (Nadia's button that opens the Agent, a scene's list item that opens nothing). The current row's name is set in 500. A state tone puts a 6 px dot before the state line. Narrow, the orb stands alone and the words stay for a screen reader.",
|
|
729
|
+
words: 'The name, then one state line: what she is doing now ("Answering on Telegram", "Working") or what she is for ("Sorts requests"). The tone never says more than the line does.',
|
|
730
|
+
access: "The orb is decorative; the name and the state line are the row's text, read by its control. The dot is hidden from assistive technology, so the line carries its meaning.",
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
name: "Breadcrumb",
|
|
734
|
+
module: "breadcrumb",
|
|
735
|
+
family: "Navigation",
|
|
736
|
+
summary: "The top bar's path to the page.",
|
|
737
|
+
when: "The top bar of every product page: the sidebar group or the parents, ending at the destination or the object. An object opened from search still shows its parent.",
|
|
738
|
+
instead: "Never a back button in its place. A return link may remember a visit, beside the path, not instead of it. Sibling views are tabs.",
|
|
739
|
+
behaviour: "Ancestors are links in the body colour that turn ink on hover; the current item is ink and not a link. A long path folds its middle into `BreadcrumbEllipsis` and keeps the parent and the current item.",
|
|
740
|
+
words: "The groups' and records' own names, exactly as the sidebar and the record write them. The `aria-label` and the ellipsis's `label` come from the product's catalogue: \"Path\", \"More\".",
|
|
741
|
+
access: 'A labelled `nav` with an ordered list; the current item has `aria-current="page"`; the chevrons and the ⋯ glyph are hidden, and the folded middle reads its `label`.',
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
name: "CommandDialog",
|
|
745
|
+
module: "command",
|
|
746
|
+
family: "Navigation",
|
|
747
|
+
summary: "Find anything across the product and go there.",
|
|
748
|
+
when: "Finding anything across the product and going there: an Agent, a customer, a page, a creation command. Opened by ⌘K or the sidebar's Find.",
|
|
749
|
+
instead: "One record's commands are its `ActionMenu`. Search inside one collection is `CollectionSearch`. Choosing the page's scope is `ScopeSwitcher`.",
|
|
750
|
+
behaviour: "Opens instantly, a third of the way down, on glass at 12 px corners. Arrows move the highlight, Enter goes, Esc closes and returns focus to the trigger. An empty query shows useful defaults; no match says so.",
|
|
751
|
+
words: "Groups are plural nouns (*Agents*, *Go to*). Items are names, or verb and noun for a command (*New Agent*). No match quotes the query.",
|
|
752
|
+
access: "A dialog with a screen-reader title and description; the field is a combobox over a listbox; the highlighted item is `aria-selected`.",
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
name: "DashboardShell",
|
|
756
|
+
module: "dashboard-shell",
|
|
757
|
+
family: "Navigation",
|
|
758
|
+
summary: "A web product's frame: the sidebar, the top bar with the page's path, and the content.",
|
|
759
|
+
when: "The Portal's frame around every signed-in page: its sidebar, the top bar and the scrolling content, with an optional inspector.",
|
|
760
|
+
instead: "A desktop window is `DesktopAppShell`. A page's own title and actions are `PageHeader` inside the content.",
|
|
761
|
+
behaviour: "The sidebar can be resized and collapsed to its rail; the content scrolls under the top bar. On a narrow window the sidebar opens as a sheet.",
|
|
762
|
+
words: "None of its own: the sidebar and the header carry the product's words.",
|
|
763
|
+
access: "The content is the page's `main`, labelled by `contentLabel`; the inspector is a labelled `aside`; the narrow window's navigation button and the sidebar rail are named.",
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
name: "DesktopAppShell",
|
|
767
|
+
module: "desktop-shell",
|
|
768
|
+
family: "Navigation",
|
|
769
|
+
summary: "A desktop window's frame: title bar, rails, resizable panes and status bar.",
|
|
770
|
+
when: "A desktop product's whole window: Nadia's left column (the Agents list, then an Agent's sections behind *‹ Agents*), its workspace and its side panes.",
|
|
771
|
+
instead: "The Portal's column is `PortalSidebarFrame` inside `DashboardShell`. Both draw their rows with the same `SidebarMenuButton` and end with the same `AccountMenu`.",
|
|
772
|
+
behaviour: "One 44 px band shares the window buttons and the window's commands. The workspace splits into resizable panes; the secondary pane and the inspector rail appear only when given. Each Agent row is her orb, name and one line.",
|
|
773
|
+
words: "Every pane label is the product's word for what it holds. An Agent's line says her job in under six words: *Writes quotes from the price list*.",
|
|
774
|
+
access: "Each pane and rail is a labelled region; the orb beside a name is decorative.",
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
name: "Footer",
|
|
778
|
+
module: "footer",
|
|
779
|
+
family: "Navigation",
|
|
780
|
+
summary: "The always-dark site footer: the brand line, link columns and a meta row.",
|
|
781
|
+
when: "The foot of every website page and the Portal's public pages.",
|
|
782
|
+
instead: "A dialog's or a card's footer is its recessed strip. A product's account is `AccountMenu`.",
|
|
783
|
+
behaviour: 'Always dark, in either theme: it scopes `dark` itself. `mega` adds link columns and one hairline above the meta row; `width="page"` puts it on the website\'s one column. The clock is a pre-formatted string, not a live timer.',
|
|
784
|
+
words: "Link columns are nouns; the identity paragraph names the company as the glossary defines it.",
|
|
785
|
+
access: "A `footer` landmark; each link group is a labelled `nav`.",
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
name: "NavigationMenu",
|
|
789
|
+
module: "navigation-menu",
|
|
790
|
+
family: "Navigation",
|
|
791
|
+
summary: "A website header's top-level links, some opening a panel of links.",
|
|
792
|
+
when: "The website's header: a few top-level destinations, where one may open a panel of related pages.",
|
|
793
|
+
instead: "A product's navigation is its `Sidebar`. Commands are a menu; sibling views are tabs.",
|
|
794
|
+
behaviour: "Opens on hover and on click; one panel at a time, positioned under its trigger. Escape closes it and returns focus.",
|
|
795
|
+
words: "Nouns, one or two words, sentence case. A panel's links name their page and may carry one short line.",
|
|
796
|
+
access: 'A labelled `nav`; triggers expose `aria-expanded`; links are real anchors with `aria-current="page"` on the current one.',
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
name: "Pagination",
|
|
800
|
+
module: "pagination",
|
|
801
|
+
family: "Navigation",
|
|
802
|
+
summary: "Numbered sibling pages with Previous and Next.",
|
|
803
|
+
when: "`Pagination` for numbered sibling pages. A table of server pages takes `DataTable`'s own Previous and Next under its card; the card's footer strip holds the count or the paging.",
|
|
804
|
+
instead: "Appending rows in place is a `Button` with `PendingLabel` (*Load more*). A fixed comparison passes `pagination={false}` and stays whole.",
|
|
805
|
+
behaviour: "Boundaries are disabled. While the next page loads both buttons disable and the rows stay. The order and the page live in the URL. The labels hide under `sm`, leaving the chevrons.",
|
|
806
|
+
words: "*Previous*, *Next*. The footer is a count with its noun or *Page 1 of 6*, never a help sentence.",
|
|
807
|
+
access: 'A labelled `nav`; the current page has `aria-current="page"`; the arrows read *Go to previous page*; a pending button is `aria-busy`.',
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
name: "PortalSidebarFrame",
|
|
811
|
+
module: "portal-sidebar-frame",
|
|
812
|
+
family: "Navigation",
|
|
813
|
+
summary: "The Portal's navigation frame, without the Portal's routing: the wordmark and the section name over the collapse control, the Find control with its shortcut, the labelled nav bands, the band that leads out of the Portal, and the account at the foot.",
|
|
814
|
+
when: "`PortalSidebarFrame` is the Portal's whole left column, and the website's sample of it.",
|
|
815
|
+
instead: "Nadia's left column belongs to `DesktopAppShell`. Both draw their rows with the same `SidebarMenuButton` and end with the same `AccountMenu`; neither paints its own selected fill or its own account block.",
|
|
816
|
+
behaviour: "Wordmark and product name over the collapse control, then Find, the bands, the way out (Get Nadia) and the account, split by 1 px guides.",
|
|
817
|
+
words: "Find is one word beside ⌘K. Bands are short nouns; items are nouns, one or two words, sentence case.",
|
|
818
|
+
access: 'The column is a labelled `nav`. Find is a button named with its shortcut. The wordmark is `role="img"` named nadicode.',
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
name: "ScopeSwitcher",
|
|
822
|
+
module: "scope-switcher",
|
|
823
|
+
family: "Navigation",
|
|
824
|
+
summary: "Says which part of the account a page reads, and changes it.",
|
|
825
|
+
when: "Changing which part of the account a page reads, such as Analytics' scope: the whole fleet, one partner, one customer. Only when the viewer has more than one.",
|
|
826
|
+
instead: "A viewer with one scope and nothing to create reads its name with no control, which this draws by itself. Finding anything is `CommandDialog`; narrowing rows is `CollectionFilters`.",
|
|
827
|
+
behaviour: "A ghost trigger, at most 16rem, opens a 288 px popover with focus in its search. Type to filter, Enter chooses and closes; choosing the current one changes nothing. The caller writes the choice to the URL in `onValueChange`, so sibling pages keep it. An optional create command sits last.",
|
|
828
|
+
words: '`copy.label` names what is chosen ("Scope") beside the current scope\'s name. Search and empty lines name the thing: "Find a scope", "No scope matches".',
|
|
829
|
+
access: 'The trigger reads "Scope: All customers"; the popover has a hidden title; options are a listbox with the current one checked.',
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
name: "Sidebar",
|
|
833
|
+
module: "sidebar",
|
|
834
|
+
family: "Navigation",
|
|
835
|
+
summary: "A product's navigation column: where a person can go, with the account at its foot.",
|
|
836
|
+
when: "The Portal's and Nadia's left column: the groups of places, an object's sections when the column swaps, the update offer and the account menu at the foot.",
|
|
837
|
+
instead: "An object's sections are SidebarSections inside this column, never a second column or a tab row; a page's own views are Tabs.",
|
|
838
|
+
behaviour: "One row is selected and marked as the current page. Collapsed or narrow, rows keep their icon and show their name in a tooltip; under the mobile breakpoint the column becomes a sheet. A row's count uses SidebarMenuBadge, whose attention tone is for a failure that needs the person.",
|
|
839
|
+
words: 'Each row is a place\'s noun: "Agents", "Tasks", "Customers". A count is a bare number.',
|
|
840
|
+
access: 'The column is a landmark; each row is a link or a button with its name, and the current one carries aria-current="page". The badge\'s number is read with its row.',
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
name: "SidebarSections",
|
|
844
|
+
module: "sidebar-sections",
|
|
845
|
+
family: "Navigation",
|
|
846
|
+
summary: "The sidebar swapped to one object: the way back, what you are in, and its sections.",
|
|
847
|
+
when: "Inside an object, the account or Platform settings, the same sidebar column shows these instead of the places: an Agent's or a Customer's sections in the Portal, Nadia's Edit and her company's sections, the Portal's Account and Platform settings.",
|
|
848
|
+
instead: "The places a person can go are the sidebar's own groups; a page's views are Tabs; a settings page that does not swap the column is a SettingsPage. Never a second column beside the first.",
|
|
849
|
+
behaviour: "The back row returns to where the person came from and is disabled while leaving is blocked. One section is current. Narrow, the identity and the heading leave, and each row keeps its icon with its name in a tooltip.",
|
|
850
|
+
words: 'The back row names where it goes ("Agents", "Back to workspace"); the identity is the object\'s own name; the heading names the kind of settings ("Account"); sections are nouns ("Skills", "Members").',
|
|
851
|
+
access: 'The sections are a nav named by `label`; the current one carries aria-current="page". The identity\'s mark is decorative beside its name.',
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
name: "Tabs",
|
|
855
|
+
module: "tabs",
|
|
856
|
+
family: "Navigation",
|
|
857
|
+
summary: "Panels of one surface that switch in place.",
|
|
858
|
+
when: "Sibling views of one object that switch in place inside one surface.",
|
|
859
|
+
instead: "Views with their own URL are `TabsNav`. A choice that changes a value is a `RadioGroup` or `ToggleGroup`. A stable destination belongs in the `Sidebar`. A tab never opens a new scope.",
|
|
860
|
+
behaviour: "One treatment among siblings, chosen through `variant`, never a page border. Arrow keys move, one tab stop. The underline fades on `confirm`, 180 ms.",
|
|
861
|
+
words: "Nouns, one or two words: *Overview*, *Installations*. Italian (*Installazioni*) scrolls, never wraps or truncates.",
|
|
862
|
+
access: "`tablist`, `tab`, `tabpanel` with `aria-selected`.",
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
name: "TabsNav",
|
|
866
|
+
module: "tabs",
|
|
867
|
+
family: "Navigation",
|
|
868
|
+
summary: "Sibling views of one object, each with its own URL, under the top bar.",
|
|
869
|
+
when: "Sibling views of one object under the top bar, when each view has its own URL (an object's sections), with `TabsLink` for each.",
|
|
870
|
+
instead: "Panels that switch in place are `Tabs`. A stable destination belongs in the `Sidebar`. An object's ancestry is the `Breadcrumb`.",
|
|
871
|
+
behaviour: "Overflow scrolls sideways and brings the current link into view. The current link takes the underline.",
|
|
872
|
+
words: "Nouns, one or two words: *Overview*, *Installations*. Italian scrolls, never wraps or truncates.",
|
|
873
|
+
access: 'A labelled `nav` of links with `aria-current="page"` on the current one.',
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
name: "textLinkVariants",
|
|
877
|
+
module: "text-link",
|
|
878
|
+
family: "Navigation",
|
|
879
|
+
summary: "The classes of a link that reads as text: `inline` inside a sentence, `plain` on its own, `quiet` for a muted way out.",
|
|
880
|
+
when: "A link inside a sentence (`inline`, blue and underlined), a link that stands alone as text (`plain`), or a muted secondary way to somewhere such as a footer's *Learn more* (`quiet`).",
|
|
881
|
+
instead: "A command is a `Button`; a destination drawn as a button is a link with `buttonVariants`. Going to a record from its row is the record's name in `RecordIdentity`.",
|
|
882
|
+
behaviour: "Classes only: the caller renders the real anchor or router link. `inline` thickens its underline on hover; `plain` and `quiet` underline on hover. Paint changes ride the shared paint transition.",
|
|
883
|
+
words: "The link's text names where it goes: *Open Billing*, *Read the privacy notice*; never *Click here* or a bare URL.",
|
|
884
|
+
access: "A real `a` with an `href`. A link that leaves the product says so in its text or carries the arrow with a name. Focus is the base layer's 2 px outline.",
|
|
885
|
+
},
|
|
886
|
+
{
|
|
887
|
+
name: "AgentCard",
|
|
888
|
+
module: "agent-card",
|
|
889
|
+
family: "Data",
|
|
890
|
+
summary: "One Agent, or another pictured object, as a card in a gallery.",
|
|
891
|
+
when: "A gallery of Agents or templates where each one is chosen by its picture and its job: the Agents to create from, the templates of a hub.",
|
|
892
|
+
instead: "A list of Agents to open is `AgentListRow`. An Agent's own page opens with `AgentProfileCard`. A Library entry is `CatalogEntry`.",
|
|
893
|
+
behaviour: "The picture (her orb at 96) on the leading side, the name and job, an optional status under them, and a footer with the meta and one action. A long name wraps inside the card.",
|
|
894
|
+
words: "The name as the Agent calls herself; the job in one line (*Writes quotes from the price list*); the action verb and noun (*Use template*).",
|
|
895
|
+
access: "The name is the card's heading text; the orb is decorative beside it; the action is a real button or link.",
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
name: "ApprovalRow",
|
|
899
|
+
module: "approval-row",
|
|
900
|
+
family: "Data",
|
|
901
|
+
summary: "One thing waiting for a person's yes: a mark for what is asking, the request in one sentence, what happened underneath it, and the single action that clears it.",
|
|
902
|
+
when: "Each request in a list of approvals: a mark for what is asking, the request in one sentence, what happened, and the one action that clears it.",
|
|
903
|
+
instead: "A record's state is a `StatusBadge`. A notice about a condition is `NoticeBanner`. An Agent's question inside a conversation belongs to the conversation.",
|
|
904
|
+
behaviour: "An outline `Item` at the small size; several sit in an `ItemGroup`. A `failed` description is announced.",
|
|
905
|
+
words: "The title is the request as a sentence; the action is its yes as verb and noun: *Approve payment*.",
|
|
906
|
+
access: 'A `listitem`; a failed description is `role="alert"`.',
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
name: "Card",
|
|
910
|
+
module: "card",
|
|
911
|
+
family: "Data",
|
|
912
|
+
summary: "A resting surface that holds one thing: a header, content and a recessed footer.",
|
|
913
|
+
when: "A bounded piece of a page that stands on its own: a settings section, a KPI, a chart, a table. Usually reached through the composition that owns that job.",
|
|
914
|
+
instead: "A page's own header is never in a card. A row of a list is `Item`. A plane of brand colour is `BrandField`.",
|
|
915
|
+
behaviour: 'The resting material: 6 px corners and the rest shadow, no border of its own. `CardHeader` lays out title, description and one `CardAction`; `CardFooter` is the recessed strip behind one seam. `size="sm"` for a compact card in a side column.',
|
|
916
|
+
words: "The title is a noun phrase naming what the card holds; the description one sentence, only when it adds something.",
|
|
917
|
+
access: "A plain container; give it `render={<section />}` with a heading when it is a region of the page.",
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
name: "CardRow",
|
|
921
|
+
module: "card-row",
|
|
922
|
+
family: "Data",
|
|
923
|
+
summary: "The row sibling cards sit in.",
|
|
924
|
+
when: "Two to four sibling cards side by side: the KPIs of an overview, a pair of charts.",
|
|
925
|
+
instead: "A list of records is `Item` or a table. A single card needs no row.",
|
|
926
|
+
behaviour: "One column below `from`, then `columns` columns; `auto` gives each card an equal share. Each card fills its cell, so the bottom edge is even.",
|
|
927
|
+
words: "None of its own.",
|
|
928
|
+
access: "A layout container; reading order is source order.",
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
name: "CodeBlock",
|
|
932
|
+
module: "code-block",
|
|
933
|
+
family: "Data",
|
|
934
|
+
summary: "Several lines of exact text to read or copy.",
|
|
935
|
+
when: "Several lines a person reads or copies exactly: a configuration, static JSON, a command sequence.",
|
|
936
|
+
instead: "One short value to copy is a read-only input with a `CopyButton`. A before and after is `FileDiff`. Code in a conversation is her `MarkdownText`.",
|
|
937
|
+
behaviour: "Read-only, no wrapping, scrolls in both directions up to 384 px. Copy takes the exact text, says Copied only on success and says when it failed. No syntax colour, no line numbers.",
|
|
938
|
+
words: "The real filename, or an honest label. The language as its common name: *JSON*. Copy, Copied, Couldn't copy.",
|
|
939
|
+
access: "The text area is named by its `label`; the copy button names its target (*Copy mcp.json*) and announces the result.",
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
name: "DataTable",
|
|
943
|
+
module: "data-table",
|
|
944
|
+
family: "Data",
|
|
945
|
+
summary: "Records that share comparable facts, read across in rows inside their `TableCard`.",
|
|
946
|
+
when: 'Records that share comparable facts: usage per Agent, statements, invoices, customers with their partner and count. 40 px rows for figures; `density="comfortable"`, the default, gives 48 px for entity rows.',
|
|
947
|
+
instead: "An entity collection that is the page's whole job is `CollectionPage`, which draws its own 56 px rows. A descriptive list is `ItemGroup`. One object's facts are `ObjectFacts`.",
|
|
948
|
+
behaviour: "Headings visible by default; numbers trail in tabular figures. Row hover, focus within and an open menu take `accent`; a selected row takes `muted`; headers and footers never highlight. Narrow cards move facts into a detail row, never scroll sideways; an `optional` column's empty value is left out of it. Empty sits outside the body.",
|
|
949
|
+
words: 'Headings are nouns with their unit: "Cost (€)", "Tokens". The footer is a count or the paging; the summary row is a labelled total. Italian headings run a third longer and never wrap.',
|
|
950
|
+
access: 'A native table with `aria-label`; `th scope="col"`; the record\'s name is the row\'s one link. A missing value is a hidden "—" with screen-reader text, never blank.',
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
name: "DiffCount",
|
|
954
|
+
module: "diff-count",
|
|
955
|
+
family: "Data",
|
|
956
|
+
summary: "Lines added and removed, as +n and −n.",
|
|
957
|
+
when: "Beside a file or a change: how many lines it adds and removes.",
|
|
958
|
+
instead: "The lines themselves are `FileDiff`. A change in a figure is `TrendBadge`.",
|
|
959
|
+
behaviour: "Renders nothing when both are zero. The numbers roll to a new value; still under reduced motion.",
|
|
960
|
+
words: "Signed counts with a true minus: *+12 −3*.",
|
|
961
|
+
access: "Read as text.",
|
|
962
|
+
},
|
|
963
|
+
{
|
|
964
|
+
name: "DisclosureRow",
|
|
965
|
+
module: "disclosure-row",
|
|
966
|
+
family: "Data",
|
|
967
|
+
summary: "A row whose label opens what it holds, with an action and a trailing value beside it.",
|
|
968
|
+
when: "A line in a dense list that opens to show its detail: a tool call, a group of steps.",
|
|
969
|
+
instead: "Supporting detail on a page is `Disclosure`. A long block cut short is `ExpandableBlock`.",
|
|
970
|
+
behaviour: "The chevron shows on hover or focus and while open. Without `onToggle` the row is static and draws no chevron.",
|
|
971
|
+
words: "The label names what is inside; the trailing value is a short figure.",
|
|
972
|
+
access: "The label is a `button` with `aria-expanded` when it toggles.",
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
name: "FileDiff",
|
|
976
|
+
module: "file-diff",
|
|
977
|
+
family: "Data",
|
|
978
|
+
summary: "A file's before and after, line by line.",
|
|
979
|
+
when: "Showing what changed in a file an Agent edited, or in a configuration before it is saved.",
|
|
980
|
+
instead: "A file as it stands is `CodeBlock`. A count of changed lines is `DiffCount`.",
|
|
981
|
+
behaviour: "Added lines on the success fill with a plus, removed on the destructive fill with a true minus; unchanged lines beyond `context` fold into one marker.",
|
|
982
|
+
words: "The added and removed labels and the folded-lines count come from the product's catalogue.",
|
|
983
|
+
access: "Each changed line carries its added or removed label in screen-reader text; the plus and minus marks are hidden.",
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
name: "Item",
|
|
987
|
+
module: "item",
|
|
988
|
+
family: "Data",
|
|
989
|
+
summary: "A row said in a sentence: media, a title, one line of description, trailing actions.",
|
|
990
|
+
when: "Things best said in a sentence: an activity feed, a Library shelf, connected accounts. Media, a title, one line of description, trailing actions.",
|
|
991
|
+
instead: "Facts that compare across records are a `DataTable`. A page whose job is one collection is `CollectionPage`. Agents in a gallery are `AgentListRow`; Library entries `CatalogEntry`.",
|
|
992
|
+
behaviour: "Inside a card the group is `divided`: no gaps, one hairline between items. An item that is an `a` or `button` takes the `accent` hover and is one hit target; nested controls stay independent. The title holds one line.",
|
|
993
|
+
words: "Title: the name, or what happened as a short sentence (*Nadia filed 12 invoices*). Description: one sentence. One primary action as a button; the rest in the three dots.",
|
|
994
|
+
access: "The group is a `list` and each item a list item. A linked item's text is its name; image media is decorative beside the title.",
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
name: "Kbd",
|
|
998
|
+
module: "kbd",
|
|
999
|
+
family: "Data",
|
|
1000
|
+
summary: "One key of a shortcut, beside the command it triggers.",
|
|
1001
|
+
when: "A shortcut hint next to the command it triggers: Find with ⌘K, the sidebar with ⌘B. 20 px, 2 px corners, mono 12 on the recessed fill.",
|
|
1002
|
+
instead: "A key a person types into is an `Input`; a code a person types is `InputOTP`. In a command list, `CommandShortcut`.",
|
|
1003
|
+
behaviour: "Not interactive. Only shortcuts actually bound are shown. The caller maps the platform: ⌘ on macOS, Ctrl on Windows and Linux.",
|
|
1004
|
+
words: "One key per `Kbd`; symbols for macOS modifiers (⌘ ⇧ ⌥), words elsewhere (*Ctrl*). Surrounding prose stays outside the key.",
|
|
1005
|
+
access: "A `kbd` element, read in order; the command's own name carries the meaning.",
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
name: "MemoryItem",
|
|
1009
|
+
module: "memory-item",
|
|
1010
|
+
family: "Data",
|
|
1011
|
+
summary: "One fact an Agent keeps, under its muted label.",
|
|
1012
|
+
when: "A fact from an Agent's memory shown in her conversation or her profile.",
|
|
1013
|
+
instead: "A fact about a record is `ObjectFacts`. A note a person writes is a `Textarea`.",
|
|
1014
|
+
behaviour: "A short label over the fact; `children` replace the plain `fact` when it needs rich content.",
|
|
1015
|
+
words: "The label is the product's word for memory from the catalogue; the fact is in the Agent's own words.",
|
|
1016
|
+
access: "Read in place as text.",
|
|
1017
|
+
},
|
|
1018
|
+
{
|
|
1019
|
+
name: "ObjectFacts",
|
|
1020
|
+
module: "object-workspace",
|
|
1021
|
+
family: "Data",
|
|
1022
|
+
summary: "An object's facts as labelled values in a grid, inside one of its sections.",
|
|
1023
|
+
when: "Read-only values that describe an object, inside an ObjectSection: a company's legal name, VAT number and address.",
|
|
1024
|
+
instead: "Facts under the object's name belong to ObjectPage's `facts`; values a person changes are SettingsFields in a SettingsSection; figures compared across records are a DataTable.",
|
|
1025
|
+
behaviour: "Two columns from `sm`, one below; `compact` tightens the gaps for a dense card; a `block` fact takes the full width and keeps its line breaks.",
|
|
1026
|
+
words: 'A label is a noun ("Billing email"); a value is the fact itself, with no unit the label already says.',
|
|
1027
|
+
access: "A description list: each label is its value's term and names it.",
|
|
1028
|
+
},
|
|
1029
|
+
{
|
|
1030
|
+
name: "PairingCode",
|
|
1031
|
+
module: "pairing-code",
|
|
1032
|
+
family: "Data",
|
|
1033
|
+
summary: "The short code two screens show at once so a person can tell they are talking to each other, such as the four digits Nadia and Alveare Server both show while a Nadia asks to join.",
|
|
1034
|
+
when: "Pairing two devices or apps a person can see side by side: the four digits Nadia and Alveare Server both show while a Nadia asks to join.",
|
|
1035
|
+
instead: "A code a person types is `InputOTP`. A link another device scans is `QrCode`.",
|
|
1036
|
+
behaviour: "Each digit in its own cell, large enough to compare from across a desk. A leading zero is a digit.",
|
|
1037
|
+
words: "The label says what the code is: *Pairing code*.",
|
|
1038
|
+
access: '`role="img"` named by the label and the digits read one by one.',
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
name: "Progress",
|
|
1042
|
+
module: "progress",
|
|
1043
|
+
family: "Data",
|
|
1044
|
+
summary: "A known amount against a real maximum, with its label and value.",
|
|
1045
|
+
when: "A known amount against a real maximum, with its label and value: included runs used against the plan's allowance.",
|
|
1046
|
+
instead: "An unknown wait is the waiting line, never a bar with an invented percentage. A run's consumption in a dense spot is a `UsageMeter`. A single figure is a `KpiCard`.",
|
|
1047
|
+
behaviour: "A 4 px track in the `line` colour. The fill moves only when the reading changes, on `open`; still under reduced motion. `tone` is the product's threshold, never derived from the value. Past the maximum the bar fills and turns red, whatever the tone.",
|
|
1048
|
+
words: 'Print the work and its unit in `ProgressValue`: "620 of 1,000".',
|
|
1049
|
+
access: "A `progressbar` named by its `ProgressLabel` or `aria-label`, with its value.",
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
name: "QrCode",
|
|
1053
|
+
module: "qr-code",
|
|
1054
|
+
family: "Data",
|
|
1055
|
+
summary: "A link drawn as a QR code another device can scan.",
|
|
1056
|
+
when: "Opening something on a phone from a screen: a mobile sign-in, a download link.",
|
|
1057
|
+
instead: "Two screens compared by eye is `PairingCode`. A link a person clicks is a link.",
|
|
1058
|
+
behaviour: "Square dark modules on a white tile in every theme, with the quiet zone a reader needs.",
|
|
1059
|
+
words: "The label names what the code opens: *Open Nadia on your phone*.",
|
|
1060
|
+
access: '`role="img"` named by `label`.',
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
name: "RecordTime",
|
|
1064
|
+
module: "record-time",
|
|
1065
|
+
family: "Data",
|
|
1066
|
+
summary: "When something happened to a record: a relative time in the sentence that says what, or the time of day in a feed's time column.",
|
|
1067
|
+
when: 'The moment a record was made, changed or last ran, in its row or its facts ("Updated 3 hours ago"), and the time of each event in an ActivityFeed or a RunTimeline step (`mode="clock"`).',
|
|
1068
|
+
instead: 'A date a person picks is a Calendar; a span of days a page reads is a DateRangeControl; a run\'s duration is a fact written by the product ("Took 4 min").',
|
|
1069
|
+
behaviour: "Relative within a week, then the day and month, with the year only when it is another year; `mode=\"clock\"` prints the time of day in the viewer's zone in tabular figures. Hovering either shows the exact moment in UTC and in the viewer's zone. A page rendered on a server passes the viewer's `timeZone` when it knows it, so the server and the browser write the same time; otherwise the server and the hydrating page write UTC and the page then rewrites it in the browser's zone. A time that names no moment draws nothing.",
|
|
1070
|
+
words: 'The product writes the sentence through `phrase` ("Updated {when}", "Ran {when}"); the clock needs no words. The package formats every date with the person\'s `locale`.',
|
|
1071
|
+
access: "A `<time>` element with the machine-readable moment; assistive technology reads the exact local moment after the visible text.",
|
|
1072
|
+
},
|
|
1073
|
+
{
|
|
1074
|
+
name: "RunTimeline",
|
|
1075
|
+
module: "run-timeline",
|
|
1076
|
+
family: "Data",
|
|
1077
|
+
summary: "One run of an Agent, read step by step on a neutral rail.",
|
|
1078
|
+
when: "The steps of one run, in order: a scheduled task's run, an Agent's handoff. Each step is something the run did or will do.",
|
|
1079
|
+
instead: "What happened to a record over time is an ActivityFeed; steps a person follows are NumberedSteps; the stages a system runs on an entry screen are the EntryStageList.",
|
|
1080
|
+
behaviour: 'Each step is a node on one rail, its label and title, one line of detail, and its time at the trailing edge ("—" until it happens). The node marks the step and never grades it: the current step\'s node is ink, a step to come is drawn in the line colour with its title muted. An outcome that needs a person is the StatusBadge inside its step. Nothing moves.',
|
|
1081
|
+
words: 'The label numbers the step ("Step 01"); a done step\'s title is in the past tense ("Filed the invoices"), a step to come in the imperative ("Send the summary to Marco"); a waiting step\'s detail says what it waits for ("Waits for your decision on step 03").',
|
|
1082
|
+
access: 'An ordered list; the current step carries `aria-current="step"`; the rail and nodes are hidden from assistive technology, and so is the dash of a step that has not happened.',
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
name: "SettingsFactsSection",
|
|
1086
|
+
module: "settings-facts",
|
|
1087
|
+
family: "Data",
|
|
1088
|
+
summary: "Read-only facts about one object, framed as a card with a title and one action.",
|
|
1089
|
+
when: "Read-only facts about one object: who it is, where it belongs, its identifiers. `SettingsFactsSection` frames them as a card with a title and one action; `ObjectFacts` is the list alone.",
|
|
1090
|
+
instead: "Facts a person changes are a `SettingsSection` with its own Save. Facts compared across records are a table. A relation is its identity or a `Tag`, never its own card.",
|
|
1091
|
+
behaviour: 'Label above value, two equal columns, one column on a phone. Every label stays when its value is missing, as *—*. A long value spans both columns. No fact gets a box of its own. In a side column, `presentation="summary"` drops the card.',
|
|
1092
|
+
words: "Labels are nouns, sentence case, no colon: *VAT number*. Values are exact: identifiers in mono with a copy button, dates in the person's locale.",
|
|
1093
|
+
access: "A `dl` of `dt` and `dd`, each value named by its label. The section is labelled by its heading, which also takes focus when an editor closes. A dash carries screen-reader text.",
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
name: "StatusRow",
|
|
1097
|
+
module: "status-row",
|
|
1098
|
+
family: "Data",
|
|
1099
|
+
summary: "One line of a status panel: a mark, what it is, and controls that show on hover.",
|
|
1100
|
+
when: "Lines inside a side panel that report what is running or connected, grouped under a collapsible `StatusSection`.",
|
|
1101
|
+
instead: "A collection's row is `RecordList`'s. A row with a sentence and actions is `Item`.",
|
|
1102
|
+
behaviour: "When `onActivate` is given the whole row is one button that takes the accent hover; the trailing controls show on hover or focus unless `trailingVisible`. A `StatusSection` starts collapsed.",
|
|
1103
|
+
words: "The row names the thing; the section's label is a plural noun.",
|
|
1104
|
+
access: 'An activatable row is `role="button"`, reached by Tab and run by Enter or Space. The section\'s toggle exposes `aria-expanded`.',
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
name: "Table",
|
|
1108
|
+
module: "table",
|
|
1109
|
+
family: "Data",
|
|
1110
|
+
summary: "The native table primitive every comparison table is drawn with.",
|
|
1111
|
+
when: "A fixed table a composition draws itself: a summary inside a card, a list of plan limits. A table of records is `DataTable`, which draws this one.",
|
|
1112
|
+
instead: "Records with sorting, paging and an empty state are `DataTable`. A descriptive list is `ItemGroup`. One object's facts are `ObjectFacts`.",
|
|
1113
|
+
behaviour: "Headings visible; numbers trail in tabular figures. Row hover takes `accent`; headers and footers never highlight. `TableDetailRow` and `tableCompactLayouts` move facts into a detail row on a narrow card instead of scrolling sideways.",
|
|
1114
|
+
words: "Headings are nouns with their unit: *Cost (€)*, *Tokens*. Italian headings run a third longer and never wrap.",
|
|
1115
|
+
access: 'A native `table` with a caption or `aria-label`; `th scope="col"`. A missing value is `TableValue`\'s hidden dash, never blank.',
|
|
1116
|
+
},
|
|
1117
|
+
{
|
|
1118
|
+
name: "TableCard",
|
|
1119
|
+
module: "table-card",
|
|
1120
|
+
family: "Data",
|
|
1121
|
+
summary: "The frame a collection's table sits in: a heading, the collection's own toolbar under it, the table, a labelled total, and the recessed footer strip.",
|
|
1122
|
+
when: "A table of records in a card: its heading, its own toolbar, the table, a labelled total and the recessed footer strip.",
|
|
1123
|
+
instead: "An entity collection that is the page's whole job is `CollectionPage`. A chart is `ChartCard`. One object's facts are `SettingsFactsSection`.",
|
|
1124
|
+
behaviour: "The heading, the toolbar and a separator come first when given; the summary row is a labelled total under the table; the footer strip holds the hint on the left and the count or paging on the right.",
|
|
1125
|
+
words: "The title names the collection. The footer is a count or the paging; the summary is a labelled total. Never a help sentence in the footer.",
|
|
1126
|
+
access: "A `section` whose title is an `h2`; the summary is a `dl`.",
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
name: "TableValue",
|
|
1130
|
+
module: "table-value",
|
|
1131
|
+
family: "Data",
|
|
1132
|
+
summary: "One cell's value in a table, in each state a reading can be in.",
|
|
1133
|
+
when: "Every cell of a `DataTable` whose reading can be missing, zero, out of date, unreadable or still loading.",
|
|
1134
|
+
instead: 'A whole table that failed to read is `EmptyState kind="failed"`; a figure on its own is a `KpiCard`.',
|
|
1135
|
+
behaviour: 'Five states that never collapse into a dash: unknown (a muted dash), zero (the figure "0"), stale (the reading, then the stale word), failed (the warning mark and its words) and loading (a still 64 × 12 placeholder). A real value, `0` included, is shown as it is.',
|
|
1136
|
+
words: '`missingLabel` says what the absence means ("Not reported", never "N/A" or "None"); `staleLabel` is one word ("Stale"); `failedLabel` says the read failed ("Couldn\'t read").',
|
|
1137
|
+
access: "The dash is hidden and `missingLabel` is read in its place; the warning mark is hidden beside its words; the placeholder is decorative, and the table is `aria-busy` while it loads.",
|
|
1138
|
+
},
|
|
1139
|
+
{
|
|
1140
|
+
name: "UsageMeter",
|
|
1141
|
+
module: "usage-meter",
|
|
1142
|
+
family: "Data",
|
|
1143
|
+
summary: "Consumption against an allowance in a dense spot.",
|
|
1144
|
+
when: "`UsageMeter`: consumption against an allowance in a dense spot, such as a run's tokens and cost.",
|
|
1145
|
+
instead: "A known amount against a real maximum with its label is `Progress`. An unknown wait is the waiting line, never a bar with an invented percentage. A single figure is a `KpiCard`.",
|
|
1146
|
+
behaviour: "The fill moves only when the reading changes, on `transition`; still under reduced motion. The tone is the product's threshold, never derived from the value. Past the maximum the bar fills and turns red.",
|
|
1147
|
+
words: "Print the work and its unit: *620 of 1,000*. The meter's fields are short and set in uppercase mono by the stylesheet, so they are written in sentence case.",
|
|
1148
|
+
access: "The meter's printed figures are the reading; its track is decorative.",
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
name: "Alert",
|
|
1152
|
+
module: "alert",
|
|
1153
|
+
family: "Feedback",
|
|
1154
|
+
summary: "The note primitive under every banner and notice: an icon, a title, a description and an action.",
|
|
1155
|
+
when: "Drawing a notice the composition owners do not cover, inside the package. A product's notice is `NoticeBanner` or `MessageNotice`.",
|
|
1156
|
+
instead: "A condition of a page or the account is `NoticeBanner`; a message about one control or section is `MessageNotice`; a finished action is a toast.",
|
|
1157
|
+
behaviour: "A soft ground, deep text, the 1 px line edge, 6 px corners; the icon leads, the action trails.",
|
|
1158
|
+
words: "Title names the condition; the description what it stops; the action the fix as verb and noun.",
|
|
1159
|
+
access: '`role="alert"` by default; a calmer owner passes `status` or `note`. The icon is hidden.',
|
|
1160
|
+
},
|
|
1161
|
+
{
|
|
1162
|
+
name: "EmptyState",
|
|
1163
|
+
module: "empty-state",
|
|
1164
|
+
family: "Feedback",
|
|
1165
|
+
summary: "What a place with nothing in it says: a first use shows its section's picture, a title, one line and the action that fills it; an empty list, a search that found nothing and a read that failed stay quiet.",
|
|
1166
|
+
when: "A collection, a section or a page has nothing to show: it never had a record (`firstUse`), it is empty right now and fills by itself (`nothingYet`), the search or a filter found nothing (`noResults`), or its read failed (`failed`).",
|
|
1167
|
+
instead: "A list's rows still loading are its skeleton rows, never an empty state. A failure of one record's own action is that record's row message. A failure that blocks the whole page, or a notice about the account, is a `NoticeBanner`.",
|
|
1168
|
+
behaviour: "The frame follows the container: a page or a region stands on a resting card with its own edge, inside a card it takes none, and a collection always passes `card`. A first use's picture comes from the one approved set and arrives once, from faint and soft to sharp, after it loads, with no animation under reduced motion; nothing else moves. Only `firstUse` has a picture or a title; only `failed` has a mark, the warning, with its message as an alert and its actions, Retry among them, as outline buttons.",
|
|
1169
|
+
words: 'A first use\'s title names what is missing ("No mailboxes yet") and its line says what will live there and how it fills, in one sentence. A quiet line is one sentence. Clear says what it clears: "Clear search", "Clear filters". A failure is the catalogue\'s message, never a string of the component\'s own.',
|
|
1170
|
+
access: "A first use's title is a heading, level 2 or, inside a titled section, 3. The picture is decorative. A failure is announced as an alert.",
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
name: "EntryProgress",
|
|
1174
|
+
module: "entry-scene",
|
|
1175
|
+
family: "Feedback",
|
|
1176
|
+
summary: "Measured work on an entry screen: a 2 px line with the product's written count under it.",
|
|
1177
|
+
when: "Work on an entry screen whose progress is measured: downloading an update, the stages of starting Nadia.",
|
|
1178
|
+
instead: "Work whose length is unknown is a WaitingLine; the named stages themselves are the EntryStageList; measured work inside the product is a Progress with its count.",
|
|
1179
|
+
behaviour: "The line keeps the measured fraction, clamped between empty and full; the count under it is the product's own words. It never prints a percentage.",
|
|
1180
|
+
words: 'The count says what is measured, in tabular figures: "Step 2 of 3", "12 of 40 MB". Never an invented percentage.',
|
|
1181
|
+
access: "The count is a status, so assistive technology hears it change; the line is hidden.",
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
name: "EntryStageList",
|
|
1185
|
+
module: "entry-scene",
|
|
1186
|
+
family: "Feedback",
|
|
1187
|
+
summary: "The stages a system runs on an entry screen, each done, current or still to come.",
|
|
1188
|
+
when: 'The real stages of a long setup on an entry screen: installing Nadia, Alveare Server\'s "Get this computer ready".',
|
|
1189
|
+
instead: "Steps the person does are NumberedSteps; the steps of an Agent's run are a RunTimeline.",
|
|
1190
|
+
behaviour: "One mark per stage: done, current, still to come. Followed by the EntryProgress count. Nothing moves but the stage that changes.",
|
|
1191
|
+
words: 'Each stage is what the system does, in the imperative: "Start the chat service".',
|
|
1192
|
+
access: 'An ordered list; the current stage carries `aria-current="step"`; the marks are hidden.',
|
|
1193
|
+
},
|
|
1194
|
+
{
|
|
1195
|
+
name: "HoverCard",
|
|
1196
|
+
module: "hover-card",
|
|
1197
|
+
family: "Feedback",
|
|
1198
|
+
summary: "A preview of a few facts about something named in a dense row.",
|
|
1199
|
+
when: "A preview of a few facts about something named in a dense row: the exact moment behind a relative time, a record's summary.",
|
|
1200
|
+
instead: "For one phrase use `Tooltip`. For anything to edit or keep open use a `Sheet` or the record's page. Never the only way to an action.",
|
|
1201
|
+
behaviour: "Opens on hover and on focus, below by default, 4 px off; stays while the pointer is on it. Solid floating surface, 12 px padding.",
|
|
1202
|
+
words: "Facts, not prose: the date in words, the time with its zone, the machine timestamp. The trigger keeps its verb sentence: *Updated 3 hours ago*.",
|
|
1203
|
+
access: "The trigger is a real element with its own name (a `time` with its `datetime` for a moment), so the facts never depend on hover. Keyboard opening is tested, not assumed.",
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
name: "LabelledPicture",
|
|
1207
|
+
module: "picture-label",
|
|
1208
|
+
family: "Feedback",
|
|
1209
|
+
summary: "A failure page's picture with its label, the way a museum labels a work.",
|
|
1210
|
+
when: "A page that cannot show what was asked for: an address or record that is not there (absence), or a request the product stopped (fault). `PictureLabel` is its label.",
|
|
1211
|
+
instead: "For one region that failed inside a working page use `EmptyState failed`; the rest of the page stays. Never turn the whole page into an error because one card failed.",
|
|
1212
|
+
behaviour: "Picture 256 px, 320 from sm, 384 from lg. The label moves beside the base at lg with an empty column of the same width opposite, so the picture keeps the centre line. Still.",
|
|
1213
|
+
words: "Never apologise, never name the mechanism. The label's title says what the picture is doing; the second line gives its materials and year.",
|
|
1214
|
+
access: "The picture is decorative; the label is a `figcaption`, read once. The page's heading is its `h1`; its actions are real links.",
|
|
1215
|
+
},
|
|
1216
|
+
{
|
|
1217
|
+
name: "MessageNotice",
|
|
1218
|
+
module: "message-notice",
|
|
1219
|
+
family: "Feedback",
|
|
1220
|
+
summary: "A catalogue message about one thing on the screen.",
|
|
1221
|
+
when: "A catalogue message about one thing on the screen: under the control whose write failed (`action`), or atop the section whose condition lasts (`section`).",
|
|
1222
|
+
instead: "For a whole page or the account use `NoticeBanner`. For a finished action use a toast. For a field's wrong value use `FieldError`. For a failed read use `EmptyState failed`.",
|
|
1223
|
+
behaviour: "Tone `destructive` by default, `warning` or `info`. Its actions are outline buttons. Long words wrap, nothing truncates. A successful retry removes it. A `section` message with no action is drawn as the passage under a control, because a banner always carries its fix.",
|
|
1224
|
+
words: "From the catalogue only. Title says what happened to which object; body only when it adds something. Action labelled with its result: *Try again*, *Sign in*.",
|
|
1225
|
+
access: '`action`: `role="alert"` (`status` for info). `section`: `role="status"`, `aria-live="polite"`, atomic. Focus stays where the person was.',
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
name: "NoticeBanner",
|
|
1229
|
+
module: "notice-banner",
|
|
1230
|
+
family: "Feedback",
|
|
1231
|
+
summary: "A condition of the whole page, the account or the service, with its fix.",
|
|
1232
|
+
when: "A condition of the whole page, the account or the service that the page itself can resolve, with that resolving action on the banner. One at a time, above the page's content, under its title.",
|
|
1233
|
+
instead: 'For one section use `MessageNotice placement="section"`. For a measured level use a `KpiCard` with its tone; crossing a threshold is a notification in the inbox, not a banner.',
|
|
1234
|
+
behaviour: "Tone `neutral` (the plain card fill), `info`, `warning`, `destructive`: a soft ground, deep text, the 1 px line edge, 6 px corners; neutral and info take the Info mark, warning and destructive the TriangleAlert. No close button on an unresolved condition. No action, no banner: `action` is required.",
|
|
1235
|
+
words: 'Title names the condition, description what it stops, the action the fix as verb and noun: "Open Slack settings", "Sign in". Sentence case, no "Please". The words come from the product\'s catalogue code.',
|
|
1236
|
+
access: '`liveRegion="polite"` gives `role="status"`, announced once when it appears; `"off"` gives `role="note"` for one already there at load. The mark is hidden.',
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
name: "PendingLabel",
|
|
1240
|
+
module: "pending-label",
|
|
1241
|
+
family: "Feedback",
|
|
1242
|
+
summary: "A control's own label while the system works on what it was asked to do.",
|
|
1243
|
+
when: "Every control that starts work the system does: from the press until the result, whatever the wait. Under about a second it is the only sign. Every save in a footer goes through it.",
|
|
1244
|
+
instead: "Past a second add one `WaitingLine` beside the control. An Agent's work is never this: it is her orb and a sentence. A queued or paused request is a status.",
|
|
1245
|
+
behaviour: "Swaps the word, nothing else: same place, size and icon. The caller sets `disabled` (50% opacity) and `aria-busy` and blocks a second submit, because only the caller knows which element the wait belongs to. Failure returns the rest label.",
|
|
1246
|
+
words: "The rest label's verb in its -ing form with the same noun: *Remove mailbox* to *Removing mailbox*. No ellipsis, no *Please wait*.",
|
|
1247
|
+
access: "`aria-busy` on the control; its name changes to the pending word and is read once. Focus stays on it.",
|
|
1248
|
+
},
|
|
1249
|
+
{
|
|
1250
|
+
name: "Skeleton",
|
|
1251
|
+
module: "skeleton",
|
|
1252
|
+
family: "Feedback",
|
|
1253
|
+
summary: "A still placeholder in the shape of content whose layout is known.",
|
|
1254
|
+
when: "A page or region whose layout is known while its data loads.",
|
|
1255
|
+
instead: "For a wait on something the person pressed use `PendingLabel` and `WaitingLine`. Unknown layout shows nothing until data. Never both a skeleton and a line.",
|
|
1256
|
+
behaviour: "The `line` fill, which stays visible on the card and on the workspace ground in both modes; 6 px corners or a circle, in the final shape so nothing shifts. Never pulses. Resolves to data, an absence or a failure.",
|
|
1257
|
+
words: 'None. No "Loading" text beside it.',
|
|
1258
|
+
access: "The region is `aria-busy`; each placeholder is hidden and never focusable.",
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
name: "Toaster",
|
|
1262
|
+
module: "sonner",
|
|
1263
|
+
family: "Feedback",
|
|
1264
|
+
summary: "The one place toasts appear, mounted once per product.",
|
|
1265
|
+
when: "One acknowledgement of an action the person took, when the result is not already visible where they are looking; and the Undo of a reversible removal. Mount it once; raise toasts through `toast`.",
|
|
1266
|
+
instead: "For a failure that must stay, use `MessageNotice` by the control. For unsaved work, failed payment or lost access never a toast alone. For a condition use a banner.",
|
|
1267
|
+
behaviour: "Tone `success`, `info`, `warning`, `error`; mark in the deep step. The first action with a handler becomes its one button. Undo only where a safe rollback exists. A toast that stays up shows the waiting line, not a spinner.",
|
|
1268
|
+
words: "Completion is noun, past participle: *Mailbox removed*, *Agent created*, paired one to one with its button *Remove mailbox*. No *successfully*, no exclamation.",
|
|
1269
|
+
access: "Announced by the toaster's live region. Never the only route to recovery: the record's own row keeps its controls. Undo is reachable by keyboard (Alt+T moves focus to the toasts) while it shows.",
|
|
1270
|
+
},
|
|
1271
|
+
{
|
|
1272
|
+
name: "Tooltip",
|
|
1273
|
+
module: "tooltip",
|
|
1274
|
+
family: "Feedback",
|
|
1275
|
+
summary: "A short, optional fact about its trigger.",
|
|
1276
|
+
when: "A short, optional fact the visible label cannot hold: why a value looks as it does, or an icon-only button's name, a shortcut only when one is bound.",
|
|
1277
|
+
instead: "For a preview with several facts use `HoverCard`. Help with a link uses a popover. A disabled command's reason is written under it, never only here.",
|
|
1278
|
+
behaviour: "Opens on hover and focus with no delay, above by default, 4 px off. Escape closes it. Never interactive; never the only home of a warning, a price or a reason.",
|
|
1279
|
+
words: "One phrase, sentence case, no full stop: *Resets on 1 November*. Never repeats the visible label (*Save* on Save).",
|
|
1280
|
+
access: "The trigger keeps its own name; the tooltip describes it. An icon-only button carries `aria-label` whether or not the tooltip is open.",
|
|
1281
|
+
},
|
|
1282
|
+
{
|
|
1283
|
+
name: "UpdateCard",
|
|
1284
|
+
module: "update-card",
|
|
1285
|
+
family: "Feedback",
|
|
1286
|
+
summary: "The update offer at the foot of a desktop app's sidebar, above the account.",
|
|
1287
|
+
when: "Nadia's and Alveare's sidebar foot, only while an update is on offer or has just been installed.",
|
|
1288
|
+
instead: "A failed update or a download that needs the person is a NoticeBanner; the Portal's way to get the app is its Downloads row.",
|
|
1289
|
+
behaviour: "Available: the title, the version and one full-width command that keeps its place and says its pending word while it runs. Updated: the title, the version and a close. Narrow, the card is one icon button whose tooltip shows the title and the version. Nothing else in the window offers the update.",
|
|
1290
|
+
words: 'The title says what happened ("Update available"), the version names the product and its number ("Nadia 0.42.0"), and the command says its result ("Update and restart").',
|
|
1291
|
+
access: 'The card is a region named by its title. The narrow button is named by its command and the version ("Update and restart: Nadia 0.42.0"), and the close carries its label; a running command is aria-busy.',
|
|
1292
|
+
},
|
|
1293
|
+
{
|
|
1294
|
+
name: "WaitingLine",
|
|
1295
|
+
module: "waiting-line",
|
|
1296
|
+
family: "Feedback",
|
|
1297
|
+
summary: "The one moving thing a system wait may show: a 2 px ink line, after a second.",
|
|
1298
|
+
when: "A system wait the person asked for that runs past a second: a save, a connection, a download without a count.",
|
|
1299
|
+
instead: "Under a second the `PendingLabel` alone. A known amount is a progress line with a count. A page load is `Skeleton`. An Agent working is her orb and a sentence.",
|
|
1300
|
+
behaviour: "Takes its 2 px from the start and stays empty until 1 s, so its arrival moves nothing. No track colour; the segment is ink, never info blue, crossing at 32% width. Under reduced motion it breathes.",
|
|
1301
|
+
words: "None of its own. The control beside it carries the pending word; a standalone line takes a `label` naming the work: *Connecting Telegram*.",
|
|
1302
|
+
access: 'With a label: `role="status"`, announced once after the second. `decorative` when the control beside it already says it. The segment is hidden.',
|
|
1303
|
+
},
|
|
1304
|
+
{
|
|
1305
|
+
name: "AccountMenu",
|
|
1306
|
+
module: "account-menu",
|
|
1307
|
+
family: "Menus",
|
|
1308
|
+
summary: "The account menu at the foot of a shell's navigation: whose account it is, and the menu opening on that same identity with what they can do beneath it.",
|
|
1309
|
+
when: "The account at the sidebar's foot in the Portal, Nadia and Alveare: the gear to the account's settings, Theme, Language, a product's own settings, its commands, and Sign out.",
|
|
1310
|
+
instead: "A record's or a page's commands are an ActionMenu; a setting with more than a few options or one that needs a Save belongs on a SettingsPage.",
|
|
1311
|
+
behaviour: "The menu opens upward on the identity. In order: the gear, Theme, Language, the product's choices as submenus, its commands with any reading at their end, and Sign out last in the error colour. Theme and Language apply at once and keep the menu open. While signing out, Sign out says its pending word, the menu stays open and the trigger is locked; a failure shows under it. A Sign out that `confirms` closes the menu instead, for the product's own confirmation.",
|
|
1312
|
+
words: 'The menu\'s name ("Account"), the person\'s name and lines, then each row\'s noun or verb from the product\'s catalogue: "Theme", "Language", "Usage", "Sign out" and "Signing out".',
|
|
1313
|
+
access: 'The trigger and the menu are named "{label}: {name}"; the gear carries its label; the pending sign-out is aria-busy and announced through a status; a failure is an alert.',
|
|
1314
|
+
},
|
|
1315
|
+
{
|
|
1316
|
+
name: "ActionContextMenu",
|
|
1317
|
+
module: "action-menu",
|
|
1318
|
+
family: "Menus",
|
|
1319
|
+
summary: "A record's menu opened from its row by a right-click: the mirror of its `ActionMenu`.",
|
|
1320
|
+
when: "A right-click or long-press convenience on a record that already has a visible menu with the same commands.",
|
|
1321
|
+
instead: "For anything a person must find use the visible three dots or a button: a context menu is never the only way. For global search use `CommandDialog`.",
|
|
1322
|
+
behaviour: "The dropdown's surface and rows exactly, opening at the pointer. The same commands in the same order, the same disabled reasons, destructive last after a divider. With no command the row renders alone.",
|
|
1323
|
+
words: "Identical to the visible menu's, in the same order; a command reached two ways reads the same both ways.",
|
|
1324
|
+
access: "The Menu key and Shift+F10 open it on the focused row. The menu is named by `label`; Escape closes it and returns focus to the row.",
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
name: "ActionMenu",
|
|
1328
|
+
module: "action-menu",
|
|
1329
|
+
family: "Menus",
|
|
1330
|
+
summary: "A record's three dots: the menu of its secondary commands, headed by the record's name.",
|
|
1331
|
+
when: "The secondary commands of one record from a visible trigger: the row's three dots, or the page's, which comes last in the title row.",
|
|
1332
|
+
instead: "For a record's main task use a visible button (Edit opens the row). For finding across everything use `CommandDialog`. For a value to choose use `Select`. For right-click use the mirror, `ActionContextMenu`.",
|
|
1333
|
+
behaviour: "Ghost 36 px trigger that keeps its fill while open. The menu opens aligned to the trigger's end, 6 px below: the record's name, the commands with their icons first and the value one acts on in mono under it, then the destructive ones after a divider in the error colour. Typeahead, arrows, Escape returns focus. A disabled command stays, greyed, with its reason under it. Nothing renders with no command.",
|
|
1334
|
+
words: 'The trigger reads "More for {record}"; the header is the record\'s name. Commands are verb and noun in sentence case, "Remove mailbox", never a bare "Delete". About ten at most; rows wrap, never truncate.',
|
|
1335
|
+
access: 'The trigger is a ghost icon button named by `label`, `aria-expanded` while open. `role="menu"`, items `menuitem` in a group named by the record; the value a command acts on and its reason are the item\'s description; icons hidden.',
|
|
1336
|
+
},
|
|
1337
|
+
{
|
|
1338
|
+
name: "AlertDialog",
|
|
1339
|
+
module: "alert-dialog",
|
|
1340
|
+
family: "Menus",
|
|
1341
|
+
summary: "The blocking dialog primitive under `ConfirmDialog`.",
|
|
1342
|
+
when: "Before an action that stops or loses something, through `ConfirmDialog`, which owns the words and the pending state.",
|
|
1343
|
+
instead: "A product confirms with `ConfirmDialog`, never a hand-built alert dialog. A reversible local change needs no confirmation; give it Undo in a toast.",
|
|
1344
|
+
behaviour: "No backdrop dismissal; Escape cancels. `AlertDialogAction` closes on press; a confirm that can fail is a plain button so the dialog stays open with the error.",
|
|
1345
|
+
words: "Title a statement naming the record, never a question. Body the consequence, once.",
|
|
1346
|
+
access: '`role="alertdialog"`, named by the title and described by the consequence. Focus starts on Cancel, the safe choice.',
|
|
1347
|
+
},
|
|
1348
|
+
{
|
|
1349
|
+
name: "ContextMenu",
|
|
1350
|
+
module: "context-menu",
|
|
1351
|
+
family: "Menus",
|
|
1352
|
+
summary: "A menu that opens at the pointer on a right-click, from the dropdown's own parts.",
|
|
1353
|
+
when: "A right-click on a canvas or a surface no record owns, whose commands are also reachable another way.",
|
|
1354
|
+
instead: "A record's right-click is `ActionContextMenu`, from the same data as its `ActionMenu`. A context menu is never the only way to a command: give it a visible trigger too.",
|
|
1355
|
+
behaviour: "The dropdown's surface and rows exactly, opening at the pointer on the right. Destructive last, after a divider. One level of submenu at most.",
|
|
1356
|
+
words: "Identical to the visible menu's, in the same order; a command reached two ways reads the same both ways.",
|
|
1357
|
+
access: "The Menu key and Shift+F10 open it on the focused element. Escape closes it and returns focus to that element.",
|
|
1358
|
+
},
|
|
1359
|
+
{
|
|
1360
|
+
name: "Dialog",
|
|
1361
|
+
module: "dialog",
|
|
1362
|
+
family: "Menus",
|
|
1363
|
+
summary: "A centred modal for a bounded job the person finishes or cancels.",
|
|
1364
|
+
when: "A new record through a few fields, or one or two values changed from a command: a bounded job the person finishes or cancels. Usually reached through `FormDialog`.",
|
|
1365
|
+
instead: "A record already in a list edits inside its row. A catalogue or a setup in steps is `FormDrawer`. A consequence is `ConfirmDialog`. A linkable workflow is its own page.",
|
|
1366
|
+
behaviour: "Centred, 384 px, 24 px padding, 16 px gaps, 12 px corners, modal height over the 50% scrim. `DialogBody` scrolls between a header and footer that stay. Footer recessed behind a hairline, Cancel then the primary at the trailing edge.",
|
|
1367
|
+
words: "Title is verb and noun (*Add MCP server*); the primary repeats it (*Add server*); the pending word is its -ing form. The failure comes from the catalogue, above the footer.",
|
|
1368
|
+
access: '`role="dialog"` named by its title. Focus starts on the first field, is held inside, returns to the opener. Escape and the named close button dismiss when nothing is running.',
|
|
1369
|
+
},
|
|
1370
|
+
{
|
|
1371
|
+
name: "Drawer",
|
|
1372
|
+
module: "drawer",
|
|
1373
|
+
family: "Menus",
|
|
1374
|
+
summary: "The low-level swipe drawer primitive.",
|
|
1375
|
+
when: "A surface that slides from an edge and follows a swipe. No screen calls it today; screens use `FormDrawer`.",
|
|
1376
|
+
instead: "A catalogue or a setup in steps is `FormDrawer`. Context beside a record is `Sheet`. A few fields are `FormDialog`.",
|
|
1377
|
+
behaviour: "Opens from its swipe direction and follows the finger; nested drawers stack. The header and footer stay while the body scrolls, each drawing the one hairline that separates it.",
|
|
1378
|
+
words: "Title is what it does to which record: *Connect Telegram*.",
|
|
1379
|
+
access: "A modal dialog named by its title with a named close; focus returns to the trigger.",
|
|
1380
|
+
},
|
|
1381
|
+
{
|
|
1382
|
+
name: "DropdownMenu",
|
|
1383
|
+
module: "dropdown-menu",
|
|
1384
|
+
family: "Menus",
|
|
1385
|
+
summary: "A menu that floats from a visible trigger, built from its parts: the surface, labelled groups, commands, choices and dividers.",
|
|
1386
|
+
when: "A menu no composition draws: a column chooser, a sort, a product's own choices in a submenu.",
|
|
1387
|
+
instead: "A record's or a page's commands are `ActionMenu` or `PageActions`' menu, from data. The account's rows are `AccountMenu`. A value to choose in a form is `Select`; finding across everything is `CommandDialog`.",
|
|
1388
|
+
behaviour: "Solid floating surface, 12 px corners, 4 px inset, at least 224 px. Rows 36 px (44 on touch), 12 px padding, accent fill on hover and focus. Opens on click; typeahead, arrows, Escape returns focus to the trigger. A `DropdownMenuCommand` leads with its icon; one that cannot run stays, greyed, with its reason under it.",
|
|
1389
|
+
words: 'Commands are verb and noun in sentence case, "Remove mailbox", never a bare "Delete". About ten at most. Italian runs a third longer; rows wrap, never truncate.',
|
|
1390
|
+
access: '`role="menu"`, items `menuitem`, the trigger `aria-expanded` while open. A command\'s icon is hidden; the value it acts on and its reason are its description.',
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
name: "GlassControl",
|
|
1394
|
+
module: "glass-control",
|
|
1395
|
+
family: "Menus",
|
|
1396
|
+
summary: "A control or a bar on glass, floating over content that moves under it.",
|
|
1397
|
+
when: "A control that floats over content passing under it: a period picker over a chart, a bar over the product view.",
|
|
1398
|
+
instead: "A control on a solid ground is drawn plain; glass over nothing reads as a bordered box. A toolbar over its own rows is `CollectionToolbar`.",
|
|
1399
|
+
behaviour: 'The glass material at the floating height; `shape="control"` takes 6 px corners, `shape="bar"` none. The caller renders the element through `render`.',
|
|
1400
|
+
words: "None of its own.",
|
|
1401
|
+
access: "Takes the semantics of what it renders; the glass is paint.",
|
|
1402
|
+
},
|
|
1403
|
+
{
|
|
1404
|
+
name: "MenuChoiceRow",
|
|
1405
|
+
module: "menu-choice-row",
|
|
1406
|
+
family: "Menus",
|
|
1407
|
+
summary: "A named preference inside a menu: its icon and label at the leading edge, the exclusive choices together at the trailing edge, close enough to read as one control.",
|
|
1408
|
+
when: "A setting that applies at once from inside a menu: the account menu's Theme and Language.",
|
|
1409
|
+
instead: "A product's own setting with more choices or longer names is a submenu of radio items (`AccountMenu`'s `choices`). A setting on a page is a `ToggleGroup` or a `Select` in its section.",
|
|
1410
|
+
behaviour: "Icon and label lead, on the commands' 12 px line; the choices sit in one bordered group at the trailing edge. Choosing applies at once and keeps the menu open, so the result shows without reopening it.",
|
|
1411
|
+
words: 'The label is a noun: "Theme", "Language". Each choice carries a full name even when it shows a glyph or a short code: "EN" is named "English".',
|
|
1412
|
+
access: "A radio group named by the label; each choice is a radio named by its `label`, with the same text as its tooltip. The icon is hidden.",
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
name: "Menubar",
|
|
1416
|
+
module: "menubar",
|
|
1417
|
+
family: "Menus",
|
|
1418
|
+
summary: "A row of menus, as a desktop application's menu bar.",
|
|
1419
|
+
when: "A desktop surface whose commands are many and grouped, as an application's File and Edit menus are.",
|
|
1420
|
+
instead: "A record's commands are its `ActionMenu`; a page's are `PageActions`. Finding anything is `CommandDialog`.",
|
|
1421
|
+
behaviour: "Each menu has the dropdown's surface and rows. Arrow keys move between menus and through items; Escape closes and returns focus to the bar.",
|
|
1422
|
+
words: "Menu names are single nouns; items are verb and noun in sentence case.",
|
|
1423
|
+
access: '`role="menubar"`; each trigger exposes `aria-expanded`; items are `menuitem`s.',
|
|
1424
|
+
},
|
|
1425
|
+
{
|
|
1426
|
+
name: "Popover",
|
|
1427
|
+
module: "popover",
|
|
1428
|
+
family: "Menus",
|
|
1429
|
+
summary: "A small control set tied to its trigger, on glass.",
|
|
1430
|
+
when: "A small control set tied to its trigger: filters, a scope chooser, a date range, a feedback form. The page stays live behind it.",
|
|
1431
|
+
instead: "For commands use `DropdownMenu`. For a form that adds a record use `FormDialog`. For one phrase use `Tooltip`; for facts on hover use `HoverCard`.",
|
|
1432
|
+
behaviour: "Glass floating surface, 12 px padding and gap. Opens on click, closes on Escape or outside press, focus returns to the trigger. Applies at once; no Save inside.",
|
|
1433
|
+
words: "Title names the control's job (*Filter skills*); an optional one-line description. Options are nouns.",
|
|
1434
|
+
access: "Trigger has a visible name and `aria-expanded`. The popup is a labelled dialog that does not trap focus; Tab leaves it in order.",
|
|
1435
|
+
},
|
|
1436
|
+
{
|
|
1437
|
+
name: "Sheet",
|
|
1438
|
+
module: "sheet",
|
|
1439
|
+
family: "Menus",
|
|
1440
|
+
summary: "A panel beside a record, or the navigation on a narrow window.",
|
|
1441
|
+
when: "Context that belongs beside a record: inspecting a row's details. And the product's navigation when the window is too narrow for the sidebar.",
|
|
1442
|
+
instead: "For a catalogue or steps use `FormDrawer` (built on this). For editing use the row or the record's page. For a blocking decision use `ConfirmDialog`.",
|
|
1443
|
+
behaviour: "From any side, 12 px from the edges, 12 px corners all round, modal over the scrim. Default 3/4 of the window up to 384 px; navigation 288 px. Header 24 px padding; body scrolls; footer recessed.",
|
|
1444
|
+
words: "Title is the record's name, never the page's heading again. A footer link names where it goes: *Open Rossi Ottica*.",
|
|
1445
|
+
access: "A modal dialog named by its title with a named close. Focus returns to the row it inspects, or to the navigation button.",
|
|
1446
|
+
},
|
|
1447
|
+
{
|
|
1448
|
+
name: "ThemeModeMenu",
|
|
1449
|
+
module: "theme-mode-switcher",
|
|
1450
|
+
family: "Menus",
|
|
1451
|
+
summary: "The appearance as one row of a menu: its name and the current mode's glyph leading, the three modes as compact choices at its end.",
|
|
1452
|
+
when: "The account menu's Theme row, in the Portal and in Nadia.",
|
|
1453
|
+
instead: "On a settings page the choice is ThemeModeSwitcher, with its names shown.",
|
|
1454
|
+
behaviour: "Choosing a mode applies it at once and keeps the menu open, so the result shows without reopening it. The order is System, Light, Dark.",
|
|
1455
|
+
words: "The row's name (\"Theme\") and each mode's name, read as the choice's accessible name and tooltip.",
|
|
1456
|
+
access: "A radio group inside the menu, named by the row's label; each mode is a menu radio item with its name.",
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
name: "ActivityCalendar",
|
|
1460
|
+
module: "activity-calendar",
|
|
1461
|
+
family: "Charts",
|
|
1462
|
+
summary: "On which days activity happened, as a year of cells.",
|
|
1463
|
+
when: "On which measured days activity happened, over the window the data covers, up to the last 365 days.",
|
|
1464
|
+
instead: "Never added to fill a row. Amounts over time are a bar or area chart. It follows the selected metric and names its own from-to window.",
|
|
1465
|
+
behaviour: "One hue, chart-1, at four steps of opacity over an empty day; a legend from Less to More. Only measured history: unknown coverage stays unknown, never zero.",
|
|
1466
|
+
words: "The window as dates in the description. Each day's label: *8 October 2026: 42 requests*.",
|
|
1467
|
+
access: "Every day is a named cell for assistive technology; the legend steps are named too. Colour is never the only reading: the value is in each label.",
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
name: "ChartAreaStacked",
|
|
1471
|
+
module: "chart-area-stacked",
|
|
1472
|
+
family: "Charts",
|
|
1473
|
+
summary: "A continuous volume building up over time, as stacked areas.",
|
|
1474
|
+
when: "A continuous volume building up over time, in three series or fewer: Included usage against Extra usage.",
|
|
1475
|
+
instead: "More than three series, or discrete daily totals, use `ChartBarStacked`. A cap reading is `Progress`.",
|
|
1476
|
+
behaviour: "Stacked natural curves, each filled with its entity's hue at 40% and stroked at full strength. Value axis and dashed grid as every chart.",
|
|
1477
|
+
words: 'Series named for what the person buys: "Included usage", "Extra usage". Axis scale in M; the tooltip prints the exact token count.',
|
|
1478
|
+
access: "Named by its title. A delta that is neither good nor bad, like volume, takes the neutral tone.",
|
|
1479
|
+
},
|
|
1480
|
+
{
|
|
1481
|
+
name: "ChartBarHorizontal",
|
|
1482
|
+
module: "chart-bar-horizontal",
|
|
1483
|
+
family: "Charts",
|
|
1484
|
+
summary: "A signed comparison across entities: profit to the right, loss to the left of a zero line.",
|
|
1485
|
+
when: "Which Customers contribute profit or loss: a signed comparison across entities.",
|
|
1486
|
+
instead: "Never encode a loss as a share. An unsigned ranking is the compact `Progress` ranking or a `DataTable`.",
|
|
1487
|
+
behaviour: "Horizontal bars from a 1.5 px zero line: favourable values to the right in success with right corners rounded, unfavourable to the left in destructive with left corners rounded.",
|
|
1488
|
+
words: "The money unit in the period or the axis. Losses stay negative, written with a true minus: −€360.",
|
|
1489
|
+
access: "Each bar's sign is in its position and its tooltip, never only its colour. Category labels are text, readable without hue.",
|
|
1490
|
+
},
|
|
1491
|
+
{
|
|
1492
|
+
name: "ChartBarMultiple",
|
|
1493
|
+
module: "chart-bar-multiple",
|
|
1494
|
+
family: "Charts",
|
|
1495
|
+
summary: "Grouped bars: two or more measures side by side per period, on one axis in one unit.",
|
|
1496
|
+
when: "Two money measures compared period by period: monthly recurring revenue against model cost.",
|
|
1497
|
+
instead: "Never a second axis: a ratio such as gross margin is a `KpiCard` beside it. One measure split by entity is `ChartBarStacked`.",
|
|
1498
|
+
behaviour: "Bars side by side in series order, 4 px gap, every corner 4 px, at most 48 px wide, one shared value axis on nice steps.",
|
|
1499
|
+
words: 'Series named in full: "Monthly recurring revenue", "Model cost". Months as short names on the axis, the full month in the tooltip.',
|
|
1500
|
+
access: "The plot is named by its title; each bar's figure is in the tooltip and, where the page needs it, a table.",
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
name: "ChartBarStacked",
|
|
1504
|
+
module: "chart-bar-stacked",
|
|
1505
|
+
family: "Charts",
|
|
1506
|
+
summary: "One total over time, each bar split by entity; with `share`, one bar split to 100%.",
|
|
1507
|
+
when: "How a total moved over time split by Customer, member account or model; with `share`, what part of one total each holds, with no time axis.",
|
|
1508
|
+
instead: "For a continuous volume in three series or fewer use `ChartAreaStacked`. Two measures side by side use `ChartBarMultiple`. Exact lookup is a table.",
|
|
1509
|
+
behaviour: 'Stacked in series order, bottom segment rounded below and top above at 4 px, bars at most 48 px. The Portal names five entities and folds the rest into "Everything else". The share plot is 64 px, legend included.',
|
|
1510
|
+
words: 'Entity names as the reader knows them, never ids. The neutral remainder is "Everything else". Values through the page\'s shared money formatter.',
|
|
1511
|
+
access: "The plot is an image named by the card title; the tooltip and legend are read with it. The share bar sits above the full-width table that carries each figure.",
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
name: "ChartCard",
|
|
1515
|
+
module: "chart-card",
|
|
1516
|
+
family: "Charts",
|
|
1517
|
+
summary: "The card every chart in the kit renders: one header, the summary, the plot, its legend and the reading's time. The plots (`ChartBarStacked`, `ChartAreaStacked`, `ChartBarMultiple`, `ChartBarHorizontal`) hold only their own plot; a page never builds a chart card frame by hand.",
|
|
1518
|
+
when: "Every chart and every reading built around one: the frame a page never builds by hand. A chart is a named section of its page.",
|
|
1519
|
+
instead: "A single figure is a `KpiCard`, never nested inside a chart. A ranking beside the plot goes in the card's `aside`, not a second card.",
|
|
1520
|
+
behaviour: "Header grid: title and period in the first column, controls in the second from a 28 rem card width, under the title below it. Summary, plot, legend, footer in that order. An empty dataset shows its `emptyState` in the plot's place. The footer is a recessed strip behind a hairline: the reading's time left, the link to its owner right.",
|
|
1521
|
+
words: 'Title names the measure and its split: "Model spend by Customer". Period as dates. Footer: the reading\'s time, "Updated 4 minutes ago" or "Read at 12:42", and the way to its owner, "Open in Analytics". Sentence case throughout.',
|
|
1522
|
+
access: "The title is a heading at the page's level (default 2) and labels the plot. The plot is focusable and shows the 2 px focus outline only on keyboard focus.",
|
|
1523
|
+
},
|
|
1524
|
+
{
|
|
1525
|
+
name: "ChartContainer",
|
|
1526
|
+
module: "chart",
|
|
1527
|
+
family: "Charts",
|
|
1528
|
+
summary: "shadcn's chart foundation: the Recharts container, its tooltip and its legend, themed by the series config.",
|
|
1529
|
+
when: "Inside a kit plot only: `ChartBarStacked`, `ChartAreaStacked`, `ChartBarMultiple`, `ChartBarHorizontal`, `ChartSparkline` render through it.",
|
|
1530
|
+
instead: "A page renders a kit plot in its `ChartCard`, never this container or a Recharts import of its own. A chart the kit lacks is pulled from the shadcn registry into the kit first.",
|
|
1531
|
+
behaviour: "Maps each series id to its colour token, sizes the plot to its frame, and draws the tooltip with the exact figure and the legend below the plot: an 8 px dot, 6 px to the name, 16 px between, left-aligned and wrapping.",
|
|
1532
|
+
words: "None of its own: series labels come from the config the plot builds from the page's words.",
|
|
1533
|
+
access: "The plot it holds is named by the card title through `aria-labelledby`; Recharts' accessibility layer makes it keyboard focusable.",
|
|
1534
|
+
},
|
|
1535
|
+
{
|
|
1536
|
+
name: "ChartSparkline",
|
|
1537
|
+
module: "chart-sparkline",
|
|
1538
|
+
family: "Charts",
|
|
1539
|
+
summary: "The stock linear line with nothing around it: no axes, no grid, no tooltip, no card.",
|
|
1540
|
+
when: "What is trending: a row in a list, beside its name and its delta.",
|
|
1541
|
+
instead: "When the reader needs values, axes or a period, use a full chart card. A KPI value carries its delta badge, not a sparkline, unless the card owns one.",
|
|
1542
|
+
behaviour: "96 by 32 px, a 2 px linear line. Stroke is one chart token or the entity's colour.",
|
|
1543
|
+
words: 'None of its own. The row names the measure and the window: "Requests · past 8 weeks".',
|
|
1544
|
+
access: "Decorative by default, hidden from assistive technology, because the value and delta beside it carry the reading. Standalone it takes a `label` and becomes an image.",
|
|
1545
|
+
},
|
|
1546
|
+
{
|
|
1547
|
+
name: "DateRangeControl",
|
|
1548
|
+
module: "chart-date-range-control",
|
|
1549
|
+
family: "Charts",
|
|
1550
|
+
summary: "The period a chart reads: a `Select` of presets with a custom window from a calendar.",
|
|
1551
|
+
when: "The reading period of an overview or a chart: on the title row through `PageActions`' `period`, or in a `ChartCard`'s `controls` where the page has none.",
|
|
1552
|
+
instead: "A choice of metric is a `ToggleGroup` in the card's controls. A date a person enters in a form is a date field.",
|
|
1553
|
+
behaviour: "One select with the presets and a custom window; the value is encoded into the URL by the caller with `encodeDateRange`.",
|
|
1554
|
+
words: 'Presets name the window: "Past 7 days", "Past 14 days", "Past 30 days", "This cycle". A custom window reads as its dates.',
|
|
1555
|
+
access: "The select carries the control's accessible name and announces the current range.",
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
name: "KpiCard",
|
|
1559
|
+
module: "kpi-card",
|
|
1560
|
+
family: "Charts",
|
|
1561
|
+
summary: "One measured figure, the way the dashboard-01 section card shows it: the label above the value, the change top right as a badge, and the named comparison in the footer (`rule/kpi-card-trend-top-right`).",
|
|
1562
|
+
when: "One figure a person checks at a glance: Active Agents, Spend, Tasks done, Need attention, in an overview's row of figures.",
|
|
1563
|
+
instead: "A figure read over time is a `ChartCard`, and a single figure is never nested inside one. A ratio beside two money measures is a `KpiCard` next to the chart, never a second axis. A level against a cap is `Progress`.",
|
|
1564
|
+
behaviour: "Label left and the change badge right on the first line, the value under them, the comparison in the footer. A figure with no comparison shows no badge and no empty footer. Direction crossed with whether up is good sets the badge icon's tone: success, blocked, or grey for a flat or neutral measure. `tone` marks the value itself as warning or critical when it crosses a threshold.",
|
|
1565
|
+
words: 'The label names the measure in sentence case: "Active Agents", "Spend". The change is signed with a true minus and its unit ("+12.4%", "−1"), the comparison names the period: "vs 16 last week", "vs August 2026". No icon beside the label.',
|
|
1566
|
+
access: "The trend icon is hidden and the direction is read as a word in the reader's language (`directionLabel`). Figures use tabular digits. The value is text, never only colour.",
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
name: "TrendBadge",
|
|
1570
|
+
module: "trend-badge",
|
|
1571
|
+
family: "Charts",
|
|
1572
|
+
summary: "A change against a stated period, as an outline badge with its direction.",
|
|
1573
|
+
when: "A change against a stated period: on a `KpiCard` top right, in a chart's summary, on a Trending row. A figure with no comparison shows no badge.",
|
|
1574
|
+
instead: "A level that crosses a threshold is the card's own tone; crossing it is a notification. Status is a `StatusBadge`, never a delta.",
|
|
1575
|
+
behaviour: "Direction crossed with whether up is good (`trendTone`) sets the icon's tone: success green or blocked red; flat or a neutral measure stays grey. The badge text stays ink.",
|
|
1576
|
+
words: "Signed value with a true minus and its unit (+12.4%, −€360), then *vs previous 30 days* or *vs August 2026*. Never bare signed text, colour alone or a triangle glyph.",
|
|
1577
|
+
access: "The icon is hidden and the direction is read as a word (*up*, *down*, *unchanged*) in the reader's language; tabular figures keep the digits aligned.",
|
|
1578
|
+
},
|
|
1579
|
+
{
|
|
1580
|
+
name: "createEntityColorMap",
|
|
1581
|
+
module: "chart-entity-colors",
|
|
1582
|
+
family: "Charts",
|
|
1583
|
+
summary: 'Assigns `var(--nc-chart-1..6)` in fixed order by FIRST APPEARANCE of each stable entity id. Duplicate ids keep their first assignment. Entities past the sixth unique id fold to the neutral "other" register.',
|
|
1584
|
+
when: "Once per surface, from the full list of entities the page shows, passed to every chart and table row on it.",
|
|
1585
|
+
instead: "Never a hue picked by rank, position or index, and never a colour meaning health or trend: status is a `StatusBadge`, a change is a `TrendBadge`.",
|
|
1586
|
+
behaviour: "A hue follows its entity: one assignment per surface, the same in the chart and its table, stable through filtering and sorting. Six categorical hues colour data and nothing else; past six the tail folds into one neutral series in the muted ink, summed per bucket.",
|
|
1587
|
+
words: 'None of its own. The folded tail is named by the page: "Everything else".',
|
|
1588
|
+
access: "Hue is never the only reading: the legend is always on and every value is text in the tooltip or a table.",
|
|
1589
|
+
},
|
|
1590
|
+
{
|
|
1591
|
+
name: "Accordion",
|
|
1592
|
+
module: "accordion",
|
|
1593
|
+
family: "Other",
|
|
1594
|
+
summary: "Sections that open and close under their headings.",
|
|
1595
|
+
when: "Optional or advanced content in named sections, such as the questions of a help page.",
|
|
1596
|
+
instead: "One piece of supporting detail is `Disclosure`. A long block cut short is `ExpandableBlock`. The page's main answer is never hidden in one.",
|
|
1597
|
+
behaviour: "Related sections may stay open together; exclusive ones open one at a time. The trigger's chevron turns when open.",
|
|
1598
|
+
words: "Each trigger names its topic as a noun phrase or a question a person asks.",
|
|
1599
|
+
access: "Each trigger is a `button` with `aria-expanded` controlling its panel; headings keep the page's outline.",
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
name: "AspectRatio",
|
|
1603
|
+
module: "aspect-ratio",
|
|
1604
|
+
family: "Other",
|
|
1605
|
+
summary: "A box that keeps its width-to-height ratio.",
|
|
1606
|
+
when: "A picture or a captured screen that must keep its shape while its width changes.",
|
|
1607
|
+
instead: "A fixed-size mark is its own component (`AppMark`, `AgentOrb`).",
|
|
1608
|
+
behaviour: "The height follows the width at `ratio`; the content fills it.",
|
|
1609
|
+
words: "None of its own.",
|
|
1610
|
+
access: "A layout container; the content keeps its own alternative text.",
|
|
1611
|
+
},
|
|
1612
|
+
{
|
|
1613
|
+
name: "BrandField",
|
|
1614
|
+
module: "brand-field",
|
|
1615
|
+
family: "Other",
|
|
1616
|
+
summary: "BrandField is the fixed white-on-ink identity plane for composition.",
|
|
1617
|
+
when: "A plane of the company's identity on the website or an entry screen, where the brand is the ground.",
|
|
1618
|
+
instead: "A product surface is a `Card` or the page ground. Identity colour as a ground belongs to the website.",
|
|
1619
|
+
behaviour: "Dark by nature: every role and control inside takes its dark value in either theme. No interaction, state or colour variant.",
|
|
1620
|
+
words: "None of its own.",
|
|
1621
|
+
access: "A plain container.",
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
name: "Carousel",
|
|
1625
|
+
module: "carousel",
|
|
1626
|
+
family: "Other",
|
|
1627
|
+
summary: "A rail of slides moved with Previous and Next.",
|
|
1628
|
+
when: "A controlled rail of like items on the website: screens, testimonials.",
|
|
1629
|
+
instead: "A product's records are a list or a table, never a carousel. One overflowing row is `ScrollArea`.",
|
|
1630
|
+
behaviour: "Slides move by swipe, drag or the Previous and Next buttons; the buttons disable at the ends. Arrow keys move when the carousel holds focus.",
|
|
1631
|
+
words: "The buttons name their move: *Previous slide*, *Next slide*.",
|
|
1632
|
+
access: "A `region` described as a carousel; each slide is a `group` described as a slide.",
|
|
1633
|
+
},
|
|
1634
|
+
{
|
|
1635
|
+
name: "ChannelView",
|
|
1636
|
+
module: "channel-view",
|
|
1637
|
+
family: "Other",
|
|
1638
|
+
summary: "A work-chat channel, as presentation only: the channel's header, the day it opens on, the messages in it, the replies gathered under a message, a file left in the conversation, and the card a voice call leaves behind.",
|
|
1639
|
+
when: "Showing a channel of Alveare's work chat: its header, its days, messages, replies, files and calls.",
|
|
1640
|
+
instead: "An Agent's conversation is the Agents interface (`@nadicodeai/ui/agents`). A list of records is a list or table.",
|
|
1641
|
+
behaviour: "A 36 px member column, a 10 px gap to the text, the author and the time on one baseline; replies gather in a pill under their message, and cards sit at the resting fill inside the line: Alveare's channel geometry.",
|
|
1642
|
+
words: "The product's members and messages; every label (members, replies, reactions) comes from its catalogue.",
|
|
1643
|
+
access: 'A person\'s picture is `role="img"` named by their name; the member stack is named by `membersLabel`; a reaction is named by its `label`, its glyph hidden.',
|
|
1644
|
+
},
|
|
1645
|
+
{
|
|
1646
|
+
name: "Collapsible",
|
|
1647
|
+
module: "collapsible",
|
|
1648
|
+
family: "Other",
|
|
1649
|
+
summary: "Content that a trigger shows and hides.",
|
|
1650
|
+
when: "Building a disclosure the complete owners do not cover: nested files in a sidebar, a group of rows.",
|
|
1651
|
+
instead: "Supporting detail on a page is `Disclosure`; sections are `Accordion`; a long block is `ExpandableBlock`.",
|
|
1652
|
+
behaviour: "The trigger toggles the content; closed content is not rendered for the reader.",
|
|
1653
|
+
words: "The trigger names what is inside.",
|
|
1654
|
+
access: "The trigger exposes `aria-expanded` and controls its content.",
|
|
1655
|
+
},
|
|
1656
|
+
{
|
|
1657
|
+
name: "CompanyCard",
|
|
1658
|
+
module: "company-card",
|
|
1659
|
+
family: "Other",
|
|
1660
|
+
summary: "The company's nadicode card: what the person is making while they sign up, and what the website shows being issued.",
|
|
1661
|
+
when: "Sign-up, where a person watches their company's card being made, and the website, which shows one being issued.",
|
|
1662
|
+
instead: "A company's facts are `SettingsFactsSection`. A company in a row is its `IdentityMark`.",
|
|
1663
|
+
behaviour: "Fills in as the form is typed and turns to the pointer so its foil catches the light; a company's card takes the cool foil, a Partner's the warm. Still under reduced motion.",
|
|
1664
|
+
words: "Every word it shows is a prop from the product's catalogue.",
|
|
1665
|
+
access: "Hidden from assistive technology and holds nothing interactive; the form beside it carries the same words.",
|
|
1666
|
+
},
|
|
1667
|
+
{
|
|
1668
|
+
name: "Disclosure",
|
|
1669
|
+
module: "disclosure",
|
|
1670
|
+
family: "Other",
|
|
1671
|
+
summary: "Supporting detail a person opens on demand, such as other download formats or a checksum.",
|
|
1672
|
+
when: "Supporting detail a person opens on demand, such as other download formats or a checksum.",
|
|
1673
|
+
instead: "Named sections are `Accordion`. A long block cut short is `ExpandableBlock`. A warning is never hidden in one.",
|
|
1674
|
+
behaviour: "Opens without JavaScript and renders on the server; the chevron turns when open.",
|
|
1675
|
+
words: "The closed label names what is inside: *Other formats*, *Checksum*.",
|
|
1676
|
+
access: "A native `details` and `summary`, announced as a disclosure.",
|
|
1677
|
+
},
|
|
1678
|
+
{
|
|
1679
|
+
name: "ExpandableBlock",
|
|
1680
|
+
module: "expandable-block",
|
|
1681
|
+
family: "Other",
|
|
1682
|
+
summary: "A tall block cut to its first lines, with a control to read the rest.",
|
|
1683
|
+
when: "A long output inside a conversation or a run: a tool's result, a pasted log.",
|
|
1684
|
+
instead: "Supporting detail behind a label is `Disclosure`. Exact text to copy is `CodeBlock`.",
|
|
1685
|
+
behaviour: "Shows the control only when the content runs past 120 px; expanding shows it whole.",
|
|
1686
|
+
words: "The expand and collapse labels come from the product's catalogue.",
|
|
1687
|
+
access: "The control is a `button` with `aria-expanded` and the current label as its name.",
|
|
1688
|
+
},
|
|
1689
|
+
{
|
|
1690
|
+
name: "HiveScene",
|
|
1691
|
+
module: "hive-scene",
|
|
1692
|
+
family: "Other",
|
|
1693
|
+
summary: "Alveare's entry scene: its picture, its logo and six Agent orbs around the words.",
|
|
1694
|
+
when: "Alveare's entry screens, on its desktop and on Alveare Server: joining, loading, a failure.",
|
|
1695
|
+
instead: "Nadia's entry screens are `EntryScene`. A product page never stands on a scene.",
|
|
1696
|
+
behaviour: "`join` puts the words in the hexagon's middle, `loading` draws the orbs in with no words, `still` shows no Agent and no work. Only the orbs and the particles move; reduced motion stops both. Black in every theme.",
|
|
1697
|
+
words: "The words are the screen's own: a title, a line, one action. The logo's label names Alveare.",
|
|
1698
|
+
access: 'The canvases are hidden; the logo\'s image is named by its label. In `loading` the scene is `role="status"` named by `label`; otherwise the words and their action are the reading.',
|
|
1699
|
+
},
|
|
1700
|
+
{
|
|
1701
|
+
name: "NadiaPresence",
|
|
1702
|
+
module: "nadia-presence",
|
|
1703
|
+
family: "Other",
|
|
1704
|
+
summary: "Nadia at an entry screen: her ribbon, arriving through the picture behind her.",
|
|
1705
|
+
when: "Nadia's entry, sign-in and update screens, standing in the middle of `EntryScene`.",
|
|
1706
|
+
instead: "Nadia anywhere else is her `AgentOrb`. A system wait is the waiting line.",
|
|
1707
|
+
behaviour: "`reveal` drives one opacity from a trace to whole; each presence state maps to her orb's state, so a person sees whether she is working, waiting, finished or stopped. 160 px unless the scene sets its size.",
|
|
1708
|
+
words: "The label names the arrival: *Nadia is getting ready*.",
|
|
1709
|
+
access: "A hidden `progressbar` named by `label` carries the same value the person sees; the ribbon is decorative.",
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
name: "NumberedSteps",
|
|
1713
|
+
module: "numbered-steps",
|
|
1714
|
+
family: "Other",
|
|
1715
|
+
summary: "Steps a person follows, each with its number, its words and its own action.",
|
|
1716
|
+
when: "A short sequence the person does: installing Nadia from Downloads, connecting Teams, the Dashboard's setup guide; or a sequence whose real progress the page tracks, such as the company check.",
|
|
1717
|
+
instead: 'Stages the system runs on an entry screen are the EntryStageList; the steps of an Agent\'s run are a RunTimeline; a setup with a wait is a FormDrawer with its "Step 2 of 3" line.',
|
|
1718
|
+
behaviour: "Each step is a 28 px square number in label-mono, its title, one muted description and, under it, the step's own action. Instructions mark no step and every number stays muted, because the page cannot know which one the person is on. Where the page tracks real progress, `current` turns that step's number to ink and writes its word beside the title. `framed` draws one bordered list with a seam between steps. It is the one owner of a drawn step number.",
|
|
1719
|
+
words: 'The title is what the person does, in the imperative ("Install Nadia"), or a finished step in the past tense ("Sofia looked up acme.it"). The current step\'s word is short: "Now". An action names its verb and carries its platform line ("macOS · 2.14.0 · Apple silicon").',
|
|
1720
|
+
access: 'An ordered list named by `label`, so assistive technology reads the count and position; the drawn numbers are hidden. The current step carries `aria-current="step"`. The titles are not headings, so the list never breaks the page\'s heading order.',
|
|
1721
|
+
},
|
|
1722
|
+
{
|
|
1723
|
+
name: "PluginSlotBoundary",
|
|
1724
|
+
module: "plugin-slot-boundary",
|
|
1725
|
+
family: "Other",
|
|
1726
|
+
summary: "The frame around content a plugin draws inside a product.",
|
|
1727
|
+
when: "Any surface a plugin renders into: it names the plugin, its permissions and its state around the plugin's own content.",
|
|
1728
|
+
instead: "The product's own sections are `SettingsSection` or `ObjectSection`.",
|
|
1729
|
+
behaviour: "A title and description, the permissions with their levels, a warning or an error when given, then the plugin's content in a labelled region and its footer. `disabled` dims the content.",
|
|
1730
|
+
words: "The plugin's title as the plugin names itself; permissions are short nouns with a sentence each.",
|
|
1731
|
+
access: "The permissions are a labelled list and the plugin's content a region labelled `contentLabel`, so a reader knows where the plugin begins and ends.",
|
|
1732
|
+
},
|
|
1733
|
+
{
|
|
1734
|
+
name: "ReadingColumn",
|
|
1735
|
+
module: "reading-column",
|
|
1736
|
+
family: "Other",
|
|
1737
|
+
summary: "The column a page's content stands in: full, reading or configuration width.",
|
|
1738
|
+
when: "Setting a page's measure: `reading` for prose and conversations, `configuration` for settings, `full` for collections.",
|
|
1739
|
+
instead: "A settings page's column is `SettingsPage`'s. A card row is `CardRow`.",
|
|
1740
|
+
behaviour: "Centred with a maximum width per kind; full takes the content's width.",
|
|
1741
|
+
words: "None of its own.",
|
|
1742
|
+
access: "A layout container.",
|
|
1743
|
+
},
|
|
1744
|
+
{
|
|
1745
|
+
name: "ResizablePanelGroup",
|
|
1746
|
+
module: "resizable",
|
|
1747
|
+
family: "Other",
|
|
1748
|
+
summary: "Panels a person resizes by dragging the handle between them.",
|
|
1749
|
+
when: "Side-by-side panes whose balance a person sets: a conversation and its side panel.",
|
|
1750
|
+
instead: "The product frame's sidebar resizes through `DashboardShell` or `DesktopAppShell`.",
|
|
1751
|
+
behaviour: "The handle moves on drag and on arrow keys; each panel keeps its minimum and maximum.",
|
|
1752
|
+
words: "None of its own.",
|
|
1753
|
+
access: "The handle is the resizable library's focusable separator.",
|
|
1754
|
+
},
|
|
1755
|
+
{
|
|
1756
|
+
name: "ScrollArea",
|
|
1757
|
+
module: "scroll-area",
|
|
1758
|
+
family: "Other",
|
|
1759
|
+
summary: "An area that scrolls with the product's own thin scrollbar.",
|
|
1760
|
+
when: "A bounded area whose content overflows on one axis: a side panel's list, a menu's long body.",
|
|
1761
|
+
instead: "A page scrolls as the document. A rail of slides is `Carousel`.",
|
|
1762
|
+
behaviour: "The viewport scrolls natively, so wheel, touch and keyboard all reach it; the thin scrollbar is drawn over the content.",
|
|
1763
|
+
words: "None of its own.",
|
|
1764
|
+
access: "The content keeps its own semantics; the scrollbar is paint.",
|
|
1765
|
+
},
|
|
1766
|
+
{
|
|
1767
|
+
name: "Separator",
|
|
1768
|
+
module: "separator",
|
|
1769
|
+
family: "Other",
|
|
1770
|
+
summary: "A 1 px line between groups.",
|
|
1771
|
+
when: "Separating groups inside one surface: menu sections, a card's header from its toolbar.",
|
|
1772
|
+
instead: "A card's footer draws its own seam; a list in a card is a `divided` `ItemGroup`. Never a border around a region.",
|
|
1773
|
+
behaviour: "Horizontal or vertical, in the line colour.",
|
|
1774
|
+
words: "None.",
|
|
1775
|
+
access: "A `separator` from Base UI with no name of its own.",
|
|
1776
|
+
},
|
|
1777
|
+
{
|
|
1778
|
+
name: "ToolIcon",
|
|
1779
|
+
module: "tool-icon",
|
|
1780
|
+
family: "Other",
|
|
1781
|
+
summary: "The mark of a tool an Agent used, at the head of its row in the conversation.",
|
|
1782
|
+
when: "A tool call's row in an Agent's conversation: running a command, reading or editing a file, searching, browsing.",
|
|
1783
|
+
instead: "A file in a list takes its `FileTypeIcon`; an app takes its brand mark in `AppMark`; an Agent is her `AgentOrb`.",
|
|
1784
|
+
behaviour: "Lucide's glyph for the tool's kind, 1.5 px line in the text colour, 14 px unless `size` says otherwise. An unknown kind draws the question mark, so a new tool still has a mark.",
|
|
1785
|
+
words: "None. The tool's title stands beside it.",
|
|
1786
|
+
access: "Hidden: the row's title is the name.",
|
|
1787
|
+
},
|
|
1788
|
+
];
|