@delacour/react-native-ui 0.1.0-alpha.3 → 0.1.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 +11 -7
- package/package.json +49 -5
- package/src/components/accordion/AGENTS.md +21 -9
- package/src/components/accordion/accordion-content.tsx +7 -4
- package/src/components/accordion/accordion-item.tsx +15 -13
- package/src/components/accordion/accordion.context.tsx +11 -5
- package/src/components/accordion/accordion.variants.test.ts +64 -3
- package/src/components/accordion/accordion.variants.ts +33 -9
- package/src/components/alert/AGENTS.md +102 -0
- package/src/components/alert/alert-action.tsx +17 -0
- package/src/components/alert/alert-close-button.tsx +50 -0
- package/src/components/alert/alert-content.tsx +15 -0
- package/src/components/alert/alert-description.tsx +16 -0
- package/src/components/alert/alert-glyphs.ts +25 -0
- package/src/components/alert/alert-indicator.tsx +40 -0
- package/src/components/alert/alert-title.tsx +18 -0
- package/src/components/alert/alert.context.tsx +69 -0
- package/src/components/alert/alert.tsx +160 -0
- package/src/components/alert/alert.types.ts +10 -0
- package/src/components/alert/alert.variants.test.ts +218 -0
- package/src/components/alert/alert.variants.ts +180 -0
- package/src/components/alert/index.ts +23 -0
- package/src/components/avatar/AGENTS.md +106 -0
- package/src/components/avatar/avatar-badge.tsx +51 -0
- package/src/components/avatar/avatar-group.tsx +139 -0
- package/src/components/avatar/avatar.context.tsx +93 -0
- package/src/components/avatar/avatar.tsx +201 -0
- package/src/components/avatar/avatar.utils.test.ts +174 -0
- package/src/components/avatar/avatar.utils.ts +141 -0
- package/src/components/avatar/avatar.variants.test.ts +251 -0
- package/src/components/avatar/avatar.variants.ts +270 -0
- package/src/components/avatar/index.ts +39 -0
- package/src/components/badge/AGENTS.md +5 -0
- package/src/components/badge/badge.tsx +6 -1
- package/src/components/bottom-sheet/AGENTS.md +186 -221
- package/src/components/bottom-sheet/bottom-sheet-background.tsx +31 -22
- package/src/components/bottom-sheet/bottom-sheet-close.tsx +23 -30
- package/src/components/bottom-sheet/bottom-sheet-container.tsx +54 -207
- package/src/components/bottom-sheet/bottom-sheet-content.tsx +25 -48
- package/src/components/bottom-sheet/bottom-sheet-description.tsx +8 -2
- package/src/components/bottom-sheet/bottom-sheet-flat-list.tsx +65 -0
- package/src/components/bottom-sheet/bottom-sheet-footer.tsx +53 -120
- package/src/components/bottom-sheet/bottom-sheet-handle.tsx +31 -26
- package/src/components/bottom-sheet/bottom-sheet-legend-list.tsx +69 -0
- package/src/components/bottom-sheet/bottom-sheet-overlay.tsx +25 -147
- package/src/components/bottom-sheet/bottom-sheet-provider.tsx +42 -0
- package/src/components/bottom-sheet/bottom-sheet-scroll-view.tsx +38 -52
- package/src/components/bottom-sheet/bottom-sheet-section-list.tsx +58 -0
- package/src/components/bottom-sheet/bottom-sheet-steps.tsx +88 -0
- package/src/components/bottom-sheet/bottom-sheet-text-input.tsx +44 -0
- package/src/components/bottom-sheet/bottom-sheet-title.tsx +12 -8
- package/src/components/bottom-sheet/bottom-sheet-trigger.tsx +19 -37
- package/src/components/bottom-sheet/bottom-sheet.tsx +113 -60
- package/src/components/bottom-sheet/bottom-sheet.variants.test.ts +47 -70
- package/src/components/bottom-sheet/bottom-sheet.variants.ts +50 -105
- package/src/components/bottom-sheet/index.ts +39 -17
- package/src/components/bottom-sheet/use-bottom-sheet-input.ts +16 -115
- package/src/components/button/AGENTS.md +45 -11
- package/src/components/button/button-group.tsx +44 -8
- package/src/components/button/button.context.tsx +10 -0
- package/src/components/button/button.tsx +2 -1
- package/src/components/button/button.variants.test.ts +154 -0
- package/src/components/button/button.variants.ts +71 -6
- package/src/components/button/index.ts +2 -0
- package/src/components/calendar/AGENTS.md +142 -0
- package/src/components/calendar/calendar-caption.tsx +116 -0
- package/src/components/calendar/calendar-day.tsx +103 -0
- package/src/components/calendar/calendar-grid.tsx +183 -0
- package/src/components/calendar/calendar-header.tsx +34 -0
- package/src/components/calendar/calendar-nav.tsx +51 -0
- package/src/components/calendar/calendar-picker.tsx +128 -0
- package/src/components/calendar/calendar-weekdays.tsx +48 -0
- package/src/components/calendar/calendar.context.tsx +108 -0
- package/src/components/calendar/calendar.date.test.ts +456 -0
- package/src/components/calendar/calendar.date.ts +584 -0
- package/src/components/calendar/calendar.tsx +389 -0
- package/src/components/calendar/calendar.types.ts +87 -0
- package/src/components/calendar/calendar.variants.test.ts +363 -0
- package/src/components/calendar/calendar.variants.ts +426 -0
- package/src/components/calendar/index.ts +96 -0
- package/src/components/card/AGENTS.md +88 -0
- package/src/components/card/card-action.tsx +16 -0
- package/src/components/card/card-content.tsx +12 -0
- package/src/components/card/card-description.tsx +12 -0
- package/src/components/card/card-footer.tsx +30 -0
- package/src/components/card/card-header.tsx +45 -0
- package/src/components/card/card-title.tsx +25 -0
- package/src/components/card/card.context.tsx +64 -0
- package/src/components/card/card.tsx +94 -0
- package/src/components/card/card.types.ts +13 -0
- package/src/components/card/card.variants.test.ts +240 -0
- package/src/components/card/card.variants.ts +177 -0
- package/src/components/card/index.ts +15 -0
- package/src/components/chart/AGENTS.md +9 -1
- package/src/components/chart/chart.tsx +8 -1
- package/src/components/chip/AGENTS.md +113 -0
- package/src/components/chip/chip-close-button.tsx +48 -0
- package/src/components/chip/chip-end-content.tsx +15 -0
- package/src/components/chip/chip-label.tsx +21 -0
- package/src/components/chip/chip-start-content.tsx +16 -0
- package/src/components/chip/chip.context.tsx +66 -0
- package/src/components/chip/chip.tsx +268 -0
- package/src/components/chip/chip.types.ts +10 -0
- package/src/components/chip/chip.variants.test.ts +335 -0
- package/src/components/chip/chip.variants.ts +321 -0
- package/src/components/chip/index.ts +24 -0
- package/src/components/collapsible/AGENTS.md +97 -0
- package/src/components/collapsible/collapsible-content.tsx +97 -0
- package/src/components/collapsible/collapsible-description.tsx +17 -0
- package/src/components/collapsible/collapsible-indicator.tsx +92 -0
- package/src/components/collapsible/collapsible-title.tsx +17 -0
- package/src/components/collapsible/collapsible-trigger.tsx +133 -0
- package/src/components/collapsible/collapsible.context.tsx +91 -0
- package/src/components/collapsible/collapsible.tsx +167 -0
- package/src/components/collapsible/collapsible.types.ts +9 -0
- package/src/components/collapsible/collapsible.variants.test.ts +338 -0
- package/src/components/collapsible/collapsible.variants.ts +228 -0
- package/src/components/collapsible/index.ts +32 -0
- package/src/components/context-menu/AGENTS.md +103 -0
- package/src/components/context-menu/context-menu-content.tsx +64 -0
- package/src/components/context-menu/context-menu-item.tsx +22 -0
- package/src/components/context-menu/context-menu-preview.tsx +60 -0
- package/src/components/context-menu/context-menu-trigger.tsx +160 -0
- package/src/components/context-menu/context-menu.context.tsx +91 -0
- package/src/components/context-menu/context-menu.tsx +90 -0
- package/src/components/context-menu/context-menu.variants.test.ts +266 -0
- package/src/components/context-menu/context-menu.variants.ts +147 -0
- package/src/components/context-menu/index.ts +18 -0
- package/src/components/dialog/AGENTS.md +97 -0
- package/src/components/dialog/dialog-body.tsx +21 -0
- package/src/components/dialog/dialog-close.tsx +82 -0
- package/src/components/dialog/dialog-content.tsx +153 -0
- package/src/components/dialog/dialog-description.tsx +23 -0
- package/src/components/dialog/dialog-footer.tsx +32 -0
- package/src/components/dialog/dialog-header.tsx +20 -0
- package/src/components/dialog/dialog-title.tsx +42 -0
- package/src/components/dialog/dialog-trigger.tsx +54 -0
- package/src/components/dialog/dialog.context.tsx +90 -0
- package/src/components/dialog/dialog.tsx +119 -0
- package/src/components/dialog/dialog.variants.test.ts +224 -0
- package/src/components/dialog/dialog.variants.ts +173 -0
- package/src/components/dialog/index.ts +30 -0
- package/src/components/drawer/AGENTS.md +123 -0
- package/src/components/drawer/drawer-body.tsx +46 -0
- package/src/components/drawer/drawer-close.tsx +76 -0
- package/src/components/drawer/drawer-content.tsx +186 -0
- package/src/components/drawer/drawer-description.tsx +23 -0
- package/src/components/drawer/drawer-footer.tsx +21 -0
- package/src/components/drawer/drawer-header.tsx +42 -0
- package/src/components/drawer/drawer-title.tsx +35 -0
- package/src/components/drawer/drawer-trigger.tsx +54 -0
- package/src/components/drawer/drawer.context.tsx +114 -0
- package/src/components/drawer/drawer.tsx +119 -0
- package/src/components/drawer/drawer.variants.test.ts +392 -0
- package/src/components/drawer/drawer.variants.ts +244 -0
- package/src/components/drawer/index.ts +41 -0
- package/src/components/drawer/use-drawer-pan.ts +108 -0
- package/src/components/empty-state/AGENTS.md +90 -0
- package/src/components/empty-state/empty-state-content.tsx +17 -0
- package/src/components/empty-state/empty-state-description.tsx +12 -0
- package/src/components/empty-state/empty-state-header.tsx +17 -0
- package/src/components/empty-state/empty-state-media.tsx +56 -0
- package/src/components/empty-state/empty-state-title.tsx +18 -0
- package/src/components/empty-state/empty-state.context.tsx +65 -0
- package/src/components/empty-state/empty-state.tsx +84 -0
- package/src/components/empty-state/empty-state.types.ts +14 -0
- package/src/components/empty-state/empty-state.variants.test.ts +245 -0
- package/src/components/empty-state/empty-state.variants.ts +132 -0
- package/src/components/empty-state/index.ts +20 -0
- package/src/components/fab/AGENTS.md +119 -0
- package/src/components/fab/fab-action.tsx +118 -0
- package/src/components/fab/fab-group.tsx +214 -0
- package/src/components/fab/fab-label.tsx +18 -0
- package/src/components/fab/fab.context.tsx +125 -0
- package/src/components/fab/fab.tsx +156 -0
- package/src/components/fab/fab.types.ts +17 -0
- package/src/components/fab/fab.variants.test.ts +274 -0
- package/src/components/fab/fab.variants.ts +234 -0
- package/src/components/fab/index.ts +37 -0
- package/src/components/feedback/AGENTS.md +95 -0
- package/src/components/feedback/feedback-action.tsx +16 -0
- package/src/components/feedback/feedback-cancel.tsx +34 -0
- package/src/components/feedback/feedback-close.tsx +21 -0
- package/src/components/feedback/feedback-content.tsx +24 -0
- package/src/components/feedback/feedback-field.tsx +70 -0
- package/src/components/feedback/feedback-footer.tsx +21 -0
- package/src/components/feedback/feedback-panel.tsx +54 -0
- package/src/components/feedback/feedback-submit.tsx +74 -0
- package/src/components/feedback/feedback-title.tsx +34 -0
- package/src/components/feedback/feedback-trigger.tsx +20 -0
- package/src/components/feedback/feedback.context.tsx +73 -0
- package/src/components/feedback/feedback.tsx +135 -0
- package/src/components/feedback/feedback.variants.test.ts +185 -0
- package/src/components/feedback/feedback.variants.ts +128 -0
- package/src/components/feedback/index.ts +24 -0
- package/src/components/field/AGENTS.md +19 -0
- package/src/components/field/field-label.tsx +19 -5
- package/src/components/field/field.context.tsx +17 -0
- package/src/components/field/field.tsx +15 -2
- package/src/components/field/field.variants.test.ts +24 -0
- package/src/components/field/field.variants.ts +20 -0
- package/src/components/field/index.ts +1 -0
- package/src/components/item/AGENTS.md +92 -0
- package/src/components/item/index.ts +25 -0
- package/src/components/item/item-actions.tsx +28 -0
- package/src/components/item/item-content.tsx +15 -0
- package/src/components/item/item-description.tsx +12 -0
- package/src/components/item/item-footer.tsx +13 -0
- package/src/components/item/item-group.tsx +32 -0
- package/src/components/item/item-header.tsx +13 -0
- package/src/components/item/item-media.tsx +37 -0
- package/src/components/item/item-separator.tsx +13 -0
- package/src/components/item/item-title.tsx +17 -0
- package/src/components/item/item.context.tsx +66 -0
- package/src/components/item/item.tsx +218 -0
- package/src/components/item/item.types.ts +12 -0
- package/src/components/item/item.variants.test.ts +263 -0
- package/src/components/item/item.variants.ts +200 -0
- package/src/components/kpi/AGENTS.md +125 -0
- package/src/components/kpi/index.ts +45 -0
- package/src/components/kpi/kpi-action.tsx +12 -0
- package/src/components/kpi/kpi-content.tsx +35 -0
- package/src/components/kpi/kpi-footer.tsx +52 -0
- package/src/components/kpi/kpi-group.tsx +70 -0
- package/src/components/kpi/kpi-header.tsx +25 -0
- package/src/components/kpi/kpi-icon.tsx +28 -0
- package/src/components/kpi/kpi-sparkline.tsx +145 -0
- package/src/components/kpi/kpi-stat.tsx +20 -0
- package/src/components/kpi/kpi-title.tsx +19 -0
- package/src/components/kpi/kpi-trend.tsx +105 -0
- package/src/components/kpi/kpi-value.tsx +32 -0
- package/src/components/kpi/kpi.context.tsx +111 -0
- package/src/components/kpi/kpi.tsx +154 -0
- package/src/components/kpi/kpi.types.ts +9 -0
- package/src/components/kpi/kpi.variants.test.ts +428 -0
- package/src/components/kpi/kpi.variants.ts +347 -0
- package/src/components/label/AGENTS.md +89 -0
- package/src/components/label/index.ts +10 -0
- package/src/components/label/label.tsx +97 -0
- package/src/components/label/label.variants.test.ts +176 -0
- package/src/components/label/label.variants.ts +123 -0
- package/src/components/menu/AGENTS.md +176 -0
- package/src/components/menu/index.ts +44 -0
- package/src/components/menu/menu-background.tsx +17 -0
- package/src/components/menu/menu-checkbox-item.tsx +57 -0
- package/src/components/menu/menu-content.tsx +303 -0
- package/src/components/menu/menu-item.tsx +162 -0
- package/src/components/menu/menu-label.tsx +14 -0
- package/src/components/menu/menu-radio-group.tsx +50 -0
- package/src/components/menu/menu-radio-item.tsx +57 -0
- package/src/components/menu/menu-separator.tsx +11 -0
- package/src/components/menu/menu-sub-content.tsx +72 -0
- package/src/components/menu/menu-sub-trigger.tsx +50 -0
- package/src/components/menu/menu-sub.tsx +75 -0
- package/src/components/menu/menu-trigger.tsx +57 -0
- package/src/components/menu/menu.context.tsx +214 -0
- package/src/components/menu/menu.tsx +88 -0
- package/src/components/menu/menu.types.ts +33 -0
- package/src/components/menu/menu.variants.test.ts +400 -0
- package/src/components/menu/menu.variants.ts +353 -0
- package/src/components/meter/AGENTS.md +135 -0
- package/src/components/meter/index.ts +43 -0
- package/src/components/meter/meter-fill.tsx +19 -0
- package/src/components/meter/meter-header.tsx +17 -0
- package/src/components/meter/meter-label.tsx +18 -0
- package/src/components/meter/meter-output.tsx +42 -0
- package/src/components/meter/meter-segments.tsx +83 -0
- package/src/components/meter/meter-track.tsx +16 -0
- package/src/components/meter/meter.context.tsx +62 -0
- package/src/components/meter/meter.tsx +286 -0
- package/src/components/meter/meter.types.ts +30 -0
- package/src/components/meter/meter.variants.test.ts +430 -0
- package/src/components/meter/meter.variants.ts +347 -0
- package/src/components/overlay/AGENTS.md +89 -0
- package/src/components/overlay/index.ts +27 -0
- package/src/components/overlay/overlay-portal.tsx +84 -0
- package/src/components/overlay/overlay-presence.test.ts +46 -0
- package/src/components/overlay/overlay-presence.ts +49 -0
- package/src/components/overlay/overlay-registry.test.ts +96 -0
- package/src/components/overlay/overlay-registry.ts +99 -0
- package/src/components/overlay/overlay-scrim.tsx +49 -0
- package/src/components/overlay/overlay.context.tsx +48 -0
- package/src/components/overlay/overlay.tsx +118 -0
- package/src/components/overlay/overlay.variants.test.ts +37 -0
- package/src/components/overlay/overlay.variants.ts +33 -0
- package/src/components/overlay/use-overlay-back-handler.ts +34 -0
- package/src/components/overlay/use-overlay-presence.ts +87 -0
- package/src/components/popover/AGENTS.md +138 -0
- package/src/components/popover/index.ts +48 -0
- package/src/components/popover/popover-anchor.tsx +49 -0
- package/src/components/popover/popover-arrow.tsx +89 -0
- package/src/components/popover/popover-close.tsx +73 -0
- package/src/components/popover/popover-content.tsx +235 -0
- package/src/components/popover/popover-description.tsx +18 -0
- package/src/components/popover/popover-title.tsx +33 -0
- package/src/components/popover/popover-trigger.tsx +56 -0
- package/src/components/popover/popover.context.tsx +71 -0
- package/src/components/popover/popover.position.test.ts +354 -0
- package/src/components/popover/popover.position.ts +286 -0
- package/src/components/popover/popover.tsx +123 -0
- package/src/components/popover/popover.variants.test.ts +135 -0
- package/src/components/popover/popover.variants.ts +85 -0
- package/src/components/popover/use-anchor-measure.ts +76 -0
- package/src/components/popover/use-anchored-content.ts +219 -0
- package/src/components/pressable/AGENTS.md +11 -1
- package/src/components/pressable/pressable.tsx +7 -2
- package/src/components/pressable/pressable.variants.test.ts +29 -0
- package/src/components/pressable/pressable.variants.ts +17 -0
- package/src/components/progress/AGENTS.md +120 -0
- package/src/components/progress/index.ts +40 -0
- package/src/components/progress/progress-fill.tsx +152 -0
- package/src/components/progress/progress-header.tsx +19 -0
- package/src/components/progress/progress-label.tsx +27 -0
- package/src/components/progress/progress-output.tsx +47 -0
- package/src/components/progress/progress-track.tsx +38 -0
- package/src/components/progress/progress.context.tsx +79 -0
- package/src/components/progress/progress.tsx +171 -0
- package/src/components/progress/progress.types.ts +23 -0
- package/src/components/progress/progress.variants.test.ts +335 -0
- package/src/components/progress/progress.variants.ts +284 -0
- package/src/components/progress-button/AGENTS.md +116 -0
- package/src/components/progress-button/index.ts +36 -0
- package/src/components/progress-button/progress-button-done.tsx +33 -0
- package/src/components/progress-button/progress-button-label.tsx +27 -0
- package/src/components/progress-button/progress-button.context.tsx +93 -0
- package/src/components/progress-button/progress-button.tsx +414 -0
- package/src/components/progress-button/progress-button.variants.test.ts +314 -0
- package/src/components/progress-button/progress-button.variants.ts +236 -0
- package/src/components/provider/AGENTS.md +38 -25
- package/src/components/provider/provider.tsx +38 -11
- package/src/components/radio/AGENTS.md +8 -10
- package/src/components/radio/radio.variants.test.ts +5 -6
- package/src/components/radio/radio.variants.ts +6 -7
- package/src/components/rating/AGENTS.md +143 -0
- package/src/components/rating/index.ts +43 -0
- package/src/components/rating/rating-output.tsx +39 -0
- package/src/components/rating/rating-star.tsx +70 -0
- package/src/components/rating/rating-stars.tsx +219 -0
- package/src/components/rating/rating.context.tsx +79 -0
- package/src/components/rating/rating.tsx +163 -0
- package/src/components/rating/rating.variants.test.ts +347 -0
- package/src/components/rating/rating.variants.ts +354 -0
- package/src/components/screen/screen-navbar-back-button.tsx +1 -1
- package/src/components/selection-mode/AGENTS.md +155 -0
- package/src/components/selection-mode/index.ts +43 -0
- package/src/components/selection-mode/selection-mode-action.tsx +65 -0
- package/src/components/selection-mode/selection-mode-bar.tsx +79 -0
- package/src/components/selection-mode/selection-mode-group.tsx +123 -0
- package/src/components/selection-mode/selection-mode-header.tsx +85 -0
- package/src/components/selection-mode/selection-mode-indicator.tsx +118 -0
- package/src/components/selection-mode/selection-mode-item.tsx +182 -0
- package/src/components/selection-mode/selection-mode.context.tsx +89 -0
- package/src/components/selection-mode/selection-mode.tsx +207 -0
- package/src/components/selection-mode/selection-mode.types.ts +36 -0
- package/src/components/selection-mode/selection-mode.variants.test.ts +292 -0
- package/src/components/selection-mode/selection-mode.variants.ts +329 -0
- package/src/components/skeleton/AGENTS.md +120 -0
- package/src/components/skeleton/index.ts +15 -0
- package/src/components/skeleton/skeleton-clock.ts +48 -0
- package/src/components/skeleton/skeleton-group.tsx +64 -0
- package/src/components/skeleton/skeleton-shimmer.tsx +80 -0
- package/src/components/skeleton/skeleton.context.tsx +45 -0
- package/src/components/skeleton/skeleton.tsx +227 -0
- package/src/components/skeleton/skeleton.variants.test.ts +245 -0
- package/src/components/skeleton/skeleton.variants.ts +222 -0
- package/src/components/slide-button/AGENTS.md +122 -0
- package/src/components/slide-button/index.ts +43 -0
- package/src/components/slide-button/slide-button-label.tsx +70 -0
- package/src/components/slide-button/slide-button-thumb.tsx +93 -0
- package/src/components/slide-button/slide-button.context.tsx +76 -0
- package/src/components/slide-button/slide-button.tsx +457 -0
- package/src/components/slide-button/slide-button.variants.test.ts +288 -0
- package/src/components/slide-button/slide-button.variants.ts +324 -0
- package/src/components/slider/index.ts +2 -0
- package/src/components/slider/slider-thumb.tsx +33 -1
- package/src/components/slider/slider.variants.test.ts +52 -0
- package/src/components/slider/slider.variants.ts +56 -2
- package/src/components/stack-card/AGENTS.md +169 -0
- package/src/components/stack-card/index.ts +37 -0
- package/src/components/stack-card/stack-card-action.tsx +66 -0
- package/src/components/stack-card/stack-card-actions.tsx +18 -0
- package/src/components/stack-card/stack-card-card.tsx +71 -0
- package/src/components/stack-card/stack-card-empty.tsx +30 -0
- package/src/components/stack-card/stack-card-slot.tsx +90 -0
- package/src/components/stack-card/stack-card-stamp.tsx +76 -0
- package/src/components/stack-card/stack-card.context.tsx +117 -0
- package/src/components/stack-card/stack-card.tsx +557 -0
- package/src/components/stack-card/stack-card.types.ts +26 -0
- package/src/components/stack-card/stack-card.variants.test.ts +355 -0
- package/src/components/stack-card/stack-card.variants.ts +360 -0
- package/src/components/steps/AGENTS.md +153 -0
- package/src/components/steps/index.ts +45 -0
- package/src/components/steps/steps-connector.tsx +31 -0
- package/src/components/steps/steps-description.tsx +26 -0
- package/src/components/steps/steps-indicator.tsx +106 -0
- package/src/components/steps/steps-item.tsx +225 -0
- package/src/components/steps/steps-panel.tsx +41 -0
- package/src/components/steps/steps-title.tsx +32 -0
- package/src/components/steps/steps-track.tsx +59 -0
- package/src/components/steps/steps.context.tsx +123 -0
- package/src/components/steps/steps.tsx +166 -0
- package/src/components/steps/steps.variants.test.ts +388 -0
- package/src/components/steps/steps.variants.ts +468 -0
- package/src/components/surface/AGENTS.md +72 -0
- package/src/components/surface/index.ts +15 -0
- package/src/components/surface/surface.context.tsx +54 -0
- package/src/components/surface/surface.tsx +70 -0
- package/src/components/surface/surface.variants.test.ts +180 -0
- package/src/components/surface/surface.variants.ts +133 -0
- package/src/components/swipe/AGENTS.md +140 -0
- package/src/components/swipe/index.ts +31 -0
- package/src/components/swipe/swipe-action.tsx +99 -0
- package/src/components/swipe/swipe-end.tsx +14 -0
- package/src/components/swipe/swipe-group.tsx +55 -0
- package/src/components/swipe/swipe-panel.tsx +55 -0
- package/src/components/swipe/swipe-start.tsx +15 -0
- package/src/components/swipe/swipe.context.tsx +135 -0
- package/src/components/swipe/swipe.tsx +393 -0
- package/src/components/swipe/swipe.types.ts +7 -0
- package/src/components/swipe/swipe.variants.test.ts +337 -0
- package/src/components/swipe/swipe.variants.ts +290 -0
- package/src/components/switch/switch.variants.ts +2 -2
- package/src/components/tabs/AGENTS.md +4 -3
- package/src/components/tabs/tabs.variants.test.ts +1 -1
- package/src/components/tabs/tabs.variants.ts +4 -6
- package/src/components/textarea/AGENTS.md +86 -0
- package/src/components/textarea/index.ts +16 -0
- package/src/components/textarea/textarea.tsx +157 -0
- package/src/components/textarea/textarea.variants.test.ts +219 -0
- package/src/components/textarea/textarea.variants.ts +171 -0
- package/src/components/toast/AGENTS.md +140 -0
- package/src/components/toast/index.ts +74 -0
- package/src/components/toast/toast-action.tsx +59 -0
- package/src/components/toast/toast-api.ts +32 -0
- package/src/components/toast/toast-close.tsx +44 -0
- package/src/components/toast/toast-content.tsx +11 -0
- package/src/components/toast/toast-description.tsx +11 -0
- package/src/components/toast/toast-indicator.tsx +34 -0
- package/src/components/toast/toast-item.tsx +308 -0
- package/src/components/toast/toast-title.tsx +13 -0
- package/src/components/toast/toast-viewport.tsx +135 -0
- package/src/components/toast/toast.context.tsx +69 -0
- package/src/components/toast/toast.store.test.ts +259 -0
- package/src/components/toast/toast.store.ts +338 -0
- package/src/components/toast/toast.timer.test.ts +64 -0
- package/src/components/toast/toast.timer.ts +51 -0
- package/src/components/toast/toast.tsx +132 -0
- package/src/components/toast/toast.variants.test.ts +393 -0
- package/src/components/toast/toast.variants.ts +304 -0
- package/src/components/toggle-button/AGENTS.md +106 -0
- package/src/components/toggle-button/index.ts +30 -0
- package/src/components/toggle-button/toggle-button-group.tsx +156 -0
- package/src/components/toggle-button/toggle-button-label.tsx +19 -0
- package/src/components/toggle-button/toggle-button.context.tsx +130 -0
- package/src/components/toggle-button/toggle-button.tsx +172 -0
- package/src/components/toggle-button/toggle-button.variants.test.ts +189 -0
- package/src/components/toggle-button/toggle-button.variants.ts +160 -0
- package/src/components/tooltip/AGENTS.md +133 -0
- package/src/components/tooltip/index.ts +28 -0
- package/src/components/tooltip/tooltip-arrow.tsx +40 -0
- package/src/components/tooltip/tooltip-content.tsx +179 -0
- package/src/components/tooltip/tooltip-description.tsx +19 -0
- package/src/components/tooltip/tooltip-text.tsx +21 -0
- package/src/components/tooltip/tooltip-title.tsx +20 -0
- package/src/components/tooltip/tooltip-trigger.tsx +103 -0
- package/src/components/tooltip/tooltip.context.tsx +68 -0
- package/src/components/tooltip/tooltip.tsx +213 -0
- package/src/components/tooltip/tooltip.variants.test.ts +231 -0
- package/src/components/tooltip/tooltip.variants.ts +177 -0
- package/src/hooks/use-calm-motion.tsx +31 -0
- package/src/lib/calm-motion.test.ts +17 -0
- package/src/lib/calm-motion.ts +23 -0
- package/src/lib/cn.test.ts +14 -0
- package/src/lib/cn.ts +2 -2
- package/src/no-gorhom.test.ts +54 -0
- package/src/styles/geometry.test.ts +1 -0
- package/src/styles/theme.css +4 -0
- package/src/styles/tokens.css +11 -0
- package/src/styles/tokens.test.ts +22 -0
- package/src/styles/tokens.ts +20 -0
- package/src/components/bottom-sheet/bottom-sheet-portal.tsx +0 -72
- package/src/components/bottom-sheet/bottom-sheet.context.tsx +0 -135
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ReactElement, useMemo } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { IconDefaultsProvider } from "../icon";
|
|
4
|
+
import { useItemPart } from "./item.context";
|
|
5
|
+
import type { ItemSlotProps } from "./item.types";
|
|
6
|
+
import { ITEM_ACTIONS_ICON_TOKEN, itemVariants } from "./item.variants";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The trailing slot — buttons, a chevron, a switch, a value.
|
|
10
|
+
*
|
|
11
|
+
* A bare icon here inherits a step below the media's size and the muted token,
|
|
12
|
+
* so a chevron reads as a hint that the row leads somewhere rather than
|
|
13
|
+
* competing with the row's own subject. A `Button` inside sets its own icon
|
|
14
|
+
* defaults and is unaffected.
|
|
15
|
+
*/
|
|
16
|
+
export function ItemActions({ className, children, ...props }: ItemSlotProps): ReactElement {
|
|
17
|
+
const { size } = useItemPart("Item.Actions");
|
|
18
|
+
const slots = itemVariants({ size });
|
|
19
|
+
const iconClassName = slots.actionsIcon();
|
|
20
|
+
const iconDefaults = useMemo(() => ({ className: iconClassName, color: ITEM_ACTIONS_ICON_TOKEN }), [iconClassName]);
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<View className={slots.actions({ className })} {...props}>
|
|
24
|
+
<IconDefaultsProvider value={iconDefaults}>{children}</IconDefaultsProvider>
|
|
25
|
+
</View>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
ItemActions.displayName = "DelacourUI.Item.Actions";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { useItemPart } from "./item.context";
|
|
4
|
+
import type { ItemSlotProps } from "./item.types";
|
|
5
|
+
import { itemVariants } from "./item.variants";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The text column. Along a row it takes whatever width the media and actions
|
|
9
|
+
* leave, so the actions stay pinned to the trailing edge.
|
|
10
|
+
*/
|
|
11
|
+
export function ItemContent({ className, ...props }: ItemSlotProps): ReactElement {
|
|
12
|
+
const { orientation } = useItemPart("Item.Content");
|
|
13
|
+
return <View className={itemVariants({ orientation }).content({ className })} {...props} />;
|
|
14
|
+
}
|
|
15
|
+
ItemContent.displayName = "DelacourUI.Item.Content";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { Text } from "../text";
|
|
3
|
+
import { useItemPart } from "./item.context";
|
|
4
|
+
import type { ItemTextProps } from "./item.types";
|
|
5
|
+
import { itemVariants } from "./item.variants";
|
|
6
|
+
|
|
7
|
+
/** The item's secondary line, a step down in scale and on the muted token. */
|
|
8
|
+
export function ItemDescription({ className, ...props }: ItemTextProps): ReactElement {
|
|
9
|
+
const { size } = useItemPart("Item.Description");
|
|
10
|
+
return <Text className={itemVariants({ size }).description({ className })} {...props} />;
|
|
11
|
+
}
|
|
12
|
+
ItemDescription.displayName = "DelacourUI.Item.Description";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import type { ItemSlotProps } from "./item.types";
|
|
4
|
+
import { itemVariants } from "./item.variants";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A full-width strip below the row's content — metadata, a progress bar, a row
|
|
8
|
+
* of buttons. Takes a line of its own on either orientation.
|
|
9
|
+
*/
|
|
10
|
+
export function ItemFooter({ className, ...props }: ItemSlotProps): ReactElement {
|
|
11
|
+
return <View className={itemVariants().footer({ className })} {...props} />;
|
|
12
|
+
}
|
|
13
|
+
ItemFooter.displayName = "DelacourUI.Item.Footer";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from "react";
|
|
2
|
+
import { View, type ViewProps } from "react-native";
|
|
3
|
+
import { type ItemOrientation, itemVariants } from "./item.variants";
|
|
4
|
+
|
|
5
|
+
export type ItemGroupProps = ViewProps & {
|
|
6
|
+
/**
|
|
7
|
+
* `vertical` stacks the items down the screen. `horizontal` runs them across,
|
|
8
|
+
* for a carousel — put it in a horizontal `ScrollView` and give each item
|
|
9
|
+
* `orientation="vertical"` so every entry reads as a card.
|
|
10
|
+
*/
|
|
11
|
+
orientation?: ItemOrientation;
|
|
12
|
+
className?: string;
|
|
13
|
+
children?: ReactNode;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A stack of standalone items, spaced rather than divided, announced as a
|
|
18
|
+
* list.
|
|
19
|
+
*
|
|
20
|
+
* For rows sharing one card with dividers between them, put the items in a
|
|
21
|
+
* `ListGroup` instead — they take the group's surface and size from there.
|
|
22
|
+
*/
|
|
23
|
+
export function ItemGroup({ orientation = "vertical", className, ...props }: ItemGroupProps): ReactElement {
|
|
24
|
+
return (
|
|
25
|
+
<View
|
|
26
|
+
accessibilityRole="list"
|
|
27
|
+
className={itemVariants({ groupOrientation: orientation }).group({ className })}
|
|
28
|
+
{...props}
|
|
29
|
+
/>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
ItemGroup.displayName = "DelacourUI.Item.Group";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import type { ItemSlotProps } from "./item.types";
|
|
4
|
+
import { itemVariants } from "./item.variants";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A full-width strip above the row's content — a cover image, a kicker, a
|
|
8
|
+
* timestamp. Takes a line of its own on either orientation.
|
|
9
|
+
*/
|
|
10
|
+
export function ItemHeader({ className, ...props }: ItemSlotProps): ReactElement {
|
|
11
|
+
return <View className={itemVariants().header({ className })} {...props} />;
|
|
12
|
+
}
|
|
13
|
+
ItemHeader.displayName = "DelacourUI.Item.Header";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ReactElement, useMemo } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { IconDefaultsProvider } from "../icon";
|
|
4
|
+
import { useItemPart } from "./item.context";
|
|
5
|
+
import type { ItemSlotProps } from "./item.types";
|
|
6
|
+
import { ITEM_MEDIA_ICON_TOKEN, type ItemMediaVariant, itemVariants } from "./item.variants";
|
|
7
|
+
|
|
8
|
+
export type ItemMediaProps = ItemSlotProps & {
|
|
9
|
+
/**
|
|
10
|
+
* `default` draws nothing and sizes a bare icon to match a `ListGroup` row's.
|
|
11
|
+
* `icon` sets the glyph on a filled tile. `image` is a fixed square that clips
|
|
12
|
+
* its child to the corner — give the image `className="size-full"`.
|
|
13
|
+
*/
|
|
14
|
+
variant?: ItemMediaVariant;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The leading slot — a bare icon, an icon tile, a thumbnail, or an avatar
|
|
19
|
+
* passed straight through.
|
|
20
|
+
*
|
|
21
|
+
* Its subtree inherits an icon size read from the item's size and this slot's
|
|
22
|
+
* variant, and the foreground token, so a bare `<Icon icon={IconFile} />` comes
|
|
23
|
+
* out right with nothing said at the call site.
|
|
24
|
+
*/
|
|
25
|
+
export function ItemMedia({ variant = "default", className, children, ...props }: ItemMediaProps): ReactElement {
|
|
26
|
+
const { isSelected, size, surface } = useItemPart("Item.Media");
|
|
27
|
+
const slots = itemVariants({ isSelected, mediaVariant: variant, size, surface });
|
|
28
|
+
const iconClassName = slots.mediaIcon();
|
|
29
|
+
const iconDefaults = useMemo(() => ({ className: iconClassName, color: ITEM_MEDIA_ICON_TOKEN }), [iconClassName]);
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<View className={slots.media({ className })} {...props}>
|
|
33
|
+
<IconDefaultsProvider value={iconDefaults}>{children}</IconDefaultsProvider>
|
|
34
|
+
</View>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
ItemMedia.displayName = "DelacourUI.Item.Media";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { Separator, type SeparatorProps } from "../separator";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A hairline between items in an `Item.Group`. Match the group's axis — a
|
|
6
|
+
* horizontal group needs `orientation="vertical"`.
|
|
7
|
+
*
|
|
8
|
+
* A `ListGroup` inserts its own dividers, so this is for `Item.Group` only.
|
|
9
|
+
*/
|
|
10
|
+
export function ItemSeparator(props: SeparatorProps): ReactElement {
|
|
11
|
+
return <Separator {...props} />;
|
|
12
|
+
}
|
|
13
|
+
ItemSeparator.displayName = "DelacourUI.Item.Separator";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import { Text } from "../text";
|
|
3
|
+
import { useItemPart } from "./item.context";
|
|
4
|
+
import type { ItemTextProps } from "./item.types";
|
|
5
|
+
import { itemVariants } from "./item.variants";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The item's primary line.
|
|
9
|
+
*
|
|
10
|
+
* Carries its own colour and type scale, read from the item's context: a React
|
|
11
|
+
* Native `View` does not cascade colour to a `Text` descendant.
|
|
12
|
+
*/
|
|
13
|
+
export function ItemTitle({ className, ...props }: ItemTextProps): ReactElement {
|
|
14
|
+
const { size } = useItemPart("Item.Title");
|
|
15
|
+
return <Text className={itemVariants({ size }).title({ className })} {...props} />;
|
|
16
|
+
}
|
|
17
|
+
ItemTitle.displayName = "DelacourUI.Item.Title";
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createContext, type ReactElement, type ReactNode, use } from "react";
|
|
2
|
+
import type { ItemOrientation, ItemSize, ItemSurface } from "./item.variants";
|
|
3
|
+
|
|
4
|
+
export type ItemContextValue = {
|
|
5
|
+
/** Resolved size — the item's own, else its `ListGroup`'s, else `md`. */
|
|
6
|
+
size: ItemSize;
|
|
7
|
+
/** Whether the item's parts sit side by side or stack. */
|
|
8
|
+
orientation: ItemOrientation;
|
|
9
|
+
/** The surface actually drawn: `grouped` inside a `ListGroup`, else the variant. */
|
|
10
|
+
surface: ItemSurface;
|
|
11
|
+
/** Whether the item is disabled. */
|
|
12
|
+
isDisabled: boolean;
|
|
13
|
+
/** Whether the item is selected. */
|
|
14
|
+
isSelected: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const ItemContext = createContext<ItemContextValue | null>(null);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Supplies the enclosing item's resolved size, orientation and surface to its
|
|
21
|
+
* parts.
|
|
22
|
+
*
|
|
23
|
+
* Lives in its own module, importing nothing but `item.variants`, so a part can
|
|
24
|
+
* read it without importing `./item` and closing a cycle through the root. See
|
|
25
|
+
* AGENTS.md rule 3.
|
|
26
|
+
*/
|
|
27
|
+
export function ItemProvider({ value, children }: { value: ItemContextValue; children: ReactNode }): ReactElement {
|
|
28
|
+
return <ItemContext value={value}>{children}</ItemContext>;
|
|
29
|
+
}
|
|
30
|
+
ItemProvider.displayName = "DelacourUI.Item.Provider";
|
|
31
|
+
|
|
32
|
+
/** The enclosing item's context, or null outside an `<Item>`. */
|
|
33
|
+
export function useItemContext(): ItemContextValue | null {
|
|
34
|
+
return use(ItemContext);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Reads the enclosing item's resolved size, orientation and surface.
|
|
39
|
+
*
|
|
40
|
+
* Lets a custom part style itself to match without props passed down through
|
|
41
|
+
* every slot. Throws outside an `<Item>` — use {@link useItemContext} where the
|
|
42
|
+
* enclosing item is optional.
|
|
43
|
+
*/
|
|
44
|
+
export function useItem(): ItemContextValue {
|
|
45
|
+
const context = useItemContext();
|
|
46
|
+
if (!context) {
|
|
47
|
+
throw new Error("useItem must be called inside an <Item>.");
|
|
48
|
+
}
|
|
49
|
+
return context;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The enclosing item's context, for a compound part that cannot work without
|
|
54
|
+
* one.
|
|
55
|
+
*
|
|
56
|
+
* Internal: deliberately not re-exported from `index.ts`. A caller outside the
|
|
57
|
+
* library wants {@link useItem}, whose error message names the hook rather than
|
|
58
|
+
* a part.
|
|
59
|
+
*/
|
|
60
|
+
export function useItemPart(component: string): ItemContextValue {
|
|
61
|
+
const context = useItemContext();
|
|
62
|
+
if (!context) {
|
|
63
|
+
throw new Error(`${component} must be rendered inside an <Item>.`);
|
|
64
|
+
}
|
|
65
|
+
return context;
|
|
66
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Children, type ReactElement, type ReactNode, useMemo } from "react";
|
|
2
|
+
import type { AccessibilityState } from "react-native";
|
|
3
|
+
import Animated from "react-native-reanimated";
|
|
4
|
+
import { useListGroupContext } from "../list-group/list-group.context";
|
|
5
|
+
import { Pressable, type PressableProps } from "../pressable";
|
|
6
|
+
import { type ItemContextValue, ItemProvider } from "./item.context";
|
|
7
|
+
import {
|
|
8
|
+
type ItemOrientation,
|
|
9
|
+
type ItemSize,
|
|
10
|
+
type ItemVariant,
|
|
11
|
+
itemVariants,
|
|
12
|
+
resolveItemFeedback,
|
|
13
|
+
resolveItemRender,
|
|
14
|
+
resolveItemSize,
|
|
15
|
+
resolveItemSurface,
|
|
16
|
+
} from "./item.variants";
|
|
17
|
+
import { ItemActions } from "./item-actions";
|
|
18
|
+
import { ItemContent } from "./item-content";
|
|
19
|
+
import { ItemDescription } from "./item-description";
|
|
20
|
+
import { ItemFooter } from "./item-footer";
|
|
21
|
+
import { ItemGroup } from "./item-group";
|
|
22
|
+
import { ItemHeader } from "./item-header";
|
|
23
|
+
import { ItemMedia } from "./item-media";
|
|
24
|
+
import { ItemSeparator } from "./item-separator";
|
|
25
|
+
import { ItemTitle } from "./item-title";
|
|
26
|
+
|
|
27
|
+
export type ItemProps = Omit<PressableProps, "children" | "disabled"> & {
|
|
28
|
+
/**
|
|
29
|
+
* `default` draws no surface, `outline` a hairline border, `muted` a fill.
|
|
30
|
+
* Ignored inside a `ListGroup`, which draws the surface itself.
|
|
31
|
+
*/
|
|
32
|
+
variant?: ItemVariant;
|
|
33
|
+
/**
|
|
34
|
+
* Row density. `Item.Media`, `Item.Title` and `Item.Description` follow it.
|
|
35
|
+
* Inside a `ListGroup` it defaults to the group's size.
|
|
36
|
+
*/
|
|
37
|
+
size?: ItemSize;
|
|
38
|
+
/** `horizontal` is the list row; `vertical` stacks the parts into a card. */
|
|
39
|
+
orientation?: ItemOrientation;
|
|
40
|
+
isDisabled?: boolean;
|
|
41
|
+
/** Lays the accent fill over the surface and announces the item as selected. */
|
|
42
|
+
isSelected?: boolean;
|
|
43
|
+
children?: ReactNode;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
function ItemRoot({
|
|
47
|
+
variant = "default",
|
|
48
|
+
size,
|
|
49
|
+
orientation = "horizontal",
|
|
50
|
+
isDisabled = false,
|
|
51
|
+
isSelected = false,
|
|
52
|
+
feedback,
|
|
53
|
+
haptic,
|
|
54
|
+
pressedScale,
|
|
55
|
+
pressedOpacity,
|
|
56
|
+
busy,
|
|
57
|
+
asChild,
|
|
58
|
+
onPress,
|
|
59
|
+
onLongPress,
|
|
60
|
+
accessibilityState,
|
|
61
|
+
className,
|
|
62
|
+
children,
|
|
63
|
+
...props
|
|
64
|
+
}: ItemProps): ReactElement {
|
|
65
|
+
const group = useListGroupContext();
|
|
66
|
+
const isInGroup = group !== null;
|
|
67
|
+
const resolvedSize = resolveItemSize(size, group?.size);
|
|
68
|
+
const surface = resolveItemSurface(variant, isInGroup);
|
|
69
|
+
|
|
70
|
+
const context = useMemo<ItemContextValue>(
|
|
71
|
+
() => ({ isDisabled, isSelected, orientation, size: resolvedSize, surface }),
|
|
72
|
+
[isDisabled, isSelected, orientation, resolvedSize, surface]
|
|
73
|
+
);
|
|
74
|
+
const content = useMemo(() => wrapTextChildren(children), [children]);
|
|
75
|
+
const rootClassName = itemVariants({ isDisabled, isSelected, orientation, size: resolvedSize, surface }).root({
|
|
76
|
+
className,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const render = resolveItemRender({ isDisabled, onLongPress, onPress });
|
|
80
|
+
|
|
81
|
+
if (render === "pressable") {
|
|
82
|
+
return (
|
|
83
|
+
<ItemProvider value={context}>
|
|
84
|
+
<Pressable
|
|
85
|
+
accessibilityState={{ ...accessibilityState, selected: isSelected }}
|
|
86
|
+
asChild={asChild}
|
|
87
|
+
busy={busy}
|
|
88
|
+
className={rootClassName}
|
|
89
|
+
disabled={isDisabled}
|
|
90
|
+
feedback={resolveItemFeedback(feedback, isInGroup)}
|
|
91
|
+
haptic={haptic}
|
|
92
|
+
onLongPress={onLongPress}
|
|
93
|
+
onPress={onPress}
|
|
94
|
+
pressedOpacity={pressedOpacity}
|
|
95
|
+
pressedScale={pressedScale}
|
|
96
|
+
{...props}
|
|
97
|
+
>
|
|
98
|
+
{content}
|
|
99
|
+
</Pressable>
|
|
100
|
+
</ItemProvider>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const state: AccessibilityState = { ...accessibilityState, busy, disabled: isDisabled, selected: isSelected };
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<ItemProvider value={context}>
|
|
108
|
+
<Animated.View accessibilityState={state} className={rootClassName} {...props}>
|
|
109
|
+
{content}
|
|
110
|
+
</Animated.View>
|
|
111
|
+
</ItemProvider>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Wraps bare text children in a title inside a content column.
|
|
117
|
+
*
|
|
118
|
+
* Consecutive strings and numbers are collected into a single title rather
|
|
119
|
+
* than one each — `Row {index}` is one piece of text. React Native cannot
|
|
120
|
+
* render a string outside a `<Text>`, so without this `<Item>Wi-Fi</Item>`
|
|
121
|
+
* would crash.
|
|
122
|
+
*
|
|
123
|
+
* Lives with the root because the root is what wraps its own text; a part
|
|
124
|
+
* importing it from here would close a cycle. See AGENTS.md rule 3.
|
|
125
|
+
*/
|
|
126
|
+
function wrapTextChildren(children: ReactNode): ReactNode {
|
|
127
|
+
const items = Children.toArray(children);
|
|
128
|
+
const output: ReactNode[] = [];
|
|
129
|
+
let run: (string | number)[] = [];
|
|
130
|
+
|
|
131
|
+
const flushRun = () => {
|
|
132
|
+
if (run.length === 0) return;
|
|
133
|
+
output.push(
|
|
134
|
+
<ItemContent key={`content-${output.length}`}>
|
|
135
|
+
<ItemTitle>{run.join("")}</ItemTitle>
|
|
136
|
+
</ItemContent>
|
|
137
|
+
);
|
|
138
|
+
run = [];
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
for (const child of items) {
|
|
142
|
+
if (typeof child === "string" || typeof child === "number") {
|
|
143
|
+
run.push(child);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
flushRun();
|
|
147
|
+
output.push(child);
|
|
148
|
+
}
|
|
149
|
+
flushRun();
|
|
150
|
+
|
|
151
|
+
return output;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* A row of media, text and actions, for lists and settings.
|
|
156
|
+
*
|
|
157
|
+
* Give it an `onPress` and it renders as a `Pressable` announced as a button;
|
|
158
|
+
* leave it off and it is a plain view, so a static row never claims to be a
|
|
159
|
+
* control. `resolveItemRender` makes that call, and a disabled one too. `size` is set once here — the media, the title and the description
|
|
160
|
+
* read it from context.
|
|
161
|
+
*
|
|
162
|
+
* It drops straight into a `ListGroup` as a row: inside one it takes the
|
|
163
|
+
* group's size unless given its own, draws no surface of its own whatever its
|
|
164
|
+
* `variant`, fades rather than scales on press, and pads itself to the inset
|
|
165
|
+
* the group draws its dividers at.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* <Item variant="outline">
|
|
169
|
+
* <Item.Media variant="icon">
|
|
170
|
+
* <Icon icon={IconFileText} />
|
|
171
|
+
* </Item.Media>
|
|
172
|
+
* <Item.Content>
|
|
173
|
+
* <Item.Title>Invoice.pdf</Item.Title>
|
|
174
|
+
* <Item.Description>2.4 MB · Updated yesterday</Item.Description>
|
|
175
|
+
* </Item.Content>
|
|
176
|
+
* <Item.Actions>
|
|
177
|
+
* <Button size="sm" variant="outline">
|
|
178
|
+
* <Button.Label>Open</Button.Label>
|
|
179
|
+
* </Button>
|
|
180
|
+
* </Item.Actions>
|
|
181
|
+
* </Item>
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* <ListGroup>
|
|
185
|
+
* <Item onPress={openWifi}>
|
|
186
|
+
* <Item.Media>
|
|
187
|
+
* <Icon icon={IconWifi} />
|
|
188
|
+
* </Item.Media>
|
|
189
|
+
* <Item.Content>
|
|
190
|
+
* <Item.Title>Wi-Fi</Item.Title>
|
|
191
|
+
* </Item.Content>
|
|
192
|
+
* <Item.Actions>
|
|
193
|
+
* <Icon icon={IconChevronRight} />
|
|
194
|
+
* </Item.Actions>
|
|
195
|
+
* </Item>
|
|
196
|
+
* </ListGroup>
|
|
197
|
+
*/
|
|
198
|
+
export const Item = Object.assign(ItemRoot, {
|
|
199
|
+
/** A spaced stack of standalone items, announced as a list. */
|
|
200
|
+
Group: ItemGroup,
|
|
201
|
+
/** A hairline between items in an `Item.Group`. */
|
|
202
|
+
Separator: ItemSeparator,
|
|
203
|
+
/** The leading slot — a bare icon, an icon tile, or an image. Sized by the item. */
|
|
204
|
+
Media: ItemMedia,
|
|
205
|
+
/** The text column, taking the width the media and actions leave. */
|
|
206
|
+
Content: ItemContent,
|
|
207
|
+
/** The primary line. Carries its own colour — a `View` cannot cascade one to a `Text`. */
|
|
208
|
+
Title: ItemTitle,
|
|
209
|
+
/** The secondary line, a step down in scale and on the muted token. */
|
|
210
|
+
Description: ItemDescription,
|
|
211
|
+
/** The trailing slot — buttons, a chevron, a switch, a value. */
|
|
212
|
+
Actions: ItemActions,
|
|
213
|
+
/** A full-width strip above the row's content. */
|
|
214
|
+
Header: ItemHeader,
|
|
215
|
+
/** A full-width strip below the row's content. */
|
|
216
|
+
Footer: ItemFooter,
|
|
217
|
+
displayName: "DelacourUI.Item",
|
|
218
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { TextProps, ViewProps } from "react-native";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The shape of an item's layout slots — `Content`, `Actions`, `Header` and
|
|
6
|
+
* `Footer` — and the base `Item.Media` extends. Shared by several parts, so it
|
|
7
|
+
* lives in a leaf rather than in one of them arbitrarily.
|
|
8
|
+
*/
|
|
9
|
+
export type ItemSlotProps = ViewProps & { className?: string; children?: ReactNode };
|
|
10
|
+
|
|
11
|
+
/** The shape of an item's two text lines, `Title` and `Description`. */
|
|
12
|
+
export type ItemTextProps = TextProps & { className?: string };
|