prime-ui-kit 0.6.0 → 0.7.1
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/dist/components/accordion/examples/02-settings-panels.d.ts.map +1 -1
- package/dist/components/accordion/examples/04-api-docs-sections.d.ts.map +1 -1
- package/dist/components/accordion/examples/05-knowledge-base-categories.d.ts.map +1 -1
- package/dist/components/avatar/examples/app-header-nav.d.ts.map +1 -1
- package/dist/components/avatar/examples/src-from-state.d.ts.map +1 -1
- package/dist/components/banner/examples/cookie-consent-row.d.ts.map +1 -1
- package/dist/components/banner/examples/feature-promo.d.ts.map +1 -1
- package/dist/components/checkbox/examples/bulk-select-rows.d.ts.map +1 -1
- package/dist/components/checkbox/examples/empty-label-form.d.ts.map +1 -1
- package/dist/components/checkbox/examples/feature-flags-list.d.ts.map +1 -1
- package/dist/components/checkbox/examples/settings-panel.d.ts.map +1 -1
- package/dist/components/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/color-picker/ColorPickerRac.d.ts.map +1 -1
- package/dist/components/color-picker/examples/controlled-form-field.d.ts.map +1 -1
- package/dist/components/color-picker/examples/theme-accent.d.ts.map +1 -1
- package/dist/components/command-menu/examples/composition-tags-footer.d.ts.map +1 -1
- package/dist/components/command-menu/examples/variants-density-items.d.ts.map +1 -1
- package/dist/components/datepicker/examples/full-width-form.d.ts.map +1 -1
- package/dist/components/digit-input/examples/error-state.d.ts.map +1 -1
- package/dist/components/digit-input/examples/resend-and-clear.d.ts.map +1 -1
- package/dist/components/divider/examples/section-breaks.d.ts.map +1 -1
- package/dist/components/dropdown/Dropdown.d.ts +0 -14
- package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/components/dropdown/examples/account-menu.d.ts.map +1 -1
- package/dist/components/dropdown/examples/actions-menu.d.ts.map +1 -1
- package/dist/components/dropdown/examples/full-width.d.ts.map +1 -1
- package/dist/components/empty-page/EmptyPage.d.ts +63 -0
- package/dist/components/empty-page/EmptyPage.d.ts.map +1 -0
- package/dist/components/empty-page/examples/canonical.d.ts +3 -0
- package/dist/components/empty-page/examples/canonical.d.ts.map +1 -0
- package/dist/components/empty-page/examples/sizes.d.ts +3 -0
- package/dist/components/empty-page/examples/sizes.d.ts.map +1 -0
- package/dist/components/empty-page/examples/table-region.d.ts +6 -0
- package/dist/components/empty-page/examples/table-region.d.ts.map +1 -0
- package/dist/components/hint/examples/a11y-describedby.d.ts.map +1 -1
- package/dist/components/hint/examples/error-hint.d.ts.map +1 -1
- package/dist/components/hint/examples/field-help.d.ts.map +1 -1
- package/dist/components/hint/examples/field-states.d.ts.map +1 -1
- package/dist/components/hint/examples/inline-tip-form.d.ts.map +1 -1
- package/dist/components/hint/examples/success-confirmation.d.ts.map +1 -1
- package/dist/components/hint/examples/variants.d.ts.map +1 -1
- package/dist/components/index.css +254 -106
- package/dist/components/index.css.map +4 -4
- package/dist/components/index.d.ts +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +373 -337
- package/dist/components/index.js.map +4 -4
- package/dist/components/input/examples/login-email.d.ts.map +1 -1
- package/dist/components/input/examples/search.d.ts.map +1 -1
- package/dist/components/link-button/examples/disabled.d.ts.map +1 -1
- package/dist/components/link-button/examples/external.d.ts.map +1 -1
- package/dist/components/link-button/examples/inline-text-link.d.ts.map +1 -1
- package/dist/components/link-button/examples/navigation-cluster.d.ts.map +1 -1
- package/dist/components/modal/examples/pattern-controlled.d.ts.map +1 -1
- package/dist/components/modal/examples/pattern-portal-and-scroll.d.ts.map +1 -1
- package/dist/components/modal/examples/scenario-multi-field-form.d.ts.map +1 -1
- package/dist/components/notification/examples/action-toast.d.ts.map +1 -1
- package/dist/components/notification/examples/error-success.d.ts.map +1 -1
- package/dist/components/popover/Popover.d.ts +3 -3
- package/dist/components/popover/Popover.d.ts.map +1 -1
- package/dist/components/popover/examples/composition.d.ts +1 -1
- package/dist/components/popover/examples/date-trigger.d.ts.map +1 -1
- package/dist/components/popover/examples/features.d.ts.map +1 -1
- package/dist/components/popover/examples/form-in-popover.d.ts.map +1 -1
- package/dist/components/popover/examples/full-width.d.ts.map +1 -1
- package/dist/components/popover/examples/placement.d.ts.map +1 -1
- package/dist/components/popover/examples/rich-content.d.ts.map +1 -1
- package/dist/components/popover/examples/sizes.d.ts +1 -1
- package/dist/components/progress-bar/examples/step-progress.d.ts.map +1 -1
- package/dist/components/progress-circle/examples/dashboard-ring.d.ts.map +1 -1
- package/dist/components/progress-circle/examples/states.d.ts.map +1 -1
- package/dist/components/radio/examples/plan-picker.d.ts.map +1 -1
- package/dist/components/segmented-control/examples/pricing-toggle.d.ts.map +1 -1
- package/dist/components/segmented-control/examples/view-mode.d.ts.map +1 -1
- package/dist/components/select/examples/01-country.d.ts.map +1 -1
- package/dist/components/select/examples/02-controlled.d.ts.map +1 -1
- package/dist/components/select/examples/03-groups.d.ts.map +1 -1
- package/dist/components/select/examples/04-full-width-form.d.ts.map +1 -1
- package/dist/components/switch/examples/composition.d.ts.map +1 -1
- package/dist/components/switch/examples/scenario-feature-flag.d.ts.map +1 -1
- package/dist/components/tabs/examples/01-settings-vertical-rail.d.ts.map +1 -1
- package/dist/components/tag/examples/controlled.d.ts.map +1 -1
- package/dist/components/textarea/examples/01-support-ticket.d.ts.map +1 -1
- package/dist/components/textarea/examples/02-comment.d.ts.map +1 -1
- package/dist/components/textarea/examples/controlled.d.ts.map +1 -1
- package/dist/components/textarea/examples/features.d.ts.map +1 -1
- package/dist/components/tooltip/examples/composition.d.ts.map +1 -1
- package/dist/index.css +254 -106
- package/dist/index.css.map +4 -4
- package/dist/index.js +375 -338
- package/dist/index.js.map +4 -4
- package/dist/internal/states.d.ts +2 -0
- package/dist/internal/states.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/accordion/COMPONENT.md +1 -1
- package/src/components/accordion/examples/01-faq-marketing.tsx +1 -1
- package/src/components/accordion/examples/02-settings-panels.tsx +1 -6
- package/src/components/accordion/examples/03-checkout-order-summary.tsx +1 -1
- package/src/components/accordion/examples/04-api-docs-sections.tsx +0 -1
- package/src/components/accordion/examples/05-knowledge-base-categories.tsx +1 -7
- package/src/components/avatar/COMPONENT.md +2 -2
- package/src/components/avatar/examples/app-header-nav.tsx +5 -13
- package/src/components/avatar/examples/comment-thread.tsx +1 -1
- package/src/components/avatar/examples/src-from-state.tsx +0 -1
- package/src/components/badge/examples/admin-tags.tsx +6 -6
- package/src/components/badge/examples/ecommerce-inventory.tsx +5 -5
- package/src/components/badge/examples/inbox-labels.tsx +5 -5
- package/src/components/badge/examples/status-presence.tsx +4 -4
- package/src/components/banner/examples/controlled-visibility.tsx +1 -1
- package/src/components/banner/examples/cookie-consent-row.tsx +0 -1
- package/src/components/banner/examples/feature-promo.tsx +0 -1
- package/src/components/button/examples/canonical-composition.tsx +4 -4
- package/src/components/button/examples/destructive-confirm.tsx +3 -3
- package/src/components/button/examples/form-submit-row.tsx +2 -2
- package/src/components/button/examples/full-width-stack.tsx +2 -2
- package/src/components/button/examples/icon-composition.tsx +6 -6
- package/src/components/button/examples/toolbar.tsx +4 -4
- package/src/components/button-group/COMPONENT.md +1 -1
- package/src/components/button-group/examples/editor-toolbar.tsx +1 -1
- package/src/components/button-group/examples/form-footer.tsx +1 -1
- package/src/components/button-group/examples/full-width.tsx +1 -1
- package/src/components/button-group/examples/view-switcher.tsx +1 -1
- package/src/components/button-group/examples/wizard-actions.tsx +1 -1
- package/src/components/checkbox/examples/bulk-select-rows.tsx +0 -2
- package/src/components/checkbox/examples/empty-label-form.tsx +1 -2
- package/src/components/checkbox/examples/feature-flags-list.tsx +0 -1
- package/src/components/checkbox/examples/settings-panel.tsx +1 -4
- package/src/components/color-picker/COMPONENT.md +2 -2
- package/src/components/color-picker/examples/brand-kit.tsx +3 -3
- package/src/components/color-picker/examples/controlled-form-field.tsx +4 -6
- package/src/components/color-picker/examples/field-eyedropper.tsx +2 -2
- package/src/components/color-picker/examples/format-variants.tsx +2 -2
- package/src/components/color-picker/examples/full-width.tsx +2 -2
- package/src/components/color-picker/examples/minimal-popover.tsx +2 -2
- package/src/components/color-picker/examples/panel-placement.tsx +4 -4
- package/src/components/color-picker/examples/product-variant-swatch.tsx +2 -2
- package/src/components/color-picker/examples/readout-trigger.tsx +2 -2
- package/src/components/color-picker/examples/states.tsx +4 -4
- package/src/components/color-picker/examples/theme-accent.tsx +2 -7
- package/src/components/command-menu/examples/app-palette.tsx +1 -1
- package/src/components/command-menu/examples/composition-tags-footer.tsx +2 -7
- package/src/components/command-menu/examples/controlled-open-search.tsx +1 -1
- package/src/components/command-menu/examples/disabled-items.tsx +1 -1
- package/src/components/command-menu/examples/file-search.tsx +1 -1
- package/src/components/command-menu/examples/full-width-panel.tsx +1 -1
- package/src/components/command-menu/examples/item-icon-as.tsx +1 -1
- package/src/components/command-menu/examples/quick-actions.tsx +1 -1
- package/src/components/command-menu/examples/variants-density-items.tsx +2 -4
- package/src/components/data-table/COMPONENT.md +2 -0
- package/src/components/datepicker/examples/birthdate.tsx +2 -2
- package/src/components/datepicker/examples/booking.tsx +2 -2
- package/src/components/datepicker/examples/full-width-form.tsx +3 -10
- package/src/components/datepicker/examples/range-report.tsx +2 -2
- package/src/components/digit-input/examples/composition.tsx +3 -3
- package/src/components/digit-input/examples/error-state.tsx +3 -5
- package/src/components/digit-input/examples/otp-login.tsx +3 -3
- package/src/components/digit-input/examples/resend-and-clear.tsx +3 -9
- package/src/components/digit-input/examples/verification-step.tsx +4 -4
- package/src/components/divider/examples/card-splits.tsx +2 -2
- package/src/components/divider/examples/inset-stack.tsx +1 -1
- package/src/components/divider/examples/line-spacing-column.tsx +3 -3
- package/src/components/divider/examples/section-breaks.tsx +2 -6
- package/src/components/drawer/COMPONENT.md +1 -1
- package/src/components/drawer/examples/cart-preview.tsx +4 -4
- package/src/components/drawer/examples/explicit-panel.tsx +3 -3
- package/src/components/drawer/examples/filters-panel.tsx +7 -7
- package/src/components/drawer/examples/mobile-nav-sheet.tsx +3 -3
- package/src/components/drawer/examples/settings-side.tsx +6 -6
- package/src/components/dropdown/COMPONENT.md +5 -18
- package/src/components/dropdown/examples/account-menu.tsx +31 -33
- package/src/components/dropdown/examples/actions-menu.tsx +0 -1
- package/src/components/dropdown/examples/composition.tsx +1 -1
- package/src/components/dropdown/examples/controlled.tsx +1 -1
- package/src/components/dropdown/examples/dropdown-examples.module.css +0 -4
- package/src/components/dropdown/examples/full-width.tsx +0 -1
- package/src/components/dropdown/examples/select-like-list.tsx +1 -1
- package/src/components/dropdown/examples/states.tsx +1 -1
- package/src/components/dropdown/examples/variants.tsx +1 -1
- package/src/components/empty-page/COMPONENT.md +143 -0
- package/src/components/empty-page/examples/canonical.tsx +22 -0
- package/src/components/empty-page/examples/examples-demos.module.css +25 -0
- package/src/components/empty-page/examples/sizes.tsx +23 -0
- package/src/components/empty-page/examples/table-region.tsx +35 -0
- package/src/components/file-upload/examples/full-width.tsx +1 -1
- package/src/components/hint/examples/a11y-describedby.tsx +2 -4
- package/src/components/hint/examples/controlled-variant.tsx +1 -1
- package/src/components/hint/examples/error-hint.tsx +3 -5
- package/src/components/hint/examples/field-help.tsx +3 -5
- package/src/components/hint/examples/field-states.tsx +9 -19
- package/src/components/hint/examples/inline-tip-form.tsx +6 -10
- package/src/components/hint/examples/success-confirmation.tsx +3 -5
- package/src/components/hint/examples/variants.tsx +3 -9
- package/src/components/hint/examples/with-icon.tsx +1 -1
- package/src/components/input/examples/affix-url-and-amount.tsx +2 -2
- package/src/components/input/examples/checkout-full-width.tsx +2 -2
- package/src/components/input/examples/login-email.tsx +1 -5
- package/src/components/input/examples/password-with-hint.tsx +1 -1
- package/src/components/input/examples/search.tsx +0 -1
- package/src/components/kbd/examples/composition-chord-icon.tsx +1 -1
- package/src/components/kbd/examples/toolbar-hints.tsx +2 -2
- package/src/components/label/examples/with-icon.tsx +1 -1
- package/src/components/link-button/COMPONENT.md +1 -1
- package/src/components/link-button/examples/composition.tsx +3 -3
- package/src/components/link-button/examples/disabled.tsx +2 -4
- package/src/components/link-button/examples/external.tsx +1 -6
- package/src/components/link-button/examples/inline-text-link.tsx +2 -4
- package/src/components/link-button/examples/navigation-cluster.tsx +4 -12
- package/src/components/modal/COMPONENT.md +4 -4
- package/src/components/modal/examples/canonical-maximal.tsx +4 -4
- package/src/components/modal/examples/pattern-close-behavior.tsx +3 -3
- package/src/components/modal/examples/pattern-controlled.tsx +3 -5
- package/src/components/modal/examples/pattern-full-width-footer.tsx +3 -3
- package/src/components/modal/examples/pattern-portal-and-scroll.tsx +3 -5
- package/src/components/modal/examples/scenario-confirm-delete.tsx +3 -3
- package/src/components/modal/examples/scenario-edit-entity.tsx +4 -4
- package/src/components/modal/examples/scenario-legal-consent.tsx +2 -2
- package/src/components/modal/examples/scenario-multi-field-form.tsx +7 -13
- package/src/components/notification/examples/action-toast.tsx +0 -2
- package/src/components/notification/examples/error-success.tsx +0 -2
- package/src/components/page-content/COMPONENT.md +1 -0
- package/src/components/popover/COMPONENT.md +1 -1
- package/src/components/popover/examples/as-child.tsx +1 -1
- package/src/components/popover/examples/canonical-panel.tsx +2 -2
- package/src/components/popover/examples/composition.tsx +7 -7
- package/src/components/popover/examples/controlled.tsx +4 -4
- package/src/components/popover/examples/date-trigger.tsx +3 -10
- package/src/components/popover/examples/features.tsx +6 -13
- package/src/components/popover/examples/form-in-popover.tsx +5 -13
- package/src/components/popover/examples/full-width.tsx +2 -9
- package/src/components/popover/examples/inset-variants.tsx +6 -6
- package/src/components/popover/examples/placement.tsx +2 -7
- package/src/components/popover/examples/rich-content.tsx +6 -8
- package/src/components/popover/examples/sizes.tsx +5 -5
- package/src/components/popover/examples/states.tsx +4 -4
- package/src/components/progress-bar/examples/indeterminate-busy-state.tsx +1 -1
- package/src/components/progress-bar/examples/step-progress.tsx +0 -1
- package/src/components/progress-bar/examples/upload-progress.tsx +1 -1
- package/src/components/progress-bar/examples/wizard-composition.tsx +1 -1
- package/src/components/progress-circle/examples/a11y-label.tsx +1 -1
- package/src/components/progress-circle/examples/composition.tsx +2 -2
- package/src/components/progress-circle/examples/dashboard-ring.tsx +1 -6
- package/src/components/progress-circle/examples/max-scale.tsx +3 -3
- package/src/components/progress-circle/examples/states.tsx +5 -13
- package/src/components/radio/examples/notification-channel.tsx +3 -3
- package/src/components/radio/examples/plan-picker.tsx +0 -3
- package/src/components/radio/examples/settings-group.tsx +4 -4
- package/src/components/radio/examples/shipping-method.tsx +3 -3
- package/src/components/segmented-control/examples/canonical-composition.tsx +7 -7
- package/src/components/segmented-control/examples/composition.tsx +7 -7
- package/src/components/segmented-control/examples/features.tsx +3 -3
- package/src/components/segmented-control/examples/full-width.tsx +1 -1
- package/src/components/segmented-control/examples/pricing-toggle.tsx +0 -1
- package/src/components/segmented-control/examples/states.tsx +3 -3
- package/src/components/segmented-control/examples/view-mode.tsx +0 -1
- package/src/components/segmented-progress-bar/examples/size-ladder.tsx +1 -1
- package/src/components/select/COMPONENT.md +3 -3
- package/src/components/select/examples/01-country.tsx +2 -4
- package/src/components/select/examples/02-controlled.tsx +2 -4
- package/src/components/select/examples/03-groups.tsx +2 -4
- package/src/components/select/examples/04-full-width-form.tsx +4 -8
- package/src/components/select/examples/pattern-composition.tsx +1 -1
- package/src/components/select/examples/pattern-controlled.tsx +1 -1
- package/src/components/select/examples/pattern-features.tsx +1 -1
- package/src/components/select/examples/pattern-full-width.tsx +1 -1
- package/src/components/select/examples/pattern-native.tsx +1 -1
- package/src/components/select/examples/pattern-states.tsx +4 -4
- package/src/components/slider/COMPONENT.md +1 -1
- package/src/components/stepper/COMPONENT.md +1 -1
- package/src/components/stepper/examples/01-checkout-horizontal.tsx +1 -1
- package/src/components/stepper/examples/02-onboarding-vertical.tsx +1 -1
- package/src/components/stepper/examples/03-vertical-primitive-rail.tsx +1 -1
- package/src/components/stepper/examples/04-checkout-step-error.tsx +1 -1
- package/src/components/stepper/examples/05-horizontal-primitive.tsx +1 -1
- package/src/components/switch/COMPONENT.md +1 -1
- package/src/components/switch/examples/canonical-maximal.tsx +1 -1
- package/src/components/switch/examples/composition.tsx +1 -2
- package/src/components/switch/examples/controlled.tsx +1 -1
- package/src/components/switch/examples/full-width.tsx +1 -1
- package/src/components/switch/examples/scenario-billing-annual.tsx +1 -1
- package/src/components/switch/examples/scenario-feature-flag.tsx +1 -6
- package/src/components/switch/examples/scenario-settings-toggle.tsx +3 -3
- package/src/components/switch/examples/states.tsx +6 -6
- package/src/components/switch/examples/variants.tsx +2 -2
- package/src/components/tabs/COMPONENT.md +1 -1
- package/src/components/tabs/examples/01-settings-vertical-rail.tsx +1 -6
- package/src/components/tag/COMPONENT.md +1 -1
- package/src/components/tag/examples/01-filter-chips.tsx +1 -1
- package/src/components/tag/examples/02-removable-selected-values.tsx +1 -1
- package/src/components/tag/examples/03-status-metadata.tsx +3 -3
- package/src/components/tag/examples/controlled.tsx +1 -6
- package/src/components/tag/examples/removable.tsx +1 -1
- package/src/components/textarea/examples/01-support-ticket.tsx +0 -1
- package/src/components/textarea/examples/02-comment.tsx +1 -2
- package/src/components/textarea/examples/composition.tsx +2 -2
- package/src/components/textarea/examples/controlled.tsx +0 -1
- package/src/components/textarea/examples/features.tsx +3 -12
- package/src/components/textarea/examples/full-width.tsx +1 -1
- package/src/components/textarea/examples/states.tsx +4 -4
- package/src/components/textarea/examples/variants.tsx +2 -2
- package/src/components/tooltip/COMPONENT.md +0 -1
- package/src/components/tooltip/examples/canonical-icon-hint.tsx +1 -1
- package/src/components/tooltip/examples/composition.tsx +3 -9
- package/src/components/tooltip/examples/controlled.tsx +2 -2
- package/src/components/tooltip/examples/delay.tsx +1 -1
- package/src/components/tooltip/examples/long-content.tsx +2 -2
- package/src/components/tooltip/examples/side.tsx +4 -4
- package/src/components/tooltip/examples/states.tsx +2 -2
- package/src/components/tooltip/examples/surfaces.tsx +2 -2
- package/dist/components/dropdown/examples/inset.d.ts +0 -3
- package/dist/components/dropdown/examples/inset.d.ts.map +0 -1
- package/src/components/dropdown/examples/inset.tsx +0 -51
|
@@ -15,13 +15,13 @@ export default function DrawerExampleCartPreview() {
|
|
|
15
15
|
return (
|
|
16
16
|
<Drawer.Root>
|
|
17
17
|
<Drawer.Trigger>
|
|
18
|
-
<Button.Root type="button"
|
|
18
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
19
19
|
Cart (3)
|
|
20
20
|
</Button.Root>
|
|
21
21
|
</Drawer.Trigger>
|
|
22
22
|
<Drawer.Portal>
|
|
23
23
|
<Drawer.Overlay />
|
|
24
|
-
<Drawer.Content side="right"
|
|
24
|
+
<Drawer.Content side="right" aria-labelledby="drawer-cart-title">
|
|
25
25
|
<Drawer.Header>
|
|
26
26
|
<Drawer.Title id="drawer-cart-title">Your cart</Drawer.Title>
|
|
27
27
|
</Drawer.Header>
|
|
@@ -38,12 +38,12 @@ export default function DrawerExampleCartPreview() {
|
|
|
38
38
|
</Drawer.Body>
|
|
39
39
|
<Drawer.Footer className={styles.footerActions}>
|
|
40
40
|
<Drawer.Close>
|
|
41
|
-
<Button.Root type="button"
|
|
41
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
42
42
|
View cart
|
|
43
43
|
</Button.Root>
|
|
44
44
|
</Drawer.Close>
|
|
45
45
|
<Drawer.Close>
|
|
46
|
-
<Button.Root type="button"
|
|
46
|
+
<Button.Root type="button" variant="primary">
|
|
47
47
|
Checkout
|
|
48
48
|
</Button.Root>
|
|
49
49
|
</Drawer.Close>
|
|
@@ -10,13 +10,13 @@ export default function DrawerExampleExplicitPanel() {
|
|
|
10
10
|
return (
|
|
11
11
|
<Drawer.Root>
|
|
12
12
|
<Drawer.Trigger>
|
|
13
|
-
<Button.Root type="button"
|
|
13
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
14
14
|
Open explicit panel
|
|
15
15
|
</Button.Root>
|
|
16
16
|
</Drawer.Trigger>
|
|
17
17
|
<Drawer.Portal>
|
|
18
18
|
<Drawer.Overlay />
|
|
19
|
-
<Drawer.Panel side="right"
|
|
19
|
+
<Drawer.Panel side="right" aria-labelledby="drawer-explicit-title">
|
|
20
20
|
<Drawer.Header>
|
|
21
21
|
<Drawer.Title id="drawer-explicit-title">Details</Drawer.Title>
|
|
22
22
|
</Drawer.Header>
|
|
@@ -28,7 +28,7 @@ export default function DrawerExampleExplicitPanel() {
|
|
|
28
28
|
</Drawer.Content>
|
|
29
29
|
<Drawer.Footer>
|
|
30
30
|
<Drawer.Close>
|
|
31
|
-
<Button.Root type="button"
|
|
31
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
32
32
|
Close
|
|
33
33
|
</Button.Root>
|
|
34
34
|
</Drawer.Close>
|
|
@@ -11,37 +11,37 @@ export default function DrawerExampleFiltersPanel() {
|
|
|
11
11
|
return (
|
|
12
12
|
<Drawer.Root>
|
|
13
13
|
<Drawer.Trigger>
|
|
14
|
-
<Button.Root type="button"
|
|
14
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
15
15
|
Filters
|
|
16
16
|
</Button.Root>
|
|
17
17
|
</Drawer.Trigger>
|
|
18
18
|
<Drawer.Portal>
|
|
19
19
|
<Drawer.Overlay />
|
|
20
|
-
<Drawer.Content side="left"
|
|
20
|
+
<Drawer.Content side="left" aria-labelledby="drawer-filters-title">
|
|
21
21
|
<Drawer.Header>
|
|
22
22
|
<Drawer.Title id="drawer-filters-title">Filters</Drawer.Title>
|
|
23
23
|
</Drawer.Header>
|
|
24
24
|
<Drawer.Body>
|
|
25
25
|
<div className={styles.filterStack}>
|
|
26
|
-
<Checkbox.Root
|
|
26
|
+
<Checkbox.Root defaultChecked>
|
|
27
27
|
<Checkbox.Label>In stock only</Checkbox.Label>
|
|
28
28
|
</Checkbox.Root>
|
|
29
|
-
<Checkbox.Root
|
|
29
|
+
<Checkbox.Root>
|
|
30
30
|
<Checkbox.Label>On sale</Checkbox.Label>
|
|
31
31
|
</Checkbox.Root>
|
|
32
|
-
<Checkbox.Root
|
|
32
|
+
<Checkbox.Root>
|
|
33
33
|
<Checkbox.Label>Ships today</Checkbox.Label>
|
|
34
34
|
</Checkbox.Root>
|
|
35
35
|
</div>
|
|
36
36
|
</Drawer.Body>
|
|
37
37
|
<Drawer.Footer className={styles.footerActions}>
|
|
38
38
|
<Drawer.Close>
|
|
39
|
-
<Button.Root type="button"
|
|
39
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
40
40
|
Reset
|
|
41
41
|
</Button.Root>
|
|
42
42
|
</Drawer.Close>
|
|
43
43
|
<Drawer.Close>
|
|
44
|
-
<Button.Root type="button"
|
|
44
|
+
<Button.Root type="button" variant="primary">
|
|
45
45
|
Apply
|
|
46
46
|
</Button.Root>
|
|
47
47
|
</Drawer.Close>
|
|
@@ -12,13 +12,13 @@ export default function DrawerExampleMobileNavSheet() {
|
|
|
12
12
|
return (
|
|
13
13
|
<Drawer.Root>
|
|
14
14
|
<Drawer.Trigger>
|
|
15
|
-
<Button.Root type="button"
|
|
15
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
16
16
|
Menu
|
|
17
17
|
</Button.Root>
|
|
18
18
|
</Drawer.Trigger>
|
|
19
19
|
<Drawer.Portal>
|
|
20
20
|
<Drawer.Overlay />
|
|
21
|
-
<Drawer.Content side="bottom"
|
|
21
|
+
<Drawer.Content side="bottom" aria-labelledby="drawer-nav-title">
|
|
22
22
|
<Drawer.Header>
|
|
23
23
|
<Drawer.Title id="drawer-nav-title">Navigate</Drawer.Title>
|
|
24
24
|
</Drawer.Header>
|
|
@@ -26,7 +26,7 @@ export default function DrawerExampleMobileNavSheet() {
|
|
|
26
26
|
<nav className={styles.nav} aria-label="Primary">
|
|
27
27
|
{items.map((label) => (
|
|
28
28
|
<Drawer.Close key={label}>
|
|
29
|
-
<Button.Root type="button"
|
|
29
|
+
<Button.Root type="button" variant="neutral" mode="ghost" fullWidth>
|
|
30
30
|
{label}
|
|
31
31
|
</Button.Root>
|
|
32
32
|
</Drawer.Close>
|
|
@@ -11,24 +11,24 @@ export default function DrawerExampleSettingsSide() {
|
|
|
11
11
|
return (
|
|
12
12
|
<Drawer.Root>
|
|
13
13
|
<Drawer.Trigger>
|
|
14
|
-
<Button.Root type="button"
|
|
14
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
15
15
|
Workspace settings
|
|
16
16
|
</Button.Root>
|
|
17
17
|
</Drawer.Trigger>
|
|
18
18
|
<Drawer.Portal>
|
|
19
19
|
<Drawer.Overlay />
|
|
20
|
-
<Drawer.Content side="right"
|
|
20
|
+
<Drawer.Content side="right" aria-labelledby="drawer-settings-title">
|
|
21
21
|
<Drawer.Header>
|
|
22
22
|
<Drawer.Title id="drawer-settings-title">Workspace</Drawer.Title>
|
|
23
23
|
</Drawer.Header>
|
|
24
24
|
<Drawer.Body>
|
|
25
25
|
<div className={styles.settingsStack}>
|
|
26
|
-
<Input.Root label="Workspace name"
|
|
26
|
+
<Input.Root label="Workspace name">
|
|
27
27
|
<Input.Wrapper>
|
|
28
28
|
<Input.Field defaultValue="Acme Design" />
|
|
29
29
|
</Input.Wrapper>
|
|
30
30
|
</Input.Root>
|
|
31
|
-
<Input.Root label="Default timezone"
|
|
31
|
+
<Input.Root label="Default timezone" hint="Used for scheduled reports.">
|
|
32
32
|
<Input.Wrapper>
|
|
33
33
|
<Input.Field defaultValue="Europe/Berlin" />
|
|
34
34
|
</Input.Wrapper>
|
|
@@ -37,12 +37,12 @@ export default function DrawerExampleSettingsSide() {
|
|
|
37
37
|
</Drawer.Body>
|
|
38
38
|
<Drawer.Footer className={styles.footerActions}>
|
|
39
39
|
<Drawer.Close>
|
|
40
|
-
<Button.Root type="button"
|
|
40
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
41
41
|
Cancel
|
|
42
42
|
</Button.Root>
|
|
43
43
|
</Drawer.Close>
|
|
44
44
|
<Drawer.Close>
|
|
45
|
-
<Button.Root type="button"
|
|
45
|
+
<Button.Root type="button" variant="primary">
|
|
46
46
|
Save changes
|
|
47
47
|
</Button.Root>
|
|
48
48
|
</Drawer.Close>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
**What:** `Dropdown` is a **portaled action menu** (`role="menu"`): one trigger toggles a floating list of **`menuitem`** rows. **`Dropdown.Trigger`** clones **exactly one** child element and merges **`aria-expanded`**, **`aria-haspopup="menu"`**, **`aria-controls`**, **`id`**, ref, and toggle **`onClick`**. **`Dropdown.Content`** renders **only when open**, applies focus trap, Escape/outside close, and arrow-key roving focus among items.
|
|
8
8
|
|
|
9
|
-
**Parts:** `Root` → `Trigger` + `Content`. Inside `Content`:
|
|
9
|
+
**Parts:** `Root` → `Trigger` + `Content`. Inside `Content`: `Block`, `Header` (+ `HeaderRow`, `HeaderLeading`, `HeaderMain`, `HeaderTitle`, `HeaderDescription`, `HeaderTrailing`), `Group` + `GroupLabel`, `Separator`, `Item` (+ `ItemIcon`).
|
|
10
10
|
|
|
11
11
|
**State:** Uncontrolled: **`defaultOpen`** on `Root`. Controlled: **`open`** + **`onOpenChange`**. **`Item.onSelect`** runs on activation, then the menu closes unless **`disabled`**.
|
|
12
12
|
|
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
| [`playground/snippets/dropdown/composition.tsx`](../../../playground/snippets/dropdown/composition.tsx) | **`Block`**, header slots, **`GroupLabel`**, **`ItemIcon`**, nested trailing **Button** |
|
|
27
27
|
| [`playground/snippets/dropdown/full-width.tsx`](../../../playground/snippets/dropdown/full-width.tsx) | **`sameMinWidthAsTrigger`** with narrow trigger |
|
|
28
28
|
| [`playground/snippets/dropdown/as-child.tsx`](../../../playground/snippets/dropdown/as-child.tsx) | **`Trigger`** merges props into a single child (e.g. link) |
|
|
29
|
-
| [`playground/snippets/dropdown/inset.tsx`](../../../playground/snippets/dropdown/inset.tsx) | **`Inset`** **`padding`** / **`gap`** variants |
|
|
30
29
|
|
|
31
30
|
**Package `examples/`** (same folder as this file; `@/` imports in-repo, **`prime-ui-kit`** for consumers):
|
|
32
31
|
|
|
@@ -40,9 +39,8 @@
|
|
|
40
39
|
| [`examples/composition.tsx`](examples/composition.tsx) | `composition.tsx` | Same as playground composition |
|
|
41
40
|
| [`examples/full-width.tsx`](examples/full-width.tsx) | `full-width.tsx` | Same as playground full-width |
|
|
42
41
|
| [`examples/as-child.tsx`](examples/as-child.tsx) | `as-child.tsx` | Same as playground as-child |
|
|
43
|
-
| [`examples/inset.tsx`](examples/inset.tsx) | `inset.tsx` | Same as playground inset |
|
|
44
42
|
| [`examples/actions-menu.tsx`](examples/actions-menu.tsx) | — | Icon-only trigger, row icons, separator, **`destructive`** |
|
|
45
|
-
| [`examples/account-menu.tsx`](examples/account-menu.tsx) | — | Header + avatar, **`
|
|
43
|
+
| [`examples/account-menu.tsx`](examples/account-menu.tsx) | — | Header + avatar, **`sameMinWidthAsTrigger`**, sign out |
|
|
46
44
|
| [`examples/select-like-list.tsx`](examples/select-like-list.tsx) | — | Trigger shows choice; still **`role="menu"`** (not **Select**) |
|
|
47
45
|
|
|
48
46
|
Shared layout tokens for some examples: [`examples/dropdown-examples.module.css`](examples/dropdown-examples.module.css) (mirrors [`playground/snippets/dropdown/dropdown-snippets.module.css`](../../../playground/snippets/dropdown/dropdown-snippets.module.css)).
|
|
@@ -56,7 +54,7 @@ export function Example() {
|
|
|
56
54
|
return (
|
|
57
55
|
<Dropdown.Root>
|
|
58
56
|
<Dropdown.Trigger>
|
|
59
|
-
<Button.Root type="button" variant="neutral" mode="stroke"
|
|
57
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
60
58
|
Actions
|
|
61
59
|
</Button.Root>
|
|
62
60
|
</Dropdown.Trigger>
|
|
@@ -89,8 +87,7 @@ A composite **action menu**: the trigger toggles a portaled panel with commands,
|
|
|
89
87
|
|
|
90
88
|
- **`Dropdown.Root`** wraps everything and owns open state (controlled or uncontrolled).
|
|
91
89
|
- **`Dropdown.Trigger`** must wrap **exactly one** React element; refs, `id`, `aria-*`, and toggle `onClick` are merged into that child.
|
|
92
|
-
- **`Dropdown.Content`** renders **only when open** (portal + `role="menu"`). Put **`Dropdown.
|
|
93
|
-
- **`Dropdown.Inset`** optional wrapper: padding and vertical gap between **direct** children.
|
|
90
|
+
- **`Dropdown.Content`** renders **only when open** (portal + `role="menu"`). Put **`Dropdown.Block`** / **`Dropdown.Group`** / **`Dropdown.Item`** children inside it.
|
|
94
91
|
- **`Dropdown.Block`** — generic section; **`Dropdown.Header`** and **`HeaderRow`**, **`HeaderLeading`**, **`HeaderMain`**, **`HeaderTitle`**, **`HeaderDescription`**, **`HeaderTrailing`** compose a header area inside the panel.
|
|
95
92
|
- **`Dropdown.Item`** — actionable row (`role="menuitem"`); may include **`Dropdown.ItemIcon`** before text.
|
|
96
93
|
- **`Dropdown.Group`** + **`Dropdown.GroupLabel`** label a set of items; **`Dropdown.Separator`** is an `hr` between blocks.
|
|
@@ -135,17 +132,7 @@ A composite **action menu**: the trigger toggles a portaled panel with commands,
|
|
|
135
132
|
| sameMinWidthAsTrigger | `boolean` | `false` | No | Panel minimum width is not less than the trigger width. |
|
|
136
133
|
| size | `"s" \| "m" \| "l" \| "xl"` | `"m"` | No | Tier for panel metrics, rows, group labels, and default icon size. |
|
|
137
134
|
| className | `string` | — | No | Extra class on the portaled menu container. |
|
|
138
|
-
| children | `React.ReactNode` | — | Yes | Menu body:
|
|
139
|
-
|
|
140
|
-
#### Dropdown.Inset
|
|
141
|
-
|
|
142
|
-
| Prop | Type | Default | Required | Description |
|
|
143
|
-
|------|------|---------|----------|-------------|
|
|
144
|
-
| padding | `"none" \| "x1" \| "x2" \| "x3"` | `"x2"` | No | Inner padding from the content edge. |
|
|
145
|
-
| gap | `"none" \| "x2" \| "x3" \| "x4"` | `"x3"` | No | Vertical gap between direct children. |
|
|
146
|
-
| className | `string` | — | No | Extra class. |
|
|
147
|
-
| children | `React.ReactNode` | — | Yes | Nested blocks and items. |
|
|
148
|
-
| …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Other `div` attributes. |
|
|
135
|
+
| children | `React.ReactNode` | — | Yes | Menu body: blocks, groups, items, etc. |
|
|
149
136
|
|
|
150
137
|
#### Dropdown.Block
|
|
151
138
|
|
|
@@ -8,44 +8,42 @@ export default function DropdownAccountMenuExample() {
|
|
|
8
8
|
return (
|
|
9
9
|
<Dropdown.Root>
|
|
10
10
|
<Dropdown.Trigger>
|
|
11
|
-
<Button.Root type="button" variant="neutral" mode="stroke"
|
|
11
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
12
12
|
Аккаунт
|
|
13
13
|
</Button.Root>
|
|
14
14
|
</Dropdown.Trigger>
|
|
15
15
|
<Dropdown.Content align="end" sameMinWidthAsTrigger>
|
|
16
|
-
<Dropdown.
|
|
17
|
-
<Dropdown.
|
|
18
|
-
<Dropdown.
|
|
19
|
-
<Dropdown.
|
|
20
|
-
<
|
|
21
|
-
<Avatar.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<Dropdown.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<Dropdown.
|
|
35
|
-
|
|
36
|
-
Профиль
|
|
37
|
-
</Dropdown.Item>
|
|
38
|
-
<Dropdown.Item>
|
|
39
|
-
<Dropdown.ItemIcon as={Settings} strokeWidth={2} />
|
|
40
|
-
Настройки
|
|
41
|
-
</Dropdown.Item>
|
|
42
|
-
</Dropdown.Block>
|
|
43
|
-
<Dropdown.Separator />
|
|
44
|
-
<Dropdown.Item destructive>
|
|
45
|
-
<Dropdown.ItemIcon as={LogOut} strokeWidth={2} />
|
|
46
|
-
Выйти
|
|
16
|
+
<Dropdown.Block>
|
|
17
|
+
<Dropdown.Header>
|
|
18
|
+
<Dropdown.HeaderRow>
|
|
19
|
+
<Dropdown.HeaderLeading>
|
|
20
|
+
<Avatar.Root size="l">
|
|
21
|
+
<Avatar.Fallback>ИП</Avatar.Fallback>
|
|
22
|
+
</Avatar.Root>
|
|
23
|
+
</Dropdown.HeaderLeading>
|
|
24
|
+
<Dropdown.HeaderMain>
|
|
25
|
+
<Dropdown.HeaderTitle>Иван Петров</Dropdown.HeaderTitle>
|
|
26
|
+
<Dropdown.HeaderDescription truncate>
|
|
27
|
+
ivan.petrov@example.com
|
|
28
|
+
</Dropdown.HeaderDescription>
|
|
29
|
+
</Dropdown.HeaderMain>
|
|
30
|
+
</Dropdown.HeaderRow>
|
|
31
|
+
<Dropdown.Separator />
|
|
32
|
+
</Dropdown.Header>
|
|
33
|
+
<Dropdown.Item>
|
|
34
|
+
<Dropdown.ItemIcon as={UserRound} strokeWidth={2} />
|
|
35
|
+
Профиль
|
|
47
36
|
</Dropdown.Item>
|
|
48
|
-
|
|
37
|
+
<Dropdown.Item>
|
|
38
|
+
<Dropdown.ItemIcon as={Settings} strokeWidth={2} />
|
|
39
|
+
Настройки
|
|
40
|
+
</Dropdown.Item>
|
|
41
|
+
</Dropdown.Block>
|
|
42
|
+
<Dropdown.Separator />
|
|
43
|
+
<Dropdown.Item destructive>
|
|
44
|
+
<Dropdown.ItemIcon as={LogOut} strokeWidth={2} />
|
|
45
|
+
Выйти
|
|
46
|
+
</Dropdown.Item>
|
|
49
47
|
</Dropdown.Content>
|
|
50
48
|
</Dropdown.Root>
|
|
51
49
|
);
|
|
@@ -9,7 +9,7 @@ export default function DropdownCompositionExample() {
|
|
|
9
9
|
return (
|
|
10
10
|
<Dropdown.Root>
|
|
11
11
|
<Dropdown.Trigger>
|
|
12
|
-
<Button.Root type="button"
|
|
12
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
13
13
|
Меню пользователя
|
|
14
14
|
</Button.Root>
|
|
15
15
|
</Dropdown.Trigger>
|
|
@@ -13,7 +13,7 @@ export default function DropdownControlledExample() {
|
|
|
13
13
|
<div className={styles.controlledRow}>
|
|
14
14
|
<Dropdown.Root open={open} onOpenChange={setOpen}>
|
|
15
15
|
<Dropdown.Trigger>
|
|
16
|
-
<Button.Root type="button"
|
|
16
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
17
17
|
Шаг 2 из 4
|
|
18
18
|
</Button.Root>
|
|
19
19
|
</Dropdown.Trigger>
|
|
@@ -15,7 +15,7 @@ export default function DropdownSelectLikeListExample() {
|
|
|
15
15
|
return (
|
|
16
16
|
<Dropdown.Root>
|
|
17
17
|
<Dropdown.Trigger>
|
|
18
|
-
<Button.Root type="button" variant="neutral" mode="stroke"
|
|
18
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
19
19
|
Пространство: {workspace}
|
|
20
20
|
</Button.Root>
|
|
21
21
|
</Dropdown.Trigger>
|
|
@@ -6,7 +6,7 @@ export default function DropdownStatesExample() {
|
|
|
6
6
|
return (
|
|
7
7
|
<Dropdown.Root>
|
|
8
8
|
<Dropdown.Trigger>
|
|
9
|
-
<Button.Root type="button"
|
|
9
|
+
<Button.Root type="button" variant="neutral" mode="stroke">
|
|
10
10
|
Доступ к отчёту
|
|
11
11
|
</Button.Root>
|
|
12
12
|
</Dropdown.Trigger>
|
|
@@ -6,7 +6,7 @@ export default function DropdownVariantsExample() {
|
|
|
6
6
|
return (
|
|
7
7
|
<Dropdown.Root>
|
|
8
8
|
<Dropdown.Trigger>
|
|
9
|
-
<Button.Root type="button"
|
|
9
|
+
<Button.Root type="button" variant="neutral" mode="lighter">
|
|
10
10
|
Документ
|
|
11
11
|
</Button.Root>
|
|
12
12
|
</Dropdown.Trigger>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# EmptyPage
|
|
2
|
+
|
|
3
|
+
## About
|
|
4
|
+
|
|
5
|
+
Центрированный блок **пустого состояния**: **`EmptyPage.Icon`** (область под глиф), **`EmptyPage.Title`** (**`<h2>`**), **`EmptyPage.Description`**, **`EmptyPage.Actions`** (ряд кнопок). Ось **`size`** (`s`–`xl`) задаёт иконку, кегль и отступы и пробрасывается в **`ControlSizeProvider`** для дочерних **`Button`**.
|
|
6
|
+
|
|
7
|
+
- **Используйте** на странице списка, в теле таблицы, в карточке или в **`ScrollContainer`**, когда данных нет и нужен явный призыв к действию.
|
|
8
|
+
- **`layout="fill"`** — блок растягивается по высоте **flex**-родителя с заданной **`min-height`** (типично «область таблицы»); **`default`** — компактный блок по содержимому.
|
|
9
|
+
- **Не** подменяйте **`Title`** на **`PageContent.Title`** (**`<h1>`**): пустое состояние — регион страницы, заголовок вью остаётся один на маршруте.
|
|
10
|
+
|
|
11
|
+
## Composition
|
|
12
|
+
|
|
13
|
+
- **`EmptyPage.Root`** — колонка по центру, **`text-align: center`**; **`size`**, **`layout`** через `data-*`.
|
|
14
|
+
- **`EmptyPage.Icon`** — подложка под глиф в духе иконки шапки [**`Modal.Panel`**](../modal/COMPONENT.md) (`headerIcon`): скругление **`--prime-sys-size-control-*-radius`**, фон **`--prime-sys-color-status-error-background`**, цвет глифа **`--prime-sys-color-status-error-foreground`** (не «сырой» красный). Внутрь — **`lucide-react`** или **`Icon`** с **`aria-hidden`**.
|
|
15
|
+
- **`EmptyPage.Title`** — **`h2`**; связывайте с **`aria-labelledby`** на корне.
|
|
16
|
+
- **`EmptyPage.Description`** — **`p`**, вторичный цвет контента.
|
|
17
|
+
- **`EmptyPage.Actions`** — **`flex`**-ряд с **`gap`** по размеру; внутри — **`Button`**, **`ButtonGroup`**, **`LinkButton`**.
|
|
18
|
+
|
|
19
|
+
### Canonical example
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { Search } from "lucide-react";
|
|
23
|
+
import { Button, EmptyPage } from "prime-ui-kit";
|
|
24
|
+
|
|
25
|
+
export function EmptySearchResults() {
|
|
26
|
+
return (
|
|
27
|
+
<EmptyPage.Root aria-labelledby="empty-heading">
|
|
28
|
+
<EmptyPage.Icon aria-hidden>
|
|
29
|
+
<Search strokeWidth={2} aria-hidden />
|
|
30
|
+
</EmptyPage.Icon>
|
|
31
|
+
<EmptyPage.Title id="empty-heading">Ничего не найдено</EmptyPage.Title>
|
|
32
|
+
<EmptyPage.Description>
|
|
33
|
+
Измените фильтры или сбросьте поиск — тогда мы снова покажем результаты.
|
|
34
|
+
</EmptyPage.Description>
|
|
35
|
+
<EmptyPage.Actions>
|
|
36
|
+
<Button.Root type="button" variant="primary">
|
|
37
|
+
Сбросить фильтры
|
|
38
|
+
</Button.Root>
|
|
39
|
+
</EmptyPage.Actions>
|
|
40
|
+
</EmptyPage.Root>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Пустое состояние в области таблицы
|
|
46
|
+
|
|
47
|
+
Родитель с **`min-height`** (и обычно рамкой области данных) + **`layout="fill"`** — контент визуально по центру «подложки».
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { PackagePlus } from "lucide-react";
|
|
51
|
+
import { Button, EmptyPage } from "prime-ui-kit";
|
|
52
|
+
|
|
53
|
+
export function OrdersTableEmpty() {
|
|
54
|
+
return (
|
|
55
|
+
<div className="ordersTableBodyRegion">
|
|
56
|
+
<EmptyPage.Root layout="fill" aria-labelledby="empty-table-heading">
|
|
57
|
+
<EmptyPage.Icon aria-hidden>
|
|
58
|
+
<PackagePlus strokeWidth={2} aria-hidden />
|
|
59
|
+
</EmptyPage.Icon>
|
|
60
|
+
<EmptyPage.Title id="empty-table-heading">Пока нет позиций</EmptyPage.Title>
|
|
61
|
+
<EmptyPage.Description>Добавьте первую строку или импортируйте каталог.</EmptyPage.Description>
|
|
62
|
+
<EmptyPage.Actions>
|
|
63
|
+
<Button.Root type="button" variant="primary">
|
|
64
|
+
Добавить позицию
|
|
65
|
+
</Button.Root>
|
|
66
|
+
</EmptyPage.Actions>
|
|
67
|
+
</EmptyPage.Root>
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Связь с DataTable
|
|
74
|
+
|
|
75
|
+
У **`DataTable`** пустой набор строк может отображаться через **`emptyText`** (строка в таблице). Для **богатого** пустого состояния с кнопкой и иконкой не подставляйте разметку внутрь **`emptyText`**: рендерите **`EmptyPage`** **вместо** таблицы или **в** ячейке-обёртке с **`layout="fill"`**, когда **`rows.length === 0`** и не **`loading`**.
|
|
76
|
+
|
|
77
|
+
### Playground
|
|
78
|
+
|
|
79
|
+
Живые примеры: **`playground/sections/EmptyPageSection.tsx`**.
|
|
80
|
+
|
|
81
|
+
## Extended examples
|
|
82
|
+
|
|
83
|
+
| Playground (сниппет) | Runnable (`examples/*.tsx`) |
|
|
84
|
+
|----------------------|------------------------------|
|
|
85
|
+
| [`canonical.tsx`](../../../playground/snippets/empty-page/canonical.tsx) | [`examples/canonical.tsx`](./examples/canonical.tsx) |
|
|
86
|
+
| [`sizes.tsx`](../../../playground/snippets/empty-page/sizes.tsx) | [`examples/sizes.tsx`](./examples/sizes.tsx) |
|
|
87
|
+
| [`table-region.tsx`](../../../playground/snippets/empty-page/table-region.tsx) | [`examples/table-region.tsx`](./examples/table-region.tsx) |
|
|
88
|
+
|
|
89
|
+
## Rules
|
|
90
|
+
|
|
91
|
+
- Заголовок вью — один **`h1`** ([`PageContent.Title`](../page-content/COMPONENT.md)); в **`EmptyPage`** используйте **`Title`** (**`h2`**).
|
|
92
|
+
- Иконка декоративная — **`aria-hidden`** на обёртке или SVG.
|
|
93
|
+
- Размеры кнопок в **`Actions`** наследуются от **`ControlSizeProvider`** на **`Root`**; при необходимости оберните действия в отдельный **`ControlSizeProvider`**.
|
|
94
|
+
|
|
95
|
+
## API
|
|
96
|
+
|
|
97
|
+
### EmptyPage.Root
|
|
98
|
+
|
|
99
|
+
| Prop | Type | Default | Required | Description |
|
|
100
|
+
|------|------|---------|----------|-------------|
|
|
101
|
+
| size | `s` \| `m` \| `l` \| `xl` | `m` | No | Шкала иконки, текста, отступов; `ControlSizeProvider` для потомков. |
|
|
102
|
+
| layout | `default` \| `fill` | `default` | No | `fill` — растянуть по высоте flex-родителя (пустое тело таблицы / панели). |
|
|
103
|
+
| className | `string` | — | No | Дополнительный класс корня. |
|
|
104
|
+
| children | `React.ReactNode` | — | No | Icon, Title, Description, Actions. |
|
|
105
|
+
| …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | В т.ч. `ref` (`forwardRef`), `aria-*`. |
|
|
106
|
+
|
|
107
|
+
### EmptyPage.Icon
|
|
108
|
+
|
|
109
|
+
| Prop | Type | Default | Required | Description |
|
|
110
|
+
|------|------|---------|----------|-------------|
|
|
111
|
+
| className | `string` | — | No | Класс подложки под иконку. |
|
|
112
|
+
| children | `React.ReactNode` | — | No | Глиф (например из `lucide-react`). |
|
|
113
|
+
| …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Атрибуты обёртки. |
|
|
114
|
+
|
|
115
|
+
### EmptyPage.Title
|
|
116
|
+
|
|
117
|
+
| Prop | Type | Default | Required | Description |
|
|
118
|
+
|------|------|---------|----------|-------------|
|
|
119
|
+
| className | `string` | — | No | Класс на **`h2`**. |
|
|
120
|
+
| children | `React.ReactNode` | — | No | Заголовок блока. |
|
|
121
|
+
| …rest | `React.HTMLAttributes<HTMLHeadingElement>` | — | No | В т.ч. `ref` (`forwardRef`), `id` для `aria-labelledby`. |
|
|
122
|
+
|
|
123
|
+
### EmptyPage.Description
|
|
124
|
+
|
|
125
|
+
| Prop | Type | Default | Required | Description |
|
|
126
|
+
|------|------|---------|----------|-------------|
|
|
127
|
+
| className | `string` | — | No | Класс на **`p`**. |
|
|
128
|
+
| children | `React.ReactNode` | — | No | Пояснение. |
|
|
129
|
+
| …rest | `React.HTMLAttributes<HTMLParagraphElement>` | — | No | В т.ч. `ref` (`forwardRef`). |
|
|
130
|
+
|
|
131
|
+
### EmptyPage.Actions
|
|
132
|
+
|
|
133
|
+
| Prop | Type | Default | Required | Description |
|
|
134
|
+
|------|------|---------|----------|-------------|
|
|
135
|
+
| className | `string` | — | No | Класс на flex-контейнере действий. |
|
|
136
|
+
| children | `React.ReactNode` | — | No | Кнопки и т.п. |
|
|
137
|
+
| …rest | `React.HTMLAttributes<HTMLDivElement>` | — | No | Атрибуты **`div`**. |
|
|
138
|
+
|
|
139
|
+
## Related
|
|
140
|
+
|
|
141
|
+
- [PageContent](../page-content/COMPONENT.md) — шапка маршрута (**`h1`**).
|
|
142
|
+
- [DataTable](../data-table/COMPONENT.md) — **`emptyText`** vs отдельный **`EmptyPage`**.
|
|
143
|
+
- [Button](../button/COMPONENT.md) — действия в **`Actions`**.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Search } from "lucide-react";
|
|
2
|
+
import { Button, EmptyPage } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
/** Полный блок: иконка, заголовок, описание, кнопка. */
|
|
5
|
+
export function EmptyPageCanonical() {
|
|
6
|
+
return (
|
|
7
|
+
<EmptyPage.Root aria-labelledby="empty-heading">
|
|
8
|
+
<EmptyPage.Icon aria-hidden>
|
|
9
|
+
<Search strokeWidth={2} aria-hidden />
|
|
10
|
+
</EmptyPage.Icon>
|
|
11
|
+
<EmptyPage.Title id="empty-heading">Ничего не найдено</EmptyPage.Title>
|
|
12
|
+
<EmptyPage.Description>
|
|
13
|
+
Измените фильтры или сбросьте поиск — тогда мы снова покажем результаты.
|
|
14
|
+
</EmptyPage.Description>
|
|
15
|
+
<EmptyPage.Actions>
|
|
16
|
+
<Button.Root type="button" variant="primary">
|
|
17
|
+
Сбросить фильтры
|
|
18
|
+
</Button.Root>
|
|
19
|
+
</EmptyPage.Actions>
|
|
20
|
+
</EmptyPage.Root>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* Раскладка для runnable-примеров EmptyPage (зеркало playground/snippets/empty-page/*.module.css). */
|
|
2
|
+
|
|
3
|
+
.stack {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: var(--prime-sys-spacing-2xl);
|
|
7
|
+
width: 100%;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.tableRegion {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
min-height: var(--prime-sys-unit-18rem);
|
|
15
|
+
max-width: 100%;
|
|
16
|
+
border: var(--prime-sys-unit-1px) solid var(--prime-sys-color-border-subtle);
|
|
17
|
+
border-radius: var(--prime-sys-shape-radius-l);
|
|
18
|
+
background: var(--prime-sys-color-surface-default);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.lead {
|
|
22
|
+
margin: 0 0 var(--prime-sys-spacing-m);
|
|
23
|
+
font-size: var(--prime-sys-size-control-s-supportText);
|
|
24
|
+
color: var(--prime-sys-color-content-secondary);
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Inbox } from "lucide-react";
|
|
2
|
+
import { EmptyPage, type EmptyPageSize } from "prime-ui-kit";
|
|
3
|
+
|
|
4
|
+
import styles from "./examples-demos.module.css";
|
|
5
|
+
|
|
6
|
+
const sizes = ["s", "m", "l", "xl"] as const satisfies readonly EmptyPageSize[];
|
|
7
|
+
|
|
8
|
+
/** Лестница размеров `s`–`xl`: иконка, кегль и отступы согласованы. */
|
|
9
|
+
export function EmptyPageSizes() {
|
|
10
|
+
return (
|
|
11
|
+
<div className={styles.stack}>
|
|
12
|
+
{sizes.map((size) => (
|
|
13
|
+
<EmptyPage.Root key={size} size={size} aria-labelledby={`empty-size-${size}`}>
|
|
14
|
+
<EmptyPage.Icon aria-hidden>
|
|
15
|
+
<Inbox strokeWidth={2} aria-hidden />
|
|
16
|
+
</EmptyPage.Icon>
|
|
17
|
+
<EmptyPage.Title id={`empty-size-${size}`}>Размер {size}</EmptyPage.Title>
|
|
18
|
+
<EmptyPage.Description>Одинаковая структура, разная шкала.</EmptyPage.Description>
|
|
19
|
+
</EmptyPage.Root>
|
|
20
|
+
))}
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
}
|