bromcom-ui-next 0.1.30 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bromcom-ui/bcm-accordion-group.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-accordion.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-alert.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-avatar.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-badge.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-basic-badge.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-button-group.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-button.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-checkbox.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-chip.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-divider.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-drawer.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-dropdown-item.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-dropdown.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-file-upload.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-input.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-linked.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-modal.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-pop-confirm.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-popover.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-radio-group.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-radio.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-segment.bcm-segmented-picker.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-shortcut.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-switch.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-tab.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-tabs.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-text.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-textarea.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-tooltip.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
- package/dist/bromcom-ui/global/global.js +33 -30
- package/dist/bromcom-ui/p-010219cf.entry.js +2 -0
- package/dist/bromcom-ui/p-010219cf.entry.js.map +1 -0
- package/dist/bromcom-ui/p-01a4e00b.entry.js +2 -0
- package/dist/bromcom-ui/p-01a4e00b.entry.js.map +1 -0
- package/dist/bromcom-ui/p-14c63d61.entry.js +2 -0
- package/dist/bromcom-ui/p-14c63d61.entry.js.map +1 -0
- package/dist/bromcom-ui/p-20a94dec.entry.js +2 -0
- package/dist/bromcom-ui/p-20a94dec.entry.js.map +1 -0
- package/dist/bromcom-ui/p-398620c2.entry.js +2 -0
- package/dist/bromcom-ui/p-398620c2.entry.js.map +1 -0
- package/dist/bromcom-ui/p-3b898f90.entry.js +2 -0
- package/dist/bromcom-ui/p-3b898f90.entry.js.map +1 -0
- package/dist/bromcom-ui/p-43c85c84.entry.js +2 -0
- package/dist/bromcom-ui/p-43c85c84.entry.js.map +1 -0
- package/dist/bromcom-ui/p-4e6661a5.entry.js +2 -0
- package/dist/bromcom-ui/p-4e6661a5.entry.js.map +1 -0
- package/dist/bromcom-ui/p-52bb0cdc.entry.js +2 -0
- package/dist/bromcom-ui/p-52bb0cdc.entry.js.map +1 -0
- package/dist/bromcom-ui/p-61c1c1c8.entry.js +2 -0
- package/dist/bromcom-ui/p-61c1c1c8.entry.js.map +1 -0
- package/dist/bromcom-ui/p-82e4c5f2.entry.js +2 -0
- package/dist/bromcom-ui/p-82e4c5f2.entry.js.map +1 -0
- package/dist/bromcom-ui/p-86f85963.entry.js +2 -0
- package/dist/bromcom-ui/p-86f85963.entry.js.map +1 -0
- package/dist/bromcom-ui/p-9249c1d1.entry.js +2 -0
- package/dist/bromcom-ui/p-9249c1d1.entry.js.map +1 -0
- package/dist/bromcom-ui/p-B6Ppbs5O.js +3 -0
- package/dist/bromcom-ui/p-B6Ppbs5O.js.map +1 -0
- package/dist/bromcom-ui/p-DBDSgIvP.js +2 -0
- package/dist/bromcom-ui/p-DBDSgIvP.js.map +1 -0
- package/dist/bromcom-ui/p-DaE0ZLar.js +2 -0
- package/dist/bromcom-ui/p-DaE0ZLar.js.map +1 -0
- package/dist/bromcom-ui/p-a25d1cef.entry.js +2 -0
- package/dist/bromcom-ui/p-a25d1cef.entry.js.map +1 -0
- package/dist/bromcom-ui/p-a4cb2e79.entry.js +2 -0
- package/dist/bromcom-ui/p-a4cb2e79.entry.js.map +1 -0
- package/dist/bromcom-ui/p-a68925b4.entry.js +2 -0
- package/dist/bromcom-ui/p-a68925b4.entry.js.map +1 -0
- package/dist/bromcom-ui/p-a750186c.entry.js +2 -0
- package/dist/bromcom-ui/p-a750186c.entry.js.map +1 -0
- package/dist/bromcom-ui/p-ac768b56.entry.js +2 -0
- package/dist/bromcom-ui/p-ac768b56.entry.js.map +1 -0
- package/dist/bromcom-ui/p-b0b193e6.entry.js +2 -0
- package/dist/bromcom-ui/p-b0b193e6.entry.js.map +1 -0
- package/dist/bromcom-ui/p-bf4409ca.entry.js +2 -0
- package/dist/bromcom-ui/p-bf4409ca.entry.js.map +1 -0
- package/dist/bromcom-ui/p-c57fb29b.entry.js +2 -0
- package/dist/bromcom-ui/p-c57fb29b.entry.js.map +1 -0
- package/dist/bromcom-ui/{p-1507908f.entry.js → p-ccc310aa.entry.js} +2 -2
- package/dist/bromcom-ui/p-ccc310aa.entry.js.map +1 -0
- package/dist/bromcom-ui/p-d4ee962d.entry.js +2 -0
- package/dist/bromcom-ui/p-d4ee962d.entry.js.map +1 -0
- package/dist/bromcom-ui/p-e25a2f7a.entry.js +2 -0
- package/dist/bromcom-ui/p-e25a2f7a.entry.js.map +1 -0
- package/dist/bromcom-ui/p-e5b0b2ad.entry.js +2 -0
- package/dist/bromcom-ui/p-e5b0b2ad.entry.js.map +1 -0
- package/dist/bromcom-ui/p-e70d784d.entry.js +2 -0
- package/dist/bromcom-ui/p-e70d784d.entry.js.map +1 -0
- package/dist/bromcom-ui/p-e9fa3a22.entry.js +2 -0
- package/dist/bromcom-ui/p-e9fa3a22.entry.js.map +1 -0
- package/dist/bromcom-ui/p-ef281184.entry.js +2 -0
- package/dist/bromcom-ui/p-ef281184.entry.js.map +1 -0
- package/dist/bromcom-ui/{p-496014ca.entry.js → p-fb6f616c.entry.js} +2 -2
- package/dist/bromcom-ui/p-fb6f616c.entry.js.map +1 -0
- package/dist/bromcom-ui/p-fd31c70c.entry.js +2 -0
- package/dist/bromcom-ui/p-fd31c70c.entry.js.map +1 -0
- package/dist/bromcom-ui/p-nf_HKsGq.js +2 -0
- package/dist/bromcom-ui/{p-CUvT12BL.js.map → p-nf_HKsGq.js.map} +1 -1
- package/dist/cjs/base-choice-control-EmA4JRjR.js +54 -0
- package/dist/cjs/base-choice-control-EmA4JRjR.js.map +1 -0
- package/dist/cjs/bcm-accordion-group.cjs.entry.js +20 -18
- package/dist/cjs/bcm-accordion-group.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-accordion.cjs.entry.js +73 -56
- package/dist/cjs/bcm-accordion.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-alert.cjs.entry.js +21 -21
- package/dist/cjs/bcm-alert.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-avatar.cjs.entry.js +22 -12
- package/dist/cjs/bcm-avatar.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-badge.cjs.entry.js +114 -82
- package/dist/cjs/bcm-badge.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-basic-badge.cjs.entry.js +73 -59
- package/dist/cjs/bcm-basic-badge.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-button-group.cjs.entry.js +36 -24
- package/dist/cjs/bcm-button-group.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-button.cjs.entry.js +338 -0
- package/dist/cjs/bcm-button.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-checkbox.cjs.entry.js +284 -174
- package/dist/cjs/bcm-checkbox.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-chip.cjs.entry.js +38 -35
- package/dist/cjs/bcm-chip.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-divider.cjs.entry.js +55 -55
- package/dist/cjs/bcm-divider.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-drawer.cjs.entry.js +332 -0
- package/dist/cjs/bcm-drawer.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-dropdown-item.cjs.entry.js +36 -33
- package/dist/cjs/bcm-dropdown-item.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-dropdown.cjs.entry.js +18 -17
- package/dist/cjs/bcm-dropdown.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-file-upload.cjs.entry.js +552 -0
- package/dist/cjs/bcm-file-upload.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-input.cjs.entry.js +250 -158
- package/dist/cjs/bcm-input.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-linked.cjs.entry.js +452 -0
- package/dist/cjs/bcm-linked.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-modal.cjs.entry.js +360 -0
- package/dist/cjs/bcm-modal.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-pop-confirm.cjs.entry.js +381 -0
- package/dist/cjs/bcm-pop-confirm.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-popover.cjs.entry.js +451 -0
- package/dist/cjs/bcm-popover.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-radio-group.cjs.entry.js +103 -80
- package/dist/cjs/bcm-radio-group.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-radio.cjs.entry.js +239 -106
- package/dist/cjs/bcm-radio.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-segment.bcm-segmented-picker.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-segment_2.cjs.entry.js +335 -0
- package/dist/cjs/bcm-shortcut.cjs.entry.js +5 -4
- package/dist/cjs/bcm-shortcut.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-switch.cjs.entry.js +281 -148
- package/dist/cjs/bcm-switch.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-tab.cjs.entry.js +44 -0
- package/dist/cjs/bcm-tab.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-tabs.cjs.entry.js +191 -237
- package/dist/cjs/bcm-tabs.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-text.cjs.entry.js +86 -85
- package/dist/cjs/bcm-text.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-textarea.cjs.entry.js +224 -154
- package/dist/cjs/bcm-textarea.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-tooltip.cjs.entry.js +414 -0
- package/dist/cjs/bcm-tooltip.entry.cjs.js.map +1 -0
- package/dist/cjs/bromcom-ui.cjs.js +2 -2
- package/dist/cjs/floating-ui.dom-S9nP6zZt.js +1622 -0
- package/dist/{bromcom-ui/floating-ui.dom-ltNPqX34.js.map → cjs/floating-ui.dom-S9nP6zZt.js.map} +1 -1
- package/dist/cjs/{index-CmYzUr-k.js → index-1Qal-onT.js} +111 -33
- package/dist/cjs/index-1Qal-onT.js.map +1 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/{validation-messages-BjfpSEWk.js → validation-messages-DieKlSG4.js} +6 -7
- package/dist/{esm/validation-messages-CUvT12BL.js.map → cjs/validation-messages-DieKlSG4.js.map} +1 -1
- package/dist/collection/collection-manifest.json +4 -5
- package/dist/collection/components/_shared/form/base-choice-control.js +90 -0
- package/dist/collection/components/_shared/form/base-choice-control.js.map +1 -0
- package/dist/collection/components/_shared/form/base-form-control.js +115 -0
- package/dist/collection/components/_shared/form/base-form-control.js.map +1 -0
- package/dist/collection/components/accordion/accordion.component.js +72 -55
- package/dist/collection/components/accordion/accordion.component.js.map +1 -1
- package/dist/collection/components/accordion/accordion.css +1 -1
- package/dist/collection/components/accordion-group/accordion-group.component.js +20 -18
- package/dist/collection/components/accordion-group/accordion-group.component.js.map +1 -1
- package/dist/collection/components/alert/alert.component.js +19 -21
- package/dist/collection/components/alert/alert.component.js.map +1 -1
- package/dist/collection/components/alert/alert.css +1 -1
- package/dist/collection/components/avatar/avatar.component.js +20 -12
- package/dist/collection/components/avatar/avatar.component.js.map +1 -1
- package/dist/collection/components/avatar/avatar.css +1 -1
- package/dist/collection/components/badge/badge.component.js +111 -81
- package/dist/collection/components/badge/badge.component.js.map +1 -1
- package/dist/collection/components/badge/badge.css +1 -1
- package/dist/collection/components/basic-badge/basic-badge.component.js +70 -58
- package/dist/collection/components/basic-badge/basic-badge.component.js.map +1 -1
- package/dist/collection/components/basic-badge/basic-badge.css +1 -1
- package/dist/collection/components/button/button.component.js +105 -84
- package/dist/collection/components/button/button.component.js.map +1 -1
- package/dist/collection/components/button/button.css +1 -1
- package/dist/collection/components/button-group/button-group.component.js +34 -23
- package/dist/collection/components/button-group/button-group.component.js.map +1 -1
- package/dist/collection/components/button-group/button-group.css +1 -1
- package/dist/collection/components/checkbox/checkbox.component.js +355 -236
- package/dist/collection/components/checkbox/checkbox.component.js.map +1 -1
- package/dist/collection/components/checkbox/checkbox.css +1 -1
- package/dist/collection/components/chip/chip.component.js +35 -34
- package/dist/collection/components/chip/chip.component.js.map +1 -1
- package/dist/collection/components/chip/chip.css +1 -1
- package/dist/collection/components/divider/divider.component.js +53 -55
- package/dist/collection/components/divider/divider.component.js.map +1 -1
- package/dist/collection/components/drawer/drawer.component.js +168 -144
- package/dist/collection/components/drawer/drawer.component.js.map +1 -1
- package/dist/collection/components/dropdown/dropdown.component.js +16 -16
- package/dist/collection/components/dropdown/dropdown.component.js.map +1 -1
- package/dist/collection/components/dropdown/dropdown.css +1 -1
- package/dist/collection/components/dropdown-item/dropdown-item.component.js +34 -32
- package/dist/collection/components/dropdown-item/dropdown-item.component.js.map +1 -1
- package/dist/collection/components/dropdown-item/dropdown-item.css +1 -1
- package/dist/collection/components/input/input.component.js +241 -155
- package/dist/collection/components/input/input.component.js.map +1 -1
- package/dist/collection/components/linked/linked.component.js +160 -138
- package/dist/collection/components/linked/linked.component.js.map +1 -1
- package/dist/collection/components/linked/linked.css +1 -1
- package/dist/collection/components/modal/modal.component.js +180 -156
- package/dist/collection/components/modal/modal.component.js.map +1 -1
- package/dist/collection/components/pop-confirm/pop-confirm.component.js +190 -159
- package/dist/collection/components/pop-confirm/pop-confirm.component.js.map +1 -1
- package/dist/collection/components/pop-confirm/pop-confirm.css +1 -1
- package/dist/collection/components/popover/popover.component.js +240 -212
- package/dist/collection/components/popover/popover.component.js.map +1 -1
- package/dist/collection/components/popover/popover.css +1 -1
- package/dist/collection/components/radio/radio.component.js +282 -106
- package/dist/collection/components/radio/radio.component.js.map +1 -1
- package/dist/collection/components/radio-group/radio-group.component.js +102 -80
- package/dist/collection/components/radio-group/radio-group.component.js.map +1 -1
- package/dist/collection/components/segmented-picker/segment.component.js +228 -0
- package/dist/collection/components/segmented-picker/segment.component.js.map +1 -0
- package/dist/collection/components/segmented-picker/segment.css +1 -0
- package/dist/collection/components/segmented-picker/segmented-picker.component.js +354 -139
- package/dist/collection/components/segmented-picker/segmented-picker.component.js.map +1 -1
- package/dist/collection/components/segmented-picker/segmented-picker.css +1 -1
- package/dist/collection/components/shortcut/shortcut.js +4 -5
- package/dist/collection/components/shortcut/shortcut.js.map +1 -1
- package/dist/collection/components/switch/switch.component.js +350 -280
- package/dist/collection/components/switch/switch.component.js.map +1 -1
- package/dist/collection/components/switch/switch.css +1 -1
- package/dist/collection/components/tabs/bcm-tab.css +1 -0
- package/dist/collection/components/tabs/bcm-tabs.css +1 -1
- package/dist/collection/components/tabs/tab.component.js +169 -0
- package/dist/collection/components/tabs/tab.component.js.map +1 -0
- package/dist/collection/components/tabs/tabs.component.js +221 -352
- package/dist/collection/components/tabs/tabs.component.js.map +1 -1
- package/dist/collection/components/text/text.component.js +84 -85
- package/dist/collection/components/text/text.component.js.map +1 -1
- package/dist/collection/components/text/text.css +1 -1
- package/dist/collection/components/textarea/textarea.component.js +216 -153
- package/dist/collection/components/textarea/textarea.component.js.map +1 -1
- package/dist/collection/components/tooltip/tooltip.component.js +164 -154
- package/dist/collection/components/tooltip/tooltip.component.js.map +1 -1
- package/dist/collection/components/upload/file-upload.component.js +905 -0
- package/dist/collection/components/upload/file-upload.component.js.map +1 -0
- package/dist/collection/components/upload/file-upload.css +1 -0
- package/dist/collection/global/global.js +33 -30
- package/dist/collection/utils/i18n.js +3 -4
- package/dist/collection/utils/i18n.js.map +1 -1
- package/dist/collection/utils/slot/check-slot-content.js +1 -2
- package/dist/collection/utils/slot/check-slot-content.js.map +1 -1
- package/dist/collection/utils/validation-messages.js +1 -1
- package/dist/collection/utils/validation-messages.js.map +1 -1
- package/dist/components/bcm-accordion-group.js +19 -17
- package/dist/components/bcm-accordion-group.js.map +1 -1
- package/dist/components/bcm-accordion.js +72 -55
- package/dist/components/bcm-accordion.js.map +1 -1
- package/dist/components/bcm-alert.js +1 -114
- package/dist/components/bcm-alert.js.map +1 -1
- package/dist/components/bcm-avatar.js +22 -12
- package/dist/components/bcm-avatar.js.map +1 -1
- package/dist/components/bcm-badge.js +1 -1
- package/dist/components/bcm-basic-badge.js +72 -58
- package/dist/components/bcm-basic-badge.js.map +1 -1
- package/dist/components/bcm-button-group.js +35 -23
- package/dist/components/bcm-button-group.js.map +1 -1
- package/dist/components/bcm-button.js +1 -1
- package/dist/components/bcm-checkbox.js +296 -184
- package/dist/components/bcm-checkbox.js.map +1 -1
- package/dist/components/bcm-chip.js +37 -34
- package/dist/components/bcm-chip.js.map +1 -1
- package/dist/components/bcm-divider.js +54 -54
- package/dist/components/bcm-divider.js.map +1 -1
- package/dist/components/bcm-drawer.js +169 -144
- package/dist/components/bcm-drawer.js.map +1 -1
- package/dist/components/bcm-dropdown-item.js +35 -32
- package/dist/components/bcm-dropdown-item.js.map +1 -1
- package/dist/components/bcm-dropdown.js +19 -18
- package/dist/components/bcm-dropdown.js.map +1 -1
- package/dist/components/{bcm-tabs-content.d.ts → bcm-file-upload.d.ts} +4 -4
- package/dist/components/bcm-file-upload.js +593 -0
- package/dist/components/bcm-file-upload.js.map +1 -0
- package/dist/components/bcm-input.js +244 -158
- package/dist/components/bcm-input.js.map +1 -1
- package/dist/components/bcm-linked.js +1 -1
- package/dist/components/bcm-modal.js +181 -156
- package/dist/components/bcm-modal.js.map +1 -1
- package/dist/components/bcm-pop-confirm.js +192 -160
- package/dist/components/bcm-pop-confirm.js.map +1 -1
- package/dist/components/bcm-popover.js +242 -213
- package/dist/components/bcm-popover.js.map +1 -1
- package/dist/components/bcm-radio-group.js +102 -79
- package/dist/components/bcm-radio-group.js.map +1 -1
- package/dist/components/bcm-radio.js +241 -108
- package/dist/components/bcm-radio.js.map +1 -1
- package/dist/components/{bcm-tabs-list.d.ts → bcm-segment.d.ts} +4 -4
- package/dist/components/bcm-segment.js +110 -0
- package/dist/components/bcm-segment.js.map +1 -0
- package/dist/components/bcm-segmented-picker.js +234 -115
- package/dist/components/bcm-segmented-picker.js.map +1 -1
- package/dist/components/bcm-shortcut.js +4 -3
- package/dist/components/bcm-shortcut.js.map +1 -1
- package/dist/components/bcm-switch.js +292 -156
- package/dist/components/bcm-switch.js.map +1 -1
- package/dist/components/{bcm-tabs-trigger.d.ts → bcm-tab.d.ts} +4 -4
- package/dist/components/bcm-tab.js +71 -0
- package/dist/components/bcm-tab.js.map +1 -0
- package/dist/components/bcm-tabs.js +196 -247
- package/dist/components/bcm-tabs.js.map +1 -1
- package/dist/components/bcm-text.js +85 -84
- package/dist/components/bcm-text.js.map +1 -1
- package/dist/components/bcm-textarea.js +218 -154
- package/dist/components/bcm-textarea.js.map +1 -1
- package/dist/components/bcm-tooltip.js +164 -153
- package/dist/components/bcm-tooltip.js.map +1 -1
- package/dist/components/index.js +105 -32
- package/dist/components/index.js.map +1 -1
- package/dist/components/p-5_TgtzQU.js +119 -0
- package/dist/components/p-5_TgtzQU.js.map +1 -0
- package/dist/components/p-RlBWOSgL.js +179 -0
- package/dist/components/p-RlBWOSgL.js.map +1 -0
- package/dist/components/p-SERXqWcS.js +51 -0
- package/dist/components/p-SERXqWcS.js.map +1 -0
- package/dist/components/{p-CUvT12BL.js → p-nf_HKsGq.js} +6 -7
- package/dist/components/p-nf_HKsGq.js.map +1 -0
- package/dist/components/{p-CsIBm0J5.js → p-xQIzBLsS.js} +108 -85
- package/dist/components/p-xQIzBLsS.js.map +1 -0
- package/dist/components/{p-6VLsKZvR.js → p-z9ESseGb.js} +163 -140
- package/dist/components/p-z9ESseGb.js.map +1 -0
- package/dist/esm/base-choice-control-CKR8UdZ6.js +52 -0
- package/dist/esm/base-choice-control-CKR8UdZ6.js.map +1 -0
- package/dist/esm/bcm-accordion-group.entry.js +20 -18
- package/dist/esm/bcm-accordion-group.entry.js.map +1 -1
- package/dist/esm/bcm-accordion.entry.js +73 -56
- package/dist/esm/bcm-accordion.entry.js.map +1 -1
- package/dist/esm/bcm-alert.entry.js +21 -21
- package/dist/esm/bcm-alert.entry.js.map +1 -1
- package/dist/esm/bcm-avatar.entry.js +22 -12
- package/dist/esm/bcm-avatar.entry.js.map +1 -1
- package/dist/esm/bcm-badge.entry.js +114 -82
- package/dist/esm/bcm-badge.entry.js.map +1 -1
- package/dist/esm/bcm-basic-badge.entry.js +73 -59
- package/dist/esm/bcm-basic-badge.entry.js.map +1 -1
- package/dist/esm/bcm-button-group.entry.js +36 -24
- package/dist/esm/bcm-button-group.entry.js.map +1 -1
- package/dist/esm/bcm-button.entry.js +336 -0
- package/dist/esm/bcm-button.entry.js.map +1 -0
- package/dist/esm/bcm-checkbox.entry.js +284 -174
- package/dist/esm/bcm-checkbox.entry.js.map +1 -1
- package/dist/esm/bcm-chip.entry.js +38 -35
- package/dist/esm/bcm-chip.entry.js.map +1 -1
- package/dist/esm/bcm-divider.entry.js +55 -55
- package/dist/esm/bcm-divider.entry.js.map +1 -1
- package/dist/esm/bcm-drawer.entry.js +330 -0
- package/dist/esm/bcm-drawer.entry.js.map +1 -0
- package/dist/esm/bcm-dropdown-item.entry.js +36 -33
- package/dist/esm/bcm-dropdown-item.entry.js.map +1 -1
- package/dist/esm/bcm-dropdown.entry.js +18 -17
- package/dist/esm/bcm-dropdown.entry.js.map +1 -1
- package/dist/esm/bcm-file-upload.entry.js +550 -0
- package/dist/esm/bcm-file-upload.entry.js.map +1 -0
- package/dist/esm/bcm-input.entry.js +250 -158
- package/dist/esm/bcm-input.entry.js.map +1 -1
- package/dist/esm/bcm-linked.entry.js +450 -0
- package/dist/esm/bcm-linked.entry.js.map +1 -0
- package/dist/esm/bcm-modal.entry.js +358 -0
- package/dist/esm/bcm-modal.entry.js.map +1 -0
- package/dist/esm/bcm-pop-confirm.entry.js +379 -0
- package/dist/esm/bcm-pop-confirm.entry.js.map +1 -0
- package/dist/esm/bcm-popover.entry.js +449 -0
- package/dist/esm/bcm-popover.entry.js.map +1 -0
- package/dist/esm/bcm-radio-group.entry.js +103 -80
- package/dist/esm/bcm-radio-group.entry.js.map +1 -1
- package/dist/esm/bcm-radio.entry.js +239 -106
- package/dist/esm/bcm-radio.entry.js.map +1 -1
- package/dist/esm/bcm-segment.bcm-segmented-picker.entry.js.map +1 -0
- package/dist/esm/bcm-segment_2.entry.js +332 -0
- package/dist/esm/bcm-shortcut.entry.js +5 -4
- package/dist/esm/bcm-shortcut.entry.js.map +1 -1
- package/dist/esm/bcm-switch.entry.js +281 -148
- package/dist/esm/bcm-switch.entry.js.map +1 -1
- package/dist/esm/bcm-tab.entry.js +42 -0
- package/dist/esm/bcm-tab.entry.js.map +1 -0
- package/dist/esm/bcm-tabs.entry.js +191 -237
- package/dist/esm/bcm-tabs.entry.js.map +1 -1
- package/dist/esm/bcm-text.entry.js +86 -85
- package/dist/esm/bcm-text.entry.js.map +1 -1
- package/dist/esm/bcm-textarea.entry.js +224 -154
- package/dist/esm/bcm-textarea.entry.js.map +1 -1
- package/dist/esm/bcm-tooltip.entry.js +412 -0
- package/dist/esm/bcm-tooltip.entry.js.map +1 -0
- package/dist/esm/bromcom-ui.js +3 -3
- package/dist/esm/floating-ui.dom-DBDSgIvP.js +1615 -0
- package/dist/esm/floating-ui.dom-DBDSgIvP.js.map +1 -0
- package/dist/esm/{index-CRwAh9Np.js → index-B6Ppbs5O.js} +111 -34
- package/dist/esm/index-B6Ppbs5O.js.map +1 -0
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{validation-messages-CUvT12BL.js → validation-messages-nf_HKsGq.js} +6 -7
- package/dist/{cjs/validation-messages-BjfpSEWk.js.map → esm/validation-messages-nf_HKsGq.js.map} +1 -1
- package/dist/types/components/_shared/form/base-choice-control.d.ts +15 -0
- package/dist/types/components/_shared/form/base-form-control.d.ts +11 -0
- package/dist/types/components/checkbox/checkbox.component.d.ts +89 -71
- package/dist/types/components/input/input.component.d.ts +5 -0
- package/dist/types/components/radio/radio.component.d.ts +21 -0
- package/dist/types/components/segmented-picker/segment.component.d.ts +42 -0
- package/dist/types/components/segmented-picker/segmented-picker.component.d.ts +91 -24
- package/dist/types/components/switch/switch.component.d.ts +83 -43
- package/dist/types/components/tabs/tab.component.d.ts +33 -0
- package/dist/types/components/tabs/tabs.component.d.ts +51 -64
- package/dist/types/components/textarea/textarea.component.d.ts +5 -0
- package/dist/types/components/upload/file-upload.component.d.ts +107 -0
- package/dist/types/components.d.ts +830 -382
- package/package.json +2 -2
- package/dist/bromcom-ui/_commonjsHelpers-CvGrISen.js.map +0 -1
- package/dist/bromcom-ui/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/bcm-segmented-picker-option.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/bcm-segmented-picker.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/bcm-tabs-content.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/bcm-tabs-list.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/bcm-tabs-trigger.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/generate-id-Crb5QsB-.js.map +0 -1
- package/dist/bromcom-ui/index-40rmUZjU.js.map +0 -1
- package/dist/bromcom-ui/index-BCaJmHBB.js.map +0 -1
- package/dist/bromcom-ui/p-0c7c6896.entry.js +0 -2
- package/dist/bromcom-ui/p-0c7c6896.entry.js.map +0 -1
- package/dist/bromcom-ui/p-11d0e649.entry.js +0 -2
- package/dist/bromcom-ui/p-11d0e649.entry.js.map +0 -1
- package/dist/bromcom-ui/p-12f38632.entry.js +0 -2
- package/dist/bromcom-ui/p-12f38632.entry.js.map +0 -1
- package/dist/bromcom-ui/p-13cbd1f5.entry.js +0 -2
- package/dist/bromcom-ui/p-13cbd1f5.entry.js.map +0 -1
- package/dist/bromcom-ui/p-1507908f.entry.js.map +0 -1
- package/dist/bromcom-ui/p-1ce9913f.entry.js +0 -2
- package/dist/bromcom-ui/p-1ce9913f.entry.js.map +0 -1
- package/dist/bromcom-ui/p-206d767e.entry.js +0 -2
- package/dist/bromcom-ui/p-206d767e.entry.js.map +0 -1
- package/dist/bromcom-ui/p-3cf7a7f4.entry.js +0 -2
- package/dist/bromcom-ui/p-3cf7a7f4.entry.js.map +0 -1
- package/dist/bromcom-ui/p-4505feba.entry.js +0 -2
- package/dist/bromcom-ui/p-4505feba.entry.js.map +0 -1
- package/dist/bromcom-ui/p-496014ca.entry.js.map +0 -1
- package/dist/bromcom-ui/p-4a932cd3.entry.js +0 -2
- package/dist/bromcom-ui/p-4a932cd3.entry.js.map +0 -1
- package/dist/bromcom-ui/p-4e554b8d.entry.js +0 -2
- package/dist/bromcom-ui/p-4e554b8d.entry.js.map +0 -1
- package/dist/bromcom-ui/p-57c4c4c4.entry.js +0 -2
- package/dist/bromcom-ui/p-57c4c4c4.entry.js.map +0 -1
- package/dist/bromcom-ui/p-61293ab2.entry.js +0 -2
- package/dist/bromcom-ui/p-61293ab2.entry.js.map +0 -1
- package/dist/bromcom-ui/p-61789456.entry.js +0 -2
- package/dist/bromcom-ui/p-61789456.entry.js.map +0 -1
- package/dist/bromcom-ui/p-65d0f188.entry.js +0 -2
- package/dist/bromcom-ui/p-65d0f188.entry.js.map +0 -1
- package/dist/bromcom-ui/p-83f707dc.entry.js +0 -2
- package/dist/bromcom-ui/p-83f707dc.entry.js.map +0 -1
- package/dist/bromcom-ui/p-8ba02e7e.entry.js +0 -2
- package/dist/bromcom-ui/p-8ba02e7e.entry.js.map +0 -1
- package/dist/bromcom-ui/p-9e9bf32e.entry.js +0 -2
- package/dist/bromcom-ui/p-9e9bf32e.entry.js.map +0 -1
- package/dist/bromcom-ui/p-CRwAh9Np.js +0 -3
- package/dist/bromcom-ui/p-CRwAh9Np.js.map +0 -1
- package/dist/bromcom-ui/p-CUvT12BL.js +0 -2
- package/dist/bromcom-ui/p-c87a6acf.entry.js +0 -2
- package/dist/bromcom-ui/p-c87a6acf.entry.js.map +0 -1
- package/dist/bromcom-ui/p-e0e235a8.entry.js +0 -2
- package/dist/bromcom-ui/p-e0e235a8.entry.js.map +0 -1
- package/dist/bromcom-ui/p-e1ce8b55.entry.js +0 -2
- package/dist/bromcom-ui/p-e1ce8b55.entry.js.map +0 -1
- package/dist/bromcom-ui/p-e4dddb0b.entry.js +0 -2
- package/dist/bromcom-ui/p-e4dddb0b.entry.js.map +0 -1
- package/dist/bromcom-ui/p-f9426924.entry.js +0 -2
- package/dist/bromcom-ui/p-f9426924.entry.js.map +0 -1
- package/dist/bromcom-ui/p-faa0e62c.entry.js +0 -2
- package/dist/bromcom-ui/p-faa0e62c.entry.js.map +0 -1
- package/dist/bromcom-ui/p-fcb4399f.entry.js +0 -2
- package/dist/bromcom-ui/p-fcb4399f.entry.js.map +0 -1
- package/dist/bromcom-ui/tv-SlGJ5EfR.js.map +0 -1
- package/dist/bromcom-ui/validation-messages-CUvT12BL.js.map +0 -1
- package/dist/cjs/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-button_7.cjs.entry.js +0 -4131
- package/dist/cjs/bcm-segmented-picker-option.cjs.entry.js +0 -105
- package/dist/cjs/bcm-segmented-picker-option.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-segmented-picker.cjs.entry.js +0 -142
- package/dist/cjs/bcm-segmented-picker.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-tabs-content.cjs.entry.js +0 -18
- package/dist/cjs/bcm-tabs-content.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-tabs-list.cjs.entry.js +0 -82
- package/dist/cjs/bcm-tabs-list.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-tabs-trigger.cjs.entry.js +0 -120
- package/dist/cjs/bcm-tabs-trigger.entry.cjs.js.map +0 -1
- package/dist/cjs/index-CmYzUr-k.js.map +0 -1
- package/dist/collection/components/segmented-picker/segmented-picker-option.component.js +0 -253
- package/dist/collection/components/segmented-picker/segmented-picker-option.component.js.map +0 -1
- package/dist/collection/components/segmented-picker/segmented-picker-option.css +0 -1
- package/dist/collection/components/tabs/tabs-content.component.js +0 -46
- package/dist/collection/components/tabs/tabs-content.component.js.map +0 -1
- package/dist/collection/components/tabs/tabs-content.css +0 -1
- package/dist/collection/components/tabs/tabs-list.component.js +0 -133
- package/dist/collection/components/tabs/tabs-list.component.js.map +0 -1
- package/dist/collection/components/tabs/tabs-list.css +0 -1
- package/dist/collection/components/tabs/tabs-trigger.component.js +0 -267
- package/dist/collection/components/tabs/tabs-trigger.component.js.map +0 -1
- package/dist/collection/components/tabs/tabs-trigger.css +0 -1
- package/dist/components/bcm-segmented-picker-option.d.ts +0 -11
- package/dist/components/bcm-segmented-picker-option.js +0 -133
- package/dist/components/bcm-segmented-picker-option.js.map +0 -1
- package/dist/components/bcm-tabs-content.js +0 -41
- package/dist/components/bcm-tabs-content.js.map +0 -1
- package/dist/components/bcm-tabs-list.js +0 -106
- package/dist/components/bcm-tabs-list.js.map +0 -1
- package/dist/components/bcm-tabs-trigger.js +0 -148
- package/dist/components/bcm-tabs-trigger.js.map +0 -1
- package/dist/components/p-6VLsKZvR.js.map +0 -1
- package/dist/components/p-CUvT12BL.js.map +0 -1
- package/dist/components/p-CaemikSK.js +0 -147
- package/dist/components/p-CaemikSK.js.map +0 -1
- package/dist/components/p-CsIBm0J5.js.map +0 -1
- package/dist/esm/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.js.map +0 -1
- package/dist/esm/bcm-button_7.entry.js +0 -4123
- package/dist/esm/bcm-segmented-picker-option.entry.js +0 -103
- package/dist/esm/bcm-segmented-picker-option.entry.js.map +0 -1
- package/dist/esm/bcm-segmented-picker.entry.js +0 -140
- package/dist/esm/bcm-segmented-picker.entry.js.map +0 -1
- package/dist/esm/bcm-tabs-content.entry.js +0 -16
- package/dist/esm/bcm-tabs-content.entry.js.map +0 -1
- package/dist/esm/bcm-tabs-list.entry.js +0 -80
- package/dist/esm/bcm-tabs-list.entry.js.map +0 -1
- package/dist/esm/bcm-tabs-trigger.entry.js +0 -118
- package/dist/esm/bcm-tabs-trigger.entry.js.map +0 -1
- package/dist/esm/index-CRwAh9Np.js.map +0 -1
- package/dist/types/components/segmented-picker/segmented-picker-option.component.d.ts +0 -30
- package/dist/types/components/tabs/tabs-content.component.d.ts +0 -13
- package/dist/types/components/tabs/tabs-list.component.d.ts +0 -20
- package/dist/types/components/tabs/tabs-trigger.component.d.ts +0 -49
|
@@ -11,159 +11,79 @@ const BcmTooltip$1 = /*@__PURE__*/ proxyCustomElement(class BcmTooltip extends H
|
|
|
11
11
|
this.__registerHost();
|
|
12
12
|
}
|
|
13
13
|
this.__attachShadow();
|
|
14
|
-
this.mouseX = 0;
|
|
15
|
-
this.mouseY = 0;
|
|
16
|
-
/**
|
|
17
|
-
* How the tooltip is triggered
|
|
18
|
-
* - 'hover': Shows on mouse enter, hides on mouse leave
|
|
19
|
-
* - 'click': Toggles on click, closes on outside click or Escape key
|
|
20
|
-
*/
|
|
21
|
-
this.trigger = 'hover';
|
|
22
|
-
/**
|
|
23
|
-
* Preferred placement of the tooltip relative to the trigger
|
|
24
|
-
* Note: Tooltip will automatically flip if there's not enough space
|
|
25
|
-
* - 'top': Above the trigger element
|
|
26
|
-
* - 'right': To the right of the trigger element
|
|
27
|
-
* - 'bottom': Below the trigger element
|
|
28
|
-
* - 'left': To the left of the trigger element
|
|
29
|
-
*/
|
|
30
|
-
this.placement = 'top';
|
|
31
|
-
/**
|
|
32
|
-
* Size variant of the tooltip
|
|
33
|
-
* - 'small': Compact tooltip with minimal padding (text-size-3, py-1 px-2)
|
|
34
|
-
* - 'medium': Standard tooltip size (text-size-4, py-1.5 px-3)
|
|
35
|
-
* - 'large': Larger tooltip for more content (text-size-5, py-2 px-4)
|
|
36
|
-
*/
|
|
37
|
-
this.size = 'medium';
|
|
38
|
-
/**
|
|
39
|
-
* Delay in milliseconds before showing the tooltip
|
|
40
|
-
* Useful to prevent tooltips from appearing on quick mouse movements
|
|
41
|
-
*/
|
|
42
|
-
this.showDelay = 150;
|
|
43
|
-
/**
|
|
44
|
-
* Delay in milliseconds before hiding the tooltip
|
|
45
|
-
* Provides a grace period for mouse movements
|
|
46
|
-
*/
|
|
47
|
-
this.hideDelay = 100;
|
|
48
|
-
/**
|
|
49
|
-
* Whether to show an arrow pointing to the trigger element
|
|
50
|
-
* Note: Arrow is automatically hidden in 'follow' mode
|
|
51
|
-
*/
|
|
52
|
-
this.arrow = true;
|
|
53
|
-
/**
|
|
54
|
-
* Disables the tooltip, preventing it from showing
|
|
55
|
-
* Useful for conditional tooltips based on application state
|
|
56
|
-
*/
|
|
57
|
-
this.disabled = false;
|
|
58
|
-
/**
|
|
59
|
-
* Distance in pixels between the tooltip and the trigger element
|
|
60
|
-
* Also used as the offset in 'follow' mode
|
|
61
|
-
*/
|
|
62
|
-
this.offset = 12;
|
|
63
|
-
/**
|
|
64
|
-
* Makes the tooltip follow the mouse cursor
|
|
65
|
-
* When enabled:
|
|
66
|
-
* - Arrow is hidden
|
|
67
|
-
* - Tooltip position updates smoothly with cursor movement
|
|
68
|
-
* - Pointer events are disabled on tooltip to prevent interference
|
|
69
|
-
*/
|
|
70
|
-
this.follow = false;
|
|
71
|
-
this.isOpen = false;
|
|
72
|
-
this.handleSlotChange = () => {
|
|
73
|
-
var _a;
|
|
74
|
-
const slot = (_a = this.host.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot:not([name])');
|
|
75
|
-
if (!slot)
|
|
76
|
-
return;
|
|
77
|
-
const elements = slot.assignedElements();
|
|
78
|
-
const assignedElement = elements[0];
|
|
79
|
-
// Get the actual element position from the host, not shadow DOM
|
|
80
|
-
// This ensures proper positioning across shadow boundaries
|
|
81
|
-
this.triggerRef = (assignedElement || this.host);
|
|
82
|
-
if (!this.triggerRef)
|
|
83
|
-
return;
|
|
84
|
-
// Setup ARIA relationship
|
|
85
|
-
if (this.tooltipRef && this.tooltipId) {
|
|
86
|
-
this.triggerRef.setAttribute('aria-describedby', this.tooltipId);
|
|
87
|
-
}
|
|
88
|
-
// Remove old listeners
|
|
89
|
-
this.removeTriggerListeners();
|
|
90
|
-
// Add new listeners
|
|
91
|
-
this.setupTriggerListeners();
|
|
92
|
-
};
|
|
93
|
-
this.handleMouseEnter = () => {
|
|
94
|
-
if (!this.disabled) {
|
|
95
|
-
this.show();
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
this.handleMouseLeave = () => {
|
|
99
|
-
this.hide();
|
|
100
|
-
};
|
|
101
|
-
this.handleMouseMove = (e) => {
|
|
102
|
-
this.mouseX = e.clientX;
|
|
103
|
-
this.mouseY = e.clientY;
|
|
104
|
-
};
|
|
105
|
-
this.handleClick = () => {
|
|
106
|
-
if (!this.disabled) {
|
|
107
|
-
this.toggle();
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
this.handleOutsideClick = (e) => {
|
|
111
|
-
var _a;
|
|
112
|
-
const target = e.target;
|
|
113
|
-
if (!this.host.contains(target) && !((_a = this.tooltipRef) === null || _a === void 0 ? void 0 : _a.contains(target))) {
|
|
114
|
-
this.hide();
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
this.handleKeyDown = (e) => {
|
|
118
|
-
if (e.key === 'Escape' && this.isOpen) {
|
|
119
|
-
// Only close if this tooltip's popover element is the topmost
|
|
120
|
-
const topmostPopover = document.querySelector('[popover]:popover-open:last-of-type');
|
|
121
|
-
if (topmostPopover === this.tooltipRef) {
|
|
122
|
-
e.stopPropagation(); // Prevent event from reaching parent popovers
|
|
123
|
-
this.hide();
|
|
124
|
-
// Return focus to trigger element
|
|
125
|
-
if (this.triggerRef && 'focus' in this.triggerRef) {
|
|
126
|
-
this.triggerRef.focus();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
this.handleToggle = (e) => {
|
|
132
|
-
const toggleEvent = e;
|
|
133
|
-
// Sync our internal state with popover state
|
|
134
|
-
if (toggleEvent.newState === 'open' && !this.isOpen) {
|
|
135
|
-
this.isOpen = true;
|
|
136
|
-
}
|
|
137
|
-
else if (toggleEvent.newState === 'closed' && this.isOpen) {
|
|
138
|
-
this.isOpen = false;
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
this.tooltipClass = tv({
|
|
142
|
-
slots: {
|
|
143
|
-
tooltip: 'bcm-ui-element fixed m-0 bg-color-default-dark text-color-base rounded-md shadow-3 font-medium z-[9999]',
|
|
144
|
-
arrow: 'absolute w-2 h-2 bg-color-default-dark rotate-45',
|
|
145
|
-
content: '',
|
|
146
|
-
},
|
|
147
|
-
variants: {
|
|
148
|
-
size: {
|
|
149
|
-
small: {
|
|
150
|
-
tooltip: 'text-size-3 py-1 px-2',
|
|
151
|
-
},
|
|
152
|
-
medium: {
|
|
153
|
-
tooltip: 'text-size-4 py-1.5 px-3',
|
|
154
|
-
},
|
|
155
|
-
large: {
|
|
156
|
-
tooltip: 'text-size-5 py-2 px-4',
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
follow: {
|
|
160
|
-
true: {
|
|
161
|
-
tooltip: 'pointer-events-none',
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
14
|
}
|
|
15
|
+
get host() { return this; }
|
|
16
|
+
tooltipRef;
|
|
17
|
+
arrowRef;
|
|
18
|
+
triggerRef;
|
|
19
|
+
cleanupAutoUpdate;
|
|
20
|
+
showTimeout;
|
|
21
|
+
hideTimeout;
|
|
22
|
+
mouseX = 0;
|
|
23
|
+
mouseY = 0;
|
|
24
|
+
rafId;
|
|
25
|
+
tooltipId;
|
|
26
|
+
/**
|
|
27
|
+
* How the tooltip is triggered
|
|
28
|
+
* - 'hover': Shows on mouse enter, hides on mouse leave
|
|
29
|
+
* - 'click': Toggles on click, closes on outside click or Escape key
|
|
30
|
+
*/
|
|
31
|
+
trigger = 'hover';
|
|
32
|
+
/**
|
|
33
|
+
* Preferred placement of the tooltip relative to the trigger
|
|
34
|
+
* Note: Tooltip will automatically flip if there's not enough space
|
|
35
|
+
* - 'top': Above the trigger element
|
|
36
|
+
* - 'right': To the right of the trigger element
|
|
37
|
+
* - 'bottom': Below the trigger element
|
|
38
|
+
* - 'left': To the left of the trigger element
|
|
39
|
+
*/
|
|
40
|
+
placement = 'top';
|
|
41
|
+
/**
|
|
42
|
+
* Size variant of the tooltip
|
|
43
|
+
* - 'small': Compact tooltip with minimal padding (text-size-3, py-1 px-2)
|
|
44
|
+
* - 'medium': Standard tooltip size (text-size-4, py-1.5 px-3)
|
|
45
|
+
* - 'large': Larger tooltip for more content (text-size-5, py-2 px-4)
|
|
46
|
+
*/
|
|
47
|
+
size = 'medium';
|
|
48
|
+
/**
|
|
49
|
+
* Simple text message to display in the tooltip
|
|
50
|
+
* Can be overridden by slotting content into the 'content' slot
|
|
51
|
+
*/
|
|
52
|
+
message;
|
|
53
|
+
/**
|
|
54
|
+
* Delay in milliseconds before showing the tooltip
|
|
55
|
+
* Useful to prevent tooltips from appearing on quick mouse movements
|
|
56
|
+
*/
|
|
57
|
+
showDelay = 150;
|
|
58
|
+
/**
|
|
59
|
+
* Delay in milliseconds before hiding the tooltip
|
|
60
|
+
* Provides a grace period for mouse movements
|
|
61
|
+
*/
|
|
62
|
+
hideDelay = 100;
|
|
63
|
+
/**
|
|
64
|
+
* Whether to show an arrow pointing to the trigger element
|
|
65
|
+
* Note: Arrow is automatically hidden in 'follow' mode
|
|
66
|
+
*/
|
|
67
|
+
arrow = true;
|
|
68
|
+
/**
|
|
69
|
+
* Disables the tooltip, preventing it from showing
|
|
70
|
+
* Useful for conditional tooltips based on application state
|
|
71
|
+
*/
|
|
72
|
+
disabled = false;
|
|
73
|
+
/**
|
|
74
|
+
* Distance in pixels between the tooltip and the trigger element
|
|
75
|
+
* Also used as the offset in 'follow' mode
|
|
76
|
+
*/
|
|
77
|
+
offset = 12;
|
|
78
|
+
/**
|
|
79
|
+
* Makes the tooltip follow the mouse cursor
|
|
80
|
+
* When enabled:
|
|
81
|
+
* - Arrow is hidden
|
|
82
|
+
* - Tooltip position updates smoothly with cursor movement
|
|
83
|
+
* - Pointer events are disabled on tooltip to prevent interference
|
|
84
|
+
*/
|
|
85
|
+
follow = false;
|
|
86
|
+
isOpen = false;
|
|
167
87
|
handleDisabledChange(disabled) {
|
|
168
88
|
if (disabled && this.isOpen) {
|
|
169
89
|
this.hide();
|
|
@@ -344,6 +264,26 @@ const BcmTooltip$1 = /*@__PURE__*/ proxyCustomElement(class BcmTooltip extends H
|
|
|
344
264
|
this.triggerRef.addEventListener('click', this.handleClick);
|
|
345
265
|
}
|
|
346
266
|
}
|
|
267
|
+
handleSlotChange = () => {
|
|
268
|
+
const slot = this.host.shadowRoot?.querySelector('slot:not([name])');
|
|
269
|
+
if (!slot)
|
|
270
|
+
return;
|
|
271
|
+
const elements = slot.assignedElements();
|
|
272
|
+
const assignedElement = elements[0];
|
|
273
|
+
// Get the actual element position from the host, not shadow DOM
|
|
274
|
+
// This ensures proper positioning across shadow boundaries
|
|
275
|
+
this.triggerRef = (assignedElement || this.host);
|
|
276
|
+
if (!this.triggerRef)
|
|
277
|
+
return;
|
|
278
|
+
// Setup ARIA relationship
|
|
279
|
+
if (this.tooltipRef && this.tooltipId) {
|
|
280
|
+
this.triggerRef.setAttribute('aria-describedby', this.tooltipId);
|
|
281
|
+
}
|
|
282
|
+
// Remove old listeners
|
|
283
|
+
this.removeTriggerListeners();
|
|
284
|
+
// Add new listeners
|
|
285
|
+
this.setupTriggerListeners();
|
|
286
|
+
};
|
|
347
287
|
removeTriggerListeners() {
|
|
348
288
|
if (!this.triggerRef)
|
|
349
289
|
return;
|
|
@@ -352,6 +292,53 @@ const BcmTooltip$1 = /*@__PURE__*/ proxyCustomElement(class BcmTooltip extends H
|
|
|
352
292
|
this.triggerRef.removeEventListener('mousemove', this.handleMouseMove);
|
|
353
293
|
this.triggerRef.removeEventListener('click', this.handleClick);
|
|
354
294
|
}
|
|
295
|
+
handleMouseEnter = () => {
|
|
296
|
+
if (!this.disabled) {
|
|
297
|
+
this.show();
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
handleMouseLeave = () => {
|
|
301
|
+
this.hide();
|
|
302
|
+
};
|
|
303
|
+
handleMouseMove = (e) => {
|
|
304
|
+
this.mouseX = e.clientX;
|
|
305
|
+
this.mouseY = e.clientY;
|
|
306
|
+
};
|
|
307
|
+
handleClick = () => {
|
|
308
|
+
if (!this.disabled) {
|
|
309
|
+
this.toggle();
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
handleOutsideClick = (e) => {
|
|
313
|
+
const target = e.target;
|
|
314
|
+
if (!this.host.contains(target) && !this.tooltipRef?.contains(target)) {
|
|
315
|
+
this.hide();
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
handleKeyDown = (e) => {
|
|
319
|
+
if (e.key === 'Escape' && this.isOpen) {
|
|
320
|
+
// Only close if this tooltip's popover element is the topmost
|
|
321
|
+
const topmostPopover = document.querySelector('[popover]:popover-open:last-of-type');
|
|
322
|
+
if (topmostPopover === this.tooltipRef) {
|
|
323
|
+
e.stopPropagation(); // Prevent event from reaching parent popovers
|
|
324
|
+
this.hide();
|
|
325
|
+
// Return focus to trigger element
|
|
326
|
+
if (this.triggerRef && 'focus' in this.triggerRef) {
|
|
327
|
+
this.triggerRef.focus();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
handleToggle = (e) => {
|
|
333
|
+
const toggleEvent = e;
|
|
334
|
+
// Sync our internal state with popover state
|
|
335
|
+
if (toggleEvent.newState === 'open' && !this.isOpen) {
|
|
336
|
+
this.isOpen = true;
|
|
337
|
+
}
|
|
338
|
+
else if (toggleEvent.newState === 'closed' && this.isOpen) {
|
|
339
|
+
this.isOpen = false;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
355
342
|
setupOutsideClickListener() {
|
|
356
343
|
// Remove existing listener first
|
|
357
344
|
document.removeEventListener('click', this.handleOutsideClick);
|
|
@@ -383,6 +370,31 @@ const BcmTooltip$1 = /*@__PURE__*/ proxyCustomElement(class BcmTooltip extends H
|
|
|
383
370
|
this.tooltipRef.removeEventListener('toggle', this.handleToggle);
|
|
384
371
|
}
|
|
385
372
|
}
|
|
373
|
+
tooltipClass = tv({
|
|
374
|
+
slots: {
|
|
375
|
+
tooltip: 'bcm-ui-element fixed m-0 bg-color-default-dark text-color-base rounded-md shadow-3 font-medium z-[9999]',
|
|
376
|
+
arrow: 'absolute w-2 h-2 bg-color-default-dark rotate-45',
|
|
377
|
+
content: '',
|
|
378
|
+
},
|
|
379
|
+
variants: {
|
|
380
|
+
size: {
|
|
381
|
+
small: {
|
|
382
|
+
tooltip: 'text-size-3 py-1 px-2',
|
|
383
|
+
},
|
|
384
|
+
medium: {
|
|
385
|
+
tooltip: 'text-size-4 py-1.5 px-3',
|
|
386
|
+
},
|
|
387
|
+
large: {
|
|
388
|
+
tooltip: 'text-size-5 py-2 px-4',
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
follow: {
|
|
392
|
+
true: {
|
|
393
|
+
tooltip: 'pointer-events-none',
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
});
|
|
386
398
|
render() {
|
|
387
399
|
const { tooltip, arrow: arrowClass } = this.tooltipClass({
|
|
388
400
|
size: this.size,
|
|
@@ -392,7 +404,6 @@ const BcmTooltip$1 = /*@__PURE__*/ proxyCustomElement(class BcmTooltip extends H
|
|
|
392
404
|
// @ts-ignore - popover is a valid attribute
|
|
393
405
|
popover: "manual", role: "tooltip" }, this.arrow && !this.follow && h("div", { key: '7170aba70efdf413f4823cf2eff5618271b2fa70', ref: el => (this.arrowRef = el), part: "arrow", class: arrowClass() }), h("div", { key: '4fd9b56ce036663caaf1a75874e95ea566e214ef', part: "content" }, h("slot", { key: 'd5ab1ab3ef54e1c827ed1d009e226258a099378b', name: "content" }, this.message)))));
|
|
394
406
|
}
|
|
395
|
-
get host() { return this; }
|
|
396
407
|
static get watchers() { return {
|
|
397
408
|
"disabled": ["handleDisabledChange"],
|
|
398
409
|
"trigger": ["handleTriggerChange"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"bcm-tooltip.js","mappings":"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","names":["BcmTooltip","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/tooltip/tooltip.css?tag=bcm-tooltip&encapsulation=shadow","src/components/tooltip/tooltip.component.tsx"],"sourcesContent":[":host {\n display: inline-block;\n}\n\n[popover] {\n /* Reset default popover styles */\n border: none;\n padding: 0;\n overflow: visible;\n\n /* Subtle, fast animation - won't be jarring on quick hover transitions */\n transition: opacity 100ms ease-out, transform 100ms ease-out;\n opacity: 0;\n transform: scale(0.95);\n}\n\n[popover]:popover-open {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Starting state when opening */\n@starting-style {\n [popover]:popover-open {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n","import { Component, Element, h, Prop, State, Method, Watch } from '@stencil/core';\nimport { computePosition, flip, shift, offset, arrow, autoUpdate } from '@floating-ui/dom';\nimport { tv } from '@utils/tv';\n\nexport type TooltipTrigger = 'hover' | 'click';\nexport type TooltipPlacement = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipSize = 'small' | 'medium' | 'large';\n\n/**\n * @component BcmTooltip\n * @description A flexible tooltip component that provides contextual information on hover or click.\n * Built on the native Popover API for top-layer rendering and Floating UI for intelligent positioning.\n * Automatically handles overflow, flipping, and complex shadow DOM scenarios.\n *\n * @slot - The trigger element that will show the tooltip\n * @slot content - Custom rich content for the tooltip (overrides message prop)\n *\n * @part tooltip - The tooltip container element (for custom styling)\n * @part arrow - The arrow pointer element\n * @part content - The content wrapper element\n *\n * @example\n * ```html\n * <!-- Basic usage with text message -->\n * <bcm-tooltip message=\"This is a tooltip\">\n * <button>Hover me</button>\n * </bcm-tooltip>\n *\n * <!-- With custom rich content -->\n * <bcm-tooltip placement=\"right\" size=\"large\">\n * <button>Click me</button>\n * <div slot=\"content\">\n * <strong>Rich content</strong>\n * <p>You can add any HTML here</p>\n * </div>\n * </bcm-tooltip>\n *\n * <!-- Click trigger with custom delays -->\n * <bcm-tooltip trigger=\"click\" show-delay=\"0\" hide-delay=\"0\">\n * <span>Click me</span>\n * </bcm-tooltip>\n *\n * <!-- Mouse following mode -->\n * <bcm-tooltip follow={true} message=\"I follow your cursor!\">\n * <div>Move your mouse here</div>\n * </bcm-tooltip>\n *\n * <!-- Programmatic control -->\n * <bcm-tooltip id=\"myTooltip\" message=\"Programmatic tooltip\">\n * <span>Trigger</span>\n * </bcm-tooltip>\n * <script>\n * const tooltip = document.getElementById('myTooltip');\n * tooltip.show();\n * setTimeout(() => tooltip.hide(), 2000);\n * </script>\n *\n * <!-- Custom styling with CSS parts -->\n * <style>\n * bcm-tooltip::part(tooltip) {\n * background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n * border-radius: 12px;\n * }\n * bcm-tooltip::part(arrow) {\n * background: #667eea;\n * }\n * </style>\n * ```\n */\n@Component({\n tag: 'bcm-tooltip',\n styleUrl: 'tooltip.css',\n shadow: true,\n})\nexport class BcmTooltip {\n @Element() host: HTMLBcmTooltipElement;\n\n private tooltipRef?: HTMLDivElement;\n private arrowRef?: HTMLDivElement;\n private triggerRef?: HTMLElement;\n private cleanupAutoUpdate?: () => void;\n private showTimeout?: number;\n private hideTimeout?: number;\n private mouseX = 0;\n private mouseY = 0;\n private rafId?: number;\n private tooltipId: string;\n\n /**\n * How the tooltip is triggered\n * - 'hover': Shows on mouse enter, hides on mouse leave\n * - 'click': Toggles on click, closes on outside click or Escape key\n */\n @Prop() trigger: TooltipTrigger = 'hover';\n\n /**\n * Preferred placement of the tooltip relative to the trigger\n * Note: Tooltip will automatically flip if there's not enough space\n * - 'top': Above the trigger element\n * - 'right': To the right of the trigger element\n * - 'bottom': Below the trigger element\n * - 'left': To the left of the trigger element\n */\n @Prop() placement: TooltipPlacement = 'top';\n\n /**\n * Size variant of the tooltip\n * - 'small': Compact tooltip with minimal padding (text-size-3, py-1 px-2)\n * - 'medium': Standard tooltip size (text-size-4, py-1.5 px-3)\n * - 'large': Larger tooltip for more content (text-size-5, py-2 px-4)\n */\n @Prop() size: TooltipSize = 'medium';\n\n /**\n * Simple text message to display in the tooltip\n * Can be overridden by slotting content into the 'content' slot\n */\n @Prop() message?: string;\n\n /**\n * Delay in milliseconds before showing the tooltip\n * Useful to prevent tooltips from appearing on quick mouse movements\n */\n @Prop({ attribute: 'show-delay' }) showDelay: number = 150;\n\n /**\n * Delay in milliseconds before hiding the tooltip\n * Provides a grace period for mouse movements\n */\n @Prop({ attribute: 'hide-delay' }) hideDelay: number = 100;\n\n /**\n * Whether to show an arrow pointing to the trigger element\n * Note: Arrow is automatically hidden in 'follow' mode\n */\n @Prop() arrow: boolean = true;\n\n /**\n * Disables the tooltip, preventing it from showing\n * Useful for conditional tooltips based on application state\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Distance in pixels between the tooltip and the trigger element\n * Also used as the offset in 'follow' mode\n */\n @Prop() offset: number = 12;\n\n /**\n * Makes the tooltip follow the mouse cursor\n * When enabled:\n * - Arrow is hidden\n * - Tooltip position updates smoothly with cursor movement\n * - Pointer events are disabled on tooltip to prevent interference\n */\n @Prop() follow: boolean = false;\n\n @State() isOpen = false;\n\n @Watch('disabled')\n handleDisabledChange(disabled: boolean) {\n if (disabled && this.isOpen) {\n this.hide();\n }\n }\n\n @Watch('trigger')\n handleTriggerChange() {\n this.removeTriggerListeners();\n this.setupOutsideClickListener();\n if (this.triggerRef) {\n this.setupTriggerListeners();\n }\n }\n\n @Watch('isOpen')\n async handleOpenChange(open: boolean) {\n if (!this.tooltipRef) return;\n\n if (open) {\n this.tooltipRef.showPopover();\n\n // Wait for next frame to ensure popover is rendered\n await new Promise(resolve => requestAnimationFrame(() => resolve(undefined)));\n\n if (this.follow) {\n this.startFollowing();\n } else {\n await this.updatePosition();\n this.startAutoUpdate();\n }\n } else {\n this.tooltipRef.hidePopover();\n this.stopFollowing();\n this.stopAutoUpdate();\n }\n }\n\n /**\n * Programmatically shows the tooltip\n * Respects the showDelay prop and disabled state\n */\n @Method()\n async show() {\n if (this.disabled) return;\n this.clearTimeouts();\n this.showTimeout = window.setTimeout(() => {\n this.isOpen = true;\n }, this.showDelay);\n }\n\n /**\n * Programmatically hides the tooltip\n * Respects the hideDelay prop\n */\n @Method()\n async hide() {\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.isOpen = false;\n }, this.hideDelay);\n }\n\n /**\n * Toggles the tooltip visibility\n * If open, hides it; if closed, shows it\n */\n @Method()\n async toggle() {\n if (this.isOpen) {\n await this.hide();\n } else {\n await this.show();\n }\n }\n\n private clearTimeouts() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = undefined;\n }\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n }\n }\n\n private startAutoUpdate() {\n if (!this.triggerRef || !this.tooltipRef || this.follow) return;\n\n this.cleanupAutoUpdate = autoUpdate(this.triggerRef, this.tooltipRef, () => this.updatePosition(), {\n ancestorScroll: true,\n ancestorResize: true,\n elementResize: true,\n layoutShift: true,\n });\n }\n\n private stopAutoUpdate() {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n\n private startFollowing() {\n if (!this.follow) return;\n\n const updateFollowPosition = () => {\n if (!this.isOpen || !this.tooltipRef) {\n this.rafId = undefined;\n return;\n }\n\n const offsetX = this.offset;\n const offsetY = this.offset;\n\n this.tooltipRef.style.left = `${this.mouseX + offsetX}px`;\n this.tooltipRef.style.top = `${this.mouseY + offsetY}px`;\n\n this.rafId = requestAnimationFrame(updateFollowPosition);\n };\n\n this.rafId = requestAnimationFrame(updateFollowPosition);\n }\n\n private stopFollowing() {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n }\n\n private async updatePosition() {\n if (!this.triggerRef || !this.tooltipRef || this.follow) return;\n\n try {\n // Check if trigger element is still in viewport\n const triggerRect = this.triggerRef.getBoundingClientRect();\n const isInViewport =\n triggerRect.bottom > 0 && triggerRect.top < window.innerHeight && triggerRect.right > 0 && triggerRect.left < window.innerWidth;\n\n // Hide tooltip if trigger is out of viewport\n if (!isInViewport && this.isOpen) {\n this.hide();\n return;\n }\n\n const middleware = [offset(this.offset), flip(), shift({ padding: 8 })];\n\n if (this.arrow && this.arrowRef) {\n middleware.push(arrow({ element: this.arrowRef }));\n }\n\n // Use virtual element to properly handle shadow DOM boundaries\n const virtualElement = {\n getBoundingClientRect: () => this.triggerRef.getBoundingClientRect(),\n };\n\n const { x, y, placement, middlewareData } = await computePosition(virtualElement, this.tooltipRef, {\n placement: this.placement,\n strategy: 'fixed',\n middleware,\n });\n\n this.tooltipRef.style.left = `${x}px`;\n this.tooltipRef.style.top = `${y}px`;\n\n // Arrow positioning\n if (this.arrow && this.arrowRef && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left';\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[side];\n\n Object.assign(this.arrowRef.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n });\n }\n } catch (error) {\n console.error('Failed to compute tooltip position:', error);\n }\n }\n\n private setupTriggerListeners() {\n if (!this.triggerRef) return;\n\n // Add new listeners based on trigger type\n if (this.trigger === 'hover') {\n this.triggerRef.addEventListener('mouseenter', this.handleMouseEnter);\n this.triggerRef.addEventListener('mouseleave', this.handleMouseLeave);\n\n if (this.follow) {\n this.triggerRef.addEventListener('mousemove', this.handleMouseMove);\n }\n } else if (this.trigger === 'click') {\n this.triggerRef.addEventListener('click', this.handleClick);\n }\n }\n\n private handleSlotChange = () => {\n const slot = this.host.shadowRoot?.querySelector('slot:not([name])');\n if (!slot) return;\n\n const elements = (slot as HTMLSlotElement).assignedElements();\n const assignedElement = elements[0] as HTMLElement;\n\n // Get the actual element position from the host, not shadow DOM\n // This ensures proper positioning across shadow boundaries\n this.triggerRef = (assignedElement || this.host) as HTMLElement;\n\n if (!this.triggerRef) return;\n\n // Setup ARIA relationship\n if (this.tooltipRef && this.tooltipId) {\n this.triggerRef.setAttribute('aria-describedby', this.tooltipId);\n }\n\n // Remove old listeners\n this.removeTriggerListeners();\n\n // Add new listeners\n this.setupTriggerListeners();\n };\n\n private removeTriggerListeners() {\n if (!this.triggerRef) return;\n\n this.triggerRef.removeEventListener('mouseenter', this.handleMouseEnter);\n this.triggerRef.removeEventListener('mouseleave', this.handleMouseLeave);\n this.triggerRef.removeEventListener('mousemove', this.handleMouseMove);\n this.triggerRef.removeEventListener('click', this.handleClick);\n }\n\n private handleMouseEnter = () => {\n if (!this.disabled) {\n this.show();\n }\n };\n\n private handleMouseLeave = () => {\n this.hide();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n this.mouseX = e.clientX;\n this.mouseY = e.clientY;\n };\n\n private handleClick = () => {\n if (!this.disabled) {\n this.toggle();\n }\n };\n\n private handleOutsideClick = (e: Event) => {\n const target = e.target as Node;\n if (!this.host.contains(target) && !this.tooltipRef?.contains(target)) {\n this.hide();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen) {\n // Only close if this tooltip's popover element is the topmost\n const topmostPopover = document.querySelector('[popover]:popover-open:last-of-type');\n if (topmostPopover === this.tooltipRef) {\n e.stopPropagation(); // Prevent event from reaching parent popovers\n this.hide();\n // Return focus to trigger element\n if (this.triggerRef && 'focus' in this.triggerRef) {\n (this.triggerRef as HTMLElement).focus();\n }\n }\n }\n };\n\n private handleToggle = (e: Event) => {\n const toggleEvent = e as ToggleEvent;\n\n // Sync our internal state with popover state\n if (toggleEvent.newState === 'open' && !this.isOpen) {\n this.isOpen = true;\n } else if (toggleEvent.newState === 'closed' && this.isOpen) {\n this.isOpen = false;\n }\n };\n\n private setupOutsideClickListener() {\n // Remove existing listener first\n document.removeEventListener('click', this.handleOutsideClick);\n\n // Add listener only for click trigger\n if (this.trigger === 'click') {\n document.addEventListener('click', this.handleOutsideClick);\n }\n }\n\n componentDidLoad() {\n // Generate unique ID for ARIA relationship\n this.tooltipId = `tooltip-${Math.random().toString(36).substring(2, 11)}`;\n\n // Setup outside click listener for click trigger\n this.setupOutsideClickListener();\n\n // Listen to popover toggle event to sync state\n if (this.tooltipRef) {\n this.tooltipRef.addEventListener('toggle', this.handleToggle);\n }\n\n // Setup keyboard listener for manual popover escape handling\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n disconnectedCallback() {\n this.clearTimeouts();\n this.stopAutoUpdate();\n this.stopFollowing();\n this.removeTriggerListeners();\n document.removeEventListener('click', this.handleOutsideClick);\n document.removeEventListener('keydown', this.handleKeyDown);\n if (this.tooltipRef) {\n this.tooltipRef.removeEventListener('toggle', this.handleToggle);\n }\n }\n\n private tooltipClass = tv({\n slots: {\n tooltip: 'bcm-ui-element fixed m-0 bg-color-default-dark text-color-base rounded-md shadow-3 font-medium z-[9999]',\n arrow: 'absolute w-2 h-2 bg-color-default-dark rotate-45',\n content: '',\n },\n variants: {\n size: {\n small: {\n tooltip: 'text-size-3 py-1 px-2',\n },\n medium: {\n tooltip: 'text-size-4 py-1.5 px-3',\n },\n large: {\n tooltip: 'text-size-5 py-2 px-4',\n },\n },\n follow: {\n true: {\n tooltip: 'pointer-events-none',\n },\n },\n },\n });\n\n render() {\n const { tooltip, arrow: arrowClass } = this.tooltipClass({\n size: this.size,\n follow: this.follow,\n });\n\n return (\n <div class=\"inline-block\">\n <slot onSlotchange={this.handleSlotChange}></slot>\n\n <div\n ref={el => (this.tooltipRef = el)}\n id={this.tooltipId}\n part=\"tooltip\"\n class={tooltip()}\n // @ts-ignore - popover is a valid attribute\n popover=\"manual\"\n role=\"tooltip\"\n >\n {this.arrow && !this.follow && <div ref={el => (this.arrowRef = el)} part=\"arrow\" class={arrowClass()} />}\n <div part=\"content\">\n <slot name=\"content\">{this.message}</slot>\n </div>\n </div>\n </div>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"bcm-tooltip.js","mappings":"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","names":["BcmTooltip","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/tooltip/tooltip.css?tag=bcm-tooltip&encapsulation=shadow","src/components/tooltip/tooltip.component.tsx"],"sourcesContent":[":host {\n display: inline-block;\n}\n\n[popover] {\n /* Reset default popover styles */\n border: none;\n padding: 0;\n overflow: visible;\n\n /* Subtle, fast animation - won't be jarring on quick hover transitions */\n transition: opacity 100ms ease-out, transform 100ms ease-out;\n opacity: 0;\n transform: scale(0.95);\n}\n\n[popover]:popover-open {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Starting state when opening */\n@starting-style {\n [popover]:popover-open {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n","import { Component, Element, h, Prop, State, Method, Watch } from '@stencil/core';\nimport { computePosition, flip, shift, offset, arrow, autoUpdate } from '@floating-ui/dom';\nimport { tv } from '@utils/tv';\n\nexport type TooltipTrigger = 'hover' | 'click';\nexport type TooltipPlacement = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipSize = 'small' | 'medium' | 'large';\n\n/**\n * @component BcmTooltip\n * @description A flexible tooltip component that provides contextual information on hover or click.\n * Built on the native Popover API for top-layer rendering and Floating UI for intelligent positioning.\n * Automatically handles overflow, flipping, and complex shadow DOM scenarios.\n *\n * @slot - The trigger element that will show the tooltip\n * @slot content - Custom rich content for the tooltip (overrides message prop)\n *\n * @part tooltip - The tooltip container element (for custom styling)\n * @part arrow - The arrow pointer element\n * @part content - The content wrapper element\n *\n * @example\n * ```html\n * <!-- Basic usage with text message -->\n * <bcm-tooltip message=\"This is a tooltip\">\n * <button>Hover me</button>\n * </bcm-tooltip>\n *\n * <!-- With custom rich content -->\n * <bcm-tooltip placement=\"right\" size=\"large\">\n * <button>Click me</button>\n * <div slot=\"content\">\n * <strong>Rich content</strong>\n * <p>You can add any HTML here</p>\n * </div>\n * </bcm-tooltip>\n *\n * <!-- Click trigger with custom delays -->\n * <bcm-tooltip trigger=\"click\" show-delay=\"0\" hide-delay=\"0\">\n * <span>Click me</span>\n * </bcm-tooltip>\n *\n * <!-- Mouse following mode -->\n * <bcm-tooltip follow={true} message=\"I follow your cursor!\">\n * <div>Move your mouse here</div>\n * </bcm-tooltip>\n *\n * <!-- Programmatic control -->\n * <bcm-tooltip id=\"myTooltip\" message=\"Programmatic tooltip\">\n * <span>Trigger</span>\n * </bcm-tooltip>\n * <script>\n * const tooltip = document.getElementById('myTooltip');\n * tooltip.show();\n * setTimeout(() => tooltip.hide(), 2000);\n * </script>\n *\n * <!-- Custom styling with CSS parts -->\n * <style>\n * bcm-tooltip::part(tooltip) {\n * background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n * border-radius: 12px;\n * }\n * bcm-tooltip::part(arrow) {\n * background: #667eea;\n * }\n * </style>\n * ```\n */\n@Component({\n tag: 'bcm-tooltip',\n styleUrl: 'tooltip.css',\n shadow: true,\n})\nexport class BcmTooltip {\n @Element() host: HTMLBcmTooltipElement;\n\n private tooltipRef?: HTMLDivElement;\n private arrowRef?: HTMLDivElement;\n private triggerRef?: HTMLElement;\n private cleanupAutoUpdate?: () => void;\n private showTimeout?: number;\n private hideTimeout?: number;\n private mouseX = 0;\n private mouseY = 0;\n private rafId?: number;\n private tooltipId: string;\n\n /**\n * How the tooltip is triggered\n * - 'hover': Shows on mouse enter, hides on mouse leave\n * - 'click': Toggles on click, closes on outside click or Escape key\n */\n @Prop() trigger: TooltipTrigger = 'hover';\n\n /**\n * Preferred placement of the tooltip relative to the trigger\n * Note: Tooltip will automatically flip if there's not enough space\n * - 'top': Above the trigger element\n * - 'right': To the right of the trigger element\n * - 'bottom': Below the trigger element\n * - 'left': To the left of the trigger element\n */\n @Prop() placement: TooltipPlacement = 'top';\n\n /**\n * Size variant of the tooltip\n * - 'small': Compact tooltip with minimal padding (text-size-3, py-1 px-2)\n * - 'medium': Standard tooltip size (text-size-4, py-1.5 px-3)\n * - 'large': Larger tooltip for more content (text-size-5, py-2 px-4)\n */\n @Prop() size: TooltipSize = 'medium';\n\n /**\n * Simple text message to display in the tooltip\n * Can be overridden by slotting content into the 'content' slot\n */\n @Prop() message?: string;\n\n /**\n * Delay in milliseconds before showing the tooltip\n * Useful to prevent tooltips from appearing on quick mouse movements\n */\n @Prop({ attribute: 'show-delay' }) showDelay: number = 150;\n\n /**\n * Delay in milliseconds before hiding the tooltip\n * Provides a grace period for mouse movements\n */\n @Prop({ attribute: 'hide-delay' }) hideDelay: number = 100;\n\n /**\n * Whether to show an arrow pointing to the trigger element\n * Note: Arrow is automatically hidden in 'follow' mode\n */\n @Prop() arrow: boolean = true;\n\n /**\n * Disables the tooltip, preventing it from showing\n * Useful for conditional tooltips based on application state\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Distance in pixels between the tooltip and the trigger element\n * Also used as the offset in 'follow' mode\n */\n @Prop() offset: number = 12;\n\n /**\n * Makes the tooltip follow the mouse cursor\n * When enabled:\n * - Arrow is hidden\n * - Tooltip position updates smoothly with cursor movement\n * - Pointer events are disabled on tooltip to prevent interference\n */\n @Prop() follow: boolean = false;\n\n @State() isOpen = false;\n\n @Watch('disabled')\n handleDisabledChange(disabled: boolean) {\n if (disabled && this.isOpen) {\n this.hide();\n }\n }\n\n @Watch('trigger')\n handleTriggerChange() {\n this.removeTriggerListeners();\n this.setupOutsideClickListener();\n if (this.triggerRef) {\n this.setupTriggerListeners();\n }\n }\n\n @Watch('isOpen')\n async handleOpenChange(open: boolean) {\n if (!this.tooltipRef) return;\n\n if (open) {\n this.tooltipRef.showPopover();\n\n // Wait for next frame to ensure popover is rendered\n await new Promise(resolve => requestAnimationFrame(() => resolve(undefined)));\n\n if (this.follow) {\n this.startFollowing();\n } else {\n await this.updatePosition();\n this.startAutoUpdate();\n }\n } else {\n this.tooltipRef.hidePopover();\n this.stopFollowing();\n this.stopAutoUpdate();\n }\n }\n\n /**\n * Programmatically shows the tooltip\n * Respects the showDelay prop and disabled state\n */\n @Method()\n async show() {\n if (this.disabled) return;\n this.clearTimeouts();\n this.showTimeout = window.setTimeout(() => {\n this.isOpen = true;\n }, this.showDelay);\n }\n\n /**\n * Programmatically hides the tooltip\n * Respects the hideDelay prop\n */\n @Method()\n async hide() {\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.isOpen = false;\n }, this.hideDelay);\n }\n\n /**\n * Toggles the tooltip visibility\n * If open, hides it; if closed, shows it\n */\n @Method()\n async toggle() {\n if (this.isOpen) {\n await this.hide();\n } else {\n await this.show();\n }\n }\n\n private clearTimeouts() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = undefined;\n }\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n }\n }\n\n private startAutoUpdate() {\n if (!this.triggerRef || !this.tooltipRef || this.follow) return;\n\n this.cleanupAutoUpdate = autoUpdate(this.triggerRef, this.tooltipRef, () => this.updatePosition(), {\n ancestorScroll: true,\n ancestorResize: true,\n elementResize: true,\n layoutShift: true,\n });\n }\n\n private stopAutoUpdate() {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = undefined;\n }\n }\n\n private startFollowing() {\n if (!this.follow) return;\n\n const updateFollowPosition = () => {\n if (!this.isOpen || !this.tooltipRef) {\n this.rafId = undefined;\n return;\n }\n\n const offsetX = this.offset;\n const offsetY = this.offset;\n\n this.tooltipRef.style.left = `${this.mouseX + offsetX}px`;\n this.tooltipRef.style.top = `${this.mouseY + offsetY}px`;\n\n this.rafId = requestAnimationFrame(updateFollowPosition);\n };\n\n this.rafId = requestAnimationFrame(updateFollowPosition);\n }\n\n private stopFollowing() {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n }\n\n private async updatePosition() {\n if (!this.triggerRef || !this.tooltipRef || this.follow) return;\n\n try {\n // Check if trigger element is still in viewport\n const triggerRect = this.triggerRef.getBoundingClientRect();\n const isInViewport =\n triggerRect.bottom > 0 && triggerRect.top < window.innerHeight && triggerRect.right > 0 && triggerRect.left < window.innerWidth;\n\n // Hide tooltip if trigger is out of viewport\n if (!isInViewport && this.isOpen) {\n this.hide();\n return;\n }\n\n const middleware = [offset(this.offset), flip(), shift({ padding: 8 })];\n\n if (this.arrow && this.arrowRef) {\n middleware.push(arrow({ element: this.arrowRef }));\n }\n\n // Use virtual element to properly handle shadow DOM boundaries\n const virtualElement = {\n getBoundingClientRect: () => this.triggerRef.getBoundingClientRect(),\n };\n\n const { x, y, placement, middlewareData } = await computePosition(virtualElement, this.tooltipRef, {\n placement: this.placement,\n strategy: 'fixed',\n middleware,\n });\n\n this.tooltipRef.style.left = `${x}px`;\n this.tooltipRef.style.top = `${y}px`;\n\n // Arrow positioning\n if (this.arrow && this.arrowRef && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left';\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[side];\n\n Object.assign(this.arrowRef.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n });\n }\n } catch (error) {\n console.error('Failed to compute tooltip position:', error);\n }\n }\n\n private setupTriggerListeners() {\n if (!this.triggerRef) return;\n\n // Add new listeners based on trigger type\n if (this.trigger === 'hover') {\n this.triggerRef.addEventListener('mouseenter', this.handleMouseEnter);\n this.triggerRef.addEventListener('mouseleave', this.handleMouseLeave);\n\n if (this.follow) {\n this.triggerRef.addEventListener('mousemove', this.handleMouseMove);\n }\n } else if (this.trigger === 'click') {\n this.triggerRef.addEventListener('click', this.handleClick);\n }\n }\n\n private handleSlotChange = () => {\n const slot = this.host.shadowRoot?.querySelector('slot:not([name])');\n if (!slot) return;\n\n const elements = (slot as HTMLSlotElement).assignedElements();\n const assignedElement = elements[0] as HTMLElement;\n\n // Get the actual element position from the host, not shadow DOM\n // This ensures proper positioning across shadow boundaries\n this.triggerRef = (assignedElement || this.host) as HTMLElement;\n\n if (!this.triggerRef) return;\n\n // Setup ARIA relationship\n if (this.tooltipRef && this.tooltipId) {\n this.triggerRef.setAttribute('aria-describedby', this.tooltipId);\n }\n\n // Remove old listeners\n this.removeTriggerListeners();\n\n // Add new listeners\n this.setupTriggerListeners();\n };\n\n private removeTriggerListeners() {\n if (!this.triggerRef) return;\n\n this.triggerRef.removeEventListener('mouseenter', this.handleMouseEnter);\n this.triggerRef.removeEventListener('mouseleave', this.handleMouseLeave);\n this.triggerRef.removeEventListener('mousemove', this.handleMouseMove);\n this.triggerRef.removeEventListener('click', this.handleClick);\n }\n\n private handleMouseEnter = () => {\n if (!this.disabled) {\n this.show();\n }\n };\n\n private handleMouseLeave = () => {\n this.hide();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n this.mouseX = e.clientX;\n this.mouseY = e.clientY;\n };\n\n private handleClick = () => {\n if (!this.disabled) {\n this.toggle();\n }\n };\n\n private handleOutsideClick = (e: Event) => {\n const target = e.target as Node;\n if (!this.host.contains(target) && !this.tooltipRef?.contains(target)) {\n this.hide();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen) {\n // Only close if this tooltip's popover element is the topmost\n const topmostPopover = document.querySelector('[popover]:popover-open:last-of-type');\n if (topmostPopover === this.tooltipRef) {\n e.stopPropagation(); // Prevent event from reaching parent popovers\n this.hide();\n // Return focus to trigger element\n if (this.triggerRef && 'focus' in this.triggerRef) {\n (this.triggerRef as HTMLElement).focus();\n }\n }\n }\n };\n\n private handleToggle = (e: Event) => {\n const toggleEvent = e as ToggleEvent;\n\n // Sync our internal state with popover state\n if (toggleEvent.newState === 'open' && !this.isOpen) {\n this.isOpen = true;\n } else if (toggleEvent.newState === 'closed' && this.isOpen) {\n this.isOpen = false;\n }\n };\n\n private setupOutsideClickListener() {\n // Remove existing listener first\n document.removeEventListener('click', this.handleOutsideClick);\n\n // Add listener only for click trigger\n if (this.trigger === 'click') {\n document.addEventListener('click', this.handleOutsideClick);\n }\n }\n\n componentDidLoad() {\n // Generate unique ID for ARIA relationship\n this.tooltipId = `tooltip-${Math.random().toString(36).substring(2, 11)}`;\n\n // Setup outside click listener for click trigger\n this.setupOutsideClickListener();\n\n // Listen to popover toggle event to sync state\n if (this.tooltipRef) {\n this.tooltipRef.addEventListener('toggle', this.handleToggle);\n }\n\n // Setup keyboard listener for manual popover escape handling\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n disconnectedCallback() {\n this.clearTimeouts();\n this.stopAutoUpdate();\n this.stopFollowing();\n this.removeTriggerListeners();\n document.removeEventListener('click', this.handleOutsideClick);\n document.removeEventListener('keydown', this.handleKeyDown);\n if (this.tooltipRef) {\n this.tooltipRef.removeEventListener('toggle', this.handleToggle);\n }\n }\n\n private tooltipClass = tv({\n slots: {\n tooltip: 'bcm-ui-element fixed m-0 bg-color-default-dark text-color-base rounded-md shadow-3 font-medium z-[9999]',\n arrow: 'absolute w-2 h-2 bg-color-default-dark rotate-45',\n content: '',\n },\n variants: {\n size: {\n small: {\n tooltip: 'text-size-3 py-1 px-2',\n },\n medium: {\n tooltip: 'text-size-4 py-1.5 px-3',\n },\n large: {\n tooltip: 'text-size-5 py-2 px-4',\n },\n },\n follow: {\n true: {\n tooltip: 'pointer-events-none',\n },\n },\n },\n });\n\n render() {\n const { tooltip, arrow: arrowClass } = this.tooltipClass({\n size: this.size,\n follow: this.follow,\n });\n\n return (\n <div class=\"inline-block\">\n <slot onSlotchange={this.handleSlotChange}></slot>\n\n <div\n ref={el => (this.tooltipRef = el)}\n id={this.tooltipId}\n part=\"tooltip\"\n class={tooltip()}\n // @ts-ignore - popover is a valid attribute\n popover=\"manual\"\n role=\"tooltip\"\n >\n {this.arrow && !this.follow && <div ref={el => (this.arrowRef = el)} part=\"arrow\" class={arrowClass()} />}\n <div part=\"content\">\n <slot name=\"content\">{this.message}</slot>\n </div>\n </div>\n </div>\n );\n }\n}\n"],"version":3}
|