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,113 @@
|
|
|
1
|
+
/** 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`. */
|
|
2
|
+
import { Dnd, moveBefore, Typography, VisuallyHidden } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
import styles from "./examples.module.css";
|
|
6
|
+
|
|
7
|
+
type Line = { id: string; title: string; hours: number };
|
|
8
|
+
type Stage = { id: string; title: string; lines: Line[] };
|
|
9
|
+
|
|
10
|
+
const ESTIMATE: Stage[] = [
|
|
11
|
+
{
|
|
12
|
+
id: "analysis",
|
|
13
|
+
title: "Обследование",
|
|
14
|
+
lines: [
|
|
15
|
+
{ id: "interviews", title: "Интервью с отделом продаж", hours: 12 },
|
|
16
|
+
{ id: "processes", title: "Описание процессов", hours: 20 },
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "setup",
|
|
21
|
+
title: "Настройка",
|
|
22
|
+
lines: [
|
|
23
|
+
{ id: "roles", title: "Роли и права доступа", hours: 8 },
|
|
24
|
+
{ id: "import", title: "Перенос клиентской базы", hours: 16 },
|
|
25
|
+
{ id: "training", title: "Обучение менеджеров", hours: 6 },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
/** Moves line `id` in front of `beforeId` (`null` — last) in stage `to`, from whichever stage holds it. */
|
|
31
|
+
const moveLine = (stages: Stage[], id: string, beforeId: string | null, to: string) => {
|
|
32
|
+
const line = stages.flatMap((stage) => stage.lines).find((item) => item.id === id);
|
|
33
|
+
if (!line) return stages;
|
|
34
|
+
return stages.map((stage) => {
|
|
35
|
+
const rest = stage.lines.filter((item) => item.id !== id);
|
|
36
|
+
if (stage.id !== to) return { ...stage, lines: rest };
|
|
37
|
+
return { ...stage, lines: moveBefore([...rest, line], id, beforeId, (item) => item.id) };
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default function DndTableExample() {
|
|
42
|
+
const [stages, setStages] = React.useState(ESTIMATE);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<Dnd.Root>
|
|
46
|
+
<table className={styles.table}>
|
|
47
|
+
<caption className={styles.caption}>
|
|
48
|
+
<Typography as="span" variant="title-s">
|
|
49
|
+
Смета внедрения CRM
|
|
50
|
+
</Typography>
|
|
51
|
+
</caption>
|
|
52
|
+
<thead>
|
|
53
|
+
<tr>
|
|
54
|
+
<th scope="col" className={styles.grip}>
|
|
55
|
+
<VisuallyHidden>Порядок</VisuallyHidden>
|
|
56
|
+
</th>
|
|
57
|
+
<th scope="col" className={styles.cell}>
|
|
58
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
59
|
+
Работа
|
|
60
|
+
</Typography>
|
|
61
|
+
</th>
|
|
62
|
+
<th scope="col" className={styles.numeric}>
|
|
63
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
64
|
+
Часы
|
|
65
|
+
</Typography>
|
|
66
|
+
</th>
|
|
67
|
+
</tr>
|
|
68
|
+
</thead>
|
|
69
|
+
{stages.map((stage) => (
|
|
70
|
+
<Dnd.Sortable
|
|
71
|
+
key={stage.id}
|
|
72
|
+
as="tbody"
|
|
73
|
+
kind="estimate-line"
|
|
74
|
+
handle
|
|
75
|
+
aria-label={stage.title}
|
|
76
|
+
items={stage.lines}
|
|
77
|
+
getId={(line) => line.id}
|
|
78
|
+
getLabel={(line) => line.title}
|
|
79
|
+
onReorder={(id, beforeId) =>
|
|
80
|
+
setStages((current) => moveLine(current, id, beforeId, stage.id))
|
|
81
|
+
}
|
|
82
|
+
header={
|
|
83
|
+
<tr>
|
|
84
|
+
<th scope="colgroup" colSpan={3} className={styles.groupCell}>
|
|
85
|
+
<Typography as="span" variant="body-m">
|
|
86
|
+
{stage.title}
|
|
87
|
+
</Typography>
|
|
88
|
+
</th>
|
|
89
|
+
</tr>
|
|
90
|
+
}
|
|
91
|
+
renderItem={(line) => (
|
|
92
|
+
<Dnd.SortableItem id={line.id}>
|
|
93
|
+
<td className={styles.grip}>
|
|
94
|
+
<Dnd.Handle />
|
|
95
|
+
</td>
|
|
96
|
+
<td className={styles.cell}>
|
|
97
|
+
<Typography as="span" variant="body-m">
|
|
98
|
+
{line.title}
|
|
99
|
+
</Typography>
|
|
100
|
+
</td>
|
|
101
|
+
<td className={styles.numeric}>
|
|
102
|
+
<Typography as="span" variant="body-m">
|
|
103
|
+
{line.hours}
|
|
104
|
+
</Typography>
|
|
105
|
+
</td>
|
|
106
|
+
</Dnd.SortableItem>
|
|
107
|
+
)}
|
|
108
|
+
/>
|
|
109
|
+
))}
|
|
110
|
+
</table>
|
|
111
|
+
</Dnd.Root>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
@@ -212,6 +212,7 @@ Motion: the scrim fades, the panel slides from its side over `slow` and leaves o
|
|
|
212
212
|
| [dismiss.tsx](examples/dismiss.tsx) | An import closes only from its buttons, and not at all while it runs — `closeOnOutsideClick`, `closeOnEscape`. |
|
|
213
213
|
| [controlled-open.tsx](examples/controlled-open.tsx) | The parent owns the state and opens the drawer from a link, without a trigger — `open`, `onOpenChange`. |
|
|
214
214
|
| [in-form.tsx](examples/in-form.tsx) | A settings form in the panel: the footer button submits the form and an empty name shakes the field and keeps it open until it is filled — `Drawer.Body`, `Drawer.Footer`, `error`. |
|
|
215
|
+
| [screen.tsx](examples/screen.tsx) | A create form in a Drawer opened from the primary action in the app header: grouped fields, errors on submit with focus on the first invalid field, a loading submit, a toast and the new row in the list — `Drawer.Trigger`, `Drawer.Guard`. |
|
|
215
216
|
|
|
216
217
|
## Mistakes
|
|
217
218
|
- A drawer without `Drawer.Footer` → add one: «Закрыть» for details, «Отмена» + the submit button for a form. The header × alone is not the end of the panel.
|
|
@@ -19,7 +19,7 @@ export default function DrawerDismissExample() {
|
|
|
19
19
|
open={open}
|
|
20
20
|
onOpenChange={setOpen}
|
|
21
21
|
closeOnOutsideClick={false}
|
|
22
|
-
closeOnEscape={
|
|
22
|
+
closeOnEscape={false}
|
|
23
23
|
>
|
|
24
24
|
<Drawer.Trigger>
|
|
25
25
|
<Button.Root variant="soft" tone="neutral">
|
|
@@ -27,7 +27,9 @@ export default function DrawerDismissExample() {
|
|
|
27
27
|
</Button.Root>
|
|
28
28
|
</Drawer.Trigger>
|
|
29
29
|
<Drawer.Content size="s">
|
|
30
|
-
|
|
30
|
+
{/* While the import runs, the guard keeps «Отмена» in place, disabled. */}
|
|
31
|
+
<Drawer.Guard busy={importing} />
|
|
32
|
+
<Drawer.Header showClose={false}>
|
|
31
33
|
<Drawer.Title>Импорт товаров</Drawer.Title>
|
|
32
34
|
<Drawer.Description>catalog-october.xlsx · 1 240 строк</Drawer.Description>
|
|
33
35
|
</Drawer.Header>
|
|
@@ -41,7 +43,7 @@ export default function DrawerDismissExample() {
|
|
|
41
43
|
</Drawer.Body>
|
|
42
44
|
<Drawer.Footer>
|
|
43
45
|
<Drawer.Close>
|
|
44
|
-
<Button.Root variant="outline" tone="neutral"
|
|
46
|
+
<Button.Root variant="outline" tone="neutral">
|
|
45
47
|
Отмена
|
|
46
48
|
</Button.Root>
|
|
47
49
|
</Drawer.Close>
|
|
@@ -6,16 +6,3 @@
|
|
|
6
6
|
flex-direction: column;
|
|
7
7
|
gap: var(--prime-space-5);
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
/* overview.tsx: a term / value grid. */
|
|
11
|
-
.details {
|
|
12
|
-
display: grid;
|
|
13
|
-
grid-template-columns: auto 1fr;
|
|
14
|
-
gap: var(--prime-space-2) var(--prime-space-4);
|
|
15
|
-
margin: 0;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.details dd {
|
|
19
|
-
margin: 0;
|
|
20
|
-
font-variant-numeric: tabular-nums;
|
|
21
|
-
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
/** A record card: its status and a ⋯ menu sit in the header before the close button, one tier smaller — `Drawer.Actions`. */
|
|
2
|
-
import { Badge, Button, Drawer, Dropdown, Icon } from "prime-ui-kit";
|
|
3
|
-
|
|
4
|
-
import styles from "./examples.module.css";
|
|
2
|
+
import { Badge, Button, DescriptionList, Drawer, Dropdown, Icon } from "prime-ui-kit";
|
|
5
3
|
|
|
6
4
|
const DEAL = {
|
|
7
5
|
title: "Сделка №1042",
|
|
@@ -42,12 +40,10 @@ export default function DrawerHeaderActionsExample() {
|
|
|
42
40
|
</Drawer.Actions>
|
|
43
41
|
</Drawer.Header>
|
|
44
42
|
<Drawer.Body>
|
|
45
|
-
<
|
|
46
|
-
<
|
|
47
|
-
<
|
|
48
|
-
|
|
49
|
-
<dd>{DEAL.owner}</dd>
|
|
50
|
-
</dl>
|
|
43
|
+
<DescriptionList.Root>
|
|
44
|
+
<DescriptionList.Item label="Сумма">{DEAL.amount}</DescriptionList.Item>
|
|
45
|
+
<DescriptionList.Item label="Ответственный">{DEAL.owner}</DescriptionList.Item>
|
|
46
|
+
</DescriptionList.Root>
|
|
51
47
|
</Drawer.Body>
|
|
52
48
|
<Drawer.Footer>
|
|
53
49
|
<Drawer.Close>
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/** Order details next to the list: the three zones of every drawer — a header with a close button, a read-only body and a footer with Close and the main action — `Drawer.Trigger`, `Drawer.Body`, `Drawer.Footer`. */
|
|
2
|
-
import { Button,
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import styles from "./examples.module.css";
|
|
2
|
+
import { Button, DescriptionList, Drawer } from "prime-ui-kit";
|
|
6
3
|
|
|
7
4
|
const DETAILS = [
|
|
8
5
|
{ term: "Клиент", value: "Анна Смирнова" },
|
|
@@ -25,22 +22,13 @@ export default function DrawerOverviewExample() {
|
|
|
25
22
|
<Drawer.Description>Оформлен 3 октября</Drawer.Description>
|
|
26
23
|
</Drawer.Header>
|
|
27
24
|
<Drawer.Body>
|
|
28
|
-
<
|
|
25
|
+
<DescriptionList.Root>
|
|
29
26
|
{DETAILS.map(({ term, value }) => (
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
{term}
|
|
34
|
-
</Typography>
|
|
35
|
-
</dt>
|
|
36
|
-
<dd>
|
|
37
|
-
<Typography as="span" variant="body-m">
|
|
38
|
-
{value}
|
|
39
|
-
</Typography>
|
|
40
|
-
</dd>
|
|
41
|
-
</React.Fragment>
|
|
27
|
+
<DescriptionList.Item key={term} label={term}>
|
|
28
|
+
{value}
|
|
29
|
+
</DescriptionList.Item>
|
|
42
30
|
))}
|
|
43
|
-
</
|
|
31
|
+
</DescriptionList.Root>
|
|
44
32
|
</Drawer.Body>
|
|
45
33
|
<Drawer.Footer>
|
|
46
34
|
<Drawer.Close>
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/** A create form in a Drawer opened from the primary action in the app header: grouped fields, errors on submit with focus on the first invalid field, a loading submit, a toast and the new row in the list — `Drawer.Trigger`, `Drawer.Guard`. */
|
|
2
|
+
import {
|
|
3
|
+
AppHeader,
|
|
4
|
+
Badge,
|
|
5
|
+
Button,
|
|
6
|
+
Checkbox,
|
|
7
|
+
DataTable,
|
|
8
|
+
type DataTableColumn,
|
|
9
|
+
Drawer,
|
|
10
|
+
Fieldset,
|
|
11
|
+
Icon,
|
|
12
|
+
Input,
|
|
13
|
+
PageContent,
|
|
14
|
+
PageToolbar,
|
|
15
|
+
Radio,
|
|
16
|
+
Select,
|
|
17
|
+
SmartFilter,
|
|
18
|
+
Textarea,
|
|
19
|
+
useNotifications,
|
|
20
|
+
} from "prime-ui-kit";
|
|
21
|
+
import * as React from "react";
|
|
22
|
+
|
|
23
|
+
import styles from "./screen.module.css";
|
|
24
|
+
|
|
25
|
+
type Client = { id: string; name: string; kind: "company" | "person"; manager: string };
|
|
26
|
+
type Errors = Partial<Record<"name" | "inn" | "email", string>>;
|
|
27
|
+
|
|
28
|
+
const MANAGERS = ["Анна Климова", "Илья Петров", "Марат Хасанов"];
|
|
29
|
+
|
|
30
|
+
const CLIENTS: Client[] = [
|
|
31
|
+
{ id: "c1", name: "ООО «Северный ветер»", kind: "company", manager: "Анна Климова" },
|
|
32
|
+
{ id: "c2", name: "АО «Техностиль»", kind: "company", manager: "Илья Петров" },
|
|
33
|
+
{ id: "c3", name: "ИП Соколова М. А.", kind: "person", manager: "Анна Климова" },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const COLUMNS: DataTableColumn<Client>[] = [
|
|
37
|
+
{ id: "name", header: "Клиент", accessor: "name" },
|
|
38
|
+
{
|
|
39
|
+
id: "kind",
|
|
40
|
+
header: "Тип",
|
|
41
|
+
cell: (row) =>
|
|
42
|
+
row.kind === "company" ? (
|
|
43
|
+
<Badge.Root color="blue">Компания</Badge.Root>
|
|
44
|
+
) : (
|
|
45
|
+
<Badge.Root color="purple">ИП</Badge.Root>
|
|
46
|
+
),
|
|
47
|
+
},
|
|
48
|
+
{ id: "manager", header: "Менеджер", accessor: "manager" },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const CLIENT_WORDS = ["клиент", "клиента", "клиентов"] as const;
|
|
52
|
+
const COMPANY_WORDS = ["компания", "компании", "компаний"] as const;
|
|
53
|
+
|
|
54
|
+
/** «1 клиент», «3 клиента», «5 клиентов». */
|
|
55
|
+
const plural = (count: number, [one, few, many]: readonly [string, string, string]) => {
|
|
56
|
+
const tens = count % 100;
|
|
57
|
+
const ones = count % 10;
|
|
58
|
+
if (tens >= 11 && tens <= 14) return `${count} ${many}`;
|
|
59
|
+
if (ones === 1) return `${count} ${one}`;
|
|
60
|
+
if (ones >= 2 && ones <= 4) return `${count} ${few}`;
|
|
61
|
+
return `${count} ${many}`;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
function validate(data: FormData): Errors {
|
|
65
|
+
const errors: Errors = {};
|
|
66
|
+
const name = String(data.get("name") ?? "").trim();
|
|
67
|
+
const inn = String(data.get("inn") ?? "").replace(/\s/g, "");
|
|
68
|
+
const email = String(data.get("email") ?? "").trim();
|
|
69
|
+
if (!name) errors.name = "Введите название клиента";
|
|
70
|
+
if (!/^\d{10}(\d{2})?$/.test(inn)) errors.inn = "ИНН — 10 цифр для компании или 12 для ИП";
|
|
71
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))
|
|
72
|
+
errors.email = "Введите почту в формате name@company.ru";
|
|
73
|
+
return errors;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default function DrawerScreenExample() {
|
|
77
|
+
const { notify } = useNotifications();
|
|
78
|
+
const formId = React.useId();
|
|
79
|
+
const [clients, setClients] = React.useState(CLIENTS);
|
|
80
|
+
const [open, setOpen] = React.useState(false);
|
|
81
|
+
const [errors, setErrors] = React.useState<Errors>({});
|
|
82
|
+
const [saving, setSaving] = React.useState(false);
|
|
83
|
+
const [dirty, setDirty] = React.useState(false);
|
|
84
|
+
const [manager, setManager] = React.useState(MANAGERS[0]);
|
|
85
|
+
const [search, setSearch] = React.useState("");
|
|
86
|
+
|
|
87
|
+
// Drawer.Guard holds every way out while saving and asks before an edited form is discarded.
|
|
88
|
+
const changeOpen = (next: boolean) => {
|
|
89
|
+
setOpen(next);
|
|
90
|
+
if (!next) {
|
|
91
|
+
setErrors({});
|
|
92
|
+
setDirty(false);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const submit = (event: React.FormEvent<HTMLFormElement>) => {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
const form = event.currentTarget;
|
|
99
|
+
const data = new FormData(form);
|
|
100
|
+
const found = validate(data);
|
|
101
|
+
setErrors(found);
|
|
102
|
+
const firstInvalid = (["name", "inn", "email"] as const).find((key) => found[key]);
|
|
103
|
+
if (firstInvalid) {
|
|
104
|
+
form.querySelector<HTMLInputElement>(`[name="${firstInvalid}"]`)?.focus();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
setSaving(true);
|
|
108
|
+
window.setTimeout(() => {
|
|
109
|
+
const name = String(data.get("name")).trim();
|
|
110
|
+
setClients((list) => [
|
|
111
|
+
{
|
|
112
|
+
id: `c${list.length + 1}`,
|
|
113
|
+
name,
|
|
114
|
+
kind: data.get("kind") === "person" ? "person" : "company",
|
|
115
|
+
manager,
|
|
116
|
+
},
|
|
117
|
+
...list,
|
|
118
|
+
]);
|
|
119
|
+
setSaving(false);
|
|
120
|
+
setDirty(false);
|
|
121
|
+
setOpen(false);
|
|
122
|
+
notify({ tone: "success", title: "Клиент добавлен", description: name });
|
|
123
|
+
}, 900);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const query = search.trim().toLowerCase();
|
|
127
|
+
const shown = clients.filter((client) => client.name.toLowerCase().includes(query));
|
|
128
|
+
const people = clients.filter((client) => client.kind === "person").length;
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
<>
|
|
132
|
+
{/* The page lives in the app header: the only h1, the counts under it, search and the one
|
|
133
|
+
primary action — the Drawer trigger — in the tools row; main has no PageContent.Header. */}
|
|
134
|
+
<AppHeader.Root>
|
|
135
|
+
<AppHeader.Start>
|
|
136
|
+
<AppHeader.Title>
|
|
137
|
+
Клиенты
|
|
138
|
+
<AppHeader.Description>
|
|
139
|
+
{plural(clients.length, CLIENT_WORDS)} ·{" "}
|
|
140
|
+
{plural(clients.length - people, COMPANY_WORDS)} и {people} ИП
|
|
141
|
+
</AppHeader.Description>
|
|
142
|
+
</AppHeader.Title>
|
|
143
|
+
</AppHeader.Start>
|
|
144
|
+
<AppHeader.Tools>
|
|
145
|
+
<SmartFilter.Root fields={[]} search={search} onSearchChange={setSearch}>
|
|
146
|
+
<PageToolbar.Root aria-label="Клиенты">
|
|
147
|
+
<PageToolbar.Tools>
|
|
148
|
+
<SmartFilter.Toolbar />
|
|
149
|
+
</PageToolbar.Tools>
|
|
150
|
+
<PageToolbar.Actions>
|
|
151
|
+
<Drawer.Root open={open} onOpenChange={changeOpen}>
|
|
152
|
+
<Drawer.Trigger>
|
|
153
|
+
<Button.Root>
|
|
154
|
+
<Button.Icon>
|
|
155
|
+
<Icon name="action.add" />
|
|
156
|
+
</Button.Icon>
|
|
157
|
+
Новый клиент
|
|
158
|
+
</Button.Root>
|
|
159
|
+
</Drawer.Trigger>
|
|
160
|
+
<Drawer.Content>
|
|
161
|
+
<Drawer.Header>
|
|
162
|
+
<Drawer.Title>Новый клиент</Drawer.Title>
|
|
163
|
+
<Drawer.Description>
|
|
164
|
+
Появится в списке и в выборе клиента при выставлении счёта.
|
|
165
|
+
</Drawer.Description>
|
|
166
|
+
</Drawer.Header>
|
|
167
|
+
<Drawer.Body>
|
|
168
|
+
<Drawer.Guard busy={saving} dirty={dirty} />
|
|
169
|
+
<form
|
|
170
|
+
id={formId}
|
|
171
|
+
className={styles.form}
|
|
172
|
+
noValidate
|
|
173
|
+
onSubmit={submit}
|
|
174
|
+
onChange={() => setDirty(true)}
|
|
175
|
+
>
|
|
176
|
+
<Fieldset label="Реквизиты" disabled={saving}>
|
|
177
|
+
<Radio.Group
|
|
178
|
+
name="kind"
|
|
179
|
+
label="Тип клиента"
|
|
180
|
+
defaultValue="company"
|
|
181
|
+
orientation="horizontal"
|
|
182
|
+
>
|
|
183
|
+
<Radio.Root value="company">
|
|
184
|
+
<Radio.Label>Компания</Radio.Label>
|
|
185
|
+
</Radio.Root>
|
|
186
|
+
<Radio.Root value="person">
|
|
187
|
+
<Radio.Label>ИП</Radio.Label>
|
|
188
|
+
</Radio.Root>
|
|
189
|
+
</Radio.Group>
|
|
190
|
+
<Input.Root label="Название" error={errors.name}>
|
|
191
|
+
<Input.Wrapper>
|
|
192
|
+
<Input.Field
|
|
193
|
+
name="name"
|
|
194
|
+
placeholder="ООО «Ромашка»"
|
|
195
|
+
autoComplete="organization"
|
|
196
|
+
/>
|
|
197
|
+
</Input.Wrapper>
|
|
198
|
+
</Input.Root>
|
|
199
|
+
<div className={styles.pair}>
|
|
200
|
+
<Input.Root label="ИНН" error={errors.inn} reserveSupportRow>
|
|
201
|
+
<Input.Wrapper>
|
|
202
|
+
<Input.Field
|
|
203
|
+
name="inn"
|
|
204
|
+
inputMode="numeric"
|
|
205
|
+
placeholder="7704512908"
|
|
206
|
+
/>
|
|
207
|
+
</Input.Wrapper>
|
|
208
|
+
</Input.Root>
|
|
209
|
+
<Input.Root label="КПП" optional reserveSupportRow>
|
|
210
|
+
<Input.Wrapper>
|
|
211
|
+
<Input.Field
|
|
212
|
+
name="kpp"
|
|
213
|
+
inputMode="numeric"
|
|
214
|
+
placeholder="770401001"
|
|
215
|
+
/>
|
|
216
|
+
</Input.Wrapper>
|
|
217
|
+
</Input.Root>
|
|
218
|
+
</div>
|
|
219
|
+
</Fieldset>
|
|
220
|
+
<Fieldset label="Контакты" disabled={saving}>
|
|
221
|
+
<Input.Root
|
|
222
|
+
label="Почта для счетов"
|
|
223
|
+
error={errors.email}
|
|
224
|
+
hint="На неё уйдут счета и акты"
|
|
225
|
+
>
|
|
226
|
+
<Input.Wrapper>
|
|
227
|
+
<Input.Icon side="start">
|
|
228
|
+
<Icon name="field.email" />
|
|
229
|
+
</Input.Icon>
|
|
230
|
+
<Input.Field
|
|
231
|
+
name="email"
|
|
232
|
+
type="email"
|
|
233
|
+
placeholder="billing@company.ru"
|
|
234
|
+
/>
|
|
235
|
+
</Input.Wrapper>
|
|
236
|
+
</Input.Root>
|
|
237
|
+
<Select.Root
|
|
238
|
+
label="Менеджер"
|
|
239
|
+
value={manager}
|
|
240
|
+
onValueChange={(next) => {
|
|
241
|
+
setManager(next);
|
|
242
|
+
setDirty(true);
|
|
243
|
+
}}
|
|
244
|
+
>
|
|
245
|
+
<Select.Trigger>
|
|
246
|
+
<Select.Value />
|
|
247
|
+
</Select.Trigger>
|
|
248
|
+
<Select.Content>
|
|
249
|
+
{MANAGERS.map((name) => (
|
|
250
|
+
<Select.Item key={name} value={name}>
|
|
251
|
+
{name}
|
|
252
|
+
</Select.Item>
|
|
253
|
+
))}
|
|
254
|
+
</Select.Content>
|
|
255
|
+
</Select.Root>
|
|
256
|
+
<Textarea.Root name="note" label="Комментарий" optional rows={2} />
|
|
257
|
+
<Checkbox.Root
|
|
258
|
+
name="invite"
|
|
259
|
+
defaultChecked
|
|
260
|
+
hint="Клиент увидит свои счета и акты онлайн"
|
|
261
|
+
>
|
|
262
|
+
<Checkbox.Label>Пригласить в личный кабинет</Checkbox.Label>
|
|
263
|
+
</Checkbox.Root>
|
|
264
|
+
</Fieldset>
|
|
265
|
+
</form>
|
|
266
|
+
</Drawer.Body>
|
|
267
|
+
<Drawer.Footer>
|
|
268
|
+
<Drawer.Close>
|
|
269
|
+
<Button.Root variant="outline" tone="neutral">
|
|
270
|
+
Отмена
|
|
271
|
+
</Button.Root>
|
|
272
|
+
</Drawer.Close>
|
|
273
|
+
<Button.Root type="submit" form={formId} loading={saving}>
|
|
274
|
+
Добавить клиента
|
|
275
|
+
</Button.Root>
|
|
276
|
+
</Drawer.Footer>
|
|
277
|
+
</Drawer.Content>
|
|
278
|
+
</Drawer.Root>
|
|
279
|
+
</PageToolbar.Actions>
|
|
280
|
+
</PageToolbar.Root>
|
|
281
|
+
</SmartFilter.Root>
|
|
282
|
+
</AppHeader.Tools>
|
|
283
|
+
</AppHeader.Root>
|
|
284
|
+
|
|
285
|
+
<PageContent.Root>
|
|
286
|
+
<PageContent.Body>
|
|
287
|
+
<DataTable
|
|
288
|
+
columns={COLUMNS}
|
|
289
|
+
rows={shown}
|
|
290
|
+
getRowKey={(row) => row.id}
|
|
291
|
+
paging="none"
|
|
292
|
+
empty="Клиентов не найдено"
|
|
293
|
+
/>
|
|
294
|
+
</PageContent.Body>
|
|
295
|
+
</PageContent.Root>
|
|
296
|
+
</>
|
|
297
|
+
);
|
|
298
|
+
}
|
|
@@ -8,15 +8,11 @@
|
|
|
8
8
|
max-width: calc(var(--prime-space-24) * 3);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
/* overview.tsx:
|
|
11
|
+
/* overview.tsx: the record on the left, its actions button at the end. */
|
|
12
12
|
.row {
|
|
13
13
|
display: flex;
|
|
14
14
|
align-items: center;
|
|
15
15
|
justify-content: space-between;
|
|
16
16
|
gap: var(--prime-space-4);
|
|
17
17
|
width: min(100%, calc(var(--prime-space-24) * 4));
|
|
18
|
-
padding-block: var(--prime-space-1);
|
|
19
|
-
padding-inline: var(--prime-space-4) var(--prime-space-1);
|
|
20
|
-
border-radius: var(--prime-radius-l);
|
|
21
|
-
background: var(--prime-color-layer-nested);
|
|
22
18
|
}
|
|
@@ -148,7 +148,7 @@ EmptyPage.Root centered column; size, layout, tone (role="alert" w
|
|
|
148
148
|
| [variants.tsx](examples/variants.tsx) | The tone tells why the area is empty: no data yet, a first run, or a failed load with a retry — `tone`, `EmptyPage.RetryButton`. |
|
|
149
149
|
| [sizes.tsx](examples/sizes.tsx) | Every tier changes the icon tile, the title and the padding; buttons in Actions take the same size — `size`. |
|
|
150
150
|
| [data-region.tsx](examples/data-region.tsx) | An empty data region: the empty state stretches over the rest of a card with a header — `layout`. |
|
|
151
|
-
| [region-error.tsx](examples/region-error.tsx) | A data region that failed to load: the error state takes the region, the retry shows its loading until the data cross-fades in — `tone`, `layout`, `EmptyPage.RetryButton`, `onRetry`. |
|
|
151
|
+
| [region-error.tsx](examples/region-error.tsx) | A data region that failed to load: the error state takes the region, the retry shows its loading until the data cross-fades in; its text comes from labels — `tone`, `layout`, `EmptyPage.RetryButton`, `onRetry`, `labels`. |
|
|
152
152
|
| [compact.tsx](examples/compact.tsx) | The quiet empty state of a search panel: no entrance motion, smaller text, a paragraph title, one action — `layout`, `as`. |
|
|
153
153
|
| [narrow.tsx](examples/narrow.tsx) | In a 320 px side panel the text wraps under the tile and the actions wrap to a second line. |
|
|
154
154
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A data region that failed to load: the error state takes the region, the retry shows its loading until the data cross-fades in — `tone`, `layout`, `EmptyPage.RetryButton`, `onRetry`. */
|
|
1
|
+
/** A data region that failed to load: the error state takes the region, the retry shows its loading until the data cross-fades in; its text comes from labels — `tone`, `layout`, `EmptyPage.RetryButton`, `onRetry`, `labels`. */
|
|
2
2
|
import { Button, Card, Crossfade, EmptyPage, Icon, Skeleton, Typography } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
@@ -53,7 +53,13 @@ export default function EmptyPageRegionErrorExample() {
|
|
|
53
53
|
{state === "loading" ? (
|
|
54
54
|
<Skeleton lines={3} />
|
|
55
55
|
) : state === "error" ? (
|
|
56
|
-
<EmptyPage.Root
|
|
56
|
+
<EmptyPage.Root
|
|
57
|
+
layout="fill"
|
|
58
|
+
size="s"
|
|
59
|
+
tone="danger"
|
|
60
|
+
labels={{ retry: "Загрузить снова" }}
|
|
61
|
+
aria-labelledby="invoices-error"
|
|
62
|
+
>
|
|
57
63
|
<EmptyPage.Icon>
|
|
58
64
|
<Icon name="status.offline" />
|
|
59
65
|
</EmptyPage.Icon>
|
|
@@ -59,7 +59,7 @@ ExampleFrame frame: toolbar + preview stage or code pane
|
|
|
59
59
|
| `stack-narrow` | column, children capped at `7 × --prime-space-16` and centered | forms and narrow columns | |
|
|
60
60
|
| `full` | column, gap 16, every child takes the whole stage width | page structure: app shells, page regions | |
|
|
61
61
|
| `row` | centered wrapping row, gap 12, extra vertical padding | a few buttons or controls side by side | |
|
|
62
|
-
| `matrix` | centered grid of labelled cells: each direct child is a row, its children are cells (specimen above its caption); columns (up to 12) line up across rows, are never narrower than their content and grow to 320 / 160 / 128px for 1 / 2 / 3+ columns, so width-less specimens (Slider, `width: 100%` blocks) get a real cell;
|
|
62
|
+
| `matrix` | centered grid of labelled cells: each direct child is a row, its children are cells (specimen above its caption); columns (up to 12) line up across rows, are never narrower than their content and grow to 320 / 160 / 128px for 1 / 2 / 3+ columns, so width-less specimens (Slider, `width: 100%` blocks) get a real cell; centered vertically too; when the grid is wider than the stage (a phone frame) each row wraps its cells, centered (`data-matrix-wrap` on the stage) | variant, size and state matrices | |
|
|
63
63
|
|
|
64
64
|
### viewport
|
|
65
65
|
| Value | Looks like | Use when | Default |
|
|
@@ -87,7 +87,7 @@ Frame look: the chrome is a layer of the surface ladder (`data-depth`, one above
|
|
|
87
87
|
|
|
88
88
|
## Layout & spacing
|
|
89
89
|
- The frame is `max-width: 100%`; long code lines scroll inside the code pane instead of widening the page. The code pane is at most `min(512px, 70vh)` high and scrolls both ways.
|
|
90
|
-
- The stage is at least 160 high with `--prime-space-6` / `--prime-space-4` padding; content wider than it is clipped (`matrix`
|
|
90
|
+
- The stage is at least 160 high with `--prime-space-6` / `--prime-space-4` padding; content wider than it is clipped (`matrix` wraps its rows instead).
|
|
91
91
|
- The toolbar wraps below 40rem of frame width; below 25rem the visible device labels are hidden (icons stay, each option keeps a screen-reader name).
|
|
92
92
|
- The device width switches at once: `max-width` is layout, so it does not animate.
|
|
93
93
|
- Stack frames one per demo block; spacing between blocks comes from the page.
|
|
@@ -128,6 +128,7 @@ Frame look: the chrome is a layer of the surface ladder (`data-depth`, one above
|
|
|
128
128
|
| Example | Shows |
|
|
129
129
|
|---|---|
|
|
130
130
|
| [overview.tsx](examples/overview.tsx) | A live example next to its source, with the pane, width, theme and copy controls — `code`, `previewLayout`. |
|
|
131
|
+
| [initial-view.tsx](examples/initial-view.tsx) | A matrix frame that opens at phone width in the dark theme with no theme switch and counts code copies — `previewLayout`, `defaultViewport`, `defaultColorScheme`, `showThemeToggle`, `onCopy`. |
|
|
131
132
|
| [controlled.tsx](examples/controlled.tsx) | Frames of one page share the preview width and theme: the parent owns both — `viewport`, `colorScheme`. |
|
|
132
133
|
|
|
133
134
|
## Mistakes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** A matrix frame that opens at phone width in the dark theme with no theme switch and counts code copies — `previewLayout`, `defaultViewport`, `defaultColorScheme`, `showThemeToggle`, `onCopy`. */
|
|
2
|
+
import { Badge, ExampleFrame, Typography } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
const STATUSES = [
|
|
6
|
+
{ color: "gray", label: "Черновик" },
|
|
7
|
+
{ color: "blue", label: "На ревью" },
|
|
8
|
+
{ color: "green", label: "Опубликован" },
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
const CODE = STATUSES.map(
|
|
12
|
+
({ color, label }) => `<Badge.Root color="${color}">${label}</Badge.Root>`,
|
|
13
|
+
).join("\n");
|
|
14
|
+
|
|
15
|
+
export default function ExampleFrameInitialViewExample() {
|
|
16
|
+
const [copies, setCopies] = React.useState(0);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
<ExampleFrame
|
|
21
|
+
code={CODE}
|
|
22
|
+
previewLayout="matrix"
|
|
23
|
+
defaultViewport="mobile"
|
|
24
|
+
defaultColorScheme="dark"
|
|
25
|
+
showThemeToggle={false}
|
|
26
|
+
onCopy={() => setCopies((count) => count + 1)}
|
|
27
|
+
>
|
|
28
|
+
<div>
|
|
29
|
+
{STATUSES.map(({ color, label }) => (
|
|
30
|
+
<div key={color}>
|
|
31
|
+
<Badge.Root color={color}>{label}</Badge.Root>
|
|
32
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
33
|
+
{color}
|
|
34
|
+
</Typography>
|
|
35
|
+
</div>
|
|
36
|
+
))}
|
|
37
|
+
</div>
|
|
38
|
+
</ExampleFrame>
|
|
39
|
+
<Typography variant="body-s" tone="secondary">
|
|
40
|
+
Код скопирован: {copies}
|
|
41
|
+
</Typography>
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
}
|