@botiverse/raft-ui 0.51.0 → 0.52.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/CHANGELOG.md +26 -0
- package/dist/components/activity-inbox/activity-inbox-shell.d.mts +12 -0
- package/dist/components/activity-inbox/activity-inbox-shell.mjs +39 -0
- package/dist/components/activity-inbox/activity-inbox-shell.recipe.mjs +14 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.d.mts +6 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.mjs +22 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.recipe.mjs +22 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.d.mts +9 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.mjs +29 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.recipe.mjs +14 -0
- package/dist/components/activity-inbox/index.d.mts +4 -0
- package/dist/components/alert-dialog/alert-dialog.d.mts +41 -0
- package/dist/components/alert-dialog/alert-dialog.mjs +163 -0
- package/dist/components/alert-dialog/index.d.mts +2 -0
- package/dist/components/announcement-dialog/announcement-dialog.d.mts +18 -0
- package/dist/components/announcement-dialog/announcement-dialog.mjs +121 -0
- package/dist/components/announcement-dialog/index.d.mts +3 -0
- package/dist/components/app-rail/app-rail.d.mts +31 -0
- package/dist/components/app-rail/app-rail.mjs +126 -0
- package/dist/components/app-rail/app-rail.recipe.mjs +47 -0
- package/dist/components/app-rail/index.d.mts +2 -0
- package/dist/components/app-shell/app-shell.d.mts +27 -0
- package/dist/components/app-shell/app-shell.mjs +217 -0
- package/dist/components/app-shell/index.d.mts +2 -0
- package/dist/components/avatar/avatar.d.mts +169 -0
- package/dist/components/avatar/avatar.mjs +298 -0
- package/dist/components/avatar/index.d.mts +2 -0
- package/dist/components/badge/badge.d.mts +89 -0
- package/dist/components/badge/badge.mjs +203 -0
- package/dist/components/badge/index.d.mts +2 -0
- package/dist/components/banner/banner.d.mts +141 -0
- package/dist/components/banner/banner.mjs +228 -0
- package/dist/components/banner/index.d.mts +2 -0
- package/dist/components/button/button.d.mts +257 -0
- package/dist/components/button/button.mjs +177 -0
- package/dist/components/button/index.d.mts +2 -0
- package/dist/components/card/card.d.mts +21 -0
- package/dist/components/card/card.mjs +114 -0
- package/dist/components/card/card.recipe.d.mts +105 -0
- package/dist/components/card/card.recipe.mjs +67 -0
- package/dist/components/card/index.d.mts +2 -0
- package/dist/components/checkbox/checkbox-indicator.d.mts +92 -0
- package/dist/components/checkbox/checkbox-indicator.mjs +61 -0
- package/dist/components/checkbox/checkbox.d.mts +9 -0
- package/dist/components/checkbox/checkbox.mjs +40 -0
- package/dist/components/checkbox/index.d.mts +3 -0
- package/dist/components/choice-list/choice-list.d.mts +103 -0
- package/dist/components/choice-list/choice-list.mjs +301 -0
- package/dist/components/choice-list/choice-list.recipe.mjs +44 -0
- package/dist/components/choice-list/index.d.mts +2 -0
- package/dist/components/code-block/code-block.d.mts +30 -0
- package/dist/components/code-block/code-block.mjs +151 -0
- package/dist/components/code-block/code-block.recipe.mjs +47 -0
- package/dist/components/code-block/index.d.mts +2 -0
- package/dist/components/combobox/combobox.d.mts +69 -0
- package/dist/components/combobox/combobox.mjs +438 -0
- package/dist/components/combobox/index.d.mts +2 -0
- package/dist/components/combobox-select/combobox-select.d.mts +4 -0
- package/dist/components/combobox-select/combobox-select.list-side.mjs +16 -0
- package/dist/components/combobox-select/combobox-select.mjs +473 -0
- package/dist/components/combobox-select/combobox-select.options.mjs +21 -0
- package/dist/components/combobox-select/combobox-select.types.d.mts +83 -0
- package/dist/components/combobox-select/index.d.mts +3 -0
- package/dist/components/comment/comment-card.d.mts +40 -0
- package/dist/components/comment/comment-card.mjs +83 -0
- package/dist/components/comment/comment-entry.d.mts +24 -0
- package/dist/components/comment/comment-entry.mjs +75 -0
- package/dist/components/comment/comment-highlight.d.mts +18 -0
- package/dist/components/comment/comment-highlight.mjs +33 -0
- package/dist/components/comment/comment-margin-layout.d.mts +32 -0
- package/dist/components/comment/comment-margin-layout.mjs +44 -0
- package/dist/components/comment/comment-margin.d.mts +29 -0
- package/dist/components/comment/comment-margin.mjs +164 -0
- package/dist/components/comment/comment-marker.d.mts +16 -0
- package/dist/components/comment/comment-marker.mjs +24 -0
- package/dist/components/comment/comment.recipe.mjs +58 -0
- package/dist/components/comment/index.d.mts +8 -0
- package/dist/components/comment/use-comment-margin-fits.d.mts +16 -0
- package/dist/components/comment/use-comment-margin-fits.mjs +34 -0
- package/dist/components/composer/composer-attachment.recipe.mjs +85 -0
- package/dist/components/composer/composer-attachments-scroll-area.d.mts +5 -0
- package/dist/components/composer/composer-attachments-scroll-area.mjs +93 -0
- package/dist/components/composer/composer-attachments.d.mts +27 -0
- package/dist/components/composer/composer-attachments.mjs +147 -0
- package/dist/components/composer/composer-drop-overlay.d.mts +9 -0
- package/dist/components/composer/composer-drop-overlay.mjs +60 -0
- package/dist/components/composer/composer-drop-overlay.recipe.mjs +23 -0
- package/dist/components/composer/composer-root.d.mts +5 -0
- package/dist/components/composer/composer-root.mjs +18 -0
- package/dist/components/composer/composer-suggestion-list.d.mts +139 -0
- package/dist/components/composer/composer-suggestion-list.mjs +160 -0
- package/dist/components/composer/composer-toolbar-label.d.mts +5 -0
- package/dist/components/composer/composer-toolbar-label.mjs +24 -0
- package/dist/components/composer/composer.d.mts +20 -0
- package/dist/components/composer/composer.mjs +88 -0
- package/dist/components/composer/composer.recipe.mjs +29 -0
- package/dist/components/composer/index.d.mts +10 -0
- package/dist/components/composer/sortable-composer-attachments.d.mts +37 -0
- package/dist/components/composer/sortable-composer-attachments.mjs +247 -0
- package/dist/components/composer/use-composer-suggestions.d.mts +83 -0
- package/dist/components/composer/use-composer-suggestions.mjs +207 -0
- package/dist/components/context-menu/context-menu.d.mts +53 -0
- package/dist/components/context-menu/context-menu.mjs +275 -0
- package/dist/components/context-menu/index.d.mts +2 -0
- package/dist/components/conversation-panel/conversation-panel-empty-state.d.mts +9 -0
- package/dist/components/conversation-panel/conversation-panel-empty-state.mjs +57 -0
- package/dist/components/conversation-panel/conversation-panel.d.mts +20 -0
- package/dist/components/conversation-panel/conversation-panel.mjs +63 -0
- package/dist/components/conversation-panel/conversation-panel.recipe.mjs +15 -0
- package/dist/components/conversation-panel/index.d.mts +3 -0
- package/dist/components/copyable-code/copyable-code.d.mts +72 -0
- package/dist/components/copyable-code/copyable-code.mjs +153 -0
- package/dist/components/copyable-code/index.d.mts +2 -0
- package/dist/components/description-list/description-list.d.mts +59 -0
- package/dist/components/description-list/description-list.mjs +96 -0
- package/dist/components/description-list/index.d.mts +2 -0
- package/dist/components/dialog/dialog-sheet-context.mjs +58 -0
- package/dist/components/dialog/dialog-sheet.d.mts +31 -0
- package/dist/components/dialog/dialog-sheet.mjs +194 -0
- package/dist/components/dialog/dialog.d.mts +85 -0
- package/dist/components/dialog/dialog.mjs +371 -0
- package/dist/components/dialog/index.d.mts +3 -0
- package/dist/components/drag/drag-announcements.d.mts +72 -0
- package/dist/components/drag/drag-announcements.mjs +115 -0
- package/dist/components/drag/drag-lift.d.mts +100 -0
- package/dist/components/drag/drag-lift.mjs +276 -0
- package/dist/components/drag/drag-lists.d.mts +98 -0
- package/dist/components/drag/drag-lists.mjs +258 -0
- package/dist/components/drag/drag-sensors.d.mts +87 -0
- package/dist/components/drag/drag-sensors.mjs +169 -0
- package/dist/components/drag/drag.recipe.d.mts +7 -0
- package/dist/components/drag/drag.recipe.mjs +30 -0
- package/dist/components/drag/drop-placeholder.d.mts +41 -0
- package/dist/components/drag/drop-placeholder.mjs +161 -0
- package/dist/components/drag/index.d.mts +8 -0
- package/dist/components/drawer/drawer.d.mts +34 -0
- package/dist/components/drawer/drawer.mjs +202 -0
- package/dist/components/drawer/drawer.recipe.mjs +175 -0
- package/dist/components/drawer/index.d.mts +2 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.mts +62 -0
- package/dist/components/dropdown-menu/dropdown-menu.mjs +319 -0
- package/dist/components/dropdown-menu/index.d.mts +2 -0
- package/dist/components/ellipsis/ellipsis.d.mts +55 -0
- package/dist/components/ellipsis/ellipsis.mjs +320 -0
- package/dist/components/ellipsis/index.d.mts +3 -0
- package/dist/components/empty-state/empty-state.d.mts +15 -0
- package/dist/components/empty-state/empty-state.mjs +102 -0
- package/dist/components/empty-state/index.d.mts +2 -0
- package/dist/components/field/field.d.mts +79 -0
- package/dist/components/field/field.mjs +100 -0
- package/dist/components/field/index.d.mts +2 -0
- package/dist/components/file-preview/file-preview.d.mts +17 -0
- package/dist/components/file-preview/file-preview.mjs +210 -0
- package/dist/components/file-preview/file-preview.recipe.d.mts +99 -0
- package/dist/components/file-preview/file-preview.recipe.mjs +39 -0
- package/dist/components/file-preview/index.d.mts +2 -0
- package/dist/components/files/files.d.mts +35 -0
- package/dist/components/files/files.mjs +69 -0
- package/dist/components/files/files.recipe.mjs +40 -0
- package/dist/components/files/index.d.mts +2 -0
- package/dist/components/filter-chip/filter-chip.d.mts +25 -0
- package/dist/components/filter-chip/filter-chip.mjs +59 -0
- package/dist/components/filter-chip/index.d.mts +2 -0
- package/dist/components/float-button/float-button.d.mts +36 -0
- package/dist/components/float-button/float-button.mjs +116 -0
- package/dist/components/float-button/float-button.position.d.mts +6 -0
- package/dist/components/float-button/float-button.position.mjs +41 -0
- package/dist/components/float-button/index.d.mts +3 -0
- package/dist/components/form-section/form-section.d.mts +16 -0
- package/dist/components/form-section/form-section.mjs +53 -0
- package/dist/components/form-section/index.d.mts +2 -0
- package/dist/components/icon-tile/icon-tile.d.mts +97 -0
- package/dist/components/icon-tile/icon-tile.mjs +49 -0
- package/dist/components/icon-tile/index.d.mts +2 -0
- package/dist/components/icons/action-icons.d.mts +34 -0
- package/dist/components/icons/action-icons.mjs +383 -0
- package/dist/components/icons/conversation-icons.d.mts +12 -0
- package/dist/components/icons/conversation-icons.mjs +147 -0
- package/dist/components/icons/index.d.mts +4 -0
- package/dist/components/icons/object-icons.d.mts +6 -0
- package/dist/components/icons/object-icons.mjs +27 -0
- package/dist/components/inbox-item/inbox-item-leading-badge.d.mts +13 -0
- package/dist/components/inbox-item/inbox-item-leading-badge.mjs +27 -0
- package/dist/components/inbox-item/inbox-item-skeleton.d.mts +46 -0
- package/dist/components/inbox-item/inbox-item-skeleton.mjs +89 -0
- package/dist/components/inbox-item/inbox-item-skeleton.recipe.mjs +20 -0
- package/dist/components/inbox-item/inbox-item.d.mts +71 -0
- package/dist/components/inbox-item/inbox-item.mjs +276 -0
- package/dist/components/inbox-item/inbox-item.recipe.mjs +137 -0
- package/dist/components/inbox-item/index.d.mts +2 -0
- package/dist/components/inline-code/index.d.mts +2 -0
- package/dist/components/inline-code/inline-code.d.mts +8 -0
- package/dist/components/inline-code/inline-code.mjs +30 -0
- package/dist/components/input/index.d.mts +2 -0
- package/dist/components/input/input.d.mts +16 -0
- package/dist/components/input/input.mjs +20 -0
- package/dist/components/input/input.recipe.mjs +12 -0
- package/dist/components/input-group/index.d.mts +2 -0
- package/dist/components/input-group/input-group.d.mts +93 -0
- package/dist/components/input-group/input-group.mjs +178 -0
- package/dist/components/kbd/index.d.mts +2 -0
- package/dist/components/kbd/kbd.d.mts +7 -0
- package/dist/components/kbd/kbd.mjs +34 -0
- package/dist/components/label/index.d.mts +2 -0
- package/dist/components/label/label.d.mts +60 -0
- package/dist/components/label/label.mjs +75 -0
- package/dist/components/legacy-task-panel/index.d.mts +2 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.d.mts +57 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.mjs +234 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.recipe.mjs +30 -0
- package/dist/components/lightbox/index.d.mts +2 -0
- package/dist/components/lightbox/lightbox.d.mts +55 -0
- package/dist/components/lightbox/lightbox.mjs +336 -0
- package/dist/components/list-row/index.d.mts +2 -0
- package/dist/components/list-row/list-row-skeleton.d.mts +21 -0
- package/dist/components/list-row/list-row-skeleton.mjs +43 -0
- package/dist/components/list-row/list-row.d.mts +66 -0
- package/dist/components/list-row/list-row.mjs +167 -0
- package/dist/components/list-row/list-row.recipe.d.mts +126 -0
- package/dist/components/list-row/list-row.recipe.mjs +94 -0
- package/dist/components/live-agent-activity-bar/index.d.mts +2 -0
- package/dist/components/live-agent-activity-bar/live-agent-activity-bar.d.mts +25 -0
- package/dist/components/live-agent-activity-bar/live-agent-activity-bar.mjs +107 -0
- package/dist/components/logo/index.d.mts +2 -0
- package/dist/components/logo/raft-logo.d.mts +9 -0
- package/dist/components/logo/raft-logo.mjs +63 -0
- package/dist/components/markdown/index.d.mts +2 -0
- package/dist/components/markdown/markdown-parts.d.mts +54 -0
- package/dist/components/markdown/markdown-parts.mjs +153 -0
- package/dist/components/markdown/markdown.recipe.mjs +77 -0
- package/dist/components/message-action-card/index.d.mts +2 -0
- package/dist/components/message-action-card/message-action-card-content.recipe.mjs +50 -0
- package/dist/components/message-action-card/message-action-card.d.mts +95 -0
- package/dist/components/message-action-card/message-action-card.mjs +298 -0
- package/dist/components/message-action-card/message-action-card.recipe.mjs +47 -0
- package/dist/components/message-attachment/index.d.mts +5 -0
- package/dist/components/message-attachment/message-attachment.d.mts +27 -0
- package/dist/components/message-attachment/message-attachment.mjs +129 -0
- package/dist/components/message-attachment/message-attachment.recipe.mjs +36 -0
- package/dist/components/message-attachment/message-image-gallery-rows.d.mts +47 -0
- package/dist/components/message-attachment/message-image-gallery-rows.mjs +55 -0
- package/dist/components/message-attachment/message-image-gallery.d.mts +32 -0
- package/dist/components/message-attachment/message-image-gallery.mjs +105 -0
- package/dist/components/message-attachment/message-image-gallery.recipe.mjs +61 -0
- package/dist/components/message-attachment/message-video-preview.d.mts +19 -0
- package/dist/components/message-attachment/message-video-preview.mjs +92 -0
- package/dist/components/message-attachment/message-video-preview.recipe.mjs +33 -0
- package/dist/components/message-embed/index.d.mts +2 -0
- package/dist/components/message-embed/message-embed.d.mts +12 -0
- package/dist/components/message-embed/message-embed.mjs +42 -0
- package/dist/components/message-embed/message-embed.recipe.mjs +14 -0
- package/dist/components/message-forwarded-bundle/index.d.mts +2 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.d.mts +92 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.mjs +324 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.recipe.mjs +81 -0
- package/dist/components/message-item/index.d.mts +13 -0
- package/dist/components/message-item/message-footer.d.mts +20 -0
- package/dist/components/message-item/message-footer.mjs +54 -0
- package/dist/components/message-item/message-footer.recipe.mjs +46 -0
- package/dist/components/message-item/message-item-content.d.mts +22 -0
- package/dist/components/message-item/message-item-content.mjs +81 -0
- package/dist/components/message-item/message-item-delegated.d.mts +38 -0
- package/dist/components/message-item/message-item-delegated.mjs +72 -0
- package/dist/components/message-item/message-item-gutter.d.mts +10 -0
- package/dist/components/message-item/message-item-gutter.mjs +41 -0
- package/dist/components/message-item/message-item-header.d.mts +29 -0
- package/dist/components/message-item/message-item-header.mjs +107 -0
- package/dist/components/message-item/message-item-label.mjs +113 -0
- package/dist/components/message-item/message-item-root.d.mts +25 -0
- package/dist/components/message-item/message-item-root.mjs +39 -0
- package/dist/components/message-item/message-item-toolbar.d.mts +9 -0
- package/dist/components/message-item/message-item-toolbar.mjs +131 -0
- package/dist/components/message-item/message-item.recipe.d.mts +101 -0
- package/dist/components/message-item/message-item.recipe.mjs +114 -0
- package/dist/components/message-item/message-multi-select.d.mts +15 -0
- package/dist/components/message-item/message-multi-select.mjs +49 -0
- package/dist/components/message-item/message-multi-select.recipe.mjs +23 -0
- package/dist/components/message-item/message-reaction.d.mts +39 -0
- package/dist/components/message-item/message-reaction.mjs +188 -0
- package/dist/components/message-item/message-reaction.recipe.mjs +76 -0
- package/dist/components/message-item/message-reference.d.mts +50 -0
- package/dist/components/message-item/message-reference.mjs +111 -0
- package/dist/components/message-item/message-reference.recipe.d.mts +6 -0
- package/dist/components/message-item/message-reference.recipe.mjs +63 -0
- package/dist/components/message-item/message-text-selection-toolbar.d.mts +24 -0
- package/dist/components/message-item/message-text-selection-toolbar.mjs +13 -0
- package/dist/components/message-list/index.d.mts +4 -0
- package/dist/components/message-list/message-list-jump.d.mts +21 -0
- package/dist/components/message-list/message-list-jump.mjs +73 -0
- package/dist/components/message-list/message-list-markers.d.mts +13 -0
- package/dist/components/message-list/message-list-markers.mjs +70 -0
- package/dist/components/message-list/message-list.d.mts +7 -0
- package/dist/components/message-list/message-list.mjs +52 -0
- package/dist/components/message-list/message-list.recipe.mjs +54 -0
- package/dist/components/message-quoted-preview/index.d.mts +2 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.d.mts +40 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.mjs +144 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.recipe.mjs +38 -0
- package/dist/components/message-replies/index.d.mts +2 -0
- package/dist/components/message-replies/message-replies.d.mts +17 -0
- package/dist/components/message-replies/message-replies.mjs +79 -0
- package/dist/components/message-replies/message-replies.recipe.mjs +25 -0
- package/dist/components/message-translation/index.d.mts +2 -0
- package/dist/components/message-translation/message-translation.d.mts +20 -0
- package/dist/components/message-translation/message-translation.mjs +64 -0
- package/dist/components/message-translation/message-translation.recipe.mjs +27 -0
- package/dist/components/meter/index.d.mts +2 -0
- package/dist/components/meter/meter.d.mts +107 -0
- package/dist/components/meter/meter.mjs +118 -0
- package/dist/components/mobile-nav/index.d.mts +3 -0
- package/dist/components/mobile-nav/mobile-nav-server.d.mts +71 -0
- package/dist/components/mobile-nav/mobile-nav-server.mjs +287 -0
- package/dist/components/mobile-nav/mobile-nav.d.mts +12 -0
- package/dist/components/mobile-nav/mobile-nav.mjs +73 -0
- package/dist/components/mode-bar/index.d.mts +2 -0
- package/dist/components/mode-bar/mode-bar.d.mts +33 -0
- package/dist/components/mode-bar/mode-bar.mjs +115 -0
- package/dist/components/notification-center/index.d.mts +2 -0
- package/dist/components/notification-center/notification-center.d.mts +225 -0
- package/dist/components/notification-center/notification-center.mjs +340 -0
- package/dist/components/panel/index.d.mts +7 -0
- package/dist/components/panel/panel-action.d.mts +15 -0
- package/dist/components/panel/panel-action.mjs +23 -0
- package/dist/components/panel/panel-action.recipe.mjs +40 -0
- package/dist/components/panel/panel-header.d.mts +34 -0
- package/dist/components/panel/panel-header.mjs +135 -0
- package/dist/components/panel/panel-header.recipe.mjs +78 -0
- package/dist/components/panel/panel-notice.d.mts +16 -0
- package/dist/components/panel/panel-notice.mjs +77 -0
- package/dist/components/panel/panel-split-action.d.mts +34 -0
- package/dist/components/panel/panel-split-action.mjs +69 -0
- package/dist/components/panel/panel-split-action.recipe.mjs +53 -0
- package/dist/components/panel/panel-toggle-action.d.mts +6 -0
- package/dist/components/panel/panel-toggle-action.mjs +15 -0
- package/dist/components/panel/panel.d.mts +25 -0
- package/dist/components/panel/panel.mjs +96 -0
- package/dist/components/panel/panel.recipe.mjs +24 -0
- package/dist/components/picker-trigger-button/index.d.mts +2 -0
- package/dist/components/picker-trigger-button/picker-trigger-button.d.mts +7 -0
- package/dist/components/picker-trigger-button/picker-trigger-button.mjs +36 -0
- package/dist/components/popover/index.d.mts +2 -0
- package/dist/components/popover/popover.d.mts +41 -0
- package/dist/components/popover/popover.mjs +184 -0
- package/dist/components/preview-card/index.d.mts +2 -0
- package/dist/components/preview-card/preview-card.d.mts +43 -0
- package/dist/components/preview-card/preview-card.mjs +197 -0
- package/dist/components/profile-panel/index.d.mts +2 -0
- package/dist/components/profile-panel/profile-panel.d.mts +14 -0
- package/dist/components/profile-panel/profile-panel.mjs +46 -0
- package/dist/components/profile-panel/profile-panel.recipe.mjs +14 -0
- package/dist/components/progress/index.d.mts +2 -0
- package/dist/components/progress/progress.d.mts +119 -0
- package/dist/components/progress/progress.mjs +139 -0
- package/dist/components/pull-to-refresh/index.d.mts +4 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-gesture.d.mts +30 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-gesture.mjs +134 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-indicator.d.mts +21 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-indicator.mjs +153 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-material-progress.mjs +150 -0
- package/dist/components/pull-to-refresh/use-pull-to-refresh.d.mts +55 -0
- package/dist/components/pull-to-refresh/use-pull-to-refresh.mjs +156 -0
- package/dist/components/radio-group/index.d.mts +2 -0
- package/dist/components/radio-group/radio-group.d.mts +14 -0
- package/dist/components/radio-group/radio-group.mjs +59 -0
- package/dist/components/resizable/index.d.mts +2 -0
- package/dist/components/resizable/resizable.d.mts +15 -0
- package/dist/components/resizable/resizable.mjs +39 -0
- package/dist/components/resizable/resizable.recipe.mjs +24 -0
- package/dist/components/scroll-area/index.d.mts +2 -0
- package/dist/components/scroll-area/scroll-area.d.mts +17 -0
- package/dist/components/scroll-area/scroll-area.mjs +55 -0
- package/dist/components/scroll-area/scroll-area.recipe.mjs +23 -0
- package/dist/components/search/index.d.mts +6 -0
- package/dist/components/search/search-entity.d.mts +24 -0
- package/dist/components/search/search-entity.mjs +106 -0
- package/dist/components/search/search-entity.recipe.mjs +41 -0
- package/dist/components/search/search-message.d.mts +25 -0
- package/dist/components/search/search-message.mjs +115 -0
- package/dist/components/search/search-message.recipe.mjs +32 -0
- package/dist/components/search/search-thread.d.mts +17 -0
- package/dist/components/search/search-thread.mjs +79 -0
- package/dist/components/search/search-thread.recipe.mjs +16 -0
- package/dist/components/search/search-trigger.d.mts +15 -0
- package/dist/components/search/search-trigger.mjs +59 -0
- package/dist/components/search/search.d.mts +23 -0
- package/dist/components/search/search.mjs +88 -0
- package/dist/components/search/search.recipe.mjs +22 -0
- package/dist/components/segmented-control/index.d.mts +2 -0
- package/dist/components/segmented-control/segmented-control.d.mts +38 -0
- package/dist/components/segmented-control/segmented-control.mjs +306 -0
- package/dist/components/select/index.d.mts +2 -0
- package/dist/components/select/select.d.mts +95 -0
- package/dist/components/select/select.mjs +483 -0
- package/dist/components/separator/index.d.mts +2 -0
- package/dist/components/separator/separator.d.mts +10 -0
- package/dist/components/separator/separator.mjs +49 -0
- package/dist/components/sidebar/index.d.mts +5 -0
- package/dist/components/sidebar/sidebar-item.d.mts +64 -0
- package/dist/components/sidebar/sidebar-item.mjs +201 -0
- package/dist/components/sidebar/sidebar-item.recipe.mjs +100 -0
- package/dist/components/sidebar/sidebar-menu.d.mts +13 -0
- package/dist/components/sidebar/sidebar-menu.mjs +67 -0
- package/dist/components/sidebar/sidebar-menu.recipe.mjs +22 -0
- package/dist/components/sidebar/sidebar-section.d.mts +41 -0
- package/dist/components/sidebar/sidebar-section.mjs +164 -0
- package/dist/components/sidebar/sidebar-section.recipe.mjs +45 -0
- package/dist/components/sidebar/sidebar.d.mts +17 -0
- package/dist/components/sidebar/sidebar.mjs +149 -0
- package/dist/components/sidebar/sidebar.recipe.mjs +37 -0
- package/dist/components/skeleton/index.d.mts +2 -0
- package/dist/components/skeleton/skeleton.d.mts +50 -0
- package/dist/components/skeleton/skeleton.mjs +29 -0
- package/dist/components/spinner/index.d.mts +2 -0
- package/dist/components/spinner/spinner.d.mts +77 -0
- package/dist/components/spinner/spinner.mjs +118 -0
- package/dist/components/status/index.d.mts +2 -0
- package/dist/components/status/status.d.mts +143 -0
- package/dist/components/status/status.mjs +56 -0
- package/dist/components/steps/index.d.mts +3 -0
- package/dist/components/steps/otter-indicator.d.mts +17 -0
- package/dist/components/steps/otter-indicator.mjs +331 -0
- package/dist/components/steps/steps.d.mts +50 -0
- package/dist/components/steps/steps.mjs +174 -0
- package/dist/components/switch/index.d.mts +2 -0
- package/dist/components/switch/switch.d.mts +9 -0
- package/dist/components/switch/switch.mjs +50 -0
- package/dist/components/system-message/index.d.mts +2 -0
- package/dist/components/system-message/system-message.d.mts +27 -0
- package/dist/components/system-message/system-message.mjs +113 -0
- package/dist/components/system-message/system-message.recipe.mjs +34 -0
- package/dist/components/table/index.d.mts +2 -0
- package/dist/components/table/table.d.mts +35 -0
- package/dist/components/table/table.mjs +102 -0
- package/dist/components/table/table.recipe.mjs +31 -0
- package/dist/components/tabs/index.d.mts +2 -0
- package/dist/components/tabs/tabs.d.mts +185 -0
- package/dist/components/tabs/tabs.mjs +528 -0
- package/dist/components/task-board/index.d.mts +2 -0
- package/dist/components/task-board/task-board-column.recipe.mjs +46 -0
- package/dist/components/task-board/task-board.d.mts +40 -0
- package/dist/components/task-board/task-board.mjs +155 -0
- package/dist/components/task-card/index.d.mts +2 -0
- package/dist/components/task-card/task-card-status.recipe.mjs +17 -0
- package/dist/components/task-card/task-card.d.mts +30 -0
- package/dist/components/task-card/task-card.mjs +141 -0
- package/dist/components/task-card/task-card.recipe.mjs +39 -0
- package/dist/components/task-dnd/index.d.mts +2 -0
- package/dist/components/task-dnd/task-dnd.d.mts +75 -0
- package/dist/components/task-dnd/task-dnd.mjs +341 -0
- package/dist/components/task-dnd/task-dnd.recipe.mjs +20 -0
- package/dist/components/task-list/index.d.mts +2 -0
- package/dist/components/task-list/task-list-section.recipe.mjs +37 -0
- package/dist/components/task-list/task-list.d.mts +34 -0
- package/dist/components/task-list/task-list.mjs +119 -0
- package/dist/components/tasks/index.d.mts +7 -0
- package/dist/components/tasks/task-chip.d.mts +14 -0
- package/dist/components/tasks/task-chip.mjs +81 -0
- package/dist/components/tasks/task-loading.d.mts +7 -0
- package/dist/components/tasks/task-loading.mjs +32 -0
- package/dist/components/tasks/task-loading.recipe.mjs +8 -0
- package/dist/components/tasks/task-status-badge.d.mts +24 -0
- package/dist/components/tasks/task-status-badge.mjs +24 -0
- package/dist/components/tasks/task-status-icon.d.mts +13 -0
- package/dist/components/tasks/task-status-icon.mjs +90 -0
- package/dist/components/tasks/task-status.recipe.d.mts +62 -0
- package/dist/components/tasks/task-status.recipe.mjs +33 -0
- package/dist/components/tasks/tasks-panel.d.mts +22 -0
- package/dist/components/tasks/tasks-panel.mjs +114 -0
- package/dist/components/tasks/tasks-panel.recipe.mjs +36 -0
- package/dist/components/text/index.d.mts +2 -0
- package/dist/components/text/text.d.mts +186 -0
- package/dist/components/text/text.mjs +114 -0
- package/dist/components/text-link/index.d.mts +2 -0
- package/dist/components/text-link/text-link.d.mts +36 -0
- package/dist/components/text-link/text-link.mjs +60 -0
- package/dist/components/text-selection-toolbar/index.d.mts +3 -0
- package/dist/components/text-selection-toolbar/text-selection-anchor.d.mts +22 -0
- package/dist/components/text-selection-toolbar/text-selection-anchor.mjs +106 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.d.mts +20 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.mjs +41 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.recipe.mjs +19 -0
- package/dist/components/textarea/index.d.mts +2 -0
- package/dist/components/textarea/textarea.d.mts +16 -0
- package/dist/components/textarea/textarea.mjs +62 -0
- package/dist/components/thread-panel/index.d.mts +2 -0
- package/dist/components/thread-panel/thread-panel.d.mts +31 -0
- package/dist/components/thread-panel/thread-panel.mjs +162 -0
- package/dist/components/thread-panel/thread-panel.recipe.mjs +36 -0
- package/dist/components/timeline/index.d.mts +2 -0
- package/dist/components/timeline/timeline.d.mts +44 -0
- package/dist/components/timeline/timeline.mjs +81 -0
- package/dist/components/toast/index.d.mts +2 -0
- package/dist/components/toast/toast.d.mts +263 -0
- package/dist/components/toast/toast.mjs +556 -0
- package/dist/components/toggle-group/index.d.mts +2 -0
- package/dist/components/toggle-group/toggle-group.d.mts +15 -0
- package/dist/components/toggle-group/toggle-group.mjs +64 -0
- package/dist/components/tooltip/index.d.mts +2 -0
- package/dist/components/tooltip/tooltip.d.mts +18 -0
- package/dist/components/tooltip/tooltip.mjs +197 -0
- package/dist/components/virtual-list/ItemColumns.mjs +37 -0
- package/dist/components/virtual-list/VirtualList.d.mts +4 -0
- package/dist/components/virtual-list/VirtualList.mjs +1401 -0
- package/dist/components/virtual-list/VirtualListContext.mjs +5 -0
- package/dist/components/virtual-list/hooks/use-event-callback.mjs +10 -0
- package/dist/components/virtual-list/hooks/use-ios-momentum-compensation.mjs +148 -0
- package/dist/components/virtual-list/hooks/use-keyboard-scroll.mjs +42 -0
- package/dist/components/virtual-list/hooks/use-latest-ref.mjs +10 -0
- package/dist/components/virtual-list/hooks/use-layout-effect-with-previous.mjs +16 -0
- package/dist/components/virtual-list/hooks/use-memo-with-previous.mjs +22 -0
- package/dist/components/virtual-list/hooks/use-non-passive-wheel.mjs +23 -0
- package/dist/components/virtual-list/hooks/use-non-virtual-content-resize.mjs +28 -0
- package/dist/components/virtual-list/hooks/use-scroll-anchor.mjs +55 -0
- package/dist/components/virtual-list/index.d.mts +5 -0
- package/dist/components/virtual-list/public-types.d.mts +341 -0
- package/dist/components/virtual-list/resize-observer/ResizeObserverWrapper.d.mts +5 -0
- package/dist/components/virtual-list/resize-observer/ResizeObserverWrapper.mjs +70 -0
- package/dist/components/virtual-list/resize-observer/resize-observer-delegate.d.mts +6 -0
- package/dist/components/virtual-list/resize-observer/resize-observer-delegate.mjs +54 -0
- package/dist/components/virtual-list/utils/align.mjs +19 -0
- package/dist/components/virtual-list/utils/constants.mjs +30 -0
- package/dist/components/virtual-list/utils/fenwick-tree.mjs +66 -0
- package/dist/components/virtual-list/utils/items-anchor.mjs +49 -0
- package/dist/components/virtual-list/utils/measure.mjs +77 -0
- package/dist/components/virtual-list/utils/platform.mjs +39 -0
- package/dist/components/virtual-list/utils/range.mjs +103 -0
- package/dist/components/virtual-list/utils/size-cache.mjs +35 -0
- package/dist/components/workspace-button/index.d.mts +2 -0
- package/dist/components/workspace-button/workspace-button.d.mts +9 -0
- package/dist/components/workspace-button/workspace-button.mjs +28 -0
- package/dist/index.d.mts +239 -4864
- package/dist/index.mjs +142 -17054
- package/dist/lib/chip-remove.mjs +17 -0
- package/dist/lib/data-attributes.d.mts +5 -0
- package/dist/lib/decision-width.mjs +9 -0
- package/dist/lib/default-native-button.mjs +8 -0
- package/dist/lib/desktop-media.mjs +10 -0
- package/dist/lib/drag-escape.mjs +37 -0
- package/dist/lib/frame-insets.mjs +127 -0
- package/dist/lib/head-edges.mjs +44 -0
- package/dist/lib/hud-text-action.mjs +10 -0
- package/dist/lib/inline-chip.mjs +30 -0
- package/dist/lib/input-modality.d.mts +36 -0
- package/dist/lib/input-modality.mjs +186 -0
- package/dist/lib/list-cell.mjs +21 -0
- package/dist/lib/located.d.mts +25 -0
- package/dist/lib/located.mjs +28 -0
- package/dist/lib/overlay-depth.d.mts +42 -0
- package/dist/lib/overlay-depth.mjs +59 -0
- package/dist/lib/phone-media.mjs +24 -0
- package/dist/lib/presence.d.mts +16 -0
- package/dist/lib/presence.mjs +16 -0
- package/dist/lib/row-tone.d.mts +8 -0
- package/dist/lib/search-hit.mjs +18 -0
- package/dist/lib/stacked-actions.mjs +112 -0
- package/dist/lib/styled-props.d.mts +15 -0
- package/dist/lib/tap-activation.mjs +133 -0
- package/dist/lib/theme/theme-context.d.mts +10 -0
- package/dist/lib/theme/theme-context.mjs +9 -0
- package/dist/lib/theme/theme-provider.d.mts +23 -0
- package/dist/lib/theme/theme-provider.mjs +61 -0
- package/dist/lib/theme/theme-scope.mjs +19 -0
- package/dist/lib/theme/use-theme.d.mts +5 -0
- package/dist/lib/theme/use-theme.mjs +9 -0
- package/dist/lib/touch-drag.d.mts +55 -0
- package/dist/lib/touch-drag.mjs +151 -0
- package/dist/lib/truncation.d.mts +26 -0
- package/dist/lib/truncation.mjs +153 -0
- package/dist/lib/tv.d.mts +2 -0
- package/dist/lib/tv.mjs +14 -0
- package/dist/lib/use-copy-to-clipboard.mjs +58 -0
- package/dist/lib/use-merged-ref.mjs +60 -0
- package/dist/lib/use-mobile-viewport.mjs +17 -0
- package/dist/lib/use-overflow-title.mjs +49 -0
- package/dist/lib/use-scrollbar-size.d.mts +16 -0
- package/dist/lib/use-scrollbar-size.mjs +46 -0
- package/dist/lib/use-truncated.d.mts +20 -0
- package/dist/lib/use-truncated.mjs +34 -0
- package/dist/lib/without-children.d.mts +8 -0
- package/dist/wip.d.mts +61 -1190
- package/dist/wip.mjs +43 -2970
- package/package.json +8 -1
- package/dist/index-C3ymUW98.d.mts +0 -1816
- package/dist/mode-bar-tGnYByXp.mjs +0 -7564
- package/dist/style.css +0 -1395
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { eventWindow, holdEscape, releaseEscape } from "./drag-escape.mjs";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { PointerSensor, TouchSensor, useSensor } from "@dnd-kit/core";
|
|
4
|
+
//#region src/lib/touch-drag.ts
|
|
5
|
+
/**
|
|
6
|
+
* How a finger picks up something that can be dragged
|
|
7
|
+
* (design/foundations/states.md#dragging-on-a-touch-screen):
|
|
8
|
+
*
|
|
9
|
+
* - hold still for `TOUCH_DRAG_HOLD_MS`: the item is armed, the same moment a
|
|
10
|
+
* long press opens a menu (raft-ui's ContextMenuTrigger, iOS: 500ms);
|
|
11
|
+
* - then move by `TOUCH_DRAG_DISTANCE_PX`: the drag starts, and whoever owns a
|
|
12
|
+
* menu that opened closes it in `onDragStart`;
|
|
13
|
+
* - move by more than `TOUCH_DRAG_TOLERANCE_PX` before the hold is up, or put a
|
|
14
|
+
* second finger down: it was a scroll or a pinch, and the item lets go.
|
|
15
|
+
*
|
|
16
|
+
* dnd-kit's delay constraint starts the drag the moment the hold is up, at the
|
|
17
|
+
* same time as the long press opens the menu, so the two fight. Starting on the
|
|
18
|
+
* first move after the hold lets holding still mean "menu" and holding then
|
|
19
|
+
* moving mean "drag", as on iOS.
|
|
20
|
+
*
|
|
21
|
+
* Pair it with `MouseOnlyPointerSensor`, not dnd-kit's PointerSensor: a phone
|
|
22
|
+
* sends `pointerdown` (pointerType "touch") before `touchstart`, and the sensor
|
|
23
|
+
* that takes the press first keeps it, so a PointerSensor would pick up every
|
|
24
|
+
* touch on its distance and this sensor would never run.
|
|
25
|
+
*/
|
|
26
|
+
const TOUCH_DRAG_HOLD_MS = 500;
|
|
27
|
+
const TOUCH_DRAG_DISTANCE_PX = 10;
|
|
28
|
+
const TOUCH_DRAG_TOLERANCE_PX = 10;
|
|
29
|
+
const holds = /* @__PURE__ */ new WeakMap();
|
|
30
|
+
function touchPoint(event) {
|
|
31
|
+
const touch = event.touches?.[0] ?? event.changedTouches?.[0];
|
|
32
|
+
return touch ? {
|
|
33
|
+
x: touch.clientX,
|
|
34
|
+
y: touch.clientY
|
|
35
|
+
} : null;
|
|
36
|
+
}
|
|
37
|
+
function farther(from, to, limit) {
|
|
38
|
+
return Math.hypot(to.x - from.x, to.y - from.y) > limit;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Once a pointer sensor's drag has started, Escape cancels it and reaches
|
|
42
|
+
* nothing else (`drag-escape.ts`): no app handler on the window, the document
|
|
43
|
+
* or an element hears it.
|
|
44
|
+
*/
|
|
45
|
+
function holdEscapeOnceActive(sensor) {
|
|
46
|
+
const self = sensor;
|
|
47
|
+
if (self.activated) holdEscape(eventWindow(self.props.event), sensor, () => self.handleCancel());
|
|
48
|
+
}
|
|
49
|
+
function releaseEscapeOf(sensor) {
|
|
50
|
+
releaseEscape(eventWindow(sensor.props.event), sensor);
|
|
51
|
+
}
|
|
52
|
+
var HoldThenMoveTouchSensorImpl = class extends TouchSensor {
|
|
53
|
+
static activators = TouchSensor.activators;
|
|
54
|
+
static setup() {
|
|
55
|
+
return TouchSensor.setup();
|
|
56
|
+
}
|
|
57
|
+
attach() {
|
|
58
|
+
super.attach();
|
|
59
|
+
const self = this;
|
|
60
|
+
const { holdMs = 500 } = self.props.options;
|
|
61
|
+
const state = {
|
|
62
|
+
heldAt: null,
|
|
63
|
+
last: null,
|
|
64
|
+
timer: setTimeout(() => {
|
|
65
|
+
state.heldAt = state.last ?? self.initialCoordinates;
|
|
66
|
+
}, holdMs)
|
|
67
|
+
};
|
|
68
|
+
holds.set(this, state);
|
|
69
|
+
}
|
|
70
|
+
handleStart() {
|
|
71
|
+
super.handleStart();
|
|
72
|
+
holdEscapeOnceActive(this);
|
|
73
|
+
}
|
|
74
|
+
handleMove(event) {
|
|
75
|
+
const self = this;
|
|
76
|
+
const state = holds.get(this);
|
|
77
|
+
if (self.activated || !state) {
|
|
78
|
+
super.handleMove(event);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if ((event.touches?.length ?? 1) > 1) {
|
|
82
|
+
self.handleCancel();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const point = touchPoint(event);
|
|
86
|
+
const start = self.initialCoordinates;
|
|
87
|
+
if (!point || !start) return;
|
|
88
|
+
state.last = point;
|
|
89
|
+
const { distance = 10, tolerance = 10 } = self.props.options;
|
|
90
|
+
if (!state.heldAt) {
|
|
91
|
+
if (farther(start, point, tolerance)) self.handleCancel();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (event.cancelable) event.preventDefault();
|
|
95
|
+
if (farther(state.heldAt, point, distance)) self.handleStart();
|
|
96
|
+
}
|
|
97
|
+
detach() {
|
|
98
|
+
const state = holds.get(this);
|
|
99
|
+
if (state) clearTimeout(state.timer);
|
|
100
|
+
holds.delete(this);
|
|
101
|
+
releaseEscapeOf(this);
|
|
102
|
+
super.detach();
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
/** A TouchSensor that starts a drag on the first move after a still hold (see above). */
|
|
106
|
+
const HoldThenMoveTouchSensor = HoldThenMoveTouchSensorImpl;
|
|
107
|
+
var MouseOnlyPointerSensorImpl = class extends PointerSensor {
|
|
108
|
+
static activators = [{
|
|
109
|
+
eventName: "onPointerDown",
|
|
110
|
+
handler: (event, options) => event.nativeEvent.pointerType === "touch" ? false : PointerSensor.activators[0].handler(event, options)
|
|
111
|
+
}];
|
|
112
|
+
handleStart() {
|
|
113
|
+
super.handleStart();
|
|
114
|
+
holdEscapeOnceActive(this);
|
|
115
|
+
}
|
|
116
|
+
detach() {
|
|
117
|
+
releaseEscapeOf(this);
|
|
118
|
+
super.detach();
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* dnd-kit's PointerSensor for a mouse and a pen only: a finger's pointerdown is
|
|
123
|
+
* left to `HoldThenMoveTouchSensor`. While it holds a drag, Escape puts the
|
|
124
|
+
* item back and reaches nothing else.
|
|
125
|
+
*/
|
|
126
|
+
const MouseOnlyPointerSensor = MouseOnlyPointerSensorImpl;
|
|
127
|
+
/**
|
|
128
|
+
* `useSensor(HoldThenMoveTouchSensor, …)` with the activation the sensor relies
|
|
129
|
+
* on: no constraint dnd-kit would act on by itself, so only a move after the
|
|
130
|
+
* hold starts the drag.
|
|
131
|
+
*/
|
|
132
|
+
function useHoldThenMoveTouchSensor({ holdMs = 500, distance = 10, tolerance = 10 } = {}) {
|
|
133
|
+
const options = useMemo(() => ({
|
|
134
|
+
holdMs,
|
|
135
|
+
distance,
|
|
136
|
+
tolerance,
|
|
137
|
+
activationConstraint: { distance: Number.POSITIVE_INFINITY }
|
|
138
|
+
}), [
|
|
139
|
+
holdMs,
|
|
140
|
+
distance,
|
|
141
|
+
tolerance
|
|
142
|
+
]);
|
|
143
|
+
return useSensor(HoldThenMoveTouchSensor, options);
|
|
144
|
+
}
|
|
145
|
+
/** The mouse / pen sensor that goes with it: picks up after `distance` px. */
|
|
146
|
+
function useMouseOnlyPointerSensor(distance) {
|
|
147
|
+
const options = useMemo(() => ({ activationConstraint: { distance } }), [distance]);
|
|
148
|
+
return useSensor(MouseOnlyPointerSensor, options);
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
export { HoldThenMoveTouchSensor, MouseOnlyPointerSensor, TOUCH_DRAG_DISTANCE_PX, TOUCH_DRAG_HOLD_MS, TOUCH_DRAG_TOLERANCE_PX, useHoldThenMoveTouchSensor, useMouseOnlyPointerSensor };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/lib/truncation.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Whether a text is cut off, and when to look again: the one way raft-ui
|
|
4
|
+
* measures truncation (Ellipsis, `useTruncated`, and the `title` that
|
|
5
|
+
* fields give a cut value).
|
|
6
|
+
*
|
|
7
|
+
* The truncation itself is CSS (`text-overflow: ellipsis`, `line-clamp`);
|
|
8
|
+
* this module only answers "did it cut?".
|
|
9
|
+
*
|
|
10
|
+
* - It compares fractional geometry with a 0.5px tolerance. `scrollWidth` and
|
|
11
|
+
* `clientWidth` are whole pixels, so at some widths (and page zooms) a text
|
|
12
|
+
* that shows an ellipsis reports that it fits.
|
|
13
|
+
* - Every measured element on a page shares one ResizeObserver, one
|
|
14
|
+
* MutationObserver and one font-loading listener. A web font that finishes
|
|
15
|
+
* loading widens the text without resizing its box, which no
|
|
16
|
+
* ResizeObserver would notice.
|
|
17
|
+
* - Requests are batched into one animation frame, before paint: every
|
|
18
|
+
* target is isolated (an Ellipsis hides its `after` so the text is measured
|
|
19
|
+
* alone), then every target is read, then restored, then every result is
|
|
20
|
+
* committed in one synchronous React update. Reads never interleave with
|
|
21
|
+
* writes, and a result shows in the same frame it was measured in. A
|
|
22
|
+
* request made while a frame is handled is queued for the next one.
|
|
23
|
+
*/
|
|
24
|
+
/** `undefined`: not known yet, or the element has no box (hidden, not laid out). */
|
|
25
|
+
export type Truncation = boolean | undefined;
|
|
26
|
+
//#endregion
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { flushSync } from "react-dom";
|
|
2
|
+
//#region src/lib/truncation.ts
|
|
3
|
+
/** Overflow smaller than this is rounding, not a cut. */
|
|
4
|
+
const TOLERANCE = .5;
|
|
5
|
+
function contentBox(element) {
|
|
6
|
+
const rect = element.getBoundingClientRect();
|
|
7
|
+
if (rect.width === 0 && rect.height === 0) return void 0;
|
|
8
|
+
const style = element.ownerDocument.defaultView?.getComputedStyle(element);
|
|
9
|
+
const px = (value) => Number.parseFloat(value ?? "") || 0;
|
|
10
|
+
return {
|
|
11
|
+
left: rect.left + px(style?.borderLeftWidth) + px(style?.paddingLeft),
|
|
12
|
+
right: rect.right - px(style?.borderRightWidth) - px(style?.paddingRight),
|
|
13
|
+
top: rect.top + px(style?.borderTopWidth) + px(style?.paddingTop),
|
|
14
|
+
bottom: rect.bottom - px(style?.borderBottomWidth) - px(style?.paddingBottom)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whether laid-out text `rects` overflow `box`: past either inline edge, or
|
|
19
|
+
* on a line whose middle is below the bottom edge (a clamped line is still
|
|
20
|
+
* laid out, below the box; the middle, not the top, so a glyph box taller
|
|
21
|
+
* than a tight line-height does not count as a cut).
|
|
22
|
+
*/
|
|
23
|
+
function overflows(rects, box) {
|
|
24
|
+
for (const rect of Array.from(rects)) {
|
|
25
|
+
if (rect.width === 0 && rect.height === 0) continue;
|
|
26
|
+
if (rect.right > box.right + .5 || rect.left < box.left - .5) return true;
|
|
27
|
+
if (rect.top + rect.height / 2 > box.bottom + .5) return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/** Whether the text inside `element` overflows its content box. */
|
|
32
|
+
function measureElement(element) {
|
|
33
|
+
if (!element.isConnected) return void 0;
|
|
34
|
+
const box = contentBox(element);
|
|
35
|
+
if (!box) return void 0;
|
|
36
|
+
const range = element.ownerDocument.createRange();
|
|
37
|
+
range.selectNodeContents(element);
|
|
38
|
+
return overflows(range.getClientRects(), box);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether the inline `content` overflows `text`, the box that clips it.
|
|
42
|
+
* Used where `text` holds more than the content (an Ellipsis's floats).
|
|
43
|
+
*/
|
|
44
|
+
function measureContent(text, content) {
|
|
45
|
+
if (!text.isConnected) return void 0;
|
|
46
|
+
const box = contentBox(text);
|
|
47
|
+
if (!box) return void 0;
|
|
48
|
+
return overflows(content.getClientRects(), box);
|
|
49
|
+
}
|
|
50
|
+
/** Isolates, reads and restores one target now, outside the batch. */
|
|
51
|
+
function readNow(target) {
|
|
52
|
+
const restore = target.isolate?.();
|
|
53
|
+
try {
|
|
54
|
+
return target.read();
|
|
55
|
+
} finally {
|
|
56
|
+
restore?.();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const targets = /* @__PURE__ */ new Set();
|
|
60
|
+
const byElement = /* @__PURE__ */ new WeakMap();
|
|
61
|
+
const pending = /* @__PURE__ */ new Set();
|
|
62
|
+
let frame = 0;
|
|
63
|
+
let resizeObserver;
|
|
64
|
+
let mutationObserver;
|
|
65
|
+
let fontsListening = false;
|
|
66
|
+
function flush() {
|
|
67
|
+
frame = 0;
|
|
68
|
+
const batch = Array.from(pending).filter((target) => targets.has(target));
|
|
69
|
+
pending.clear();
|
|
70
|
+
const restores = batch.map((target) => target.isolate?.());
|
|
71
|
+
const results = batch.map((target) => target.read());
|
|
72
|
+
for (const restore of restores) restore?.();
|
|
73
|
+
flushSync(() => {
|
|
74
|
+
batch.forEach((target, index) => {
|
|
75
|
+
if (targets.has(target)) target.commit(results[index]);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Asks for `target` to be measured in the next frame, before it paints. */
|
|
80
|
+
function scheduleMeasure(target) {
|
|
81
|
+
if (!targets.has(target)) return;
|
|
82
|
+
pending.add(target);
|
|
83
|
+
if (frame === 0 && typeof requestAnimationFrame === "function") frame = requestAnimationFrame(flush);
|
|
84
|
+
}
|
|
85
|
+
function scheduleAll() {
|
|
86
|
+
for (const target of targets) scheduleMeasure(target);
|
|
87
|
+
}
|
|
88
|
+
function ownerOf(node) {
|
|
89
|
+
for (let current = node; current; current = current.parentNode) {
|
|
90
|
+
const target = byElement.get(current);
|
|
91
|
+
if (target) return target;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function observers(view) {
|
|
95
|
+
if (!resizeObserver && "ResizeObserver" in view) resizeObserver = new view.ResizeObserver((entries) => {
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
const target = byElement.get(entry.target);
|
|
98
|
+
if (target) scheduleMeasure(target);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (!mutationObserver && "MutationObserver" in view) mutationObserver = new view.MutationObserver((records) => {
|
|
102
|
+
for (const record of records) {
|
|
103
|
+
const target = ownerOf(record.target);
|
|
104
|
+
if (target) scheduleMeasure(target);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const fonts = view.document.fonts;
|
|
108
|
+
if (!fontsListening && fonts && typeof fonts.addEventListener === "function") {
|
|
109
|
+
fonts.addEventListener("loadingdone", scheduleAll);
|
|
110
|
+
fontsListening = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Starts watching `target`: the elements it names, the text under `watch`
|
|
115
|
+
* and the page's fonts. Measures it in the next frame. Returns the cleanup.
|
|
116
|
+
*/
|
|
117
|
+
function observeTruncation(target) {
|
|
118
|
+
const observed = target.observe().filter((element) => element != null);
|
|
119
|
+
const first = observed[0];
|
|
120
|
+
const view = first?.ownerDocument.defaultView;
|
|
121
|
+
if (!first || !view) return () => void 0;
|
|
122
|
+
observers(view);
|
|
123
|
+
targets.add(target);
|
|
124
|
+
for (const element of observed) {
|
|
125
|
+
byElement.set(element, target);
|
|
126
|
+
resizeObserver?.observe(element);
|
|
127
|
+
}
|
|
128
|
+
const watched = target.watch();
|
|
129
|
+
if (watched) {
|
|
130
|
+
byElement.set(watched, target);
|
|
131
|
+
mutationObserver?.observe(watched, {
|
|
132
|
+
childList: true,
|
|
133
|
+
characterData: true,
|
|
134
|
+
subtree: true
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
scheduleMeasure(target);
|
|
138
|
+
return () => {
|
|
139
|
+
targets.delete(target);
|
|
140
|
+
pending.delete(target);
|
|
141
|
+
for (const element of observed) {
|
|
142
|
+
if (byElement.get(element) === target) byElement.delete(element);
|
|
143
|
+
resizeObserver?.unobserve(element);
|
|
144
|
+
}
|
|
145
|
+
if (watched && byElement.get(watched) === target) byElement.delete(watched);
|
|
146
|
+
if (targets.size === 0) {
|
|
147
|
+
mutationObserver?.disconnect();
|
|
148
|
+
mutationObserver = void 0;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
export { TOLERANCE, measureContent, measureElement, observeTruncation, readNow, scheduleMeasure };
|
package/dist/lib/tv.mjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { cn } from "../cn.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants/lite";
|
|
3
|
+
//#region src/lib/tv.ts
|
|
4
|
+
const tv$1 = ((options) => {
|
|
5
|
+
const recipe = tv(options);
|
|
6
|
+
const wrappedRecipe = ((props) => {
|
|
7
|
+
const result = recipe(props);
|
|
8
|
+
if (result == null || typeof result === "string") return cn(result);
|
|
9
|
+
return Object.fromEntries(Object.entries(result).map(([slotName, slot]) => [slotName, (slotProps) => cn(slot(slotProps))]));
|
|
10
|
+
});
|
|
11
|
+
return Object.assign(wrappedRecipe, recipe);
|
|
12
|
+
});
|
|
13
|
+
//#endregion
|
|
14
|
+
export { tv$1 as tv };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
//#region src/lib/use-copy-to-clipboard.ts
|
|
3
|
+
function legacyCopy(value) {
|
|
4
|
+
try {
|
|
5
|
+
const area = document.createElement("textarea");
|
|
6
|
+
area.value = value;
|
|
7
|
+
area.setAttribute("readonly", "");
|
|
8
|
+
area.style.position = "fixed";
|
|
9
|
+
area.style.top = "0";
|
|
10
|
+
area.style.opacity = "0";
|
|
11
|
+
document.body.appendChild(area);
|
|
12
|
+
area.select();
|
|
13
|
+
const ok = document.execCommand("copy");
|
|
14
|
+
document.body.removeChild(area);
|
|
15
|
+
return ok;
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function writeClipboard(value) {
|
|
21
|
+
try {
|
|
22
|
+
if (navigator.clipboard?.writeText) {
|
|
23
|
+
await navigator.clipboard.writeText(value);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
} catch {}
|
|
27
|
+
return legacyCopy(value);
|
|
28
|
+
}
|
|
29
|
+
function useCopyToClipboard({ timeout = 1400 } = {}) {
|
|
30
|
+
const [copied, setCopied] = useState(false);
|
|
31
|
+
const timerRef = useRef(null);
|
|
32
|
+
const clear = useCallback(() => {
|
|
33
|
+
if (timerRef.current !== null) {
|
|
34
|
+
clearTimeout(timerRef.current);
|
|
35
|
+
timerRef.current = null;
|
|
36
|
+
}
|
|
37
|
+
}, []);
|
|
38
|
+
const reset = useCallback(() => {
|
|
39
|
+
clear();
|
|
40
|
+
setCopied(false);
|
|
41
|
+
}, [clear]);
|
|
42
|
+
useEffect(() => clear, [clear]);
|
|
43
|
+
return {
|
|
44
|
+
copied,
|
|
45
|
+
copyText: useCallback(async (value) => {
|
|
46
|
+
if (!await writeClipboard(value)) throw new Error("copy_failed");
|
|
47
|
+
setCopied(true);
|
|
48
|
+
clear();
|
|
49
|
+
timerRef.current = setTimeout(() => {
|
|
50
|
+
timerRef.current = null;
|
|
51
|
+
setCopied(false);
|
|
52
|
+
}, timeout);
|
|
53
|
+
}, [clear, timeout]),
|
|
54
|
+
reset
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { useCopyToClipboard };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
2
|
+
//#region src/lib/use-merged-ref.ts
|
|
3
|
+
/**
|
|
4
|
+
* Merges refs into one setter. Returns `[setRef, getRef]`: `setRef(el)` stores `el` and passes it to
|
|
5
|
+
* every ref; `getRef()` reads the stored element. When a ref changes between renders (checked while
|
|
6
|
+
* rendering), the old one is cleared and the new one gets the stored element at once. The setter
|
|
7
|
+
* calls ref callbacks itself, so what they return is ignored.
|
|
8
|
+
*/
|
|
9
|
+
function useMergedRef(...refs) {
|
|
10
|
+
const entries = useMemo(() => [], []);
|
|
11
|
+
const elementRef = useRef(null);
|
|
12
|
+
const getRef = useCallback(() => elementRef.current, []);
|
|
13
|
+
const clearEntry = useCallback((entry) => {
|
|
14
|
+
if (entry != null) {
|
|
15
|
+
if (entry.type === "RefCallback") entry.ref(null);
|
|
16
|
+
else entry.ref.current = null;
|
|
17
|
+
}
|
|
18
|
+
}, []);
|
|
19
|
+
const applyStoredElement = useCallback((ref) => {
|
|
20
|
+
if (typeof ref == "function") ref(getRef());
|
|
21
|
+
else ref.current = getRef();
|
|
22
|
+
}, [getRef]);
|
|
23
|
+
const setRef = useCallback((el) => {
|
|
24
|
+
elementRef.current = el;
|
|
25
|
+
for (const entry of entries) if (entry == null) continue;
|
|
26
|
+
else if (entry.type === "RefObject") entry.ref.current = el;
|
|
27
|
+
else entry.ref(el);
|
|
28
|
+
}, [entries]);
|
|
29
|
+
for (let i = 0; i < refs.length; i++) {
|
|
30
|
+
const ref = refs[i];
|
|
31
|
+
const entry = entries[i];
|
|
32
|
+
if (ref == null) {
|
|
33
|
+
clearEntry(entry);
|
|
34
|
+
entries[i] = null;
|
|
35
|
+
} else {
|
|
36
|
+
if (entry && entry.ref === ref) continue;
|
|
37
|
+
if (typeof ref == "function") {
|
|
38
|
+
if (entry != null) clearEntry(entry);
|
|
39
|
+
entries[i] = {
|
|
40
|
+
type: "RefCallback",
|
|
41
|
+
ref
|
|
42
|
+
};
|
|
43
|
+
} else {
|
|
44
|
+
if (entry != null) clearEntry(entry);
|
|
45
|
+
entries[i] = {
|
|
46
|
+
type: "RefObject",
|
|
47
|
+
ref
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
applyStoredElement(ref);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (let i = refs.length; i < entries.length; i++) {
|
|
54
|
+
clearEntry(entries[i]);
|
|
55
|
+
entries[i] = null;
|
|
56
|
+
}
|
|
57
|
+
return [setRef, getRef];
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { useMergedRef };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
//#region src/lib/use-mobile-viewport.ts
|
|
3
|
+
const MOBILE_QUERY = "(max-width: 767px)";
|
|
4
|
+
function subscribeMobileViewport(onStoreChange) {
|
|
5
|
+
if (typeof window === "undefined") return () => void 0;
|
|
6
|
+
const media = window.matchMedia(MOBILE_QUERY);
|
|
7
|
+
media.addEventListener("change", onStoreChange);
|
|
8
|
+
return () => media.removeEventListener("change", onStoreChange);
|
|
9
|
+
}
|
|
10
|
+
function getMobileViewportSnapshot() {
|
|
11
|
+
return typeof window !== "undefined" && window.matchMedia(MOBILE_QUERY).matches;
|
|
12
|
+
}
|
|
13
|
+
function useMobileViewport() {
|
|
14
|
+
return useSyncExternalStore(subscribeMobileViewport, getMobileViewportSnapshot, () => false);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { useMobileViewport };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { measureElement, observeTruncation } from "./truncation.mjs";
|
|
2
|
+
import { useCallback, useRef } from "react";
|
|
3
|
+
//#region src/lib/use-overflow-title.ts
|
|
4
|
+
function cut(element) {
|
|
5
|
+
return measureElement(element) === true;
|
|
6
|
+
}
|
|
7
|
+
function assign(ref, node) {
|
|
8
|
+
if (typeof ref === "function") ref(node);
|
|
9
|
+
else if (ref) ref.current = node;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Gives a value that is cut off (an ellipsis, a clamp) its whole text as its
|
|
13
|
+
* `title`, and takes it away again when the value fits: a value that shows in
|
|
14
|
+
* full needs no tooltip repeating it (design/patterns/forms.md#long-values-in-fields).
|
|
15
|
+
* It watches the element and its children, so a part whose text sits in a
|
|
16
|
+
* child that truncates (a chip's label) is covered too. A `title` the caller
|
|
17
|
+
* passes wins, and is never touched.
|
|
18
|
+
*
|
|
19
|
+
* Pass a stable `ref`: a ref object, or a callback ref made with `useCallback`
|
|
20
|
+
* (or defined outside the component). The returned callback ref changes
|
|
21
|
+
* whenever `ref` does, and React then detaches and re-attaches it, so an inline
|
|
22
|
+
* `ref={(node) => ...}` disconnects and rebuilds both observers on every render.
|
|
23
|
+
* The title stays right, but each render pays for new observers and a fresh
|
|
24
|
+
* measurement.
|
|
25
|
+
*/
|
|
26
|
+
function useOverflowTitle(ref, title) {
|
|
27
|
+
const cleanup = useRef(void 0);
|
|
28
|
+
const own = title !== void 0;
|
|
29
|
+
return useCallback((node) => {
|
|
30
|
+
cleanup.current?.();
|
|
31
|
+
cleanup.current = void 0;
|
|
32
|
+
assign(ref, node);
|
|
33
|
+
const view = node?.ownerDocument.defaultView;
|
|
34
|
+
if (!node || own || !view) return;
|
|
35
|
+
const children = Array.from(node.children);
|
|
36
|
+
cleanup.current = observeTruncation({
|
|
37
|
+
observe: () => [node, ...children],
|
|
38
|
+
watch: () => node,
|
|
39
|
+
read: () => cut(node) || children.some(cut),
|
|
40
|
+
commit: (truncated) => {
|
|
41
|
+
const text = node.textContent?.trim() ?? "";
|
|
42
|
+
if (text && truncated) node.title = text;
|
|
43
|
+
else node.removeAttribute("title");
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}, [own, ref]);
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { useOverflowTitle };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/lib/use-scrollbar-size.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Publishes a scroller's classic scrollbar width as `--scrollbar-size` on the
|
|
4
|
+
* scroller, for the list cells inside it (lib/list-cell.ts): a cell gives
|
|
5
|
+
* that much of its 8px end inset back, so its fill sits 8px from both outer
|
|
6
|
+
* edges of the list whether the scrollbar takes room (a classic scrollbar,
|
|
7
|
+
* `scrollbar-list`) or not (an overlay scrollbar: 0). CSS alone can't tell
|
|
8
|
+
* the two apart. The width is kept current while the scroller or one of its
|
|
9
|
+
* direct children resizes, which is when a scrollbar comes and goes: content
|
|
10
|
+
* deeper down that grows also grows the child that holds it. A child whose
|
|
11
|
+
* box keeps its size while its content overflows it would not be seen.
|
|
12
|
+
*
|
|
13
|
+
* Returns a ref callback for the scroller.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useScrollbarSize<E extends HTMLElement>(): (el: E | null) => void;
|
|
16
|
+
//#endregion
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useCallback, useRef } from "react";
|
|
2
|
+
//#region src/lib/use-scrollbar-size.ts
|
|
3
|
+
/**
|
|
4
|
+
* Publishes a scroller's classic scrollbar width as `--scrollbar-size` on the
|
|
5
|
+
* scroller, for the list cells inside it (lib/list-cell.ts): a cell gives
|
|
6
|
+
* that much of its 8px end inset back, so its fill sits 8px from both outer
|
|
7
|
+
* edges of the list whether the scrollbar takes room (a classic scrollbar,
|
|
8
|
+
* `scrollbar-list`) or not (an overlay scrollbar: 0). CSS alone can't tell
|
|
9
|
+
* the two apart. The width is kept current while the scroller or one of its
|
|
10
|
+
* direct children resizes, which is when a scrollbar comes and goes: content
|
|
11
|
+
* deeper down that grows also grows the child that holds it. A child whose
|
|
12
|
+
* box keeps its size while its content overflows it would not be seen.
|
|
13
|
+
*
|
|
14
|
+
* Returns a ref callback for the scroller.
|
|
15
|
+
*/
|
|
16
|
+
function useScrollbarSize() {
|
|
17
|
+
const cleanup = useRef(null);
|
|
18
|
+
return useCallback((el) => {
|
|
19
|
+
cleanup.current?.();
|
|
20
|
+
cleanup.current = null;
|
|
21
|
+
if (!el || typeof ResizeObserver === "undefined") return;
|
|
22
|
+
const update = () => {
|
|
23
|
+
const style = getComputedStyle(el);
|
|
24
|
+
const size = el.offsetWidth - el.clientWidth - parseFloat(style.borderLeftWidth || "0") - parseFloat(style.borderRightWidth || "0");
|
|
25
|
+
el.style.setProperty("--scrollbar-size", `${Math.max(0, Math.round(size))}px`);
|
|
26
|
+
};
|
|
27
|
+
const resize = new ResizeObserver(update);
|
|
28
|
+
const observeChildren = () => {
|
|
29
|
+
for (const child of el.children) resize.observe(child);
|
|
30
|
+
};
|
|
31
|
+
resize.observe(el);
|
|
32
|
+
observeChildren();
|
|
33
|
+
const mutation = new MutationObserver(() => {
|
|
34
|
+
observeChildren();
|
|
35
|
+
update();
|
|
36
|
+
});
|
|
37
|
+
mutation.observe(el, { childList: true });
|
|
38
|
+
update();
|
|
39
|
+
cleanup.current = () => {
|
|
40
|
+
resize.disconnect();
|
|
41
|
+
mutation.disconnect();
|
|
42
|
+
};
|
|
43
|
+
}, []);
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { useScrollbarSize };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Truncation } from "./truncation.mjs";
|
|
2
|
+
import { RefObject } from "react";
|
|
3
|
+
//#region src/lib/use-truncated.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Whether the text in the element `ref` points at is cut off by its CSS
|
|
6
|
+
* (`truncate`, `line-clamp`, a fixed size with `overflow: hidden`): `true`,
|
|
7
|
+
* `false`, or `undefined` until it is measured or while it has no box.
|
|
8
|
+
*
|
|
9
|
+
* It measures fractional sizes with a 0.5px tolerance, past either inline
|
|
10
|
+
* edge and below the bottom edge, so it needs no line count. It measures again
|
|
11
|
+
* when the element changes size, when its text changes and when a web font
|
|
12
|
+
* finishes loading, in one batched frame for every measured element on the
|
|
13
|
+
* page (lib/truncation.ts), before that frame paints.
|
|
14
|
+
*
|
|
15
|
+
* The element is read when the component mounts: keep `ref` on one element
|
|
16
|
+
* for the component's life, or give the component a `key` that changes with
|
|
17
|
+
* the element.
|
|
18
|
+
*/
|
|
19
|
+
export declare function useTruncated(ref: RefObject<Element | null>): Truncation;
|
|
20
|
+
//#endregion
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { measureElement, observeTruncation } from "./truncation.mjs";
|
|
2
|
+
import { useLayoutEffect, useState } from "react";
|
|
3
|
+
//#region src/lib/use-truncated.ts
|
|
4
|
+
/**
|
|
5
|
+
* Whether the text in the element `ref` points at is cut off by its CSS
|
|
6
|
+
* (`truncate`, `line-clamp`, a fixed size with `overflow: hidden`): `true`,
|
|
7
|
+
* `false`, or `undefined` until it is measured or while it has no box.
|
|
8
|
+
*
|
|
9
|
+
* It measures fractional sizes with a 0.5px tolerance, past either inline
|
|
10
|
+
* edge and below the bottom edge, so it needs no line count. It measures again
|
|
11
|
+
* when the element changes size, when its text changes and when a web font
|
|
12
|
+
* finishes loading, in one batched frame for every measured element on the
|
|
13
|
+
* page (lib/truncation.ts), before that frame paints.
|
|
14
|
+
*
|
|
15
|
+
* The element is read when the component mounts: keep `ref` on one element
|
|
16
|
+
* for the component's life, or give the component a `key` that changes with
|
|
17
|
+
* the element.
|
|
18
|
+
*/
|
|
19
|
+
function useTruncated(ref) {
|
|
20
|
+
const [truncated, setTruncated] = useState(void 0);
|
|
21
|
+
useLayoutEffect(() => {
|
|
22
|
+
const element = ref.current;
|
|
23
|
+
if (!element) return void 0;
|
|
24
|
+
return observeTruncation({
|
|
25
|
+
observe: () => [element],
|
|
26
|
+
watch: () => element,
|
|
27
|
+
read: () => measureElement(element),
|
|
28
|
+
commit: setTruncated
|
|
29
|
+
});
|
|
30
|
+
}, [ref]);
|
|
31
|
+
return truncated;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { useTruncated };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/lib/without-children.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Element props without `children` — for leaf components (dots, markers) that
|
|
4
|
+
* render no caller content. React ships `ComponentPropsWithoutRef` but no
|
|
5
|
+
* equivalent that subtracts children, so this names the one-off `Omit`.
|
|
6
|
+
*/
|
|
7
|
+
export type WithoutChildren<P> = Omit<P, "children">;
|
|
8
|
+
//#endregion
|