@xplor-education/core-stencil-components 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/index.js +1 -1
- package/components/index.js.map +1 -1
- package/components/{p-B1W2qj2l.js → p-B3zR7peH.js} +4 -4
- package/components/p-B3zR7peH.js.map +1 -0
- package/components/{p-Ddr35stE.js → p-BRWe4TXp.js} +65 -5
- package/components/p-BRWe4TXp.js.map +1 -0
- package/components/{p-CBSi5kQB.js → p-Bs_ocvfe.js} +7 -3
- package/components/p-Bs_ocvfe.js.map +1 -0
- package/components/{p-CTD6SyTD.js → p-D4jVa8dE.js} +20 -4
- package/components/p-D4jVa8dE.js.map +1 -0
- package/components/{p-BaDLDCH5.js → p-DURNLP66.js} +71 -6
- package/components/p-DURNLP66.js.map +1 -0
- package/components/xplor-alert-dialog.js +60 -3
- package/components/xplor-alert-dialog.js.map +1 -1
- package/components/xplor-assistant.js +3 -3
- package/components/xplor-assistant.js.map +1 -1
- package/components/xplor-autocomplete.js +15 -9
- package/components/xplor-autocomplete.js.map +1 -1
- package/components/xplor-avatar-and-name.js +1 -1
- package/components/xplor-avatar.js +1 -1
- package/components/xplor-btn-back-to-parent.js +7 -2
- package/components/xplor-btn-back-to-parent.js.map +1 -1
- package/components/xplor-btn-icon.js +3 -2
- package/components/xplor-btn-icon.js.map +1 -1
- package/components/xplor-btn-menu.js +103 -6
- package/components/xplor-btn-menu.js.map +1 -1
- package/components/xplor-btn-tooltip.js +2 -2
- package/components/xplor-button.js +1 -1
- package/components/xplor-chat-widget.js +1 -1
- package/components/xplor-checkbox.js +3 -1
- package/components/xplor-checkbox.js.map +1 -1
- package/components/xplor-combobox.js +20 -10
- package/components/xplor-combobox.js.map +1 -1
- package/components/xplor-datatable.js +10 -4
- package/components/xplor-datatable.js.map +1 -1
- package/components/xplor-date-picker.js +9 -5
- package/components/xplor-date-picker.js.map +1 -1
- package/components/xplor-drag-and-drop-input.js +7 -4
- package/components/xplor-drag-and-drop-input.js.map +1 -1
- package/components/xplor-expansion-panel.js +3 -3
- package/components/xplor-expansion-panel.js.map +1 -1
- package/components/xplor-expansion-panels.js +1 -1
- package/components/xplor-expansion-panels.js.map +1 -1
- package/components/xplor-file-upload.js +2 -2
- package/components/xplor-file-upload.js.map +1 -1
- package/components/xplor-inline-date-picker.js +1 -1
- package/components/xplor-input-file.js +3 -1
- package/components/xplor-input-file.js.map +1 -1
- package/components/xplor-input-search.js +4 -2
- package/components/xplor-input-search.js.map +1 -1
- package/components/xplor-input-select.js +107 -7
- package/components/xplor-input-select.js.map +1 -1
- package/components/xplor-input-send.js +2 -2
- package/components/xplor-input-send.js.map +1 -1
- package/components/xplor-input-text-area.js +6 -2
- package/components/xplor-input-text-area.js.map +1 -1
- package/components/xplor-input-text-secondary.js +6 -2
- package/components/xplor-input-text-secondary.js.map +1 -1
- package/components/xplor-input-text.js +6 -2
- package/components/xplor-input-text.js.map +1 -1
- package/components/xplor-input-title.js +7 -2
- package/components/xplor-input-title.js.map +1 -1
- package/components/xplor-links.js +5 -2
- package/components/xplor-links.js.map +1 -1
- package/components/xplor-modal-persistent.js +1 -1
- package/components/xplor-modal.js +1 -1
- package/components/xplor-nav-tabs.js +41 -3
- package/components/xplor-nav-tabs.js.map +1 -1
- package/components/xplor-radio-btn.js +99 -4
- package/components/xplor-radio-btn.js.map +1 -1
- package/components/xplor-section-card.js +2 -2
- package/components/xplor-section-card.js.map +1 -1
- package/components/xplor-section-heading.js +9 -3
- package/components/xplor-section-heading.js.map +1 -1
- package/components/xplor-table.js +14 -9
- package/components/xplor-table.js.map +1 -1
- package/components/xplor-text-bubble.js +2 -2
- package/components/xplor-text-field.js +2 -2
- package/components/xplor-time-picker.js +6 -6
- package/components/xplor-tooltip.js +1 -1
- package/dist/cjs/{index-Bc5o_4vY.js → index-BjAapk2n.js} +3 -3
- package/dist/cjs/index-BjAapk2n.js.map +1 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/xplor-alert-dialog_58.cjs.entry.js +673 -100
- package/dist/cjs/xplor-alert-dialog_58.cjs.entry.js.map +1 -1
- package/dist/cjs/xplor-component-library.cjs.js +2 -2
- package/dist/collection/components/xplor-alert-dialog/xplor-alert-dialog.js +85 -1
- package/dist/collection/components/xplor-alert-dialog/xplor-alert-dialog.js.map +1 -1
- package/dist/collection/components/xplor-assistant/internal/AssistantInput.js +1 -1
- package/dist/collection/components/xplor-assistant/internal/AssistantInput.js.map +1 -1
- package/dist/collection/components/xplor-assistant/xplor-assistant.js +1 -1
- package/dist/collection/components/xplor-assistant/xplor-assistant.js.map +1 -1
- package/dist/collection/components/xplor-autocomplete/xplor-autocomplete.js +33 -9
- package/dist/collection/components/xplor-autocomplete/xplor-autocomplete.js.map +1 -1
- package/dist/collection/components/xplor-avatar/xplor-avatar.js +2 -2
- package/dist/collection/components/xplor-avatar/xplor-avatar.js.map +1 -1
- package/dist/collection/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.js +25 -1
- package/dist/collection/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.js.map +1 -1
- package/dist/collection/components/xplor-btn-icon/xplor-btn-icon.js +20 -1
- package/dist/collection/components/xplor-btn-icon/xplor-btn-icon.js.map +1 -1
- package/dist/collection/components/xplor-btn-menu/xplor-btn-menu.js +129 -5
- package/dist/collection/components/xplor-btn-menu/xplor-btn-menu.js.map +1 -1
- package/dist/collection/components/xplor-button/xplor-button.js +42 -1
- package/dist/collection/components/xplor-button/xplor-button.js.map +1 -1
- package/dist/collection/components/xplor-checkbox/xplor-checkbox.js +3 -1
- package/dist/collection/components/xplor-checkbox/xplor-checkbox.js.map +1 -1
- package/dist/collection/components/xplor-combobox/xplor-combobox.js +38 -10
- package/dist/collection/components/xplor-combobox/xplor-combobox.js.map +1 -1
- package/dist/collection/components/xplor-datatable/xplor-datatable.js +10 -4
- package/dist/collection/components/xplor-datatable/xplor-datatable.js.map +1 -1
- package/dist/collection/components/xplor-date-picker/xplor-date-picker.js +8 -4
- package/dist/collection/components/xplor-date-picker/xplor-date-picker.js.map +1 -1
- package/dist/collection/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.js +24 -3
- package/dist/collection/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.js.map +1 -1
- package/dist/collection/components/xplor-expansion-panel/xplor-expansion-panel.js +3 -3
- package/dist/collection/components/xplor-expansion-panel/xplor-expansion-panel.js.map +1 -1
- package/dist/collection/components/xplor-expansion-panels/xplor-expansion-panels.js +1 -1
- package/dist/collection/components/xplor-expansion-panels/xplor-expansion-panels.js.map +1 -1
- package/dist/collection/components/xplor-file-upload/xplor-file-upload.js +2 -2
- package/dist/collection/components/xplor-file-upload/xplor-file-upload.js.map +1 -1
- package/dist/collection/components/xplor-inline-date-picker/xplor-inline-date-picker.js +77 -3
- package/dist/collection/components/xplor-inline-date-picker/xplor-inline-date-picker.js.map +1 -1
- package/dist/collection/components/xplor-input-file/xplor-input-file.js +3 -1
- package/dist/collection/components/xplor-input-file/xplor-input-file.js.map +1 -1
- package/dist/collection/components/xplor-input-search/xplor-input-search.js +4 -2
- package/dist/collection/components/xplor-input-search/xplor-input-search.js.map +1 -1
- package/dist/collection/components/xplor-input-select/xplor-input-select.js +133 -6
- package/dist/collection/components/xplor-input-select/xplor-input-select.js.map +1 -1
- package/dist/collection/components/xplor-input-send/xplor-input-send.js +1 -1
- package/dist/collection/components/xplor-input-send/xplor-input-send.js.map +1 -1
- package/dist/collection/components/xplor-input-text/xplor-input-text.js +6 -2
- package/dist/collection/components/xplor-input-text/xplor-input-text.js.map +1 -1
- package/dist/collection/components/xplor-input-text-area/xplor-input-text-area.js +6 -2
- package/dist/collection/components/xplor-input-text-area/xplor-input-text-area.js.map +1 -1
- package/dist/collection/components/xplor-input-text-secondary/xplor-input-text-secondary.js +6 -2
- package/dist/collection/components/xplor-input-text-secondary/xplor-input-text-secondary.js.map +1 -1
- package/dist/collection/components/xplor-input-title/xplor-input-title.js +25 -1
- package/dist/collection/components/xplor-input-title/xplor-input-title.js.map +1 -1
- package/dist/collection/components/xplor-links/xplor-links.js +25 -1
- package/dist/collection/components/xplor-links/xplor-links.js.map +1 -1
- package/dist/collection/components/xplor-modal/xplor-modal.js +88 -1
- package/dist/collection/components/xplor-modal/xplor-modal.js.map +1 -1
- package/dist/collection/components/xplor-nav-tabs/xplor-nav-tabs.js +49 -2
- package/dist/collection/components/xplor-nav-tabs/xplor-nav-tabs.js.map +1 -1
- package/dist/collection/components/xplor-radio-btn/xplor-radio-btn.css +116 -1
- package/dist/collection/components/xplor-radio-btn/xplor-radio-btn.js +258 -2
- package/dist/collection/components/xplor-radio-btn/xplor-radio-btn.js.map +1 -1
- package/dist/collection/components/xplor-section-card/xplor-section-card.js +2 -2
- package/dist/collection/components/xplor-section-card/xplor-section-card.js.map +1 -1
- package/dist/collection/components/xplor-section-heading/xplor-section-heading.js +27 -2
- package/dist/collection/components/xplor-section-heading/xplor-section-heading.js.map +1 -1
- package/dist/collection/components/xplor-table/xplor-table.js +14 -9
- package/dist/collection/components/xplor-table/xplor-table.js.map +1 -1
- package/dist/collection/components/xplor-text-bubble/xplor-text-bubble.js +2 -2
- package/dist/collection/components/xplor-text-field/xplor-text-field.js +2 -2
- package/dist/collection/components/xplor-time-picker/xplor-time-picker.js +6 -6
- package/dist/collection/components/xplor-tooltip/xplor-tooltip.js +18 -2
- package/dist/collection/components/xplor-tooltip/xplor-tooltip.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-BHdeGt6k.js → p--zhT6rvJ.js} +4 -4
- package/dist/components/p--zhT6rvJ.js.map +1 -0
- package/dist/components/{p-DKh6y3GY.js → p-04oMLTZR.js} +65 -5
- package/dist/components/p-04oMLTZR.js.map +1 -0
- package/dist/components/{p-DIv_A5Gj.js → p-B5rS_jjI.js} +7 -3
- package/dist/components/p-B5rS_jjI.js.map +1 -0
- package/dist/components/{p-4l9DAhAo.js → p-DbQ6ZNvh.js} +20 -4
- package/dist/components/p-DbQ6ZNvh.js.map +1 -0
- package/dist/components/{p-CXJd350E.js → p-Dh0wQJt6.js} +71 -6
- package/dist/components/p-Dh0wQJt6.js.map +1 -0
- package/dist/components/xplor-alert-dialog.js +60 -3
- package/dist/components/xplor-alert-dialog.js.map +1 -1
- package/dist/components/xplor-assistant.js +3 -3
- package/dist/components/xplor-assistant.js.map +1 -1
- package/dist/components/xplor-autocomplete.js +15 -9
- package/dist/components/xplor-autocomplete.js.map +1 -1
- package/dist/components/xplor-avatar-and-name.js +1 -1
- package/dist/components/xplor-avatar.js +1 -1
- package/dist/components/xplor-btn-back-to-parent.js +7 -2
- package/dist/components/xplor-btn-back-to-parent.js.map +1 -1
- package/dist/components/xplor-btn-icon.js +3 -2
- package/dist/components/xplor-btn-icon.js.map +1 -1
- package/dist/components/xplor-btn-menu.js +103 -6
- package/dist/components/xplor-btn-menu.js.map +1 -1
- package/dist/components/xplor-btn-tooltip.js +2 -2
- package/dist/components/xplor-button.js +1 -1
- package/dist/components/xplor-chat-widget.js +1 -1
- package/dist/components/xplor-checkbox.js +3 -1
- package/dist/components/xplor-checkbox.js.map +1 -1
- package/dist/components/xplor-combobox.js +20 -10
- package/dist/components/xplor-combobox.js.map +1 -1
- package/dist/components/xplor-datatable.js +10 -4
- package/dist/components/xplor-datatable.js.map +1 -1
- package/dist/components/xplor-date-picker.js +9 -5
- package/dist/components/xplor-date-picker.js.map +1 -1
- package/dist/components/xplor-drag-and-drop-input.js +7 -4
- package/dist/components/xplor-drag-and-drop-input.js.map +1 -1
- package/dist/components/xplor-expansion-panel.js +3 -3
- package/dist/components/xplor-expansion-panel.js.map +1 -1
- package/dist/components/xplor-expansion-panels.js +1 -1
- package/dist/components/xplor-expansion-panels.js.map +1 -1
- package/dist/components/xplor-file-upload.js +2 -2
- package/dist/components/xplor-file-upload.js.map +1 -1
- package/dist/components/xplor-inline-date-picker.js +1 -1
- package/dist/components/xplor-input-file.js +3 -1
- package/dist/components/xplor-input-file.js.map +1 -1
- package/dist/components/xplor-input-search.js +4 -2
- package/dist/components/xplor-input-search.js.map +1 -1
- package/dist/components/xplor-input-select.js +107 -7
- package/dist/components/xplor-input-select.js.map +1 -1
- package/dist/components/xplor-input-send.js +2 -2
- package/dist/components/xplor-input-send.js.map +1 -1
- package/dist/components/xplor-input-text-area.js +6 -2
- package/dist/components/xplor-input-text-area.js.map +1 -1
- package/dist/components/xplor-input-text-secondary.js +6 -2
- package/dist/components/xplor-input-text-secondary.js.map +1 -1
- package/dist/components/xplor-input-text.js +6 -2
- package/dist/components/xplor-input-text.js.map +1 -1
- package/dist/components/xplor-input-title.js +7 -2
- package/dist/components/xplor-input-title.js.map +1 -1
- package/dist/components/xplor-links.js +5 -2
- package/dist/components/xplor-links.js.map +1 -1
- package/dist/components/xplor-modal-persistent.js +1 -1
- package/dist/components/xplor-modal.js +1 -1
- package/dist/components/xplor-nav-tabs.js +41 -3
- package/dist/components/xplor-nav-tabs.js.map +1 -1
- package/dist/components/xplor-radio-btn.js +99 -4
- package/dist/components/xplor-radio-btn.js.map +1 -1
- package/dist/components/xplor-section-card.js +2 -2
- package/dist/components/xplor-section-card.js.map +1 -1
- package/dist/components/xplor-section-heading.js +9 -3
- package/dist/components/xplor-section-heading.js.map +1 -1
- package/dist/components/xplor-table.js +14 -9
- package/dist/components/xplor-table.js.map +1 -1
- package/dist/components/xplor-text-bubble.js +2 -2
- package/dist/components/xplor-text-field.js +2 -2
- package/dist/components/xplor-time-picker.js +6 -6
- package/dist/components/xplor-tooltip.js +1 -1
- package/dist/esm/{index-Zkk2NJif.js → index-KRfMjDC2.js} +3 -3
- package/dist/esm/index-KRfMjDC2.js.map +1 -0
- package/dist/esm/loader.js +3 -3
- package/dist/esm/xplor-alert-dialog_58.entry.js +673 -100
- package/dist/esm/xplor-alert-dialog_58.entry.js.map +1 -1
- package/dist/esm/xplor-component-library.js +3 -3
- package/dist/hydrate/index.js +718 -116
- package/dist/hydrate/index.mjs +718 -116
- package/dist/types/components/xplor-alert-dialog/xplor-alert-dialog.d.ts +11 -0
- package/dist/types/components/xplor-autocomplete/xplor-autocomplete.d.ts +4 -0
- package/dist/types/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.d.ts +4 -0
- package/dist/types/components/xplor-btn-icon/xplor-btn-icon.d.ts +4 -0
- package/dist/types/components/xplor-btn-menu/xplor-btn-menu.d.ts +19 -0
- package/dist/types/components/xplor-button/xplor-button.d.ts +4 -0
- package/dist/types/components/xplor-checkbox/xplor-checkbox.d.ts +1 -0
- package/dist/types/components/xplor-combobox/xplor-combobox.d.ts +4 -0
- package/dist/types/components/xplor-date-picker/xplor-date-picker.d.ts +3 -0
- package/dist/types/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.d.ts +4 -0
- package/dist/types/components/xplor-inline-date-picker/xplor-inline-date-picker.d.ts +3 -0
- package/dist/types/components/xplor-input-file/xplor-input-file.d.ts +1 -0
- package/dist/types/components/xplor-input-search/xplor-input-search.d.ts +1 -0
- package/dist/types/components/xplor-input-select/xplor-input-select.d.ts +8 -0
- package/dist/types/components/xplor-input-text/xplor-input-text.d.ts +3 -0
- package/dist/types/components/xplor-input-text-area/xplor-input-text-area.d.ts +3 -0
- package/dist/types/components/xplor-input-text-secondary/xplor-input-text-secondary.d.ts +3 -0
- package/dist/types/components/xplor-input-title/xplor-input-title.d.ts +4 -0
- package/dist/types/components/xplor-links/xplor-links.d.ts +2 -0
- package/dist/types/components/xplor-modal/xplor-modal.d.ts +11 -0
- package/dist/types/components/xplor-nav-tabs/xplor-nav-tabs.d.ts +2 -0
- package/dist/types/components/xplor-radio-btn/xplor-radio-btn.d.ts +32 -0
- package/dist/types/components/xplor-section-heading/xplor-section-heading.d.ts +4 -0
- package/dist/types/components/xplor-tooltip/xplor-tooltip.d.ts +3 -0
- package/dist/types/components.d.ts +205 -0
- package/dist/xplor-component-library/p-0df9ea5d.entry.js +2 -0
- package/dist/xplor-component-library/p-0df9ea5d.entry.js.map +1 -0
- package/dist/xplor-component-library/{p-Zkk2NJif.js → p-KRfMjDC2.js} +3 -3
- package/dist/xplor-component-library/p-KRfMjDC2.js.map +1 -0
- package/dist/xplor-component-library/xplor-component-library.css +1 -1
- package/dist/xplor-component-library/xplor-component-library.esm.js +1 -1
- package/package.json +1 -1
- package/components/p-B1W2qj2l.js.map +0 -1
- package/components/p-BaDLDCH5.js.map +0 -1
- package/components/p-CBSi5kQB.js.map +0 -1
- package/components/p-CTD6SyTD.js.map +0 -1
- package/components/p-Ddr35stE.js.map +0 -1
- package/dist/cjs/index-Bc5o_4vY.js.map +0 -1
- package/dist/components/p-4l9DAhAo.js.map +0 -1
- package/dist/components/p-BHdeGt6k.js.map +0 -1
- package/dist/components/p-CXJd350E.js.map +0 -1
- package/dist/components/p-DIv_A5Gj.js.map +0 -1
- package/dist/components/p-DKh6y3GY.js.map +0 -1
- package/dist/esm/index-Zkk2NJif.js.map +0 -1
- package/dist/xplor-component-library/p-07d83c17.entry.js +0 -2
- package/dist/xplor-component-library/p-07d83c17.entry.js.map +0 -1
- package/dist/xplor-component-library/p-Zkk2NJif.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"xplor-file-upload.js","mappings":"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","names":["XplorFileUpload","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-file-upload/xplor-file-upload.scss?tag=xplor-file-upload&encapsulation=scoped","src/components/xplor-file-upload/xplor-file-upload.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.file-upload {\n width: 100%;\n}\n\n.file-upload__dropzone {\n border: 2px dashed #bdbdbd;\n border-radius: 8px;\n padding: 2rem;\n text-align: center;\n transition: all 0.2s ease;\n background-color: #fafafa;\n cursor: pointer;\n position: relative;\n\n &:hover:not(&--disabled) {\n border-color: #1976d2;\n background-color: #f0f7ff;\n }\n\n &--dragging {\n border-color: #1976d2;\n background-color: #e3f2fd;\n transform: scale(1.02);\n }\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background-color: #f5f5f5;\n }\n}\n\n.file-upload__input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.file-upload__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n}\n\n.file-upload__icon {\n color: #757575;\n}\n\n.file-upload__text {\n font-size: 1rem;\n color: #424242;\n margin: 0;\n}\n\n.file-upload__button {\n background: none;\n border: none;\n color: #1976d2;\n text-decoration: underline;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n padding: 0;\n transition: color 0.2s;\n\n &:hover:not(:disabled) {\n color: #1565c0;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n}\n\n.file-upload__hint {\n font-size: 0.875rem;\n color: #757575;\n margin: 0;\n}\n\n.file-upload__error {\n margin-top: 0.5rem;\n padding: 0.75rem;\n background-color: #ffebee;\n color: #c62828;\n border-radius: 4px;\n font-size: 0.875rem;\n border-left: 4px solid #f44336;\n}\n\n.file-upload__files {\n margin-top: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.file-upload__file {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.75rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n border: 1px solid #e0e0e0;\n}\n\n.file-upload__preview {\n width: 48px;\n height: 48px;\n object-fit: cover;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.file-upload__file-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.file-upload__file-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #212121;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-upload__file-size {\n font-size: 0.75rem;\n color: #757575;\n}\n\n.file-upload__remove {\n background: none;\n border: none;\n font-size: 1.5rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 4px;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &:hover {\n background-color: #ffebee;\n color: #f44336;\n }\n\n &:focus {\n outline: 2px solid #1976d2;\n outline-offset: 2px;\n }\n}","import { Component, Host, h, Prop, State, Event, EventEmitter } from '@stencil/core';\n\nconst DEFAULT_ACCEPT_ALL = '*' + '/' + '*';\n\nexport interface UploadedFile {\n file: File;\n id: string;\n name: string;\n size: number;\n type: string;\n dataUrl?: string;\n}\n\n@Component({\n tag: 'xplor-file-upload',\n styleUrl: 'xplor-file-upload.scss',\n scoped: true,\n})\nexport class XplorFileUpload {\n /**\n * Accepted file types (e.g., 'image/png', '.pdf', 'image/star'). Default accepts all types.\n */\n @Prop() accepts: string = DEFAULT_ACCEPT_ALL;\n\n /**\n * Maximum file size in bytes\n */\n @Prop() maxSize: number = 10 * 1024 * 1024; // 10MB default\n\n /**\n * Allow multiple file selection\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Disable the file upload\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Show image preview for uploaded images\n */\n @Prop() showPreview: boolean = true;\n\n /**\n * Label text for the upload button\n */\n @Prop() label: string = 'Upload Files';\n\n @State() files: UploadedFile[] = [];\n @State() isDragging: boolean = false;\n @State() error: string = '';\n\n @Event() xplorFileAdd: EventEmitter<UploadedFile[]>;\n @Event() xplorFileRemove: EventEmitter<UploadedFile>;\n @Event() xplorError: EventEmitter<string>;\n\n private fileInputEl: HTMLInputElement;\n\n private handleFileSelect = (event: Event) => {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.processFiles(Array.from(input.files));\n }\n };\n\n private handleDragOver = (event: DragEvent) => {\n event.preventDefault();\n if (!this.disabled) {\n this.isDragging = true;\n }\n };\n\n private handleDragLeave = (event: DragEvent) => {\n event.preventDefault();\n this.isDragging = false;\n };\n\n private handleDrop = (event: DragEvent) => {\n event.preventDefault();\n this.isDragging = false;\n\n if (this.disabled) return;\n\n if (event.dataTransfer?.files) {\n this.processFiles(Array.from(event.dataTransfer.files));\n }\n };\n\n private processFiles(fileList: File[]) {\n this.error = '';\n const validFiles: UploadedFile[] = [];\n\n for (const file of fileList) {\n // Validate file size\n if (file.size > this.maxSize) {\n const maxSizeMB = (this.maxSize / (1024 * 1024)).toFixed(2);\n this.error = `File \"${file.name}\" exceeds maximum size of ${maxSizeMB}MB`;\n this.xplorError.emit(this.error);\n continue;\n }\n\n // Validate file type if specified\n if (this.accepts !== '*/*') {\n const acceptedTypes = this.accepts.split(',').map(t => t.trim());\n const fileExtension = `.${file.name.split('.').pop()}`;\n const isAccepted = acceptedTypes.some(type => {\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', ''));\n }\n return type === file.type || type === fileExtension;\n });\n\n if (!isAccepted) {\n this.error = `File type \"${file.type}\" is not accepted`;\n this.xplorError.emit(this.error);\n continue;\n }\n }\n\n const uploadedFile: UploadedFile = {\n file,\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n name: file.name,\n size: file.size,\n type: file.type,\n };\n\n // Generate preview for images\n if (this.showPreview && file.type.startsWith('image/')) {\n const reader = new FileReader();\n reader.onload = (e) => {\n uploadedFile.dataUrl = e.target?.result as string;\n this.files = [...this.files];\n };\n reader.readAsDataURL(file);\n }\n\n validFiles.push(uploadedFile);\n }\n\n if (validFiles.length > 0) {\n if (this.multiple) {\n this.files = [...this.files, ...validFiles];\n } else {\n this.files = [validFiles[0]];\n }\n this.xplorFileAdd.emit(validFiles);\n }\n\n // Reset input\n if (this.fileInputEl) {\n this.fileInputEl.value = '';\n }\n }\n\n private handleRemoveFile = (fileToRemove: UploadedFile) => {\n this.files = this.files.filter(f => f.id !== fileToRemove.id);\n this.xplorFileRemove.emit(fileToRemove);\n };\n\n private handleButtonClick = () => {\n if (!this.disabled && this.fileInputEl) {\n this.fileInputEl.click();\n }\n };\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n }\n\n render() {\n return (\n <Host>\n <div class=\"file-upload\">\n <div\n class={{\n 'file-upload__dropzone': true,\n 'file-upload__dropzone--dragging': this.isDragging,\n 'file-upload__dropzone--disabled': this.disabled,\n }}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n onDrop={this.handleDrop}\n >\n <input\n ref={(el) => (this.fileInputEl = el)}\n type=\"file\"\n accept={this.accepts}\n multiple={this.multiple}\n disabled={this.disabled}\n onChange={this.handleFileSelect}\n class=\"file-upload__input\"\n />\n\n <div class=\"file-upload__content\">\n <svg class=\"file-upload__icon\" width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15V3M12 3L8 7M12 3L16 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 17L2 19C2 20.1046 2.89543 21 4 21L20 21C21.1046 21 22 20.1046 22 19L22 17\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n <p class=\"file-upload__text\">\n Drag & drop files here or{' '}\n <button\n type=\"button\"\n class=\"file-upload__button\"\n onClick={this.handleButtonClick}\n disabled={this.disabled}\n >\n {this.label}\n </button>\n </p>\n <p class=\"file-upload__hint\">\n Max size: {this.formatFileSize(this.maxSize)}\n {this.accepts !== '*/*' && ` • Accepts: ${this.accepts}`}\n </p>\n </div>\n </div>\n\n {this.error && (\n <div class=\"file-upload__error\" role=\"alert\">\n {this.error}\n </div>\n )}\n\n {this.files.length > 0 && (\n <div class=\"file-upload__files\">\n {this.files.map((file) => (\n <div key={file.id} class=\"file-upload__file\">\n {file.dataUrl && (\n <img src={file.dataUrl} alt={file.name} class=\"file-upload__preview\" />\n )}\n <div class=\"file-upload__file-info\">\n <span class=\"file-upload__file-name\" title={file.name}>\n {file.name}\n </span>\n <span class=\"file-upload__file-size\">\n {this.formatFileSize(file.size)}\n </span>\n </div>\n <button\n type=\"button\"\n class=\"file-upload__remove\"\n onClick={() => this.handleRemoveFile(file)}\n aria-label={`Remove ${file.name}`}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"xplor-file-upload.js","mappings":"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","names":["XplorFileUpload","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-file-upload/xplor-file-upload.scss?tag=xplor-file-upload&encapsulation=scoped","src/components/xplor-file-upload/xplor-file-upload.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.file-upload {\n width: 100%;\n}\n\n.file-upload__dropzone {\n border: 2px dashed #bdbdbd;\n border-radius: 8px;\n padding: 2rem;\n text-align: center;\n transition: all 0.2s ease;\n background-color: #fafafa;\n cursor: pointer;\n position: relative;\n\n &:hover:not(&--disabled) {\n border-color: #1976d2;\n background-color: #f0f7ff;\n }\n\n &--dragging {\n border-color: #1976d2;\n background-color: #e3f2fd;\n transform: scale(1.02);\n }\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background-color: #f5f5f5;\n }\n}\n\n.file-upload__input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.file-upload__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n}\n\n.file-upload__icon {\n color: #757575;\n}\n\n.file-upload__text {\n font-size: 1rem;\n color: #424242;\n margin: 0;\n}\n\n.file-upload__button {\n background: none;\n border: none;\n color: #1976d2;\n text-decoration: underline;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n padding: 0;\n transition: color 0.2s;\n\n &:hover:not(:disabled) {\n color: #1565c0;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n}\n\n.file-upload__hint {\n font-size: 0.875rem;\n color: #757575;\n margin: 0;\n}\n\n.file-upload__error {\n margin-top: 0.5rem;\n padding: 0.75rem;\n background-color: #ffebee;\n color: #c62828;\n border-radius: 4px;\n font-size: 0.875rem;\n border-left: 4px solid #f44336;\n}\n\n.file-upload__files {\n margin-top: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.file-upload__file {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.75rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n border: 1px solid #e0e0e0;\n}\n\n.file-upload__preview {\n width: 48px;\n height: 48px;\n object-fit: cover;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.file-upload__file-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.file-upload__file-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #212121;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-upload__file-size {\n font-size: 0.75rem;\n color: #757575;\n}\n\n.file-upload__remove {\n background: none;\n border: none;\n font-size: 1.5rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 4px;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &:hover {\n background-color: #ffebee;\n color: #f44336;\n }\n\n &:focus {\n outline: 2px solid #1976d2;\n outline-offset: 2px;\n }\n}","import { Component, Host, h, Prop, State, Event, EventEmitter } from '@stencil/core';\n\nconst DEFAULT_ACCEPT_ALL = '*' + '/' + '*';\n\nexport interface UploadedFile {\n file: File;\n id: string;\n name: string;\n size: number;\n type: string;\n dataUrl?: string;\n}\n\n@Component({\n tag: 'xplor-file-upload',\n styleUrl: 'xplor-file-upload.scss',\n scoped: true,\n})\nexport class XplorFileUpload {\n /**\n * Accepted file types (e.g., 'image/png', '.pdf', 'image/star'). Default accepts all types.\n */\n @Prop() accepts: string = DEFAULT_ACCEPT_ALL;\n\n /**\n * Maximum file size in bytes\n */\n @Prop() maxSize: number = 10 * 1024 * 1024; // 10MB default\n\n /**\n * Allow multiple file selection\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Disable the file upload\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Show image preview for uploaded images\n */\n @Prop() showPreview: boolean = true;\n\n /**\n * Label text for the upload button\n */\n @Prop() label: string = 'Upload Files';\n\n @State() files: UploadedFile[] = [];\n @State() isDragging: boolean = false;\n @State() error: string = '';\n\n @Event() xplorFileAdd: EventEmitter<UploadedFile[]>;\n @Event() xplorFileRemove: EventEmitter<UploadedFile>;\n @Event() xplorError: EventEmitter<string>;\n\n private fileInputEl: HTMLInputElement;\n\n private handleFileSelect = (event: Event) => {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.processFiles(Array.from(input.files));\n }\n };\n\n private handleDragOver = (event: DragEvent) => {\n event.preventDefault();\n if (!this.disabled) {\n this.isDragging = true;\n }\n };\n\n private handleDragLeave = (event: DragEvent) => {\n event.preventDefault();\n this.isDragging = false;\n };\n\n private handleDrop = (event: DragEvent) => {\n event.preventDefault();\n this.isDragging = false;\n\n if (this.disabled) return;\n\n if (event.dataTransfer?.files) {\n this.processFiles(Array.from(event.dataTransfer.files));\n }\n };\n\n private processFiles(fileList: File[]) {\n this.error = '';\n const validFiles: UploadedFile[] = [];\n\n for (const file of fileList) {\n // Validate file size\n if (file.size > this.maxSize) {\n const maxSizeMB = (this.maxSize / (1024 * 1024)).toFixed(2);\n this.error = `File \"${file.name}\" exceeds maximum size of ${maxSizeMB}MB`;\n this.xplorError.emit(this.error);\n continue;\n }\n\n // Validate file type if specified\n if (this.accepts !== '*/*') {\n const acceptedTypes = this.accepts.split(',').map(t => t.trim());\n const fileExtension = `.${file.name.split('.').pop()}`;\n const isAccepted = acceptedTypes.some(type => {\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', ''));\n }\n return type === file.type || type === fileExtension;\n });\n\n if (!isAccepted) {\n this.error = `File type \"${file.type}\" is not accepted`;\n this.xplorError.emit(this.error);\n continue;\n }\n }\n\n const uploadedFile: UploadedFile = {\n file,\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n name: file.name,\n size: file.size,\n type: file.type,\n };\n\n // Generate preview for images\n if (this.showPreview && file.type.startsWith('image/')) {\n const reader = new FileReader();\n reader.onload = (e) => {\n uploadedFile.dataUrl = e.target?.result as string;\n this.files = [...this.files];\n };\n reader.readAsDataURL(file);\n }\n\n validFiles.push(uploadedFile);\n }\n\n if (validFiles.length > 0) {\n if (this.multiple) {\n this.files = [...this.files, ...validFiles];\n } else {\n this.files = [validFiles[0]];\n }\n this.xplorFileAdd.emit(validFiles);\n }\n\n // Reset input\n if (this.fileInputEl) {\n this.fileInputEl.value = '';\n }\n }\n\n private handleRemoveFile = (fileToRemove: UploadedFile) => {\n this.files = this.files.filter(f => f.id !== fileToRemove.id);\n this.xplorFileRemove.emit(fileToRemove);\n };\n\n private handleButtonClick = () => {\n if (!this.disabled && this.fileInputEl) {\n this.fileInputEl.click();\n }\n };\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n }\n\n render() {\n return (\n <Host>\n <div class=\"file-upload\">\n <div\n class={{\n 'file-upload__dropzone': true,\n 'file-upload__dropzone--dragging': this.isDragging,\n 'file-upload__dropzone--disabled': this.disabled,\n }}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n onDrop={this.handleDrop}\n aria-label={`Drop zone for file upload. ${this.accepts !== '*/*' ? `Accepts: ${this.accepts}.` : ''} Maximum size: ${this.formatFileSize(this.maxSize)}`}\n >\n <input\n ref={(el) => (this.fileInputEl = el)}\n type=\"file\"\n accept={this.accepts}\n multiple={this.multiple}\n disabled={this.disabled}\n onChange={this.handleFileSelect}\n class=\"file-upload__input\"\n />\n\n <div class=\"file-upload__content\">\n <svg class=\"file-upload__icon\" width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15V3M12 3L8 7M12 3L16 7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 17L2 19C2 20.1046 2.89543 21 4 21L20 21C21.1046 21 22 20.1046 22 19L22 17\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n <p class=\"file-upload__text\">\n Drag & drop files here or{' '}\n <button\n type=\"button\"\n class=\"file-upload__button\"\n onClick={this.handleButtonClick}\n disabled={this.disabled}\n >\n {this.label}\n </button>\n </p>\n <p class=\"file-upload__hint\">\n Max size: {this.formatFileSize(this.maxSize)}\n {this.accepts !== '*/*' && ` • Accepts: ${this.accepts}`}\n </p>\n </div>\n </div>\n\n {this.error && (\n <div class=\"file-upload__error\" role=\"alert\">\n {this.error}\n </div>\n )}\n\n {this.files.length > 0 && (\n <div class=\"file-upload__files\">\n {this.files.map((file) => (\n <div key={file.id} class=\"file-upload__file\">\n {file.dataUrl && (\n <img src={file.dataUrl} alt={file.name} class=\"file-upload__preview\" />\n )}\n <div class=\"file-upload__file-info\">\n <span class=\"file-upload__file-name\" title={file.name}>\n {file.name}\n </span>\n <span class=\"file-upload__file-size\">\n {this.formatFileSize(file.size)}\n </span>\n </div>\n <button\n type=\"button\"\n class=\"file-upload__remove\"\n onClick={() => this.handleRemoveFile(file)}\n aria-label={`Remove ${file.name}`}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as XplorInlineDatePicker$1, d as defineCustomElement$1 } from './p-
|
|
1
|
+
import { X as XplorInlineDatePicker$1, d as defineCustomElement$1 } from './p-DURNLP66.js';
|
|
2
2
|
|
|
3
3
|
const XplorInlineDatePicker = XplorInlineDatePicker$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -2,12 +2,14 @@ import { p as proxyCustomElement, H, c as createEvent, h, a as Host } from './in
|
|
|
2
2
|
|
|
3
3
|
const xplorInputFileCss = "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n@layer base {\n \n :root {\n --color-primary: #db3b03;\n --color-primary-50: rgba(255, 152, 0, 1);\n --color-secondary: rgb(0, 119, 107);\n --color-secondary-50: rgba(1, 163, 157, 1);\n --color-tertiary: rgb(128, 104, 186);\n --color-tertiary: rgb(223, 242, 241);\n --color-white: white;\n --color-emphasis: rgb(8, 8, 9);\n --color-supergiant: rgb(213, 66, 99);\n --color-orange: rgb(250, 200, 127);\n --color-buttons: #fbbc05;\n --color-typography: #ea4335;\n --background: 20 66% 99%;\n --foreground: 20 51% 4%;\n --muted: 20 25% 86%;\n --muted-foreground: 20 7% 25%;\n --popover: 20 66% 98%;\n --popover-foreground: 20 51% 3%;\n --card: 20 66% 98%;\n --card-foreground: 20 51% 3%;\n --border: 20 15% 94%;\n --input: 20 15% 94%;\n --primary: 20 48% 72%;\n --primary-foreground: 20 48% 12%;\n --secondary: 20 12% 92%;\n --secondary-foreground: 20 12% 32%;\n --accent: 20 12% 92%;\n --accent-foreground: 20 12% 32%;\n --destructive: 11 80% 22%;\n --destructive-foreground: 11 80% 82%;\n --ring: 20 48% 72%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n .dark {\n --background: 253 43% 3%;\n --foreground: 253 31% 98%;\n --muted: 253 7% 13%;\n --muted-foreground: 253 13% 63%;\n --popover: 253 43% 3%;\n --popover-foreground: 253 31% 98%;\n --card: 253 43% 4%;\n --card-foreground: 253 31% 99%;\n --border: 215 27.9% 16.9%;\n --input: 215 27.9% 16.9%;\n --primary: 253 91% 58%;\n --primary-foreground: 253 91% 98%;\n --secondary: 253 7% 9%;\n --secondary-foreground: 253 7% 69%;\n --accent: 253 13% 14%;\n --accent-foreground: 253 13% 74%;\n --destructive: 339.2 90.36% 51.18%;\n --destructive-foreground: 0 0% 100%;\n --ring: 253 91% 58%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply box-border bg-background text-foreground;\n }\n}\n@layer utilities {\n .min-h-screen {\n min-height: 100vh;\n \n min-height: 100dvh;\n }\n .h-screen {\n height: 100vh;\n \n height: 100dvh;\n }\n}\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n@layer components {\n .glass {\n border: none;\n backdrop-filter: blur(var(--glass-blur, 40px));\n background-color: transparent;\n background-image: linear-gradient(135deg, rgb(255, 255, 255, var(--glass-opacity, 30%)), transparent), linear-gradient(var(--glass-reflex-degree, 100deg), rgb(255, 255, 255, var(--glass-reflex-opacity, 10%)) 25%, transparent 0);\n box-shadow: 0 0 0 1px rgb(255, 255, 255, var(--glass-border-opacity, 10%)) inset, 0 0 0 2px rgba(0, 0, 0, 0.05);\n text-shadow: 0 1px rgb(0, 0, 0, var(--glass-text-shadow-opacity, 5%));\n }\n}\n.tox.tox-tinymce.sc-xplor-input-file {\n width: 50% !important;\n height: 400px !important;\n display: inline-flex;\n}\n\n\n@media only screen and (min-width: 600px) {\n .tox.tox-tinymce.sc-xplor-input-file {\n width: 600px !important;\n }\n}\nh1.sc-xplor-input-file {\n color: var(--color-primary);\n \n font-family: Inter;\n font-size: 48px;\n font-style: normal;\n font-weight: 400;\n line-height: 56px; \n}\n\nh2.sc-xplor-input-file {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 32px;\n font-style: normal;\n font-weight: 600;\n line-height: 38px; \n letter-spacing: 0.25px;\n}\n\nh3.sc-xplor-input-file {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 24px;\n font-style: normal;\n font-weight: 400;\n line-height: 32px; \n}\n\n.overline.sc-xplor-input-file {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px; \n letter-spacing: 3.2px;\n text-transform: uppercase;\n}\n\nol.sc-xplor-input-file, ul.sc-xplor-input-file {\n list-style: none;\n margin: 1rem;\n padding: 0;\n}\nol.sc-xplor-input-file li.sc-xplor-input-file, ul.sc-xplor-input-file li.sc-xplor-input-file {\n margin: 1rem;\n padding: 0;\n}\nol.mdc-list.sc-xplor-input-file, ul.mdc-list.sc-xplor-input-file {\n list-style-type: none;\n list-style: none;\n}\nol.mdc-list.sc-xplor-input-file li.mdc-list-item.sc-xplor-input-file, ul.mdc-list.sc-xplor-input-file li.mdc-list-item.sc-xplor-input-file {\n list-style-type: none;\n list-style: none !important;\n}\n\n.orange-label.sc-xplor-input-file {\n color: var(--Orange-900-Primary, #db3b03);\n \n font-family: Inter;\n font-size: 12px;\n font-style: normal;\n font-weight: 400;\n line-height: 16px; \n letter-spacing: 0.4px;\n margin: 0px 0 -9px 16px;\n z-index: 1 !important;\n position: relative;\n width: fit-content;\n}\n.orange-label.grey-bg.sc-xplor-input-file {\n background-color: #fefcfb;\n}\n\n#spinnerLoader.sc-xplor-input-file {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: #fff;\n padding: 20px;\n border-radius: 5px;\n box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n pointer-events: none;\n}\n\n#textfield-Title-label.sc-xplor-input-file {\n background-color: white;\n}\n\n.mdc-ripple-upgraded.sc-xplor-input-file .mdc-text-field--outlined.sc-xplor-input-file .mdc-notched-outline__notch.sc-xplor-input-file {\n border: 0px solid transparent !important;\n border-bottom: 1px solid #db3b03 !important;\n padding: 0;\n height: 0;\n}\n\n.mdc-text-field--focused.sc-xplor-input-file .mdc-notched-outline__notch.sc-xplor-input-file {\n border: 0px solid transparent !important;\n border-bottom: 2px solid #db3b03 !important;\n}\n\n.mdc-text-field--outlined.sc-xplor-input-file .mdc-notched-outline.sc-xplor-input-file .mdc-notched-outline__notch.sc-xplor-input-file {\n max-width: calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2);\n border-top: transparent;\n}\n\n.generate-btn.sc-xplor-input-file {\n display: flex;\n height: 48px;\n padding: 12px 24px;\n justify-content: center;\n align-items: center;\n gap: 10px;\n border-radius: 16px;\n}\n.generate-btn.link.sc-xplor-input-file:hover {\n background-color: var(--Cyan-700-Secondary, #e27046);\n color: var(--Cyan-700-Secondary-Text, #fff);\n}\n\n.bg-green.sc-xplor-input-file {\n background: var(--Cyan-700-Secondary, #00776b);\n}\n\n.sc-xplor-input-file-h {\n display: block;\n}\n\n.xplor-input-file.sc-xplor-input-file {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n.xplor-input-file__label.sc-xplor-input-file {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-bottom: 0.25rem;\n}\n.xplor-input-file__field.sc-xplor-input-file {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.875rem 1rem;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n gap: 0.75rem;\n}\n.xplor-input-file__field.sc-xplor-input-file:hover:not(.xplor-input-file--disabled .xplor-input-file__field) {\n border-color: rgba(0, 0, 0, 0.6);\n}\n.xplor-input-file__field.sc-xplor-input-file:focus-within {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n}\n.xplor-input-file--disabled.sc-xplor-input-file .xplor-input-file__field.sc-xplor-input-file {\n background-color: rgba(0, 0, 0, 0.04);\n cursor: not-allowed;\n}\n.xplor-input-file--disabled.sc-xplor-input-file .xplor-input-file__placeholder.sc-xplor-input-file, .xplor-input-file--disabled.sc-xplor-input-file .xplor-input-file__icon.sc-xplor-input-file {\n color: rgba(0, 0, 0, 0.38);\n}\n.xplor-input-file__icon.sc-xplor-input-file {\n font-size: 1.25rem;\n color: rgba(0, 0, 0, 0.54);\n flex-shrink: 0;\n}\n.xplor-input-file__content.sc-xplor-input-file {\n flex: 1;\n min-width: 0;\n}\n.xplor-input-file__placeholder.sc-xplor-input-file {\n color: rgba(0, 0, 0, 0.38);\n}\n.xplor-input-file__chips.sc-xplor-input-file {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n}\n.xplor-input-file__chip.sc-xplor-input-file {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background-color: #673AB7;\n color: white;\n border-radius: 1rem;\n font-size: 0.875rem;\n max-width: 100%;\n}\n.xplor-input-file__chip-text.sc-xplor-input-file {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.xplor-input-file__chip-size.sc-xplor-input-file {\n font-size: 0.75rem;\n opacity: 0.8;\n white-space: nowrap;\n}\n.xplor-input-file__additional.sc-xplor-input-file {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-left: 0.5rem;\n}\n.xplor-input-file__clear.sc-xplor-input-file {\n position: relative;\n width: 1.5rem;\n height: 1.5rem;\n border: none;\n background: transparent;\n color: rgba(0, 0, 0, 0.54);\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n.xplor-input-file__clear.sc-xplor-input-file:hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.xplor-input-file__clear.sc-xplor-input-file:active {\n background-color: rgba(0, 0, 0, 0.08);\n}\n.xplor-input-file__input.sc-xplor-input-file {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n}\n.xplor-input-file__input.sc-xplor-input-file:disabled {\n cursor: not-allowed;\n}\n.xplor-input-file__counter.sc-xplor-input-file {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n padding: 0 1rem;\n}";
|
|
4
4
|
|
|
5
|
+
let inputFileIdCounter = 0;
|
|
5
6
|
const XplorInputFile$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputFile extends H {
|
|
6
7
|
constructor() {
|
|
7
8
|
super();
|
|
8
9
|
this.__registerHost();
|
|
9
10
|
this.attach = createEvent(this, "attach");
|
|
10
11
|
this.xplorClear = createEvent(this, "xplorClear");
|
|
12
|
+
this.inputId = `xplor-input-file-${++inputFileIdCounter}`;
|
|
11
13
|
/**
|
|
12
14
|
* Input label
|
|
13
15
|
*/
|
|
@@ -82,7 +84,7 @@ const XplorInputFile$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputFile e
|
|
|
82
84
|
};
|
|
83
85
|
const visibleFiles = this.selectedFiles.slice(0, this.maxChips);
|
|
84
86
|
const additionalCount = this.selectedFiles.length - this.maxChips;
|
|
85
|
-
return (h(Host, { key: '
|
|
87
|
+
return (h(Host, { key: 'f4cdb8be9b2a73258a308e31c07f9a8077ae39c8' }, h("div", { key: '3a43a67ebb7354d1965b808d5252c70939fa917e', class: containerClasses }, this.label && (h("label", { key: '03a177574387efc0a1a7aa3ea05c1425d18a0db9', class: "xplor-input-file__label", htmlFor: this.inputId }, this.label)), h("div", { key: 'ca9c5943b0471244343e507955352af0b72eab76', class: "xplor-input-file__field" }, h("span", { key: '4570d02fbed6e939b153a69ca444cf4c2be7230f', class: "xplor-input-file__icon" }, this.prependInnerIcon), h("div", { key: '408231a07d2ccbdca8e57a7ae36de017f01940bc', class: "xplor-input-file__content" }, this.selectedFiles.length === 0 ? (h("span", { class: "xplor-input-file__placeholder" }, this.placeholder)) : (h("div", { class: "xplor-input-file__chips" }, visibleFiles.map((file) => (h("div", { class: "xplor-input-file__chip", key: file.name }, h("span", { class: "xplor-input-file__chip-text" }, file.name), this.showSize && file.size && (h("span", { class: "xplor-input-file__chip-size" }, "(", this.formatFileSize(file.size), ")"))))), additionalCount > 0 && (h("span", { class: "xplor-input-file__additional" }, "+", additionalCount, " additional file", additionalCount > 1 ? 's' : ''))))), this.selectedFiles.length > 0 && !this.disabled && (h("button", { key: 'da690e16f90d31d9def263a69d4ceef18e185aab', type: "button", class: "xplor-input-file__clear", onClick: this.handleClear, "aria-label": "Clear" }, "\u2715")), h("input", { key: 'f72a3b3295ce47aa4dcad63751f12256fcc20c01', id: this.inputId, ref: (el) => (this.fileInputRef = el), type: "file", class: "xplor-input-file__input", multiple: this.multiple, accept: this.accept, disabled: this.disabled, onChange: this.handleFileChange, "aria-label": this.label || 'Choose file' })), this.counter && this.selectedFiles.length > 0 && (h("div", { key: '495dd2d0314549a384085706df7f2ab722169edf', class: "xplor-input-file__counter" }, this.selectedFiles.length, " file", this.selectedFiles.length > 1 ? 's' : '', " selected")))));
|
|
86
88
|
}
|
|
87
89
|
static get style() { return xplorInputFileCss; }
|
|
88
90
|
}, [2, "xplor-input-file", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"xplor-input-file.js","mappings":"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","names":["XplorInputFile","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-input-file/xplor-input-file.scss?tag=xplor-input-file&encapsulation=scoped","src/components/xplor-input-file/xplor-input-file.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.xplor-input-file {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n &__label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-bottom: 0.25rem;\n }\n\n &__field {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.875rem 1rem;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n gap: 0.75rem;\n\n &:hover:not(.xplor-input-file--disabled &) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n\n &:focus-within {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n\n &--disabled {\n .xplor-input-file__field {\n background-color: rgba(0, 0, 0, 0.04);\n cursor: not-allowed;\n }\n\n .xplor-input-file__placeholder,\n .xplor-input-file__icon {\n color: rgba(0, 0, 0, 0.38);\n }\n }\n\n &__icon {\n font-size: 1.25rem;\n color: rgba(0, 0, 0, 0.54);\n flex-shrink: 0;\n }\n\n &__content {\n flex: 1;\n min-width: 0;\n }\n\n &__placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n }\n\n &__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background-color: #673AB7;\n color: white;\n border-radius: 1rem;\n font-size: 0.875rem;\n max-width: 100%;\n }\n\n &__chip-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__chip-size {\n font-size: 0.75rem;\n opacity: 0.8;\n white-space: nowrap;\n }\n\n &__additional {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-left: 0.5rem;\n }\n\n &__clear {\n position: relative;\n width: 1.5rem;\n height: 1.5rem;\n border: none;\n background: transparent;\n color: rgba(0, 0, 0, 0.54);\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n &:active {\n background-color: rgba(0, 0, 0, 0.08);\n }\n }\n\n &__input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__counter {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n padding: 0 1rem;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State } from '@stencil/core';\n\n@Component({\n tag: 'xplor-input-file',\n styleUrl: 'xplor-input-file.scss',\n scoped: true,\n})\nexport class XplorInputFile {\n private fileInputRef: HTMLInputElement;\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = 'Choose file(s)';\n\n /**\n * Border/focus color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether multiple files can be selected\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Accepted file types\n */\n @Prop() accept: string = '';\n\n /**\n * Maximum number of chips to show\n */\n @Prop() maxChips: number = 1;\n\n /**\n * Whether to show file counter\n */\n @Prop() counter: boolean = true;\n\n /**\n * Whether to show file size\n */\n @Prop() showSize: number = 1000;\n\n /**\n * Prepend inner icon (default: paperclip)\n */\n @Prop() prependInnerIcon: string = '📎';\n\n /**\n * Files selected\n */\n @State() selectedFiles: File[] = [];\n\n /**\n * Attach/change event\n */\n @Event() attach: EventEmitter<File[]>;\n\n /**\n * Clear event\n */\n @Event() xplorClear: EventEmitter<void>;\n\n private handleFileChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n if (target.files) {\n this.selectedFiles = Array.from(target.files);\n this.attach.emit(this.selectedFiles);\n }\n };\n\n private handleClear = () => {\n this.selectedFiles = [];\n if (this.fileInputRef) {\n this.fileInputRef.value = '';\n }\n this.xplorClear.emit();\n };\n\n private formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-file': true,\n 'xplor-input-file--disabled': this.disabled,\n };\n\n const visibleFiles = this.selectedFiles.slice(0, this.maxChips);\n const additionalCount = this.selectedFiles.length - this.maxChips;\n\n return (\n <Host>\n <div class={containerClasses}>\n {this.label && (\n <label class=\"xplor-input-file__label\">{this.label}</label>\n )}\n\n <div class=\"xplor-input-file__field\">\n <span class=\"xplor-input-file__icon\">{this.prependInnerIcon}</span>\n\n <div class=\"xplor-input-file__content\">\n {this.selectedFiles.length === 0 ? (\n <span class=\"xplor-input-file__placeholder\">{this.placeholder}</span>\n ) : (\n <div class=\"xplor-input-file__chips\">\n {visibleFiles.map((file) => (\n <div class=\"xplor-input-file__chip\" key={file.name}>\n <span class=\"xplor-input-file__chip-text\">{file.name}</span>\n {this.showSize && file.size && (\n <span class=\"xplor-input-file__chip-size\">\n ({this.formatFileSize(file.size)})\n </span>\n )}\n </div>\n ))}\n {additionalCount > 0 && (\n <span class=\"xplor-input-file__additional\">\n +{additionalCount} additional file{additionalCount > 1 ? 's' : ''}\n </span>\n )}\n </div>\n )}\n </div>\n\n {this.selectedFiles.length > 0 && !this.disabled && (\n <button\n type=\"button\"\n class=\"xplor-input-file__clear\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n ✕\n </button>\n )}\n\n <input\n ref={(el) => (this.fileInputRef = el)}\n type=\"file\"\n class=\"xplor-input-file__input\"\n multiple={this.multiple}\n accept={this.accept}\n disabled={this.disabled}\n onChange={this.handleFileChange}\n />\n </div>\n\n {this.counter && this.selectedFiles.length > 0 && (\n <div class=\"xplor-input-file__counter\">\n {this.selectedFiles.length} file{this.selectedFiles.length > 1 ? 's' : ''} selected\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"xplor-input-file.js","mappings":"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","names":["XplorInputFile","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-input-file/xplor-input-file.scss?tag=xplor-input-file&encapsulation=scoped","src/components/xplor-input-file/xplor-input-file.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.xplor-input-file {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n &__label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-bottom: 0.25rem;\n }\n\n &__field {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.875rem 1rem;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n gap: 0.75rem;\n\n &:hover:not(.xplor-input-file--disabled &) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n\n &:focus-within {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n\n &--disabled {\n .xplor-input-file__field {\n background-color: rgba(0, 0, 0, 0.04);\n cursor: not-allowed;\n }\n\n .xplor-input-file__placeholder,\n .xplor-input-file__icon {\n color: rgba(0, 0, 0, 0.38);\n }\n }\n\n &__icon {\n font-size: 1.25rem;\n color: rgba(0, 0, 0, 0.54);\n flex-shrink: 0;\n }\n\n &__content {\n flex: 1;\n min-width: 0;\n }\n\n &__placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n }\n\n &__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background-color: #673AB7;\n color: white;\n border-radius: 1rem;\n font-size: 0.875rem;\n max-width: 100%;\n }\n\n &__chip-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__chip-size {\n font-size: 0.75rem;\n opacity: 0.8;\n white-space: nowrap;\n }\n\n &__additional {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-left: 0.5rem;\n }\n\n &__clear {\n position: relative;\n width: 1.5rem;\n height: 1.5rem;\n border: none;\n background: transparent;\n color: rgba(0, 0, 0, 0.54);\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n &:active {\n background-color: rgba(0, 0, 0, 0.08);\n }\n }\n\n &__input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__counter {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n padding: 0 1rem;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State } from '@stencil/core';\n\nlet inputFileIdCounter = 0;\n\n@Component({\n tag: 'xplor-input-file',\n styleUrl: 'xplor-input-file.scss',\n scoped: true,\n})\nexport class XplorInputFile {\n private fileInputRef: HTMLInputElement;\n private inputId = `xplor-input-file-${++inputFileIdCounter}`;\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = 'Choose file(s)';\n\n /**\n * Border/focus color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether multiple files can be selected\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Accepted file types\n */\n @Prop() accept: string = '';\n\n /**\n * Maximum number of chips to show\n */\n @Prop() maxChips: number = 1;\n\n /**\n * Whether to show file counter\n */\n @Prop() counter: boolean = true;\n\n /**\n * Whether to show file size\n */\n @Prop() showSize: number = 1000;\n\n /**\n * Prepend inner icon (default: paperclip)\n */\n @Prop() prependInnerIcon: string = '📎';\n\n /**\n * Files selected\n */\n @State() selectedFiles: File[] = [];\n\n /**\n * Attach/change event\n */\n @Event() attach: EventEmitter<File[]>;\n\n /**\n * Clear event\n */\n @Event() xplorClear: EventEmitter<void>;\n\n private handleFileChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n if (target.files) {\n this.selectedFiles = Array.from(target.files);\n this.attach.emit(this.selectedFiles);\n }\n };\n\n private handleClear = () => {\n this.selectedFiles = [];\n if (this.fileInputRef) {\n this.fileInputRef.value = '';\n }\n this.xplorClear.emit();\n };\n\n private formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-file': true,\n 'xplor-input-file--disabled': this.disabled,\n };\n\n const visibleFiles = this.selectedFiles.slice(0, this.maxChips);\n const additionalCount = this.selectedFiles.length - this.maxChips;\n\n return (\n <Host>\n <div class={containerClasses}>\n {this.label && (\n <label class=\"xplor-input-file__label\" htmlFor={this.inputId}>{this.label}</label>\n )}\n\n <div class=\"xplor-input-file__field\">\n <span class=\"xplor-input-file__icon\">{this.prependInnerIcon}</span>\n\n <div class=\"xplor-input-file__content\">\n {this.selectedFiles.length === 0 ? (\n <span class=\"xplor-input-file__placeholder\">{this.placeholder}</span>\n ) : (\n <div class=\"xplor-input-file__chips\">\n {visibleFiles.map((file) => (\n <div class=\"xplor-input-file__chip\" key={file.name}>\n <span class=\"xplor-input-file__chip-text\">{file.name}</span>\n {this.showSize && file.size && (\n <span class=\"xplor-input-file__chip-size\">\n ({this.formatFileSize(file.size)})\n </span>\n )}\n </div>\n ))}\n {additionalCount > 0 && (\n <span class=\"xplor-input-file__additional\">\n +{additionalCount} additional file{additionalCount > 1 ? 's' : ''}\n </span>\n )}\n </div>\n )}\n </div>\n\n {this.selectedFiles.length > 0 && !this.disabled && (\n <button\n type=\"button\"\n class=\"xplor-input-file__clear\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n ✕\n </button>\n )}\n\n <input\n id={this.inputId}\n ref={(el) => (this.fileInputRef = el)}\n type=\"file\"\n class=\"xplor-input-file__input\"\n multiple={this.multiple}\n accept={this.accept}\n disabled={this.disabled}\n onChange={this.handleFileChange}\n aria-label={this.label || 'Choose file'}\n />\n </div>\n\n {this.counter && this.selectedFiles.length > 0 && (\n <div class=\"xplor-input-file__counter\">\n {this.selectedFiles.length} file{this.selectedFiles.length > 1 ? 's' : ''} selected\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -2,11 +2,13 @@ import { p as proxyCustomElement, H, c as createEvent, h, a as Host } from './in
|
|
|
2
2
|
|
|
3
3
|
const xplorInputSearchCss = "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n@layer base {\n \n :root {\n --color-primary: #db3b03;\n --color-primary-50: rgba(255, 152, 0, 1);\n --color-secondary: rgb(0, 119, 107);\n --color-secondary-50: rgba(1, 163, 157, 1);\n --color-tertiary: rgb(128, 104, 186);\n --color-tertiary: rgb(223, 242, 241);\n --color-white: white;\n --color-emphasis: rgb(8, 8, 9);\n --color-supergiant: rgb(213, 66, 99);\n --color-orange: rgb(250, 200, 127);\n --color-buttons: #fbbc05;\n --color-typography: #ea4335;\n --background: 20 66% 99%;\n --foreground: 20 51% 4%;\n --muted: 20 25% 86%;\n --muted-foreground: 20 7% 25%;\n --popover: 20 66% 98%;\n --popover-foreground: 20 51% 3%;\n --card: 20 66% 98%;\n --card-foreground: 20 51% 3%;\n --border: 20 15% 94%;\n --input: 20 15% 94%;\n --primary: 20 48% 72%;\n --primary-foreground: 20 48% 12%;\n --secondary: 20 12% 92%;\n --secondary-foreground: 20 12% 32%;\n --accent: 20 12% 92%;\n --accent-foreground: 20 12% 32%;\n --destructive: 11 80% 22%;\n --destructive-foreground: 11 80% 82%;\n --ring: 20 48% 72%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n .dark {\n --background: 253 43% 3%;\n --foreground: 253 31% 98%;\n --muted: 253 7% 13%;\n --muted-foreground: 253 13% 63%;\n --popover: 253 43% 3%;\n --popover-foreground: 253 31% 98%;\n --card: 253 43% 4%;\n --card-foreground: 253 31% 99%;\n --border: 215 27.9% 16.9%;\n --input: 215 27.9% 16.9%;\n --primary: 253 91% 58%;\n --primary-foreground: 253 91% 98%;\n --secondary: 253 7% 9%;\n --secondary-foreground: 253 7% 69%;\n --accent: 253 13% 14%;\n --accent-foreground: 253 13% 74%;\n --destructive: 339.2 90.36% 51.18%;\n --destructive-foreground: 0 0% 100%;\n --ring: 253 91% 58%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply box-border bg-background text-foreground;\n }\n}\n@layer utilities {\n .min-h-screen {\n min-height: 100vh;\n \n min-height: 100dvh;\n }\n .h-screen {\n height: 100vh;\n \n height: 100dvh;\n }\n}\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n@layer components {\n .glass {\n border: none;\n backdrop-filter: blur(var(--glass-blur, 40px));\n background-color: transparent;\n background-image: linear-gradient(135deg, rgb(255, 255, 255, var(--glass-opacity, 30%)), transparent), linear-gradient(var(--glass-reflex-degree, 100deg), rgb(255, 255, 255, var(--glass-reflex-opacity, 10%)) 25%, transparent 0);\n box-shadow: 0 0 0 1px rgb(255, 255, 255, var(--glass-border-opacity, 10%)) inset, 0 0 0 2px rgba(0, 0, 0, 0.05);\n text-shadow: 0 1px rgb(0, 0, 0, var(--glass-text-shadow-opacity, 5%));\n }\n}\n.tox.tox-tinymce.sc-xplor-input-search {\n width: 50% !important;\n height: 400px !important;\n display: inline-flex;\n}\n\n\n@media only screen and (min-width: 600px) {\n .tox.tox-tinymce.sc-xplor-input-search {\n width: 600px !important;\n }\n}\nh1.sc-xplor-input-search {\n color: var(--color-primary);\n \n font-family: Inter;\n font-size: 48px;\n font-style: normal;\n font-weight: 400;\n line-height: 56px; \n}\n\nh2.sc-xplor-input-search {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 32px;\n font-style: normal;\n font-weight: 600;\n line-height: 38px; \n letter-spacing: 0.25px;\n}\n\nh3.sc-xplor-input-search {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 24px;\n font-style: normal;\n font-weight: 400;\n line-height: 32px; \n}\n\n.overline.sc-xplor-input-search {\n color: var(--grey-1100252525, #252525);\n \n font-family: Inter;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px; \n letter-spacing: 3.2px;\n text-transform: uppercase;\n}\n\nol.sc-xplor-input-search, ul.sc-xplor-input-search {\n list-style: none;\n margin: 1rem;\n padding: 0;\n}\nol.sc-xplor-input-search li.sc-xplor-input-search, ul.sc-xplor-input-search li.sc-xplor-input-search {\n margin: 1rem;\n padding: 0;\n}\nol.mdc-list.sc-xplor-input-search, ul.mdc-list.sc-xplor-input-search {\n list-style-type: none;\n list-style: none;\n}\nol.mdc-list.sc-xplor-input-search li.mdc-list-item.sc-xplor-input-search, ul.mdc-list.sc-xplor-input-search li.mdc-list-item.sc-xplor-input-search {\n list-style-type: none;\n list-style: none !important;\n}\n\n.orange-label.sc-xplor-input-search {\n color: var(--Orange-900-Primary, #db3b03);\n \n font-family: Inter;\n font-size: 12px;\n font-style: normal;\n font-weight: 400;\n line-height: 16px; \n letter-spacing: 0.4px;\n margin: 0px 0 -9px 16px;\n z-index: 1 !important;\n position: relative;\n width: fit-content;\n}\n.orange-label.grey-bg.sc-xplor-input-search {\n background-color: #fefcfb;\n}\n\n#spinnerLoader.sc-xplor-input-search {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: #fff;\n padding: 20px;\n border-radius: 5px;\n box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n pointer-events: none;\n}\n\n#textfield-Title-label.sc-xplor-input-search {\n background-color: white;\n}\n\n.mdc-ripple-upgraded.sc-xplor-input-search .mdc-text-field--outlined.sc-xplor-input-search .mdc-notched-outline__notch.sc-xplor-input-search {\n border: 0px solid transparent !important;\n border-bottom: 1px solid #db3b03 !important;\n padding: 0;\n height: 0;\n}\n\n.mdc-text-field--focused.sc-xplor-input-search .mdc-notched-outline__notch.sc-xplor-input-search {\n border: 0px solid transparent !important;\n border-bottom: 2px solid #db3b03 !important;\n}\n\n.mdc-text-field--outlined.sc-xplor-input-search .mdc-notched-outline.sc-xplor-input-search .mdc-notched-outline__notch.sc-xplor-input-search {\n max-width: calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2);\n border-top: transparent;\n}\n\n.generate-btn.sc-xplor-input-search {\n display: flex;\n height: 48px;\n padding: 12px 24px;\n justify-content: center;\n align-items: center;\n gap: 10px;\n border-radius: 16px;\n}\n.generate-btn.link.sc-xplor-input-search:hover {\n background-color: var(--Cyan-700-Secondary, #e27046);\n color: var(--Cyan-700-Secondary-Text, #fff);\n}\n\n.bg-green.sc-xplor-input-search {\n background: var(--Cyan-700-Secondary, #00776b);\n}\n\n.sc-xplor-input-search-h {\n display: block;\n}\n\n.xplor-input-search.sc-xplor-input-search {\n display: flex;\n flex-direction: column;\n}\n.xplor-input-search__field.sc-xplor-input-search {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n transition: border-color 0.2s ease;\n padding-right: 0.375rem;\n}\n.xplor-input-search__field.sc-xplor-input-search:hover:not(.xplor-input-search--disabled .xplor-input-search__field) {\n border-color: rgba(0, 0, 0, 0.6);\n}\n.xplor-input-search--focused.sc-xplor-input-search .xplor-input-search__field.sc-xplor-input-search {\n border-color: #008480;\n border-width: 2px;\n padding-right: calc(0.375rem - 1px);\n}\n.xplor-input-search--focused.sc-xplor-input-search .xplor-input-search__input.sc-xplor-input-search {\n padding-left: calc(1rem - 1px);\n}\n.xplor-input-search__input.sc-xplor-input-search {\n flex: 1;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: none;\n outline: none;\n background: transparent;\n min-width: 0;\n}\n.xplor-input-search__input.sc-xplor-input-search::placeholder {\n color: rgba(0, 0, 0, 0.38);\n}\n.xplor-input-search__input.sc-xplor-input-search:disabled {\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n}\n.xplor-input-search__button.sc-xplor-input-search {\n min-height: 0;\n min-width: 0;\n height: 2.5rem;\n width: 2.5rem;\n padding: 0;\n border: none;\n border-radius: 4px;\n background-color: #008480;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n.xplor-input-search__button.sc-xplor-input-search:hover:not(:disabled) {\n background-color: #006D6A;\n}\n.xplor-input-search__button.sc-xplor-input-search:active:not(:disabled) {\n background-color: #005755;\n}\n.xplor-input-search__button.sc-xplor-input-search:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n.xplor-input-search__icon.sc-xplor-input-search {\n width: 1.25rem;\n height: 1.25rem;\n fill: currentColor;\n}\n.xplor-input-search--compact.sc-xplor-input-search .xplor-input-search__input.sc-xplor-input-search {\n padding: 0.625rem 1rem;\n}\n.xplor-input-search--compact.sc-xplor-input-search .xplor-input-search__button.sc-xplor-input-search {\n height: 2rem;\n width: 2rem;\n}\n.xplor-input-search--compact.sc-xplor-input-search .xplor-input-search__icon.sc-xplor-input-search {\n width: 1rem;\n height: 1rem;\n}\n.xplor-input-search--comfortable.sc-xplor-input-search .xplor-input-search__input.sc-xplor-input-search {\n padding: 1rem 1rem;\n}\n.xplor-input-search--comfortable.sc-xplor-input-search .xplor-input-search__button.sc-xplor-input-search {\n height: 2.75rem;\n width: 2.75rem;\n}\n.xplor-input-search--comfortable.sc-xplor-input-search .xplor-input-search__icon.sc-xplor-input-search {\n width: 1.375rem;\n height: 1.375rem;\n}\n.xplor-input-search--disabled.sc-xplor-input-search .xplor-input-search__field.sc-xplor-input-search {\n background-color: rgba(0, 0, 0, 0.04);\n}";
|
|
4
4
|
|
|
5
|
+
let inputSearchIdCounter = 0;
|
|
5
6
|
const XplorInputSearch$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSearch extends H {
|
|
6
7
|
constructor() {
|
|
7
8
|
super();
|
|
8
9
|
this.__registerHost();
|
|
9
10
|
this.search = createEvent(this, "search");
|
|
11
|
+
this.inputId = `xplor-input-search-${++inputSearchIdCounter}`;
|
|
10
12
|
/**
|
|
11
13
|
* Search value
|
|
12
14
|
*/
|
|
@@ -52,9 +54,9 @@ const XplorInputSearch$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSear
|
|
|
52
54
|
'xplor-input-search--focused': this.isFocused,
|
|
53
55
|
'xplor-input-search--disabled': this.disabled,
|
|
54
56
|
};
|
|
55
|
-
return (h(Host, { key: '
|
|
57
|
+
return (h(Host, { key: '943cf40e14806c8d2645e8e08c7868f1bbe1d585' }, h("div", { key: 'a073a7da5206a8f97ad4576628bb5688572709ed', class: containerClasses }, h("div", { key: '52d484023b8d5275d22a2b890fc73c0b758a7899', class: "xplor-input-search__field" }, h("input", { key: 'b520a1127ec5aefe99a8ea92d329823e0380ac63', id: this.inputId, type: "search", class: "xplor-input-search__input", value: this.value, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onKeyDown: this.handleKeyDown, onFocus: () => (this.isFocused = true), onBlur: () => (this.isFocused = false), style: {
|
|
56
58
|
backgroundColor: this.bgColor,
|
|
57
|
-
} }), h("slot", { key: '
|
|
59
|
+
}, role: "searchbox", "aria-label": "Search" }), h("slot", { key: '2e352e10096c529d275071cffa6ff8062faf27a3', name: "append-inner" }, h("button", { key: 'ce5993a34434803f80ff05fc07993ea7865f7120', type: "button", class: "xplor-input-search__button", onClick: this.handleSearch, disabled: this.disabled, "data-testid": "input-search-button", "aria-label": "Search" }, h("svg", { key: '518d76a88181e3286d14102ceced2e1dae0b6a8c', viewBox: "0 0 24 24", class: "xplor-input-search__icon" }, h("path", { key: 'f7253605b82900a022475c107b4719612f614564', d: "M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" }))))))));
|
|
58
60
|
}
|
|
59
61
|
static get style() { return xplorInputSearchCss; }
|
|
60
62
|
}, [6, "xplor-input-search", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"xplor-input-search.js","mappings":";;AAAA,MAAM,mBAAmB,GAAG,msTAAmsT;;
|
|
1
|
+
{"file":"xplor-input-search.js","mappings":"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","names":["XplorInputSearch","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-input-search/xplor-input-search.scss?tag=xplor-input-search&encapsulation=scoped","src/components/xplor-input-search/xplor-input-search.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.xplor-input-search {\n display: flex;\n flex-direction: column;\n\n &__field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n transition: border-color 0.2s ease;\n padding-right: 0.375rem;\n\n &:hover:not(.xplor-input-search--disabled &) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n }\n\n &--focused {\n .xplor-input-search__field {\n border-color: #008480;\n border-width: 2px;\n padding-right: calc(0.375rem - 1px);\n }\n\n .xplor-input-search__input {\n padding-left: calc(1rem - 1px);\n }\n }\n\n &__input {\n flex: 1;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: none;\n outline: none;\n background: transparent;\n min-width: 0;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:disabled {\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n }\n }\n\n &__button {\n min-height: 0;\n min-width: 0;\n height: 2.5rem;\n width: 2.5rem;\n padding: 0;\n border: none;\n border-radius: 4px;\n background-color: #008480;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: #006D6A;\n }\n\n &:active:not(:disabled) {\n background-color: #005755;\n }\n\n &:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n }\n }\n\n &__icon {\n width: 1.25rem;\n height: 1.25rem;\n fill: currentColor;\n }\n\n // Density variants\n &--compact {\n .xplor-input-search__input {\n padding: 0.625rem 1rem;\n }\n\n .xplor-input-search__button {\n height: 2rem;\n width: 2rem;\n }\n\n .xplor-input-search__icon {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &--comfortable {\n .xplor-input-search__input {\n padding: 1rem 1rem;\n }\n\n .xplor-input-search__button {\n height: 2.75rem;\n width: 2.75rem;\n }\n\n .xplor-input-search__icon {\n width: 1.375rem;\n height: 1.375rem;\n }\n }\n\n &--disabled {\n .xplor-input-search__field {\n background-color: rgba(0, 0, 0, 0.04);\n }\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State } from '@stencil/core';\n\nlet inputSearchIdCounter = 0;\n\n@Component({\n tag: 'xplor-input-search',\n styleUrl: 'xplor-input-search.scss',\n scoped: true,\n})\nexport class XplorInputSearch {\n private inputId = `xplor-input-search-${++inputSearchIdCounter}`;\n /**\n * Search value\n */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = 'Search...';\n\n /**\n * Background color\n */\n @Prop() bgColor: string = 'white';\n\n /**\n * Button/focus color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Density (compact, default, comfortable)\n */\n @Prop() density: 'compact' | 'default' | 'comfortable' = 'default';\n\n /**\n * Search event (triggered on button click or Enter key)\n */\n @Event() search: EventEmitter<string>;\n\n @State() isFocused: boolean = false;\n\n private handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.value = target.value;\n };\n\n private handleSearch = () => {\n this.search.emit(this.value);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n this.handleSearch();\n }\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-search': true,\n [`xplor-input-search--${this.density}`]: true,\n 'xplor-input-search--focused': this.isFocused,\n 'xplor-input-search--disabled': this.disabled,\n };\n\n return (\n <Host>\n <div class={containerClasses}>\n <div class=\"xplor-input-search__field\">\n <input\n id={this.inputId}\n type=\"search\"\n class=\"xplor-input-search__input\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n onInput={this.handleInput}\n onKeyDown={this.handleKeyDown}\n onFocus={() => (this.isFocused = true)}\n onBlur={() => (this.isFocused = false)}\n style={{\n backgroundColor: this.bgColor,\n }}\n role=\"searchbox\"\n aria-label=\"Search\"\n />\n\n <slot name=\"append-inner\">\n <button\n type=\"button\"\n class=\"xplor-input-search__button\"\n onClick={this.handleSearch}\n disabled={this.disabled}\n data-testid=\"input-search-button\"\n aria-label=\"Search\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"xplor-input-search__icon\">\n <path d=\"M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z\" />\n </svg>\n </button>\n </slot>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -62,6 +62,7 @@ const XplorInputSelect$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSele
|
|
|
62
62
|
this.isOpen = false;
|
|
63
63
|
this.isFocused = false;
|
|
64
64
|
this.menuPosition = null;
|
|
65
|
+
this.highlightedIndex = -1;
|
|
65
66
|
this.updateMenuPosition = () => {
|
|
66
67
|
if (this.fieldRef) {
|
|
67
68
|
const rect = this.fieldRef.getBoundingClientRect();
|
|
@@ -81,8 +82,12 @@ const XplorInputSelect$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSele
|
|
|
81
82
|
if (!this.disabled && !this.readonly) {
|
|
82
83
|
if (!this.isOpen) {
|
|
83
84
|
this.updateMenuPosition();
|
|
85
|
+
this.highlightedIndex = -1;
|
|
84
86
|
}
|
|
85
87
|
this.isOpen = !this.isOpen;
|
|
88
|
+
if (!this.isOpen) {
|
|
89
|
+
this.highlightedIndex = -1;
|
|
90
|
+
}
|
|
86
91
|
}
|
|
87
92
|
};
|
|
88
93
|
this.handleOptionClick = (option) => {
|
|
@@ -127,6 +132,82 @@ const XplorInputSelect$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSele
|
|
|
127
132
|
disconnectedCallback() {
|
|
128
133
|
document.removeEventListener('click', this.handleOutsideClick);
|
|
129
134
|
}
|
|
135
|
+
handleKeyDown(event) {
|
|
136
|
+
var _a;
|
|
137
|
+
const totalOptions = this.options.length;
|
|
138
|
+
if (totalOptions === 0)
|
|
139
|
+
return;
|
|
140
|
+
switch (event.key) {
|
|
141
|
+
case 'ArrowDown':
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
if (!this.isOpen) {
|
|
144
|
+
this.updateMenuPosition();
|
|
145
|
+
this.isOpen = true;
|
|
146
|
+
this.highlightedIndex = 0;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
this.highlightedIndex = this.highlightedIndex < totalOptions - 1 ? this.highlightedIndex + 1 : 0;
|
|
150
|
+
}
|
|
151
|
+
this.scrollToHighlightedOption();
|
|
152
|
+
break;
|
|
153
|
+
case 'ArrowUp':
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
if (!this.isOpen) {
|
|
156
|
+
this.updateMenuPosition();
|
|
157
|
+
this.isOpen = true;
|
|
158
|
+
this.highlightedIndex = totalOptions - 1;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.highlightedIndex = this.highlightedIndex > 0 ? this.highlightedIndex - 1 : totalOptions - 1;
|
|
162
|
+
}
|
|
163
|
+
this.scrollToHighlightedOption();
|
|
164
|
+
break;
|
|
165
|
+
case 'Enter':
|
|
166
|
+
case ' ':
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
if (this.isOpen && this.highlightedIndex >= 0 && this.highlightedIndex < totalOptions) {
|
|
169
|
+
this.handleOptionClick(this.options[this.highlightedIndex]);
|
|
170
|
+
}
|
|
171
|
+
else if (!this.isOpen) {
|
|
172
|
+
this.toggleDropdown();
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case 'Escape':
|
|
176
|
+
event.preventDefault();
|
|
177
|
+
this.isOpen = false;
|
|
178
|
+
this.highlightedIndex = -1;
|
|
179
|
+
(_a = this.fieldRef) === null || _a === void 0 ? void 0 : _a.focus();
|
|
180
|
+
break;
|
|
181
|
+
case 'Home':
|
|
182
|
+
if (this.isOpen) {
|
|
183
|
+
event.preventDefault();
|
|
184
|
+
this.highlightedIndex = 0;
|
|
185
|
+
this.scrollToHighlightedOption();
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
case 'End':
|
|
189
|
+
if (this.isOpen) {
|
|
190
|
+
event.preventDefault();
|
|
191
|
+
this.highlightedIndex = totalOptions - 1;
|
|
192
|
+
this.scrollToHighlightedOption();
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
case 'Tab':
|
|
196
|
+
this.isOpen = false;
|
|
197
|
+
this.highlightedIndex = -1;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
scrollToHighlightedOption() {
|
|
202
|
+
requestAnimationFrame(() => {
|
|
203
|
+
if (this.selectRef && this.highlightedIndex >= 0) {
|
|
204
|
+
const highlightedEl = this.selectRef.querySelector(`[data-option-index="${this.highlightedIndex}"]`);
|
|
205
|
+
if (highlightedEl) {
|
|
206
|
+
highlightedEl.scrollIntoView({ block: 'nearest' });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
130
211
|
render() {
|
|
131
212
|
const containerClasses = {
|
|
132
213
|
'xplor-input-select': true,
|
|
@@ -136,18 +217,36 @@ const XplorInputSelect$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSele
|
|
|
136
217
|
'xplor-input-select--error': !!this.error,
|
|
137
218
|
};
|
|
138
219
|
const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && (this.error || this.helperText));
|
|
139
|
-
|
|
220
|
+
const listboxId = 'input-select-listbox';
|
|
221
|
+
const labelId = 'input-select-label';
|
|
222
|
+
const errorId = 'input-select-error';
|
|
223
|
+
const helperId = 'input-select-helper';
|
|
224
|
+
const activeDescendantId = this.highlightedIndex >= 0 ? `input-select-option-${this.highlightedIndex}` : undefined;
|
|
225
|
+
// Build aria-describedby from error/helper text
|
|
226
|
+
const describedByParts = [];
|
|
227
|
+
if (this.error)
|
|
228
|
+
describedByParts.push(errorId);
|
|
229
|
+
if (!this.error && this.helperText)
|
|
230
|
+
describedByParts.push(helperId);
|
|
231
|
+
const ariaDescribedBy = describedByParts.length > 0 ? describedByParts.join(' ') : undefined;
|
|
232
|
+
return (h(Host, { key: '4c7693dfd1a0a4ac74ed4f4ff5024d4375acd3a8' }, h("div", { key: 'bcd180aa7fbccfae34ce29b1c9bbe6329bf87476', class: containerClasses, ref: (el) => (this.selectRef = el) }, this.label && (h("label", { key: '85c20aecaf25a7fc260c79a15e4d4bb30804213d', class: "xplor-input-select__label", id: labelId }, this.label, this.required && h("span", { key: '82c8dbcb5d7e77c42e0a6e54b69cbb514563ac2b', class: "xplor-input-select__required" }, "*"))), h("div", { key: 'b7cfc5c895fc57f3eac6e66aa5fd431a89dd07bb', class: "xplor-input-select__field", onClick: this.toggleDropdown, ref: (el) => (this.fieldRef = el), role: "combobox", tabindex: this.disabled ? -1 : 0, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-controls": this.isOpen ? listboxId : undefined, "aria-activedescendant": activeDescendantId, "aria-labelledby": this.label ? labelId : undefined, "aria-label": !this.label ? (this.ariaLabel || this.placeholder) : undefined, "aria-describedby": ariaDescribedBy, "aria-required": this.required ? 'true' : undefined, "aria-disabled": this.disabled ? 'true' : undefined }, h("div", { key: '1125703089a34186cbbfaba5e51d6ea50c5f4239', class: "xplor-input-select__value" }, this.getDisplayValue()), h("span", { key: 'e33ab0424fddc90d1f48ef2b285e70fd3eeaff8a', class: "xplor-input-select__arrow", "aria-hidden": "true" }, this.isOpen ? '▲' : '▼')), this.isOpen && this.menuPosition && (h("div", { key: 'b1fb47a1d217c4156250bded2c9e9ae9bdebf603', class: "xplor-input-select__menu", role: "listbox", id: listboxId, "aria-label": this.label || this.ariaLabel || 'Options', "aria-multiselectable": this.multiple ? 'true' : undefined, style: {
|
|
140
233
|
position: 'fixed',
|
|
141
234
|
top: `${this.menuPosition.top}px`,
|
|
142
235
|
left: `${this.menuPosition.left}px`,
|
|
143
236
|
width: `${this.menuPosition.width}px`,
|
|
144
|
-
} }, this.options.length === 0 ? (h("div", { class: "xplor-input-select__empty" }, "No options available")) : (this.options.map((option) =>
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
237
|
+
} }, this.options.length === 0 ? (h("div", { class: "xplor-input-select__empty", role: "option", "aria-disabled": "true" }, "No options available")) : (this.options.map((option, index) => {
|
|
238
|
+
const selected = this.isSelected(option);
|
|
239
|
+
return (h("div", { key: option.value, id: `input-select-option-${index}`, "data-option-index": index, role: "option", "aria-selected": selected ? 'true' : 'false', class: {
|
|
240
|
+
'xplor-input-select__option': true,
|
|
241
|
+
'xplor-input-select__option--selected': selected,
|
|
242
|
+
'xplor-input-select__option--highlighted': index === this.highlightedIndex,
|
|
243
|
+
}, onClick: () => this.handleOptionClick(option) }, this.multiple && (h("input", { type: "checkbox", class: "xplor-input-select__checkbox", checked: selected, readOnly: true, tabindex: -1, "aria-checked": selected ? 'true' : 'false', "aria-hidden": "true" })), h("div", { class: "xplor-input-select__option-content" }, h("div", { class: "xplor-input-select__option-title" }, option.title), option.subtitle && (h("div", { class: "xplor-input-select__option-subtitle" }, option.subtitle)))));
|
|
244
|
+
})))), showDetails && (h("div", { key: '0a4f46b2460cd068fe27635cbe45d054c06e9538', class: "xplor-input-select__details" }, this.error && h("div", { key: '2d0f44af6a4c115bf3ed66764092b29cf117d57e', class: "xplor-input-select__error-message", id: errorId, role: "alert" }, this.error), !this.error && this.helperText && h("div", { key: 'ee93ffdd070c853b1d779235d6c57e368d75bcf1', class: "xplor-input-select__helper-text", id: helperId }, this.helperText))))));
|
|
148
245
|
}
|
|
246
|
+
get el() { return this; }
|
|
149
247
|
static get style() { return xplorInputSelectCss; }
|
|
150
248
|
}, [2, "xplor-input-select", {
|
|
249
|
+
"ariaLabel": [1, "aria-label"],
|
|
151
250
|
"value": [1032],
|
|
152
251
|
"label": [1],
|
|
153
252
|
"placeholder": [1],
|
|
@@ -163,8 +262,9 @@ const XplorInputSelect$1 = /*@__PURE__*/ proxyCustomElement(class XplorInputSele
|
|
|
163
262
|
"required": [4],
|
|
164
263
|
"isOpen": [32],
|
|
165
264
|
"isFocused": [32],
|
|
166
|
-
"menuPosition": [32]
|
|
167
|
-
|
|
265
|
+
"menuPosition": [32],
|
|
266
|
+
"highlightedIndex": [32]
|
|
267
|
+
}, [[0, "keydown", "handleKeyDown"]]]);
|
|
168
268
|
function defineCustomElement$1() {
|
|
169
269
|
if (typeof customElements === "undefined") {
|
|
170
270
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"xplor-input-select.js","mappings":"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","names":["XplorInputSelect","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-input-select/xplor-input-select.scss?tag=xplor-input-select&encapsulation=scoped","src/components/xplor-input-select/xplor-input-select.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.xplor-input-select {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n &__label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-bottom: 0.25rem;\n }\n\n &__required {\n color: #d32f2f;\n margin-left: 0.25rem;\n }\n\n &__field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.875rem 1rem;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n gap: 0.5rem;\n\n &:hover:not(.xplor-input-select--disabled &) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n }\n\n &--open {\n .xplor-input-select__field {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n\n &--error {\n .xplor-input-select__field {\n border-color: #d32f2f;\n }\n }\n\n &--disabled {\n .xplor-input-select__field {\n background-color: rgba(0, 0, 0, 0.04);\n cursor: not-allowed;\n }\n\n .xplor-input-select__value {\n color: rgba(0, 0, 0, 0.38);\n }\n }\n\n &__value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &__arrow {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.54);\n transition: transform 0.2s ease;\n flex-shrink: 0;\n }\n\n &__menu {\n max-height: 300px;\n overflow-y: auto;\n background-color: white;\n border-radius: 0.5rem;\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2),\n 0px 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0px 3px 14px 2px rgba(0, 0, 0, 0.12);\n z-index: 9999;\n }\n\n &__empty {\n padding: 1rem;\n text-align: center;\n color: rgba(0, 0, 0, 0.6);\n }\n\n &__option {\n display: flex;\n align-items: center;\n padding: 0.875rem 1.25rem;\n cursor: pointer;\n transition: background-color 0.2s ease;\n gap: 0.75rem;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n &--selected {\n background-color: rgba(0, 132, 128, 0.08);\n }\n }\n\n &__checkbox {\n flex-shrink: 0;\n width: 1.125rem;\n height: 1.125rem;\n cursor: pointer;\n }\n\n &__option-content {\n flex: 1;\n min-width: 0;\n }\n\n &__option-title {\n font-size: 1rem;\n color: rgba(0, 0, 0, 0.87);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__option-subtitle {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__details {\n min-height: 1.25rem;\n padding: 0 1rem;\n font-size: 0.75rem;\n }\n\n &__error-message {\n color: #d32f2f;\n }\n\n &__helper-text {\n color: rgba(0, 0, 0, 0.6);\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State } from '@stencil/core';\n\nexport interface SelectOption {\n value: any;\n title: string;\n subtitle?: string;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-input-select',\n styleUrl: 'xplor-input-select.scss',\n scoped: true,\n})\nexport class XplorInputSelect {\n private selectRef: HTMLDivElement;\n private fieldRef: HTMLDivElement;\n\n /**\n * Selected value(s)\n */\n @Prop({ mutable: true }) value: any | any[] = null;\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = 'Select...';\n\n /**\n * Options array\n */\n @Prop() options: SelectOption[] = [];\n\n /**\n * Whether multiple selection is allowed\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Background color\n */\n @Prop() bgColor: string = 'white';\n\n /**\n * Border/focus color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the select is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the select is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Whether to hide validation details\n */\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n\n /**\n * Error message\n */\n @Prop() error: string = '';\n\n /**\n * Helper text\n */\n @Prop() helperText: string = '';\n\n /**\n * Whether the input is required\n */\n @Prop() required: boolean = false;\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<any>;\n\n @State() isOpen: boolean = false;\n @State() isFocused: boolean = false;\n @State() menuPosition: { top: number; left: number; width: number } = null;\n\n componentDidLoad() {\n document.addEventListener('click', this.handleOutsideClick);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n\n private updateMenuPosition = () => {\n if (this.fieldRef) {\n const rect = this.fieldRef.getBoundingClientRect();\n this.menuPosition = {\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n };\n }\n };\n\n private handleOutsideClick = (event: MouseEvent) => {\n if (this.selectRef && !this.selectRef.contains(event.target as Node)) {\n this.isOpen = false;\n }\n };\n\n private toggleDropdown = () => {\n if (!this.disabled && !this.readonly) {\n if (!this.isOpen) {\n this.updateMenuPosition();\n }\n this.isOpen = !this.isOpen;\n }\n };\n\n private handleOptionClick = (option: SelectOption) => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n const index = currentValue.findIndex((v) => v === option.value);\n\n if (index > -1) {\n this.value = currentValue.filter((_, i) => i !== index);\n } else {\n this.value = [...currentValue, option.value];\n }\n } else {\n this.value = option.value;\n this.isOpen = false;\n }\n\n this.xplorChange.emit(this.value);\n };\n\n private isSelected = (option: SelectOption): boolean => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n return currentValue.includes(option.value);\n }\n return this.value === option.value;\n };\n\n private getDisplayValue = (): string => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n if (currentValue.length === 0) return this.placeholder;\n\n const selectedOptions = this.options.filter((opt) =>\n currentValue.includes(opt.value)\n );\n return `${selectedOptions.length} selected`;\n }\n\n const selectedOption = this.options.find((opt) => opt.value === this.value);\n return selectedOption ? selectedOption.title : this.placeholder;\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-select': true,\n 'xplor-input-select--open': this.isOpen,\n 'xplor-input-select--focused': this.isFocused,\n 'xplor-input-select--disabled': this.disabled,\n 'xplor-input-select--error': !!this.error,\n };\n\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && (this.error || this.helperText));\n\n return (\n <Host>\n <div class={containerClasses} ref={(el) => (this.selectRef = el)}>\n {this.label && (\n <label class=\"xplor-input-select__label\">\n {this.label}\n {this.required && <span class=\"xplor-input-select__required\">*</span>}\n </label>\n )}\n\n <div class=\"xplor-input-select__field\" onClick={this.toggleDropdown} ref={(el) => (this.fieldRef = el)}>\n <div class=\"xplor-input-select__value\">\n {this.getDisplayValue()}\n </div>\n <span class=\"xplor-input-select__arrow\">{this.isOpen ? '▲' : '▼'}</span>\n </div>\n\n {this.isOpen && this.menuPosition && (\n <div\n class=\"xplor-input-select__menu\"\n style={{\n position: 'fixed',\n top: `${this.menuPosition.top}px`,\n left: `${this.menuPosition.left}px`,\n width: `${this.menuPosition.width}px`,\n }}\n >\n {this.options.length === 0 ? (\n <div class=\"xplor-input-select__empty\">No options available</div>\n ) : (\n this.options.map((option) => (\n <div\n key={option.value}\n class={{\n 'xplor-input-select__option': true,\n 'xplor-input-select__option--selected': this.isSelected(option),\n }}\n onClick={() => this.handleOptionClick(option)}\n >\n {this.multiple && (\n <input\n type=\"checkbox\"\n class=\"xplor-input-select__checkbox\"\n checked={this.isSelected(option)}\n readOnly\n />\n )}\n <div class=\"xplor-input-select__option-content\">\n <div class=\"xplor-input-select__option-title\">{option.title}</div>\n {option.subtitle && (\n <div class=\"xplor-input-select__option-subtitle\">{option.subtitle}</div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n\n {showDetails && (\n <div class=\"xplor-input-select__details\">\n {this.error && <div class=\"xplor-input-select__error-message\">{this.error}</div>}\n {!this.error && this.helperText && <div class=\"xplor-input-select__helper-text\">{this.helperText}</div>}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"xplor-input-select.js","mappings":"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","names":["XplorInputSelect","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/xplor-input-select/xplor-input-select.scss?tag=xplor-input-select&encapsulation=scoped","src/components/xplor-input-select/xplor-input-select.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.xplor-input-select {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n &__label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n margin-bottom: 0.25rem;\n }\n\n &__required {\n color: #d32f2f;\n margin-left: 0.25rem;\n }\n\n &__field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.875rem 1rem;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n background-color: white;\n cursor: pointer;\n transition: border-color 0.2s ease;\n gap: 0.5rem;\n\n &:hover:not(.xplor-input-select--disabled &) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n }\n\n &--open {\n .xplor-input-select__field {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n\n &--error {\n .xplor-input-select__field {\n border-color: #d32f2f;\n }\n }\n\n &--disabled {\n .xplor-input-select__field {\n background-color: rgba(0, 0, 0, 0.04);\n cursor: not-allowed;\n }\n\n .xplor-input-select__value {\n color: rgba(0, 0, 0, 0.38);\n }\n }\n\n &__value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &__arrow {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.54);\n transition: transform 0.2s ease;\n flex-shrink: 0;\n }\n\n &__menu {\n max-height: 300px;\n overflow-y: auto;\n background-color: white;\n border-radius: 0.5rem;\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2),\n 0px 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0px 3px 14px 2px rgba(0, 0, 0, 0.12);\n z-index: 9999;\n }\n\n &__empty {\n padding: 1rem;\n text-align: center;\n color: rgba(0, 0, 0, 0.6);\n }\n\n &__option {\n display: flex;\n align-items: center;\n padding: 0.875rem 1.25rem;\n cursor: pointer;\n transition: background-color 0.2s ease;\n gap: 0.75rem;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n &--selected {\n background-color: rgba(0, 132, 128, 0.08);\n }\n }\n\n &__checkbox {\n flex-shrink: 0;\n width: 1.125rem;\n height: 1.125rem;\n cursor: pointer;\n }\n\n &__option-content {\n flex: 1;\n min-width: 0;\n }\n\n &__option-title {\n font-size: 1rem;\n color: rgba(0, 0, 0, 0.87);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__option-subtitle {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__details {\n min-height: 1.25rem;\n padding: 0 1rem;\n font-size: 0.75rem;\n }\n\n &__error-message {\n color: #d32f2f;\n }\n\n &__helper-text {\n color: rgba(0, 0, 0, 0.6);\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State, Element, Listen } from '@stencil/core';\n\nexport interface SelectOption {\n value: any;\n title: string;\n subtitle?: string;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-input-select',\n styleUrl: 'xplor-input-select.scss',\n scoped: true,\n})\nexport class XplorInputSelect {\n @Element() el: HTMLElement;\n\n private selectRef: HTMLDivElement;\n private fieldRef: HTMLDivElement;\n\n /**\n * Accessible label for the select when no visible label is provided\n */\n @Prop() ariaLabel: string;\n\n /**\n * Selected value(s)\n */\n @Prop({ mutable: true }) value: any | any[] = null;\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = 'Select...';\n\n /**\n * Options array\n */\n @Prop() options: SelectOption[] = [];\n\n /**\n * Whether multiple selection is allowed\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Background color\n */\n @Prop() bgColor: string = 'white';\n\n /**\n * Border/focus color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the select is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the select is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Whether to hide validation details\n */\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n\n /**\n * Error message\n */\n @Prop() error: string = '';\n\n /**\n * Helper text\n */\n @Prop() helperText: string = '';\n\n /**\n * Whether the input is required\n */\n @Prop() required: boolean = false;\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<any>;\n\n @State() isOpen: boolean = false;\n @State() isFocused: boolean = false;\n @State() menuPosition: { top: number; left: number; width: number } = null;\n @State() highlightedIndex: number = -1;\n\n componentDidLoad() {\n document.addEventListener('click', this.handleOutsideClick);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n const totalOptions = this.options.length;\n if (totalOptions === 0) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen) {\n this.updateMenuPosition();\n this.isOpen = true;\n this.highlightedIndex = 0;\n } else {\n this.highlightedIndex = this.highlightedIndex < totalOptions - 1 ? this.highlightedIndex + 1 : 0;\n }\n this.scrollToHighlightedOption();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (!this.isOpen) {\n this.updateMenuPosition();\n this.isOpen = true;\n this.highlightedIndex = totalOptions - 1;\n } else {\n this.highlightedIndex = this.highlightedIndex > 0 ? this.highlightedIndex - 1 : totalOptions - 1;\n }\n this.scrollToHighlightedOption();\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.isOpen && this.highlightedIndex >= 0 && this.highlightedIndex < totalOptions) {\n this.handleOptionClick(this.options[this.highlightedIndex]);\n } else if (!this.isOpen) {\n this.toggleDropdown();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen = false;\n this.highlightedIndex = -1;\n this.fieldRef?.focus();\n break;\n\n case 'Home':\n if (this.isOpen) {\n event.preventDefault();\n this.highlightedIndex = 0;\n this.scrollToHighlightedOption();\n }\n break;\n\n case 'End':\n if (this.isOpen) {\n event.preventDefault();\n this.highlightedIndex = totalOptions - 1;\n this.scrollToHighlightedOption();\n }\n break;\n\n case 'Tab':\n this.isOpen = false;\n this.highlightedIndex = -1;\n break;\n }\n }\n\n private scrollToHighlightedOption() {\n requestAnimationFrame(() => {\n if (this.selectRef && this.highlightedIndex >= 0) {\n const highlightedEl = this.selectRef.querySelector(`[data-option-index=\"${this.highlightedIndex}\"]`) as HTMLElement;\n if (highlightedEl) {\n highlightedEl.scrollIntoView({ block: 'nearest' });\n }\n }\n });\n }\n\n private updateMenuPosition = () => {\n if (this.fieldRef) {\n const rect = this.fieldRef.getBoundingClientRect();\n this.menuPosition = {\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n };\n }\n };\n\n private handleOutsideClick = (event: MouseEvent) => {\n if (this.selectRef && !this.selectRef.contains(event.target as Node)) {\n this.isOpen = false;\n }\n };\n\n private toggleDropdown = () => {\n if (!this.disabled && !this.readonly) {\n if (!this.isOpen) {\n this.updateMenuPosition();\n this.highlightedIndex = -1;\n }\n this.isOpen = !this.isOpen;\n if (!this.isOpen) {\n this.highlightedIndex = -1;\n }\n }\n };\n\n private handleOptionClick = (option: SelectOption) => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n const index = currentValue.findIndex((v) => v === option.value);\n\n if (index > -1) {\n this.value = currentValue.filter((_, i) => i !== index);\n } else {\n this.value = [...currentValue, option.value];\n }\n } else {\n this.value = option.value;\n this.isOpen = false;\n }\n\n this.xplorChange.emit(this.value);\n };\n\n private isSelected = (option: SelectOption): boolean => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n return currentValue.includes(option.value);\n }\n return this.value === option.value;\n };\n\n private getDisplayValue = (): string => {\n if (this.multiple) {\n const currentValue = Array.isArray(this.value) ? this.value : [];\n if (currentValue.length === 0) return this.placeholder;\n\n const selectedOptions = this.options.filter((opt) =>\n currentValue.includes(opt.value)\n );\n return `${selectedOptions.length} selected`;\n }\n\n const selectedOption = this.options.find((opt) => opt.value === this.value);\n return selectedOption ? selectedOption.title : this.placeholder;\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-select': true,\n 'xplor-input-select--open': this.isOpen,\n 'xplor-input-select--focused': this.isFocused,\n 'xplor-input-select--disabled': this.disabled,\n 'xplor-input-select--error': !!this.error,\n };\n\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && (this.error || this.helperText));\n const listboxId = 'input-select-listbox';\n const labelId = 'input-select-label';\n const errorId = 'input-select-error';\n const helperId = 'input-select-helper';\n const activeDescendantId = this.highlightedIndex >= 0 ? `input-select-option-${this.highlightedIndex}` : undefined;\n\n // Build aria-describedby from error/helper text\n const describedByParts: string[] = [];\n if (this.error) describedByParts.push(errorId);\n if (!this.error && this.helperText) describedByParts.push(helperId);\n const ariaDescribedBy = describedByParts.length > 0 ? describedByParts.join(' ') : undefined;\n\n return (\n <Host>\n <div class={containerClasses} ref={(el) => (this.selectRef = el)}>\n {this.label && (\n <label class=\"xplor-input-select__label\" id={labelId}>\n {this.label}\n {this.required && <span class=\"xplor-input-select__required\">*</span>}\n </label>\n )}\n\n <div\n class=\"xplor-input-select__field\"\n onClick={this.toggleDropdown}\n ref={(el) => (this.fieldRef = el)}\n role=\"combobox\"\n tabindex={this.disabled ? -1 : 0}\n aria-expanded={this.isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={this.isOpen ? listboxId : undefined}\n aria-activedescendant={activeDescendantId}\n aria-labelledby={this.label ? labelId : undefined}\n aria-label={!this.label ? (this.ariaLabel || this.placeholder) : undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={this.required ? 'true' : undefined}\n aria-disabled={this.disabled ? 'true' : undefined}\n >\n <div class=\"xplor-input-select__value\">\n {this.getDisplayValue()}\n </div>\n <span class=\"xplor-input-select__arrow\" aria-hidden=\"true\">{this.isOpen ? '▲' : '▼'}</span>\n </div>\n\n {this.isOpen && this.menuPosition && (\n <div\n class=\"xplor-input-select__menu\"\n role=\"listbox\"\n id={listboxId}\n aria-label={this.label || this.ariaLabel || 'Options'}\n aria-multiselectable={this.multiple ? 'true' : undefined}\n style={{\n position: 'fixed',\n top: `${this.menuPosition.top}px`,\n left: `${this.menuPosition.left}px`,\n width: `${this.menuPosition.width}px`,\n }}\n >\n {this.options.length === 0 ? (\n <div class=\"xplor-input-select__empty\" role=\"option\" aria-disabled=\"true\">No options available</div>\n ) : (\n this.options.map((option, index) => {\n const selected = this.isSelected(option);\n return (\n <div\n key={option.value}\n id={`input-select-option-${index}`}\n data-option-index={index}\n role=\"option\"\n aria-selected={selected ? 'true' : 'false'}\n class={{\n 'xplor-input-select__option': true,\n 'xplor-input-select__option--selected': selected,\n 'xplor-input-select__option--highlighted': index === this.highlightedIndex,\n }}\n onClick={() => this.handleOptionClick(option)}\n >\n {this.multiple && (\n <input\n type=\"checkbox\"\n class=\"xplor-input-select__checkbox\"\n checked={selected}\n readOnly\n tabindex={-1}\n aria-checked={selected ? 'true' : 'false'}\n aria-hidden=\"true\"\n />\n )}\n <div class=\"xplor-input-select__option-content\">\n <div class=\"xplor-input-select__option-title\">{option.title}</div>\n {option.subtitle && (\n <div class=\"xplor-input-select__option-subtitle\">{option.subtitle}</div>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showDetails && (\n <div class=\"xplor-input-select__details\">\n {this.error && <div class=\"xplor-input-select__error-message\" id={errorId} role=\"alert\">{this.error}</div>}\n {!this.error && this.helperText && <div class=\"xplor-input-select__helper-text\" id={helperId}>{this.helperText}</div>}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|