prime-ui-kit 0.13.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -20
- package/dist/chunks/{chunk-XNOJEX55.js → chunk-2IKH55MI.js} +1 -1
- package/dist/chunks/{chunk-JV2KB5JZ.js → chunk-THFZIHKU.js} +3761 -3041
- package/dist/chunks/{chunk-PK2GC77E.js → chunk-XJAVS6FH.js} +213 -188
- package/dist/color-picker.js +2 -2
- package/dist/components/banner/Banner.d.ts +5 -2
- package/dist/components/chart-frame/ChartFrame.d.ts +19 -6
- package/dist/components/chat/Chat.d.ts +2 -2
- package/dist/components/chat/ChatPinned.d.ts +2 -2
- package/dist/components/chat/MessageList.d.ts +1 -1
- package/dist/components/chat/chatContext.d.ts +1 -1
- package/dist/components/dnd/Dnd.d.ts +1 -1
- package/dist/components/field-list/FieldList.d.ts +90 -0
- package/dist/components/index.d.ts +3 -1
- package/dist/components/input/Input.d.ts +2 -2
- package/dist/components/kanban/Kanban.d.ts +6 -3
- package/dist/components/login-form/LoginForm.d.ts +5 -1
- package/dist/components/page-content/PageContent.d.ts +55 -4
- package/dist/components/sparkline/Sparkline.d.ts +64 -15
- package/dist/components/sparkline/geometry.d.ts +26 -0
- package/dist/components/tooltip/Tooltip.d.ts +5 -2
- package/dist/hooks/usePosition.d.ts +15 -4
- package/dist/index.css +1 -1
- package/dist/index.js +4 -2
- package/dist/internal/ChartTooltip.d.ts +26 -0
- package/dist/internal/FieldAction.d.ts +6 -7
- package/dist/internal/fieldCell.d.ts +21 -0
- package/dist/internal/messageList.d.ts +2 -2
- package/dist/internal/palette.d.ts +7 -0
- package/dist/internal/swatch.d.ts +6 -2
- package/dist/layout/app-header/AppHeader.d.ts +9 -28
- package/dist/layout/index.d.ts +1 -1
- package/dist/skill/SKILL.md +32 -20
- package/dist/skill/anti-slop.md +77 -4
- package/dist/skill/api-contract.md +2 -2
- package/dist/skill/cheatsheet.md +33 -7
- package/dist/skill/checklist.md +28 -6
- package/dist/skill/choosing.md +17 -14
- package/dist/skill/components.md +9 -15
- package/dist/skill/composition.md +301 -61
- package/dist/skill/foundations.md +9 -7
- package/dist/skill/layouts.md +70 -37
- package/dist/skill/reference/components/avatar/COMPONENT.md +4 -4
- package/dist/skill/reference/components/avatar/examples/presence.tsx +1 -1
- package/dist/skill/reference/components/avatar/examples/states.tsx +5 -5
- package/dist/skill/reference/components/badge/examples/applied-filters.tsx +13 -19
- package/dist/skill/reference/components/badge/examples/examples.module.css +1 -8
- package/dist/skill/reference/components/badge/examples/server-tags.tsx +2 -6
- package/dist/skill/reference/components/banner/COMPONENT.md +6 -6
- package/dist/skill/reference/components/banner/examples/dismissible.tsx +22 -11
- package/dist/skill/reference/components/banner/examples/examples.module.css +4 -8
- package/dist/skill/reference/components/banner/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/banner/examples/page-strip.tsx +16 -22
- package/dist/skill/reference/components/breadcrumb/COMPONENT.md +5 -4
- package/dist/skill/reference/components/breadcrumb/examples/ellipsis.tsx +2 -2
- package/dist/skill/reference/components/breadcrumb/examples/overflow.tsx +1 -1
- package/dist/skill/reference/components/button-group/COMPONENT.md +2 -2
- package/dist/skill/reference/components/button-group/examples/in-form.tsx +22 -2
- package/dist/skill/reference/components/button-group/examples/states.tsx +10 -1
- package/dist/skill/reference/components/card/COMPONENT.md +7 -5
- package/dist/skill/reference/components/card/examples/examples.module.css +0 -28
- package/dist/skill/reference/components/card/examples/kpi-media.tsx +13 -11
- package/dist/skill/reference/components/card/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/card/examples/panel-chart.tsx +45 -22
- package/dist/skill/reference/components/card/examples/screen.module.css +14 -0
- package/dist/skill/reference/components/card/examples/screen.tsx +362 -0
- package/dist/skill/reference/components/card/examples/variants.tsx +15 -1
- package/dist/skill/reference/components/chart-frame/COMPONENT.md +12 -8
- package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +119 -0
- package/dist/skill/reference/components/chart-frame/examples/states.tsx +3 -1
- package/dist/skill/reference/components/chart-frame/examples/tooltip.tsx +20 -24
- package/dist/skill/reference/components/chat/COMPONENT.md +6 -4
- package/dist/skill/reference/components/chat/examples/group-chat.tsx +15 -2
- package/dist/skill/reference/components/chat/examples/reactions.tsx +121 -0
- package/dist/skill/reference/components/chat/examples/screen.module.css +9 -0
- package/dist/skill/{patterns/chat.tsx → reference/components/chat/examples/screen.tsx} +187 -350
- package/dist/skill/reference/components/chat/examples/search.tsx +1 -1
- package/dist/skill/reference/components/chat-list/COMPONENT.md +2 -1
- package/dist/skill/reference/components/chat-list/examples/links.tsx +72 -0
- package/dist/skill/reference/components/checkbox/COMPONENT.md +1 -1
- package/dist/skill/reference/components/checkbox/examples/examples.module.css +5 -1
- package/dist/skill/reference/components/checkbox/examples/indicator.tsx +37 -9
- package/dist/skill/reference/components/checkbox/examples/states.tsx +6 -1
- package/dist/skill/reference/components/color-field/COMPONENT.md +1 -1
- package/dist/skill/reference/components/color-picker/COMPONENT.md +6 -5
- package/dist/skill/reference/components/color-picker/examples/controlled-open.tsx +37 -0
- package/dist/skill/reference/components/color-picker/examples/presets.tsx +2 -2
- package/dist/skill/reference/components/color-picker/examples/states.tsx +23 -14
- package/dist/skill/reference/components/color-swatches/COMPONENT.md +1 -0
- package/dist/skill/reference/components/composer/COMPONENT.md +2 -1
- package/dist/skill/reference/components/composer/examples/attach-menu.tsx +78 -0
- package/dist/skill/reference/components/composer/examples/attachments.tsx +2 -2
- package/dist/skill/reference/components/crossfade/COMPONENT.md +1 -0
- package/dist/skill/{patterns/screen-states.module.css → reference/components/crossfade/examples/screen.module.css} +3 -17
- package/dist/skill/reference/components/crossfade/examples/screen.tsx +197 -0
- package/dist/skill/reference/components/data-table/COMPONENT.md +3 -2
- package/dist/skill/reference/components/data-table/examples/detail-panel.tsx +36 -37
- package/dist/skill/reference/components/data-table/examples/examples.module.css +0 -12
- package/dist/skill/reference/components/data-table/examples/numeric.tsx +36 -4
- package/dist/skill/reference/components/data-table/examples/overview.tsx +1 -0
- package/dist/skill/reference/components/data-table/examples/row-open.tsx +7 -36
- package/dist/skill/{patterns/list-page.module.css → reference/components/data-table/examples/screen.module.css} +1 -7
- package/dist/skill/{patterns/list-page.tsx → reference/components/data-table/examples/screen.tsx} +84 -64
- package/dist/skill/reference/components/datepicker/COMPONENT.md +6 -4
- package/dist/skill/reference/components/datepicker/examples/examples.module.css +2 -6
- package/dist/skill/reference/components/datepicker/examples/in-form.tsx +47 -55
- package/dist/skill/reference/components/datepicker/examples/locale.tsx +35 -0
- package/dist/skill/reference/components/datepicker/examples/range-presets.tsx +11 -2
- package/dist/skill/reference/components/datepicker/examples/states.tsx +9 -1
- package/dist/skill/reference/components/description-list/COMPONENT.md +1 -0
- package/dist/skill/{patterns/detail-page.module.css → reference/components/description-list/examples/screen.module.css} +2 -12
- package/dist/skill/reference/components/description-list/examples/screen.tsx +214 -0
- package/dist/skill/reference/components/description-list/examples/structure.tsx +1 -1
- package/dist/skill/reference/components/digit-input/COMPONENT.md +3 -1
- package/dist/skill/reference/components/digit-input/examples/states.tsx +3 -1
- package/dist/skill/reference/components/digit-input/examples/without-focus-ring.tsx +13 -0
- package/dist/skill/reference/components/divider/examples/with-icon.tsx +2 -2
- package/dist/skill/reference/components/dnd/COMPONENT.md +7 -5
- package/dist/skill/reference/components/dnd/examples/drop-zones.tsx +82 -49
- package/dist/skill/reference/components/dnd/examples/examples.module.css +50 -0
- package/dist/skill/reference/components/dnd/examples/states.tsx +54 -0
- package/dist/skill/reference/components/dnd/examples/table.tsx +113 -0
- package/dist/skill/reference/components/drawer/COMPONENT.md +1 -0
- package/dist/skill/reference/components/drawer/examples/dismiss.tsx +5 -3
- package/dist/skill/reference/components/drawer/examples/examples.module.css +0 -13
- package/dist/skill/reference/components/drawer/examples/header-actions.tsx +5 -9
- package/dist/skill/reference/components/drawer/examples/overview.tsx +6 -18
- package/dist/skill/reference/components/drawer/examples/screen.tsx +298 -0
- package/dist/skill/reference/components/dropdown/examples/examples.module.css +1 -5
- package/dist/skill/reference/components/empty-page/COMPONENT.md +1 -1
- package/dist/skill/reference/components/empty-page/examples/region-error.tsx +8 -2
- package/dist/skill/reference/components/example-frame/COMPONENT.md +3 -2
- package/dist/skill/reference/components/example-frame/examples/initial-view.tsx +44 -0
- package/dist/skill/reference/components/field-list/COMPONENT.md +165 -0
- package/dist/skill/reference/components/field-list/examples/base-row.tsx +76 -0
- package/dist/skill/reference/components/field-list/examples/controlled.tsx +72 -0
- package/dist/skill/reference/components/field-list/examples/errors.tsx +88 -0
- package/dist/skill/reference/components/field-list/examples/examples.module.css +34 -0
- package/dist/skill/reference/components/field-list/examples/limits.tsx +55 -0
- package/dist/skill/reference/components/field-list/examples/locked.tsx +139 -0
- package/dist/skill/reference/components/field-list/examples/narrow.tsx +68 -0
- package/dist/skill/reference/components/field-list/examples/overview.tsx +66 -0
- package/dist/skill/reference/components/field-list/examples/reorder.tsx +42 -0
- package/dist/skill/reference/components/field-list/examples/screen.module.css +18 -0
- package/dist/skill/reference/components/field-list/examples/screen.tsx +316 -0
- package/dist/skill/reference/components/field-list/examples/sizes.tsx +42 -0
- package/dist/skill/reference/components/field-list/examples/states.tsx +51 -0
- package/dist/skill/reference/components/file-upload/COMPONENT.md +7 -6
- package/dist/skill/reference/components/file-upload/examples/custom-body.tsx +2 -1
- package/dist/skill/reference/components/file-upload/examples/examples.module.css +1 -7
- package/dist/skill/reference/components/file-upload/examples/file-cards.tsx +10 -1
- package/dist/skill/reference/components/file-upload/examples/gallery.tsx +2 -2
- package/dist/skill/reference/components/file-upload/examples/in-form.tsx +4 -9
- package/dist/skill/reference/components/file-upload/examples/overview.tsx +5 -1
- package/dist/skill/reference/components/file-upload/examples/row-parts.tsx +24 -1
- package/dist/skill/{patterns/media-library.module.css → reference/components/file-upload/examples/screen.module.css} +2 -23
- package/dist/skill/reference/components/file-upload/examples/screen.tsx +646 -0
- package/dist/skill/reference/components/file-upload/examples/states.tsx +6 -2
- package/dist/skill/reference/components/file-upload/examples/validation.tsx +11 -2
- package/dist/skill/reference/components/file-upload/examples/variants.tsx +3 -20
- package/dist/skill/reference/components/gantt/COMPONENT.md +2 -1
- package/dist/skill/reference/components/gantt/examples/screen.module.css +14 -0
- package/dist/skill/{patterns/schedule.tsx → reference/components/gantt/examples/screen.tsx} +174 -170
- package/dist/skill/reference/components/gantt/examples/states.tsx +6 -2
- package/dist/skill/reference/components/input/COMPONENT.md +2 -2
- package/dist/skill/reference/components/input/examples/examples.module.css +2 -13
- package/dist/skill/reference/components/input/examples/in-form.tsx +1 -9
- package/dist/skill/reference/components/input/examples/password-strength.tsx +34 -8
- package/dist/skill/reference/components/input/examples/states.tsx +6 -1
- package/dist/skill/reference/components/kanban/COMPONENT.md +16 -11
- package/dist/skill/reference/components/kanban/examples/columns.tsx +8 -5
- package/dist/skill/reference/components/kanban/examples/limits.tsx +2 -1
- package/dist/skill/reference/components/kanban/examples/screen.module.css +17 -0
- package/dist/skill/{patterns/kanban-board.tsx → reference/components/kanban/examples/screen.tsx} +132 -172
- package/dist/skill/reference/components/kanban/examples/states.tsx +17 -6
- package/dist/skill/reference/components/kanban/examples/variants.tsx +16 -8
- package/dist/skill/reference/components/list/COMPONENT.md +1 -1
- package/dist/skill/reference/components/login-form/COMPONENT.md +6 -5
- package/dist/skill/reference/components/login-form/examples/examples.module.css +2 -21
- package/dist/skill/reference/components/login-form/examples/forgot-password.tsx +28 -32
- package/dist/skill/reference/components/login-form/examples/narrow.tsx +1 -1
- package/dist/skill/reference/components/login-form/examples/overview.tsx +45 -47
- package/dist/skill/reference/components/login-form/examples/register.tsx +64 -68
- package/dist/skill/reference/components/login-form/examples/reset-password.tsx +50 -47
- package/dist/skill/reference/components/login-form/examples/sizes.tsx +4 -6
- package/dist/skill/reference/components/login-form/examples/states.tsx +53 -57
- package/dist/skill/reference/components/login-form/examples/structure.tsx +18 -22
- package/dist/skill/reference/components/login-form/examples/verification-code.tsx +41 -45
- package/dist/skill/reference/components/media-viewer/COMPONENT.md +3 -3
- package/dist/skill/reference/components/media-viewer/examples/dismiss.tsx +5 -1
- package/dist/skill/reference/components/message/COMPONENT.md +6 -5
- package/dist/skill/reference/components/message/examples/file.tsx +5 -1
- package/dist/skill/reference/components/message/examples/media-open.tsx +48 -0
- package/dist/skill/reference/components/message/examples/status.tsx +21 -3
- package/dist/skill/reference/components/message/examples/text-formatting.tsx +7 -1
- package/dist/skill/reference/components/modal/COMPONENT.md +2 -1
- package/dist/skill/reference/components/modal/examples/custom-container.tsx +20 -20
- package/dist/skill/reference/components/modal/examples/dismiss.tsx +5 -3
- package/dist/skill/reference/components/modal/examples/enter-key.tsx +116 -0
- package/dist/skill/reference/components/modal/examples/examples.module.css +7 -13
- package/dist/skill/reference/components/modal/examples/structure.tsx +5 -2
- package/dist/skill/reference/components/native-select/COMPONENT.md +1 -1
- package/dist/skill/reference/components/native-select/examples/states.tsx +5 -1
- package/dist/skill/reference/components/notification/COMPONENT.md +2 -1
- package/dist/skill/reference/components/notification/examples/dismiss.tsx +2 -2
- package/dist/skill/reference/components/page-content/COMPONENT.md +71 -14
- package/dist/skill/reference/components/page-content/examples/grid.tsx +107 -0
- package/dist/skill/reference/components/page-content/examples/list-detail.tsx +0 -3
- package/dist/skill/reference/components/page-content/examples/overview.tsx +2 -2
- package/dist/skill/{patterns/settings-page.module.css → reference/components/page-content/examples/screen.module.css} +1 -21
- package/dist/skill/{patterns/settings-page.tsx → reference/components/page-content/examples/screen.tsx} +61 -82
- package/dist/skill/reference/components/page-content/examples/sections.tsx +81 -0
- package/dist/skill/reference/components/page-content/examples/variants.tsx +4 -11
- package/dist/skill/reference/components/page-toolbar/COMPONENT.md +18 -16
- package/dist/skill/reference/components/page-toolbar/examples/narrow.tsx +6 -3
- package/dist/skill/reference/components/pagination/examples/controlled.tsx +29 -29
- package/dist/skill/reference/components/pagination/examples/examples.module.css +0 -2
- package/dist/skill/reference/components/progress-bar/COMPONENT.md +1 -1
- package/dist/skill/reference/components/progress-bar/examples/segments.tsx +2 -2
- package/dist/skill/reference/components/progress-circle/COMPONENT.md +1 -1
- package/dist/skill/reference/components/progress-circle/examples/segments.tsx +8 -3
- package/dist/skill/reference/components/radio/COMPONENT.md +1 -0
- package/dist/skill/reference/components/radio/examples/examples.module.css +14 -0
- package/dist/skill/reference/components/radio/examples/in-form.tsx +45 -0
- package/dist/skill/reference/components/scroll-container/COMPONENT.md +1 -0
- package/dist/skill/reference/components/scroll-container/examples/auto-scroll.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/chat.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/edges.tsx +6 -3
- package/dist/skill/reference/components/scroll-container/examples/examples.module.css +4 -17
- package/dist/skill/reference/components/scroll-container/examples/load-more.tsx +51 -0
- package/dist/skill/reference/components/scroll-container/examples/lock.tsx +3 -5
- package/dist/skill/reference/components/scroll-container/examples/overscroll.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/overview.tsx +3 -3
- package/dist/skill/reference/components/scroll-container/examples/scrollbar.tsx +13 -7
- package/dist/skill/reference/components/scroll-container/examples/variants.tsx +13 -7
- package/dist/skill/reference/components/segmented-control/COMPONENT.md +3 -2
- package/dist/skill/reference/components/segmented-control/examples/in-form.tsx +5 -1
- package/dist/skill/reference/components/segmented-control/examples/states.tsx +10 -1
- package/dist/skill/reference/components/select/COMPONENT.md +5 -3
- package/dist/skill/reference/components/select/examples/examples.module.css +2 -7
- package/dist/skill/reference/components/select/examples/icon-only.tsx +38 -0
- package/dist/skill/reference/components/select/examples/states.tsx +13 -1
- package/dist/skill/reference/components/sheet/COMPONENT.md +2 -0
- package/dist/skill/reference/components/sheet/examples/guard.tsx +72 -0
- package/dist/skill/reference/components/sheet/examples/header-actions.tsx +56 -0
- package/dist/skill/reference/components/slider/COMPONENT.md +2 -1
- package/dist/skill/reference/components/slider/examples/examples.module.css +8 -0
- package/dist/skill/reference/components/slider/examples/in-form.tsx +47 -0
- package/dist/skill/reference/components/slider/examples/states.tsx +4 -1
- package/dist/skill/reference/components/smart-filter/COMPONENT.md +1 -1
- package/dist/skill/reference/components/smart-filter/examples/controlled.tsx +3 -3
- package/dist/skill/reference/components/smart-filter/examples/ranges.tsx +44 -10
- package/dist/skill/reference/components/sparkline/COMPONENT.md +83 -30
- package/dist/skill/reference/components/sparkline/examples/compact.tsx +1 -1
- package/dist/skill/reference/components/sparkline/examples/curve.tsx +28 -0
- package/dist/skill/reference/components/sparkline/examples/gaps.tsx +33 -0
- package/dist/skill/reference/components/sparkline/examples/overview.tsx +11 -2
- package/dist/skill/reference/components/sparkline/examples/period.tsx +7 -2
- package/dist/skill/reference/components/sparkline/examples/reference.tsx +38 -0
- package/dist/skill/reference/components/sparkline/examples/variants.tsx +2 -2
- package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
- package/dist/skill/reference/components/tabs/examples/examples.module.css +0 -6
- package/dist/skill/reference/components/tabs/examples/in-drawer.tsx +11 -13
- package/dist/skill/reference/components/tabs/examples/sizes.tsx +1 -1
- package/dist/skill/reference/components/tag-select/COMPONENT.md +1 -1
- package/dist/skill/reference/components/tag-select/examples/states.tsx +8 -1
- package/dist/skill/reference/components/textarea/COMPONENT.md +1 -1
- package/dist/skill/reference/components/textarea/examples/examples.module.css +0 -6
- package/dist/skill/reference/components/textarea/examples/in-form.tsx +1 -9
- package/dist/skill/reference/components/textarea/examples/states.tsx +2 -1
- package/dist/skill/reference/components/thumbnail/COMPONENT.md +2 -1
- package/dist/skill/reference/components/thumbnail/examples/examples.module.css +1 -1
- package/dist/skill/reference/components/thumbnail/examples/fit.tsx +24 -0
- package/dist/skill/reference/components/thumbnail/examples/video.tsx +20 -1
- package/dist/skill/reference/components/timeline/COMPONENT.md +1 -1
- package/dist/skill/reference/components/timeline/examples/examples.module.css +0 -8
- package/dist/skill/reference/components/timeline/examples/links.tsx +55 -14
- package/dist/skill/reference/components/timeline/examples/narrow.tsx +2 -2
- package/dist/skill/reference/components/timeline/examples/sizes.tsx +3 -3
- package/dist/skill/reference/components/timeline/examples/variants.tsx +4 -4
- package/dist/skill/reference/components/tooltip/COMPONENT.md +7 -5
- package/dist/skill/reference/components/tooltip/examples/placement.tsx +2 -1
- package/dist/skill/reference/components/tooltip/examples/toolbar.tsx +2 -2
- package/dist/skill/reference/components/typography/examples/weights.tsx +3 -0
- package/dist/skill/reference/components/video-note/COMPONENT.md +3 -3
- package/dist/skill/reference/components/video-note/examples/controlled.tsx +19 -2
- package/dist/skill/reference/components/video-note/examples/in-message.tsx +5 -2
- package/dist/skill/reference/components/visually-hidden/COMPONENT.md +2 -1
- package/dist/skill/reference/components/visually-hidden/examples/assertive.tsx +39 -0
- package/dist/skill/reference/components/voice-player/COMPONENT.md +3 -3
- package/dist/skill/reference/components/voice-player/examples/call-recording.tsx +19 -9
- package/dist/skill/reference/components/voice-player/examples/controlled.tsx +20 -3
- package/dist/skill/reference/layout/app-header/COMPONENT.md +46 -63
- package/dist/skill/reference/layout/app-header/examples/breadcrumbs.tsx +10 -9
- package/dist/skill/reference/layout/app-header/examples/examples.module.css +1 -1
- package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +2 -3
- package/dist/skill/reference/layout/app-header/examples/narrow.tsx +4 -5
- package/dist/skill/reference/layout/app-header/examples/overview.tsx +8 -10
- package/dist/skill/reference/layout/app-header/examples/page-title.tsx +3 -10
- package/dist/skill/reference/layout/app-shell/COMPONENT.md +5 -4
- package/dist/skill/reference/layout/app-shell/examples/footer.tsx +2 -2
- package/dist/skill/reference/layout/app-shell/examples/overview.tsx +17 -32
- package/dist/skill/{patterns/app-shell.module.css → reference/layout/app-shell/examples/screen.module.css} +1 -8
- package/dist/skill/reference/layout/app-shell/examples/screen.tsx +262 -0
- package/dist/skill/reference/layout/app-shell/examples/template.tsx +31 -11
- package/dist/skill/reference/layout/bottom-nav/examples/floating-action.tsx +2 -2
- package/dist/skill/reference/layout/bottom-nav/examples/floating.tsx +2 -2
- package/dist/skill/reference/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
- package/dist/skill/reference/layout/sidebar/COMPONENT.md +7 -4
- package/dist/skill/reference/layout/sidebar/examples/account.tsx +2 -2
- package/dist/skill/reference/layout/sidebar/examples/collapsible-groups.tsx +12 -4
- package/dist/skill/reference/layout/sidebar/examples/custom-part.tsx +53 -0
- package/dist/skill/reference/layout/sidebar/examples/examples.module.css +5 -0
- package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +53 -0
- package/dist/skill/reference/layout/sidebar/examples/persist.tsx +57 -0
- package/dist/skill/reference/layout/sidebar/examples/router.tsx +14 -2
- package/dist/skill/reference/layout/sidebar/examples/structure.tsx +7 -2
- package/dist/skill/responsive.md +7 -5
- package/dist/skill/ux.md +145 -0
- package/dist/tokens/semantic.d.ts +2 -0
- package/package.json +1 -1
- package/src/components/avatar/COMPONENT.md +4 -4
- package/src/components/avatar/examples/presence.tsx +1 -1
- package/src/components/avatar/examples/states.tsx +5 -5
- package/src/components/badge/examples/applied-filters.tsx +13 -19
- package/src/components/badge/examples/examples.module.css +1 -8
- package/src/components/badge/examples/server-tags.tsx +2 -6
- package/src/components/banner/COMPONENT.md +6 -6
- package/src/components/banner/examples/dismissible.tsx +22 -11
- package/src/components/banner/examples/examples.module.css +4 -8
- package/src/components/banner/examples/narrow.tsx +1 -1
- package/src/components/banner/examples/page-strip.tsx +16 -22
- package/src/components/breadcrumb/COMPONENT.md +5 -4
- package/src/components/breadcrumb/examples/ellipsis.tsx +2 -2
- package/src/components/breadcrumb/examples/overflow.tsx +1 -1
- package/src/components/button-group/COMPONENT.md +2 -2
- package/src/components/button-group/examples/in-form.tsx +22 -2
- package/src/components/button-group/examples/states.tsx +10 -1
- package/src/components/card/COMPONENT.md +7 -5
- package/src/components/card/examples/examples.module.css +0 -28
- package/src/components/card/examples/kpi-media.tsx +13 -11
- package/src/components/card/examples/narrow.tsx +1 -1
- package/src/components/card/examples/panel-chart.tsx +45 -22
- package/src/components/card/examples/screen.module.css +14 -0
- package/src/components/card/examples/screen.tsx +362 -0
- package/src/components/card/examples/variants.tsx +15 -1
- package/src/components/chart-frame/COMPONENT.md +12 -8
- package/src/components/chart-frame/examples/fill-height.tsx +119 -0
- package/src/components/chart-frame/examples/states.tsx +3 -1
- package/src/components/chart-frame/examples/tooltip.tsx +20 -24
- package/src/components/chat/COMPONENT.md +6 -4
- package/src/components/chat/examples/group-chat.tsx +15 -2
- package/src/components/chat/examples/reactions.tsx +121 -0
- package/src/components/chat/examples/screen.module.css +9 -0
- package/src/components/chat/examples/screen.tsx +718 -0
- package/src/components/chat/examples/search.tsx +1 -1
- package/src/components/chat-list/COMPONENT.md +2 -1
- package/src/components/chat-list/examples/links.tsx +72 -0
- package/src/components/checkbox/COMPONENT.md +1 -1
- package/src/components/checkbox/examples/examples.module.css +5 -1
- package/src/components/checkbox/examples/indicator.tsx +37 -9
- package/src/components/checkbox/examples/states.tsx +6 -1
- package/src/components/color-field/COMPONENT.md +1 -1
- package/src/components/color-picker/COMPONENT.md +6 -5
- package/src/components/color-picker/examples/controlled-open.tsx +37 -0
- package/src/components/color-picker/examples/presets.tsx +2 -2
- package/src/components/color-picker/examples/states.tsx +23 -14
- package/src/components/color-swatches/COMPONENT.md +1 -0
- package/src/components/composer/COMPONENT.md +2 -1
- package/src/components/composer/examples/attach-menu.tsx +78 -0
- package/src/components/composer/examples/attachments.tsx +2 -2
- package/src/components/crossfade/COMPONENT.md +1 -0
- package/src/components/crossfade/examples/screen.module.css +40 -0
- package/src/components/crossfade/examples/screen.tsx +197 -0
- package/src/components/data-table/COMPONENT.md +3 -2
- package/src/components/data-table/examples/detail-panel.tsx +36 -37
- package/src/components/data-table/examples/examples.module.css +0 -12
- package/src/components/data-table/examples/numeric.tsx +36 -4
- package/src/components/data-table/examples/overview.tsx +1 -0
- package/src/components/data-table/examples/row-open.tsx +7 -36
- package/src/components/data-table/examples/screen.module.css +13 -0
- package/src/components/data-table/examples/screen.tsx +354 -0
- package/src/components/datepicker/COMPONENT.md +6 -4
- package/src/components/datepicker/examples/examples.module.css +2 -6
- package/src/components/datepicker/examples/in-form.tsx +47 -55
- package/src/components/datepicker/examples/locale.tsx +35 -0
- package/src/components/datepicker/examples/range-presets.tsx +11 -2
- package/src/components/datepicker/examples/states.tsx +9 -1
- package/src/components/description-list/COMPONENT.md +1 -0
- package/src/components/description-list/examples/screen.module.css +64 -0
- package/src/components/description-list/examples/screen.tsx +214 -0
- package/src/components/description-list/examples/structure.tsx +1 -1
- package/src/components/digit-input/COMPONENT.md +3 -1
- package/src/components/digit-input/examples/states.tsx +3 -1
- package/src/components/digit-input/examples/without-focus-ring.tsx +13 -0
- package/src/components/divider/examples/with-icon.tsx +2 -2
- package/src/components/dnd/COMPONENT.md +7 -5
- package/src/components/dnd/examples/drop-zones.tsx +82 -49
- package/src/components/dnd/examples/examples.module.css +50 -0
- package/src/components/dnd/examples/states.tsx +54 -0
- package/src/components/dnd/examples/table.tsx +113 -0
- package/src/components/drawer/COMPONENT.md +1 -0
- package/src/components/drawer/examples/dismiss.tsx +5 -3
- package/src/components/drawer/examples/examples.module.css +0 -13
- package/src/components/drawer/examples/header-actions.tsx +5 -9
- package/src/components/drawer/examples/overview.tsx +6 -18
- package/src/components/drawer/examples/screen.module.css +14 -0
- package/src/components/drawer/examples/screen.tsx +298 -0
- package/src/components/dropdown/examples/examples.module.css +1 -5
- package/src/components/empty-page/COMPONENT.md +1 -1
- package/src/components/empty-page/examples/region-error.tsx +8 -2
- package/src/components/example-frame/COMPONENT.md +3 -2
- package/src/components/example-frame/examples/initial-view.tsx +44 -0
- package/src/components/field-list/COMPONENT.md +165 -0
- package/src/components/field-list/examples/base-row.tsx +76 -0
- package/src/components/field-list/examples/controlled.tsx +72 -0
- package/src/components/field-list/examples/errors.tsx +88 -0
- package/src/components/field-list/examples/examples.module.css +34 -0
- package/src/components/field-list/examples/limits.tsx +55 -0
- package/src/components/field-list/examples/locked.tsx +139 -0
- package/src/components/field-list/examples/narrow.tsx +68 -0
- package/src/components/field-list/examples/overview.tsx +66 -0
- package/src/components/field-list/examples/reorder.tsx +42 -0
- package/src/components/field-list/examples/screen.module.css +18 -0
- package/src/components/field-list/examples/screen.tsx +316 -0
- package/src/components/field-list/examples/sizes.tsx +42 -0
- package/src/components/field-list/examples/states.tsx +51 -0
- package/src/components/file-upload/COMPONENT.md +7 -6
- package/src/components/file-upload/examples/custom-body.tsx +2 -1
- package/src/components/file-upload/examples/examples.module.css +1 -7
- package/src/components/file-upload/examples/file-cards.tsx +10 -1
- package/src/components/file-upload/examples/gallery.tsx +2 -2
- package/src/components/file-upload/examples/in-form.tsx +4 -9
- package/src/components/file-upload/examples/overview.tsx +5 -1
- package/src/components/file-upload/examples/row-parts.tsx +24 -1
- package/src/components/file-upload/examples/screen.module.css +45 -0
- package/src/components/file-upload/examples/screen.tsx +646 -0
- package/src/components/file-upload/examples/states.tsx +6 -2
- package/src/components/file-upload/examples/validation.tsx +11 -2
- package/src/components/file-upload/examples/variants.tsx +3 -20
- package/src/components/gantt/COMPONENT.md +2 -1
- package/src/components/gantt/examples/screen.module.css +14 -0
- package/src/components/gantt/examples/screen.tsx +726 -0
- package/src/components/gantt/examples/states.tsx +6 -2
- package/src/components/input/COMPONENT.md +2 -2
- package/src/components/input/examples/examples.module.css +2 -13
- package/src/components/input/examples/in-form.tsx +1 -9
- package/src/components/input/examples/password-strength.tsx +34 -8
- package/src/components/input/examples/states.tsx +6 -1
- package/src/components/kanban/COMPONENT.md +16 -11
- package/src/components/kanban/examples/columns.tsx +8 -5
- package/src/components/kanban/examples/limits.tsx +2 -1
- package/src/components/kanban/examples/screen.module.css +17 -0
- package/src/components/kanban/examples/screen.tsx +572 -0
- package/src/components/kanban/examples/states.tsx +17 -6
- package/src/components/kanban/examples/variants.tsx +16 -8
- package/src/components/list/COMPONENT.md +1 -1
- package/src/components/login-form/COMPONENT.md +6 -5
- package/src/components/login-form/examples/examples.module.css +2 -21
- package/src/components/login-form/examples/forgot-password.tsx +28 -32
- package/src/components/login-form/examples/narrow.tsx +1 -1
- package/src/components/login-form/examples/overview.tsx +45 -47
- package/src/components/login-form/examples/register.tsx +64 -68
- package/src/components/login-form/examples/reset-password.tsx +50 -47
- package/src/components/login-form/examples/sizes.tsx +4 -6
- package/src/components/login-form/examples/states.tsx +53 -57
- package/src/components/login-form/examples/structure.tsx +18 -22
- package/src/components/login-form/examples/verification-code.tsx +41 -45
- package/src/components/media-viewer/COMPONENT.md +3 -3
- package/src/components/media-viewer/examples/dismiss.tsx +5 -1
- package/src/components/message/COMPONENT.md +6 -5
- package/src/components/message/examples/file.tsx +5 -1
- package/src/components/message/examples/media-open.tsx +48 -0
- package/src/components/message/examples/status.tsx +21 -3
- package/src/components/message/examples/text-formatting.tsx +7 -1
- package/src/components/modal/COMPONENT.md +2 -1
- package/src/components/modal/examples/custom-container.tsx +20 -20
- package/src/components/modal/examples/dismiss.tsx +5 -3
- package/src/components/modal/examples/enter-key.tsx +116 -0
- package/src/components/modal/examples/examples.module.css +7 -13
- package/src/components/modal/examples/structure.tsx +5 -2
- package/src/components/native-select/COMPONENT.md +1 -1
- package/src/components/native-select/examples/states.tsx +5 -1
- package/src/components/notification/COMPONENT.md +2 -1
- package/src/components/notification/examples/dismiss.tsx +2 -2
- package/src/components/page-content/COMPONENT.md +71 -14
- package/src/components/page-content/examples/grid.tsx +107 -0
- package/src/components/page-content/examples/list-detail.tsx +0 -3
- package/src/components/page-content/examples/overview.tsx +2 -2
- package/src/components/page-content/examples/screen.module.css +27 -0
- package/src/components/page-content/examples/screen.tsx +196 -0
- package/src/components/page-content/examples/sections.tsx +81 -0
- package/src/components/page-content/examples/variants.tsx +4 -11
- package/src/components/page-toolbar/COMPONENT.md +18 -16
- package/src/components/page-toolbar/examples/narrow.tsx +6 -3
- package/src/components/pagination/examples/controlled.tsx +29 -29
- package/src/components/pagination/examples/examples.module.css +0 -2
- package/src/components/progress-bar/COMPONENT.md +1 -1
- package/src/components/progress-bar/examples/segments.tsx +2 -2
- package/src/components/progress-circle/COMPONENT.md +1 -1
- package/src/components/progress-circle/examples/segments.tsx +8 -3
- package/src/components/radio/COMPONENT.md +1 -0
- package/src/components/radio/examples/examples.module.css +14 -0
- package/src/components/radio/examples/in-form.tsx +45 -0
- package/src/components/scroll-container/COMPONENT.md +1 -0
- package/src/components/scroll-container/examples/auto-scroll.tsx +3 -3
- package/src/components/scroll-container/examples/chat.tsx +3 -3
- package/src/components/scroll-container/examples/edges.tsx +6 -3
- package/src/components/scroll-container/examples/examples.module.css +4 -17
- package/src/components/scroll-container/examples/load-more.tsx +51 -0
- package/src/components/scroll-container/examples/lock.tsx +3 -5
- package/src/components/scroll-container/examples/overscroll.tsx +3 -3
- package/src/components/scroll-container/examples/overview.tsx +3 -3
- package/src/components/scroll-container/examples/scrollbar.tsx +13 -7
- package/src/components/scroll-container/examples/variants.tsx +13 -7
- package/src/components/segmented-control/COMPONENT.md +3 -2
- package/src/components/segmented-control/examples/in-form.tsx +5 -1
- package/src/components/segmented-control/examples/states.tsx +10 -1
- package/src/components/select/COMPONENT.md +5 -3
- package/src/components/select/examples/examples.module.css +2 -7
- package/src/components/select/examples/icon-only.tsx +38 -0
- package/src/components/select/examples/states.tsx +13 -1
- package/src/components/sheet/COMPONENT.md +2 -0
- package/src/components/sheet/examples/guard.tsx +72 -0
- package/src/components/sheet/examples/header-actions.tsx +56 -0
- package/src/components/slider/COMPONENT.md +2 -1
- package/src/components/slider/examples/examples.module.css +8 -0
- package/src/components/slider/examples/in-form.tsx +47 -0
- package/src/components/slider/examples/states.tsx +4 -1
- package/src/components/smart-filter/COMPONENT.md +1 -1
- package/src/components/smart-filter/examples/controlled.tsx +3 -3
- package/src/components/smart-filter/examples/ranges.tsx +44 -10
- package/src/components/sparkline/COMPONENT.md +83 -30
- package/src/components/sparkline/examples/compact.tsx +1 -1
- package/src/components/sparkline/examples/curve.tsx +28 -0
- package/src/components/sparkline/examples/gaps.tsx +33 -0
- package/src/components/sparkline/examples/overview.tsx +11 -2
- package/src/components/sparkline/examples/period.tsx +7 -2
- package/src/components/sparkline/examples/reference.tsx +38 -0
- package/src/components/sparkline/examples/variants.tsx +2 -2
- package/src/components/tabs/COMPONENT.md +1 -1
- package/src/components/tabs/examples/examples.module.css +0 -6
- package/src/components/tabs/examples/in-drawer.tsx +11 -13
- package/src/components/tabs/examples/sizes.tsx +1 -1
- package/src/components/tag-select/COMPONENT.md +1 -1
- package/src/components/tag-select/examples/states.tsx +8 -1
- package/src/components/textarea/COMPONENT.md +1 -1
- package/src/components/textarea/examples/examples.module.css +0 -6
- package/src/components/textarea/examples/in-form.tsx +1 -9
- package/src/components/textarea/examples/states.tsx +2 -1
- package/src/components/thumbnail/COMPONENT.md +2 -1
- package/src/components/thumbnail/examples/examples.module.css +1 -1
- package/src/components/thumbnail/examples/fit.tsx +24 -0
- package/src/components/thumbnail/examples/video.tsx +20 -1
- package/src/components/timeline/COMPONENT.md +1 -1
- package/src/components/timeline/examples/examples.module.css +0 -8
- package/src/components/timeline/examples/links.tsx +55 -14
- package/src/components/timeline/examples/narrow.tsx +2 -2
- package/src/components/timeline/examples/sizes.tsx +3 -3
- package/src/components/timeline/examples/variants.tsx +4 -4
- package/src/components/tooltip/COMPONENT.md +7 -5
- package/src/components/tooltip/examples/placement.tsx +2 -1
- package/src/components/tooltip/examples/toolbar.tsx +2 -2
- package/src/components/typography/examples/weights.tsx +3 -0
- package/src/components/video-note/COMPONENT.md +3 -3
- package/src/components/video-note/examples/controlled.tsx +19 -2
- package/src/components/video-note/examples/in-message.tsx +5 -2
- package/src/components/visually-hidden/COMPONENT.md +2 -1
- package/src/components/visually-hidden/examples/assertive.tsx +39 -0
- package/src/components/voice-player/COMPONENT.md +3 -3
- package/src/components/voice-player/examples/call-recording.tsx +19 -9
- package/src/components/voice-player/examples/controlled.tsx +20 -3
- package/src/layout/app-header/COMPONENT.md +46 -63
- package/src/layout/app-header/examples/breadcrumbs.tsx +10 -9
- package/src/layout/app-header/examples/examples.module.css +1 -1
- package/src/layout/app-header/examples/in-app-shell.tsx +2 -3
- package/src/layout/app-header/examples/narrow.tsx +4 -5
- package/src/layout/app-header/examples/overview.tsx +8 -10
- package/src/layout/app-header/examples/page-title.tsx +3 -10
- package/src/layout/app-shell/COMPONENT.md +5 -4
- package/src/layout/app-shell/examples/footer.tsx +2 -2
- package/src/layout/app-shell/examples/overview.tsx +17 -32
- package/src/layout/app-shell/examples/screen.module.css +11 -0
- package/src/layout/app-shell/examples/screen.tsx +262 -0
- package/src/layout/app-shell/examples/template.tsx +31 -11
- package/src/layout/bottom-nav/examples/floating-action.tsx +2 -2
- package/src/layout/bottom-nav/examples/floating.tsx +2 -2
- package/src/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
- package/src/layout/sidebar/COMPONENT.md +7 -4
- package/src/layout/sidebar/examples/account.tsx +2 -2
- package/src/layout/sidebar/examples/collapsible-groups.tsx +12 -4
- package/src/layout/sidebar/examples/custom-part.tsx +53 -0
- package/src/layout/sidebar/examples/examples.module.css +5 -0
- package/src/layout/sidebar/examples/narrow.tsx +53 -0
- package/src/layout/sidebar/examples/persist.tsx +57 -0
- package/src/layout/sidebar/examples/router.tsx +14 -2
- package/src/layout/sidebar/examples/structure.tsx +7 -2
- package/src/styles/theme-light.css +1 -0
- package/dist/skill/patterns/app-shell.tsx +0 -301
- package/dist/skill/patterns/chat.module.css +0 -8
- package/dist/skill/patterns/dashboard.module.css +0 -44
- package/dist/skill/patterns/dashboard.tsx +0 -326
- package/dist/skill/patterns/detail-page.tsx +0 -209
- package/dist/skill/patterns/form-drawer.tsx +0 -240
- package/dist/skill/patterns/kanban-board.module.css +0 -28
- package/dist/skill/patterns/media-library.tsx +0 -638
- package/dist/skill/patterns/schedule.module.css +0 -22
- package/dist/skill/patterns/screen-states.tsx +0 -186
- /package/dist/skill/{patterns/form-drawer.module.css → reference/components/drawer/examples/screen.module.css} +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* Detail page: the header carries the title; two columns that wrap into one on narrow screens, no
|
|
2
|
+
breakpoints. */
|
|
3
|
+
|
|
4
|
+
/* Main column grows; the side column keeps ~18rem and drops below once main would get < 30rem. */
|
|
5
|
+
.columns {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-wrap: wrap;
|
|
8
|
+
align-items: flex-start;
|
|
9
|
+
gap: var(--prime-space-8) var(--prime-space-6);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.main {
|
|
13
|
+
flex: 999 1 calc(var(--prime-space-24) * 5);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.aside {
|
|
17
|
+
display: grid;
|
|
18
|
+
flex: 1 1 calc(var(--prime-space-24) * 3);
|
|
19
|
+
gap: var(--prime-space-4);
|
|
20
|
+
min-width: 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Totals under the table: the amounts end where the «Сумма» column ends (the table's cell padding). */
|
|
24
|
+
.totals {
|
|
25
|
+
display: grid;
|
|
26
|
+
gap: var(--prime-space-2);
|
|
27
|
+
justify-self: end;
|
|
28
|
+
width: min(100%, calc(var(--prime-space-24) * 3));
|
|
29
|
+
margin: 0;
|
|
30
|
+
padding-inline: var(--prime-table-cell-padding-x);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.totalRow {
|
|
34
|
+
display: flex;
|
|
35
|
+
justify-content: space-between;
|
|
36
|
+
gap: var(--prime-space-4);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.totalRow dd {
|
|
40
|
+
margin: 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.amount {
|
|
44
|
+
font-variant-numeric: tabular-nums;
|
|
45
|
+
white-space: nowrap;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Client card: who it is, then the facts as label → value pairs. */
|
|
49
|
+
.client {
|
|
50
|
+
display: grid;
|
|
51
|
+
gap: var(--prime-space-5);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.person {
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
gap: var(--prime-space-3);
|
|
58
|
+
min-width: 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.personText {
|
|
62
|
+
display: grid;
|
|
63
|
+
min-width: 0;
|
|
64
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/** 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`. */
|
|
2
|
+
import {
|
|
3
|
+
AppHeader,
|
|
4
|
+
Avatar,
|
|
5
|
+
Breadcrumb,
|
|
6
|
+
Button,
|
|
7
|
+
Card,
|
|
8
|
+
DataTable,
|
|
9
|
+
type DataTableColumn,
|
|
10
|
+
DescriptionList,
|
|
11
|
+
Dropdown,
|
|
12
|
+
Icon,
|
|
13
|
+
LinkButton,
|
|
14
|
+
PageContent,
|
|
15
|
+
PageToolbar,
|
|
16
|
+
Timeline,
|
|
17
|
+
Typography,
|
|
18
|
+
} from "prime-ui-kit";
|
|
19
|
+
|
|
20
|
+
import styles from "./screen.module.css";
|
|
21
|
+
|
|
22
|
+
type Line = { id: string; name: string; quantity: number; unit: string; price: number };
|
|
23
|
+
|
|
24
|
+
const LINES: Line[] = [
|
|
25
|
+
{ id: "l1", name: "Лицензия CRM, тариф «Бизнес»", quantity: 25, unit: "мест", price: 12_000 },
|
|
26
|
+
{ id: "l2", name: "Внедрение и настройка", quantity: 40, unit: "ч", price: 3_500 },
|
|
27
|
+
{ id: "l3", name: "Обучение менеджеров", quantity: 2, unit: "дня", price: 18_000 },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const HISTORY = [
|
|
31
|
+
{ id: "h1", title: "Счёт открыт клиентом", date: "2 окт., 11:40" },
|
|
32
|
+
{ id: "h2", title: "Отправлен на billing@veter.ru", date: "30 сент., 16:05" },
|
|
33
|
+
{ id: "h3", title: "Создан · Анна Климова", date: "30 сент., 15:52" },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const MONEY = new Intl.NumberFormat("ru-RU", {
|
|
37
|
+
style: "currency",
|
|
38
|
+
currency: "RUB",
|
|
39
|
+
maximumFractionDigits: 0,
|
|
40
|
+
});
|
|
41
|
+
const COUNT = new Intl.NumberFormat("ru-RU");
|
|
42
|
+
|
|
43
|
+
const NET = LINES.reduce((sum, line) => sum + line.quantity * line.price, 0);
|
|
44
|
+
const VAT = Math.round(NET * 0.2);
|
|
45
|
+
|
|
46
|
+
const TOTALS = [
|
|
47
|
+
{ label: "Без НДС", value: MONEY.format(NET) },
|
|
48
|
+
{ label: "НДС 20%", value: MONEY.format(VAT) },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const COLUMNS: DataTableColumn<Line>[] = [
|
|
52
|
+
{ id: "name", header: "Позиция", accessor: "name" },
|
|
53
|
+
{
|
|
54
|
+
id: "quantity",
|
|
55
|
+
header: "Кол-во",
|
|
56
|
+
numeric: true,
|
|
57
|
+
headerAlign: "end",
|
|
58
|
+
cell: (row) => `${COUNT.format(row.quantity)} ${row.unit}`,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "price",
|
|
62
|
+
header: "Цена",
|
|
63
|
+
numeric: true,
|
|
64
|
+
headerAlign: "end",
|
|
65
|
+
cell: (row) => MONEY.format(row.price),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "sum",
|
|
69
|
+
header: "Сумма",
|
|
70
|
+
numeric: true,
|
|
71
|
+
headerAlign: "end",
|
|
72
|
+
cell: (row) => MONEY.format(row.quantity * row.price),
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
export default function DescriptionListScreenExample() {
|
|
77
|
+
return (
|
|
78
|
+
<>
|
|
79
|
+
{/* A nested record titles itself in the app header: the path up to the list, the record as the
|
|
80
|
+
only h1 with its status and due date under it, the record's actions in the tools row. */}
|
|
81
|
+
<AppHeader.Root>
|
|
82
|
+
<AppHeader.Start>
|
|
83
|
+
<Breadcrumb.Root>
|
|
84
|
+
<Breadcrumb.Item href="#invoices">Счета</Breadcrumb.Item>
|
|
85
|
+
</Breadcrumb.Root>
|
|
86
|
+
<AppHeader.Separator />
|
|
87
|
+
<AppHeader.Title>
|
|
88
|
+
Счёт № 2026-0418
|
|
89
|
+
<AppHeader.Description>Отправлен · оплатить до 14 октября</AppHeader.Description>
|
|
90
|
+
</AppHeader.Title>
|
|
91
|
+
</AppHeader.Start>
|
|
92
|
+
<AppHeader.Tools>
|
|
93
|
+
<PageToolbar.Root aria-label="Счёт № 2026-0418">
|
|
94
|
+
<PageToolbar.Actions>
|
|
95
|
+
<Dropdown.Root>
|
|
96
|
+
<Dropdown.Trigger>
|
|
97
|
+
<Button.Root variant="soft" tone="neutral" aria-label="Другие действия">
|
|
98
|
+
<Button.Icon>
|
|
99
|
+
<Icon name="action.more" />
|
|
100
|
+
</Button.Icon>
|
|
101
|
+
</Button.Root>
|
|
102
|
+
</Dropdown.Trigger>
|
|
103
|
+
<Dropdown.Content>
|
|
104
|
+
<Dropdown.Item>Дублировать</Dropdown.Item>
|
|
105
|
+
<Dropdown.Item>Скачать PDF</Dropdown.Item>
|
|
106
|
+
<Dropdown.Separator />
|
|
107
|
+
<Dropdown.Item tone="danger">Аннулировать счёт</Dropdown.Item>
|
|
108
|
+
</Dropdown.Content>
|
|
109
|
+
</Dropdown.Root>
|
|
110
|
+
<Button.Root variant="soft" tone="neutral" aria-label="Напомнить клиенту">
|
|
111
|
+
<Button.Icon>
|
|
112
|
+
<Icon name="action.send" />
|
|
113
|
+
</Button.Icon>
|
|
114
|
+
</Button.Root>
|
|
115
|
+
<Button.Root>Отметить оплату</Button.Root>
|
|
116
|
+
</PageToolbar.Actions>
|
|
117
|
+
</PageToolbar.Root>
|
|
118
|
+
</AppHeader.Tools>
|
|
119
|
+
</AppHeader.Root>
|
|
120
|
+
|
|
121
|
+
<PageContent.Root>
|
|
122
|
+
<PageContent.Body>
|
|
123
|
+
<div className={styles.columns}>
|
|
124
|
+
<PageContent.Section label="Позиции" className={styles.main}>
|
|
125
|
+
<DataTable
|
|
126
|
+
columns={COLUMNS}
|
|
127
|
+
rows={LINES}
|
|
128
|
+
getRowKey={(row) => row.id}
|
|
129
|
+
paging="none"
|
|
130
|
+
highlightRowOnHover={false}
|
|
131
|
+
/>
|
|
132
|
+
{/* Totals line up with the «Сумма» column of the table above: a layout of its own. */}
|
|
133
|
+
<dl className={styles.totals}>
|
|
134
|
+
{TOTALS.map((row) => (
|
|
135
|
+
<div key={row.label} className={styles.totalRow}>
|
|
136
|
+
<dt>
|
|
137
|
+
<Typography variant="body-m" tone="secondary">
|
|
138
|
+
{row.label}
|
|
139
|
+
</Typography>
|
|
140
|
+
</dt>
|
|
141
|
+
<dd>
|
|
142
|
+
<Typography variant="body-m" className={styles.amount}>
|
|
143
|
+
{row.value}
|
|
144
|
+
</Typography>
|
|
145
|
+
</dd>
|
|
146
|
+
</div>
|
|
147
|
+
))}
|
|
148
|
+
<div className={styles.totalRow}>
|
|
149
|
+
<dt>
|
|
150
|
+
<Typography variant="title-m">К оплате</Typography>
|
|
151
|
+
</dt>
|
|
152
|
+
<dd>
|
|
153
|
+
<Typography variant="title-m" className={styles.amount}>
|
|
154
|
+
{MONEY.format(NET + VAT)}
|
|
155
|
+
</Typography>
|
|
156
|
+
</dd>
|
|
157
|
+
</div>
|
|
158
|
+
</dl>
|
|
159
|
+
</PageContent.Section>
|
|
160
|
+
<aside className={styles.aside} aria-label="Клиент и история">
|
|
161
|
+
<Card.Root variant="panel">
|
|
162
|
+
<Card.Header>
|
|
163
|
+
<Card.Title as="h2">Клиент</Card.Title>
|
|
164
|
+
</Card.Header>
|
|
165
|
+
<Card.Body>
|
|
166
|
+
<div className={styles.client}>
|
|
167
|
+
<span className={styles.person}>
|
|
168
|
+
<Avatar.Root color="teal">
|
|
169
|
+
<Avatar.Fallback>СВ</Avatar.Fallback>
|
|
170
|
+
</Avatar.Root>
|
|
171
|
+
<span className={styles.personText}>
|
|
172
|
+
<Typography as="span" variant="title-s">
|
|
173
|
+
ООО «Северный ветер»
|
|
174
|
+
</Typography>
|
|
175
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
176
|
+
ИНН 7704 512 908
|
|
177
|
+
</Typography>
|
|
178
|
+
</span>
|
|
179
|
+
</span>
|
|
180
|
+
<DescriptionList.Root orientation="vertical">
|
|
181
|
+
<DescriptionList.Item label="Контакт">
|
|
182
|
+
Ольга Мартынова, финансовый директор
|
|
183
|
+
</DescriptionList.Item>
|
|
184
|
+
<DescriptionList.Item label="Почта для счетов">
|
|
185
|
+
<LinkButton href="mailto:billing@veter.ru">billing@veter.ru</LinkButton>
|
|
186
|
+
</DescriptionList.Item>
|
|
187
|
+
</DescriptionList.Root>
|
|
188
|
+
</div>
|
|
189
|
+
</Card.Body>
|
|
190
|
+
</Card.Root>
|
|
191
|
+
<Card.Root variant="panel">
|
|
192
|
+
<Card.Header>
|
|
193
|
+
<Card.Title as="h2">История</Card.Title>
|
|
194
|
+
</Card.Header>
|
|
195
|
+
<Card.Body>
|
|
196
|
+
<Timeline.Root>
|
|
197
|
+
<Timeline.Group>
|
|
198
|
+
{HISTORY.map((event) => (
|
|
199
|
+
<Timeline.Item key={event.id}>
|
|
200
|
+
<Timeline.Title>{event.title}</Timeline.Title>
|
|
201
|
+
<Timeline.Meta>{event.date}</Timeline.Meta>
|
|
202
|
+
</Timeline.Item>
|
|
203
|
+
))}
|
|
204
|
+
</Timeline.Group>
|
|
205
|
+
</Timeline.Root>
|
|
206
|
+
</Card.Body>
|
|
207
|
+
</Card.Root>
|
|
208
|
+
</aside>
|
|
209
|
+
</div>
|
|
210
|
+
</PageContent.Body>
|
|
211
|
+
</PageContent.Root>
|
|
212
|
+
</>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
@@ -13,7 +13,7 @@ export default function DescriptionListStructureExample() {
|
|
|
13
13
|
<DescriptionList.Item label="Договор">
|
|
14
14
|
<LinkButton href="#contract-118">Договор № 118 от 12 марта</LinkButton>
|
|
15
15
|
</DescriptionList.Item>
|
|
16
|
-
<DescriptionList.Item label="
|
|
16
|
+
<DescriptionList.Item label="Почта">
|
|
17
17
|
finance@severny-veter.ru
|
|
18
18
|
<DescriptionList.ItemAction
|
|
19
19
|
label="Написать"
|
|
@@ -109,6 +109,7 @@ No `variant` or `tone`.
|
|
|
109
109
|
|
|
110
110
|
## Layout & spacing
|
|
111
111
|
- The field hugs its cells (label left-aligned above them); with `fullWidth` it fills the container.
|
|
112
|
+
- The code is always one row: in a container narrower than the row the cells narrow and keep the tier height, so no digit or group wraps to a second line.
|
|
112
113
|
- Label → cells: tier `label-gap`; cells → hint: tier `hint-gap` — the same rhythm as every field.
|
|
113
114
|
- Put the submit button below or next to the code; with the same `size` it lines up with the cells.
|
|
114
115
|
|
|
@@ -145,11 +146,12 @@ No `variant` or `tone`.
|
|
|
145
146
|
|---|---|
|
|
146
147
|
| [overview.tsx](examples/overview.tsx) | A six-digit code from SMS with its label and a hint — `label`, `hint`, `length`. |
|
|
147
148
|
| [sizes.tsx](examples/sizes.tsx) | Every size; the cell is a square on its own scale, two steps above the control heights — `size`. |
|
|
148
|
-
| [states.tsx](examples/states.tsx) | A default code next to a disabled one — `disabled`. |
|
|
149
|
+
| [states.tsx](examples/states.tsx) | A default code next to a disabled one, an invalid one with no message and an accepted one — `disabled`, `invalid`, `success`. |
|
|
149
150
|
| [validation.tsx](examples/validation.tsx) | A confirmation code checked once it is complete: a wrong code shakes in with one message and leaves as soon as you type again; a hint and an optional code — `required`, `optional`, `hint`, `error`. |
|
|
150
151
|
| [grouped.tsx](examples/grouped.tsx) | A long code read in chunks with a wider gap between groups — `groupSize`. |
|
|
151
152
|
| [full-width.tsx](examples/full-width.tsx) | Cells that share the container width and keep the tier height, above a full-width button — `fullWidth`. |
|
|
152
153
|
| [on-complete.tsx](examples/on-complete.tsx) | The code is checked on the server as soon as the last cell is filled: the cells wait, a right one turns them success, a wrong one clears them and shakes in the reason — `onComplete`, `hint`. |
|
|
154
|
+
| [without-focus-ring.tsx](examples/without-focus-ring.tsx) | The one code on a pickup point screen, where the caret and the lighter fill of the entry cell show focus — `focusRing`. |
|
|
153
155
|
| [controlled.tsx](examples/controlled.tsx) | The parent owns the code and clears it with a button — `value`, `onValueChange`. |
|
|
154
156
|
| [in-form.tsx](examples/in-form.tsx) | A masked card PIN submitted with a form; a short or wrong PIN shakes in an error that leaves when you type again — `name`, `mask`, `required`, `error`. |
|
|
155
157
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A default code next to a disabled one — `disabled`. */
|
|
1
|
+
/** A default code next to a disabled one, an invalid one with no message and an accepted one — `disabled`, `invalid`, `success`. */
|
|
2
2
|
import { DigitInput } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
export default function DigitInputStatesExample() {
|
|
@@ -6,6 +6,8 @@ export default function DigitInputStatesExample() {
|
|
|
6
6
|
<>
|
|
7
7
|
<DigitInput label="default" defaultValue="42" />
|
|
8
8
|
<DigitInput label="disabled" defaultValue="42" disabled />
|
|
9
|
+
<DigitInput label="invalid" defaultValue="4271" invalid />
|
|
10
|
+
<DigitInput label="success" defaultValue="4821" success hint="Код подтверждён" />
|
|
9
11
|
</>
|
|
10
12
|
);
|
|
11
13
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The one code on a pickup point screen, where the caret and the lighter fill of the entry cell show focus — `focusRing`. */
|
|
2
|
+
import { DigitInput } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
export default function DigitInputWithoutFocusRingExample() {
|
|
5
|
+
return (
|
|
6
|
+
<DigitInput
|
|
7
|
+
label="Код выдачи заказа"
|
|
8
|
+
hint="Покупатель называет его на кассе"
|
|
9
|
+
length={6}
|
|
10
|
+
focusRing={false}
|
|
11
|
+
/>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -10,7 +10,7 @@ export default function DividerWithIconExample() {
|
|
|
10
10
|
Безопасность
|
|
11
11
|
</Divider>
|
|
12
12
|
<Typography as="span" variant="caption" tone="muted">
|
|
13
|
-
|
|
13
|
+
Icon · children
|
|
14
14
|
</Typography>
|
|
15
15
|
</div>
|
|
16
16
|
<div>
|
|
@@ -18,7 +18,7 @@ export default function DividerWithIconExample() {
|
|
|
18
18
|
<Icon name="status.locked" />
|
|
19
19
|
</Divider>
|
|
20
20
|
<Typography as="span" variant="caption" tone="muted">
|
|
21
|
-
|
|
21
|
+
Icon · aria-label
|
|
22
22
|
</Typography>
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
@@ -36,7 +36,7 @@ Dnd.Root session owner: overlay (portal), live region, l
|
|
|
36
36
|
├─ Dnd.Draggable an item to carry elsewhere; stays in place, faded, until the drop
|
|
37
37
|
└─ Dnd.DropZone a box that takes dropped items
|
|
38
38
|
```
|
|
39
|
-
A drag in flight is drawn by `Dnd.Root` as a clone of the lifted element above every layer, following the pointer; an item without a fill of its own flies on the fill of the surface it was lifted from (`--prime-color-layer-current`). A refusal with a reason shows the reason in a chip under the clone. The page gets `data-dnd-active="mouse | touch | pen"` on `<html>` for the length of the gesture.
|
|
39
|
+
A drag in flight is drawn by `Dnd.Root` as a clone of the lifted element above every layer, following the pointer. The clone flies inside empty copies (`display: contents`) of its ancestors up to the nearest surface (`data-depth`) and that surface's `data-theme`, so the host's variables and selectors (a List row's tier padding and radius) dress it exactly as the item in place, and it sets down without a jump; an item without a fill of its own flies on the fill of the surface it was lifted from (`--prime-color-layer-current`). A refusal with a reason shows the reason in a chip under the clone. The page gets `data-dnd-active="mouse | touch | pen"` on `<html>` for the length of the gesture.
|
|
40
40
|
|
|
41
41
|
## API
|
|
42
42
|
|
|
@@ -103,7 +103,7 @@ Generic `Dnd.Draggable<TData>`; `ref` → `HTMLElement`. An item carried onto a
|
|
|
103
103
|
| `as` | `"div" \| "li" \| "span" \| "article" \| "section"` | `"div"` | Element. |
|
|
104
104
|
| `onDragStart` | `(item, point, origin) => void` | — | Fired once the press became a drag. |
|
|
105
105
|
| `onDragEnd` | `(item, outcome: "drop" \| "release" \| "cancel") => void` | — | Always fired at the end. |
|
|
106
|
-
| `…rest` | `Omit<HTMLAttributes<HTMLElement>, "id">` | — | `className` and the other attributes. |
|
|
106
|
+
| `…rest` | `Omit<HTMLAttributes<HTMLElement>, "id" \| "onDragStart" \| "onDragEnd">` | — | `className` and the other attributes. |
|
|
107
107
|
|
|
108
108
|
### Dnd.DropZone
|
|
109
109
|
Generic `Dnd.DropZone<TData>`; `ref` → `HTMLElement`. Renders the `as` element; state is mirrored by `data-dnd-over`, `data-dnd-reject`, `data-dnd-flash`. Where zones overlap, the innermost wins.
|
|
@@ -190,7 +190,7 @@ An item's own `onPointerDown` / `onKeyDown` run before the kit's: `preventDefaul
|
|
|
190
190
|
- The list gap is `--prime-space-2`; override it with `className` (widen the rule with `[data-axis]` so it wins: `.gallery[data-axis] { gap: … }`).
|
|
191
191
|
- A grid (`axis="grid"`) is `display: grid`: the host sets the tracks (`grid-template-columns`) and the cells' size; the gap takes a cell, and a carried item resizes to the cell it would land in.
|
|
192
192
|
- The reason chip stands `--prime-tooltip-offset` under the carried copy, start-aligned, at most `--prime-tooltip-max-width` wide.
|
|
193
|
-
- The look of a row is the consumer's: give `Dnd.SortableItem` / `Dnd.Draggable` a
|
|
193
|
+
- The look of a row is the consumer's: give `Dnd.SortableItem` / `Dnd.Draggable` a radius on its own class (the gap and the clone's fill take it) and keep the row's look within its ancestors up to the nearest surface (`data-depth`) — the clone flies inside empty copies (`display: contents`) of exactly those, so their variables and selectors still apply. A table row flies in a one-row copy of its table inside them.
|
|
194
194
|
- A scrollable ancestor under the pointer auto-scrolls within 64 px of its edge (a `ScrollContainer` strip works).
|
|
195
195
|
- Keep a zone's height stable between states; it only changes fill and outline.
|
|
196
196
|
|
|
@@ -238,7 +238,9 @@ An item's own `onPointerDown` / `onKeyDown` run before the kit's: `preventDefaul
|
|
|
238
238
|
| [grid.tsx](examples/grid.tsx) | Product photos in a wrapping grid: a photo carried across rows lands in reading order, the gap takes a cell, Alt + ← / → steps it one place — `axis`. |
|
|
239
239
|
| [locked.tsx](examples/locked.tsx) | Sections of a workspace menu: the home section is pinned first with a lock in place of its grip, the rest reorder around nothing past it; each row is named by its visible title — `locked`, `handle`, `aria-labelledby`. |
|
|
240
240
|
| [board.tsx](examples/board.tsx) | A ticket board: columns share one kind, so a ticket lands in another column at an exact position or moves there with Alt + ← / →, an empty column says so, and a full column refuses it before the release with the reason under the ticket — `kind`, `canDrop`, `empty`, `onReorder`. |
|
|
241
|
-
| [drop-zones.tsx](examples/drop-zones.tsx) | Documents carried onto folders: a zone takes items by kind, a locked folder refuses before the release and says why under the carried file, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `canDrop`, `flashOnDrop`. |
|
|
241
|
+
| [drop-zones.tsx](examples/drop-zones.tsx) | Documents carried onto folders: a zone takes items by kind and gets the document as data, a locked folder refuses before the release and says why under the carried file, a syncing folder is no target at all, a document on signing stays put, the line above follows the drag, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `data`, `canDrop`, `disabled`, `onDragStart`, `onDragEnd`, `onEnter`, `onLeave`, `flashOnDrop`. |
|
|
242
|
+
| [table.tsx](examples/table.tsx) | A project estimate as a table: each stage is its own body of rows under a heading row that never moves, a row is carried by its grip within a stage or into another, and the rows stay table rows — `as`, `header`, `kind`, `handle`. |
|
|
243
|
+
| [states.tsx](examples/states.tsx) | A contract's approval route: a step already signed stays where it is while the rest reorder around it, and once the route is approved the whole list holds still — `Dnd.SortableItem`, `Dnd.Sortable`, `disabled`. |
|
|
242
244
|
| [narrow.tsx](examples/narrow.tsx) | A row of status filters in a 320 px strip: tags reorder sideways and the strip scrolls when a tag is held near its edge — `axis`. |
|
|
243
245
|
|
|
244
246
|
## Mistakes
|
|
@@ -246,7 +248,7 @@ An item's own `onPointerDown` / `onKeyDown` run before the kit's: `preventDefaul
|
|
|
246
248
|
- A `Dnd.SortableItem` `id` that differs from `getId(item)` → the item never moves.
|
|
247
249
|
- Rendering items yourself instead of through `renderItem` → the list cannot draw the gap or the optimistic order.
|
|
248
250
|
- Using `index` as the id → ids must survive a reorder.
|
|
249
|
-
- Styling a row from an ancestor
|
|
251
|
+
- Styling a row from an ancestor above the nearest surface (`data-depth`) → the flying clone loses it; keep the row's look on the row and its hosts inside the surface.
|
|
250
252
|
- Starting a drag from a button inside a row without `handle` → presses on controls are theirs; use `Dnd.Handle`.
|
|
251
253
|
- A drag-only move with no alternative → add a button or a menu for the same action.
|
|
252
254
|
- `aria-label` on an item that shows a title and a description → it hides them; point `aria-labelledby` / `aria-describedby` at them.
|
|
@@ -1,81 +1,114 @@
|
|
|
1
|
-
/** Documents carried onto folders: a zone takes items by kind, a locked folder refuses before the release and says why under the carried file, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `canDrop`, `flashOnDrop`. */
|
|
1
|
+
/** Documents carried onto folders: a zone takes items by kind and gets the document as data, a locked folder refuses before the release and says why under the carried file, a syncing folder is no target at all, a document on signing stays put, the line above follows the drag, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `data`, `canDrop`, `disabled`, `onDragStart`, `onDragEnd`, `onEnter`, `onLeave`, `flashOnDrop`. */
|
|
2
2
|
import { Badge, Dnd, Typography } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
import styles from "./examples.module.css";
|
|
6
6
|
|
|
7
|
-
type Folder = "inbox" | "contracts" | "archive";
|
|
8
|
-
type Paper = { id: string; title: string; folder: Folder };
|
|
7
|
+
type Folder = "inbox" | "contracts" | "accounting" | "archive";
|
|
8
|
+
type Paper = { id: string; title: string; folder: Folder; signing?: boolean };
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
/** `locked` refuses with a reason; `syncing` is no target at all while it syncs. */
|
|
11
|
+
const FOLDERS: { id: Folder; title: string; locked?: boolean; syncing?: boolean }[] = [
|
|
11
12
|
{ id: "contracts", title: "Договоры" },
|
|
13
|
+
{ id: "accounting", title: "Бухгалтерия (синхронизация)", syncing: true },
|
|
12
14
|
{ id: "archive", title: "Архив (закрыт для записи)", locked: true },
|
|
13
15
|
];
|
|
14
16
|
|
|
15
17
|
const DOCUMENTS: Paper[] = [
|
|
16
18
|
{ id: "d1", title: "Договор поставки № 14", folder: "inbox" },
|
|
17
19
|
{ id: "d2", title: "Акт сверки за квартал", folder: "inbox" },
|
|
18
|
-
{ id: "d3", title: "Счёт на оплату", folder: "inbox" },
|
|
20
|
+
{ id: "d3", title: "Счёт на оплату № 482", folder: "inbox", signing: true },
|
|
19
21
|
];
|
|
20
22
|
|
|
21
23
|
export default function DndDropZonesExample() {
|
|
22
24
|
const [documents, setDocuments] = React.useState(DOCUMENTS);
|
|
25
|
+
const [carried, setCarried] = React.useState<string | null>(null);
|
|
26
|
+
const [target, setTarget] = React.useState<string | null>(null);
|
|
23
27
|
const inFolder = (folder: Folder) => documents.filter((doc) => doc.folder === folder);
|
|
24
28
|
|
|
29
|
+
const status =
|
|
30
|
+
carried === null
|
|
31
|
+
? "Перетащите документ в папку"
|
|
32
|
+
: target === null
|
|
33
|
+
? `«${carried}» — отпустите над папкой`
|
|
34
|
+
: `«${carried}» → ${target}`;
|
|
35
|
+
|
|
25
36
|
return (
|
|
26
37
|
<Dnd.Root>
|
|
27
|
-
<div className={styles.
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<Badge.Root>{inFolder("inbox").length}</Badge.Root>
|
|
34
|
-
</div>
|
|
35
|
-
{inFolder("inbox").map((doc) => (
|
|
36
|
-
<Dnd.Draggable
|
|
37
|
-
key={doc.id}
|
|
38
|
-
kind="document"
|
|
39
|
-
id={doc.id}
|
|
40
|
-
label={doc.title}
|
|
41
|
-
className={styles.ticket}
|
|
42
|
-
>
|
|
43
|
-
<Typography as="span" variant="body-m">
|
|
44
|
-
{doc.title}
|
|
45
|
-
</Typography>
|
|
46
|
-
</Dnd.Draggable>
|
|
47
|
-
))}
|
|
48
|
-
</section>
|
|
49
|
-
{FOLDERS.map((folder) => (
|
|
50
|
-
<Dnd.DropZone
|
|
51
|
-
key={folder.id}
|
|
52
|
-
as="section"
|
|
53
|
-
aria-label={folder.title}
|
|
54
|
-
accepts="document"
|
|
55
|
-
flashOnDrop
|
|
56
|
-
className={styles.column}
|
|
57
|
-
canDrop={() => (folder.locked ? "Архив только для чтения" : true)}
|
|
58
|
-
onDrop={(item) =>
|
|
59
|
-
setDocuments((current) =>
|
|
60
|
-
current.map((doc) => (doc.id === item.id ? { ...doc, folder: folder.id } : doc)),
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
>
|
|
38
|
+
<div className={styles.stage}>
|
|
39
|
+
<Typography as="p" variant="body-s" tone="muted">
|
|
40
|
+
{status}
|
|
41
|
+
</Typography>
|
|
42
|
+
<div className={styles.board}>
|
|
43
|
+
<section className={styles.column} aria-label="Входящие">
|
|
64
44
|
<div className={styles.columnHeader}>
|
|
65
45
|
<Typography as="h4" variant="title-s">
|
|
66
|
-
|
|
46
|
+
Входящие
|
|
67
47
|
</Typography>
|
|
68
|
-
<Badge.Root>{inFolder(
|
|
48
|
+
<Badge.Root>{inFolder("inbox").length}</Badge.Root>
|
|
69
49
|
</div>
|
|
70
|
-
{inFolder(
|
|
71
|
-
<
|
|
50
|
+
{inFolder("inbox").map((doc) => (
|
|
51
|
+
<Dnd.Draggable
|
|
52
|
+
key={doc.id}
|
|
53
|
+
kind="document"
|
|
54
|
+
id={doc.id}
|
|
55
|
+
data={doc}
|
|
56
|
+
label={doc.title}
|
|
57
|
+
disabled={doc.signing}
|
|
58
|
+
className={styles.ticket}
|
|
59
|
+
onDragStart={(item) => setCarried(item.label)}
|
|
60
|
+
onDragEnd={() => {
|
|
61
|
+
setCarried(null);
|
|
62
|
+
setTarget(null);
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
72
65
|
<Typography as="span" variant="body-m">
|
|
73
66
|
{doc.title}
|
|
74
67
|
</Typography>
|
|
75
|
-
|
|
68
|
+
{doc.signing ? (
|
|
69
|
+
<Badge.Root color="orange" className={styles.badge}>
|
|
70
|
+
На подписи
|
|
71
|
+
</Badge.Root>
|
|
72
|
+
) : null}
|
|
73
|
+
</Dnd.Draggable>
|
|
76
74
|
))}
|
|
77
|
-
</
|
|
78
|
-
|
|
75
|
+
</section>
|
|
76
|
+
{FOLDERS.map((folder) => (
|
|
77
|
+
<Dnd.DropZone<Paper>
|
|
78
|
+
key={folder.id}
|
|
79
|
+
as="section"
|
|
80
|
+
aria-label={folder.title}
|
|
81
|
+
accepts="document"
|
|
82
|
+
flashOnDrop
|
|
83
|
+
disabled={folder.syncing}
|
|
84
|
+
className={styles.column}
|
|
85
|
+
canDrop={() => (folder.locked ? "Архив только для чтения" : true)}
|
|
86
|
+
onEnter={() => setTarget(folder.title)}
|
|
87
|
+
onLeave={() => setTarget(null)}
|
|
88
|
+
onDrop={(item) =>
|
|
89
|
+
setDocuments((current) =>
|
|
90
|
+
current.map((doc) =>
|
|
91
|
+
doc.id === item.data.id ? { ...doc, folder: folder.id } : doc,
|
|
92
|
+
),
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
>
|
|
96
|
+
<div className={styles.columnHeader}>
|
|
97
|
+
<Typography as="h4" variant="title-s">
|
|
98
|
+
{folder.title}
|
|
99
|
+
</Typography>
|
|
100
|
+
<Badge.Root>{inFolder(folder.id).length}</Badge.Root>
|
|
101
|
+
</div>
|
|
102
|
+
{inFolder(folder.id).map((doc) => (
|
|
103
|
+
<div key={doc.id} className={styles.ticket}>
|
|
104
|
+
<Typography as="span" variant="body-m">
|
|
105
|
+
{doc.title}
|
|
106
|
+
</Typography>
|
|
107
|
+
</div>
|
|
108
|
+
))}
|
|
109
|
+
</Dnd.DropZone>
|
|
110
|
+
))}
|
|
111
|
+
</div>
|
|
79
112
|
</div>
|
|
80
113
|
</Dnd.Root>
|
|
81
114
|
);
|
|
@@ -48,6 +48,19 @@
|
|
|
48
48
|
background: var(--prime-color-fill-muted);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
/* drop-zones.tsx: the drag status line above the board. */
|
|
52
|
+
.stage {
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: column;
|
|
55
|
+
gap: var(--prime-space-3);
|
|
56
|
+
width: 100%;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* A status badge keeps its own width inside a ticket. */
|
|
60
|
+
.badge {
|
|
61
|
+
align-self: flex-start;
|
|
62
|
+
}
|
|
63
|
+
|
|
51
64
|
.columnHeader {
|
|
52
65
|
display: flex;
|
|
53
66
|
align-items: center;
|
|
@@ -94,6 +107,43 @@
|
|
|
94
107
|
text-align: center;
|
|
95
108
|
}
|
|
96
109
|
|
|
110
|
+
/* table.tsx: a plain table whose bodies are sortable lists; rows sit on faint dividers. */
|
|
111
|
+
.table {
|
|
112
|
+
width: 100%;
|
|
113
|
+
max-width: calc(var(--prime-space-24) * 6);
|
|
114
|
+
border-collapse: collapse;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.caption {
|
|
118
|
+
padding-block-end: var(--prime-space-3);
|
|
119
|
+
text-align: start;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.cell,
|
|
123
|
+
.numeric,
|
|
124
|
+
.grip,
|
|
125
|
+
.groupCell {
|
|
126
|
+
padding: var(--prime-space-2) var(--prime-space-3);
|
|
127
|
+
border-block-end: var(--prime-border-width) solid var(--prime-color-border-subtle);
|
|
128
|
+
text-align: start;
|
|
129
|
+
vertical-align: middle;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.numeric {
|
|
133
|
+
text-align: end;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.grip {
|
|
137
|
+
inline-size: var(--prime-space-10);
|
|
138
|
+
padding-inline-end: 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* A stage's heading row: a fill marks where a new stage starts. */
|
|
142
|
+
.groupCell {
|
|
143
|
+
padding-block-start: var(--prime-space-4);
|
|
144
|
+
background: var(--prime-color-fill-muted);
|
|
145
|
+
}
|
|
146
|
+
|
|
97
147
|
/* 320 px strip; the padding keeps room for the focus ring of the first and last tag. */
|
|
98
148
|
.strip {
|
|
99
149
|
width: min(100%, calc(var(--prime-space-20) * 4));
|