@krizaka/ui 3.2.0 → 3.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/dist/activity-feed.d.ts +199 -0
- package/dist/activity-feed.js +155 -0
- package/dist/activity-feed.js.map +1 -0
- package/dist/argument-card.js +3 -3
- package/dist/{chunk-I5RVM5CW.js → chunk-2FRWNSRO.js} +2 -6
- package/dist/chunk-2FRWNSRO.js.map +1 -0
- package/dist/chunk-7Z4KHPFC.js +42 -0
- package/dist/chunk-7Z4KHPFC.js.map +1 -0
- package/dist/chunk-BTMFZ66D.js +135 -0
- package/dist/chunk-BTMFZ66D.js.map +1 -0
- package/dist/chunk-C2BRIFJG.js +13 -0
- package/dist/chunk-C2BRIFJG.js.map +1 -0
- package/dist/chunk-KDXRYUD3.js +39 -0
- package/dist/chunk-KDXRYUD3.js.map +1 -0
- package/dist/{chunk-2PUDI7JS.js → chunk-ZKVQGXLD.js} +5 -3
- package/dist/{chunk-2PUDI7JS.js.map → chunk-ZKVQGXLD.js.map} +1 -1
- package/dist/command.js +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/data-table.js +101 -133
- package/dist/data-table.js.map +1 -1
- package/dist/date-picker.d.ts +3 -1
- package/dist/date-picker.js +13 -13
- package/dist/date-picker.js.map +1 -1
- package/dist/description-list.d.ts +105 -0
- package/dist/description-list.js +49 -0
- package/dist/description-list.js.map +1 -0
- package/dist/dropdown-menu.js +1 -1
- package/dist/filter-bar.js +3 -2
- package/dist/form.d.ts +23 -12
- package/dist/form.js +11 -47
- package/dist/form.js.map +1 -1
- package/dist/glow-card.js +1 -1
- package/dist/image-cropper.js +3 -1
- package/dist/image-cropper.js.map +1 -1
- package/dist/index.js +13 -66
- package/dist/index.js.map +1 -1
- package/dist/kanban.d.ts +132 -0
- package/dist/kanban.js +187 -0
- package/dist/kanban.js.map +1 -0
- package/dist/list.d.ts +153 -0
- package/dist/list.js +130 -0
- package/dist/list.js.map +1 -0
- package/dist/map.d.ts +463 -0
- package/dist/map.js +952 -0
- package/dist/map.js.map +1 -0
- package/dist/marquee.js +1 -1
- package/dist/motion.css +12 -1
- package/dist/native/form.d.ts +60 -15
- package/dist/native/form.js +103 -42
- package/dist/native/form.js.map +1 -1
- package/dist/native/map.d.ts +200 -0
- package/dist/native/map.js +673 -0
- package/dist/native/map.js.map +1 -0
- package/dist/native/media-picker.d.ts +58 -0
- package/dist/native/media-picker.js +63 -0
- package/dist/native/media-picker.js.map +1 -0
- package/dist/native.d.ts +772 -6
- package/dist/native.js +2493 -741
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.js +1 -1
- package/dist/page-hero.js +3 -3
- package/dist/popover.js +1 -1
- package/dist/radio-group.d.ts +66 -32
- package/dist/radio-group.js +54 -10
- package/dist/radio-group.js.map +1 -1
- package/dist/slider.d.ts +96 -35
- package/dist/slider.js +67 -13
- package/dist/slider.js.map +1 -1
- package/dist/stat.d.ts +31 -2
- package/dist/stat.js +21 -4
- package/dist/stat.js.map +1 -1
- package/dist/terminal-replay.js +34 -60
- package/dist/terminal-replay.js.map +1 -1
- package/dist/toast.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/tree-view.d.ts +111 -0
- package/dist/tree-view.js +154 -0
- package/dist/tree-view.js.map +1 -0
- package/dist/video-player.js +3 -1
- package/dist/video-player.js.map +1 -1
- package/package.json +148 -11
- package/registry/achievement.json +1 -1
- package/registry/action-bar.json +1 -1
- package/registry/action-sheet.json +121 -0
- package/registry/activity-feed.json +468 -0
- package/registry/alert.json +1 -1
- package/registry/app-shell.json +1 -1
- package/registry/argument-card.json +1 -1
- package/registry/audio-player.json +1 -1
- package/registry/auth-layout.json +1 -1
- package/registry/avatar.json +58 -3
- package/registry/badge.json +1 -1
- package/registry/button.json +1 -1
- package/registry/card-grid.json +1 -1
- package/registry/card.json +1 -1
- package/registry/catalogue-page.json +1 -1
- package/registry/changelog-page.json +1 -1
- package/registry/checkbox.json +1 -1
- package/registry/chip-link.json +1 -1
- package/registry/chip.json +1 -1
- package/registry/choice-grid.json +1 -1
- package/registry/code-block.json +1 -1
- package/registry/combobox.json +226 -4
- package/registry/command.json +1 -1
- package/registry/component-page.json +1 -1
- package/registry/confirm-button.json +1 -1
- package/registry/contact-page.json +1 -1
- package/registry/continue-prompt.json +1 -1
- package/registry/countdown.json +1 -1
- package/registry/cta-panel.json +1 -1
- package/registry/dashboard-layout.json +1 -1
- package/registry/data-table.json +1 -1
- package/registry/date-picker.json +18 -4
- package/registry/decision-list.json +1 -1
- package/registry/description-list.json +232 -0
- package/registry/detail-layout.json +1 -1
- package/registry/dialog.json +75 -4
- package/registry/docs-article-page.json +1 -1
- package/registry/docs-hub-page.json +1 -1
- package/registry/docs-layout.json +1 -1
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/error-page.json +1 -1
- package/registry/examples/action-sheet/native/video-actions.d.ts +4 -0
- package/registry/examples/action-sheet/native/video-actions.dark.png +0 -0
- package/registry/examples/action-sheet/native/video-actions.js +30 -0
- package/registry/examples/action-sheet/native/video-actions.light.png +0 -0
- package/registry/examples/action-sheet/native/video-actions.tsx +24 -0
- package/registry/examples/activity-feed/job-activity.d.ts +4 -0
- package/registry/examples/activity-feed/job-activity.js +21 -0
- package/registry/examples/activity-feed/job-activity.tsx +17 -0
- package/registry/examples/activity-feed/live.d.ts +4 -0
- package/registry/examples/activity-feed/live.js +23 -0
- package/registry/examples/activity-feed/live.tsx +24 -0
- package/registry/examples/activity-feed/native/notifications.d.ts +4 -0
- package/registry/examples/activity-feed/native/notifications.dark.png +0 -0
- package/registry/examples/activity-feed/native/notifications.js +18 -0
- package/registry/examples/activity-feed/native/notifications.light.png +0 -0
- package/registry/examples/activity-feed/native/notifications.tsx +18 -0
- package/registry/examples/activity-feed/timeline.d.ts +4 -0
- package/registry/examples/activity-feed/timeline.js +25 -0
- package/registry/examples/activity-feed/timeline.tsx +19 -0
- package/registry/examples/avatar/native/presence.d.ts +4 -0
- package/registry/examples/avatar/native/presence.dark.png +0 -0
- package/registry/examples/avatar/native/presence.js +18 -0
- package/registry/examples/avatar/native/presence.light.png +0 -0
- package/registry/examples/avatar/native/presence.tsx +15 -0
- package/registry/examples/combobox/native/multiple.d.ts +4 -0
- package/registry/examples/combobox/native/multiple.dark.png +0 -0
- package/registry/examples/combobox/native/multiple.js +15 -0
- package/registry/examples/combobox/native/multiple.light.png +0 -0
- package/registry/examples/combobox/native/multiple.tsx +15 -0
- package/registry/examples/combobox/native/search.d.ts +4 -0
- package/registry/examples/combobox/native/search.dark.png +0 -0
- package/registry/examples/combobox/native/search.js +15 -0
- package/registry/examples/combobox/native/search.light.png +0 -0
- package/registry/examples/combobox/native/search.tsx +15 -0
- package/registry/examples/description-list/job-details.d.ts +4 -0
- package/registry/examples/description-list/job-details.js +23 -0
- package/registry/examples/description-list/job-details.tsx +17 -0
- package/registry/examples/description-list/key-value-grid.d.ts +4 -0
- package/registry/examples/description-list/key-value-grid.js +22 -0
- package/registry/examples/description-list/key-value-grid.tsx +16 -0
- package/registry/examples/description-list/native/job-details.d.ts +4 -0
- package/registry/examples/description-list/native/job-details.dark.png +0 -0
- package/registry/examples/description-list/native/job-details.js +33 -0
- package/registry/examples/description-list/native/job-details.light.png +0 -0
- package/registry/examples/description-list/native/job-details.tsx +24 -0
- package/registry/examples/description-list/receipt.d.ts +4 -0
- package/registry/examples/description-list/receipt.js +23 -0
- package/registry/examples/description-list/receipt.tsx +17 -0
- package/registry/examples/dialog/native/sheet.d.ts +4 -0
- package/registry/examples/dialog/native/sheet.dark.png +0 -0
- package/registry/examples/dialog/native/sheet.js +21 -0
- package/registry/examples/dialog/native/sheet.light.png +0 -0
- package/registry/examples/dialog/native/sheet.tsx +18 -0
- package/registry/examples/fab/native/extended.d.ts +4 -0
- package/registry/examples/fab/native/extended.dark.png +0 -0
- package/registry/examples/fab/native/extended.js +18 -0
- package/registry/examples/fab/native/extended.light.png +0 -0
- package/registry/examples/fab/native/extended.tsx +23 -0
- package/registry/examples/field/native/select.d.ts +4 -0
- package/registry/examples/field/native/select.dark.png +0 -0
- package/registry/examples/field/native/select.js +29 -0
- package/registry/examples/field/native/select.light.png +0 -0
- package/registry/examples/field/native/select.tsx +25 -0
- package/registry/examples/form/native/audience.dark.png +0 -0
- package/registry/examples/form/native/audience.light.png +0 -0
- package/registry/examples/form/native/profile.dark.png +0 -0
- package/registry/examples/form/native/profile.light.png +0 -0
- package/registry/examples/form/native/settings.dark.png +0 -0
- package/registry/examples/form/native/settings.light.png +0 -0
- package/registry/examples/form/native/sign-up.dark.png +0 -0
- package/registry/examples/form/native/sign-up.light.png +0 -0
- package/registry/examples/form/native/upload.dark.png +0 -0
- package/registry/examples/form/native/upload.light.png +0 -0
- package/registry/examples/header/native/large-title.d.ts +4 -0
- package/registry/examples/header/native/large-title.dark.png +0 -0
- package/registry/examples/header/native/large-title.js +23 -0
- package/registry/examples/header/native/large-title.light.png +0 -0
- package/registry/examples/header/native/large-title.tsx +31 -0
- package/registry/examples/image-viewer/native/gallery.d.ts +4 -0
- package/registry/examples/image-viewer/native/gallery.dark.png +0 -0
- package/registry/examples/image-viewer/native/gallery.js +22 -0
- package/registry/examples/image-viewer/native/gallery.light.png +0 -0
- package/registry/examples/image-viewer/native/gallery.tsx +21 -0
- package/registry/examples/kanban/moderation.d.ts +4 -0
- package/registry/examples/kanban/moderation.js +35 -0
- package/registry/examples/kanban/moderation.tsx +37 -0
- package/registry/examples/list/jobs.d.ts +4 -0
- package/registry/examples/list/jobs.js +35 -0
- package/registry/examples/list/jobs.tsx +33 -0
- package/registry/examples/list/selectable.d.ts +4 -0
- package/registry/examples/list/selectable.js +33 -0
- package/registry/examples/list/selectable.tsx +30 -0
- package/registry/examples/list/virtualized.d.ts +4 -0
- package/registry/examples/list/virtualized.js +22 -0
- package/registry/examples/list/virtualized.tsx +17 -0
- package/registry/examples/loader/native/block.d.ts +4 -0
- package/registry/examples/loader/native/block.dark.png +0 -0
- package/registry/examples/loader/native/block.js +12 -0
- package/registry/examples/loader/native/block.light.png +0 -0
- package/registry/examples/loader/native/block.tsx +11 -0
- package/registry/examples/loader/native/job-wait.d.ts +4 -0
- package/registry/examples/loader/native/job-wait.dark.png +0 -0
- package/registry/examples/loader/native/job-wait.js +17 -0
- package/registry/examples/loader/native/job-wait.light.png +0 -0
- package/registry/examples/loader/native/job-wait.tsx +14 -0
- package/registry/examples/map/cluster.d.ts +4 -0
- package/registry/examples/map/cluster.js +16 -0
- package/registry/examples/map/cluster.tsx +18 -0
- package/registry/examples/map/location-picker.d.ts +4 -0
- package/registry/examples/map/location-picker.js +24 -0
- package/registry/examples/map/location-picker.tsx +22 -0
- package/registry/examples/map/native/location-picker.d.ts +4 -0
- package/registry/examples/map/native/location-picker.dark.png +0 -0
- package/registry/examples/map/native/location-picker.js +14 -0
- package/registry/examples/map/native/location-picker.light.png +0 -0
- package/registry/examples/map/native/location-picker.tsx +13 -0
- package/registry/examples/map/native/places.d.ts +4 -0
- package/registry/examples/map/native/places.dark.png +0 -0
- package/registry/examples/map/native/places.js +25 -0
- package/registry/examples/map/native/places.light.png +0 -0
- package/registry/examples/map/native/places.tsx +27 -0
- package/registry/examples/map/places.d.ts +4 -0
- package/registry/examples/map/places.js +28 -0
- package/registry/examples/map/places.tsx +28 -0
- package/registry/examples/map/static.d.ts +4 -0
- package/registry/examples/map/static.js +22 -0
- package/registry/examples/map/static.tsx +18 -0
- package/registry/examples/media-picker/native/story.d.ts +4 -0
- package/registry/examples/media-picker/native/story.dark.png +0 -0
- package/registry/examples/media-picker/native/story.js +30 -0
- package/registry/examples/media-picker/native/story.light.png +0 -0
- package/registry/examples/media-picker/native/story.tsx +26 -0
- package/registry/examples/meter/native/credits.d.ts +4 -0
- package/registry/examples/meter/native/credits.dark.png +0 -0
- package/registry/examples/meter/native/credits.js +15 -0
- package/registry/examples/meter/native/credits.light.png +0 -0
- package/registry/examples/meter/native/credits.tsx +12 -0
- package/registry/examples/meter/native/split-ring.d.ts +4 -0
- package/registry/examples/meter/native/split-ring.dark.png +0 -0
- package/registry/examples/meter/native/split-ring.js +24 -0
- package/registry/examples/meter/native/split-ring.light.png +0 -0
- package/registry/examples/meter/native/split-ring.tsx +19 -0
- package/registry/examples/number-ticker/native/balance.d.ts +4 -0
- package/registry/examples/number-ticker/native/balance.dark.png +0 -0
- package/registry/examples/number-ticker/native/balance.js +18 -0
- package/registry/examples/number-ticker/native/balance.light.png +0 -0
- package/registry/examples/number-ticker/native/balance.tsx +17 -0
- package/registry/examples/onboarding/native/first-launch.d.ts +4 -0
- package/registry/examples/onboarding/native/first-launch.dark.png +0 -0
- package/registry/examples/onboarding/native/first-launch.js +23 -0
- package/registry/examples/onboarding/native/first-launch.light.png +0 -0
- package/registry/examples/onboarding/native/first-launch.tsx +19 -0
- package/registry/examples/otp-input/native/invalid.d.ts +4 -0
- package/registry/examples/otp-input/native/invalid.dark.png +0 -0
- package/registry/examples/otp-input/native/invalid.js +15 -0
- package/registry/examples/otp-input/native/invalid.light.png +0 -0
- package/registry/examples/otp-input/native/invalid.tsx +14 -0
- package/registry/examples/otp-input/native/verify.d.ts +4 -0
- package/registry/examples/otp-input/native/verify.dark.png +0 -0
- package/registry/examples/otp-input/native/verify.js +17 -0
- package/registry/examples/otp-input/native/verify.light.png +0 -0
- package/registry/examples/otp-input/native/verify.tsx +14 -0
- package/registry/examples/permission-prompt/native/blocked.d.ts +4 -0
- package/registry/examples/permission-prompt/native/blocked.dark.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.js +25 -0
- package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.tsx +21 -0
- package/registry/examples/permission-prompt/native/camera.d.ts +4 -0
- package/registry/examples/permission-prompt/native/camera.dark.png +0 -0
- package/registry/examples/permission-prompt/native/camera.js +25 -0
- package/registry/examples/permission-prompt/native/camera.light.png +0 -0
- package/registry/examples/permission-prompt/native/camera.tsx +21 -0
- package/registry/examples/pull-to-refresh/native/feed.d.ts +4 -0
- package/registry/examples/pull-to-refresh/native/feed.dark.png +0 -0
- package/registry/examples/pull-to-refresh/native/feed.js +14 -0
- package/registry/examples/pull-to-refresh/native/feed.light.png +0 -0
- package/registry/examples/pull-to-refresh/native/feed.tsx +19 -0
- package/registry/examples/radio-group/buttons.d.ts +4 -0
- package/registry/examples/radio-group/buttons.js +17 -0
- package/registry/examples/radio-group/buttons.tsx +21 -0
- package/registry/examples/radio-group/cards.js +1 -1
- package/registry/examples/radio-group/cards.tsx +2 -2
- package/registry/examples/radio-group/native/buttons.d.ts +4 -0
- package/registry/examples/radio-group/native/buttons.dark.png +0 -0
- package/registry/examples/radio-group/native/buttons.js +25 -0
- package/registry/examples/radio-group/native/buttons.light.png +0 -0
- package/registry/examples/radio-group/native/buttons.tsx +21 -0
- package/registry/examples/radio-group/native/cards.d.ts +4 -0
- package/registry/examples/radio-group/native/cards.dark.png +0 -0
- package/registry/examples/radio-group/native/cards.js +23 -0
- package/registry/examples/radio-group/native/cards.light.png +0 -0
- package/registry/examples/radio-group/native/cards.tsx +19 -0
- package/registry/examples/radio-group/native/list.d.ts +4 -0
- package/registry/examples/radio-group/native/list.dark.png +0 -0
- package/registry/examples/radio-group/native/list.js +24 -0
- package/registry/examples/radio-group/native/list.light.png +0 -0
- package/registry/examples/radio-group/native/list.tsx +20 -0
- package/registry/examples/radio-group/native/segmented.d.ts +4 -0
- package/registry/examples/radio-group/native/segmented.dark.png +0 -0
- package/registry/examples/radio-group/native/segmented.js +24 -0
- package/registry/examples/radio-group/native/segmented.light.png +0 -0
- package/registry/examples/radio-group/native/segmented.tsx +20 -0
- package/registry/examples/radio-group/segmented.d.ts +4 -0
- package/registry/examples/radio-group/segmented.js +15 -0
- package/registry/examples/radio-group/segmented.tsx +12 -0
- package/registry/examples/search-field/native/cancel.d.ts +4 -0
- package/registry/examples/search-field/native/cancel.dark.png +0 -0
- package/registry/examples/search-field/native/cancel.js +14 -0
- package/registry/examples/search-field/native/cancel.light.png +0 -0
- package/registry/examples/search-field/native/cancel.tsx +13 -0
- package/registry/examples/slider/floating.d.ts +4 -0
- package/registry/examples/slider/floating.js +11 -0
- package/registry/examples/slider/floating.tsx +12 -0
- package/registry/examples/slider/native/default.d.ts +4 -0
- package/registry/examples/slider/native/default.dark.png +0 -0
- package/registry/examples/slider/native/default.js +14 -0
- package/registry/examples/slider/native/default.light.png +0 -0
- package/registry/examples/slider/native/default.tsx +13 -0
- package/registry/examples/slider/native/range.d.ts +4 -0
- package/registry/examples/slider/native/range.dark.png +0 -0
- package/registry/examples/slider/native/range.js +12 -0
- package/registry/examples/slider/native/range.light.png +0 -0
- package/registry/examples/slider/native/range.tsx +11 -0
- package/registry/examples/slider/native/stepped.d.ts +4 -0
- package/registry/examples/slider/native/stepped.dark.png +0 -0
- package/registry/examples/slider/native/stepped.js +28 -0
- package/registry/examples/slider/native/stepped.light.png +0 -0
- package/registry/examples/slider/native/stepped.tsx +24 -0
- package/registry/examples/slider/native/vertical.d.ts +4 -0
- package/registry/examples/slider/native/vertical.dark.png +0 -0
- package/registry/examples/slider/native/vertical.js +16 -0
- package/registry/examples/slider/native/vertical.light.png +0 -0
- package/registry/examples/slider/native/vertical.tsx +13 -0
- package/registry/examples/slider/price-range.d.ts +4 -0
- package/registry/examples/slider/price-range.js +29 -0
- package/registry/examples/slider/price-range.tsx +27 -0
- package/registry/examples/slider/stepped.d.ts +4 -0
- package/registry/examples/slider/stepped.js +28 -0
- package/registry/examples/slider/stepped.tsx +24 -0
- package/registry/examples/slider/vertical.d.ts +4 -0
- package/registry/examples/slider/vertical.js +15 -0
- package/registry/examples/slider/vertical.tsx +14 -0
- package/registry/examples/stat/grid.d.ts +4 -0
- package/registry/examples/stat/grid.js +17 -0
- package/registry/examples/stat/grid.tsx +14 -0
- package/registry/examples/stepper/native/run.d.ts +4 -0
- package/registry/examples/stepper/native/run.dark.png +0 -0
- package/registry/examples/stepper/native/run.js +24 -0
- package/registry/examples/stepper/native/run.light.png +0 -0
- package/registry/examples/stepper/native/run.tsx +20 -0
- package/registry/examples/swipeable-row/native/conversation.d.ts +4 -0
- package/registry/examples/swipeable-row/native/conversation.dark.png +0 -0
- package/registry/examples/swipeable-row/native/conversation.js +30 -0
- package/registry/examples/swipeable-row/native/conversation.light.png +0 -0
- package/registry/examples/swipeable-row/native/conversation.tsx +27 -0
- package/registry/examples/switch/native/default.d.ts +4 -0
- package/registry/examples/switch/native/default.dark.png +0 -0
- package/registry/examples/switch/native/default.js +16 -0
- package/registry/examples/switch/native/default.light.png +0 -0
- package/registry/examples/switch/native/default.tsx +13 -0
- package/registry/examples/switch/native/settings.d.ts +4 -0
- package/registry/examples/switch/native/settings.dark.png +0 -0
- package/registry/examples/switch/native/settings.js +20 -0
- package/registry/examples/switch/native/settings.light.png +0 -0
- package/registry/examples/switch/native/settings.tsx +17 -0
- package/registry/examples/tab-bar/native/main-sections.d.ts +4 -0
- package/registry/examples/tab-bar/native/main-sections.dark.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.js +29 -0
- package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.tsx +30 -0
- package/registry/examples/tabs/native/sections.d.ts +4 -0
- package/registry/examples/tabs/native/sections.dark.png +0 -0
- package/registry/examples/tabs/native/sections.js +23 -0
- package/registry/examples/tabs/native/sections.light.png +0 -0
- package/registry/examples/tabs/native/sections.tsx +19 -0
- package/registry/examples/tabs/native/segmented.d.ts +4 -0
- package/registry/examples/tabs/native/segmented.dark.png +0 -0
- package/registry/examples/tabs/native/segmented.js +22 -0
- package/registry/examples/tabs/native/segmented.light.png +0 -0
- package/registry/examples/tabs/native/segmented.tsx +18 -0
- package/registry/examples/toast/native/snackbar.d.ts +4 -0
- package/registry/examples/toast/native/snackbar.dark.png +0 -0
- package/registry/examples/toast/native/snackbar.js +23 -0
- package/registry/examples/toast/native/snackbar.light.png +0 -0
- package/registry/examples/toast/native/snackbar.tsx +21 -0
- package/registry/examples/tree-view/docs.d.ts +4 -0
- package/registry/examples/tree-view/docs.js +24 -0
- package/registry/examples/tree-view/docs.tsx +22 -0
- package/registry/examples/tree-view/lazy.d.ts +4 -0
- package/registry/examples/tree-view/lazy.js +21 -0
- package/registry/examples/tree-view/lazy.tsx +19 -0
- package/registry/fab.json +122 -0
- package/registry/field.json +16 -4
- package/registry/file-upload.json +2 -2
- package/registry/filter-bar.json +1 -1
- package/registry/form.json +252 -44
- package/registry/gallery-page.json +1 -1
- package/registry/glow-card.json +1 -1
- package/registry/goal-gauge.json +1 -1
- package/registry/header.json +137 -0
- package/registry/how-it-works-page.json +1 -1
- package/registry/image-cropper.json +1 -1
- package/registry/image-viewer.json +107 -0
- package/registry/index.json +322 -44
- package/registry/iso.json +1 -1
- package/registry/kanban.json +253 -0
- package/registry/kbd.json +1 -1
- package/registry/landing-page.json +1 -1
- package/registry/landscape.json +1 -1
- package/registry/legal-page.json +1 -1
- package/registry/link-card.json +1 -1
- package/registry/list.json +367 -30
- package/registry/loader.json +157 -4
- package/registry/longform-page.json +1 -1
- package/registry/map.json +1368 -0
- package/registry/marketing-layout.json +1 -1
- package/registry/marquee.json +1 -1
- package/registry/mascot-quote.json +1 -1
- package/registry/mascot-state.json +1 -1
- package/registry/mascots.json +1 -1
- package/registry/media-capture.json +1 -1
- package/registry/media-picker.json +129 -0
- package/registry/meter.json +136 -4
- package/registry/nav-bar.json +1 -1
- package/registry/number-ticker.json +96 -4
- package/registry/onboarding.json +95 -0
- package/registry/otp-input.json +150 -0
- package/registry/page-header.json +1 -1
- package/registry/page-hero.json +1 -1
- package/registry/page.json +1 -1
- package/registry/pagination.json +1 -1
- package/registry/permission-prompt.json +172 -0
- package/registry/pointer-light.json +1 -1
- package/registry/popover.json +1 -1
- package/registry/pricing-page.json +1 -1
- package/registry/product-page.json +1 -1
- package/registry/profile-card.json +1 -1
- package/registry/progress.json +2 -2
- package/registry/promise-card.json +1 -1
- package/registry/pull-to-refresh.json +74 -0
- package/registry/radio-group.json +228 -16
- package/registry/scroll-stage.json +1 -1
- package/registry/search-field.json +30 -3
- package/registry/section-backdrop.json +1 -1
- package/registry/separator.json +1 -1
- package/registry/settings-layout.json +1 -1
- package/registry/skeleton.json +1 -1
- package/registry/slider.json +315 -14
- package/registry/slot.json +1 -1
- package/registry/spinner.json +1 -1
- package/registry/split-view.json +1 -1
- package/registry/stage-banner.json +1 -1
- package/registry/stat.json +68 -5
- package/registry/status-page.json +1 -1
- package/registry/stepper.json +75 -4
- package/registry/swipeable-row.json +124 -0
- package/registry/switch.json +116 -4
- package/registry/tab-bar.json +115 -0
- package/registry/tabs.json +96 -6
- package/registry/tag-input.json +1 -1
- package/registry/terminal-replay.json +1 -1
- package/registry/theme.json +8 -1
- package/registry/toast.json +17 -3
- package/registry/toc.json +1 -1
- package/registry/tooltip.json +1 -1
- package/registry/tree-view.json +291 -0
- package/registry/video-player.json +1 -1
- package/registry/video-trimmer.json +1 -1
- package/registry/virtual.json +1 -1
- package/skills/choice-controls/SKILL.md +39 -0
- package/skills/form/SKILL.md +3 -0
- package/skills/map/SKILL.md +35 -0
- package/dist/chunk-I5RVM5CW.js.map +0 -1
- package/dist/chunk-RUPRYJ45.js +0 -82
- package/dist/chunk-RUPRYJ45.js.map +0 -1
package/dist/data-table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-table/csv.ts","../src/data-table/data-table.tsx","../src/checkbox/checkbox.tsx","../src/pagination/pagination.tsx","../src/data-table/engine.ts","../src/button/button.tsx","../src/spinner/glyph.tsx","../src/field/field.tsx","../src/data-table/toolbar.tsx"],"sourcesContent":["// CSV (RFC 4180) from rows and columns: the header of each column, then each row's values — what `value` returns (or\n// `row[id]`), never the rendered cell. Dates as ISO 8601; a value that a spreadsheet would run as a formula is quoted\n// with a leading apostrophe (CSV injection).\nimport type { CellValue } from \"./engine\";\n\ntype CsvColumn<T> = { id: string; header: string; value?: (row: T) => CellValue };\n\nconst FORMULA = /^[=+\\-@\\t\\r]/;\n\nfunction field(value: CellValue): string {\n let text = value == null ? \"\" : value instanceof Date ? value.toISOString() : String(value);\n if (typeof value === \"string\" && FORMULA.test(text)) text = `'${text}`;\n return /[\",\\n\\r;]/.test(text) || text !== text.trim() ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/** The rows as CSV text: a header line, then one line per row, separated by `\\r\\n`. */\nexport function dataTableCsv<T>(rows: readonly T[], columns: readonly CsvColumn<T>[], separator = \",\"): string {\n const lines = [columns.map((column) => field(column.header)).join(separator)];\n for (const row of rows) {\n lines.push(columns.map((column) => field(column.value ? column.value(row) : ((row as Record<string, unknown>)[column.id] as CellValue))).join(separator));\n }\n return lines.join(\"\\r\\n\");\n}\n","// Client (the table's state, the windowing of long lists). A real `<table>` with a caption and column headers\n// (`scope=\"col\"`, `aria-sort` on the sorted one) that turns into a stack of cards in a narrow container — one DOM, the\n// roles written out so that the change of `display` never loses the table's semantics. The engine is TanStack Table v9\n// (engine.ts): sorting, filters and facets, grouping, expanding, pagination, selection, visibility, pinning, resizing —\n// in the browser, or on the server (`manual` + `onStateChange`). Long lists render by what is in view (`virtualized`).\nimport { useTable } from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Checkbox } from \"../checkbox\";\nimport { ChevronGlyph, SortGlyph } from \"../glyphs\";\nimport { useControllable } from \"../media\";\nimport { Pagination, type PaginationLabels } from \"../pagination\";\nimport { useLayoutFallbacks, useVirtualizer } from \"../virtual/virtual\";\nimport {\n type CellValue,\n type ColumnDef,\n type ColumnResizingState,\n type DataTableFilterState,\n type DataTableInstance,\n features,\n FILTERS,\n type FilterValue,\n type RowData,\n sortByValue,\n type TableCell,\n type TableColumn,\n type TableRow,\n} from \"./engine\";\n\nexport const dataTable = tv({\n slots: {\n root: \"@container w-full overflow-hidden rounded-xl border border-border-default bg-surface-1\",\n toolbar: \"border-b border-border-default p-3\",\n scroller: \"w-full overflow-x-auto\",\n table: \"w-full border-collapse text-left text-sm text-fg\",\n caption: \"px-4 pt-4 pb-2 text-left text-sm font-semibold text-fg\",\n thead: \"bg-surface-2/60\",\n headRow: \"border-b border-border-default\",\n th: \"relative whitespace-nowrap px-4 py-3 text-xs font-semibold text-fg-secondary\",\n sortButton:\n \"-mx-1.5 inline-flex items-center gap-1 rounded-md px-1.5 py-1 hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-[pressed=true]:text-fg\",\n resizer:\n \"absolute top-0 right-0 h-full w-1.5 cursor-col-resize touch-none select-none bg-transparent hover:bg-border-strong \" +\n \"focus-visible:bg-accent focus-visible:outline-hidden data-[resizing]:bg-accent\",\n tbody: \"\",\n tr: \"border-b border-border-subtle transition-colors last:border-b-0 hover:bg-surface-2/50 data-[state=selected]:bg-accent-soft\",\n groupRow: \"bg-surface-2/40 font-semibold\",\n td: \"px-4 py-3 align-middle\",\n select: \"w-10\",\n expander: \"w-10\",\n toggle:\n \"inline-flex h-7 min-w-7 items-center justify-center gap-1.5 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 [&[aria-expanded=true]>svg]:rotate-90 [&>svg]:transition-transform motion-reduce:[&>svg]:transition-none\",\n detail: \"bg-surface-0 px-4 py-4\",\n message: \"px-4 py-10 text-center text-sm text-fg-secondary\",\n skeleton: \"h-4 w-full max-w-40 animate-pulse rounded bg-surface-3 motion-reduce:animate-none\",\n footer: \"border-t border-border-default px-4 py-3\",\n },\n variants: {\n layout: {\n table: {\n th: \"data-[pin]:sticky data-[pin]:z-[2] data-[pin]:bg-surface-2 data-[pin=start]:left-(--dt-pin) data-[pin=end]:right-(--dt-pin)\",\n td: \"data-[pin]:sticky data-[pin]:z-[1] data-[pin]:bg-surface-1 data-[pin=start]:left-(--dt-pin) data-[pin=end]:right-(--dt-pin)\",\n },\n // Below 36rem of container: cards. The sortable headers stay, as a row of sort buttons above the cards.\n auto: {\n table: \"@max-xl:block\",\n caption: \"@max-xl:block\",\n thead: \"@max-xl:sr-only @max-xl:bg-transparent @max-xl:has-[[data-keep]]:not-sr-only @max-xl:has-[[data-keep]]:block\",\n headRow: \"@max-xl:flex @max-xl:flex-wrap @max-xl:items-center @max-xl:gap-2 @max-xl:px-3 @max-xl:py-2\",\n th:\n \"@max-xl:sr-only @max-xl:data-[keep]:not-sr-only @max-xl:data-[keep]:block @max-xl:p-0 \" +\n \"@xl:data-[pin]:sticky @xl:data-[pin]:z-[2] @xl:data-[pin]:bg-surface-2 @xl:data-[pin=start]:left-(--dt-pin) @xl:data-[pin=end]:right-(--dt-pin)\",\n tbody: \"@max-xl:grid @max-xl:gap-3 @max-xl:p-3\",\n tr: \"@max-xl:relative @max-xl:grid @max-xl:gap-1.5 @max-xl:rounded-xl @max-xl:border @max-xl:border-border-default @max-xl:bg-surface-0 @max-xl:p-4 @max-xl:last:border-b\",\n td:\n \"@max-xl:flex @max-xl:items-baseline @max-xl:justify-between @max-xl:gap-4 @max-xl:p-0 @max-xl:text-right \" +\n \"@max-xl:before:shrink-0 @max-xl:before:text-xs @max-xl:before:font-semibold @max-xl:before:text-fg-secondary @max-xl:before:content-[attr(data-label)] \" +\n \"@max-xl:data-[card=title]:order-first @max-xl:data-[card=title]:pr-8 @max-xl:data-[card=title]:text-left @max-xl:data-[card=title]:text-base @max-xl:data-[card=title]:font-semibold @max-xl:data-[card=title]:before:content-none \" +\n \"@max-xl:data-[card=hidden]:hidden @max-xl:data-[card=message]:block @max-xl:data-[card=message]:text-center @max-xl:data-[card=message]:before:content-none \" +\n \"@xl:data-[pin]:sticky @xl:data-[pin]:z-[1] @xl:data-[pin]:bg-surface-1 @xl:data-[pin=start]:left-(--dt-pin) @xl:data-[pin=end]:right-(--dt-pin)\",\n select: \"@max-xl:absolute @max-xl:right-3 @max-xl:top-3 @max-xl:w-auto @max-xl:before:content-none\",\n expander: \"@max-xl:before:content-none\",\n },\n cards: {\n table: \"block\",\n caption: \"block\",\n thead: \"sr-only bg-transparent has-[[data-keep]]:not-sr-only has-[[data-keep]]:block\",\n headRow: \"flex flex-wrap items-center gap-2 px-3 py-2\",\n th: \"sr-only p-0 data-[keep]:not-sr-only data-[keep]:block\",\n tbody: \"grid gap-3 p-3\",\n tr: \"relative grid gap-1.5 rounded-xl border border-border-default bg-surface-0 p-4 last:border-b\",\n td:\n \"flex items-baseline justify-between gap-4 p-0 text-right before:shrink-0 before:text-xs before:font-semibold before:text-fg-secondary before:content-[attr(data-label)] \" +\n \"data-[card=title]:order-first data-[card=title]:pr-8 data-[card=title]:text-left data-[card=title]:text-base data-[card=title]:font-semibold data-[card=title]:before:content-none \" +\n \"data-[card=hidden]:hidden data-[card=message]:block data-[card=message]:text-center data-[card=message]:before:content-none\",\n select: \"absolute right-3 top-3 w-auto before:content-none\",\n expander: \"before:content-none\",\n },\n },\n density: {\n comfortable: {},\n compact: { th: \"py-2\", td: \"py-1.5\" },\n },\n },\n defaultVariants: { layout: \"auto\", density: \"comfortable\" },\n});\n\nexport type SortDirection = \"ascending\" | \"descending\";\nexport type DataTableSort = { column: string; direction: SortDirection } | null;\n\n/** What the server needs to fetch a page (`manual` mode): given to `onStateChange` at each change. */\nexport type DataTableQuery = {\n /** The sorted column, or `null`. */\n sort: DataTableSort;\n /** The filters in force, by column id. */\n filters: DataTableFilterState;\n /** The page, from 1 (1 without pagination). */\n page: number;\n /** Rows per page (`Infinity` without pagination). */\n pageSize: number;\n};\n\nexport type DataTableColumn<T> = {\n /** A key of the column (and of the row, for the default value). */\n id: string;\n /** The column's name, passed translated: the header, the label of the value in a card, the filter's name. */\n header: string;\n /** What a cell shows. Default: the value as text. */\n cell?: (row: T) => React.ReactNode;\n /** The value sorted, filtered, grouped and exported. Default `row[id]`. */\n value?: (row: T) => CellValue;\n /** The header becomes a sort button (ascending → descending → none). */\n sortable?: boolean;\n /** How `DataTableFilters` filters it: `text` (a search), `facet` (values to choose), `range` (numbers between bounds). */\n filter?: \"text\" | \"facet\" | \"range\";\n /** The choices of a `facet` filter, with their words (and counts from the server). Default: the values found in the rows. */\n options?: readonly { value: string; label: string; count?: number }[];\n /** The rows can be grouped by this column (`groupBy`). */\n groupable?: boolean;\n /** What a group's row shows in this column, from the group's rows (a sum, a count). */\n aggregate?: (rows: readonly T[]) => React.ReactNode;\n /** Text alignment: `end` for amounts and counts. */\n align?: \"start\" | \"center\" | \"end\";\n /** The width, in px (the starting width when `resizing`). */\n width?: number;\n /** The narrowest a resized column may be, in px. Default 64. */\n minWidth?: number;\n /** In a card: `title` (the heading of the card), `label` (default: \"Header value\"), `hidden`. */\n card?: \"title\" | \"label\" | \"hidden\";\n /** Hides the header visually (an actions column), keeping it for screen readers. */\n headerHidden?: boolean;\n /** Listed in `DataTableColumnsMenu`, so a person can hide it. Default `true`. */\n hideable?: boolean;\n};\n\nexport type DataTableLabels = {\n /** The checkbox of the header (\"Select all rows\"). */\n selectAll: string;\n /** The checkbox of a row: `(name) => \"Select \" + name`, the name from `rowLabel`. */\n selectRow: (name: string) => string;\n /** Read while the rows load (\"Loading\"). */\n loading: string;\n /** The default empty state (\"Nothing to show\"). */\n empty: string;\n /** The header of the column of the expand buttons, for screen readers (\"Details\"). */\n details: string;\n /** The button that opens a row: `(name) => \"Show details of \" + name`. */\n expandRow: (name: string) => string;\n /** The button of a group's row: `(value, count) => value + \", \" + count + \" rows\"`. */\n group: (value: string, count: number) => string;\n /** The handle that resizes a column: `(header) => \"Resize \" + header`. */\n resize: (header: string) => string;\n /** The count of results under the filters: `(count) => count + \" rows\"`. */\n results: (count: number) => string;\n /** The accessible name of the filters' bar (\"Filter the table\"). */\n filters: string;\n /** \"Clear filters\". */\n clearFilters: string;\n /** A filter's chip remove button: `(label) => \"Remove \" + label`. */\n removeFilter: (label: string) => string;\n /** The words of a filter in force: `(header, value) => header + \": \" + value`. */\n activeFilter: (header: string, value: string) => string;\n /** A `text` filter's field: `(header) => \"Search \" + header`. */\n search: (header: string) => string;\n /** The lower bound of a `range` filter: `(header) => header + \" from\"`. */\n rangeFrom: (header: string) => string;\n /** The upper bound of a `range` filter: `(header) => header + \" to\"`. */\n rangeTo: (header: string) => string;\n /** The button of the columns menu (\"Columns\"). */\n columns: string;\n /** The export button (\"Export CSV\"). */\n export: string;\n /** The words of the pagination under the table. */\n pagination?: Partial<PaginationLabels>;\n};\n\nexport const dataTableLabels: DataTableLabels = {\n selectAll: \"Select all rows\",\n selectRow: (name) => `Select ${name}`,\n loading: \"Loading\",\n empty: \"Nothing to show\",\n details: \"Details\",\n expandRow: (name) => `Show details of ${name}`,\n group: (value, count) => `${value}, ${count} ${count === 1 ? \"row\" : \"rows\"}`,\n resize: (header) => `Resize ${header}`,\n results: (count) => `${count.toLocaleString(\"en\")} ${count === 1 ? \"row\" : \"rows\"}`,\n filters: \"Filter the table\",\n clearFilters: \"Clear filters\",\n removeFilter: (label) => `Remove ${label}`,\n activeFilter: (header, value) => `${header}: ${value}`,\n search: (header) => `Search ${header.toLocaleLowerCase()}`,\n rangeFrom: (header) => `${header} from`,\n rangeTo: (header) => `${header} to`,\n columns: \"Columns\",\n export: \"Export CSV\",\n};\n\nexport type DataTableProps<T> = {\n /** The rows (stable: module scope, state or a query's data). Sorted, filtered and paginated here unless `manual`. */\n rows: readonly T[];\n /** The columns, in order (stable: module scope or `useMemo`). */\n columns: readonly DataTableColumn<T>[];\n /** A stable id per row: the React key, the selection's value, the expansion's key. */\n getRowId: (row: T) => string;\n /** What the table lists (\"Jobs\", \"Your videos\"): its `<caption>`, hidden unless `showCaption`. */\n caption: string;\n /** Shows the caption above the table. */\n showCaption?: boolean;\n\n /** The sorted column (controlled), `null` for none. */\n sort?: DataTableSort;\n /** The sort at first, uncontrolled. */\n defaultSort?: DataTableSort;\n /** Called when a header asks for a new sort. */\n onSortChange?: (sort: DataTableSort) => void;\n\n /** The filters in force (controlled), by column id — what `DataTableFilters` edits. */\n filters?: DataTableFilterState;\n /** The filters at first, uncontrolled. */\n defaultFilters?: DataTableFilterState;\n /** Called with the new filters. */\n onFiltersChange?: (filters: DataTableFilterState) => void;\n\n /** Adds a checkbox per row and one in the header. */\n selectable?: boolean;\n /** The ids selected (controlled). */\n selected?: readonly string[];\n /** The ids selected at first, uncontrolled. */\n defaultSelected?: readonly string[];\n /** Called with the new selection. */\n onSelectedChange?: (selected: string[]) => void;\n /** The name of a row in its labels (checkbox, expand button). Default: its id. */\n rowLabel?: (row: T) => string;\n\n /** The columns the rows are grouped by, in order (controlled) — each `groupable`. */\n groupBy?: readonly string[];\n /** The grouping at first, uncontrolled. */\n defaultGroupBy?: readonly string[];\n /** Called with the new grouping. */\n onGroupByChange?: (groupBy: string[]) => void;\n\n /** Visible (`true`) or hidden (`false`) columns, by id (controlled); a column not listed is visible. */\n columnVisibility?: Readonly<Record<string, boolean>>;\n /** The visibility at first, uncontrolled. */\n defaultColumnVisibility?: Readonly<Record<string, boolean>>;\n /** Called with the new visibility (`DataTableColumnsMenu`). */\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n\n /** Columns that stay in view while the table scrolls sideways: at the start (a name) or the end (actions). */\n pinning?: { start?: readonly string[]; end?: readonly string[] };\n /** Columns can be resized (pointer drag, or the arrow keys on the focused handle). */\n resizing?: boolean;\n\n /** The children of a row (a tree): each row with children gets a button that shows them. */\n getSubRows?: (row: T) => readonly T[] | undefined;\n /** A panel under an opened row (the details of a job): each row gets a button that opens it. */\n renderDetail?: (row: T) => React.ReactNode;\n /** The opened rows and groups (controlled), by id. */\n expanded?: Readonly<Record<string, boolean>>;\n /** The opened rows at first, uncontrolled. */\n defaultExpanded?: Readonly<Record<string, boolean>>;\n /** Called with the opened rows. */\n onExpandedChange?: (expanded: Record<string, boolean>) => void;\n\n /** Rows per page (controlled): turns on the pagination under the table. */\n pageSize?: number;\n /** Rows per page at first, uncontrolled: turns on the pagination under the table. */\n defaultPageSize?: number;\n /** Called with the size chosen in the pagination's select (`pageSizeOptions`). */\n onPageSizeChange?: (pageSize: number) => void;\n /** The sizes the pagination offers (`[10, 25, 50]`). */\n pageSizeOptions?: readonly number[];\n /** The page, from 1 (controlled). */\n page?: number;\n /** The page at first, uncontrolled. Default 1. */\n defaultPage?: number;\n /** Called with the page asked for. */\n onPageChange?: (page: number) => void;\n\n /** The server does the work: the rows are shown as given (sorted, filtered, a single page) — fetch in `onStateChange`. */\n manual?: { sorting?: boolean; filtering?: boolean; pagination?: boolean };\n /** The number of rows on the server (`manual.pagination`): the page count and the results' count. */\n rowCount?: number;\n /** Called with the sort, the filters and the page after each change: the query key of a server table. */\n onStateChange?: (query: DataTableQuery) => void;\n\n /** Rows are loading: skeleton rows (`loadingRows` of them) and `aria-busy`. */\n loading?: boolean;\n /** How many skeleton rows while loading. Default 5. */\n loadingRows?: number;\n /** A failure, shown in place of the rows (an `Alert`, a retry button); announced. */\n error?: React.ReactNode;\n /** Shown when there is no row (an `EmptyState`). Default: `labels.empty`. */\n empty?: React.ReactNode;\n\n /** `auto` (default): a table, cards below 36rem of container width. `table` or `cards` to force one. */\n layout?: \"auto\" | \"table\" | \"cards\";\n /** comfortable (default) · compact. */\n density?: \"comfortable\" | \"compact\";\n /** Renders only the rows in view, in a scrolling body of `height` px; rows are measured (`estimateRowHeight` is a guess). Forces the table layout. */\n virtualized?: { height: number; estimateRowHeight?: number; overscan?: number };\n\n /** Above the table, inside its frame: `DataTableFilters`, `DataTableColumnsMenu`, `DataTableExport`, actions. */\n toolbar?: React.ReactNode;\n /** Under the table (after the pagination): a total, a note. */\n footer?: React.ReactNode;\n /** The words, passed translated; English by default. */\n labels?: Partial<DataTableLabels>;\n /** Classes merged on the root. */\n className?: string;\n};\n\ntype Context = {\n table: DataTableInstance<object>;\n columns: readonly DataTableColumn<object>[];\n labels: DataTableLabels;\n filters: DataTableFilterState;\n setFilters: (filters: DataTableFilterState) => void;\n /** The rows after the filters (all pages), or the server's count. */\n resultCount: number;\n /** The rows to export: filtered and sorted, every page, without the group rows. */\n exportRows: () => readonly unknown[];\n manualFiltering: boolean;\n};\n\nconst DataTableContext = React.createContext<Context | null>(null);\n\n/**\n * The table a component sits in (`toolbar`, or anything under it): the TanStack Table instance (`table` — the escape\n * hatch for what the props do not cover), the columns, the words, the filters and their setter.\n */\nexport function useDataTable<T extends RowData = object>() {\n const context = React.useContext(DataTableContext);\n if (!context) throw new Error(\"useDataTable: call it inside a DataTable (its `toolbar`, `footer` or a cell)\");\n return context as unknown as Omit<Context, \"table\" | \"columns\" | \"exportRows\"> & {\n table: DataTableInstance<T>;\n columns: readonly DataTableColumn<T>[];\n exportRows: () => readonly T[];\n };\n}\n\nconst ALIGN = { start: \"text-left\", center: \"text-center\", end: \"text-right\" } as const;\nconst NONE: readonly never[] = [];\nconst NO_RECORD: Readonly<Record<string, never>> = {};\nconst apply = <S,>(updater: S | ((old: S) => S), old: S): S => (typeof updater === \"function\" ? (updater as (old: S) => S)(old) : updater);\n\nconst valueOf = <T,>(column: DataTableColumn<T>, row: T): CellValue =>\n column.value ? column.value(row) : ((row as Record<string, unknown>)[column.id] as CellValue);\n\nconst display = (value: CellValue) => (value instanceof Date ? value.toISOString() : String(value ?? \"\"));\n\n/** A table of records — sort, filters and facets, groups, details, pages, selection, visibility, pinning, resizing — on the client or the server, cards on a phone, windowing for long lists. */\nexport function DataTable<T extends RowData>({\n rows,\n columns,\n getRowId,\n caption,\n showCaption,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n filters: filtersProp,\n defaultFilters = NO_RECORD,\n onFiltersChange,\n selectable,\n selected: selectedProp,\n defaultSelected = NONE,\n onSelectedChange,\n rowLabel,\n groupBy: groupByProp,\n defaultGroupBy = NONE,\n onGroupByChange,\n columnVisibility: visibilityProp,\n defaultColumnVisibility = NO_RECORD,\n onColumnVisibilityChange,\n pinning,\n resizing,\n getSubRows,\n renderDetail,\n expanded: expandedProp,\n defaultExpanded = NO_RECORD,\n onExpandedChange,\n pageSize: pageSizeProp,\n defaultPageSize,\n onPageSizeChange,\n pageSizeOptions,\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n manual,\n rowCount,\n onStateChange,\n loading,\n loadingRows = 5,\n error,\n empty,\n layout = \"auto\",\n density,\n virtualized,\n toolbar,\n footer,\n labels: given,\n className,\n}: DataTableProps<T>) {\n const labels = { ...dataTableLabels, ...given };\n const effectiveLayout = virtualized ? \"table\" : layout;\n const s = dataTable({ layout: effectiveLayout, density });\n\n const [sort, setSort] = useControllable<DataTableSort>(sortProp, defaultSort, onSortChange);\n const [filters, setFiltersState] = useControllable<DataTableFilterState>(filtersProp, defaultFilters, onFiltersChange);\n const [selected, setSelected] = useControllable<readonly string[]>(selectedProp, defaultSelected, onSelectedChange as (next: readonly string[]) => void);\n const [groupBy, setGroupBy] = useControllable<readonly string[]>(groupByProp, defaultGroupBy, onGroupByChange as (next: readonly string[]) => void);\n const [visibility, setVisibility] = useControllable<Readonly<Record<string, boolean>>>(visibilityProp, defaultColumnVisibility, onColumnVisibilityChange as (next: Readonly<Record<string, boolean>>) => void);\n const [expanded, setExpanded] = useControllable<Readonly<Record<string, boolean>>>(expandedProp, defaultExpanded, onExpandedChange as (next: Readonly<Record<string, boolean>>) => void);\n const paginated = pageSizeProp !== undefined || defaultPageSize !== undefined;\n const [pageSize, setPageSize] = useControllable<number>(pageSizeProp, defaultPageSize ?? Number.POSITIVE_INFINITY, onPageSizeChange);\n const [page, setPage] = useControllable<number>(pageProp, defaultPage, onPageChange);\n const [sizing, setSizing] = React.useState<Record<string, number>>({});\n const [resizeState, setResizeState] = React.useState<ColumnResizingState | undefined>(undefined);\n\n // One place announces the server's query: after any change of sort, filters, page or page size.\n const announce = (next: Partial<DataTableQuery>) =>\n onStateChange?.({ sort, filters, page: paginated ? page : 1, pageSize: paginated ? pageSize : Number.POSITIVE_INFINITY, ...next });\n const changeSort = (next: DataTableSort) => {\n setSort(next);\n if (paginated && page !== 1) setPage(1);\n announce({ sort: next, page: 1 });\n };\n const changeFilters = (next: DataTableFilterState) => {\n setFiltersState(next);\n if (paginated && page !== 1) setPage(1);\n announce({ filters: next, page: 1 });\n };\n const changePage = (next: number) => {\n setPage(next);\n announce({ page: next });\n };\n const changePageSize = (next: number) => {\n setPageSize(next);\n setPage(1);\n announce({ pageSize: next, page: 1 });\n };\n\n const hasExpander = Boolean(renderDetail || getSubRows);\n const defs = React.useMemo<ColumnDef<typeof features, T>[]>(\n () =>\n columns.map((column) => ({\n id: column.id,\n accessorFn: (row: T) => valueOf(column, row),\n header: column.header,\n enableSorting: Boolean(column.sortable),\n sortFn: sortByValue as never,\n sortUndefined: \"last\",\n enableColumnFilter: Boolean(column.filter),\n filterFn: (column.filter ? FILTERS[column.filter] : FILTERS.text) as never,\n enableGrouping: Boolean(column.groupable),\n enableHiding: column.hideable !== false,\n enableResizing: Boolean(resizing),\n ...(column.width ? { size: column.width } : {}),\n minSize: column.minWidth ?? 64,\n })),\n [columns, resizing],\n );\n\n const pageIndex = Math.max(0, page - 1);\n const table = useTable<typeof features, T>({\n features,\n columns: defs,\n data: rows as T[],\n getRowId: (row) => getRowId(row),\n getSubRows: getSubRows ? (row) => getSubRows(row) as T[] | undefined : undefined,\n getRowCanExpand: renderDetail ? () => true : undefined,\n state: {\n sorting: sort ? [{ id: sort.column, desc: sort.direction === \"descending\" }] : [],\n columnFilters: Object.entries(filters).map(([id, value]) => ({ id, value })),\n rowSelection: Object.fromEntries(selected.map((id) => [id, true])),\n grouping: [...groupBy],\n columnVisibility: { ...visibility },\n expanded: { ...expanded },\n pagination: { pageIndex, pageSize: paginated ? pageSize : Math.max(1, rows.length) },\n columnPinning: { start: [...(pinning?.start ?? [])], end: [...(pinning?.end ?? [])] },\n columnSizing: sizing,\n ...(resizeState ? { columnResizing: resizeState } : {}),\n },\n onSortingChange: (updater) => {\n const [first] = apply(updater, sort ? [{ id: sort.column, desc: sort.direction === \"descending\" }] : []);\n changeSort(first ? { column: first.id, direction: first.desc ? \"descending\" : \"ascending\" } : null);\n },\n onColumnFiltersChange: (updater) => {\n const next = apply(updater, Object.entries(filters).map(([id, value]) => ({ id, value })));\n changeFilters(Object.fromEntries(next.map((f) => [f.id, f.value as FilterValue])));\n },\n onRowSelectionChange: (updater) => {\n const next = apply(updater, Object.fromEntries(selected.map((id) => [id, true])));\n setSelected(Object.keys(next).filter((id) => next[id]));\n },\n onGroupingChange: (updater) => setGroupBy(apply(updater, [...groupBy])),\n onColumnVisibilityChange: (updater) => setVisibility(apply(updater, { ...visibility })),\n onExpandedChange: (updater) => {\n const next = apply(updater, { ...expanded });\n setExpanded(next === true ? Object.fromEntries(table.getRowModel().rows.map((r) => [r.id, true])) : next);\n },\n onColumnSizingChange: (updater) => setSizing((old: Record<string, number>) => apply(updater, old)),\n onColumnResizingChange: (updater) => setResizeState((old) => apply(updater, old as ColumnResizingState)),\n enableSortingRemoval: true,\n sortDescFirst: false,\n manualSorting: manual?.sorting,\n manualFiltering: manual?.filtering,\n manualPagination: manual?.pagination || !paginated,\n rowCount: manual?.pagination ? rowCount : undefined,\n autoResetPageIndex: false,\n autoResetExpanded: false,\n groupedColumnMode: false,\n columnResizeMode: \"onChange\",\n enableRowSelection: (row) => !row.getIsGrouped(),\n });\n\n const visibleColumns = table.getVisibleLeafColumns();\n const byId = new Map(columns.map((c) => [c.id, c]));\n const pageRows = table.getRowModel().rows;\n const leafCount = (manual?.pagination || manual?.filtering) && rowCount !== undefined ? rowCount : table.getFilteredRowModel().rows.length;\n const pageCount = paginated ? Math.max(1, manual?.pagination ? Math.ceil((rowCount ?? rows.length) / pageSize) : table.getPageCount()) : 1;\n // A page beyond the last (the filters shrank the list): show the last one.\n React.useEffect(() => {\n if (paginated && !loading && page > pageCount) changePage(pageCount);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only when the count of pages drops under the page\n }, [pageCount]);\n\n const selectableIds = pageRows.filter((r) => !r.getIsGrouped()).map((r) => r.id);\n const chosen = new Set(selected);\n const allChosen = selectableIds.length > 0 && selectableIds.every((id) => chosen.has(id));\n const someChosen = selectableIds.some((id) => chosen.has(id));\n const toggleAll = () =>\n setSelected(allChosen ? selected.filter((id) => !selectableIds.includes(id)) : [...new Set([...selected, ...selectableIds])]);\n\n const span = visibleColumns.length + (selectable ? 1 : 0) + (hasExpander ? 1 : 0);\n const fixedLayout = Boolean(resizing || pinning?.start?.length || pinning?.end?.length);\n const nameOf = (row: TableRow<T>) => (rowLabel ? rowLabel(row.original) : row.id);\n\n // Windowing: the rows in view, between two spacer rows that keep the scroll height.\n const scroller = React.useRef<HTMLDivElement>(null);\n const fallbacks = useLayoutFallbacks(virtualized?.height ?? 0, virtualized?.estimateRowHeight ?? 44);\n const virtualizer = useVirtualizer({\n ...fallbacks,\n count: pageRows.length,\n getScrollElement: () => scroller.current,\n estimateSize: () => virtualized?.estimateRowHeight ?? 44,\n overscan: virtualized?.overscan ?? 6,\n initialRect: { width: 0, height: virtualized?.height ?? 0 },\n getItemKey: (index) => pageRows[index]?.id ?? index,\n enabled: Boolean(virtualized) && !loading,\n });\n const windowItems = virtualized && !loading ? virtualizer.getVirtualItems() : null;\n const before = windowItems?.[0]?.start ?? 0;\n const after = windowItems && windowItems.length > 0 ? virtualizer.getTotalSize() - (windowItems.at(-1)?.end ?? 0) : 0;\n\n const pin = (column: TableColumn<T>): { \"data-pin\"?: \"start\" | \"end\"; style?: React.CSSProperties } => {\n const position = column.getIsPinned();\n if (!position) return {};\n const offset = position === \"start\" ? column.getStart(\"start\") : column.getAfter(\"end\");\n return { \"data-pin\": position, style: { [\"--dt-pin\" as string]: `${offset}px` } };\n };\n const width = (column: TableColumn<T>): React.CSSProperties | undefined =>\n fixedLayout || byId.get(column.id)?.width ? { width: column.getSize() } : undefined;\n\n const message = (content: React.ReactNode, alert?: boolean) => (\n <tr role=\"row\" className={s.tr({ className: \"hover:bg-transparent\" })}>\n <td role=\"cell\" colSpan={span} data-card=\"message\" className={s.td({ className: s.message() })}>\n {alert ? <div role=\"alert\">{content}</div> : content}\n </td>\n </tr>\n );\n\n const cardOf = (column: DataTableColumn<T> | undefined) => (column?.card === \"title\" ? \"title\" : column?.card === \"hidden\" ? \"hidden\" : undefined);\n\n const dataCell = (row: TableRow<T>, cell: TableCell<T>, first: boolean) => {\n const column = byId.get(cell.column.id);\n if (!column) return null;\n const { style, ...pinned } = pin(cell.column);\n let content: React.ReactNode;\n if (row.getIsGrouped()) {\n const leaves = row.getLeafRows().filter((r) => !r.getIsGrouped()).map((r) => r.original);\n if (cell.column.id === row.groupingColumnId) {\n const value = display(row.groupingValue as CellValue);\n content = (\n <button type=\"button\" className={s.toggle({ className: \"px-1.5 font-semibold text-fg\" })} aria-expanded={row.getIsExpanded()} onClick={row.getToggleExpandedHandler()}>\n <ChevronGlyph direction=\"right\" className=\"h-4 w-4\" />\n {labels.group(value, leaves.length)}\n </button>\n );\n } else content = column.aggregate ? column.aggregate(leaves) : null;\n } else content = column.cell ? column.cell(row.original) : display(valueOf(column, row.original));\n return (\n <td\n role=\"cell\"\n key={cell.id}\n data-label={column.header}\n data-card={row.getIsGrouped() ? (cell.column.id === row.groupingColumnId ? \"title\" : column.aggregate ? undefined : \"hidden\") : cardOf(column)}\n {...pinned}\n className={s.td({ className: ALIGN[column.align ?? \"start\"] })}\n style={{ ...style, ...(first && row.depth > 0 && !row.getIsGrouped() ? { paddingInlineStart: `${1 + row.depth * 1.25}rem` } : {}) }}\n >\n {content}\n </td>\n );\n };\n\n const renderRow = (row: TableRow<T>, index: number) => {\n const isChosen = chosen.has(row.id);\n const grouped = row.getIsGrouped();\n const canExpand = !grouped && (renderDetail ? true : row.getCanExpand());\n const cells = row.getVisibleCells();\n const main = (\n <tr\n role=\"row\"\n key={row.id}\n data-index={windowItems ? index : undefined}\n ref={windowItems ? virtualizer.measureElement : undefined}\n aria-rowindex={virtualized ? index + 2 : undefined}\n data-state={isChosen ? \"selected\" : undefined}\n data-group={grouped ? \"\" : undefined}\n className={s.tr({ className: grouped ? s.groupRow() : undefined })}\n >\n {selectable && (\n <td role=\"cell\" className={s.td({ className: s.select() })}>\n {grouped ? null : <Checkbox checked={isChosen} onCheckedChange={() => row.toggleSelected()} aria-label={labels.selectRow(nameOf(row))} />}\n </td>\n )}\n {hasExpander && (\n <td role=\"cell\" className={s.td({ className: s.expander() })}>\n {canExpand ? (\n <button type=\"button\" className={s.toggle()} aria-expanded={row.getIsExpanded()} aria-label={labels.expandRow(nameOf(row))} onClick={row.getToggleExpandedHandler()}>\n <ChevronGlyph direction=\"right\" className=\"h-4 w-4\" />\n </button>\n ) : null}\n </td>\n )}\n {cells.map((cell, i) => dataCell(row, cell, i === 0))}\n </tr>\n );\n if (!renderDetail || grouped || !row.getIsExpanded() || virtualized) return main;\n return (\n <React.Fragment key={row.id}>\n {main}\n <tr role=\"row\" className={s.tr({ className: \"hover:bg-transparent\" })}>\n <td role=\"cell\" colSpan={span} data-card=\"message\" className={s.td({ className: s.detail() })}>\n {renderDetail(row.original)}\n </td>\n </tr>\n </React.Fragment>\n );\n };\n\n let body: React.ReactNode;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) => (\n <tr role=\"row\" key={`loading-${i}`} aria-hidden className={s.tr()}>\n {selectable && <td role=\"cell\" className={s.td({ className: s.select() })} />}\n {hasExpander && <td role=\"cell\" className={s.td({ className: s.expander() })} />}\n {visibleColumns.map((column) => (\n <td role=\"cell\" key={column.id} data-card={cardOf(byId.get(column.id))} className={s.td()}>\n <div className={s.skeleton()} />\n </td>\n ))}\n </tr>\n ));\n } else if (error) body = message(error, true);\n else if (pageRows.length === 0) body = message(empty ?? labels.empty);\n else if (windowItems) body = windowItems.map((item) => renderRow(pageRows[item.index] as TableRow<T>, item.index));\n else body = pageRows.map((row, i) => renderRow(row, i));\n\n const headers = table.getHeaderGroups().at(-1)?.headers ?? [];\n const tableElement = (\n <table\n role=\"table\"\n aria-busy={loading || undefined}\n aria-rowcount={virtualized ? pageRows.length + 1 : undefined}\n className={s.table({ className: fixedLayout ? \"table-fixed\" : undefined })}\n style={fixedLayout ? { minWidth: table.getTotalSize() + (selectable ? 40 : 0) + (hasExpander ? 40 : 0) } : undefined}\n >\n <caption className={showCaption ? s.caption() : \"sr-only\"}>\n {caption}\n {loading ? <span className=\"sr-only\">{` — ${labels.loading}`}</span> : null}\n </caption>\n <thead role=\"rowgroup\" className={s.thead({ className: virtualized ? \"sticky top-0 z-10 bg-surface-2\" : undefined })}>\n <tr role=\"row\" aria-rowindex={virtualized ? 1 : undefined} className={s.headRow()}>\n {selectable && (\n <th role=\"columnheader\" scope=\"col\" data-keep=\"\" className={s.th({ className: s.select() })}>\n <Checkbox\n checked={allChosen ? true : someChosen ? \"indeterminate\" : false}\n onCheckedChange={toggleAll}\n disabled={loading || selectableIds.length === 0}\n aria-label={labels.selectAll}\n />\n </th>\n )}\n {hasExpander && (\n <th role=\"columnheader\" scope=\"col\" className={s.th({ className: s.expander() })}>\n <span className=\"sr-only\">{labels.details}</span>\n </th>\n )}\n {headers.map((header) => {\n const column = byId.get(header.column.id);\n if (!column) return null;\n const sorted = header.column.getIsSorted();\n const direction: SortDirection | undefined = sorted === \"asc\" ? \"ascending\" : sorted === \"desc\" ? \"descending\" : undefined;\n const { style, ...pinned } = pin(header.column);\n return (\n <th\n role=\"columnheader\"\n scope=\"col\"\n key={header.id}\n aria-sort={column.sortable ? (direction ?? \"none\") : undefined}\n data-keep={column.sortable ? \"\" : undefined}\n {...pinned}\n className={s.th({ className: ALIGN[column.align ?? \"start\"] })}\n style={{ ...style, ...width(header.column) }}\n >\n {column.sortable ? (\n <button type=\"button\" aria-pressed={Boolean(direction)} className={s.sortButton()} onClick={() => header.column.toggleSorting(undefined, false)}>\n {column.header}\n <SortGlyph direction={direction} className=\"h-3.5 w-3.5\" />\n </button>\n ) : column.headerHidden ? (\n <span className=\"sr-only\">{column.header}</span>\n ) : (\n column.header\n )}\n {resizing && header.column.getCanResize() ? (\n <ResizeHandle\n label={labels.resize(column.header)}\n size={header.column.getSize()}\n min={column.minWidth ?? 64}\n resizing={header.column.getIsResizing()}\n className={s.resizer()}\n onPointerStart={header.getResizeHandler()}\n onSize={(size) => setSizing((old: Record<string, number>) => ({ ...old, [header.column.id]: size }))}\n />\n ) : null}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody role=\"rowgroup\" className={s.tbody()}>\n {before > 0 && (\n <tr aria-hidden style={{ height: before }}>\n <td colSpan={span} />\n </tr>\n )}\n {body}\n {after > 0 && (\n <tr aria-hidden style={{ height: after }}>\n <td colSpan={span} />\n </tr>\n )}\n </tbody>\n </table>\n );\n\n const context: Context = {\n table: table as unknown as DataTableInstance<object>,\n columns: columns as readonly DataTableColumn<object>[],\n labels,\n filters,\n setFilters: changeFilters,\n resultCount: leafCount,\n exportRows: () => table.getSortedRowModel().flatRows.filter((r) => !r.getIsGrouped()).map((r) => r.original),\n manualFiltering: Boolean(manual?.filtering),\n };\n\n const pagination = paginated ? (\n <Pagination\n page={Math.min(page, pageCount)}\n pageCount={pageCount}\n onPageChange={changePage}\n pageSize={pageSizeOptions ? pageSize : undefined}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={pageSizeOptions ? changePageSize : undefined}\n disabled={loading}\n labels={labels.pagination}\n />\n ) : null;\n\n return (\n <DataTableContext.Provider value={context}>\n <div className={s.root({ className })}>\n {toolbar ? <div className={s.toolbar()}>{toolbar}</div> : null}\n {virtualized ? (\n // A scrolling region the keyboard can reach: Tab lands on it, the arrows scroll it.\n <div\n ref={scroller}\n tabIndex={0}\n role=\"region\"\n aria-label={caption}\n className={s.scroller({ className: \"overflow-y-auto focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\" })}\n style={{ height: virtualized.height }}\n >\n {tableElement}\n </div>\n ) : (\n <div className={s.scroller()}>{tableElement}</div>\n )}\n {pagination || footer ? (\n <div className={s.footer({ className: \"flex flex-col gap-3\" })}>\n {pagination}\n {footer}\n </div>\n ) : null}\n </div>\n </DataTableContext.Provider>\n );\n}\n\n/** The handle on a header's edge: drag it, or focus it and use ← → (Shift for larger steps). */\nfunction ResizeHandle({\n label,\n size,\n min,\n resizing,\n className,\n onPointerStart,\n onSize,\n}: {\n label: string;\n size: number;\n min: number;\n resizing: boolean;\n className: string;\n onPointerStart: (event: unknown) => void;\n onSize: (size: number) => void;\n}) {\n return (\n // A focusable separator is interactive (WAI-ARIA \"window splitter\"): its value is the width, the arrows change it.\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={label}\n aria-valuenow={Math.round(size)}\n aria-valuemin={min}\n tabIndex={0}\n data-resizing={resizing ? \"\" : undefined}\n className={className}\n onMouseDown={onPointerStart}\n onTouchStart={onPointerStart}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n const step = event.shiftKey ? 48 : 16;\n if (event.key === \"ArrowLeft\") onSize(Math.max(min, size - step));\n else if (event.key === \"ArrowRight\") onSize(size + step);\n else return;\n event.preventDefault();\n }}\n />\n );\n}\n","// Client. Radix Checkbox: role=\"checkbox\", aria-checked (true · false · mixed), Space toggles, a hidden input inside a\n// form. It sits in a `Field` like the other controls: `<Field.Label htmlFor={id}>`, `invalid`, aria-describedby.\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const checkbox = tv({\n slots: {\n root:\n \"peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-md border border-border-strong bg-surface-1 text-on-accent transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 \" +\n \"data-[state=checked]:border-accent data-[state=checked]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent \" +\n \"aria-invalid:border-danger aria-invalid:ring-danger/30\",\n indicator: \"flex items-center justify-center\",\n label: \"flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-60\",\n },\n});\n\nfunction Check() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction Dash() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<React.ComponentProps<typeof CheckboxPrimitive.Root>, \"children\"> & {\n /** Marks it invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n /** The text next to the box, clickable: the box and its words in one `<label>`. Otherwise name it with\n * `Field.Label htmlFor` or `aria-label`. */\n children?: React.ReactNode;\n};\n\n/** A checkbox: `checked`/`defaultChecked` (`true` · `false` · `\"indeterminate\"`) + `onCheckedChange`. */\nexport function Checkbox({ invalid, className, children, ...props }: CheckboxProps) {\n const s = checkbox();\n const box = (\n <CheckboxPrimitive.Root\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className: children ? \"mt-0.5\" : className })}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={s.indicator()}>\n {props.checked === \"indeterminate\" ? <Dash /> : <Check />}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n if (!children) return box;\n return (\n <label className={s.label({ className })}>\n {box}\n <span className=\"min-w-0\">{children}</span>\n </label>\n );\n}\n","// Server-safe: no hook, no context. A `<nav>` named by `labels.nav`; the current page is `aria-current=\"page\"`.\n// Two modes: pages (`page` + `pageCount`: numbers with ellipses, which fold into \"Page 3 of 12\" in a narrow container)\n// and cursor (`hasPrevious` / `hasNext`: an API that only knows the next and previous pages). Links (`getHref`) when\n// the page lives in the address — the right default for a list a search engine or a shared link should reach — or\n// buttons (`onPageChange`).\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronGlyph } from \"../glyphs\";\n\nexport const pagination = tv({\n slots: {\n root: \"@container flex w-full flex-wrap items-center justify-between gap-3 text-sm\",\n list: \"flex items-center gap-1\",\n pages: \"hidden items-center gap-1 @md:flex\",\n compact: \"px-2 text-xs font-semibold tabular-nums text-fg-secondary @md:hidden\",\n item:\n \"inline-flex h-9 min-w-9 select-none items-center justify-center gap-1.5 rounded-lg px-2.5 text-sm font-semibold tabular-nums text-fg-secondary \" +\n \"transition-colors hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"aria-[current=page]:bg-accent aria-[current=page]:text-on-accent aria-[current=page]:hover:bg-accent \" +\n \"aria-disabled:pointer-events-none aria-disabled:opacity-40 disabled:pointer-events-none disabled:opacity-40\",\n edge: \"border border-border-default bg-surface-1 px-3\",\n ellipsis: \"inline-flex h-9 min-w-6 items-end justify-center pb-2 text-fg-muted\",\n status: \"text-xs text-fg-secondary tabular-nums\",\n size: \"flex items-center gap-2 text-xs text-fg-secondary\",\n select:\n \"h-9 rounded-lg border border-border-default bg-surface-2 px-2 text-sm text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n },\n});\n\nexport type PaginationLabels = {\n /** The accessible name of the navigation (\"Pagination\", \"Pages of results\"). */\n nav: string;\n /** The previous-page control. */\n previous: string;\n /** The next-page control. */\n next: string;\n /** The accessible name of a page number: `(3) => \"Page 3\"`. */\n page: (page: number) => string;\n /** The folded form, in a narrow container: `(3, 12) => \"Page 3 of 12\"`. */\n compact: (page: number, pageCount: number) => string;\n /** The label of the page-size select (\"Rows per page\"). */\n pageSize: string;\n};\n\n/** The English words, for a quick start — pass your translations through `labels`. */\nexport const paginationLabels: PaginationLabels = {\n nav: \"Pagination\",\n previous: \"Previous\",\n next: \"Next\",\n page: (page) => `Page ${page}`,\n compact: (page, count) => `Page ${page} of ${count}`,\n pageSize: \"Rows per page\",\n};\n\n/**\n * The pages to show: the first and last `boundaries`, the current page and its `siblings`, and `\"…\"` where pages are\n * skipped. A gap of a single page shows that page instead of an ellipsis; few pages are all shown.\n */\nexport function pageRange(page: number, pageCount: number, siblings = 1, boundaries = 1): (number | \"…\")[] {\n // Few enough pages to show them all in the room the folded form takes: no ellipsis.\n if (pageCount <= 2 * boundaries + 2 * siblings + 3) return Array.from({ length: Math.max(0, pageCount) }, (_, i) => i + 1);\n const pages = new Set<number>();\n for (let i = 1; i <= Math.min(boundaries, pageCount); i += 1) pages.add(i);\n for (let i = Math.max(1, pageCount - boundaries + 1); i <= pageCount; i += 1) pages.add(i);\n for (let i = Math.max(1, page - siblings); i <= Math.min(pageCount, page + siblings); i += 1) pages.add(i);\n const sorted = [...pages].sort((a, b) => a - b);\n const out: (number | \"…\")[] = [];\n sorted.forEach((n, i) => {\n const prev = sorted[i - 1];\n if (prev !== undefined && n - prev === 2) out.push(prev + 1);\n else if (prev !== undefined && n - prev > 2) out.push(\"…\");\n out.push(n);\n });\n return out;\n}\n\nexport type PaginationProps = Omit<React.ComponentProps<\"nav\">, \"children\"> & {\n /** Pages mode: the current page, from 1. */\n page?: number;\n /** Pages mode: how many pages there are. Without it, the pagination is in cursor mode. */\n pageCount?: number;\n /** Called with the page asked for (buttons). Ignored for the pages `getHref` turns into links. */\n onPageChange?: (page: number) => void;\n /** The address of a page: the pages become links (crawlable, shareable, the state in the URL). */\n getHref?: (page: number) => string;\n /** Cursor mode: whether there is a previous page. */\n hasPrevious?: boolean;\n /** Cursor mode: whether there is a next page. */\n hasNext?: boolean;\n /** Cursor mode: called by the previous control. */\n onPrevious?: () => void;\n /** Cursor mode: called by the next control. */\n onNext?: () => void;\n /** Pages shown on each side of the current one. Default 1. */\n siblings?: number;\n /** Pages always shown at each end. Default 1. */\n boundaries?: number;\n /** A text beside the controls, read as is: \"41–60 of 1,284\", \"12 results\". */\n status?: React.ReactNode;\n /** The page size, with `pageSizeOptions` and `onPageSizeChange`: a select of rows per page. */\n pageSize?: number;\n /** The sizes offered (`[10, 20, 50]`). */\n pageSizeOptions?: readonly number[];\n /** Called with the size chosen. */\n onPageSizeChange?: (size: number) => void;\n /** Disables every control (a page is loading). */\n disabled?: boolean;\n /** The words, passed translated; English by default. */\n labels?: Partial<PaginationLabels>;\n};\n\ntype ItemProps = {\n href?: string;\n onClick?: () => void;\n disabled?: boolean;\n current?: boolean;\n label: string;\n className: string;\n children: React.ReactNode;\n};\n\nfunction Item({ href, onClick, disabled, current, label, className, children }: ItemProps) {\n const common = { \"aria-label\": label, \"aria-current\": current ? (\"page\" as const) : undefined, className };\n if (href && !disabled) {\n return (\n <a href={href} onClick={onClick} {...common}>\n {children}\n </a>\n );\n }\n if (href) {\n return (\n <a role=\"link\" aria-disabled {...common}>\n {children}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} disabled={disabled} {...common}>\n {children}\n </button>\n );\n}\n\n/** Moves through a long list: page numbers (folded on a narrow screen) or previous / next on a cursor. */\nexport function Pagination({\n page = 1,\n pageCount,\n onPageChange,\n getHref,\n hasPrevious,\n hasNext,\n onPrevious,\n onNext,\n siblings = 1,\n boundaries = 1,\n status,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n disabled,\n labels: given,\n className,\n ...props\n}: PaginationProps) {\n const s = pagination();\n const labels = { ...paginationLabels, ...given };\n const paged = pageCount !== undefined;\n const count = Math.max(1, pageCount ?? 1);\n const current = Math.min(Math.max(1, page), count);\n const canPrevious = paged ? current > 1 : Boolean(hasPrevious);\n const canNext = paged ? current < count : Boolean(hasNext);\n const go = (target: number) => () => onPageChange?.(target);\n const href = (target: number) => (paged && getHref ? getHref(target) : undefined);\n\n return (\n <nav aria-label={labels.nav} className={s.root({ className })} {...props}>\n {status !== undefined || pageSizeOptions ? (\n <div className=\"flex flex-wrap items-center gap-4\">\n {status !== undefined && <p className={s.status()}>{status}</p>}\n {pageSizeOptions && pageSize !== undefined && (\n <label className={s.size()}>\n {labels.pageSize}\n <select\n className={s.select()}\n value={pageSize}\n disabled={disabled}\n onChange={(event) => onPageSizeChange?.(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n ) : null}\n <ul className={s.list()}>\n <li>\n <Item\n href={href(current - 1)}\n onClick={paged ? go(current - 1) : onPrevious}\n disabled={disabled || !canPrevious}\n label={labels.previous}\n className={s.item({ className: s.edge() })}\n >\n <ChevronGlyph direction=\"left\" />\n <span className=\"hidden @lg:inline\">{labels.previous}</span>\n </Item>\n </li>\n {paged && (\n <>\n <li className={s.pages()}>\n <ul className=\"contents\">\n {pageRange(current, count, siblings, boundaries).map((n, i) =>\n n === \"…\" ? (\n <li key={`gap-${i}`} aria-hidden className={s.ellipsis()}>\n …\n </li>\n ) : (\n <li key={n}>\n <Item href={href(n)} onClick={go(n)} disabled={disabled} current={n === current} label={labels.page(n)} className={s.item()}>\n {n}\n </Item>\n </li>\n ),\n )}\n </ul>\n </li>\n <li className={s.compact()}>\n {labels.compact(current, count)}\n </li>\n </>\n )}\n <li>\n <Item\n href={href(current + 1)}\n onClick={paged ? go(current + 1) : onNext}\n disabled={disabled || !canNext}\n label={labels.next}\n className={s.item({ className: s.edge() })}\n >\n <span className=\"hidden @lg:inline\">{labels.next}</span>\n <ChevronGlyph direction=\"right\" />\n </Item>\n </li>\n </ul>\n </nav>\n );\n}\n","// The engine of DataTable: TanStack Table v9 behind the Krizaka facade (ADR-001 — a product imports\n// `@krizaka/ui/data-table`, never `@tanstack/*`). The features are registered once, at module scope (stable input),\n// and the Krizaka API (`sort`, `filters`, `selected`, `page`… in the app's words) is translated to TanStack's state\n// here — nothing else of the component knows TanStack's shapes.\nimport {\n type Cell,\n type Column,\n type ColumnDef,\n columnFacetingFeature,\n columnFilteringFeature,\n columnGroupingFeature,\n columnPinningFeature,\n columnResizingFeature,\n type columnResizingState as ColumnResizingState,\n columnSizingFeature,\n columnVisibilityFeature,\n createExpandedRowModel,\n createFacetedMinMaxValues,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createGroupedRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n type FilterFn,\n type ReactTable,\n type Row,\n type RowData,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n type SortFn,\n tableFeatures,\n} from \"@tanstack/react-table\";\n\nexport const features = tableFeatures({\n columnFilteringFeature,\n filteredRowModel: createFilteredRowModel(),\n columnFacetingFeature,\n facetedRowModel: createFacetedRowModel(),\n facetedUniqueValues: createFacetedUniqueValues(),\n facetedMinMaxValues: createFacetedMinMaxValues(),\n columnGroupingFeature,\n groupedRowModel: createGroupedRowModel(),\n rowSortingFeature,\n sortedRowModel: createSortedRowModel(),\n rowExpandingFeature,\n expandedRowModel: createExpandedRowModel(),\n rowPaginationFeature,\n paginatedRowModel: createPaginatedRowModel(),\n rowSelectionFeature,\n columnVisibilityFeature,\n columnPinningFeature,\n columnSizingFeature,\n columnResizingFeature,\n});\n\nexport type Features = typeof features;\n/** The TanStack Table instance behind a DataTable — the escape hatch of `useDataTable()`. */\nexport type DataTableInstance<T extends RowData> = ReactTable<Features, T>;\nexport type TableRow<T extends RowData> = Row<Features, T>;\nexport type TableCell<T extends RowData> = Cell<Features, T, unknown>;\nexport type TableColumn<T extends RowData> = Column<Features, T, unknown>;\n\n/** What a cell holds for sorting, filtering and the CSV export: a string, a number, a date, a boolean, or nothing. */\nexport type CellValue = string | number | boolean | Date | null | undefined;\n\n/** A filter's value: a text (`text`), the values chosen (`facet`), or bounds, either open (`range`). */\nexport type FilterValue = string | readonly string[] | readonly [number | null, number | null];\n/** The filters in force, by column id. */\nexport type DataTableFilterState = Readonly<Record<string, FilterValue>>;\n\nconst empty = (value: CellValue) => value == null || value === \"\";\n\n/** The order of two values: empty last, dates and numbers by value, text in natural order (\"item 2\" < \"item 10\"). */\nexport function compareValues(a: CellValue, b: CellValue): number {\n if (empty(a)) return empty(b) ? 0 : 1;\n if (empty(b)) return -1;\n if (a instanceof Date || b instanceof Date) return Number(a) - Number(b);\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n}\n\nexport const sortByValue: SortFn<Features, never> = (a, b, id) => compareValues(a.getValue(id) as CellValue, b.getValue(id) as CellValue);\n\n/** A text filter: the value contains the words, case and accents ignored. */\nexport const filterText: FilterFn<Features, never> = (row, id, query: string) =>\n String(row.getValue(id) ?? \"\")\n .normalize(\"NFD\")\n .toLocaleLowerCase()\n .includes(query.normalize(\"NFD\").toLocaleLowerCase().trim());\nfilterText.autoRemove = (value: unknown) => typeof value !== \"string\" || value.trim() === \"\";\n\n/** A facet filter: the value is one of those chosen. */\nexport const filterFacet: FilterFn<Features, never> = (row, id, chosen: readonly string[]) => chosen.includes(String(row.getValue(id) ?? \"\"));\nfilterFacet.autoRemove = (value: unknown) => !Array.isArray(value) || value.length === 0;\n\n/** A range filter: the value (a number or a date) lies within the bounds, either of which may be open. */\nexport const filterRange: FilterFn<Features, never> = (row, id, [min, max]: readonly [number | null, number | null]) => {\n const raw = row.getValue(id) as CellValue;\n if (empty(raw)) return false;\n const value = Number(raw);\n return (min == null || value >= min) && (max == null || value <= max);\n};\nfilterRange.autoRemove = (value: unknown) => !Array.isArray(value) || (value[0] == null && value[1] == null);\n\nexport const FILTERS = { text: filterText, facet: filterFacet, range: filterRange } as const;\n\nexport type { ColumnDef, ColumnResizingState, RowData };\n","// Server-safe: no hook, no context. `buttonVariants` styles a <Link> or a Server Component without the component.\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { LoaderGlyph } from \"../spinner/glyph\";\n\nexport const buttonVariants = tv({\n base:\n \"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap font-semibold transition-all \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"disabled:pointer-events-none disabled:opacity-40 data-loading:cursor-progress active:scale-[0.98] \" +\n // Busy is not unavailable: a loading button keeps its colour (it is disabled only so it is not pressed twice).\n \"[&[data-loading]]:opacity-100\",\n variants: {\n variant: {\n primary: \"bg-accent text-on-accent shadow-sm hover:bg-accent-hover\",\n // The brand's signature: accent → accent-2 (on-accent reads on both stops, tested in @krizaka/tokens).\n gradient: \"bg-linear-to-r from-accent to-accent-2 text-on-accent shadow-sm hover:brightness-110\",\n secondary: \"border border-border-default bg-surface-2 text-fg hover:border-border-strong hover:bg-surface-3\",\n outline: \"border border-border-default bg-transparent text-fg hover:border-accent hover:text-fg-accent\",\n ghost: \"text-fg-secondary hover:bg-surface-2 hover:text-fg\",\n // The border and the tint carry the danger; the label stays the primary text role, legible on the tint at rest\n // and hovered over every surface (`text-fg-danger` is for text set directly on a surface).\n danger: \"border border-danger/50 bg-danger/10 text-fg hover:border-danger hover:bg-danger/20\",\n },\n size: { sm: \"h-8 px-3 text-xs\", md: \"h-10 px-4 text-sm\", lg: \"h-12 px-6 text-sm\", icon: \"h-10 w-10\" },\n // `cut`: the Krizaka chamfer — 45° corners (CSS corner-shape, where supported; rounded elsewhere). The border, the\n // focus ring and the hover follow the cut, unlike a clip-path.\n shape: { rounded: \"rounded-lg\", pill: \"rounded-full\", cut: \"rounded-[10px] [corner-shape:bevel]\" },\n },\n defaultVariants: { variant: \"secondary\", size: \"md\", shape: \"rounded\" },\n});\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> &\n ButtonVariants & {\n /**\n * The look: `primary` (the accent), `gradient` (accent → accent-2), `secondary` (a raised surface), `outline`,\n * `ghost`, `danger`.\n * @default \"secondary\"\n */\n variant?: ButtonVariants[\"variant\"];\n /**\n * sm · md · lg, or `icon` (a square).\n * @default \"md\"\n */\n size?: ButtonVariants[\"size\"];\n /**\n * rounded · pill · cut (45° corners, the Krizaka chamfer).\n * @default \"rounded\"\n */\n shape?: ButtonVariants[\"shape\"];\n /** Renders the child (e.g. a <Link>) instead of the <button>, with props, classes and ref merged. */\n asChild?: boolean;\n /**\n * Disables and signals the wait (aria-busy, data-loading) and shows the Krizaka loader glyph before the label; the\n * button keeps its colour.\n */\n loading?: boolean;\n /**\n * Between 0 and 1, while `loading`: the glyph's trace and a light fill across the button grow to the value (an\n * upload, an export).\n */\n progress?: number | null;\n /**\n * How the action ended: `success` draws a check, `error` a cross (and the button shakes its head once); a ring of\n * the status colour opens around it. Clear it to return to rest.\n */\n status?: \"success\" | \"error\" | null;\n /** A message announced politely by assistive technology when it changes (“Saved”, “Upload failed”) — passed translated. */\n announce?: string;\n /**\n * Shows the glyph while `loading` / with a `status`. `false`: you draw your own.\n * @default true\n */\n indicator?: boolean;\n /** A sheen of light crosses the button on hover — for the one action a page is about. */\n shimmer?: boolean;\n /** The button leans a few pixels toward a fine pointer (driven by `MotionObserver`; never under reduced motion or on touch). */\n magnetic?: boolean;\n };\n\nconst STATUS_TEXT = { success: \"text-fg-success\", error: \"text-fg-danger\" } as const;\n\nexport function Button({\n asChild,\n loading,\n progress,\n status,\n announce,\n indicator = true,\n shimmer,\n magnetic,\n variant,\n size,\n shape,\n className,\n disabled,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n const known = loading && typeof progress === \"number\" && Number.isFinite(progress);\n const ratio = known ? Math.min(1, Math.max(0, progress)) : 0;\n const glyph = indicator && !asChild && (loading || status) ? (status ?? \"loading\") : null;\n // On a filled variant the glyph stays in the label's colour; on the others it takes the status colour.\n const filled = variant === \"primary\" || variant === \"gradient\";\n const button = (\n <Comp\n type={asChild ? undefined : \"button\"}\n aria-busy={loading || undefined}\n data-loading={loading ? \"\" : undefined}\n data-variant={variant ?? \"secondary\"}\n data-kz-status={status ?? undefined}\n data-kz-magnetic={magnetic ? \"\" : undefined}\n disabled={asChild ? undefined : disabled || loading}\n aria-disabled={asChild && (disabled || loading) ? true : undefined}\n className={buttonVariants({\n variant,\n size,\n shape,\n className: [known && \"relative isolate overflow-hidden\", shimmer && \"kz-sheen\", className].filter(Boolean).join(\" \") || undefined,\n })}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {known && (\n <span aria-hidden className=\"absolute inset-y-0 left-0 -z-10 bg-current opacity-15 transition-[width] duration-500\" style={{ width: `${ratio * 100}%` }} />\n )}\n {glyph && (\n <span\n aria-hidden\n data-slot=\"indicator\"\n className=\"-my-1 grid grid-cols-[1fr] transition-[grid-template-columns,margin,opacity] duration-300 starting:-mr-2 starting:grid-cols-[0fr] starting:opacity-0\"\n >\n <span className=\"overflow-hidden\">\n <LoaderGlyph state={glyph} value={known ? ratio : null} className={[\"h-4 w-4\", glyph !== \"loading\" && !filled && STATUS_TEXT[glyph]].filter(Boolean).join(\" \")} />\n </span>\n </span>\n )}\n {children}\n </>\n )}\n </Comp>\n );\n if (announce === undefined || asChild) return button;\n return (\n <>\n {button}\n <span role=\"status\" className=\"sr-only\">\n {announce}\n </span>\n </>\n );\n}\n\nexport type IconButtonProps = Omit<ButtonProps, \"size\"> & {\n /** The accessible name (and tooltip) of the button — required, passed translated. */\n label: string;\n /**\n * sm · md · lg, or `icon` (a square).\n * @default \"icon\"\n */\n size?: ButtonProps[\"size\"];\n};\n\n/** An icon-only button: `label` is required, it is its accessible name. Loading or with a status, the glyph takes the icon's place. */\nexport function IconButton({ label, size = \"icon\", children, ...props }: IconButtonProps) {\n const swap = props.indicator !== false && !props.asChild && (props.loading || props.status);\n return (\n <Button aria-label={label} title={label} size={size} {...props}>\n {swap ? null : children}\n </Button>\n );\n}\n","// The Krizaka loader glyph, server-safe: a hexagon (the marks' shape) traced by a segment of light around a node that\n// breathes; determinate, it fills to its value; done, the trace closes and a check (or a cross) draws itself. Animated by\n// motion.css (`kz-loader-*`); still under prefers-reduced-motion — a segment at rest and the node lit, never blank.\nimport type * as React from \"react\";\n\n/** The hexagon, pointy top, radius 9 around (12, 12). */\nconst HEX = \"M12 3 19.79 7.5 19.79 16.5 12 21 4.21 16.5 4.21 7.5Z\";\n\n/** What the glyph shows: a wait (with an optional value), or how it ended. */\nexport type LoaderGlyphState = \"loading\" | \"success\" | \"error\";\n\nexport interface LoaderGlyphProps extends Omit<React.ComponentProps<\"svg\">, \"children\"> {\n /** loading · success · error. */\n state?: LoaderGlyphState;\n /** Between 0 and 1: a determinate wait, the trace grows to it. Absent: indeterminate. */\n value?: number | null;\n}\n\n/** The glyph alone (decorative): the Spinner, the Loader and the Button's `loading` draw it. */\nexport function LoaderGlyph({ state = \"loading\", value, ...props }: LoaderGlyphProps) {\n const known = typeof value === \"number\" && Number.isFinite(value);\n const fill = state !== \"loading\" ? 100 : known ? Math.round(Math.min(1, Math.max(0, value)) * 100) : null;\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden data-state={state} data-progress={fill === null ? undefined : fill} {...props}>\n <path d={HEX} stroke=\"currentColor\" strokeOpacity=\"0.22\" strokeWidth=\"2.2\" strokeLinejoin=\"round\" />\n <path\n d={HEX}\n pathLength={100}\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n className=\"kz-loader-trace\"\n strokeDasharray={fill === null ? undefined : `${fill} ${100 - fill}`}\n />\n {state === \"loading\" && <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill=\"currentColor\" className=\"kz-loader-node\" />}\n {state === \"success\" && <path d=\"M8.3 12.3l2.6 2.6 4.9-5.3\" pathLength={20} stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"kz-loader-mark\" />}\n {state === \"error\" && <path d=\"M9.4 9.4l5.2 5.2M14.6 9.4l-5.2 5.2\" pathLength={20} stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" className=\"kz-loader-mark\" />}\n </svg>\n );\n}\n","// Server-safe. The label ↔ control wiring is HTML (htmlFor / id, aria-describedby): no context.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\n\nexport const field = tv({\n slots: {\n root: \"flex flex-col gap-1.5\",\n label: \"text-xs font-semibold text-fg-secondary\",\n control:\n \"flex h-11 w-full rounded-lg border border-border-default bg-surface-2 px-3 text-sm text-fg placeholder:text-fg-muted \" +\n \"transition-[border-color,box-shadow] focus-visible:border-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-danger aria-invalid:ring-danger/30\",\n hint: \"text-xs text-fg-secondary\",\n // The message reads in the danger text role (≥ 4.5:1 on every surface, both themes); the dot is the danger fill.\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 selectWrap: \"relative flex w-full\",\n chevron: \"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-fg-secondary\",\n },\n});\nconst s = field();\n\nexport const Field = {\n Root: ({ className, ...props }: React.ComponentProps<\"div\">) => <div className={s.root({ className })} {...props} />,\n Label: ({ className, ...props }: React.ComponentProps<\"label\">) => <label className={s.label({ className })} {...props} />,\n Hint: ({ className, ...props }: React.ComponentProps<\"p\">) => <p className={s.hint({ className })} {...props} />,\n Error: ({ className, ...props }: React.ComponentProps<\"p\">) => <p role=\"alert\" className={s.error({ className })} {...props} />,\n};\n\ntype ControlProps = {\n /** Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n};\n\nconst invalidProps = (invalid?: boolean) => (invalid ? { \"aria-invalid\": true as const, \"data-invalid\": \"\" } : {});\n\nexport function Input({ invalid, className, ...props }: React.ComponentProps<\"input\"> & ControlProps) {\n return <input {...invalidProps(invalid)} className={s.control({ className })} {...props} />;\n}\n\nexport function Textarea({ invalid, className, ...props }: React.ComponentProps<\"textarea\"> & ControlProps) {\n return <textarea {...invalidProps(invalid)} className={s.control({ className: cn(\"h-auto min-h-24 py-2\", className) })} {...props} />;\n}\n\n/** A native <select>, styled like the other controls (the platform's menu: accessible and right on phones). */\nexport function Select({ invalid, className, ...props }: React.ComponentProps<\"select\"> & ControlProps) {\n return (\n <span className={s.selectWrap()}>\n <select {...invalidProps(invalid)} className={s.control({ className: cn(\"appearance-none pr-9\", className) })} {...props} />\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden className={s.chevron()}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </span>\n );\n}\n","// The toolbar of a DataTable — its filters (a FilterBar built from the columns), the columns menu and the CSV export —\n// connected to the table they sit in through `useDataTable()`. Words come from the table's `labels`.\nimport * as React from \"react\";\n\nimport { Button } from \"../button\";\nimport { DropdownMenu } from \"../dropdown-menu\";\nimport { Input } from \"../field\";\nimport { type ActiveFilter, FilterBar, FilterMenu } from \"../filter-bar\";\nimport { ChevronGlyph } from \"../glyphs\";\nimport { SearchField } from \"../search-field\";\nimport { dataTableCsv } from \"./csv\";\nimport { type DataTableColumn, useDataTable } from \"./data-table\";\nimport type { FilterValue } from \"./engine\";\n\nexport type DataTableFiltersProps = {\n /** The search's wait after the last key, in ms, before the filter applies (a request, in server mode). Default 250. */\n debounce?: number;\n /** More controls in the bar (a date range picker, a toggle). */\n children?: React.ReactNode;\n /** Classes merged on the bar. */\n className?: string;\n};\n\nconst asRange = (value: FilterValue | undefined): [number | null, number | null] =>\n Array.isArray(value) && value.length === 2 && (typeof value[0] !== \"string\" || typeof value[1] !== \"string\") ? [value[0] as number | null, value[1] as number | null] : [null, null];\nconst asList = (value: FilterValue | undefined): readonly string[] => (Array.isArray(value) ? (value as readonly string[]) : []);\nconst number = (text: string) => (text.trim() === \"\" || Number.isNaN(Number(text)) ? null : Number(text));\n\n/**\n * The filters of the table, from its columns: a search per `text` column, a menu of values (with their counts) per\n * `facet` column, two bounds per `range` column; the filters in force as removable chips, \"clear all\", and the count\n * of results, announced.\n */\nexport function DataTableFilters({ debounce = 250, children, className }: DataTableFiltersProps) {\n const { table, columns, labels, filters, setFilters, resultCount, manualFiltering } = useDataTable();\n const set = (id: string, value: FilterValue | null) => {\n const next = { ...filters };\n if (value === null || value === \"\" || (Array.isArray(value) && (value.length === 0 || (value.length === 2 && value[0] == null && value[1] == null)))) delete next[id];\n else next[id] = value;\n setFilters(next);\n };\n const filterable = columns.filter((column) => column.filter);\n const optionsOf = (column: DataTableColumn<object>) => {\n if (column.options) return column.options;\n // The values found in the rows, with their counts — the other filters applied (TanStack's facets).\n const facets = manualFiltering ? new Map<unknown, number>() : (table.getColumn(column.id)?.getFacetedUniqueValues() ?? new Map<unknown, number>());\n return [...facets.entries()]\n .filter(([value]) => value != null && value !== \"\")\n .map(([value, count]) => ({ value: String(value), label: String(value), count }))\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { numeric: true }));\n };\n const active: ActiveFilter[] = filterable.flatMap((column) => {\n const value = filters[column.id];\n if (value === undefined) return [];\n let text: string;\n if (column.filter === \"facet\") {\n const options = optionsOf(column);\n text = asList(value).map((v) => options.find((o) => o.value === v)?.label ?? v).join(\", \");\n } else if (column.filter === \"range\") {\n const [min, max] = asRange(value);\n text = `${min ?? \"…\"}–${max ?? \"…\"}`;\n } else text = String(value);\n const label = labels.activeFilter(column.header, text);\n return [{ id: column.id, label, onRemove: () => set(column.id, null) }];\n });\n return (\n <FilterBar\n label={labels.filters}\n active={active}\n onClearAll={() => setFilters({})}\n clearLabel={labels.clearFilters}\n removeLabel={labels.removeFilter}\n results={labels.results(resultCount)}\n className={className}\n >\n {filterable.map((column) => {\n if (column.filter === \"text\")\n return (\n <SearchField\n key={column.id}\n label={labels.search(column.header)}\n placeholder={labels.search(column.header)}\n value={typeof filters[column.id] === \"string\" ? undefined : \"\"}\n defaultValue={typeof filters[column.id] === \"string\" ? (filters[column.id] as string) : undefined}\n debounce={debounce}\n onSearch={(query) => set(column.id, query)}\n landmark={false}\n size=\"sm\"\n className=\"min-w-48 flex-1\"\n />\n );\n if (column.filter === \"facet\")\n return (\n <FilterMenu key={column.id} label={column.header} options={optionsOf(column)} value={asList(filters[column.id])} onValueChange={(value) => set(column.id, value)} />\n );\n const [min, max] = asRange(filters[column.id]);\n const bounds = manualFiltering ? undefined : table.getColumn(column.id)?.getFacetedMinMaxValues();\n return (\n <span key={column.id} className=\"inline-flex items-center gap-1.5\">\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n aria-label={labels.rangeFrom(column.header)}\n placeholder={bounds ? String(bounds[0]) : labels.rangeFrom(column.header)}\n value={min ?? \"\"}\n onChange={(event) => set(column.id, [number(event.currentTarget.value), max])}\n className=\"h-11 w-28\"\n />\n <span aria-hidden className=\"text-fg-secondary\">\n –\n </span>\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n aria-label={labels.rangeTo(column.header)}\n placeholder={bounds ? String(bounds[1]) : labels.rangeTo(column.header)}\n value={max ?? \"\"}\n onChange={(event) => set(column.id, [min, number(event.currentTarget.value)])}\n className=\"h-11 w-28\"\n />\n </span>\n );\n })}\n {children}\n </FilterBar>\n );\n}\n\nexport type DataTableColumnsMenuProps = {\n /** Opens the menu at first (a story, a test). */\n defaultOpen?: boolean;\n /** Classes merged on the button. */\n className?: string;\n};\n\n/** A menu of the `hideable` columns, each a checkbox: the person chooses what the table shows. */\nexport function DataTableColumnsMenu({ defaultOpen, className }: DataTableColumnsMenuProps) {\n const { table, columns, labels } = useDataTable();\n return (\n <DropdownMenu.Root defaultOpen={defaultOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" size=\"sm\" className={className}>\n {labels.columns}\n <ChevronGlyph className=\"h-4 w-4\" />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" aria-label={labels.columns}>\n {columns\n .filter((column) => column.hideable !== false)\n .map((column) => {\n const instance = table.getColumn(column.id);\n return (\n <DropdownMenu.CheckboxItem\n key={column.id}\n checked={instance?.getIsVisible() ?? true}\n onSelect={(event) => event.preventDefault()}\n onCheckedChange={(checked) => instance?.toggleVisibility(Boolean(checked))}\n >\n {column.header}\n </DropdownMenu.CheckboxItem>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nexport type DataTableExportProps = {\n /** The file's name. Default `\"export.csv\"`. */\n filename?: string;\n /** Receives the CSV instead of downloading it (send it to the server, a test). */\n onExport?: (csv: string) => void;\n /** Classes merged on the button. */\n className?: string;\n};\n\n/** Downloads what the table shows — the filtered and sorted rows of every page, the visible columns — as CSV. */\nexport function DataTableExport({ filename = \"export.csv\", onExport, className }: DataTableExportProps) {\n const { table, columns, labels, exportRows } = useDataTable();\n const run = () => {\n const visible = columns.filter((column) => table.getColumn(column.id)?.getIsVisible() !== false);\n const csv = dataTableCsv(exportRows(), visible);\n if (onExport) return onExport(csv);\n const url = URL.createObjectURL(new Blob([\"\", csv], { type: \"text/csv;charset=utf-8\" }));\n const link = Object.assign(document.createElement(\"a\"), { href: url, download: filename });\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n };\n return (\n <Button variant=\"outline\" size=\"sm\" className={className} onClick={run}>\n {labels.export}\n </Button>\n );\n}\n"],"mappings":"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","names":["tv","s","tv","jsx","jsxs","tv","s","jsx","jsxs","tv","empty","s","pagination","tv","jsx","jsxs","Fragment","jsx","jsxs","tv","tv","jsx","jsxs","field","tv","jsx","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-table/csv.ts","../src/data-table/data-table.tsx","../src/pagination/pagination.tsx","../src/data-table/engine.ts","../src/button/button.tsx","../src/spinner/glyph.tsx","../src/field/field.tsx","../src/data-table/toolbar.tsx"],"sourcesContent":["// CSV (RFC 4180) from rows and columns: the header of each column, then each row's values — what `value` returns (or\n// `row[id]`), never the rendered cell. Dates as ISO 8601; a value that a spreadsheet would run as a formula is quoted\n// with a leading apostrophe (CSV injection).\nimport type { CellValue } from \"./engine\";\n\ntype CsvColumn<T> = { id: string; header: string; value?: (row: T) => CellValue };\n\nconst FORMULA = /^[=+\\-@\\t\\r]/;\n\nfunction field(value: CellValue): string {\n let text = value == null ? \"\" : value instanceof Date ? value.toISOString() : String(value);\n if (typeof value === \"string\" && FORMULA.test(text)) text = `'${text}`;\n return /[\",\\n\\r;]/.test(text) || text !== text.trim() ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/** The rows as CSV text: a header line, then one line per row, separated by `\\r\\n`. */\nexport function dataTableCsv<T>(rows: readonly T[], columns: readonly CsvColumn<T>[], separator = \",\"): string {\n const lines = [columns.map((column) => field(column.header)).join(separator)];\n for (const row of rows) {\n lines.push(columns.map((column) => field(column.value ? column.value(row) : ((row as Record<string, unknown>)[column.id] as CellValue))).join(separator));\n }\n return lines.join(\"\\r\\n\");\n}\n","// Client (the table's state, the windowing of long lists). A real `<table>` with a caption and column headers\n// (`scope=\"col\"`, `aria-sort` on the sorted one) that turns into a stack of cards in a narrow container — one DOM, the\n// roles written out so that the change of `display` never loses the table's semantics. The engine is TanStack Table v9\n// (engine.ts): sorting, filters and facets, grouping, expanding, pagination, selection, visibility, pinning, resizing —\n// in the browser, or on the server (`manual` + `onStateChange`). Long lists render by what is in view (`virtualized`).\nimport { useTable } from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Checkbox } from \"../checkbox\";\nimport { ChevronGlyph, SortGlyph } from \"../glyphs\";\nimport { useControllable } from \"../media\";\nimport { Pagination, type PaginationLabels } from \"../pagination\";\nimport { useLayoutFallbacks, useVirtualizer } from \"../virtual/virtual\";\nimport {\n type CellValue,\n type ColumnDef,\n type ColumnResizingState,\n type DataTableFilterState,\n type DataTableInstance,\n features,\n FILTERS,\n type FilterValue,\n type RowData,\n sortByValue,\n type TableCell,\n type TableColumn,\n type TableRow,\n} from \"./engine\";\n\nexport const dataTable = tv({\n slots: {\n root: \"@container w-full overflow-hidden rounded-xl border border-border-default bg-surface-1\",\n toolbar: \"border-b border-border-default p-3\",\n scroller: \"w-full overflow-x-auto\",\n table: \"w-full border-collapse text-left text-sm text-fg\",\n caption: \"px-4 pt-4 pb-2 text-left text-sm font-semibold text-fg\",\n thead: \"bg-surface-2/60\",\n headRow: \"border-b border-border-default\",\n th: \"relative whitespace-nowrap px-4 py-3 text-xs font-semibold text-fg-secondary\",\n sortButton:\n \"-mx-1.5 inline-flex items-center gap-1 rounded-md px-1.5 py-1 hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-[pressed=true]:text-fg\",\n resizer:\n \"absolute top-0 right-0 h-full w-1.5 cursor-col-resize touch-none select-none bg-transparent hover:bg-border-strong \" +\n \"focus-visible:bg-accent focus-visible:outline-hidden data-[resizing]:bg-accent\",\n tbody: \"\",\n tr: \"border-b border-border-subtle transition-colors last:border-b-0 hover:bg-surface-2/50 data-[state=selected]:bg-accent-soft\",\n groupRow: \"bg-surface-2/40 font-semibold\",\n td: \"px-4 py-3 align-middle\",\n select: \"w-10\",\n expander: \"w-10\",\n toggle:\n \"inline-flex h-7 min-w-7 items-center justify-center gap-1.5 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 [&[aria-expanded=true]>svg]:rotate-90 [&>svg]:transition-transform motion-reduce:[&>svg]:transition-none\",\n detail: \"bg-surface-0 px-4 py-4\",\n message: \"px-4 py-10 text-center text-sm text-fg-secondary\",\n skeleton: \"h-4 w-full max-w-40 animate-pulse rounded bg-surface-3 motion-reduce:animate-none\",\n footer: \"border-t border-border-default px-4 py-3\",\n },\n variants: {\n layout: {\n table: {\n th: \"data-[pin]:sticky data-[pin]:z-[2] data-[pin]:bg-surface-2 data-[pin=start]:left-(--dt-pin) data-[pin=end]:right-(--dt-pin)\",\n td: \"data-[pin]:sticky data-[pin]:z-[1] data-[pin]:bg-surface-1 data-[pin=start]:left-(--dt-pin) data-[pin=end]:right-(--dt-pin)\",\n },\n // Below 36rem of container: cards. The sortable headers stay, as a row of sort buttons above the cards.\n auto: {\n table: \"@max-xl:block\",\n caption: \"@max-xl:block\",\n thead: \"@max-xl:sr-only @max-xl:bg-transparent @max-xl:has-[[data-keep]]:not-sr-only @max-xl:has-[[data-keep]]:block\",\n headRow: \"@max-xl:flex @max-xl:flex-wrap @max-xl:items-center @max-xl:gap-2 @max-xl:px-3 @max-xl:py-2\",\n th:\n \"@max-xl:sr-only @max-xl:data-[keep]:not-sr-only @max-xl:data-[keep]:block @max-xl:p-0 \" +\n \"@xl:data-[pin]:sticky @xl:data-[pin]:z-[2] @xl:data-[pin]:bg-surface-2 @xl:data-[pin=start]:left-(--dt-pin) @xl:data-[pin=end]:right-(--dt-pin)\",\n tbody: \"@max-xl:grid @max-xl:gap-3 @max-xl:p-3\",\n tr: \"@max-xl:relative @max-xl:grid @max-xl:gap-1.5 @max-xl:rounded-xl @max-xl:border @max-xl:border-border-default @max-xl:bg-surface-0 @max-xl:p-4 @max-xl:last:border-b\",\n td:\n \"@max-xl:flex @max-xl:items-baseline @max-xl:justify-between @max-xl:gap-4 @max-xl:p-0 @max-xl:text-right \" +\n \"@max-xl:before:shrink-0 @max-xl:before:text-xs @max-xl:before:font-semibold @max-xl:before:text-fg-secondary @max-xl:before:content-[attr(data-label)] \" +\n \"@max-xl:data-[card=title]:order-first @max-xl:data-[card=title]:pr-8 @max-xl:data-[card=title]:text-left @max-xl:data-[card=title]:text-base @max-xl:data-[card=title]:font-semibold @max-xl:data-[card=title]:before:content-none \" +\n \"@max-xl:data-[card=hidden]:hidden @max-xl:data-[card=message]:block @max-xl:data-[card=message]:text-center @max-xl:data-[card=message]:before:content-none \" +\n \"@xl:data-[pin]:sticky @xl:data-[pin]:z-[1] @xl:data-[pin]:bg-surface-1 @xl:data-[pin=start]:left-(--dt-pin) @xl:data-[pin=end]:right-(--dt-pin)\",\n select: \"@max-xl:absolute @max-xl:right-3 @max-xl:top-3 @max-xl:w-auto @max-xl:before:content-none\",\n expander: \"@max-xl:before:content-none\",\n },\n cards: {\n table: \"block\",\n caption: \"block\",\n thead: \"sr-only bg-transparent has-[[data-keep]]:not-sr-only has-[[data-keep]]:block\",\n headRow: \"flex flex-wrap items-center gap-2 px-3 py-2\",\n th: \"sr-only p-0 data-[keep]:not-sr-only data-[keep]:block\",\n tbody: \"grid gap-3 p-3\",\n tr: \"relative grid gap-1.5 rounded-xl border border-border-default bg-surface-0 p-4 last:border-b\",\n td:\n \"flex items-baseline justify-between gap-4 p-0 text-right before:shrink-0 before:text-xs before:font-semibold before:text-fg-secondary before:content-[attr(data-label)] \" +\n \"data-[card=title]:order-first data-[card=title]:pr-8 data-[card=title]:text-left data-[card=title]:text-base data-[card=title]:font-semibold data-[card=title]:before:content-none \" +\n \"data-[card=hidden]:hidden data-[card=message]:block data-[card=message]:text-center data-[card=message]:before:content-none\",\n select: \"absolute right-3 top-3 w-auto before:content-none\",\n expander: \"before:content-none\",\n },\n },\n density: {\n comfortable: {},\n compact: { th: \"py-2\", td: \"py-1.5\" },\n },\n },\n defaultVariants: { layout: \"auto\", density: \"comfortable\" },\n});\n\nexport type SortDirection = \"ascending\" | \"descending\";\nexport type DataTableSort = { column: string; direction: SortDirection } | null;\n\n/** What the server needs to fetch a page (`manual` mode): given to `onStateChange` at each change. */\nexport type DataTableQuery = {\n /** The sorted column, or `null`. */\n sort: DataTableSort;\n /** The filters in force, by column id. */\n filters: DataTableFilterState;\n /** The page, from 1 (1 without pagination). */\n page: number;\n /** Rows per page (`Infinity` without pagination). */\n pageSize: number;\n};\n\nexport type DataTableColumn<T> = {\n /** A key of the column (and of the row, for the default value). */\n id: string;\n /** The column's name, passed translated: the header, the label of the value in a card, the filter's name. */\n header: string;\n /** What a cell shows. Default: the value as text. */\n cell?: (row: T) => React.ReactNode;\n /** The value sorted, filtered, grouped and exported. Default `row[id]`. */\n value?: (row: T) => CellValue;\n /** The header becomes a sort button (ascending → descending → none). */\n sortable?: boolean;\n /** How `DataTableFilters` filters it: `text` (a search), `facet` (values to choose), `range` (numbers between bounds). */\n filter?: \"text\" | \"facet\" | \"range\";\n /** The choices of a `facet` filter, with their words (and counts from the server). Default: the values found in the rows. */\n options?: readonly { value: string; label: string; count?: number }[];\n /** The rows can be grouped by this column (`groupBy`). */\n groupable?: boolean;\n /** What a group's row shows in this column, from the group's rows (a sum, a count). */\n aggregate?: (rows: readonly T[]) => React.ReactNode;\n /** Text alignment: `end` for amounts and counts. */\n align?: \"start\" | \"center\" | \"end\";\n /** The width, in px (the starting width when `resizing`). */\n width?: number;\n /** The narrowest a resized column may be, in px. Default 64. */\n minWidth?: number;\n /** In a card: `title` (the heading of the card), `label` (default: \"Header value\"), `hidden`. */\n card?: \"title\" | \"label\" | \"hidden\";\n /** Hides the header visually (an actions column), keeping it for screen readers. */\n headerHidden?: boolean;\n /** Listed in `DataTableColumnsMenu`, so a person can hide it. Default `true`. */\n hideable?: boolean;\n};\n\nexport type DataTableLabels = {\n /** The checkbox of the header (\"Select all rows\"). */\n selectAll: string;\n /** The checkbox of a row: `(name) => \"Select \" + name`, the name from `rowLabel`. */\n selectRow: (name: string) => string;\n /** Read while the rows load (\"Loading\"). */\n loading: string;\n /** The default empty state (\"Nothing to show\"). */\n empty: string;\n /** The header of the column of the expand buttons, for screen readers (\"Details\"). */\n details: string;\n /** The button that opens a row: `(name) => \"Show details of \" + name`. */\n expandRow: (name: string) => string;\n /** The button of a group's row: `(value, count) => value + \", \" + count + \" rows\"`. */\n group: (value: string, count: number) => string;\n /** The handle that resizes a column: `(header) => \"Resize \" + header`. */\n resize: (header: string) => string;\n /** The count of results under the filters: `(count) => count + \" rows\"`. */\n results: (count: number) => string;\n /** The accessible name of the filters' bar (\"Filter the table\"). */\n filters: string;\n /** \"Clear filters\". */\n clearFilters: string;\n /** A filter's chip remove button: `(label) => \"Remove \" + label`. */\n removeFilter: (label: string) => string;\n /** The words of a filter in force: `(header, value) => header + \": \" + value`. */\n activeFilter: (header: string, value: string) => string;\n /** A `text` filter's field: `(header) => \"Search \" + header`. */\n search: (header: string) => string;\n /** The lower bound of a `range` filter: `(header) => header + \" from\"`. */\n rangeFrom: (header: string) => string;\n /** The upper bound of a `range` filter: `(header) => header + \" to\"`. */\n rangeTo: (header: string) => string;\n /** The button of the columns menu (\"Columns\"). */\n columns: string;\n /** The export button (\"Export CSV\"). */\n export: string;\n /** The words of the pagination under the table. */\n pagination?: Partial<PaginationLabels>;\n};\n\nexport const dataTableLabels: DataTableLabels = {\n selectAll: \"Select all rows\",\n selectRow: (name) => `Select ${name}`,\n loading: \"Loading\",\n empty: \"Nothing to show\",\n details: \"Details\",\n expandRow: (name) => `Show details of ${name}`,\n group: (value, count) => `${value}, ${count} ${count === 1 ? \"row\" : \"rows\"}`,\n resize: (header) => `Resize ${header}`,\n results: (count) => `${count.toLocaleString(\"en\")} ${count === 1 ? \"row\" : \"rows\"}`,\n filters: \"Filter the table\",\n clearFilters: \"Clear filters\",\n removeFilter: (label) => `Remove ${label}`,\n activeFilter: (header, value) => `${header}: ${value}`,\n search: (header) => `Search ${header.toLocaleLowerCase()}`,\n rangeFrom: (header) => `${header} from`,\n rangeTo: (header) => `${header} to`,\n columns: \"Columns\",\n export: \"Export CSV\",\n};\n\nexport type DataTableProps<T> = {\n /** The rows (stable: module scope, state or a query's data). Sorted, filtered and paginated here unless `manual`. */\n rows: readonly T[];\n /** The columns, in order (stable: module scope or `useMemo`). */\n columns: readonly DataTableColumn<T>[];\n /** A stable id per row: the React key, the selection's value, the expansion's key. */\n getRowId: (row: T) => string;\n /** What the table lists (\"Jobs\", \"Your videos\"): its `<caption>`, hidden unless `showCaption`. */\n caption: string;\n /** Shows the caption above the table. */\n showCaption?: boolean;\n\n /** The sorted column (controlled), `null` for none. */\n sort?: DataTableSort;\n /** The sort at first, uncontrolled. */\n defaultSort?: DataTableSort;\n /** Called when a header asks for a new sort. */\n onSortChange?: (sort: DataTableSort) => void;\n\n /** The filters in force (controlled), by column id — what `DataTableFilters` edits. */\n filters?: DataTableFilterState;\n /** The filters at first, uncontrolled. */\n defaultFilters?: DataTableFilterState;\n /** Called with the new filters. */\n onFiltersChange?: (filters: DataTableFilterState) => void;\n\n /** Adds a checkbox per row and one in the header. */\n selectable?: boolean;\n /** The ids selected (controlled). */\n selected?: readonly string[];\n /** The ids selected at first, uncontrolled. */\n defaultSelected?: readonly string[];\n /** Called with the new selection. */\n onSelectedChange?: (selected: string[]) => void;\n /** The name of a row in its labels (checkbox, expand button). Default: its id. */\n rowLabel?: (row: T) => string;\n\n /** The columns the rows are grouped by, in order (controlled) — each `groupable`. */\n groupBy?: readonly string[];\n /** The grouping at first, uncontrolled. */\n defaultGroupBy?: readonly string[];\n /** Called with the new grouping. */\n onGroupByChange?: (groupBy: string[]) => void;\n\n /** Visible (`true`) or hidden (`false`) columns, by id (controlled); a column not listed is visible. */\n columnVisibility?: Readonly<Record<string, boolean>>;\n /** The visibility at first, uncontrolled. */\n defaultColumnVisibility?: Readonly<Record<string, boolean>>;\n /** Called with the new visibility (`DataTableColumnsMenu`). */\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n\n /** Columns that stay in view while the table scrolls sideways: at the start (a name) or the end (actions). */\n pinning?: { start?: readonly string[]; end?: readonly string[] };\n /** Columns can be resized (pointer drag, or the arrow keys on the focused handle). */\n resizing?: boolean;\n\n /** The children of a row (a tree): each row with children gets a button that shows them. */\n getSubRows?: (row: T) => readonly T[] | undefined;\n /** A panel under an opened row (the details of a job): each row gets a button that opens it. */\n renderDetail?: (row: T) => React.ReactNode;\n /** The opened rows and groups (controlled), by id. */\n expanded?: Readonly<Record<string, boolean>>;\n /** The opened rows at first, uncontrolled. */\n defaultExpanded?: Readonly<Record<string, boolean>>;\n /** Called with the opened rows. */\n onExpandedChange?: (expanded: Record<string, boolean>) => void;\n\n /** Rows per page (controlled): turns on the pagination under the table. */\n pageSize?: number;\n /** Rows per page at first, uncontrolled: turns on the pagination under the table. */\n defaultPageSize?: number;\n /** Called with the size chosen in the pagination's select (`pageSizeOptions`). */\n onPageSizeChange?: (pageSize: number) => void;\n /** The sizes the pagination offers (`[10, 25, 50]`). */\n pageSizeOptions?: readonly number[];\n /** The page, from 1 (controlled). */\n page?: number;\n /** The page at first, uncontrolled. Default 1. */\n defaultPage?: number;\n /** Called with the page asked for. */\n onPageChange?: (page: number) => void;\n\n /** The server does the work: the rows are shown as given (sorted, filtered, a single page) — fetch in `onStateChange`. */\n manual?: { sorting?: boolean; filtering?: boolean; pagination?: boolean };\n /** The number of rows on the server (`manual.pagination`): the page count and the results' count. */\n rowCount?: number;\n /** Called with the sort, the filters and the page after each change: the query key of a server table. */\n onStateChange?: (query: DataTableQuery) => void;\n\n /** Rows are loading: skeleton rows (`loadingRows` of them) and `aria-busy`. */\n loading?: boolean;\n /** How many skeleton rows while loading. Default 5. */\n loadingRows?: number;\n /** A failure, shown in place of the rows (an `Alert`, a retry button); announced. */\n error?: React.ReactNode;\n /** Shown when there is no row (an `EmptyState`). Default: `labels.empty`. */\n empty?: React.ReactNode;\n\n /** `auto` (default): a table, cards below 36rem of container width. `table` or `cards` to force one. */\n layout?: \"auto\" | \"table\" | \"cards\";\n /** comfortable (default) · compact. */\n density?: \"comfortable\" | \"compact\";\n /** Renders only the rows in view, in a scrolling body of `height` px; rows are measured (`estimateRowHeight` is a guess). Forces the table layout. */\n virtualized?: { height: number; estimateRowHeight?: number; overscan?: number };\n\n /** Above the table, inside its frame: `DataTableFilters`, `DataTableColumnsMenu`, `DataTableExport`, actions. */\n toolbar?: React.ReactNode;\n /** Under the table (after the pagination): a total, a note. */\n footer?: React.ReactNode;\n /** The words, passed translated; English by default. */\n labels?: Partial<DataTableLabels>;\n /** Classes merged on the root. */\n className?: string;\n};\n\ntype Context = {\n table: DataTableInstance<object>;\n columns: readonly DataTableColumn<object>[];\n labels: DataTableLabels;\n filters: DataTableFilterState;\n setFilters: (filters: DataTableFilterState) => void;\n /** The rows after the filters (all pages), or the server's count. */\n resultCount: number;\n /** The rows to export: filtered and sorted, every page, without the group rows. */\n exportRows: () => readonly unknown[];\n manualFiltering: boolean;\n};\n\nconst DataTableContext = React.createContext<Context | null>(null);\n\n/**\n * The table a component sits in (`toolbar`, or anything under it): the TanStack Table instance (`table` — the escape\n * hatch for what the props do not cover), the columns, the words, the filters and their setter.\n */\nexport function useDataTable<T extends RowData = object>() {\n const context = React.useContext(DataTableContext);\n if (!context) throw new Error(\"useDataTable: call it inside a DataTable (its `toolbar`, `footer` or a cell)\");\n return context as unknown as Omit<Context, \"table\" | \"columns\" | \"exportRows\"> & {\n table: DataTableInstance<T>;\n columns: readonly DataTableColumn<T>[];\n exportRows: () => readonly T[];\n };\n}\n\nconst ALIGN = { start: \"text-left\", center: \"text-center\", end: \"text-right\" } as const;\nconst NONE: readonly never[] = [];\nconst NO_RECORD: Readonly<Record<string, never>> = {};\nconst apply = <S,>(updater: S | ((old: S) => S), old: S): S => (typeof updater === \"function\" ? (updater as (old: S) => S)(old) : updater);\n\nconst valueOf = <T,>(column: DataTableColumn<T>, row: T): CellValue =>\n column.value ? column.value(row) : ((row as Record<string, unknown>)[column.id] as CellValue);\n\nconst display = (value: CellValue) => (value instanceof Date ? value.toISOString() : String(value ?? \"\"));\n\n/** A table of records — sort, filters and facets, groups, details, pages, selection, visibility, pinning, resizing — on the client or the server, cards on a phone, windowing for long lists. */\nexport function DataTable<T extends RowData>({\n rows,\n columns,\n getRowId,\n caption,\n showCaption,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n filters: filtersProp,\n defaultFilters = NO_RECORD,\n onFiltersChange,\n selectable,\n selected: selectedProp,\n defaultSelected = NONE,\n onSelectedChange,\n rowLabel,\n groupBy: groupByProp,\n defaultGroupBy = NONE,\n onGroupByChange,\n columnVisibility: visibilityProp,\n defaultColumnVisibility = NO_RECORD,\n onColumnVisibilityChange,\n pinning,\n resizing,\n getSubRows,\n renderDetail,\n expanded: expandedProp,\n defaultExpanded = NO_RECORD,\n onExpandedChange,\n pageSize: pageSizeProp,\n defaultPageSize,\n onPageSizeChange,\n pageSizeOptions,\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n manual,\n rowCount,\n onStateChange,\n loading,\n loadingRows = 5,\n error,\n empty,\n layout = \"auto\",\n density,\n virtualized,\n toolbar,\n footer,\n labels: given,\n className,\n}: DataTableProps<T>) {\n const labels = { ...dataTableLabels, ...given };\n const effectiveLayout = virtualized ? \"table\" : layout;\n const s = dataTable({ layout: effectiveLayout, density });\n\n const [sort, setSort] = useControllable<DataTableSort>(sortProp, defaultSort, onSortChange);\n const [filters, setFiltersState] = useControllable<DataTableFilterState>(filtersProp, defaultFilters, onFiltersChange);\n const [selected, setSelected] = useControllable<readonly string[]>(selectedProp, defaultSelected, onSelectedChange as (next: readonly string[]) => void);\n const [groupBy, setGroupBy] = useControllable<readonly string[]>(groupByProp, defaultGroupBy, onGroupByChange as (next: readonly string[]) => void);\n const [visibility, setVisibility] = useControllable<Readonly<Record<string, boolean>>>(visibilityProp, defaultColumnVisibility, onColumnVisibilityChange as (next: Readonly<Record<string, boolean>>) => void);\n const [expanded, setExpanded] = useControllable<Readonly<Record<string, boolean>>>(expandedProp, defaultExpanded, onExpandedChange as (next: Readonly<Record<string, boolean>>) => void);\n const paginated = pageSizeProp !== undefined || defaultPageSize !== undefined;\n const [pageSize, setPageSize] = useControllable<number>(pageSizeProp, defaultPageSize ?? Number.POSITIVE_INFINITY, onPageSizeChange);\n const [page, setPage] = useControllable<number>(pageProp, defaultPage, onPageChange);\n const [sizing, setSizing] = React.useState<Record<string, number>>({});\n const [resizeState, setResizeState] = React.useState<ColumnResizingState | undefined>(undefined);\n\n // One place announces the server's query: after any change of sort, filters, page or page size.\n const announce = (next: Partial<DataTableQuery>) =>\n onStateChange?.({ sort, filters, page: paginated ? page : 1, pageSize: paginated ? pageSize : Number.POSITIVE_INFINITY, ...next });\n const changeSort = (next: DataTableSort) => {\n setSort(next);\n if (paginated && page !== 1) setPage(1);\n announce({ sort: next, page: 1 });\n };\n const changeFilters = (next: DataTableFilterState) => {\n setFiltersState(next);\n if (paginated && page !== 1) setPage(1);\n announce({ filters: next, page: 1 });\n };\n const changePage = (next: number) => {\n setPage(next);\n announce({ page: next });\n };\n const changePageSize = (next: number) => {\n setPageSize(next);\n setPage(1);\n announce({ pageSize: next, page: 1 });\n };\n\n const hasExpander = Boolean(renderDetail || getSubRows);\n const defs = React.useMemo<ColumnDef<typeof features, T>[]>(\n () =>\n columns.map((column) => ({\n id: column.id,\n accessorFn: (row: T) => valueOf(column, row),\n header: column.header,\n enableSorting: Boolean(column.sortable),\n sortFn: sortByValue as never,\n sortUndefined: \"last\",\n enableColumnFilter: Boolean(column.filter),\n filterFn: (column.filter ? FILTERS[column.filter] : FILTERS.text) as never,\n enableGrouping: Boolean(column.groupable),\n enableHiding: column.hideable !== false,\n enableResizing: Boolean(resizing),\n ...(column.width ? { size: column.width } : {}),\n minSize: column.minWidth ?? 64,\n })),\n [columns, resizing],\n );\n\n const pageIndex = Math.max(0, page - 1);\n const table = useTable<typeof features, T>({\n features,\n columns: defs,\n data: rows as T[],\n getRowId: (row) => getRowId(row),\n getSubRows: getSubRows ? (row) => getSubRows(row) as T[] | undefined : undefined,\n getRowCanExpand: renderDetail ? () => true : undefined,\n state: {\n sorting: sort ? [{ id: sort.column, desc: sort.direction === \"descending\" }] : [],\n columnFilters: Object.entries(filters).map(([id, value]) => ({ id, value })),\n rowSelection: Object.fromEntries(selected.map((id) => [id, true])),\n grouping: [...groupBy],\n columnVisibility: { ...visibility },\n expanded: { ...expanded },\n pagination: { pageIndex, pageSize: paginated ? pageSize : Math.max(1, rows.length) },\n columnPinning: { start: [...(pinning?.start ?? [])], end: [...(pinning?.end ?? [])] },\n columnSizing: sizing,\n ...(resizeState ? { columnResizing: resizeState } : {}),\n },\n onSortingChange: (updater) => {\n const [first] = apply(updater, sort ? [{ id: sort.column, desc: sort.direction === \"descending\" }] : []);\n changeSort(first ? { column: first.id, direction: first.desc ? \"descending\" : \"ascending\" } : null);\n },\n onColumnFiltersChange: (updater) => {\n const next = apply(updater, Object.entries(filters).map(([id, value]) => ({ id, value })));\n changeFilters(Object.fromEntries(next.map((f) => [f.id, f.value as FilterValue])));\n },\n onRowSelectionChange: (updater) => {\n const next = apply(updater, Object.fromEntries(selected.map((id) => [id, true])));\n setSelected(Object.keys(next).filter((id) => next[id]));\n },\n onGroupingChange: (updater) => setGroupBy(apply(updater, [...groupBy])),\n onColumnVisibilityChange: (updater) => setVisibility(apply(updater, { ...visibility })),\n onExpandedChange: (updater) => {\n const next = apply(updater, { ...expanded });\n setExpanded(next === true ? Object.fromEntries(table.getRowModel().rows.map((r) => [r.id, true])) : next);\n },\n onColumnSizingChange: (updater) => setSizing((old: Record<string, number>) => apply(updater, old)),\n onColumnResizingChange: (updater) => setResizeState((old) => apply(updater, old as ColumnResizingState)),\n enableSortingRemoval: true,\n sortDescFirst: false,\n manualSorting: manual?.sorting,\n manualFiltering: manual?.filtering,\n manualPagination: manual?.pagination || !paginated,\n rowCount: manual?.pagination ? rowCount : undefined,\n autoResetPageIndex: false,\n autoResetExpanded: false,\n groupedColumnMode: false,\n columnResizeMode: \"onChange\",\n enableRowSelection: (row) => !row.getIsGrouped(),\n });\n\n const visibleColumns = table.getVisibleLeafColumns();\n const byId = new Map(columns.map((c) => [c.id, c]));\n const pageRows = table.getRowModel().rows;\n const leafCount = (manual?.pagination || manual?.filtering) && rowCount !== undefined ? rowCount : table.getFilteredRowModel().rows.length;\n const pageCount = paginated ? Math.max(1, manual?.pagination ? Math.ceil((rowCount ?? rows.length) / pageSize) : table.getPageCount()) : 1;\n // A page beyond the last (the filters shrank the list): show the last one.\n React.useEffect(() => {\n if (paginated && !loading && page > pageCount) changePage(pageCount);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only when the count of pages drops under the page\n }, [pageCount]);\n\n const selectableIds = pageRows.filter((r) => !r.getIsGrouped()).map((r) => r.id);\n const chosen = new Set(selected);\n const allChosen = selectableIds.length > 0 && selectableIds.every((id) => chosen.has(id));\n const someChosen = selectableIds.some((id) => chosen.has(id));\n const toggleAll = () =>\n setSelected(allChosen ? selected.filter((id) => !selectableIds.includes(id)) : [...new Set([...selected, ...selectableIds])]);\n\n const span = visibleColumns.length + (selectable ? 1 : 0) + (hasExpander ? 1 : 0);\n const fixedLayout = Boolean(resizing || pinning?.start?.length || pinning?.end?.length);\n const nameOf = (row: TableRow<T>) => (rowLabel ? rowLabel(row.original) : row.id);\n\n // Windowing: the rows in view, between two spacer rows that keep the scroll height.\n const scroller = React.useRef<HTMLDivElement>(null);\n const fallbacks = useLayoutFallbacks(virtualized?.height ?? 0, virtualized?.estimateRowHeight ?? 44);\n const virtualizer = useVirtualizer({\n ...fallbacks,\n count: pageRows.length,\n getScrollElement: () => scroller.current,\n estimateSize: () => virtualized?.estimateRowHeight ?? 44,\n overscan: virtualized?.overscan ?? 6,\n initialRect: { width: 0, height: virtualized?.height ?? 0 },\n getItemKey: (index) => pageRows[index]?.id ?? index,\n enabled: Boolean(virtualized) && !loading,\n });\n const windowItems = virtualized && !loading ? virtualizer.getVirtualItems() : null;\n const before = windowItems?.[0]?.start ?? 0;\n const after = windowItems && windowItems.length > 0 ? virtualizer.getTotalSize() - (windowItems.at(-1)?.end ?? 0) : 0;\n\n const pin = (column: TableColumn<T>): { \"data-pin\"?: \"start\" | \"end\"; style?: React.CSSProperties } => {\n const position = column.getIsPinned();\n if (!position) return {};\n const offset = position === \"start\" ? column.getStart(\"start\") : column.getAfter(\"end\");\n return { \"data-pin\": position, style: { [\"--dt-pin\" as string]: `${offset}px` } };\n };\n const width = (column: TableColumn<T>): React.CSSProperties | undefined =>\n fixedLayout || byId.get(column.id)?.width ? { width: column.getSize() } : undefined;\n\n const message = (content: React.ReactNode, alert?: boolean) => (\n <tr role=\"row\" className={s.tr({ className: \"hover:bg-transparent\" })}>\n <td role=\"cell\" colSpan={span} data-card=\"message\" className={s.td({ className: s.message() })}>\n {alert ? <div role=\"alert\">{content}</div> : content}\n </td>\n </tr>\n );\n\n const cardOf = (column: DataTableColumn<T> | undefined) => (column?.card === \"title\" ? \"title\" : column?.card === \"hidden\" ? \"hidden\" : undefined);\n\n const dataCell = (row: TableRow<T>, cell: TableCell<T>, first: boolean) => {\n const column = byId.get(cell.column.id);\n if (!column) return null;\n const { style, ...pinned } = pin(cell.column);\n let content: React.ReactNode;\n if (row.getIsGrouped()) {\n const leaves = row.getLeafRows().filter((r) => !r.getIsGrouped()).map((r) => r.original);\n if (cell.column.id === row.groupingColumnId) {\n const value = display(row.groupingValue as CellValue);\n content = (\n <button type=\"button\" className={s.toggle({ className: \"px-1.5 font-semibold text-fg\" })} aria-expanded={row.getIsExpanded()} onClick={row.getToggleExpandedHandler()}>\n <ChevronGlyph direction=\"right\" className=\"h-4 w-4\" />\n {labels.group(value, leaves.length)}\n </button>\n );\n } else content = column.aggregate ? column.aggregate(leaves) : null;\n } else content = column.cell ? column.cell(row.original) : display(valueOf(column, row.original));\n return (\n <td\n role=\"cell\"\n key={cell.id}\n data-label={column.header}\n data-card={row.getIsGrouped() ? (cell.column.id === row.groupingColumnId ? \"title\" : column.aggregate ? undefined : \"hidden\") : cardOf(column)}\n {...pinned}\n className={s.td({ className: ALIGN[column.align ?? \"start\"] })}\n style={{ ...style, ...(first && row.depth > 0 && !row.getIsGrouped() ? { paddingInlineStart: `${1 + row.depth * 1.25}rem` } : {}) }}\n >\n {content}\n </td>\n );\n };\n\n const renderRow = (row: TableRow<T>, index: number) => {\n const isChosen = chosen.has(row.id);\n const grouped = row.getIsGrouped();\n const canExpand = !grouped && (renderDetail ? true : row.getCanExpand());\n const cells = row.getVisibleCells();\n const main = (\n <tr\n role=\"row\"\n key={row.id}\n data-index={windowItems ? index : undefined}\n ref={windowItems ? virtualizer.measureElement : undefined}\n aria-rowindex={virtualized ? index + 2 : undefined}\n data-state={isChosen ? \"selected\" : undefined}\n data-group={grouped ? \"\" : undefined}\n className={s.tr({ className: grouped ? s.groupRow() : undefined })}\n >\n {selectable && (\n <td role=\"cell\" className={s.td({ className: s.select() })}>\n {grouped ? null : <Checkbox checked={isChosen} onCheckedChange={() => row.toggleSelected()} aria-label={labels.selectRow(nameOf(row))} />}\n </td>\n )}\n {hasExpander && (\n <td role=\"cell\" className={s.td({ className: s.expander() })}>\n {canExpand ? (\n <button type=\"button\" className={s.toggle()} aria-expanded={row.getIsExpanded()} aria-label={labels.expandRow(nameOf(row))} onClick={row.getToggleExpandedHandler()}>\n <ChevronGlyph direction=\"right\" className=\"h-4 w-4\" />\n </button>\n ) : null}\n </td>\n )}\n {cells.map((cell, i) => dataCell(row, cell, i === 0))}\n </tr>\n );\n if (!renderDetail || grouped || !row.getIsExpanded() || virtualized) return main;\n return (\n <React.Fragment key={row.id}>\n {main}\n <tr role=\"row\" className={s.tr({ className: \"hover:bg-transparent\" })}>\n <td role=\"cell\" colSpan={span} data-card=\"message\" className={s.td({ className: s.detail() })}>\n {renderDetail(row.original)}\n </td>\n </tr>\n </React.Fragment>\n );\n };\n\n let body: React.ReactNode;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) => (\n <tr role=\"row\" key={`loading-${i}`} aria-hidden className={s.tr()}>\n {selectable && <td role=\"cell\" className={s.td({ className: s.select() })} />}\n {hasExpander && <td role=\"cell\" className={s.td({ className: s.expander() })} />}\n {visibleColumns.map((column) => (\n <td role=\"cell\" key={column.id} data-card={cardOf(byId.get(column.id))} className={s.td()}>\n <div className={s.skeleton()} />\n </td>\n ))}\n </tr>\n ));\n } else if (error) body = message(error, true);\n else if (pageRows.length === 0) body = message(empty ?? labels.empty);\n else if (windowItems) body = windowItems.map((item) => renderRow(pageRows[item.index] as TableRow<T>, item.index));\n else body = pageRows.map((row, i) => renderRow(row, i));\n\n const headers = table.getHeaderGroups().at(-1)?.headers ?? [];\n const tableElement = (\n <table\n role=\"table\"\n aria-busy={loading || undefined}\n aria-rowcount={virtualized ? pageRows.length + 1 : undefined}\n className={s.table({ className: fixedLayout ? \"table-fixed\" : undefined })}\n style={fixedLayout ? { minWidth: table.getTotalSize() + (selectable ? 40 : 0) + (hasExpander ? 40 : 0) } : undefined}\n >\n <caption className={showCaption ? s.caption() : \"sr-only\"}>\n {caption}\n {loading ? <span className=\"sr-only\">{` — ${labels.loading}`}</span> : null}\n </caption>\n <thead role=\"rowgroup\" className={s.thead({ className: virtualized ? \"sticky top-0 z-10 bg-surface-2\" : undefined })}>\n <tr role=\"row\" aria-rowindex={virtualized ? 1 : undefined} className={s.headRow()}>\n {selectable && (\n <th role=\"columnheader\" scope=\"col\" data-keep=\"\" className={s.th({ className: s.select() })}>\n <Checkbox\n checked={allChosen ? true : someChosen ? \"indeterminate\" : false}\n onCheckedChange={toggleAll}\n disabled={loading || selectableIds.length === 0}\n aria-label={labels.selectAll}\n />\n </th>\n )}\n {hasExpander && (\n <th role=\"columnheader\" scope=\"col\" className={s.th({ className: s.expander() })}>\n <span className=\"sr-only\">{labels.details}</span>\n </th>\n )}\n {headers.map((header) => {\n const column = byId.get(header.column.id);\n if (!column) return null;\n const sorted = header.column.getIsSorted();\n const direction: SortDirection | undefined = sorted === \"asc\" ? \"ascending\" : sorted === \"desc\" ? \"descending\" : undefined;\n const { style, ...pinned } = pin(header.column);\n return (\n <th\n role=\"columnheader\"\n scope=\"col\"\n key={header.id}\n aria-sort={column.sortable ? (direction ?? \"none\") : undefined}\n data-keep={column.sortable ? \"\" : undefined}\n {...pinned}\n className={s.th({ className: ALIGN[column.align ?? \"start\"] })}\n style={{ ...style, ...width(header.column) }}\n >\n {column.sortable ? (\n <button type=\"button\" aria-pressed={Boolean(direction)} className={s.sortButton()} onClick={() => header.column.toggleSorting(undefined, false)}>\n {column.header}\n <SortGlyph direction={direction} className=\"h-3.5 w-3.5\" />\n </button>\n ) : column.headerHidden ? (\n <span className=\"sr-only\">{column.header}</span>\n ) : (\n column.header\n )}\n {resizing && header.column.getCanResize() ? (\n <ResizeHandle\n label={labels.resize(column.header)}\n size={header.column.getSize()}\n min={column.minWidth ?? 64}\n resizing={header.column.getIsResizing()}\n className={s.resizer()}\n onPointerStart={header.getResizeHandler()}\n onSize={(size) => setSizing((old: Record<string, number>) => ({ ...old, [header.column.id]: size }))}\n />\n ) : null}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody role=\"rowgroup\" className={s.tbody()}>\n {before > 0 && (\n <tr aria-hidden style={{ height: before }}>\n <td colSpan={span} />\n </tr>\n )}\n {body}\n {after > 0 && (\n <tr aria-hidden style={{ height: after }}>\n <td colSpan={span} />\n </tr>\n )}\n </tbody>\n </table>\n );\n\n const context: Context = {\n table: table as unknown as DataTableInstance<object>,\n columns: columns as readonly DataTableColumn<object>[],\n labels,\n filters,\n setFilters: changeFilters,\n resultCount: leafCount,\n exportRows: () => table.getSortedRowModel().flatRows.filter((r) => !r.getIsGrouped()).map((r) => r.original),\n manualFiltering: Boolean(manual?.filtering),\n };\n\n const pagination = paginated ? (\n <Pagination\n page={Math.min(page, pageCount)}\n pageCount={pageCount}\n onPageChange={changePage}\n pageSize={pageSizeOptions ? pageSize : undefined}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={pageSizeOptions ? changePageSize : undefined}\n disabled={loading}\n labels={labels.pagination}\n />\n ) : null;\n\n return (\n <DataTableContext.Provider value={context}>\n <div className={s.root({ className })}>\n {toolbar ? <div className={s.toolbar()}>{toolbar}</div> : null}\n {virtualized ? (\n // A scrolling region the keyboard can reach: Tab lands on it, the arrows scroll it.\n <div\n ref={scroller}\n tabIndex={0}\n role=\"region\"\n aria-label={caption}\n className={s.scroller({ className: \"overflow-y-auto focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\" })}\n style={{ height: virtualized.height }}\n >\n {tableElement}\n </div>\n ) : (\n <div className={s.scroller()}>{tableElement}</div>\n )}\n {pagination || footer ? (\n <div className={s.footer({ className: \"flex flex-col gap-3\" })}>\n {pagination}\n {footer}\n </div>\n ) : null}\n </div>\n </DataTableContext.Provider>\n );\n}\n\n/** The handle on a header's edge: drag it, or focus it and use ← → (Shift for larger steps). */\nfunction ResizeHandle({\n label,\n size,\n min,\n resizing,\n className,\n onPointerStart,\n onSize,\n}: {\n label: string;\n size: number;\n min: number;\n resizing: boolean;\n className: string;\n onPointerStart: (event: unknown) => void;\n onSize: (size: number) => void;\n}) {\n return (\n // A focusable separator is interactive (WAI-ARIA \"window splitter\"): its value is the width, the arrows change it.\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={label}\n aria-valuenow={Math.round(size)}\n aria-valuemin={min}\n tabIndex={0}\n data-resizing={resizing ? \"\" : undefined}\n className={className}\n onMouseDown={onPointerStart}\n onTouchStart={onPointerStart}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n const step = event.shiftKey ? 48 : 16;\n if (event.key === \"ArrowLeft\") onSize(Math.max(min, size - step));\n else if (event.key === \"ArrowRight\") onSize(size + step);\n else return;\n event.preventDefault();\n }}\n />\n );\n}\n","// Server-safe: no hook, no context. A `<nav>` named by `labels.nav`; the current page is `aria-current=\"page\"`.\n// Two modes: pages (`page` + `pageCount`: numbers with ellipses, which fold into \"Page 3 of 12\" in a narrow container)\n// and cursor (`hasPrevious` / `hasNext`: an API that only knows the next and previous pages). Links (`getHref`) when\n// the page lives in the address — the right default for a list a search engine or a shared link should reach — or\n// buttons (`onPageChange`).\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronGlyph } from \"../glyphs\";\n\nexport const pagination = tv({\n slots: {\n root: \"@container flex w-full flex-wrap items-center justify-between gap-3 text-sm\",\n list: \"flex items-center gap-1\",\n pages: \"hidden items-center gap-1 @md:flex\",\n compact: \"px-2 text-xs font-semibold tabular-nums text-fg-secondary @md:hidden\",\n item:\n \"inline-flex h-9 min-w-9 select-none items-center justify-center gap-1.5 rounded-lg px-2.5 text-sm font-semibold tabular-nums text-fg-secondary \" +\n \"transition-colors hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"aria-[current=page]:bg-accent aria-[current=page]:text-on-accent aria-[current=page]:hover:bg-accent \" +\n \"aria-disabled:pointer-events-none aria-disabled:opacity-40 disabled:pointer-events-none disabled:opacity-40\",\n edge: \"border border-border-default bg-surface-1 px-3\",\n ellipsis: \"inline-flex h-9 min-w-6 items-end justify-center pb-2 text-fg-muted\",\n status: \"text-xs text-fg-secondary tabular-nums\",\n size: \"flex items-center gap-2 text-xs text-fg-secondary\",\n select:\n \"h-9 rounded-lg border border-border-default bg-surface-2 px-2 text-sm text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n },\n});\n\nexport type PaginationLabels = {\n /** The accessible name of the navigation (\"Pagination\", \"Pages of results\"). */\n nav: string;\n /** The previous-page control. */\n previous: string;\n /** The next-page control. */\n next: string;\n /** The accessible name of a page number: `(3) => \"Page 3\"`. */\n page: (page: number) => string;\n /** The folded form, in a narrow container: `(3, 12) => \"Page 3 of 12\"`. */\n compact: (page: number, pageCount: number) => string;\n /** The label of the page-size select (\"Rows per page\"). */\n pageSize: string;\n};\n\n/** The English words, for a quick start — pass your translations through `labels`. */\nexport const paginationLabels: PaginationLabels = {\n nav: \"Pagination\",\n previous: \"Previous\",\n next: \"Next\",\n page: (page) => `Page ${page}`,\n compact: (page, count) => `Page ${page} of ${count}`,\n pageSize: \"Rows per page\",\n};\n\n/**\n * The pages to show: the first and last `boundaries`, the current page and its `siblings`, and `\"…\"` where pages are\n * skipped. A gap of a single page shows that page instead of an ellipsis; few pages are all shown.\n */\nexport function pageRange(page: number, pageCount: number, siblings = 1, boundaries = 1): (number | \"…\")[] {\n // Few enough pages to show them all in the room the folded form takes: no ellipsis.\n if (pageCount <= 2 * boundaries + 2 * siblings + 3) return Array.from({ length: Math.max(0, pageCount) }, (_, i) => i + 1);\n const pages = new Set<number>();\n for (let i = 1; i <= Math.min(boundaries, pageCount); i += 1) pages.add(i);\n for (let i = Math.max(1, pageCount - boundaries + 1); i <= pageCount; i += 1) pages.add(i);\n for (let i = Math.max(1, page - siblings); i <= Math.min(pageCount, page + siblings); i += 1) pages.add(i);\n const sorted = [...pages].sort((a, b) => a - b);\n const out: (number | \"…\")[] = [];\n sorted.forEach((n, i) => {\n const prev = sorted[i - 1];\n if (prev !== undefined && n - prev === 2) out.push(prev + 1);\n else if (prev !== undefined && n - prev > 2) out.push(\"…\");\n out.push(n);\n });\n return out;\n}\n\nexport type PaginationProps = Omit<React.ComponentProps<\"nav\">, \"children\"> & {\n /** Pages mode: the current page, from 1. */\n page?: number;\n /** Pages mode: how many pages there are. Without it, the pagination is in cursor mode. */\n pageCount?: number;\n /** Called with the page asked for (buttons). Ignored for the pages `getHref` turns into links. */\n onPageChange?: (page: number) => void;\n /** The address of a page: the pages become links (crawlable, shareable, the state in the URL). */\n getHref?: (page: number) => string;\n /** Cursor mode: whether there is a previous page. */\n hasPrevious?: boolean;\n /** Cursor mode: whether there is a next page. */\n hasNext?: boolean;\n /** Cursor mode: called by the previous control. */\n onPrevious?: () => void;\n /** Cursor mode: called by the next control. */\n onNext?: () => void;\n /** Pages shown on each side of the current one. Default 1. */\n siblings?: number;\n /** Pages always shown at each end. Default 1. */\n boundaries?: number;\n /** A text beside the controls, read as is: \"41–60 of 1,284\", \"12 results\". */\n status?: React.ReactNode;\n /** The page size, with `pageSizeOptions` and `onPageSizeChange`: a select of rows per page. */\n pageSize?: number;\n /** The sizes offered (`[10, 20, 50]`). */\n pageSizeOptions?: readonly number[];\n /** Called with the size chosen. */\n onPageSizeChange?: (size: number) => void;\n /** Disables every control (a page is loading). */\n disabled?: boolean;\n /** The words, passed translated; English by default. */\n labels?: Partial<PaginationLabels>;\n};\n\ntype ItemProps = {\n href?: string;\n onClick?: () => void;\n disabled?: boolean;\n current?: boolean;\n label: string;\n className: string;\n children: React.ReactNode;\n};\n\nfunction Item({ href, onClick, disabled, current, label, className, children }: ItemProps) {\n const common = { \"aria-label\": label, \"aria-current\": current ? (\"page\" as const) : undefined, className };\n if (href && !disabled) {\n return (\n <a href={href} onClick={onClick} {...common}>\n {children}\n </a>\n );\n }\n if (href) {\n return (\n <a role=\"link\" aria-disabled {...common}>\n {children}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} disabled={disabled} {...common}>\n {children}\n </button>\n );\n}\n\n/** Moves through a long list: page numbers (folded on a narrow screen) or previous / next on a cursor. */\nexport function Pagination({\n page = 1,\n pageCount,\n onPageChange,\n getHref,\n hasPrevious,\n hasNext,\n onPrevious,\n onNext,\n siblings = 1,\n boundaries = 1,\n status,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n disabled,\n labels: given,\n className,\n ...props\n}: PaginationProps) {\n const s = pagination();\n const labels = { ...paginationLabels, ...given };\n const paged = pageCount !== undefined;\n const count = Math.max(1, pageCount ?? 1);\n const current = Math.min(Math.max(1, page), count);\n const canPrevious = paged ? current > 1 : Boolean(hasPrevious);\n const canNext = paged ? current < count : Boolean(hasNext);\n const go = (target: number) => () => onPageChange?.(target);\n const href = (target: number) => (paged && getHref ? getHref(target) : undefined);\n\n return (\n <nav aria-label={labels.nav} className={s.root({ className })} {...props}>\n {status !== undefined || pageSizeOptions ? (\n <div className=\"flex flex-wrap items-center gap-4\">\n {status !== undefined && <p className={s.status()}>{status}</p>}\n {pageSizeOptions && pageSize !== undefined && (\n <label className={s.size()}>\n {labels.pageSize}\n <select\n className={s.select()}\n value={pageSize}\n disabled={disabled}\n onChange={(event) => onPageSizeChange?.(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n ) : null}\n <ul className={s.list()}>\n <li>\n <Item\n href={href(current - 1)}\n onClick={paged ? go(current - 1) : onPrevious}\n disabled={disabled || !canPrevious}\n label={labels.previous}\n className={s.item({ className: s.edge() })}\n >\n <ChevronGlyph direction=\"left\" />\n <span className=\"hidden @lg:inline\">{labels.previous}</span>\n </Item>\n </li>\n {paged && (\n <>\n <li className={s.pages()}>\n <ul className=\"contents\">\n {pageRange(current, count, siblings, boundaries).map((n, i) =>\n n === \"…\" ? (\n <li key={`gap-${i}`} aria-hidden className={s.ellipsis()}>\n …\n </li>\n ) : (\n <li key={n}>\n <Item href={href(n)} onClick={go(n)} disabled={disabled} current={n === current} label={labels.page(n)} className={s.item()}>\n {n}\n </Item>\n </li>\n ),\n )}\n </ul>\n </li>\n <li className={s.compact()}>\n {labels.compact(current, count)}\n </li>\n </>\n )}\n <li>\n <Item\n href={href(current + 1)}\n onClick={paged ? go(current + 1) : onNext}\n disabled={disabled || !canNext}\n label={labels.next}\n className={s.item({ className: s.edge() })}\n >\n <span className=\"hidden @lg:inline\">{labels.next}</span>\n <ChevronGlyph direction=\"right\" />\n </Item>\n </li>\n </ul>\n </nav>\n );\n}\n","// The engine of DataTable: TanStack Table v9 behind the Krizaka facade (ADR-001 — a product imports\n// `@krizaka/ui/data-table`, never `@tanstack/*`). The features are registered once, at module scope (stable input),\n// and the Krizaka API (`sort`, `filters`, `selected`, `page`… in the app's words) is translated to TanStack's state\n// here — nothing else of the component knows TanStack's shapes.\nimport {\n type Cell,\n type Column,\n type ColumnDef,\n columnFacetingFeature,\n columnFilteringFeature,\n columnGroupingFeature,\n columnPinningFeature,\n columnResizingFeature,\n type columnResizingState as ColumnResizingState,\n columnSizingFeature,\n columnVisibilityFeature,\n createExpandedRowModel,\n createFacetedMinMaxValues,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createGroupedRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n type FilterFn,\n type ReactTable,\n type Row,\n type RowData,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n type SortFn,\n tableFeatures,\n} from \"@tanstack/react-table\";\n\nexport const features = tableFeatures({\n columnFilteringFeature,\n filteredRowModel: createFilteredRowModel(),\n columnFacetingFeature,\n facetedRowModel: createFacetedRowModel(),\n facetedUniqueValues: createFacetedUniqueValues(),\n facetedMinMaxValues: createFacetedMinMaxValues(),\n columnGroupingFeature,\n groupedRowModel: createGroupedRowModel(),\n rowSortingFeature,\n sortedRowModel: createSortedRowModel(),\n rowExpandingFeature,\n expandedRowModel: createExpandedRowModel(),\n rowPaginationFeature,\n paginatedRowModel: createPaginatedRowModel(),\n rowSelectionFeature,\n columnVisibilityFeature,\n columnPinningFeature,\n columnSizingFeature,\n columnResizingFeature,\n});\n\nexport type Features = typeof features;\n/** The TanStack Table instance behind a DataTable — the escape hatch of `useDataTable()`. */\nexport type DataTableInstance<T extends RowData> = ReactTable<Features, T>;\nexport type TableRow<T extends RowData> = Row<Features, T>;\nexport type TableCell<T extends RowData> = Cell<Features, T, unknown>;\nexport type TableColumn<T extends RowData> = Column<Features, T, unknown>;\n\n/** What a cell holds for sorting, filtering and the CSV export: a string, a number, a date, a boolean, or nothing. */\nexport type CellValue = string | number | boolean | Date | null | undefined;\n\n/** A filter's value: a text (`text`), the values chosen (`facet`), or bounds, either open (`range`). */\nexport type FilterValue = string | readonly string[] | readonly [number | null, number | null];\n/** The filters in force, by column id. */\nexport type DataTableFilterState = Readonly<Record<string, FilterValue>>;\n\nconst empty = (value: CellValue) => value == null || value === \"\";\n\n/** The order of two values: empty last, dates and numbers by value, text in natural order (\"item 2\" < \"item 10\"). */\nexport function compareValues(a: CellValue, b: CellValue): number {\n if (empty(a)) return empty(b) ? 0 : 1;\n if (empty(b)) return -1;\n if (a instanceof Date || b instanceof Date) return Number(a) - Number(b);\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n}\n\nexport const sortByValue: SortFn<Features, never> = (a, b, id) => compareValues(a.getValue(id) as CellValue, b.getValue(id) as CellValue);\n\n/** A text filter: the value contains the words, case and accents ignored. */\nexport const filterText: FilterFn<Features, never> = (row, id, query: string) =>\n String(row.getValue(id) ?? \"\")\n .normalize(\"NFD\")\n .toLocaleLowerCase()\n .includes(query.normalize(\"NFD\").toLocaleLowerCase().trim());\nfilterText.autoRemove = (value: unknown) => typeof value !== \"string\" || value.trim() === \"\";\n\n/** A facet filter: the value is one of those chosen. */\nexport const filterFacet: FilterFn<Features, never> = (row, id, chosen: readonly string[]) => chosen.includes(String(row.getValue(id) ?? \"\"));\nfilterFacet.autoRemove = (value: unknown) => !Array.isArray(value) || value.length === 0;\n\n/** A range filter: the value (a number or a date) lies within the bounds, either of which may be open. */\nexport const filterRange: FilterFn<Features, never> = (row, id, [min, max]: readonly [number | null, number | null]) => {\n const raw = row.getValue(id) as CellValue;\n if (empty(raw)) return false;\n const value = Number(raw);\n return (min == null || value >= min) && (max == null || value <= max);\n};\nfilterRange.autoRemove = (value: unknown) => !Array.isArray(value) || (value[0] == null && value[1] == null);\n\nexport const FILTERS = { text: filterText, facet: filterFacet, range: filterRange } as const;\n\nexport type { ColumnDef, ColumnResizingState, RowData };\n","// Server-safe: no hook, no context. `buttonVariants` styles a <Link> or a Server Component without the component.\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { LoaderGlyph } from \"../spinner/glyph\";\n\nexport const buttonVariants = tv({\n base:\n \"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap font-semibold transition-all \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"disabled:pointer-events-none disabled:opacity-40 data-loading:cursor-progress active:scale-[0.98] \" +\n // Busy is not unavailable: a loading button keeps its colour (it is disabled only so it is not pressed twice).\n \"[&[data-loading]]:opacity-100\",\n variants: {\n variant: {\n primary: \"bg-accent text-on-accent shadow-sm hover:bg-accent-hover\",\n // The brand's signature: accent → accent-2 (on-accent reads on both stops, tested in @krizaka/tokens).\n gradient: \"bg-linear-to-r from-accent to-accent-2 text-on-accent shadow-sm hover:brightness-110\",\n secondary: \"border border-border-default bg-surface-2 text-fg hover:border-border-strong hover:bg-surface-3\",\n outline: \"border border-border-default bg-transparent text-fg hover:border-accent hover:text-fg-accent\",\n ghost: \"text-fg-secondary hover:bg-surface-2 hover:text-fg\",\n // The border and the tint carry the danger; the label stays the primary text role, legible on the tint at rest\n // and hovered over every surface (`text-fg-danger` is for text set directly on a surface).\n danger: \"border border-danger/50 bg-danger/10 text-fg hover:border-danger hover:bg-danger/20\",\n },\n size: { sm: \"h-8 px-3 text-xs\", md: \"h-10 px-4 text-sm\", lg: \"h-12 px-6 text-sm\", icon: \"h-10 w-10\" },\n // `cut`: the Krizaka chamfer — 45° corners (CSS corner-shape, where supported; rounded elsewhere). The border, the\n // focus ring and the hover follow the cut, unlike a clip-path.\n shape: { rounded: \"rounded-lg\", pill: \"rounded-full\", cut: \"rounded-[10px] [corner-shape:bevel]\" },\n },\n defaultVariants: { variant: \"secondary\", size: \"md\", shape: \"rounded\" },\n});\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> &\n ButtonVariants & {\n /**\n * The look: `primary` (the accent), `gradient` (accent → accent-2), `secondary` (a raised surface), `outline`,\n * `ghost`, `danger`.\n * @default \"secondary\"\n */\n variant?: ButtonVariants[\"variant\"];\n /**\n * sm · md · lg, or `icon` (a square).\n * @default \"md\"\n */\n size?: ButtonVariants[\"size\"];\n /**\n * rounded · pill · cut (45° corners, the Krizaka chamfer).\n * @default \"rounded\"\n */\n shape?: ButtonVariants[\"shape\"];\n /** Renders the child (e.g. a <Link>) instead of the <button>, with props, classes and ref merged. */\n asChild?: boolean;\n /**\n * Disables and signals the wait (aria-busy, data-loading) and shows the Krizaka loader glyph before the label; the\n * button keeps its colour.\n */\n loading?: boolean;\n /**\n * Between 0 and 1, while `loading`: the glyph's trace and a light fill across the button grow to the value (an\n * upload, an export).\n */\n progress?: number | null;\n /**\n * How the action ended: `success` draws a check, `error` a cross (and the button shakes its head once); a ring of\n * the status colour opens around it. Clear it to return to rest.\n */\n status?: \"success\" | \"error\" | null;\n /** A message announced politely by assistive technology when it changes (“Saved”, “Upload failed”) — passed translated. */\n announce?: string;\n /**\n * Shows the glyph while `loading` / with a `status`. `false`: you draw your own.\n * @default true\n */\n indicator?: boolean;\n /** A sheen of light crosses the button on hover — for the one action a page is about. */\n shimmer?: boolean;\n /** The button leans a few pixels toward a fine pointer (driven by `MotionObserver`; never under reduced motion or on touch). */\n magnetic?: boolean;\n };\n\nconst STATUS_TEXT = { success: \"text-fg-success\", error: \"text-fg-danger\" } as const;\n\nexport function Button({\n asChild,\n loading,\n progress,\n status,\n announce,\n indicator = true,\n shimmer,\n magnetic,\n variant,\n size,\n shape,\n className,\n disabled,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n const known = loading && typeof progress === \"number\" && Number.isFinite(progress);\n const ratio = known ? Math.min(1, Math.max(0, progress)) : 0;\n const glyph = indicator && !asChild && (loading || status) ? (status ?? \"loading\") : null;\n // On a filled variant the glyph stays in the label's colour; on the others it takes the status colour.\n const filled = variant === \"primary\" || variant === \"gradient\";\n const button = (\n <Comp\n type={asChild ? undefined : \"button\"}\n aria-busy={loading || undefined}\n data-loading={loading ? \"\" : undefined}\n data-variant={variant ?? \"secondary\"}\n data-kz-status={status ?? undefined}\n data-kz-magnetic={magnetic ? \"\" : undefined}\n disabled={asChild ? undefined : disabled || loading}\n aria-disabled={asChild && (disabled || loading) ? true : undefined}\n className={buttonVariants({\n variant,\n size,\n shape,\n className: [known && \"relative isolate overflow-hidden\", shimmer && \"kz-sheen\", className].filter(Boolean).join(\" \") || undefined,\n })}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {known && (\n <span aria-hidden className=\"absolute inset-y-0 left-0 -z-10 bg-current opacity-15 transition-[width] duration-500\" style={{ width: `${ratio * 100}%` }} />\n )}\n {glyph && (\n <span\n aria-hidden\n data-slot=\"indicator\"\n className=\"-my-1 grid grid-cols-[1fr] transition-[grid-template-columns,margin,opacity] duration-300 starting:-mr-2 starting:grid-cols-[0fr] starting:opacity-0\"\n >\n <span className=\"overflow-hidden\">\n <LoaderGlyph state={glyph} value={known ? ratio : null} className={[\"h-4 w-4\", glyph !== \"loading\" && !filled && STATUS_TEXT[glyph]].filter(Boolean).join(\" \")} />\n </span>\n </span>\n )}\n {children}\n </>\n )}\n </Comp>\n );\n if (announce === undefined || asChild) return button;\n return (\n <>\n {button}\n <span role=\"status\" className=\"sr-only\">\n {announce}\n </span>\n </>\n );\n}\n\nexport type IconButtonProps = Omit<ButtonProps, \"size\"> & {\n /** The accessible name (and tooltip) of the button — required, passed translated. */\n label: string;\n /**\n * sm · md · lg, or `icon` (a square).\n * @default \"icon\"\n */\n size?: ButtonProps[\"size\"];\n};\n\n/** An icon-only button: `label` is required, it is its accessible name. Loading or with a status, the glyph takes the icon's place. */\nexport function IconButton({ label, size = \"icon\", children, ...props }: IconButtonProps) {\n const swap = props.indicator !== false && !props.asChild && (props.loading || props.status);\n return (\n <Button aria-label={label} title={label} size={size} {...props}>\n {swap ? null : children}\n </Button>\n );\n}\n","// The Krizaka loader glyph, server-safe: a hexagon (the marks' shape) traced by a segment of light around a node that\n// breathes; determinate, it fills to its value; done, the trace closes and a check (or a cross) draws itself. Animated by\n// motion.css (`kz-loader-*`); still under prefers-reduced-motion — a segment at rest and the node lit, never blank.\nimport type * as React from \"react\";\n\n/** The hexagon, pointy top, radius 9 around (12, 12). */\nconst HEX = \"M12 3 19.79 7.5 19.79 16.5 12 21 4.21 16.5 4.21 7.5Z\";\n\n/** What the glyph shows: a wait (with an optional value), or how it ended. */\nexport type LoaderGlyphState = \"loading\" | \"success\" | \"error\";\n\nexport interface LoaderGlyphProps extends Omit<React.ComponentProps<\"svg\">, \"children\"> {\n /** loading · success · error. */\n state?: LoaderGlyphState;\n /** Between 0 and 1: a determinate wait, the trace grows to it. Absent: indeterminate. */\n value?: number | null;\n}\n\n/** The glyph alone (decorative): the Spinner, the Loader and the Button's `loading` draw it. */\nexport function LoaderGlyph({ state = \"loading\", value, ...props }: LoaderGlyphProps) {\n const known = typeof value === \"number\" && Number.isFinite(value);\n const fill = state !== \"loading\" ? 100 : known ? Math.round(Math.min(1, Math.max(0, value)) * 100) : null;\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden data-state={state} data-progress={fill === null ? undefined : fill} {...props}>\n <path d={HEX} stroke=\"currentColor\" strokeOpacity=\"0.22\" strokeWidth=\"2.2\" strokeLinejoin=\"round\" />\n <path\n d={HEX}\n pathLength={100}\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n className=\"kz-loader-trace\"\n strokeDasharray={fill === null ? undefined : `${fill} ${100 - fill}`}\n />\n {state === \"loading\" && <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill=\"currentColor\" className=\"kz-loader-node\" />}\n {state === \"success\" && <path d=\"M8.3 12.3l2.6 2.6 4.9-5.3\" pathLength={20} stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"kz-loader-mark\" />}\n {state === \"error\" && <path d=\"M9.4 9.4l5.2 5.2M14.6 9.4l-5.2 5.2\" pathLength={20} stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" className=\"kz-loader-mark\" />}\n </svg>\n );\n}\n","// Server-safe. The label ↔ control wiring is HTML (htmlFor / id, aria-describedby): no context.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\n\nexport const field = tv({\n slots: {\n root: \"flex flex-col gap-1.5\",\n label: \"text-xs font-semibold text-fg-secondary\",\n control:\n \"flex h-11 w-full rounded-lg border border-border-default bg-surface-2 px-3 text-sm text-fg placeholder:text-fg-muted \" +\n \"transition-[border-color,box-shadow] focus-visible:border-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-danger aria-invalid:ring-danger/30\",\n hint: \"text-xs text-fg-secondary\",\n // The message reads in the danger text role (≥ 4.5:1 on every surface, both themes); the dot is the danger fill.\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 selectWrap: \"relative flex w-full\",\n chevron: \"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-fg-secondary\",\n },\n});\nconst s = field();\n\nexport const Field = {\n Root: ({ className, ...props }: React.ComponentProps<\"div\">) => <div className={s.root({ className })} {...props} />,\n Label: ({ className, ...props }: React.ComponentProps<\"label\">) => <label className={s.label({ className })} {...props} />,\n Hint: ({ className, ...props }: React.ComponentProps<\"p\">) => <p className={s.hint({ className })} {...props} />,\n Error: ({ className, ...props }: React.ComponentProps<\"p\">) => <p role=\"alert\" className={s.error({ className })} {...props} />,\n};\n\ntype ControlProps = {\n /** Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n};\n\nconst invalidProps = (invalid?: boolean) => (invalid ? { \"aria-invalid\": true as const, \"data-invalid\": \"\" } : {});\n\nexport function Input({ invalid, className, ...props }: React.ComponentProps<\"input\"> & ControlProps) {\n return <input {...invalidProps(invalid)} className={s.control({ className })} {...props} />;\n}\n\nexport function Textarea({ invalid, className, ...props }: React.ComponentProps<\"textarea\"> & ControlProps) {\n return <textarea {...invalidProps(invalid)} className={s.control({ className: cn(\"h-auto min-h-24 py-2\", className) })} {...props} />;\n}\n\n/** A native <select>, styled like the other controls (the platform's menu: accessible and right on phones). */\nexport function Select({ invalid, className, ...props }: React.ComponentProps<\"select\"> & ControlProps) {\n return (\n <span className={s.selectWrap()}>\n <select {...invalidProps(invalid)} className={s.control({ className: cn(\"appearance-none pr-9\", className) })} {...props} />\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden className={s.chevron()}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </span>\n );\n}\n","// The toolbar of a DataTable — its filters (a FilterBar built from the columns), the columns menu and the CSV export —\n// connected to the table they sit in through `useDataTable()`. Words come from the table's `labels`.\nimport * as React from \"react\";\n\nimport { Button } from \"../button\";\nimport { DropdownMenu } from \"../dropdown-menu\";\nimport { Input } from \"../field\";\nimport { type ActiveFilter, FilterBar, FilterMenu } from \"../filter-bar\";\nimport { ChevronGlyph } from \"../glyphs\";\nimport { SearchField } from \"../search-field\";\nimport { dataTableCsv } from \"./csv\";\nimport { type DataTableColumn, useDataTable } from \"./data-table\";\nimport type { FilterValue } from \"./engine\";\n\nexport type DataTableFiltersProps = {\n /** The search's wait after the last key, in ms, before the filter applies (a request, in server mode). Default 250. */\n debounce?: number;\n /** More controls in the bar (a date range picker, a toggle). */\n children?: React.ReactNode;\n /** Classes merged on the bar. */\n className?: string;\n};\n\nconst asRange = (value: FilterValue | undefined): [number | null, number | null] =>\n Array.isArray(value) && value.length === 2 && (typeof value[0] !== \"string\" || typeof value[1] !== \"string\") ? [value[0] as number | null, value[1] as number | null] : [null, null];\nconst asList = (value: FilterValue | undefined): readonly string[] => (Array.isArray(value) ? (value as readonly string[]) : []);\nconst number = (text: string) => (text.trim() === \"\" || Number.isNaN(Number(text)) ? null : Number(text));\n\n/**\n * The filters of the table, from its columns: a search per `text` column, a menu of values (with their counts) per\n * `facet` column, two bounds per `range` column; the filters in force as removable chips, \"clear all\", and the count\n * of results, announced.\n */\nexport function DataTableFilters({ debounce = 250, children, className }: DataTableFiltersProps) {\n const { table, columns, labels, filters, setFilters, resultCount, manualFiltering } = useDataTable();\n const set = (id: string, value: FilterValue | null) => {\n const next = { ...filters };\n if (value === null || value === \"\" || (Array.isArray(value) && (value.length === 0 || (value.length === 2 && value[0] == null && value[1] == null)))) delete next[id];\n else next[id] = value;\n setFilters(next);\n };\n const filterable = columns.filter((column) => column.filter);\n const optionsOf = (column: DataTableColumn<object>) => {\n if (column.options) return column.options;\n // The values found in the rows, with their counts — the other filters applied (TanStack's facets).\n const facets = manualFiltering ? new Map<unknown, number>() : (table.getColumn(column.id)?.getFacetedUniqueValues() ?? new Map<unknown, number>());\n return [...facets.entries()]\n .filter(([value]) => value != null && value !== \"\")\n .map(([value, count]) => ({ value: String(value), label: String(value), count }))\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { numeric: true }));\n };\n const active: ActiveFilter[] = filterable.flatMap((column) => {\n const value = filters[column.id];\n if (value === undefined) return [];\n let text: string;\n if (column.filter === \"facet\") {\n const options = optionsOf(column);\n text = asList(value).map((v) => options.find((o) => o.value === v)?.label ?? v).join(\", \");\n } else if (column.filter === \"range\") {\n const [min, max] = asRange(value);\n text = `${min ?? \"…\"}–${max ?? \"…\"}`;\n } else text = String(value);\n const label = labels.activeFilter(column.header, text);\n return [{ id: column.id, label, onRemove: () => set(column.id, null) }];\n });\n return (\n <FilterBar\n label={labels.filters}\n active={active}\n onClearAll={() => setFilters({})}\n clearLabel={labels.clearFilters}\n removeLabel={labels.removeFilter}\n results={labels.results(resultCount)}\n className={className}\n >\n {filterable.map((column) => {\n if (column.filter === \"text\")\n return (\n <SearchField\n key={column.id}\n label={labels.search(column.header)}\n placeholder={labels.search(column.header)}\n value={typeof filters[column.id] === \"string\" ? undefined : \"\"}\n defaultValue={typeof filters[column.id] === \"string\" ? (filters[column.id] as string) : undefined}\n debounce={debounce}\n onSearch={(query) => set(column.id, query)}\n landmark={false}\n size=\"sm\"\n className=\"min-w-48 flex-1\"\n />\n );\n if (column.filter === \"facet\")\n return (\n <FilterMenu key={column.id} label={column.header} options={optionsOf(column)} value={asList(filters[column.id])} onValueChange={(value) => set(column.id, value)} />\n );\n const [min, max] = asRange(filters[column.id]);\n const bounds = manualFiltering ? undefined : table.getColumn(column.id)?.getFacetedMinMaxValues();\n return (\n <span key={column.id} className=\"inline-flex items-center gap-1.5\">\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n aria-label={labels.rangeFrom(column.header)}\n placeholder={bounds ? String(bounds[0]) : labels.rangeFrom(column.header)}\n value={min ?? \"\"}\n onChange={(event) => set(column.id, [number(event.currentTarget.value), max])}\n className=\"h-11 w-28\"\n />\n <span aria-hidden className=\"text-fg-secondary\">\n –\n </span>\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n aria-label={labels.rangeTo(column.header)}\n placeholder={bounds ? String(bounds[1]) : labels.rangeTo(column.header)}\n value={max ?? \"\"}\n onChange={(event) => set(column.id, [min, number(event.currentTarget.value)])}\n className=\"h-11 w-28\"\n />\n </span>\n );\n })}\n {children}\n </FilterBar>\n );\n}\n\nexport type DataTableColumnsMenuProps = {\n /** Opens the menu at first (a story, a test). */\n defaultOpen?: boolean;\n /** Classes merged on the button. */\n className?: string;\n};\n\n/** A menu of the `hideable` columns, each a checkbox: the person chooses what the table shows. */\nexport function DataTableColumnsMenu({ defaultOpen, className }: DataTableColumnsMenuProps) {\n const { table, columns, labels } = useDataTable();\n return (\n <DropdownMenu.Root defaultOpen={defaultOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" size=\"sm\" className={className}>\n {labels.columns}\n <ChevronGlyph className=\"h-4 w-4\" />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" aria-label={labels.columns}>\n {columns\n .filter((column) => column.hideable !== false)\n .map((column) => {\n const instance = table.getColumn(column.id);\n return (\n <DropdownMenu.CheckboxItem\n key={column.id}\n checked={instance?.getIsVisible() ?? true}\n onSelect={(event) => event.preventDefault()}\n onCheckedChange={(checked) => instance?.toggleVisibility(Boolean(checked))}\n >\n {column.header}\n </DropdownMenu.CheckboxItem>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nexport type DataTableExportProps = {\n /** The file's name. Default `\"export.csv\"`. */\n filename?: string;\n /** Receives the CSV instead of downloading it (send it to the server, a test). */\n onExport?: (csv: string) => void;\n /** Classes merged on the button. */\n className?: string;\n};\n\n/** Downloads what the table shows — the filtered and sorted rows of every page, the visible columns — as CSV. */\nexport function DataTableExport({ filename = \"export.csv\", onExport, className }: DataTableExportProps) {\n const { table, columns, labels, exportRows } = useDataTable();\n const run = () => {\n const visible = columns.filter((column) => table.getColumn(column.id)?.getIsVisible() !== false);\n const csv = dataTableCsv(exportRows(), visible);\n if (onExport) return onExport(csv);\n const url = URL.createObjectURL(new Blob([\"\", csv], { type: \"text/csv;charset=utf-8\" }));\n const link = Object.assign(document.createElement(\"a\"), { href: url, download: filename });\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n };\n return (\n <Button variant=\"outline\" size=\"sm\" className={className} onClick={run}>\n {labels.export}\n </Button>\n );\n}\n"],"mappings":"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","names":["tv","s","jsx","jsxs","tv","empty","s","pagination","tv","jsx","jsxs","Fragment","jsx","jsxs","tv","tv","jsx","jsxs","field","tv","jsx","jsx","jsxs"]}
|
package/dist/date-picker.d.ts
CHANGED
|
@@ -862,11 +862,13 @@ type WheelPickerProps = {
|
|
|
862
862
|
"aria-describedby"?: string;
|
|
863
863
|
/** Marks the group invalid (a danger edge): pair it with an error read through `aria-describedby`. */
|
|
864
864
|
invalid?: boolean;
|
|
865
|
+
/** Nothing is chosen yet: the values under the band stay quiet until a wheel is turned. */
|
|
866
|
+
unset?: boolean;
|
|
865
867
|
/** Classes merged on the root. */
|
|
866
868
|
className?: string;
|
|
867
869
|
};
|
|
868
870
|
/** The frame of one or several wheels: a raised surface, the lit band across them, a group named by `label`. */
|
|
869
|
-
declare function WheelPicker({ label, children, visible, "aria-describedby": describedBy, invalid, className }: WheelPickerProps): React.JSX.Element;
|
|
871
|
+
declare function WheelPicker({ label, children, visible, "aria-describedby": describedBy, invalid, unset, className }: WheelPickerProps): React.JSX.Element;
|
|
870
872
|
/** A divider between two wheels (`:` between the hours and the minutes). */
|
|
871
873
|
declare function WheelDivider({ children }: {
|
|
872
874
|
children: React.ReactNode;
|