@brandsync/wc 1.12.1 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/CONVENTIONS.md +109 -0
- package/REFERENCE.md +1357 -0
- package/custom-elements.json +2628 -338
- package/dist/brandsync-wc/brandsync-wc.css +1 -1783
- package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
- package/dist/brandsync-wc/{p-83c90489.entry.js → p-00be9a64.entry.js} +1 -1
- package/dist/brandsync-wc/{p-b9ccd9d1.entry.js → p-020cb767.entry.js} +1 -1
- package/dist/brandsync-wc/p-046a53de.entry.js +1 -0
- package/dist/brandsync-wc/{p-282ddbee.entry.js → p-07966676.entry.js} +1 -1
- package/dist/brandsync-wc/p-0cb6fc39.entry.js +1 -0
- package/dist/brandsync-wc/{p-2497d128.entry.js → p-0e940ee1.entry.js} +1 -1
- package/dist/brandsync-wc/{p-e5daa6ca.entry.js → p-10290c41.entry.js} +1 -1
- package/dist/brandsync-wc/{p-e2556b4e.entry.js → p-144b6ac8.entry.js} +1 -1
- package/dist/brandsync-wc/p-1b5cc9b8.entry.js +1 -0
- package/dist/brandsync-wc/p-23b56775.entry.js +1 -0
- package/dist/brandsync-wc/{p-a9169157.entry.js → p-23cc532f.entry.js} +1 -1
- package/dist/brandsync-wc/{p-81605b82.entry.js → p-361aef36.entry.js} +1 -1
- package/dist/brandsync-wc/{p-89fabf27.entry.js → p-3789c7a5.entry.js} +1 -1
- package/dist/brandsync-wc/p-3f6682f8.entry.js +1 -0
- package/dist/brandsync-wc/{p-f5180578.entry.js → p-4054a944.entry.js} +1 -1
- package/dist/brandsync-wc/{p-fc069773.entry.js → p-45cb3e6d.entry.js} +1 -1
- package/dist/brandsync-wc/{p-de110ad0.entry.js → p-47b7fe76.entry.js} +1 -1
- package/dist/brandsync-wc/{p-2f4e08e1.entry.js → p-47cd19aa.entry.js} +1 -1
- package/dist/brandsync-wc/{p-3a1af63a.entry.js → p-4bbc4809.entry.js} +1 -1
- package/dist/brandsync-wc/{p-247e36ad.entry.js → p-4ea435a6.entry.js} +1 -1
- package/dist/brandsync-wc/{p-56c37e0a.entry.js → p-4ea9b6a1.entry.js} +1 -1
- package/dist/brandsync-wc/{p-1978e63c.entry.js → p-53362609.entry.js} +1 -1
- package/dist/brandsync-wc/p-658532b7.entry.js +1 -0
- package/dist/brandsync-wc/p-68f0be29.entry.js +1 -0
- package/dist/brandsync-wc/{p-09bc1923.entry.js → p-694fe468.entry.js} +1 -1
- package/dist/brandsync-wc/{p-78f4fcf0.entry.js → p-6ca1e51b.entry.js} +1 -1
- package/dist/brandsync-wc/{p-52cb2358.entry.js → p-6e923ebc.entry.js} +1 -1
- package/dist/brandsync-wc/p-7e24dbd7.entry.js +1 -0
- package/dist/brandsync-wc/{p-00a0d489.entry.js → p-8048d033.entry.js} +1 -1
- package/dist/brandsync-wc/{p-2368a92e.entry.js → p-8184d7de.entry.js} +1 -1
- package/dist/brandsync-wc/p-8390a155.entry.js +1 -0
- package/dist/brandsync-wc/{p-0b2d3b7e.entry.js → p-86028548.entry.js} +1 -1
- package/dist/brandsync-wc/{p-fcee0dc4.entry.js → p-89fa7567.entry.js} +1 -1
- package/dist/brandsync-wc/{p-7796b93f.entry.js → p-8c9938a5.entry.js} +1 -1
- package/dist/brandsync-wc/{p-68fcd4a4.entry.js → p-9125632c.entry.js} +1 -1
- package/dist/brandsync-wc/{p-416322bd.entry.js → p-94d435a2.entry.js} +1 -1
- package/dist/brandsync-wc/{p-69c0a85d.entry.js → p-95f034fc.entry.js} +1 -1
- package/dist/brandsync-wc/p-9b58c0c5.entry.js +1 -0
- package/dist/brandsync-wc/{p-39a26c64.entry.js → p-9cf8274a.entry.js} +1 -1
- package/dist/brandsync-wc/p-9d12b1fb.entry.js +1 -0
- package/dist/brandsync-wc/{p-5ba90a13.entry.js → p-9d660c03.entry.js} +1 -1
- package/dist/brandsync-wc/p-D3SkQJpw.js +3 -0
- package/dist/brandsync-wc/{p-7f954939.entry.js → p-a28ef52e.entry.js} +1 -1
- package/dist/brandsync-wc/{p-09435f41.entry.js → p-a5659499.entry.js} +1 -1
- package/dist/brandsync-wc/p-ab07c9b5.entry.js +1 -0
- package/dist/brandsync-wc/p-b0b2e525.entry.js +1 -0
- package/dist/brandsync-wc/p-b6ac1b50.entry.js +1 -0
- package/dist/brandsync-wc/p-bee30626.entry.js +1 -0
- package/dist/brandsync-wc/p-bf8bd386.entry.js +1 -0
- package/dist/brandsync-wc/{p-1aab6d07.entry.js → p-c05ee501.entry.js} +1 -1
- package/dist/brandsync-wc/p-c3da3080.entry.js +1 -0
- package/dist/brandsync-wc/p-c679b631.entry.js +1 -0
- package/dist/brandsync-wc/p-cceb8484.entry.js +1 -0
- package/dist/brandsync-wc/p-cd53bba9.entry.js +1 -0
- package/dist/brandsync-wc/p-ce16f038.entry.js +1 -0
- package/dist/brandsync-wc/{p-491b51e6.entry.js → p-d5a6098d.entry.js} +1 -1
- package/dist/brandsync-wc/{p-f15d9524.entry.js → p-d64cae57.entry.js} +1 -1
- package/dist/brandsync-wc/p-dfad8c0a.entry.js +1 -0
- package/dist/brandsync-wc/p-e0504a4b.entry.js +1 -0
- package/dist/brandsync-wc/{p-0ee4126c.entry.js → p-e1b7bea7.entry.js} +1 -1
- package/dist/brandsync-wc/{p-0b7c77c1.entry.js → p-e65d286c.entry.js} +1 -1
- package/dist/brandsync-wc/p-ed5c2d97.entry.js +1 -0
- package/dist/brandsync-wc/p-f134a502.entry.js +1 -0
- package/dist/brandsync-wc/p-f271e1d2.entry.js +1 -0
- package/dist/brandsync-wc/{p-3f09296a.entry.js → p-f3eca1ce.entry.js} +1 -1
- package/dist/brandsync-wc/{p-617bd13a.entry.js → p-f8d47004.entry.js} +1 -1
- package/dist/brandsync-wc/p-fa34fe20.entry.js +1 -0
- package/dist/brandsync-wc/{p-2177042f.entry.js → p-fa6b9750.entry.js} +1 -1
- package/dist/brandsync-wc/p-fb4d0093.entry.js +1 -0
- package/dist/brandsync-wc/{p-78a69a59.entry.js → p-fc76031e.entry.js} +1 -1
- package/dist/brandsync-wc/{p-be3dd446.entry.js → p-ffc07eb5.entry.js} +1 -1
- package/dist/cjs/brandsync-wc.cjs.js +2 -2
- package/dist/cjs/bs-accordion-group.cjs.entry.js +33 -0
- package/dist/cjs/bs-accordion.cjs.entry.js +1 -1
- package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
- package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
- package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
- package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
- package/dist/cjs/bs-attachment.cjs.entry.js +9 -5
- package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
- package/dist/cjs/bs-badge.cjs.entry.js +1 -1
- package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +1 -1
- package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
- package/dist/cjs/bs-breadcrumbs.cjs.entry.js +2 -2
- package/dist/cjs/bs-button-skeleton.cjs.entry.js +4 -2
- package/dist/cjs/bs-button.cjs.entry.js +1 -1
- package/dist/cjs/bs-card.cjs.entry.js +1 -1
- package/dist/cjs/bs-carousel.cjs.entry.js +1 -1
- package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +18 -2
- package/dist/cjs/bs-chatbot-header.cjs.entry.js +20 -2
- package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +25 -3
- package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +4 -2
- package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +3 -3
- package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +4 -2
- package/dist/cjs/bs-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/bs-chip-filter.cjs.entry.js +1 -1
- package/dist/cjs/bs-chip-informative.cjs.entry.js +1 -1
- package/dist/cjs/bs-chip-input.cjs.entry.js +4 -2
- package/dist/cjs/bs-citation-preview.cjs.entry.js +29 -0
- package/dist/cjs/bs-composer-status-banner.cjs.entry.js +11 -3
- package/dist/cjs/bs-composer.cjs.entry.js +36 -7
- package/dist/cjs/bs-cookie-consent.cjs.entry.js +1 -1
- package/dist/cjs/bs-data-table.cjs.entry.js +5 -3
- package/dist/cjs/bs-datepicker.cjs.entry.js +1 -1
- package/dist/cjs/bs-dialog.cjs.entry.js +4 -2
- package/dist/cjs/bs-error-page.cjs.entry.js +1 -1
- package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
- package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
- package/dist/cjs/bs-icon-button.cjs.entry.js +1 -1
- package/dist/cjs/bs-icon-tile.cjs.entry.js +1 -1
- package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
- package/dist/cjs/bs-input_3.cjs.entry.js +15 -7
- package/dist/cjs/bs-logo.cjs.entry.js +1 -1
- package/dist/cjs/bs-message-list.cjs.entry.js +71 -0
- package/dist/cjs/bs-message.cjs.entry.js +25 -0
- package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
- package/dist/cjs/bs-navigation-drawer.cjs.entry.js +9 -3
- package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
- package/dist/cjs/bs-onboarding-checklist.cjs.entry.js +1 -1
- package/dist/cjs/bs-pagination.cjs.entry.js +6 -2
- package/dist/cjs/bs-popover.cjs.entry.js +153 -0
- package/dist/cjs/bs-product-tour.cjs.entry.js +1 -1
- package/dist/cjs/bs-progress-linear.cjs.entry.js +3 -3
- package/dist/cjs/bs-progress.cjs.entry.js +3 -3
- package/dist/cjs/bs-qr-code.cjs.entry.js +2 -2
- package/dist/cjs/bs-radio.cjs.entry.js +2 -2
- package/dist/cjs/bs-session-timeout.cjs.entry.js +2 -2
- package/dist/cjs/bs-side-panel.cjs.entry.js +164 -0
- package/dist/cjs/bs-skeleton.cjs.entry.js +51 -0
- package/dist/cjs/bs-slider.cjs.entry.js +7 -3
- package/dist/cjs/bs-snackbar.cjs.entry.js +2 -2
- package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
- package/dist/cjs/bs-spinner.cjs.entry.js +24 -0
- package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
- package/dist/cjs/bs-stepper.cjs.entry.js +2 -2
- package/dist/cjs/bs-switch.cjs.entry.js +2 -2
- package/dist/cjs/bs-tab_3.cjs.entry.js +4 -4
- package/dist/cjs/bs-timepicker.cjs.entry.js +8 -4
- package/dist/cjs/bs-toast.cjs.entry.js +4 -2
- package/dist/cjs/bs-tooltip-trigger.cjs.entry.js +46 -0
- package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
- package/dist/cjs/bs-whats-new.cjs.entry.js +1 -1
- package/dist/cjs/index-BYfMRtlW.js +1863 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +9 -0
- package/dist/collection/components/bs-accordion-group/bs-accordion-group.cmp.test.js +39 -0
- package/dist/collection/components/bs-accordion-group/bs-accordion-group.css +10 -0
- package/dist/collection/components/bs-accordion-group/bs-accordion-group.js +86 -0
- package/dist/collection/components/bs-accordion-group/bs-accordion-group.stories.js +18 -0
- package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
- package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
- package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
- package/dist/collection/components/bs-attachment/bs-attachment.js +48 -4
- package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
- package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
- package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +23 -1
- package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.cmp.test.js +10 -0
- package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +178 -2
- package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.cmp.test.js +6 -0
- package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +200 -1
- package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.cmp.test.js +8 -0
- package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.css +4 -0
- package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +223 -1
- package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +24 -2
- package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.css +1 -4
- package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +3 -6
- package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +23 -1
- package/dist/collection/components/bs-chip/bs-chip-input/bs-chip-input.js +23 -1
- package/dist/collection/components/bs-citation-preview/bs-citation-preview.cmp.test.js +34 -0
- package/dist/collection/components/bs-citation-preview/bs-citation-preview.css +36 -0
- package/dist/collection/components/bs-citation-preview/bs-citation-preview.js +154 -0
- package/dist/collection/components/bs-citation-preview/bs-citation-preview.stories.js +22 -0
- package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +29 -2
- package/dist/collection/components/bs-composer/bs-composer.css +16 -0
- package/dist/collection/components/bs-composer/bs-composer.js +234 -6
- package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.js +5 -0
- package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.css +16 -0
- package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +49 -1
- package/dist/collection/components/bs-data-table/bs-data-table.js +24 -2
- package/dist/collection/components/bs-dialog/bs-dialog.js +23 -1
- package/dist/collection/components/bs-input/bs-input.js +92 -4
- package/dist/collection/components/bs-menu/bs-menu.js +1 -1
- package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
- package/dist/collection/components/bs-message/bs-message.cmp.test.js +36 -0
- package/dist/collection/components/bs-message/bs-message.css +77 -0
- package/dist/collection/components/bs-message/bs-message.js +156 -0
- package/dist/collection/components/bs-message/bs-message.stories.js +33 -0
- package/dist/collection/components/bs-message-list/bs-message-list.cmp.test.js +58 -0
- package/dist/collection/components/bs-message-list/bs-message-list.css +40 -0
- package/dist/collection/components/bs-message-list/bs-message-list.js +161 -0
- package/dist/collection/components/bs-message-list/bs-message-list.stories.js +17 -0
- package/dist/collection/components/bs-pagination/bs-pagination.cmp.test.js +5 -0
- package/dist/collection/components/bs-pagination/bs-pagination.js +45 -1
- package/dist/collection/components/bs-popover/bs-popover.cmp.test.js +107 -0
- package/dist/collection/components/bs-popover/bs-popover.css +61 -0
- package/dist/collection/components/bs-popover/bs-popover.js +247 -0
- package/dist/collection/components/bs-popover/bs-popover.stories.js +26 -0
- package/dist/collection/components/bs-progress/bs-progress.js +2 -2
- package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
- package/dist/collection/components/bs-qr-code/bs-qr-code.js +1 -1
- package/dist/collection/components/bs-radio/bs-radio.js +1 -1
- package/dist/collection/components/bs-session-timeout/bs-session-timeout.js +1 -1
- package/dist/collection/components/bs-side-panel/bs-side-panel.cmp.test.js +117 -0
- package/dist/collection/components/bs-side-panel/bs-side-panel.css +77 -0
- package/dist/collection/components/bs-side-panel/bs-side-panel.js +325 -0
- package/dist/collection/components/bs-side-panel/bs-side-panel.stories.js +24 -0
- package/dist/collection/components/bs-skeleton/bs-skeleton.cmp.test.js +49 -0
- package/dist/collection/components/bs-skeleton/bs-skeleton.css +62 -0
- package/dist/collection/components/bs-skeleton/bs-skeleton.js +204 -0
- package/dist/collection/components/bs-skeleton/bs-skeleton.stories.js +43 -0
- package/dist/collection/components/bs-slider/bs-slider.js +46 -2
- package/dist/collection/components/bs-snackbar/bs-snackbar.js +1 -1
- package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
- package/dist/collection/components/bs-spinner/bs-spinner.cmp.test.js +32 -0
- package/dist/collection/components/bs-spinner/bs-spinner.css +61 -0
- package/dist/collection/components/bs-spinner/bs-spinner.js +96 -0
- package/dist/collection/components/bs-spinner/bs-spinner.stories.js +30 -0
- package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
- package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
- package/dist/collection/components/bs-switch/bs-switch.js +1 -1
- package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
- package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
- package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
- package/dist/collection/components/bs-timepicker/bs-timepicker.js +48 -4
- package/dist/collection/components/bs-toast/bs-toast.js +23 -1
- package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
- package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.js +73 -0
- package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.css +52 -0
- package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.js +140 -0
- package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.js +21 -0
- package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +1 -1
- package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +68 -2
- package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
- package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
- package/dist/collection/global/brand-theming.cmp.test.js +44 -0
- package/dist/components/bs-accordion-group.d.ts +11 -0
- package/dist/components/bs-accordion-group.js +1 -0
- package/dist/components/bs-accordion.js +1 -1
- package/dist/components/bs-ai-disclaimer.js +1 -1
- package/dist/components/bs-ai-greeting.js +1 -1
- package/dist/components/bs-ai-thinking.js +1 -1
- package/dist/components/bs-attachment-list.js +1 -1
- package/dist/components/bs-attachment.js +1 -1
- package/dist/components/bs-avatar.js +1 -1
- package/dist/components/bs-badge.js +1 -1
- package/dist/components/bs-breadcrumb-overflow.js +1 -1
- package/dist/components/bs-breadcrumb.js +1 -1
- package/dist/components/bs-breadcrumbs.js +1 -1
- package/dist/components/bs-button-skeleton.js +1 -1
- package/dist/components/bs-button.js +1 -1
- package/dist/components/bs-card.js +1 -1
- package/dist/components/bs-carousel.js +1 -1
- package/dist/components/bs-chatbot-feedback.js +1 -1
- package/dist/components/bs-chatbot-header.js +1 -1
- package/dist/components/bs-chatbot-response-action.js +1 -1
- package/dist/components/bs-chatbot-sources-drawer.js +1 -1
- package/dist/components/bs-chatbot-suggestion-button.js +1 -1
- package/dist/components/bs-checkbox-skeleton.js +1 -1
- package/dist/components/bs-checkbox.js +1 -1
- package/dist/components/bs-chip-filter.js +1 -1
- package/dist/components/bs-chip-informative.js +1 -1
- package/dist/components/bs-chip-input.js +1 -1
- package/dist/components/bs-citation-preview.d.ts +11 -0
- package/dist/components/bs-citation-preview.js +1 -0
- package/dist/components/bs-composer-status-banner.js +1 -1
- package/dist/components/bs-composer.js +1 -1
- package/dist/components/bs-cookie-consent.js +1 -1
- package/dist/components/bs-data-table.js +1 -1
- package/dist/components/bs-datepicker.js +1 -1
- package/dist/components/bs-dialog.js +1 -1
- package/dist/components/bs-error-page.js +1 -1
- package/dist/components/bs-file-upload-item.js +1 -1
- package/dist/components/bs-file-upload.js +1 -1
- package/dist/components/bs-icon-button.js +1 -1
- package/dist/components/bs-icon-tile.js +1 -1
- package/dist/components/bs-inline-tab.js +1 -1
- package/dist/components/bs-input.js +1 -1
- package/dist/components/bs-logo.js +1 -1
- package/dist/components/bs-menu-item.js +1 -1
- package/dist/components/bs-menu.js +1 -1
- package/dist/components/bs-message-list.d.ts +11 -0
- package/dist/components/bs-message-list.js +1 -0
- package/dist/components/bs-message.d.ts +11 -0
- package/dist/components/bs-message.js +1 -0
- package/dist/components/bs-navigation-drawer-item.js +1 -1
- package/dist/components/bs-navigation-drawer.js +1 -1
- package/dist/components/bs-navigation-header.js +1 -1
- package/dist/components/bs-onboarding-checklist.js +1 -1
- package/dist/components/bs-pagination.js +1 -1
- package/dist/components/bs-popover.d.ts +11 -0
- package/dist/components/bs-popover.js +1 -0
- package/dist/components/bs-product-tour.js +1 -1
- package/dist/components/bs-progress-linear.js +1 -1
- package/dist/components/bs-progress.js +1 -1
- package/dist/components/bs-qr-code.js +1 -1
- package/dist/components/bs-radio.js +1 -1
- package/dist/components/bs-session-timeout.js +1 -1
- package/dist/components/bs-side-panel.d.ts +11 -0
- package/dist/components/bs-side-panel.js +1 -0
- package/dist/components/bs-skeleton.d.ts +11 -0
- package/dist/components/bs-skeleton.js +1 -0
- package/dist/components/bs-slider.js +1 -1
- package/dist/components/bs-snackbar.js +1 -1
- package/dist/components/bs-source-link.js +1 -1
- package/dist/components/bs-spinner.d.ts +11 -0
- package/dist/components/bs-spinner.js +1 -0
- package/dist/components/bs-stepper-step.js +1 -1
- package/dist/components/bs-stepper.js +1 -1
- package/dist/components/bs-switch.js +1 -1
- package/dist/components/bs-tab.js +1 -1
- package/dist/components/bs-tabs.js +1 -1
- package/dist/components/bs-timepicker.js +1 -1
- package/dist/components/bs-toast.js +1 -1
- package/dist/components/bs-tooltip-trigger.d.ts +11 -0
- package/dist/components/bs-tooltip-trigger.js +1 -0
- package/dist/components/bs-tooltip.js +1 -1
- package/dist/components/bs-whats-new-entry.js +1 -1
- package/dist/components/bs-whats-new.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/p-B2gx7SZk.js +1 -0
- package/dist/components/{p-BEEoVNRu.js → p-BTPdjnXT.js} +1 -1
- package/dist/components/{p-Be9L4_Fe.js → p-BVhF8cZQ.js} +1 -1
- package/dist/components/{p-C_j_jDM6.js → p-Bfq5YVOv.js} +1 -1
- package/dist/components/{p-DE8K7fg0.js → p-C2NR1v3p.js} +1 -1
- package/dist/components/{p-YsHQLXET.js → p-C9jIMBG3.js} +1 -1
- package/dist/components/{p-DuLL7Ouw.js → p-CRtvJlh8.js} +1 -1
- package/dist/components/{p-Dr0Qk9Zc.js → p-ChcaPfNL.js} +1 -1
- package/dist/components/{p-CbimDNGY.js → p-CrmEXUwm.js} +1 -1
- package/dist/components/p-Cu-aeY9t.js +1 -0
- package/dist/components/{p-zTHlbyH6.js → p-DAwSBMeM.js} +1 -1
- package/dist/components/{p-qmS2CBqi.js → p-DYuzgzxI.js} +1 -1
- package/dist/components/p-DfzrJKwN.js +1 -0
- package/dist/components/{p-CUfs0ROR.js → p-DpVeeIko.js} +1 -1
- package/dist/components/p-DqXI9V2A.js +1 -0
- package/dist/components/p-Dqg8l1y6.js +1 -0
- package/dist/components/{p-CA31vqjL.js → p-DvNED6Lb.js} +1 -1
- package/dist/components/{p-C8yT2Ucq.js → p-QnTjSed5.js} +1 -1
- package/dist/components/{p-CncySD_-.js → p-Rx4bpeYN.js} +1 -1
- package/dist/components/{p-Be_Pmccm.js → p-owdeCW0M.js} +1 -1
- package/dist/components/{p-Bl_tVzeq.js → p-uHvS81XA.js} +1 -1
- package/dist/esm/brandsync-wc.js +3 -3
- package/dist/esm/bs-accordion-group.entry.js +31 -0
- package/dist/esm/bs-accordion.entry.js +1 -1
- package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
- package/dist/esm/bs-ai-greeting.entry.js +2 -2
- package/dist/esm/bs-ai-thinking.entry.js +2 -2
- package/dist/esm/bs-attachment-list.entry.js +2 -2
- package/dist/esm/bs-attachment.entry.js +9 -5
- package/dist/esm/bs-avatar.entry.js +1 -1
- package/dist/esm/bs-badge.entry.js +1 -1
- package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
- package/dist/esm/bs-breadcrumb.entry.js +1 -1
- package/dist/esm/bs-breadcrumbs.entry.js +2 -2
- package/dist/esm/bs-button-skeleton.entry.js +4 -2
- package/dist/esm/bs-button.entry.js +1 -1
- package/dist/esm/bs-card.entry.js +1 -1
- package/dist/esm/bs-carousel.entry.js +1 -1
- package/dist/esm/bs-chatbot-feedback.entry.js +18 -2
- package/dist/esm/bs-chatbot-header.entry.js +20 -2
- package/dist/esm/bs-chatbot-response-action.entry.js +25 -3
- package/dist/esm/bs-chatbot-sources-drawer.entry.js +4 -2
- package/dist/esm/bs-chatbot-suggestion-button.entry.js +3 -3
- package/dist/esm/bs-checkbox-skeleton.entry.js +4 -2
- package/dist/esm/bs-checkbox.entry.js +1 -1
- package/dist/esm/bs-chip-filter.entry.js +1 -1
- package/dist/esm/bs-chip-informative.entry.js +1 -1
- package/dist/esm/bs-chip-input.entry.js +4 -2
- package/dist/esm/bs-citation-preview.entry.js +27 -0
- package/dist/esm/bs-composer-status-banner.entry.js +11 -3
- package/dist/esm/bs-composer.entry.js +36 -7
- package/dist/esm/bs-cookie-consent.entry.js +1 -1
- package/dist/esm/bs-data-table.entry.js +5 -3
- package/dist/esm/bs-datepicker.entry.js +1 -1
- package/dist/esm/bs-dialog.entry.js +4 -2
- package/dist/esm/bs-error-page.entry.js +1 -1
- package/dist/esm/bs-file-upload-item.entry.js +1 -1
- package/dist/esm/bs-file-upload.entry.js +1 -1
- package/dist/esm/bs-icon-button.entry.js +1 -1
- package/dist/esm/bs-icon-tile.entry.js +1 -1
- package/dist/esm/bs-inline-tab.entry.js +2 -2
- package/dist/esm/bs-input_3.entry.js +15 -7
- package/dist/esm/bs-logo.entry.js +1 -1
- package/dist/esm/bs-message-list.entry.js +69 -0
- package/dist/esm/bs-message.entry.js +23 -0
- package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
- package/dist/esm/bs-navigation-drawer.entry.js +9 -3
- package/dist/esm/bs-navigation-header.entry.js +2 -2
- package/dist/esm/bs-onboarding-checklist.entry.js +1 -1
- package/dist/esm/bs-pagination.entry.js +6 -2
- package/dist/esm/bs-popover.entry.js +151 -0
- package/dist/esm/bs-product-tour.entry.js +1 -1
- package/dist/esm/bs-progress-linear.entry.js +3 -3
- package/dist/esm/bs-progress.entry.js +3 -3
- package/dist/esm/bs-qr-code.entry.js +2 -2
- package/dist/esm/bs-radio.entry.js +2 -2
- package/dist/esm/bs-session-timeout.entry.js +2 -2
- package/dist/esm/bs-side-panel.entry.js +162 -0
- package/dist/esm/bs-skeleton.entry.js +49 -0
- package/dist/esm/bs-slider.entry.js +7 -3
- package/dist/esm/bs-snackbar.entry.js +2 -2
- package/dist/esm/bs-source-link.entry.js +3 -3
- package/dist/esm/bs-spinner.entry.js +22 -0
- package/dist/esm/bs-stepper-step.entry.js +2 -2
- package/dist/esm/bs-stepper.entry.js +2 -2
- package/dist/esm/bs-switch.entry.js +2 -2
- package/dist/esm/bs-tab_3.entry.js +4 -4
- package/dist/esm/bs-timepicker.entry.js +8 -4
- package/dist/esm/bs-toast.entry.js +4 -2
- package/dist/esm/bs-tooltip-trigger.entry.js +44 -0
- package/dist/esm/bs-tooltip.entry.js +2 -2
- package/dist/esm/bs-whats-new.entry.js +1 -1
- package/dist/esm/index-D3SkQJpw.js +1853 -0
- package/dist/esm/loader.js +3 -3
- package/dist/types/components/bs-accordion-group/bs-accordion-group.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-accordion-group/bs-accordion-group.d.ts +25 -0
- package/dist/types/components/bs-accordion-group/bs-accordion-group.stories.d.ts +9 -0
- package/dist/types/components/bs-attachment/bs-attachment.d.ts +4 -0
- package/dist/types/components/bs-button-skeleton/bs-button-skeleton.d.ts +2 -0
- package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.d.ts +16 -0
- package/dist/types/components/bs-chatbot-header/bs-chatbot-header.d.ts +19 -0
- package/dist/types/components/bs-chatbot-response-action/bs-chatbot-response-action.d.ts +22 -0
- package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.d.ts +2 -0
- package/dist/types/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.d.ts +2 -5
- package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.d.ts +2 -0
- package/dist/types/components/bs-chip/bs-chip-input/bs-chip-input.d.ts +2 -0
- package/dist/types/components/bs-citation-preview/bs-citation-preview.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-citation-preview/bs-citation-preview.d.ts +40 -0
- package/dist/types/components/bs-citation-preview/bs-citation-preview.stories.d.ts +13 -0
- package/dist/types/components/bs-composer/bs-composer.d.ts +25 -1
- package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.d.ts +5 -0
- package/dist/types/components/bs-data-table/bs-data-table.d.ts +2 -0
- package/dist/types/components/bs-dialog/bs-dialog.d.ts +2 -0
- package/dist/types/components/bs-input/bs-input.d.ts +8 -0
- package/dist/types/components/bs-message/bs-message.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-message/bs-message.d.ts +49 -0
- package/dist/types/components/bs-message/bs-message.stories.d.ts +15 -0
- package/dist/types/components/bs-message-list/bs-message-list.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-message-list/bs-message-list.d.ts +44 -0
- package/dist/types/components/bs-message-list/bs-message-list.stories.d.ts +8 -0
- package/dist/types/components/bs-pagination/bs-pagination.d.ts +4 -0
- package/dist/types/components/bs-popover/bs-popover.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-popover/bs-popover.d.ts +58 -0
- package/dist/types/components/bs-popover/bs-popover.stories.d.ts +11 -0
- package/dist/types/components/bs-side-panel/bs-side-panel.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-side-panel/bs-side-panel.d.ts +67 -0
- package/dist/types/components/bs-side-panel/bs-side-panel.stories.d.ts +14 -0
- package/dist/types/components/bs-skeleton/bs-skeleton.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-skeleton/bs-skeleton.d.ts +44 -0
- package/dist/types/components/bs-skeleton/bs-skeleton.stories.d.ts +17 -0
- package/dist/types/components/bs-slider/bs-slider.d.ts +4 -0
- package/dist/types/components/bs-spinner/bs-spinner.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-spinner/bs-spinner.d.ts +32 -0
- package/dist/types/components/bs-spinner/bs-spinner.stories.d.ts +12 -0
- package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +4 -0
- package/dist/types/components/bs-toast/bs-toast.d.ts +2 -0
- package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.d.ts +1 -0
- package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.d.ts +35 -0
- package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.d.ts +10 -0
- package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.d.ts +6 -0
- package/dist/types/components.d.ts +1778 -38
- package/dist/types/global/brand-theming.cmp.test.d.ts +1 -0
- package/package.json +21 -5
- package/reference.d.ts +242 -0
- package/reference.json +4176 -0
- package/reference.mjs +2 -0
- package/tailwind-preset.cjs +36 -0
- package/testing/vitest-setup.mjs +41 -0
- package/dist/brandsync-wc/p-09cbf05b.entry.js +0 -1
- package/dist/brandsync-wc/p-0f8cd2e8.entry.js +0 -1
- package/dist/brandsync-wc/p-1261f0b0.entry.js +0 -1
- package/dist/brandsync-wc/p-20030f4d.entry.js +0 -1
- package/dist/brandsync-wc/p-22f8201a.entry.js +0 -1
- package/dist/brandsync-wc/p-34e5feaf.entry.js +0 -1
- package/dist/brandsync-wc/p-452f9c1c.entry.js +0 -1
- package/dist/brandsync-wc/p-6a696161.entry.js +0 -1
- package/dist/brandsync-wc/p-6c6cdf77.entry.js +0 -1
- package/dist/brandsync-wc/p-6e735e37.entry.js +0 -1
- package/dist/brandsync-wc/p-73f214ed.entry.js +0 -1
- package/dist/brandsync-wc/p-823ab3b2.entry.js +0 -1
- package/dist/brandsync-wc/p-DqQRXQMx.js +0 -3
- package/dist/brandsync-wc/p-b84366a7.entry.js +0 -1
- package/dist/brandsync-wc/p-b8d2ce91.entry.js +0 -1
- package/dist/brandsync-wc/p-b9a4042e.entry.js +0 -1
- package/dist/brandsync-wc/p-d754ee13.entry.js +0 -1
- package/dist/brandsync-wc/p-d75f3f87.entry.js +0 -1
- package/dist/brandsync-wc/p-d8b29a53.entry.js +0 -1
- package/dist/brandsync-wc/p-f7d15fbe.entry.js +0 -1
- package/dist/cjs/index-tFJjflK5.js +0 -1863
- package/dist/components/p-BGW5q5LZ.js +0 -1
- package/dist/components/p-BZ3M4lOU.js +0 -1
- package/dist/components/p-CVrEuVFo.js +0 -1
- package/dist/components/p-CeUK3n7D.js +0 -1
- package/dist/esm/index-DqQRXQMx.js +0 -1853
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import { componentDescription, propDescription } from "../../stories-utils";
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Genie AI Components/bs-message',
|
|
5
|
+
parameters: { docs: { description: { component: componentDescription('bs-message') } } },
|
|
6
|
+
render: args => html `
|
|
7
|
+
<bs-message role=${args.role} timestamp=${args.timestamp} datetime=${args.datetime} status=${args.status}>
|
|
8
|
+
Here is a short answer to your question.
|
|
9
|
+
</bs-message>
|
|
10
|
+
`,
|
|
11
|
+
argTypes: {
|
|
12
|
+
role: { control: 'inline-radio', options: ['user', 'assistant'], description: propDescription('bs-message', 'role') },
|
|
13
|
+
timestamp: { control: 'text', description: propDescription('bs-message', 'timestamp') },
|
|
14
|
+
datetime: { control: 'text', description: propDescription('bs-message', 'datetime') },
|
|
15
|
+
status: { control: 'inline-radio', options: ['default', 'error', 'pending'], description: propDescription('bs-message', 'status') },
|
|
16
|
+
},
|
|
17
|
+
args: { role: 'assistant', timestamp: '10:42', datetime: '2026-01-01T10:42:00Z', status: 'default' },
|
|
18
|
+
};
|
|
19
|
+
export default meta;
|
|
20
|
+
export const Default = {};
|
|
21
|
+
export const User = { args: { role: 'user' } };
|
|
22
|
+
export const Pending = { args: { role: 'user', status: 'pending' } };
|
|
23
|
+
export const ErrorState = { name: 'Error', args: { role: 'user', status: 'error' } };
|
|
24
|
+
export const WithAvatarAndFooter = {
|
|
25
|
+
name: 'With avatar and footer',
|
|
26
|
+
render: args => html `
|
|
27
|
+
<bs-message role=${args.role} timestamp=${args.timestamp}>
|
|
28
|
+
<bs-avatar slot="avatar"></bs-avatar>
|
|
29
|
+
Here is a short answer to your question.
|
|
30
|
+
<bs-chatbot-response-action slot="footer"></bs-chatbot-response-action>
|
|
31
|
+
</bs-message>
|
|
32
|
+
`,
|
|
33
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { render, h, describe, it, expect } from "@stencil/vitest";
|
|
2
|
+
const nextMutation = () => new Promise(r => setTimeout(r, 0));
|
|
3
|
+
const tall = () => h("div", { style: { height: '300px' } });
|
|
4
|
+
const renderList = (extra = {}) => render(h("bs-message-list", { style: { display: 'block', height: '200px' }, ...extra }, tall(), tall()));
|
|
5
|
+
const viewportOf = (root) => root.shadowRoot.querySelector('.bs-message-list__viewport');
|
|
6
|
+
const scrollTo = (el, top) => {
|
|
7
|
+
el.scrollTop = top;
|
|
8
|
+
el.dispatchEvent(new Event('scroll'));
|
|
9
|
+
};
|
|
10
|
+
const appendMessage = async (root, waitForChanges) => {
|
|
11
|
+
root.appendChild(document.createElement('bs-message'));
|
|
12
|
+
await nextMutation();
|
|
13
|
+
await waitForChanges();
|
|
14
|
+
};
|
|
15
|
+
describe('bs-message-list', () => {
|
|
16
|
+
it('renders a polite log region', async () => {
|
|
17
|
+
const { root } = await renderList();
|
|
18
|
+
expect(root.shadowRoot.querySelector('[role="log"]')).toEqualAttribute('aria-live', 'polite');
|
|
19
|
+
});
|
|
20
|
+
it('does not show the scroll button initially', async () => {
|
|
21
|
+
const { root } = await renderList();
|
|
22
|
+
expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
it('shows the scroll button when new content arrives while scrolled up', async () => {
|
|
25
|
+
const { root, waitForChanges } = await renderList();
|
|
26
|
+
scrollTo(viewportOf(root), 0);
|
|
27
|
+
await appendMessage(root, waitForChanges);
|
|
28
|
+
const btn = root.shadowRoot.querySelector('[part="scroll-to-latest"]');
|
|
29
|
+
expect(btn).not.toBeNull();
|
|
30
|
+
expect(btn.ariaLabel).toBe('Scroll to latest message');
|
|
31
|
+
});
|
|
32
|
+
it('does not show the button when the user is near the bottom', async () => {
|
|
33
|
+
const { root, waitForChanges } = await renderList();
|
|
34
|
+
const viewport = viewportOf(root);
|
|
35
|
+
scrollTo(viewport, viewport.scrollHeight);
|
|
36
|
+
await appendMessage(root, waitForChanges);
|
|
37
|
+
expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
it('uses a custom scrollToLatestLabel', async () => {
|
|
40
|
+
const { root, waitForChanges } = await renderList({ 'scroll-to-latest-label': 'Jump down' });
|
|
41
|
+
scrollTo(viewportOf(root), 0);
|
|
42
|
+
await appendMessage(root, waitForChanges);
|
|
43
|
+
const btn = root.shadowRoot.querySelector('[part="scroll-to-latest"]');
|
|
44
|
+
expect(btn.ariaLabel).toBe('Jump down');
|
|
45
|
+
});
|
|
46
|
+
it('scrollToLatest() scrolls, hides the button and emits bsScrollToLatest', async () => {
|
|
47
|
+
const { root, waitForChanges, spyOnEvent } = await renderList();
|
|
48
|
+
const spy = spyOnEvent('bsScrollToLatest');
|
|
49
|
+
const viewport = viewportOf(root);
|
|
50
|
+
scrollTo(viewport, 0);
|
|
51
|
+
await appendMessage(root, waitForChanges);
|
|
52
|
+
await root.scrollToLatest();
|
|
53
|
+
await waitForChanges();
|
|
54
|
+
expect(viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight).toBeLessThanOrEqual(1);
|
|
55
|
+
expect(spy).toHaveReceivedEventTimes(1);
|
|
56
|
+
expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
position: relative;
|
|
4
|
+
min-height: 0;
|
|
5
|
+
--bs-message-list-gap: var(--bs-spacing-200);
|
|
6
|
+
--bs-message-list-padding: var(--bs-spacing-200);
|
|
7
|
+
--bs-message-list-button-offset: var(--bs-spacing-200);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.bs-message-list {
|
|
11
|
+
position: relative;
|
|
12
|
+
height: 100%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.bs-message-list__viewport {
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
gap: var(--bs-message-list-gap);
|
|
20
|
+
height: 100%;
|
|
21
|
+
padding: var(--bs-message-list-padding);
|
|
22
|
+
overflow-y: auto;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Messages keep their natural height and the viewport scrolls, instead of flex-shrinking them. */
|
|
26
|
+
::slotted(*) {
|
|
27
|
+
flex-shrink: 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.bs-message-list__viewport:focus-visible {
|
|
31
|
+
outline: 2px solid var(--bs-border-neutral-focus);
|
|
32
|
+
outline-offset: -2px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.bs-message-list__scroll {
|
|
36
|
+
position: absolute;
|
|
37
|
+
inset-block-end: var(--bs-message-list-button-offset);
|
|
38
|
+
inset-inline-start: 50%;
|
|
39
|
+
transform: translateX(-50%);
|
|
40
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { h } from "@stencil/core";
|
|
2
|
+
/** Distance (px) from the bottom within which the list counts as "at the bottom". */
|
|
3
|
+
const NEAR_BOTTOM_THRESHOLD = 48;
|
|
4
|
+
/**
|
|
5
|
+
* Scrollable chat transcript container (`role="log"`, `aria-live="polite"`) for `bs-message`
|
|
6
|
+
* children. It keeps itself pinned to the newest message while the user is near the bottom; when
|
|
7
|
+
* the user has scrolled up and new content arrives, it shows a "scroll to latest" button instead
|
|
8
|
+
* of yanking the viewport.
|
|
9
|
+
*
|
|
10
|
+
* Composed from: `bs-icon-button` (the scroll-to-latest control).
|
|
11
|
+
*
|
|
12
|
+
* ## When to use
|
|
13
|
+
* - Holding the messages of a chat conversation.
|
|
14
|
+
*
|
|
15
|
+
* ## When not to use
|
|
16
|
+
* - For generic scrollable lists -- this is built around append-at-the-bottom transcripts.
|
|
17
|
+
*
|
|
18
|
+
* @slot - `bs-message` elements.
|
|
19
|
+
* @part viewport - The scrollable region.
|
|
20
|
+
* @part scroll-to-latest - The scroll-to-latest `bs-icon-button`.
|
|
21
|
+
* @prop --bs-message-list-gap - Gap between messages. Aliased to `--bs-spacing-200`.
|
|
22
|
+
* @prop --bs-message-list-padding - Padding inside the scroll area. Aliased to `--bs-spacing-200`.
|
|
23
|
+
* @prop --bs-message-list-button-offset - Distance of the scroll-to-latest button from the bottom edge. Aliased to `--bs-spacing-200`.
|
|
24
|
+
*/
|
|
25
|
+
export class BsMessageList {
|
|
26
|
+
host;
|
|
27
|
+
/** Accessible name of the scroll-to-latest button. */
|
|
28
|
+
scrollToLatestLabel = 'Scroll to latest message';
|
|
29
|
+
/** True while the user is scrolled away from the bottom and new content has arrived. */
|
|
30
|
+
showScrollButton = false;
|
|
31
|
+
/** Fires when the scroll-to-latest button is activated or `scrollToLatest()` is called. */
|
|
32
|
+
bsScrollToLatest;
|
|
33
|
+
viewport;
|
|
34
|
+
observer;
|
|
35
|
+
stickToBottom = true;
|
|
36
|
+
/** Scrolls to the newest message and re-enables auto-follow. */
|
|
37
|
+
async scrollToLatest() {
|
|
38
|
+
this.scrollToBottom();
|
|
39
|
+
this.stickToBottom = true;
|
|
40
|
+
this.showScrollButton = false;
|
|
41
|
+
this.bsScrollToLatest.emit();
|
|
42
|
+
}
|
|
43
|
+
connectedCallback() {
|
|
44
|
+
this.observer = new MutationObserver(this.onMutation);
|
|
45
|
+
this.observer.observe(this.host, { childList: true, subtree: true, characterData: true });
|
|
46
|
+
}
|
|
47
|
+
disconnectedCallback() {
|
|
48
|
+
this.observer?.disconnect();
|
|
49
|
+
this.observer = undefined;
|
|
50
|
+
}
|
|
51
|
+
componentDidLoad() {
|
|
52
|
+
this.scrollToBottom();
|
|
53
|
+
}
|
|
54
|
+
isNearBottom() {
|
|
55
|
+
const v = this.viewport;
|
|
56
|
+
if (!v)
|
|
57
|
+
return true;
|
|
58
|
+
return v.scrollHeight - v.scrollTop - v.clientHeight <= NEAR_BOTTOM_THRESHOLD;
|
|
59
|
+
}
|
|
60
|
+
scrollToBottom() {
|
|
61
|
+
if (this.viewport)
|
|
62
|
+
this.viewport.scrollTop = this.viewport.scrollHeight;
|
|
63
|
+
}
|
|
64
|
+
onScroll = () => {
|
|
65
|
+
this.stickToBottom = this.isNearBottom();
|
|
66
|
+
if (this.stickToBottom)
|
|
67
|
+
this.showScrollButton = false;
|
|
68
|
+
};
|
|
69
|
+
onMutation = () => {
|
|
70
|
+
if (this.stickToBottom) {
|
|
71
|
+
this.scrollToBottom();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.showScrollButton = true;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
render() {
|
|
78
|
+
return (h("div", { key: '3298d4991c4c335e7efcff0e363a8c097452c832', class: "bs-message-list" }, h("div", { key: '7ad06a6bce1ae78b1a0779172d479c9f46a08e9b', part: "viewport", class: "bs-message-list__viewport", role: "log", "aria-live": "polite", tabindex: "0", ref: el => (this.viewport = el), onScroll: this.onScroll }, h("slot", { key: '274329a2ffa9207023177bca19a44d029150511c' })), this.showScrollButton && (h("bs-icon-button", { key: '7aff39c002edca1724ab94add005431f7e453b57', part: "scroll-to-latest", class: "bs-message-list__scroll", variant: "neutral", ariaLabel: this.scrollToLatestLabel, onClick: () => this.scrollToLatest() }, h("svg", { key: '85d406797de8e14957f078fa9ca3e9f5947c2586', width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true" }, h("path", { key: '4dd14212d3c5501ab6be3aae51e1cc80f143bf8a', d: "M8 3v10M3.5 8.5L8 13l4.5-4.5", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }))))));
|
|
79
|
+
}
|
|
80
|
+
static get is() { return "bs-message-list"; }
|
|
81
|
+
static get encapsulation() { return "shadow"; }
|
|
82
|
+
static get originalStyleUrls() {
|
|
83
|
+
return {
|
|
84
|
+
"$": ["bs-message-list.css"]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
static get styleUrls() {
|
|
88
|
+
return {
|
|
89
|
+
"$": ["bs-message-list.css"]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
static get properties() {
|
|
93
|
+
return {
|
|
94
|
+
"scrollToLatestLabel": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"mutable": false,
|
|
97
|
+
"complexType": {
|
|
98
|
+
"original": "string",
|
|
99
|
+
"resolved": "string",
|
|
100
|
+
"references": {}
|
|
101
|
+
},
|
|
102
|
+
"required": false,
|
|
103
|
+
"optional": false,
|
|
104
|
+
"docs": {
|
|
105
|
+
"tags": [],
|
|
106
|
+
"text": "Accessible name of the scroll-to-latest button."
|
|
107
|
+
},
|
|
108
|
+
"getter": false,
|
|
109
|
+
"setter": false,
|
|
110
|
+
"reflect": false,
|
|
111
|
+
"attribute": "scroll-to-latest-label",
|
|
112
|
+
"defaultValue": "'Scroll to latest message'"
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
static get states() {
|
|
117
|
+
return {
|
|
118
|
+
"showScrollButton": {}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
static get events() {
|
|
122
|
+
return [{
|
|
123
|
+
"method": "bsScrollToLatest",
|
|
124
|
+
"name": "bsScrollToLatest",
|
|
125
|
+
"bubbles": true,
|
|
126
|
+
"cancelable": true,
|
|
127
|
+
"composed": true,
|
|
128
|
+
"docs": {
|
|
129
|
+
"tags": [],
|
|
130
|
+
"text": "Fires when the scroll-to-latest button is activated or `scrollToLatest()` is called."
|
|
131
|
+
},
|
|
132
|
+
"complexType": {
|
|
133
|
+
"original": "void",
|
|
134
|
+
"resolved": "void",
|
|
135
|
+
"references": {}
|
|
136
|
+
}
|
|
137
|
+
}];
|
|
138
|
+
}
|
|
139
|
+
static get methods() {
|
|
140
|
+
return {
|
|
141
|
+
"scrollToLatest": {
|
|
142
|
+
"complexType": {
|
|
143
|
+
"signature": "() => Promise<void>",
|
|
144
|
+
"parameters": [],
|
|
145
|
+
"references": {
|
|
146
|
+
"Promise": {
|
|
147
|
+
"location": "global",
|
|
148
|
+
"id": "global::Promise"
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"return": "Promise<void>"
|
|
152
|
+
},
|
|
153
|
+
"docs": {
|
|
154
|
+
"text": "Scrolls to the newest message and re-enables auto-follow.",
|
|
155
|
+
"tags": []
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
static get elementRef() { return "host"; }
|
|
161
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import { componentDescription, propDescription } from "../../stories-utils";
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Genie AI Components/bs-message-list',
|
|
5
|
+
parameters: { docs: { description: { component: componentDescription('bs-message-list') } } },
|
|
6
|
+
render: args => html `
|
|
7
|
+
<bs-message-list scroll-to-latest-label=${args.scrollToLatestLabel} style="height: 320px; border: 1px solid var(--bs-border-default);">
|
|
8
|
+
${Array.from({ length: 12 }, (_, i) => html `<bs-message role=${i % 2 ? 'assistant' : 'user'} timestamp="10:${String(i).padStart(2, '0')}">Message number ${i + 1}</bs-message>`)}
|
|
9
|
+
</bs-message-list>
|
|
10
|
+
`,
|
|
11
|
+
argTypes: {
|
|
12
|
+
scrollToLatestLabel: { control: 'text', description: propDescription('bs-message-list', 'scrollToLatestLabel') },
|
|
13
|
+
},
|
|
14
|
+
args: { scrollToLatestLabel: 'Scroll to latest message' },
|
|
15
|
+
};
|
|
16
|
+
export default meta;
|
|
17
|
+
export const Default = {};
|
|
@@ -99,4 +99,9 @@ describe('bs-pagination', () => {
|
|
|
99
99
|
expect(root.shadowRoot.querySelector('[part="prev"]')).toEqualAttribute('aria-label', 'Go back');
|
|
100
100
|
expect(root.shadowRoot.querySelector('[part="next"]')).toEqualAttribute('aria-label', 'Go forward');
|
|
101
101
|
});
|
|
102
|
+
it('applies navLabel and pageLabel overrides', async () => {
|
|
103
|
+
const { root } = await render(h("bs-pagination", { totalPages: 5, navLabel: "Sidenummerering", pageLabel: "G\u00E5 til side" }));
|
|
104
|
+
expect(root.shadowRoot.querySelector('nav')).toEqualAttribute('aria-label', 'Sidenummerering');
|
|
105
|
+
expect(root.shadowRoot.querySelector('[aria-label="Gå til side 2"]')).not.toBeNull();
|
|
106
|
+
});
|
|
102
107
|
});
|
|
@@ -36,6 +36,10 @@ export class BsPagination {
|
|
|
36
36
|
* into `...`. `1` (the default) reproduces the Figma spec's example exactly (page 1 of 12 shows
|
|
37
37
|
* `1 2 3 ... 12`). */
|
|
38
38
|
siblingCount = 1;
|
|
39
|
+
/** Accessible name of the pagination landmark. */
|
|
40
|
+
navLabel = 'Pagination';
|
|
41
|
+
/** Prefix of each page button's accessible name ("Go to page 3"). */
|
|
42
|
+
pageLabel = 'Go to page';
|
|
39
43
|
/** Accessible name for the previous-page button. */
|
|
40
44
|
previousLabel = 'Previous page';
|
|
41
45
|
/** Accessible name for the next-page button. */
|
|
@@ -87,7 +91,7 @@ export class BsPagination {
|
|
|
87
91
|
}
|
|
88
92
|
render() {
|
|
89
93
|
const pageList = this.getPageList();
|
|
90
|
-
return (h("nav", { key: '
|
|
94
|
+
return (h("nav", { key: 'e5a681ef3a6ad9256b7d86bca4848f07f45bd68c', "aria-label": this.navLabel }, h("ul", { key: '6e7c8b544db575ac9681d56f2a328e63965f6f8e', part: "list", class: "bs-pagination__list" }, h("li", { key: 'd9d899eaa3ab46136a8d8f0d7807ff47142241a7', part: "item", class: "bs-pagination__item" }, h("button", { key: '534929e47bac4665187919708832743de124769f', part: "prev", type: "button", class: "bs-pagination__control", "aria-label": this.previousLabel, disabled: this.currentPage <= 1, onClick: () => this.goToPage(this.currentPage - 1) }, h(ChevronLeftIcon, { key: 'badb293c1e204d4a6d95773ec841a9ea187d7461' }))), pageList.map((item, index) => item === 'ellipsis' ? (h("li", { part: "item", class: "bs-pagination__item", key: `ellipsis-${index}` }, h("span", { part: "ellipsis", class: "bs-pagination__ellipsis", "aria-hidden": "true" }, h(EllipsisIcon, null)))) : (h("li", { part: "item", class: "bs-pagination__item", key: item }, h("button", { part: item === this.currentPage ? 'page current' : 'page', type: "button", class: `bs-pagination__control bs-pagination__page ${item === this.currentPage ? 'bs-pagination__page--current' : ''}`, "aria-label": `${this.pageLabel} ${item}`, "aria-current": item === this.currentPage ? 'page' : undefined, onClick: () => this.goToPage(item) }, item)))), h("li", { key: 'b0b053124a350cf380b2e4482d658bdd3b990312', part: "item", class: "bs-pagination__item" }, h("button", { key: '9c1fa207fd0d1989e19da1e3e55c057b3ba17cb6', part: "next", type: "button", class: "bs-pagination__control", "aria-label": this.nextLabel, disabled: this.currentPage >= this.safeTotalPages, onClick: () => this.goToPage(this.currentPage + 1) }, h(ChevronRightIcon, { key: '437791d5fe13908ce80632783bdce7afc660876c' }))))));
|
|
91
95
|
}
|
|
92
96
|
static get is() { return "bs-pagination"; }
|
|
93
97
|
static get encapsulation() { return "shadow"; }
|
|
@@ -163,6 +167,46 @@ export class BsPagination {
|
|
|
163
167
|
"attribute": "sibling-count",
|
|
164
168
|
"defaultValue": "1"
|
|
165
169
|
},
|
|
170
|
+
"navLabel": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"mutable": false,
|
|
173
|
+
"complexType": {
|
|
174
|
+
"original": "string",
|
|
175
|
+
"resolved": "string",
|
|
176
|
+
"references": {}
|
|
177
|
+
},
|
|
178
|
+
"required": false,
|
|
179
|
+
"optional": false,
|
|
180
|
+
"docs": {
|
|
181
|
+
"tags": [],
|
|
182
|
+
"text": "Accessible name of the pagination landmark."
|
|
183
|
+
},
|
|
184
|
+
"getter": false,
|
|
185
|
+
"setter": false,
|
|
186
|
+
"reflect": false,
|
|
187
|
+
"attribute": "nav-label",
|
|
188
|
+
"defaultValue": "'Pagination'"
|
|
189
|
+
},
|
|
190
|
+
"pageLabel": {
|
|
191
|
+
"type": "string",
|
|
192
|
+
"mutable": false,
|
|
193
|
+
"complexType": {
|
|
194
|
+
"original": "string",
|
|
195
|
+
"resolved": "string",
|
|
196
|
+
"references": {}
|
|
197
|
+
},
|
|
198
|
+
"required": false,
|
|
199
|
+
"optional": false,
|
|
200
|
+
"docs": {
|
|
201
|
+
"tags": [],
|
|
202
|
+
"text": "Prefix of each page button's accessible name (\"Go to page 3\")."
|
|
203
|
+
},
|
|
204
|
+
"getter": false,
|
|
205
|
+
"setter": false,
|
|
206
|
+
"reflect": false,
|
|
207
|
+
"attribute": "page-label",
|
|
208
|
+
"defaultValue": "'Go to page'"
|
|
209
|
+
},
|
|
166
210
|
"previousLabel": {
|
|
167
211
|
"type": "string",
|
|
168
212
|
"mutable": false,
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { render, h, describe, it, expect } from "@stencil/vitest";
|
|
2
|
+
const setup = () => render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", null, "Content")));
|
|
3
|
+
describe('bs-popover', () => {
|
|
4
|
+
it('is closed by default with aria wiring on the trigger wrapper', async () => {
|
|
5
|
+
const { root } = await setup();
|
|
6
|
+
const trigger = root.shadowRoot.querySelector('[part="trigger"]');
|
|
7
|
+
const popup = root.shadowRoot.querySelector('[part="popup"]');
|
|
8
|
+
expect(trigger).toEqualAttribute('aria-expanded', 'false');
|
|
9
|
+
expect(trigger).toEqualAttribute('aria-haspopup', 'true');
|
|
10
|
+
expect(trigger.getAttribute('aria-controls')).toBe(popup.id);
|
|
11
|
+
expect(popup.hasAttribute('hidden')).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it('toggles on trigger click and emits bsOpenChange', async () => {
|
|
14
|
+
const { root, waitForChanges, spyOnEvent } = await setup();
|
|
15
|
+
const spy = spyOnEvent('bsOpenChange');
|
|
16
|
+
const trigger = root.shadowRoot.querySelector('[part="trigger"]');
|
|
17
|
+
trigger.click();
|
|
18
|
+
await waitForChanges();
|
|
19
|
+
expect(root.open).toBe(true);
|
|
20
|
+
expect(root).toHaveAttribute('open');
|
|
21
|
+
expect(trigger).toEqualAttribute('aria-expanded', 'true');
|
|
22
|
+
expect(spy).toHaveReceivedEventDetail(true);
|
|
23
|
+
trigger.click();
|
|
24
|
+
await waitForChanges();
|
|
25
|
+
expect(root.open).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('closes on outside click', async () => {
|
|
28
|
+
const { root, waitForChanges } = await setup();
|
|
29
|
+
root.open = true;
|
|
30
|
+
await waitForChanges();
|
|
31
|
+
document.body.click();
|
|
32
|
+
await waitForChanges();
|
|
33
|
+
expect(root.open).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it('stays open when clicking inside the popup', async () => {
|
|
36
|
+
const { root, waitForChanges } = await setup();
|
|
37
|
+
root.open = true;
|
|
38
|
+
await waitForChanges();
|
|
39
|
+
root.querySelector('div').click();
|
|
40
|
+
await waitForChanges();
|
|
41
|
+
expect(root.open).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('closes on Escape and returns focus to the trigger', async () => {
|
|
44
|
+
const { root, waitForChanges } = await setup();
|
|
45
|
+
root.open = true;
|
|
46
|
+
await waitForChanges();
|
|
47
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
48
|
+
await waitForChanges();
|
|
49
|
+
expect(root.open).toBe(false);
|
|
50
|
+
expect(document.activeElement).toBe(root.querySelector('button'));
|
|
51
|
+
});
|
|
52
|
+
it('defaults placement to bottom-start', async () => {
|
|
53
|
+
const { root } = await setup();
|
|
54
|
+
expect(root.placement).toBe('bottom-start');
|
|
55
|
+
});
|
|
56
|
+
it('moves focus to the first focusable element in the popup on open', async () => {
|
|
57
|
+
const { root, waitForChanges } = await render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", null, h("button", { id: "first" }, "One"))));
|
|
58
|
+
root.open = true;
|
|
59
|
+
await waitForChanges();
|
|
60
|
+
expect(document.activeElement).toBe(root.querySelector('#first'));
|
|
61
|
+
root.open = false;
|
|
62
|
+
await waitForChanges();
|
|
63
|
+
expect(document.activeElement).toBe(root.querySelector('button[slot="trigger"]'));
|
|
64
|
+
});
|
|
65
|
+
it('focuses the popup container when nothing inside is focusable', async () => {
|
|
66
|
+
const { root, waitForChanges } = await setup();
|
|
67
|
+
root.open = true;
|
|
68
|
+
await waitForChanges();
|
|
69
|
+
expect(root.shadowRoot.activeElement).toBe(root.shadowRoot.querySelector('[part="popup"]'));
|
|
70
|
+
});
|
|
71
|
+
it('opens and focuses on ArrowDown from the trigger', async () => {
|
|
72
|
+
const { root, waitForChanges } = await render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("button", { id: "item" }, "Item")));
|
|
73
|
+
const trigger = root.shadowRoot.querySelector('[part="trigger"]');
|
|
74
|
+
const ev = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true });
|
|
75
|
+
trigger.dispatchEvent(ev);
|
|
76
|
+
await waitForChanges();
|
|
77
|
+
expect(ev.defaultPrevented).toBe(true);
|
|
78
|
+
expect(root.open).toBe(true);
|
|
79
|
+
expect(document.activeElement).toBe(root.querySelector('#item'));
|
|
80
|
+
});
|
|
81
|
+
it('reflects data-placement and keeps the preferred side when there is room', async () => {
|
|
82
|
+
const { root, waitForChanges } = await render(h("div", { style: { paddingTop: '200px', paddingLeft: '200px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '50px', width: '100px' } }, "Content"))));
|
|
83
|
+
const pop = root.querySelector('bs-popover');
|
|
84
|
+
pop.open = true;
|
|
85
|
+
await waitForChanges();
|
|
86
|
+
expect(pop.getAttribute('data-placement')).toBe('bottom-start');
|
|
87
|
+
});
|
|
88
|
+
it('flips to top when the popup would overflow the bottom of the viewport', async () => {
|
|
89
|
+
const { root, waitForChanges } = await render(h("div", { style: { position: 'fixed', left: '20px', bottom: '10px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '150px', width: '100px' } }, "Content"))));
|
|
90
|
+
const pop = root.querySelector('bs-popover');
|
|
91
|
+
pop.open = true;
|
|
92
|
+
await waitForChanges();
|
|
93
|
+
expect(pop.getAttribute('data-placement')).toBe('top-start');
|
|
94
|
+
const rect = pop.shadowRoot.querySelector('[part="popup"]').getBoundingClientRect();
|
|
95
|
+
expect(rect.bottom).toBeLessThanOrEqual(window.innerHeight);
|
|
96
|
+
});
|
|
97
|
+
it('flips to end alignment when overflowing the right edge, and re-measures on resize', async () => {
|
|
98
|
+
const { root, waitForChanges } = await render(h("div", { style: { position: 'fixed', right: '10px', top: '20px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '40px', width: '300px' } }, "Content"))));
|
|
99
|
+
const pop = root.querySelector('bs-popover');
|
|
100
|
+
pop.open = true;
|
|
101
|
+
await waitForChanges();
|
|
102
|
+
expect(pop.getAttribute('data-placement')).toBe('bottom-end');
|
|
103
|
+
window.dispatchEvent(new Event('resize'));
|
|
104
|
+
await waitForChanges();
|
|
105
|
+
expect(pop.getAttribute('data-placement')).toBe('bottom-end');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: inline-block;
|
|
3
|
+
position: relative;
|
|
4
|
+
--bs-popover-bg: var(--bs-surface-raised);
|
|
5
|
+
--bs-popover-radius: var(--bs-border-radius-100);
|
|
6
|
+
--bs-popover-shadow: var(--bs-shadow-md);
|
|
7
|
+
--bs-popover-offset: var(--bs-spacing-100);
|
|
8
|
+
--bs-popover-min-width: var(--bs-scale-1600);
|
|
9
|
+
--bs-popover-z-index: var(--bs-z-index-popover);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.bs-popover__trigger {
|
|
13
|
+
display: inline-block;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.bs-popover__popup {
|
|
17
|
+
position: absolute;
|
|
18
|
+
z-index: var(--bs-popover-z-index);
|
|
19
|
+
min-width: var(--bs-popover-min-width);
|
|
20
|
+
background: var(--bs-popover-bg);
|
|
21
|
+
border-radius: var(--bs-popover-radius);
|
|
22
|
+
box-shadow: var(--bs-popover-shadow);
|
|
23
|
+
top: calc(100% + var(--bs-popover-offset));
|
|
24
|
+
left: 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.bs-popover__popup {
|
|
28
|
+
outline: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.bs-popover__popup[hidden] {
|
|
32
|
+
display: none;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:host([data-placement='bottom-start']) .bs-popover__popup {
|
|
36
|
+
top: calc(100% + var(--bs-popover-offset));
|
|
37
|
+
bottom: auto;
|
|
38
|
+
left: 0;
|
|
39
|
+
right: auto;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:host([data-placement='bottom-end']) .bs-popover__popup {
|
|
43
|
+
top: calc(100% + var(--bs-popover-offset));
|
|
44
|
+
bottom: auto;
|
|
45
|
+
left: auto;
|
|
46
|
+
right: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:host([data-placement='top-start']) .bs-popover__popup {
|
|
50
|
+
top: auto;
|
|
51
|
+
left: 0;
|
|
52
|
+
right: auto;
|
|
53
|
+
bottom: calc(100% + var(--bs-popover-offset));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:host([data-placement='top-end']) .bs-popover__popup {
|
|
57
|
+
top: auto;
|
|
58
|
+
left: auto;
|
|
59
|
+
right: 0;
|
|
60
|
+
bottom: calc(100% + var(--bs-popover-offset));
|
|
61
|
+
}
|