@repraze/kernelkit 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -2
- package/dist/components/accordion.d.ts +13 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +33 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +24 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.js +49 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.d.ts +22 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +61 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +10 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/aspect-ratio.js +18 -0
- package/dist/components/aspect-ratio.js.map +1 -0
- package/dist/components/attachment.d.ts +27 -0
- package/dist/components/attachment.d.ts.map +1 -0
- package/dist/components/attachment.js +76 -0
- package/dist/components/attachment.js.map +1 -0
- package/dist/components/avatar.d.ts +18 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +38 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +18 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +49 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +11 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +40 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/bubble.d.ts +22 -0
- package/dist/components/bubble.d.ts.map +1 -0
- package/dist/components/bubble.js +72 -0
- package/dist/components/bubble.js.map +1 -0
- package/dist/components/button-group.d.ts +11 -0
- package/dist/components/button-group.d.ts.map +1 -0
- package/dist/components/button-group.js +38 -0
- package/dist/components/button-group.js.map +1 -0
- package/dist/components/button.d.ts +26 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +78 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +11 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +89 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/callout.d.ts +25 -0
- package/dist/components/callout.d.ts.map +1 -0
- package/dist/components/callout.js +40 -0
- package/dist/components/callout.js.map +1 -0
- package/dist/components/card.d.ts +43 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +80 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +31 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +120 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.d.ts +45 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +137 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox-group.d.ts +9 -0
- package/dist/components/checkbox-group.d.ts.map +1 -0
- package/dist/components/checkbox-group.js +14 -0
- package/dist/components/checkbox-group.js.map +1 -0
- package/dist/components/checkbox.d.ts +6 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +27 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/code-block.d.ts +29 -0
- package/dist/components/code-block.d.ts.map +1 -0
- package/dist/components/code-block.js +87 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/collapsible.d.ts +11 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/collapsible.js +21 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +26 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +66 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +25 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +48 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/context-menu.d.ts +32 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +58 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/copy-button.d.ts +21 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +34 -0
- package/dist/components/copy-button.js.map +1 -0
- package/dist/components/data-table/data-table-utils.d.ts +18 -0
- package/dist/components/data-table/data-table-utils.d.ts.map +1 -0
- package/dist/components/data-table/data-table-utils.js +92 -0
- package/dist/components/data-table/data-table-utils.js.map +1 -0
- package/dist/components/data-table/elements/data-table-base.d.ts +24 -0
- package/dist/components/data-table/elements/data-table-base.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-base.js +28 -0
- package/dist/components/data-table/elements/data-table-base.js.map +1 -0
- package/dist/components/data-table/elements/data-table-body.d.ts +8 -0
- package/dist/components/data-table/elements/data-table-body.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-body.js +16 -0
- package/dist/components/data-table/elements/data-table-body.js.map +1 -0
- package/dist/components/data-table/elements/data-table-cell.d.ts +12 -0
- package/dist/components/data-table/elements/data-table-cell.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-cell.js +23 -0
- package/dist/components/data-table/elements/data-table-cell.js.map +1 -0
- package/dist/components/data-table/elements/data-table-filter-row.d.ts +40 -0
- package/dist/components/data-table/elements/data-table-filter-row.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-filter-row.js +117 -0
- package/dist/components/data-table/elements/data-table-filter-row.js.map +1 -0
- package/dist/components/data-table/elements/data-table-foot.d.ts +9 -0
- package/dist/components/data-table/elements/data-table-foot.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-foot.js +11 -0
- package/dist/components/data-table/elements/data-table-foot.js.map +1 -0
- package/dist/components/data-table/elements/data-table-head.d.ts +9 -0
- package/dist/components/data-table/elements/data-table-head.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-head.js +11 -0
- package/dist/components/data-table/elements/data-table-head.js.map +1 -0
- package/dist/components/data-table/elements/data-table-info-row.d.ts +7 -0
- package/dist/components/data-table/elements/data-table-info-row.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-info-row.js +19 -0
- package/dist/components/data-table/elements/data-table-info-row.js.map +1 -0
- package/dist/components/data-table/elements/data-table-row.d.ts +13 -0
- package/dist/components/data-table/elements/data-table-row.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-row.js +19 -0
- package/dist/components/data-table/elements/data-table-row.js.map +1 -0
- package/dist/components/data-table/elements/data-table-scroll.d.ts +11 -0
- package/dist/components/data-table/elements/data-table-scroll.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-scroll.js +10 -0
- package/dist/components/data-table/elements/data-table-scroll.js.map +1 -0
- package/dist/components/data-table/elements/data-table-sort-row.d.ts +28 -0
- package/dist/components/data-table/elements/data-table-sort-row.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-sort-row.js +114 -0
- package/dist/components/data-table/elements/data-table-sort-row.js.map +1 -0
- package/dist/components/data-table/elements/data-table-title-row.d.ts +11 -0
- package/dist/components/data-table/elements/data-table-title-row.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-title-row.js +16 -0
- package/dist/components/data-table/elements/data-table-title-row.js.map +1 -0
- package/dist/components/data-table/elements/data-table-virtualized-body.d.ts +10 -0
- package/dist/components/data-table/elements/data-table-virtualized-body.d.ts.map +1 -0
- package/dist/components/data-table/elements/data-table-virtualized-body.js +38 -0
- package/dist/components/data-table/elements/data-table-virtualized-body.js.map +1 -0
- package/dist/components/data-table/set-utils.d.ts +41 -0
- package/dist/components/data-table/set-utils.d.ts.map +1 -0
- package/dist/components/data-table/set-utils.js +97 -0
- package/dist/components/data-table/set-utils.js.map +1 -0
- package/dist/components/data-table/views/data-table-filter-view.d.ts +18 -0
- package/dist/components/data-table/views/data-table-filter-view.d.ts.map +1 -0
- package/dist/components/data-table/views/data-table-filter-view.js +63 -0
- package/dist/components/data-table/views/data-table-filter-view.js.map +1 -0
- package/dist/components/data-table/views/data-table-prop-view.d.ts +297 -0
- package/dist/components/data-table/views/data-table-prop-view.d.ts.map +1 -0
- package/dist/components/data-table/views/data-table-prop-view.js +44 -0
- package/dist/components/data-table/views/data-table-prop-view.js.map +1 -0
- package/dist/components/data-table/views/data-table-root-view.d.ts +8 -0
- package/dist/components/data-table/views/data-table-root-view.d.ts.map +1 -0
- package/dist/components/data-table/views/data-table-root-view.js +18 -0
- package/dist/components/data-table/views/data-table-root-view.js.map +1 -0
- package/dist/components/data-table/views/data-table-sort-view.d.ts +18 -0
- package/dist/components/data-table/views/data-table-sort-view.d.ts.map +1 -0
- package/dist/components/data-table/views/data-table-sort-view.js +70 -0
- package/dist/components/data-table/views/data-table-sort-view.js.map +1 -0
- package/dist/components/data-table/views/data-table-view.d.ts +44 -0
- package/dist/components/data-table/views/data-table-view.d.ts.map +1 -0
- package/dist/components/data-table/views/data-table-view.js +86 -0
- package/dist/components/data-table/views/data-table-view.js.map +1 -0
- package/dist/components/data-table.d.ts +20 -0
- package/dist/components/data-table.d.ts.map +1 -0
- package/dist/components/data-table.js +26 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/date-picker.d.ts +43 -0
- package/dist/components/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker.js +45 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +24 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +57 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/direction.d.ts +2 -0
- package/dist/components/direction.d.ts.map +1 -0
- package/dist/components/direction.js +3 -0
- package/dist/components/direction.js.map +1 -0
- package/dist/components/drawer.d.ts +18 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +84 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +45 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +77 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.d.ts +15 -0
- package/dist/components/empty.d.ts.map +1 -0
- package/dist/components/empty.js +44 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.d.ts +25 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +72 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/file-upload.d.ts +24 -0
- package/dist/components/file-upload.d.ts.map +1 -0
- package/dist/components/file-upload.js +78 -0
- package/dist/components/file-upload.js.map +1 -0
- package/dist/components/hero.d.ts +39 -0
- package/dist/components/hero.d.ts.map +1 -0
- package/dist/components/hero.js +71 -0
- package/dist/components/hero.js.map +1 -0
- package/dist/components/hover-card.d.ts +6 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +17 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-group.d.ts +23 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +86 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input-otp.d.ts +13 -0
- package/dist/components/input-otp.d.ts.map +1 -0
- package/dist/components/input-otp.js +25 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.d.ts +13 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +29 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/item.d.ts +23 -0
- package/dist/components/item.d.ts.map +1 -0
- package/dist/components/item.js +89 -0
- package/dist/components/item.js.map +1 -0
- package/dist/components/kbd.d.ts +11 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +26 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +4 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +9 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/marker.d.ts +11 -0
- package/dist/components/marker.d.ts.map +1 -0
- package/dist/components/marker.js +37 -0
- package/dist/components/marker.js.map +1 -0
- package/dist/components/menubar.d.ts +23 -0
- package/dist/components/menubar.d.ts.map +1 -0
- package/dist/components/menubar.js +60 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/message-scroller.d.ts +11 -0
- package/dist/components/message-scroller.d.ts.map +1 -0
- package/dist/components/message-scroller.js +27 -0
- package/dist/components/message-scroller.js.map +1 -0
- package/dist/components/message.d.ts +17 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +24 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/meter.d.ts +18 -0
- package/dist/components/meter.d.ts.map +1 -0
- package/dist/components/meter.js +25 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/native-select.d.ts +14 -0
- package/dist/components/native-select.d.ts.map +1 -0
- package/dist/components/native-select.js +34 -0
- package/dist/components/native-select.js.map +1 -0
- package/dist/components/navbar.d.ts +11 -0
- package/dist/components/navbar.d.ts.map +1 -0
- package/dist/components/navbar.js +44 -0
- package/dist/components/navbar.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +23 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +51 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/number-field.d.ts +16 -0
- package/dist/components/number-field.d.ts.map +1 -0
- package/dist/components/number-field.js +49 -0
- package/dist/components/number-field.js.map +1 -0
- package/dist/components/page-header.d.ts +13 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/page-header.js +51 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pager.d.ts +14 -0
- package/dist/components/pager.d.ts.map +1 -0
- package/dist/components/pager.js +36 -0
- package/dist/components/pager.js.map +1 -0
- package/dist/components/pagination.d.ts +21 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +29 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/password-input.d.ts +18 -0
- package/dist/components/password-input.d.ts.map +1 -0
- package/dist/components/password-input.js +17 -0
- package/dist/components/password-input.js.map +1 -0
- package/dist/components/password-strength.d.ts +21 -0
- package/dist/components/password-strength.d.ts.map +1 -0
- package/dist/components/password-strength.js +52 -0
- package/dist/components/password-strength.js.map +1 -0
- package/dist/components/popover.d.ts +10 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +27 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +26 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +39 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/questionnaire.d.ts +20 -0
- package/dist/components/questionnaire.d.ts.map +1 -0
- package/dist/components/questionnaire.js +57 -0
- package/dist/components/questionnaire.js.map +1 -0
- package/dist/components/radio-group.d.ts +8 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +27 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/resizable.d.ts +13 -0
- package/dist/components/resizable.d.ts.map +1 -0
- package/dist/components/resizable.js +24 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scroll-area.d.ts +17 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +12 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/search-dialog.d.ts +38 -0
- package/dist/components/search-dialog.d.ts.map +1 -0
- package/dist/components/search-dialog.js +39 -0
- package/dist/components/search-dialog.js.map +1 -0
- package/dist/components/search-trigger.d.ts +20 -0
- package/dist/components/search-trigger.d.ts.map +1 -0
- package/dist/components/search-trigger.js +52 -0
- package/dist/components/search-trigger.js.map +1 -0
- package/dist/components/section.d.ts +30 -0
- package/dist/components/section.d.ts.map +1 -0
- package/dist/components/section.js +79 -0
- package/dist/components/section.js.map +1 -0
- package/dist/components/select.d.ts +16 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +38 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +4 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +44 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +76 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +289 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/site-footer.d.ts +22 -0
- package/dist/components/site-footer.d.ts.map +1 -0
- package/dist/components/site-footer.js +42 -0
- package/dist/components/site-footer.js.map +1 -0
- package/dist/components/site-header.d.ts +48 -0
- package/dist/components/site-header.d.ts.map +1 -0
- package/dist/components/site-header.js +104 -0
- package/dist/components/site-header.js.map +1 -0
- package/dist/components/site-layout.d.ts +35 -0
- package/dist/components/site-layout.d.ts.map +1 -0
- package/dist/components/site-layout.js +99 -0
- package/dist/components/site-layout.js.map +1 -0
- package/dist/components/skeleton.d.ts +6 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +16 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +4 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +11 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.d.ts +12 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +26 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stat.d.ts +31 -0
- package/dist/components/stat.d.ts.map +1 -0
- package/dist/components/stat.js +66 -0
- package/dist/components/stat.js.map +1 -0
- package/dist/components/status-dot.d.ts +25 -0
- package/dist/components/status-dot.d.ts.map +1 -0
- package/dist/components/status-dot.js +45 -0
- package/dist/components/status-dot.js.map +1 -0
- package/dist/components/switch.d.ts +17 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +49 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +25 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +45 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +18 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +51 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +4 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +10 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +27 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +68 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toc.d.ts +35 -0
- package/dist/components/toc.d.ts.map +1 -0
- package/dist/components/toc.js +94 -0
- package/dist/components/toc.js.map +1 -0
- package/dist/components/toggle-group.d.ts +19 -0
- package/dist/components/toggle-group.d.ts.map +1 -0
- package/dist/components/toggle-group.js +33 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +15 -0
- package/dist/components/toggle.d.ts.map +1 -0
- package/dist/components/toggle.js +42 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/toolbar.d.ts +14 -0
- package/dist/components/toolbar.d.ts.map +1 -0
- package/dist/components/toolbar.js +37 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.d.ts +7 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +22 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/trace.d.ts +20 -0
- package/dist/components/trace.d.ts.map +1 -0
- package/dist/components/trace.js +32 -0
- package/dist/components/trace.js.map +1 -0
- package/dist/components/typography.d.ts +37 -0
- package/dist/components/typography.d.ts.map +1 -0
- package/dist/components/typography.js +140 -0
- package/dist/components/typography.js.map +1 -0
- package/dist/hooks/use-highlighted-code.d.ts +3 -0
- package/dist/hooks/use-highlighted-code.d.ts.map +1 -0
- package/dist/hooks/use-highlighted-code.js +50 -0
- package/dist/hooks/use-highlighted-code.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/lib/color.d.ts +30 -0
- package/dist/lib/color.d.ts.map +1 -0
- package/dist/lib/color.js +56 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/highlighter.d.ts +10 -0
- package/dist/lib/highlighter.d.ts.map +1 -0
- package/dist/lib/highlighter.js +94 -0
- package/dist/lib/highlighter.js.map +1 -0
- package/dist/lib/recipes.d.ts +30 -0
- package/dist/lib/recipes.d.ts.map +1 -0
- package/dist/lib/recipes.js +30 -0
- package/dist/lib/recipes.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +2 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/provider/index.d.ts +3 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +3 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/theme-provider.d.ts +47 -0
- package/dist/provider/theme-provider.d.ts.map +1 -0
- package/dist/provider/theme-provider.js +118 -0
- package/dist/provider/theme-provider.js.map +1 -0
- package/dist/provider/theme.d.ts +42 -0
- package/dist/provider/theme.d.ts.map +1 -0
- package/dist/provider/theme.js +58 -0
- package/dist/provider/theme.js.map +1 -0
- package/package.json +145 -5
- package/src/components/accordion.tsx +92 -0
- package/src/components/alert-dialog.tsx +167 -0
- package/src/components/alert.tsx +110 -0
- package/src/components/aspect-ratio.tsx +29 -0
- package/src/components/attachment.tsx +198 -0
- package/src/components/avatar.tsx +115 -0
- package/src/components/badge.tsx +75 -0
- package/src/components/breadcrumb.tsx +104 -0
- package/src/components/bubble.tsx +125 -0
- package/src/components/button-group.tsx +75 -0
- package/src/components/button.tsx +124 -0
- package/src/components/calendar.tsx +204 -0
- package/src/components/callout.tsx +131 -0
- package/src/components/card.tsx +178 -0
- package/src/components/carousel.tsx +294 -0
- package/src/components/chart.tsx +332 -0
- package/src/components/checkbox-group.tsx +21 -0
- package/src/components/checkbox.tsx +39 -0
- package/src/components/code-block.tsx +246 -0
- package/src/components/collapsible.tsx +47 -0
- package/src/components/combobox.tsx +295 -0
- package/src/components/command.tsx +174 -0
- package/src/components/context-menu.tsx +238 -0
- package/src/components/copy-button.tsx +80 -0
- package/src/components/data-table/data-table-utils.tsx +125 -0
- package/src/components/data-table/elements/data-table-base.tsx +78 -0
- package/src/components/data-table/elements/data-table-body.tsx +50 -0
- package/src/components/data-table/elements/data-table-cell.tsx +42 -0
- package/src/components/data-table/elements/data-table-filter-row.tsx +222 -0
- package/src/components/data-table/elements/data-table-foot.tsx +36 -0
- package/src/components/data-table/elements/data-table-head.tsx +36 -0
- package/src/components/data-table/elements/data-table-info-row.tsx +38 -0
- package/src/components/data-table/elements/data-table-row.tsx +58 -0
- package/src/components/data-table/elements/data-table-scroll.tsx +33 -0
- package/src/components/data-table/elements/data-table-sort-row.tsx +180 -0
- package/src/components/data-table/elements/data-table-title-row.tsx +33 -0
- package/src/components/data-table/elements/data-table-virtualized-body.tsx +87 -0
- package/src/components/data-table/set-utils.ts +103 -0
- package/src/components/data-table/views/data-table-filter-view.tsx +75 -0
- package/src/components/data-table/views/data-table-prop-view.tsx +55 -0
- package/src/components/data-table/views/data-table-root-view.tsx +20 -0
- package/src/components/data-table/views/data-table-sort-view.tsx +81 -0
- package/src/components/data-table/views/data-table-view.tsx +147 -0
- package/src/components/data-table.tsx +30 -0
- package/src/components/date-picker.tsx +166 -0
- package/src/components/dialog.tsx +158 -0
- package/src/components/direction.tsx +3 -0
- package/src/components/drawer.tsx +222 -0
- package/src/components/dropdown-menu.tsx +267 -0
- package/src/components/empty.tsx +97 -0
- package/src/components/field.tsx +229 -0
- package/src/components/file-upload.tsx +180 -0
- package/src/components/hero.tsx +137 -0
- package/src/components/hover-card.tsx +44 -0
- package/src/components/input-group.tsx +186 -0
- package/src/components/input-otp.tsx +82 -0
- package/src/components/input.tsx +50 -0
- package/src/components/item.tsx +191 -0
- package/src/components/kbd.tsx +39 -0
- package/src/components/label.tsx +19 -0
- package/src/components/marker.tsx +69 -0
- package/src/components/menubar.tsx +146 -0
- package/src/components/message-scroller.tsx +113 -0
- package/src/components/message.tsx +90 -0
- package/src/components/meter.tsx +69 -0
- package/src/components/native-select.tsx +76 -0
- package/src/components/navbar.tsx +55 -0
- package/src/components/navigation-menu.tsx +193 -0
- package/src/components/number-field.tsx +133 -0
- package/src/components/page-header.tsx +63 -0
- package/src/components/pager.tsx +70 -0
- package/src/components/pagination.tsx +106 -0
- package/src/components/password-input.tsx +71 -0
- package/src/components/password-strength.tsx +99 -0
- package/src/components/popover.tsx +68 -0
- package/src/components/progress.tsx +105 -0
- package/src/components/questionnaire.tsx +299 -0
- package/src/components/radio-group.tsx +43 -0
- package/src/components/resizable.tsx +62 -0
- package/src/components/scroll-area.tsx +68 -0
- package/src/components/search-dialog.tsx +87 -0
- package/src/components/search-trigger.tsx +74 -0
- package/src/components/section.tsx +110 -0
- package/src/components/select.tsx +184 -0
- package/src/components/separator.tsx +20 -0
- package/src/components/sheet.tsx +116 -0
- package/src/components/sidebar.tsx +722 -0
- package/src/components/site-footer.tsx +55 -0
- package/src/components/site-header.tsx +169 -0
- package/src/components/site-layout.tsx +147 -0
- package/src/components/skeleton.tsx +19 -0
- package/src/components/slider.tsx +46 -0
- package/src/components/spinner.tsx +42 -0
- package/src/components/stat.tsx +155 -0
- package/src/components/status-dot.tsx +94 -0
- package/src/components/switch.tsx +70 -0
- package/src/components/table.tsx +133 -0
- package/src/components/tabs.tsx +99 -0
- package/src/components/textarea.tsx +23 -0
- package/src/components/toast.tsx +221 -0
- package/src/components/toc.tsx +122 -0
- package/src/components/toggle-group.tsx +95 -0
- package/src/components/toggle.tsx +59 -0
- package/src/components/toolbar.tsx +97 -0
- package/src/components/tooltip.tsx +57 -0
- package/src/components/trace.tsx +143 -0
- package/src/components/typography.tsx +205 -0
- package/src/hooks/use-highlighted-code.ts +71 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/lib/color.ts +76 -0
- package/src/lib/highlighter.tsx +121 -0
- package/src/lib/recipes.ts +47 -0
- package/src/lib/utils.ts +1 -0
- package/src/provider/index.ts +2 -0
- package/src/provider/theme-provider.tsx +210 -0
- package/src/provider/theme.ts +83 -0
- package/src/styles/kernelkit.css +301 -0
- package/src/styles/shadcn.css +555 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {mergeProps} from "@base-ui/react/merge-props";
|
|
4
|
+
import {useRender} from "@base-ui/react/use-render";
|
|
5
|
+
import {focusRing} from "@repraze/kernelkit/lib/recipes";
|
|
6
|
+
import {cn} from "cn";
|
|
7
|
+
import type * as React from "react";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The suite's site footer: a top border and one mono row at the site width, credits on the left and
|
|
11
|
+
* links on the right.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <SiteFooter>
|
|
15
|
+
* <span>MIT · built from one palette</span>
|
|
16
|
+
* <SiteFooterLinks>
|
|
17
|
+
* <SiteFooterLink href="https://github.com/…">GitHub</SiteFooterLink>
|
|
18
|
+
* </SiteFooterLinks>
|
|
19
|
+
* </SiteFooter>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function SiteFooter({className, children, ...props}: React.ComponentProps<"footer">) {
|
|
23
|
+
return (
|
|
24
|
+
<footer data-slot="site-footer" className={cn("border-t border-border", className)} {...props}>
|
|
25
|
+
<div className="mx-auto flex w-full max-w-(--kk-site-width) flex-col gap-3 px-4 py-6 font-mono text-xs text-muted-foreground sm:flex-row sm:items-center sm:justify-between md:px-6">
|
|
26
|
+
{children}
|
|
27
|
+
</div>
|
|
28
|
+
</footer>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The footer's links (wrap on phones). */
|
|
33
|
+
function SiteFooterLinks({className, render, ...props}: useRender.ComponentProps<"nav">) {
|
|
34
|
+
return useRender({
|
|
35
|
+
defaultTagName: "nav",
|
|
36
|
+
props: mergeProps<"nav">({className: cn("flex flex-wrap items-center gap-x-4 gap-y-1", className)}, props),
|
|
37
|
+
render,
|
|
38
|
+
state: {slot: "site-footer-links"},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A footer link: muted, foreground on hover. */
|
|
43
|
+
function SiteFooterLink({className, render, ...props}: useRender.ComponentProps<"a">) {
|
|
44
|
+
return useRender({
|
|
45
|
+
defaultTagName: "a",
|
|
46
|
+
props: mergeProps<"a">(
|
|
47
|
+
{className: cn("rounded-sm transition-colors hover:text-foreground", focusRing, className)},
|
|
48
|
+
props,
|
|
49
|
+
),
|
|
50
|
+
render,
|
|
51
|
+
state: {slot: "site-footer-link"},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export {SiteFooter, SiteFooterLink, SiteFooterLinks};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {mergeProps} from "@base-ui/react/merge-props";
|
|
4
|
+
import {useRender} from "@base-ui/react/use-render";
|
|
5
|
+
import {Button} from "@repraze/kernelkit/components/button";
|
|
6
|
+
import {Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger} from "@repraze/kernelkit/components/sheet";
|
|
7
|
+
import {focusRing} from "@repraze/kernelkit/lib/recipes";
|
|
8
|
+
import {cn} from "cn";
|
|
9
|
+
import {MenuIcon} from "lucide-react";
|
|
10
|
+
import type * as React from "react";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The suite's site header: sticky, blurred, one row of `--kk-header-height` inside a `--kk-site-width`
|
|
14
|
+
* container. Brand, then mono nav links (current page underlined in the accent), then actions.
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <SiteHeader>
|
|
18
|
+
* <SiteHeaderContent>
|
|
19
|
+
* <SiteHeaderMenu title="termicolor">…mobile nav…</SiteHeaderMenu>
|
|
20
|
+
* <SiteHeaderBrand render={<Link to="/" />}>…</SiteHeaderBrand>
|
|
21
|
+
* <SiteNav><SiteNavLink render={<Link to="/ports" />}>Ports</SiteNavLink></SiteNav>
|
|
22
|
+
* <SiteHeaderActions>…search, theme, github…</SiteHeaderActions>
|
|
23
|
+
* </SiteHeaderContent>
|
|
24
|
+
* </SiteHeader>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function SiteHeader({className, render, ...props}: useRender.ComponentProps<"header">) {
|
|
28
|
+
return useRender({
|
|
29
|
+
defaultTagName: "header",
|
|
30
|
+
props: mergeProps<"header">(
|
|
31
|
+
{
|
|
32
|
+
className: cn(
|
|
33
|
+
"sticky top-0 z-40 w-full border-b border-border bg-background/85 text-foreground backdrop-blur supports-backdrop-filter:bg-background/70",
|
|
34
|
+
className,
|
|
35
|
+
),
|
|
36
|
+
},
|
|
37
|
+
props,
|
|
38
|
+
),
|
|
39
|
+
render,
|
|
40
|
+
state: {slot: "site-header"},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The header row: centered at the site width, the same gutters as SiteContainer. */
|
|
45
|
+
function SiteHeaderContent({className, render, ...props}: useRender.ComponentProps<"div">) {
|
|
46
|
+
return useRender({
|
|
47
|
+
defaultTagName: "div",
|
|
48
|
+
props: mergeProps<"div">(
|
|
49
|
+
{
|
|
50
|
+
className: cn(
|
|
51
|
+
"mx-auto flex h-14 w-full max-w-(--kk-site-width) items-center gap-4 px-4 md:gap-6 md:px-6",
|
|
52
|
+
className,
|
|
53
|
+
),
|
|
54
|
+
},
|
|
55
|
+
props,
|
|
56
|
+
),
|
|
57
|
+
render,
|
|
58
|
+
state: {slot: "site-header-content"},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Logo + name, links home. Pass the router link with `render`. */
|
|
63
|
+
function SiteHeaderBrand({className, render, ...props}: useRender.ComponentProps<"a">) {
|
|
64
|
+
return useRender({
|
|
65
|
+
defaultTagName: "a",
|
|
66
|
+
props: mergeProps<"a">(
|
|
67
|
+
{
|
|
68
|
+
className: cn(
|
|
69
|
+
"flex shrink-0 items-center gap-2 rounded-md font-mono text-sm font-semibold tracking-tight",
|
|
70
|
+
focusRing,
|
|
71
|
+
"[&_svg]:shrink-0",
|
|
72
|
+
className,
|
|
73
|
+
),
|
|
74
|
+
},
|
|
75
|
+
props,
|
|
76
|
+
),
|
|
77
|
+
render,
|
|
78
|
+
state: {slot: "site-header-brand"},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Primary navigation (desktop). On phones the links move into SiteHeaderMenu. */
|
|
83
|
+
function SiteNav({className, render, ...props}: useRender.ComponentProps<"nav">) {
|
|
84
|
+
return useRender({
|
|
85
|
+
defaultTagName: "nav",
|
|
86
|
+
props: mergeProps<"nav">(
|
|
87
|
+
{"aria-label": "Main", className: cn("hidden items-center gap-1 md:flex", className)},
|
|
88
|
+
props,
|
|
89
|
+
),
|
|
90
|
+
render,
|
|
91
|
+
state: {slot: "site-nav"},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A nav link, styled like the suite's other navigation (GUIDELINES §7c): muted at rest, a hover wash,
|
|
97
|
+
* and when current (`aria-current="page"`, `data-status="active"` from TanStack Router, or `data-active`)
|
|
98
|
+
* foreground text plus a 2px accent indicator. In SiteNav the indicator sits on the header's bottom
|
|
99
|
+
* border (like line Tabs); elsewhere (the phone menu) the link is a sidebar row with a tint and the
|
|
100
|
+
* indicator on its left edge.
|
|
101
|
+
*/
|
|
102
|
+
function SiteNavLink({className, render, ...props}: useRender.ComponentProps<"a">) {
|
|
103
|
+
return useRender({
|
|
104
|
+
defaultTagName: "a",
|
|
105
|
+
props: mergeProps<"a">(
|
|
106
|
+
{
|
|
107
|
+
className: cn(
|
|
108
|
+
"relative flex h-8 items-center rounded-md px-2.5 font-mono text-sm text-muted-foreground transition-colors hover:bg-hover hover:text-foreground motion-reduce:transition-none",
|
|
109
|
+
focusRing,
|
|
110
|
+
// indicator: vertical by default, on the header border inside SiteNav
|
|
111
|
+
"after:pointer-events-none after:absolute after:top-1.5 after:bottom-1.5 after:left-0 after:w-0.5 after:rounded-pill after:bg-primary-text after:opacity-0",
|
|
112
|
+
"in-data-[slot=site-nav]:after:top-auto in-data-[slot=site-nav]:after:right-2.5 in-data-[slot=site-nav]:after:-bottom-[calc(0.75rem+1px)] in-data-[slot=site-nav]:after:left-2.5 in-data-[slot=site-nav]:after:h-0.5 in-data-[slot=site-nav]:after:w-auto",
|
|
113
|
+
"aria-[current=page]:text-foreground aria-[current=page]:after:opacity-100 data-[status=active]:text-foreground data-[status=active]:after:opacity-100 data-active:text-foreground data-active:after:opacity-100",
|
|
114
|
+
// outside the header row: the sidebar's current-row tint
|
|
115
|
+
"not-in-data-[slot=site-nav]:aria-[current=page]:bg-primary-tint not-in-data-[slot=site-nav]:data-[status=active]:bg-primary-tint not-in-data-[slot=site-nav]:data-active:bg-primary-tint",
|
|
116
|
+
className,
|
|
117
|
+
),
|
|
118
|
+
},
|
|
119
|
+
props,
|
|
120
|
+
),
|
|
121
|
+
render,
|
|
122
|
+
state: {slot: "site-nav-link"},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Right side of the header row: search, theme, repository links. */
|
|
127
|
+
function SiteHeaderActions({className, render, ...props}: useRender.ComponentProps<"div">) {
|
|
128
|
+
return useRender({
|
|
129
|
+
defaultTagName: "div",
|
|
130
|
+
props: mergeProps<"div">({className: cn("ml-auto flex items-center gap-1", className)}, props),
|
|
131
|
+
render,
|
|
132
|
+
state: {slot: "site-header-actions"},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
interface SiteHeaderMenuProps extends Omit<React.ComponentProps<typeof Sheet>, "children"> {
|
|
137
|
+
children?: React.ReactNode;
|
|
138
|
+
/** Sheet title (also the accessible name). */
|
|
139
|
+
title?: React.ReactNode;
|
|
140
|
+
className?: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Phone navigation: a menu button (hidden from `md`) opening a left sheet with the nav and the page's
|
|
145
|
+
* sidebar. Control `open` to close it on navigation.
|
|
146
|
+
*/
|
|
147
|
+
function SiteHeaderMenu({title = "Menu", children, className, ...props}: SiteHeaderMenuProps) {
|
|
148
|
+
return (
|
|
149
|
+
<Sheet {...props}>
|
|
150
|
+
<SheetTrigger
|
|
151
|
+
render={<Button variant="ghost" size="icon-sm" className="-ml-1.5 md:hidden" aria-label="Menu" />}
|
|
152
|
+
>
|
|
153
|
+
<MenuIcon />
|
|
154
|
+
</SheetTrigger>
|
|
155
|
+
<SheetContent
|
|
156
|
+
side="left"
|
|
157
|
+
data-slot="site-header-menu"
|
|
158
|
+
className={cn("w-72 gap-0 overflow-y-auto overscroll-contain p-0", className)}
|
|
159
|
+
>
|
|
160
|
+
<SheetHeader className="border-b border-border">
|
|
161
|
+
<SheetTitle className="flex items-center gap-2">{title}</SheetTitle>
|
|
162
|
+
</SheetHeader>
|
|
163
|
+
<div className="flex flex-col gap-4 p-2">{children}</div>
|
|
164
|
+
</SheetContent>
|
|
165
|
+
</Sheet>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export {SiteHeader, SiteHeaderActions, SiteHeaderBrand, SiteHeaderContent, SiteHeaderMenu, SiteNav, SiteNavLink};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {mergeProps} from "@base-ui/react/merge-props";
|
|
4
|
+
import {useRender} from "@base-ui/react/use-render";
|
|
5
|
+
import {ScrollArea} from "@repraze/kernelkit/components/scroll-area";
|
|
6
|
+
import {cn} from "cn";
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The suite's page layout, under SiteHeader:
|
|
11
|
+
*
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <SiteLayout>
|
|
14
|
+
* <SiteSidebar aria-label="Docs">…SidebarGroup / SidebarMenu…</SiteSidebar>
|
|
15
|
+
* <SiteMain>…PageHeader, content, Pager…</SiteMain>
|
|
16
|
+
* <SiteAside><Toc>…</Toc></SiteAside>
|
|
17
|
+
* </SiteLayout>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Sidebars are sticky below the header and scroll on their own with edge fades. Content pages without
|
|
21
|
+
* a sidebar use SiteContainer.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** Centered at `--kk-site-width` with the header's gutters. */
|
|
25
|
+
function SiteContainer({className, render, ...props}: useRender.ComponentProps<"div">) {
|
|
26
|
+
return useRender({
|
|
27
|
+
defaultTagName: "div",
|
|
28
|
+
props: mergeProps<"div">(
|
|
29
|
+
{className: cn("mx-auto w-full max-w-(--kk-site-width) px-4 md:px-6", className)},
|
|
30
|
+
props,
|
|
31
|
+
),
|
|
32
|
+
render,
|
|
33
|
+
state: {slot: "site-container"},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Sidebar + main (+ aside) row inside the site container. */
|
|
38
|
+
function SiteLayout({className, render, ...props}: useRender.ComponentProps<"div">) {
|
|
39
|
+
return useRender({
|
|
40
|
+
defaultTagName: "div",
|
|
41
|
+
props: mergeProps<"div">(
|
|
42
|
+
{
|
|
43
|
+
className: cn(
|
|
44
|
+
"mx-auto flex w-full max-w-(--kk-site-width) flex-1 gap-8 px-4 md:px-6 lg:gap-10",
|
|
45
|
+
className,
|
|
46
|
+
),
|
|
47
|
+
},
|
|
48
|
+
props,
|
|
49
|
+
),
|
|
50
|
+
render,
|
|
51
|
+
state: {slot: "site-layout"},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Sticky columns fill the viewport below the header; their content has the page's vertical padding. */
|
|
56
|
+
const stickyColumn = "sticky top-(--kk-header-height) h-[calc(100svh-var(--kk-header-height))]";
|
|
57
|
+
/** Vertical rhythm of every column (the layout itself has none, so the sidebar border runs edge to edge). */
|
|
58
|
+
const columnPadding = "py-8 lg:py-10";
|
|
59
|
+
|
|
60
|
+
interface SiteSidebarProps extends React.ComponentProps<"aside"> {
|
|
61
|
+
/** Classes for the scrolling viewport (padding, etc.). */
|
|
62
|
+
viewportClassName?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Items a nav marks current: SidebarMenuButton isActive, router links, aria-current. */
|
|
66
|
+
const CURRENT = '[data-active]:not([data-active="false"]), [aria-current="page"], [data-status="active"]';
|
|
67
|
+
|
|
68
|
+
/** Center the current item in the sidebar's own viewport (never scrolls the page). */
|
|
69
|
+
function useKeepCurrentInView(viewport: React.RefObject<HTMLDivElement | null>) {
|
|
70
|
+
React.useEffect(() => {
|
|
71
|
+
const el = viewport.current;
|
|
72
|
+
if (!el) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const reveal = () => {
|
|
76
|
+
const item = el.querySelector<HTMLElement>(CURRENT);
|
|
77
|
+
if (!item) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const offset = item.getBoundingClientRect().top - el.getBoundingClientRect().top;
|
|
81
|
+
if (offset < 0 || offset > el.clientHeight - item.offsetHeight) {
|
|
82
|
+
el.scrollTop += offset - el.clientHeight / 2;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
reveal();
|
|
86
|
+
// navigation flips data-active / aria-current on the links: follow it
|
|
87
|
+
const observer = new MutationObserver(reveal);
|
|
88
|
+
observer.observe(el, {
|
|
89
|
+
subtree: true,
|
|
90
|
+
attributes: true,
|
|
91
|
+
attributeFilter: ["data-active", "aria-current", "data-status"],
|
|
92
|
+
});
|
|
93
|
+
return () => observer.disconnect();
|
|
94
|
+
}, [viewport]);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Left navigation column (from `md`): sticky, scrolls on its own, fades at its edges, and keeps the
|
|
99
|
+
* current item in view. Its right border runs the layout's full height, header to footer.
|
|
100
|
+
*/
|
|
101
|
+
function SiteSidebar({className, viewportClassName, children, ...props}: SiteSidebarProps) {
|
|
102
|
+
const viewport = React.useRef<HTMLDivElement>(null);
|
|
103
|
+
useKeepCurrentInView(viewport);
|
|
104
|
+
return (
|
|
105
|
+
<aside
|
|
106
|
+
data-slot="site-sidebar"
|
|
107
|
+
className={cn("hidden w-60 shrink-0 border-r border-border md:block", className)}
|
|
108
|
+
{...props}
|
|
109
|
+
>
|
|
110
|
+
{/* sticky on a wrapper: Base UI's ScrollArea root sets position inline */}
|
|
111
|
+
<div className={stickyColumn}>
|
|
112
|
+
<ScrollArea
|
|
113
|
+
fade
|
|
114
|
+
className="h-full"
|
|
115
|
+
viewportRef={viewport}
|
|
116
|
+
viewportClassName={cn(columnPadding, "pr-3", viewportClassName)}
|
|
117
|
+
>
|
|
118
|
+
{children}
|
|
119
|
+
</ScrollArea>
|
|
120
|
+
</div>
|
|
121
|
+
</aside>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** The page column. */
|
|
126
|
+
function SiteMain({className, render, ...props}: useRender.ComponentProps<"main">) {
|
|
127
|
+
return useRender({
|
|
128
|
+
defaultTagName: "main",
|
|
129
|
+
props: mergeProps<"main">(
|
|
130
|
+
{className: cn("flex min-w-0 flex-1 flex-col gap-10", columnPadding, className)},
|
|
131
|
+
props,
|
|
132
|
+
),
|
|
133
|
+
render,
|
|
134
|
+
state: {slot: "site-main"},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Right column (from `xl`): table of contents, page meta. Sticky like the sidebar. */
|
|
139
|
+
function SiteAside({className, children, ...props}: React.ComponentProps<"aside">) {
|
|
140
|
+
return (
|
|
141
|
+
<aside data-slot="site-aside" className={cn("hidden w-48 shrink-0 xl:block", className)} {...props}>
|
|
142
|
+
<div className={cn(stickyColumn, columnPadding, "overflow-y-auto")}>{children}</div>
|
|
143
|
+
</aside>
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export {SiteAside, SiteContainer, SiteLayout, SiteMain, SiteSidebar};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {mergeProps} from "@base-ui/react/merge-props";
|
|
4
|
+
import {useRender} from "@base-ui/react/use-render";
|
|
5
|
+
import {cn} from "cn";
|
|
6
|
+
|
|
7
|
+
/** Placeholder block while content loads. Size it with `h-*`/`w-*`; `rounded-pill` for avatars and pills. */
|
|
8
|
+
const skeletonClass = "animate-pulse rounded-md bg-foreground/10 motion-reduce:animate-none hc:bg-border";
|
|
9
|
+
|
|
10
|
+
function Skeleton({className, render, ...props}: useRender.ComponentProps<"div">) {
|
|
11
|
+
return useRender({
|
|
12
|
+
defaultTagName: "div",
|
|
13
|
+
props: mergeProps<"div">({"aria-hidden": true, className: cn(skeletonClass, className)}, props),
|
|
14
|
+
render,
|
|
15
|
+
state: {slot: "skeleton"},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export {Skeleton, skeletonClass};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {Slider as SliderPrimitive} from "@base-ui/react/slider";
|
|
4
|
+
import {cn} from "cn";
|
|
5
|
+
|
|
6
|
+
function Slider({className, defaultValue, value, min = 0, max = 100, ...props}: SliderPrimitive.Root.Props) {
|
|
7
|
+
const _values = Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max];
|
|
8
|
+
const thumbs = value !== undefined || defaultValue !== undefined ? _values.length : 1;
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<SliderPrimitive.Root
|
|
12
|
+
className={cn("group/slider data-horizontal:w-full data-vertical:h-full", className)}
|
|
13
|
+
data-slot="slider"
|
|
14
|
+
defaultValue={defaultValue}
|
|
15
|
+
value={value}
|
|
16
|
+
min={min}
|
|
17
|
+
max={max}
|
|
18
|
+
thumbAlignment="edge"
|
|
19
|
+
{...props}
|
|
20
|
+
>
|
|
21
|
+
<SliderPrimitive.Control
|
|
22
|
+
data-slot="slider-control"
|
|
23
|
+
className="relative flex w-full touch-none items-center select-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-horizontal:h-4 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-4 data-vertical:flex-col data-vertical:justify-center"
|
|
24
|
+
>
|
|
25
|
+
<SliderPrimitive.Track
|
|
26
|
+
data-slot="slider-track"
|
|
27
|
+
className="relative grow overflow-hidden rounded-pill bg-input select-none data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5"
|
|
28
|
+
>
|
|
29
|
+
<SliderPrimitive.Indicator
|
|
30
|
+
data-slot="slider-range"
|
|
31
|
+
className="bg-primary select-none group-data-invalid/slider:bg-danger data-horizontal:h-full data-vertical:w-full"
|
|
32
|
+
/>
|
|
33
|
+
</SliderPrimitive.Track>
|
|
34
|
+
{Array.from({length: thumbs}, (_, index) => (
|
|
35
|
+
<SliderPrimitive.Thumb
|
|
36
|
+
data-slot="slider-thumb"
|
|
37
|
+
key={index}
|
|
38
|
+
className="relative block size-4 shrink-0 cursor-grab rounded-pill border-2 border-primary-text bg-background shadow-sm shadow-(color:--shadow-color) ring-ring/50 transition-[color,box-shadow,border-color] duration-100 select-none after:absolute after:-inset-1 hover:ring-3 has-focus-visible:ring-3 has-focus-visible:outline-hidden active:cursor-grabbing active:ring-3 group-data-invalid/slider:border-danger group-data-invalid/slider:ring-danger/20 data-disabled:pointer-events-none motion-reduce:transition-none"
|
|
39
|
+
/>
|
|
40
|
+
))}
|
|
41
|
+
</SliderPrimitive.Control>
|
|
42
|
+
</SliderPrimitive.Root>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export {Slider};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {cva, type VariantProps} from "class-variance-authority";
|
|
4
|
+
import {cn} from "cn";
|
|
5
|
+
import {Loader2Icon} from "lucide-react";
|
|
6
|
+
|
|
7
|
+
/** Sizes follow the icon column of §4 so a spinner can replace an icon in place. */
|
|
8
|
+
const spinnerVariants = cva(
|
|
9
|
+
// reduced motion: slow the spin down rather than freeze it, a frozen spinner reads as a glyph
|
|
10
|
+
"shrink-0 animate-spin text-current motion-reduce:[animation-duration:2.5s]",
|
|
11
|
+
{
|
|
12
|
+
variants: {
|
|
13
|
+
size: {
|
|
14
|
+
xs: "size-3",
|
|
15
|
+
sm: "size-3.5",
|
|
16
|
+
default: "size-4",
|
|
17
|
+
lg: "size-5",
|
|
18
|
+
xl: "size-6",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: {size: "default"},
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
interface SpinnerProps extends React.ComponentProps<"svg">, VariantProps<typeof spinnerVariants> {}
|
|
26
|
+
|
|
27
|
+
/** Indeterminate loading indicator. Inherits `currentColor`; announces itself as a status. */
|
|
28
|
+
function Spinner({className, size, ...props}: SpinnerProps) {
|
|
29
|
+
return (
|
|
30
|
+
<Loader2Icon
|
|
31
|
+
data-slot="spinner"
|
|
32
|
+
data-size={size ?? "default"}
|
|
33
|
+
role="status"
|
|
34
|
+
aria-label="Loading"
|
|
35
|
+
className={cn(spinnerVariants({size}), className)}
|
|
36
|
+
{...props}
|
|
37
|
+
/>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export {Spinner, spinnerVariants};
|
|
42
|
+
export type {SpinnerProps};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {mergeProps} from "@base-ui/react/merge-props";
|
|
4
|
+
import {useRender} from "@base-ui/react/use-render";
|
|
5
|
+
import {cva} from "class-variance-authority";
|
|
6
|
+
import {cn} from "cn";
|
|
7
|
+
import {ArrowDownRightIcon, ArrowUpRightIcon, MinusIcon} from "lucide-react";
|
|
8
|
+
import type * as React from "react";
|
|
9
|
+
|
|
10
|
+
/** A metric: label, big mono value, delta and an optional sparkline. Sits alone or inside a Card. */
|
|
11
|
+
const statVariants = cva("group/stat grid min-w-0 grid-cols-[1fr_auto] content-start gap-x-3", {
|
|
12
|
+
variants: {
|
|
13
|
+
size: {
|
|
14
|
+
sm: "gap-y-0.5",
|
|
15
|
+
default: "gap-y-1",
|
|
16
|
+
lg: "gap-y-1.5",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {size: "default"},
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
function Stat({
|
|
23
|
+
className,
|
|
24
|
+
size = "default",
|
|
25
|
+
render,
|
|
26
|
+
...props
|
|
27
|
+
}: useRender.ComponentProps<"div"> & {size?: "sm" | "default" | "lg"}) {
|
|
28
|
+
return useRender({
|
|
29
|
+
defaultTagName: "div",
|
|
30
|
+
props: mergeProps<"div">({className: cn(statVariants({size}), className)}, props),
|
|
31
|
+
render,
|
|
32
|
+
state: {slot: "stat", size},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function StatLabel({className, ...props}: React.ComponentProps<"div">) {
|
|
37
|
+
return (
|
|
38
|
+
<div
|
|
39
|
+
data-slot="stat-label"
|
|
40
|
+
className={cn(
|
|
41
|
+
"col-span-full flex min-w-0 items-center gap-1.5 truncate text-xs font-medium text-muted-foreground [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
|
|
42
|
+
className,
|
|
43
|
+
)}
|
|
44
|
+
{...props}
|
|
45
|
+
/>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function StatValue({className, ...props}: React.ComponentProps<"div">) {
|
|
50
|
+
return (
|
|
51
|
+
<div
|
|
52
|
+
data-slot="stat-value"
|
|
53
|
+
className={cn(
|
|
54
|
+
"col-start-1 flex items-baseline gap-1 font-mono text-2xl leading-tight font-medium tracking-tight text-foreground tabular-nums",
|
|
55
|
+
"group-data-[size=sm]/stat:text-xl group-data-[size=lg]/stat:text-3xl",
|
|
56
|
+
className,
|
|
57
|
+
)}
|
|
58
|
+
{...props}
|
|
59
|
+
/>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Unit or suffix after the value (`ms`, `%`, `req/s`). */
|
|
64
|
+
function StatUnit({className, ...props}: React.ComponentProps<"span">) {
|
|
65
|
+
return (
|
|
66
|
+
<span
|
|
67
|
+
data-slot="stat-unit"
|
|
68
|
+
className={cn("text-sm font-normal tracking-normal text-muted-foreground", className)}
|
|
69
|
+
{...props}
|
|
70
|
+
/>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
type StatTrend = "up" | "down" | "flat";
|
|
75
|
+
|
|
76
|
+
const statDeltaVariants = cva(
|
|
77
|
+
"col-start-1 inline-flex w-fit items-center gap-1 font-mono text-xs font-medium tabular-nums [&_svg]:size-3.5 [&_svg]:shrink-0",
|
|
78
|
+
{
|
|
79
|
+
variants: {
|
|
80
|
+
intent: {
|
|
81
|
+
positive: "text-success",
|
|
82
|
+
negative: "text-danger",
|
|
83
|
+
neutral: "text-muted-foreground",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
defaultVariants: {intent: "neutral"},
|
|
87
|
+
},
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const trendIcon = {up: ArrowUpRightIcon, down: ArrowDownRightIcon, flat: MinusIcon} as const;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Change versus a previous period. `trend` picks the arrow; up is good (success) and down is bad (danger)
|
|
94
|
+
* unless `invert` is set (latency, error rate, cost). The arrow keeps the meaning readable without color.
|
|
95
|
+
*/
|
|
96
|
+
function StatDelta({
|
|
97
|
+
className,
|
|
98
|
+
trend = "flat",
|
|
99
|
+
invert = false,
|
|
100
|
+
children,
|
|
101
|
+
...props
|
|
102
|
+
}: React.ComponentProps<"div"> & {trend?: StatTrend; invert?: boolean}) {
|
|
103
|
+
const good = trend === "flat" ? null : (trend === "up") !== invert;
|
|
104
|
+
const intent = good === null ? "neutral" : good ? "positive" : "negative";
|
|
105
|
+
const Icon = trendIcon[trend];
|
|
106
|
+
return (
|
|
107
|
+
<div
|
|
108
|
+
data-slot="stat-delta"
|
|
109
|
+
data-trend={trend}
|
|
110
|
+
data-intent={intent}
|
|
111
|
+
className={cn(statDeltaVariants({intent}), className)}
|
|
112
|
+
{...props}
|
|
113
|
+
>
|
|
114
|
+
<Icon aria-hidden="true" />
|
|
115
|
+
{children}
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function StatDescription({className, ...props}: React.ComponentProps<"div">) {
|
|
121
|
+
return (
|
|
122
|
+
<div
|
|
123
|
+
data-slot="stat-description"
|
|
124
|
+
className={cn("col-start-1 text-xs text-muted-foreground", className)}
|
|
125
|
+
{...props}
|
|
126
|
+
/>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Right-hand slot beside the value and delta rows: a sparkline, an icon tile or a badge. */
|
|
131
|
+
function StatSparkline({className, ...props}: React.ComponentProps<"div">) {
|
|
132
|
+
return (
|
|
133
|
+
<div
|
|
134
|
+
data-slot="stat-sparkline"
|
|
135
|
+
className={cn(
|
|
136
|
+
"col-start-2 row-span-2 row-start-2 flex h-full min-h-8 w-24 items-end self-end text-primary-text",
|
|
137
|
+
className,
|
|
138
|
+
)}
|
|
139
|
+
{...props}
|
|
140
|
+
/>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export {
|
|
145
|
+
Stat,
|
|
146
|
+
StatDelta,
|
|
147
|
+
statDeltaVariants,
|
|
148
|
+
StatDescription,
|
|
149
|
+
StatLabel,
|
|
150
|
+
StatSparkline,
|
|
151
|
+
StatUnit,
|
|
152
|
+
StatValue,
|
|
153
|
+
statVariants,
|
|
154
|
+
};
|
|
155
|
+
export type {StatTrend};
|