@krizaka/ui 2.2.0 → 2.4.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 +33 -8
- package/dist/audio-player.d.ts +113 -0
- package/dist/audio-player.js +207 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/{button-Cgfkg_3y.d.ts → button-BMAO7dKF.d.ts} +29 -2
- package/dist/button.d.ts +32 -5
- package/dist/button.js +62 -9
- package/dist/button.js.map +1 -1
- package/dist/chip-link.d.ts +53 -0
- package/dist/chip-link.js +32 -0
- package/dist/chip-link.js.map +1 -0
- package/dist/chunk-2USC2YT6.js +17 -0
- package/dist/chunk-2USC2YT6.js.map +1 -0
- package/dist/chunk-43PTCDTL.js +31 -0
- package/dist/chunk-43PTCDTL.js.map +1 -0
- package/dist/chunk-6ISW63JI.js +11 -0
- package/dist/chunk-6ISW63JI.js.map +1 -0
- package/dist/chunk-EUPTXKH7.js +95 -0
- package/dist/chunk-EUPTXKH7.js.map +1 -0
- package/dist/chunk-HAQWKORZ.js +117 -0
- package/dist/chunk-HAQWKORZ.js.map +1 -0
- package/dist/{chunk-FHYZSO2S.js → chunk-R6SDS7JM.js} +5 -3
- package/dist/chunk-R6SDS7JM.js.map +1 -0
- package/dist/chunk-RUPNPMP3.js +103 -0
- package/dist/chunk-RUPNPMP3.js.map +1 -0
- package/dist/chunk-RUPRYJ45.js +82 -0
- package/dist/chunk-RUPRYJ45.js.map +1 -0
- package/dist/chunk-VDR2EP6K.js +49 -0
- package/dist/chunk-VDR2EP6K.js.map +1 -0
- package/dist/chunk-WEVYKZIF.js +33 -0
- package/dist/chunk-WEVYKZIF.js.map +1 -0
- package/dist/chunk-XUMJA5ZI.js +283 -0
- package/dist/chunk-XUMJA5ZI.js.map +1 -0
- package/dist/chunk-YH4LMWRU.js +92 -0
- package/dist/chunk-YH4LMWRU.js.map +1 -0
- package/dist/chunk-YX6CNVJA.js +94 -0
- package/dist/chunk-YX6CNVJA.js.map +1 -0
- package/dist/chunk-ZIXB33X7.js +95 -0
- package/dist/chunk-ZIXB33X7.js.map +1 -0
- package/dist/combobox.d.ts +188 -0
- package/dist/combobox.js +16 -0
- package/dist/combobox.js.map +1 -0
- package/dist/command.d.ts +7 -7
- package/dist/command.js +3 -2
- package/dist/command.js.map +1 -1
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +2 -1
- package/dist/confirm-button.js.map +1 -1
- package/dist/data-table.d.ts +246 -0
- package/dist/data-table.js +290 -0
- package/dist/data-table.js.map +1 -0
- package/dist/date-picker.d.ts +288 -0
- package/dist/date-picker.js +364 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/{dialog-GQ4Nvuyf.d.ts → dialog-D42QwYb_.d.ts} +11 -1
- package/dist/dialog.d.ts +1 -1
- package/dist/dialog.js +3 -2
- package/dist/dialog.js.map +1 -1
- package/dist/file-upload.d.ts +238 -0
- package/dist/file-upload.js +437 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/filter-bar.d.ts +139 -0
- package/dist/filter-bar.js +155 -0
- package/dist/filter-bar.js.map +1 -0
- package/dist/glow-card.d.ts +20 -0
- package/dist/glow-card.js +30 -0
- package/dist/glow-card.js.map +1 -0
- package/dist/image-cropper.d.ts +115 -0
- package/dist/image-cropper.js +166 -0
- package/dist/image-cropper.js.map +1 -0
- package/dist/index.d.ts +2 -20
- package/dist/index.js +7 -64
- package/dist/index.js.map +1 -1
- package/dist/iso.d.ts +400 -0
- package/dist/iso.js +363 -0
- package/dist/iso.js.map +1 -0
- package/dist/loader.d.ts +206 -0
- package/dist/loader.js +138 -0
- package/dist/loader.js.map +1 -0
- package/dist/marquee.d.ts +33 -0
- package/dist/marquee.js +52 -0
- package/dist/marquee.js.map +1 -0
- package/dist/media-capture.d.ts +155 -0
- package/dist/media-capture.js +242 -0
- package/dist/media-capture.js.map +1 -0
- package/dist/meter.d.ts +146 -0
- package/dist/meter.js +107 -0
- package/dist/meter.js.map +1 -0
- package/dist/motion.css +394 -3
- package/dist/motion.d.ts +46 -0
- package/dist/motion.js +10 -0
- package/dist/motion.js.map +1 -0
- package/dist/native/media-capture.d.ts +49 -0
- package/dist/native/media-capture.js +113 -0
- package/dist/native/media-capture.js.map +1 -0
- package/dist/native/video-player.d.ts +50 -0
- package/dist/native/video-player.js +69 -0
- package/dist/native/video-player.js.map +1 -0
- package/dist/native.d.ts +66 -2
- package/dist/native.js +166 -68
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.d.ts +178 -0
- package/dist/nav-bar.js +157 -0
- package/dist/nav-bar.js.map +1 -0
- package/dist/number-ticker.d.ts +32 -0
- package/dist/number-ticker.js +61 -0
- package/dist/number-ticker.js.map +1 -0
- package/dist/pagination.d.ts +141 -0
- package/dist/pagination.js +165 -0
- package/dist/pagination.js.map +1 -0
- package/dist/progress.d.ts +56 -1
- package/dist/progress.js +72 -25
- package/dist/progress.js.map +1 -1
- package/dist/search-field.d.ts +100 -0
- package/dist/search-field.js +167 -0
- package/dist/search-field.js.map +1 -0
- package/dist/skeleton.d.ts +18 -3
- package/dist/skeleton.js +9 -1
- package/dist/skeleton.js.map +1 -1
- package/dist/spinner.d.ts +21 -5
- package/dist/spinner.js +13 -12
- package/dist/spinner.js.map +1 -1
- package/dist/stepper.d.ts +112 -0
- package/dist/stepper.js +67 -0
- package/dist/stepper.js.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +14 -8
- package/dist/tabs.js.map +1 -1
- package/dist/tag-input.d.ts +44 -0
- package/dist/tag-input.js +67 -0
- package/dist/tag-input.js.map +1 -0
- package/dist/theme.d.ts +1 -1
- package/dist/theme.js +2 -1
- package/dist/theme.js.map +1 -1
- package/dist/toast.d.ts +39 -4
- package/dist/toast.js +81 -7
- package/dist/toast.js.map +1 -1
- package/dist/video-player.d.ts +204 -0
- package/dist/video-player.js +371 -0
- package/dist/video-player.js.map +1 -0
- package/dist/video-trimmer.d.ts +142 -0
- package/dist/video-trimmer.js +193 -0
- package/dist/video-trimmer.js.map +1 -0
- package/package.json +375 -7
- package/registry/alert.json +1 -1
- package/registry/audio-player.json +282 -0
- package/registry/avatar.json +1 -1
- package/registry/badge.json +1 -1
- package/registry/button.json +232 -26
- package/registry/card.json +1 -1
- package/registry/checkbox.json +1 -1
- package/registry/chip-link.json +158 -0
- package/registry/chip.json +1 -1
- package/registry/combobox.json +475 -0
- package/registry/command.json +1 -1
- package/registry/confirm-button.json +91 -7
- package/registry/countdown.json +1 -1
- package/registry/data-table.json +500 -0
- package/registry/date-picker.json +978 -0
- package/registry/dialog.json +15 -7
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/examples/audio-player/podcast.js +22 -0
- package/registry/examples/audio-player/podcast.tsx +19 -0
- package/registry/examples/audio-player/voice-note.d.ts +4 -0
- package/registry/examples/audio-player/voice-note.js +12 -0
- package/registry/examples/audio-player/voice-note.tsx +12 -0
- package/registry/examples/button/error.d.ts +4 -0
- package/registry/examples/button/error.js +11 -0
- package/registry/examples/button/error.tsx +10 -0
- package/registry/examples/button/loading.tsx +1 -1
- package/registry/examples/button/save-flow.d.ts +4 -0
- package/registry/examples/button/save-flow.js +28 -0
- package/registry/examples/button/save-flow.tsx +24 -0
- package/registry/examples/button/signature.d.ts +4 -0
- package/registry/examples/button/signature.js +17 -0
- package/registry/examples/button/signature.tsx +19 -0
- package/registry/examples/button/upload-progress.d.ts +4 -0
- package/registry/examples/button/upload-progress.js +23 -0
- package/registry/examples/button/upload-progress.tsx +26 -0
- package/registry/examples/chip-link/filters.d.ts +4 -0
- package/registry/examples/chip-link/filters.js +12 -0
- package/registry/examples/chip-link/filters.tsx +17 -0
- package/registry/examples/combobox/async.d.ts +4 -0
- package/registry/examples/combobox/async.js +23 -0
- package/registry/examples/combobox/async.tsx +22 -0
- package/registry/examples/combobox/creatable.d.ts +4 -0
- package/registry/examples/combobox/creatable.js +32 -0
- package/registry/examples/combobox/creatable.tsx +28 -0
- package/registry/examples/combobox/invalid.d.ts +4 -0
- package/registry/examples/combobox/invalid.js +23 -0
- package/registry/examples/combobox/invalid.tsx +17 -0
- package/registry/examples/combobox/multiple.d.ts +4 -0
- package/registry/examples/combobox/multiple.js +29 -0
- package/registry/examples/combobox/multiple.tsx +26 -0
- package/registry/examples/data-table/cards.d.ts +4 -0
- package/registry/examples/data-table/cards.js +21 -0
- package/registry/examples/data-table/cards.tsx +20 -0
- package/registry/examples/data-table/empty.d.ts +4 -0
- package/registry/examples/data-table/empty.js +26 -0
- package/registry/examples/data-table/empty.tsx +21 -0
- package/registry/examples/data-table/error.d.ts +4 -0
- package/registry/examples/data-table/error.js +28 -0
- package/registry/examples/data-table/error.tsx +29 -0
- package/registry/examples/data-table/jobs.d.ts +4 -0
- package/registry/examples/data-table/jobs.js +37 -0
- package/registry/examples/data-table/jobs.tsx +36 -0
- package/registry/examples/data-table/loading.d.ts +4 -0
- package/registry/examples/data-table/loading.js +16 -0
- package/registry/examples/data-table/loading.tsx +12 -0
- package/registry/examples/data-table/virtualized.d.ts +4 -0
- package/registry/examples/data-table/virtualized.js +21 -0
- package/registry/examples/data-table/virtualized.tsx +20 -0
- package/registry/examples/date-picker/calendar.d.ts +4 -0
- package/registry/examples/date-picker/calendar.js +14 -0
- package/registry/examples/date-picker/calendar.tsx +16 -0
- package/registry/examples/date-picker/french.d.ts +4 -0
- package/registry/examples/date-picker/french.js +20 -0
- package/registry/examples/date-picker/french.tsx +14 -0
- package/registry/examples/date-picker/open.d.ts +4 -0
- package/registry/examples/date-picker/open.js +11 -0
- package/registry/examples/date-picker/open.tsx +8 -0
- package/registry/examples/date-picker/range.d.ts +4 -0
- package/registry/examples/date-picker/range.js +29 -0
- package/registry/examples/date-picker/range.tsx +25 -0
- package/registry/examples/date-picker/schedule.d.ts +4 -0
- package/registry/examples/date-picker/schedule.js +26 -0
- package/registry/examples/date-picker/schedule.tsx +22 -0
- package/registry/examples/dialog/left.d.ts +4 -0
- package/registry/examples/dialog/left.js +22 -0
- package/registry/examples/dialog/left.tsx +32 -0
- package/registry/examples/file-upload/images.d.ts +4 -0
- package/registry/examples/file-upload/images.js +32 -0
- package/registry/examples/file-upload/images.tsx +25 -0
- package/registry/examples/file-upload/states.d.ts +4 -0
- package/registry/examples/file-upload/states.js +28 -0
- package/registry/examples/file-upload/states.tsx +23 -0
- package/registry/examples/file-upload/tus.d.ts +4 -0
- package/registry/examples/file-upload/tus.js +23 -0
- package/registry/examples/file-upload/tus.tsx +26 -0
- package/registry/examples/file-upload/video.d.ts +4 -0
- package/registry/examples/file-upload/video.js +39 -0
- package/registry/examples/file-upload/video.tsx +36 -0
- package/registry/examples/filter-bar/address.d.ts +4 -0
- package/registry/examples/filter-bar/address.js +29 -0
- package/registry/examples/filter-bar/address.tsx +27 -0
- package/registry/examples/filter-bar/jobs.d.ts +4 -0
- package/registry/examples/filter-bar/jobs.js +37 -0
- package/registry/examples/filter-bar/jobs.tsx +37 -0
- package/registry/examples/filter-bar/menu.d.ts +4 -0
- package/registry/examples/filter-bar/menu.js +27 -0
- package/registry/examples/filter-bar/menu.tsx +23 -0
- package/registry/examples/glow-card/link-card.d.ts +4 -0
- package/registry/examples/glow-card/link-card.js +14 -0
- package/registry/examples/glow-card/link-card.tsx +13 -0
- package/registry/examples/glow-card/plans.d.ts +4 -0
- package/registry/examples/glow-card/plans.js +25 -0
- package/registry/examples/glow-card/plans.tsx +26 -0
- package/registry/examples/glow-card/spotlight.d.ts +4 -0
- package/registry/examples/glow-card/spotlight.js +14 -0
- package/registry/examples/glow-card/spotlight.tsx +15 -0
- package/registry/examples/image-cropper/avatar.d.ts +4 -0
- package/registry/examples/image-cropper/avatar.js +13 -0
- package/registry/examples/image-cropper/avatar.tsx +14 -0
- package/registry/examples/image-cropper/banner.d.ts +4 -0
- package/registry/examples/image-cropper/banner.js +11 -0
- package/registry/examples/image-cropper/banner.tsx +10 -0
- package/registry/examples/image-cropper/vertical-video.d.ts +4 -0
- package/registry/examples/image-cropper/vertical-video.js +12 -0
- package/registry/examples/image-cropper/vertical-video.tsx +16 -0
- package/registry/examples/iso/compose.d.ts +4 -0
- package/registry/examples/iso/compose.js +22 -0
- package/registry/examples/iso/compose.tsx +19 -0
- package/registry/examples/iso/orazaka-hero.d.ts +4 -0
- package/registry/examples/iso/orazaka-hero.js +26 -0
- package/registry/examples/iso/orazaka-hero.tsx +21 -0
- package/registry/examples/iso/orochia-hero.d.ts +4 -0
- package/registry/examples/iso/orochia-hero.js +29 -0
- package/registry/examples/iso/orochia-hero.tsx +23 -0
- package/registry/examples/iso/still.d.ts +4 -0
- package/registry/examples/iso/still.js +21 -0
- package/registry/examples/iso/still.tsx +15 -0
- package/registry/examples/loader/endings.d.ts +4 -0
- package/registry/examples/loader/endings.js +14 -0
- package/registry/examples/loader/endings.tsx +11 -0
- package/registry/examples/loader/fetch-flow.d.ts +4 -0
- package/registry/examples/loader/fetch-flow.js +24 -0
- package/registry/examples/loader/fetch-flow.tsx +24 -0
- package/registry/examples/loader/minimal.d.ts +4 -0
- package/registry/examples/loader/minimal.js +11 -0
- package/registry/examples/loader/minimal.tsx +6 -0
- package/registry/examples/loader/overlay.d.ts +4 -0
- package/registry/examples/loader/overlay.js +16 -0
- package/registry/examples/loader/overlay.tsx +13 -0
- package/registry/examples/loader/region-handover.d.ts +4 -0
- package/registry/examples/loader/region-handover.js +42 -0
- package/registry/examples/loader/region-handover.tsx +29 -0
- package/registry/examples/loader/upload-eta.d.ts +4 -0
- package/registry/examples/loader/upload-eta.js +11 -0
- package/registry/examples/loader/upload-eta.tsx +10 -0
- package/registry/examples/marquee/cards.d.ts +4 -0
- package/registry/examples/marquee/cards.js +23 -0
- package/registry/examples/marquee/cards.tsx +21 -0
- package/registry/examples/marquee/logos.d.ts +4 -0
- package/registry/examples/marquee/logos.js +12 -0
- package/registry/examples/marquee/logos.tsx +17 -0
- package/registry/examples/media-capture/clip.d.ts +4 -0
- package/registry/examples/media-capture/clip.js +20 -0
- package/registry/examples/media-capture/clip.tsx +18 -0
- package/registry/examples/media-capture/native/photo.d.ts +4 -0
- package/registry/examples/media-capture/native/photo.dark.png +0 -0
- package/registry/examples/media-capture/native/photo.js +27 -0
- package/registry/examples/media-capture/native/photo.light.png +0 -0
- package/registry/examples/media-capture/native/photo.tsx +20 -0
- package/registry/examples/media-capture/profile-photo.d.ts +4 -0
- package/registry/examples/media-capture/profile-photo.js +24 -0
- package/registry/examples/media-capture/profile-photo.tsx +20 -0
- package/registry/examples/meter/balance.d.ts +4 -0
- package/registry/examples/meter/balance.js +14 -0
- package/registry/examples/meter/balance.tsx +15 -0
- package/registry/examples/meter/quota.d.ts +4 -0
- package/registry/examples/meter/quota.js +15 -0
- package/registry/examples/meter/quota.tsx +12 -0
- package/registry/examples/meter/split.d.ts +4 -0
- package/registry/examples/meter/split.js +18 -0
- package/registry/examples/meter/split.tsx +18 -0
- package/registry/examples/nav-bar/app-bar.d.ts +4 -0
- package/registry/examples/nav-bar/app-bar.js +22 -0
- package/registry/examples/nav-bar/app-bar.tsx +21 -0
- package/registry/examples/nav-bar/menu-open.d.ts +4 -0
- package/registry/examples/nav-bar/menu-open.js +26 -0
- package/registry/examples/nav-bar/menu-open.tsx +26 -0
- package/registry/examples/nav-bar/site.d.ts +4 -0
- package/registry/examples/nav-bar/site.js +31 -0
- package/registry/examples/nav-bar/site.tsx +36 -0
- package/registry/examples/number-ticker/gradient.d.ts +4 -0
- package/registry/examples/number-ticker/gradient.js +11 -0
- package/registry/examples/number-ticker/gradient.tsx +10 -0
- package/registry/examples/number-ticker/live-total.d.ts +4 -0
- package/registry/examples/number-ticker/live-total.js +17 -0
- package/registry/examples/number-ticker/live-total.tsx +21 -0
- package/registry/examples/number-ticker/stats.d.ts +4 -0
- package/registry/examples/number-ticker/stats.js +19 -0
- package/registry/examples/number-ticker/stats.tsx +23 -0
- package/registry/examples/pagination/cursor.d.ts +4 -0
- package/registry/examples/pagination/cursor.js +24 -0
- package/registry/examples/pagination/cursor.tsx +20 -0
- package/registry/examples/pagination/links.d.ts +4 -0
- package/registry/examples/pagination/links.js +11 -0
- package/registry/examples/pagination/links.tsx +6 -0
- package/registry/examples/pagination/native/cursor.d.ts +4 -0
- package/registry/examples/pagination/native/cursor.dark.png +0 -0
- package/registry/examples/pagination/native/cursor.js +19 -0
- package/registry/examples/pagination/native/cursor.light.png +0 -0
- package/registry/examples/pagination/native/cursor.tsx +13 -0
- package/registry/examples/pagination/native/pages.d.ts +4 -0
- package/registry/examples/pagination/native/pages.dark.png +0 -0
- package/registry/examples/pagination/native/pages.js +21 -0
- package/registry/examples/pagination/native/pages.light.png +0 -0
- package/registry/examples/pagination/native/pages.tsx +14 -0
- package/registry/examples/pagination/results.d.ts +4 -0
- package/registry/examples/pagination/results.js +23 -0
- package/registry/examples/pagination/results.tsx +19 -0
- package/registry/examples/pagination/table-footer.d.ts +4 -0
- package/registry/examples/pagination/table-footer.js +31 -0
- package/registry/examples/pagination/table-footer.tsx +27 -0
- package/registry/examples/progress/buffer.d.ts +4 -0
- package/registry/examples/progress/buffer.js +11 -0
- package/registry/examples/progress/buffer.tsx +10 -0
- package/registry/examples/progress/statuses.d.ts +4 -0
- package/registry/examples/progress/statuses.js +14 -0
- package/registry/examples/progress/statuses.tsx +11 -0
- package/registry/examples/progress/steps.d.ts +4 -0
- package/registry/examples/progress/steps.js +14 -0
- package/registry/examples/progress/steps.tsx +13 -0
- package/registry/examples/progress/upload.d.ts +4 -0
- package/registry/examples/progress/upload.js +11 -0
- package/registry/examples/progress/upload.tsx +10 -0
- package/registry/examples/search-field/global.d.ts +4 -0
- package/registry/examples/search-field/global.js +19 -0
- package/registry/examples/search-field/global.tsx +15 -0
- package/registry/examples/search-field/native/default.d.ts +4 -0
- package/registry/examples/search-field/native/default.dark.png +0 -0
- package/registry/examples/search-field/native/default.js +13 -0
- package/registry/examples/search-field/native/default.light.png +0 -0
- package/registry/examples/search-field/native/default.tsx +7 -0
- package/registry/examples/search-field/suggestions.d.ts +4 -0
- package/registry/examples/search-field/suggestions.js +30 -0
- package/registry/examples/search-field/suggestions.tsx +27 -0
- package/registry/examples/search-field/toolbar.d.ts +4 -0
- package/registry/examples/search-field/toolbar.js +17 -0
- package/registry/examples/search-field/toolbar.tsx +21 -0
- package/registry/examples/skeleton/paragraph.d.ts +4 -0
- package/registry/examples/skeleton/paragraph.js +14 -0
- package/registry/examples/skeleton/paragraph.tsx +12 -0
- package/registry/examples/skeleton/shape-of-content.d.ts +4 -0
- package/registry/examples/skeleton/shape-of-content.js +23 -0
- package/registry/examples/skeleton/shape-of-content.tsx +26 -0
- package/registry/examples/spinner/default.js +5 -2
- package/registry/examples/spinner/default.tsx +7 -1
- package/registry/examples/spinner/sizes.js +2 -1
- package/registry/examples/spinner/sizes.tsx +2 -0
- package/registry/examples/spinner/value.d.ts +4 -0
- package/registry/examples/spinner/value.js +11 -0
- package/registry/examples/spinner/value.tsx +12 -0
- package/registry/examples/stepper/checkout.d.ts +4 -0
- package/registry/examples/stepper/checkout.js +22 -0
- package/registry/examples/stepper/checkout.tsx +17 -0
- package/registry/examples/stepper/failed.d.ts +4 -0
- package/registry/examples/stepper/failed.js +26 -0
- package/registry/examples/stepper/failed.tsx +21 -0
- package/registry/examples/stepper/job.d.ts +4 -0
- package/registry/examples/stepper/job.js +32 -0
- package/registry/examples/stepper/job.tsx +28 -0
- package/registry/examples/tag-input/recipients.d.ts +4 -0
- package/registry/examples/tag-input/recipients.js +23 -0
- package/registry/examples/tag-input/recipients.tsx +20 -0
- package/registry/examples/tag-input/video-tags.d.ts +4 -0
- package/registry/examples/tag-input/video-tags.js +26 -0
- package/registry/examples/tag-input/video-tags.tsx +22 -0
- package/registry/examples/toast/grouped.d.ts +4 -0
- package/registry/examples/toast/grouped.js +21 -0
- package/registry/examples/toast/grouped.tsx +23 -0
- package/registry/examples/toast/undo.d.ts +4 -0
- package/registry/examples/toast/undo.js +29 -0
- package/registry/examples/toast/undo.tsx +30 -0
- package/registry/examples/toast/upload-progress.d.ts +4 -0
- package/registry/examples/toast/upload-progress.js +29 -0
- package/registry/examples/toast/upload-progress.tsx +31 -0
- package/registry/examples/video-player/default.d.ts +4 -0
- package/registry/examples/video-player/default.js +12 -0
- package/registry/examples/video-player/default.tsx +8 -0
- package/registry/examples/video-player/gated.d.ts +4 -0
- package/registry/examples/video-player/gated.js +26 -0
- package/registry/examples/video-player/gated.tsx +23 -0
- package/registry/examples/video-player/native/default.d.ts +4 -0
- package/registry/examples/video-player/native/default.dark.png +0 -0
- package/registry/examples/video-player/native/default.js +18 -0
- package/registry/examples/video-player/native/default.light.png +0 -0
- package/registry/examples/video-player/native/default.tsx +12 -0
- package/registry/examples/video-player/signed-source.d.ts +4 -0
- package/registry/examples/video-player/signed-source.js +16 -0
- package/registry/examples/video-player/signed-source.tsx +15 -0
- package/registry/examples/video-player/vertical.d.ts +4 -0
- package/registry/examples/video-player/vertical.js +12 -0
- package/registry/examples/video-player/vertical.tsx +12 -0
- package/registry/examples/video-trimmer/custom.d.ts +4 -0
- package/registry/examples/video-trimmer/custom.js +24 -0
- package/registry/examples/video-trimmer/custom.tsx +26 -0
- package/registry/examples/video-trimmer/filmstrip.d.ts +4 -0
- package/registry/examples/video-trimmer/filmstrip.js +15 -0
- package/registry/examples/video-trimmer/filmstrip.tsx +13 -0
- package/registry/examples/video-trimmer/playhead.d.ts +4 -0
- package/registry/examples/video-trimmer/playhead.js +15 -0
- package/registry/examples/video-trimmer/playhead.tsx +13 -0
- package/registry/field.json +1 -1
- package/registry/file-upload.json +471 -0
- package/registry/filter-bar.json +347 -0
- package/registry/glow-card.json +162 -0
- package/registry/image-cropper.json +313 -0
- package/registry/index.json +445 -20
- package/registry/iso.json +1355 -0
- package/registry/kbd.json +1 -1
- package/registry/loader.json +399 -0
- package/registry/marquee.json +225 -0
- package/registry/mascots.json +3 -3
- package/registry/media-capture.json +347 -0
- package/registry/meter.json +324 -0
- package/registry/nav-bar.json +480 -0
- package/registry/number-ticker.json +219 -0
- package/registry/page-header.json +1 -1
- package/registry/pagination.json +475 -0
- package/registry/popover.json +1 -1
- package/registry/progress.json +114 -9
- package/registry/radio-group.json +1 -1
- package/registry/search-field.json +436 -0
- package/registry/section-backdrop.json +1 -1
- package/registry/separator.json +1 -1
- package/registry/skeleton.json +69 -13
- package/registry/slider.json +1 -1
- package/registry/slot.json +1 -1
- package/registry/spinner.json +91 -27
- package/registry/stat.json +1 -1
- package/registry/stepper.json +174 -0
- package/registry/switch.json +1 -1
- package/registry/tabs.json +11 -7
- package/registry/tag-input.json +363 -0
- package/registry/theme.json +3 -3
- package/registry/toast.json +41 -13
- package/registry/tooltip.json +1 -1
- package/registry/video-player.json +598 -0
- package/registry/video-trimmer.json +385 -0
- package/dist/chunk-FHYZSO2S.js.map +0 -1
- package/dist/chunk-PESA2R4U.js +0 -51
- package/dist/chunk-PESA2R4U.js.map +0 -1
- package/registry/examples/spinner/muted.js +0 -11
- package/registry/examples/spinner/muted.tsx +0 -6
- /package/registry/examples/{spinner/muted.d.ts → audio-player/podcast.d.ts} +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn,
|
|
4
|
+
floating
|
|
5
|
+
} from "./chunk-2USC2YT6.js";
|
|
6
|
+
import {
|
|
7
|
+
useControllable
|
|
8
|
+
} from "./chunk-EUPTXKH7.js";
|
|
9
|
+
import {
|
|
10
|
+
CalendarGlyph,
|
|
11
|
+
ChevronGlyph,
|
|
12
|
+
CloseGlyph
|
|
13
|
+
} from "./chunk-YX6CNVJA.js";
|
|
14
|
+
|
|
15
|
+
// src/date-picker/calendar.tsx
|
|
16
|
+
import { formatDate, getDateTimeFormat } from "@krizaka/intl";
|
|
17
|
+
import * as React from "react";
|
|
18
|
+
import { tv } from "tailwind-variants";
|
|
19
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
+
var calendar = tv({
|
|
21
|
+
slots: {
|
|
22
|
+
root: "w-[17.5rem] select-none text-sm text-fg",
|
|
23
|
+
header: "mb-2 flex items-center justify-between gap-2",
|
|
24
|
+
title: "text-sm font-semibold capitalize",
|
|
25
|
+
nav: "inline-flex h-8 w-8 items-center justify-center rounded-md text-fg-secondary hover:bg-surface-3 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40",
|
|
26
|
+
grid: "w-full border-collapse",
|
|
27
|
+
weekday: "h-8 w-10 text-center text-[11px] font-semibold uppercase text-fg-secondary",
|
|
28
|
+
cell: "p-0 text-center",
|
|
29
|
+
day: "relative h-10 w-10 rounded-lg text-sm tabular-nums text-fg transition-colors hover:bg-surface-3 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring data-[outside]:text-fg-secondary data-[today]:font-bold data-[today]:not-data-[selected]:text-fg-accent data-[in-range]:rounded-none data-[in-range]:bg-accent-soft data-[selected]:bg-accent data-[selected]:text-on-accent data-[selected]:hover:bg-accent disabled:cursor-not-allowed disabled:text-fg-muted disabled:line-through disabled:opacity-50 disabled:hover:bg-transparent"
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
var pad = (n) => String(n).padStart(2, "0");
|
|
33
|
+
var parts = (iso) => iso.split("-").map(Number);
|
|
34
|
+
var toLocalDate = (iso) => {
|
|
35
|
+
const [y, m, d] = parts(iso);
|
|
36
|
+
return new Date(y, m - 1, d);
|
|
37
|
+
};
|
|
38
|
+
var toIsoDate = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
39
|
+
var addDays = (iso, days) => {
|
|
40
|
+
const date = toLocalDate(iso);
|
|
41
|
+
date.setDate(date.getDate() + days);
|
|
42
|
+
return toIsoDate(date);
|
|
43
|
+
};
|
|
44
|
+
var addMonths = (iso, months) => {
|
|
45
|
+
const [y, m, d] = parts(iso);
|
|
46
|
+
const first = new Date(y, m - 1 + months, 1);
|
|
47
|
+
const last = new Date(first.getFullYear(), first.getMonth() + 1, 0).getDate();
|
|
48
|
+
return toIsoDate(new Date(first.getFullYear(), first.getMonth(), Math.min(d, last)));
|
|
49
|
+
};
|
|
50
|
+
var monthOf = (iso) => `${iso.slice(0, 7)}-01`;
|
|
51
|
+
var clampIso = (iso, min, max) => min && iso < min ? min : max && iso > max ? max : iso;
|
|
52
|
+
function weekStartOf(locale) {
|
|
53
|
+
try {
|
|
54
|
+
const info = new Intl.Locale(locale);
|
|
55
|
+
const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;
|
|
56
|
+
return firstDay ? firstDay % 7 : 1;
|
|
57
|
+
} catch {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
var calendarLabels = { previousMonth: "Previous month", nextMonth: "Next month" };
|
|
62
|
+
function Calendar({
|
|
63
|
+
locale,
|
|
64
|
+
value,
|
|
65
|
+
range,
|
|
66
|
+
onSelect,
|
|
67
|
+
month: monthProp,
|
|
68
|
+
defaultMonth,
|
|
69
|
+
onMonthChange,
|
|
70
|
+
min,
|
|
71
|
+
max,
|
|
72
|
+
isDateDisabled,
|
|
73
|
+
weekStartsOn,
|
|
74
|
+
today: todayProp,
|
|
75
|
+
autoFocus,
|
|
76
|
+
labels: given,
|
|
77
|
+
className
|
|
78
|
+
}) {
|
|
79
|
+
const labels = { ...calendarLabels, ...given };
|
|
80
|
+
const s = calendar();
|
|
81
|
+
const today = todayProp ?? toIsoDate(/* @__PURE__ */ new Date());
|
|
82
|
+
const anchor = value ?? range?.start ?? clampIso(today, min, max);
|
|
83
|
+
const [innerMonth, setInnerMonth] = React.useState(monthOf(defaultMonth ?? anchor));
|
|
84
|
+
const month = monthProp ? monthOf(monthProp) : innerMonth;
|
|
85
|
+
const [focused, setFocused] = React.useState(anchor.slice(0, 7) === month.slice(0, 7) ? anchor : month);
|
|
86
|
+
const [hover, setHover] = React.useState(null);
|
|
87
|
+
const grid = React.useRef(null);
|
|
88
|
+
const moved = React.useRef(Boolean(autoFocus));
|
|
89
|
+
const titleId = React.useId();
|
|
90
|
+
const setMonth = (next) => {
|
|
91
|
+
const m = monthOf(next);
|
|
92
|
+
if (!monthProp) setInnerMonth(m);
|
|
93
|
+
onMonthChange?.(m);
|
|
94
|
+
};
|
|
95
|
+
const active = focused.slice(0, 7) === month.slice(0, 7) ? focused : month;
|
|
96
|
+
React.useEffect(() => {
|
|
97
|
+
if (!moved.current) return;
|
|
98
|
+
moved.current = false;
|
|
99
|
+
grid.current?.querySelector(`[data-date="${active}"]`)?.focus();
|
|
100
|
+
}, [active]);
|
|
101
|
+
const disabled = (iso) => Boolean(min && iso < min || max && iso > max || isDateDisabled?.(iso));
|
|
102
|
+
const start = weekStartsOn ?? weekStartOf(locale);
|
|
103
|
+
const first = toLocalDate(month);
|
|
104
|
+
const lead = (first.getDay() - start + 7) % 7;
|
|
105
|
+
const gridStart = addDays(month, -lead);
|
|
106
|
+
const days = Array.from({ length: 42 }, (_, i) => addDays(gridStart, i));
|
|
107
|
+
const weeks = Array.from({ length: 6 }, (_, w) => days.slice(w * 7, w * 7 + 7)).filter((week, w) => w < 5 || week[0].slice(0, 7) === month.slice(0, 7));
|
|
108
|
+
const weekdayShort = getDateTimeFormat(locale, { weekday: "short" });
|
|
109
|
+
const weekdayLong = getDateTimeFormat(locale, { weekday: "long" });
|
|
110
|
+
const title = getDateTimeFormat(locale, { month: "long", year: "numeric" }).format(first);
|
|
111
|
+
const rangeEnd = range ? range.end ?? hover : null;
|
|
112
|
+
const [lo, hi] = range && rangeEnd ? range.start <= rangeEnd ? [range.start, rangeEnd] : [rangeEnd, range.start] : [null, null];
|
|
113
|
+
const focusDay = (iso) => {
|
|
114
|
+
moved.current = true;
|
|
115
|
+
setFocused(iso);
|
|
116
|
+
if (iso.slice(0, 7) !== month.slice(0, 7)) setMonth(iso);
|
|
117
|
+
};
|
|
118
|
+
const onKeyDown = (event) => {
|
|
119
|
+
const weekday = (toLocalDate(active).getDay() - start + 7) % 7;
|
|
120
|
+
const moves = {
|
|
121
|
+
ArrowLeft: () => addDays(active, -1),
|
|
122
|
+
ArrowRight: () => addDays(active, 1),
|
|
123
|
+
ArrowUp: () => addDays(active, -7),
|
|
124
|
+
ArrowDown: () => addDays(active, 7),
|
|
125
|
+
Home: () => addDays(active, -weekday),
|
|
126
|
+
End: () => addDays(active, 6 - weekday),
|
|
127
|
+
PageUp: () => addMonths(active, event.shiftKey ? -12 : -1),
|
|
128
|
+
PageDown: () => addMonths(active, event.shiftKey ? 12 : 1)
|
|
129
|
+
};
|
|
130
|
+
const move = moves[event.key];
|
|
131
|
+
if (!move) return;
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
focusDay(move());
|
|
134
|
+
};
|
|
135
|
+
const prevDisabled = Boolean(min && addDays(month, -1) < min);
|
|
136
|
+
const nextDisabled = Boolean(max && addMonths(month, 1) > max);
|
|
137
|
+
return /* @__PURE__ */ jsxs("div", { className: s.root({ className }), children: [
|
|
138
|
+
/* @__PURE__ */ jsxs("div", { className: s.header(), children: [
|
|
139
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: s.nav(), "aria-label": labels.previousMonth, disabled: prevDisabled, onClick: () => setMonth(addMonths(month, -1)), children: /* @__PURE__ */ jsx(ChevronGlyph, { direction: "left" }) }),
|
|
140
|
+
/* @__PURE__ */ jsx("h2", { id: titleId, className: s.title(), "aria-live": "polite", children: title }),
|
|
141
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: s.nav(), "aria-label": labels.nextMonth, disabled: nextDisabled, onClick: () => setMonth(addMonths(month, 1)), children: /* @__PURE__ */ jsx(ChevronGlyph, { direction: "right" }) })
|
|
142
|
+
] }),
|
|
143
|
+
/* @__PURE__ */ jsxs("table", { ref: grid, role: "grid", "aria-labelledby": titleId, className: s.grid(), onKeyDown, children: [
|
|
144
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: days.slice(0, 7).map((iso) => /* @__PURE__ */ jsx("th", { scope: "col", abbr: weekdayLong.format(toLocalDate(iso)), className: s.weekday(), children: weekdayShort.format(toLocalDate(iso)).replace(/\.$/, "") }, iso)) }) }),
|
|
145
|
+
/* @__PURE__ */ jsx("tbody", { children: weeks.map((week) => /* @__PURE__ */ jsx("tr", { children: week.map((iso) => {
|
|
146
|
+
const selected = iso === value || range && (iso === range.start || iso === range.end);
|
|
147
|
+
const inRange = Boolean(lo && hi && iso > lo && iso < hi);
|
|
148
|
+
return /* @__PURE__ */ jsx("td", { role: "gridcell", "aria-selected": selected || inRange || void 0, className: s.cell(), children: /* @__PURE__ */ jsx(
|
|
149
|
+
"button",
|
|
150
|
+
{
|
|
151
|
+
type: "button",
|
|
152
|
+
"data-date": iso,
|
|
153
|
+
tabIndex: iso === active ? 0 : -1,
|
|
154
|
+
"aria-label": formatDate(toLocalDate(iso), { locale, style: "long" }),
|
|
155
|
+
"aria-current": iso === today ? "date" : void 0,
|
|
156
|
+
"data-today": iso === today ? "" : void 0,
|
|
157
|
+
"data-outside": iso.slice(0, 7) !== month.slice(0, 7) ? "" : void 0,
|
|
158
|
+
"data-selected": selected ? "" : void 0,
|
|
159
|
+
"data-in-range": inRange ? "" : void 0,
|
|
160
|
+
disabled: disabled(iso),
|
|
161
|
+
className: s.day(),
|
|
162
|
+
onClick: () => {
|
|
163
|
+
setFocused(iso);
|
|
164
|
+
onSelect?.(iso);
|
|
165
|
+
},
|
|
166
|
+
onMouseEnter: range && !range.end ? () => setHover(iso) : void 0,
|
|
167
|
+
onFocus: range && !range.end ? () => setHover(iso) : void 0,
|
|
168
|
+
children: Number(iso.slice(8))
|
|
169
|
+
}
|
|
170
|
+
) }, iso);
|
|
171
|
+
}) }, week[0])) })
|
|
172
|
+
] })
|
|
173
|
+
] });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/date-picker/date-picker.tsx
|
|
177
|
+
import { formatDate as formatDate2, getDateTimeFormat as getDateTimeFormat2 } from "@krizaka/intl";
|
|
178
|
+
import * as React2 from "react";
|
|
179
|
+
import { tv as tv2 } from "tailwind-variants";
|
|
180
|
+
|
|
181
|
+
// src/popover/popover.tsx
|
|
182
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
183
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
184
|
+
function PopoverContent({ sideOffset = 8, collisionPadding = 8, container, className, ...props }) {
|
|
185
|
+
return /* @__PURE__ */ jsx2(PopoverPrimitive.Portal, { container, children: /* @__PURE__ */ jsx2(
|
|
186
|
+
PopoverPrimitive.Content,
|
|
187
|
+
{
|
|
188
|
+
sideOffset,
|
|
189
|
+
collisionPadding,
|
|
190
|
+
className: cn(floating, "w-72 max-w-(--radix-popover-content-available-width) p-4 origin-(--radix-popover-content-transform-origin)", className),
|
|
191
|
+
...props
|
|
192
|
+
}
|
|
193
|
+
) });
|
|
194
|
+
}
|
|
195
|
+
var Popover = {
|
|
196
|
+
Root: PopoverPrimitive.Root,
|
|
197
|
+
Trigger: PopoverPrimitive.Trigger,
|
|
198
|
+
Anchor: PopoverPrimitive.Anchor,
|
|
199
|
+
Close: PopoverPrimitive.Close,
|
|
200
|
+
Content: PopoverContent
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// src/date-picker/date-picker.tsx
|
|
204
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
205
|
+
var datePicker = tv2({
|
|
206
|
+
slots: {
|
|
207
|
+
root: "flex w-full flex-col gap-1.5",
|
|
208
|
+
label: "text-xs font-semibold text-fg-secondary",
|
|
209
|
+
row: "relative flex w-full",
|
|
210
|
+
trigger: "flex h-11 w-full items-center gap-2.5 rounded-lg border border-border-default bg-surface-2 px-3 text-left text-sm text-fg transition-[border-color,box-shadow] focus-visible:border-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring data-[placeholder]:text-fg-muted aria-invalid:border-danger disabled:cursor-not-allowed disabled:opacity-50 data-[clearable]:pr-10",
|
|
211
|
+
icon: "h-4 w-4 shrink-0 text-fg-secondary",
|
|
212
|
+
clear: "absolute right-1.5 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-md text-fg-secondary hover:bg-surface-3 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
|
|
213
|
+
content: "w-auto p-3",
|
|
214
|
+
layout: "flex flex-col gap-3 sm:flex-row",
|
|
215
|
+
presets: "flex flex-wrap gap-1.5 sm:w-36 sm:flex-col sm:flex-nowrap sm:border-r sm:border-border-default sm:pr-3",
|
|
216
|
+
preset: "rounded-md px-2.5 py-1.5 text-left text-xs font-semibold text-fg-secondary hover:bg-surface-3 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-pressed:bg-accent-soft aria-pressed:text-fg",
|
|
217
|
+
hint: "text-xs text-fg-secondary",
|
|
218
|
+
error: "flex items-center gap-1.5 text-xs font-medium text-fg-danger before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-danger"
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
var datePickerLabels = { previousMonth: "Previous month", nextMonth: "Next month", clear: "Clear date" };
|
|
222
|
+
function Field({
|
|
223
|
+
shared,
|
|
224
|
+
text,
|
|
225
|
+
hasValue,
|
|
226
|
+
onClear,
|
|
227
|
+
hidden,
|
|
228
|
+
open,
|
|
229
|
+
setOpen,
|
|
230
|
+
children
|
|
231
|
+
}) {
|
|
232
|
+
const { label, placeholder, clearable, hint, error, disabled, name, className } = shared;
|
|
233
|
+
const labels = { ...datePickerLabels, ...shared.labels };
|
|
234
|
+
const s = datePicker();
|
|
235
|
+
const id = React2.useId();
|
|
236
|
+
const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(" ") || void 0;
|
|
237
|
+
return /* @__PURE__ */ jsxs2("div", { className: s.root({ className }), children: [
|
|
238
|
+
/* @__PURE__ */ jsx3("label", { htmlFor: `${id}-trigger`, className: s.label(), children: label }),
|
|
239
|
+
/* @__PURE__ */ jsxs2(Popover.Root, { open, onOpenChange: setOpen, children: [
|
|
240
|
+
/* @__PURE__ */ jsxs2("div", { className: s.row(), children: [
|
|
241
|
+
/* @__PURE__ */ jsx3(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs2(
|
|
242
|
+
"button",
|
|
243
|
+
{
|
|
244
|
+
id: `${id}-trigger`,
|
|
245
|
+
type: "button",
|
|
246
|
+
"aria-haspopup": "dialog",
|
|
247
|
+
"aria-describedby": describedBy,
|
|
248
|
+
"aria-invalid": error ? true : void 0,
|
|
249
|
+
disabled,
|
|
250
|
+
"data-placeholder": hasValue ? void 0 : "",
|
|
251
|
+
"data-clearable": clearable && hasValue ? "" : void 0,
|
|
252
|
+
className: s.trigger(),
|
|
253
|
+
children: [
|
|
254
|
+
/* @__PURE__ */ jsx3(CalendarGlyph, { className: s.icon() }),
|
|
255
|
+
/* @__PURE__ */ jsx3("span", { className: "truncate", children: text ?? placeholder ?? "" })
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
) }),
|
|
259
|
+
clearable && hasValue && !disabled ? /* @__PURE__ */ jsx3("button", { type: "button", "aria-label": labels.clear, className: s.clear(), onClick: onClear, children: /* @__PURE__ */ jsx3(CloseGlyph, { className: "h-4 w-4" }) }) : null
|
|
260
|
+
] }),
|
|
261
|
+
/* @__PURE__ */ jsx3(Popover.Content, { align: "start", "aria-label": label, className: s.content(), children })
|
|
262
|
+
] }),
|
|
263
|
+
name ? /* @__PURE__ */ jsx3("input", { type: "hidden", name, value: hidden }) : null,
|
|
264
|
+
hint ? /* @__PURE__ */ jsx3("p", { id: `${id}-hint`, className: s.hint(), children: hint }) : null,
|
|
265
|
+
error ? /* @__PURE__ */ jsx3("p", { id: `${id}-error`, className: s.error(), children: error }) : null
|
|
266
|
+
] });
|
|
267
|
+
}
|
|
268
|
+
function DatePicker({ value: valueProp, defaultValue = null, onValueChange, defaultOpen = false, ...shared }) {
|
|
269
|
+
const [value, setValue] = useControllable(valueProp, defaultValue, onValueChange);
|
|
270
|
+
const [open, setOpen] = React2.useState(defaultOpen);
|
|
271
|
+
const { locale, format = "medium" } = shared;
|
|
272
|
+
return /* @__PURE__ */ jsx3(
|
|
273
|
+
Field,
|
|
274
|
+
{
|
|
275
|
+
shared,
|
|
276
|
+
text: value ? formatDate2(toLocalDate(value), { locale, style: format }) : null,
|
|
277
|
+
hasValue: Boolean(value),
|
|
278
|
+
onClear: () => setValue(null),
|
|
279
|
+
hidden: value ?? "",
|
|
280
|
+
open,
|
|
281
|
+
setOpen,
|
|
282
|
+
children: /* @__PURE__ */ jsx3(
|
|
283
|
+
Calendar,
|
|
284
|
+
{
|
|
285
|
+
...shared,
|
|
286
|
+
autoFocus: true,
|
|
287
|
+
value,
|
|
288
|
+
onSelect: (date) => {
|
|
289
|
+
setValue(date);
|
|
290
|
+
setOpen(false);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
}
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
function formatRange(locale, start, end, style) {
|
|
298
|
+
const formatter = getDateTimeFormat2(locale, { dateStyle: style });
|
|
299
|
+
return formatter.formatRange ? formatter.formatRange(toLocalDate(start), toLocalDate(end)) : `${formatter.format(toLocalDate(start))} \u2013 ${formatter.format(toLocalDate(end))}`;
|
|
300
|
+
}
|
|
301
|
+
function DateRangePicker({ value: valueProp, defaultValue = null, onValueChange, presets, defaultOpen = false, ...shared }) {
|
|
302
|
+
const [value, setValue] = useControllable(valueProp, defaultValue, onValueChange);
|
|
303
|
+
const [draft, setDraft] = React2.useState(null);
|
|
304
|
+
const [open, setOpenState] = React2.useState(defaultOpen);
|
|
305
|
+
const { locale, format = "medium" } = shared;
|
|
306
|
+
const s = datePicker();
|
|
307
|
+
const setOpen = (next) => {
|
|
308
|
+
setOpenState(next);
|
|
309
|
+
setDraft(null);
|
|
310
|
+
};
|
|
311
|
+
const shown = draft ?? value;
|
|
312
|
+
const pick = (date) => {
|
|
313
|
+
if (!draft) setDraft({ start: date, end: null });
|
|
314
|
+
else {
|
|
315
|
+
const [start, end] = date < draft.start ? [date, draft.start] : [draft.start, date];
|
|
316
|
+
setValue({ start, end });
|
|
317
|
+
setOpen(false);
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
return /* @__PURE__ */ jsx3(
|
|
321
|
+
Field,
|
|
322
|
+
{
|
|
323
|
+
shared,
|
|
324
|
+
text: value ? formatRange(locale, value.start, value.end, format) : null,
|
|
325
|
+
hasValue: Boolean(value),
|
|
326
|
+
onClear: () => setValue(null),
|
|
327
|
+
hidden: value ? `${value.start}/${value.end}` : "",
|
|
328
|
+
open,
|
|
329
|
+
setOpen,
|
|
330
|
+
children: /* @__PURE__ */ jsxs2("div", { className: s.layout(), children: [
|
|
331
|
+
presets?.length ? /* @__PURE__ */ jsx3("div", { className: s.presets(), children: presets.map((preset) => /* @__PURE__ */ jsx3(
|
|
332
|
+
"button",
|
|
333
|
+
{
|
|
334
|
+
type: "button",
|
|
335
|
+
"aria-pressed": value?.start === preset.start && value?.end === preset.end,
|
|
336
|
+
className: s.preset(),
|
|
337
|
+
onClick: () => {
|
|
338
|
+
setValue({ start: preset.start, end: preset.end });
|
|
339
|
+
setOpen(false);
|
|
340
|
+
},
|
|
341
|
+
children: preset.label
|
|
342
|
+
},
|
|
343
|
+
preset.label
|
|
344
|
+
)) }) : null,
|
|
345
|
+
/* @__PURE__ */ jsx3(Calendar, { ...shared, autoFocus: true, range: shown, onSelect: pick })
|
|
346
|
+
] })
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
export {
|
|
351
|
+
Calendar,
|
|
352
|
+
DatePicker,
|
|
353
|
+
DateRangePicker,
|
|
354
|
+
addDays,
|
|
355
|
+
addMonths,
|
|
356
|
+
calendar,
|
|
357
|
+
calendarLabels,
|
|
358
|
+
datePicker,
|
|
359
|
+
datePickerLabels,
|
|
360
|
+
toIsoDate,
|
|
361
|
+
toLocalDate,
|
|
362
|
+
weekStartOf
|
|
363
|
+
};
|
|
364
|
+
//# sourceMappingURL=date-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/date-picker/calendar.tsx","../src/date-picker/date-picker.tsx","../src/popover/popover.tsx"],"sourcesContent":["// Client. A month as an ARIA grid (the APG date picker): one day in the tab order, the arrows walk the days, Home /\n// End the week, Page Up / Page Down the months (Shift: the years), Enter or Space picks. Dates are ISO calendar dates\n// (`\"2026-10-11\"`): no time zone, nothing to convert, safe in an address. Month and day names come from\n// `@krizaka/intl` for the `locale` given — never the runtime's default.\nimport { formatDate, getDateTimeFormat } from \"@krizaka/intl\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronGlyph } from \"../glyphs\";\n\n/** A calendar date, `YYYY-MM-DD`. */\nexport type IsoDate = string;\n/** A range of calendar dates; `end` is `null` while the second date is not chosen. */\nexport type DateRange = { start: IsoDate; end: IsoDate | null };\n\nexport const calendar = tv({\n slots: {\n root: \"w-[17.5rem] select-none text-sm text-fg\",\n header: \"mb-2 flex items-center justify-between gap-2\",\n title: \"text-sm font-semibold capitalize\",\n nav:\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-fg-secondary hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40\",\n grid: \"w-full border-collapse\",\n weekday: \"h-8 w-10 text-center text-[11px] font-semibold uppercase text-fg-secondary\",\n cell: \"p-0 text-center\",\n day:\n \"relative h-10 w-10 rounded-lg text-sm tabular-nums text-fg transition-colors hover:bg-surface-3 \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"data-[outside]:text-fg-secondary data-[today]:font-bold data-[today]:not-data-[selected]:text-fg-accent \" +\n \"data-[in-range]:rounded-none data-[in-range]:bg-accent-soft \" +\n \"data-[selected]:bg-accent data-[selected]:text-on-accent data-[selected]:hover:bg-accent \" +\n \"disabled:cursor-not-allowed disabled:text-fg-muted disabled:line-through disabled:opacity-50 disabled:hover:bg-transparent\",\n },\n});\n\nexport const pad = (n: number) => String(n).padStart(2, \"0\");\nconst parts = (iso: IsoDate) => iso.split(\"-\").map(Number) as [number, number, number];\n/** A local `Date` at midnight for an ISO date (for formatting). */\nexport const toLocalDate = (iso: IsoDate) => {\n const [y, m, d] = parts(iso);\n return new Date(y, m - 1, d);\n};\n/** The ISO date of a local `Date`. */\nexport const toIsoDate = (date: Date): IsoDate => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\nexport const addDays = (iso: IsoDate, days: number) => {\n const date = toLocalDate(iso);\n date.setDate(date.getDate() + days);\n return toIsoDate(date);\n};\nexport const addMonths = (iso: IsoDate, months: number) => {\n const [y, m, d] = parts(iso);\n const first = new Date(y, m - 1 + months, 1);\n const last = new Date(first.getFullYear(), first.getMonth() + 1, 0).getDate();\n return toIsoDate(new Date(first.getFullYear(), first.getMonth(), Math.min(d, last)));\n};\nconst monthOf = (iso: IsoDate) => `${iso.slice(0, 7)}-01`;\nconst clampIso = (iso: IsoDate, min?: IsoDate, max?: IsoDate) => (min && iso < min ? min : max && iso > max ? max : iso);\n\n/** The first day of the week for a locale (0 = Sunday … 6 = Saturday), from `Intl.Locale` week info; Monday otherwise. */\nexport function weekStartOf(locale: string): number {\n try {\n const info = new Intl.Locale(locale) as Intl.Locale & { getWeekInfo?: () => { firstDay: number }; weekInfo?: { firstDay: number } };\n const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;\n return firstDay ? firstDay % 7 : 1;\n } catch {\n return 1;\n }\n}\n\nexport type CalendarLabels = {\n /** The previous-month button (\"Previous month\"). */\n previousMonth: string;\n /** The next-month button (\"Next month\"). */\n nextMonth: string;\n};\n\nexport const calendarLabels: CalendarLabels = { previousMonth: \"Previous month\", nextMonth: \"Next month\" };\n\nexport type CalendarProps = {\n /** The BCP 47 locale of the month and day names (`\"en-US\"`, `\"fr-CA\"`): always explicit. */\n locale: string;\n /** The chosen date (one-date mode). */\n value?: IsoDate | null;\n /** The chosen range (range mode): its ends are marked, the days between tinted. */\n range?: DateRange | null;\n /** Called with the day picked. */\n onSelect?: (date: IsoDate) => void;\n /** The month shown, any day of it (controlled). */\n month?: IsoDate;\n /** The month shown at first. Default: the value's, or today's. */\n defaultMonth?: IsoDate;\n /** Called when the month shown changes. */\n onMonthChange?: (month: IsoDate) => void;\n /** The earliest date that can be picked. */\n min?: IsoDate;\n /** The latest date that can be picked. */\n max?: IsoDate;\n /** Refuses some dates (`(d) => isWeekend(d)`). */\n isDateDisabled?: (date: IsoDate) => boolean;\n /** The first day of the week, 0 = Sunday. Default: the locale's. */\n weekStartsOn?: number;\n /** Today (marked): inject it for a stable server render or a test. Default: the device's date. */\n today?: IsoDate;\n /** Moves the focus to the active day when it mounts (inside a popover). */\n autoFocus?: boolean;\n /** The words, passed translated; English by default. */\n labels?: Partial<CalendarLabels>;\n /** Classes merged on the root. */\n className?: string;\n};\n\n/** A month grid to pick a date or the ends of a range, with the full keyboard of the APG date picker. */\nexport function Calendar({\n locale,\n value,\n range,\n onSelect,\n month: monthProp,\n defaultMonth,\n onMonthChange,\n min,\n max,\n isDateDisabled,\n weekStartsOn,\n today: todayProp,\n autoFocus,\n labels: given,\n className,\n}: CalendarProps) {\n const labels = { ...calendarLabels, ...given };\n const s = calendar();\n const today = todayProp ?? toIsoDate(new Date());\n const anchor = value ?? range?.start ?? clampIso(today, min, max);\n const [innerMonth, setInnerMonth] = React.useState(monthOf(defaultMonth ?? anchor));\n const month = monthProp ? monthOf(monthProp) : innerMonth;\n const [focused, setFocused] = React.useState<IsoDate>(anchor.slice(0, 7) === month.slice(0, 7) ? anchor : month);\n const [hover, setHover] = React.useState<IsoDate | null>(null);\n const grid = React.useRef<HTMLTableElement>(null);\n const moved = React.useRef(Boolean(autoFocus));\n const titleId = React.useId();\n\n const setMonth = (next: IsoDate) => {\n const m = monthOf(next);\n if (!monthProp) setInnerMonth(m);\n onMonthChange?.(m);\n };\n // The focused day follows the month shown when it is changed from outside (the buttons, a controlled `month`).\n const active = focused.slice(0, 7) === month.slice(0, 7) ? focused : month;\n\n React.useEffect(() => {\n if (!moved.current) return;\n moved.current = false;\n grid.current?.querySelector<HTMLButtonElement>(`[data-date=\"${active}\"]`)?.focus();\n }, [active]);\n\n const disabled = (iso: IsoDate) => Boolean((min && iso < min) || (max && iso > max) || isDateDisabled?.(iso));\n const start = weekStartsOn ?? weekStartOf(locale);\n const first = toLocalDate(month);\n const lead = (first.getDay() - start + 7) % 7;\n const gridStart = addDays(month, -lead);\n const days = Array.from({ length: 42 }, (_, i) => addDays(gridStart, i));\n const weeks = Array.from({ length: 6 }, (_, w) => days.slice(w * 7, w * 7 + 7)).filter((week, w) => w < 5 || week[0]!.slice(0, 7) === month.slice(0, 7));\n const weekdayShort = getDateTimeFormat(locale, { weekday: \"short\" });\n const weekdayLong = getDateTimeFormat(locale, { weekday: \"long\" });\n const title = getDateTimeFormat(locale, { month: \"long\", year: \"numeric\" }).format(first);\n\n const rangeEnd = range ? (range.end ?? hover) : null;\n const [lo, hi] = range && rangeEnd ? (range.start <= rangeEnd ? [range.start, rangeEnd] : [rangeEnd, range.start]) : [null, null];\n\n const focusDay = (iso: IsoDate) => {\n moved.current = true;\n setFocused(iso);\n if (iso.slice(0, 7) !== month.slice(0, 7)) setMonth(iso);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const weekday = (toLocalDate(active).getDay() - start + 7) % 7;\n const moves: Record<string, () => IsoDate> = {\n ArrowLeft: () => addDays(active, -1),\n ArrowRight: () => addDays(active, 1),\n ArrowUp: () => addDays(active, -7),\n ArrowDown: () => addDays(active, 7),\n Home: () => addDays(active, -weekday),\n End: () => addDays(active, 6 - weekday),\n PageUp: () => addMonths(active, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(active, event.shiftKey ? 12 : 1),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n focusDay(move());\n };\n\n const prevDisabled = Boolean(min && addDays(month, -1) < min);\n const nextDisabled = Boolean(max && addMonths(month, 1) > max);\n\n return (\n <div className={s.root({ className })}>\n <div className={s.header()}>\n <button type=\"button\" className={s.nav()} aria-label={labels.previousMonth} disabled={prevDisabled} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronGlyph direction=\"left\" />\n </button>\n <h2 id={titleId} className={s.title()} aria-live=\"polite\">\n {title}\n </h2>\n <button type=\"button\" className={s.nav()} aria-label={labels.nextMonth} disabled={nextDisabled} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronGlyph direction=\"right\" />\n </button>\n </div>\n <table ref={grid} role=\"grid\" aria-labelledby={titleId} className={s.grid()} onKeyDown={onKeyDown}>\n <thead>\n <tr>\n {days.slice(0, 7).map((iso) => (\n <th key={iso} scope=\"col\" abbr={weekdayLong.format(toLocalDate(iso))} className={s.weekday()}>\n {weekdayShort.format(toLocalDate(iso)).replace(/\\.$/, \"\")}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]}>\n {week.map((iso) => {\n const selected = iso === value || (range && (iso === range.start || iso === range.end));\n const inRange = Boolean(lo && hi && iso > lo && iso < hi);\n return (\n <td key={iso} role=\"gridcell\" aria-selected={selected || inRange || undefined} className={s.cell()}>\n <button\n type=\"button\"\n data-date={iso}\n tabIndex={iso === active ? 0 : -1}\n aria-label={formatDate(toLocalDate(iso), { locale, style: \"long\" })}\n aria-current={iso === today ? \"date\" : undefined}\n data-today={iso === today ? \"\" : undefined}\n data-outside={iso.slice(0, 7) !== month.slice(0, 7) ? \"\" : undefined}\n data-selected={selected ? \"\" : undefined}\n data-in-range={inRange ? \"\" : undefined}\n disabled={disabled(iso)}\n className={s.day()}\n onClick={() => {\n setFocused(iso);\n onSelect?.(iso);\n }}\n onMouseEnter={range && !range.end ? () => setHover(iso) : undefined}\n onFocus={range && !range.end ? () => setHover(iso) : undefined}\n >\n {Number(iso.slice(8))}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","// Client (a portal). A field-like button that opens the `Calendar` in a Popover (Radix: Escape closes, the focus\n// returns to the button). The value is an ISO date (`\"2026-10-11\"`) — the same string in a form, an address and an\n// API; the button reads it in the `locale`'s own format through `@krizaka/intl`.\nimport { formatDate, getDateTimeFormat } from \"@krizaka/intl\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CalendarGlyph, CloseGlyph } from \"../glyphs\";\nimport { useControllable } from \"../media\";\nimport { Popover } from \"../popover\";\nimport { Calendar, type CalendarLabels, type CalendarProps, type DateRange, type IsoDate, toLocalDate } from \"./calendar\";\n\nexport const datePicker = tv({\n slots: {\n root: \"flex w-full flex-col gap-1.5\",\n label: \"text-xs font-semibold text-fg-secondary\",\n row: \"relative flex w-full\",\n trigger:\n \"flex h-11 w-full items-center gap-2.5 rounded-lg border border-border-default bg-surface-2 px-3 text-left text-sm text-fg \" +\n \"transition-[border-color,box-shadow] focus-visible:border-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"data-[placeholder]:text-fg-muted aria-invalid:border-danger disabled:cursor-not-allowed disabled:opacity-50 data-[clearable]:pr-10\",\n icon: \"h-4 w-4 shrink-0 text-fg-secondary\",\n clear:\n \"absolute right-1.5 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-md text-fg-secondary hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n content: \"w-auto p-3\",\n layout: \"flex flex-col gap-3 sm:flex-row\",\n presets: \"flex flex-wrap gap-1.5 sm:w-36 sm:flex-col sm:flex-nowrap sm:border-r sm:border-border-default sm:pr-3\",\n preset:\n \"rounded-md px-2.5 py-1.5 text-left text-xs font-semibold text-fg-secondary hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-pressed:bg-accent-soft aria-pressed:text-fg\",\n hint: \"text-xs text-fg-secondary\",\n error: \"flex items-center gap-1.5 text-xs font-medium text-fg-danger before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-danger\",\n },\n});\n\nexport type DatePickerLabels = CalendarLabels & {\n /** The clear button (\"Clear date\"). */\n clear: string;\n};\n\nexport const datePickerLabels: DatePickerLabels = { previousMonth: \"Previous month\", nextMonth: \"Next month\", clear: \"Clear date\" };\n\ntype Shared = Pick<CalendarProps, \"locale\" | \"min\" | \"max\" | \"isDateDisabled\" | \"weekStartsOn\" | \"today\"> & {\n /** The visible label, passed translated (also the button's accessible name, with the value). */\n label: string;\n /** Shown while nothing is chosen (\"Pick a date\"), passed translated. */\n placeholder?: string;\n /** `short` · `medium` (default) · `long`: how the button writes the date. */\n format?: \"short\" | \"medium\" | \"long\";\n /** Adds a button that empties the value. */\n clearable?: boolean;\n /** A help text under the field. */\n hint?: string;\n /** An error under the field: marks it invalid and is read with it. */\n error?: string;\n /** Not available. */\n disabled?: boolean;\n /** The name of a hidden input holding the ISO value, for a plain `<form>` post. */\n name?: string;\n /** Opens the calendar at first (a story, a test). */\n defaultOpen?: boolean;\n /** The words, passed translated; English by default. */\n labels?: Partial<DatePickerLabels>;\n /** Classes merged on the root. */\n className?: string;\n};\n\nexport type DatePickerProps = Shared & {\n /** The chosen date, ISO (controlled); `null` for none. */\n value?: IsoDate | null;\n /** The chosen date at first, uncontrolled. */\n defaultValue?: IsoDate | null;\n /** Called with the date picked, or `null` when cleared. */\n onValueChange?: (value: IsoDate | null) => void;\n};\n\nfunction Field({\n shared,\n text,\n hasValue,\n onClear,\n hidden,\n open,\n setOpen,\n children,\n}: {\n shared: Shared;\n text: string | null;\n hasValue: boolean;\n onClear: () => void;\n hidden: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n children: React.ReactNode;\n}) {\n const { label, placeholder, clearable, hint, error, disabled, name, className } = shared;\n const labels = { ...datePickerLabels, ...shared.labels };\n const s = datePicker();\n const id = React.useId();\n const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(\" \") || undefined;\n return (\n <div className={s.root({ className })}>\n <label htmlFor={`${id}-trigger`} className={s.label()}>\n {label}\n </label>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <div className={s.row()}>\n <Popover.Trigger asChild>\n <button\n id={`${id}-trigger`}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-describedby={describedBy}\n aria-invalid={error ? true : undefined}\n disabled={disabled}\n data-placeholder={hasValue ? undefined : \"\"}\n data-clearable={clearable && hasValue ? \"\" : undefined}\n className={s.trigger()}\n >\n <CalendarGlyph className={s.icon()} />\n <span className=\"truncate\">{text ?? placeholder ?? \"\"}</span>\n </button>\n </Popover.Trigger>\n {clearable && hasValue && !disabled ? (\n <button type=\"button\" aria-label={labels.clear} className={s.clear()} onClick={onClear}>\n <CloseGlyph className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n <Popover.Content align=\"start\" aria-label={label} className={s.content()}>\n {children}\n </Popover.Content>\n </Popover.Root>\n {name ? <input type=\"hidden\" name={name} value={hidden} /> : null}\n {hint ? (\n <p id={`${id}-hint`} className={s.hint()}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={`${id}-error`} className={s.error()}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** A date field: a button showing the date in the locale's format, a calendar in a popover, an ISO value. */\nexport function DatePicker({ value: valueProp, defaultValue = null, onValueChange, defaultOpen = false, ...shared }: DatePickerProps) {\n const [value, setValue] = useControllable<IsoDate | null>(valueProp, defaultValue, onValueChange);\n const [open, setOpen] = React.useState(defaultOpen);\n const { locale, format = \"medium\" } = shared;\n return (\n <Field\n shared={shared}\n text={value ? formatDate(toLocalDate(value), { locale, style: format }) : null}\n hasValue={Boolean(value)}\n onClear={() => setValue(null)}\n hidden={value ?? \"\"}\n open={open}\n setOpen={setOpen}\n >\n <Calendar\n {...shared}\n autoFocus\n value={value}\n onSelect={(date) => {\n setValue(date);\n setOpen(false);\n }}\n />\n </Field>\n );\n}\n\nexport type DateRangePreset = {\n /** Its name, passed translated (\"Last 7 days\"). */\n label: string;\n /** The first day, ISO. */\n start: IsoDate;\n /** The last day, ISO. */\n end: IsoDate;\n};\n\nexport type DateRangePickerProps = Shared & {\n /** The chosen range (controlled); `null` for none. `end` is never `null` in a committed value. */\n value?: { start: IsoDate; end: IsoDate } | null;\n /** The range at first, uncontrolled. */\n defaultValue?: { start: IsoDate; end: IsoDate } | null;\n /** Called once both ends are chosen (or with `null` when cleared). */\n onValueChange?: (value: { start: IsoDate; end: IsoDate } | null) => void;\n /** Ranges one click away (\"Last 7 days\", \"This month\"), beside the calendar. */\n presets?: readonly DateRangePreset[];\n};\n\n/** Formats a range as the locale writes one (\"Oct 1 – 11, 2026\"), through Intl's `formatRange` where available. */\nfunction formatRange(locale: string, start: IsoDate, end: IsoDate, style: \"short\" | \"medium\" | \"long\") {\n const formatter = getDateTimeFormat(locale, { dateStyle: style }) as Intl.DateTimeFormat & { formatRange?: (a: Date, b: Date) => string };\n return formatter.formatRange\n ? formatter.formatRange(toLocalDate(start), toLocalDate(end))\n : `${formatter.format(toLocalDate(start))} – ${formatter.format(toLocalDate(end))}`;\n}\n\n/** A period field: two clicks on one calendar (the days between tinted as you hover), optional presets. */\nexport function DateRangePicker({ value: valueProp, defaultValue = null, onValueChange, presets, defaultOpen = false, ...shared }: DateRangePickerProps) {\n const [value, setValue] = useControllable(valueProp, defaultValue, onValueChange);\n const [draft, setDraft] = React.useState<DateRange | null>(null);\n const [open, setOpenState] = React.useState(defaultOpen);\n const { locale, format = \"medium\" } = shared;\n const s = datePicker();\n const setOpen = (next: boolean) => {\n setOpenState(next);\n setDraft(null);\n };\n const shown: DateRange | null = draft ?? value;\n const pick = (date: IsoDate) => {\n if (!draft) setDraft({ start: date, end: null });\n else {\n const [start, end] = date < draft.start ? [date, draft.start] : [draft.start, date];\n setValue({ start, end });\n setOpen(false);\n }\n };\n return (\n <Field\n shared={shared}\n text={value ? formatRange(locale, value.start, value.end, format) : null}\n hasValue={Boolean(value)}\n onClear={() => setValue(null)}\n hidden={value ? `${value.start}/${value.end}` : \"\"}\n open={open}\n setOpen={setOpen}\n >\n <div className={s.layout()}>\n {presets?.length ? (\n <div className={s.presets()}>\n {presets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n aria-pressed={value?.start === preset.start && value?.end === preset.end}\n className={s.preset()}\n onClick={() => {\n setValue({ start: preset.start, end: preset.end });\n setOpen(false);\n }}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n <Calendar {...shared} autoFocus range={shown} onSelect={pick} />\n </div>\n </Field>\n );\n}\n","// Client (a portal). Radix places the content, traps nothing, closes on Escape and on an outside click, and returns\n// the focus to the trigger.\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { floating } from \"../floating\";\n\nexport type PopoverContentProps = React.ComponentProps<typeof PopoverPrimitive.Content> & {\n /** The element the portal renders into (default: document.body). */\n container?: HTMLElement | null;\n};\n\nexport function PopoverContent({ sideOffset = 8, collisionPadding = 8, container, className, ...props }: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cn(floating, \"w-72 max-w-(--radix-popover-content-available-width) p-4 origin-(--radix-popover-content-transform-origin)\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** `Popover.Root/Trigger/Anchor/Content/Close`. `open`/`defaultOpen` + `onOpenChange`. */\nexport const Popover = {\n Root: PopoverPrimitive.Root,\n Trigger: PopoverPrimitive.Trigger,\n Anchor: PopoverPrimitive.Anchor,\n Close: PopoverPrimitive.Close,\n Content: PopoverContent,\n};\n"],"mappings":"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","names":["formatDate","getDateTimeFormat","React","tv","jsx","jsx","jsxs","tv","formatDate","getDateTimeFormat"]}
|
|
@@ -14,6 +14,9 @@ declare const dialog: tailwind_variants.TVReturnType<{
|
|
|
14
14
|
right: {
|
|
15
15
|
content: string;
|
|
16
16
|
};
|
|
17
|
+
left: {
|
|
18
|
+
content: string;
|
|
19
|
+
};
|
|
17
20
|
};
|
|
18
21
|
size: {
|
|
19
22
|
sm: {
|
|
@@ -46,6 +49,9 @@ declare const dialog: tailwind_variants.TVReturnType<{
|
|
|
46
49
|
right: {
|
|
47
50
|
content: string;
|
|
48
51
|
};
|
|
52
|
+
left: {
|
|
53
|
+
content: string;
|
|
54
|
+
};
|
|
49
55
|
};
|
|
50
56
|
size: {
|
|
51
57
|
sm: {
|
|
@@ -78,6 +84,9 @@ declare const dialog: tailwind_variants.TVReturnType<{
|
|
|
78
84
|
right: {
|
|
79
85
|
content: string;
|
|
80
86
|
};
|
|
87
|
+
left: {
|
|
88
|
+
content: string;
|
|
89
|
+
};
|
|
81
90
|
};
|
|
82
91
|
size: {
|
|
83
92
|
sm: {
|
|
@@ -112,7 +121,8 @@ type CloseButtonProps = {
|
|
|
112
121
|
};
|
|
113
122
|
type DialogContentProps = React.ComponentProps<typeof Dialog$1.Content> & DialogVariants & CloseButtonProps & {
|
|
114
123
|
/**
|
|
115
|
-
* center · bottom (a sheet on a phone, centred from `sm` up) · right (a side panel, full height)
|
|
124
|
+
* center · bottom (a sheet on a phone, centred from `sm` up) · right (a side panel, full height) · left (a
|
|
125
|
+
* navigation drawer, full height).
|
|
116
126
|
* @default "center"
|
|
117
127
|
*/
|
|
118
128
|
placement?: DialogVariants["placement"];
|
package/dist/dialog.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export { a as Dialog, b as DialogBody, c as DialogContent, D as DialogContentProps, d as DialogDescription, e as DialogFooter, f as DialogHeader, g as DialogTitle, h as DialogVariants, S as Sheet, i as SheetProps, j as dialog } from './dialog-
|
|
2
|
+
export { a as Dialog, b as DialogBody, c as DialogContent, D as DialogContentProps, d as DialogDescription, e as DialogFooter, f as DialogHeader, g as DialogTitle, h as DialogVariants, S as Sheet, i as SheetProps, j as dialog } from './dialog-D42QwYb_.js';
|
|
3
3
|
import 'tailwind-variants';
|
|
4
4
|
import 'radix-ui';
|
|
5
5
|
|
package/dist/dialog.js
CHANGED
|
@@ -9,10 +9,11 @@ import {
|
|
|
9
9
|
DialogTitle,
|
|
10
10
|
Sheet,
|
|
11
11
|
dialog
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-R6SDS7JM.js";
|
|
13
13
|
import {
|
|
14
14
|
Button
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-RUPNPMP3.js";
|
|
16
|
+
import "./chunk-WEVYKZIF.js";
|
|
16
17
|
|
|
17
18
|
// src/dialog/alert-dialog.tsx
|
|
18
19
|
import { AlertDialog as AlertDialogPrimitive } from "radix-ui";
|
package/dist/dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dialog/alert-dialog.tsx"],"sourcesContent":["// Client. A confirmation that interrupts: Radix AlertDialog (role=\"alertdialog\", no outside click, focus on Cancel).\n// `onConfirm` may be async: the dialog stays open with the confirm button loading until it settles, closes when it\n// resolves, and stays open when it rejects (the product shows the error).\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Button } from \"../button/button\";\nimport { dialog } from \"./dialog\";\n\nconst s = dialog({ placement: \"center\", size: \"sm\" });\n\nexport type AlertDialogProps = {\n /** Open or closed (controlled), with `onOpenChange`. */\n open?: boolean;\n /** Open at first, uncontrolled. */\n defaultOpen?: boolean;\n /** Called when it opens or closes (never while `onConfirm` is pending). */\n onOpenChange?: (open: boolean) => void;\n /** The element that opens the dialog (rendered as is, `asChild`): a Button, an IconButton. */\n trigger?: React.ReactNode;\n /** The question asked (\"Delete this video?\"): the dialog's accessible name. */\n title: React.ReactNode;\n /** What the action does and what it costs: the dialog's description. */\n description?: React.ReactNode;\n /** More content between the description and the actions. */\n children?: React.ReactNode;\n /** The words of the confirm button — passed translated. */\n confirmLabel: string;\n /** The words of the cancel button (it takes the focus at open) — passed translated. */\n cancelLabel: string;\n /** `danger` for a destructive action (delete, leave, cancel a payment). */\n tone?: \"danger\" | \"primary\";\n /** Runs on confirm. A promise keeps the dialog open and the button loading until it settles. */\n onConfirm: () => void | Promise<unknown>;\n /** The element the portal renders into (default: document.body). */\n container?: HTMLElement | null;\n /** Classes of the dialog's content, merged last. */\n className?: string;\n};\n\nexport function AlertDialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger,\n title,\n description,\n children,\n confirmLabel,\n cancelLabel,\n tone = \"primary\",\n onConfirm,\n container,\n className,\n}: AlertDialogProps) {\n const [openState, setOpenState] = React.useState(defaultOpen);\n const [pending, setPending] = React.useState(false);\n const open = openProp ?? openState;\n\n const setOpen = (next: boolean) => {\n if (openProp === undefined) setOpenState(next);\n onOpenChange?.(next);\n };\n\n const confirm = async () => {\n setPending(true);\n try {\n await onConfirm();\n setOpen(false);\n } catch {\n // Stays open: the product reports the failure (a toast, an inline error) and the person may retry.\n } finally {\n setPending(false);\n }\n };\n\n return (\n <AlertDialogPrimitive.Root open={open} onOpenChange={(next) => (pending ? undefined : setOpen(next))}>\n {trigger && <AlertDialogPrimitive.Trigger asChild>{trigger}</AlertDialogPrimitive.Trigger>}\n <AlertDialogPrimitive.Portal container={container}>\n <AlertDialogPrimitive.Overlay className={s.overlay()} />\n <AlertDialogPrimitive.Content\n data-tone={tone}\n aria-busy={pending || undefined}\n className={s.content({ className })}\n onEscapeKeyDown={(event) => pending && event.preventDefault()}\n >\n <div className={s.header({ className: \"pr-5\" })}>\n <AlertDialogPrimitive.Title className={s.title()}>{title}</AlertDialogPrimitive.Title>\n {description && <AlertDialogPrimitive.Description className={s.description()}>{description}</AlertDialogPrimitive.Description>}\n </div>\n {children && <div className={s.body()}>{children}</div>}\n <div className={s.footer()}>\n <AlertDialogPrimitive.Cancel asChild>\n <Button variant=\"ghost\" disabled={pending}>\n {cancelLabel}\n </Button>\n </AlertDialogPrimitive.Cancel>\n <Button variant={tone === \"danger\" ? \"danger\" : \"primary\"} loading={pending} onClick={confirm}>\n {confirmLabel}\n </Button>\n </div>\n </AlertDialogPrimitive.Content>\n </AlertDialogPrimitive.Portal>\n </AlertDialogPrimitive.Root>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/dialog/alert-dialog.tsx"],"sourcesContent":["// Client. A confirmation that interrupts: Radix AlertDialog (role=\"alertdialog\", no outside click, focus on Cancel).\n// `onConfirm` may be async: the dialog stays open with the confirm button loading until it settles, closes when it\n// resolves, and stays open when it rejects (the product shows the error).\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Button } from \"../button/button\";\nimport { dialog } from \"./dialog\";\n\nconst s = dialog({ placement: \"center\", size: \"sm\" });\n\nexport type AlertDialogProps = {\n /** Open or closed (controlled), with `onOpenChange`. */\n open?: boolean;\n /** Open at first, uncontrolled. */\n defaultOpen?: boolean;\n /** Called when it opens or closes (never while `onConfirm` is pending). */\n onOpenChange?: (open: boolean) => void;\n /** The element that opens the dialog (rendered as is, `asChild`): a Button, an IconButton. */\n trigger?: React.ReactNode;\n /** The question asked (\"Delete this video?\"): the dialog's accessible name. */\n title: React.ReactNode;\n /** What the action does and what it costs: the dialog's description. */\n description?: React.ReactNode;\n /** More content between the description and the actions. */\n children?: React.ReactNode;\n /** The words of the confirm button — passed translated. */\n confirmLabel: string;\n /** The words of the cancel button (it takes the focus at open) — passed translated. */\n cancelLabel: string;\n /** `danger` for a destructive action (delete, leave, cancel a payment). */\n tone?: \"danger\" | \"primary\";\n /** Runs on confirm. A promise keeps the dialog open and the button loading until it settles. */\n onConfirm: () => void | Promise<unknown>;\n /** The element the portal renders into (default: document.body). */\n container?: HTMLElement | null;\n /** Classes of the dialog's content, merged last. */\n className?: string;\n};\n\nexport function AlertDialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger,\n title,\n description,\n children,\n confirmLabel,\n cancelLabel,\n tone = \"primary\",\n onConfirm,\n container,\n className,\n}: AlertDialogProps) {\n const [openState, setOpenState] = React.useState(defaultOpen);\n const [pending, setPending] = React.useState(false);\n const open = openProp ?? openState;\n\n const setOpen = (next: boolean) => {\n if (openProp === undefined) setOpenState(next);\n onOpenChange?.(next);\n };\n\n const confirm = async () => {\n setPending(true);\n try {\n await onConfirm();\n setOpen(false);\n } catch {\n // Stays open: the product reports the failure (a toast, an inline error) and the person may retry.\n } finally {\n setPending(false);\n }\n };\n\n return (\n <AlertDialogPrimitive.Root open={open} onOpenChange={(next) => (pending ? undefined : setOpen(next))}>\n {trigger && <AlertDialogPrimitive.Trigger asChild>{trigger}</AlertDialogPrimitive.Trigger>}\n <AlertDialogPrimitive.Portal container={container}>\n <AlertDialogPrimitive.Overlay className={s.overlay()} />\n <AlertDialogPrimitive.Content\n data-tone={tone}\n aria-busy={pending || undefined}\n className={s.content({ className })}\n onEscapeKeyDown={(event) => pending && event.preventDefault()}\n >\n <div className={s.header({ className: \"pr-5\" })}>\n <AlertDialogPrimitive.Title className={s.title()}>{title}</AlertDialogPrimitive.Title>\n {description && <AlertDialogPrimitive.Description className={s.description()}>{description}</AlertDialogPrimitive.Description>}\n </div>\n {children && <div className={s.body()}>{children}</div>}\n <div className={s.footer()}>\n <AlertDialogPrimitive.Cancel asChild>\n <Button variant=\"ghost\" disabled={pending}>\n {cancelLabel}\n </Button>\n </AlertDialogPrimitive.Cancel>\n <Button variant={tone === \"danger\" ? \"danger\" : \"primary\"} loading={pending} onClick={confirm}>\n {confirmLabel}\n </Button>\n </div>\n </AlertDialogPrimitive.Content>\n </AlertDialogPrimitive.Portal>\n </AlertDialogPrimitive.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAGA,SAAS,eAAe,4BAA4B;AACpD,YAAY,WAAW;AA0EL,cASR,YATQ;AArElB,IAAM,IAAI,OAAO,EAAE,WAAW,UAAU,MAAM,KAAK,CAAC;AA+B7C,SAAS,YAAY;AAAA,EAC1B,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,CAAC,WAAW,YAAY,IAAU,eAAS,WAAW;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAU,eAAS,KAAK;AAClD,QAAM,OAAO,YAAY;AAEzB,QAAM,UAAU,CAAC,SAAkB;AACjC,QAAI,aAAa,OAAW,cAAa,IAAI;AAC7C,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,UAAU,YAAY;AAC1B,eAAW,IAAI;AACf,QAAI;AACF,YAAM,UAAU;AAChB,cAAQ,KAAK;AAAA,IACf,QAAQ;AAAA,IAER,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,qBAAC,qBAAqB,MAArB,EAA0B,MAAY,cAAc,CAAC,SAAU,UAAU,SAAY,QAAQ,IAAI,GAC/F;AAAA,eAAW,oBAAC,qBAAqB,SAArB,EAA6B,SAAO,MAAE,mBAAQ;AAAA,IAC3D,qBAAC,qBAAqB,QAArB,EAA4B,WAC3B;AAAA,0BAAC,qBAAqB,SAArB,EAA6B,WAAW,EAAE,QAAQ,GAAG;AAAA,MACtD;AAAA,QAAC,qBAAqB;AAAA,QAArB;AAAA,UACC,aAAW;AAAA,UACX,aAAW,WAAW;AAAA,UACtB,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC;AAAA,UAClC,iBAAiB,CAAC,UAAU,WAAW,MAAM,eAAe;AAAA,UAE5D;AAAA,iCAAC,SAAI,WAAW,EAAE,OAAO,EAAE,WAAW,OAAO,CAAC,GAC5C;AAAA,kCAAC,qBAAqB,OAArB,EAA2B,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,cACxD,eAAe,oBAAC,qBAAqB,aAArB,EAAiC,WAAW,EAAE,YAAY,GAAI,uBAAY;AAAA,eAC7F;AAAA,YACC,YAAY,oBAAC,SAAI,WAAW,EAAE,KAAK,GAAI,UAAS;AAAA,YACjD,qBAAC,SAAI,WAAW,EAAE,OAAO,GACvB;AAAA,kCAAC,qBAAqB,QAArB,EAA4B,SAAO,MAClC,8BAAC,UAAO,SAAQ,SAAQ,UAAU,SAC/B,uBACH,GACF;AAAA,cACA,oBAAC,UAAO,SAAS,SAAS,WAAW,WAAW,WAAW,SAAS,SAAS,SAAS,SACnF,wBACH;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|