prime-ui-kit 0.14.0 → 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 +13 -14
- package/dist/chunks/{chunk-P6ZO37JM.js → chunk-2IKH55MI.js} +1 -1
- package/dist/chunks/{chunk-SYEX7OVT.js → chunk-THFZIHKU.js} +276 -263
- package/dist/chunks/{chunk-WXKRUVSE.js → chunk-XJAVS6FH.js} +49 -48
- package/dist/color-picker.js +2 -2
- package/dist/components/dnd/Dnd.d.ts +1 -1
- package/dist/components/login-form/LoginForm.d.ts +5 -1
- package/dist/index.css +1 -1
- package/dist/index.js +2 -2
- 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 +9 -7
- package/dist/skill/api-contract.md +2 -2
- package/dist/skill/cheatsheet.md +9 -2
- package/dist/skill/checklist.md +9 -5
- package/dist/skill/choosing.md +7 -9
- package/dist/skill/components.md +5 -12
- package/dist/skill/composition.md +281 -54
- package/dist/skill/foundations.md +1 -1
- package/dist/skill/layouts.md +70 -37
- package/dist/skill/reference/components/avatar/examples/states.tsx +4 -4
- 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/examples/examples.module.css +1 -5
- package/dist/skill/reference/components/banner/examples/page-strip.tsx +16 -22
- package/dist/skill/reference/components/breadcrumb/COMPONENT.md +4 -3
- package/dist/skill/reference/components/breadcrumb/examples/ellipsis.tsx +2 -2
- 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 +2 -1
- 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 +2 -1
- 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/chat/COMPONENT.md +3 -1
- 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} +170 -351
- package/dist/skill/reference/components/chat-list/COMPONENT.md +1 -0
- 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 +13 -7
- 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 +4 -3
- 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/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/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 +5 -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 -9
- 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 +4 -2
- 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 +2 -1
- package/dist/skill/reference/components/field-list/examples/errors.tsx +5 -2
- package/dist/skill/{patterns/record-editor.tsx → reference/components/field-list/examples/screen.tsx} +3 -43
- 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 -1
- 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 +0 -6
- 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 +3 -2
- package/dist/skill/reference/components/kanban/examples/columns.tsx +8 -5
- 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} +130 -172
- package/dist/skill/reference/components/kanban/examples/states.tsx +17 -6
- 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 +1 -1
- package/dist/skill/reference/components/media-viewer/examples/dismiss.tsx +5 -1
- package/dist/skill/reference/components/message/COMPONENT.md +4 -3
- 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 +1 -1
- package/dist/skill/reference/components/notification/examples/dismiss.tsx +2 -2
- package/dist/skill/reference/components/page-content/COMPONENT.md +1 -0
- package/dist/skill/reference/components/page-content/examples/list-detail.tsx +0 -3
- package/dist/skill/{patterns/settings-page.tsx → reference/components/page-content/examples/screen.tsx} +3 -3
- package/dist/skill/reference/components/page-content/examples/variants.tsx +4 -11
- package/dist/skill/reference/components/page-toolbar/COMPONENT.md +17 -15
- 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 +2 -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 +1 -1
- package/dist/skill/reference/components/select/examples/examples.module.css +2 -7
- 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 +1 -1
- package/dist/skill/reference/components/sparkline/examples/reference.tsx +2 -1
- package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
- 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/links.tsx +55 -14
- package/dist/skill/reference/components/tooltip/COMPONENT.md +1 -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 +2 -2
- 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 +2 -2
- 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 +0 -1
- 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 +4 -3
- package/dist/skill/reference/layout/app-shell/examples/overview.tsx +15 -30
- package/dist/skill/reference/layout/app-shell/examples/screen.tsx +262 -0
- package/dist/skill/reference/layout/app-shell/examples/template.tsx +29 -9
- 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 +2 -2
- package/package.json +1 -1
- package/src/components/avatar/examples/states.tsx +4 -4
- 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/examples/examples.module.css +1 -5
- package/src/components/banner/examples/page-strip.tsx +16 -22
- package/src/components/breadcrumb/COMPONENT.md +4 -3
- package/src/components/breadcrumb/examples/ellipsis.tsx +2 -2
- 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 +2 -1
- 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 +2 -1
- package/src/components/chart-frame/examples/fill-height.tsx +119 -0
- package/src/components/chart-frame/examples/states.tsx +3 -1
- package/src/components/chat/COMPONENT.md +3 -1
- 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-list/COMPONENT.md +1 -0
- 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 +13 -7
- 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 +4 -3
- 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/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 +5 -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 +4 -2
- 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 +2 -1
- package/src/components/field-list/examples/errors.tsx +5 -2
- package/src/components/field-list/examples/screen.module.css +18 -0
- package/src/components/field-list/examples/screen.tsx +316 -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 +0 -6
- 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 +3 -2
- package/src/components/kanban/examples/columns.tsx +8 -5
- 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/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 +1 -1
- package/src/components/media-viewer/examples/dismiss.tsx +5 -1
- package/src/components/message/COMPONENT.md +4 -3
- 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 +1 -1
- package/src/components/notification/examples/dismiss.tsx +2 -2
- package/src/components/page-content/COMPONENT.md +1 -0
- package/src/components/page-content/examples/list-detail.tsx +0 -3
- 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/variants.tsx +4 -11
- package/src/components/page-toolbar/COMPONENT.md +17 -15
- 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 +2 -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 +1 -1
- package/src/components/select/examples/examples.module.css +2 -7
- 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 +1 -1
- package/src/components/sparkline/examples/reference.tsx +2 -1
- package/src/components/tabs/COMPONENT.md +1 -1
- 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/links.tsx +55 -14
- package/src/components/tooltip/COMPONENT.md +1 -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 +2 -2
- 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 +2 -2
- 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 +0 -1
- 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 +4 -3
- package/src/layout/app-shell/examples/overview.tsx +15 -30
- 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 +29 -9
- 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/dist/skill/patterns/app-shell.tsx +0 -303
- package/dist/skill/patterns/chat.module.css +0 -8
- package/dist/skill/patterns/dashboard.tsx +0 -340
- package/dist/skill/patterns/detail-page.tsx +0 -206
- 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 -637
- package/dist/skill/patterns/schedule.module.css +0 -22
- package/dist/skill/patterns/screen-states.tsx +0 -187
- /package/dist/skill/{patterns/dashboard.module.css → reference/components/card/examples/screen.module.css} +0 -0
- /package/dist/skill/{patterns/screen-states.module.css → reference/components/crossfade/examples/screen.module.css} +0 -0
- /package/dist/skill/{patterns/form-drawer.module.css → reference/components/drawer/examples/screen.module.css} +0 -0
- /package/dist/skill/{patterns/record-editor.module.css → reference/components/field-list/examples/screen.module.css} +0 -0
- /package/dist/skill/{patterns/settings-page.module.css → reference/components/page-content/examples/screen.module.css} +0 -0
- /package/dist/skill/{patterns/app-shell.module.css → reference/layout/app-shell/examples/screen.module.css} +0 -0
|
@@ -327,7 +327,7 @@ Root attributes: `data-size`, `data-row-dividers`, `data-column-dividers`, `data
|
|
|
327
327
|
|---|---|
|
|
328
328
|
| [overview.tsx](examples/overview.tsx) | Recent orders: sortable columns, a status Badge, numeric sums and five rows per page — `columns`, `getRowKey`, `pageSize`. |
|
|
329
329
|
| [sizes.tsx](examples/sizes.tsx) | Every density: rows from 36 to 52 px, the head at the control height of the tier — `size`. |
|
|
330
|
-
| [numeric.tsx](examples/numeric.tsx) | An inventory report: number columns align to the end in tabular figures, a long name stays on one line with a title — `numeric`, `truncate`, `maxWidth`. |
|
|
330
|
+
| [numeric.tsx](examples/numeric.tsx) | An inventory report: number columns align to the end in tabular figures, a long name stays on one line with a title, formatted cells sort by their raw number and article numbers in natural order — `numeric`, `truncate`, `maxWidth`, `sortAccessor`, `sortComparator`. |
|
|
331
331
|
| [heatmap.tsx](examples/heatmap.tsx) | Deals closed per manager and month as a heatmap: each count shades its cell on the chart scale and stays readable in it — `scale`, `numeric`. |
|
|
332
332
|
| [trend.tsx](examples/trend.tsx) | Clients with revenue by month as a compact Sparkline in a cell of each row, next to the half-year total — `cell`, `width`. |
|
|
333
333
|
| [content-width.tsx](examples/content-width.tsx) | A short lookup table sized by its content with a centered column, and a `grow` column that takes the free width and wraps — `fullWidth`, `align`, `grow`. |
|
|
@@ -335,7 +335,7 @@ Root attributes: `data-size`, `data-row-dividers`, `data-column-dividers`, `data
|
|
|
335
335
|
| [toolbar.tsx](examples/toolbar.tsx) | A campaign list with search, a status filter and export above the table; the empty text when nothing matches — `toolbar`, `empty`. |
|
|
336
336
|
| [selection.tsx](examples/selection.tsx) | Team members with checkboxes: Shift+click range, press-and-drag, «select all» and bulk actions in the toolbar — `selectable`, `selected`, `onSelectedChange`, `getRowLabel`. |
|
|
337
337
|
| [nested-rows.tsx](examples/nested-rows.tsx) | Partners with their expense lines: sub-rows indented under the parent's name, a chevron toggle, together with selection and sorting — `getRowChildren`, `expanded`, `onExpandedChange`. |
|
|
338
|
-
| [detail-panel.tsx](examples/detail-panel.tsx) | Order details in a full-width row under an expanded order, aligned with the first content column — `renderExpanded`, `defaultExpanded`. |
|
|
338
|
+
| [detail-panel.tsx](examples/detail-panel.tsx) | Order details in a full-width row under an expanded order, aligned with the first content column; a cancelled order has nothing to show and gets no toggle — `renderExpanded`, `defaultExpanded`, `isRowExpandable`. |
|
|
339
339
|
| [sticky.tsx](examples/sticky.tsx) | Monthly sales by region in a 280 px window: the head and the region column stay while scrolling both ways — `stickyHeader`, `stickyFirstColumn`, `scrollHeight`. |
|
|
340
340
|
| [row-link.tsx](examples/row-link.tsx) | Invoices whose rows are links: ⌘-click or a middle click opens a new tab, a plain click routes inside the app, the totals row and the ⋯ menu never open a row — `getRowHref`, `onRowClick`, `isRowClickable`. |
|
|
341
341
|
| [row-open.tsx](examples/row-open.tsx) | Deals that open in a side panel: a click, or Enter and Space on the focused row; the panel keeps the last deal while it slides away — `onRowClick`. |
|
|
@@ -348,6 +348,7 @@ Root attributes: `data-size`, `data-row-dividers`, `data-column-dividers`, `data
|
|
|
348
348
|
| [states.tsx](examples/states.tsx) | Loading skeleton, an empty period and a load error with a retry: the head stays, only the body changes — `loading`, `loadingRows`, `empty`, `error`. |
|
|
349
349
|
| [controlled.tsx](examples/controlled.tsx) | Sort and page owned by the parent (a URL or a store): a header click goes asc → desc → none, a new sort returns to page 1 — `sort`, `onSortChange`, `page`, `onPageChange`. |
|
|
350
350
|
| [narrow.tsx](examples/narrow.tsx) | A 320 px support queue: columns scroll inside the table with the first one pinned, the toolbar and footer reflow and the pager turns compact — `stickyFirstColumn`, `size`. |
|
|
351
|
+
| [screen.tsx](examples/screen.tsx) | A list page: the title, a line of figures, search, filters and the one primary action in the app header, a DataTable of invoices with statuses, row actions, pages and a filtered empty state — `empty`, `pageSize`, `stickyFirstColumn`. |
|
|
351
352
|
|
|
352
353
|
## Mistakes
|
|
353
354
|
- No `getRowKey` with `selectable`, expansion or sorting → selection follows positions, not records.
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
/** Order details in a full-width row under an expanded order, aligned with the first content column — `renderExpanded`, `defaultExpanded`. */
|
|
2
|
-
import { DataTable, type DataTableColumn,
|
|
3
|
-
|
|
4
|
-
import styles from "./examples.module.css";
|
|
1
|
+
/** Order details in a full-width row under an expanded order, aligned with the first content column; a cancelled order has nothing to show and gets no toggle — `renderExpanded`, `defaultExpanded`, `isRowExpandable`. */
|
|
2
|
+
import { DataTable, type DataTableColumn, DescriptionList } from "prime-ui-kit";
|
|
5
3
|
|
|
6
4
|
type Order = {
|
|
7
5
|
id: string;
|
|
@@ -9,8 +7,8 @@ type Order = {
|
|
|
9
7
|
customer: string;
|
|
10
8
|
date: string;
|
|
11
9
|
total: number;
|
|
12
|
-
|
|
13
|
-
items: string;
|
|
10
|
+
/** Delivery details; a cancelled order has none. */
|
|
11
|
+
delivery: { address: string; items: string } | null;
|
|
14
12
|
};
|
|
15
13
|
|
|
16
14
|
const ORDERS: Order[] = [
|
|
@@ -20,8 +18,10 @@ const ORDERS: Order[] = [
|
|
|
20
18
|
customer: "Анна Соколова",
|
|
21
19
|
date: "07.10.26",
|
|
22
20
|
total: 12_480,
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
delivery: {
|
|
22
|
+
address: "Москва, ул. Тверская, 12, кв. 45",
|
|
23
|
+
items: "Кабель USB-C, 2 м × 2, док-станция × 1",
|
|
24
|
+
},
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
id: "o2",
|
|
@@ -29,17 +29,23 @@ const ORDERS: Order[] = [
|
|
|
29
29
|
customer: "Дмитрий Орлов",
|
|
30
30
|
date: "06.10.26",
|
|
31
31
|
total: 34_900,
|
|
32
|
-
address: "Санкт-Петербург, Невский пр., 28",
|
|
33
|
-
items: 'Монитор 27" × 1',
|
|
32
|
+
delivery: { address: "Санкт-Петербург, Невский пр., 28", items: 'Монитор 27" × 1' },
|
|
34
33
|
},
|
|
35
34
|
{
|
|
36
35
|
id: "o3",
|
|
36
|
+
number: "№ 10 479",
|
|
37
|
+
customer: "Игорь Белов",
|
|
38
|
+
date: "06.10.26",
|
|
39
|
+
total: 2_990,
|
|
40
|
+
delivery: null,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "o4",
|
|
37
44
|
number: "№ 10 477",
|
|
38
45
|
customer: "Мария Ким",
|
|
39
46
|
date: "05.10.26",
|
|
40
47
|
total: 4_350,
|
|
41
|
-
address: "Казань, ул. Баумана, 7",
|
|
42
|
-
items: "Клавиатура × 1",
|
|
48
|
+
delivery: { address: "Казань, ул. Баумана, 7", items: "Клавиатура × 1" },
|
|
43
49
|
},
|
|
44
50
|
];
|
|
45
51
|
|
|
@@ -51,7 +57,13 @@ const RUB = new Intl.NumberFormat("ru-RU", {
|
|
|
51
57
|
|
|
52
58
|
const COLUMNS: DataTableColumn<Order>[] = [
|
|
53
59
|
{ id: "number", header: "Заказ", accessor: "number", minWidth: "8rem" },
|
|
54
|
-
{
|
|
60
|
+
{
|
|
61
|
+
id: "customer",
|
|
62
|
+
header: "Покупатель",
|
|
63
|
+
accessor: "customer",
|
|
64
|
+
sortable: true,
|
|
65
|
+
cell: (row) => (row.delivery ? row.customer : `${row.customer} · отменён`),
|
|
66
|
+
},
|
|
55
67
|
{ id: "date", header: "Дата", accessor: "date", numeric: true },
|
|
56
68
|
{
|
|
57
69
|
id: "total",
|
|
@@ -70,30 +82,17 @@ export default function DataTableDetailPanelExample() {
|
|
|
70
82
|
rows={ORDERS}
|
|
71
83
|
getRowKey={(row) => row.id}
|
|
72
84
|
getRowLabel={(row) => row.number}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
</dd>
|
|
85
|
-
<dt>
|
|
86
|
-
<Typography as="span" variant="body-s" tone="muted">
|
|
87
|
-
Состав
|
|
88
|
-
</Typography>
|
|
89
|
-
</dt>
|
|
90
|
-
<dd>
|
|
91
|
-
<Typography as="span" variant="body-s">
|
|
92
|
-
{row.items}
|
|
93
|
-
</Typography>
|
|
94
|
-
</dd>
|
|
95
|
-
</dl>
|
|
96
|
-
)}
|
|
85
|
+
isRowExpandable={(row) => row.delivery !== null}
|
|
86
|
+
renderExpanded={(row) =>
|
|
87
|
+
row.delivery ? (
|
|
88
|
+
<DescriptionList.Root size="s">
|
|
89
|
+
<DescriptionList.Item label="Адрес доставки">
|
|
90
|
+
{row.delivery.address}
|
|
91
|
+
</DescriptionList.Item>
|
|
92
|
+
<DescriptionList.Item label="Состав">{row.delivery.items}</DescriptionList.Item>
|
|
93
|
+
</DescriptionList.Root>
|
|
94
|
+
) : null
|
|
95
|
+
}
|
|
97
96
|
defaultExpanded={["o1"]}
|
|
98
97
|
paging="none"
|
|
99
98
|
/>
|
|
@@ -57,18 +57,6 @@
|
|
|
57
57
|
min-width: 0;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
.details {
|
|
61
|
-
display: grid;
|
|
62
|
-
grid-template-columns: max-content minmax(0, 1fr);
|
|
63
|
-
gap: var(--prime-space-1) var(--prime-space-4);
|
|
64
|
-
margin: 0;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.details dd {
|
|
68
|
-
margin: 0;
|
|
69
|
-
min-width: 0;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
60
|
/* fill-height: a panel of a fixed height (the rest of a page, a pane) the table fills. */
|
|
73
61
|
.fillStage {
|
|
74
62
|
display: flex;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** An inventory report: number columns align to the end in tabular figures, a long name stays on one line with a title — `numeric`, `truncate`, `maxWidth`. */
|
|
1
|
+
/** An inventory report: number columns align to the end in tabular figures, a long name stays on one line with a title, formatted cells sort by their raw number and article numbers in natural order — `numeric`, `truncate`, `maxWidth`, `sortAccessor`, `sortComparator`. */
|
|
2
2
|
import { DataTable, type DataTableColumn } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
type Sku = {
|
|
@@ -22,18 +22,50 @@ const SKUS: Sku[] = [
|
|
|
22
22
|
{ sku: "MS-044", name: "Мышь оптическая", stock: 86, price: 1290, sold: 1204, margin: 0.312 },
|
|
23
23
|
{ sku: "MN-27Q", name: 'Монитор 27" QHD IPS', stock: 12, price: 32_900, sold: 41, margin: 0.118 },
|
|
24
24
|
{ sku: "HB-7P", name: "USB-хаб на 7 портов", stock: 530, price: 2190, sold: 97, margin: 0.402 },
|
|
25
|
+
{
|
|
26
|
+
sku: "HB-10P",
|
|
27
|
+
name: "USB-хаб на 10 портов",
|
|
28
|
+
stock: 210,
|
|
29
|
+
price: 3490,
|
|
30
|
+
sold: 64,
|
|
31
|
+
margin: 0.356,
|
|
32
|
+
},
|
|
25
33
|
];
|
|
26
34
|
|
|
27
35
|
const INT = new Intl.NumberFormat("ru-RU");
|
|
28
36
|
const PCT = new Intl.NumberFormat("ru-RU", { style: "percent", maximumFractionDigits: 1 });
|
|
29
37
|
|
|
38
|
+
/** Article numbers in natural order: HB-7P before HB-10P. */
|
|
39
|
+
const NATURAL = new Intl.Collator("ru-RU", { numeric: true });
|
|
40
|
+
|
|
30
41
|
const COLUMNS: DataTableColumn<Sku>[] = [
|
|
31
|
-
{
|
|
42
|
+
{
|
|
43
|
+
id: "sku",
|
|
44
|
+
header: "Артикул",
|
|
45
|
+
accessor: "sku",
|
|
46
|
+
width: "6rem",
|
|
47
|
+
sortable: true,
|
|
48
|
+
sortComparator: (a, b) => NATURAL.compare(a.sku, b.sku),
|
|
49
|
+
},
|
|
32
50
|
{ id: "name", header: "Товар", accessor: "name", truncate: true, maxWidth: "14rem" },
|
|
33
|
-
{
|
|
51
|
+
{
|
|
52
|
+
id: "stock",
|
|
53
|
+
header: "Остаток, шт",
|
|
54
|
+
numeric: true,
|
|
55
|
+
sortable: true,
|
|
56
|
+
sortAccessor: (row) => row.stock,
|
|
57
|
+
cell: (row) => INT.format(row.stock),
|
|
58
|
+
},
|
|
34
59
|
{ id: "price", header: "Цена, ₽", numeric: true, cell: (row) => INT.format(row.price) },
|
|
35
60
|
{ id: "sold", header: "Продано", numeric: true, cell: (row) => INT.format(row.sold) },
|
|
36
|
-
{
|
|
61
|
+
{
|
|
62
|
+
id: "margin",
|
|
63
|
+
header: "Маржа",
|
|
64
|
+
numeric: true,
|
|
65
|
+
sortable: true,
|
|
66
|
+
sortAccessor: (row) => row.margin,
|
|
67
|
+
cell: (row) => PCT.format(row.margin),
|
|
68
|
+
},
|
|
37
69
|
];
|
|
38
70
|
|
|
39
71
|
export default function DataTableNumericExample() {
|
|
@@ -34,6 +34,7 @@ const COLUMNS: DataTableColumn<Order>[] = [
|
|
|
34
34
|
header: "Статус",
|
|
35
35
|
accessor: "status",
|
|
36
36
|
sortable: true,
|
|
37
|
+
sortAccessor: (row) => STATUS[row.status].label,
|
|
37
38
|
cell: (row) => (
|
|
38
39
|
<Badge.Root color={STATUS[row.status].color}>{STATUS[row.status].label}</Badge.Root>
|
|
39
40
|
),
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/** Deals that open in a side panel: a click, or Enter and Space on the focused row; the panel keeps the last deal while it slides away — `onRowClick`. */
|
|
2
|
-
import { Badge, DataTable, type DataTableColumn,
|
|
2
|
+
import { Badge, DataTable, type DataTableColumn, DescriptionList, Drawer } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
|
-
import styles from "./examples.module.css";
|
|
6
|
-
|
|
7
5
|
type Stage = "new" | "talks" | "won";
|
|
8
6
|
type Deal = { id: string; title: string; client: string; owner: string; stage: Stage; sum: number };
|
|
9
7
|
|
|
@@ -47,7 +45,7 @@ const RUB = new Intl.NumberFormat("ru-RU", {
|
|
|
47
45
|
});
|
|
48
46
|
|
|
49
47
|
const COLUMNS: DataTableColumn<Deal>[] = [
|
|
50
|
-
{ id: "title", header: "Сделка", accessor: "title"
|
|
48
|
+
{ id: "title", header: "Сделка", accessor: "title" },
|
|
51
49
|
{ id: "client", header: "Клиент", accessor: "client" },
|
|
52
50
|
{
|
|
53
51
|
id: "stage",
|
|
@@ -88,38 +86,11 @@ export default function DataTableRowOpenExample() {
|
|
|
88
86
|
</Drawer.Header>
|
|
89
87
|
<Drawer.Body>
|
|
90
88
|
{deal ? (
|
|
91
|
-
<
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
</dt>
|
|
97
|
-
<dd>
|
|
98
|
-
<Typography as="span" variant="body-m">
|
|
99
|
-
{deal.client}
|
|
100
|
-
</Typography>
|
|
101
|
-
</dd>
|
|
102
|
-
<dt>
|
|
103
|
-
<Typography as="span" variant="body-m" tone="muted">
|
|
104
|
-
Ответственный
|
|
105
|
-
</Typography>
|
|
106
|
-
</dt>
|
|
107
|
-
<dd>
|
|
108
|
-
<Typography as="span" variant="body-m">
|
|
109
|
-
{deal.owner}
|
|
110
|
-
</Typography>
|
|
111
|
-
</dd>
|
|
112
|
-
<dt>
|
|
113
|
-
<Typography as="span" variant="body-m" tone="muted">
|
|
114
|
-
Сумма
|
|
115
|
-
</Typography>
|
|
116
|
-
</dt>
|
|
117
|
-
<dd>
|
|
118
|
-
<Typography as="span" variant="body-m">
|
|
119
|
-
{RUB.format(deal.sum)}
|
|
120
|
-
</Typography>
|
|
121
|
-
</dd>
|
|
122
|
-
</dl>
|
|
89
|
+
<DescriptionList.Root>
|
|
90
|
+
<DescriptionList.Item label="Клиент">{deal.client}</DescriptionList.Item>
|
|
91
|
+
<DescriptionList.Item label="Ответственный">{deal.owner}</DescriptionList.Item>
|
|
92
|
+
<DescriptionList.Item label="Сумма">{RUB.format(deal.sum)}</DescriptionList.Item>
|
|
93
|
+
</DescriptionList.Root>
|
|
123
94
|
) : null}
|
|
124
95
|
</Drawer.Body>
|
|
125
96
|
</Drawer.Content>
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
/* List page:
|
|
2
|
-
|
|
3
|
-
/* The filter takes the whole toolbar row, so its search stretches. */
|
|
4
|
-
.filter {
|
|
5
|
-
width: 100%;
|
|
6
|
-
min-width: 0;
|
|
7
|
-
}
|
|
1
|
+
/* List page: the header carries the title and the tools; this module lays out table cells only. */
|
|
8
2
|
|
|
9
3
|
/* Client cell: avatar, then the name over the tax id. On a phone the table scrolls sideways. */
|
|
10
4
|
.client {
|
package/dist/skill/{patterns/list-page.tsx → reference/components/data-table/examples/screen.tsx}
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
/** A list page:
|
|
1
|
+
/** A list page: the title, a line of figures, search, filters and the one primary action in the app header, a DataTable of invoices with statuses, row actions, pages and a filtered empty state — `empty`, `pageSize`, `stickyFirstColumn`. */
|
|
2
2
|
import {
|
|
3
|
+
AppHeader,
|
|
3
4
|
Avatar,
|
|
4
5
|
Badge,
|
|
5
6
|
Button,
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
Icon,
|
|
11
12
|
matchesSmartFilter,
|
|
12
13
|
PageContent,
|
|
14
|
+
PageToolbar,
|
|
13
15
|
type PaletteColor,
|
|
14
16
|
SmartFilter,
|
|
15
17
|
type SmartFilterField,
|
|
@@ -18,7 +20,7 @@ import {
|
|
|
18
20
|
} from "prime-ui-kit";
|
|
19
21
|
import * as React from "react";
|
|
20
22
|
|
|
21
|
-
import styles from "./
|
|
23
|
+
import styles from "./screen.module.css";
|
|
22
24
|
|
|
23
25
|
type Status = "draft" | "sent" | "paid" | "overdue";
|
|
24
26
|
|
|
@@ -140,6 +142,13 @@ const MONEY = new Intl.NumberFormat("ru-RU", {
|
|
|
140
142
|
});
|
|
141
143
|
const DAY = new Intl.DateTimeFormat("ru-RU", { day: "numeric", month: "short" });
|
|
142
144
|
|
|
145
|
+
const OVERDUE = INVOICES.filter((row) => row.status === "overdue");
|
|
146
|
+
|
|
147
|
+
/** The header's line of context carries data: how many invoices and what is overdue. */
|
|
148
|
+
const SUMMARY = `${INVOICES.length} счетов · просрочено ${OVERDUE.length} на ${MONEY.format(
|
|
149
|
+
OVERDUE.reduce((sum, row) => sum + row.amount, 0),
|
|
150
|
+
)}`;
|
|
151
|
+
|
|
143
152
|
const asOptions = (values: string[]) => values.map((value) => ({ value, label: value }));
|
|
144
153
|
|
|
145
154
|
const FIELDS: SmartFilterField[] = [
|
|
@@ -250,7 +259,7 @@ const COLUMNS: DataTableColumn<Invoice>[] = [
|
|
|
250
259
|
},
|
|
251
260
|
];
|
|
252
261
|
|
|
253
|
-
export default function
|
|
262
|
+
export default function DataTableScreenExample() {
|
|
254
263
|
const [filter, setFilter] = React.useState<SmartFilterValue>({});
|
|
255
264
|
const [search, setSearch] = React.useState("");
|
|
256
265
|
|
|
@@ -268,67 +277,78 @@ export default function ListPagePattern() {
|
|
|
268
277
|
};
|
|
269
278
|
|
|
270
279
|
return (
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
pageSize={6}
|
|
299
|
-
stickyFirstColumn
|
|
300
|
-
defaultSort={{ columnId: "due", order: "desc" }}
|
|
301
|
-
toolbar={
|
|
302
|
-
<SmartFilter.Root
|
|
303
|
-
fields={FIELDS}
|
|
304
|
-
value={filter}
|
|
305
|
-
onValueChange={setFilter}
|
|
306
|
-
search={search}
|
|
307
|
-
onSearchChange={setSearch}
|
|
308
|
-
className={styles.filter}
|
|
309
|
-
>
|
|
310
|
-
<SmartFilter.Toolbar />
|
|
311
|
-
<SmartFilter.Chips />
|
|
312
|
-
</SmartFilter.Root>
|
|
313
|
-
}
|
|
314
|
-
empty={
|
|
315
|
-
<EmptyPage.Root size="s" role="status" aria-labelledby="invoices-empty">
|
|
316
|
-
<EmptyPage.Icon>
|
|
317
|
-
<Icon name="action.search" />
|
|
318
|
-
</EmptyPage.Icon>
|
|
319
|
-
<EmptyPage.Title as="p" id="invoices-empty">
|
|
320
|
-
Счетов не найдено
|
|
321
|
-
</EmptyPage.Title>
|
|
322
|
-
<EmptyPage.Description>Измените запрос или сбросьте фильтры.</EmptyPage.Description>
|
|
323
|
-
<EmptyPage.Actions>
|
|
324
|
-
<Button.Root variant="soft" tone="neutral" onClick={resetFilters}>
|
|
325
|
-
Сбросить фильтры
|
|
280
|
+
<>
|
|
281
|
+
{/* The page lives in the app header: the only h1, a line of figures under it, and the page's
|
|
282
|
+
tools — search, filters, export, the one primary action; main has no PageContent.Header. */}
|
|
283
|
+
<AppHeader.Root>
|
|
284
|
+
<AppHeader.Start>
|
|
285
|
+
<AppHeader.Title>
|
|
286
|
+
Счета
|
|
287
|
+
<AppHeader.Description>{SUMMARY}</AppHeader.Description>
|
|
288
|
+
</AppHeader.Title>
|
|
289
|
+
</AppHeader.Start>
|
|
290
|
+
<AppHeader.Tools>
|
|
291
|
+
<SmartFilter.Root
|
|
292
|
+
fields={FIELDS}
|
|
293
|
+
value={filter}
|
|
294
|
+
onValueChange={setFilter}
|
|
295
|
+
search={search}
|
|
296
|
+
onSearchChange={setSearch}
|
|
297
|
+
>
|
|
298
|
+
<PageToolbar.Root aria-label="Счета">
|
|
299
|
+
<PageToolbar.Tools>
|
|
300
|
+
<SmartFilter.Toolbar />
|
|
301
|
+
</PageToolbar.Tools>
|
|
302
|
+
<PageToolbar.Actions>
|
|
303
|
+
<Button.Root variant="soft" tone="neutral" aria-label="Экспорт в Excel">
|
|
304
|
+
<Button.Icon>
|
|
305
|
+
<Icon name="action.download" />
|
|
306
|
+
</Button.Icon>
|
|
326
307
|
</Button.Root>
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
308
|
+
<Button.Root>
|
|
309
|
+
<Button.Icon>
|
|
310
|
+
<Icon name="action.add" />
|
|
311
|
+
</Button.Icon>
|
|
312
|
+
Новый счёт
|
|
313
|
+
</Button.Root>
|
|
314
|
+
</PageToolbar.Actions>
|
|
315
|
+
<PageToolbar.Chips>
|
|
316
|
+
<SmartFilter.Chips />
|
|
317
|
+
</PageToolbar.Chips>
|
|
318
|
+
</PageToolbar.Root>
|
|
319
|
+
</SmartFilter.Root>
|
|
320
|
+
</AppHeader.Tools>
|
|
321
|
+
</AppHeader.Root>
|
|
322
|
+
|
|
323
|
+
<PageContent.Root>
|
|
324
|
+
<PageContent.Body>
|
|
325
|
+
<DataTable
|
|
326
|
+
columns={COLUMNS}
|
|
327
|
+
rows={rows}
|
|
328
|
+
getRowKey={(row) => row.id}
|
|
329
|
+
getRowLabel={(row) => `Счёт ${row.id}`}
|
|
330
|
+
pageSize={6}
|
|
331
|
+
stickyFirstColumn
|
|
332
|
+
defaultSort={{ columnId: "due", order: "desc" }}
|
|
333
|
+
empty={
|
|
334
|
+
<EmptyPage.Root size="s" role="status" aria-labelledby="invoices-empty">
|
|
335
|
+
<EmptyPage.Icon>
|
|
336
|
+
<Icon name="action.search" />
|
|
337
|
+
</EmptyPage.Icon>
|
|
338
|
+
<EmptyPage.Title as="p" id="invoices-empty">
|
|
339
|
+
Счетов не найдено
|
|
340
|
+
</EmptyPage.Title>
|
|
341
|
+
<EmptyPage.Description>Измените запрос или сбросьте фильтры.</EmptyPage.Description>
|
|
342
|
+
<EmptyPage.Actions>
|
|
343
|
+
<Button.Root variant="soft" tone="neutral" onClick={resetFilters}>
|
|
344
|
+
Сбросить фильтры
|
|
345
|
+
</Button.Root>
|
|
346
|
+
</EmptyPage.Actions>
|
|
347
|
+
</EmptyPage.Root>
|
|
348
|
+
}
|
|
349
|
+
/>
|
|
350
|
+
</PageContent.Body>
|
|
351
|
+
</PageContent.Root>
|
|
352
|
+
</>
|
|
333
353
|
);
|
|
334
354
|
}
|
|
@@ -139,7 +139,7 @@ Shared by `Datepicker.Root` and `Datepicker.Panel`.
|
|
|
139
139
|
| State | Driven by | DOM |
|
|
140
140
|
|---|---|---|
|
|
141
141
|
| empty | no value | `data-empty="true"`, `labels.placeholder` (or `placeholder`) in placeholder color |
|
|
142
|
-
| open | click, `open` | `data-state="open"`, `field-bg-
|
|
142
|
+
| open | click, `open` | `data-state="open"`, `field-bg-hover` fill, the chevron turns |
|
|
143
143
|
| focus-visible | keyboard | inset focus ring; none with `focusRing={false}` (`data-focus-ring="false"`) |
|
|
144
144
|
| invalid | `invalid`, `error` | `data-invalid`, `aria-invalid`, inset `danger-border` ring; the control shakes once when an error arrives (`data-shake` on the frame) |
|
|
145
145
|
| disabled | `disabled` | native `disabled`, `data-disabled`, `field-bg-disabled`, cannot open |
|
|
@@ -147,7 +147,7 @@ Shared by `Datepicker.Root` and `Datepicker.Panel`.
|
|
|
147
147
|
| selected / band | value | day `aria-pressed`, `data-edge`; cell `data-band="selected" \| "preview"`, `data-band-start` / `-end` |
|
|
148
148
|
| day disabled | `isDayDisabled`, `disableFuture` | native `disabled`, muted |
|
|
149
149
|
|
|
150
|
-
Panel DOM: `data-size`, `data-embedded`, `data-compact`, `data-layout` (`aside` · `stacked`). The popover follows the overlay contract: an outside press or Escape closes it, focus is trapped while open, the wheel over the panel does not scroll the page. The panel of `Datepicker.Root` mounts only while the popover is open, so every opening starts from the current value; nothing is rendered for it while closed.
|
|
150
|
+
Panel DOM: `data-size`, `data-embedded`, `data-compact`, `data-layout` (`aside` · `stacked`). The footer row carries `data-time` with `withTime`; a footer field never shrinks below its whole date and time — the fields wrap above the actions, and in a footer narrower than 22rem with time they stand one under the other. The popover follows the overlay contract: an outside press or Escape closes it, focus is trapped while open, the wheel over the panel does not scroll the page. The panel of `Datepicker.Root` mounts only while the popover is open, so every opening starts from the current value; nothing is rendered for it while closed.
|
|
151
151
|
|
|
152
152
|
Committing: without `footer` a picked day (or the second day of a range) applies at once and closes the popover; with `footer` the pick stays a draft until «Применить», and «Сбросить» sets `resetValue` (else empty) and closes. A preset applies its period at once, with or without `footer`. With `name`, hidden inputs submit `yyyy-MM-dd` (`yyyy-MM-ddTHH:mm` with `withTime`); a range submits `from`, then `to`.
|
|
153
153
|
|
|
@@ -205,11 +205,12 @@ Committing: without `footer` a picked day (or the second day of a range) applies
|
|
|
205
205
|
|---|---|
|
|
206
206
|
| [overview.tsx](examples/overview.tsx) | A shipping date field: a click opens one month, a picked day applies at once — `mode`, `label`. |
|
|
207
207
|
| [sizes.tsx](examples/sizes.tsx) | Every size tier: the field is 28 to 48 px high, the day cell of the panel 24 to 40 px — `size`. |
|
|
208
|
-
| [states.tsx](examples/states.tsx) | An empty field with the default placeholder, a filled
|
|
208
|
+
| [states.tsx](examples/states.tsx) | An empty field with the default placeholder, a filled, a disabled and an invalid one, and one whose focus shows without the ring — `disabled`, `invalid`, `focusRing`. |
|
|
209
209
|
| [validation.tsx](examples/validation.tsx) | A leave period checked live: the error shakes in, names the broken rule and leaves once the period fits; an optional return date — `required`, `hint`, `error`, `optional`. |
|
|
210
|
-
| [range-presets.tsx](examples/range-presets.tsx) | A report period: presets aside, two months, a step prompt, time fields with Reset / Apply, no future days — `presets`, `months`, `prompt`, `footer`, `withTime`, `disableFuture`. |
|
|
210
|
+
| [range-presets.tsx](examples/range-presets.tsx) | A report period: presets aside, two months, a step prompt, time fields with Reset / Apply, no future days; Reset returns the current month and the panel lines up with the field's end — `presets`, `months`, `prompt`, `footer`, `withTime`, `disableFuture`, `resetValue`, `align`. |
|
|
211
211
|
| [inline-panel.tsx](examples/inline-panel.tsx) | A booking calendar embedded in a card: the card is its container, two months when the parent has room, the range applies at once — `Datepicker.Panel`, `months`, `prompt`. |
|
|
212
212
|
| [yearless.tsx](examples/yearless.tsx) | An annual price change date: day and month without a year, a value prefix and taken days disabled — `yearless`, `valuePrefix`, `isDayDisabled`. |
|
|
213
|
+
| [locale.tsx](examples/locale.tsx) | A delivery window on a partner portal in English: month and weekday names from the date-fns locale, the week from Sunday and the system texts translated — `locale`, `weekStartsOn`, `labels`. |
|
|
213
214
|
| [controlled.tsx](examples/controlled.tsx) | A report filter owns the period: quick buttons set it from outside, the field shows it — `value`, `onValueChange`. |
|
|
214
215
|
| [controlled-open.tsx](examples/controlled-open.tsx) | The parent owns the panel: a reminder button opens the calendar from code, a picked day closes it — `open`, `onOpenChange`. |
|
|
215
216
|
| [in-form.tsx](examples/in-form.tsx) | A leave request form: submit reads the period from the form data and checks it, the error shakes in and leaves once the period is fixed; an optional return date — `name`, `required`, `error`, `optional`. |
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
/* Layout of the Datepicker scenarios: semantic tokens only. */
|
|
2
2
|
|
|
3
|
-
/*
|
|
4
|
-
.formCard {
|
|
5
|
-
width: min(100%, calc(var(--prime-space-24) * 5));
|
|
6
|
-
}
|
|
7
|
-
|
|
3
|
+
/* in-form.tsx: field → field 20. */
|
|
8
4
|
.form {
|
|
9
5
|
display: flex;
|
|
10
6
|
flex-direction: column;
|
|
11
7
|
gap: var(--prime-space-5);
|
|
12
|
-
|
|
8
|
+
width: min(100%, calc(var(--prime-space-24) * 5));
|
|
13
9
|
}
|
|
14
10
|
|
|
15
11
|
.actions {
|