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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Support request form: the description is checked on submit, its error leaves as soon as the text is long enough and does not shift the form, a sent request turns the button green — `required`, `error`, `reserveSupportRow`. */
|
|
2
|
-
import { Button, Input, Textarea
|
|
2
|
+
import { Button, Input, Textarea } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
import styles from "./examples.module.css";
|
|
@@ -23,14 +23,6 @@ export default function TextareaInFormExample() {
|
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
25
|
<form className={styles.form} noValidate onSubmit={submit}>
|
|
26
|
-
<div className={styles.formHeader}>
|
|
27
|
-
<Typography as="h3" variant="title-m">
|
|
28
|
-
Обращение в поддержку
|
|
29
|
-
</Typography>
|
|
30
|
-
<Typography as="p" variant="body-s" tone="secondary">
|
|
31
|
-
Ответим в течение рабочего дня.
|
|
32
|
-
</Typography>
|
|
33
|
-
</div>
|
|
34
26
|
<div className={styles.formFields}>
|
|
35
27
|
<Input.Root label="Тема" required>
|
|
36
28
|
<Input.Wrapper>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A default field next to a read-only
|
|
1
|
+
/** A default field next to a read-only, a disabled and an invalid one with no message — `readOnly`, `disabled`, `invalid`. */
|
|
2
2
|
import { Textarea } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
export default function TextareaStatesExample() {
|
|
@@ -16,6 +16,7 @@ export default function TextareaStatesExample() {
|
|
|
16
16
|
placeholder="Причина возврата"
|
|
17
17
|
hint="Станет доступно после выбора заказа"
|
|
18
18
|
/>
|
|
19
|
+
<Textarea.Root label="invalid" invalid defaultValue="Не подошёл размер" />
|
|
19
20
|
</>
|
|
20
21
|
);
|
|
21
22
|
}
|
|
@@ -171,9 +171,10 @@ No `labels`.
|
|
|
171
171
|
| [sizes.tsx](examples/sizes.tsx) | Every height tier, 24 to 64 px; `m` fits a two-line table cell — `size`. |
|
|
172
172
|
| [states.tsx](examples/states.tsx) | No image (an icon or a short label on the fill) and an image that fails and falls back by itself. |
|
|
173
173
|
| [ratios.tsx](examples/ratios.tsx) | Every aspect ratio at the same height; keep one ratio per list — `ratio`. |
|
|
174
|
+
| [fit.tsx](examples/fit.tsx) | A supplier's wide banner in a square frame: cropped to fill or shown whole on the fill — `fit`. |
|
|
174
175
|
| [ring.tsx](examples/ring.tsx) | A faint inner ring for a white-background photo on a light surface, where the edge would vanish — `ring`. |
|
|
175
176
|
| [full-width.tsx](examples/full-width.tsx) | Covers in a card grid take the card width and keep 16:9, so every cover has one height — `fullWidth`. |
|
|
176
|
-
| [video.tsx](examples/video.tsx) | Videos in the frame: a walkthrough without a poster shows its first frame, a play mark and the duration; a short clip loops muted like a GIF; a video message plays in place with its controls — `Thumbnail.Video`, `autoPlay`, `controls`. |
|
|
177
|
+
| [video.tsx](examples/video.tsx) | Videos in the frame: a walkthrough without a poster shows its first frame, a play mark and the duration; a briefing shows its poster and its own duration format; a short clip loops muted like a GIF; a video message plays in place with its controls — `Thumbnail.Video`, `poster`, `formatDuration`, `autoPlay`, `controls`. |
|
|
177
178
|
| [pressable.tsx](examples/pressable.tsx) | Photos of a delivery that open a viewer: the frame is put on a button, so it lifts on hover, presses and takes the focus ring — `asChild`. |
|
|
178
179
|
| [controlled.tsx](examples/controlled.tsx) | A media library picks photos for a listing: each tile is a checkbox with its check in the corner, the selection lives in the parent and a button clears it — `checked`, `onCheckedChange`. |
|
|
179
180
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** A supplier's wide banner in a square frame: cropped to fill or shown whole on the fill — `fit`. */
|
|
2
|
+
import { Thumbnail, Typography } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
import styles from "./examples.module.css";
|
|
5
|
+
|
|
6
|
+
const BANNER = "https://picsum.photos/seed/supplier-banner/480/160";
|
|
7
|
+
const FITS = ["cover", "contain"] as const;
|
|
8
|
+
|
|
9
|
+
export default function ThumbnailFitExample() {
|
|
10
|
+
return (
|
|
11
|
+
<div className={styles.row}>
|
|
12
|
+
{FITS.map((fit) => (
|
|
13
|
+
<div key={fit} className={styles.cell}>
|
|
14
|
+
<Thumbnail.Root size="xl" color="gray">
|
|
15
|
+
<Thumbnail.Image src={BANNER} fit={fit} alt="Ферма поставщика «Северное хозяйство»" />
|
|
16
|
+
</Thumbnail.Root>
|
|
17
|
+
<Typography as="span" variant="caption" tone="muted">
|
|
18
|
+
{fit}
|
|
19
|
+
</Typography>
|
|
20
|
+
</div>
|
|
21
|
+
))}
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
/** Videos in the frame: a walkthrough without a poster shows its first frame, a play mark and the duration; a short clip loops muted like a GIF; a video message plays in place with its controls — `Thumbnail.Video`, `autoPlay`, `controls`. */
|
|
1
|
+
/** Videos in the frame: a walkthrough without a poster shows its first frame, a play mark and the duration; a briefing shows its poster and its own duration format; a short clip loops muted like a GIF; a video message plays in place with its controls — `Thumbnail.Video`, `poster`, `formatDuration`, `autoPlay`, `controls`. */
|
|
2
2
|
import { Icon, Thumbnail, Typography } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
5
5
|
|
|
6
6
|
const CLIP = "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4";
|
|
7
|
+
const POSTER = "https://picsum.photos/seed/safety-briefing/640/360";
|
|
8
|
+
|
|
9
|
+
const formatSeconds = (seconds: number) => `${Math.round(seconds)} с`;
|
|
7
10
|
|
|
8
11
|
export default function ThumbnailVideoExample() {
|
|
9
12
|
return (
|
|
@@ -19,6 +22,22 @@ export default function ThumbnailVideoExample() {
|
|
|
19
22
|
Обход склада · без обложки
|
|
20
23
|
</Typography>
|
|
21
24
|
</div>
|
|
25
|
+
<div className={styles.cardContent}>
|
|
26
|
+
<Thumbnail.Root fullWidth ratio="16:9">
|
|
27
|
+
<Thumbnail.Video
|
|
28
|
+
src={CLIP}
|
|
29
|
+
poster={POSTER}
|
|
30
|
+
formatDuration={formatSeconds}
|
|
31
|
+
aria-label="Инструктаж по технике безопасности"
|
|
32
|
+
/>
|
|
33
|
+
<Thumbnail.Fallback>
|
|
34
|
+
<Icon name="action.play" />
|
|
35
|
+
</Thumbnail.Fallback>
|
|
36
|
+
</Thumbnail.Root>
|
|
37
|
+
<Typography variant="caption" tone="muted">
|
|
38
|
+
Инструктаж · обложка, длительность в секундах
|
|
39
|
+
</Typography>
|
|
40
|
+
</div>
|
|
22
41
|
<div className={styles.cardContent}>
|
|
23
42
|
<Thumbnail.Root fullWidth ratio="16:9">
|
|
24
43
|
<Thumbnail.Video src={CLIP} autoPlay aria-label="Как собрать заказ, ролик" />
|
|
@@ -165,7 +165,7 @@ No `labels`.
|
|
|
165
165
|
| [variants.tsx](examples/variants.tsx) | Dot hues for categories at reduced emphasis, and status tones on items, values and gaps at full emphasis — `color`, `tone`. |
|
|
166
166
|
| [sizes.tsx](examples/sizes.tsx) | Every tier scales text, dot and row rhythm, rows 40 to 76 px — `size`. |
|
|
167
167
|
| [structure.tsx](examples/structure.tsx) | A service history with intervals between events, a caption on the right of a gap and a second value line — `Timeline.Gap`, `Timeline.GapMeta`, `Timeline.ValueMeta`. |
|
|
168
|
-
| [links.tsx](examples/links.tsx) | Rows that open an operation page
|
|
168
|
+
| [links.tsx](examples/links.tsx) | Rows that open something: an operation page by a link or by your router link through the slot, a receipt in place by a button; one Tab stop each with a focus ring — `href`, `asChild`, `onClick`. |
|
|
169
169
|
| [narrow.tsx](examples/narrow.tsx) | At 375 px the title wraps and the amount stays right; below 20rem of its own width the amount moves under the meta line. |
|
|
170
170
|
|
|
171
171
|
## Mistakes
|
|
@@ -6,14 +6,6 @@
|
|
|
6
6
|
width: min(100%, calc(var(--prime-space-24) * 5));
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
.stack {
|
|
10
|
-
display: flex;
|
|
11
|
-
flex-direction: column;
|
|
12
|
-
gap: var(--prime-space-10);
|
|
13
|
-
width: min(100%, calc(var(--prime-space-24) * 5));
|
|
14
|
-
min-width: 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
9
|
/* narrow.tsx: a 375px phone column. */
|
|
18
10
|
.phone {
|
|
19
11
|
width: min(100%, calc(var(--prime-space-1) * 93.75));
|
|
@@ -1,28 +1,69 @@
|
|
|
1
|
-
/** Rows that open an operation page
|
|
2
|
-
import { Timeline } from "prime-ui-kit";
|
|
1
|
+
/** Rows that open something: an operation page by a link or by your router link through the slot, a receipt in place by a button; one Tab stop each with a focus ring — `href`, `asChild`, `onClick`. */
|
|
2
|
+
import { Button, Drawer, Timeline } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
3
4
|
|
|
4
5
|
import styles from "./examples.module.css";
|
|
5
6
|
|
|
6
|
-
const
|
|
7
|
+
const OPERATIONS = [
|
|
7
8
|
{ id: "rent-ivan", title: "Аренда закончилась · Иван К.", date: "21.09.26", value: "+6 300 ₽" },
|
|
8
9
|
{ id: "oil", title: "ТО: замена масла", date: "10.09.26", value: "−689 ₽" },
|
|
9
|
-
{ id: "wash", title: "Мойка и химчистка салона", date: "01.09.26", value: "−450 ₽" },
|
|
10
10
|
];
|
|
11
11
|
|
|
12
|
+
const WASH = { title: "Мойка и химчистка салона", date: "01.09.26", value: "−450 ₽" };
|
|
13
|
+
|
|
12
14
|
export default function TimelineLinksExample() {
|
|
15
|
+
const [receiptOpen, setReceiptOpen] = React.useState(false);
|
|
16
|
+
|
|
13
17
|
return (
|
|
14
|
-
|
|
15
|
-
<Timeline.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<Timeline.
|
|
18
|
+
<>
|
|
19
|
+
<Timeline.Root className={styles.feed}>
|
|
20
|
+
<Timeline.Group label="Операции">
|
|
21
|
+
{OPERATIONS.map((operation) => (
|
|
22
|
+
<Timeline.Item key={operation.id} href={`#${operation.id}`}>
|
|
23
|
+
<Timeline.Title>{operation.title}</Timeline.Title>
|
|
24
|
+
<Timeline.Meta>
|
|
25
|
+
<Timeline.MetaPrimary>{operation.date}</Timeline.MetaPrimary>
|
|
26
|
+
</Timeline.Meta>
|
|
27
|
+
<Timeline.Value>{operation.value}</Timeline.Value>
|
|
28
|
+
</Timeline.Item>
|
|
29
|
+
))}
|
|
30
|
+
{/* The receipt opens in place: the row is a button. */}
|
|
31
|
+
<Timeline.Item onClick={() => setReceiptOpen(true)}>
|
|
32
|
+
<Timeline.Title>{WASH.title}</Timeline.Title>
|
|
19
33
|
<Timeline.Meta>
|
|
20
|
-
<Timeline.MetaPrimary>{
|
|
34
|
+
<Timeline.MetaPrimary>{WASH.date}</Timeline.MetaPrimary> · чек
|
|
21
35
|
</Timeline.Meta>
|
|
22
|
-
<Timeline.Value>{
|
|
36
|
+
<Timeline.Value>{WASH.value}</Timeline.Value>
|
|
23
37
|
</Timeline.Item>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
{/* A router link (`<Link to>`) goes in the same way. */}
|
|
39
|
+
<Timeline.Item asChild>
|
|
40
|
+
<a href="#operations-archive">
|
|
41
|
+
<Timeline.Title>Операции за август</Timeline.Title>
|
|
42
|
+
<Timeline.Meta>
|
|
43
|
+
<Timeline.MetaPrimary>14 операций</Timeline.MetaPrimary>
|
|
44
|
+
</Timeline.Meta>
|
|
45
|
+
</a>
|
|
46
|
+
</Timeline.Item>
|
|
47
|
+
</Timeline.Group>
|
|
48
|
+
</Timeline.Root>
|
|
49
|
+
|
|
50
|
+
<Drawer.Root open={receiptOpen} onOpenChange={setReceiptOpen}>
|
|
51
|
+
<Drawer.Content size="s">
|
|
52
|
+
<Drawer.Header>
|
|
53
|
+
<Drawer.Title>{WASH.title}</Drawer.Title>
|
|
54
|
+
<Drawer.Description>
|
|
55
|
+
Чек от {WASH.date} · {WASH.value}
|
|
56
|
+
</Drawer.Description>
|
|
57
|
+
</Drawer.Header>
|
|
58
|
+
<Drawer.Footer>
|
|
59
|
+
<Drawer.Close>
|
|
60
|
+
<Button.Root variant="outline" tone="neutral">
|
|
61
|
+
Закрыть
|
|
62
|
+
</Button.Root>
|
|
63
|
+
</Drawer.Close>
|
|
64
|
+
</Drawer.Footer>
|
|
65
|
+
</Drawer.Content>
|
|
66
|
+
</Drawer.Root>
|
|
67
|
+
</>
|
|
27
68
|
);
|
|
28
69
|
}
|
|
@@ -20,7 +20,7 @@ const EVENTS = [
|
|
|
20
20
|
|
|
21
21
|
export default function TimelineNarrowExample() {
|
|
22
22
|
return (
|
|
23
|
-
|
|
23
|
+
<>
|
|
24
24
|
{WIDTHS.map((width) => (
|
|
25
25
|
<Timeline.Root key={width.id} className={width.className}>
|
|
26
26
|
<Timeline.Group label={width.label}>
|
|
@@ -36,6 +36,6 @@ export default function TimelineNarrowExample() {
|
|
|
36
36
|
</Timeline.Group>
|
|
37
37
|
</Timeline.Root>
|
|
38
38
|
))}
|
|
39
|
-
|
|
39
|
+
</>
|
|
40
40
|
);
|
|
41
41
|
}
|
|
@@ -7,9 +7,9 @@ const SIZES = ["xs", "s", "m", "l", "xl"] as const;
|
|
|
7
7
|
|
|
8
8
|
export default function TimelineSizesExample() {
|
|
9
9
|
return (
|
|
10
|
-
|
|
10
|
+
<>
|
|
11
11
|
{SIZES.map((size) => (
|
|
12
|
-
<Timeline.Root key={size} size={size}>
|
|
12
|
+
<Timeline.Root key={size} size={size} className={styles.feed}>
|
|
13
13
|
<Timeline.Group label={size}>
|
|
14
14
|
<Timeline.Item>
|
|
15
15
|
<Timeline.Title>Аренда закончилась · Иван К.</Timeline.Title>
|
|
@@ -28,6 +28,6 @@ export default function TimelineSizesExample() {
|
|
|
28
28
|
</Timeline.Group>
|
|
29
29
|
</Timeline.Root>
|
|
30
30
|
))}
|
|
31
|
-
|
|
31
|
+
</>
|
|
32
32
|
);
|
|
33
33
|
}
|
|
@@ -27,8 +27,8 @@ const TONES: { tone: Tone; title: string; value: string }[] = [
|
|
|
27
27
|
|
|
28
28
|
export default function TimelineVariantsExample() {
|
|
29
29
|
return (
|
|
30
|
-
|
|
31
|
-
<Timeline.Root>
|
|
30
|
+
<>
|
|
31
|
+
<Timeline.Root className={styles.feed}>
|
|
32
32
|
<Timeline.Group label="color">
|
|
33
33
|
{COLORS.map((color) => (
|
|
34
34
|
<Timeline.Item key={color} color={color}>
|
|
@@ -38,7 +38,7 @@ export default function TimelineVariantsExample() {
|
|
|
38
38
|
))}
|
|
39
39
|
</Timeline.Group>
|
|
40
40
|
</Timeline.Root>
|
|
41
|
-
<Timeline.Root>
|
|
41
|
+
<Timeline.Root className={styles.feed}>
|
|
42
42
|
<Timeline.Group label="tone">
|
|
43
43
|
{TONES.map(({ tone, title, value }) => (
|
|
44
44
|
<Timeline.Item key={tone} tone={tone}>
|
|
@@ -51,6 +51,6 @@ export default function TimelineVariantsExample() {
|
|
|
51
51
|
<Timeline.Gap tone="danger">Просрочка 30 дней</Timeline.Gap>
|
|
52
52
|
</Timeline.Group>
|
|
53
53
|
</Timeline.Root>
|
|
54
|
-
|
|
54
|
+
</>
|
|
55
55
|
);
|
|
56
56
|
}
|
|
@@ -70,7 +70,7 @@ No DOM of its own: clones the single child and links it to the tooltip with `ari
|
|
|
70
70
|
| Prop | Type | Default | Description |
|
|
71
71
|
|---|---|---|---|
|
|
72
72
|
| `side` | `"top" \| "bottom" \| "left" \| "right"` | `"top"` | Preferred side; flips to the opposite one when it does not fit, then shifts inside the viewport. |
|
|
73
|
-
| `align` | `"start" \| "center" \| "end"` | `"center"` | Alignment along the trigger:
|
|
73
|
+
| `align` | `"auto" \| "start" \| "center" \| "end"` | `"center"` | Alignment along the trigger: centred by default; `auto` lines the chip up with the trigger edge that has more room beyond it; `start` or `end` fix the edge. The arrow keeps pointing at the trigger. |
|
|
74
74
|
| `size` | `"xs" \| "s" \| "m" \| "l" \| "xl"` | `"m"` | Text and padding tier; also the size context of controls inside (a Kbd). |
|
|
75
75
|
| `children` | `ReactNode` | — (required) | Hint text, optionally with a Kbd. |
|
|
76
76
|
| `…rest` | `Omit<HTMLAttributes<HTMLDivElement>, "id" \| "role" \| "onPointerEnter" \| "onPointerLeave">` | — | `className`, `style` and the other attributes of the chip. |
|
|
@@ -100,9 +100,10 @@ A chip of tier T is as tall as a menu item of tier T; text, padding and radius s
|
|
|
100
100
|
### align (Content)
|
|
101
101
|
| Value | Looks like | Use when | Default |
|
|
102
102
|
|---|---|---|---|
|
|
103
|
-
| `start` | Chip starts at the trigger's start edge | Wide triggers, triggers at a container's start | |
|
|
104
103
|
| `center` | Chip centred on the trigger | Most triggers | yes |
|
|
105
|
-
| `
|
|
104
|
+
| `auto` | Lined up with the trigger edge that has more room: near the end of the screen the end edges meet and the chip grows toward the start, near the start the other way | A long chip on a wide trigger near a screen edge | |
|
|
105
|
+
| `start` | Chip starts at the trigger's start edge | The chip must line up with the start of a block whatever room there is | |
|
|
106
|
+
| `end` | Chip ends at the trigger's end edge | The chip must line up with the end of a block whatever room there is | |
|
|
106
107
|
|
|
107
108
|
**Combinations** — size of the tooltip = size of the trigger control; a Kbd inside takes the tier one step down by itself.
|
|
108
109
|
|
|
@@ -133,6 +134,7 @@ A chip of tier T is as tall as a menu item of tier T; text, padding and radius s
|
|
|
133
134
|
- `Tooltip.Trigger` composes the child's `ref`, sets `data-state` and chains the child's `onPointerEnter`, `onPointerLeave`, `onPointerDown`, `onFocus` and `onBlur`.
|
|
134
135
|
- The tooltip is a description, not the name: an icon-only button needs its own `aria-label`.
|
|
135
136
|
- The pointer may move onto the chip without closing it (WCAG 1.4.13); a touch does not open it, focus does.
|
|
137
|
+
- Tooltip has no `closeOnEscape` / `closeOnOutsideClick` (foundation §8): it closes on pointer-leave, blur, a press on the trigger and Escape, and Escape cannot be turned off — WCAG 1.4.13 requires the chip to be dismissable without moving the pointer or focus.
|
|
136
138
|
- A `disabled` control is wrapped by the kit in a focusable `<span>`: the host takes hover and Tab, the focus ring is drawn on the control.
|
|
137
139
|
- A trigger that is no tab stop (Badge, Avatar, ProgressCircle, `Icon` with `label`) gets `tabIndex={0}` and the focus ring; its name comes from `aria-label` or the icon `label`.
|
|
138
140
|
|
|
@@ -146,8 +148,8 @@ No `labels`.
|
|
|
146
148
|
|---|---|
|
|
147
149
|
| [overview.tsx](examples/overview.tsx) | An icon-only button with a tooltip that repeats its name on hover and keyboard focus — `Tooltip.Trigger`, `Tooltip.Content`. |
|
|
148
150
|
| [sizes.tsx](examples/sizes.tsx) | Every size tier next to buttons of the same tier; take the tier of the control it describes — `size`. |
|
|
149
|
-
| [placement.tsx](examples/placement.tsx) | Every side, and start
|
|
150
|
-
| [toolbar.tsx](examples/toolbar.tsx) | A formatting toolbar in one group: after the first tooltip the neighbours open at once, each with its name and shortcut — `Tooltip.Provider`. |
|
|
151
|
+
| [placement.tsx](examples/placement.tsx) | Every side, and alignment by room, start and end along the trigger; without room the chip flips and shifts, the arrow keeps pointing at the trigger — `side`, `align`. |
|
|
152
|
+
| [toolbar.tsx](examples/toolbar.tsx) | A formatting toolbar in one group: after the first tooltip the neighbours open at once for half a second, each with its name and shortcut — `Tooltip.Provider`, `skipDelayDuration`. |
|
|
151
153
|
| [disabled-trigger.tsx](examples/disabled-trigger.tsx) | Why an action is unavailable: the disabled button still shows its tooltip on hover and Tab, no wrapper needed — `Tooltip.Trigger`. |
|
|
152
154
|
| [non-interactive-trigger.tsx](examples/non-interactive-trigger.tsx) | A status badge, an avatar and an information icon explain themselves: the kit makes each a tab stop, so the tooltip opens from the keyboard too — `Tooltip.Trigger`. |
|
|
153
155
|
| [delay.tsx](examples/delay.tsx) | The show delay of one tooltip: at once, the default 400 ms and one second — `delayDuration`. |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Every side, and start
|
|
1
|
+
/** Every side, and alignment by room, start and end along the trigger; without room the chip flips and shifts, the arrow keeps pointing at the trigger — `side`, `align`. */
|
|
2
2
|
import { Button, Tooltip } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
const PLACEMENTS = [
|
|
@@ -6,6 +6,7 @@ const PLACEMENTS = [
|
|
|
6
6
|
{ side: "bottom", align: "center" },
|
|
7
7
|
{ side: "left", align: "center" },
|
|
8
8
|
{ side: "right", align: "center" },
|
|
9
|
+
{ side: "bottom", align: "auto" },
|
|
9
10
|
{ side: "bottom", align: "start" },
|
|
10
11
|
{ side: "bottom", align: "end" },
|
|
11
12
|
] as const;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A formatting toolbar in one group: after the first tooltip the neighbours open at once, each with its name and shortcut — `Tooltip.Provider`. */
|
|
1
|
+
/** A formatting toolbar in one group: after the first tooltip the neighbours open at once for half a second, each with its name and shortcut — `Tooltip.Provider`, `skipDelayDuration`. */
|
|
2
2
|
import { Button, Icon, Kbd, Tooltip } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
@@ -13,7 +13,7 @@ const TOOLS = [
|
|
|
13
13
|
|
|
14
14
|
export default function TooltipToolbarExample() {
|
|
15
15
|
return (
|
|
16
|
-
<Tooltip.Provider>
|
|
16
|
+
<Tooltip.Provider skipDelayDuration={500}>
|
|
17
17
|
<div className={styles.toolbar} role="toolbar" aria-label="Форматирование">
|
|
18
18
|
{TOOLS.map(({ icon, label, keys }) => (
|
|
19
19
|
<Tooltip.Root key={label}>
|
|
@@ -17,6 +17,9 @@ export default function TypographyWeightsExample() {
|
|
|
17
17
|
<Typography variant="body-m" weight="semibold">
|
|
18
18
|
{LINE} · semibold
|
|
19
19
|
</Typography>
|
|
20
|
+
<Typography variant="body-m" tracking="tight">
|
|
21
|
+
{LINE} · tracking tight
|
|
22
|
+
</Typography>
|
|
20
23
|
<Typography variant="body-m" tracking="tighter">
|
|
21
24
|
{LINE} · tracking tighter
|
|
22
25
|
</Typography>
|
|
@@ -79,7 +79,7 @@ One look. The circle is the video; the play disk and the pills stand on the medi
|
|
|
79
79
|
## States
|
|
80
80
|
| State | Driven by | DOM |
|
|
81
81
|
|---|---|---|
|
|
82
|
-
| loading | the first frame not drawn yet | `data-frame="loading"` on the circle: a Skeleton fills it
|
|
82
|
+
| loading | the first frame not drawn yet | `data-frame="loading"` on the circle: a Skeleton fills it; once loaded the video fades in over it (`base`), then the Skeleton goes |
|
|
83
83
|
| at rest | idle | `data-state="idle"` on the circle; the still first frame (or `poster`) with the play disk and the duration; nothing plays, loops or decodes past the metadata and the first frame — a long chat costs nothing until a press |
|
|
84
84
|
| playing | the disk (or a press on the circle), `playing` / `defaultPlaying` | `data-playing="true"` on the root, `data-state="playing"`; sound from the start, the ring fills over the edge every frame (one CSS variable on the ring), the duration counts down, the disk's glyph turns to pause and the disk fades out (it stays while it has the keyboard focus); `onPlayingChange(true)`; any other sound pauses |
|
|
85
85
|
| paused | the disk or the circle again, another sound starting, `playing={false}` | `data-state="paused"`, the disk with the play glyph comes back, the ring stays; `onPlayingChange(false)` |
|
|
@@ -155,10 +155,10 @@ One look. The circle is the video; the play disk and the pills stand on the medi
|
|
|
155
155
|
|---|---|
|
|
156
156
|
| [overview.tsx](examples/overview.tsx) | A foreman's round video report: its still first frame with the play disk and the duration, played with sound on a press — `src`, `duration`. |
|
|
157
157
|
| [states.tsx](examples/states.tsx) | Every state side by side, each labelled by its prop: the transfer is drawn on the play disk itself — in flight with the cross and the ring, failed with the retry, not fetched with the download arrow — `unplayed`, `transfer`, `transferProgress`, `disabled`. |
|
|
158
|
-
| [in-message.tsx](examples/in-message.tsx) | Round video messages in a field crew chat: the circle is the message itself, the time stands on its pill
|
|
158
|
+
| [in-message.tsx](examples/in-message.tsx) | Round video messages in a field crew chat: the circle is the message itself, the time stands on its pill, the reply follows as text and the answer circle shows the cover its server made — `Message.Root`, `time`, `status`, `poster`. |
|
|
159
159
|
| [transcript.tsx](examples/transcript.tsx) | Round video messages with a transcript: the button stands at the circle's top end like a voice message's, one text is known and one is asked for on the first open — `transcript`, `onTranscribe`. |
|
|
160
160
|
| [transfer.tsx](examples/transfer.tsx) | One look for a round video on its way in either direction: the foreman's report waits to be fetched and then arrives, the engineer's answer is being sent — the disk in the middle with the ring of the share, the cross cancels, a dropped connection offers a retry, the circle plays once it is through — `transfer`, `transferProgress`, `transferDirection`, `onCancel`, `onRetry`, `onDownload`. |
|
|
161
|
-
| [controlled.tsx](examples/controlled.tsx) | The parent knows what plays
|
|
161
|
+
| [controlled.tsx](examples/controlled.tsx) | The parent knows what plays, marks the report as watched on the first play and as seen to the end when it ends, and keeps the transcript open — `playing`, `onPlayingChange`, `unplayed`, `onEnded`, `transcriptExpanded`, `onTranscriptExpandedChange`. |
|
|
162
162
|
|
|
163
163
|
## Mistakes
|
|
164
164
|
- A `<video>` cropped round by hand in a bubble → use `VideoNote`: it plays one sound at a time, draws the transfer on its disk and keeps the meta on its pill.
|
|
@@ -1,12 +1,25 @@
|
|
|
1
|
-
/** The parent knows what plays
|
|
1
|
+
/** The parent knows what plays, marks the report as watched on the first play and as seen to the end when it ends, and keeps the transcript open — `playing`, `onPlayingChange`, `unplayed`, `onEnded`, `transcriptExpanded`, `onTranscriptExpandedChange`. */
|
|
2
2
|
import { Typography, VideoNote } from "prime-ui-kit";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
const VIDEO_URL = "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4";
|
|
6
6
|
|
|
7
|
+
const TRANSCRIPT =
|
|
8
|
+
"Стойка собрана, кабели промаркированы. Жду подтверждения, чтобы включить питание.";
|
|
9
|
+
|
|
7
10
|
export default function VideoNoteControlledExample() {
|
|
8
11
|
const [playing, setPlaying] = React.useState(false);
|
|
9
12
|
const [unplayed, setUnplayed] = React.useState(true);
|
|
13
|
+
const [seen, setSeen] = React.useState(false);
|
|
14
|
+
const [transcriptOpen, setTranscriptOpen] = React.useState(true);
|
|
15
|
+
|
|
16
|
+
const state = playing
|
|
17
|
+
? "Воспроизводится"
|
|
18
|
+
: seen
|
|
19
|
+
? "Досмотрено до конца"
|
|
20
|
+
: unplayed
|
|
21
|
+
? "Ещё не просмотрено"
|
|
22
|
+
: "Просмотрено";
|
|
10
23
|
|
|
11
24
|
return (
|
|
12
25
|
<>
|
|
@@ -19,9 +32,13 @@ export default function VideoNoteControlledExample() {
|
|
|
19
32
|
setPlaying(next);
|
|
20
33
|
if (next) setUnplayed(false);
|
|
21
34
|
}}
|
|
35
|
+
onEnded={() => setSeen(true)}
|
|
36
|
+
transcript={TRANSCRIPT}
|
|
37
|
+
transcriptExpanded={transcriptOpen}
|
|
38
|
+
onTranscriptExpandedChange={setTranscriptOpen}
|
|
22
39
|
/>
|
|
23
40
|
<Typography as="p" variant="body-s" tone="secondary">
|
|
24
|
-
{
|
|
41
|
+
{state} · расшифровка {transcriptOpen ? "открыта" : "свёрнута"}
|
|
25
42
|
</Typography>
|
|
26
43
|
</>
|
|
27
44
|
);
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
/** Round video messages in a field crew chat: the circle is the message itself, the time stands on its pill
|
|
1
|
+
/** Round video messages in a field crew chat: the circle is the message itself, the time stands on its pill, the reply follows as text and the answer circle shows the cover its server made — `Message.Root`, `time`, `status`, `poster`. */
|
|
2
2
|
import { Message, VideoNote } from "prime-ui-kit";
|
|
3
3
|
|
|
4
4
|
import styles from "./examples.module.css";
|
|
5
5
|
|
|
6
6
|
const VIDEO_URL = "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4";
|
|
7
7
|
|
|
8
|
+
/** The cover the media server made for the reply: shown at once, before the first frame. */
|
|
9
|
+
const POSTER_URL = "https://picsum.photos/seed/server-rack/480/480";
|
|
10
|
+
|
|
8
11
|
export default function VideoNoteInMessageExample() {
|
|
9
12
|
return (
|
|
10
13
|
<div className={styles.thread}>
|
|
@@ -15,7 +18,7 @@ export default function VideoNoteInMessageExample() {
|
|
|
15
18
|
<Message.Text>Вижу, стойка собрана. Подключайте питание.</Message.Text>
|
|
16
19
|
</Message.Root>
|
|
17
20
|
<Message.Root direction="outgoing" time="13:51" status="read">
|
|
18
|
-
<VideoNote src={VIDEO_URL} duration={6} />
|
|
21
|
+
<VideoNote src={VIDEO_URL} duration={6} poster={POSTER_URL} />
|
|
19
22
|
</Message.Root>
|
|
20
23
|
</div>
|
|
21
24
|
);
|
|
@@ -69,7 +69,8 @@ No `labels`.
|
|
|
69
69
|
## Examples
|
|
70
70
|
| Example | Shows |
|
|
71
71
|
|---|---|
|
|
72
|
-
| [overview.tsx](examples/overview.tsx) | A count that sighted users read from the layout, said in words to screen readers, and a polite announcement after an action — `VisuallyHidden`. |
|
|
72
|
+
| [overview.tsx](examples/overview.tsx) | A count that sighted users read from the layout, said in words to screen readers, and a polite announcement after an action — `VisuallyHidden`, `live`. |
|
|
73
|
+
| [assertive.tsx](examples/assertive.tsx) | A failed save shown by a badge on screen and announced at once, interrupting the screen reader — `live`. |
|
|
73
74
|
|
|
74
75
|
## Mistakes
|
|
75
76
|
- `display: none` or `hidden` for screen-reader text → both remove it from the accessibility tree.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** A failed save shown by a badge on screen and announced at once, interrupting the screen reader — `live`. */
|
|
2
|
+
import { Badge, Button, VisuallyHidden } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
/** The server refusing the save a beat later. */
|
|
6
|
+
const saveInvoice = () =>
|
|
7
|
+
new Promise<void>((_, reject) => setTimeout(() => reject(new Error("offline")), 700));
|
|
8
|
+
|
|
9
|
+
export default function VisuallyHiddenAssertiveExample() {
|
|
10
|
+
const [saving, setSaving] = React.useState(false);
|
|
11
|
+
const [failed, setFailed] = React.useState(false);
|
|
12
|
+
|
|
13
|
+
const save = async () => {
|
|
14
|
+
setSaving(true);
|
|
15
|
+
setFailed(false);
|
|
16
|
+
try {
|
|
17
|
+
await saveInvoice();
|
|
18
|
+
} catch {
|
|
19
|
+
setFailed(true);
|
|
20
|
+
}
|
|
21
|
+
setSaving(false);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<>
|
|
26
|
+
<Button.Root loading={saving} onClick={save}>
|
|
27
|
+
Сохранить счёт
|
|
28
|
+
</Button.Root>
|
|
29
|
+
{failed ? (
|
|
30
|
+
<Badge.Root color="red" aria-hidden="true">
|
|
31
|
+
Не сохранено
|
|
32
|
+
</Badge.Root>
|
|
33
|
+
) : null}
|
|
34
|
+
<VisuallyHidden live="assertive">
|
|
35
|
+
{failed ? "Счёт не сохранён: нет связи с сервером. Повторите попытку." : ""}
|
|
36
|
+
</VisuallyHidden>
|
|
37
|
+
</>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -84,7 +84,7 @@ One look. Colors are semantic roles only (`accent-default`, `accent-fg`, `fill-s
|
|
|
84
84
|
### Flags
|
|
85
85
|
| Value | Looks like | Use when | Default |
|
|
86
86
|
|---|---|---|---|
|
|
87
|
-
| `unplayed` | an accent dot after the time; it
|
|
87
|
+
| `unplayed` | an accent dot after the time; it rises in with a fade and sinks out the same way | the recipient has not listened yet | |
|
|
88
88
|
| `disabled` | muted disk, no played bars, disabled time | the recording cannot be played (deleted, expired) | |
|
|
89
89
|
|
|
90
90
|
## States
|
|
@@ -172,11 +172,11 @@ One look. Colors are semantic roles only (`accent-default`, `accent-fg`, `fill-s
|
|
|
172
172
|
|---|---|
|
|
173
173
|
| [overview.tsx](examples/overview.tsx) | A client's voice message to support, ready to play — `src`, `waveform`, `duration`. |
|
|
174
174
|
| [states.tsx](examples/states.tsx) | Every state side by side, each labelled by its prop: the transfer is drawn on the play disk itself — in flight with the cross and the ring, failed with the retry, not fetched with the download arrow — `unplayed`, `transfer`, `transferProgress`, `disabled`. |
|
|
175
|
-
| [call-recording.tsx](examples/call-recording.tsx) | A sales call recording on a deal card: the player takes the card's width — `className`. |
|
|
175
|
+
| [call-recording.tsx](examples/call-recording.tsx) | A sales call recording on a deal card: the telephony stores no levels, so the waveform is read from the audio itself and the calm flat row fills in once it is ready; the player takes the card's width — `getWaveform`, `waveform`, `className`. |
|
|
176
176
|
| [in-message.tsx](examples/in-message.tsx) | Voice messages in a support chat: the player sits on the bubble fill and the bubble's time stands in its corner — `Message.Root`, `time`, `status`. |
|
|
177
177
|
| [transcript.tsx](examples/transcript.tsx) | Voice messages with a transcript: one known, one asked for on the first open — `transcript`, `onTranscribe`. |
|
|
178
178
|
| [transfer.tsx](examples/transfer.tsx) | One look for a recording on its way in either direction: the client's voice message waits to be fetched and then arrives, the reply is being sent — the play disk itself carries the cross and the ring of the share, a dropped connection offers a retry, and the play glyph comes back once it is through — `transfer`, `transferProgress`, `transferDirection`, `onCancel`, `onRetry`, `onDownload`. |
|
|
179
|
-
| [controlled.tsx](examples/controlled.tsx) | The parent knows what plays, marks the message as listened on the first play and keeps the speed — `playing`, `onPlayingChange`, `unplayed`, `rate`, `onRateChange`. |
|
|
179
|
+
| [controlled.tsx](examples/controlled.tsx) | The parent knows what plays, marks the message as listened on the first play and as heard to the end when it ends, keeps the speed and keeps the transcript open — `playing`, `onPlayingChange`, `unplayed`, `onEnded`, `rate`, `onRateChange`, `transcriptExpanded`, `onTranscriptExpandedChange`. |
|
|
180
180
|
|
|
181
181
|
## Mistakes
|
|
182
182
|
- A hand-made `<audio controls>` in a bubble → use `VoicePlayer`: it matches the bubble's colors and keeps room for the time.
|
|
@@ -1,17 +1,27 @@
|
|
|
1
|
-
/** A sales call recording on a deal card: the player takes the card's width — `className`. */
|
|
2
|
-
import { Card, Typography, VoicePlayer } from "prime-ui-kit";
|
|
1
|
+
/** A sales call recording on a deal card: the telephony stores no levels, so the waveform is read from the audio itself and the calm flat row fills in once it is ready; the player takes the card's width — `getWaveform`, `waveform`, `className`. */
|
|
2
|
+
import { Card, getWaveform, Typography, VoicePlayer } from "prime-ui-kit";
|
|
3
|
+
import * as React from "react";
|
|
3
4
|
|
|
4
5
|
import styles from "./examples.module.css";
|
|
5
6
|
|
|
6
7
|
const RECORDING_URL = "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3";
|
|
7
8
|
|
|
8
|
-
const WAVEFORM = [
|
|
9
|
-
0.2, 0.34, 0.5, 0.42, 0.6, 0.78, 0.66, 0.4, 0.3, 0.52, 0.7, 0.86, 0.74, 0.48, 0.36, 0.58, 0.8,
|
|
10
|
-
0.62, 0.38, 0.26, 0.44, 0.68, 0.9, 0.72, 0.5, 0.32, 0.46, 0.64, 0.54, 0.3, 0.22, 0.4, 0.6, 0.76,
|
|
11
|
-
0.56, 0.34,
|
|
12
|
-
];
|
|
13
|
-
|
|
14
9
|
export default function VoicePlayerCallRecordingExample() {
|
|
10
|
+
const [waveform, setWaveform] = React.useState<number[]>();
|
|
11
|
+
|
|
12
|
+
React.useEffect(() => {
|
|
13
|
+
let current = true;
|
|
14
|
+
getWaveform(RECORDING_URL)
|
|
15
|
+
.then((levels) => {
|
|
16
|
+
if (current) setWaveform([...levels]);
|
|
17
|
+
})
|
|
18
|
+
// Without levels the player keeps its flat row: the recording still plays.
|
|
19
|
+
.catch(() => {});
|
|
20
|
+
return () => {
|
|
21
|
+
current = false;
|
|
22
|
+
};
|
|
23
|
+
}, []);
|
|
24
|
+
|
|
15
25
|
return (
|
|
16
26
|
<Card.Root className={styles.card}>
|
|
17
27
|
<Card.Body className={styles.body}>
|
|
@@ -24,7 +34,7 @@ export default function VoicePlayerCallRecordingExample() {
|
|
|
24
34
|
<VoicePlayer
|
|
25
35
|
className={styles.player}
|
|
26
36
|
src={RECORDING_URL}
|
|
27
|
-
waveform={
|
|
37
|
+
waveform={waveform}
|
|
28
38
|
duration={754}
|
|
29
39
|
aria-label="Запись звонка"
|
|
30
40
|
/>
|