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,68 @@
|
|
|
1
|
+
/** The invoice lines in a 320 px column: the headings give way, each row stacks its fields with their own labels and rows stand a group apart — `columns`. */
|
|
2
|
+
import { FieldList, type FieldListColumn, Input } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
import styles from "./examples.module.css";
|
|
6
|
+
|
|
7
|
+
type Line = { id: string; service: string; quantity: string; price: string };
|
|
8
|
+
|
|
9
|
+
const COLUMNS: FieldListColumn[] = [
|
|
10
|
+
{ label: "Услуга" },
|
|
11
|
+
{ label: "Кол-во", width: "s" },
|
|
12
|
+
{ label: "Цена", width: "m" },
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const LINES: Line[] = [
|
|
16
|
+
{ id: "setup", service: "Внедрение CRM", quantity: "1", price: "180 000" },
|
|
17
|
+
{ id: "training", service: "Обучение менеджеров", quantity: "3", price: "15 000" },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
export default function FieldListNarrowExample() {
|
|
21
|
+
const [lines, setLines] = React.useState(LINES);
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div className={styles.narrow}>
|
|
25
|
+
<FieldList
|
|
26
|
+
label="Позиции счёта"
|
|
27
|
+
columns={COLUMNS}
|
|
28
|
+
value={lines}
|
|
29
|
+
onValueChange={setLines}
|
|
30
|
+
getId={(line) => line.id}
|
|
31
|
+
getLabel={(line) => line.service}
|
|
32
|
+
createItem={() => ({ id: crypto.randomUUID(), service: "", quantity: "1", price: "" })}
|
|
33
|
+
addLabel="Добавить позицию"
|
|
34
|
+
renderItem={(line, row) => (
|
|
35
|
+
<>
|
|
36
|
+
<Input.Root>
|
|
37
|
+
<Input.Wrapper>
|
|
38
|
+
<Input.Field
|
|
39
|
+
value={line.service}
|
|
40
|
+
onChange={(event) => row.update({ service: event.target.value })}
|
|
41
|
+
/>
|
|
42
|
+
</Input.Wrapper>
|
|
43
|
+
</Input.Root>
|
|
44
|
+
<Input.Root>
|
|
45
|
+
<Input.Wrapper>
|
|
46
|
+
<Input.Field
|
|
47
|
+
value={line.quantity}
|
|
48
|
+
inputMode="numeric"
|
|
49
|
+
onChange={(event) => row.update({ quantity: event.target.value })}
|
|
50
|
+
/>
|
|
51
|
+
</Input.Wrapper>
|
|
52
|
+
</Input.Root>
|
|
53
|
+
<Input.Root>
|
|
54
|
+
<Input.Wrapper>
|
|
55
|
+
<Input.Field
|
|
56
|
+
value={line.price}
|
|
57
|
+
inputMode="decimal"
|
|
58
|
+
onChange={(event) => row.update({ price: event.target.value })}
|
|
59
|
+
/>
|
|
60
|
+
<Input.InlineAffix side="end">₽</Input.InlineAffix>
|
|
61
|
+
</Input.Wrapper>
|
|
62
|
+
</Input.Root>
|
|
63
|
+
</>
|
|
64
|
+
)}
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Lines of an invoice: the column headings stand once above the rows, each row has a remove button and the add button sits under them — `columns`, `renderItem`, `createItem`, `addLabel`. */
|
|
2
|
+
import { FieldList, type FieldListColumn, Input } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
type Line = { id: string; service: string; quantity: string; price: string };
|
|
6
|
+
|
|
7
|
+
const COLUMNS: FieldListColumn[] = [
|
|
8
|
+
{ label: "Услуга" },
|
|
9
|
+
{ label: "Кол-во", width: "s" },
|
|
10
|
+
{ label: "Цена", width: "m" },
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
const LINES: Line[] = [
|
|
14
|
+
{ id: "setup", service: "Внедрение CRM", quantity: "1", price: "180 000" },
|
|
15
|
+
{ id: "training", service: "Обучение менеджеров", quantity: "3", price: "15 000" },
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export default function FieldListOverviewExample() {
|
|
19
|
+
const [lines, setLines] = React.useState(LINES);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<FieldList
|
|
23
|
+
label="Позиции счёта"
|
|
24
|
+
columns={COLUMNS}
|
|
25
|
+
value={lines}
|
|
26
|
+
onValueChange={setLines}
|
|
27
|
+
getId={(line) => line.id}
|
|
28
|
+
getLabel={(line) => line.service}
|
|
29
|
+
createItem={() => ({ id: crypto.randomUUID(), service: "", quantity: "1", price: "" })}
|
|
30
|
+
addLabel="Добавить позицию"
|
|
31
|
+
renderItem={(line, row) => (
|
|
32
|
+
<>
|
|
33
|
+
<Input.Root>
|
|
34
|
+
<Input.Wrapper>
|
|
35
|
+
<Input.Field
|
|
36
|
+
value={line.service}
|
|
37
|
+
placeholder="Поддержка, 1 месяц"
|
|
38
|
+
onChange={(event) => row.update({ service: event.target.value })}
|
|
39
|
+
/>
|
|
40
|
+
</Input.Wrapper>
|
|
41
|
+
</Input.Root>
|
|
42
|
+
<Input.Root>
|
|
43
|
+
<Input.Wrapper>
|
|
44
|
+
<Input.Field
|
|
45
|
+
value={line.quantity}
|
|
46
|
+
inputMode="numeric"
|
|
47
|
+
onChange={(event) => row.update({ quantity: event.target.value })}
|
|
48
|
+
/>
|
|
49
|
+
</Input.Wrapper>
|
|
50
|
+
</Input.Root>
|
|
51
|
+
<Input.Root>
|
|
52
|
+
<Input.Wrapper>
|
|
53
|
+
<Input.Field
|
|
54
|
+
value={line.price}
|
|
55
|
+
inputMode="decimal"
|
|
56
|
+
placeholder="0"
|
|
57
|
+
onChange={(event) => row.update({ price: event.target.value })}
|
|
58
|
+
/>
|
|
59
|
+
<Input.InlineAffix side="end">₽</Input.InlineAffix>
|
|
60
|
+
</Input.Wrapper>
|
|
61
|
+
</Input.Root>
|
|
62
|
+
</>
|
|
63
|
+
)}
|
|
64
|
+
/>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Selling points of a plan in the order of the pricing page: a one-column list has no headings and no numbers, a point moves by its handle or Alt+arrows — `reorderable`, `getLabel`. */
|
|
2
|
+
import { FieldList, type FieldListColumn, Input } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
type Point = { id: string; text: string };
|
|
6
|
+
|
|
7
|
+
const COLUMNS: FieldListColumn[] = [{ label: "Преимущество" }];
|
|
8
|
+
|
|
9
|
+
const POINTS: Point[] = [
|
|
10
|
+
{ id: "users", text: "До 50 сотрудников в одном пространстве" },
|
|
11
|
+
{ id: "storage", text: "200 ГБ для документов и вложений" },
|
|
12
|
+
{ id: "support", text: "Поддержка в рабочие часы, ответ за 2 часа" },
|
|
13
|
+
{ id: "api", text: "Доступ к API и вебхукам" },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export default function FieldListReorderExample() {
|
|
17
|
+
const [points, setPoints] = React.useState(POINTS);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<FieldList
|
|
21
|
+
label="Преимущества тарифа"
|
|
22
|
+
columns={COLUMNS}
|
|
23
|
+
reorderable
|
|
24
|
+
value={points}
|
|
25
|
+
onValueChange={setPoints}
|
|
26
|
+
getId={(point) => point.id}
|
|
27
|
+
getLabel={(point) => point.text}
|
|
28
|
+
createItem={() => ({ id: crypto.randomUUID(), text: "" })}
|
|
29
|
+
addLabel="Добавить преимущество"
|
|
30
|
+
renderItem={(point, row) => (
|
|
31
|
+
<Input.Root>
|
|
32
|
+
<Input.Wrapper>
|
|
33
|
+
<Input.Field
|
|
34
|
+
value={point.text}
|
|
35
|
+
onChange={(event) => row.update({ text: event.target.value })}
|
|
36
|
+
/>
|
|
37
|
+
</Input.Wrapper>
|
|
38
|
+
</Input.Root>
|
|
39
|
+
)}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* Record editor: the sections are PageContent.Section layout="aside"; here only the panels' insides. */
|
|
2
|
+
|
|
3
|
+
/* Two groups in one panel, a group apart. */
|
|
4
|
+
.groups {
|
|
5
|
+
display: grid;
|
|
6
|
+
gap: var(--prime-space-8);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* One value in three currencies: one row while there is room, the unit inside each field. */
|
|
10
|
+
.currencies {
|
|
11
|
+
display: grid;
|
|
12
|
+
grid-template-columns: repeat(
|
|
13
|
+
auto-fit,
|
|
14
|
+
minmax(min(100%, calc(var(--prime-space-24) + var(--prime-space-8))), 1fr)
|
|
15
|
+
);
|
|
16
|
+
align-items: start;
|
|
17
|
+
gap: var(--prime-space-3);
|
|
18
|
+
}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/** A record editor as a document page, a long form whose title, description and save stand in the content header: a plan's name, its specs and prices in one form; repeating records as FieldList rows with the headings once, a base price pinned above its changes, one value in three currencies in one row — `getLocked`, `compact`. */
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Card,
|
|
5
|
+
ColorPresets,
|
|
6
|
+
FieldList,
|
|
7
|
+
type FieldListColumn,
|
|
8
|
+
Fieldset,
|
|
9
|
+
Icon,
|
|
10
|
+
type IconName,
|
|
11
|
+
Input,
|
|
12
|
+
PageContent,
|
|
13
|
+
Select,
|
|
14
|
+
Textarea,
|
|
15
|
+
} from "prime-ui-kit";
|
|
16
|
+
import * as React from "react";
|
|
17
|
+
|
|
18
|
+
import styles from "./screen.module.css";
|
|
19
|
+
|
|
20
|
+
type Spec = {
|
|
21
|
+
id: string;
|
|
22
|
+
icon: IconName;
|
|
23
|
+
name: string;
|
|
24
|
+
value: string;
|
|
25
|
+
color: string;
|
|
26
|
+
pinned?: boolean;
|
|
27
|
+
};
|
|
28
|
+
type Period = { id: string; from: string; price: string; base?: boolean };
|
|
29
|
+
|
|
30
|
+
const SPEC_COLUMNS: FieldListColumn[] = [
|
|
31
|
+
{ label: "Иконка", width: "compact" },
|
|
32
|
+
{ label: "Параметр" },
|
|
33
|
+
{ label: "Значение" },
|
|
34
|
+
{ label: "Цвет", width: "compact" },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const SPEC_ICONS: { name: IconName; label: string }[] = [
|
|
38
|
+
{ name: "object.users", label: "Сотрудники" },
|
|
39
|
+
{ name: "object.storage", label: "Хранилище" },
|
|
40
|
+
{ name: "object.headset", label: "Поддержка" },
|
|
41
|
+
{ name: "object.chart", label: "Отчёты" },
|
|
42
|
+
{ name: "object.key", label: "Доступ" },
|
|
43
|
+
{ name: "object.globe", label: "Интеграции" },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const SPECS: Spec[] = [
|
|
47
|
+
{
|
|
48
|
+
id: "seats",
|
|
49
|
+
icon: "object.users",
|
|
50
|
+
name: "Сотрудники",
|
|
51
|
+
value: "до 50",
|
|
52
|
+
color: "#5068f5",
|
|
53
|
+
pinned: true,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "storage",
|
|
57
|
+
icon: "object.storage",
|
|
58
|
+
name: "Хранилище",
|
|
59
|
+
value: "200 ГБ",
|
|
60
|
+
color: "#22c55e",
|
|
61
|
+
pinned: true,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "support",
|
|
65
|
+
icon: "object.headset",
|
|
66
|
+
name: "Поддержка",
|
|
67
|
+
value: "8/5, ответ за 2 часа",
|
|
68
|
+
color: "#f97316",
|
|
69
|
+
pinned: true,
|
|
70
|
+
},
|
|
71
|
+
{ id: "reports", icon: "object.chart", name: "Отчёты", value: "12 шаблонов", color: "#a855f7" },
|
|
72
|
+
{ id: "sso", icon: "object.key", name: "Вход через SSO", value: "SAML, OIDC", color: "#14b8a6" },
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
const PRICE_COLUMNS: FieldListColumn[] = [{ label: "Действует" }, { label: "Цена", width: "m" }];
|
|
76
|
+
|
|
77
|
+
const MONTHS = [
|
|
78
|
+
{ value: "01", label: "С 1 января" },
|
|
79
|
+
{ value: "04", label: "С 1 апреля" },
|
|
80
|
+
{ value: "07", label: "С 1 июля" },
|
|
81
|
+
{ value: "10", label: "С 1 октября" },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
const PERIODS: Period[] = [
|
|
85
|
+
{ id: "base", from: "", price: "4 900", base: true },
|
|
86
|
+
{ id: "autumn", from: "10", price: "5 400" },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const SETUP_FEE = [
|
|
90
|
+
{ currency: "₽", name: "setupRub", label: "Подключение в рублях", value: "15 000" },
|
|
91
|
+
{ currency: "$", name: "setupUsd", label: "Подключение в долларах", value: "170" },
|
|
92
|
+
{ currency: "€", name: "setupEur", label: "Подключение в евро", value: "" },
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
const SAVE_MS = 900;
|
|
96
|
+
const SAVED_MS = 2000;
|
|
97
|
+
|
|
98
|
+
export default function FieldListScreenExample() {
|
|
99
|
+
const formId = React.useId();
|
|
100
|
+
const [specs, setSpecs] = React.useState(SPECS);
|
|
101
|
+
const [periods, setPeriods] = React.useState(PERIODS);
|
|
102
|
+
const [nameError, setNameError] = React.useState<string>();
|
|
103
|
+
const [saving, setSaving] = React.useState(false);
|
|
104
|
+
const [saved, setSaved] = React.useState(false);
|
|
105
|
+
|
|
106
|
+
const save = (event: React.FormEvent<HTMLFormElement>) => {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
const name = String(new FormData(event.currentTarget).get("name") ?? "").trim();
|
|
109
|
+
if (name === "") {
|
|
110
|
+
setNameError("Назовите тариф: так его увидят клиенты");
|
|
111
|
+
event.currentTarget.querySelector<HTMLInputElement>("[name='name']")?.focus();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
setNameError(undefined);
|
|
115
|
+
setSaving(true);
|
|
116
|
+
window.setTimeout(() => {
|
|
117
|
+
setSaving(false);
|
|
118
|
+
setSaved(true);
|
|
119
|
+
window.setTimeout(() => setSaved(false), SAVED_MS);
|
|
120
|
+
}, SAVE_MS);
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<PageContent.Root maxWidth="wide" aria-labelledby="plan-title">
|
|
125
|
+
<PageContent.Header>
|
|
126
|
+
<PageContent.Title id="plan-title">Тариф «Команда»</PageContent.Title>
|
|
127
|
+
<PageContent.Description>
|
|
128
|
+
Так тариф выглядит на странице цен и в счетах.
|
|
129
|
+
</PageContent.Description>
|
|
130
|
+
<PageContent.Actions>
|
|
131
|
+
<Button.Root type="submit" form={formId} loading={saving}>
|
|
132
|
+
{saved ? "Сохранено" : "Сохранить тариф"}
|
|
133
|
+
</Button.Root>
|
|
134
|
+
</PageContent.Actions>
|
|
135
|
+
</PageContent.Header>
|
|
136
|
+
<PageContent.Body>
|
|
137
|
+
<PageContent.Section layout="aside" label="Основное">
|
|
138
|
+
<form id={formId} noValidate onSubmit={save}>
|
|
139
|
+
<Card.Root variant="panel">
|
|
140
|
+
<Card.Body>
|
|
141
|
+
<Fieldset disabled={saving} aria-label="Основное">
|
|
142
|
+
<Input.Root label="Название" error={nameError}>
|
|
143
|
+
<Input.Wrapper>
|
|
144
|
+
<Input.Field name="name" defaultValue="Команда" />
|
|
145
|
+
</Input.Wrapper>
|
|
146
|
+
</Input.Root>
|
|
147
|
+
<Textarea.Root
|
|
148
|
+
name="summary"
|
|
149
|
+
label="Описание"
|
|
150
|
+
optional
|
|
151
|
+
rows={2}
|
|
152
|
+
defaultValue="Для отделов до 50 человек: задачи, документы и отчёты в одном месте."
|
|
153
|
+
/>
|
|
154
|
+
</Fieldset>
|
|
155
|
+
</Card.Body>
|
|
156
|
+
</Card.Root>
|
|
157
|
+
</form>
|
|
158
|
+
</PageContent.Section>
|
|
159
|
+
|
|
160
|
+
<PageContent.Section layout="aside" label="Характеристики">
|
|
161
|
+
<Card.Root variant="panel">
|
|
162
|
+
<Card.Body>
|
|
163
|
+
<FieldList
|
|
164
|
+
aria-label="Характеристики"
|
|
165
|
+
disabled={saving}
|
|
166
|
+
columns={SPEC_COLUMNS}
|
|
167
|
+
reorderable
|
|
168
|
+
value={specs}
|
|
169
|
+
onValueChange={setSpecs}
|
|
170
|
+
getId={(spec) => spec.id}
|
|
171
|
+
getLabel={(spec) => spec.name}
|
|
172
|
+
getLocked={(spec) => spec.pinned ?? false}
|
|
173
|
+
createItem={(): Spec => ({
|
|
174
|
+
id: crypto.randomUUID(),
|
|
175
|
+
icon: "object.globe",
|
|
176
|
+
name: "",
|
|
177
|
+
value: "",
|
|
178
|
+
color: "#14b8a6",
|
|
179
|
+
})}
|
|
180
|
+
addLabel="Добавить характеристику"
|
|
181
|
+
renderItem={(spec, row) => (
|
|
182
|
+
<>
|
|
183
|
+
<Select.Root
|
|
184
|
+
value={spec.icon}
|
|
185
|
+
onValueChange={(icon) => row.update({ icon: icon as IconName })}
|
|
186
|
+
>
|
|
187
|
+
<Select.Trigger>
|
|
188
|
+
<Select.TriggerIcon>
|
|
189
|
+
<Icon name={spec.icon} />
|
|
190
|
+
</Select.TriggerIcon>
|
|
191
|
+
</Select.Trigger>
|
|
192
|
+
<Select.Content>
|
|
193
|
+
{SPEC_ICONS.map((icon) => (
|
|
194
|
+
<Select.Item key={icon.name} value={icon.name}>
|
|
195
|
+
<Select.ItemIcon>
|
|
196
|
+
<Icon name={icon.name} />
|
|
197
|
+
</Select.ItemIcon>
|
|
198
|
+
{icon.label}
|
|
199
|
+
</Select.Item>
|
|
200
|
+
))}
|
|
201
|
+
</Select.Content>
|
|
202
|
+
</Select.Root>
|
|
203
|
+
<Input.Root>
|
|
204
|
+
<Input.Wrapper>
|
|
205
|
+
<Input.Field
|
|
206
|
+
value={spec.name}
|
|
207
|
+
onChange={(event) => row.update({ name: event.target.value })}
|
|
208
|
+
/>
|
|
209
|
+
</Input.Wrapper>
|
|
210
|
+
</Input.Root>
|
|
211
|
+
<Input.Root>
|
|
212
|
+
<Input.Wrapper>
|
|
213
|
+
<Input.Field
|
|
214
|
+
value={spec.value}
|
|
215
|
+
onChange={(event) => row.update({ value: event.target.value })}
|
|
216
|
+
/>
|
|
217
|
+
</Input.Wrapper>
|
|
218
|
+
</Input.Root>
|
|
219
|
+
<ColorPresets.Root
|
|
220
|
+
value={spec.color}
|
|
221
|
+
onValueChange={(color) => row.update({ color: color ?? spec.color })}
|
|
222
|
+
>
|
|
223
|
+
<ColorPresets.Trigger>
|
|
224
|
+
<ColorPresets.SwatchButton />
|
|
225
|
+
</ColorPresets.Trigger>
|
|
226
|
+
<ColorPresets.Content />
|
|
227
|
+
</ColorPresets.Root>
|
|
228
|
+
</>
|
|
229
|
+
)}
|
|
230
|
+
/>
|
|
231
|
+
</Card.Body>
|
|
232
|
+
</Card.Root>
|
|
233
|
+
</PageContent.Section>
|
|
234
|
+
|
|
235
|
+
<PageContent.Section layout="aside" label="Стоимость">
|
|
236
|
+
<Card.Root variant="panel">
|
|
237
|
+
<Card.Body className={styles.groups}>
|
|
238
|
+
<Fieldset label="За месяц" disabled={saving}>
|
|
239
|
+
<FieldList
|
|
240
|
+
columns={PRICE_COLUMNS}
|
|
241
|
+
value={periods}
|
|
242
|
+
onValueChange={setPeriods}
|
|
243
|
+
getId={(period) => period.id}
|
|
244
|
+
getLocked={(period) => period.base ?? false}
|
|
245
|
+
createItem={() => ({ id: crypto.randomUUID(), from: "", price: "" })}
|
|
246
|
+
addLabel="Добавить изменение цены"
|
|
247
|
+
renderItem={(period, row) => (
|
|
248
|
+
<>
|
|
249
|
+
{period.base ? (
|
|
250
|
+
<Input.Root>
|
|
251
|
+
<Input.Wrapper>
|
|
252
|
+
<Input.Field value="Всегда, если нет изменений" readOnly />
|
|
253
|
+
</Input.Wrapper>
|
|
254
|
+
</Input.Root>
|
|
255
|
+
) : (
|
|
256
|
+
<Select.Root
|
|
257
|
+
value={period.from}
|
|
258
|
+
onValueChange={(from) => row.update({ from })}
|
|
259
|
+
placeholder="Выберите месяц"
|
|
260
|
+
>
|
|
261
|
+
<Select.Trigger>
|
|
262
|
+
<Select.Value />
|
|
263
|
+
</Select.Trigger>
|
|
264
|
+
<Select.Content>
|
|
265
|
+
{MONTHS.map((month) => (
|
|
266
|
+
<Select.Item key={month.value} value={month.value}>
|
|
267
|
+
{month.label}
|
|
268
|
+
</Select.Item>
|
|
269
|
+
))}
|
|
270
|
+
</Select.Content>
|
|
271
|
+
</Select.Root>
|
|
272
|
+
)}
|
|
273
|
+
<Input.Root>
|
|
274
|
+
<Input.Wrapper>
|
|
275
|
+
<Input.Field
|
|
276
|
+
value={period.price}
|
|
277
|
+
inputMode="decimal"
|
|
278
|
+
placeholder="0"
|
|
279
|
+
onChange={(event) => row.update({ price: event.target.value })}
|
|
280
|
+
/>
|
|
281
|
+
<Input.InlineAffix side="end">₽</Input.InlineAffix>
|
|
282
|
+
</Input.Wrapper>
|
|
283
|
+
</Input.Root>
|
|
284
|
+
</>
|
|
285
|
+
)}
|
|
286
|
+
/>
|
|
287
|
+
</Fieldset>
|
|
288
|
+
<Fieldset
|
|
289
|
+
label="Подключение"
|
|
290
|
+
description="Разовый платёж; пустая валюта не выставляется."
|
|
291
|
+
disabled={saving}
|
|
292
|
+
>
|
|
293
|
+
<div className={styles.currencies}>
|
|
294
|
+
{SETUP_FEE.map((fee) => (
|
|
295
|
+
<Input.Root key={fee.name}>
|
|
296
|
+
<Input.Wrapper>
|
|
297
|
+
<Input.Field
|
|
298
|
+
name={fee.name}
|
|
299
|
+
aria-label={fee.label}
|
|
300
|
+
inputMode="decimal"
|
|
301
|
+
placeholder="0"
|
|
302
|
+
defaultValue={fee.value}
|
|
303
|
+
/>
|
|
304
|
+
<Input.InlineAffix side="end">{fee.currency}</Input.InlineAffix>
|
|
305
|
+
</Input.Wrapper>
|
|
306
|
+
</Input.Root>
|
|
307
|
+
))}
|
|
308
|
+
</div>
|
|
309
|
+
</Fieldset>
|
|
310
|
+
</Card.Body>
|
|
311
|
+
</Card.Root>
|
|
312
|
+
</PageContent.Section>
|
|
313
|
+
</PageContent.Body>
|
|
314
|
+
</PageContent.Root>
|
|
315
|
+
);
|
|
316
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Every tier: the headings, the fields, the handle and the buttons follow the list's size — `size`. */
|
|
2
|
+
import { FieldList, type FieldListColumn, Input } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
type Contact = { id: string; name: string; phone: string };
|
|
5
|
+
|
|
6
|
+
const SIZES = ["xs", "s", "m", "l", "xl"] as const;
|
|
7
|
+
|
|
8
|
+
const COLUMNS: FieldListColumn[] = [{ label: "Контакт" }, { label: "Телефон", width: "m" }];
|
|
9
|
+
|
|
10
|
+
const CONTACTS: Contact[] = [{ id: "buyer", name: "Анна Лебедева", phone: "+7 912 404-18-20" }];
|
|
11
|
+
|
|
12
|
+
export default function FieldListSizesExample() {
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
{SIZES.map((size) => (
|
|
16
|
+
<FieldList
|
|
17
|
+
key={size}
|
|
18
|
+
size={size}
|
|
19
|
+
label={size}
|
|
20
|
+
columns={COLUMNS}
|
|
21
|
+
defaultValue={CONTACTS}
|
|
22
|
+
getId={(contact) => contact.id}
|
|
23
|
+
getLabel={(contact) => contact.name}
|
|
24
|
+
renderItem={(contact) => (
|
|
25
|
+
<>
|
|
26
|
+
<Input.Root>
|
|
27
|
+
<Input.Wrapper>
|
|
28
|
+
<Input.Field defaultValue={contact.name} />
|
|
29
|
+
</Input.Wrapper>
|
|
30
|
+
</Input.Root>
|
|
31
|
+
<Input.Root>
|
|
32
|
+
<Input.Wrapper>
|
|
33
|
+
<Input.Field type="tel" defaultValue={contact.phone} />
|
|
34
|
+
</Input.Wrapper>
|
|
35
|
+
</Input.Root>
|
|
36
|
+
</>
|
|
37
|
+
)}
|
|
38
|
+
/>
|
|
39
|
+
))}
|
|
40
|
+
</>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** The same list editable and disabled while the request saves it: fields, handles and buttons turn off together — `disabled`. */
|
|
2
|
+
import { FieldList, type FieldListColumn, Input } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
type Stage = { id: string; name: string; days: string };
|
|
5
|
+
|
|
6
|
+
const COLUMNS: FieldListColumn[] = [{ label: "Этап" }, { label: "Дней", width: "s" }];
|
|
7
|
+
|
|
8
|
+
const STAGES: Stage[] = [
|
|
9
|
+
{ id: "brief", name: "Бриф и смета", days: "3" },
|
|
10
|
+
{ id: "design", name: "Дизайн", days: "10" },
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
const STATES = [
|
|
14
|
+
{ label: "Этапы проекта", disabled: false },
|
|
15
|
+
{ label: "disabled", disabled: true },
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export default function FieldListStatesExample() {
|
|
19
|
+
return (
|
|
20
|
+
<>
|
|
21
|
+
{STATES.map((state) => (
|
|
22
|
+
<FieldList
|
|
23
|
+
key={state.label}
|
|
24
|
+
label={state.label}
|
|
25
|
+
disabled={state.disabled}
|
|
26
|
+
reorderable
|
|
27
|
+
columns={COLUMNS}
|
|
28
|
+
defaultValue={STAGES}
|
|
29
|
+
getId={(stage) => stage.id}
|
|
30
|
+
getLabel={(stage) => stage.name}
|
|
31
|
+
createItem={() => ({ id: crypto.randomUUID(), name: "", days: "" })}
|
|
32
|
+
addLabel="Добавить этап"
|
|
33
|
+
renderItem={(stage) => (
|
|
34
|
+
<>
|
|
35
|
+
<Input.Root>
|
|
36
|
+
<Input.Wrapper>
|
|
37
|
+
<Input.Field defaultValue={stage.name} />
|
|
38
|
+
</Input.Wrapper>
|
|
39
|
+
</Input.Root>
|
|
40
|
+
<Input.Root>
|
|
41
|
+
<Input.Wrapper>
|
|
42
|
+
<Input.Field defaultValue={stage.days} inputMode="numeric" />
|
|
43
|
+
</Input.Wrapper>
|
|
44
|
+
</Input.Root>
|
|
45
|
+
</>
|
|
46
|
+
)}
|
|
47
|
+
/>
|
|
48
|
+
))}
|
|
49
|
+
</>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -288,7 +288,7 @@ A rejection of `upload` fails the file with its message as the reason; retry que
|
|
|
288
288
|
| disabled | `disabled` | `data-disabled="true"`, disabled input, disabled fill and text, drops ignored; no add tile, actions or drag; a disabled button with `trigger="button"` |
|
|
289
289
|
| empty | no files, `trigger="tile"` | the add tile spans the row with «Нажмите или перетащите файлы» |
|
|
290
290
|
| cover | `cover`, the first tile | «Обложка» in place of the format pill, `data-cover` on the tiles wrapper (the first tile takes a 2 × 2 cell in a grid) |
|
|
291
|
-
| full | the set reaches `max` | `data-full` on the add tile: «Лимит файлов», faded
|
|
291
|
+
| full | the set reaches `max` | `data-full` on the add tile: «Лимит файлов», faded; the file input is `aria-disabled` and opens no picker, so the field label stays undimmed |
|
|
292
292
|
| queued | queue item `status: "queued"` | a row reads «size · В очереди» over an empty bar; a tile (`data-upload="queued"`) dims under a 40px disk on the `media` shade (Button `shape="circle"` `variant="shade"`) whose ring turns at its least arc, described by «В очереди» |
|
|
293
293
|
| loading | `status: "loading"` | a row reads «size · Загрузка 40%» and its bar fills (`accent`); a tile's white arc grows clockwise from 12 o'clock with the share sent (the `progress` ring of a shade circle Button, one variable `--ring-value`, gliding `base` while it turns); the disk is the remove («Отменить загрузку: name», described by the state), the corner × is not drawn; the tile still reorders, its carried copy keeps the disk |
|
|
294
294
|
| done | `status: "done"` | a row reads «size» over a full `success` bar; a tile's ring fills, then its disk fades and shrinks to 0.9 (`fast`, `inert`), the picture returns to full or the sheet comes back |
|
|
@@ -372,20 +372,21 @@ Also `data-size`, `data-variant` on the zone, `data-size` on Item, `data-status`
|
|
|
372
372
|
| Example | Shows |
|
|
373
373
|
|---|---|
|
|
374
374
|
| [overview.tsx](examples/overview.tsx) | Documents of a deal: a drop zone, the files already attached as rows whose names open them, and new files uploading through a queue with progress, a reason and a retry — `label`, `hint`, `multiple`, `defaultValue`, `href`, `queue`. |
|
|
375
|
-
| [variants.tsx](examples/variants.tsx) | How files are added: the dashed drop zone, the zone with only its fill for cards and modals, the compact picker button and the add tile
|
|
375
|
+
| [variants.tsx](examples/variants.tsx) | How files are added: the dashed drop zone, the zone with only its fill for cards and modals, the compact picker button and the add tile that starts an empty set of tiles — `variant`, `trigger`. |
|
|
376
376
|
| [sizes.tsx](examples/sizes.tsx) | Every tier of the zone and of its file rows: padding, icon, button, text and the format badge follow it — `size`. |
|
|
377
377
|
| [states.tsx](examples/states.tsx) | A default zone, a disabled one whose files are read-only and an invalid one without a message — `disabled`, `invalid`. |
|
|
378
378
|
| [validation.tsx](examples/validation.tsx) | A required scan checked as soon as it is picked: a wrong type or a large file shakes in an error that leaves when the file is removed; a hint and an optional zone — `required`, `hint`, `error`, `optional`. |
|
|
379
|
-
| [gallery.tsx](examples/gallery.tsx) | An image gallery of an office listing: the first photo is the cover on two tiles and a photo dragged first takes its place, new photos upload in their tiles, and the add tile counts up to the limit — `trigger`, `layout`, `cover`, `max`, `value`, `queue`. |
|
|
380
|
-
| [file-cards.tsx](examples/file-cards.tsx) | Materials of a warehouse inspection as cards: photos and documents in one grid, each with its picture or format and the name with the size; new files upload in their cards and the order is set by drag or Alt + arrows — `trigger`, `layout`, `defaultValue`, `queue`. |
|
|
379
|
+
| [gallery.tsx](examples/gallery.tsx) | An image gallery of an office listing: the first photo is the cover on two tiles and a photo dragged first takes its place, new photos upload in their tiles, one fails and retries, and the add tile counts up to the limit and then says so — `trigger`, `layout`, `cover`, `max`, `value`, `queue`. |
|
|
380
|
+
| [file-cards.tsx](examples/file-cards.tsx) | Materials of a warehouse inspection as cards: photos and documents in one grid, each with its picture or format and the name with the size in megabytes as the report gives it; new files upload in their cards and the order is set by drag or Alt + arrows — `trigger`, `layout`, `defaultValue`, `queue`, `formatSize`. |
|
|
381
381
|
| [attachment-tray.tsx](examples/attachment-tray.tsx) | A reply to a client with a paperclip instead of a drop zone: the icon-only picker button, and the attachments as one scrolling row of tiles above the message — `trigger`, `aria-label`, `FileUpload.Queue`, `layout`. |
|
|
382
382
|
| [saving.tsx](examples/saving.tsx) | Published listing photos with no picker, every change saved on the server: a moved or removed photo waits busy, and a change the server refuses puts the set back — `FileUpload.Queue`, `onValueChange`, `value`, `cover`. |
|
|
383
|
-
| [custom-body.tsx](examples/custom-body.tsx) | A custom body: a muted title with a browse link and source buttons instead of the built-in one — `FileUpload.Body`, `FileUpload.Title`. |
|
|
383
|
+
| [custom-body.tsx](examples/custom-body.tsx) | A custom body: a muted title with a browse link and the formats line and source buttons instead of the built-in one — `FileUpload.Body`, `FileUpload.Title`, `FileUpload.Description`. |
|
|
384
384
|
| [avatar-upload.tsx](examples/avatar-upload.tsx) | A round zone around an Avatar that takes images and shows a preview; buttons open the same input — `inputRef`, `accept`, `className`. |
|
|
385
|
-
| [row-parts.tsx](examples/row-parts.tsx) | Rows the set does not draw, built from parts: order documents with a download button, a photo with its preview
|
|
385
|
+
| [row-parts.tsx](examples/row-parts.tsx) | Rows the set does not draw, built from parts: order documents with a download button, a photo with its preview, a report still being prepared and one that failed with a retry — `FileUpload.Item`, `FileUpload.FormatBadge`, `FileUpload.ItemPreview`, `FileUpload.ItemActions`, `FileUpload.ItemProgress`, `invalid`, `tone`. |
|
|
386
386
|
| [controlled.tsx](examples/controlled.tsx) | Documents of a deal in one list: the files already on the server and new uploads after them, saved on every change, and a button brings back the saved set — `value`, `onValueChange`, `queue`. |
|
|
387
387
|
| [in-form.tsx](examples/in-form.tsx) | A contract upload form: submit checks the required scan, its error shakes in and leaves once a file is picked or removed — `required`, `error`, `name`, `value`. |
|
|
388
388
|
| [narrow.tsx](examples/narrow.tsx) | In a phone-width column the zone text wraps, a long file name truncates, and a gallery goes three across and then two, the cover keeping two columns and the remove buttons shown without hover. |
|
|
389
|
+
| [screen.tsx](examples/screen.tsx) | A media library of a catalog object as a work screen: the title, the object and a PageToolbar with sections, search, order and upload in the app header; uploads in FileUpload tiles through a queue; a grid of Thumbnails that open MediaViewer out of the tile or are picked for bulk download and delete; a Skeleton first load and a filtered empty state in a Crossfade — `trigger`, `layout`. |
|
|
389
390
|
|
|
390
391
|
## Mistakes
|
|
391
392
|
- A `Label` and a `Hint` placed around the zone by hand → pass `label`, `hint`, `error`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A custom body: a muted title with a browse link and source buttons instead of the built-in one — `FileUpload.Body`, `FileUpload.Title`. */
|
|
1
|
+
/** A custom body: a muted title with a browse link and the formats line and source buttons instead of the built-in one — `FileUpload.Body`, `FileUpload.Title`, `FileUpload.Description`. */
|
|
2
2
|
import { Button, FileUpload, Icon, LinkButton } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
@@ -23,6 +23,7 @@ export default function FileUploadCustomBodyExample() {
|
|
|
23
23
|
</button>
|
|
24
24
|
</LinkButton>
|
|
25
25
|
</FileUpload.Title>
|
|
26
|
+
<FileUpload.Description>PDF, JPG или PNG до 20 МБ</FileUpload.Description>
|
|
26
27
|
<div className={styles.sources}>
|
|
27
28
|
<Button.Root variant="soft" tone="neutral" size="s" onClick={openPicker}>
|
|
28
29
|
<Button.Icon>
|