sveltacular 0.0.77 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -15
- package/dist/forms/base-input-wrapper.svelte +99 -0
- package/dist/forms/base-input-wrapper.svelte.d.ts +15 -0
- package/dist/forms/bool-box/bool-box.svelte +30 -16
- package/dist/forms/bool-box/bool-box.svelte.d.ts +9 -23
- package/dist/forms/button/button.svelte +153 -89
- package/dist/forms/button/button.svelte.d.ts +25 -31
- package/dist/forms/check-box/check-box-group.svelte +69 -31
- package/dist/forms/check-box/check-box-group.svelte.d.ts +11 -29
- package/dist/forms/check-box/check-box.svelte +57 -33
- package/dist/forms/check-box/check-box.svelte.d.ts +15 -27
- package/dist/forms/check-box/index.d.ts +2 -0
- package/dist/forms/check-box/index.js +2 -0
- package/dist/forms/combo/new-or-existing-combo.svelte +37 -18
- package/dist/forms/combo/new-or-existing-combo.svelte.d.ts +15 -27
- package/dist/forms/combo-box/combo-box.svelte +643 -0
- package/dist/forms/combo-box/combo-box.svelte.d.ts +42 -0
- package/dist/forms/combo-box/index.d.ts +1 -0
- package/dist/forms/combo-box/index.js +1 -0
- package/dist/forms/date-box/date-box.svelte +82 -53
- package/dist/forms/date-box/date-box.svelte.d.ts +21 -34
- package/dist/forms/file-area/file-area.svelte +109 -57
- package/dist/forms/file-area/file-area.svelte.d.ts +12 -24
- package/dist/forms/file-box/file-box.svelte +38 -23
- package/dist/forms/file-box/file-box.svelte.d.ts +14 -27
- package/dist/forms/form-field.svelte +76 -13
- package/dist/forms/form-field.svelte.d.ts +15 -20
- package/dist/forms/form-footer.svelte +6 -3
- package/dist/forms/form-footer.svelte.d.ts +6 -28
- package/dist/forms/form-header.svelte +15 -4
- package/dist/forms/form-header.svelte.d.ts +8 -20
- package/dist/forms/form-label.svelte +15 -6
- package/dist/forms/form-label.svelte.d.ts +8 -21
- package/dist/forms/form-row.svelte +29 -0
- package/dist/forms/form-row.svelte.d.ts +7 -0
- package/dist/forms/form-section.svelte +15 -4
- package/dist/forms/form-section.svelte.d.ts +8 -20
- package/dist/forms/form.svelte +36 -13
- package/dist/forms/form.svelte.d.ts +11 -24
- package/dist/forms/index.d.ts +26 -0
- package/dist/forms/index.js +31 -0
- package/dist/forms/info-box/info-box.svelte +17 -10
- package/dist/forms/info-box/info-box.svelte.d.ts +8 -21
- package/dist/forms/list-box/index.d.ts +2 -0
- package/dist/forms/list-box/index.js +1 -0
- package/dist/forms/list-box/list-box.svelte +188 -111
- package/dist/forms/list-box/list-box.svelte.d.ts +16 -28
- package/dist/forms/money-box/money-box.svelte +224 -178
- package/dist/forms/money-box/money-box.svelte.d.ts +16 -30
- package/dist/forms/number-box/number-box.svelte +82 -62
- package/dist/forms/number-box/number-box.svelte.d.ts +17 -30
- package/dist/forms/phone-box/index.d.ts +1 -0
- package/dist/forms/phone-box/index.js +1 -0
- package/dist/forms/phone-box/phone-box.svelte +156 -116
- package/dist/forms/phone-box/phone-box.svelte.d.ts +8 -22
- package/dist/forms/radio-group/index.d.ts +2 -0
- package/dist/forms/radio-group/index.js +2 -0
- package/dist/forms/radio-group/radio-box.svelte +23 -8
- package/dist/forms/radio-group/radio-box.svelte.d.ts +10 -21
- package/dist/forms/radio-group/radio-group.svelte +25 -15
- package/dist/forms/radio-group/radio-group.svelte.d.ts +10 -23
- package/dist/forms/slider/slider.svelte +206 -0
- package/dist/forms/slider/slider.svelte.d.ts +17 -0
- package/dist/forms/switch-box/switch-box.svelte +35 -21
- package/dist/forms/switch-box/switch-box.svelte.d.ts +9 -22
- package/dist/forms/text-area/text-area.svelte +94 -17
- package/dist/forms/text-area/text-area.svelte.d.ts +15 -25
- package/dist/forms/text-box/text-box.svelte +244 -79
- package/dist/forms/text-box/text-box.svelte.d.ts +28 -38
- package/dist/forms/time-box/time-box.svelte +63 -0
- package/dist/forms/time-box/time-box.svelte.d.ts +12 -0
- package/dist/forms/url-box/url-box.svelte +32 -18
- package/dist/forms/url-box/url-box.svelte.d.ts +9 -22
- package/dist/forms/validation.d.ts +60 -0
- package/dist/forms/validation.js +123 -0
- package/dist/generic/address/address.svelte +22 -11
- package/dist/generic/address/address.svelte.d.ts +9 -21
- package/dist/generic/avatar/avatar.svelte +87 -0
- package/dist/generic/avatar/avatar.svelte.d.ts +10 -0
- package/dist/generic/badge/badge.svelte +82 -0
- package/dist/generic/badge/badge.svelte.d.ts +11 -0
- package/dist/generic/card/card-container.svelte +41 -12
- package/dist/generic/card/card-container.svelte.d.ts +8 -20
- package/dist/generic/card/card.svelte +47 -27
- package/dist/generic/card/card.svelte.d.ts +9 -21
- package/dist/generic/card/index.d.ts +3 -0
- package/dist/generic/card/index.js +2 -0
- package/dist/generic/chip/chip.svelte +91 -0
- package/dist/generic/chip/chip.svelte.d.ts +11 -0
- package/dist/generic/date/date-time.svelte +86 -58
- package/dist/generic/date/date-time.svelte.d.ts +10 -22
- package/dist/generic/divider/divider.svelte.d.ts +22 -21
- package/dist/generic/dot/dot.svelte +13 -4
- package/dist/generic/dot/dot.svelte.d.ts +7 -19
- package/dist/generic/dropdown-item/dropdown-item.svelte +24 -12
- package/dist/generic/dropdown-item/dropdown-item.svelte.d.ts +10 -23
- package/dist/generic/email/email.svelte +6 -4
- package/dist/generic/email/email.svelte.d.ts +5 -17
- package/dist/generic/empty/empty.svelte +57 -26
- package/dist/generic/empty/empty.svelte.d.ts +11 -23
- package/dist/generic/header/header.svelte +26 -10
- package/dist/generic/header/header.svelte.d.ts +10 -22
- package/dist/generic/index.d.ts +28 -0
- package/dist/generic/index.js +31 -0
- package/dist/generic/link/link.svelte +20 -7
- package/dist/generic/link/link.svelte.d.ts +11 -23
- package/dist/generic/list/index.d.ts +4 -0
- package/dist/generic/list/index.js +3 -0
- package/dist/generic/list/list-item.svelte +17 -13
- package/dist/generic/list/list-item.svelte.d.ts +6 -17
- package/dist/generic/list/list.d.ts +2 -2
- package/dist/generic/list/list.svelte +28 -15
- package/dist/generic/list/list.svelte.d.ts +9 -21
- package/dist/generic/menu/menu.svelte +163 -54
- package/dist/generic/menu/menu.svelte.d.ts +16 -26
- package/dist/generic/notice/notice.svelte +119 -80
- package/dist/generic/notice/notice.svelte.d.ts +17 -28
- package/dist/generic/overlay.svelte +40 -14
- package/dist/generic/overlay.svelte.d.ts +9 -21
- package/dist/generic/panel/panel.svelte +16 -6
- package/dist/generic/panel/panel.svelte.d.ts +8 -20
- package/dist/generic/phone/phone.svelte +30 -20
- package/dist/generic/phone/phone.svelte.d.ts +6 -18
- package/dist/generic/pill/pill.svelte +47 -33
- package/dist/generic/pill/pill.svelte.d.ts +10 -23
- package/dist/generic/popover/popover.svelte +226 -0
- package/dist/generic/popover/popover.svelte.d.ts +15 -0
- package/dist/generic/rating/rating.svelte +85 -0
- package/dist/generic/rating/rating.svelte.d.ts +11 -0
- package/dist/generic/scorecard/scorecard.svelte +34 -18
- package/dist/generic/scorecard/scorecard.svelte.d.ts +9 -21
- package/dist/generic/section/section.svelte +28 -9
- package/dist/generic/section/section.svelte.d.ts +11 -23
- package/dist/generic/spinner/spinner.svelte +64 -0
- package/dist/generic/spinner/spinner.svelte.d.ts +8 -0
- package/dist/generic/theme-provider/index.d.ts +1 -0
- package/dist/generic/theme-provider/index.js +1 -0
- package/dist/generic/theme-provider/theme-provider-demo.svelte +182 -0
- package/dist/generic/theme-provider/theme-provider-demo.svelte.d.ts +3 -0
- package/dist/generic/theme-provider/theme-provider.svelte +83 -0
- package/dist/generic/theme-provider/theme-provider.svelte.d.ts +44 -0
- package/dist/generic/toaster/toaster.svelte +31 -6
- package/dist/generic/toaster/toaster.svelte.d.ts +7 -17
- package/dist/generic/tooltip/tooltip.svelte +389 -0
- package/dist/generic/tooltip/tooltip.svelte.d.ts +21 -0
- package/dist/helpers/ago.d.ts +6 -0
- package/dist/helpers/ago.js +6 -0
- package/dist/helpers/animation-actions.d.ts +124 -0
- package/dist/helpers/animation-actions.js +299 -0
- package/dist/helpers/animations.d.ts +198 -0
- package/dist/helpers/animations.js +280 -0
- package/dist/helpers/announcer.d.ts +118 -0
- package/dist/helpers/announcer.js +250 -0
- package/dist/helpers/copy-to-clipboard.svelte.d.ts +5 -0
- package/dist/helpers/copy-to-clipboard.svelte.js +28 -0
- package/dist/helpers/debounce.d.ts +7 -0
- package/dist/helpers/debounce.js +7 -0
- package/dist/helpers/focus.d.ts +123 -0
- package/dist/helpers/focus.js +335 -0
- package/dist/helpers/fuzzy-search.d.ts +41 -0
- package/dist/helpers/fuzzy-search.js +114 -0
- package/dist/helpers/index.d.ts +24 -0
- package/dist/helpers/index.js +24 -0
- package/dist/helpers/navigate-to.d.ts +4 -0
- package/dist/helpers/navigate-to.js +4 -0
- package/dist/helpers/positioning.d.ts +97 -0
- package/dist/helpers/positioning.js +230 -0
- package/dist/helpers/round-to-decimals.d.ts +7 -5
- package/dist/helpers/round-to-decimals.js +7 -5
- package/dist/helpers/spring.svelte.d.ts +97 -0
- package/dist/helpers/spring.svelte.js +216 -0
- package/dist/helpers/subscribable.d.ts +1 -1
- package/dist/helpers/theme.svelte.d.ts +63 -0
- package/dist/helpers/theme.svelte.js +123 -0
- package/dist/helpers/unique-id.d.ts +4 -0
- package/dist/helpers/unique-id.js +4 -0
- package/dist/helpers/use-position.svelte.d.ts +96 -0
- package/dist/helpers/use-position.svelte.js +189 -0
- package/dist/helpers/use-virtual-list.svelte.d.ts +121 -0
- package/dist/helpers/use-virtual-list.svelte.js +239 -0
- package/dist/icons/angle-right-icon.svelte +2 -1
- package/dist/icons/angle-right-icon.svelte.d.ts +16 -14
- package/dist/icons/angle-up-icon.svelte.d.ts +22 -21
- package/dist/icons/check-icon.svelte.d.ts +22 -21
- package/dist/icons/copy-icon.svelte +46 -0
- package/dist/icons/copy-icon.svelte.d.ts +6 -0
- package/dist/icons/envelope-icon.svelte.d.ts +22 -21
- package/dist/icons/folder-open-icon.svelte.d.ts +22 -21
- package/dist/icons/hamburger-icon.svelte.d.ts +22 -21
- package/dist/icons/home-icon.svelte +2 -1
- package/dist/icons/home-icon.svelte.d.ts +16 -14
- package/dist/icons/index.d.ts +13 -0
- package/dist/icons/index.js +13 -0
- package/dist/icons/link-icon.svelte.d.ts +22 -21
- package/dist/icons/mobile-phone-icon.svelte.d.ts +22 -21
- package/dist/icons/phone-icon.svelte.d.ts +22 -21
- package/dist/icons/svg-icon.svelte +46 -10
- package/dist/icons/svg-icon.svelte.d.ts +13 -25
- package/dist/icons/upload-icon.svelte.d.ts +22 -21
- package/dist/images/icon.svelte +9 -3
- package/dist/images/icon.svelte.d.ts +6 -18
- package/dist/images/image.svelte +28 -8
- package/dist/images/image.svelte.d.ts +14 -28
- package/dist/images/index.d.ts +2 -0
- package/dist/images/index.js +2 -0
- package/dist/index.d.ts +13 -122
- package/dist/index.js +27 -135
- package/dist/layout/flex-col.svelte +65 -16
- package/dist/layout/flex-col.svelte.d.ts +12 -24
- package/dist/layout/flex-item.svelte +13 -3
- package/dist/layout/flex-item.svelte.d.ts +8 -20
- package/dist/layout/flex-row.svelte +70 -15
- package/dist/layout/flex-row.svelte.d.ts +14 -26
- package/dist/layout/grid.svelte +7 -1
- package/dist/layout/grid.svelte.d.ts +6 -28
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +4 -0
- package/dist/modals/alert.svelte +42 -28
- package/dist/modals/alert.svelte.d.ts +13 -26
- package/dist/modals/confirm.svelte +54 -37
- package/dist/modals/confirm.svelte.d.ts +16 -29
- package/dist/modals/dialog-body.svelte +10 -4
- package/dist/modals/dialog-body.svelte.d.ts +6 -28
- package/dist/modals/dialog-close-button.svelte +15 -9
- package/dist/modals/dialog-close-button.svelte.d.ts +6 -19
- package/dist/modals/dialog-footer.svelte +6 -3
- package/dist/modals/dialog-footer.svelte.d.ts +6 -28
- package/dist/modals/dialog-header.svelte +13 -1
- package/dist/modals/dialog-header.svelte.d.ts +7 -28
- package/dist/modals/dialog-window.svelte +42 -14
- package/dist/modals/dialog-window.svelte.d.ts +9 -19
- package/dist/modals/index.d.ts +9 -0
- package/dist/modals/index.js +9 -0
- package/dist/modals/modal.svelte +88 -23
- package/dist/modals/modal.svelte.d.ts +14 -24
- package/dist/modals/prompt.svelte +71 -49
- package/dist/modals/prompt.svelte.d.ts +19 -32
- package/dist/navigation/accordion/accordion.svelte +104 -0
- package/dist/navigation/accordion/accordion.svelte.d.ts +9 -0
- package/dist/navigation/app-bar/app-bar.svelte +26 -12
- package/dist/navigation/app-bar/app-bar.svelte.d.ts +10 -22
- package/dist/navigation/app-bar/app-branding.svelte +10 -5
- package/dist/navigation/app-bar/app-branding.svelte.d.ts +6 -17
- package/dist/navigation/app-bar/app-logo.svelte +20 -5
- package/dist/navigation/app-bar/app-logo.svelte.d.ts +9 -21
- package/dist/navigation/app-bar/app-nav-item.svelte +26 -13
- package/dist/navigation/app-bar/app-nav-item.svelte.d.ts +9 -22
- package/dist/navigation/app-bar/app-nav.svelte +39 -12
- package/dist/navigation/app-bar/app-nav.svelte.d.ts +8 -20
- package/dist/navigation/app-bar/index.d.ts +5 -0
- package/dist/navigation/app-bar/index.js +5 -0
- package/dist/navigation/breadcrumbs/breadcrumbs.svelte +54 -27
- package/dist/navigation/breadcrumbs/breadcrumbs.svelte.d.ts +12 -23
- package/dist/navigation/command-palette/command-palette.svelte +758 -0
- package/dist/navigation/command-palette/command-palette.svelte.d.ts +65 -0
- package/dist/navigation/command-palette/index.d.ts +2 -0
- package/dist/navigation/command-palette/index.js +1 -0
- package/dist/navigation/context-menu/README.md +147 -0
- package/dist/navigation/context-menu/context-menu-divider.svelte +22 -0
- package/dist/navigation/context-menu/context-menu-divider.svelte.d.ts +18 -0
- package/dist/navigation/context-menu/context-menu-item.svelte +268 -0
- package/dist/navigation/context-menu/context-menu-item.svelte.d.ts +19 -0
- package/dist/navigation/context-menu/context-menu.svelte +226 -0
- package/dist/navigation/context-menu/context-menu.svelte.d.ts +38 -0
- package/dist/navigation/context-menu/index.d.ts +3 -0
- package/dist/navigation/context-menu/index.js +3 -0
- package/dist/navigation/drawer/drawer.svelte +137 -0
- package/dist/navigation/drawer/drawer.svelte.d.ts +11 -0
- package/dist/navigation/dropdown-button/dropdown-button.svelte +58 -19
- package/dist/navigation/dropdown-button/dropdown-button.svelte.d.ts +10 -22
- package/dist/navigation/index.d.ts +11 -0
- package/dist/navigation/index.js +14 -0
- package/dist/navigation/pagination/pagination.svelte +55 -37
- package/dist/navigation/pagination/pagination.svelte.d.ts +10 -23
- package/dist/navigation/side-bar/side-bar.svelte +18 -9
- package/dist/navigation/side-bar/side-bar.svelte.d.ts +7 -19
- package/dist/navigation/tabs/index.d.ts +4 -0
- package/dist/navigation/tabs/index.js +3 -0
- package/dist/navigation/tabs/tab-context.d.ts +12 -6
- package/dist/navigation/tabs/tab-group.svelte +268 -52
- package/dist/navigation/tabs/tab-group.svelte.d.ts +9 -22
- package/dist/navigation/tabs/tab.svelte +64 -33
- package/dist/navigation/tabs/tab.svelte.d.ts +11 -24
- package/dist/navigation/wizard/index.d.ts +3 -0
- package/dist/navigation/wizard/index.js +2 -0
- package/dist/navigation/wizard/wizard-context.d.ts +13 -8
- package/dist/navigation/wizard/wizard-step.svelte +38 -13
- package/dist/navigation/wizard/wizard-step.svelte.d.ts +8 -20
- package/dist/navigation/wizard/wizard.svelte +123 -81
- package/dist/navigation/wizard/wizard.svelte.d.ts +15 -28
- package/dist/placeholders/index.d.ts +6 -0
- package/dist/placeholders/index.js +6 -0
- package/dist/placeholders/loading.svelte +39 -23
- package/dist/placeholders/loading.svelte.d.ts +10 -19
- package/dist/placeholders/progress.svelte +7 -6
- package/dist/placeholders/progress.svelte.d.ts +5 -17
- package/dist/placeholders/skeleton-input.svelte +66 -38
- package/dist/placeholders/skeleton-input.svelte.d.ts +5 -17
- package/dist/placeholders/skeleton-paragraph.svelte +25 -0
- package/dist/placeholders/skeleton-paragraph.svelte.d.ts +8 -0
- package/dist/placeholders/skeleton-table.svelte +75 -0
- package/dist/placeholders/skeleton-table.svelte.d.ts +8 -0
- package/dist/placeholders/skeleton-text.svelte +46 -15
- package/dist/placeholders/skeleton-text.svelte.d.ts +7 -19
- package/dist/tables/cell-renderers.d.ts +24 -0
- package/dist/tables/cell-renderers.js +228 -0
- package/dist/tables/data-grid.svelte +332 -118
- package/dist/tables/data-grid.svelte.d.ts +34 -35
- package/dist/tables/index.d.ts +10 -0
- package/dist/tables/index.js +12 -0
- package/dist/tables/table-caption.svelte +13 -4
- package/dist/tables/table-caption.svelte.d.ts +8 -20
- package/dist/tables/table-cell.svelte +45 -14
- package/dist/tables/table-cell.svelte.d.ts +10 -21
- package/dist/tables/table-context.svelte.d.ts +32 -0
- package/dist/tables/table-context.svelte.js +160 -0
- package/dist/tables/table-header-cell.svelte +158 -18
- package/dist/tables/table-header-cell.svelte.d.ts +15 -21
- package/dist/tables/table-header.svelte +31 -6
- package/dist/tables/table-header.svelte.d.ts +7 -28
- package/dist/tables/table-row.svelte +87 -7
- package/dist/tables/table-row.svelte.d.ts +10 -28
- package/dist/tables/table.svelte +61 -2
- package/dist/tables/table.svelte.d.ts +13 -28
- package/dist/test-utils/accessibility-helpers.d.ts +80 -0
- package/dist/test-utils/accessibility-helpers.js +220 -0
- package/dist/test-utils/index.d.ts +8 -0
- package/dist/test-utils/index.js +8 -0
- package/dist/test-utils/mock-helpers.d.ts +68 -0
- package/dist/test-utils/mock-helpers.js +165 -0
- package/dist/test-utils/render-helpers.d.ts +55 -0
- package/dist/test-utils/render-helpers.js +114 -0
- package/dist/test-utils/setup.d.ts +5 -0
- package/dist/test-utils/setup.js +91 -0
- package/dist/test-utils/test-data.d.ts +102 -0
- package/dist/test-utils/test-data.js +99 -0
- package/dist/timeline/index.d.ts +2 -0
- package/dist/timeline/index.js +2 -0
- package/dist/timeline/timeline-item.svelte +26 -9
- package/dist/timeline/timeline-item.svelte.d.ts +13 -25
- package/dist/timeline/timeline.svelte +12 -6
- package/dist/timeline/timeline.svelte.d.ts +6 -28
- package/dist/types/data.d.ts +61 -0
- package/dist/types/date.d.ts +1 -1
- package/dist/types/form.d.ts +20 -2
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/dist/types/size.d.ts +22 -0
- package/dist/types/size.js +22 -0
- package/dist/typography/code-block.svelte +89 -10
- package/dist/typography/code-block.svelte.d.ts +7 -19
- package/dist/typography/code.svelte +89 -0
- package/dist/typography/code.svelte.d.ts +7 -0
- package/dist/typography/headline.svelte +29 -9
- package/dist/typography/headline.svelte.d.ts +8 -20
- package/dist/typography/index.d.ts +6 -0
- package/dist/typography/index.js +6 -0
- package/dist/typography/paragraph.svelte +18 -10
- package/dist/typography/paragraph.svelte.d.ts +6 -28
- package/dist/typography/subtitle.svelte +18 -4
- package/dist/typography/subtitle.svelte.d.ts +8 -20
- package/dist/typography/text.svelte +20 -5
- package/dist/typography/text.svelte.d.ts +9 -21
- package/package.json +31 -21
- package/dist/navigation/accordian/accordian.svelte +0 -62
- package/dist/navigation/accordian/accordian.svelte.d.ts +0 -21
- package/dist/tables/table-body.svelte +0 -3
- package/dist/tables/table-body.svelte.d.ts +0 -29
- package/dist/tables/table-footer-cell.svelte +0 -22
- package/dist/tables/table-footer-cell.svelte.d.ts +0 -20
- package/dist/tables/table-footer-row.svelte +0 -3
- package/dist/tables/table-footer-row.svelte.d.ts +0 -29
- package/dist/tables/table-footer.svelte +0 -13
- package/dist/tables/table-footer.svelte.d.ts +0 -29
- package/dist/tables/table-header-row.svelte +0 -4
- package/dist/tables/table-header-row.svelte.d.ts +0 -29
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Management Composable
|
|
3
|
+
*
|
|
4
|
+
* Provides reactive theme state and utilities for switching between light and dark modes.
|
|
5
|
+
* The theme preference is persisted in localStorage and synced across tabs.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { useTheme } from './theme.svelte';
|
|
11
|
+
*
|
|
12
|
+
* const theme = useTheme();
|
|
13
|
+
* </script>
|
|
14
|
+
*
|
|
15
|
+
* <button onclick={() => theme.toggle()}>
|
|
16
|
+
* Current theme: {theme.current}
|
|
17
|
+
* </button>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
21
|
+
export type ResolvedTheme = 'light' | 'dark';
|
|
22
|
+
declare class ThemeManager {
|
|
23
|
+
current: Theme;
|
|
24
|
+
resolved: ResolvedTheme;
|
|
25
|
+
private mediaQuery;
|
|
26
|
+
private initialized;
|
|
27
|
+
constructor();
|
|
28
|
+
private initialize;
|
|
29
|
+
private updateResolvedTheme;
|
|
30
|
+
private applyTheme;
|
|
31
|
+
/**
|
|
32
|
+
* Set the theme to a specific value
|
|
33
|
+
*/
|
|
34
|
+
set(theme: Theme): void;
|
|
35
|
+
/**
|
|
36
|
+
* Toggle between light and dark themes
|
|
37
|
+
* (skips 'system' mode for simple toggling)
|
|
38
|
+
*/
|
|
39
|
+
toggle(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Reset to system preference
|
|
42
|
+
*/
|
|
43
|
+
resetToSystem(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Check if dark mode is currently active
|
|
46
|
+
*/
|
|
47
|
+
get isDark(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Check if light mode is currently active
|
|
50
|
+
*/
|
|
51
|
+
get isLight(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Check if system preference is being used
|
|
54
|
+
*/
|
|
55
|
+
get isSystem(): boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get the theme manager instance
|
|
59
|
+
*
|
|
60
|
+
* @returns ThemeManager instance with reactive theme state
|
|
61
|
+
*/
|
|
62
|
+
export declare function useTheme(): ThemeManager;
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Management Composable
|
|
3
|
+
*
|
|
4
|
+
* Provides reactive theme state and utilities for switching between light and dark modes.
|
|
5
|
+
* The theme preference is persisted in localStorage and synced across tabs.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { useTheme } from './theme.svelte';
|
|
11
|
+
*
|
|
12
|
+
* const theme = useTheme();
|
|
13
|
+
* </script>
|
|
14
|
+
*
|
|
15
|
+
* <button onclick={() => theme.toggle()}>
|
|
16
|
+
* Current theme: {theme.current}
|
|
17
|
+
* </button>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
const STORAGE_KEY = 'sveltacular-theme';
|
|
21
|
+
const MEDIA_QUERY = '(prefers-color-scheme: dark)';
|
|
22
|
+
class ThemeManager {
|
|
23
|
+
current = $state('system');
|
|
24
|
+
resolved = $state('light');
|
|
25
|
+
mediaQuery = null;
|
|
26
|
+
initialized = false;
|
|
27
|
+
constructor() {
|
|
28
|
+
if (typeof window !== 'undefined') {
|
|
29
|
+
this.initialize();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
initialize() {
|
|
33
|
+
if (this.initialized)
|
|
34
|
+
return;
|
|
35
|
+
this.initialized = true;
|
|
36
|
+
// Load saved preference or default to 'system'
|
|
37
|
+
const saved = localStorage.getItem(STORAGE_KEY);
|
|
38
|
+
this.current = saved || 'system';
|
|
39
|
+
// Set up media query listener for system preference
|
|
40
|
+
this.mediaQuery = window.matchMedia(MEDIA_QUERY);
|
|
41
|
+
this.updateResolvedTheme();
|
|
42
|
+
// Listen for system theme changes
|
|
43
|
+
this.mediaQuery.addEventListener('change', () => {
|
|
44
|
+
this.updateResolvedTheme();
|
|
45
|
+
});
|
|
46
|
+
// Listen for storage changes (sync across tabs)
|
|
47
|
+
window.addEventListener('storage', (e) => {
|
|
48
|
+
if (e.key === STORAGE_KEY && e.newValue) {
|
|
49
|
+
this.current = e.newValue;
|
|
50
|
+
this.updateResolvedTheme();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// Apply theme immediately
|
|
54
|
+
this.applyTheme();
|
|
55
|
+
}
|
|
56
|
+
updateResolvedTheme() {
|
|
57
|
+
if (this.current === 'system') {
|
|
58
|
+
this.resolved = this.mediaQuery?.matches ? 'dark' : 'light';
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.resolved = this.current;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
applyTheme() {
|
|
65
|
+
if (typeof document === 'undefined')
|
|
66
|
+
return;
|
|
67
|
+
this.updateResolvedTheme();
|
|
68
|
+
document.documentElement.setAttribute('data-theme', this.resolved);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set the theme to a specific value
|
|
72
|
+
*/
|
|
73
|
+
set(theme) {
|
|
74
|
+
this.current = theme;
|
|
75
|
+
localStorage.setItem(STORAGE_KEY, theme);
|
|
76
|
+
this.applyTheme();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Toggle between light and dark themes
|
|
80
|
+
* (skips 'system' mode for simple toggling)
|
|
81
|
+
*/
|
|
82
|
+
toggle() {
|
|
83
|
+
const newTheme = this.resolved === 'dark' ? 'light' : 'dark';
|
|
84
|
+
this.set(newTheme);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reset to system preference
|
|
88
|
+
*/
|
|
89
|
+
resetToSystem() {
|
|
90
|
+
this.set('system');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if dark mode is currently active
|
|
94
|
+
*/
|
|
95
|
+
get isDark() {
|
|
96
|
+
return this.resolved === 'dark';
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if light mode is currently active
|
|
100
|
+
*/
|
|
101
|
+
get isLight() {
|
|
102
|
+
return this.resolved === 'light';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if system preference is being used
|
|
106
|
+
*/
|
|
107
|
+
get isSystem() {
|
|
108
|
+
return this.current === 'system';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Singleton instance
|
|
112
|
+
let themeManager = null;
|
|
113
|
+
/**
|
|
114
|
+
* Get the theme manager instance
|
|
115
|
+
*
|
|
116
|
+
* @returns ThemeManager instance with reactive theme state
|
|
117
|
+
*/
|
|
118
|
+
export function useTheme() {
|
|
119
|
+
if (!themeManager) {
|
|
120
|
+
themeManager = new ThemeManager();
|
|
121
|
+
}
|
|
122
|
+
return themeManager;
|
|
123
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Position Composable
|
|
3
|
+
*
|
|
4
|
+
* Reactive positioning for floating elements (tooltips, popovers, dropdowns).
|
|
5
|
+
* Automatically updates position on scroll and resize events.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { usePosition } from './use-position.svelte';
|
|
11
|
+
*
|
|
12
|
+
* let buttonRef: HTMLElement;
|
|
13
|
+
* let tooltipRef: HTMLElement;
|
|
14
|
+
*
|
|
15
|
+
* const position = usePosition(() => buttonRef, () => tooltipRef, {
|
|
16
|
+
* placement: 'top',
|
|
17
|
+
* arrow: true
|
|
18
|
+
* });
|
|
19
|
+
* </script>
|
|
20
|
+
*
|
|
21
|
+
* <button bind:this={buttonRef}>Hover me</button>
|
|
22
|
+
*
|
|
23
|
+
* <div
|
|
24
|
+
* bind:this={tooltipRef}
|
|
25
|
+
* style="position: fixed; top: {position.top}px; left: {position.left}px;"
|
|
26
|
+
* >
|
|
27
|
+
* Tooltip content
|
|
28
|
+
* </div>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import { type PositionOptions } from './positioning.js';
|
|
32
|
+
export interface UsePositionOptions extends PositionOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Whether positioning is enabled
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
enabled?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Update position on scroll
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
updateOnScroll?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Update position on resize
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
updateOnResize?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare class PositionManager {
|
|
50
|
+
top: number;
|
|
51
|
+
left: number;
|
|
52
|
+
side: import("./positioning.js").Side;
|
|
53
|
+
alignment: import("./positioning.js").Alignment;
|
|
54
|
+
arrowTop: number | undefined;
|
|
55
|
+
arrowLeft: number | undefined;
|
|
56
|
+
arrowSide: import("./positioning.js").Side;
|
|
57
|
+
private getReferenceElement;
|
|
58
|
+
private getFloatingElement;
|
|
59
|
+
private options;
|
|
60
|
+
private cleanup;
|
|
61
|
+
private rafId;
|
|
62
|
+
constructor(getReferenceElement: () => Element | null, getFloatingElement: () => Element | null, options: UsePositionOptions);
|
|
63
|
+
/**
|
|
64
|
+
* Update the position
|
|
65
|
+
*/
|
|
66
|
+
update(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Start listening for scroll and resize events
|
|
69
|
+
*/
|
|
70
|
+
start(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Stop listening for events
|
|
73
|
+
*/
|
|
74
|
+
stop(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Update options
|
|
77
|
+
*/
|
|
78
|
+
setOptions(options: Partial<UsePositionOptions>): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get current position as style object
|
|
81
|
+
*/
|
|
82
|
+
get style(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Get arrow style object
|
|
85
|
+
*/
|
|
86
|
+
get arrowStyle(): string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a position manager instance
|
|
90
|
+
*
|
|
91
|
+
* @param getReferenceElement - Function that returns the reference element
|
|
92
|
+
* @param getFloatingElement - Function that returns the floating element
|
|
93
|
+
* @param options - Positioning options
|
|
94
|
+
* @returns PositionManager instance
|
|
95
|
+
*/
|
|
96
|
+
export declare function usePosition(getReferenceElement: () => Element | null, getFloatingElement: () => Element | null, options: UsePositionOptions): PositionManager;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Position Composable
|
|
3
|
+
*
|
|
4
|
+
* Reactive positioning for floating elements (tooltips, popovers, dropdowns).
|
|
5
|
+
* Automatically updates position on scroll and resize events.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { usePosition } from './use-position.svelte';
|
|
11
|
+
*
|
|
12
|
+
* let buttonRef: HTMLElement;
|
|
13
|
+
* let tooltipRef: HTMLElement;
|
|
14
|
+
*
|
|
15
|
+
* const position = usePosition(() => buttonRef, () => tooltipRef, {
|
|
16
|
+
* placement: 'top',
|
|
17
|
+
* arrow: true
|
|
18
|
+
* });
|
|
19
|
+
* </script>
|
|
20
|
+
*
|
|
21
|
+
* <button bind:this={buttonRef}>Hover me</button>
|
|
22
|
+
*
|
|
23
|
+
* <div
|
|
24
|
+
* bind:this={tooltipRef}
|
|
25
|
+
* style="position: fixed; top: {position.top}px; left: {position.left}px;"
|
|
26
|
+
* >
|
|
27
|
+
* Tooltip content
|
|
28
|
+
* </div>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import { calculatePosition, calculateArrowPosition } from './positioning.js';
|
|
32
|
+
import { onMount } from 'svelte';
|
|
33
|
+
export class PositionManager {
|
|
34
|
+
// Position state
|
|
35
|
+
top = $state(0);
|
|
36
|
+
left = $state(0);
|
|
37
|
+
side = $state('bottom');
|
|
38
|
+
alignment = $state('center');
|
|
39
|
+
// Arrow state
|
|
40
|
+
arrowTop = $state(undefined);
|
|
41
|
+
arrowLeft = $state(undefined);
|
|
42
|
+
arrowSide = $state('bottom');
|
|
43
|
+
// Element getters
|
|
44
|
+
getReferenceElement;
|
|
45
|
+
getFloatingElement;
|
|
46
|
+
// Options
|
|
47
|
+
options;
|
|
48
|
+
// Cleanup
|
|
49
|
+
cleanup = null;
|
|
50
|
+
rafId = null;
|
|
51
|
+
constructor(getReferenceElement, getFloatingElement, options) {
|
|
52
|
+
this.getReferenceElement = getReferenceElement;
|
|
53
|
+
this.getFloatingElement = getFloatingElement;
|
|
54
|
+
this.options = {
|
|
55
|
+
enabled: true,
|
|
56
|
+
updateOnScroll: true,
|
|
57
|
+
updateOnResize: true,
|
|
58
|
+
...options
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Update the position
|
|
63
|
+
*/
|
|
64
|
+
update() {
|
|
65
|
+
// Cancel any pending update
|
|
66
|
+
if (this.rafId !== null) {
|
|
67
|
+
cancelAnimationFrame(this.rafId);
|
|
68
|
+
}
|
|
69
|
+
// Schedule update in next frame
|
|
70
|
+
this.rafId = requestAnimationFrame(() => {
|
|
71
|
+
this.rafId = null;
|
|
72
|
+
if (!this.options.enabled)
|
|
73
|
+
return;
|
|
74
|
+
const reference = this.getReferenceElement();
|
|
75
|
+
const floating = this.getFloatingElement();
|
|
76
|
+
if (!reference || !floating)
|
|
77
|
+
return;
|
|
78
|
+
// Calculate position
|
|
79
|
+
const position = calculatePosition(reference, floating, this.options);
|
|
80
|
+
this.top = position.top;
|
|
81
|
+
this.left = position.left;
|
|
82
|
+
this.side = position.side;
|
|
83
|
+
this.alignment = position.alignment;
|
|
84
|
+
// Calculate arrow position if enabled
|
|
85
|
+
if (this.options.arrow) {
|
|
86
|
+
const arrow = calculateArrowPosition(reference, floating, position.side, this.options.arrowSize);
|
|
87
|
+
this.arrowTop = arrow.top;
|
|
88
|
+
this.arrowLeft = arrow.left;
|
|
89
|
+
this.arrowSide = arrow.side;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Start listening for scroll and resize events
|
|
95
|
+
*/
|
|
96
|
+
start() {
|
|
97
|
+
this.stop(); // Clean up any existing listeners
|
|
98
|
+
// Initial update
|
|
99
|
+
this.update();
|
|
100
|
+
// Set up event listeners
|
|
101
|
+
const listeners = [];
|
|
102
|
+
if (this.options.updateOnScroll) {
|
|
103
|
+
const scrollHandler = () => this.update();
|
|
104
|
+
window.addEventListener('scroll', scrollHandler, { passive: true });
|
|
105
|
+
listeners.push(() => window.removeEventListener('scroll', scrollHandler));
|
|
106
|
+
}
|
|
107
|
+
if (this.options.updateOnResize) {
|
|
108
|
+
const resizeHandler = () => this.update();
|
|
109
|
+
window.addEventListener('resize', resizeHandler, { passive: true });
|
|
110
|
+
listeners.push(() => window.removeEventListener('resize', resizeHandler));
|
|
111
|
+
}
|
|
112
|
+
// Store cleanup function
|
|
113
|
+
this.cleanup = () => {
|
|
114
|
+
listeners.forEach(cleanup => cleanup());
|
|
115
|
+
if (this.rafId !== null) {
|
|
116
|
+
cancelAnimationFrame(this.rafId);
|
|
117
|
+
this.rafId = null;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Stop listening for events
|
|
123
|
+
*/
|
|
124
|
+
stop() {
|
|
125
|
+
if (this.cleanup) {
|
|
126
|
+
this.cleanup();
|
|
127
|
+
this.cleanup = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Update options
|
|
132
|
+
*/
|
|
133
|
+
setOptions(options) {
|
|
134
|
+
this.options = { ...this.options, ...options };
|
|
135
|
+
this.update();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get current position as style object
|
|
139
|
+
*/
|
|
140
|
+
get style() {
|
|
141
|
+
return `position: fixed; top: ${this.top}px; left: ${this.left}px;`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get arrow style object
|
|
145
|
+
*/
|
|
146
|
+
get arrowStyle() {
|
|
147
|
+
const styles = ['position: absolute;'];
|
|
148
|
+
if (this.arrowLeft !== undefined) {
|
|
149
|
+
styles.push(`left: ${this.arrowLeft}px;`);
|
|
150
|
+
}
|
|
151
|
+
if (this.arrowTop !== undefined) {
|
|
152
|
+
styles.push(`top: ${this.arrowTop}px;`);
|
|
153
|
+
}
|
|
154
|
+
// Position arrow on the correct side
|
|
155
|
+
// Overlap by 1px to bridge gap created by border-radius
|
|
156
|
+
switch (this.arrowSide) {
|
|
157
|
+
case 'top':
|
|
158
|
+
styles.push('bottom: calc(100% - 1px);');
|
|
159
|
+
break;
|
|
160
|
+
case 'bottom':
|
|
161
|
+
styles.push('top: calc(100% - 1px);');
|
|
162
|
+
break;
|
|
163
|
+
case 'left':
|
|
164
|
+
styles.push('right: calc(100% - 1px);');
|
|
165
|
+
break;
|
|
166
|
+
case 'right':
|
|
167
|
+
styles.push('left: calc(100% - 1px);');
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
return styles.join(' ');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create a position manager instance
|
|
175
|
+
*
|
|
176
|
+
* @param getReferenceElement - Function that returns the reference element
|
|
177
|
+
* @param getFloatingElement - Function that returns the floating element
|
|
178
|
+
* @param options - Positioning options
|
|
179
|
+
* @returns PositionManager instance
|
|
180
|
+
*/
|
|
181
|
+
export function usePosition(getReferenceElement, getFloatingElement, options) {
|
|
182
|
+
const manager = new PositionManager(getReferenceElement, getFloatingElement, options);
|
|
183
|
+
// Auto-start on mount
|
|
184
|
+
onMount(() => {
|
|
185
|
+
manager.start();
|
|
186
|
+
return () => manager.stop();
|
|
187
|
+
});
|
|
188
|
+
return manager;
|
|
189
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual List Composable
|
|
3
|
+
*
|
|
4
|
+
* Provides efficient rendering of large lists by only rendering visible items.
|
|
5
|
+
* Maintains 60fps performance with 10,000+ items through viewport-based rendering.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { useVirtualList } from './use-virtual-list.svelte';
|
|
11
|
+
*
|
|
12
|
+
* const items = Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` }));
|
|
13
|
+
* const virtual = useVirtualList(items, { itemHeight: 40 });
|
|
14
|
+
* </script>
|
|
15
|
+
*
|
|
16
|
+
* <div bind:this={virtual.containerRef} style="height: 400px; overflow-y: auto;">
|
|
17
|
+
* <div style="height: {virtual.totalHeight}px; position: relative;">
|
|
18
|
+
* {#each virtual.visibleItems as item (item.index)}
|
|
19
|
+
* <div style="position: absolute; top: {item.offsetTop}px; height: {virtual.itemHeight}px;">
|
|
20
|
+
* {item.data.name}
|
|
21
|
+
* </div>
|
|
22
|
+
* {/each}
|
|
23
|
+
* </div>
|
|
24
|
+
* </div>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export interface VirtualListOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Height of each item in pixels
|
|
30
|
+
*/
|
|
31
|
+
itemHeight: number;
|
|
32
|
+
/**
|
|
33
|
+
* Number of items to render outside the visible viewport (buffer zone)
|
|
34
|
+
* Higher values provide smoother scrolling but render more items
|
|
35
|
+
* @default 3
|
|
36
|
+
*/
|
|
37
|
+
overscan?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Enable variable height items (experimental)
|
|
40
|
+
* When true, itemHeight is used as estimated height
|
|
41
|
+
* @default false
|
|
42
|
+
*/
|
|
43
|
+
variableHeight?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface VirtualItem<T> {
|
|
46
|
+
/**
|
|
47
|
+
* Original index in the source array
|
|
48
|
+
*/
|
|
49
|
+
index: number;
|
|
50
|
+
/**
|
|
51
|
+
* The actual data item
|
|
52
|
+
*/
|
|
53
|
+
data: T;
|
|
54
|
+
/**
|
|
55
|
+
* Offset from the top of the container
|
|
56
|
+
*/
|
|
57
|
+
offsetTop: number;
|
|
58
|
+
/**
|
|
59
|
+
* Height of this specific item (for variable height)
|
|
60
|
+
*/
|
|
61
|
+
height: number;
|
|
62
|
+
}
|
|
63
|
+
export declare class VirtualList<T> {
|
|
64
|
+
private itemHeight;
|
|
65
|
+
private overscan;
|
|
66
|
+
private variableHeight;
|
|
67
|
+
items: T[];
|
|
68
|
+
visibleItems: VirtualItem<T>[];
|
|
69
|
+
totalHeight: number;
|
|
70
|
+
scrollTop: number;
|
|
71
|
+
containerHeight: number;
|
|
72
|
+
containerRef: HTMLElement | null;
|
|
73
|
+
private heightCache;
|
|
74
|
+
private scrollHandler;
|
|
75
|
+
private resizeObserver;
|
|
76
|
+
constructor(items: T[], options: VirtualListOptions);
|
|
77
|
+
/**
|
|
78
|
+
* Update the items array
|
|
79
|
+
*/
|
|
80
|
+
setItems(items: T[]): void;
|
|
81
|
+
/**
|
|
82
|
+
* Set the container element and attach scroll listener
|
|
83
|
+
*/
|
|
84
|
+
setContainer(element: HTMLElement | null): void;
|
|
85
|
+
/**
|
|
86
|
+
* Calculate total height of all items
|
|
87
|
+
*/
|
|
88
|
+
private calculateTotalHeight;
|
|
89
|
+
/**
|
|
90
|
+
* Get the height of a specific item
|
|
91
|
+
*/
|
|
92
|
+
private getItemHeight;
|
|
93
|
+
/**
|
|
94
|
+
* Get the offset top position for a specific item
|
|
95
|
+
*/
|
|
96
|
+
private getItemOffsetTop;
|
|
97
|
+
/**
|
|
98
|
+
* Find the start index based on scroll position
|
|
99
|
+
*/
|
|
100
|
+
private findStartIndex;
|
|
101
|
+
/**
|
|
102
|
+
* Update which items should be visible
|
|
103
|
+
*/
|
|
104
|
+
private updateVisibleItems;
|
|
105
|
+
/**
|
|
106
|
+
* Update the height of a specific item (for variable height mode)
|
|
107
|
+
*/
|
|
108
|
+
setItemHeight(index: number, height: number): void;
|
|
109
|
+
/**
|
|
110
|
+
* Scroll to a specific item index
|
|
111
|
+
*/
|
|
112
|
+
scrollToIndex(index: number, behavior?: ScrollBehavior): void;
|
|
113
|
+
/**
|
|
114
|
+
* Clean up event listeners
|
|
115
|
+
*/
|
|
116
|
+
destroy(): void;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a virtual list instance
|
|
120
|
+
*/
|
|
121
|
+
export declare function useVirtualList<T>(items: T[], options: VirtualListOptions): VirtualList<T>;
|