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
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('./index-1Qal-onT.js');
|
|
4
|
+
var tv = require('./tv-ngpIbGlG.js');
|
|
5
|
+
|
|
6
|
+
const fileUploadCss = ".block{display:block}:host{display:block}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.bcm-ui-element{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.static{position:static}.relative{position:relative}.flex{display:flex}.hidden{display:none}.size-4{height:1rem;width:1rem}.size-5{height:1.25rem;width:1.25rem}.size-8{height:2rem;width:2rem}.h-1\\.5{height:.375rem}.h-10{height:2.5rem}.h-full{height:100%}.w-\\[50px\\]{width:50px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\\[3ch\\]{min-width:3ch}.max-w-64{max-width:16rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{user-select:none}.appearance-none{appearance:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:var(--bcm-ui-border-radius-default,6px)}.rounded-full{border-radius:var(--bcm-ui-border-radius-full,9999px)}.border{border-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-color-default{border-color:var(--bcm-ui-color-border-default)}.border-color-disabled{border-color:var(--bcm-ui-color-border-disabled)}.border-color-primary{border-color:var(--bcm-ui-color-border-primary)}.bg-color-basic-masterpage{background-color:var(--bcm-ui-color-background-basic-masterpage)}.bg-color-default{background-color:var(--bcm-ui-color-background-default-default)}.bg-color-disabled{background-color:var(--bcm-ui-color-background-disabled-default)}.bg-color-primary{background-color:var(--bcm-ui-color-background-primary-default)}.bg-color-soft-blue{background-color:var(--bcm-ui-color-background-soft-blue-default)}.bg-transparent{background-color:transparent}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.py-4{padding-bottom:1rem;padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-size-10{font-size:var(--bcm-ui-font-size-10,36px);line-height:var(--bcm-ui-line-height-10,44px)}.text-size-2{font-size:var(--bcm-ui-font-size-2,10px);line-height:var(--bcm-ui-line-height-2,12px)}.text-size-3{font-size:var(--bcm-ui-font-size-3,12px);line-height:var(--bcm-ui-line-height-3,16px)}.text-size-4{font-size:var(--bcm-ui-font-size-4,14px);line-height:var(--bcm-ui-line-height-4,20px)}.text-size-8{font-size:var(--bcm-ui-font-size-8,24px);line-height:var(--bcm-ui-line-height-8,32px)}.font-medium{font-weight:500}.text-color-caption{color:var(--bcm-ui-color-text-caption)}.text-color-default{color:var(--bcm-ui-color-text-default)}.text-color-disabled{color:var(--bcm-ui-color-text-disabled)}.text-color-helper{color:var(--bcm-ui-color-text-helper)}.text-color-icon-default{color:var(--bcm-ui-color-text-icon-default)}.text-color-label{color:var(--bcm-ui-color-text-label)}.text-color-primary{color:var(--bcm-ui-color-text-primary)}.no-underline{text-decoration-line:none}.opacity-60{opacity:.6}.shadow{--tw-shadow:var(--bcm-ui-box-shadow-default);--tw-shadow-colored:var(--bcm-ui-box-shadow-default);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.hover\\:bg-color-default-hover:hover{background-color:var(--bcm-ui-color-background-default-hover)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:no-underline:hover{text-decoration-line:none}";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @component BcmFileUpload
|
|
10
|
+
* @description A fully featured drag-and-drop file uploader component.
|
|
11
|
+
* Supports form-associated behavior, validation, custom size limits,
|
|
12
|
+
* accepted file type filtering, multiple file selection, progress tracking,
|
|
13
|
+
* upload canceling, file removal, and accessibility events (focus/blur).
|
|
14
|
+
*
|
|
15
|
+
* Upload progress is currently simulated locally. The `uploadUrl` prop
|
|
16
|
+
* is reserved for future real HTTP upload integration and has no effect yet.
|
|
17
|
+
*
|
|
18
|
+
* @example Basic usage
|
|
19
|
+
* <bcm-file-upload name="report" label="Upload Report"></bcm-file-upload>
|
|
20
|
+
*
|
|
21
|
+
* @example Multiple files
|
|
22
|
+
* <bcm-file-upload name="attachments" multiple></bcm-file-upload>
|
|
23
|
+
*
|
|
24
|
+
* @example Custom max size and accepted formats
|
|
25
|
+
* <bcm-file-upload
|
|
26
|
+
* name="medicalFiles"
|
|
27
|
+
* accept=".pdf,.jpg"
|
|
28
|
+
* maxSize={5}
|
|
29
|
+
* ></bcm-file-upload>
|
|
30
|
+
*
|
|
31
|
+
* @prop {string} name
|
|
32
|
+
* The name of the form field used when the component is inside a `<form>`.
|
|
33
|
+
* Supports automatic FormData generation including:
|
|
34
|
+
* - single upload: name="file"
|
|
35
|
+
* - multiple upload: name="file[0], file[1], ..."
|
|
36
|
+
*
|
|
37
|
+
* @prop {string} label
|
|
38
|
+
* Optional label shown above the upload zone.
|
|
39
|
+
*
|
|
40
|
+
* @prop {string} caption
|
|
41
|
+
* Optional helper text rendered below the file list. Example: “Max size 5MB”.
|
|
42
|
+
*
|
|
43
|
+
* @prop {boolean} multiple
|
|
44
|
+
* Allows selecting and uploading multiple files at once.
|
|
45
|
+
*
|
|
46
|
+
* @prop {string} accept
|
|
47
|
+
* Comma-separated list of allowed file extensions.
|
|
48
|
+
* Example: ".pdf,.xls,.png".
|
|
49
|
+
*
|
|
50
|
+
* @prop {number} maxSize
|
|
51
|
+
* Maximum allowed size per file (in MB). If exceeded, an error alert appears.
|
|
52
|
+
*
|
|
53
|
+
* @prop {boolean} required
|
|
54
|
+
* Enables form validation — at least one file must be uploaded.
|
|
55
|
+
* Validity integrates with native `<form>` using ElementInternals.
|
|
56
|
+
*
|
|
57
|
+
* @prop {boolean} disabled
|
|
58
|
+
* Makes the uploader non-interactive: no clicking, no drag-and-drop.
|
|
59
|
+
*
|
|
60
|
+
* @prop {"medium" | "small"} size
|
|
61
|
+
* Controls spacing, typography, and visual density of the upload zone.
|
|
62
|
+
*
|
|
63
|
+
* @prop {string} uploadUrl
|
|
64
|
+
* Reserved for future backend upload integration.
|
|
65
|
+
* Currently has no effect and does not trigger any HTTP requests.
|
|
66
|
+
*
|
|
67
|
+
* @prop {number} maxFileCount
|
|
68
|
+
* Optional limit for how many files can be selected in total.
|
|
69
|
+
* Only applied when `multiple` is true.
|
|
70
|
+
* If exceeded, new files are ignored and a max-file-count error is shown.
|
|
71
|
+
*
|
|
72
|
+
* @prop {BcmUploadErrorMessages} customErrorMessages
|
|
73
|
+
* Optional override for all error messages:
|
|
74
|
+
* - maxSize: file too large
|
|
75
|
+
* - type: unsupported file type
|
|
76
|
+
* - maxFileCount: too many files selected
|
|
77
|
+
* - required: no file selected while required
|
|
78
|
+
*
|
|
79
|
+
*
|
|
80
|
+
* @event {EventEmitter<File[]>} bcmFileChange
|
|
81
|
+
* Fired whenever the component's internal file list changes.
|
|
82
|
+
* Emits an array of the current File objects.
|
|
83
|
+
*
|
|
84
|
+
* @event {EventEmitter<BcmUploadItem>} bcmFileRemoved
|
|
85
|
+
* Fired when the user removes a file from the list.
|
|
86
|
+
*
|
|
87
|
+
* @event {EventEmitter<BcmUploadItem>} bcmUploadCanceled
|
|
88
|
+
* Fired when an upload is canceled before completion.
|
|
89
|
+
*
|
|
90
|
+
* @event {EventEmitter<FocusEvent>} bcmFocus
|
|
91
|
+
* Fired when upload zone receives keyboard or mouse focus.
|
|
92
|
+
*
|
|
93
|
+
* @event {EventEmitter<FocusEvent>} bcmBlur
|
|
94
|
+
* Fired when upload zone loses focus.
|
|
95
|
+
*
|
|
96
|
+
*
|
|
97
|
+
* @csspart upload-zone
|
|
98
|
+
* The root clickable drop area for file selection or drag-and-drop.
|
|
99
|
+
*
|
|
100
|
+
* @csspart file-list
|
|
101
|
+
* The container wrapping rendered file rows.
|
|
102
|
+
*
|
|
103
|
+
* @csspart file-row
|
|
104
|
+
* A single file entry including its name, actions, and progress bar.
|
|
105
|
+
*
|
|
106
|
+
* @csspart remove-btn
|
|
107
|
+
* The remove action button inside uploaded file rows.
|
|
108
|
+
*
|
|
109
|
+
* @csspart cancel-btn
|
|
110
|
+
* The cancel upload button during uploading progress.
|
|
111
|
+
*
|
|
112
|
+
* @csspart download-btn
|
|
113
|
+
* The download button for already uploaded files.
|
|
114
|
+
*
|
|
115
|
+
* @csspart label
|
|
116
|
+
* The external label text displayed above the component.
|
|
117
|
+
*
|
|
118
|
+
* @csspart caption
|
|
119
|
+
* Helper or informative caption displayed below the uploaded list.
|
|
120
|
+
*/
|
|
121
|
+
const uploadClasses = tv.tv({
|
|
122
|
+
slots: {
|
|
123
|
+
container: 'bcm-ui-element flex flex-col gap-2 w-full max-w-64',
|
|
124
|
+
label: 'text-size-4 font-medium text-color-label',
|
|
125
|
+
// Upload Zone
|
|
126
|
+
zone: [
|
|
127
|
+
'relative rounded border border-dashed transition-all duration-200 ease-in-out',
|
|
128
|
+
'px-4 py-4 select-none',
|
|
129
|
+
'border-color-default bg-color-basic-masterpage',
|
|
130
|
+
'flex items-center justify-center',
|
|
131
|
+
],
|
|
132
|
+
zoneActive: 'border-color-primary bg-color-soft-blue',
|
|
133
|
+
iconContainer: 'flex items-center justify-center shrink-0',
|
|
134
|
+
iconSizeClass: 'text-size-10',
|
|
135
|
+
zoneTextWrapper: 'flex flex-col flex-1 min-w-0',
|
|
136
|
+
zoneTextMain: 'text-size-4 text-color-default font-medium',
|
|
137
|
+
zoneLink: 'text-color-primary hover:underline',
|
|
138
|
+
zoneTextSub: 'text-size-3 text-color-caption',
|
|
139
|
+
// File List
|
|
140
|
+
list: 'flex flex-col gap-3',
|
|
141
|
+
// File Row
|
|
142
|
+
fileRow: [
|
|
143
|
+
'flex flex-col items-center gap-2 rounded border transition-colors min-w-0 px-3 py-1.5',
|
|
144
|
+
'bg-color-default border-color-default',
|
|
145
|
+
],
|
|
146
|
+
fileIcon: 'flex items-center justify-center rounded bg-color-soft-blue shrink-0',
|
|
147
|
+
fileNameWrapper: 'flex flex-col flex-1 min-w-0',
|
|
148
|
+
fileTitle: 'text-size-4 font-medium text-color-default',
|
|
149
|
+
fileName: 'text-size-4 text-color-default truncate',
|
|
150
|
+
// Progress
|
|
151
|
+
progressWrapper: 'flex items-center gap-3 w-full',
|
|
152
|
+
progressBar: 'h-full bg-color-primary rounded transition-all duration-300 ease-out',
|
|
153
|
+
percent: 'text-size-4 font-medium text-color-caption min-w-[3ch] text-right',
|
|
154
|
+
// Actions
|
|
155
|
+
actions: 'flex items-center gap-2',
|
|
156
|
+
iconBtn: [
|
|
157
|
+
'size-4 rounded-full flex items-center justify-center transition-colors cursor-pointer appearance-none',
|
|
158
|
+
'text-color-icon-default hover:bg-color-default-hover border-none',
|
|
159
|
+
],
|
|
160
|
+
caption: 'text-size-3 text-color-caption',
|
|
161
|
+
},
|
|
162
|
+
variants: {
|
|
163
|
+
size: {
|
|
164
|
+
medium: {
|
|
165
|
+
zone: 'flex-col text-center gap-2',
|
|
166
|
+
iconContainer: 'h-10 w-[50px]',
|
|
167
|
+
zoneTextWrapper: 'items-center gap-1',
|
|
168
|
+
},
|
|
169
|
+
small: {
|
|
170
|
+
zone: 'px-3 py-4 gap-2 flex-row text-left',
|
|
171
|
+
iconContainer: 'size-8',
|
|
172
|
+
iconSizeClass: 'text-size-8',
|
|
173
|
+
zoneTextWrapper: 'items-start gap-1',
|
|
174
|
+
label: 'text-size-3',
|
|
175
|
+
caption: 'text-size-2',
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
disabled: {
|
|
179
|
+
true: 'opacity-60 cursor-not-allowed',
|
|
180
|
+
false: '',
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
compoundVariants: [
|
|
184
|
+
{
|
|
185
|
+
disabled: true,
|
|
186
|
+
class: {
|
|
187
|
+
zone: 'bg-color-disabled border-color-disabled cursor-not-allowed',
|
|
188
|
+
zoneTextMain: 'text-color-disabled',
|
|
189
|
+
zoneTextSub: 'text-color-disabled',
|
|
190
|
+
zoneLink: 'text-color-disabled cursor-not-allowed no-underline hover:no-underline',
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
disabled: false,
|
|
195
|
+
class: {
|
|
196
|
+
zone: 'cursor-pointer',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
defaultVariants: {
|
|
201
|
+
size: 'medium',
|
|
202
|
+
disabled: false,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
const BcmFileUpload = class {
|
|
206
|
+
constructor(hostRef) {
|
|
207
|
+
index.registerInstance(this, hostRef);
|
|
208
|
+
this.bcmFileChange = index.createEvent(this, "bcmFileChange", 1);
|
|
209
|
+
this.bcmFileRemoved = index.createEvent(this, "bcmFileRemoved", 1);
|
|
210
|
+
this.bcmUploadCanceled = index.createEvent(this, "bcmUploadCanceled", 1);
|
|
211
|
+
this.bcmFocus = index.createEvent(this, "bcmFocus", 1);
|
|
212
|
+
this.bcmBlur = index.createEvent(this, "bcmBlur", 1);
|
|
213
|
+
if (hostRef.$hostElement$["s-ei"]) {
|
|
214
|
+
this.internals = hostRef.$hostElement$["s-ei"];
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
this.internals = hostRef.$hostElement$.attachInternals();
|
|
218
|
+
hostRef.$hostElement$["s-ei"] = this.internals;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
get host() { return index.getElement(this); }
|
|
222
|
+
internals;
|
|
223
|
+
fileInput;
|
|
224
|
+
uploadTimer;
|
|
225
|
+
// Focus target for validation errors and keyboard focus
|
|
226
|
+
uploadZoneRef;
|
|
227
|
+
name = 'file';
|
|
228
|
+
label = '';
|
|
229
|
+
caption = '';
|
|
230
|
+
multiple = false;
|
|
231
|
+
accept = '.xls,.pdf';
|
|
232
|
+
maxSize = 2; // MB
|
|
233
|
+
required = false;
|
|
234
|
+
disabled = false;
|
|
235
|
+
size = 'medium';
|
|
236
|
+
/**
|
|
237
|
+
* Reserved for future backend upload integration.
|
|
238
|
+
* Currently does not affect component behavior.
|
|
239
|
+
*/
|
|
240
|
+
uploadUrl;
|
|
241
|
+
/**
|
|
242
|
+
* Maximum number of files allowed in total.
|
|
243
|
+
* Only applied when `multiple` is true.
|
|
244
|
+
*/
|
|
245
|
+
maxFileCount;
|
|
246
|
+
/**
|
|
247
|
+
* Allows consumers to override default error messages.
|
|
248
|
+
*/
|
|
249
|
+
customErrorMessages;
|
|
250
|
+
files = [];
|
|
251
|
+
dragActive = false;
|
|
252
|
+
maxSizeError = false;
|
|
253
|
+
typeError = false;
|
|
254
|
+
maxFileCountError = false;
|
|
255
|
+
// Emits when file list changes
|
|
256
|
+
bcmFileChange;
|
|
257
|
+
// Emits when a file is removed
|
|
258
|
+
bcmFileRemoved;
|
|
259
|
+
// Emits when an upload is canceled
|
|
260
|
+
bcmUploadCanceled;
|
|
261
|
+
// Emits when the upload zone receives focus
|
|
262
|
+
bcmFocus;
|
|
263
|
+
// Emits when the upload zone loses focus
|
|
264
|
+
bcmBlur;
|
|
265
|
+
internalMaxSizeInBytes = this.maxSize * 1024 * 1024;
|
|
266
|
+
componentWillLoad() {
|
|
267
|
+
this.internalMaxSizeInBytes = this.maxSize * 1024 * 1024;
|
|
268
|
+
this.updateFormValueAndValidity();
|
|
269
|
+
}
|
|
270
|
+
disconnectedCallback() {
|
|
271
|
+
// Clear interval when component is removed from the DOM
|
|
272
|
+
if (this.uploadTimer) {
|
|
273
|
+
window.clearInterval(this.uploadTimer);
|
|
274
|
+
this.uploadTimer = undefined;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
handleMaxSizeChange() {
|
|
278
|
+
this.internalMaxSizeInBytes = this.maxSize * 1024 * 1024;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Normalize and check a file against the `accept` attribute.
|
|
282
|
+
*/
|
|
283
|
+
isFileAccepted(file) {
|
|
284
|
+
if (!this.accept)
|
|
285
|
+
return true;
|
|
286
|
+
const extension = '.' + (file.name.split('.').pop() || '').toLowerCase();
|
|
287
|
+
const accepted = this.accept
|
|
288
|
+
.toLowerCase()
|
|
289
|
+
.split(',')
|
|
290
|
+
.map(x => x.trim())
|
|
291
|
+
.filter(Boolean); // e.g. ['.pdf', '.jpg', '.png']
|
|
292
|
+
return accepted.includes(extension);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Update form value and validity state for form-associated behavior.
|
|
296
|
+
*/
|
|
297
|
+
updateFormValueAndValidity() {
|
|
298
|
+
if (!this.internals)
|
|
299
|
+
return;
|
|
300
|
+
if (!this.files.length) {
|
|
301
|
+
this.internals.setFormValue(null);
|
|
302
|
+
if (this.required) {
|
|
303
|
+
const msg = this.customErrorMessages?.required ||
|
|
304
|
+
'Please upload at least one file.';
|
|
305
|
+
this.internals.setValidity({ valueMissing: true }, msg,
|
|
306
|
+
// Use upload zone if available, otherwise host as the validation anchor
|
|
307
|
+
this.uploadZoneRef ?? this.host);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
this.internals.setValidity({});
|
|
311
|
+
}
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const formData = new FormData();
|
|
315
|
+
this.files.forEach((item, index) => {
|
|
316
|
+
const key = this.multiple ? `${this.name}[${index}]` : this.name;
|
|
317
|
+
formData.append(key, item.file);
|
|
318
|
+
});
|
|
319
|
+
this.internals.setFormValue(formData);
|
|
320
|
+
this.internals.setValidity({});
|
|
321
|
+
}
|
|
322
|
+
emitChange() {
|
|
323
|
+
this.bcmFileChange.emit(this.files.map(f => f.file));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Simulate upload progress. Replace with real upload logic if needed.
|
|
327
|
+
*/
|
|
328
|
+
startFakeUpload() {
|
|
329
|
+
if (this.uploadTimer) {
|
|
330
|
+
window.clearInterval(this.uploadTimer);
|
|
331
|
+
}
|
|
332
|
+
this.uploadTimer = window.setInterval(() => {
|
|
333
|
+
let anyUploading = false;
|
|
334
|
+
this.files = this.files.map(item => {
|
|
335
|
+
if (item.status !== 'uploading')
|
|
336
|
+
return item;
|
|
337
|
+
anyUploading = true;
|
|
338
|
+
const current = item.progress ?? 0;
|
|
339
|
+
const next = Math.min(current + 15, 100);
|
|
340
|
+
if (next >= 100) {
|
|
341
|
+
return { ...item, status: 'uploaded', progress: undefined };
|
|
342
|
+
}
|
|
343
|
+
return { ...item, progress: next };
|
|
344
|
+
});
|
|
345
|
+
if (!anyUploading && this.uploadTimer) {
|
|
346
|
+
window.clearInterval(this.uploadTimer);
|
|
347
|
+
this.uploadTimer = undefined;
|
|
348
|
+
this.updateFormValueAndValidity();
|
|
349
|
+
this.emitChange();
|
|
350
|
+
}
|
|
351
|
+
}, 300);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Add files from input or drop.
|
|
355
|
+
*/
|
|
356
|
+
addFiles(fileList) {
|
|
357
|
+
if (!fileList || this.disabled)
|
|
358
|
+
return;
|
|
359
|
+
const newItems = [];
|
|
360
|
+
let hasSizeError = false;
|
|
361
|
+
let hasTypeError = false;
|
|
362
|
+
Array.from(fileList).forEach(file => {
|
|
363
|
+
if (!this.isFileAccepted(file)) {
|
|
364
|
+
hasTypeError = true;
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (file.size > this.internalMaxSizeInBytes) {
|
|
368
|
+
hasSizeError = true;
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
newItems.push({
|
|
372
|
+
id: crypto.randomUUID(),
|
|
373
|
+
file,
|
|
374
|
+
status: 'uploading',
|
|
375
|
+
progress: 0,
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
this.maxSizeError = hasSizeError;
|
|
379
|
+
this.typeError = hasTypeError;
|
|
380
|
+
this.maxFileCountError = false;
|
|
381
|
+
// If there are no valid files, just update validity and exit.
|
|
382
|
+
if (!newItems.length) {
|
|
383
|
+
this.updateFormValueAndValidity();
|
|
384
|
+
this.emitChange();
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
let merged;
|
|
388
|
+
if (this.multiple) {
|
|
389
|
+
if (typeof this.maxFileCount === 'number') {
|
|
390
|
+
const remaining = this.maxFileCount - this.files.length;
|
|
391
|
+
if (remaining <= 0) {
|
|
392
|
+
this.maxFileCountError = true;
|
|
393
|
+
this.updateFormValueAndValidity();
|
|
394
|
+
this.emitChange();
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const acceptedNew = newItems.slice(0, Math.max(0, remaining));
|
|
398
|
+
if (acceptedNew.length < newItems.length) {
|
|
399
|
+
this.maxFileCountError = true;
|
|
400
|
+
}
|
|
401
|
+
merged = [...this.files, ...acceptedNew];
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
merged = [...this.files, ...newItems];
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
// single file mode → only take first new item
|
|
409
|
+
merged = [newItems[0]];
|
|
410
|
+
}
|
|
411
|
+
this.files = merged;
|
|
412
|
+
this.updateFormValueAndValidity();
|
|
413
|
+
this.emitChange();
|
|
414
|
+
// Only fake upload for now
|
|
415
|
+
this.startFakeUpload();
|
|
416
|
+
}
|
|
417
|
+
removeFile(item) {
|
|
418
|
+
this.files = this.files.filter(f => f.id !== item.id);
|
|
419
|
+
this.bcmFileRemoved.emit(item);
|
|
420
|
+
this.updateFormValueAndValidity();
|
|
421
|
+
this.emitChange();
|
|
422
|
+
}
|
|
423
|
+
cancelUpload(item) {
|
|
424
|
+
this.files = this.files.filter(f => f.id !== item.id);
|
|
425
|
+
this.bcmUploadCanceled.emit(item);
|
|
426
|
+
this.updateFormValueAndValidity();
|
|
427
|
+
this.emitChange();
|
|
428
|
+
}
|
|
429
|
+
onFileInputChange = (event) => {
|
|
430
|
+
const input = event.target;
|
|
431
|
+
this.addFiles(input.files);
|
|
432
|
+
// Reset input so the same file can be selected again
|
|
433
|
+
input.value = '';
|
|
434
|
+
};
|
|
435
|
+
downloadFile(file) {
|
|
436
|
+
const url = URL.createObjectURL(file);
|
|
437
|
+
const a = document.createElement('a');
|
|
438
|
+
a.href = url;
|
|
439
|
+
a.download = file.name;
|
|
440
|
+
a.click();
|
|
441
|
+
URL.revokeObjectURL(url);
|
|
442
|
+
}
|
|
443
|
+
handleDrop(ev) {
|
|
444
|
+
ev.preventDefault();
|
|
445
|
+
this.dragActive = false;
|
|
446
|
+
if (this.disabled)
|
|
447
|
+
return;
|
|
448
|
+
const files = ev.dataTransfer?.files || null;
|
|
449
|
+
if (!files || files.length === 0)
|
|
450
|
+
return;
|
|
451
|
+
const first = files.item(0);
|
|
452
|
+
if (!first || !this.isFileAccepted(first)) {
|
|
453
|
+
this.typeError = true;
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
this.addFiles(files);
|
|
457
|
+
}
|
|
458
|
+
handleDragOver(ev) {
|
|
459
|
+
ev.preventDefault();
|
|
460
|
+
if (this.disabled)
|
|
461
|
+
return;
|
|
462
|
+
this.dragActive = true;
|
|
463
|
+
}
|
|
464
|
+
handleDragLeave(ev) {
|
|
465
|
+
ev.preventDefault();
|
|
466
|
+
this.dragActive = false;
|
|
467
|
+
}
|
|
468
|
+
openFileDialog = () => {
|
|
469
|
+
if (this.disabled)
|
|
470
|
+
return;
|
|
471
|
+
this.fileInput?.click();
|
|
472
|
+
};
|
|
473
|
+
formResetCallback() {
|
|
474
|
+
this.files = [];
|
|
475
|
+
this.maxSizeError = false;
|
|
476
|
+
this.typeError = false;
|
|
477
|
+
this.maxFileCountError = false;
|
|
478
|
+
if (this.uploadTimer) {
|
|
479
|
+
window.clearInterval(this.uploadTimer);
|
|
480
|
+
this.uploadTimer = undefined;
|
|
481
|
+
}
|
|
482
|
+
this.updateFormValueAndValidity();
|
|
483
|
+
this.emitChange();
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* When the browser or user calls element.focus(),
|
|
487
|
+
* move focus to the upload zone.
|
|
488
|
+
*/
|
|
489
|
+
focus(options) {
|
|
490
|
+
this.uploadZoneRef?.focus(options);
|
|
491
|
+
}
|
|
492
|
+
handleFocus = (event) => {
|
|
493
|
+
this.bcmFocus.emit(event);
|
|
494
|
+
};
|
|
495
|
+
handleBlur = (event) => {
|
|
496
|
+
this.bcmBlur.emit(event);
|
|
497
|
+
};
|
|
498
|
+
renderErrors() {
|
|
499
|
+
if (!this.maxSizeError && !this.typeError && !this.maxFileCountError) {
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
const acceptedFormats = this.accept
|
|
503
|
+
.replace(/\./g, '')
|
|
504
|
+
.toUpperCase()
|
|
505
|
+
.replace(/,/g, ', ');
|
|
506
|
+
const maxSizeMsg = this.customErrorMessages?.maxSize ||
|
|
507
|
+
'File size exceeds the maximum allowed limit.';
|
|
508
|
+
const typeMsg = this.customErrorMessages?.type ||
|
|
509
|
+
`Unsupported file type. Allowed formats: ${acceptedFormats}`;
|
|
510
|
+
const maxFileCountMsg = this.customErrorMessages?.maxFileCount ||
|
|
511
|
+
'You have reached the maximum number of files.';
|
|
512
|
+
return (index.h("div", { class: "w-full space-y-1" }, this.maxSizeError && (index.h("bcm-alert", { status: "error", size: "small", dismissible: true, onBcmDismiss: () => (this.maxSizeError = false) }, maxSizeMsg)), this.typeError && (index.h("bcm-alert", { status: "error", size: "small", dismissible: true, onBcmDismiss: () => (this.typeError = false) }, typeMsg)), this.maxFileCountError && (index.h("bcm-alert", { status: "error", size: "small", dismissible: true, onBcmDismiss: () => (this.maxFileCountError = false) }, maxFileCountMsg))));
|
|
513
|
+
}
|
|
514
|
+
renderUploadZone() {
|
|
515
|
+
const classes = uploadClasses({ size: this.size, disabled: this.disabled });
|
|
516
|
+
const { zone, zoneActive, iconContainer, iconSizeClass, zoneTextWrapper, zoneTextMain, zoneTextSub, zoneLink, } = classes;
|
|
517
|
+
const zoneClasses = [zone(), this.dragActive && zoneActive()]
|
|
518
|
+
.filter(Boolean)
|
|
519
|
+
.join(' ');
|
|
520
|
+
const maxMb = Math.round(this.internalMaxSizeInBytes / (1024 * 1024));
|
|
521
|
+
const iconColorClass = this.dragActive
|
|
522
|
+
? 'text-color-primary'
|
|
523
|
+
: 'text-color-icon-default';
|
|
524
|
+
return (index.h("div", { ref: el => (this.uploadZoneRef = el), tabindex: this.disabled ? undefined : 0, part: "upload-zone", class: zoneClasses, onClick: this.openFileDialog, onFocus: this.handleFocus, onBlur: this.handleBlur, onDragOver: ev => this.handleDragOver(ev), onDragLeave: ev => this.handleDragLeave(ev), onDrop: ev => this.handleDrop(ev) }, index.h("div", { class: iconContainer() }, index.h("bcm-icon", { name: "fa-solid fa-cloud-arrow-up", class: `${iconColorClass} ${iconSizeClass()}` })), index.h("div", { class: zoneTextWrapper() }, index.h("div", { class: zoneTextMain() }, "Drag & Drop", ' ', index.h("span", { class: "text-color-helper" }, "or "), index.h("a", { class: zoneLink(), onClick: e => {
|
|
525
|
+
e.preventDefault();
|
|
526
|
+
this.openFileDialog();
|
|
527
|
+
} }, "Choose File")), index.h("div", { class: zoneTextSub() }, "Max: ", maxMb, "MB Formats:", ' ', this.accept.replace(/\./g, '').toUpperCase().replace(/,/g, ', '))), index.h("input", { ref: el => (this.fileInput = el), type: "file", hidden: true, accept: this.accept, multiple: this.multiple, disabled: this.disabled, onChange: this.onFileInputChange })));
|
|
528
|
+
}
|
|
529
|
+
renderFileRow(item) {
|
|
530
|
+
const { percent, actions, iconBtn, fileRow, fileTitle } = uploadClasses({
|
|
531
|
+
size: this.size,
|
|
532
|
+
disabled: this.disabled,
|
|
533
|
+
});
|
|
534
|
+
const isUploading = item?.status === 'uploading';
|
|
535
|
+
return (index.h("div", { part: "file-row", class: fileRow(), title: item?.file?.name }, index.h("div", { class: "flex items-center justify-between w-full gap-2 min-w-0" }, index.h("div", { class: "flex items-center gap-1.5 min-w-0 flex-1 flex-shrink" }, index.h("div", { class: "flex items-center rounded bg-color-default shrink-0 text-size-3 text-color-caption" }, index.h("bcm-icon", { name: "fa-regular fa-file" })), index.h("span", { class: fileTitle() + ' truncate' }, item?.file?.name)), index.h("div", { class: actions() + ' flex-shrink-0' }, item.status === 'uploaded' && (index.h(index.Fragment, null, index.h("button", { type: "button", part: "download-btn", class: iconBtn(), onClick: () => this.downloadFile(item.file), title: "Download" }, index.h("bcm-icon", { name: "fa-regular fa-download", class: "text-size-4" })), index.h("button", { type: "button", part: "remove-btn", class: iconBtn(), onClick: () => this.removeFile(item), title: "Remove" }, index.h("bcm-icon", { name: "fa-regular fa-trash", class: "text-size-4" })))), isUploading && (index.h("button", { type: "button", part: "cancel-btn", class: 'text-color-default bg-transparent hover:bg-color-default-hover text-size-4 cursor-pointer flex items-center justify-center size-5 rounded-full border-none', onClick: () => this.cancelUpload(item), title: "Cancel" }, index.h("bcm-icon", { name: "fa-regular fa-xmark", class: "text-size-4" }))))), isUploading && (index.h("div", { class: "flex items-center gap-3 w-full min-w-0" }, index.h("div", { class: "h-1.5 flex-1 rounded-full bg-color-surface-default overflow-hidden" }, index.h("div", { class: "h-full bg-color-primary rounded-full transition-all duration-300 ease-out", style: { width: `${item.progress ?? 0}%` } })), index.h("span", { class: percent() }, item.progress ?? 0, "%")))));
|
|
536
|
+
}
|
|
537
|
+
render() {
|
|
538
|
+
const { container, label, list, caption } = uploadClasses({
|
|
539
|
+
size: this.size,
|
|
540
|
+
disabled: this.disabled,
|
|
541
|
+
});
|
|
542
|
+
return (index.h(index.Host, { key: '55e97908c7f1e8050231e1996086232e577c6f7f', tabindex: "-1" }, index.h("div", { key: '1a4ec527f4238923e8c1bba953c1eca16692b5ee', class: container() }, this.label && (index.h("label", { key: '07af6d58fbf4c3e97e9d2278173419ec024694ed', part: "label", class: label() }, this.label)), this.renderUploadZone(), this.renderErrors(), this.files.length > 0 && (index.h("div", { key: '17689bdd0cd4f7d060f35b616700fdf4ce8a0a70', part: "file-list", class: list() }, this.files.map(item => this.renderFileRow(item)))), this.caption && (index.h("span", { key: '89a5f04f9becb9af49040534e1e063c8adf9bfd6', part: "caption", class: caption() }, this.caption)))));
|
|
543
|
+
}
|
|
544
|
+
static get formAssociated() { return true; }
|
|
545
|
+
static get watchers() { return {
|
|
546
|
+
"maxSize": ["handleMaxSizeChange"]
|
|
547
|
+
}; }
|
|
548
|
+
};
|
|
549
|
+
BcmFileUpload.style = fileUploadCss;
|
|
550
|
+
|
|
551
|
+
exports.bcm_file_upload = BcmFileUpload;
|
|
552
|
+
//# sourceMappingURL=bcm-file-upload.entry.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bcm-file-upload.entry.cjs.js","sources":["src/components/upload/file-upload.css?tag=bcm-file-upload&encapsulation=shadow","src/components/upload/file-upload.component.tsx"],"sourcesContent":[":host {\n display: block;\n}\n","import {\n Component,\n Prop,\n State,\n h,\n Element,\n Event,\n EventEmitter,\n AttachInternals,\n ComponentInterface,\n Fragment,\n Watch,\n Host,\n} from '@stencil/core';\nimport { tv } from '@utils/tv';\n\nexport type BcmUploadStatus = 'uploading' | 'uploaded' | 'error';\n\nexport interface BcmUploadItem {\n id: string;\n file: File;\n status: BcmUploadStatus;\n progress?: number;\n}\n\nexport interface BcmUploadErrorMessages {\n /**\n * Error message shown when a file exceeds the maxSize limit.\n */\n maxSize?: string;\n\n /**\n * Error message shown when file type is not allowed by `accept`.\n */\n type?: string;\n\n /**\n * Error message shown when `maxFileCount` is exceeded.\n */\n maxFileCount?: string;\n\n /**\n * Error message used for `required` validation when no file is selected.\n */\n required?: string;\n}\n\n/**\n * @component BcmFileUpload\n * @description A fully featured drag-and-drop file uploader component.\n * Supports form-associated behavior, validation, custom size limits,\n * accepted file type filtering, multiple file selection, progress tracking,\n * upload canceling, file removal, and accessibility events (focus/blur).\n *\n * Upload progress is currently simulated locally. The `uploadUrl` prop\n * is reserved for future real HTTP upload integration and has no effect yet.\n *\n * @example Basic usage\n * <bcm-file-upload name=\"report\" label=\"Upload Report\"></bcm-file-upload>\n *\n * @example Multiple files\n * <bcm-file-upload name=\"attachments\" multiple></bcm-file-upload>\n *\n * @example Custom max size and accepted formats\n * <bcm-file-upload\n * name=\"medicalFiles\"\n * accept=\".pdf,.jpg\"\n * maxSize={5}\n * ></bcm-file-upload>\n *\n * @prop {string} name\n * The name of the form field used when the component is inside a `<form>`.\n * Supports automatic FormData generation including:\n * - single upload: name=\"file\"\n * - multiple upload: name=\"file[0], file[1], ...\"\n *\n * @prop {string} label\n * Optional label shown above the upload zone.\n *\n * @prop {string} caption\n * Optional helper text rendered below the file list. Example: “Max size 5MB”.\n *\n * @prop {boolean} multiple\n * Allows selecting and uploading multiple files at once.\n *\n * @prop {string} accept\n * Comma-separated list of allowed file extensions.\n * Example: \".pdf,.xls,.png\".\n *\n * @prop {number} maxSize\n * Maximum allowed size per file (in MB). If exceeded, an error alert appears.\n *\n * @prop {boolean} required\n * Enables form validation — at least one file must be uploaded.\n * Validity integrates with native `<form>` using ElementInternals.\n *\n * @prop {boolean} disabled\n * Makes the uploader non-interactive: no clicking, no drag-and-drop.\n *\n * @prop {\"medium\" | \"small\"} size\n * Controls spacing, typography, and visual density of the upload zone.\n *\n * @prop {string} uploadUrl\n * Reserved for future backend upload integration.\n * Currently has no effect and does not trigger any HTTP requests.\n *\n * @prop {number} maxFileCount\n * Optional limit for how many files can be selected in total.\n * Only applied when `multiple` is true.\n * If exceeded, new files are ignored and a max-file-count error is shown.\n *\n * @prop {BcmUploadErrorMessages} customErrorMessages\n * Optional override for all error messages:\n * - maxSize: file too large\n * - type: unsupported file type\n * - maxFileCount: too many files selected\n * - required: no file selected while required\n *\n *\n * @event {EventEmitter<File[]>} bcmFileChange\n * Fired whenever the component's internal file list changes.\n * Emits an array of the current File objects.\n *\n * @event {EventEmitter<BcmUploadItem>} bcmFileRemoved\n * Fired when the user removes a file from the list.\n *\n * @event {EventEmitter<BcmUploadItem>} bcmUploadCanceled\n * Fired when an upload is canceled before completion.\n *\n * @event {EventEmitter<FocusEvent>} bcmFocus\n * Fired when upload zone receives keyboard or mouse focus.\n *\n * @event {EventEmitter<FocusEvent>} bcmBlur\n * Fired when upload zone loses focus.\n *\n *\n * @csspart upload-zone\n * The root clickable drop area for file selection or drag-and-drop.\n *\n * @csspart file-list\n * The container wrapping rendered file rows.\n *\n * @csspart file-row\n * A single file entry including its name, actions, and progress bar.\n *\n * @csspart remove-btn\n * The remove action button inside uploaded file rows.\n *\n * @csspart cancel-btn\n * The cancel upload button during uploading progress.\n *\n * @csspart download-btn\n * The download button for already uploaded files.\n *\n * @csspart label\n * The external label text displayed above the component.\n *\n * @csspart caption\n * Helper or informative caption displayed below the uploaded list.\n */\n\nconst uploadClasses = tv({\n slots: {\n container: 'bcm-ui-element flex flex-col gap-2 w-full max-w-64',\n label: 'text-size-4 font-medium text-color-label',\n\n // Upload Zone\n zone: [\n 'relative rounded border border-dashed transition-all duration-200 ease-in-out',\n 'px-4 py-4 select-none',\n 'border-color-default bg-color-basic-masterpage',\n 'flex items-center justify-center',\n ],\n zoneActive: 'border-color-primary bg-color-soft-blue',\n\n iconContainer: 'flex items-center justify-center shrink-0',\n iconSizeClass: 'text-size-10',\n\n zoneTextWrapper: 'flex flex-col flex-1 min-w-0',\n\n zoneTextMain: 'text-size-4 text-color-default font-medium',\n zoneLink: 'text-color-primary hover:underline',\n zoneTextSub: 'text-size-3 text-color-caption',\n\n // File List\n list: 'flex flex-col gap-3',\n\n // File Row\n fileRow: [\n 'flex flex-col items-center gap-2 rounded border transition-colors min-w-0 px-3 py-1.5',\n 'bg-color-default border-color-default',\n ],\n fileIcon: 'flex items-center justify-center rounded bg-color-soft-blue shrink-0',\n fileNameWrapper: 'flex flex-col flex-1 min-w-0',\n fileTitle: 'text-size-4 font-medium text-color-default',\n fileName: 'text-size-4 text-color-default truncate',\n\n // Progress\n progressWrapper: 'flex items-center gap-3 w-full',\n progressBar: 'h-full bg-color-primary rounded transition-all duration-300 ease-out',\n percent: 'text-size-4 font-medium text-color-caption min-w-[3ch] text-right',\n\n // Actions\n actions: 'flex items-center gap-2',\n iconBtn: [\n 'size-4 rounded-full flex items-center justify-center transition-colors cursor-pointer appearance-none',\n 'text-color-icon-default hover:bg-color-default-hover border-none',\n ],\n\n caption: 'text-size-3 text-color-caption',\n },\n\n variants: {\n size: {\n medium: {\n zone: 'flex-col text-center gap-2',\n iconContainer: 'h-10 w-[50px]',\n zoneTextWrapper: 'items-center gap-1',\n },\n small: {\n zone: 'px-3 py-4 gap-2 flex-row text-left',\n iconContainer: 'size-8',\n iconSizeClass: 'text-size-8',\n zoneTextWrapper: 'items-start gap-1',\n label: 'text-size-3',\n caption: 'text-size-2',\n },\n },\n disabled: {\n true: 'opacity-60 cursor-not-allowed',\n false: '',\n },\n },\n compoundVariants: [\n {\n disabled: true,\n class: {\n zone: 'bg-color-disabled border-color-disabled cursor-not-allowed',\n zoneTextMain: 'text-color-disabled',\n zoneTextSub: 'text-color-disabled',\n zoneLink:\n 'text-color-disabled cursor-not-allowed no-underline hover:no-underline',\n },\n },\n {\n disabled: false,\n class: {\n zone: 'cursor-pointer',\n },\n },\n ],\n defaultVariants: {\n size: 'medium',\n disabled: false,\n },\n});\n\n@Component({\n tag: 'bcm-file-upload',\n styleUrl: 'file-upload.css',\n shadow: true,\n formAssociated: true,\n})\nexport class BcmFileUpload implements ComponentInterface {\n @Element() host!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n private fileInput?: HTMLInputElement;\n private uploadTimer?: number;\n\n // Focus target for validation errors and keyboard focus\n private uploadZoneRef?: HTMLDivElement;\n\n @Prop() name: string = 'file';\n @Prop() label: string = '';\n @Prop() caption?: string = '';\n @Prop() multiple: boolean = false;\n @Prop() accept: string = '.xls,.pdf';\n @Prop({ mutable: true }) maxSize: number = 2; // MB\n @Prop() required: boolean = false;\n @Prop() disabled: boolean = false;\n @Prop() size: 'medium' | 'small' = 'medium';\n\n /**\n * Reserved for future backend upload integration.\n * Currently does not affect component behavior.\n */\n @Prop() uploadUrl?: string;\n\n /**\n * Maximum number of files allowed in total.\n * Only applied when `multiple` is true.\n */\n @Prop() maxFileCount?: number;\n\n /**\n * Allows consumers to override default error messages.\n */\n @Prop() customErrorMessages?: BcmUploadErrorMessages;\n\n @State() private files: BcmUploadItem[] = [];\n @State() private dragActive = false;\n @State() private maxSizeError = false;\n @State() private typeError = false;\n @State() private maxFileCountError = false;\n\n // Emits when file list changes\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmFileChange!: EventEmitter<File[]>;\n\n // Emits when a file is removed\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmFileRemoved!: EventEmitter<BcmUploadItem>;\n\n // Emits when an upload is canceled\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmUploadCanceled!: EventEmitter<BcmUploadItem>;\n\n // Emits when the upload zone receives focus\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmFocus!: EventEmitter<FocusEvent>;\n\n // Emits when the upload zone loses focus\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmBlur!: EventEmitter<FocusEvent>;\n\n private internalMaxSizeInBytes: number = this.maxSize * 1024 * 1024;\n\n componentWillLoad(): void {\n this.internalMaxSizeInBytes = this.maxSize * 1024 * 1024;\n this.updateFormValueAndValidity();\n }\n\n disconnectedCallback() {\n // Clear interval when component is removed from the DOM\n if (this.uploadTimer) {\n window.clearInterval(this.uploadTimer);\n this.uploadTimer = undefined;\n }\n }\n\n @Watch('maxSize')\n handleMaxSizeChange() {\n this.internalMaxSizeInBytes = this.maxSize * 1024 * 1024;\n }\n\n /**\n * Normalize and check a file against the `accept` attribute.\n */\n private isFileAccepted(file: File): boolean {\n if (!this.accept) return true;\n\n const extension = '.' + (file.name.split('.').pop() || '').toLowerCase();\n const accepted = this.accept\n .toLowerCase()\n .split(',')\n .map(x => x.trim())\n .filter(Boolean); // e.g. ['.pdf', '.jpg', '.png']\n\n return accepted.includes(extension);\n }\n\n /**\n * Update form value and validity state for form-associated behavior.\n */\n private updateFormValueAndValidity() {\n if (!this.internals) return;\n\n if (!this.files.length) {\n this.internals.setFormValue(null);\n\n if (this.required) {\n const msg =\n this.customErrorMessages?.required ||\n 'Please upload at least one file.';\n\n this.internals.setValidity(\n { valueMissing: true },\n msg,\n // Use upload zone if available, otherwise host as the validation anchor\n this.uploadZoneRef ?? this.host,\n );\n } else {\n this.internals.setValidity({});\n }\n\n return;\n }\n\n const formData = new FormData();\n this.files.forEach((item, index) => {\n const key = this.multiple ? `${this.name}[${index}]` : this.name;\n formData.append(key, item.file);\n });\n\n this.internals.setFormValue(formData);\n this.internals.setValidity({});\n }\n\n private emitChange() {\n this.bcmFileChange.emit(this.files.map(f => f.file));\n }\n\n /**\n * Simulate upload progress. Replace with real upload logic if needed.\n */\n private startFakeUpload() {\n if (this.uploadTimer) {\n window.clearInterval(this.uploadTimer);\n }\n\n this.uploadTimer = window.setInterval(() => {\n let anyUploading = false;\n\n this.files = this.files.map(item => {\n if (item.status !== 'uploading') return item;\n\n anyUploading = true;\n const current = item.progress ?? 0;\n const next = Math.min(current + 15, 100);\n\n if (next >= 100) {\n return { ...item, status: 'uploaded', progress: undefined };\n }\n\n return { ...item, progress: next };\n });\n\n if (!anyUploading && this.uploadTimer) {\n window.clearInterval(this.uploadTimer);\n this.uploadTimer = undefined;\n this.updateFormValueAndValidity();\n this.emitChange();\n }\n }, 300);\n }\n\n /**\n * Add files from input or drop.\n */\n private addFiles(fileList: FileList | null) {\n if (!fileList || this.disabled) return;\n\n const newItems: BcmUploadItem[] = [];\n let hasSizeError = false;\n let hasTypeError = false;\n\n Array.from(fileList).forEach(file => {\n if (!this.isFileAccepted(file)) {\n hasTypeError = true;\n return;\n }\n\n if (file.size > this.internalMaxSizeInBytes) {\n hasSizeError = true;\n return;\n }\n\n newItems.push({\n id: crypto.randomUUID(),\n file,\n status: 'uploading',\n progress: 0,\n });\n });\n\n this.maxSizeError = hasSizeError;\n this.typeError = hasTypeError;\n this.maxFileCountError = false;\n\n // If there are no valid files, just update validity and exit.\n if (!newItems.length) {\n this.updateFormValueAndValidity();\n this.emitChange();\n return;\n }\n\n let merged: BcmUploadItem[];\n\n if (this.multiple) {\n if (typeof this.maxFileCount === 'number') {\n const remaining = this.maxFileCount - this.files.length;\n\n if (remaining <= 0) {\n this.maxFileCountError = true;\n this.updateFormValueAndValidity();\n this.emitChange();\n return;\n }\n\n const acceptedNew = newItems.slice(0, Math.max(0, remaining));\n if (acceptedNew.length < newItems.length) {\n this.maxFileCountError = true;\n }\n\n merged = [...this.files, ...acceptedNew];\n } else {\n merged = [...this.files, ...newItems];\n }\n } else {\n // single file mode → only take first new item\n merged = [newItems[0]];\n }\n\n this.files = merged;\n\n this.updateFormValueAndValidity();\n this.emitChange();\n\n // Only fake upload for now\n this.startFakeUpload();\n }\n\n private removeFile(item: BcmUploadItem) {\n this.files = this.files.filter(f => f.id !== item.id);\n this.bcmFileRemoved.emit(item);\n this.updateFormValueAndValidity();\n this.emitChange();\n }\n\n private cancelUpload(item: BcmUploadItem) {\n this.files = this.files.filter(f => f.id !== item.id);\n this.bcmUploadCanceled.emit(item);\n this.updateFormValueAndValidity();\n this.emitChange();\n }\n\n private onFileInputChange = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.addFiles(input.files);\n // Reset input so the same file can be selected again\n input.value = '';\n };\n\n private downloadFile(file: File) {\n const url = URL.createObjectURL(file);\n const a = document.createElement('a');\n a.href = url;\n a.download = file.name;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private handleDrop(ev: DragEvent) {\n ev.preventDefault();\n this.dragActive = false;\n if (this.disabled) return;\n\n const files = ev.dataTransfer?.files || null;\n if (!files || files.length === 0) return;\n\n const first = files.item(0);\n if (!first || !this.isFileAccepted(first)) {\n this.typeError = true;\n return;\n }\n\n this.addFiles(files);\n }\n\n private handleDragOver(ev: DragEvent) {\n ev.preventDefault();\n if (this.disabled) return;\n this.dragActive = true;\n }\n\n private handleDragLeave(ev: DragEvent) {\n ev.preventDefault();\n this.dragActive = false;\n }\n\n private openFileDialog = () => {\n if (this.disabled) return;\n this.fileInput?.click();\n };\n\n formResetCallback() {\n this.files = [];\n this.maxSizeError = false;\n this.typeError = false;\n this.maxFileCountError = false;\n\n if (this.uploadTimer) {\n window.clearInterval(this.uploadTimer);\n this.uploadTimer = undefined;\n }\n\n this.updateFormValueAndValidity();\n this.emitChange();\n }\n\n /**\n * When the browser or user calls element.focus(),\n * move focus to the upload zone.\n */\n public focus(options?: FocusOptions) {\n this.uploadZoneRef?.focus(options);\n }\n\n private handleFocus = (event: FocusEvent) => {\n this.bcmFocus.emit(event);\n };\n\n private handleBlur = (event: FocusEvent) => {\n this.bcmBlur.emit(event);\n };\n\n private renderErrors() {\n if (!this.maxSizeError && !this.typeError && !this.maxFileCountError) {\n return null;\n }\n\n const acceptedFormats = this.accept\n .replace(/\\./g, '')\n .toUpperCase()\n .replace(/,/g, ', ');\n\n const maxSizeMsg =\n this.customErrorMessages?.maxSize ||\n 'File size exceeds the maximum allowed limit.';\n\n const typeMsg =\n this.customErrorMessages?.type ||\n `Unsupported file type. Allowed formats: ${acceptedFormats}`;\n\n const maxFileCountMsg =\n this.customErrorMessages?.maxFileCount ||\n 'You have reached the maximum number of files.';\n\n return (\n <div class=\"w-full space-y-1\">\n {this.maxSizeError && (\n <bcm-alert\n status=\"error\"\n size=\"small\"\n dismissible\n onBcmDismiss={() => (this.maxSizeError = false)}\n >\n {maxSizeMsg}\n </bcm-alert>\n )}\n\n {this.typeError && (\n <bcm-alert\n status=\"error\"\n size=\"small\"\n dismissible\n onBcmDismiss={() => (this.typeError = false)}\n >\n {typeMsg}\n </bcm-alert>\n )}\n\n {this.maxFileCountError && (\n <bcm-alert\n status=\"error\"\n size=\"small\"\n dismissible\n onBcmDismiss={() => (this.maxFileCountError = false)}\n >\n {maxFileCountMsg}\n </bcm-alert>\n )}\n </div>\n );\n }\n\n private renderUploadZone() {\n const classes = uploadClasses({ size: this.size, disabled: this.disabled });\n const {\n zone,\n zoneActive,\n iconContainer,\n iconSizeClass,\n zoneTextWrapper,\n zoneTextMain,\n zoneTextSub,\n zoneLink,\n } = classes;\n\n const zoneClasses = [zone(), this.dragActive && zoneActive()]\n .filter(Boolean)\n .join(' ');\n\n const maxMb = Math.round(this.internalMaxSizeInBytes / (1024 * 1024));\n const iconColorClass = this.dragActive\n ? 'text-color-primary'\n : 'text-color-icon-default';\n\n return (\n <div\n ref={el => (this.uploadZoneRef = el as HTMLDivElement)}\n tabindex={this.disabled ? undefined : 0}\n part=\"upload-zone\"\n class={zoneClasses}\n onClick={this.openFileDialog}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onDragOver={ev => this.handleDragOver(ev)}\n onDragLeave={ev => this.handleDragLeave(ev)}\n onDrop={ev => this.handleDrop(ev)}\n >\n <div class={iconContainer()}>\n <bcm-icon\n name=\"fa-solid fa-cloud-arrow-up\"\n class={`${iconColorClass} ${iconSizeClass()}`}\n ></bcm-icon>\n </div>\n\n <div class={zoneTextWrapper()}>\n <div class={zoneTextMain()}>\n Drag & Drop{' '}\n <span class=\"text-color-helper\">or </span>\n <a\n class={zoneLink()}\n onClick={e => {\n e.preventDefault();\n this.openFileDialog();\n }}\n >\n Choose File\n </a>\n </div>\n <div class={zoneTextSub()}>\n Max: {maxMb}MB Formats:{' '}\n {this.accept.replace(/\\./g, '').toUpperCase().replace(/,/g, ', ')}\n </div>\n </div>\n\n <input\n ref={el => (this.fileInput = el as HTMLInputElement)}\n type=\"file\"\n hidden\n accept={this.accept}\n multiple={this.multiple}\n disabled={this.disabled}\n onChange={this.onFileInputChange}\n />\n </div>\n );\n }\n\n private renderFileRow(item: BcmUploadItem) {\n const { percent, actions, iconBtn, fileRow, fileTitle } = uploadClasses({\n size: this.size,\n disabled: this.disabled,\n });\n const isUploading = item?.status === 'uploading';\n\n return (\n <div part=\"file-row\" class={fileRow()} title={item?.file?.name}>\n <div class=\"flex items-center justify-between w-full gap-2 min-w-0\">\n <div class=\"flex items-center gap-1.5 min-w-0 flex-1 flex-shrink\">\n <div class=\"flex items-center rounded bg-color-default shrink-0 text-size-3 text-color-caption\">\n <bcm-icon name=\"fa-regular fa-file\"></bcm-icon>\n </div>\n <span class={fileTitle() + ' truncate'}>{item?.file?.name}</span>\n </div>\n\n <div class={actions() + ' flex-shrink-0'}>\n {item.status === 'uploaded' && (\n <Fragment>\n <button\n type=\"button\"\n part=\"download-btn\"\n class={iconBtn()}\n onClick={() => this.downloadFile(item.file)}\n title=\"Download\"\n >\n <bcm-icon\n name=\"fa-regular fa-download\"\n class=\"text-size-4\"\n ></bcm-icon>\n </button>\n\n <button\n type=\"button\"\n part=\"remove-btn\"\n class={iconBtn()}\n onClick={() => this.removeFile(item)}\n title=\"Remove\"\n >\n <bcm-icon\n name=\"fa-regular fa-trash\"\n class=\"text-size-4\"\n ></bcm-icon>\n </button>\n </Fragment>\n )}\n\n {isUploading && (\n <button\n type=\"button\"\n part=\"cancel-btn\"\n class={\n 'text-color-default bg-transparent hover:bg-color-default-hover text-size-4 cursor-pointer flex items-center justify-center size-5 rounded-full border-none'\n }\n onClick={() => this.cancelUpload(item)}\n title=\"Cancel\"\n >\n <bcm-icon\n name=\"fa-regular fa-xmark\"\n class=\"text-size-4\"\n ></bcm-icon>\n </button>\n )}\n </div>\n </div>\n\n {isUploading && (\n <div class=\"flex items-center gap-3 w-full min-w-0\">\n <div class=\"h-1.5 flex-1 rounded-full bg-color-surface-default overflow-hidden\">\n <div\n class=\"h-full bg-color-primary rounded-full transition-all duration-300 ease-out\"\n style={{ width: `${item.progress ?? 0}%` }}\n />\n </div>\n <span class={percent()}>{item.progress ?? 0}%</span>\n </div>\n )}\n </div>\n );\n }\n\n render() {\n const { container, label, list, caption } = uploadClasses({\n size: this.size,\n disabled: this.disabled,\n });\n\n return (\n <Host tabindex=\"-1\">\n <div class={container()}>\n {this.label && (\n <label part=\"label\" class={label()}>\n {this.label}\n </label>\n )}\n\n {this.renderUploadZone()}\n\n {this.renderErrors()}\n\n {this.files.length > 0 && (\n <div part=\"file-list\" class={list()}>\n {this.files.map(item => this.renderFileRow(item))}\n </div>\n )}\n\n {this.caption && (\n <span part=\"caption\" class={caption()}>\n {this.caption}\n </span>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"names":["tv","h","Fragment","Host"],"mappings":"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"}
|