prime-ui-kit 0.13.1 → 0.15.0
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/README.md +20 -20
- package/dist/chunks/{chunk-XNOJEX55.js → chunk-2IKH55MI.js} +1 -1
- package/dist/chunks/{chunk-JV2KB5JZ.js → chunk-THFZIHKU.js} +3761 -3041
- package/dist/chunks/{chunk-PK2GC77E.js → chunk-XJAVS6FH.js} +213 -188
- package/dist/color-picker.js +2 -2
- package/dist/components/banner/Banner.d.ts +5 -2
- package/dist/components/chart-frame/ChartFrame.d.ts +19 -6
- package/dist/components/chat/Chat.d.ts +2 -2
- package/dist/components/chat/ChatPinned.d.ts +2 -2
- package/dist/components/chat/MessageList.d.ts +1 -1
- package/dist/components/chat/chatContext.d.ts +1 -1
- package/dist/components/dnd/Dnd.d.ts +1 -1
- package/dist/components/field-list/FieldList.d.ts +90 -0
- package/dist/components/index.d.ts +3 -1
- package/dist/components/input/Input.d.ts +2 -2
- package/dist/components/kanban/Kanban.d.ts +6 -3
- package/dist/components/login-form/LoginForm.d.ts +5 -1
- package/dist/components/page-content/PageContent.d.ts +55 -4
- package/dist/components/sparkline/Sparkline.d.ts +64 -15
- package/dist/components/sparkline/geometry.d.ts +26 -0
- package/dist/components/tooltip/Tooltip.d.ts +5 -2
- package/dist/hooks/usePosition.d.ts +15 -4
- package/dist/index.css +1 -1
- package/dist/index.js +4 -2
- package/dist/internal/ChartTooltip.d.ts +26 -0
- package/dist/internal/FieldAction.d.ts +6 -7
- package/dist/internal/fieldCell.d.ts +21 -0
- package/dist/internal/messageList.d.ts +2 -2
- package/dist/internal/palette.d.ts +7 -0
- package/dist/internal/swatch.d.ts +6 -2
- package/dist/layout/app-header/AppHeader.d.ts +9 -28
- package/dist/layout/index.d.ts +1 -1
- package/dist/skill/SKILL.md +32 -20
- package/dist/skill/anti-slop.md +77 -4
- package/dist/skill/api-contract.md +2 -2
- package/dist/skill/cheatsheet.md +33 -7
- package/dist/skill/checklist.md +28 -6
- package/dist/skill/choosing.md +17 -14
- package/dist/skill/components.md +9 -15
- package/dist/skill/composition.md +301 -61
- package/dist/skill/foundations.md +9 -7
- package/dist/skill/layouts.md +70 -37
- package/dist/skill/reference/components/avatar/COMPONENT.md +4 -4
- package/dist/skill/reference/components/avatar/examples/presence.tsx +1 -1
- package/dist/skill/reference/components/avatar/examples/states.tsx +5 -5
- package/dist/skill/reference/components/badge/examples/applied-filters.tsx +13 -19
- package/dist/skill/reference/components/badge/examples/examples.module.css +1 -8
- package/dist/skill/reference/components/badge/examples/server-tags.tsx +2 -6
- package/dist/skill/reference/components/banner/COMPONENT.md +6 -6
- package/dist/skill/reference/components/banner/examples/dismissible.tsx +22 -11
- package/dist/skill/reference/components/banner/examples/examples.module.css +4 -8
- package/dist/skill/reference/components/banner/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/banner/examples/page-strip.tsx +16 -22
- package/dist/skill/reference/components/breadcrumb/COMPONENT.md +5 -4
- package/dist/skill/reference/components/breadcrumb/examples/ellipsis.tsx +2 -2
- package/dist/skill/reference/components/breadcrumb/examples/overflow.tsx +1 -1
- package/dist/skill/reference/components/button-group/COMPONENT.md +2 -2
- package/dist/skill/reference/components/button-group/examples/in-form.tsx +22 -2
- package/dist/skill/reference/components/button-group/examples/states.tsx +10 -1
- package/dist/skill/reference/components/card/COMPONENT.md +7 -5
- package/dist/skill/reference/components/card/examples/examples.module.css +0 -28
- package/dist/skill/reference/components/card/examples/kpi-media.tsx +13 -11
- package/dist/skill/reference/components/card/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/card/examples/panel-chart.tsx +45 -22
- package/dist/skill/reference/components/card/examples/screen.module.css +14 -0
- package/dist/skill/reference/components/card/examples/screen.tsx +362 -0
- package/dist/skill/reference/components/card/examples/variants.tsx +15 -1
- package/dist/skill/reference/components/chart-frame/COMPONENT.md +12 -8
- package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +119 -0
- package/dist/skill/reference/components/chart-frame/examples/states.tsx +3 -1
- package/dist/skill/reference/components/chart-frame/examples/tooltip.tsx +20 -24
- package/dist/skill/reference/components/chat/COMPONENT.md +6 -4
- package/dist/skill/reference/components/chat/examples/group-chat.tsx +15 -2
- package/dist/skill/reference/components/chat/examples/reactions.tsx +121 -0
- package/dist/skill/reference/components/chat/examples/screen.module.css +9 -0
- package/dist/skill/{patterns/chat.tsx → reference/components/chat/examples/screen.tsx} +187 -350
- package/dist/skill/reference/components/chat/examples/search.tsx +1 -1
- package/dist/skill/reference/components/chat-list/COMPONENT.md +2 -1
- package/dist/skill/reference/components/chat-list/examples/links.tsx +72 -0
- package/dist/skill/reference/components/checkbox/COMPONENT.md +1 -1
- package/dist/skill/reference/components/checkbox/examples/examples.module.css +5 -1
- package/dist/skill/reference/components/checkbox/examples/indicator.tsx +37 -9
- package/dist/skill/reference/components/checkbox/examples/states.tsx +6 -1
- package/dist/skill/reference/components/color-field/COMPONENT.md +1 -1
- package/dist/skill/reference/components/color-picker/COMPONENT.md +6 -5
- package/dist/skill/reference/components/color-picker/examples/controlled-open.tsx +37 -0
- package/dist/skill/reference/components/color-picker/examples/presets.tsx +2 -2
- package/dist/skill/reference/components/color-picker/examples/states.tsx +23 -14
- package/dist/skill/reference/components/color-swatches/COMPONENT.md +1 -0
- package/dist/skill/reference/components/composer/COMPONENT.md +2 -1
- package/dist/skill/reference/components/composer/examples/attach-menu.tsx +78 -0
- package/dist/skill/reference/components/composer/examples/attachments.tsx +2 -2
- package/dist/skill/reference/components/crossfade/COMPONENT.md +1 -0
- package/dist/skill/{patterns/screen-states.module.css → reference/components/crossfade/examples/screen.module.css} +3 -17
- package/dist/skill/reference/components/crossfade/examples/screen.tsx +197 -0
- package/dist/skill/reference/components/data-table/COMPONENT.md +3 -2
- package/dist/skill/reference/components/data-table/examples/detail-panel.tsx +36 -37
- package/dist/skill/reference/components/data-table/examples/examples.module.css +0 -12
- package/dist/skill/reference/components/data-table/examples/numeric.tsx +36 -4
- package/dist/skill/reference/components/data-table/examples/overview.tsx +1 -0
- package/dist/skill/reference/components/data-table/examples/row-open.tsx +7 -36
- package/dist/skill/{patterns/list-page.module.css → reference/components/data-table/examples/screen.module.css} +1 -7
- package/dist/skill/{patterns/list-page.tsx → reference/components/data-table/examples/screen.tsx} +84 -64
- package/dist/skill/reference/components/datepicker/COMPONENT.md +6 -4
- package/dist/skill/reference/components/datepicker/examples/examples.module.css +2 -6
- package/dist/skill/reference/components/datepicker/examples/in-form.tsx +47 -55
- package/dist/skill/reference/components/datepicker/examples/locale.tsx +35 -0
- package/dist/skill/reference/components/datepicker/examples/range-presets.tsx +11 -2
- package/dist/skill/reference/components/datepicker/examples/states.tsx +9 -1
- package/dist/skill/reference/components/description-list/COMPONENT.md +1 -0
- package/dist/skill/{patterns/detail-page.module.css → reference/components/description-list/examples/screen.module.css} +2 -12
- package/dist/skill/reference/components/description-list/examples/screen.tsx +214 -0
- package/dist/skill/reference/components/description-list/examples/structure.tsx +1 -1
- package/dist/skill/reference/components/digit-input/COMPONENT.md +3 -1
- package/dist/skill/reference/components/digit-input/examples/states.tsx +3 -1
- package/dist/skill/reference/components/digit-input/examples/without-focus-ring.tsx +13 -0
- package/dist/skill/reference/components/divider/examples/with-icon.tsx +2 -2
- package/dist/skill/reference/components/dnd/COMPONENT.md +7 -5
- package/dist/skill/reference/components/dnd/examples/drop-zones.tsx +82 -49
- package/dist/skill/reference/components/dnd/examples/examples.module.css +50 -0
- package/dist/skill/reference/components/dnd/examples/states.tsx +54 -0
- package/dist/skill/reference/components/dnd/examples/table.tsx +113 -0
- package/dist/skill/reference/components/drawer/COMPONENT.md +1 -0
- package/dist/skill/reference/components/drawer/examples/dismiss.tsx +5 -3
- package/dist/skill/reference/components/drawer/examples/examples.module.css +0 -13
- package/dist/skill/reference/components/drawer/examples/header-actions.tsx +5 -9
- package/dist/skill/reference/components/drawer/examples/overview.tsx +6 -18
- package/dist/skill/reference/components/drawer/examples/screen.tsx +298 -0
- package/dist/skill/reference/components/dropdown/examples/examples.module.css +1 -5
- package/dist/skill/reference/components/empty-page/COMPONENT.md +1 -1
- package/dist/skill/reference/components/empty-page/examples/region-error.tsx +8 -2
- package/dist/skill/reference/components/example-frame/COMPONENT.md +3 -2
- package/dist/skill/reference/components/example-frame/examples/initial-view.tsx +44 -0
- package/dist/skill/reference/components/field-list/COMPONENT.md +165 -0
- package/dist/skill/reference/components/field-list/examples/base-row.tsx +76 -0
- package/dist/skill/reference/components/field-list/examples/controlled.tsx +72 -0
- package/dist/skill/reference/components/field-list/examples/errors.tsx +88 -0
- package/dist/skill/reference/components/field-list/examples/examples.module.css +34 -0
- package/dist/skill/reference/components/field-list/examples/limits.tsx +55 -0
- package/dist/skill/reference/components/field-list/examples/locked.tsx +139 -0
- package/dist/skill/reference/components/field-list/examples/narrow.tsx +68 -0
- package/dist/skill/reference/components/field-list/examples/overview.tsx +66 -0
- package/dist/skill/reference/components/field-list/examples/reorder.tsx +42 -0
- package/dist/skill/reference/components/field-list/examples/screen.module.css +18 -0
- package/dist/skill/reference/components/field-list/examples/screen.tsx +316 -0
- package/dist/skill/reference/components/field-list/examples/sizes.tsx +42 -0
- package/dist/skill/reference/components/field-list/examples/states.tsx +51 -0
- package/dist/skill/reference/components/file-upload/COMPONENT.md +7 -6
- package/dist/skill/reference/components/file-upload/examples/custom-body.tsx +2 -1
- package/dist/skill/reference/components/file-upload/examples/examples.module.css +1 -7
- package/dist/skill/reference/components/file-upload/examples/file-cards.tsx +10 -1
- package/dist/skill/reference/components/file-upload/examples/gallery.tsx +2 -2
- package/dist/skill/reference/components/file-upload/examples/in-form.tsx +4 -9
- package/dist/skill/reference/components/file-upload/examples/overview.tsx +5 -1
- package/dist/skill/reference/components/file-upload/examples/row-parts.tsx +24 -1
- package/dist/skill/{patterns/media-library.module.css → reference/components/file-upload/examples/screen.module.css} +2 -23
- package/dist/skill/reference/components/file-upload/examples/screen.tsx +646 -0
- package/dist/skill/reference/components/file-upload/examples/states.tsx +6 -2
- package/dist/skill/reference/components/file-upload/examples/validation.tsx +11 -2
- package/dist/skill/reference/components/file-upload/examples/variants.tsx +3 -20
- package/dist/skill/reference/components/gantt/COMPONENT.md +2 -1
- package/dist/skill/reference/components/gantt/examples/screen.module.css +14 -0
- package/dist/skill/{patterns/schedule.tsx → reference/components/gantt/examples/screen.tsx} +174 -170
- package/dist/skill/reference/components/gantt/examples/states.tsx +6 -2
- package/dist/skill/reference/components/input/COMPONENT.md +2 -2
- package/dist/skill/reference/components/input/examples/examples.module.css +2 -13
- package/dist/skill/reference/components/input/examples/in-form.tsx +1 -9
- package/dist/skill/reference/components/input/examples/password-strength.tsx +34 -8
- package/dist/skill/reference/components/input/examples/states.tsx +6 -1
- package/dist/skill/reference/components/kanban/COMPONENT.md +16 -11
- package/dist/skill/reference/components/kanban/examples/columns.tsx +8 -5
- package/dist/skill/reference/components/kanban/examples/limits.tsx +2 -1
- package/dist/skill/reference/components/kanban/examples/screen.module.css +17 -0
- package/dist/skill/{patterns/kanban-board.tsx → reference/components/kanban/examples/screen.tsx} +132 -172
- package/dist/skill/reference/components/kanban/examples/states.tsx +17 -6
- package/dist/skill/reference/components/kanban/examples/variants.tsx +16 -8
- package/dist/skill/reference/components/list/COMPONENT.md +1 -1
- package/dist/skill/reference/components/login-form/COMPONENT.md +6 -5
- package/dist/skill/reference/components/login-form/examples/examples.module.css +2 -21
- package/dist/skill/reference/components/login-form/examples/forgot-password.tsx +28 -32
- package/dist/skill/reference/components/login-form/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/login-form/examples/overview.tsx +45 -47
- package/dist/skill/reference/components/login-form/examples/register.tsx +64 -68
- package/dist/skill/reference/components/login-form/examples/reset-password.tsx +50 -47
- package/dist/skill/reference/components/login-form/examples/sizes.tsx +4 -6
- package/dist/skill/reference/components/login-form/examples/states.tsx +53 -57
- package/dist/skill/reference/components/login-form/examples/structure.tsx +18 -22
- package/dist/skill/reference/components/login-form/examples/verification-code.tsx +41 -45
- package/dist/skill/reference/components/media-viewer/COMPONENT.md +3 -3
- package/dist/skill/reference/components/media-viewer/examples/dismiss.tsx +5 -1
- package/dist/skill/reference/components/message/COMPONENT.md +6 -5
- package/dist/skill/reference/components/message/examples/file.tsx +5 -1
- package/dist/skill/reference/components/message/examples/media-open.tsx +48 -0
- package/dist/skill/reference/components/message/examples/status.tsx +21 -3
- package/dist/skill/reference/components/message/examples/text-formatting.tsx +7 -1
- package/dist/skill/reference/components/modal/COMPONENT.md +2 -1
- package/dist/skill/reference/components/modal/examples/custom-container.tsx +20 -20
- package/dist/skill/reference/components/modal/examples/dismiss.tsx +5 -3
- package/dist/skill/reference/components/modal/examples/enter-key.tsx +116 -0
- package/dist/skill/reference/components/modal/examples/examples.module.css +7 -13
- package/dist/skill/reference/components/modal/examples/structure.tsx +5 -2
- package/dist/skill/reference/components/native-select/COMPONENT.md +1 -1
- package/dist/skill/reference/components/native-select/examples/states.tsx +5 -1
- package/dist/skill/reference/components/notification/COMPONENT.md +2 -1
- package/dist/skill/reference/components/notification/examples/dismiss.tsx +2 -2
- package/dist/skill/reference/components/page-content/COMPONENT.md +71 -14
- package/dist/skill/reference/components/page-content/examples/grid.tsx +107 -0
- package/dist/skill/reference/components/page-content/examples/list-detail.tsx +0 -3
- package/dist/skill/reference/components/page-content/examples/overview.tsx +2 -2
- package/dist/skill/{patterns/settings-page.module.css → reference/components/page-content/examples/screen.module.css} +1 -21
- package/dist/skill/{patterns/settings-page.tsx → reference/components/page-content/examples/screen.tsx} +61 -82
- package/dist/skill/reference/components/page-content/examples/sections.tsx +81 -0
- package/dist/skill/reference/components/page-content/examples/variants.tsx +4 -11
- package/dist/skill/reference/components/page-toolbar/COMPONENT.md +18 -16
- package/dist/skill/reference/components/page-toolbar/examples/narrow.tsx +6 -3
- package/dist/skill/reference/components/pagination/examples/controlled.tsx +29 -29
- package/dist/skill/reference/components/pagination/examples/examples.module.css +0 -2
- package/dist/skill/reference/components/progress-bar/COMPONENT.md +1 -1
- package/dist/skill/reference/components/progress-bar/examples/segments.tsx +2 -2
- package/dist/skill/reference/components/progress-circle/COMPONENT.md +1 -1
- package/dist/skill/reference/components/progress-circle/examples/segments.tsx +8 -3
- package/dist/skill/reference/components/radio/COMPONENT.md +1 -0
- package/dist/skill/reference/components/radio/examples/examples.module.css +14 -0
- package/dist/skill/reference/components/radio/examples/in-form.tsx +45 -0
- package/dist/skill/reference/components/scroll-container/COMPONENT.md +1 -0
- package/dist/skill/reference/components/scroll-container/examples/auto-scroll.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/chat.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/edges.tsx +6 -3
- package/dist/skill/reference/components/scroll-container/examples/examples.module.css +4 -17
- package/dist/skill/reference/components/scroll-container/examples/load-more.tsx +51 -0
- package/dist/skill/reference/components/scroll-container/examples/lock.tsx +3 -5
- package/dist/skill/reference/components/scroll-container/examples/overscroll.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/overview.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/scrollbar.tsx +13 -7
- package/dist/skill/reference/components/scroll-container/examples/variants.tsx +13 -7
- package/dist/skill/reference/components/segmented-control/COMPONENT.md +3 -2
- package/dist/skill/reference/components/segmented-control/examples/in-form.tsx +5 -1
- package/dist/skill/reference/components/segmented-control/examples/states.tsx +10 -1
- package/dist/skill/reference/components/select/COMPONENT.md +5 -3
- package/dist/skill/reference/components/select/examples/examples.module.css +2 -7
- package/dist/skill/reference/components/select/examples/icon-only.tsx +38 -0
- package/dist/skill/reference/components/select/examples/states.tsx +13 -1
- package/dist/skill/reference/components/sheet/COMPONENT.md +2 -0
- package/dist/skill/reference/components/sheet/examples/guard.tsx +72 -0
- package/dist/skill/reference/components/sheet/examples/header-actions.tsx +56 -0
- package/dist/skill/reference/components/slider/COMPONENT.md +2 -1
- package/dist/skill/reference/components/slider/examples/examples.module.css +8 -0
- package/dist/skill/reference/components/slider/examples/in-form.tsx +47 -0
- package/dist/skill/reference/components/slider/examples/states.tsx +4 -1
- package/dist/skill/reference/components/smart-filter/COMPONENT.md +1 -1
- package/dist/skill/reference/components/smart-filter/examples/controlled.tsx +3 -3
- package/dist/skill/reference/components/smart-filter/examples/ranges.tsx +44 -10
- package/dist/skill/reference/components/sparkline/COMPONENT.md +83 -30
- package/dist/skill/reference/components/sparkline/examples/compact.tsx +1 -1
- package/dist/skill/reference/components/sparkline/examples/curve.tsx +28 -0
- package/dist/skill/reference/components/sparkline/examples/gaps.tsx +33 -0
- package/dist/skill/reference/components/sparkline/examples/overview.tsx +11 -2
- package/dist/skill/reference/components/sparkline/examples/period.tsx +7 -2
- package/dist/skill/reference/components/sparkline/examples/reference.tsx +38 -0
- package/dist/skill/reference/components/sparkline/examples/variants.tsx +2 -2
- package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
- package/dist/skill/reference/components/tabs/examples/examples.module.css +0 -6
- package/dist/skill/reference/components/tabs/examples/in-drawer.tsx +11 -13
- package/dist/skill/reference/components/tabs/examples/sizes.tsx +1 -1
- package/dist/skill/reference/components/tag-select/COMPONENT.md +1 -1
- package/dist/skill/reference/components/tag-select/examples/states.tsx +8 -1
- package/dist/skill/reference/components/textarea/COMPONENT.md +1 -1
- package/dist/skill/reference/components/textarea/examples/examples.module.css +0 -6
- package/dist/skill/reference/components/textarea/examples/in-form.tsx +1 -9
- package/dist/skill/reference/components/textarea/examples/states.tsx +2 -1
- package/dist/skill/reference/components/thumbnail/COMPONENT.md +2 -1
- package/dist/skill/reference/components/thumbnail/examples/examples.module.css +1 -1
- package/dist/skill/reference/components/thumbnail/examples/fit.tsx +24 -0
- package/dist/skill/reference/components/thumbnail/examples/video.tsx +20 -1
- package/dist/skill/reference/components/timeline/COMPONENT.md +1 -1
- package/dist/skill/reference/components/timeline/examples/examples.module.css +0 -8
- package/dist/skill/reference/components/timeline/examples/links.tsx +55 -14
- package/dist/skill/reference/components/timeline/examples/narrow.tsx +2 -2
- package/dist/skill/reference/components/timeline/examples/sizes.tsx +3 -3
- package/dist/skill/reference/components/timeline/examples/variants.tsx +4 -4
- package/dist/skill/reference/components/tooltip/COMPONENT.md +7 -5
- package/dist/skill/reference/components/tooltip/examples/placement.tsx +2 -1
- package/dist/skill/reference/components/tooltip/examples/toolbar.tsx +2 -2
- package/dist/skill/reference/components/typography/examples/weights.tsx +3 -0
- package/dist/skill/reference/components/video-note/COMPONENT.md +3 -3
- package/dist/skill/reference/components/video-note/examples/controlled.tsx +19 -2
- package/dist/skill/reference/components/video-note/examples/in-message.tsx +5 -2
- package/dist/skill/reference/components/visually-hidden/COMPONENT.md +2 -1
- package/dist/skill/reference/components/visually-hidden/examples/assertive.tsx +39 -0
- package/dist/skill/reference/components/voice-player/COMPONENT.md +3 -3
- package/dist/skill/reference/components/voice-player/examples/call-recording.tsx +19 -9
- package/dist/skill/reference/components/voice-player/examples/controlled.tsx +20 -3
- package/dist/skill/reference/layout/app-header/COMPONENT.md +46 -63
- package/dist/skill/reference/layout/app-header/examples/breadcrumbs.tsx +10 -9
- package/dist/skill/reference/layout/app-header/examples/examples.module.css +1 -1
- package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +2 -3
- package/dist/skill/reference/layout/app-header/examples/narrow.tsx +4 -5
- package/dist/skill/reference/layout/app-header/examples/overview.tsx +8 -10
- package/dist/skill/reference/layout/app-header/examples/page-title.tsx +3 -10
- package/dist/skill/reference/layout/app-shell/COMPONENT.md +5 -4
- package/dist/skill/reference/layout/app-shell/examples/footer.tsx +2 -2
- package/dist/skill/reference/layout/app-shell/examples/overview.tsx +17 -32
- package/dist/skill/{patterns/app-shell.module.css → reference/layout/app-shell/examples/screen.module.css} +1 -8
- package/dist/skill/reference/layout/app-shell/examples/screen.tsx +262 -0
- package/dist/skill/reference/layout/app-shell/examples/template.tsx +31 -11
- package/dist/skill/reference/layout/bottom-nav/examples/floating-action.tsx +2 -2
- package/dist/skill/reference/layout/bottom-nav/examples/floating.tsx +2 -2
- package/dist/skill/reference/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
- package/dist/skill/reference/layout/sidebar/COMPONENT.md +7 -4
- package/dist/skill/reference/layout/sidebar/examples/account.tsx +2 -2
- package/dist/skill/reference/layout/sidebar/examples/collapsible-groups.tsx +12 -4
- package/dist/skill/reference/layout/sidebar/examples/custom-part.tsx +53 -0
- package/dist/skill/reference/layout/sidebar/examples/examples.module.css +5 -0
- package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +53 -0
- package/dist/skill/reference/layout/sidebar/examples/persist.tsx +57 -0
- package/dist/skill/reference/layout/sidebar/examples/router.tsx +14 -2
- package/dist/skill/reference/layout/sidebar/examples/structure.tsx +7 -2
- package/dist/skill/responsive.md +7 -5
- package/dist/skill/ux.md +145 -0
- package/dist/tokens/semantic.d.ts +2 -0
- package/package.json +1 -1
- package/src/components/avatar/COMPONENT.md +4 -4
- package/src/components/avatar/examples/presence.tsx +1 -1
- package/src/components/avatar/examples/states.tsx +5 -5
- package/src/components/badge/examples/applied-filters.tsx +13 -19
- package/src/components/badge/examples/examples.module.css +1 -8
- package/src/components/badge/examples/server-tags.tsx +2 -6
- package/src/components/banner/COMPONENT.md +6 -6
- package/src/components/banner/examples/dismissible.tsx +22 -11
- package/src/components/banner/examples/examples.module.css +4 -8
- package/src/components/banner/examples/narrow.tsx +1 -1
- package/src/components/banner/examples/page-strip.tsx +16 -22
- package/src/components/breadcrumb/COMPONENT.md +5 -4
- package/src/components/breadcrumb/examples/ellipsis.tsx +2 -2
- package/src/components/breadcrumb/examples/overflow.tsx +1 -1
- package/src/components/button-group/COMPONENT.md +2 -2
- package/src/components/button-group/examples/in-form.tsx +22 -2
- package/src/components/button-group/examples/states.tsx +10 -1
- package/src/components/card/COMPONENT.md +7 -5
- package/src/components/card/examples/examples.module.css +0 -28
- package/src/components/card/examples/kpi-media.tsx +13 -11
- package/src/components/card/examples/narrow.tsx +1 -1
- package/src/components/card/examples/panel-chart.tsx +45 -22
- package/src/components/card/examples/screen.module.css +14 -0
- package/src/components/card/examples/screen.tsx +362 -0
- package/src/components/card/examples/variants.tsx +15 -1
- package/src/components/chart-frame/COMPONENT.md +12 -8
- package/src/components/chart-frame/examples/fill-height.tsx +119 -0
- package/src/components/chart-frame/examples/states.tsx +3 -1
- package/src/components/chart-frame/examples/tooltip.tsx +20 -24
- package/src/components/chat/COMPONENT.md +6 -4
- package/src/components/chat/examples/group-chat.tsx +15 -2
- package/src/components/chat/examples/reactions.tsx +121 -0
- package/src/components/chat/examples/screen.module.css +9 -0
- package/src/components/chat/examples/screen.tsx +718 -0
- package/src/components/chat/examples/search.tsx +1 -1
- package/src/components/chat-list/COMPONENT.md +2 -1
- package/src/components/chat-list/examples/links.tsx +72 -0
- package/src/components/checkbox/COMPONENT.md +1 -1
- package/src/components/checkbox/examples/examples.module.css +5 -1
- package/src/components/checkbox/examples/indicator.tsx +37 -9
- package/src/components/checkbox/examples/states.tsx +6 -1
- package/src/components/color-field/COMPONENT.md +1 -1
- package/src/components/color-picker/COMPONENT.md +6 -5
- package/src/components/color-picker/examples/controlled-open.tsx +37 -0
- package/src/components/color-picker/examples/presets.tsx +2 -2
- package/src/components/color-picker/examples/states.tsx +23 -14
- package/src/components/color-swatches/COMPONENT.md +1 -0
- package/src/components/composer/COMPONENT.md +2 -1
- package/src/components/composer/examples/attach-menu.tsx +78 -0
- package/src/components/composer/examples/attachments.tsx +2 -2
- package/src/components/crossfade/COMPONENT.md +1 -0
- package/src/components/crossfade/examples/screen.module.css +40 -0
- package/src/components/crossfade/examples/screen.tsx +197 -0
- package/src/components/data-table/COMPONENT.md +3 -2
- package/src/components/data-table/examples/detail-panel.tsx +36 -37
- package/src/components/data-table/examples/examples.module.css +0 -12
- package/src/components/data-table/examples/numeric.tsx +36 -4
- package/src/components/data-table/examples/overview.tsx +1 -0
- package/src/components/data-table/examples/row-open.tsx +7 -36
- package/src/components/data-table/examples/screen.module.css +13 -0
- package/src/components/data-table/examples/screen.tsx +354 -0
- package/src/components/datepicker/COMPONENT.md +6 -4
- package/src/components/datepicker/examples/examples.module.css +2 -6
- package/src/components/datepicker/examples/in-form.tsx +47 -55
- package/src/components/datepicker/examples/locale.tsx +35 -0
- package/src/components/datepicker/examples/range-presets.tsx +11 -2
- package/src/components/datepicker/examples/states.tsx +9 -1
- package/src/components/description-list/COMPONENT.md +1 -0
- package/src/components/description-list/examples/screen.module.css +64 -0
- package/src/components/description-list/examples/screen.tsx +214 -0
- package/src/components/description-list/examples/structure.tsx +1 -1
- package/src/components/digit-input/COMPONENT.md +3 -1
- package/src/components/digit-input/examples/states.tsx +3 -1
- package/src/components/digit-input/examples/without-focus-ring.tsx +13 -0
- package/src/components/divider/examples/with-icon.tsx +2 -2
- package/src/components/dnd/COMPONENT.md +7 -5
- package/src/components/dnd/examples/drop-zones.tsx +82 -49
- package/src/components/dnd/examples/examples.module.css +50 -0
- package/src/components/dnd/examples/states.tsx +54 -0
- package/src/components/dnd/examples/table.tsx +113 -0
- package/src/components/drawer/COMPONENT.md +1 -0
- package/src/components/drawer/examples/dismiss.tsx +5 -3
- package/src/components/drawer/examples/examples.module.css +0 -13
- package/src/components/drawer/examples/header-actions.tsx +5 -9
- package/src/components/drawer/examples/overview.tsx +6 -18
- package/src/components/drawer/examples/screen.module.css +14 -0
- package/src/components/drawer/examples/screen.tsx +298 -0
- package/src/components/dropdown/examples/examples.module.css +1 -5
- package/src/components/empty-page/COMPONENT.md +1 -1
- package/src/components/empty-page/examples/region-error.tsx +8 -2
- package/src/components/example-frame/COMPONENT.md +3 -2
- package/src/components/example-frame/examples/initial-view.tsx +44 -0
- package/src/components/field-list/COMPONENT.md +165 -0
- package/src/components/field-list/examples/base-row.tsx +76 -0
- package/src/components/field-list/examples/controlled.tsx +72 -0
- package/src/components/field-list/examples/errors.tsx +88 -0
- package/src/components/field-list/examples/examples.module.css +34 -0
- package/src/components/field-list/examples/limits.tsx +55 -0
- package/src/components/field-list/examples/locked.tsx +139 -0
- package/src/components/field-list/examples/narrow.tsx +68 -0
- package/src/components/field-list/examples/overview.tsx +66 -0
- package/src/components/field-list/examples/reorder.tsx +42 -0
- package/src/components/field-list/examples/screen.module.css +18 -0
- package/src/components/field-list/examples/screen.tsx +316 -0
- package/src/components/field-list/examples/sizes.tsx +42 -0
- package/src/components/field-list/examples/states.tsx +51 -0
- package/src/components/file-upload/COMPONENT.md +7 -6
- package/src/components/file-upload/examples/custom-body.tsx +2 -1
- package/src/components/file-upload/examples/examples.module.css +1 -7
- package/src/components/file-upload/examples/file-cards.tsx +10 -1
- package/src/components/file-upload/examples/gallery.tsx +2 -2
- package/src/components/file-upload/examples/in-form.tsx +4 -9
- package/src/components/file-upload/examples/overview.tsx +5 -1
- package/src/components/file-upload/examples/row-parts.tsx +24 -1
- package/src/components/file-upload/examples/screen.module.css +45 -0
- package/src/components/file-upload/examples/screen.tsx +646 -0
- package/src/components/file-upload/examples/states.tsx +6 -2
- package/src/components/file-upload/examples/validation.tsx +11 -2
- package/src/components/file-upload/examples/variants.tsx +3 -20
- package/src/components/gantt/COMPONENT.md +2 -1
- package/src/components/gantt/examples/screen.module.css +14 -0
- package/src/components/gantt/examples/screen.tsx +726 -0
- package/src/components/gantt/examples/states.tsx +6 -2
- package/src/components/input/COMPONENT.md +2 -2
- package/src/components/input/examples/examples.module.css +2 -13
- package/src/components/input/examples/in-form.tsx +1 -9
- package/src/components/input/examples/password-strength.tsx +34 -8
- package/src/components/input/examples/states.tsx +6 -1
- package/src/components/kanban/COMPONENT.md +16 -11
- package/src/components/kanban/examples/columns.tsx +8 -5
- package/src/components/kanban/examples/limits.tsx +2 -1
- package/src/components/kanban/examples/screen.module.css +17 -0
- package/src/components/kanban/examples/screen.tsx +572 -0
- package/src/components/kanban/examples/states.tsx +17 -6
- package/src/components/kanban/examples/variants.tsx +16 -8
- package/src/components/list/COMPONENT.md +1 -1
- package/src/components/login-form/COMPONENT.md +6 -5
- package/src/components/login-form/examples/examples.module.css +2 -21
- package/src/components/login-form/examples/forgot-password.tsx +28 -32
- package/src/components/login-form/examples/narrow.tsx +1 -1
- package/src/components/login-form/examples/overview.tsx +45 -47
- package/src/components/login-form/examples/register.tsx +64 -68
- package/src/components/login-form/examples/reset-password.tsx +50 -47
- package/src/components/login-form/examples/sizes.tsx +4 -6
- package/src/components/login-form/examples/states.tsx +53 -57
- package/src/components/login-form/examples/structure.tsx +18 -22
- package/src/components/login-form/examples/verification-code.tsx +41 -45
- package/src/components/media-viewer/COMPONENT.md +3 -3
- package/src/components/media-viewer/examples/dismiss.tsx +5 -1
- package/src/components/message/COMPONENT.md +6 -5
- package/src/components/message/examples/file.tsx +5 -1
- package/src/components/message/examples/media-open.tsx +48 -0
- package/src/components/message/examples/status.tsx +21 -3
- package/src/components/message/examples/text-formatting.tsx +7 -1
- package/src/components/modal/COMPONENT.md +2 -1
- package/src/components/modal/examples/custom-container.tsx +20 -20
- package/src/components/modal/examples/dismiss.tsx +5 -3
- package/src/components/modal/examples/enter-key.tsx +116 -0
- package/src/components/modal/examples/examples.module.css +7 -13
- package/src/components/modal/examples/structure.tsx +5 -2
- package/src/components/native-select/COMPONENT.md +1 -1
- package/src/components/native-select/examples/states.tsx +5 -1
- package/src/components/notification/COMPONENT.md +2 -1
- package/src/components/notification/examples/dismiss.tsx +2 -2
- package/src/components/page-content/COMPONENT.md +71 -14
- package/src/components/page-content/examples/grid.tsx +107 -0
- package/src/components/page-content/examples/list-detail.tsx +0 -3
- package/src/components/page-content/examples/overview.tsx +2 -2
- package/src/components/page-content/examples/screen.module.css +27 -0
- package/src/components/page-content/examples/screen.tsx +196 -0
- package/src/components/page-content/examples/sections.tsx +81 -0
- package/src/components/page-content/examples/variants.tsx +4 -11
- package/src/components/page-toolbar/COMPONENT.md +18 -16
- package/src/components/page-toolbar/examples/narrow.tsx +6 -3
- package/src/components/pagination/examples/controlled.tsx +29 -29
- package/src/components/pagination/examples/examples.module.css +0 -2
- package/src/components/progress-bar/COMPONENT.md +1 -1
- package/src/components/progress-bar/examples/segments.tsx +2 -2
- package/src/components/progress-circle/COMPONENT.md +1 -1
- package/src/components/progress-circle/examples/segments.tsx +8 -3
- package/src/components/radio/COMPONENT.md +1 -0
- package/src/components/radio/examples/examples.module.css +14 -0
- package/src/components/radio/examples/in-form.tsx +45 -0
- package/src/components/scroll-container/COMPONENT.md +1 -0
- package/src/components/scroll-container/examples/auto-scroll.tsx +3 -3
- package/src/components/scroll-container/examples/chat.tsx +3 -3
- package/src/components/scroll-container/examples/edges.tsx +6 -3
- package/src/components/scroll-container/examples/examples.module.css +4 -17
- package/src/components/scroll-container/examples/load-more.tsx +51 -0
- package/src/components/scroll-container/examples/lock.tsx +3 -5
- package/src/components/scroll-container/examples/overscroll.tsx +3 -3
- package/src/components/scroll-container/examples/overview.tsx +3 -3
- package/src/components/scroll-container/examples/scrollbar.tsx +13 -7
- package/src/components/scroll-container/examples/variants.tsx +13 -7
- package/src/components/segmented-control/COMPONENT.md +3 -2
- package/src/components/segmented-control/examples/in-form.tsx +5 -1
- package/src/components/segmented-control/examples/states.tsx +10 -1
- package/src/components/select/COMPONENT.md +5 -3
- package/src/components/select/examples/examples.module.css +2 -7
- package/src/components/select/examples/icon-only.tsx +38 -0
- package/src/components/select/examples/states.tsx +13 -1
- package/src/components/sheet/COMPONENT.md +2 -0
- package/src/components/sheet/examples/guard.tsx +72 -0
- package/src/components/sheet/examples/header-actions.tsx +56 -0
- package/src/components/slider/COMPONENT.md +2 -1
- package/src/components/slider/examples/examples.module.css +8 -0
- package/src/components/slider/examples/in-form.tsx +47 -0
- package/src/components/slider/examples/states.tsx +4 -1
- package/src/components/smart-filter/COMPONENT.md +1 -1
- package/src/components/smart-filter/examples/controlled.tsx +3 -3
- package/src/components/smart-filter/examples/ranges.tsx +44 -10
- package/src/components/sparkline/COMPONENT.md +83 -30
- package/src/components/sparkline/examples/compact.tsx +1 -1
- package/src/components/sparkline/examples/curve.tsx +28 -0
- package/src/components/sparkline/examples/gaps.tsx +33 -0
- package/src/components/sparkline/examples/overview.tsx +11 -2
- package/src/components/sparkline/examples/period.tsx +7 -2
- package/src/components/sparkline/examples/reference.tsx +38 -0
- package/src/components/sparkline/examples/variants.tsx +2 -2
- package/src/components/tabs/COMPONENT.md +1 -1
- package/src/components/tabs/examples/examples.module.css +0 -6
- package/src/components/tabs/examples/in-drawer.tsx +11 -13
- package/src/components/tabs/examples/sizes.tsx +1 -1
- package/src/components/tag-select/COMPONENT.md +1 -1
- package/src/components/tag-select/examples/states.tsx +8 -1
- package/src/components/textarea/COMPONENT.md +1 -1
- package/src/components/textarea/examples/examples.module.css +0 -6
- package/src/components/textarea/examples/in-form.tsx +1 -9
- package/src/components/textarea/examples/states.tsx +2 -1
- package/src/components/thumbnail/COMPONENT.md +2 -1
- package/src/components/thumbnail/examples/examples.module.css +1 -1
- package/src/components/thumbnail/examples/fit.tsx +24 -0
- package/src/components/thumbnail/examples/video.tsx +20 -1
- package/src/components/timeline/COMPONENT.md +1 -1
- package/src/components/timeline/examples/examples.module.css +0 -8
- package/src/components/timeline/examples/links.tsx +55 -14
- package/src/components/timeline/examples/narrow.tsx +2 -2
- package/src/components/timeline/examples/sizes.tsx +3 -3
- package/src/components/timeline/examples/variants.tsx +4 -4
- package/src/components/tooltip/COMPONENT.md +7 -5
- package/src/components/tooltip/examples/placement.tsx +2 -1
- package/src/components/tooltip/examples/toolbar.tsx +2 -2
- package/src/components/typography/examples/weights.tsx +3 -0
- package/src/components/video-note/COMPONENT.md +3 -3
- package/src/components/video-note/examples/controlled.tsx +19 -2
- package/src/components/video-note/examples/in-message.tsx +5 -2
- package/src/components/visually-hidden/COMPONENT.md +2 -1
- package/src/components/visually-hidden/examples/assertive.tsx +39 -0
- package/src/components/voice-player/COMPONENT.md +3 -3
- package/src/components/voice-player/examples/call-recording.tsx +19 -9
- package/src/components/voice-player/examples/controlled.tsx +20 -3
- package/src/layout/app-header/COMPONENT.md +46 -63
- package/src/layout/app-header/examples/breadcrumbs.tsx +10 -9
- package/src/layout/app-header/examples/examples.module.css +1 -1
- package/src/layout/app-header/examples/in-app-shell.tsx +2 -3
- package/src/layout/app-header/examples/narrow.tsx +4 -5
- package/src/layout/app-header/examples/overview.tsx +8 -10
- package/src/layout/app-header/examples/page-title.tsx +3 -10
- package/src/layout/app-shell/COMPONENT.md +5 -4
- package/src/layout/app-shell/examples/footer.tsx +2 -2
- package/src/layout/app-shell/examples/overview.tsx +17 -32
- package/src/layout/app-shell/examples/screen.module.css +11 -0
- package/src/layout/app-shell/examples/screen.tsx +262 -0
- package/src/layout/app-shell/examples/template.tsx +31 -11
- package/src/layout/bottom-nav/examples/floating-action.tsx +2 -2
- package/src/layout/bottom-nav/examples/floating.tsx +2 -2
- package/src/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
- package/src/layout/sidebar/COMPONENT.md +7 -4
- package/src/layout/sidebar/examples/account.tsx +2 -2
- package/src/layout/sidebar/examples/collapsible-groups.tsx +12 -4
- package/src/layout/sidebar/examples/custom-part.tsx +53 -0
- package/src/layout/sidebar/examples/examples.module.css +5 -0
- package/src/layout/sidebar/examples/narrow.tsx +53 -0
- package/src/layout/sidebar/examples/persist.tsx +57 -0
- package/src/layout/sidebar/examples/router.tsx +14 -2
- package/src/layout/sidebar/examples/structure.tsx +7 -2
- package/src/styles/theme-light.css +1 -0
- package/dist/skill/patterns/app-shell.tsx +0 -301
- package/dist/skill/patterns/chat.module.css +0 -8
- package/dist/skill/patterns/dashboard.module.css +0 -44
- package/dist/skill/patterns/dashboard.tsx +0 -326
- package/dist/skill/patterns/detail-page.tsx +0 -209
- package/dist/skill/patterns/form-drawer.tsx +0 -240
- package/dist/skill/patterns/kanban-board.module.css +0 -28
- package/dist/skill/patterns/media-library.tsx +0 -638
- package/dist/skill/patterns/schedule.module.css +0 -22
- package/dist/skill/patterns/screen-states.tsx +0 -186
- /package/dist/skill/{patterns/form-drawer.module.css → reference/components/drawer/examples/screen.module.css} +0 -0
package/dist/skill/layouts.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# Layouts — app frame, page wrappers, auth
|
|
2
2
|
|
|
3
3
|
Every screen sits in one frame: `AppShell.Root` with Nav / `AppHeader` / Main (the content panel is the page,
|
|
4
|
-
the nav rail one layer above it)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
the nav rail one layer above it). The `AppHeader` belongs to the page — it carries the page title and
|
|
5
|
+
the page's tools ([composition.md](composition.md#1-page-skeleton)); `PageContent` holds the body.
|
|
6
|
+
`AppShell.Main` carries the page gutters and `PageContent` spaces the page — blocks 24, a titled
|
|
7
|
+
`PageContent.Section` 40, tiles in a `PageContent.Grid` 16 on both axes — so your code adds **no outer padding and no margins**. Your CSS only lays out the inside of a block (grids, rows) with `gap` on `--prime-space-*`.
|
|
8
|
+
Main's top air under the header is part of the frame — 24, then 32 from 1024px: the page's first block
|
|
9
|
+
starts there; never cancel it with a negative margin or a padding override.
|
|
9
10
|
|
|
10
|
-
The page recipes are whole, working screens
|
|
11
|
-
([the list](composition.md#
|
|
11
|
+
The page recipes are whole, working screens — the `screen.tsx` example of their main component
|
|
12
|
+
([the list](composition.md#screens)): start from the closest one and keep its skeleton. The rules behind them are in [composition.md](composition.md).
|
|
12
13
|
|
|
13
14
|
## App frame (once per app)
|
|
14
15
|
|
|
@@ -16,18 +17,31 @@ Every `Sidebar.Item` gets a `Sidebar.ItemIcon` (in compact mode only icons remai
|
|
|
16
17
|
`href`, or `asChild` with the router's `NavLink`; `current` marks the current page (`aria-current`), a
|
|
17
18
|
router link sets it itself. Counters go in `Sidebar.ItemCount`. Below 768px the Sidebar becomes an
|
|
18
19
|
off-canvas panel — the app must render a menu button that opens it, otherwise navigation is unreachable
|
|
19
|
-
on phones. `AppHeader` is the top bar of the panel on every width
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
the brand and the title read as one line.
|
|
20
|
+
on phones. `AppHeader` is the top bar of the panel on every width, and its row is the page's: the
|
|
21
|
+
frame gives it the menu button (`AppHeader.MenuButton` shows itself below 768px, the Sidebar's own
|
|
22
|
+
breakpoint); each page gives it its title, a line of data, its own buttons and its tools. The row is
|
|
23
|
+
as high as the Sidebar brand row, so the brand and the title read as one line. Nothing app-wide goes
|
|
24
|
+
into it — no global search, no notifications: the header row is per page.
|
|
23
25
|
|
|
24
26
|
```tsx
|
|
25
27
|
import { AppHeader, AppShell, Icon, NotificationProvider, Sidebar } from "prime-ui-kit";
|
|
26
28
|
import { type ReactNode, useState } from "react";
|
|
27
29
|
|
|
28
|
-
type AppLayoutProps = {
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
type AppLayoutProps = {
|
|
31
|
+
/** The page title — the page's h1; leave it out on a document page (its title is in main). */
|
|
32
|
+
title?: ReactNode;
|
|
33
|
+
/** One line of data under the title. */
|
|
34
|
+
description?: ReactNode;
|
|
35
|
+
/** The path up on a nested record: a `Breadcrumb.Root`. */
|
|
36
|
+
path?: ReactNode;
|
|
37
|
+
/** The page's own buttons in the title row. */
|
|
38
|
+
actions?: ReactNode;
|
|
39
|
+
/** The page's tools: a `PageToolbar.Root`. */
|
|
40
|
+
tools?: ReactNode;
|
|
41
|
+
children: ReactNode;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export function AppLayout({ title, description, path, actions, tools, children }: AppLayoutProps) {
|
|
31
45
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
32
46
|
return (
|
|
33
47
|
<NotificationProvider>
|
|
@@ -79,10 +93,21 @@ export function AppLayout({ title, onSearch, children }: AppLayoutProps) {
|
|
|
79
93
|
<AppHeader.Root>
|
|
80
94
|
<AppHeader.Start>
|
|
81
95
|
<AppHeader.MenuButton aria-expanded={menuOpen} onClick={() => setMenuOpen(true)} />
|
|
82
|
-
|
|
96
|
+
{path ? (
|
|
97
|
+
<>
|
|
98
|
+
{path}
|
|
99
|
+
<AppHeader.Separator />
|
|
100
|
+
</>
|
|
101
|
+
) : null}
|
|
102
|
+
{title ? (
|
|
103
|
+
<AppHeader.Title>
|
|
104
|
+
{title}
|
|
105
|
+
{description ? <AppHeader.Description>{description}</AppHeader.Description> : null}
|
|
106
|
+
</AppHeader.Title>
|
|
107
|
+
) : null}
|
|
83
108
|
</AppHeader.Start>
|
|
84
|
-
{
|
|
85
|
-
<AppHeader.
|
|
109
|
+
{actions ? <AppHeader.Actions>{actions}</AppHeader.Actions> : null}
|
|
110
|
+
{tools ? <AppHeader.Tools>{tools}</AppHeader.Tools> : null}
|
|
86
111
|
</AppHeader.Root>
|
|
87
112
|
<AppShell.Main>{children}</AppShell.Main>
|
|
88
113
|
</AppShell.Root>
|
|
@@ -91,6 +116,11 @@ export function AppLayout({ title, onSearch, children }: AppLayoutProps) {
|
|
|
91
116
|
}
|
|
92
117
|
```
|
|
93
118
|
|
|
119
|
+
Each page renders `AppLayout` with its own header content:
|
|
120
|
+
`<AppLayout title="Заказы" description="128 в работе · 6 ждут оплаты" tools={<OrdersToolbar />}>`.
|
|
121
|
+
A document page (settings, a long form, help) passes no `title` and opens its body with
|
|
122
|
+
`PageContent.Header`.
|
|
123
|
+
|
|
94
124
|
Phone navigation for 2–6 main sections is a `BottomNav.Root` in `AppShell.Footer` (the last child of
|
|
95
125
|
`AppShell.Root`, or the Template `footer` prop) — never in Main, never `position: fixed`, never behind
|
|
96
126
|
your own media query. The shell hides the footer while the Sidebar rail is on screen and shows it
|
|
@@ -101,21 +131,19 @@ Next.js App Router: the package is marked `"use client"`, but a server component
|
|
|
101
131
|
`"use client"` and render them from `app/layout.tsx` and the pages; import `bundle.css` in the root
|
|
102
132
|
layout and put `data-theme` on `<html>` there.
|
|
103
133
|
|
|
104
|
-
A nested record page
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
### The page title in the header
|
|
134
|
+
A nested record page puts the path up before its title in the header — `Breadcrumb` (the list it
|
|
135
|
+
belongs to), `AppHeader.Separator`, `AppHeader.Title` with the record's name and its status as
|
|
136
|
+
the description ([the detail page](reference/components/description-list/examples/screen.tsx)). With
|
|
137
|
+
`offCanvas="always"` pass `show="always"` to the menu button.
|
|
109
138
|
|
|
110
|
-
|
|
111
|
-
heading row in main and let the header carry the page — one or the other, never both:
|
|
139
|
+
### The page's tools in the header
|
|
112
140
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
141
|
+
The page's tools — its own search and filters, sections, the period or view, the primary action —
|
|
142
|
+
go into `AppHeader.Tools` as a `PageToolbar.Root`: the header's second row, full width, sticky with
|
|
143
|
+
it. The toolbar lays itself out from that width (one row when wide, stacked rows on a phone, the
|
|
144
|
+
primary action on its own row when the search would be squeezed), so the tools wrap under the title
|
|
145
|
+
instead of squeezing it. `AppHeader.Actions` keeps the page's other buttons (export, a more menu) in
|
|
146
|
+
the title row.
|
|
119
147
|
|
|
120
148
|
```tsx
|
|
121
149
|
import { AppHeader, Button, Icon, PageToolbar, SegmentedControl } from "prime-ui-kit";
|
|
@@ -126,7 +154,10 @@ export function DealsHeader({ view, onViewChange }: DealsHeaderProps) {
|
|
|
126
154
|
return (
|
|
127
155
|
<AppHeader.Root>
|
|
128
156
|
<AppHeader.Start>
|
|
129
|
-
<AppHeader.Title
|
|
157
|
+
<AppHeader.Title>
|
|
158
|
+
Сделки
|
|
159
|
+
<AppHeader.Description>7 сделок в работе · 6 461 750 ₽</AppHeader.Description>
|
|
160
|
+
</AppHeader.Title>
|
|
130
161
|
</AppHeader.Start>
|
|
131
162
|
<AppHeader.Tools>
|
|
132
163
|
<PageToolbar.Root aria-label="Сделки">
|
|
@@ -181,11 +212,13 @@ from what people do, not from how the backend is split. The full guide with the
|
|
|
181
212
|
|
|
182
213
|
## Page wrapper
|
|
183
214
|
|
|
184
|
-
- App pages
|
|
185
|
-
|
|
186
|
-
|
|
215
|
+
- App pages (dashboard, list, detail, a board): `PageContent.Page` — the full width of the panel; the
|
|
216
|
+
page's title and tools are in its `AppHeader`, the body starts with its first block.
|
|
217
|
+
- Document pages — settings and long forms: `PageContent.Root maxWidth="wide"` with `PageContent.Header`
|
|
218
|
+
(the page's h1) and a `PageContent.Section layout="aside"`
|
|
219
|
+
(heading column + panel) per section ([the settings page](reference/components/page-content/examples/screen.tsx)), or `maxWidth="readable"` for a single
|
|
187
220
|
narrow column of fields.
|
|
188
|
-
- Long reading text (terms, help): `PageContent.Root maxWidth="readable"`.
|
|
221
|
+
- Long reading text (terms, help): `PageContent.Root maxWidth="readable"` with `PageContent.Header`.
|
|
189
222
|
- A page as high as the panel (a log, a board, a chat): `AppShell.Root fillViewport` +
|
|
190
223
|
`PageContent.Root fill`; the body passes its free height to a filling child — DataTable
|
|
191
224
|
`scrollHeight="fill"`, Crossfade `fill`, `PageContent.Split`. Never compute heights from `100vh`.
|
|
@@ -196,9 +229,9 @@ from what people do, not from how the backend is split. The full guide with the
|
|
|
196
229
|
(`anchor="end"` for a thread). The records in the list pane are a `List` (`current` on the open
|
|
197
230
|
one). Details that open over a table and close again are a Drawer instead.
|
|
198
231
|
|
|
199
|
-
## Which
|
|
232
|
+
## Which screen to start from
|
|
200
233
|
|
|
201
|
-
The table of screens
|
|
234
|
+
The table of screens lives in [composition.md](composition.md#screens).
|
|
202
235
|
|
|
203
236
|
A short form (≤ 4 fields: rename, invite, confirm with a reason) belongs in a `Modal` with the same
|
|
204
237
|
form rules: `Modal.Body` holds the `<form id>`, `Modal.Footer` holds Cancel + submit with `form={id}`
|
|
@@ -67,7 +67,7 @@ Avatar.Group overlapping row, gives its size to members
|
|
|
67
67
|
|
|
68
68
|
| Prop | Type | Default | Description |
|
|
69
69
|
|---|---|---|---|
|
|
70
|
-
| `status` | `"online" \| "offline" \| "away" \| "busy"` | — (required) | Presence state: green
|
|
70
|
+
| `status` | `"online" \| "offline" \| "away" \| "busy"` | — (required) | Presence state, told by shape and color: `online` a full green dot, `away` a warning crescent, `busy` a danger dot with a bar, `offline` a hollow gray ring. |
|
|
71
71
|
| `labels` | `Partial<AvatarStatusLabels>` | — | Accessible names of the states, see Labels. |
|
|
72
72
|
| `…rest` | `Omit<HTMLAttributes<HTMLSpanElement>, "children">` | — | `className` and the other span attributes. |
|
|
73
73
|
|
|
@@ -129,7 +129,7 @@ No keyboard interaction.
|
|
|
129
129
|
|
|
130
130
|
### ARIA
|
|
131
131
|
- `Avatar.Image` `alt`: empty when the name is written next to it, otherwise the name. Without a photo and without a name nearby, put `aria-label` on `Avatar.Root`.
|
|
132
|
-
- `Avatar.Status` is `role="img"` with `aria-label` from `labels`.
|
|
132
|
+
- `Avatar.Status` is `role="img"` with `aria-label` from `labels`. Every state has its own shape (full dot, crescent, dot with a bar, hollow ring), so presence never rests on color alone.
|
|
133
133
|
- `Avatar.Group` is `role="group"`; give it `aria-label`. Give `Avatar.Overflow` an `aria-label` («Ещё 3 участника»).
|
|
134
134
|
|
|
135
135
|
### Labels
|
|
@@ -148,8 +148,8 @@ No keyboard interaction.
|
|
|
148
148
|
| [overview.tsx](examples/overview.tsx) | A photo with initials underneath while it loads, and initials alone — `Avatar.Image`, `Avatar.Fallback`. |
|
|
149
149
|
| [variants.tsx](examples/variants.tsx) | Every palette hue of the fallback; derive it from a stable user id — `color`. |
|
|
150
150
|
| [sizes.tsx](examples/sizes.tsx) | Every diameter, 20 to 64 px; initials take 40% of it — `size`. |
|
|
151
|
-
| [states.tsx](examples/states.tsx) | A loaded photo, a broken URL that falls back to initials, and an icon fallback for a guest. |
|
|
152
|
-
| [presence.tsx](examples/presence.tsx) | A presence dot on the avatar edge
|
|
151
|
+
| [states.tsx](examples/states.tsx) | A loaded photo, a broken URL that falls back to initials, and an icon fallback for a guest — `Avatar.Image`, `Avatar.Fallback`. |
|
|
152
|
+
| [presence.tsx](examples/presence.tsx) | A presence dot on the avatar edge: each state has its own shape and color and is announced by its name — `Avatar.Status`, `labels`. |
|
|
153
153
|
| [team-group.tsx](examples/team-group.tsx) | Project members as an overlapping row with a «+N» cell; the group size goes to every member — `Avatar.Group`, `Avatar.Overflow`, `size`. |
|
|
154
154
|
| [src-from-state.tsx](examples/src-from-state.tsx) | A new photo source restarts loading; initials show until the new photo arrives — `src`. |
|
|
155
155
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A presence dot on the avatar edge
|
|
1
|
+
/** A presence dot on the avatar edge: each state has its own shape and color and is announced by its name — `Avatar.Status`, `labels`. */
|
|
2
2
|
import { Avatar, Typography } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A loaded photo, a broken URL that falls back to initials, and an icon fallback for a guest. */
|
|
1
|
+
/** A loaded photo, a broken URL that falls back to initials, and an icon fallback for a guest — `Avatar.Image`, `Avatar.Fallback`. */
|
|
2
2
|
import { Avatar, Icon, Typography } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
const PHOTO = "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=128&h=128&fit=crop";
|
|
@@ -7,7 +7,7 @@ export default function AvatarStatesExample() {
|
|
|
7
7
|
return (
|
|
8
8
|
<div>
|
|
9
9
|
<div>
|
|
10
|
-
<Avatar.Root
|
|
10
|
+
<Avatar.Root color="green">
|
|
11
11
|
<Avatar.Image src={PHOTO} alt="Михаил Котов" />
|
|
12
12
|
<Avatar.Fallback>МК</Avatar.Fallback>
|
|
13
13
|
</Avatar.Root>
|
|
@@ -16,7 +16,7 @@ export default function AvatarStatesExample() {
|
|
|
16
16
|
</Typography>
|
|
17
17
|
</div>
|
|
18
18
|
<div>
|
|
19
|
-
<Avatar.Root
|
|
19
|
+
<Avatar.Root color="orange">
|
|
20
20
|
<Avatar.Image src="https://example.com/missing-avatar.png" alt="Сергей Лебедев" />
|
|
21
21
|
<Avatar.Fallback>СЛ</Avatar.Fallback>
|
|
22
22
|
</Avatar.Root>
|
|
@@ -25,9 +25,9 @@ export default function AvatarStatesExample() {
|
|
|
25
25
|
</Typography>
|
|
26
26
|
</div>
|
|
27
27
|
<div>
|
|
28
|
-
<Avatar.Root
|
|
28
|
+
<Avatar.Root aria-label="Гость">
|
|
29
29
|
<Avatar.Fallback>
|
|
30
|
-
<Icon name="
|
|
30
|
+
<Icon name="object.user" />
|
|
31
31
|
</Avatar.Fallback>
|
|
32
32
|
</Avatar.Root>
|
|
33
33
|
<Typography as="span" variant="caption" tone="muted">
|
|
@@ -8,23 +8,9 @@ const INITIAL = ["Москва", "Санкт-Петербург", "Есть в
|
|
|
8
8
|
|
|
9
9
|
export default function BadgeAppliedFiltersExample() {
|
|
10
10
|
const [filters, setFilters] = React.useState(INITIAL);
|
|
11
|
-
const titleId = React.useId();
|
|
12
11
|
|
|
13
12
|
return (
|
|
14
|
-
<
|
|
15
|
-
<div className={styles.filtersHeader}>
|
|
16
|
-
<Typography as="h3" variant="title-s" id={titleId}>
|
|
17
|
-
Фильтры
|
|
18
|
-
</Typography>
|
|
19
|
-
<Button.Root
|
|
20
|
-
variant="ghost"
|
|
21
|
-
tone="neutral"
|
|
22
|
-
size="s"
|
|
23
|
-
onClick={() => setFilters(filters.length > 0 ? [] : INITIAL)}
|
|
24
|
-
>
|
|
25
|
-
{filters.length > 0 ? "Сбросить все" : "Вернуть"}
|
|
26
|
-
</Button.Root>
|
|
27
|
-
</div>
|
|
13
|
+
<div className={styles.filters}>
|
|
28
14
|
{filters.length > 0 ? (
|
|
29
15
|
<div className={styles.badges}>
|
|
30
16
|
{filters.map((label) => (
|
|
@@ -36,12 +22,20 @@ export default function BadgeAppliedFiltersExample() {
|
|
|
36
22
|
{label}
|
|
37
23
|
</Badge.Root>
|
|
38
24
|
))}
|
|
25
|
+
<Button.Root variant="ghost" tone="neutral" size="s" onClick={() => setFilters([])}>
|
|
26
|
+
Сбросить все
|
|
27
|
+
</Button.Root>
|
|
39
28
|
</div>
|
|
40
29
|
) : (
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
30
|
+
<div className={styles.badges}>
|
|
31
|
+
<Typography variant="body-s" tone="muted">
|
|
32
|
+
Фильтры не выбраны — показаны все товары.
|
|
33
|
+
</Typography>
|
|
34
|
+
<Button.Root variant="ghost" tone="neutral" size="s" onClick={() => setFilters(INITIAL)}>
|
|
35
|
+
Вернуть
|
|
36
|
+
</Button.Root>
|
|
37
|
+
</div>
|
|
44
38
|
)}
|
|
45
|
-
</
|
|
39
|
+
</div>
|
|
46
40
|
);
|
|
47
41
|
}
|
|
@@ -10,20 +10,13 @@
|
|
|
10
10
|
width: min(100%, var(--prime-modal-width-m));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
/* applied-filters.tsx: a
|
|
13
|
+
/* applied-filters.tsx, server-tags.tsx: a row of badges above a list. */
|
|
14
14
|
.filters {
|
|
15
15
|
display: grid;
|
|
16
16
|
gap: var(--prime-space-3);
|
|
17
17
|
width: min(100%, var(--prime-modal-width-s));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.filtersHeader {
|
|
21
|
-
display: flex;
|
|
22
|
-
align-items: center;
|
|
23
|
-
justify-content: space-between;
|
|
24
|
-
gap: var(--prime-space-3);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
20
|
.badges {
|
|
28
21
|
display: flex;
|
|
29
22
|
flex-wrap: wrap;
|
|
@@ -19,13 +19,9 @@ function deleteTag(tag: string) {
|
|
|
19
19
|
export default function BadgeServerTagsExample() {
|
|
20
20
|
const [tags, setTags] = React.useState(TAGS);
|
|
21
21
|
const [failure, setFailure] = React.useState<string | null>(null);
|
|
22
|
-
const titleId = React.useId();
|
|
23
22
|
|
|
24
23
|
return (
|
|
25
|
-
<
|
|
26
|
-
<Typography as="h3" variant="title-s" id={titleId}>
|
|
27
|
-
Теги заказа № 4821
|
|
28
|
-
</Typography>
|
|
24
|
+
<div className={styles.filters}>
|
|
29
25
|
<div className={styles.badges}>
|
|
30
26
|
{tags.map((tag) => (
|
|
31
27
|
<Badge.Root
|
|
@@ -56,6 +52,6 @@ export default function BadgeServerTagsExample() {
|
|
|
56
52
|
{failure}
|
|
57
53
|
</Typography>
|
|
58
54
|
) : null}
|
|
59
|
-
</
|
|
55
|
+
</div>
|
|
60
56
|
);
|
|
61
57
|
}
|
|
@@ -46,7 +46,7 @@ Banner.Root <div>; variant, tone, size, placement
|
|
|
46
46
|
| `tone` | `"neutral" \| "accent" \| "success" \| "warning" \| "danger" \| "info"` | `"info"` | Semantic color of the message. |
|
|
47
47
|
| `size` | `"xs" \| "s" \| "m" \| "l" \| "xl"` | `"m"` | Spacing, icon and title follow the control tier; the description is one step smaller. |
|
|
48
48
|
| `placement` | `"inset" \| "page"` | `"inset"` | `inset` — rounded block in the flow or in a card; `page` — edge-to-edge strip above a page, content aligned to the page column. |
|
|
49
|
-
| `onDismiss` | `() => void` | — | Renders a close button (top-right, or last in `Banner.Actions`) and calls this on click; the parent unmounts the banner. |
|
|
49
|
+
| `onDismiss` | `() => void` | — | Renders a close button (top-right, or last in `Banner.Actions`) and calls this on click; the parent unmounts the banner, which closes up in place, and moves focus to a sensible place. |
|
|
50
50
|
| `labels` | `Partial<BannerLabels>` | — | Built-in strings, see Labels. |
|
|
51
51
|
| `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `className`, `role` (`alert`, `status`, `region`), `aria-label` and the other div attributes. |
|
|
52
52
|
|
|
@@ -117,7 +117,7 @@ Banner.Root <div>; variant, tone, size, placement
|
|
|
117
117
|
| dismissible | `onDismiss` | corner ghost Button (`xs`, `s` on `l` / `xl`), or the last outline Button in `Banner.Actions` |
|
|
118
118
|
| narrow | own width < 36rem (a banner with `Banner.Actions` is a size container) | actions move under the text |
|
|
119
119
|
|
|
120
|
-
No `open` prop: the parent mounts and unmounts the banner.
|
|
120
|
+
No `open` prop: the parent mounts and unmounts the banner. A mounted banner enters (a short fade and rise); an unmounted one closes up in place, so the content below glides up instead of jumping. To swap the banner for another block in the same spot (a «restore» button), wrap both in [Crossfade](../crossfade/COMPONENT.md).
|
|
121
121
|
|
|
122
122
|
## Layout & spacing
|
|
123
123
|
- `width: 100%`; text column capped at `--prime-layout-reading-max-width`.
|
|
@@ -134,7 +134,7 @@ No `open` prop: the parent mounts and unmounts the banner.
|
|
|
134
134
|
### ARIA
|
|
135
135
|
- The banner has no role of its own: give an error after an action `role="alert"`, a calm status `role="status"`, a page strip `role="region"` with `aria-label`.
|
|
136
136
|
- The icon is `aria-hidden`: the title carries the meaning, not the color.
|
|
137
|
-
- The close button is named by `labels.dismiss
|
|
137
|
+
- The close button is named by `labels.dismiss`. It leaves with the banner, so after dismissing the parent moves focus to a sensible place: the control that takes the banner's spot, or the next heading or action of the section (see `dismissible.tsx`).
|
|
138
138
|
|
|
139
139
|
### Labels
|
|
140
140
|
<!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
|
|
@@ -150,9 +150,9 @@ No `open` prop: the parent mounts and unmounts the banner.
|
|
|
150
150
|
| [variants.tsx](examples/variants.tsx) | Every treatment on every tone: soft by default, solid for urgent, outline for calm — `variant`, `tone`. |
|
|
151
151
|
| [sizes.tsx](examples/sizes.tsx) | Every tier: padding, icon and title follow the control tier, the description is one step smaller — `size`. |
|
|
152
152
|
| [structure.tsx](examples/structure.tsx) | Optional parts: a one-line title, a title with a description, and actions where the close button joins the row — `Banner.Description`, `Banner.Actions`, `onDismiss`. |
|
|
153
|
-
| [dismissible.tsx](examples/dismissible.tsx) | The parent owns visibility: the close button calls back and
|
|
153
|
+
| [dismissible.tsx](examples/dismissible.tsx) | The parent owns visibility: the close button calls back, the banner closes up and focus moves to the restore button; the button name comes from labels — `onDismiss`, `labels`. |
|
|
154
154
|
| [page-strip.tsx](examples/page-strip.tsx) | An edge-to-edge strip above a page and a rounded block inside a card — `placement`. |
|
|
155
|
-
| [narrow.tsx](examples/narrow.tsx) | Below 36rem of its own width the banner moves the actions under the text. |
|
|
155
|
+
| [narrow.tsx](examples/narrow.tsx) | Below 36rem of its own width the banner moves the actions under the text — `Banner.Actions`. |
|
|
156
156
|
|
|
157
157
|
## Mistakes
|
|
158
158
|
- A hand-made × next to the banner → pass `onDismiss`.
|
|
@@ -162,4 +162,4 @@ No `open` prop: the parent mounts and unmounts the banner.
|
|
|
162
162
|
|
|
163
163
|
## Related
|
|
164
164
|
- **Built from:** [Button](../button/COMPONENT.md) (close button), Icon (`action.close`)
|
|
165
|
-
- **See also:** [Notification](../notification/COMPONENT.md), [Hint](../hint/COMPONENT.md), [EmptyPage](../empty-page/COMPONENT.md), [Badge](../badge/COMPONENT.md)
|
|
165
|
+
- **See also:** [Crossfade](../crossfade/COMPONENT.md), [Notification](../notification/COMPONENT.md), [Hint](../hint/COMPONENT.md), [EmptyPage](../empty-page/COMPONENT.md), [Badge](../badge/COMPONENT.md)
|
|
@@ -1,18 +1,34 @@
|
|
|
1
|
-
/** The parent owns visibility: the close button calls back and
|
|
2
|
-
import { Banner, Button, Icon } from "prime-ui-kit";
|
|
1
|
+
/** The parent owns visibility: the close button calls back, the banner closes up and focus moves to the restore button; the button name comes from labels — `onDismiss`, `labels`. */
|
|
2
|
+
import { Banner, Button, Crossfade, Icon } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
import styles from "./examples.module.css";
|
|
6
6
|
|
|
7
7
|
export default function BannerDismissibleExample() {
|
|
8
8
|
const [visible, setVisible] = React.useState(true);
|
|
9
|
+
const bannerRef = React.useRef<HTMLDivElement>(null);
|
|
10
|
+
const restoreRef = React.useRef<HTMLButtonElement>(null);
|
|
11
|
+
const toggled = React.useRef(false);
|
|
12
|
+
|
|
13
|
+
// The pressed button leaves with its block: focus goes to the control that takes its place.
|
|
14
|
+
React.useEffect(() => {
|
|
15
|
+
if (!toggled.current) return;
|
|
16
|
+
if (visible) bannerRef.current?.querySelector("button")?.focus();
|
|
17
|
+
else restoreRef.current?.focus();
|
|
18
|
+
}, [visible]);
|
|
19
|
+
|
|
20
|
+
const toggle = (next: boolean) => {
|
|
21
|
+
toggled.current = true;
|
|
22
|
+
setVisible(next);
|
|
23
|
+
};
|
|
9
24
|
|
|
10
25
|
return (
|
|
11
|
-
<
|
|
26
|
+
<Crossfade state={visible ? "banner" : "restore"} className={styles.region}>
|
|
12
27
|
{visible ? (
|
|
13
28
|
<Banner.Root
|
|
29
|
+
ref={bannerRef}
|
|
14
30
|
tone="accent"
|
|
15
|
-
onDismiss={() =>
|
|
31
|
+
onDismiss={() => toggle(false)}
|
|
16
32
|
labels={{ dismiss: "Скрыть объявление" }}
|
|
17
33
|
>
|
|
18
34
|
<Banner.Content>
|
|
@@ -24,15 +40,10 @@ export default function BannerDismissibleExample() {
|
|
|
24
40
|
</Banner.Content>
|
|
25
41
|
</Banner.Root>
|
|
26
42
|
) : (
|
|
27
|
-
<Button.Root
|
|
28
|
-
variant="outline"
|
|
29
|
-
tone="neutral"
|
|
30
|
-
className={styles.restore}
|
|
31
|
-
onClick={() => setVisible(true)}
|
|
32
|
-
>
|
|
43
|
+
<Button.Root ref={restoreRef} variant="outline" tone="neutral" onClick={() => toggle(true)}>
|
|
33
44
|
Вернуть баннер
|
|
34
45
|
</Button.Root>
|
|
35
46
|
)}
|
|
36
|
-
</
|
|
47
|
+
</Crossfade>
|
|
37
48
|
);
|
|
38
49
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
min-width: 0;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
/*
|
|
11
|
+
/* page-strip.tsx: the page strip above a card with an inset banner. */
|
|
12
12
|
.sections {
|
|
13
13
|
display: flex;
|
|
14
14
|
flex-direction: column;
|
|
@@ -17,16 +17,12 @@
|
|
|
17
17
|
min-width: 0;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.pageBody {
|
|
21
|
-
padding: var(--prime-space-5) var(--prime-space-4) var(--prime-space-8);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
20
|
/* narrow.tsx: a 320px column; the banner's container query moves actions under the text. */
|
|
25
21
|
.narrow {
|
|
26
22
|
width: min(100%, calc(var(--prime-space-20) * 4));
|
|
27
23
|
}
|
|
28
24
|
|
|
29
|
-
/*
|
|
30
|
-
.
|
|
31
|
-
|
|
25
|
+
/* dismissible.tsx: the swapped region takes the row's width. */
|
|
26
|
+
.region {
|
|
27
|
+
width: 100%;
|
|
32
28
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Below 36rem of its own width the banner moves the actions under the text. */
|
|
1
|
+
/** Below 36rem of its own width the banner moves the actions under the text — `Banner.Actions`. */
|
|
2
2
|
import { Banner, Button, Icon } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
@@ -1,32 +1,26 @@
|
|
|
1
1
|
/** An edge-to-edge strip above a page and a rounded block inside a card — `placement`. */
|
|
2
|
-
import { Banner, Button, Card, Icon
|
|
2
|
+
import { Banner, Button, Card, Icon } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
5
5
|
|
|
6
6
|
export default function BannerPageStripExample() {
|
|
7
7
|
return (
|
|
8
8
|
<div className={styles.sections}>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
<div className={styles.pageBody}>
|
|
25
|
-
<Typography as="h3" variant="heading-s">
|
|
26
|
-
Отчёты
|
|
27
|
-
</Typography>
|
|
28
|
-
</div>
|
|
29
|
-
</Card.Root>
|
|
9
|
+
{/* In an app the strip stands first in the page, edge to edge above its content. */}
|
|
10
|
+
<Banner.Root
|
|
11
|
+
tone="warning"
|
|
12
|
+
placement="page"
|
|
13
|
+
role="region"
|
|
14
|
+
aria-label="Пробный период"
|
|
15
|
+
onDismiss={() => undefined}
|
|
16
|
+
>
|
|
17
|
+
<Banner.Content>
|
|
18
|
+
<Banner.Icon>
|
|
19
|
+
<Icon name="status.warning" />
|
|
20
|
+
</Banner.Icon>
|
|
21
|
+
<Banner.Title>Пробный период закончится 12 октября</Banner.Title>
|
|
22
|
+
</Banner.Content>
|
|
23
|
+
</Banner.Root>
|
|
30
24
|
<Card.Root variant="panel">
|
|
31
25
|
<Card.Header>
|
|
32
26
|
<Card.Title>Оплата</Card.Title>
|
|
@@ -85,13 +85,14 @@ Use links for every ancestor and `current` on the last item; `s` above a `headin
|
|
|
85
85
|
|---|---|---|
|
|
86
86
|
| current | `current` | `aria-current="page"` on the text span, or on the link when the item has `href` |
|
|
87
87
|
| hover / focus-visible on links | pointer / keyboard | text → primary; focus ring from LinkButton |
|
|
88
|
-
| truncation | width | each level truncates with an ellipsis, max width `2 × --prime-space-24` (192; `--prime-space-24 + --prime-space-6`, 120,
|
|
88
|
+
| truncation | width | each level truncates with an ellipsis, max width `2 × --prime-space-24` (192; `--prime-space-24 + --prime-space-6`, 120, when its container is below 30rem — its own for 3+ levels, the nearest one above for 1–2); the last item shrinks last |
|
|
89
89
|
| auto-collapse | 3+ levels and a container `< 30rem` | `data-collapsible="true"`; middle levels are `display: none` and replaced by «… ›», whose hidden text (`labels.ellipsis`) names them |
|
|
90
90
|
|
|
91
91
|
Root attributes: `data-size`, `data-collapsible` (`"true"` / `"false"`).
|
|
92
92
|
|
|
93
93
|
## Layout & spacing
|
|
94
|
-
-
|
|
94
|
+
- A path of 1–2 levels takes its content width (at most the row), so in a flex row — the `AppHeader` start, before `AppHeader.Separator` and the title — what follows stands right after it. A path of 3+ levels is a size container (`container-type: inline-size`, `inline-size: 100%`) that folds its middle levels by its own width: inside a flex row give it `flex: 1 1 auto; min-width: 0`.
|
|
95
|
+
- In an `AppHeader` the path up holds the list a record belongs to (1–2 levels); the record itself is the `AppHeader.Title` after the separator, not the breadcrumb's `current` item.
|
|
95
96
|
- Above a page title: `gap: var(--prime-space-2)` between the trail and the title row.
|
|
96
97
|
- The list never wraps. Chevrons sit inside each level after the first, in the placeholder text color, at the tier icon size.
|
|
97
98
|
|
|
@@ -123,8 +124,8 @@ Root attributes: `data-size`, `data-collapsible` (`"true"` / `"false"`).
|
|
|
123
124
|
| [overview.tsx](examples/overview.tsx) | The path to this page: links to the levels above and the current page last — `href`, `current`. |
|
|
124
125
|
| [sizes.tsx](examples/sizes.tsx) | Every size tier; text and chevrons follow the control tier — `size`. |
|
|
125
126
|
| [with-icon.tsx](examples/with-icon.tsx) | The root level as a home icon; a link without text is named for screen readers — `aria-label`. |
|
|
126
|
-
| [overflow.tsx](examples/overflow.tsx) | A long path: levels truncate, and in a 320px container the middle ones collapse into «…», which screen readers announce as hidden levels. |
|
|
127
|
-
| [ellipsis.tsx](examples/ellipsis.tsx) | Levels skipped on purpose shown as «…»
|
|
127
|
+
| [overflow.tsx](examples/overflow.tsx) | A long path: levels truncate, and in a 320px container the middle ones collapse into «…», which screen readers announce as hidden levels — `Breadcrumb.Item`, `current`. |
|
|
128
|
+
| [ellipsis.tsx](examples/ellipsis.tsx) | Levels skipped on purpose shown as «…» whose hidden text names them for screen readers — `Breadcrumb.Ellipsis`, `labels`. |
|
|
128
129
|
|
|
129
130
|
## Mistakes
|
|
130
131
|
- Separators by hand between items → the root draws the chevrons.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/** Levels skipped on purpose shown as «…»
|
|
1
|
+
/** Levels skipped on purpose shown as «…» whose hidden text names them for screen readers — `Breadcrumb.Ellipsis`, `labels`. */
|
|
2
2
|
import { Breadcrumb } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
export default function BreadcrumbEllipsisExample() {
|
|
5
5
|
return (
|
|
6
|
-
<Breadcrumb.Root>
|
|
6
|
+
<Breadcrumb.Root labels={{ ellipsis: "Скрытые разделы: Мебель, Офисные кресла" }}>
|
|
7
7
|
<Breadcrumb.Item href="#catalog">Каталог</Breadcrumb.Item>
|
|
8
8
|
<Breadcrumb.Ellipsis />
|
|
9
9
|
<Breadcrumb.Item current>Кресло «Оптима»</Breadcrumb.Item>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A long path: levels truncate, and in a 320px container the middle ones collapse into «…», which screen readers announce as hidden levels. */
|
|
1
|
+
/** A long path: levels truncate, and in a 320px container the middle ones collapse into «…», which screen readers announce as hidden levels — `Breadcrumb.Item`, `current`. */
|
|
2
2
|
import { Breadcrumb } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
@@ -152,12 +152,12 @@ Group attributes: `data-size`, `data-orientation="vertical"` (only when vertical
|
|
|
152
152
|
|---|---|
|
|
153
153
|
| [overview.tsx](examples/overview.tsx) | Related actions joined into one bar with a group name — `aria-label`. |
|
|
154
154
|
| [sizes.tsx](examples/sizes.tsx) | Every size tier, 28 to 48 px high, set once on the root — `size`. |
|
|
155
|
-
| [states.tsx](examples/states.tsx) | A plain segment, a toggled one
|
|
155
|
+
| [states.tsx](examples/states.tsx) | A plain segment, a toggled one, a disabled one and a group in error — `pressed`, `disabled`, `invalid`. |
|
|
156
156
|
| [with-icon.tsx](examples/with-icon.tsx) | An icon before the label and square icon-only segments — `ButtonGroup.Icon`, `aria-label`. |
|
|
157
157
|
| [orientation.tsx](examples/orientation.tsx) | A row of segments and a column of related options — `orientation`. |
|
|
158
158
|
| [full-width.tsx](examples/full-width.tsx) | The group fills its column and the segments share the width equally — `fullWidth`. |
|
|
159
159
|
| [controlled.tsx](examples/controlled.tsx) | One of several: the active segment lives in parent state and gets `pressed`. |
|
|
160
|
-
| [in-form.tsx](examples/in-form.tsx) | A task form: the priority toggles are a labelled field checked on submit, and native submit and reset segments
|
|
160
|
+
| [in-form.tsx](examples/in-form.tsx) | A task form: the priority toggles are a labelled field checked on submit, an optional reminder, and native submit and reset segments in one group — `label`, `required`, `hint`, `error`, `optional`, `type`. |
|
|
161
161
|
|
|
162
162
|
## Mistakes
|
|
163
163
|
- `size` on each `ButtonGroup.Item` → set `size` once on `Root`.
|