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
|
@@ -0,0 +1,354 @@
|
|
|
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
|
+
import {
|
|
3
|
+
AppHeader,
|
|
4
|
+
Avatar,
|
|
5
|
+
Badge,
|
|
6
|
+
Button,
|
|
7
|
+
DataTable,
|
|
8
|
+
type DataTableColumn,
|
|
9
|
+
Dropdown,
|
|
10
|
+
EmptyPage,
|
|
11
|
+
Icon,
|
|
12
|
+
matchesSmartFilter,
|
|
13
|
+
PageContent,
|
|
14
|
+
PageToolbar,
|
|
15
|
+
type PaletteColor,
|
|
16
|
+
SmartFilter,
|
|
17
|
+
type SmartFilterField,
|
|
18
|
+
type SmartFilterValue,
|
|
19
|
+
Typography,
|
|
20
|
+
} from "prime-ui-kit";
|
|
21
|
+
import * as React from "react";
|
|
22
|
+
|
|
23
|
+
import styles from "./screen.module.css";
|
|
24
|
+
|
|
25
|
+
type Status = "draft" | "sent" | "paid" | "overdue";
|
|
26
|
+
|
|
27
|
+
type Invoice = {
|
|
28
|
+
id: string;
|
|
29
|
+
client: string;
|
|
30
|
+
inn: string;
|
|
31
|
+
manager: string;
|
|
32
|
+
due: string;
|
|
33
|
+
amount: number;
|
|
34
|
+
status: Status;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** One hue per status across the product: the text carries the meaning, the color repeats it. */
|
|
38
|
+
const STATUS: Record<Status, { label: string; color: PaletteColor }> = {
|
|
39
|
+
draft: { label: "Черновик", color: "gray" },
|
|
40
|
+
sent: { label: "Отправлен", color: "blue" },
|
|
41
|
+
paid: { label: "Оплачен", color: "green" },
|
|
42
|
+
overdue: { label: "Просрочен", color: "red" },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const INVOICES: Invoice[] = [
|
|
46
|
+
{
|
|
47
|
+
id: "2026-0418",
|
|
48
|
+
client: "ООО «Северный ветер»",
|
|
49
|
+
inn: "7704 512 908",
|
|
50
|
+
manager: "Анна Климова",
|
|
51
|
+
due: "2026-10-14",
|
|
52
|
+
amount: 486_000,
|
|
53
|
+
status: "sent",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "2026-0417",
|
|
57
|
+
client: "АО «Техностиль»",
|
|
58
|
+
inn: "7816 330 147",
|
|
59
|
+
manager: "Илья Петров",
|
|
60
|
+
due: "2026-10-02",
|
|
61
|
+
amount: 1_240_500,
|
|
62
|
+
status: "overdue",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "2026-0416",
|
|
66
|
+
client: "ИП Соколова М. А.",
|
|
67
|
+
inn: "5024 118 773",
|
|
68
|
+
manager: "Анна Климова",
|
|
69
|
+
due: "2026-10-20",
|
|
70
|
+
amount: 58_900,
|
|
71
|
+
status: "draft",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "2026-0415",
|
|
75
|
+
client: "ООО «Логистик Плюс»",
|
|
76
|
+
inn: "6658 402 215",
|
|
77
|
+
manager: "Марат Хасанов",
|
|
78
|
+
due: "2026-09-30",
|
|
79
|
+
amount: 312_000,
|
|
80
|
+
status: "paid",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "2026-0414",
|
|
84
|
+
client: "ООО «Гранит»",
|
|
85
|
+
inn: "5407 221 690",
|
|
86
|
+
manager: "Илья Петров",
|
|
87
|
+
due: "2026-09-28",
|
|
88
|
+
amount: 94_750,
|
|
89
|
+
status: "paid",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: "2026-0413",
|
|
93
|
+
client: "ЗАО «Альфа Медиа»",
|
|
94
|
+
inn: "7702 845 336",
|
|
95
|
+
manager: "Марат Хасанов",
|
|
96
|
+
due: "2026-09-25",
|
|
97
|
+
amount: 760_000,
|
|
98
|
+
status: "overdue",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "2026-0412",
|
|
102
|
+
client: "ООО «Зелёный квартал»",
|
|
103
|
+
inn: "2310 194 552",
|
|
104
|
+
manager: "Анна Климова",
|
|
105
|
+
due: "2026-10-18",
|
|
106
|
+
amount: 205_300,
|
|
107
|
+
status: "sent",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "2026-0411",
|
|
111
|
+
client: "ООО «Мостострой»",
|
|
112
|
+
inn: "7728 609 481",
|
|
113
|
+
manager: "Илья Петров",
|
|
114
|
+
due: "2026-09-21",
|
|
115
|
+
amount: 2_480_000,
|
|
116
|
+
status: "paid",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "2026-0410",
|
|
120
|
+
client: "ООО «Пекарня №1»",
|
|
121
|
+
inn: "7811 077 264",
|
|
122
|
+
manager: "Марат Хасанов",
|
|
123
|
+
due: "2026-10-25",
|
|
124
|
+
amount: 37_200,
|
|
125
|
+
status: "draft",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: "2026-0409",
|
|
129
|
+
client: "АО «Волга-Энерго»",
|
|
130
|
+
inn: "6316 255 018",
|
|
131
|
+
manager: "Анна Климова",
|
|
132
|
+
due: "2026-09-18",
|
|
133
|
+
amount: 1_095_000,
|
|
134
|
+
status: "paid",
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
const MONEY = new Intl.NumberFormat("ru-RU", {
|
|
139
|
+
style: "currency",
|
|
140
|
+
currency: "RUB",
|
|
141
|
+
maximumFractionDigits: 0,
|
|
142
|
+
});
|
|
143
|
+
const DAY = new Intl.DateTimeFormat("ru-RU", { day: "numeric", month: "short" });
|
|
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
|
+
|
|
152
|
+
const asOptions = (values: string[]) => values.map((value) => ({ value, label: value }));
|
|
153
|
+
|
|
154
|
+
const FIELDS: SmartFilterField[] = [
|
|
155
|
+
{
|
|
156
|
+
key: "status",
|
|
157
|
+
label: "Статус",
|
|
158
|
+
options: (Object.keys(STATUS) as Status[]).map((value) => ({
|
|
159
|
+
value,
|
|
160
|
+
label: STATUS[value].label,
|
|
161
|
+
})),
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
key: "manager",
|
|
165
|
+
label: "Менеджер",
|
|
166
|
+
finite: false,
|
|
167
|
+
options: asOptions(["Анна Климова", "Илья Петров", "Марат Хасанов"]),
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
|
|
171
|
+
const initials = (name: string) =>
|
|
172
|
+
name
|
|
173
|
+
.replace(/^(ООО|АО|ЗАО|ИП)\s+/, "")
|
|
174
|
+
.replace(/[^\p{L}\s]/gu, "")
|
|
175
|
+
.split(/\s+/)
|
|
176
|
+
.filter(Boolean)
|
|
177
|
+
.slice(0, 2)
|
|
178
|
+
.map((word) => word[0])
|
|
179
|
+
.join("")
|
|
180
|
+
.toUpperCase();
|
|
181
|
+
|
|
182
|
+
const COLUMNS: DataTableColumn<Invoice>[] = [
|
|
183
|
+
{ id: "id", header: "Счёт", accessor: "id", sortable: true, numeric: true, align: "start" },
|
|
184
|
+
{
|
|
185
|
+
id: "client",
|
|
186
|
+
header: "Клиент",
|
|
187
|
+
accessor: "client",
|
|
188
|
+
sortable: true,
|
|
189
|
+
cell: (row) => (
|
|
190
|
+
<span className={styles.client}>
|
|
191
|
+
<Avatar.Root size="s" color="gray">
|
|
192
|
+
<Avatar.Fallback>{initials(row.client)}</Avatar.Fallback>
|
|
193
|
+
</Avatar.Root>
|
|
194
|
+
<span className={styles.clientText}>
|
|
195
|
+
<Typography as="span" variant="body-m">
|
|
196
|
+
{row.client}
|
|
197
|
+
</Typography>
|
|
198
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
199
|
+
ИНН {row.inn}
|
|
200
|
+
</Typography>
|
|
201
|
+
</span>
|
|
202
|
+
</span>
|
|
203
|
+
),
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "status",
|
|
207
|
+
header: "Статус",
|
|
208
|
+
accessor: "status",
|
|
209
|
+
cell: (row) => (
|
|
210
|
+
<Badge.Root color={STATUS[row.status].color}>{STATUS[row.status].label}</Badge.Root>
|
|
211
|
+
),
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: "due",
|
|
215
|
+
header: "Оплатить до",
|
|
216
|
+
accessor: "due",
|
|
217
|
+
sortable: true,
|
|
218
|
+
numeric: true,
|
|
219
|
+
headerAlign: "end",
|
|
220
|
+
cell: (row) => DAY.format(new Date(row.due)),
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: "amount",
|
|
224
|
+
header: "Сумма",
|
|
225
|
+
accessor: "amount",
|
|
226
|
+
sortable: true,
|
|
227
|
+
numeric: true,
|
|
228
|
+
headerAlign: "end",
|
|
229
|
+
cell: (row) => MONEY.format(row.amount),
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: "actions",
|
|
233
|
+
header: "",
|
|
234
|
+
width: "3.5rem",
|
|
235
|
+
align: "end",
|
|
236
|
+
cell: (row) => (
|
|
237
|
+
<Dropdown.Root>
|
|
238
|
+
<Dropdown.Trigger>
|
|
239
|
+
<Button.Root
|
|
240
|
+
size="s"
|
|
241
|
+
variant="ghost"
|
|
242
|
+
tone="neutral"
|
|
243
|
+
aria-label={`Действия со счётом ${row.id}`}
|
|
244
|
+
>
|
|
245
|
+
<Button.Icon>
|
|
246
|
+
<Icon name="action.more" />
|
|
247
|
+
</Button.Icon>
|
|
248
|
+
</Button.Root>
|
|
249
|
+
</Dropdown.Trigger>
|
|
250
|
+
<Dropdown.Content>
|
|
251
|
+
<Dropdown.Item>Открыть</Dropdown.Item>
|
|
252
|
+
<Dropdown.Item>Скачать PDF</Dropdown.Item>
|
|
253
|
+
<Dropdown.Item>Отправить повторно</Dropdown.Item>
|
|
254
|
+
<Dropdown.Separator />
|
|
255
|
+
<Dropdown.Item tone="danger">Удалить</Dropdown.Item>
|
|
256
|
+
</Dropdown.Content>
|
|
257
|
+
</Dropdown.Root>
|
|
258
|
+
),
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
export default function DataTableScreenExample() {
|
|
263
|
+
const [filter, setFilter] = React.useState<SmartFilterValue>({});
|
|
264
|
+
const [search, setSearch] = React.useState("");
|
|
265
|
+
|
|
266
|
+
const query = search.trim().toLowerCase();
|
|
267
|
+
const rows = INVOICES.filter(
|
|
268
|
+
(row) =>
|
|
269
|
+
matchesSmartFilter(filter.status, row.status) &&
|
|
270
|
+
matchesSmartFilter(filter.manager, row.manager) &&
|
|
271
|
+
(row.id.includes(query) || row.client.toLowerCase().includes(query)),
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
const resetFilters = () => {
|
|
275
|
+
setFilter({});
|
|
276
|
+
setSearch("");
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
return (
|
|
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>
|
|
307
|
+
</Button.Root>
|
|
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
|
+
</>
|
|
353
|
+
);
|
|
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 {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** 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`. */
|
|
2
|
-
import { Button,
|
|
2
|
+
import { Button, Datepicker, type DatepickerRange, Typography } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
import styles from "./examples.module.css";
|
|
@@ -12,63 +12,55 @@ export default function DatepickerInFormExample() {
|
|
|
12
12
|
const [sent, setSent] = React.useState(false);
|
|
13
13
|
|
|
14
14
|
return (
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
<form
|
|
16
|
+
className={styles.form}
|
|
17
|
+
onSubmit={(event) => {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
// The range submits `from`, then `to` under its name ("2026-07-06").
|
|
20
|
+
const [from, to] = new FormData(event.currentTarget).getAll("vacation");
|
|
21
|
+
const complete = Boolean(from && to);
|
|
22
|
+
setError(complete ? undefined : "Укажите начало и конец отпуска");
|
|
23
|
+
setSent(complete);
|
|
24
|
+
}}
|
|
25
|
+
>
|
|
26
|
+
<Datepicker.Root
|
|
27
|
+
mode="range"
|
|
28
|
+
name="vacation"
|
|
29
|
+
label="Период отпуска"
|
|
30
|
+
required
|
|
31
|
+
hint="Не больше 28 дней подряд"
|
|
32
|
+
error={error}
|
|
33
|
+
value={period}
|
|
34
|
+
onValueChange={(next) => {
|
|
35
|
+
setPeriod(next);
|
|
36
|
+
setError(undefined);
|
|
37
|
+
setSent(false);
|
|
25
38
|
}}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
months={2}
|
|
40
|
+
footer
|
|
41
|
+
placeholder="Выбрать период"
|
|
42
|
+
fullWidth
|
|
43
|
+
/>
|
|
44
|
+
<Datepicker.Root mode="single" name="returnDate" label="Выход на работу" optional fullWidth />
|
|
45
|
+
{sent ? (
|
|
46
|
+
<Typography as="p" variant="body-s" tone="secondary" role="status">
|
|
47
|
+
Заявка отправлена на согласование.
|
|
48
|
+
</Typography>
|
|
49
|
+
) : null}
|
|
50
|
+
<div className={styles.actions}>
|
|
51
|
+
<Button.Root
|
|
52
|
+
variant="ghost"
|
|
53
|
+
tone="neutral"
|
|
54
|
+
onClick={() => {
|
|
55
|
+
setPeriod(EMPTY_PERIOD);
|
|
37
56
|
setError(undefined);
|
|
38
57
|
setSent(false);
|
|
39
58
|
}}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
mode="single"
|
|
47
|
-
name="returnDate"
|
|
48
|
-
label="Выход на работу"
|
|
49
|
-
optional
|
|
50
|
-
fullWidth
|
|
51
|
-
/>
|
|
52
|
-
{sent ? (
|
|
53
|
-
<Typography as="p" variant="body-s" tone="secondary" role="status">
|
|
54
|
-
Заявка отправлена на согласование.
|
|
55
|
-
</Typography>
|
|
56
|
-
) : null}
|
|
57
|
-
<div className={styles.actions}>
|
|
58
|
-
<Button.Root
|
|
59
|
-
variant="ghost"
|
|
60
|
-
tone="neutral"
|
|
61
|
-
onClick={() => {
|
|
62
|
-
setPeriod(EMPTY_PERIOD);
|
|
63
|
-
setError(undefined);
|
|
64
|
-
setSent(false);
|
|
65
|
-
}}
|
|
66
|
-
>
|
|
67
|
-
Отмена
|
|
68
|
-
</Button.Root>
|
|
69
|
-
<Button.Root type="submit">Отправить заявку</Button.Root>
|
|
70
|
-
</div>
|
|
71
|
-
</form>
|
|
72
|
-
</Card.Root>
|
|
59
|
+
>
|
|
60
|
+
Отмена
|
|
61
|
+
</Button.Root>
|
|
62
|
+
<Button.Root type="submit">Отправить заявку</Button.Root>
|
|
63
|
+
</div>
|
|
64
|
+
</form>
|
|
73
65
|
);
|
|
74
66
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** 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`. */
|
|
2
|
+
import { enUS } from "date-fns/locale";
|
|
3
|
+
import { Datepicker, type DatepickerLabels, type DatepickerRange } from "prime-ui-kit";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
|
|
6
|
+
const LABELS: Partial<DatepickerLabels> = {
|
|
7
|
+
placeholder: "Pick dates",
|
|
8
|
+
pickStart: "Pick the first day",
|
|
9
|
+
pickEnd: "Pick the last day",
|
|
10
|
+
reset: "Reset",
|
|
11
|
+
apply: "Apply",
|
|
12
|
+
prevMonth: "Previous month",
|
|
13
|
+
nextMonth: "Next month",
|
|
14
|
+
rangeStart: "From",
|
|
15
|
+
rangeEnd: "To",
|
|
16
|
+
until: "until",
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default function DatepickerLocaleExample() {
|
|
20
|
+
const [delivery, setDelivery] = React.useState<DatepickerRange>({ from: null, to: null });
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<Datepicker.Root
|
|
24
|
+
mode="range"
|
|
25
|
+
label="Delivery window"
|
|
26
|
+
value={delivery}
|
|
27
|
+
onValueChange={setDelivery}
|
|
28
|
+
locale={enUS}
|
|
29
|
+
weekStartsOn={0}
|
|
30
|
+
labels={LABELS}
|
|
31
|
+
prompt
|
|
32
|
+
footer
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -1,21 +1,30 @@
|
|
|
1
|
-
/** A report period: presets aside, two months, a step prompt, time fields with Reset / Apply, no future days — `presets`, `months`, `prompt`, `footer`, `withTime`, `disableFuture`. */
|
|
1
|
+
/** 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`. */
|
|
2
2
|
import { Datepicker, type DatepickerRange, DEFAULT_DATEPICKER_PRESETS } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
|
+
const NOW = new Date();
|
|
6
|
+
/** The current month up to the end of today: the report's default period. */
|
|
7
|
+
const THIS_MONTH: DatepickerRange = {
|
|
8
|
+
from: new Date(NOW.getFullYear(), NOW.getMonth(), 1),
|
|
9
|
+
to: new Date(NOW.getFullYear(), NOW.getMonth(), NOW.getDate(), 23, 59, 59, 999),
|
|
10
|
+
};
|
|
11
|
+
|
|
5
12
|
export default function DatepickerRangePresetsExample() {
|
|
6
|
-
const [period, setPeriod] = React.useState<DatepickerRange>(
|
|
13
|
+
const [period, setPeriod] = React.useState<DatepickerRange>(THIS_MONTH);
|
|
7
14
|
return (
|
|
8
15
|
<Datepicker.Root
|
|
9
16
|
mode="range"
|
|
10
17
|
label="Период отчёта"
|
|
11
18
|
value={period}
|
|
12
19
|
onValueChange={setPeriod}
|
|
20
|
+
resetValue={THIS_MONTH}
|
|
13
21
|
months={2}
|
|
14
22
|
presets={DEFAULT_DATEPICKER_PRESETS}
|
|
15
23
|
prompt
|
|
16
24
|
footer
|
|
17
25
|
withTime
|
|
18
26
|
disableFuture
|
|
27
|
+
align="end"
|
|
19
28
|
placeholder="Выбрать период"
|
|
20
29
|
/>
|
|
21
30
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** An empty field with the default placeholder, a filled
|
|
1
|
+
/** 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`. */
|
|
2
2
|
import { Datepicker } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
const CONTRACT_DATE = new Date(2026, 8, 15);
|
|
@@ -15,6 +15,14 @@ export default function DatepickerStatesExample() {
|
|
|
15
15
|
disabled
|
|
16
16
|
fullWidth
|
|
17
17
|
/>
|
|
18
|
+
<Datepicker.Root mode="single" label="invalid" invalid fullWidth />
|
|
19
|
+
<Datepicker.Root
|
|
20
|
+
mode="single"
|
|
21
|
+
label="focusRing={false}"
|
|
22
|
+
defaultValue={CONTRACT_DATE}
|
|
23
|
+
focusRing={false}
|
|
24
|
+
fullWidth
|
|
25
|
+
/>
|
|
18
26
|
</>
|
|
19
27
|
);
|
|
20
28
|
}
|
|
@@ -120,6 +120,7 @@ No motion: the list is static text; a row action has the Button's own press and
|
|
|
120
120
|
| [structure.tsx](examples/structure.tsx) | Optional pieces of a pair: a Badge or a link as the value, a row action and an empty value with its own mark — `DescriptionList.ItemAction`, `labels`. |
|
|
121
121
|
| [vertical.tsx](examples/vertical.tsx) | Labels above their values at any width, for a side panel of a record — `orientation`. |
|
|
122
122
|
| [narrow.tsx](examples/narrow.tsx) | In a 320 px card the list is narrower than 24rem: each label moves above its value and long values wrap. |
|
|
123
|
+
| [screen.tsx](examples/screen.tsx) | A nested record: the path, the title with its status and due date and the record's actions by weight in the app header, a main column with the line items and a side column with the client's details and the history — `orientation`. |
|
|
123
124
|
|
|
124
125
|
## Mistakes
|
|
125
126
|
- A grid of `Typography` pairs or a two-column table for record details → `DescriptionList`: the `<dl>` semantics and the stacking come with it.
|