@xplor-education/core-stencil-components 2.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/LICENSE +21 -0
- package/components/index.d.ts +33 -0
- package/components/index.js +2324 -0
- package/components/index.js.map +1 -0
- package/components/p-B1W2qj2l.js +50 -0
- package/components/p-B1W2qj2l.js.map +1 -0
- package/components/p-BK_ATKuB.js +37 -0
- package/components/p-BK_ATKuB.js.map +1 -0
- package/components/p-CBSi5kQB.js +56 -0
- package/components/p-CBSi5kQB.js.map +1 -0
- package/components/p-CTD6SyTD.js +181 -0
- package/components/p-CTD6SyTD.js.map +1 -0
- package/components/p-Ddr35stE.js +117 -0
- package/components/p-Ddr35stE.js.map +1 -0
- package/components/p-x30CgLRv.js +184 -0
- package/components/p-x30CgLRv.js.map +1 -0
- package/components/xplor-alert-dialog.d.ts +11 -0
- package/components/xplor-alert-dialog.js +85 -0
- package/components/xplor-alert-dialog.js.map +1 -0
- package/components/xplor-alert-message.d.ts +11 -0
- package/components/xplor-alert-message.js +48 -0
- package/components/xplor-alert-message.js.map +1 -0
- package/components/xplor-assistant.d.ts +11 -0
- package/components/xplor-assistant.js +763 -0
- package/components/xplor-assistant.js.map +1 -0
- package/components/xplor-autocomplete.d.ts +11 -0
- package/components/xplor-autocomplete.js +268 -0
- package/components/xplor-autocomplete.js.map +1 -0
- package/components/xplor-avatar-and-name.d.ts +11 -0
- package/components/xplor-avatar-and-name.js +48 -0
- package/components/xplor-avatar-and-name.js.map +1 -0
- package/components/xplor-avatar.d.ts +11 -0
- package/components/xplor-avatar.js +9 -0
- package/components/xplor-avatar.js.map +1 -0
- package/components/xplor-badge-active.d.ts +11 -0
- package/components/xplor-badge-active.js +35 -0
- package/components/xplor-badge-active.js.map +1 -0
- package/components/xplor-badge-archived.d.ts +11 -0
- package/components/xplor-badge-archived.js +35 -0
- package/components/xplor-badge-archived.js.map +1 -0
- package/components/xplor-badge-deleted.d.ts +11 -0
- package/components/xplor-badge-deleted.js +35 -0
- package/components/xplor-badge-deleted.js.map +1 -0
- package/components/xplor-badge-expired.d.ts +11 -0
- package/components/xplor-badge-expired.js +35 -0
- package/components/xplor-badge-expired.js.map +1 -0
- package/components/xplor-badge-inactive.d.ts +11 -0
- package/components/xplor-badge-inactive.js +35 -0
- package/components/xplor-badge-inactive.js.map +1 -0
- package/components/xplor-badge-recalled.d.ts +11 -0
- package/components/xplor-badge-recalled.js +35 -0
- package/components/xplor-badge-recalled.js.map +1 -0
- package/components/xplor-badge-session-booking.d.ts +11 -0
- package/components/xplor-badge-session-booking.js +60 -0
- package/components/xplor-badge-session-booking.js.map +1 -0
- package/components/xplor-badge-upcoming.d.ts +11 -0
- package/components/xplor-badge-upcoming.js +35 -0
- package/components/xplor-badge-upcoming.js.map +1 -0
- package/components/xplor-badge-waitlist.d.ts +11 -0
- package/components/xplor-badge-waitlist.js +35 -0
- package/components/xplor-badge-waitlist.js.map +1 -0
- package/components/xplor-badge.d.ts +11 -0
- package/components/xplor-badge.js +151 -0
- package/components/xplor-badge.js.map +1 -0
- package/components/xplor-btn-back-to-parent.d.ts +11 -0
- package/components/xplor-btn-back-to-parent.js +72 -0
- package/components/xplor-btn-back-to-parent.js.map +1 -0
- package/components/xplor-btn-back.d.ts +11 -0
- package/components/xplor-btn-back.js +76 -0
- package/components/xplor-btn-back.js.map +1 -0
- package/components/xplor-btn-icon.d.ts +11 -0
- package/components/xplor-btn-icon.js +77 -0
- package/components/xplor-btn-icon.js.map +1 -0
- package/components/xplor-btn-menu.d.ts +11 -0
- package/components/xplor-btn-menu.js +105 -0
- package/components/xplor-btn-menu.js.map +1 -0
- package/components/xplor-btn-toggle-group.d.ts +11 -0
- package/components/xplor-btn-toggle-group.js +46 -0
- package/components/xplor-btn-toggle-group.js.map +1 -0
- package/components/xplor-btn-toggle-secondary.d.ts +11 -0
- package/components/xplor-btn-toggle-secondary.js +64 -0
- package/components/xplor-btn-toggle-secondary.js.map +1 -0
- package/components/xplor-btn-toggle.d.ts +11 -0
- package/components/xplor-btn-toggle.js +69 -0
- package/components/xplor-btn-toggle.js.map +1 -0
- package/components/xplor-btn-tooltip.d.ts +11 -0
- package/components/xplor-btn-tooltip.js +58 -0
- package/components/xplor-btn-tooltip.js.map +1 -0
- package/components/xplor-button.d.ts +11 -0
- package/components/xplor-button.js +9 -0
- package/components/xplor-button.js.map +1 -0
- package/components/xplor-chat-widget.d.ts +11 -0
- package/components/xplor-chat-widget.js +104 -0
- package/components/xplor-chat-widget.js.map +1 -0
- package/components/xplor-checkbox.d.ts +11 -0
- package/components/xplor-checkbox.js +124 -0
- package/components/xplor-checkbox.js.map +1 -0
- package/components/xplor-combobox.d.ts +11 -0
- package/components/xplor-combobox.js +278 -0
- package/components/xplor-combobox.js.map +1 -0
- package/components/xplor-datatable.d.ts +11 -0
- package/components/xplor-datatable.js +243 -0
- package/components/xplor-datatable.js.map +1 -0
- package/components/xplor-date-picker.d.ts +11 -0
- package/components/xplor-date-picker.js +268 -0
- package/components/xplor-date-picker.js.map +1 -0
- package/components/xplor-drag-and-drop-input.d.ts +11 -0
- package/components/xplor-drag-and-drop-input.js +137 -0
- package/components/xplor-drag-and-drop-input.js.map +1 -0
- package/components/xplor-dropdown.d.ts +11 -0
- package/components/xplor-dropdown.js +9 -0
- package/components/xplor-dropdown.js.map +1 -0
- package/components/xplor-expansion-panel.d.ts +11 -0
- package/components/xplor-expansion-panel.js +74 -0
- package/components/xplor-expansion-panel.js.map +1 -0
- package/components/xplor-expansion-panels.d.ts +11 -0
- package/components/xplor-expansion-panels.js +70 -0
- package/components/xplor-expansion-panels.js.map +1 -0
- package/components/xplor-file-upload.d.ts +11 -0
- package/components/xplor-file-upload.js +183 -0
- package/components/xplor-file-upload.js.map +1 -0
- package/components/xplor-inline-checkbox.d.ts +11 -0
- package/components/xplor-inline-checkbox.js +75 -0
- package/components/xplor-inline-checkbox.js.map +1 -0
- package/components/xplor-inline-date-picker.d.ts +11 -0
- package/components/xplor-inline-date-picker.js +9 -0
- package/components/xplor-inline-date-picker.js.map +1 -0
- package/components/xplor-inline-switch.d.ts +11 -0
- package/components/xplor-inline-switch.js +68 -0
- package/components/xplor-inline-switch.js.map +1 -0
- package/components/xplor-input-file.d.ts +11 -0
- package/components/xplor-input-file.js +121 -0
- package/components/xplor-input-file.js.map +1 -0
- package/components/xplor-input-search.d.ts +11 -0
- package/components/xplor-input-search.js +89 -0
- package/components/xplor-input-search.js.map +1 -0
- package/components/xplor-input-select.d.ts +11 -0
- package/components/xplor-input-select.js +168 -0
- package/components/xplor-input-select.js.map +1 -0
- package/components/xplor-input-send.d.ts +11 -0
- package/components/xplor-input-send.js +87 -0
- package/components/xplor-input-send.js.map +1 -0
- package/components/xplor-input-text-area.d.ts +11 -0
- package/components/xplor-input-text-area.js +131 -0
- package/components/xplor-input-text-area.js.map +1 -0
- package/components/xplor-input-text-secondary.d.ts +11 -0
- package/components/xplor-input-text-secondary.js +94 -0
- package/components/xplor-input-text-secondary.js.map +1 -0
- package/components/xplor-input-text.d.ts +11 -0
- package/components/xplor-input-text.js +129 -0
- package/components/xplor-input-text.js.map +1 -0
- package/components/xplor-input-title.d.ts +11 -0
- package/components/xplor-input-title.js +68 -0
- package/components/xplor-input-title.js.map +1 -0
- package/components/xplor-links.d.ts +11 -0
- package/components/xplor-links.js +38 -0
- package/components/xplor-links.js.map +1 -0
- package/components/xplor-modal-persistent.d.ts +11 -0
- package/components/xplor-modal-persistent.js +65 -0
- package/components/xplor-modal-persistent.js.map +1 -0
- package/components/xplor-modal.d.ts +11 -0
- package/components/xplor-modal.js +9 -0
- package/components/xplor-modal.js.map +1 -0
- package/components/xplor-nav-tabs.d.ts +11 -0
- package/components/xplor-nav-tabs.js +58 -0
- package/components/xplor-nav-tabs.js.map +1 -0
- package/components/xplor-section-card.d.ts +11 -0
- package/components/xplor-section-card.js +46 -0
- package/components/xplor-section-card.js.map +1 -0
- package/components/xplor-section-heading.d.ts +11 -0
- package/components/xplor-section-heading.js +43 -0
- package/components/xplor-section-heading.js.map +1 -0
- package/components/xplor-table.d.ts +11 -0
- package/components/xplor-table.js +275 -0
- package/components/xplor-table.js.map +1 -0
- package/components/xplor-text-bubble.d.ts +11 -0
- package/components/xplor-text-bubble.js +42 -0
- package/components/xplor-text-bubble.js.map +1 -0
- package/components/xplor-text-field.d.ts +11 -0
- package/components/xplor-text-field.js +190 -0
- package/components/xplor-text-field.js.map +1 -0
- package/components/xplor-time-picker.d.ts +11 -0
- package/components/xplor-time-picker.js +348 -0
- package/components/xplor-time-picker.js.map +1 -0
- package/components/xplor-tooltip.d.ts +11 -0
- package/components/xplor-tooltip.js +9 -0
- package/components/xplor-tooltip.js.map +1 -0
- package/dist/cjs/index-Bc5o_4vY.js +2594 -0
- package/dist/cjs/index-Bc5o_4vY.js.map +1 -0
- package/dist/cjs/index.cjs.js +5 -0
- package/dist/cjs/index.cjs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +15 -0
- package/dist/cjs/loader.cjs.js.map +1 -0
- package/dist/cjs/xplor-alert-dialog_57.cjs.entry.js +4750 -0
- package/dist/cjs/xplor-alert-dialog_57.cjs.entry.js.map +1 -0
- package/dist/cjs/xplor-component-library.cjs.js +27 -0
- package/dist/cjs/xplor-component-library.cjs.js.map +1 -0
- package/dist/collection/collection-manifest.json +69 -0
- package/dist/collection/components/element-interface.js +2 -0
- package/dist/collection/components/element-interface.js.map +1 -0
- package/dist/collection/components/helpers.js +129 -0
- package/dist/collection/components/helpers.js.map +1 -0
- package/dist/collection/components/xplor-alert-dialog/xplor-alert-dialog.css +348 -0
- package/dist/collection/components/xplor-alert-dialog/xplor-alert-dialog.js +163 -0
- package/dist/collection/components/xplor-alert-dialog/xplor-alert-dialog.js.map +1 -0
- package/dist/collection/components/xplor-alert-message/xplor-alert-message.css +352 -0
- package/dist/collection/components/xplor-alert-message/xplor-alert-message.js +110 -0
- package/dist/collection/components/xplor-alert-message/xplor-alert-message.js.map +1 -0
- package/dist/collection/components/xplor-assistant/internal/AssistantInput.js +39 -0
- package/dist/collection/components/xplor-assistant/internal/AssistantInput.js.map +1 -0
- package/dist/collection/components/xplor-assistant/internal/AssistantMessage.js +35 -0
- package/dist/collection/components/xplor-assistant/internal/AssistantMessage.js.map +1 -0
- package/dist/collection/components/xplor-assistant/internal/QuickReplies.js +13 -0
- package/dist/collection/components/xplor-assistant/internal/QuickReplies.js.map +1 -0
- package/dist/collection/components/xplor-assistant/internal/TypingIndicator.js +9 -0
- package/dist/collection/components/xplor-assistant/internal/TypingIndicator.js.map +1 -0
- package/dist/collection/components/xplor-assistant/internal/types.js +2 -0
- package/dist/collection/components/xplor-assistant/internal/types.js.map +1 -0
- package/dist/collection/components/xplor-assistant/utils/api.js +138 -0
- package/dist/collection/components/xplor-assistant/utils/api.js.map +1 -0
- package/dist/collection/components/xplor-assistant/utils/icons.js +53 -0
- package/dist/collection/components/xplor-assistant/utils/icons.js.map +1 -0
- package/dist/collection/components/xplor-assistant/utils/speech.js +230 -0
- package/dist/collection/components/xplor-assistant/utils/speech.js.map +1 -0
- package/dist/collection/components/xplor-assistant/xplor-assistant.css +1384 -0
- package/dist/collection/components/xplor-assistant/xplor-assistant.js +675 -0
- package/dist/collection/components/xplor-assistant/xplor-assistant.js.map +1 -0
- package/dist/collection/components/xplor-autocomplete/xplor-autocomplete.css +458 -0
- package/dist/collection/components/xplor-autocomplete/xplor-autocomplete.js +613 -0
- package/dist/collection/components/xplor-autocomplete/xplor-autocomplete.js.map +1 -0
- package/dist/collection/components/xplor-avatar/avatar.stories.js +175 -0
- package/dist/collection/components/xplor-avatar/avatar.stories.js.map +1 -0
- package/dist/collection/components/xplor-avatar/xplor-avatar.css +271 -0
- package/dist/collection/components/xplor-avatar/xplor-avatar.js +186 -0
- package/dist/collection/components/xplor-avatar/xplor-avatar.js.map +1 -0
- package/dist/collection/components/xplor-avatar-and-name/xplor-avatar-and-name.css +284 -0
- package/dist/collection/components/xplor-avatar-and-name/xplor-avatar-and-name.js +122 -0
- package/dist/collection/components/xplor-avatar-and-name/xplor-avatar-and-name.js.map +1 -0
- package/dist/collection/components/xplor-badge/xplor-badge.css +1100 -0
- package/dist/collection/components/xplor-badge/xplor-badge.js +273 -0
- package/dist/collection/components/xplor-badge/xplor-badge.js.map +1 -0
- package/dist/collection/components/xplor-badge-active/xplor-badge-active.css +280 -0
- package/dist/collection/components/xplor-badge-active/xplor-badge-active.js +19 -0
- package/dist/collection/components/xplor-badge-active/xplor-badge-active.js.map +1 -0
- package/dist/collection/components/xplor-badge-archived/xplor-badge-archived.css +280 -0
- package/dist/collection/components/xplor-badge-archived/xplor-badge-archived.js +19 -0
- package/dist/collection/components/xplor-badge-archived/xplor-badge-archived.js.map +1 -0
- package/dist/collection/components/xplor-badge-deleted/xplor-badge-deleted.css +280 -0
- package/dist/collection/components/xplor-badge-deleted/xplor-badge-deleted.js +19 -0
- package/dist/collection/components/xplor-badge-deleted/xplor-badge-deleted.js.map +1 -0
- package/dist/collection/components/xplor-badge-expired/xplor-badge-expired.css +280 -0
- package/dist/collection/components/xplor-badge-expired/xplor-badge-expired.js +19 -0
- package/dist/collection/components/xplor-badge-expired/xplor-badge-expired.js.map +1 -0
- package/dist/collection/components/xplor-badge-inactive/xplor-badge-inactive.css +280 -0
- package/dist/collection/components/xplor-badge-inactive/xplor-badge-inactive.js +19 -0
- package/dist/collection/components/xplor-badge-inactive/xplor-badge-inactive.js.map +1 -0
- package/dist/collection/components/xplor-badge-recalled/xplor-badge-recalled.css +280 -0
- package/dist/collection/components/xplor-badge-recalled/xplor-badge-recalled.js +19 -0
- package/dist/collection/components/xplor-badge-recalled/xplor-badge-recalled.js.map +1 -0
- package/dist/collection/components/xplor-badge-session-booking/xplor-badge-session-booking.css +300 -0
- package/dist/collection/components/xplor-badge-session-booking/xplor-badge-session-booking.js +93 -0
- package/dist/collection/components/xplor-badge-session-booking/xplor-badge-session-booking.js.map +1 -0
- package/dist/collection/components/xplor-badge-upcoming/xplor-badge-upcoming.css +280 -0
- package/dist/collection/components/xplor-badge-upcoming/xplor-badge-upcoming.js +19 -0
- package/dist/collection/components/xplor-badge-upcoming/xplor-badge-upcoming.js.map +1 -0
- package/dist/collection/components/xplor-badge-waitlist/xplor-badge-waitlist.css +280 -0
- package/dist/collection/components/xplor-badge-waitlist/xplor-badge-waitlist.js +19 -0
- package/dist/collection/components/xplor-badge-waitlist/xplor-badge-waitlist.js.map +1 -0
- package/dist/collection/components/xplor-btn-back/xplor-btn-back.css +306 -0
- package/dist/collection/components/xplor-btn-back/xplor-btn-back.js +182 -0
- package/dist/collection/components/xplor-btn-back/xplor-btn-back.js.map +1 -0
- package/dist/collection/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.css +306 -0
- package/dist/collection/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.js +173 -0
- package/dist/collection/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.js.map +1 -0
- package/dist/collection/components/xplor-btn-icon/xplor-btn-icon.css +370 -0
- package/dist/collection/components/xplor-btn-icon/xplor-btn-icon.js +183 -0
- package/dist/collection/components/xplor-btn-icon/xplor-btn-icon.js.map +1 -0
- package/dist/collection/components/xplor-btn-menu/xplor-btn-menu.css +327 -0
- package/dist/collection/components/xplor-btn-menu/xplor-btn-menu.js +238 -0
- package/dist/collection/components/xplor-btn-menu/xplor-btn-menu.js.map +1 -0
- package/dist/collection/components/xplor-btn-toggle/xplor-btn-toggle.css +312 -0
- package/dist/collection/components/xplor-btn-toggle/xplor-btn-toggle.js +151 -0
- package/dist/collection/components/xplor-btn-toggle/xplor-btn-toggle.js.map +1 -0
- package/dist/collection/components/xplor-btn-toggle-group/xplor-btn-toggle-group.css +278 -0
- package/dist/collection/components/xplor-btn-toggle-group/xplor-btn-toggle-group.js +73 -0
- package/dist/collection/components/xplor-btn-toggle-group/xplor-btn-toggle-group.js.map +1 -0
- package/dist/collection/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.css +314 -0
- package/dist/collection/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.js +127 -0
- package/dist/collection/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.js.map +1 -0
- package/dist/collection/components/xplor-btn-tooltip/xplor-btn-tooltip.css +271 -0
- package/dist/collection/components/xplor-btn-tooltip/xplor-btn-tooltip.js +164 -0
- package/dist/collection/components/xplor-btn-tooltip/xplor-btn-tooltip.js.map +1 -0
- package/dist/collection/components/xplor-button/xplor-button.css +1253 -0
- package/dist/collection/components/xplor-button/xplor-button.js +212 -0
- package/dist/collection/components/xplor-button/xplor-button.js.map +1 -0
- package/dist/collection/components/xplor-button/xplor-buttons.stories.js +49 -0
- package/dist/collection/components/xplor-button/xplor-buttons.stories.js.map +1 -0
- package/dist/collection/components/xplor-chat-widget/xplor-chat-widget.css +276 -0
- package/dist/collection/components/xplor-chat-widget/xplor-chat-widget.js +139 -0
- package/dist/collection/components/xplor-chat-widget/xplor-chat-widget.js.map +1 -0
- package/dist/collection/components/xplor-chat-widget/xplor-chat.stories.js +31 -0
- package/dist/collection/components/xplor-chat-widget/xplor-chat.stories.js.map +1 -0
- package/dist/collection/components/xplor-checkbox/xplor-checkbox.css +453 -0
- package/dist/collection/components/xplor-checkbox/xplor-checkbox.js +230 -0
- package/dist/collection/components/xplor-checkbox/xplor-checkbox.js.map +1 -0
- package/dist/collection/components/xplor-combobox/xplor-combobox.css +473 -0
- package/dist/collection/components/xplor-combobox/xplor-combobox.js +553 -0
- package/dist/collection/components/xplor-combobox/xplor-combobox.js.map +1 -0
- package/dist/collection/components/xplor-datatable/xplor-datatable.css +580 -0
- package/dist/collection/components/xplor-datatable/xplor-datatable.js +536 -0
- package/dist/collection/components/xplor-datatable/xplor-datatable.js.map +1 -0
- package/dist/collection/components/xplor-datatable/xplor-datatable.stories.js +137 -0
- package/dist/collection/components/xplor-datatable/xplor-datatable.stories.js.map +1 -0
- package/dist/collection/components/xplor-date-picker/xplor-date-picker.css +415 -0
- package/dist/collection/components/xplor-date-picker/xplor-date-picker.js +694 -0
- package/dist/collection/components/xplor-date-picker/xplor-date-picker.js.map +1 -0
- package/dist/collection/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.css +1149 -0
- package/dist/collection/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.js +256 -0
- package/dist/collection/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.js.map +1 -0
- package/dist/collection/components/xplor-dropdown/xplor-dropdown.css +286 -0
- package/dist/collection/components/xplor-dropdown/xplor-dropdown.js +83 -0
- package/dist/collection/components/xplor-dropdown/xplor-dropdown.js.map +1 -0
- package/dist/collection/components/xplor-expansion-panel/xplor-expansion-panel.css +334 -0
- package/dist/collection/components/xplor-expansion-panel/xplor-expansion-panel.js +122 -0
- package/dist/collection/components/xplor-expansion-panel/xplor-expansion-panel.js.map +1 -0
- package/dist/collection/components/xplor-expansion-panels/xplor-expansion-panels.css +277 -0
- package/dist/collection/components/xplor-expansion-panels/xplor-expansion-panels.js +129 -0
- package/dist/collection/components/xplor-expansion-panels/xplor-expansion-panels.js.map +1 -0
- package/dist/collection/components/xplor-file-upload/xplor-file-upload.css +433 -0
- package/dist/collection/components/xplor-file-upload/xplor-file-upload.js +347 -0
- package/dist/collection/components/xplor-file-upload/xplor-file-upload.js.map +1 -0
- package/dist/collection/components/xplor-inline-checkbox/xplor-inline-checkbox.css +300 -0
- package/dist/collection/components/xplor-inline-checkbox/xplor-inline-checkbox.js +194 -0
- package/dist/collection/components/xplor-inline-checkbox/xplor-inline-checkbox.js.map +1 -0
- package/dist/collection/components/xplor-inline-date-picker/xplor-inline-date-picker.css +410 -0
- package/dist/collection/components/xplor-inline-date-picker/xplor-inline-date-picker.js +325 -0
- package/dist/collection/components/xplor-inline-date-picker/xplor-inline-date-picker.js.map +1 -0
- package/dist/collection/components/xplor-inline-switch/xplor-inline-switch.css +343 -0
- package/dist/collection/components/xplor-inline-switch/xplor-inline-switch.js +168 -0
- package/dist/collection/components/xplor-inline-switch/xplor-inline-switch.js.map +1 -0
- package/dist/collection/components/xplor-input-file/xplor-input-file.css +392 -0
- package/dist/collection/components/xplor-input-file/xplor-input-file.js +340 -0
- package/dist/collection/components/xplor-input-file/xplor-input-file.js.map +1 -0
- package/dist/collection/components/xplor-input-search/xplor-input-search.css +371 -0
- package/dist/collection/components/xplor-input-search/xplor-input-search.js +213 -0
- package/dist/collection/components/xplor-input-search/xplor-input-search.js.map +1 -0
- package/dist/collection/components/xplor-input-select/xplor-input-select.css +397 -0
- package/dist/collection/components/xplor-input-select/xplor-input-select.js +430 -0
- package/dist/collection/components/xplor-input-select/xplor-input-select.js.map +1 -0
- package/dist/collection/components/xplor-input-send/xplor-input-send.css +312 -0
- package/dist/collection/components/xplor-input-send/xplor-input-send.js +218 -0
- package/dist/collection/components/xplor-input-send/xplor-input-send.js.map +1 -0
- package/dist/collection/components/xplor-input-text/xplor-input-text.css +334 -0
- package/dist/collection/components/xplor-input-text/xplor-input-text.js +419 -0
- package/dist/collection/components/xplor-input-text/xplor-input-text.js.map +1 -0
- package/dist/collection/components/xplor-input-text-area/xplor-input-text-area.css +359 -0
- package/dist/collection/components/xplor-input-text-area/xplor-input-text-area.js +416 -0
- package/dist/collection/components/xplor-input-text-area/xplor-input-text-area.js.map +1 -0
- package/dist/collection/components/xplor-input-text-secondary/xplor-input-text-secondary.css +339 -0
- package/dist/collection/components/xplor-input-text-secondary/xplor-input-text-secondary.js +384 -0
- package/dist/collection/components/xplor-input-text-secondary/xplor-input-text-secondary.js.map +1 -0
- package/dist/collection/components/xplor-input-title/xplor-input-title.css +304 -0
- package/dist/collection/components/xplor-input-title/xplor-input-title.js +164 -0
- package/dist/collection/components/xplor-input-title/xplor-input-title.js.map +1 -0
- package/dist/collection/components/xplor-links/xplor-links.css +9 -0
- package/dist/collection/components/xplor-links/xplor-links.js +42 -0
- package/dist/collection/components/xplor-links/xplor-links.js.map +1 -0
- package/dist/collection/components/xplor-links/xplor-links.stories.js +18 -0
- package/dist/collection/components/xplor-links/xplor-links.stories.js.map +1 -0
- package/dist/collection/components/xplor-modal/xplor-modal.css +385 -0
- package/dist/collection/components/xplor-modal/xplor-modal.js +279 -0
- package/dist/collection/components/xplor-modal/xplor-modal.js.map +1 -0
- package/dist/collection/components/xplor-modal-persistent/xplor-modal-persistent.js +152 -0
- package/dist/collection/components/xplor-modal-persistent/xplor-modal-persistent.js.map +1 -0
- package/dist/collection/components/xplor-nav-tabs/xplor-nav-tabs.css +333 -0
- package/dist/collection/components/xplor-nav-tabs/xplor-nav-tabs.js +144 -0
- package/dist/collection/components/xplor-nav-tabs/xplor-nav-tabs.js.map +1 -0
- package/dist/collection/components/xplor-section-card/xplor-section-card.css +1076 -0
- package/dist/collection/components/xplor-section-card/xplor-section-card.js +92 -0
- package/dist/collection/components/xplor-section-card/xplor-section-card.js.map +1 -0
- package/dist/collection/components/xplor-section-heading/xplor-section-heading.css +285 -0
- package/dist/collection/components/xplor-section-heading/xplor-section-heading.js +69 -0
- package/dist/collection/components/xplor-section-heading/xplor-section-heading.js.map +1 -0
- package/dist/collection/components/xplor-table/xplor-table.js +695 -0
- package/dist/collection/components/xplor-table/xplor-table.js.map +1 -0
- package/dist/collection/components/xplor-table/xplor-table.stories.js +159 -0
- package/dist/collection/components/xplor-table/xplor-table.stories.js.map +1 -0
- package/dist/collection/components/xplor-text-bubble/xplor-text-bubble.css +285 -0
- package/dist/collection/components/xplor-text-bubble/xplor-text-bubble.js +50 -0
- package/dist/collection/components/xplor-text-bubble/xplor-text-bubble.js.map +1 -0
- package/dist/collection/components/xplor-text-field/xplor-text-field.css +1280 -0
- package/dist/collection/components/xplor-text-field/xplor-text-field.js +591 -0
- package/dist/collection/components/xplor-text-field/xplor-text-field.js.map +1 -0
- package/dist/collection/components/xplor-time-picker/xplor-time-picker.css +448 -0
- package/dist/collection/components/xplor-time-picker/xplor-time-picker.js +647 -0
- package/dist/collection/components/xplor-time-picker/xplor-time-picker.js.map +1 -0
- package/dist/collection/components/xplor-tooltip/xplor-tooltip.css +336 -0
- package/dist/collection/components/xplor-tooltip/xplor-tooltip.js +311 -0
- package/dist/collection/components/xplor-tooltip/xplor-tooltip.js.map +1 -0
- package/dist/collection/globals/globals.js +32 -0
- package/dist/collection/globals/globals.js.map +1 -0
- package/dist/collection/index.js +2 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/stories/Button.js +17 -0
- package/dist/collection/stories/Button.js.map +1 -0
- package/dist/collection/stories/Button.stories.js +50 -0
- package/dist/collection/stories/Button.stories.js.map +1 -0
- package/dist/collection/stories/Header.js +41 -0
- package/dist/collection/stories/Header.js.map +1 -0
- package/dist/collection/stories/Header.stories.js +28 -0
- package/dist/collection/stories/Header.stories.js.map +1 -0
- package/dist/collection/stories/Page.js +85 -0
- package/dist/collection/stories/Page.js.map +1 -0
- package/dist/collection/stories/Page.stories.js +25 -0
- package/dist/collection/stories/Page.stories.js.map +1 -0
- package/dist/collection/stories/assets/accessibility.svg +1 -0
- package/dist/collection/stories/assets/discord.svg +1 -0
- package/dist/collection/stories/assets/github.svg +1 -0
- package/dist/collection/stories/assets/tutorials.svg +1 -0
- package/dist/collection/stories/assets/youtube.svg +1 -0
- package/dist/collection/utils/helpers.js +25 -0
- package/dist/collection/utils/helpers.js.map +1 -0
- package/dist/components/index.d.ts +33 -0
- package/dist/components/index.js +2324 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/p-4l9DAhAo.js +182 -0
- package/dist/components/p-4l9DAhAo.js.map +1 -0
- package/dist/components/p-BHdeGt6k.js +51 -0
- package/dist/components/p-BHdeGt6k.js.map +1 -0
- package/dist/components/p-BIFlTsO8.js +185 -0
- package/dist/components/p-BIFlTsO8.js.map +1 -0
- package/dist/components/p-CJGP2_5k.js +38 -0
- package/dist/components/p-CJGP2_5k.js.map +1 -0
- package/dist/components/p-DIv_A5Gj.js +57 -0
- package/dist/components/p-DIv_A5Gj.js.map +1 -0
- package/dist/components/p-DKh6y3GY.js +118 -0
- package/dist/components/p-DKh6y3GY.js.map +1 -0
- package/dist/components/xplor-alert-dialog.d.ts +11 -0
- package/dist/components/xplor-alert-dialog.js +86 -0
- package/dist/components/xplor-alert-dialog.js.map +1 -0
- package/dist/components/xplor-alert-message.d.ts +11 -0
- package/dist/components/xplor-alert-message.js +49 -0
- package/dist/components/xplor-alert-message.js.map +1 -0
- package/dist/components/xplor-assistant.d.ts +11 -0
- package/dist/components/xplor-assistant.js +764 -0
- package/dist/components/xplor-assistant.js.map +1 -0
- package/dist/components/xplor-autocomplete.d.ts +11 -0
- package/dist/components/xplor-autocomplete.js +269 -0
- package/dist/components/xplor-autocomplete.js.map +1 -0
- package/dist/components/xplor-avatar-and-name.d.ts +11 -0
- package/dist/components/xplor-avatar-and-name.js +49 -0
- package/dist/components/xplor-avatar-and-name.js.map +1 -0
- package/dist/components/xplor-avatar.d.ts +11 -0
- package/dist/components/xplor-avatar.js +9 -0
- package/dist/components/xplor-avatar.js.map +1 -0
- package/dist/components/xplor-badge-active.d.ts +11 -0
- package/dist/components/xplor-badge-active.js +36 -0
- package/dist/components/xplor-badge-active.js.map +1 -0
- package/dist/components/xplor-badge-archived.d.ts +11 -0
- package/dist/components/xplor-badge-archived.js +36 -0
- package/dist/components/xplor-badge-archived.js.map +1 -0
- package/dist/components/xplor-badge-deleted.d.ts +11 -0
- package/dist/components/xplor-badge-deleted.js +36 -0
- package/dist/components/xplor-badge-deleted.js.map +1 -0
- package/dist/components/xplor-badge-expired.d.ts +11 -0
- package/dist/components/xplor-badge-expired.js +36 -0
- package/dist/components/xplor-badge-expired.js.map +1 -0
- package/dist/components/xplor-badge-inactive.d.ts +11 -0
- package/dist/components/xplor-badge-inactive.js +36 -0
- package/dist/components/xplor-badge-inactive.js.map +1 -0
- package/dist/components/xplor-badge-recalled.d.ts +11 -0
- package/dist/components/xplor-badge-recalled.js +36 -0
- package/dist/components/xplor-badge-recalled.js.map +1 -0
- package/dist/components/xplor-badge-session-booking.d.ts +11 -0
- package/dist/components/xplor-badge-session-booking.js +61 -0
- package/dist/components/xplor-badge-session-booking.js.map +1 -0
- package/dist/components/xplor-badge-upcoming.d.ts +11 -0
- package/dist/components/xplor-badge-upcoming.js +36 -0
- package/dist/components/xplor-badge-upcoming.js.map +1 -0
- package/dist/components/xplor-badge-waitlist.d.ts +11 -0
- package/dist/components/xplor-badge-waitlist.js +36 -0
- package/dist/components/xplor-badge-waitlist.js.map +1 -0
- package/dist/components/xplor-badge.d.ts +11 -0
- package/dist/components/xplor-badge.js +152 -0
- package/dist/components/xplor-badge.js.map +1 -0
- package/dist/components/xplor-btn-back-to-parent.d.ts +11 -0
- package/dist/components/xplor-btn-back-to-parent.js +73 -0
- package/dist/components/xplor-btn-back-to-parent.js.map +1 -0
- package/dist/components/xplor-btn-back.d.ts +11 -0
- package/dist/components/xplor-btn-back.js +77 -0
- package/dist/components/xplor-btn-back.js.map +1 -0
- package/dist/components/xplor-btn-icon.d.ts +11 -0
- package/dist/components/xplor-btn-icon.js +78 -0
- package/dist/components/xplor-btn-icon.js.map +1 -0
- package/dist/components/xplor-btn-menu.d.ts +11 -0
- package/dist/components/xplor-btn-menu.js +106 -0
- package/dist/components/xplor-btn-menu.js.map +1 -0
- package/dist/components/xplor-btn-toggle-group.d.ts +11 -0
- package/dist/components/xplor-btn-toggle-group.js +47 -0
- package/dist/components/xplor-btn-toggle-group.js.map +1 -0
- package/dist/components/xplor-btn-toggle-secondary.d.ts +11 -0
- package/dist/components/xplor-btn-toggle-secondary.js +65 -0
- package/dist/components/xplor-btn-toggle-secondary.js.map +1 -0
- package/dist/components/xplor-btn-toggle.d.ts +11 -0
- package/dist/components/xplor-btn-toggle.js +70 -0
- package/dist/components/xplor-btn-toggle.js.map +1 -0
- package/dist/components/xplor-btn-tooltip.d.ts +11 -0
- package/dist/components/xplor-btn-tooltip.js +59 -0
- package/dist/components/xplor-btn-tooltip.js.map +1 -0
- package/dist/components/xplor-button.d.ts +11 -0
- package/dist/components/xplor-button.js +9 -0
- package/dist/components/xplor-button.js.map +1 -0
- package/dist/components/xplor-chat-widget.d.ts +11 -0
- package/dist/components/xplor-chat-widget.js +105 -0
- package/dist/components/xplor-chat-widget.js.map +1 -0
- package/dist/components/xplor-checkbox.d.ts +11 -0
- package/dist/components/xplor-checkbox.js +125 -0
- package/dist/components/xplor-checkbox.js.map +1 -0
- package/dist/components/xplor-combobox.d.ts +11 -0
- package/dist/components/xplor-combobox.js +279 -0
- package/dist/components/xplor-combobox.js.map +1 -0
- package/dist/components/xplor-datatable.d.ts +11 -0
- package/dist/components/xplor-datatable.js +244 -0
- package/dist/components/xplor-datatable.js.map +1 -0
- package/dist/components/xplor-date-picker.d.ts +11 -0
- package/dist/components/xplor-date-picker.js +269 -0
- package/dist/components/xplor-date-picker.js.map +1 -0
- package/dist/components/xplor-drag-and-drop-input.d.ts +11 -0
- package/dist/components/xplor-drag-and-drop-input.js +138 -0
- package/dist/components/xplor-drag-and-drop-input.js.map +1 -0
- package/dist/components/xplor-dropdown.d.ts +11 -0
- package/dist/components/xplor-dropdown.js +9 -0
- package/dist/components/xplor-dropdown.js.map +1 -0
- package/dist/components/xplor-expansion-panel.d.ts +11 -0
- package/dist/components/xplor-expansion-panel.js +75 -0
- package/dist/components/xplor-expansion-panel.js.map +1 -0
- package/dist/components/xplor-expansion-panels.d.ts +11 -0
- package/dist/components/xplor-expansion-panels.js +71 -0
- package/dist/components/xplor-expansion-panels.js.map +1 -0
- package/dist/components/xplor-file-upload.d.ts +11 -0
- package/dist/components/xplor-file-upload.js +184 -0
- package/dist/components/xplor-file-upload.js.map +1 -0
- package/dist/components/xplor-inline-checkbox.d.ts +11 -0
- package/dist/components/xplor-inline-checkbox.js +76 -0
- package/dist/components/xplor-inline-checkbox.js.map +1 -0
- package/dist/components/xplor-inline-date-picker.d.ts +11 -0
- package/dist/components/xplor-inline-date-picker.js +9 -0
- package/dist/components/xplor-inline-date-picker.js.map +1 -0
- package/dist/components/xplor-inline-switch.d.ts +11 -0
- package/dist/components/xplor-inline-switch.js +69 -0
- package/dist/components/xplor-inline-switch.js.map +1 -0
- package/dist/components/xplor-input-file.d.ts +11 -0
- package/dist/components/xplor-input-file.js +122 -0
- package/dist/components/xplor-input-file.js.map +1 -0
- package/dist/components/xplor-input-search.d.ts +11 -0
- package/dist/components/xplor-input-search.js +90 -0
- package/dist/components/xplor-input-search.js.map +1 -0
- package/dist/components/xplor-input-select.d.ts +11 -0
- package/dist/components/xplor-input-select.js +169 -0
- package/dist/components/xplor-input-select.js.map +1 -0
- package/dist/components/xplor-input-send.d.ts +11 -0
- package/dist/components/xplor-input-send.js +88 -0
- package/dist/components/xplor-input-send.js.map +1 -0
- package/dist/components/xplor-input-text-area.d.ts +11 -0
- package/dist/components/xplor-input-text-area.js +132 -0
- package/dist/components/xplor-input-text-area.js.map +1 -0
- package/dist/components/xplor-input-text-secondary.d.ts +11 -0
- package/dist/components/xplor-input-text-secondary.js +95 -0
- package/dist/components/xplor-input-text-secondary.js.map +1 -0
- package/dist/components/xplor-input-text.d.ts +11 -0
- package/dist/components/xplor-input-text.js +130 -0
- package/dist/components/xplor-input-text.js.map +1 -0
- package/dist/components/xplor-input-title.d.ts +11 -0
- package/dist/components/xplor-input-title.js +69 -0
- package/dist/components/xplor-input-title.js.map +1 -0
- package/dist/components/xplor-links.d.ts +11 -0
- package/dist/components/xplor-links.js +39 -0
- package/dist/components/xplor-links.js.map +1 -0
- package/dist/components/xplor-modal-persistent.d.ts +11 -0
- package/dist/components/xplor-modal-persistent.js +66 -0
- package/dist/components/xplor-modal-persistent.js.map +1 -0
- package/dist/components/xplor-modal.d.ts +11 -0
- package/dist/components/xplor-modal.js +9 -0
- package/dist/components/xplor-modal.js.map +1 -0
- package/dist/components/xplor-nav-tabs.d.ts +11 -0
- package/dist/components/xplor-nav-tabs.js +59 -0
- package/dist/components/xplor-nav-tabs.js.map +1 -0
- package/dist/components/xplor-section-card.d.ts +11 -0
- package/dist/components/xplor-section-card.js +47 -0
- package/dist/components/xplor-section-card.js.map +1 -0
- package/dist/components/xplor-section-heading.d.ts +11 -0
- package/dist/components/xplor-section-heading.js +44 -0
- package/dist/components/xplor-section-heading.js.map +1 -0
- package/dist/components/xplor-table.d.ts +11 -0
- package/dist/components/xplor-table.js +276 -0
- package/dist/components/xplor-table.js.map +1 -0
- package/dist/components/xplor-text-bubble.d.ts +11 -0
- package/dist/components/xplor-text-bubble.js +43 -0
- package/dist/components/xplor-text-bubble.js.map +1 -0
- package/dist/components/xplor-text-field.d.ts +11 -0
- package/dist/components/xplor-text-field.js +191 -0
- package/dist/components/xplor-text-field.js.map +1 -0
- package/dist/components/xplor-time-picker.d.ts +11 -0
- package/dist/components/xplor-time-picker.js +349 -0
- package/dist/components/xplor-time-picker.js.map +1 -0
- package/dist/components/xplor-tooltip.d.ts +11 -0
- package/dist/components/xplor-tooltip.js +9 -0
- package/dist/components/xplor-tooltip.js.map +1 -0
- package/dist/esm/index-Zkk2NJif.js +2566 -0
- package/dist/esm/index-Zkk2NJif.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/loader.js +13 -0
- package/dist/esm/loader.js.map +1 -0
- package/dist/esm/xplor-alert-dialog_57.entry.js +4692 -0
- package/dist/esm/xplor-alert-dialog_57.entry.js.map +1 -0
- package/dist/esm/xplor-component-library.js +23 -0
- package/dist/esm/xplor-component-library.js.map +1 -0
- package/dist/hydrate/index.d.ts +273 -0
- package/dist/hydrate/index.js +25064 -0
- package/dist/hydrate/index.mjs +25056 -0
- package/dist/hydrate/package.json +12 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.js +1 -0
- package/dist/types/components/element-interface.d.ts +19 -0
- package/dist/types/components/helpers.d.ts +47 -0
- package/dist/types/components/xplor-alert-dialog/xplor-alert-dialog.d.ts +29 -0
- package/dist/types/components/xplor-alert-message/xplor-alert-message.d.ts +9 -0
- package/dist/types/components/xplor-assistant/internal/AssistantInput.d.ts +17 -0
- package/dist/types/components/xplor-assistant/internal/AssistantMessage.d.ts +6 -0
- package/dist/types/components/xplor-assistant/internal/QuickReplies.d.ts +6 -0
- package/dist/types/components/xplor-assistant/internal/TypingIndicator.d.ts +5 -0
- package/dist/types/components/xplor-assistant/internal/types.d.ts +106 -0
- package/dist/types/components/xplor-assistant/utils/api.d.ts +48 -0
- package/dist/types/components/xplor-assistant/utils/icons.d.ts +24 -0
- package/dist/types/components/xplor-assistant/utils/speech.d.ts +86 -0
- package/dist/types/components/xplor-assistant/xplor-assistant.d.ts +52 -0
- package/dist/types/components/xplor-autocomplete/xplor-autocomplete.d.ts +92 -0
- package/dist/types/components/xplor-avatar/avatar.stories.d.ts +75 -0
- package/dist/types/components/xplor-avatar/xplor-avatar.d.ts +21 -0
- package/dist/types/components/xplor-avatar-and-name/xplor-avatar-and-name.d.ts +8 -0
- package/dist/types/components/xplor-badge/xplor-badge.d.ts +52 -0
- package/dist/types/components/xplor-badge-active/xplor-badge-active.d.ts +3 -0
- package/dist/types/components/xplor-badge-archived/xplor-badge-archived.d.ts +3 -0
- package/dist/types/components/xplor-badge-deleted/xplor-badge-deleted.d.ts +3 -0
- package/dist/types/components/xplor-badge-expired/xplor-badge-expired.d.ts +3 -0
- package/dist/types/components/xplor-badge-inactive/xplor-badge-inactive.d.ts +3 -0
- package/dist/types/components/xplor-badge-recalled/xplor-badge-recalled.d.ts +3 -0
- package/dist/types/components/xplor-badge-session-booking/xplor-badge-session-booking.d.ts +20 -0
- package/dist/types/components/xplor-badge-upcoming/xplor-badge-upcoming.d.ts +3 -0
- package/dist/types/components/xplor-badge-waitlist/xplor-badge-waitlist.d.ts +3 -0
- package/dist/types/components/xplor-btn-back/xplor-btn-back.d.ts +29 -0
- package/dist/types/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.d.ts +29 -0
- package/dist/types/components/xplor-btn-icon/xplor-btn-icon.d.ts +29 -0
- package/dist/types/components/xplor-btn-menu/xplor-btn-menu.d.ts +49 -0
- package/dist/types/components/xplor-btn-toggle/xplor-btn-toggle.d.ts +25 -0
- package/dist/types/components/xplor-btn-toggle-group/xplor-btn-toggle-group.d.ts +11 -0
- package/dist/types/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.d.ts +21 -0
- package/dist/types/components/xplor-btn-tooltip/xplor-btn-tooltip.d.ts +10 -0
- package/dist/types/components/xplor-button/xplor-button.d.ts +19 -0
- package/dist/types/components/xplor-button/xplor-buttons.stories.d.ts +32 -0
- package/dist/types/components/xplor-chat-widget/xplor-chat-widget.d.ts +13 -0
- package/dist/types/components/xplor-chat-widget/xplor-chat.stories.d.ts +32 -0
- package/dist/types/components/xplor-checkbox/xplor-checkbox.d.ts +25 -0
- package/dist/types/components/xplor-combobox/xplor-combobox.d.ts +77 -0
- package/dist/types/components/xplor-datatable/xplor-datatable.d.ts +103 -0
- package/dist/types/components/xplor-datatable/xplor-datatable.stories.d.ts +18 -0
- package/dist/types/components/xplor-date-picker/xplor-date-picker.d.ts +53 -0
- package/dist/types/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.d.ts +42 -0
- package/dist/types/components/xplor-dropdown/xplor-dropdown.d.ts +6 -0
- package/dist/types/components/xplor-expansion-panel/xplor-expansion-panel.d.ts +18 -0
- package/dist/types/components/xplor-expansion-panels/xplor-expansion-panels.d.ts +12 -0
- package/dist/types/components/xplor-file-upload/xplor-file-upload.d.ts +51 -0
- package/dist/types/components/xplor-inline-checkbox/xplor-inline-checkbox.d.ts +33 -0
- package/dist/types/components/xplor-inline-date-picker/xplor-inline-date-picker.d.ts +57 -0
- package/dist/types/components/xplor-inline-switch/xplor-inline-switch.d.ts +29 -0
- package/dist/types/components/xplor-input-file/xplor-input-file.d.ts +60 -0
- package/dist/types/components/xplor-input-search/xplor-input-search.d.ts +36 -0
- package/dist/types/components/xplor-input-select/xplor-input-select.d.ts +76 -0
- package/dist/types/components/xplor-input-send/xplor-input-send.d.ts +18 -0
- package/dist/types/components/xplor-input-text/xplor-input-text.d.ts +73 -0
- package/dist/types/components/xplor-input-text-area/xplor-input-text-area.d.ts +72 -0
- package/dist/types/components/xplor-input-text-secondary/xplor-input-text-secondary.d.ts +25 -0
- package/dist/types/components/xplor-input-title/xplor-input-title.d.ts +30 -0
- package/dist/types/components/xplor-links/xplor-links.d.ts +4 -0
- package/dist/types/components/xplor-links/xplor-links.stories.d.ts +12 -0
- package/dist/types/components/xplor-modal/xplor-modal.d.ts +45 -0
- package/dist/types/components/xplor-modal-persistent/xplor-modal-persistent.d.ts +28 -0
- package/dist/types/components/xplor-nav-tabs/xplor-nav-tabs.d.ts +15 -0
- package/dist/types/components/xplor-section-card/xplor-section-card.d.ts +6 -0
- package/dist/types/components/xplor-section-heading/xplor-section-heading.d.ts +5 -0
- package/dist/types/components/xplor-table/xplor-table.d.ts +65 -0
- package/dist/types/components/xplor-table/xplor-table.stories.d.ts +77 -0
- package/dist/types/components/xplor-text-bubble/xplor-text-bubble.d.ts +4 -0
- package/dist/types/components/xplor-text-field/xplor-text-field.d.ts +111 -0
- package/dist/types/components/xplor-time-picker/xplor-time-picker.d.ts +55 -0
- package/dist/types/components/xplor-tooltip/xplor-tooltip.d.ts +28 -0
- package/dist/types/components.d.ts +4360 -0
- package/dist/types/globals/globals.d.ts +3 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/interfaces.d.ts +104 -0
- package/dist/types/stencil-public-runtime.d.ts +1702 -0
- package/dist/types/stories/Button.d.ts +15 -0
- package/dist/types/stories/Header.d.ts +10 -0
- package/dist/types/stories/Page.d.ts +2 -0
- package/dist/types/stories/Page.stories.d.ts +11 -0
- package/dist/types/utils/helpers.d.ts +3 -0
- package/dist/xplor-component-library/index.esm.js +2 -0
- package/dist/xplor-component-library/index.esm.js.map +1 -0
- package/dist/xplor-component-library/loader.esm.js.map +1 -0
- package/dist/xplor-component-library/p-25fa8553.entry.js +2 -0
- package/dist/xplor-component-library/p-25fa8553.entry.js.map +1 -0
- package/dist/xplor-component-library/p-Zkk2NJif.js +3 -0
- package/dist/xplor-component-library/p-Zkk2NJif.js.map +1 -0
- package/dist/xplor-component-library/xplor-component-library.css +1 -0
- package/dist/xplor-component-library/xplor-component-library.esm.js +2 -0
- package/dist/xplor-component-library/xplor-component-library.esm.js.map +1 -0
- package/loader/cdn.js +1 -0
- package/loader/index.cjs.js +1 -0
- package/loader/index.d.ts +24 -0
- package/loader/index.es2017.js +1 -0
- package/loader/index.js +2 -0
- package/package.json +124 -0
- package/readme.md +315 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["xplorAlertDialogCss","XplorAlertDialog","constructor","hostRef","this","open","width","persistent","handleBackdropClick","closeDialog","handleCardClick","event","stopPropagation","xplorClose","emit","xplorDialogChange","handleOpenChange","newValue","document","body","style","overflow","disconnectedCallback","render","h","Host","class","onClick","type","name","xplorAlertMessageCss","XplorAlertMessage","dismissible","handleDismiss","xplorDismiss","key","role","alertTitle","generateSessionId","timestamp","Date","now","random","Math","toString","substring","getCurrentDate","year","getFullYear","month","String","getMonth","padStart","day","getDate","getCurrentTime","hours","getHours","minutes","getMinutes","seconds","getSeconds","async","sendMessageToAPI","endpoint","message","sessionId","userId","userEmail","userName","Error","trim","payload","currentDate","currentTime","response","fetch","method","headers","JSON","stringify","ok","errorText","text","catch","statusText","status","data","json","error","includes","detectBrowserCapabilities","window","voiceInput","textToSpeech","hasVoiceInput","hasTTS","SpeechRecognitionManager","recognition","onResultCallback","onErrorCallback","onStartCallback","onEndCallback","SpeechRecognition","webkitSpeechRecognition","continuous","interimResults","lang","maxAlternatives","onstart","onresult","transcript","results","onerror","errorMessage","getErrorMessage","onend","start","console","stop","onResult","callback","onError","onStart","onEnd","isAvailable","SpeechSynthesisManager","currentUtterance","speak","SpeechSynthesisUtterance","rate","pitch","volume","speechSynthesis","speaking","cancel","isSpeaking","microphoneIcon","sendIcon","speakerIcon","stopIcon","AssistantMessage","props","enableTextToSpeech","onSpeak","onStopSpeaking","messageClasses","handleSpeakClick","content","formatTime","ampm","displayHours","displayMinutes","title","innerHTML","AssistantInput","placeholder","disabled","isLoading","enableVoiceInput","isListening","inputValue","onSendMessage","onStartListening","onStopListening","setInputValue","handleSubmit","e","preventDefault","log","handleInputChange","target","value","handleVoiceClick","isSendDisabled","onSubmit","onInput","QuickReplies","replies","onReplyClick","length","map","reply","TypingIndicator","xplorAssistantCss","XplorAssistant","autoSpeak","maxHeight","messages","internalSessionId","hasVoiceSupport","hasTTSSupport","handleSendMessage","messageText","userMessage","id","assistantMessageSent","apiEndpoint","assistantMessage","assistantMessageReceived","handleError","handleVoiceInput","assistantError","handleStartListening","speechRecognition","handleStopListening","handleSpeak","handleStopSpeaking","handleQuickReply","componentWillLoad","assistantSessionCreated","capabilities","handleSessionIdChange","newSessionId","componentDidUpdate","scrollToBottom","sendMessage","clearHistory","stopSpeaking","messagesContainerRef","setTimeout","scrollTop","scrollHeight","ref","el","quickReplies","xplorAutocompleteCss","XplorAutocomplete","items","readonly","clearable","multiple","minSearchLength","itemValue","itemText","menuMaxWidth","isOpen","searchQuery","filteredItems","selectedItems","highlightedIndex","handleInputFocus","input","filterItems","xplorSearch","xplorChange","handleInputKeyDown","min","scrollToHighlighted","max","selectItem","_a","inputEl","blur","removeItem","handleClear","xplorClear","focus","getItemValue","item","undefined","getItemText","label","Array","isArray","selectedItem","find","handleDocumentClick","contains","query","toLowerCase","filter","dropdownEl","highlightedEl","querySelector","scrollIntoView","block","itemVal","xplorSelect","v","getSelectedItemLabel","i","findItemByValue","hasValue","autocomplete","renderSelection","onFocus","onKeyDown","maxWidth","index","autocomplete__item","renderItem","xplorAvatarCss","XplorAvatar","className","size","color","inner","src","alt","href","xplorAvatarAndNameCss","XplorAvatarAndName","charAt","toUpperCase","xplorBadgeCss","XplorBadge","backgroundColor","threshold","variant","datatable","calculateLuminance","r","g","b","rs","gs","bs","c","pow","parseColor","startsWith","hex","replace","parseInt","rgbMatch","match","calculateContrastingColor","bgColor","rgb","luminance","cssVars","vars","computedClasses","xplorBadgeActiveCss","XplorBadgeActive","xplorBadgeArchivedCss","XplorBadgeArchived","xplorBadgeDeletedCss","XplorBadgeDeleted","xplorBadgeExpiredCss","XplorBadgeExpired","xplorBadgeInactiveCss","XplorBadgeInactive","xplorBadgeRecalledCss","XplorBadgeRecalled","xplorBadgeSessionBookingCss","XplorBadgeSessionBooking","getBookingTypeClass","classes","booking","push","_b","ccs_gap_fee_is_waived","join","xplorBadgeUpcomingCss","XplorBadgeUpcoming","xplorBadgeWaitlistCss","XplorBadgeWaitlist","xplorBtnBackCss","XplorBtnBack","minWidth","minHeight","gap","handleClick","xplorClick","buttonClasses","buttonStyles","xplorBtnBackToParentCss","XplorBtnBackToParent","inline","back","xplorBtnIconCss","XplorBtnIcon","iconSize","xplorBtnMenuCss","XplorBtnMenu","options","hiddenKeys","disabledKeys","density","show","handleOutsideClick","menuRef","toggleMenu","handleClickOption","option","isHidden","isDisabled","componentDidLoad","addEventListener","removeEventListener","xplorBtnToggleCss","XplorBtnToggle","active","inactiveOutlined","xplorToggle","xplorBtnToggleGroupCss","XplorBtnToggleGroup","xplorBtnToggleSecondaryCss","XplorBtnToggleSecondary","xplorBtnTooltipCss","XplorBtnTooltip","tooltipPosition","position","tooltipText","trigger","arrow","slot","mode","iconPosition","xplorButtonCss","XplorButton","icon","renderIcon","iconSvg","isIconOnly","hasIcon","Object","assign","shadow","styles","clickAction","xplorChatWidgetCss","XplorChatWidget","languageOptions","textId","selectedLanguage","apiKey","service","action","language","textValue","then","handleChange","selectElement","element","host","shadowRoot","getElementById","textContent","selected","xplorCheckboxCss","XplorCheckbox","initialChecked","initialIndeterminate","checked","indeterminate","isHovered","isFocused","isPressed","checkboxChange","handleKeyDown","handleKeyUp","getCheckboxClass","watchCheckedProp","watchIndeterminateProp","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","onBlur","onKeyUp","tabIndex","viewBox","fill","d","stroke","xplorComboboxCss","XplorCombobox","allowCustom","createMessage","customItems","totalItems","canCreateNew","createNewItem","allItems","exactMatch","some","newItem","xplorCreate","showCreateOption","combobox","combobox__item","xplorDatatableCss","XplorDatatable","loading","pagination","page","perpage","total","canSelect","horizontalLines","striped","skeletonLoader","hover","perPageOptions","sortBy","sortDirection","internalSelected","Set","allSelected","handleSort","column","sortable","sortChange","direction","handleSelectAll","forEach","add","clear","xplorSelectionChange","from","handleSelectOne","delete","updateAllSelectedState","handleRowClick","tagName","closest","rowClick","handlePageChange","newPage","updatedPagination","paginationChange","handlePerPageChange","isNaN","watchSelected","newSelected","watchItems","every","has","getSortIcon","height","opacity","renderSkeletonLoader","renderPagination","totalPages","ceil","currentPage","end","tableHeight","hasHeight","onChange","header","sorted","fixed","align","colSpan","isSelected","clickable","xplorDatePickerCss","XplorDatePicker","monthType","display","dateFormat","closeOnSelect","startWeekOnSunday","hideDetails","required","inputText","dropdownPosition","toggleDropdown","updateDropdownPosition","xplorFocus","handleInputBlur","xplorBlur","parsed","parseInputText","isDateInRange","formatDateForDisplay","dateChange","handleDateSelected","iso","detail","parseISODate","finalDate","finalIso","toISO","handleTextClick","getTime","date","Intl","DateTimeFormat","format","trimmed","slashMatch","isoMatch","rect","getBoundingClientRect","spaceBelow","innerHeight","bottom","showDetails","calendarIcon","x","y","rx","ry","x1","y1","x2","y2","selectedDate","onDateSelected","xplorDragAndDropInputCss","DEFAULT_ACCEPT_ALL","XplorDragAndDropInput","accepts","browseLabel","dragover","currentFile","onDrop","file","dataTransfer","files","fileSelect","onDragOver","onDragEnter","onDragLeave","onFileSelect","openFileDialog","fileInputEl","click","getAcceptsLabel","clearCurrentFile","fileClear","xmlns","accept","xplorDropdownCss","XplorDropdown","xplorExpansionPanelCss","nextId","XplorExpansionPanel","contentHeight","handleToggle","xplorPanelToggle","panelId","updateContentHeight","contentEl","xplorExpansionPanelsCss","XplorExpansionPanels","accordion","openPanels","handlePanelToggle","newPanels","xplorFileUploadCss","XplorFileUpload","maxSize","showPreview","isDragging","handleFileSelect","processFiles","handleDragOver","handleDragLeave","handleDrop","handleRemoveFile","fileToRemove","f","xplorFileRemove","handleButtonClick","fileList","validFiles","maxSizeMB","toFixed","xplorError","acceptedTypes","split","t","fileExtension","pop","isAccepted","endsWith","uploadedFile","substr","reader","FileReader","onload","dataUrl","result","readAsDataURL","xplorFileAdd","formatFileSize","bytes","k","sizes","floor","round","xplorInlineCheckboxCss","XplorInlineCheckbox","containerClasses","accentColor","xplorInlineDatePickerCss","XplorInlineDatePicker","monthNames","dayNames","dayNamesStartMonday","previousMonth","currentMonth","currentYear","viewDate","monthChanged","nextMonth","selectDate","dateString","formatDate","isDateDisabled","dateSelected","minDate","maxDate","isToday","today","getDaysInMonth","getFirstDayOfMonth","firstDay","getDay","renderCalendarDays","daysInMonth","days","getSidebarDate","sidebarDate","dayHeaders","xplorInlineSwitchCss","XplorInlineSwitch","xplorInputFileCss","XplorInputFile","maxChips","counter","showSize","prependInnerIcon","selectedFiles","handleFileChange","attach","fileInputRef","visibleFiles","slice","additionalCount","xplorInputSearchCss","XplorInputSearch","handleInput","handleSearch","search","xplorInputSelectCss","XplorInputSelect","helperText","selectRef","handleOptionClick","currentValue","findIndex","_","getDisplayValue","selectedOptions","opt","selectedOption","readOnly","subtitle","xplorInputSendCss","XplorInputSend","buttonText","buttonType","internalValue","xplorValueChange","shiftKey","handleSend","xplorSend","maxLength","xplorInputTextCss","XplorInputText","xplorInput","handleFocus","handleBlur","xplorInputTextAreaCss","XplorInputTextArea","rows","showClearButton","xplorInputTextSecondaryCss","XplorInputTextSecondary","isDirty","xplorInputTitleCss","XplorInputTitle","xplorLinksCss","XplorLinks","brand","xplorModalCss","XplorModal","scrollable","showTitle","closeModal","cardClasses","bodyClasses","XplorModalPersistent","onXplorClose","xplorNavTabsCss","XplorNavTabs","grow","handleTabClick","xplorSectionCardCss","XplorSectionCard","outlined","rounded","padding","xplorSectionHeadingCss","XplorSectionHeading","getIconType","sortType","XplorTable","selectedValues","isSortable","sortableColumns","areAllSelected","hasScrolled","sortTypeArray","selectedDateRange","handlePagination","handleDateRangeChange","handleFilterReports","handleDownloadAll","selectAllValue","selectAll","HTMLInputElement","querySelectorAll","selectOne","checkboxIdx","selectedIdx","tableSelect","onScroll","container","scrollLeft","col","val","idx","a","toLocaleLowerCase","rowData","sort","setData","getPaginatedData","startIndex","endIndex","watchData","columns","freeze","paginatedData","iconType","isColumnSortable","multiselect","row","rowNum","cell","htmlFor","xplorTextBubbleCss","XplorTextBubble","xplorTextFieldCss","XplorTextField","errorMessages","customClass","valueChange","inputFocus","inputBlur","clearClick","inputElement","handleValueChange","hasError","labelFloating","maxlength","xplorTimePickerCss","XplorTimePicker","prefill","showSeconds","period","lastGoodValue","emitChange","timeChange","incrementHours","decrementHours","incrementMinutes","decrementMinutes","incrementSeconds","decrementSeconds","togglePeriod","parseValueToState","formatDisplayTime","parts","m","s","stateToValue","hStr","mStr","sStr","raw","suffix","indexOf","sanitised","withColons","splits","hour","minute","second","num","renderChevronUp","points","renderChevronDown","clockIcon","cx","cy","xplorTooltipCss","XplorTooltip","tooltipStyle","arrowStyle","handleMouseEnter","hideTimeout","clearTimeout","showTooltip","handleMouseLeave","hideTooltip","requestAnimationFrame","updatePosition","setupHoverListeners","cleanupListeners","triggerEl","tooltipEl","triggerRect","tooltipRect","arrowSize","top","left","arrowTop","arrowLeft","arrowTransform","right","viewportPadding","innerWidth","transform","tooltip"],"sources":["src/components/xplor-alert-dialog/xplor-alert-dialog.scss?tag=xplor-alert-dialog&encapsulation=scoped","src/components/xplor-alert-dialog/xplor-alert-dialog.tsx","src/components/xplor-alert-message/xplor-alert-message.scss?tag=xplor-alert-message&encapsulation=scoped","src/components/xplor-alert-message/xplor-alert-message.tsx","src/components/xplor-assistant/utils/api.ts","src/components/xplor-assistant/utils/speech.ts","src/components/xplor-assistant/utils/icons.ts","src/components/xplor-assistant/internal/AssistantMessage.tsx","src/components/xplor-assistant/internal/AssistantInput.tsx","src/components/xplor-assistant/internal/QuickReplies.tsx","src/components/xplor-assistant/internal/TypingIndicator.tsx","src/components/xplor-assistant/xplor-assistant.scss?tag=xplor-assistant&encapsulation=scoped","src/components/xplor-assistant/xplor-assistant.tsx","src/components/xplor-autocomplete/xplor-autocomplete.scss?tag=xplor-autocomplete&encapsulation=scoped","src/components/xplor-autocomplete/xplor-autocomplete.tsx","src/components/xplor-avatar/xplor-avatar.scss?tag=xplor-avatar&encapsulation=shadow","src/components/xplor-avatar/xplor-avatar.tsx","src/components/xplor-avatar-and-name/xplor-avatar-and-name.scss?tag=xplor-avatar-and-name&encapsulation=scoped","src/components/xplor-avatar-and-name/xplor-avatar-and-name.tsx","src/components/xplor-badge/xplor-badge.scss?tag=xplor-badge&encapsulation=scoped","src/components/xplor-badge/xplor-badge.tsx","src/components/xplor-badge-active/xplor-badge-active.scss?tag=xplor-badge-active&encapsulation=scoped","src/components/xplor-badge-active/xplor-badge-active.tsx","src/components/xplor-badge-archived/xplor-badge-archived.scss?tag=xplor-badge-archived&encapsulation=scoped","src/components/xplor-badge-archived/xplor-badge-archived.tsx","src/components/xplor-badge-deleted/xplor-badge-deleted.scss?tag=xplor-badge-deleted&encapsulation=scoped","src/components/xplor-badge-deleted/xplor-badge-deleted.tsx","src/components/xplor-badge-expired/xplor-badge-expired.scss?tag=xplor-badge-expired&encapsulation=scoped","src/components/xplor-badge-expired/xplor-badge-expired.tsx","src/components/xplor-badge-inactive/xplor-badge-inactive.scss?tag=xplor-badge-inactive&encapsulation=scoped","src/components/xplor-badge-inactive/xplor-badge-inactive.tsx","src/components/xplor-badge-recalled/xplor-badge-recalled.scss?tag=xplor-badge-recalled&encapsulation=scoped","src/components/xplor-badge-recalled/xplor-badge-recalled.tsx","src/components/xplor-badge-session-booking/xplor-badge-session-booking.scss?tag=xplor-badge-session-booking&encapsulation=scoped","src/components/xplor-badge-session-booking/xplor-badge-session-booking.tsx","src/components/xplor-badge-upcoming/xplor-badge-upcoming.scss?tag=xplor-badge-upcoming&encapsulation=scoped","src/components/xplor-badge-upcoming/xplor-badge-upcoming.tsx","src/components/xplor-badge-waitlist/xplor-badge-waitlist.scss?tag=xplor-badge-waitlist&encapsulation=scoped","src/components/xplor-badge-waitlist/xplor-badge-waitlist.tsx","src/components/xplor-btn-back/xplor-btn-back.scss?tag=xplor-btn-back&encapsulation=scoped","src/components/xplor-btn-back/xplor-btn-back.tsx","src/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.scss?tag=xplor-btn-back-to-parent&encapsulation=scoped","src/components/xplor-btn-back-to-parent/xplor-btn-back-to-parent.tsx","src/components/xplor-btn-icon/xplor-btn-icon.scss?tag=xplor-btn-icon&encapsulation=scoped","src/components/xplor-btn-icon/xplor-btn-icon.tsx","src/components/xplor-btn-menu/xplor-btn-menu.scss?tag=xplor-btn-menu&encapsulation=scoped","src/components/xplor-btn-menu/xplor-btn-menu.tsx","src/components/xplor-btn-toggle/xplor-btn-toggle.scss?tag=xplor-btn-toggle&encapsulation=scoped","src/components/xplor-btn-toggle/xplor-btn-toggle.tsx","src/components/xplor-btn-toggle-group/xplor-btn-toggle-group.scss?tag=xplor-btn-toggle-group&encapsulation=scoped","src/components/xplor-btn-toggle-group/xplor-btn-toggle-group.tsx","src/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.scss?tag=xplor-btn-toggle-secondary&encapsulation=scoped","src/components/xplor-btn-toggle-secondary/xplor-btn-toggle-secondary.tsx","src/components/xplor-btn-tooltip/xplor-btn-tooltip.scss?tag=xplor-btn-tooltip&encapsulation=scoped","src/components/xplor-btn-tooltip/xplor-btn-tooltip.tsx","src/components/xplor-button/xplor-button.scss?tag=xplor-button&encapsulation=scoped","src/components/xplor-button/xplor-button.tsx","src/components/xplor-chat-widget/xplor-chat-widget.scss?tag=xplor-chat-widget&encapsulation=shadow","src/components/xplor-chat-widget/xplor-chat-widget.tsx","src/components/xplor-checkbox/xplor-checkbox.scss?tag=xplor-checkbox&encapsulation=shadow","src/components/xplor-checkbox/xplor-checkbox.tsx","src/components/xplor-combobox/xplor-combobox.scss?tag=xplor-combobox&encapsulation=scoped","src/components/xplor-combobox/xplor-combobox.tsx","src/components/xplor-datatable/xplor-datatable.scss?tag=xplor-datatable&encapsulation=shadow","src/components/xplor-datatable/xplor-datatable.tsx","src/components/xplor-date-picker/xplor-date-picker.scss?tag=xplor-date-picker&encapsulation=scoped","src/components/xplor-date-picker/xplor-date-picker.tsx","src/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.scss?tag=xplor-drag-and-drop-input&encapsulation=scoped","src/components/xplor-drag-and-drop-input/xplor-drag-and-drop-input.tsx","src/components/xplor-dropdown/xplor-dropdown.scss?tag=xplor-dropdown&encapsulation=shadow","src/components/xplor-dropdown/xplor-dropdown.tsx","src/components/xplor-expansion-panel/xplor-expansion-panel.scss?tag=xplor-expansion-panel&encapsulation=scoped","src/components/xplor-expansion-panel/xplor-expansion-panel.tsx","src/components/xplor-expansion-panels/xplor-expansion-panels.scss?tag=xplor-expansion-panels&encapsulation=scoped","src/components/xplor-expansion-panels/xplor-expansion-panels.tsx","src/components/xplor-file-upload/xplor-file-upload.scss?tag=xplor-file-upload&encapsulation=scoped","src/components/xplor-file-upload/xplor-file-upload.tsx","src/components/xplor-inline-checkbox/xplor-inline-checkbox.scss?tag=xplor-inline-checkbox&encapsulation=scoped","src/components/xplor-inline-checkbox/xplor-inline-checkbox.tsx","src/components/xplor-inline-date-picker/xplor-inline-date-picker.scss?tag=xplor-inline-date-picker&encapsulation=scoped","src/components/xplor-inline-date-picker/xplor-inline-date-picker.tsx","src/components/xplor-inline-switch/xplor-inline-switch.scss?tag=xplor-inline-switch&encapsulation=scoped","src/components/xplor-inline-switch/xplor-inline-switch.tsx","src/components/xplor-input-file/xplor-input-file.scss?tag=xplor-input-file&encapsulation=scoped","src/components/xplor-input-file/xplor-input-file.tsx","src/components/xplor-input-search/xplor-input-search.scss?tag=xplor-input-search&encapsulation=scoped","src/components/xplor-input-search/xplor-input-search.tsx","src/components/xplor-input-select/xplor-input-select.scss?tag=xplor-input-select&encapsulation=scoped","src/components/xplor-input-select/xplor-input-select.tsx","src/components/xplor-input-send/xplor-input-send.scss?tag=xplor-input-send&encapsulation=scoped","src/components/xplor-input-send/xplor-input-send.tsx","src/components/xplor-input-text/xplor-input-text.scss?tag=xplor-input-text&encapsulation=scoped","src/components/xplor-input-text/xplor-input-text.tsx","src/components/xplor-input-text-area/xplor-input-text-area.scss?tag=xplor-input-text-area&encapsulation=scoped","src/components/xplor-input-text-area/xplor-input-text-area.tsx","src/components/xplor-input-text-secondary/xplor-input-text-secondary.scss?tag=xplor-input-text-secondary&encapsulation=scoped","src/components/xplor-input-text-secondary/xplor-input-text-secondary.tsx","src/components/xplor-input-title/xplor-input-title.scss?tag=xplor-input-title&encapsulation=scoped","src/components/xplor-input-title/xplor-input-title.tsx","src/components/xplor-links/xplor-links.css?tag=xplor-links&encapsulation=shadow","src/components/xplor-links/xplor-links.tsx","src/components/xplor-modal/xplor-modal.scss?tag=xplor-modal&encapsulation=scoped","src/components/xplor-modal/xplor-modal.tsx","src/components/xplor-modal-persistent/xplor-modal-persistent.tsx","src/components/xplor-nav-tabs/xplor-nav-tabs.scss?tag=xplor-nav-tabs&encapsulation=scoped","src/components/xplor-nav-tabs/xplor-nav-tabs.tsx","src/components/xplor-section-card/xplor-section-card.scss?tag=xplor-section-card&encapsulation=scoped","src/components/xplor-section-card/xplor-section-card.tsx","src/components/xplor-section-heading/xplor-section-heading.scss?tag=xplor-section-heading&encapsulation=scoped","src/components/xplor-section-heading/xplor-section-heading.tsx","src/components/xplor-table/xplor-table.tsx","src/components/xplor-text-bubble/xplor-text-bubble.scss?tag=xplor-text-bubble&encapsulation=scoped","src/components/xplor-text-bubble/xplor-text-bubble.tsx","src/components/xplor-text-field/xplor-text-field.scss?tag=xplor-text-field&encapsulation=scoped","src/components/xplor-text-field/xplor-text-field.tsx","src/components/xplor-time-picker/xplor-time-picker.scss?tag=xplor-time-picker&encapsulation=scoped","src/components/xplor-time-picker/xplor-time-picker.tsx","src/components/xplor-tooltip/xplor-tooltip.scss?tag=xplor-tooltip&encapsulation=scoped","src/components/xplor-tooltip/xplor-tooltip.tsx"],"sourcesContent":[":host {\n display: contents;\n}\n\n.xplor-alert-dialog {\n &__backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2000;\n padding: 1rem;\n }\n\n &__card {\n position: relative;\n background-color: white;\n border-radius: 0.5rem;\n padding: 3.75rem 1.25rem;\n min-height: 320px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: auto;\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2),\n 0px 24px 38px 3px rgba(0, 0, 0, 0.14),\n 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n animation: xplor-dialog-fade-in 0.2s ease-out;\n }\n\n &__close-btn {\n position: absolute;\n top: 1rem;\n right: 1rem;\n width: 2rem;\n height: 2rem;\n border: none;\n background: transparent;\n color: rgba(0, 0, 0, 0.54);\n font-size: 1.5rem;\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 z-index: 1;\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 &__title {\n padding-top: 0;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &__text {\n margin-bottom: 1.5rem;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &__actions {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n }\n}\n\n@keyframes xplor-dialog-fade-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, Watch } from '@stencil/core';\n\n@Component({\n tag: 'xplor-alert-dialog',\n styleUrl: 'xplor-alert-dialog.scss',\n scoped: true,\n})\nexport class XplorAlertDialog {\n /**\n * Whether the dialog is open\n */\n @Prop({ mutable: true }) open: boolean = false;\n\n /**\n * Dialog width (can be pixel value or percentage)\n */\n @Prop() width: string = '408px';\n\n /**\n * Persistent mode - prevents closing on backdrop click\n */\n @Prop() persistent: boolean = true;\n\n /**\n * Close event\n */\n @Event() xplorClose: EventEmitter<void>;\n\n /**\n * Dialog state change event\n */\n @Event() xplorDialogChange: EventEmitter<boolean>;\n\n @Watch('open')\n handleOpenChange(newValue: boolean) {\n if (newValue) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n }\n\n disconnectedCallback() {\n document.body.style.overflow = '';\n }\n\n private handleBackdropClick = () => {\n if (!this.persistent) {\n this.closeDialog();\n }\n };\n\n private handleCardClick = (event: Event) => {\n event.stopPropagation();\n };\n\n private closeDialog = () => {\n this.open = false;\n this.xplorClose.emit();\n this.xplorDialogChange.emit(false);\n };\n\n render() {\n if (!this.open) {\n return null;\n }\n\n return (\n <Host>\n <div class=\"xplor-alert-dialog__backdrop\" onClick={this.handleBackdropClick}>\n <div\n class=\"xplor-alert-dialog__card\"\n style={{ width: this.width }}\n onClick={this.handleCardClick}\n >\n <button\n type=\"button\"\n class=\"xplor-alert-dialog__close-btn\"\n onClick={this.closeDialog}\n aria-label=\"Close dialog\"\n >\n ✕\n </button>\n\n <div class=\"xplor-alert-dialog__title\">\n <slot name=\"title\" />\n </div>\n\n <div class=\"xplor-alert-dialog__text\">\n <slot name=\"text\" />\n </div>\n\n <div class=\"xplor-alert-dialog__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.alert-message {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n border-radius: 4px;\n border-left: 4px solid;\n gap: 1rem;\n\n &--info {\n background-color: #ede7f6;\n border-left-color: #673ab7;\n color: #4a148c;\n }\n\n &--warning {\n background-color: #fff3e0;\n border-left-color: #ff9800;\n color: #e65100;\n }\n\n &--success {\n background-color: #e8f5e9;\n border-left-color: #4caf50;\n color: #1b5e20;\n }\n\n &--error {\n background-color: #ffebee;\n border-left-color: #f44336;\n color: #b71c1c;\n }\n}\n\n.alert-message__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.alert-message__title {\n font-weight: 600;\n font-size: 1rem;\n line-height: 1.5;\n}\n\n.alert-message__body {\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.alert-message__actions {\n margin-top: 0.5rem;\n\n &:empty {\n display: none;\n }\n}\n\n.alert-message__dismiss {\n background: none;\n border: none;\n font-size: 1.5rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: currentColor;\n opacity: 0.7;\n transition: opacity 0.2s;\n flex-shrink: 0;\n\n &:hover {\n opacity: 1;\n }\n\n &:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n border-radius: 2px;\n }\n}","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-alert-message',\n styleUrl: 'xplor-alert-message.scss',\n scoped: true,\n})\nexport class XplorAlertMessage {\n @Prop() type: 'info' | 'warning' | 'success' | 'error' = 'info';\n @Prop() alertTitle: string;\n @Prop() dismissible: boolean = false;\n\n @Event() xplorDismiss: EventEmitter<void>;\n\n private handleDismiss = () => {\n this.xplorDismiss.emit();\n };\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'alert-message': true,\n [`alert-message--${this.type}`]: true,\n }}\n role=\"alert\"\n >\n <div class=\"alert-message__content\">\n {this.alertTitle && (\n <div class=\"alert-message__title\">\n <slot name=\"title\">{this.alertTitle}</slot>\n </div>\n )}\n <div class=\"alert-message__body\">\n <slot />\n </div>\n <div class=\"alert-message__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n {this.dismissible && (\n <button\n class=\"alert-message__dismiss\"\n onClick={this.handleDismiss}\n aria-label=\"Dismiss alert\"\n type=\"button\"\n >\n ×\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n","/**\n * API integration utilities for the xplor-assistant component\n */\n\nimport { AssistantAPIRequest, AssistantAPIResponse } from '../internal/types';\n\n/**\n * Generates a unique session ID\n * Format: session_${timestamp}_${random}\n */\nexport function generateSessionId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `session_${timestamp}_${random}`;\n}\n\n/**\n * Formats the current date as YYYY-MM-DD\n */\nexport function getCurrentDate(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Formats the current time as HH:MM:SS\n */\nexport function getCurrentTime(): string {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Sends a message to the assistant API\n *\n * @param endpoint - The API endpoint URL\n * @param message - The user's message\n * @param sessionId - The current session ID\n * @param userId - The user's ID\n * @param userEmail - The user's email\n * @param userName - The user's name\n * @returns Promise with the API response\n * @throws Error if the API call fails\n */\nexport async function sendMessageToAPI(\n endpoint: string,\n message: string,\n sessionId: string,\n userId: string,\n userEmail: string,\n userName: string\n): Promise<AssistantAPIResponse> {\n if (!endpoint) {\n throw new Error('API endpoint is required');\n }\n\n if (!message || !message.trim()) {\n throw new Error('Message cannot be empty');\n }\n\n const payload: AssistantAPIRequest = {\n message: message.trim(),\n sessionId,\n userId,\n userEmail,\n userName,\n currentDate: getCurrentDate(),\n currentTime: getCurrentTime(),\n };\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`API error: ${response.status} - ${errorText}`);\n }\n\n const data: AssistantAPIResponse = await response.json();\n\n // Validate response structure\n if (!data.message || !data.sessionId) {\n throw new Error('Invalid API response: missing required fields');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw with more context if it's a fetch error\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n throw new Error('Network error: Unable to reach the API. Please check your connection.');\n }\n throw error;\n }\n throw new Error('Unknown error occurred while calling the API');\n }\n}\n\n/**\n * Creates an AbortController for cancelling requests\n * Useful for cleanup when component unmounts\n */\nexport function createRequestController(): AbortController {\n return new AbortController();\n}\n\n/**\n * Sends a message to the API with abort support\n *\n * @param endpoint - The API endpoint URL\n * @param message - The user's message\n * @param sessionId - The current session ID\n * @param userId - The user's ID\n * @param userEmail - The user's email\n * @param userName - The user's name\n * @param signal - AbortSignal for cancelling the request\n * @returns Promise with the API response\n */\nexport async function sendMessageWithAbort(\n endpoint: string,\n message: string,\n sessionId: string,\n userId: string,\n userEmail: string,\n userName: string,\n signal?: AbortSignal\n): Promise<AssistantAPIResponse> {\n const payload: AssistantAPIRequest = {\n message: message.trim(),\n sessionId,\n userId,\n userEmail,\n userName,\n currentDate: getCurrentDate(),\n currentTime: getCurrentTime(),\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`API error: ${response.status} - ${errorText}`);\n }\n\n const data: AssistantAPIResponse = await response.json();\n\n if (!data.message || !data.sessionId) {\n throw new Error('Invalid API response: missing required fields');\n }\n\n return data;\n}\n","/**\n * Web Speech API helpers for the xplor-assistant component\n * Handles both Speech Recognition (voice input) and Speech Synthesis (text-to-speech)\n */\n\nimport { BrowserCapabilities } from '../internal/types';\n\n/**\n * Detects browser capabilities for speech features\n */\nexport function detectBrowserCapabilities(): BrowserCapabilities {\n if (typeof window === 'undefined') {\n return {\n voiceInput: false,\n textToSpeech: false,\n };\n }\n\n const hasVoiceInput =\n 'SpeechRecognition' in window ||\n 'webkitSpeechRecognition' in window;\n\n const hasTTS = 'speechSynthesis' in window;\n\n return {\n voiceInput: hasVoiceInput,\n textToSpeech: hasTTS,\n };\n}\n\n/**\n * Speech Recognition Manager\n * Handles voice-to-text functionality\n */\nexport class SpeechRecognitionManager {\n private recognition: any = null;\n private onResultCallback: ((transcript: string) => void) | null = null;\n private onErrorCallback: ((error: string) => void) | null = null;\n private onStartCallback: (() => void) | null = null;\n private onEndCallback: (() => void) | null = null;\n\n constructor() {\n if (typeof window === 'undefined') return;\n\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = false;\n this.recognition.interimResults = false;\n this.recognition.lang = 'en-US';\n this.recognition.maxAlternatives = 1;\n\n this.recognition.onstart = () => {\n if (this.onStartCallback) {\n this.onStartCallback();\n }\n };\n\n this.recognition.onresult = (event: any) => {\n const transcript = event.results[0][0].transcript;\n if (this.onResultCallback) {\n this.onResultCallback(transcript);\n }\n };\n\n this.recognition.onerror = (event: any) => {\n const errorMessage = this.getErrorMessage(event.error);\n if (this.onErrorCallback) {\n this.onErrorCallback(errorMessage);\n }\n };\n\n this.recognition.onend = () => {\n if (this.onEndCallback) {\n this.onEndCallback();\n }\n };\n }\n }\n\n /**\n * Converts speech recognition error codes to user-friendly messages\n */\n private getErrorMessage(error: string): string {\n switch (error) {\n case 'no-speech':\n return 'No speech detected. Please try again.';\n case 'audio-capture':\n return 'No microphone found. Please ensure a microphone is connected.';\n case 'not-allowed':\n return 'Microphone permission denied. Please allow microphone access.';\n case 'network':\n return 'Network error. Please check your connection.';\n default:\n return `Speech recognition error: ${error}`;\n }\n }\n\n /**\n * Starts listening for voice input\n */\n start(): void {\n if (!this.recognition) {\n console.error('Speech recognition not supported');\n return;\n }\n\n try {\n this.recognition.start();\n } catch (error) {\n console.error('Failed to start speech recognition:', error);\n if (this.onErrorCallback) {\n this.onErrorCallback('Failed to start voice recognition');\n }\n }\n }\n\n /**\n * Stops listening for voice input\n */\n stop(): void {\n if (this.recognition) {\n this.recognition.stop();\n }\n }\n\n /**\n * Sets the callback for when a result is received\n */\n onResult(callback: (transcript: string) => void): void {\n this.onResultCallback = callback;\n }\n\n /**\n * Sets the callback for when an error occurs\n */\n onError(callback: (error: string) => void): void {\n this.onErrorCallback = callback;\n }\n\n /**\n * Sets the callback for when recognition starts\n */\n onStart(callback: () => void): void {\n this.onStartCallback = callback;\n }\n\n /**\n * Sets the callback for when recognition ends\n */\n onEnd(callback: () => void): void {\n this.onEndCallback = callback;\n }\n\n /**\n * Checks if speech recognition is available\n */\n isAvailable(): boolean {\n return this.recognition !== null;\n }\n}\n\n/**\n * Speech Synthesis Manager\n * Handles text-to-speech functionality\n */\nexport class SpeechSynthesisManager {\n private currentUtterance: SpeechSynthesisUtterance | null = null;\n private onStartCallback: (() => void) | null = null;\n private onEndCallback: (() => void) | null = null;\n\n /**\n * Speaks the given text\n */\n speak(text: string): void {\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) {\n console.error('Speech synthesis not supported');\n return;\n }\n\n // Stop any ongoing speech first\n this.stop();\n\n this.currentUtterance = new SpeechSynthesisUtterance(text);\n this.currentUtterance.lang = 'en-US';\n this.currentUtterance.rate = 1.0;\n this.currentUtterance.pitch = 1.0;\n this.currentUtterance.volume = 1.0;\n\n this.currentUtterance.onstart = () => {\n if (this.onStartCallback) {\n this.onStartCallback();\n }\n };\n\n this.currentUtterance.onend = () => {\n if (this.onEndCallback) {\n this.onEndCallback();\n }\n this.currentUtterance = null;\n };\n\n this.currentUtterance.onerror = (event) => {\n console.error('Speech synthesis error:', event);\n if (this.onEndCallback) {\n this.onEndCallback();\n }\n this.currentUtterance = null;\n };\n\n window.speechSynthesis.speak(this.currentUtterance);\n }\n\n /**\n * Stops any ongoing speech\n */\n stop(): void {\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n if (window.speechSynthesis.speaking) {\n window.speechSynthesis.cancel();\n if (this.onEndCallback) {\n this.onEndCallback();\n }\n }\n this.currentUtterance = null;\n }\n\n /**\n * Checks if currently speaking\n */\n isSpeaking(): boolean {\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return false;\n }\n return window.speechSynthesis.speaking;\n }\n\n /**\n * Sets the callback for when speech starts\n */\n onStart(callback: () => void): void {\n this.onStartCallback = callback;\n }\n\n /**\n * Sets the callback for when speech ends\n */\n onEnd(callback: () => void): void {\n this.onEndCallback = callback;\n }\n\n /**\n * Checks if speech synthesis is available\n */\n isAvailable(): boolean {\n return typeof window !== 'undefined' && 'speechSynthesis' in window;\n }\n}\n","/**\n * SVG icon definitions for the xplor-assistant component\n * Following the pattern used in xplor-button component\n */\n\n/**\n * Microphone icon for voice input button\n */\nexport const microphoneIcon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path>\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line>\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line>\n</svg>\n`;\n\n/**\n * Send arrow icon for send message button\n */\nexport const sendIcon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n</svg>\n`;\n\n/**\n * Speaker icon for text-to-speech button\n */\nexport const speakerIcon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon>\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\"></path>\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"></path>\n</svg>\n`;\n\n/**\n * Stop square icon for stopping speech\n */\nexport const stopIcon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"></rect>\n</svg>\n`;\n\n/**\n * Muted speaker icon for when TTS is disabled\n */\nexport const speakerMutedIcon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon>\n <line x1=\"23\" y1=\"9\" x2=\"17\" y2=\"15\"></line>\n <line x1=\"17\" y1=\"9\" x2=\"23\" y2=\"15\"></line>\n</svg>\n`;\n","/**\n * AssistantMessage - Internal component\n * Renders a single message bubble with optional text-to-speech functionality\n */\n\nimport { h } from '@stencil/core';\nimport { AssistantMessageProps } from './types';\nimport { speakerIcon, stopIcon } from '../utils/icons';\n\nexport const AssistantMessage = (props: AssistantMessageProps) => {\n const { message, enableTextToSpeech, isSpeaking, onSpeak, onStopSpeaking } = props;\n\n const messageClasses = {\n 'xplor-assistant__message': true,\n 'xplor-assistant__message--user': message.role === 'user',\n 'xplor-assistant__message--assistant': message.role === 'assistant',\n };\n\n const handleSpeakClick = () => {\n if (isSpeaking) {\n onStopSpeaking?.();\n } else {\n onSpeak?.(message.content);\n }\n };\n\n const formatTime = (timestamp: Date) => {\n const hours = timestamp.getHours();\n const minutes = timestamp.getMinutes();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes < 10 ? `0${minutes}` : minutes;\n return `${displayHours}:${displayMinutes} ${ampm}`;\n };\n\n return (\n <div class={messageClasses}>\n <div class=\"xplor-assistant__message-content\">\n {message.content}\n </div>\n <div class=\"xplor-assistant__message-footer\">\n <span class=\"xplor-assistant__message-timestamp\">\n {formatTime(message.timestamp)}\n </span>\n {message.role === 'assistant' && enableTextToSpeech && (\n <button\n class={{\n 'xplor-assistant__speak-button': true,\n 'xplor-assistant__speak-button--active': isSpeaking,\n }}\n onClick={handleSpeakClick}\n title={isSpeaking ? 'Stop speaking' : 'Listen to message'}\n type=\"button\"\n >\n <span\n class=\"xplor-assistant__speak-icon\"\n innerHTML={isSpeaking ? stopIcon : speakerIcon}\n ></span>\n </button>\n )}\n </div>\n </div>\n );\n};\n","/**\n * AssistantInput - Internal component\n * Renders the input field with voice and send buttons\n */\n\nimport { h } from '@stencil/core';\nimport { microphoneIcon, sendIcon } from '../utils/icons';\n\nexport interface AssistantInputInternalProps {\n placeholder: string;\n disabled: boolean;\n isLoading: boolean;\n enableVoiceInput: boolean;\n isListening: boolean;\n inputValue: string;\n onSendMessage: (message: string) => void;\n onStartListening: () => void;\n onStopListening: () => void;\n setInputValue: (value: string) => void;\n}\n\nexport const AssistantInput = (props: AssistantInputInternalProps) => {\n const {\n placeholder,\n disabled,\n isLoading,\n enableVoiceInput,\n isListening,\n inputValue,\n onSendMessage,\n onStartListening,\n onStopListening,\n setInputValue,\n } = props;\n\n const handleSubmit = (e: Event) => {\n e.preventDefault();\n console.log('[AssistantInput] Submit triggered, inputValue:', inputValue);\n if (inputValue.trim() && !disabled && !isLoading) {\n console.log('[AssistantInput] Calling onSendMessage with:', inputValue);\n onSendMessage(inputValue);\n setInputValue('');\n } else {\n console.log('[AssistantInput] Submit blocked - disabled:', disabled, 'isLoading:', isLoading, 'hasValue:', !!inputValue.trim());\n }\n };\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement;\n setInputValue(target.value);\n };\n\n const handleVoiceClick = () => {\n if (isListening) {\n onStopListening();\n } else {\n onStartListening();\n }\n };\n\n const isSendDisabled = !inputValue.trim() || disabled || isLoading;\n\n return (\n <div class=\"xplor-assistant__input-container\">\n <form onSubmit={handleSubmit} class=\"xplor-assistant__input-form\">\n {enableVoiceInput && (\n <button\n type=\"button\"\n class={{\n 'xplor-assistant__voice-button': true,\n 'xplor-assistant__voice-button--listening': isListening,\n }}\n onClick={handleVoiceClick}\n disabled={disabled || isLoading}\n title={isListening ? 'Stop listening' : 'Start voice input'}\n >\n <span class=\"xplor-assistant__voice-icon\" innerHTML={microphoneIcon}></span>\n </button>\n )}\n\n <input\n type=\"text\"\n class=\"xplor-assistant__input\"\n placeholder={placeholder}\n value={inputValue}\n onInput={handleInputChange}\n disabled={disabled || isLoading}\n />\n\n <button\n type=\"submit\"\n class=\"xplor-assistant__send-button\"\n disabled={isSendDisabled}\n title=\"Send message\"\n >\n <span class=\"xplor-assistant__send-icon\" innerHTML={sendIcon}></span>\n </button>\n </form>\n </div>\n );\n};\n","/**\n * QuickReplies - Internal component\n * Renders quick reply suggestion buttons\n */\n\nimport { h } from '@stencil/core';\nimport { QuickRepliesProps } from './types';\n\nexport const QuickReplies = (props: QuickRepliesProps) => {\n const { replies, disabled, onReplyClick } = props;\n\n if (!replies || replies.length === 0) {\n return null;\n }\n\n return (\n <div class=\"xplor-assistant__quick-replies\">\n {replies.map((reply) => (\n <button\n class=\"xplor-assistant__quick-reply\"\n onClick={() => onReplyClick(reply)}\n disabled={disabled}\n type=\"button\"\n >\n {reply}\n </button>\n ))}\n </div>\n );\n};\n","/**\n * TypingIndicator - Internal component\n * Displays animated dots to indicate the assistant is processing/typing\n */\n\nimport { h } from '@stencil/core';\n\nexport const TypingIndicator = () => {\n return (\n <div class=\"xplor-assistant__typing-indicator\">\n <span class=\"xplor-assistant__typing-dot\"></span>\n <span class=\"xplor-assistant__typing-dot\"></span>\n <span class=\"xplor-assistant__typing-dot\"></span>\n </div>\n );\n};\n","@use '../../styles/colours.scss' as colours;\n@use '../../styles/spacing.scss' as spacing;\n@use '../../styles/mixins.scss' as mixins;\n\n:host {\n display: block;\n\n // CSS custom properties for theming\n --assistant-bot-bg: #{colours.$secondary}; // Purple for bot messages\n --assistant-user-bg: #{colours.$gray-200}; // Light gray for user messages\n --assistant-accent: #{colours.$warning}; // Orange accents\n --assistant-border: #{colours.$gray-300};\n --assistant-text: #{colours.$gray-900};\n --assistant-text-light: #{colours.$gray-600};\n}\n\n.xplor-assistant {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background-color: colours.$white;\n border-radius: 0.75rem;\n border: 1px solid var(--assistant-border);\n overflow: hidden;\n\n &--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n &--error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: spacing.$spacing-24;\n }\n}\n\n// Messages Area\n.xplor-assistant__messages {\n flex: 1;\n overflow-y: auto;\n padding: spacing.$spacing-16;\n display: flex;\n flex-direction: column;\n gap: spacing.$spacing-12;\n scroll-behavior: smooth;\n\n // Scrollbar styling\n &::-webkit-scrollbar {\n width: 6px;\n }\n\n &::-webkit-scrollbar-track {\n background: colours.$gray-100;\n border-radius: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: colours.$gray-400;\n border-radius: 3px;\n\n &:hover {\n background: colours.$gray-500;\n }\n }\n}\n\n// Individual Message\n.xplor-assistant__message {\n display: flex;\n flex-direction: column;\n max-width: 80%;\n animation: slideIn 0.3s ease-out;\n\n &--bot {\n align-self: flex-start;\n\n .xplor-assistant__message-content {\n background-color: var(--assistant-bot-bg);\n color: colours.$white;\n border-radius: 1rem 1rem 1rem 0.25rem;\n }\n }\n\n &--user {\n align-self: flex-end;\n\n .xplor-assistant__message-content {\n background-color: var(--assistant-user-bg);\n color: var(--assistant-text);\n border-radius: 1rem 1rem 0.25rem 1rem;\n }\n }\n}\n\n.xplor-assistant__message-content {\n padding: spacing.$spacing-12 spacing.$spacing-16;\n font-size: 0.9375rem;\n line-height: 1.5;\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n.xplor-assistant__message-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: spacing.$spacing-4;\n padding: 0 spacing.$spacing-8;\n}\n\n.xplor-assistant__message-timestamp {\n font-size: 0.75rem;\n color: var(--assistant-text-light);\n}\n\n.xplor-assistant__speak-button {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: spacing.$spacing-4;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: colours.$gray-200;\n }\n\n &--active {\n background-color: colours.$gray-300;\n }\n}\n\n.xplor-assistant__speak-icon {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n width: 16px;\n height: 16px;\n stroke: var(--assistant-text-light);\n }\n}\n\n// Typing Indicator\n.xplor-assistant__typing-indicator {\n display: flex;\n gap: spacing.$spacing-4;\n padding: spacing.$spacing-12 spacing.$spacing-16;\n}\n\n.xplor-assistant__typing-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: colours.$gray-400;\n animation: typingBounce 1.4s infinite ease-in-out;\n\n &:nth-child(1) {\n animation-delay: 0s;\n }\n\n &:nth-child(2) {\n animation-delay: 0.2s;\n }\n\n &:nth-child(3) {\n animation-delay: 0.4s;\n }\n}\n\n// Error Banner\n.xplor-assistant__error-banner {\n background-color: colours.$error-50;\n color: colours.$error-700;\n padding: spacing.$spacing-12 spacing.$spacing-16;\n border-radius: 0.5rem;\n font-size: 0.875rem;\n margin: spacing.$spacing-8 0;\n}\n\n.xplor-assistant__error-message {\n color: colours.$error-700;\n font-size: 0.9375rem;\n text-align: center;\n}\n\n// Quick Replies\n.xplor-assistant__quick-replies {\n display: flex;\n flex-wrap: wrap;\n gap: spacing.$spacing-8;\n padding: spacing.$spacing-12 spacing.$spacing-16;\n border-top: 1px solid var(--assistant-border);\n background-color: colours.$gray-50;\n}\n\n.xplor-assistant__quick-reply {\n padding: spacing.$spacing-8 spacing.$spacing-16;\n background-color: colours.$white;\n border: 2px solid var(--assistant-accent);\n color: var(--assistant-accent);\n border-radius: 1rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n\n &:hover:not(:disabled) {\n background-color: var(--assistant-accent);\n color: colours.$white;\n transform: translateY(-1px);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n// Input Container\n.xplor-assistant__input-container {\n border-top: 1px solid var(--assistant-border);\n padding: spacing.$spacing-12;\n background-color: colours.$white;\n}\n\n.xplor-assistant__input-form {\n display: flex;\n gap: spacing.$spacing-8;\n align-items: center;\n}\n\n.xplor-assistant__input {\n flex: 1;\n padding: spacing.$spacing-12 spacing.$spacing-16;\n border: 1px solid var(--assistant-border);\n border-radius: 1.5rem;\n font-size: 0.9375rem;\n outline: none;\n transition: border-color 0.2s;\n\n &:focus {\n border-color: var(--assistant-bot-bg);\n }\n\n &:disabled {\n background-color: colours.$gray-100;\n cursor: not-allowed;\n }\n\n &::placeholder {\n color: colours.$gray-500;\n }\n}\n\n.xplor-assistant__voice-button {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: none;\n background-color: colours.$gray-200;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: colours.$gray-300;\n transform: scale(1.05);\n }\n\n &--listening {\n background-color: colours.$error;\n animation: pulse 1.5s ease-in-out infinite;\n\n .xplor-assistant__voice-icon svg {\n stroke: colours.$white;\n }\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.xplor-assistant__voice-icon {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n width: 20px;\n height: 20px;\n stroke: var(--assistant-text);\n }\n}\n\n.xplor-assistant__send-button {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: none;\n background-color: var(--assistant-bot-bg);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: colours.$secondary-700;\n transform: scale(1.05);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.xplor-assistant__send-icon {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n width: 20px;\n height: 20px;\n stroke: colours.$white;\n }\n}\n\n// Animations\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes typingBounce {\n 0%, 60%, 100% {\n transform: translateY(0);\n }\n 30% {\n transform: translateY(-8px);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.05);\n opacity: 0.9;\n }\n}\n","import { Component, Host, h, Prop, State, Event, EventEmitter, Method, Element, Watch } from '@stencil/core';\nimport {\n AssistantMessage as MessageType,\n AssistantMessageSentEvent,\n AssistantMessageReceivedEvent,\n AssistantErrorEvent,\n AssistantSessionEvent,\n} from './internal/types';\nimport { sendMessageToAPI, generateSessionId } from './utils/api';\nimport { SpeechRecognitionManager, SpeechSynthesisManager, detectBrowserCapabilities } from './utils/speech';\nimport { AssistantMessage } from './internal/AssistantMessage';\nimport { AssistantInput } from './internal/AssistantInput';\nimport { QuickReplies } from './internal/QuickReplies';\nimport { TypingIndicator } from './internal/TypingIndicator';\n\n@Component({\n tag: 'xplor-assistant',\n styleUrl: 'xplor-assistant.scss',\n scoped: true,\n})\nexport class XplorAssistant {\n @Element() el: HTMLElement;\n\n // Required Props\n @Prop() apiEndpoint!: string;\n @Prop() userId!: string;\n @Prop() userEmail!: string;\n @Prop() userName!: string;\n\n // Optional Props\n @Prop() sessionId?: string;\n @Prop() quickReplies?: string[];\n @Prop() placeholder: string = 'Type your message...';\n @Prop() enableVoiceInput: boolean = true;\n @Prop() enableTextToSpeech: boolean = true;\n @Prop() autoSpeak: boolean = false;\n @Prop() maxHeight: string = '600px';\n @Prop() disabled: boolean = false;\n\n // State\n @State() messages: MessageType[] = [];\n @State() internalSessionId: string = '';\n @State() isLoading: boolean = false;\n @State() isListening: boolean = false;\n @State() isSpeaking: boolean = false;\n @State() error: string = '';\n @State() inputValue: string = '';\n @State() hasVoiceSupport: boolean = false;\n @State() hasTTSSupport: boolean = false;\n\n // Events\n @Event() assistantMessageSent: EventEmitter<AssistantMessageSentEvent>;\n @Event() assistantMessageReceived: EventEmitter<AssistantMessageReceivedEvent>;\n @Event() assistantError: EventEmitter<AssistantErrorEvent>;\n @Event() assistantSessionCreated: EventEmitter<AssistantSessionEvent>;\n\n // Private members\n private speechRecognition: SpeechRecognitionManager;\n private speechSynthesis: SpeechSynthesisManager;\n private messagesContainerRef: HTMLDivElement;\n\n componentWillLoad() {\n // Validate required props\n if (!this.apiEndpoint) {\n console.error('xplor-assistant: apiEndpoint prop is required');\n this.error = 'Configuration error: API endpoint not provided';\n return;\n }\n\n if (!this.userId || !this.userEmail || !this.userName) {\n console.error('xplor-assistant: userId, userEmail, and userName props are required');\n this.error = 'Configuration error: User information not provided';\n return;\n }\n\n // Initialize session\n if (this.sessionId) {\n this.internalSessionId = this.sessionId;\n } else {\n this.internalSessionId = generateSessionId();\n this.assistantSessionCreated.emit({\n sessionId: this.internalSessionId,\n timestamp: new Date(),\n });\n }\n\n // Detect browser capabilities\n const capabilities = detectBrowserCapabilities();\n this.hasVoiceSupport = capabilities.voiceInput;\n this.hasTTSSupport = capabilities.textToSpeech;\n\n // Disable features if not supported\n if (!this.hasVoiceSupport) {\n this.enableVoiceInput = false;\n }\n if (!this.hasTTSSupport) {\n this.enableTextToSpeech = false;\n }\n\n // Initialize speech managers\n this.speechRecognition = new SpeechRecognitionManager();\n this.speechSynthesis = new SpeechSynthesisManager();\n\n // Setup speech recognition callbacks\n this.speechRecognition.onStart(() => {\n this.isListening = true;\n });\n\n this.speechRecognition.onEnd(() => {\n this.isListening = false;\n });\n\n this.speechRecognition.onResult((transcript) => {\n this.handleVoiceInput(transcript);\n });\n\n this.speechRecognition.onError((error) => {\n this.isListening = false;\n this.handleError(error, 'voice');\n });\n\n // Setup speech synthesis callbacks\n this.speechSynthesis.onStart(() => {\n this.isSpeaking = true;\n });\n\n this.speechSynthesis.onEnd(() => {\n this.isSpeaking = false;\n });\n }\n\n @Watch('sessionId')\n handleSessionIdChange(newSessionId: string) {\n if (newSessionId && newSessionId !== this.internalSessionId) {\n this.internalSessionId = newSessionId;\n }\n }\n\n componentDidUpdate() {\n // Auto-scroll to bottom when new messages arrive\n this.scrollToBottom();\n }\n\n disconnectedCallback() {\n // Cleanup speech synthesis\n if (this.speechSynthesis) {\n this.speechSynthesis.stop();\n }\n }\n\n // Public Methods\n\n @Method()\n async sendMessage(message: string): Promise<void> {\n if (!message || !message.trim()) {\n return;\n }\n await this.handleSendMessage(message);\n }\n\n @Method()\n async clearHistory(): Promise<void> {\n this.messages = [];\n this.error = '';\n }\n\n @Method()\n async speak(text: string): Promise<void> {\n if (this.enableTextToSpeech && this.speechSynthesis) {\n this.speechSynthesis.speak(text);\n }\n }\n\n @Method()\n async stopSpeaking(): Promise<void> {\n if (this.speechSynthesis) {\n this.speechSynthesis.stop();\n }\n }\n\n // Private Methods\n\n private scrollToBottom() {\n if (this.messagesContainerRef) {\n setTimeout(() => {\n this.messagesContainerRef.scrollTop = this.messagesContainerRef.scrollHeight;\n }, 100);\n }\n }\n\n private handleSendMessage = async (messageText: string) => {\n console.log('[XplorAssistant] handleSendMessage called with:', messageText);\n\n if (this.disabled || this.isLoading || !messageText.trim()) {\n console.log('[XplorAssistant] Message blocked - disabled:', this.disabled, 'isLoading:', this.isLoading, 'hasValue:', !!messageText.trim());\n return;\n }\n\n // Clear the input immediately\n this.inputValue = '';\n console.log('[XplorAssistant] Input cleared, proceeding with message');\n\n const userMessage: MessageType = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: messageText.trim(),\n timestamp: new Date(),\n };\n\n // Add user message to the conversation\n this.messages = [...this.messages, userMessage];\n this.error = '';\n this.isLoading = true;\n\n // Emit message sent event\n this.assistantMessageSent.emit({\n message: userMessage.content,\n sessionId: this.internalSessionId,\n timestamp: userMessage.timestamp,\n });\n\n try {\n // Call the API\n const response = await sendMessageToAPI(\n this.apiEndpoint,\n userMessage.content,\n this.internalSessionId,\n this.userId,\n this.userEmail,\n this.userName\n );\n\n // Update session ID if changed\n if (response.sessionId && response.sessionId !== this.internalSessionId) {\n this.internalSessionId = response.sessionId;\n }\n\n // Add assistant response to conversation\n const assistantMessage: MessageType = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response.message,\n timestamp: new Date(),\n };\n\n this.messages = [...this.messages, assistantMessage];\n\n // Emit message received event\n this.assistantMessageReceived.emit({\n message: assistantMessage.content,\n sessionId: this.internalSessionId,\n timestamp: assistantMessage.timestamp,\n });\n\n // Auto-speak if enabled\n if (this.autoSpeak && this.enableTextToSpeech) {\n this.speechSynthesis.speak(assistantMessage.content);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to send message';\n this.handleError(errorMessage, 'api');\n } finally {\n this.isLoading = false;\n }\n };\n\n private handleVoiceInput = (transcript: string) => {\n if (transcript && transcript.trim()) {\n this.handleSendMessage(transcript);\n }\n };\n\n private handleError = (error: string, type: 'api' | 'voice' | 'tts' | 'network' | 'validation') => {\n this.error = error;\n this.assistantError.emit({\n error,\n type,\n timestamp: new Date(),\n });\n };\n\n private handleStartListening = () => {\n if (this.speechRecognition && this.enableVoiceInput && !this.disabled && !this.isLoading) {\n this.speechRecognition.start();\n }\n };\n\n private handleStopListening = () => {\n if (this.speechRecognition) {\n this.speechRecognition.stop();\n }\n };\n\n private handleSpeak = (text: string) => {\n if (this.speechSynthesis && this.enableTextToSpeech) {\n this.speechSynthesis.speak(text);\n }\n };\n\n private handleStopSpeaking = () => {\n if (this.speechSynthesis) {\n this.speechSynthesis.stop();\n }\n };\n\n private handleQuickReply = (reply: string) => {\n this.handleSendMessage(reply);\n };\n\n private setInputValue = (value: string) => {\n this.inputValue = value;\n };\n\n render() {\n // Show error state if critical error\n if (this.error && !this.apiEndpoint) {\n return (\n <Host>\n <div class=\"xplor-assistant xplor-assistant--error\">\n <div class=\"xplor-assistant__error-message\">\n {this.error}\n </div>\n </div>\n </Host>\n );\n }\n\n return (\n <Host>\n <div\n class={{\n 'xplor-assistant': true,\n 'xplor-assistant--disabled': this.disabled,\n }}\n style={{ maxHeight: this.maxHeight }}\n >\n {/* Messages Area */}\n <div\n class=\"xplor-assistant__messages\"\n ref={(el) => (this.messagesContainerRef = el)}\n >\n {this.messages.map((message) => (\n <AssistantMessage\n message={message}\n enableTextToSpeech={this.enableTextToSpeech}\n autoSpeak={false}\n isSpeaking={this.isSpeaking}\n onSpeak={this.handleSpeak}\n onStopSpeaking={this.handleStopSpeaking}\n />\n ))}\n\n {/* Loading Indicator */}\n {this.isLoading && (\n <div class=\"xplor-assistant__message xplor-assistant__message--assistant\">\n <TypingIndicator />\n </div>\n )}\n\n {/* Error Message */}\n {this.error && this.apiEndpoint && (\n <div class=\"xplor-assistant__error-banner\">\n {this.error}\n </div>\n )}\n </div>\n\n {/* Quick Replies */}\n {this.quickReplies && this.quickReplies.length > 0 && (\n <QuickReplies\n replies={this.quickReplies}\n disabled={this.disabled || this.isLoading}\n onReplyClick={this.handleQuickReply}\n />\n )}\n\n {/* Input Area */}\n <AssistantInput\n placeholder={this.placeholder}\n disabled={this.disabled}\n isLoading={this.isLoading}\n enableVoiceInput={this.enableVoiceInput && this.hasVoiceSupport}\n isListening={this.isListening}\n onSendMessage={this.handleSendMessage}\n onStartListening={this.handleStartListening}\n onStopListening={this.handleStopListening}\n inputValue={this.inputValue}\n setInputValue={this.setInputValue}\n />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n width: 100%;\n}\n\n.autocomplete {\n position: relative;\n width: 100%;\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &--readonly {\n .autocomplete__input {\n background-color: #f5f5f5;\n }\n }\n}\n\n.autocomplete__label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #424242;\n margin-bottom: 0.5rem;\n}\n\n.autocomplete__input-wrapper {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n border: 1px solid #bdbdbd;\n border-radius: 4px;\n padding: 0.5rem;\n background-color: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n\n &:focus-within {\n border-color: #1976d2;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n }\n}\n\n.autocomplete__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.autocomplete__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background-color: #e3f2fd;\n border-radius: 16px;\n font-size: 0.875rem;\n color: #1976d2;\n}\n\n.autocomplete__chip-label {\n line-height: 1;\n}\n\n.autocomplete__chip-remove {\n background: none;\n border: none;\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #1976d2;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover:not(:disabled) {\n background-color: rgba(25, 118, 210, 0.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.autocomplete__input {\n flex: 1;\n min-width: 120px;\n border: none;\n outline: none;\n font-family: inherit;\n font-size: 1rem;\n padding: 0.25rem;\n background: transparent;\n color: #212121;\n\n &::placeholder {\n color: #9e9e9e;\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n &[readonly] {\n cursor: default;\n }\n}\n\n.autocomplete__actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n flex-shrink: 0;\n}\n\n.autocomplete__clear {\n background: none;\n border: none;\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: #f5f5f5;\n color: #212121;\n }\n}\n\n.autocomplete__icon {\n font-size: 0.75rem;\n color: #757575;\n pointer-events: none;\n transition: transform 0.2s;\n\n .autocomplete--open & {\n transform: rotate(180deg);\n }\n}\n\n.autocomplete__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n max-height: 300px;\n overflow-y: auto;\n background-color: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n}\n\n.autocomplete__item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background-color 0.2s;\n color: #212121;\n\n &:hover:not(&--disabled) {\n background-color: #f5f5f5;\n }\n\n &--highlighted {\n background-color: #e3f2fd;\n }\n\n &--selected {\n background-color: #1976d2;\n color: #fff;\n\n &:hover {\n background-color: #1565c0;\n }\n }\n\n &--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.autocomplete__no-results {\n padding: 1rem;\n text-align: center;\n color: #757575;\n font-size: 0.875rem;\n}","import { Component, Host, h, Prop, State, Event, EventEmitter, Element, Listen } from '@stencil/core';\n\nexport interface AutocompleteItem {\n label: string;\n value: any;\n disabled?: boolean;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-autocomplete',\n styleUrl: 'xplor-autocomplete.scss',\n scoped: true,\n})\nexport class XplorAutocomplete {\n @Element() el: HTMLElement;\n\n /**\n * Array of items to display in the dropdown\n */\n @Prop() items: AutocompleteItem[] = [];\n\n /**\n * Selected value\n */\n @Prop({ mutable: true }) value: any = null;\n\n /**\n * Placeholder text\n */\n @Prop() placeholder: string = 'Search...';\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Disable the autocomplete\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Make the autocomplete readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Clear button\n */\n @Prop() clearable: boolean = false;\n\n /**\n * Allow multiple selection\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Minimum characters to trigger search\n */\n @Prop() minSearchLength: number = 0;\n\n /**\n * Key to extract value from item objects\n */\n @Prop() itemValue: string = 'value';\n\n /**\n * Key to extract display text from item objects\n */\n @Prop() itemText: string = 'label';\n\n /**\n * Max width of the dropdown menu\n */\n @Prop() menuMaxWidth: string = '100%';\n\n /**\n * Custom render function for dropdown items\n */\n @Prop() renderItem: (item: AutocompleteItem) => any;\n\n /**\n * Custom render function for selected items (chips)\n */\n @Prop() renderSelection: (item: AutocompleteItem) => any;\n\n @State() isOpen: boolean = false;\n @State() searchQuery: string = '';\n @State() filteredItems: AutocompleteItem[] = [];\n @State() selectedItems: any[] = [];\n @State() highlightedIndex: number = -1;\n\n @Event() xplorChange: EventEmitter<any>;\n @Event() xplorSelect: EventEmitter<AutocompleteItem>;\n @Event() xplorClear: EventEmitter<void>;\n @Event() xplorSearch: EventEmitter<string>;\n\n private inputEl: HTMLInputElement;\n private dropdownEl: HTMLDivElement;\n\n private getItemValue(item: AutocompleteItem): any {\n return item[this.itemValue] !== undefined ? item[this.itemValue] : item.value;\n }\n\n private getItemText(item: AutocompleteItem): string {\n return item[this.itemText] !== undefined ? String(item[this.itemText]) : String(item.label);\n }\n\n componentWillLoad() {\n this.filterItems();\n if (this.value !== null) {\n if (this.multiple && Array.isArray(this.value)) {\n this.selectedItems = this.value;\n } else if (!this.multiple) {\n const selectedItem = this.items.find(item => this.getItemValue(item) === this.value);\n if (selectedItem) {\n this.searchQuery = this.getItemText(selectedItem);\n }\n }\n }\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent) {\n const target = event.target as Node;\n if (!this.el.contains(target)) {\n this.isOpen = false;\n }\n }\n\n private filterItems() {\n if (this.searchQuery.length < this.minSearchLength) {\n this.filteredItems = this.items;\n return;\n }\n\n const query = this.searchQuery.toLowerCase();\n this.filteredItems = this.items.filter(item =>\n this.getItemText(item).toLowerCase().includes(query)\n );\n }\n\n private handleInputFocus = () => {\n if (this.disabled || this.readonly) return;\n this.isOpen = true;\n this.highlightedIndex = -1;\n };\n\n private handleInputChange = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.searchQuery = input.value;\n this.filterItems();\n this.isOpen = true;\n this.highlightedIndex = -1;\n this.xplorSearch.emit(this.searchQuery);\n\n if (!this.multiple && this.searchQuery === '') {\n this.value = null;\n this.xplorChange.emit(null);\n }\n };\n\n private handleInputKeyDown = (event: KeyboardEvent) => {\n if (this.disabled || this.readonly) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.isOpen = true;\n this.highlightedIndex = Math.min(this.highlightedIndex + 1, this.filteredItems.length - 1);\n this.scrollToHighlighted();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.highlightedIndex = Math.max(this.highlightedIndex - 1, -1);\n this.scrollToHighlighted();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.highlightedIndex >= 0 && this.highlightedIndex < this.filteredItems.length) {\n this.selectItem(this.filteredItems[this.highlightedIndex]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen = false;\n this.inputEl?.blur();\n break;\n\n case 'Backspace':\n if (this.multiple && this.searchQuery === '' && this.selectedItems.length > 0) {\n event.preventDefault();\n this.removeItem(this.selectedItems[this.selectedItems.length - 1]);\n }\n break;\n }\n };\n\n private scrollToHighlighted() {\n if (this.dropdownEl && this.highlightedIndex >= 0) {\n const highlightedEl = this.dropdownEl.querySelector(`[data-index=\"${this.highlightedIndex}\"]`) as HTMLElement;\n if (highlightedEl) {\n highlightedEl.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n private selectItem(item: AutocompleteItem) {\n if (item.disabled) return;\n\n const itemVal = this.getItemValue(item);\n\n if (this.multiple) {\n if (!this.selectedItems.includes(itemVal)) {\n this.selectedItems = [...this.selectedItems, itemVal];\n this.value = this.selectedItems;\n this.xplorChange.emit(this.value);\n }\n this.searchQuery = '';\n this.filterItems();\n } else {\n this.value = itemVal;\n this.searchQuery = this.getItemText(item);\n this.isOpen = false;\n this.xplorChange.emit(this.value);\n }\n\n this.xplorSelect.emit(item);\n this.inputEl?.focus();\n }\n\n private removeItem(value: any) {\n this.selectedItems = this.selectedItems.filter(v => v !== value);\n this.value = this.selectedItems;\n this.xplorChange.emit(this.value);\n }\n\n private handleClear = () => {\n this.value = this.multiple ? [] : null;\n this.selectedItems = [];\n this.searchQuery = '';\n this.filterItems();\n this.xplorChange.emit(this.value);\n this.xplorClear.emit();\n this.inputEl?.focus();\n };\n\n private getSelectedItemLabel(value: any): string {\n const item = this.items.find(i => this.getItemValue(i) === value);\n return item ? this.getItemText(item) : value;\n }\n\n private findItemByValue(value: any): AutocompleteItem | undefined {\n return this.items.find(i => this.getItemValue(i) === value);\n }\n\n render() {\n const hasValue = this.multiple ? this.selectedItems.length > 0 : this.value !== null && this.searchQuery !== '';\n\n return (\n <Host>\n <div\n class={{\n 'autocomplete': true,\n 'autocomplete--disabled': this.disabled,\n 'autocomplete--readonly': this.readonly,\n 'autocomplete--open': this.isOpen,\n }}\n >\n {this.label && (\n <label class=\"autocomplete__label\">{this.label}</label>\n )}\n\n <div class=\"autocomplete__input-wrapper\">\n {this.multiple && this.selectedItems.length > 0 && (\n <div class=\"autocomplete__chips\">\n {this.selectedItems.map(value => {\n const item = this.findItemByValue(value);\n return (\n <div class=\"autocomplete__chip\">\n <span class=\"autocomplete__chip-label\">\n {this.renderSelection && item ? this.renderSelection(item) : this.getSelectedItemLabel(value)}\n </span>\n <button\n type=\"button\"\n class=\"autocomplete__chip-remove\"\n onClick={() => this.removeItem(value)}\n disabled={this.disabled || this.readonly}\n >\n ×\n </button>\n </div>\n );\n })}\n </div>\n )}\n\n <input\n ref={(el) => (this.inputEl = el)}\n type=\"text\"\n class=\"autocomplete__input\"\n placeholder={this.placeholder}\n value={this.searchQuery}\n onFocus={this.handleInputFocus}\n onInput={this.handleInputChange}\n onKeyDown={this.handleInputKeyDown}\n disabled={this.disabled}\n readonly={this.readonly}\n autocomplete=\"off\"\n />\n\n <div class=\"autocomplete__actions\">\n {this.clearable && hasValue && !this.disabled && !this.readonly && (\n <button\n type=\"button\"\n class=\"autocomplete__clear\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n ×\n </button>\n )}\n <span class=\"autocomplete__icon\">▼</span>\n </div>\n </div>\n\n {this.isOpen && this.filteredItems.length > 0 && (\n <div class=\"autocomplete__dropdown\" ref={(el) => (this.dropdownEl = el)} style={{ maxWidth: this.menuMaxWidth }}>\n {this.filteredItems.map((item, index) => {\n const itemVal = this.getItemValue(item);\n return (\n <div\n key={itemVal}\n data-index={index}\n class={{\n 'autocomplete__item': true,\n 'autocomplete__item--highlighted': index === this.highlightedIndex,\n 'autocomplete__item--selected': this.multiple\n ? this.selectedItems.includes(itemVal)\n : this.value === itemVal,\n 'autocomplete__item--disabled': item.disabled,\n }}\n onClick={() => this.selectItem(item)}\n >\n {this.renderItem ? this.renderItem(item) : this.getItemText(item)}\n </div>\n );\n })}\n </div>\n )}\n\n {this.isOpen && this.filteredItems.length === 0 && (\n <div class=\"autocomplete__dropdown\" style={{ maxWidth: this.menuMaxWidth }}>\n <div class=\"autocomplete__no-results\">No results found</div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-avatar',\n styleUrl: 'xplor-avatar.scss',\n shadow: true,\n})\nexport class XplorAvatar {\n /** Background color when there is no image src */\n @Prop() color?: 'green' | 'yellow' | 'pink' | 'primary' | 'secondary';\n // eslint-disable-next-line @stencil/required-jsdoc\n @Prop() disabled?: boolean = false;\n /** The URL if the avatar should be hyperlinked */\n @Prop() href?: string;\n /** Alt text for the image if there is an image src */\n @Prop() name?: string;\n /** Size of the avatar */\n @Prop() size?: 'md' | 'sm';\n /** The image URL */\n @Prop() src?: string;\n /** Color styles for the dot indicator to indicate varied states */\n @Prop() status?: 'active' | 'warning' | 'inactive';\n /**\n * Where to open the URL chosen for the `href` prop:\n * `_self` (default), `_blank`, `_parent`, or `_top`\n */\n @Prop() target?: string;\n\n render() {\n let className = 'xpl-avatar';\n if (this.size) className += ` xpl-avatar--${this.size}`;\n if (this.color) className += ` xpl-avatar--${this.color}`;\n\n const inner = (\n <div>\n {this.src ? (\n <img alt={this.name} src={this.src} />\n ) : (\n <div class=\"xpl-avatar__placeholder\">\n <slot></slot>\n </div>\n )}\n {this.status && <div class={`xpl-avatar__dot--${this.status}`}></div>}\n </div>\n );\n\n return (\n <Host>\n {this.href && !this.disabled ? (\n <a href={this.href} class={className} target={this.target}>\n {inner}\n </a>\n ) : this.href && this.disabled ? (\n <div class={className + ' xpl-avatar--disabled'}>{inner}</div>\n ) : (\n <div class={className}>{inner}</div>\n )}\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.avatar-and-name {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.avatar-and-name__text {\n font-size: 0.875rem;\n font-weight: 500;\n color: #212121;\n line-height: 1.5;\n}","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-avatar-and-name',\n styleUrl: 'xplor-avatar-and-name.scss',\n scoped: true,\n})\nexport class XplorAvatarAndName {\n @Prop() name: string;\n @Prop() src: string;\n @Prop() size: 'sm' | 'md' = 'md';\n @Prop() color?: 'green' | 'yellow' | 'pink' | 'primary' | 'secondary';\n @Prop() status?: 'active' | 'warning' | 'inactive';\n\n render() {\n return (\n <Host>\n <div class=\"avatar-and-name\">\n <xplor-avatar\n name={this.name}\n src={this.src}\n size={this.size}\n color={this.color}\n status={this.status}\n >\n {!this.src && this.name && this.name.charAt(0).toUpperCase()}\n </xplor-avatar>\n <span class=\"avatar-and-name__text\">\n <slot>{this.name}</slot>\n </span>\n </div>\n </Host>\n );\n }\n}\n","@use '../../styles/colours.scss' as colours;\n@use '../../styles/spacing.scss' as spacing;\n@use '../../styles/mixins.scss' as mixins;\n\n:host {\n display: inline-block;\n}\n\n.xplor-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-weight: 400;\n font-size: 0.875rem;\n line-height: 1.25rem;\n padding: 4px 12px;\n border-radius: 16px;\n background-color: var(--xplor-badge-bg, colours.$primary-50);\n color: var(--xplor-badge-color, colours.$primary);\n transition: all 0.2s ease;\n white-space: nowrap;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n\n // Size variants\n &--small {\n font-size: 0.75rem;\n padding: 2px 8px;\n border-radius: 12px;\n }\n\n &--medium {\n font-size: 0.875rem;\n padding: 4px 12px;\n border-radius: 16px;\n }\n\n &--large {\n font-size: 1rem;\n padding: 6px 16px;\n border-radius: 20px;\n }\n\n // Style variants\n &--flat {\n border: none;\n }\n\n &--outlined {\n background-color: transparent;\n border: 1px solid var(--xplor-badge-bg, colours.$primary);\n color: var(--xplor-badge-bg, colours.$primary);\n }\n\n &--tonal {\n background-color: var(--xplor-badge-bg, colours.$primary-50);\n color: var(--xplor-badge-color, colours.$primary);\n }\n\n // Datatable variant (slightly larger padding)\n &--datatable {\n padding: 8px 12px;\n border-radius: 14px;\n }\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge',\n styleUrl: 'xplor-badge.scss',\n scoped: true,\n})\nexport class XplorBadge {\n /**\n * Background color (can be CSS color or theme color name)\n */\n @Prop() backgroundColor: string = '#e3f2fd';\n\n /**\n * Text color - 'auto' will calculate contrasting color\n */\n @Prop() color: string = 'auto';\n\n /**\n * Luminance threshold for auto contrast calculation (0-255)\n */\n @Prop() threshold: number = 130;\n\n /**\n * Visual variant\n */\n @Prop() variant: 'flat' | 'outlined' | 'tonal' = 'flat';\n\n /**\n * Size variant\n */\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * Whether to use datatable styling (slightly larger padding)\n */\n @Prop() datatable: boolean = false;\n\n /**\n * Optional text content (can also use slot)\n */\n @Prop() text: string = '';\n\n /**\n * Calculates relative luminance of a color\n * Based on WCAG 2.0 formula\n */\n private calculateLuminance(r: number, g: number, b: number): number {\n const [rs, gs, bs] = [r, g, b].map(c => {\n c = c / 255;\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n }\n\n /**\n * Parses hex/rgb/rgba color to RGB values\n */\n private parseColor(color: string): { r: number; g: number; b: number } | null {\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.replace('#', '');\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16);\n const g = parseInt(hex[1] + hex[1], 16);\n const b = parseInt(hex[2] + hex[2], 16);\n return { r, g, b };\n } else if (hex.length === 6) {\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return { r, g, b };\n }\n }\n\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1]),\n g: parseInt(rgbMatch[2]),\n b: parseInt(rgbMatch[3]),\n };\n }\n\n return null;\n }\n\n /**\n * Calculates contrasting color (black or white) based on background\n */\n private calculateContrastingColor(bgColor: string): string {\n const rgb = this.parseColor(bgColor);\n if (!rgb) return '#000000';\n\n const luminance = this.calculateLuminance(rgb.r, rgb.g, rgb.b);\n // Using threshold to determine light vs dark background\n return luminance > 0.5 ? '#000000' : '#ffffff';\n }\n\n /**\n * Gets the computed CSS variables for the badge\n */\n private get cssVars(): { [key: string]: string } {\n const vars: { [key: string]: string } = {};\n\n // Set background color\n vars['--xplor-badge-bg'] = this.backgroundColor;\n\n // Set text color (auto-calculate if needed)\n if (this.color === 'auto') {\n vars['--xplor-badge-color'] = this.calculateContrastingColor(this.backgroundColor);\n } else {\n vars['--xplor-badge-color'] = this.color;\n }\n\n return vars;\n }\n\n /**\n * Gets the computed CSS classes\n */\n private get computedClasses(): { [key: string]: boolean } {\n return {\n 'xplor-badge': true,\n [`xplor-badge--${this.variant}`]: true,\n [`xplor-badge--${this.size}`]: true,\n 'xplor-badge--datatable': this.datatable,\n };\n }\n\n render() {\n return (\n <Host>\n <span class={this.computedClasses} style={this.cssVars}>\n <slot>{this.text}</slot>\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-active {\n background-color: #E6F7F7;\n color: #00605C;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-active',\n styleUrl: 'xplor-badge-active.scss',\n scoped: true,\n})\nexport class XplorBadgeActive {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-active\">\n Active\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-archived {\n background-color: #E8E0F0;\n color: #60479A;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-archived',\n styleUrl: 'xplor-badge-archived.scss',\n scoped: true,\n})\nexport class XplorBadgeArchived {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-archived\">\n Archived\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-deleted {\n background-color: #FFF3E6;\n color: #B35A00;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-deleted',\n styleUrl: 'xplor-badge-deleted.scss',\n scoped: true,\n})\nexport class XplorBadgeDeleted {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-deleted\">\n Deleted\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-expired {\n background-color: #FEE;\n color: #C62828;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-expired',\n styleUrl: 'xplor-badge-expired.scss',\n scoped: true,\n})\nexport class XplorBadgeExpired {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-expired\">\n Expired\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-inactive {\n background-color: #FAFAFA;\n color: #424242;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-inactive',\n styleUrl: 'xplor-badge-inactive.scss',\n scoped: true,\n})\nexport class XplorBadgeInactive {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-inactive\">\n Inactive\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-recalled {\n background-color: #FFF9E6;\n color: #F9A825;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-recalled',\n styleUrl: 'xplor-badge-recalled.scss',\n scoped: true,\n})\nexport class XplorBadgeRecalled {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-recalled\">\n Recalled\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-session-booking {\n border-radius: 0.25rem;\n color: #000;\n width: 200px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n padding: 4px 12px;\n\n &--default {\n background-color: #fef2e0;\n border: solid 2px #f69202;\n }\n\n &--absent {\n background-color: #f0f0f0;\n border: solid 2px #7b7b7b;\n }\n\n &--attend {\n background-color: #dff6f6;\n border: solid 2px #00b2a8;\n }\n\n &--holiday {\n background-color: #f0f0f0;\n border: solid 2px #7b7b7b;\n }\n\n &--waived {\n opacity: 0.5;\n }\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\nexport interface Booking {\n type: 'absence' | 'attendance' | 'holiday' | string;\n [key: string]: any;\n}\n\nexport interface BookingItem {\n ccs_gap_fee_is_waived?: boolean;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-badge-session-booking',\n styleUrl: 'xplor-badge-session-booking.scss',\n scoped: true,\n})\nexport class XplorBadgeSessionBooking {\n /**\n * Booking object\n */\n @Prop() booking!: Booking;\n\n /**\n * Item object\n */\n @Prop() item!: BookingItem;\n\n private getBookingTypeClass(): string {\n const classes = ['xplor-badge-session-booking'];\n\n switch (this.booking?.type) {\n case 'absence':\n classes.push('xplor-badge-session-booking--absent');\n break;\n case 'attendance':\n classes.push('xplor-badge-session-booking--attend');\n break;\n case 'holiday':\n classes.push('xplor-badge-session-booking--holiday');\n break;\n default:\n classes.push('xplor-badge-session-booking--default');\n break;\n }\n\n if (this.item?.ccs_gap_fee_is_waived) {\n classes.push('xplor-badge-session-booking--waived');\n }\n\n return classes.join(' ');\n }\n\n render() {\n return (\n <Host>\n <span class={this.getBookingTypeClass()}>\n <slot />\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-upcoming {\n background-color: #E3F2FD;\n color: #1976D2;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-upcoming',\n styleUrl: 'xplor-badge-upcoming.scss',\n scoped: true,\n})\nexport class XplorBadgeUpcoming {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-upcoming\">\n Upcoming\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-badge-waitlist {\n background-color: #FFF3E6;\n color: #B35A00;\n font-weight: 400;\n padding: 4px 12px;\n border-radius: 16px;\n display: inline-block;\n}\n","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'xplor-badge-waitlist',\n styleUrl: 'xplor-badge-waitlist.scss',\n scoped: true,\n})\nexport class XplorBadgeWaitlist {\n render() {\n return (\n <Host>\n <span class=\"xplor-badge-waitlist\">\n Waitlist\n </span>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-back {\n display: inline-flex;\n align-items: center;\n gap: var(--gap, 0.625rem);\n min-width: var(--min-width, 6.375rem);\n min-height: var(--min-height, 3rem);\n padding-left: 0;\n padding-right: 1rem;\n border: none;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font-size: inherit;\n font-family: inherit;\n transition: opacity 0.2s ease;\n\n &__icon {\n font-size: 1.5rem;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__text {\n line-height: 1;\n }\n\n &:hover:not(.xplor-btn-back--disabled) {\n opacity: 0.8;\n }\n\n &--disabled {\n opacity: 0.38;\n cursor: not-allowed;\n pointer-events: none;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-back',\n styleUrl: 'xplor-btn-back.scss',\n scoped: true,\n})\nexport class XplorBtnBack {\n /**\n * Button color\n */\n @Prop() color: string = 'secondary';\n\n /**\n * Minimum width\n */\n @Prop() minWidth: string = '6.375rem';\n\n /**\n * Minimum height\n */\n @Prop() minHeight: string = '3rem';\n\n /**\n * Gap between icon and text\n */\n @Prop() gap: string = '0.625rem';\n\n /**\n * Whether the button is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Click event\n */\n @Event() xplorClick: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.disabled) {\n this.xplorClick.emit(event);\n }\n };\n\n render() {\n const buttonClasses = {\n 'xplor-btn-back': true,\n 'xplor-btn-back--disabled': this.disabled,\n };\n\n const buttonStyles = {\n '--min-width': this.minWidth,\n '--min-height': this.minHeight,\n '--gap': this.gap,\n };\n\n return (\n <Host>\n <button\n class={buttonClasses}\n style={buttonStyles}\n disabled={this.disabled}\n onClick={this.handleClick}\n >\n <span class=\"xplor-btn-back__icon\">‹</span>\n <span class=\"xplor-btn-back__text\">\n <slot>Back</slot>\n </span>\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-back-to-parent {\n position: absolute;\n right: 1rem;\n top: 1rem;\n font-size: 1rem;\n z-index: 1;\n padding: 0;\n width: var(--btn-size, 2.25rem);\n height: var(--btn-size, 2.25rem);\n border: none;\n border-radius: 4px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background-color: white;\n color: #008480;\n transition: background-color 0.2s ease;\n\n &__icon {\n font-size: 1rem;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &:hover {\n background-color: #E6F7F7;\n }\n\n &--inline {\n position: relative;\n top: 0;\n right: 0;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-back-to-parent',\n styleUrl: 'xplor-btn-back-to-parent.scss',\n scoped: true,\n})\nexport class XplorBtnBackToParent {\n /**\n * Button size\n */\n @Prop() size: string = '2.25rem';\n\n /**\n * Whether to use inline (relative) positioning instead of absolute\n */\n @Prop() inline: boolean = false;\n\n /**\n * Background color\n */\n @Prop() bgColor: string = 'white';\n\n /**\n * Text/icon color\n */\n @Prop() color: string = 'secondary';\n\n /**\n * Visual variant\n */\n @Prop() variant: 'text' | 'outlined' | 'elevated' | 'tonal' = 'tonal';\n\n /**\n * Back event (emitted on click)\n */\n @Event() back: EventEmitter<void>;\n\n private handleClick = () => {\n this.back.emit();\n };\n\n render() {\n const buttonClasses = {\n 'xplor-btn-back-to-parent': true,\n 'xplor-btn-back-to-parent--inline': this.inline,\n };\n\n const buttonStyles = {\n '--btn-size': this.size,\n };\n\n return (\n <Host>\n <button\n class={buttonClasses}\n style={buttonStyles}\n onClick={this.handleClick}\n >\n <span class=\"xplor-btn-back-to-parent__icon\">✕</span>\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-icon {\n min-width: 0;\n min-height: 0;\n width: var(--btn-size, 32px);\n height: var(--btn-size, 32px);\n padding: 0;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n position: relative;\n\n &__content {\n font-size: var(--icon-size, 18px);\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n // Elevated variant (default)\n &--elevated {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2),\n 0px 2px 2px 0px rgba(0, 0, 0, 0.14),\n 0px 1px 5px 0px rgba(0, 0, 0, 0.12);\n }\n\n // Text variant\n &--text {\n box-shadow: none;\n }\n\n // Outlined variant\n &--outlined {\n border: 1px solid currentColor;\n box-shadow: none;\n }\n\n // Tonal variant\n &--tonal {\n box-shadow: none;\n }\n\n // Color variants\n &--primary {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #EC7702;\n color: white;\n }\n\n &.xplor-btn-icon--outlined {\n background-color: transparent;\n color: #EC7702;\n border-color: #EC7702;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #FFF3E6;\n color: #EC7702;\n }\n\n &:hover:not(.xplor-btn-icon--disabled) {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #D66A02;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #FFE7CC;\n }\n }\n }\n\n &--secondary {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #008480;\n color: white;\n }\n\n &.xplor-btn-icon--outlined {\n background-color: transparent;\n color: #008480;\n border-color: #008480;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #E6F7F7;\n color: #008480;\n }\n\n &:hover:not(.xplor-btn-icon--disabled) {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #006D6A;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #008480;\n color: white;\n }\n }\n }\n\n &--success {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #489951;\n color: white;\n }\n\n &.xplor-btn-icon--outlined {\n background-color: transparent;\n color: #489951;\n border-color: #489951;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #E8F5E9;\n color: #489951;\n }\n\n &:hover:not(.xplor-btn-icon--disabled) {\n &.xplor-btn-icon--elevated,\n &.xplor-btn-icon--text {\n background-color: #3D8044;\n }\n\n &.xplor-btn-icon--tonal {\n background-color: #D0EBD2;\n }\n }\n }\n\n &--disabled {\n opacity: 0.38;\n cursor: not-allowed;\n pointer-events: none;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-icon',\n styleUrl: 'xplor-btn-icon.scss',\n scoped: true,\n})\nexport class XplorBtnIcon {\n /**\n * Button color variant\n */\n @Prop() color: 'primary' | 'secondary' | 'success' | string = 'secondary';\n\n /**\n * Button size (can be pixel value like '32' or '48')\n */\n @Prop() size: string | number = '32';\n\n /**\n * Icon size\n */\n @Prop() iconSize: string | number = '18';\n\n /**\n * Visual variant\n */\n @Prop() variant: 'text' | 'outlined' | 'elevated' | 'tonal' = 'elevated';\n\n /**\n * Whether the button is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Click event\n */\n @Event() xplorClick: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.disabled) {\n this.xplorClick.emit(event);\n }\n };\n\n render() {\n const buttonClasses = {\n 'xplor-btn-icon': true,\n [`xplor-btn-icon--${this.color}`]: true,\n [`xplor-btn-icon--${this.variant}`]: true,\n 'xplor-btn-icon--disabled': this.disabled,\n };\n\n const buttonStyles = {\n '--btn-size': typeof this.size === 'number' ? `${this.size}px` : this.size,\n '--icon-size': typeof this.iconSize === 'number' ? `${this.iconSize}px` : this.iconSize,\n };\n\n return (\n <Host>\n <button\n class={buttonClasses}\n style={buttonStyles}\n disabled={this.disabled}\n onClick={this.handleClick}\n >\n <span class=\"xplor-btn-icon__content\">\n <slot />\n </span>\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n position: relative;\n}\n\n.xplor-btn-menu {\n position: relative;\n display: inline-block;\n\n &__button {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem 1rem;\n border: 1px solid #008480;\n border-radius: 4px;\n background-color: transparent;\n color: #008480;\n cursor: pointer;\n font-size: inherit;\n font-family: inherit;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: rgba(0, 132, 128, 0.04);\n }\n }\n\n &__icon {\n font-size: 0.75rem;\n line-height: 1;\n }\n\n &__list {\n position: absolute;\n top: calc(100% + 0.25rem);\n left: 0;\n min-width: 200px;\n background: white;\n border-radius: 4px;\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: 1000;\n overflow: hidden;\n }\n\n &__item {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #e0e0e0;\n text-align: center;\n cursor: pointer;\n transition: background-color 0.2s ease;\n\n &:hover:not(&--disabled) {\n background-color: #f5f5f5;\n }\n\n &:last-child {\n border-bottom: none;\n }\n\n &--disabled {\n opacity: 0.38;\n cursor: not-allowed;\n pointer-events: none;\n }\n }\n}\n","import { Component, Host, h, Prop, State, Event, EventEmitter } from '@stencil/core';\n\nexport interface MenuOption {\n key?: string;\n label: string;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-btn-menu',\n styleUrl: 'xplor-btn-menu.scss',\n scoped: true,\n})\nexport class XplorBtnMenu {\n /**\n * Button label\n */\n @Prop() label: string = '';\n\n /**\n * Menu options\n */\n @Prop() options: MenuOption[] = [];\n\n /**\n * Hidden option keys\n */\n @Prop() hiddenKeys: string[] = [];\n\n /**\n * Disabled option keys\n */\n @Prop() disabledKeys: string[] = [];\n\n /**\n * Button color\n */\n @Prop() color: string = 'secondary';\n\n /**\n * Button density (compact, default, comfortable)\n */\n @Prop() density: string = 'default';\n\n /**\n * Whether the menu is open\n */\n @State() show: boolean = false;\n\n /**\n * Click event - emits the clicked option\n */\n @Event() xplorClick: EventEmitter<MenuOption>;\n\n private menuRef: HTMLDivElement;\n\n componentDidLoad() {\n document.addEventListener('click', this.handleOutsideClick);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n\n private handleOutsideClick = (event: MouseEvent) => {\n if (this.menuRef && !this.menuRef.contains(event.target as Node)) {\n this.show = false;\n }\n };\n\n private toggleMenu = () => {\n this.show = !this.show;\n };\n\n private handleClickOption = (option: MenuOption) => {\n this.xplorClick.emit(option);\n this.show = false;\n };\n\n private isHidden = (key: string | null): boolean => {\n return key !== null && this.hiddenKeys.includes(key);\n };\n\n private isDisabled = (key: string | null): boolean => {\n return key !== null && this.disabledKeys.includes(key);\n };\n\n render() {\n return (\n <Host>\n <div class=\"xplor-btn-menu\" ref={(el) => (this.menuRef = el)}>\n <slot name=\"activator\">\n <button\n class=\"xplor-btn-menu__button\"\n onClick={this.toggleMenu}\n >\n <span>{this.label}</span>\n <span class=\"xplor-btn-menu__icon\">▼</span>\n </button>\n </slot>\n\n {this.show && (\n <div class=\"xplor-btn-menu__list\">\n {this.options.map((option, index) => {\n const key = option.key || String(index);\n if (this.isHidden(key)) {\n return null;\n }\n\n return (\n <div\n key={key}\n class={{\n 'xplor-btn-menu__item': true,\n 'xplor-btn-menu__item--disabled': this.isDisabled(key),\n }}\n onClick={() => !this.isDisabled(key) && this.handleClickOption(option)}\n >\n <slot name={key}>{option.label || ''}</slot>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-toggle {\n border: 1px solid #E0E0E0;\n border-radius: 1rem;\n min-width: 4rem;\n padding: 0.5rem 1rem;\n background-color: white;\n color: #757575;\n cursor: pointer;\n font-size: inherit;\n font-family: inherit;\n transition: all 0.2s ease;\n margin-right: 0.5rem;\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &--active {\n background-color: #E6F7F7;\n color: #008480;\n border-color: #008480;\n }\n\n &--disabled {\n background-color: #FAFAFA;\n color: rgba(0, 0, 0, 0.38);\n border-color: rgba(0, 0, 0, 0.12);\n cursor: not-allowed;\n pointer-events: none;\n\n &.xplor-btn-toggle--active {\n background-color: rgba(0, 0, 0, 0.05);\n }\n }\n\n &--inactive-outlined {\n border-color: #757575;\n }\n\n &:hover:not(.xplor-btn-toggle--disabled) {\n background-color: #F5F5F5;\n\n &.xplor-btn-toggle--active {\n background-color: #D0EBD2;\n }\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-toggle',\n styleUrl: 'xplor-btn-toggle.scss',\n scoped: true,\n})\nexport class XplorBtnToggle {\n /**\n * Whether the button is active/selected\n */\n @Prop({ mutable: true }) active: boolean = false;\n\n /**\n * Button color when active\n */\n @Prop() color: string = 'secondary';\n\n /**\n * Whether the button is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether to show outline when inactive\n */\n @Prop() inactiveOutlined: boolean = false;\n\n /**\n * Toggle event\n */\n @Event() xplorToggle: EventEmitter<boolean>;\n\n private handleClick = () => {\n if (!this.disabled) {\n this.active = !this.active;\n this.xplorToggle.emit(this.active);\n }\n };\n\n render() {\n const buttonClasses = {\n 'xplor-btn-toggle': true,\n 'xplor-btn-toggle--active': this.active,\n 'xplor-btn-toggle--disabled': this.disabled,\n 'xplor-btn-toggle--inactive-outlined': this.inactiveOutlined && !this.active,\n };\n\n return (\n <Host>\n <button\n class={buttonClasses}\n disabled={this.disabled}\n onClick={this.handleClick}\n aria-pressed={this.active ? 'true' : 'false'}\n >\n <slot />\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-toggle-group {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n height: auto;\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-toggle-group',\n styleUrl: 'xplor-btn-toggle-group.scss',\n scoped: true,\n})\nexport class XplorBtnToggleGroup {\n /**\n * Whether multiple buttons can be active at once\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Density variant\n */\n @Prop() density: 'compact' | 'default' | 'comfortable' = 'default';\n\n render() {\n return (\n <Host>\n <div class=\"xplor-btn-toggle-group\" role=\"group\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-btn-toggle-secondary {\n border: 1px solid #E0E0E0;\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n margin-bottom: 0.5rem;\n border-radius: 1rem;\n color: #757575;\n min-width: 70px;\n padding: 0.5rem 1rem;\n background-color: white;\n cursor: pointer;\n font-size: inherit;\n font-family: inherit;\n transition: all 0.2s ease;\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &--active {\n background-color: #E6F7F7;\n color: #008480;\n border-color: #008480;\n }\n\n &--disabled {\n background-color: #FAFAFA;\n color: rgba(0, 0, 0, 0.38);\n border-color: rgba(0, 0, 0, 0.12);\n cursor: not-allowed;\n pointer-events: none;\n\n &.xplor-btn-toggle-secondary--active {\n background-color: rgba(0, 0, 0, 0.05);\n }\n }\n\n &--inactive-outlined {\n border-color: #757575;\n }\n\n &:hover:not(.xplor-btn-toggle-secondary--disabled) {\n background-color: #F5F5F5;\n\n &.xplor-btn-toggle-secondary--active {\n background-color: #D0EBD2;\n }\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-toggle-secondary',\n styleUrl: 'xplor-btn-toggle-secondary.scss',\n scoped: true,\n})\nexport class XplorBtnToggleSecondary {\n /**\n * Whether the button is active/selected\n */\n @Prop({ mutable: true }) active: boolean = false;\n\n /**\n * Whether the button is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether to show outline when inactive\n */\n @Prop() inactiveOutlined: boolean = false;\n\n /**\n * Toggle event\n */\n @Event() xplorToggle: EventEmitter<boolean>;\n\n private handleClick = () => {\n if (!this.disabled) {\n this.active = !this.active;\n this.xplorToggle.emit(this.active);\n }\n };\n\n render() {\n const buttonClasses = {\n 'xplor-btn-toggle-secondary': true,\n 'xplor-btn-toggle-secondary--active': this.active,\n 'xplor-btn-toggle-secondary--disabled': this.disabled,\n 'xplor-btn-toggle-secondary--inactive-outlined': this.inactiveOutlined && !this.active,\n };\n\n return (\n <Host>\n <button\n class={buttonClasses}\n disabled={this.disabled}\n onClick={this.handleClick}\n aria-pressed={this.active ? 'true' : 'false'}\n >\n <slot />\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-btn-tooltip',\n styleUrl: 'xplor-btn-tooltip.scss',\n scoped: true,\n})\nexport class XplorBtnTooltip {\n @Prop() text: string;\n @Prop() tooltipText: string;\n @Prop() tooltipPosition: 'top' | 'bottom' | 'left' | 'right' = 'top';\n @Prop() type: 'primary' | 'secondary' | 'ghost' | 'disabled' = 'primary';\n @Prop() mode: 'office' | 'pg';\n @Prop() iconPosition: 'start' | 'end';\n @Prop() disabled: boolean = false;\n\n render() {\n return (\n <Host>\n <xplor-tooltip\n position={this.tooltipPosition}\n content={this.tooltipText}\n trigger=\"hover\"\n arrow={true}\n disabled={this.disabled}\n >\n <xplor-button\n slot=\"trigger\"\n text={this.text}\n type={this.type}\n mode={this.mode}\n icon-position={this.iconPosition}\n >\n <slot />\n </xplor-button>\n </xplor-tooltip>\n </Host>\n );\n }\n}\n","@use '../../styles/colours.scss' as colours-pg;\n@use '../../styles/spacing.scss' as spacing;\n\n:host {\n display: block;\n}\n\n.x-button {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n position: relative;\n -webkit-align-items: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n border: 1px solid;\n border-radius: 1rem;\n cursor: pointer;\n display: block;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n flex-direction: row;\n font-size: 1rem;\n font-weight: 500;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-letter-spacing: 0.75px;\n -moz-letter-spacing: 0.75px;\n -ms-letter-spacing: 0.75px;\n padding: spacing.$spacing-12 spacing.$spacing-24;\n letter-spacing: 0.75px;\n overflow: hidden;\n position: relative;\n -webkit-transition:\n background-color 0.2s,\n border-color 0.2s,\n color 0.2s;\n transition:\n background-color 0.2s,\n border-color 0.2s,\n color 0.2s;\n\n // Icon Only Button (Circular)\n &.x-button--icon-only {\n width: 48px;\n height: 48px;\n padding: 0;\n border-radius: 50%;\n min-width: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .button-icon {\n font-size: 20px;\n font-weight: 300;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &.button-icon--svg {\n svg {\n width: spacing.$spacing-16;\n height: spacing.$spacing-16;\n display: block;\n }\n }\n }\n }\n\n // Regular Button with Icon\n &.x-button--with-icon {\n .button-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n line-height: 1;\n }\n\n // SVG icon styles\n &.x-button--icon-start {\n .button-icon--svg {\n margin-right: spacing.$spacing-8 ;\n }\n }\n\n &.x-button--icon-end {\n .button-icon--svg {\n margin-left: spacing.$spacing-8 ;\n }\n }\n\n .button-icon--svg {\n\n\n svg {\n display: block;\n width: 14px;\n height: 14px;\n\n\n path {\n fill: currentColor;\n }\n }\n }\n\n .button-text {\n line-height: 1;\n }\n }\n\n // Icon positioning\n &.x-button--icon-start {\n flex-direction: row;\n }\n\n &.x-button--icon-end {\n flex-direction: row;\n }\n\n &.shadow {\n box-shadow:\n 0px 2.30969px 4.25707px rgba(20, 20, 21, 0.28),\n 0px 6.38599px 11.7703px rgba(20, 20, 21, 0.0521271),\n 0px 15.375px 28.3382px rgba(20, 20, 21, 0.04),\n 0px 32px 94px rgba(20, 20, 21, 0.0278729);\n }\n\n &.primary {\n background-color: colours-pg.$primary;\n border-color: colours-pg.$primary;\n color: white;\n\n &:hover {\n background-color: colours-pg.$primary-50;\n border-color: colours-pg.$primary-50;\n color: white;\n }\n }\n\n &.secondary {\n background-color: colours-pg.$secondary;\n border-color: colours-pg.$secondary;\n color: white;\n\n &:hover {\n background-color: colours-pg.$secondary-50;\n border-color: colours-pg.$secondary-50;\n color: white;\n ;\n }\n }\n\n &.ghost {\n background-color: #fff;\n border-color: colours-pg.$secondary;\n color: colours-pg.$secondary;\n\n &:hover {\n background-color: #DFF2F1;\n border-color: colours-pg.$secondary;\n color: colours-pg.$secondary;\n\n }\n\n &:active {\n background-color: #BEE6E4;\n border-color: colours-pg.$secondary;\n color: colours-pg.$secondary;\n\n }\n }\n\n &.minimal {\n background-color: transparent;\n border-color: transparent;\n color: colours-pg.$primary;\n }\n\n &.success {\n background-color: transparent;\n border-color: colours-pg.$success;\n color: colours-pg.$success;\n\n &:hover {\n background-color: colours-pg.$success-50;\n border-color: colours-pg.$success;\n color: colours-pg.$success;\n }\n\n &:active {\n background-color: colours-pg.$success-100;\n }\n }\n\n &.text {\n background-color: transparent;\n border-color: transparent;\n color: colours-pg.$secondary;\n\n &:hover {\n background-color: colours-pg.$secondary-50;\n }\n\n &:active {\n background-color: colours-pg.$secondary-100;\n }\n }\n\n &.disabled {\n background-color: #f6f6f6;\n border-color: #a0a0a0;\n color: #a0a0a0;\n }\n}\n\n.icon {\n background-color: #ffffff;\n bottom: 0px;\n left: 0px;\n opacity: 0;\n position: absolute;\n right: 0px;\n top: 0px;\n -webkit-transition: opacity 0.2s;\n transition: opacity 0.2s;\n}\n\n// Size variations for icon-only buttons\n.x-button--icon-only {\n &.small {\n width: 36px;\n height: 36px;\n padding: spacing.$spacing-4;\n\n .button-icon {\n font-size: 16px;\n }\n }\n\n &.button-icon--svg {\n padding: spacing.$spacing-4;\n\n svg {\n width: 16px;\n height: 16px;\n\n }\n }\n\n &.large {\n width: 56px;\n height: 56px;\n\n .button-icon {\n font-size: 24px;\n }\n }\n}\n\n// Ensure disabled state works with icon buttons\n.x-button.disabled {\n\n &.x-button--icon-only,\n &.x-button--with-icon {\n cursor: not-allowed;\n opacity: 0.6;\n }\n}","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-button',\n styleUrl: 'xplor-button.scss',\n // we cant use multiple styleUrls because the mode property is not reactive only in stencilJS and once the component is rendered it wont change the css file\n // so we are using only one styleUrl and changing the styles based on the mode property in the class\n // styleUrls: {\n // default: 'xplor-button.scss',\n // dark: 'xplor-button-pg.scss',\n // pg: 'xplor-button-pg.scss',\n // office: 'xplor-button-office.scss',\n // },\n scoped: true,\n})\nexport class XplorButton {\n @Prop() text: string;\n @Prop() type: 'minimal' | 'primary' | 'secondary' | 'ghost' | 'disabled' | 'success' | 'text' = 'secondary';\n @Prop() mode?: 'dark' | 'pg' | 'office' = 'pg'; // 'dark', 'pg', 'office' (default: 'dark')\n @Prop() size?: string; // 'small', 'medium', 'large' (default:'medium')\n @Prop() styles?: string;\n @Prop() clickAction: () => void;\n\n /**\n * Icon position: 'start' | 'end' | null\n */\n @Prop() iconPosition: 'start' | 'end' | null;\n\n /**\n * Icon to display (defaults to plus sign)\n */\n @Prop() icon: string = '+';\n @Prop() iconSvg?: string;\n\n private renderIcon() {\n if (this.icon === 'svg' && this.iconSvg) {\n return (\n <span class=\"button-icon button-icon--svg \" innerHTML={this.iconSvg}></span>\n );\n }\n return (\n <span class=\"button-icon\">\n {this.icon}\n </span>\n );\n }\n\n render() {\n const isIconOnly = !this.text && this.iconPosition !== null;\n const hasIcon = this.iconPosition !== null;\n\n return (\n <Host>\n <slot>\n <button\n role=\"button\"\n class={{\n 'x-button': true,\n [this.type]: true,\n 'shadow': this.type !== 'minimal' && this.type !== 'text',\n 'x-button--icon-only': isIconOnly,\n 'x-button--with-icon': hasIcon && !isIconOnly,\n 'x-button--icon-start': this.iconPosition === 'start' && !isIconOnly,\n 'x-button--icon-end': this.iconPosition === 'end' && !isIconOnly,\n ...(this.styles ? { [this.styles]: true } : {}),\n }}\n onClick={() => this.clickAction && this.clickAction()}\n >\n {hasIcon && this.iconPosition === 'start' && this.renderIcon()}\n {this.text && <span class=\"button-text\">{this.text}</span>}\n {hasIcon && this.iconPosition === 'end' && this.renderIcon()}\n </button>\n </slot>\n </Host>\n );\n }\n}",":host {\n display: block;\n}\n\n.container {\n display: flex;\n margin-top: 20px;\n}","import { Component, Element, Host, h, State, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-chat-widget',\n styleUrl: 'xplor-chat-widget.scss',\n shadow: true,\n})\nexport class XplorChatWidget {\n @Prop() languageOptions: string[] = ['English', 'Spanish', 'French', 'German', 'Italian'];\n @Prop() textId: string = 'text';\n @Prop() apiKey: string; // TODO: add api key to the component\n @Element() host: HTMLElement;\n @State() selectedLanguage: string = 'English';\n @State() textValue: string;\n 'Hoy, nos divertimos mucho explorando el mundo de la arcilla. Estaban totalmente absortos en el proceso, formando cuidadosamente la arcilla en diseños y patrones únicos. Desde animales coloridos hasta formas extravagantes, la imaginación de tu hijo no tuvo límites durante este día lleno de diversión.';\n\n componentDidLoad() {\n const element = this.host.shadowRoot?.getElementById('text');\n // we need to change this to a class so we can maniplulate multipule different spots with text.\n if (element) {\n this.textValue = element.textContent || '';\n console.log('textValue:', this.textValue);\n }\n }\n\n handleClick = () => {\n // const ai = document.getElementsByClassName('ai-translate');\n // Array loop throught ai html items and remap it and update\n // each class should be seperated\n debugger;\n fetch('https://nnvy1fqqcb.execute-api.ap-southeast-2.amazonaws.com/ai_dev/ai/prompt-generation', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey, // Replace with your actual API key\n },\n body: JSON.stringify({\n service: null,\n action: 'translate',\n language: this.selectedLanguage,\n content: this.textValue || '',\n }),\n })\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then((data) => {\n console.log('Success:', data);\n this.textValue = data.response;\n })\n .catch((error) => {\n console.error('Error:', error);\n });\n };\n\n handleChange = (event: Event) => {\n const selectElement = event.target as HTMLSelectElement;\n this.selectedLanguage = selectElement.value;\n console.log('Selected language:', this.selectedLanguage);\n };\n\n render() {\n return (\n <Host>\n <div id=\"ai-text\">{this.textValue}</div>\n <div class=\"container\">\n <xplor-dropdown\n options={this.languageOptions}\n selected={this.selectedLanguage}\n handleChange={this.handleChange}\n />\n <xplor-button text=\"translate\" mode=\"pg\" type=\"primary\" onClick={this.handleClick}></xplor-button>\n </div>\n </Host>\n );\n }\n}\n","/* custom-checkbox.scss */\n$color-gray-400: #d1d5db;\n$color-gray-600: #6b7280;\n$color-gray-700: #374151;\n$color-green-100: #d1fae5;\n$color-green-200: #a7f3d0;\n$color-green-300: #6ee7b7;\n$color-green-600: #059669;\n$color-red-100: #fee2e2;\n$color-red-200: #fecaca;\n$color-red-300: #fca5a5;\n$color-red-500: #ef4444;\n$color-white: white;\n\n$checkbox-size: 20px;\n$checkbox-radius: 4px;\n$border-width: 2px;\n$icon-size: 16px;\n$transition-speed: 0.15s;\n$focus-ring-opacity: 0.1;\n$disabled-opacity: 0.4;\n\n:host {\n display: inline-block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.checkbox-wrapper {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.checkbox {\n width: $checkbox-size;\n height: $checkbox-size;\n border-radius: $checkbox-radius;\n border: $border-width solid $color-gray-600;\n background: $color-white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all $transition-speed ease;\n outline: none;\n position: relative;\n\n // Hover state (unselected)\n &.hover {\n background: $color-green-100;\n border-color: $color-green-600;\n }\n\n // Focus state (unselected)\n &.focus {\n background: $color-green-200;\n border-color: $color-green-600;\n box-shadow: 0 0 0 3px rgba($color-green-600, $focus-ring-opacity);\n }\n\n // Pressed state (unselected)\n &.pressed {\n background: $color-green-300;\n border-color: $color-green-600;\n }\n\n // Selected (checked) state\n &.checked {\n background: $color-green-600;\n border-color: $color-green-600;\n\n &.hover {\n background: $color-green-100;\n border-color: $color-green-600;\n\n .check-icon {\n color: $color-green-600;\n }\n }\n\n &.focus {\n background: $color-green-200;\n border-color: $color-green-600;\n box-shadow: 0 0 0 3px rgba($color-green-600, $focus-ring-opacity);\n\n .check-icon {\n color: $color-green-600;\n }\n }\n\n &.pressed {\n background: $color-green-300;\n border-color: $color-green-600;\n\n .check-icon {\n color: $color-green-600;\n }\n }\n }\n\n // Indeterminate state\n &.indeterminate {\n background: $color-green-600;\n border-color: $color-green-600;\n\n &.hover {\n background: $color-green-100;\n border-color: $color-green-600;\n\n .indeterminate-icon {\n color: $color-green-600;\n }\n }\n\n &.focus {\n background: $color-green-200;\n border-color: $color-green-600;\n box-shadow: 0 0 0 3px rgba($color-green-600, $focus-ring-opacity);\n\n .indeterminate-icon {\n color: $color-green-600;\n }\n }\n\n &.pressed {\n background: $color-green-300;\n border-color: $color-green-600;\n\n .indeterminate-icon {\n color: $color-green-600;\n }\n }\n }\n\n // Error state (unselected)\n &.error {\n border-color: $color-red-500;\n\n &.hover {\n background: $color-red-100;\n border-color: $color-red-500;\n }\n\n &.focus {\n background: $color-red-200;\n border-color: $color-red-500;\n box-shadow: 0 0 0 3px rgba($color-red-500, $focus-ring-opacity);\n }\n\n &.pressed {\n background: $color-red-300;\n border-color: $color-red-500;\n }\n\n // Error + checked\n &.checked {\n background: $color-red-500;\n border-color: $color-red-500;\n\n &.hover {\n background: $color-red-100;\n border-color: $color-red-500;\n\n .check-icon {\n color: $color-red-500;\n }\n }\n\n &.focus {\n background: $color-red-200;\n border-color: $color-red-500;\n box-shadow: 0 0 0 3px rgba($color-red-500, $focus-ring-opacity);\n\n .check-icon {\n color: $color-red-500;\n }\n }\n\n &.pressed {\n background: $color-red-300;\n border-color: $color-red-500;\n\n .check-icon {\n color: $color-red-500;\n }\n }\n }\n\n // Error + indeterminate\n &.indeterminate {\n background: $color-red-500;\n border-color: $color-red-500;\n\n &.hover {\n background: $color-red-100;\n border-color: $color-red-500;\n\n .indeterminate-icon {\n color: $color-red-500;\n }\n }\n\n &.focus {\n background: $color-red-200;\n border-color: $color-red-500;\n box-shadow: 0 0 0 3px rgba($color-red-500, $focus-ring-opacity);\n\n .indeterminate-icon {\n color: $color-red-500;\n }\n }\n\n &.pressed {\n background: $color-red-300;\n border-color: $color-red-500;\n\n .indeterminate-icon {\n color: $color-red-500;\n }\n }\n }\n }\n\n // Disabled state\n &.disabled {\n opacity: $disabled-opacity;\n cursor: not-allowed;\n border-color: $color-gray-400;\n background: $color-white;\n\n &.checked,\n &.indeterminate {\n background: $color-gray-400;\n border-color: $color-gray-400;\n }\n }\n}\n\n.check-icon,\n.indeterminate-icon {\n width: $icon-size;\n height: $icon-size;\n color: $color-white;\n}\n\n.label {\n font-size: 14px;\n color: $color-gray-700;\n user-select: none;\n\n .checkbox.disabled~& {\n opacity: $disabled-opacity;\n }\n}","import { Component, Prop, State, Event, EventEmitter, h, Watch } from '@stencil/core';\n\n@Component({\n tag: 'xplor-checkbox',\n styleUrl: 'xplor-checkbox.scss',\n shadow: true,\n})\nexport class XplorCheckbox {\n @Prop() initialChecked: boolean = false;\n @Prop() initialIndeterminate: boolean = false;\n\n @Prop() disabled: boolean = false;\n @Prop() error: boolean = false;\n @Prop() label: string = '';\n\n @State() checked: boolean = false;\n @State() indeterminate: boolean = false;\n @State() isHovered: boolean = false;\n @State() isFocused: boolean = false;\n @State() isPressed: boolean = false;\n\n @Event() checkboxChange: EventEmitter<{ checked: boolean; indeterminate: boolean }>;\n\n @Watch('initialChecked')\n watchCheckedProp(newValue: boolean) {\n this.checked = newValue;\n }\n\n @Watch('initialIndeterminate')\n watchIndeterminateProp(newValue: boolean) {\n this.indeterminate = newValue;\n }\n\n componentWillLoad() {\n this.checked = this.initialChecked;\n this.indeterminate = this.initialIndeterminate;\n } private handleClick = () => {\n if (this.disabled) return;\n\n if (this.indeterminate) {\n // If indeterminate, go to checked state\n this.indeterminate = false;\n this.checked = true;\n } else {\n // Toggle between checked and unchecked\n this.checked = !this.checked;\n }\n\n this.checkboxChange.emit({\n checked: this.checked,\n indeterminate: this.indeterminate\n });\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (this.disabled) return;\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n this.isPressed = true;\n this.handleClick();\n }\n };\n\n private handleKeyUp = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') {\n this.isPressed = false;\n }\n };\n\n private getCheckboxClass = () => {\n const classes = ['checkbox'];\n\n if (this.checked) classes.push('checked');\n if (this.indeterminate) classes.push('indeterminate');\n if (this.disabled) classes.push('disabled');\n if (this.error) classes.push('error');\n if (this.isHovered && !this.disabled) classes.push('hover');\n if (this.isFocused && !this.disabled) classes.push('focus');\n if (this.isPressed && !this.disabled) classes.push('pressed');\n\n return classes.join(' ');\n };\n\n render() {\n return (\n <div class=\"checkbox-wrapper\">\n <div\n class={this.getCheckboxClass()}\n onClick={this.handleClick}\n onMouseEnter={() => this.isHovered = true}\n onMouseLeave={() => this.isHovered = false}\n onMouseDown={() => this.isPressed = true}\n onMouseUp={() => this.isPressed = false}\n onFocus={() => this.isFocused = true}\n onBlur={() => this.isFocused = false}\n onKeyDown={this.handleKeyDown}\n onKeyUp={this.handleKeyUp}\n tabIndex={this.disabled ? -1 : 0}\n role=\"checkbox\"\n aria-checked={this.indeterminate ? 'mixed' : this.checked.toString()}\n aria-disabled={this.disabled.toString()}\n >\n {this.checked && (\n <svg class=\"check-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.3334 4L6.00002 11.3333L2.66669 8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n )}\n {this.indeterminate && (\n <svg class=\"indeterminate-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.33331 8H12.6666\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n )}\n </div>\n {this.label && <span class=\"label\">{this.label}</span>}\n </div>\n );\n }\n}",":host {\n display: block;\n width: 100%;\n}\n\n.combobox {\n position: relative;\n width: 100%;\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &--readonly {\n .combobox__input {\n background-color: #f5f5f5;\n }\n }\n}\n\n.combobox__label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #424242;\n margin-bottom: 0.5rem;\n}\n\n.combobox__input-wrapper {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n border: 1px solid #bdbdbd;\n border-radius: 4px;\n padding: 0.5rem;\n background-color: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n\n &:focus-within {\n border-color: #1976d2;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n }\n}\n\n.combobox__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.combobox__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background-color: #e8f5e9;\n border-radius: 16px;\n font-size: 0.875rem;\n color: #2e7d32;\n}\n\n.combobox__chip-label {\n line-height: 1;\n}\n\n.combobox__chip-remove {\n background: none;\n border: none;\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #2e7d32;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover:not(:disabled) {\n background-color: rgba(46, 125, 50, 0.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.combobox__input {\n flex: 1;\n min-width: 120px;\n border: none;\n outline: none;\n font-family: inherit;\n font-size: 1rem;\n padding: 0.25rem;\n background: transparent;\n color: #212121;\n\n &::placeholder {\n color: #9e9e9e;\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n &[readonly] {\n cursor: default;\n }\n}\n\n.combobox__actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n flex-shrink: 0;\n}\n\n.combobox__clear {\n background: none;\n border: none;\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: #f5f5f5;\n color: #212121;\n }\n}\n\n.combobox__icon {\n font-size: 0.75rem;\n color: #757575;\n pointer-events: none;\n transition: transform 0.2s;\n\n .combobox--open & {\n transform: rotate(180deg);\n }\n}\n\n.combobox__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n max-height: 300px;\n overflow-y: auto;\n background-color: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n}\n\n.combobox__item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background-color 0.2s;\n color: #212121;\n\n &:hover:not(&--disabled) {\n background-color: #f5f5f5;\n }\n\n &--highlighted {\n background-color: #e3f2fd;\n }\n\n &--selected {\n background-color: #1976d2;\n color: #fff;\n\n &:hover {\n background-color: #1565c0;\n }\n }\n\n &--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &--create {\n background-color: #fff9c4;\n border-top: 1px solid #e0e0e0;\n\n &:hover {\n background-color: #fff59d;\n }\n\n &.combobox__item--highlighted {\n background-color: #fff176;\n }\n }\n}\n\n.combobox__create-label {\n color: #757575;\n font-size: 0.875rem;\n}\n\n.combobox__no-results {\n padding: 1rem;\n text-align: center;\n color: #757575;\n font-size: 0.875rem;\n}","import { Component, Host, h, Prop, State, Event, EventEmitter, Element, Listen } from '@stencil/core';\n\nexport interface ComboboxItem {\n label: string;\n value: any;\n disabled?: boolean;\n [key: string]: any;\n}\n\n@Component({\n tag: 'xplor-combobox',\n styleUrl: 'xplor-combobox.scss',\n scoped: true,\n})\nexport class XplorCombobox {\n @Element() el: HTMLElement;\n\n /**\n * Array of items to display in the dropdown\n */\n @Prop() items: ComboboxItem[] = [];\n\n /**\n * Selected value(s)\n */\n @Prop({ mutable: true }) value: any = null;\n\n /**\n * Placeholder text\n */\n @Prop() placeholder: string = 'Type to search or add...';\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Disable the combobox\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Make the combobox readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Clear button\n */\n @Prop() clearable: boolean = false;\n\n /**\n * Allow multiple selection\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Allow creating new items\n */\n @Prop() allowCustom: boolean = true;\n\n /**\n * Message to display when creating new item\n */\n @Prop() createMessage: string = 'Create';\n\n @State() isOpen: boolean = false;\n @State() searchQuery: string = '';\n @State() filteredItems: ComboboxItem[] = [];\n @State() selectedItems: any[] = [];\n @State() highlightedIndex: number = -1;\n @State() customItems: ComboboxItem[] = [];\n\n @Event() xplorChange: EventEmitter<any>;\n @Event() xplorSelect: EventEmitter<ComboboxItem>;\n @Event() xplorCreate: EventEmitter<string>;\n @Event() xplorClear: EventEmitter<void>;\n @Event() xplorSearch: EventEmitter<string>;\n\n private inputEl: HTMLInputElement;\n private dropdownEl: HTMLDivElement;\n\n componentWillLoad() {\n this.filterItems();\n if (this.value !== null) {\n if (this.multiple && Array.isArray(this.value)) {\n this.selectedItems = this.value;\n } else if (!this.multiple) {\n const allItems = [...this.items, ...this.customItems];\n const selectedItem = allItems.find(item => item.value === this.value);\n if (selectedItem) {\n this.searchQuery = selectedItem.label;\n }\n }\n }\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent) {\n const target = event.target as Node;\n if (!this.el.contains(target)) {\n this.isOpen = false;\n }\n }\n\n private filterItems() {\n const query = this.searchQuery.toLowerCase();\n const allItems = [...this.items, ...this.customItems];\n\n if (query === '') {\n this.filteredItems = allItems;\n return;\n }\n\n this.filteredItems = allItems.filter(item =>\n item.label.toLowerCase().includes(query)\n );\n }\n\n private canCreateNew(): boolean {\n if (!this.allowCustom || this.searchQuery.trim() === '') {\n return false;\n }\n\n const allItems = [...this.items, ...this.customItems];\n const exactMatch = allItems.some(\n item => item.label.toLowerCase() === this.searchQuery.toLowerCase()\n );\n\n return !exactMatch;\n }\n\n private handleInputFocus = () => {\n if (this.disabled || this.readonly) return;\n this.isOpen = true;\n this.highlightedIndex = -1;\n };\n\n private handleInputChange = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.searchQuery = input.value;\n this.filterItems();\n this.isOpen = true;\n this.highlightedIndex = -1;\n this.xplorSearch.emit(this.searchQuery);\n\n if (!this.multiple && this.searchQuery === '') {\n this.value = null;\n this.xplorChange.emit(null);\n }\n };\n\n private handleInputKeyDown = (event: KeyboardEvent) => {\n if (this.disabled || this.readonly) return;\n\n const totalItems = this.filteredItems.length + (this.canCreateNew() ? 1 : 0);\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.isOpen = true;\n this.highlightedIndex = Math.min(this.highlightedIndex + 1, totalItems - 1);\n this.scrollToHighlighted();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.highlightedIndex = Math.max(this.highlightedIndex - 1, -1);\n this.scrollToHighlighted();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.highlightedIndex >= 0) {\n if (this.highlightedIndex < this.filteredItems.length) {\n this.selectItem(this.filteredItems[this.highlightedIndex]);\n } else if (this.canCreateNew()) {\n this.createNewItem();\n }\n } else if (this.canCreateNew() && this.searchQuery.trim() !== '') {\n this.createNewItem();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen = false;\n this.inputEl?.blur();\n break;\n\n case 'Backspace':\n if (this.multiple && this.searchQuery === '' && this.selectedItems.length > 0) {\n event.preventDefault();\n this.removeItem(this.selectedItems[this.selectedItems.length - 1]);\n }\n break;\n }\n };\n\n private scrollToHighlighted() {\n if (this.dropdownEl && this.highlightedIndex >= 0) {\n const highlightedEl = this.dropdownEl.querySelector(`[data-index=\"${this.highlightedIndex}\"]`) as HTMLElement;\n if (highlightedEl) {\n highlightedEl.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n private selectItem(item: ComboboxItem) {\n if (item.disabled) return;\n\n if (this.multiple) {\n if (!this.selectedItems.includes(item.value)) {\n this.selectedItems = [...this.selectedItems, item.value];\n this.value = this.selectedItems;\n this.xplorChange.emit(this.value);\n }\n this.searchQuery = '';\n this.filterItems();\n } else {\n this.value = item.value;\n this.searchQuery = item.label;\n this.isOpen = false;\n this.xplorChange.emit(this.value);\n }\n\n this.xplorSelect.emit(item);\n this.inputEl?.focus();\n }\n\n private createNewItem() {\n const newValue = this.searchQuery.trim();\n const newItem: ComboboxItem = {\n label: newValue,\n value: newValue,\n };\n\n this.customItems = [...this.customItems, newItem];\n this.selectItem(newItem);\n this.xplorCreate.emit(newValue);\n }\n\n private removeItem(value: any) {\n this.selectedItems = this.selectedItems.filter(v => v !== value);\n this.value = this.selectedItems;\n this.xplorChange.emit(this.value);\n }\n\n private handleClear = () => {\n this.value = this.multiple ? [] : null;\n this.selectedItems = [];\n this.searchQuery = '';\n this.filterItems();\n this.xplorChange.emit(this.value);\n this.xplorClear.emit();\n this.inputEl?.focus();\n };\n\n private getSelectedItemLabel(value: any): string {\n const allItems = [...this.items, ...this.customItems];\n const item = allItems.find(i => i.value === value);\n return item ? item.label : value;\n }\n\n render() {\n const hasValue = this.multiple ? this.selectedItems.length > 0 : this.value !== null && this.searchQuery !== '';\n const showCreateOption = this.canCreateNew();\n\n return (\n <Host>\n <div\n class={{\n 'combobox': true,\n 'combobox--disabled': this.disabled,\n 'combobox--readonly': this.readonly,\n 'combobox--open': this.isOpen,\n }}\n >\n {this.label && (\n <label class=\"combobox__label\">{this.label}</label>\n )}\n\n <div class=\"combobox__input-wrapper\">\n {this.multiple && this.selectedItems.length > 0 && (\n <div class=\"combobox__chips\">\n {this.selectedItems.map(value => (\n <div class=\"combobox__chip\">\n <span class=\"combobox__chip-label\">\n {this.getSelectedItemLabel(value)}\n </span>\n <button\n type=\"button\"\n class=\"combobox__chip-remove\"\n onClick={() => this.removeItem(value)}\n disabled={this.disabled || this.readonly}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n\n <input\n ref={(el) => (this.inputEl = el)}\n type=\"text\"\n class=\"combobox__input\"\n placeholder={this.placeholder}\n value={this.searchQuery}\n onFocus={this.handleInputFocus}\n onInput={this.handleInputChange}\n onKeyDown={this.handleInputKeyDown}\n disabled={this.disabled}\n readonly={this.readonly}\n autocomplete=\"off\"\n />\n\n <div class=\"combobox__actions\">\n {this.clearable && hasValue && !this.disabled && !this.readonly && (\n <button\n type=\"button\"\n class=\"combobox__clear\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n ×\n </button>\n )}\n <span class=\"combobox__icon\">▼</span>\n </div>\n </div>\n\n {this.isOpen && (this.filteredItems.length > 0 || showCreateOption) && (\n <div class=\"combobox__dropdown\" ref={(el) => (this.dropdownEl = el)}>\n {this.filteredItems.map((item, index) => (\n <div\n key={item.value}\n data-index={index}\n class={{\n 'combobox__item': true,\n 'combobox__item--highlighted': index === this.highlightedIndex,\n 'combobox__item--selected': this.multiple\n ? this.selectedItems.includes(item.value)\n : this.value === item.value,\n 'combobox__item--disabled': item.disabled,\n }}\n onClick={() => this.selectItem(item)}\n >\n {item.label}\n </div>\n ))}\n\n {showCreateOption && (\n <div\n data-index={this.filteredItems.length}\n class={{\n 'combobox__item': true,\n 'combobox__item--create': true,\n 'combobox__item--highlighted': this.highlightedIndex === this.filteredItems.length,\n }}\n onClick={() => this.createNewItem()}\n >\n <span class=\"combobox__create-label\">{this.createMessage}:</span>{' '}\n <strong>\"{this.searchQuery}\"</strong>\n </div>\n )}\n </div>\n )}\n\n {this.isOpen && this.filteredItems.length === 0 && !showCreateOption && (\n <div class=\"combobox__dropdown\">\n <div class=\"combobox__no-results\">No results found</div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n width: 100%;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n}\n\n.datatable-container {\n background: white;\n border: 1px solid #e3e4e5;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.table-wrapper {\n width: 100%;\n overflow: auto;\n position: relative;\n\n &.has-height {\n max-height: 100%;\n }\n\n &.is-empty {\n min-height: 200px;\n }\n}\n\ntable {\n width: 100%;\n border-collapse: collapse;\n background: white;\n\n thead {\n background: #f7f8f9;\n position: sticky;\n top: 0;\n z-index: 10;\n\n tr {\n border-bottom: 1px solid #e3e4e5;\n }\n\n th {\n padding: 12px 16px;\n text-align: left;\n font-size: 0.75rem;\n font-weight: 600;\n color: #1a1a1a;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-right: 1px solid #e3e4e5;\n white-space: nowrap;\n user-select: none;\n\n &:last-child {\n border-right: none;\n }\n\n &.sortable {\n cursor: pointer;\n transition: background-color 0.2s;\n\n &:hover {\n background: #eef0f1;\n }\n }\n\n &.sorted {\n background: #e5e7e9;\n }\n\n &.fixed {\n position: sticky;\n left: 0;\n z-index: 11;\n background: #f7f8f9;\n }\n\n &.align-left {\n text-align: left;\n }\n\n &.align-center {\n text-align: center;\n }\n\n &.align-right {\n text-align: right;\n }\n\n .header-content {\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n }\n\n .sort-icon {\n flex-shrink: 0;\n color: #999;\n transition: color 0.2s;\n\n &.active {\n color: #008480;\n }\n }\n }\n }\n\n tbody {\n tr {\n border-bottom: 1px solid #f0f0f0;\n transition: background-color 0.15s;\n\n &:last-child {\n border-bottom: 1px solid #e3e4e5;\n }\n\n &.clickable {\n cursor: pointer;\n }\n\n &.selected {\n background-color: rgba(0, 132, 128, 0.08);\n\n &:hover {\n background-color: rgba(0, 132, 128, 0.12);\n }\n }\n\n &.empty-row {\n cursor: default;\n\n &:hover {\n background: transparent;\n }\n }\n }\n\n td {\n padding: 12px 16px;\n font-size: 0.875rem;\n color: #333;\n border-right: 1px solid #f0f0f0;\n\n &:last-child {\n border-right: none;\n }\n\n &.align-left {\n text-align: left;\n }\n\n &.align-center {\n text-align: center;\n }\n\n &.align-right {\n text-align: right;\n }\n }\n\n .select-column {\n width: 50px;\n text-align: center;\n position: sticky;\n left: 0;\n background: inherit;\n z-index: 1;\n }\n }\n\n // Horizontal lines variant\n .horizontal-lines & {\n thead th {\n border-right: none;\n }\n\n tbody td {\n border-right: none;\n }\n\n tbody tr {\n border-bottom: 1px solid #e3e4e5;\n }\n }\n\n // Striped variant\n .striped & {\n tbody tr:nth-child(even) {\n background-color: #fafafa;\n\n &.selected {\n background-color: rgba(0, 132, 128, 0.08);\n }\n }\n }\n\n // Hover effect\n &.hover tbody tr:not(.empty-row):hover {\n background-color: #f5f5f5;\n\n &.selected {\n background-color: rgba(0, 132, 128, 0.12);\n }\n }\n}\n\n// Checkbox styling\n.checkbox-label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n cursor: pointer;\n\n input[type='checkbox'] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: #008480;\n margin: 0;\n }\n}\n\n// Empty state\n.empty-state {\n text-align: center;\n padding: 40px 20px;\n color: #999;\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n}\n\n// Skeleton loader\n.skeleton-loader {\n tr {\n cursor: default !important;\n\n &:hover {\n background: transparent !important;\n }\n }\n\n .skeleton {\n background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\n background-size: 200% 100%;\n animation: skeleton-loading 1.5s ease-in-out infinite;\n border-radius: 4px;\n\n &-text {\n height: 16px;\n width: 80%;\n }\n\n &-checkbox {\n height: 18px;\n width: 18px;\n margin: 0 auto;\n }\n }\n}\n\n@keyframes skeleton-loading {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -200% 0;\n }\n}\n\n// Footer\n.datatable-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid #e3e4e5;\n background: #fafafa;\n flex-wrap: wrap;\n gap: 16px;\n\n .footer-info {\n font-size: 0.875rem;\n color: #666;\n }\n\n .footer-controls {\n display: flex;\n align-items: center;\n gap: 24px;\n flex-wrap: wrap;\n }\n\n .per-page-selector {\n label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.875rem;\n color: #666;\n }\n\n select {\n padding: 4px 8px;\n border: 1px solid #d0d0d0;\n border-radius: 4px;\n background: white;\n font-size: 0.875rem;\n cursor: pointer;\n transition: border-color 0.2s;\n\n &:hover {\n border-color: #008480;\n }\n\n &:focus {\n outline: none;\n border-color: #008480;\n box-shadow: 0 0 0 2px rgba(0, 132, 128, 0.1);\n }\n }\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n\n .page-info {\n font-size: 0.875rem;\n color: #333;\n padding: 0 8px;\n }\n\n .pagination-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid #d0d0d0;\n border-radius: 4px;\n background: white;\n color: #333;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover:not(:disabled) {\n border-color: #008480;\n background: #f0fffe;\n color: #008480;\n }\n\n &:active:not(:disabled) {\n background: #e0f9f8;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n }\n}\n\n// Responsive adjustments\n@media (max-width: 768px) {\n .datatable-footer {\n flex-direction: column;\n align-items: stretch;\n\n .footer-controls {\n justify-content: space-between;\n }\n }\n}","import {\n Component,\n Prop,\n State,\n Element,\n Event,\n EventEmitter,\n h,\n Watch,\n Host,\n} from '@stencil/core';\n\nexport interface DatatableColumn {\n text: string;\n value: string;\n sortable?: boolean;\n width?: string | number;\n align?: 'left' | 'center' | 'right';\n fixed?: boolean;\n}\n\nexport interface DatatablePagination {\n page: number;\n perpage: number;\n total: number;\n pages?: number;\n}\n\n@Component({\n tag: 'xplor-datatable',\n styleUrl: 'xplor-datatable.scss',\n shadow: true,\n})\nexport class XplorDatatable {\n @Element() el: HTMLXplorDatatableElement;\n\n /**\n * Array of column definitions for the table headers\n */\n @Prop() headers: DatatableColumn[] = [];\n\n /**\n * Array of data items to display in the table\n */\n @Prop() items: any[] = [];\n\n /**\n * Whether the table is in a loading state\n */\n @Prop() loading: boolean = false;\n\n /**\n * Pagination configuration object\n */\n @Prop() pagination: DatatablePagination = {\n page: 1,\n perpage: 10,\n total: 0,\n };\n\n /**\n * Array of selected items (for multiselect)\n */\n @Prop() selected: any[] = [];\n\n /**\n * Enable row selection with checkboxes\n */\n @Prop() canSelect: boolean = false;\n\n /**\n * Enable horizontal lines between rows\n */\n @Prop() horizontalLines: boolean = true;\n\n /**\n * Enable striped row styling\n */\n @Prop() striped: boolean = false;\n\n /**\n * Fixed header height (e.g., \"400px\" or 400)\n */\n @Prop() height?: string | number;\n\n /**\n * Show skeleton loader when loading\n */\n @Prop() skeletonLoader: boolean = true;\n\n /**\n * Enable hover effect on rows\n */\n @Prop() hover: boolean = true;\n\n /**\n * Per page options for pagination\n */\n @Prop() perPageOptions: number[] = [10, 25, 50, 100];\n\n /**\n * Emitted when a row is clicked\n */\n @Event() rowClick: EventEmitter<any>;\n\n /**\n * Emitted when row selection changes\n */\n @Event() xplorSelectionChange: EventEmitter<any[]>;\n\n /**\n * Emitted when pagination changes\n */\n @Event() paginationChange: EventEmitter<DatatablePagination>;\n\n /**\n * Emitted when sorting changes\n */\n @Event() sortChange: EventEmitter<{ column: string; direction: 'asc' | 'desc' | null }>;\n\n @State() sortBy: string | null = null;\n @State() sortDirection: 'asc' | 'desc' | null = null;\n @State() internalSelected: Set<any> = new Set();\n @State() allSelected: boolean = false;\n\n componentWillLoad() {\n this.internalSelected = new Set(this.selected);\n }\n\n @Watch('selected')\n watchSelected(newSelected: any[]) {\n this.internalSelected = new Set(newSelected);\n this.updateAllSelectedState();\n }\n\n @Watch('items')\n watchItems() {\n this.updateAllSelectedState();\n }\n\n private updateAllSelectedState() {\n if (this.items.length === 0) {\n this.allSelected = false;\n return;\n }\n this.allSelected = this.items.every(item => this.internalSelected.has(item));\n }\n\n private handleSort = (column: DatatableColumn) => {\n if (column.sortable === false) return;\n\n if (this.sortBy === column.value) {\n // Cycle through: asc -> desc -> null\n if (this.sortDirection === 'asc') {\n this.sortDirection = 'desc';\n } else if (this.sortDirection === 'desc') {\n this.sortDirection = null;\n this.sortBy = null;\n }\n } else {\n this.sortBy = column.value;\n this.sortDirection = 'asc';\n }\n\n this.sortChange.emit({\n column: this.sortBy,\n direction: this.sortDirection,\n });\n };\n\n private handleSelectAll = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const checked = target.checked;\n\n if (checked) {\n this.items.forEach(item => this.internalSelected.add(item));\n } else {\n this.internalSelected.clear();\n }\n\n this.allSelected = checked;\n this.internalSelected = new Set(this.internalSelected);\n this.xplorSelectionChange.emit(Array.from(this.internalSelected));\n };\n\n private handleSelectOne = (e: Event, item: any) => {\n const target = e.target as HTMLInputElement;\n const checked = target.checked;\n\n if (checked) {\n this.internalSelected.add(item);\n } else {\n this.internalSelected.delete(item);\n }\n\n this.internalSelected = new Set(this.internalSelected);\n this.updateAllSelectedState();\n this.xplorSelectionChange.emit(Array.from(this.internalSelected));\n };\n\n private handleRowClick = (item: any, e: MouseEvent) => {\n // Don't trigger row click if clicking on checkbox or interactive elements\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.closest('input')) {\n return;\n }\n\n this.rowClick.emit(item);\n };\n\n private handlePageChange = (newPage: number) => {\n const updatedPagination = {\n ...this.pagination,\n page: newPage,\n };\n this.paginationChange.emit(updatedPagination);\n };\n\n private handlePerPageChange = (e: Event) => {\n const target = e.target as HTMLSelectElement;\n const perpage = parseInt(target.value, 10);\n if (!isNaN(perpage)) {\n const updatedPagination = {\n ...this.pagination,\n page: 1, // Reset to first page\n perpage,\n };\n this.paginationChange.emit(updatedPagination);\n }\n };\n\n private getSortIcon(column: DatatableColumn) {\n if (this.sortBy !== column.value) {\n return (\n <svg class=\"sort-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L11 6H5L8 3Z\" fill=\"currentColor\" opacity=\"0.3\" />\n <path d=\"M8 13L5 10H11L8 13Z\" fill=\"currentColor\" opacity=\"0.3\" />\n </svg>\n );\n }\n\n if (this.sortDirection === 'asc') {\n return (\n <svg class=\"sort-icon active\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L11 6H5L8 3Z\" fill=\"currentColor\" />\n <path d=\"M8 13L5 10H11L8 13Z\" fill=\"currentColor\" opacity=\"0.3\" />\n </svg>\n );\n }\n\n return (\n <svg class=\"sort-icon active\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L11 6H5L8 3Z\" fill=\"currentColor\" opacity=\"0.3\" />\n <path d=\"M8 13L5 10H11L8 13Z\" fill=\"currentColor\" />\n </svg>\n );\n };\n\n private renderSkeletonLoader() {\n return (\n <tbody class=\"skeleton-loader\">\n {Array.from({ length: this.pagination.perpage }).map(() => (\n <tr>\n {this.canSelect && (\n <td>\n <div class=\"skeleton skeleton-checkbox\"></div>\n </td>\n )}\n {this.headers.map(() => (\n <td>\n <div class=\"skeleton skeleton-text\"></div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n }\n\n private renderPagination() {\n const totalPages = Math.ceil(this.pagination.total / this.pagination.perpage);\n const currentPage = this.pagination.page;\n const start = (currentPage - 1) * this.pagination.perpage + 1;\n const end = Math.min(currentPage * this.pagination.perpage, this.pagination.total);\n\n return (\n <div class=\"datatable-footer\">\n <div class=\"footer-info\">\n {this.pagination.total > 0 ? (\n <span>\n Showing {start} to {end} of {this.pagination.total} entries\n </span>\n ) : (\n <span>No entries</span>\n )}\n </div>\n\n <div class=\"footer-controls\">\n <div class=\"per-page-selector\">\n <label>\n Rows per page:\n <select onInput={this.handlePerPageChange}>\n {this.perPageOptions.map(option => (\n <option value={option} selected={option === this.pagination.perpage}>{option}</option>\n ))}\n </select>\n </label>\n </div>\n\n <div class=\"pagination-controls\">\n <button\n class=\"pagination-btn\"\n disabled={currentPage === 1}\n onClick={() => this.handlePageChange(1)}\n aria-label=\"First page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11 12L7 8L11 4M5 4V12\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n </button>\n\n <button\n class=\"pagination-btn\"\n disabled={currentPage === 1}\n onClick={() => this.handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n </button>\n\n <span class=\"page-info\">\n Page {currentPage} of {totalPages || 1}\n </span>\n\n <button\n class=\"pagination-btn\"\n disabled={currentPage >= totalPages}\n onClick={() => this.handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n </button>\n\n <button\n class=\"pagination-btn\"\n disabled={currentPage >= totalPages}\n onClick={() => this.handlePageChange(totalPages)}\n aria-label=\"Last page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M5 4L9 8L5 12M11 4V12\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n render() {\n const tableHeight = typeof this.height === 'number' ? `${this.height}px` : this.height;\n const hasHeight = !!this.height;\n\n return (\n <Host class=\"xplor-datatable\">\n <div class=\"datatable-container\">\n <div\n class={{\n 'table-wrapper': true,\n 'has-height': hasHeight,\n 'horizontal-lines': this.horizontalLines,\n 'striped': this.striped,\n 'is-empty': this.items.length === 0,\n }}\n style={hasHeight ? { height: tableHeight } : {}}\n >\n <table class={{ 'hover': this.hover }}>\n <thead>\n <tr>\n {this.canSelect && (\n <th class=\"select-column\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n checked={this.allSelected}\n indeterminate={\n this.internalSelected.size > 0 &&\n this.internalSelected.size < this.items.length\n }\n onChange={this.handleSelectAll}\n />\n </label>\n </th>\n )}\n {this.headers.map(header => (\n <th\n class={{\n sortable: header.sortable !== false,\n sorted: this.sortBy === header.value,\n fixed: header.fixed,\n [`align-${header.align || 'left'}`]: true,\n }}\n style={header.width ? { width: typeof header.width === 'number' ? `${header.width}px` : header.width } : {}}\n onClick={() => header.sortable !== false && this.handleSort(header)}\n >\n <div class=\"header-content\">\n <span>{header.text}</span>\n {header.sortable !== false && this.getSortIcon(header)}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n {this.loading && this.skeletonLoader ? (\n this.renderSkeletonLoader()\n ) : (\n <tbody>\n {this.items.length === 0 ? (\n <tr class=\"empty-row\">\n <td colSpan={this.headers.length + (this.canSelect ? 1 : 0)}>\n <div class=\"empty-state\">\n <p>No data available</p>\n </div>\n </td>\n </tr>\n ) : (\n this.items.map(item => {\n const isSelected = this.internalSelected.has(item);\n return (\n <tr\n class={{\n selected: isSelected,\n clickable: true,\n }}\n onClick={(e) => this.handleRowClick(item, e)}\n >\n {this.canSelect && (\n <td class=\"select-column\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => this.handleSelectOne(e, item)}\n />\n </label>\n </td>\n )}\n {this.headers.map(header => (\n <td class={`align-${header.align || 'left'}`}>\n <slot name={`item.${header.value}`}>\n {item[header.value]}\n </slot>\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n )}\n </table>\n </div>\n\n {this.pagination && this.pagination.total > 0 && this.renderPagination()}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n width: 100%;\n}\n\n.date-picker {\n position: relative;\n width: 100%;\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &__label {\n display: block;\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 position: relative;\n display: flex;\n align-items: center;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n transition: border-color 0.2s ease;\n background: white;\n\n &:focus-within {\n border-color: #008480;\n border-width: 2px;\n\n .date-picker__input {\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n }\n\n &--error &__field {\n border-color: #d32f2f;\n }\n\n &__input {\n flex: 1;\n width: 100%;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: none;\n border-radius: 1rem;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding-right: 0.5rem;\n flex-shrink: 0;\n }\n\n &__clear {\n background: none;\n border: none;\n font-size: 1.25rem;\n cursor: pointer;\n padding: 0;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: #f5f5f5;\n color: #212121;\n }\n }\n\n &__icon-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover:not(:disabled) {\n background-color: #f5f5f5;\n color: #212121;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n &__icon-svg {\n display: block;\n }\n\n &__text-display {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n padding: 0.5rem;\n border-radius: 4px;\n color: #008480;\n font-size: 1rem;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: rgba(0, 132, 128, 0.08);\n }\n }\n\n &__text-value {\n text-decoration: underline;\n }\n\n &__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n background-color: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n\n &--top {\n top: auto;\n bottom: calc(100% + 4px);\n }\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","import { Component, Host, h, Prop, State, Event, EventEmitter, Element, Listen } from '@stencil/core';\n\n@Component({\n tag: 'xplor-date-picker',\n styleUrl: 'xplor-date-picker.scss',\n scoped: true,\n})\nexport class XplorDatePicker {\n @Element() el: HTMLElement;\n\n /** Selected date in YYYY-MM-DD format */\n @Prop({ mutable: true }) value: string = '';\n\n @Prop() label: string = '';\n @Prop() placeholder: string = 'Select date';\n\n /** 'date' or 'month' */\n @Prop() type: 'date' | 'month' = 'date';\n\n /** For month type: select start or end of month */\n @Prop() monthType: 'start' | 'end' = 'start';\n\n /** 'input' shows text input, 'text' shows clickable text */\n @Prop() display: 'input' | 'text' = 'input';\n\n /** Date display format: 'short' (DD/MM/YYYY), 'long' (1 Jan 2025), 'iso' (YYYY-MM-DD) */\n @Prop() dateFormat: 'short' | 'long' | 'iso' = 'short';\n\n @Prop() min: string = '';\n @Prop() max: string = '';\n @Prop() readonly: boolean = false;\n @Prop() disabled: boolean = false;\n @Prop() clearable: boolean = false;\n @Prop() closeOnSelect: boolean = true;\n @Prop() bgColor: string = 'white';\n @Prop() color: string = '#008480';\n @Prop() startWeekOnSunday: boolean = true;\n @Prop() error: string = '';\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n @Prop() required: boolean = false;\n\n @State() isOpen: boolean = false;\n @State() inputText: string = '';\n @State() dropdownPosition: 'bottom' | 'top' = 'bottom';\n\n @Event() dateChange: EventEmitter<string>;\n @Event() xplorFocus: EventEmitter<FocusEvent>;\n @Event() xplorBlur: EventEmitter<FocusEvent>;\n @Event() xplorClear: EventEmitter<void>;\n\n componentWillLoad() {\n if (this.value) {\n this.inputText = this.formatDateForDisplay(this.value);\n }\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent) {\n const target = event.target as Node;\n if (!this.el.contains(target)) {\n this.isOpen = false;\n }\n }\n\n /** Parse YYYY-MM-DD safely without UTC shift */\n private parseISODate(iso: string): Date | null {\n if (!iso) return null;\n const d = new Date(iso + 'T00:00:00');\n return isNaN(d.getTime()) ? null : d;\n }\n\n private formatDateForDisplay(iso: string): string {\n const date = this.parseISODate(iso);\n if (!date) return iso;\n\n if (this.type === 'month') {\n return new Intl.DateTimeFormat('en-AU', { month: 'long', year: 'numeric' }).format(date);\n }\n\n switch (this.dateFormat) {\n case 'long':\n return new Intl.DateTimeFormat('en-AU', { day: 'numeric', month: 'short', year: 'numeric' }).format(date);\n case 'iso':\n return iso;\n case 'short':\n default:\n return new Intl.DateTimeFormat('en-AU', { day: '2-digit', month: '2-digit', year: 'numeric' }).format(date);\n }\n }\n\n private toISO(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n /** Parse user-typed text into YYYY-MM-DD */\n private parseInputText(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n // Try DD/MM/YYYY\n const slashMatch = trimmed.match(/^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/);\n if (slashMatch) {\n const day = parseInt(slashMatch[1], 10);\n const month = parseInt(slashMatch[2], 10);\n const year = parseInt(slashMatch[3], 10);\n const d = new Date(year, month - 1, day);\n if (d.getFullYear() === year && d.getMonth() === month - 1 && d.getDate() === day) {\n return this.toISO(d);\n }\n }\n\n // Try YYYY-MM-DD\n const isoMatch = trimmed.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n if (isoMatch) {\n const year = parseInt(isoMatch[1], 10);\n const month = parseInt(isoMatch[2], 10);\n const day = parseInt(isoMatch[3], 10);\n const d = new Date(year, month - 1, day);\n if (d.getFullYear() === year && d.getMonth() === month - 1 && d.getDate() === day) {\n return this.toISO(d);\n }\n }\n\n // Try natural string via Date.parse\n const d = new Date(trimmed);\n if (!isNaN(d.getTime())) {\n return this.toISO(d);\n }\n\n return null;\n }\n\n private isDateInRange(iso: string): boolean {\n if (!iso) return true;\n if (this.min && iso < this.min) return false;\n if (this.max && iso > this.max) return false;\n return true;\n }\n\n private updateDropdownPosition() {\n const rect = this.el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n this.dropdownPosition = spaceBelow < 350 ? 'top' : 'bottom';\n }\n\n private toggleDropdown = () => {\n if (this.disabled || this.readonly) return;\n this.updateDropdownPosition();\n this.isOpen = !this.isOpen;\n };\n\n private handleInputFocus = (event: FocusEvent) => {\n this.xplorFocus.emit(event);\n };\n\n private handleInputBlur = (event: FocusEvent) => {\n this.xplorBlur.emit(event);\n // Try to parse typed text\n const parsed = this.parseInputText(this.inputText);\n if (parsed && this.isDateInRange(parsed)) {\n this.value = parsed;\n this.inputText = this.formatDateForDisplay(parsed);\n this.dateChange.emit(parsed);\n } else if (this.value) {\n // Revert to current value display\n this.inputText = this.formatDateForDisplay(this.value);\n } else {\n this.inputText = '';\n }\n };\n\n private handleInputChange = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.inputText = input.value;\n };\n\n private handleDateSelected = (event: CustomEvent<string>) => {\n event.stopPropagation();\n const iso = event.detail;\n if (!this.isDateInRange(iso)) return;\n\n if (this.type === 'month') {\n const d = this.parseISODate(iso);\n if (d) {\n let finalDate: Date;\n if (this.monthType === 'end') {\n finalDate = new Date(d.getFullYear(), d.getMonth() + 1, 0);\n } else {\n finalDate = new Date(d.getFullYear(), d.getMonth(), 1);\n }\n const finalIso = this.toISO(finalDate);\n this.value = finalIso;\n this.inputText = this.formatDateForDisplay(finalIso);\n this.dateChange.emit(finalIso);\n }\n } else {\n this.value = iso;\n this.inputText = this.formatDateForDisplay(iso);\n this.dateChange.emit(iso);\n }\n\n if (this.closeOnSelect) {\n this.isOpen = false;\n }\n };\n\n private handleClear = (event: Event) => {\n event.stopPropagation();\n this.value = '';\n this.inputText = '';\n this.dateChange.emit('');\n this.xplorClear.emit();\n };\n\n private handleTextClick = () => {\n if (this.disabled || this.readonly) return;\n this.updateDropdownPosition();\n this.isOpen = !this.isOpen;\n };\n\n render() {\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && this.error);\n\n const calendarIcon = (\n <svg class=\"date-picker__icon-svg\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\n </svg>\n );\n\n return (\n <Host>\n <div class={{\n 'date-picker': true,\n 'date-picker--disabled': this.disabled,\n 'date-picker--error': !!this.error,\n 'date-picker--open': this.isOpen,\n }}>\n {this.label && (\n <label class=\"date-picker__label\">\n {this.label}\n {this.required && <span class=\"date-picker__required\">*</span>}\n </label>\n )}\n\n {this.display === 'text' ? (\n <div class=\"date-picker__text-display\" onClick={this.handleTextClick}>\n <span class=\"date-picker__text-value\">\n {this.value ? this.formatDateForDisplay(this.value) : this.placeholder}\n </span>\n {calendarIcon}\n </div>\n ) : (\n <div class=\"date-picker__field\">\n <input\n type=\"text\"\n class=\"date-picker__input\"\n value={this.inputText}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n onFocus={this.handleInputFocus}\n onBlur={this.handleInputBlur}\n onInput={this.handleInputChange}\n style={{ backgroundColor: this.bgColor }}\n />\n <div class=\"date-picker__actions\">\n {this.clearable && this.value && !this.disabled && !this.readonly && (\n <button type=\"button\" class=\"date-picker__clear\" onClick={this.handleClear} aria-label=\"Clear\">\n ×\n </button>\n )}\n <button type=\"button\" class=\"date-picker__icon-btn\" onClick={this.toggleDropdown} disabled={this.disabled} aria-label=\"Open calendar\">\n {calendarIcon}\n </button>\n </div>\n </div>\n )}\n\n {showDetails && (\n <div class=\"date-picker__details\">\n {this.error && <div class=\"date-picker__error-message\">{this.error}</div>}\n </div>\n )}\n\n {this.isOpen && (\n <div class={{\n 'date-picker__dropdown': true,\n 'date-picker__dropdown--top': this.dropdownPosition === 'top',\n }}>\n <xplor-inline-date-picker\n selectedDate={this.value}\n min={this.min}\n max={this.max}\n readonly={this.readonly}\n color={this.color}\n startWeekOnSunday={this.startWeekOnSunday}\n onDateSelected={this.handleDateSelected}\n ></xplor-inline-date-picker>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@use '../../styles/colours.scss' as colours;\n@use '../../styles/spacing.scss' as spacing;\n\n:host {\n display: block;\n}\n\n.drag-drop-wrapper {\n position: relative;\n padding-bottom: spacing.$spacing-40;\n}\n\n.drag-drop-input-hidden {\n display: none;\n}\n\n.drag-drop-card {\n background-color: colours.$secondary-50;\n border-radius: 8px;\n border: 3px dashed colours.$gray-300;\n min-height: 240px;\n padding: spacing.$spacing-16 spacing.$spacing-24 spacing.$spacing-40;\n text-align: center;\n transition: all 0.2s ease;\n cursor: default;\n\n &:hover:not(&--disabled) {\n border-color: colours.$secondary;\n }\n\n &--dragover {\n border: 3px dashed colours.$secondary;\n background-color: colours.$secondary-100;\n }\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n.drag-drop-card__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: spacing.$spacing-16;\n padding: spacing.$spacing-8 0 0;\n}\n\n.drag-drop-card__icon {\n color: colours.$secondary;\n width: 68px;\n height: 68px;\n}\n\n.drag-drop-card__title {\n color: colours.$black;\n font-family: Inter, sans-serif;\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n letter-spacing: 0;\n margin: 0;\n}\n\n.drag-drop-card__accepts,\n.drag-drop-card__divider {\n color: colours.$black;\n font-family: Inter, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n margin: 0;\n}\n\n.drag-drop-card__action {\n position: absolute;\n left: 50%;\n bottom: 0;\n transform: translateX(-50%);\n}\n\n.drag-drop-card__file-info {\n margin-top: spacing.$spacing-16;\n color: colours.$gray-700;\n font-family: Inter, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n padding: spacing.$spacing-4;\n text-align: center;\n}\n\n@media (max-width: 768px) {\n .drag-drop-card {\n min-height: 200px;\n }\n\n .drag-drop-card__title {\n font-size: 20px;\n line-height: 28px;\n }\n\n .drag-drop-card__accepts,\n .drag-drop-card__divider {\n font-size: 13px;\n line-height: 18px;\n }\n}\n","import { Component, Host, h, Prop, State, Event, EventEmitter, Method } from '@stencil/core';\n\nconst DEFAULT_ACCEPT_ALL = '*' + '/' + '*';\n\n@Component({\n tag: 'xplor-drag-and-drop-input',\n styleUrl: 'xplor-drag-and-drop-input.scss',\n scoped: true,\n})\nexport class XplorDragAndDropInput {\n /**\n * Disable the file upload\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Accepted file types (e.g., 'image/png,.pdf')\n */\n @Prop() accepts: string = DEFAULT_ACCEPT_ALL;\n\n /**\n * Instruction text displayed in the drop zone\n */\n @Prop() label: string = 'Drag and drop your file here';\n\n /**\n * Browse button label text\n */\n @Prop() browseLabel: string = 'Browse Files';\n\n @State() dragover: boolean = false;\n @State() currentFile: File | null = null;\n\n /**\n * Emitted when a file is selected via drop or click\n */\n @Event() fileSelect: EventEmitter<File>;\n\n /**\n * Emitted when the current file is cleared\n */\n @Event() fileClear: EventEmitter<void>;\n\n private fileInputEl: HTMLInputElement;\n\n /**\n * Clears the currently selected file\n */\n @Method()\n async clearCurrentFile() {\n this.currentFile = null;\n if (this.fileInputEl) {\n this.fileInputEl.value = '';\n }\n this.fileClear.emit();\n }\n\n private onDrop = (e: DragEvent) => {\n e.preventDefault();\n this.dragover = false;\n\n if (this.disabled) return;\n\n const file = e.dataTransfer?.files?.[0];\n if (file) {\n this.currentFile = file;\n this.fileSelect.emit(this.currentFile);\n }\n };\n\n private onDragOver = (e: DragEvent) => {\n e.preventDefault();\n if (!this.disabled) {\n this.dragover = true;\n }\n };\n\n private onDragEnter = (e: DragEvent) => {\n e.preventDefault();\n if (!this.disabled) {\n this.dragover = true;\n }\n };\n\n private onDragLeave = (e: DragEvent) => {\n e.preventDefault();\n this.dragover = false;\n };\n\n private onFileSelect = (e: Event) => {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n this.currentFile = file;\n this.fileSelect.emit(this.currentFile);\n }\n input.value = '';\n };\n\n private openFileDialog = () => {\n if (this.disabled) {\n return;\n }\n\n this.fileInputEl?.click();\n };\n\n private getAcceptsLabel = () => {\n const accepts = this.accepts?.trim();\n if (!accepts || accepts === DEFAULT_ACCEPT_ALL) {\n return '*';\n }\n\n return accepts;\n };\n\n render() {\n return (\n <Host>\n <div class=\"drag-drop-wrapper\">\n <div\n class={{\n 'drag-drop-card': true,\n 'drag-drop-card--dragover': this.dragover,\n 'drag-drop-card--disabled': this.disabled,\n }}\n onDrop={this.onDrop}\n onDragOver={this.onDragOver}\n onDragEnter={this.onDragEnter}\n onDragLeave={this.onDragLeave}\n >\n <div class=\"drag-drop-card__content\">\n <svg\n class=\"drag-drop-card__icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM14 13V17H10V13H7L12 8L17 13H14Z\"\n fill=\"currentColor\"\n />\n </svg>\n <h3 class=\"drag-drop-card__title\">{this.label}</h3>\n <p class=\"drag-drop-card__accepts\">Accepted file types: {this.getAcceptsLabel()}</p>\n <p class=\"drag-drop-card__divider\">or</p>\n </div>\n </div>\n\n <div class=\"drag-drop-card__action\">\n <xplor-button\n text={this.browseLabel}\n type={this.disabled ? 'disabled' : 'secondary'}\n clickAction={this.openFileDialog}\n ></xplor-button>\n </div>\n\n {this.currentFile && (\n <div class=\"drag-drop-card__file-info\">\n File Selected: {this.currentFile.name}\n </div>\n )}\n </div>\n\n <input\n id=\"drag-drop-file-select\"\n type=\"file\"\n disabled={this.disabled}\n accept={this.accepts}\n class=\"drag-drop-input-hidden\"\n ref={(el) => (this.fileInputEl = el)}\n onChange={this.onFileSelect}\n />\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.xplor-dropdown {\n display: block;\n cursor: pointer;\n margin-right: 10px;\n border: 1px solid;\n border-radius: 1rem;\n font-size: 14px;\n font-weight: 500;\n -webkit-box-pack: center;\n letter-spacing: 0.75px;\n height: 45px;\n text-align: center;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-dropdown',\n styleUrl: 'xplor-dropdown.scss',\n shadow: true,\n})\nexport class XplorDropdown {\n @Prop() options: string[];\n @Prop() selected: string;\n @Prop() handleChange: (event: Event) => void;\n\n render() {\n return (\n <Host>\n <select class=\"xplor-dropdown\" onChange={this.handleChange}>\n {this.options.map((option) => (\n <option value={option} selected={this.selected === option}>\n {option}\n </option>\n ))}\n </select>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.expansion-panel {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n\n &+& {\n margin-top: -1px;\n }\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n.expansion-panel__header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n background-color: #f5f5f5;\n border: none;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.2s;\n font-family: inherit;\n font-size: inherit;\n\n &:hover:not(:disabled) {\n background-color: #eeeeee;\n }\n\n &:focus {\n outline: 2px solid #1976d2;\n outline-offset: -2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n}\n\n.expansion-panel__header-content {\n flex: 1;\n font-weight: 500;\n}\n\n.expansion-panel__icon {\n display: inline-block;\n transition: transform 0.3s ease;\n font-size: 0.75rem;\n margin-left: 0.5rem;\n\n &--open {\n transform: rotate(180deg);\n }\n}\n\n.expansion-panel__content {\n overflow: hidden;\n transition: max-height 0.3s ease;\n background-color: #fff;\n}\n\n.expansion-panel__content-inner {\n padding: 1rem 1.5rem;\n}","import { Component, Host, h, Prop, State, Event, EventEmitter, Element } from '@stencil/core';\n\nlet nextId = 0;\n\n@Component({\n tag: 'xplor-expansion-panel',\n styleUrl: 'xplor-expansion-panel.scss',\n scoped: true,\n})\nexport class XplorExpansionPanel {\n @Element() el: HTMLElement;\n\n @Prop() disabled: boolean = false;\n @Prop({ mutable: true }) open: boolean = false;\n\n @State() panelId: string;\n @State() contentHeight: number = 0;\n\n @Event() xplorPanelToggle: EventEmitter<{ id: string; isOpen: boolean }>;\n\n private contentEl: HTMLDivElement;\n\n componentWillLoad() {\n this.panelId = `panel-${nextId++}`;\n }\n\n componentDidLoad() {\n this.updateContentHeight();\n }\n\n private updateContentHeight() {\n if (this.contentEl) {\n this.contentHeight = this.contentEl.scrollHeight;\n }\n }\n\n private handleToggle = () => {\n if (this.disabled) return;\n\n this.open = !this.open;\n this.xplorPanelToggle.emit({ id: this.panelId, isOpen: this.open });\n\n // Update height after toggle\n setTimeout(() => this.updateContentHeight(), 0);\n };\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'expansion-panel': true,\n 'expansion-panel--open': this.open,\n 'expansion-panel--disabled': this.disabled,\n }}\n >\n <button\n class=\"expansion-panel__header\"\n onClick={this.handleToggle}\n disabled={this.disabled}\n aria-expanded={this.open ? 'true' : 'false'}\n type=\"button\"\n >\n <div class=\"expansion-panel__header-content\">\n <slot name=\"header\" />\n </div>\n <span\n class={{\n 'expansion-panel__icon': true,\n 'expansion-panel__icon--open': this.open,\n }}\n >\n ▼\n </span>\n </button>\n <div\n class=\"expansion-panel__content\"\n style={{\n maxHeight: this.open ? `${this.contentHeight}px` : '0',\n }}\n >\n <div\n class=\"expansion-panel__content-inner\"\n ref={(el) => (this.contentEl = el)}\n >\n <slot />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.expansion-panels {\n display: flex;\n flex-direction: column;\n gap: 0;\n}","import { Component, Host, h, Prop, State, Listen } from '@stencil/core';\n\n@Component({\n tag: 'xplor-expansion-panels',\n styleUrl: 'xplor-expansion-panels.scss',\n scoped: true,\n})\nexport class XplorExpansionPanels {\n @Prop({ mutable: true }) value: string | string[] = [];\n @Prop() multiple: boolean = false;\n @Prop() accordion: boolean = true; // accordion mode (only one open at a time when not multiple)\n\n @State() openPanels: Set<string> = new Set();\n\n componentWillLoad() {\n if (Array.isArray(this.value)) {\n this.openPanels = new Set(this.value);\n } else if (this.value) {\n this.openPanels = new Set([this.value]);\n }\n }\n\n @Listen('xplorPanelToggle')\n handlePanelToggle(event: CustomEvent<{ id: string; isOpen: boolean }>) {\n event.stopPropagation();\n const { id, isOpen } = event.detail;\n\n if (isOpen) {\n if (this.multiple) {\n this.openPanels = new Set([...this.openPanels, id]);\n } else {\n this.openPanels = new Set([id]);\n }\n } else {\n const newPanels = new Set(this.openPanels);\n newPanels.delete(id);\n this.openPanels = newPanels;\n }\n\n this.value = this.multiple ? Array.from(this.openPanels) : Array.from(this.openPanels)[0] || '';\n }\n\n render() {\n return (\n <Host>\n <div class=\"expansion-panels\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",":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",":host {\n display: inline-block;\n}\n\n.xplor-inline-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n\n &__input {\n width: 1.125rem;\n height: 1.125rem;\n cursor: pointer;\n margin: 0;\n flex-shrink: 0;\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.38;\n }\n }\n\n &__label {\n font-size: 1rem;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &--disabled {\n cursor: not-allowed;\n\n .xplor-inline-checkbox__label {\n color: rgba(0, 0, 0, 0.38);\n }\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-inline-checkbox',\n styleUrl: 'xplor-inline-checkbox.scss',\n scoped: true,\n})\nexport class XplorInlineCheckbox {\n /**\n * Checked state\n */\n @Prop({ mutable: true }) checked: boolean = false;\n\n /**\n * Value (for use in forms)\n */\n @Prop() value: any;\n\n /**\n * Checkbox color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the checkbox is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the checkbox is indeterminate\n */\n @Prop() indeterminate: boolean = false;\n\n /**\n * Label text\n */\n @Prop() label: string = '';\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<boolean>;\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.checked = target.checked;\n this.xplorChange.emit(this.checked);\n };\n\n render() {\n const containerClasses = {\n 'xplor-inline-checkbox': true,\n 'xplor-inline-checkbox--disabled': this.disabled,\n 'xplor-inline-checkbox--checked': this.checked,\n };\n\n return (\n <Host>\n <label class={containerClasses}>\n <input\n type=\"checkbox\"\n class=\"xplor-inline-checkbox__input\"\n checked={this.checked}\n value={this.value}\n disabled={this.disabled}\n indeterminate={this.indeterminate}\n onChange={this.handleChange}\n style={{\n accentColor: this.color,\n }}\n />\n {this.label && <span class=\"xplor-inline-checkbox__label\">{this.label}</span>}\n <slot />\n </label>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-inline-date-picker {\n --picker-color: #008480;\n display: flex;\n border-radius: 1rem;\n background-color: white;\n box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),\n 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12);\n overflow: hidden;\n\n &__sidebar {\n background-color: var(--picker-color);\n color: white;\n padding: 1rem;\n min-width: 180px;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n &__sidebar-year {\n font-size: 0.875rem;\n font-weight: 700;\n }\n\n &__sidebar-day {\n font-size: 1.75rem;\n font-weight: 700;\n }\n\n &__sidebar-date {\n font-size: 1.75rem;\n font-weight: 700;\n }\n\n &__calendar {\n display: flex;\n flex-direction: column;\n width: 320px;\n padding: 1rem;\n }\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n padding: 0.5rem 0;\n }\n\n &__title {\n font-size: 1rem;\n font-weight: 700;\n color: rgba(0, 0, 0, 0.87);\n }\n\n &__arrow {\n width: 2rem;\n height: 2rem;\n border: none;\n background: transparent;\n font-size: 1.5rem;\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\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 &__weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 0.25rem;\n margin-bottom: 0.5rem;\n }\n\n &__weekday {\n text-align: center;\n font-size: 0.75rem;\n font-weight: 700;\n color: rgba(0, 0, 0, 0.6);\n padding: 0.5rem 0;\n }\n\n &__days {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 0.25rem;\n }\n\n &__day {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 50%;\n cursor: pointer;\n transition: background-color 0.2s ease;\n position: relative;\n\n &:not(&--empty):not(&--disabled):hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n &--empty {\n cursor: default;\n }\n\n &--today {\n color: var(--picker-color);\n font-weight: 700;\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n border: 2px solid var(--picker-color);\n border-radius: 50%;\n }\n }\n\n &--selected {\n background-color: var(--picker-color);\n color: white;\n font-weight: 700;\n\n &:hover {\n background-color: var(--picker-color);\n opacity: 0.9;\n }\n\n &::before {\n display: none;\n }\n }\n\n &--disabled {\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n pointer-events: none;\n }\n }\n}\n\n// Compact variant (no sidebar)\n:host([compact]) {\n .xplor-inline-date-picker {\n &__sidebar {\n display: none;\n }\n\n &__calendar {\n width: 280px;\n }\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, State } from '@stencil/core';\n\n@Component({\n tag: 'xplor-inline-date-picker',\n styleUrl: 'xplor-inline-date-picker.scss',\n scoped: true,\n})\nexport class XplorInlineDatePicker {\n /**\n * Selected date (YYYY-MM-DD format)\n */\n @Prop({ mutable: true }) selectedDate: string = '';\n\n /**\n * Minimum selectable date (YYYY-MM-DD format)\n */\n @Prop() min: string = '';\n\n /**\n * Maximum selectable date (YYYY-MM-DD format)\n */\n @Prop() max: string = '';\n\n /**\n * Whether the date picker is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Primary color\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether to start week on Sunday (default: true)\n */\n @Prop() startWeekOnSunday: boolean = true;\n\n /**\n * Date selection event\n */\n @Event() dateSelected: EventEmitter<string>;\n\n /**\n * Month change event\n */\n @Event() monthChanged: EventEmitter<{ year: number; month: number }>;\n\n @State() currentYear: number;\n @State() currentMonth: number;\n @State() viewDate: Date;\n\n private monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n private dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n private dayNamesStartMonday = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n componentWillLoad() {\n const date = this.selectedDate ? new Date(this.selectedDate) : new Date();\n this.currentYear = date.getFullYear();\n this.currentMonth = date.getMonth();\n this.viewDate = new Date(this.currentYear, this.currentMonth, 1);\n }\n\n private previousMonth = () => {\n if (this.currentMonth === 0) {\n this.currentMonth = 11;\n this.currentYear--;\n } else {\n this.currentMonth--;\n }\n this.viewDate = new Date(this.currentYear, this.currentMonth, 1);\n this.monthChanged.emit({ year: this.currentYear, month: this.currentMonth });\n };\n\n private nextMonth = () => {\n if (this.currentMonth === 11) {\n this.currentMonth = 0;\n this.currentYear++;\n } else {\n this.currentMonth++;\n }\n this.viewDate = new Date(this.currentYear, this.currentMonth, 1);\n this.monthChanged.emit({ year: this.currentYear, month: this.currentMonth });\n };\n\n private selectDate = (day: number) => {\n if (this.readonly) return;\n\n const date = new Date(this.currentYear, this.currentMonth, day);\n const dateString = this.formatDate(date);\n\n if (this.isDateDisabled(date)) return;\n\n this.selectedDate = dateString;\n this.dateSelected.emit(dateString);\n };\n\n private formatDate = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n };\n\n private isDateDisabled = (date: Date): boolean => {\n if (this.min) {\n const minDate = new Date(this.min);\n if (date < minDate) return true;\n }\n if (this.max) {\n const maxDate = new Date(this.max);\n if (date > maxDate) return true;\n }\n return false;\n };\n\n private isToday = (day: number): boolean => {\n const today = new Date();\n return (\n day === today.getDate() &&\n this.currentMonth === today.getMonth() &&\n this.currentYear === today.getFullYear()\n );\n };\n\n private isSelected = (day: number): boolean => {\n if (!this.selectedDate) return false;\n const selected = new Date(this.selectedDate);\n return (\n day === selected.getDate() &&\n this.currentMonth === selected.getMonth() &&\n this.currentYear === selected.getFullYear()\n );\n };\n\n private getDaysInMonth = (): number => {\n return new Date(this.currentYear, this.currentMonth + 1, 0).getDate();\n };\n\n private getFirstDayOfMonth = (): number => {\n const firstDay = new Date(this.currentYear, this.currentMonth, 1).getDay();\n return this.startWeekOnSunday ? firstDay : (firstDay === 0 ? 6 : firstDay - 1);\n };\n\n private renderCalendarDays = () => {\n const daysInMonth = this.getDaysInMonth();\n const firstDay = this.getFirstDayOfMonth();\n const days = [];\n\n // Empty cells for days before the first of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(<div class=\"xplor-inline-date-picker__day xplor-inline-date-picker__day--empty\"></div>);\n }\n\n // Days of the month\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(this.currentYear, this.currentMonth, day);\n const isDisabled = this.isDateDisabled(date);\n const isToday = this.isToday(day);\n const isSelected = this.isSelected(day);\n\n days.push(\n <div\n class={{\n 'xplor-inline-date-picker__day': true,\n 'xplor-inline-date-picker__day--today': isToday,\n 'xplor-inline-date-picker__day--selected': isSelected,\n 'xplor-inline-date-picker__day--disabled': isDisabled,\n }}\n onClick={() => !isDisabled && this.selectDate(day)}\n >\n {day}\n </div>\n );\n }\n\n return days;\n };\n\n private getSidebarDate = () => {\n const date = this.selectedDate ? new Date(this.selectedDate) : new Date();\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n return {\n year: date.getFullYear(),\n day: dayNames[date.getDay()],\n date: `${monthNames[date.getMonth()]} ${date.getDate()}`,\n };\n };\n\n render() {\n const sidebarDate = this.getSidebarDate();\n const dayHeaders = this.startWeekOnSunday ? this.dayNames : this.dayNamesStartMonday;\n\n return (\n <Host>\n <div class=\"xplor-inline-date-picker\" style={{ '--picker-color': this.color }}>\n <div class=\"xplor-inline-date-picker__sidebar\">\n <div class=\"xplor-inline-date-picker__sidebar-year\">{sidebarDate.year}</div>\n <div class=\"xplor-inline-date-picker__sidebar-day\">{sidebarDate.day},</div>\n <div class=\"xplor-inline-date-picker__sidebar-date\">{sidebarDate.date}</div>\n </div>\n\n <div class=\"xplor-inline-date-picker__calendar\">\n <div class=\"xplor-inline-date-picker__header\">\n <button\n type=\"button\"\n class=\"xplor-inline-date-picker__arrow\"\n onClick={this.previousMonth}\n aria-label=\"Previous month\"\n >\n ‹\n </button>\n <div class=\"xplor-inline-date-picker__title\">\n {this.monthNames[this.currentMonth]} {this.currentYear}\n </div>\n <button\n type=\"button\"\n class=\"xplor-inline-date-picker__arrow\"\n onClick={this.nextMonth}\n aria-label=\"Next month\"\n >\n ›\n </button>\n </div>\n\n <div class=\"xplor-inline-date-picker__weekdays\">\n {dayHeaders.map((day) => (\n <div class=\"xplor-inline-date-picker__weekday\">{day}</div>\n ))}\n </div>\n\n <div class=\"xplor-inline-date-picker__days\">{this.renderCalendarDays()}</div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n\n.xplor-inline-switch {\n --switch-color: #008480;\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n cursor: pointer;\n user-select: none;\n\n &__input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__track {\n position: relative;\n width: 2.25rem;\n height: 1.25rem;\n background-color: rgba(0, 0, 0, 0.38);\n border-radius: 0.625rem;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n }\n\n &__thumb {\n position: absolute;\n top: 0.125rem;\n left: 0.125rem;\n width: 1rem;\n height: 1rem;\n background-color: white;\n border-radius: 50%;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n\n &__label {\n font-size: 1rem;\n color: rgba(0, 0, 0, 0.87);\n }\n\n // Checked state\n &--checked {\n .xplor-inline-switch__track {\n background-color: var(--switch-color);\n }\n\n .xplor-inline-switch__thumb {\n transform: translateX(1rem);\n }\n }\n\n // Disabled state\n &--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n\n .xplor-inline-switch__track {\n background-color: rgba(0, 0, 0, 0.12);\n }\n\n .xplor-inline-switch__label {\n color: rgba(0, 0, 0, 0.38);\n }\n\n // Keep color when disabled but checked\n &.xplor-inline-switch--checked {\n .xplor-inline-switch__track {\n background-color: var(--switch-color);\n opacity: 0.5;\n }\n\n .xplor-inline-switch__thumb {\n background-color: white;\n }\n }\n }\n\n // Hover effect\n &:not(&--disabled):hover {\n .xplor-inline-switch__thumb {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n }\n }\n\n // Focus effect\n &__input:focus + &__track {\n outline: 2px solid var(--switch-color);\n outline-offset: 2px;\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-inline-switch',\n styleUrl: 'xplor-inline-switch.scss',\n scoped: true,\n})\nexport class XplorInlineSwitch {\n /**\n * Checked state\n */\n @Prop({ mutable: true }) checked: boolean = false;\n\n /**\n * Value (for use in forms)\n */\n @Prop() value: any;\n\n /**\n * Switch color (applies when checked)\n */\n @Prop() color: string = '#008480';\n\n /**\n * Whether the switch is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Label text\n */\n @Prop() label: string = '';\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<boolean>;\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.checked = target.checked;\n this.xplorChange.emit(this.checked);\n };\n\n render() {\n const containerClasses = {\n 'xplor-inline-switch': true,\n 'xplor-inline-switch--disabled': this.disabled,\n 'xplor-inline-switch--checked': this.checked,\n };\n\n return (\n <Host>\n <label class={containerClasses} style={{ '--switch-color': this.color }}>\n <input\n type=\"checkbox\"\n class=\"xplor-inline-switch__input\"\n checked={this.checked}\n value={this.value}\n disabled={this.disabled}\n onChange={this.handleChange}\n />\n <span class=\"xplor-inline-switch__track\">\n <span class=\"xplor-inline-switch__thumb\"></span>\n </span>\n {this.label && <span class=\"xplor-inline-switch__label\">{this.label}</span>}\n <slot />\n </label>\n </Host>\n );\n }\n}\n",":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",":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\n@Component({\n tag: 'xplor-input-search',\n styleUrl: 'xplor-input-search.scss',\n scoped: true,\n})\nexport class XplorInputSearch {\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 type=\"text\"\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 />\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 >\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",":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 position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 0.25rem;\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: 1000;\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\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\n componentDidLoad() {\n document.addEventListener('click', this.handleOutsideClick);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleOutsideClick);\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 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}>\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 && (\n <div class=\"xplor-input-select__menu\">\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",":host {\n display: block;\n width: 100%;\n}\n\n.input-send {\n display: flex;\n gap: 0.5rem;\n align-items: stretch;\n width: 100%;\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n}\n\n.input-send__input {\n flex: 1;\n padding: 0.75rem 1rem;\n border: 1px solid #bdbdbd;\n border-radius: 4px;\n font-family: inherit;\n font-size: 1rem;\n line-height: 1.5;\n color: #212121;\n background-color: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n\n &:focus {\n outline: none;\n border-color: #1976d2;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n }\n\n &::placeholder {\n color: #9e9e9e;\n }\n\n &:disabled {\n background-color: #f5f5f5;\n cursor: not-allowed;\n }\n}\n\n.input-send__button {\n flex-shrink: 0;\n}","import { Component, Host, h, Prop, State, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-input-send',\n styleUrl: 'xplor-input-send.scss',\n scoped: true,\n})\nexport class XplorInputSend {\n @Prop() placeholder: string = 'Type a message...';\n @Prop() disabled: boolean = false;\n @Prop() maxLength: number;\n @Prop({ mutable: true }) value: string = '';\n @Prop() buttonText: string = 'Send';\n @Prop() buttonType: 'primary' | 'secondary' | 'ghost' = 'primary';\n\n @State() internalValue: string = '';\n\n @Event() xplorSend: EventEmitter<string>;\n @Event() xplorValueChange: EventEmitter<string>;\n\n private inputEl: HTMLInputElement;\n\n componentWillLoad() {\n this.internalValue = this.value;\n }\n\n private handleInput = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.internalValue = input.value;\n this.value = input.value;\n this.xplorValueChange.emit(input.value);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.handleSend();\n }\n };\n\n private handleSend = () => {\n if (this.disabled || !this.internalValue.trim()) {\n return;\n }\n\n this.xplorSend.emit(this.internalValue.trim());\n this.internalValue = '';\n this.value = '';\n\n // Focus back on input after sending\n if (this.inputEl) {\n this.inputEl.focus();\n }\n };\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'input-send': true,\n 'input-send--disabled': this.disabled,\n }}\n >\n <input\n ref={(el) => (this.inputEl = el)}\n type=\"text\"\n class=\"input-send__input\"\n placeholder={this.placeholder}\n value={this.internalValue}\n onInput={this.handleInput}\n onKeyDown={this.handleKeyDown}\n disabled={this.disabled}\n maxLength={this.maxLength}\n />\n <xplor-button\n class=\"input-send__button\"\n text={this.buttonText}\n type={this.disabled || !this.internalValue.trim() ? 'disabled' : this.buttonType}\n onClick={this.handleSend}\n />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.xplor-input-text {\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 position: relative;\n display: flex;\n align-items: center;\n }\n\n &__input {\n width: 100%;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n outline: none;\n transition: border-color 0.2s ease;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:hover:not(:disabled) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n\n &:focus {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n\n &:disabled {\n background-color: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n }\n\n &:read-only {\n background-color: rgba(0, 0, 0, 0.04);\n }\n }\n\n &--error {\n .xplor-input-text__input {\n border-color: #d32f2f;\n }\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\n@Component({\n tag: 'xplor-input-text',\n styleUrl: 'xplor-input-text.scss',\n scoped: true,\n})\nexport class XplorInputText {\n /**\n * Input value\n */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = '';\n\n /**\n * Input type (text, email, password, number, etc.)\n */\n @Prop() type: string = 'text';\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 input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input 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 * Input event\n */\n @Event() xplorInput: EventEmitter<string>;\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<string>;\n\n /**\n * Focus event\n */\n @Event() xplorFocus: EventEmitter<FocusEvent>;\n\n /**\n * Blur event\n */\n @Event() xplorBlur: EventEmitter<FocusEvent>;\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 this.xplorInput.emit(this.value);\n };\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.value = target.value;\n this.xplorChange.emit(this.value);\n };\n\n private handleFocus = (event: FocusEvent) => {\n this.isFocused = true;\n this.xplorFocus.emit(event);\n };\n\n private handleBlur = (event: FocusEvent) => {\n this.isFocused = false;\n this.xplorBlur.emit(event);\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-text': true,\n 'xplor-input-text--focused': this.isFocused,\n 'xplor-input-text--disabled': this.disabled,\n 'xplor-input-text--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}>\n {this.label && (\n <label class=\"xplor-input-text__label\">\n {this.label}\n {this.required && <span class=\"xplor-input-text__required\">*</span>}\n </label>\n )}\n\n <div class=\"xplor-input-text__field\">\n <input\n type={this.type}\n class=\"xplor-input-text__input\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n required={this.required}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n style={{\n backgroundColor: this.bgColor,\n }}\n />\n <slot name=\"append-inner\" />\n </div>\n\n {showDetails && (\n <div class=\"xplor-input-text__details\">\n {this.error && <div class=\"xplor-input-text__error-message\">{this.error}</div>}\n {!this.error && this.helperText && <div class=\"xplor-input-text__helper-text\">{this.helperText}</div>}\n </div>\n )}\n\n <slot name=\"append\" />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.xplor-input-text-area {\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 position: relative;\n display: flex;\n align-items: flex-start;\n }\n\n &__input {\n width: 100%;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n outline: none;\n resize: vertical;\n min-height: 56px;\n transition: border-color 0.2s ease;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:hover:not(:disabled) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n\n &:focus {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n\n &:disabled {\n background-color: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n resize: none;\n }\n\n &:read-only {\n background-color: rgba(0, 0, 0, 0.04);\n }\n }\n\n &__clear {\n position: absolute;\n right: 0.75rem;\n top: 0.75rem;\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\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 &--error {\n .xplor-input-text-area__input {\n border-color: #d32f2f;\n }\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\n@Component({\n tag: 'xplor-input-text-area',\n styleUrl: 'xplor-input-text-area.scss',\n scoped: true,\n})\nexport class XplorInputTextArea {\n /**\n * Input value\n */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * Input label\n */\n @Prop() label: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = '';\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 input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Whether to show clear button\n */\n @Prop() clearable: boolean = true;\n\n /**\n * Number of rows\n */\n @Prop() rows: number = 3;\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 * Input event\n */\n @Event() xplorInput: EventEmitter<string>;\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<string>;\n\n /**\n * Clear event\n */\n @Event() xplorClear: EventEmitter<void>;\n\n @State() isFocused: boolean = false;\n\n private handleInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement;\n this.value = target.value;\n this.xplorInput.emit(this.value);\n };\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLTextAreaElement;\n this.value = target.value;\n this.xplorChange.emit(this.value);\n };\n\n private handleClear = () => {\n this.value = '';\n this.xplorClear.emit();\n this.xplorChange.emit(this.value);\n };\n\n render() {\n const containerClasses = {\n 'xplor-input-text-area': true,\n 'xplor-input-text-area--focused': this.isFocused,\n 'xplor-input-text-area--disabled': this.disabled,\n 'xplor-input-text-area--error': !!this.error,\n };\n\n const showClearButton = this.clearable && this.value && !this.readonly && !this.disabled;\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && (this.error || this.helperText));\n\n return (\n <Host>\n <div class={containerClasses}>\n {this.label && (\n <label class=\"xplor-input-text-area__label\">\n {this.label}\n {this.required && <span class=\"xplor-input-text-area__required\">*</span>}\n </label>\n )}\n\n <div class=\"xplor-input-text-area__field\">\n <textarea\n class=\"xplor-input-text-area__input\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n required={this.required}\n rows={this.rows}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={() => (this.isFocused = true)}\n onBlur={() => (this.isFocused = false)}\n style={{\n backgroundColor: this.bgColor,\n }}\n />\n {showClearButton && (\n <button\n type=\"button\"\n class=\"xplor-input-text-area__clear\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n ✕\n </button>\n )}\n </div>\n\n {showDetails && (\n <div class=\"xplor-input-text-area__details\">\n {this.error && <div class=\"xplor-input-text-area__error-message\">{this.error}</div>}\n {!this.error && this.helperText && <div class=\"xplor-input-text-area__helper-text\">{this.helperText}</div>}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.input-secondary {\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 position: relative;\n display: flex;\n align-items: center;\n }\n\n &__input {\n width: 100%;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 16px;\n outline: none;\n transition: border-color 0.2s ease, border-width 0.2s ease;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:hover:not(:disabled) {\n border-color: rgba(0, 0, 0, 0.6);\n }\n\n &:focus {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n\n &:disabled {\n background-color: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.38);\n cursor: not-allowed;\n }\n\n &:read-only {\n background-color: rgba(0, 0, 0, 0.04);\n }\n }\n\n &--dirty {\n .input-secondary__input {\n border-color: #008480;\n border-width: 2px;\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n\n &--error {\n .input-secondary__input {\n border-color: #d32f2f;\n }\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\n@Component({\n tag: 'xplor-input-text-secondary',\n styleUrl: 'xplor-input-text-secondary.scss',\n scoped: true,\n})\nexport class XplorInputTextSecondary {\n @Prop({ mutable: true }) value: string = '';\n @Prop() label: string = '';\n @Prop() placeholder: string = '';\n @Prop() type: string = 'text';\n @Prop() bgColor: string = 'white';\n @Prop() disabled: boolean = false;\n @Prop() readonly: boolean = false;\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n @Prop() error: string = '';\n @Prop() helperText: string = '';\n @Prop() required: boolean = false;\n @Prop() isDirty: boolean = false;\n\n @Event() xplorInput: EventEmitter<string>;\n @Event() xplorChange: EventEmitter<string>;\n @Event() xplorFocus: EventEmitter<FocusEvent>;\n @Event() xplorBlur: EventEmitter<FocusEvent>;\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 this.xplorInput.emit(this.value);\n };\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.value = target.value;\n this.xplorChange.emit(this.value);\n };\n\n private handleFocus = (event: FocusEvent) => {\n this.isFocused = true;\n this.xplorFocus.emit(event);\n };\n\n private handleBlur = (event: FocusEvent) => {\n this.isFocused = false;\n this.xplorBlur.emit(event);\n };\n\n render() {\n const containerClasses = {\n 'input-secondary': true,\n 'input-secondary--focused': this.isFocused,\n 'input-secondary--disabled': this.disabled,\n 'input-secondary--error': !!this.error,\n 'input-secondary--dirty': this.isDirty,\n };\n\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && (this.error || this.helperText));\n\n return (\n <Host>\n <div class={containerClasses}>\n {this.label && (\n <label class=\"input-secondary__label\">\n {this.label}\n {this.required && <span class=\"input-secondary__required\">*</span>}\n </label>\n )}\n\n <div class=\"input-secondary__field\">\n <input\n type={this.type}\n class=\"input-secondary__input\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n required={this.required}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n style={{\n backgroundColor: this.bgColor,\n }}\n />\n <slot name=\"append-inner\" />\n </div>\n\n {showDetails && (\n <div class=\"input-secondary__details\">\n {this.error && <div class=\"input-secondary__error-message\">{this.error}</div>}\n {!this.error && this.helperText && <div class=\"input-secondary__helper-text\">{this.helperText}</div>}\n </div>\n )}\n\n <slot name=\"append\" />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.xplor-input-title {\n width: 100%;\n height: 39px;\n font-size: 28px;\n font-family: inherit;\n font-weight: 400;\n border: none;\n border-bottom: 1px solid rgba(0, 0, 0, 0.42);\n outline: none;\n padding: 0 0 4px 0;\n background: transparent;\n transition: border-color 0.2s ease;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:hover:not(:disabled) {\n border-bottom-color: rgba(0, 0, 0, 0.87);\n }\n\n &:focus {\n border-bottom-width: 2px;\n border-bottom-color: #008480;\n padding-bottom: 3px;\n }\n\n &:disabled {\n color: rgba(0, 0, 0, 0.38);\n border-bottom-color: rgba(0, 0, 0, 0.26);\n cursor: not-allowed;\n }\n\n &:read-only {\n color: rgba(0, 0, 0, 0.6);\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-input-title',\n styleUrl: 'xplor-input-title.scss',\n scoped: true,\n})\nexport class XplorInputTitle {\n /**\n * Input value\n */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * Input placeholder\n */\n @Prop() placeholder: string = '';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Input event\n */\n @Event() xplorInput: EventEmitter<string>;\n\n /**\n * Change event\n */\n @Event() xplorChange: EventEmitter<string>;\n\n private handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.value = target.value;\n this.xplorInput.emit(this.value);\n };\n\n private handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n this.value = target.value;\n this.xplorChange.emit(this.value);\n };\n\n render() {\n return (\n <Host>\n <input\n type=\"text\"\n class=\"xplor-input-title\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n onInput={this.handleInput}\n onChange={this.handleChange}\n />\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n.x-link {\n display: block;\n padding: 0.5rem 0;\n text-decoration: none;\n color: var(--xplor-link-color);\n}\n","import { Component, h, Prop, Host } from '@stencil/core';\n@Component({\n tag: 'xplor-links',\n styleUrl: 'xplor-links.css',\n shadow: true,\n})\nexport class XplorLinks {\n @Prop() brand: string;\n render() {\n return (\n <Host class={`theme-${this.brand}`}>\n <a class=\"x-link\" href=\"https://google.com\">\n {' '}\n googole this is a link{' '}\n </a>\n <div class=\"bg-black p-2 rounded-md flex justify-center\">\n <h1 class=\"text-primary font-sans\">This is a Stencil component using Tailwind</h1>\n </div>\n <div class=\"bg-white py-24 sm:py-32\">\n <div class=\"mx-auto grid max-w-7xl gap-20 px-6 lg:px-8 xl:grid-cols-3\">\n <div class=\"max-w-xl\">\n <h2 class=\"text-pretty text-3xl font-semibold tracking-tight text-gray-900 sm:text-4xl\">\n Meet our leadership\n </h2>\n <p class=\"mt-6 text-lg/8 text-gray-600\">\n We’re a dynamic group of individuals who are passionate about what we do and dedicated to delivering the\n best results for our clients.\n </p>\n </div>\n <ul role=\"list\" class=\"grid gap-x-8 gap-y-12 sm:grid-cols-2 sm:gap-y-16 xl:col-span-2\">\n <li>\n <div class=\"flex items-center gap-x-6\">\n <img\n class=\"size-16 rounded-full\"\n src=\"https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80\"\n alt=\"\"\n />\n <div>\n <h3 class=\"text-base/7 font-semibold tracking-tight text-gray-900\">Leslie Alexander</h3>\n <p class=\"text-sm/6 font-semibold text-indigo-600\">Co-Founder / CEO</p>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: contents;\n}\n\n.xplor-modal {\n &__backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2000;\n padding: 1rem;\n }\n\n &__card {\n position: relative;\n background-color: white;\n border-radius: 1rem;\n padding: 1rem;\n max-width: 90vw;\n display: flex;\n flex-direction: column;\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2),\n 0px 24px 38px 3px rgba(0, 0, 0, 0.14),\n 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n animation: xplor-modal-fade-in 0.2s ease-out;\n\n &--scrollable {\n overflow: hidden;\n }\n }\n\n &__close-btn {\n position: absolute;\n top: 1rem;\n right: 1rem;\n width: 2.25rem;\n height: 2.25rem;\n border: none;\n background-color: white;\n color: #008480;\n font-size: 1rem;\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n z-index: 1;\n\n &:hover {\n background-color: #E6F7F7;\n }\n\n &:active {\n background-color: #D0EBD2;\n }\n }\n\n &__title {\n padding-right: 3rem;\n margin-bottom: 0.5rem;\n font-size: 1.5rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.87);\n white-space: normal;\n word-wrap: break-word;\n }\n\n &__subtitle {\n margin: 0.5rem;\n margin-bottom: 1rem;\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.6);\n }\n\n &__body {\n flex: 1;\n overflow-y: auto;\n margin-bottom: 1rem;\n\n &--no-title {\n margin-top: 3.5rem;\n }\n }\n\n &__actions {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n margin: 1rem 0;\n }\n\n &__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 3rem;\n }\n\n &__spinner {\n width: 3rem;\n height: 3rem;\n border: 4px solid rgba(0, 0, 0, 0.1);\n border-top-color: #008480;\n border-radius: 50%;\n animation: xplor-spinner-rotate 0.8s linear infinite;\n }\n}\n\n@keyframes xplor-modal-fade-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes xplor-spinner-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter, Watch } from '@stencil/core';\n\n@Component({\n tag: 'xplor-modal',\n styleUrl: 'xplor-modal.scss',\n scoped: true,\n})\nexport class XplorModal {\n /**\n * Whether the modal is open\n */\n @Prop({ mutable: true }) open: boolean = false;\n\n /**\n * Modal width\n */\n @Prop() width: string = '600px';\n\n /**\n * Maximum width\n */\n @Prop() maxWidth: string = '90%';\n\n /**\n * Maximum height\n */\n @Prop() maxHeight: string = '90%';\n\n /**\n * Whether the modal content is scrollable\n */\n @Prop() scrollable: boolean = true;\n\n /**\n * Persistent mode - prevents closing on backdrop click\n */\n @Prop() persistent: boolean = false;\n\n /**\n * Loading state\n */\n @Prop() loading: boolean = false;\n\n /**\n * Whether to show the title area (for spacing)\n */\n @Prop() showTitle: boolean = true;\n\n /**\n * Close event\n */\n @Event() xplorClose: EventEmitter<void>;\n\n @Watch('open')\n handleOpenChange(newValue: boolean) {\n if (newValue) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n }\n\n disconnectedCallback() {\n document.body.style.overflow = '';\n }\n\n private handleBackdropClick = () => {\n if (!this.persistent) {\n this.closeModal();\n }\n };\n\n private handleCardClick = (event: Event) => {\n event.stopPropagation();\n };\n\n private closeModal = () => {\n this.open = false;\n this.xplorClose.emit();\n };\n\n render() {\n if (!this.open) {\n return null;\n }\n\n const cardClasses = {\n 'xplor-modal__card': true,\n 'xplor-modal__card--scrollable': this.scrollable,\n };\n\n const bodyClasses = {\n 'xplor-modal__body': true,\n 'xplor-modal__body--no-title': !this.showTitle,\n };\n\n return (\n <Host>\n <div class=\"xplor-modal__backdrop\" onClick={this.handleBackdropClick}>\n <div\n class={cardClasses}\n style={{\n width: this.width,\n maxWidth: this.maxWidth,\n maxHeight: this.maxHeight,\n }}\n onClick={this.handleCardClick}\n >\n <button\n type=\"button\"\n class=\"xplor-modal__close-btn\"\n onClick={this.closeModal}\n aria-label=\"Close modal\"\n data-testid=\"common-modal-close-button\"\n >\n ✕\n </button>\n\n <div class=\"xplor-modal__title\">\n <slot name=\"title\" />\n </div>\n\n <div class=\"xplor-modal__subtitle\">\n <slot name=\"subtitle\" />\n </div>\n\n <div class={bodyClasses}>\n {this.loading ? (\n <div class=\"xplor-modal__loading\">\n <div class=\"xplor-modal__spinner\"></div>\n </div>\n ) : (\n <slot name=\"body\" />\n )}\n </div>\n\n <div class=\"xplor-modal__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'xplor-modal-persistent',\n shadow: false,\n})\nexport class XplorModalPersistent {\n /**\n * Whether the modal is open\n */\n @Prop() open: boolean = false;\n\n /**\n * Modal width\n */\n @Prop() width: string = '600px';\n\n /**\n * Maximum width\n */\n @Prop() maxWidth: string = '90%';\n\n /**\n * Maximum height\n */\n @Prop() maxHeight: string = '90%';\n\n /**\n * Loading state\n */\n @Prop() loading: boolean = false;\n\n /**\n * Close event\n */\n @Event() xplorClose: EventEmitter<void>;\n\n render() {\n return (\n <Host>\n <xplor-modal\n open={this.open}\n width={this.width}\n maxWidth={this.maxWidth}\n maxHeight={this.maxHeight}\n loading={this.loading}\n persistent={true}\n onXplorClose={() => this.xplorClose.emit()}\n >\n <slot name=\"title\" slot=\"title\" />\n <slot name=\"subtitle\" slot=\"subtitle\" />\n <slot name=\"body\" slot=\"body\" />\n <slot name=\"actions\" slot=\"actions\" />\n </xplor-modal>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n\n.nav-tabs {\n display: flex;\n border-bottom: 2px solid #e0e0e0;\n gap: 0;\n\n &--grow {\n .nav-tabs__tab {\n flex: 1;\n }\n }\n}\n\n.nav-tabs__tab {\n background: none;\n border: none;\n padding: 0.75rem 1.5rem;\n font-family: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n color: #757575;\n position: relative;\n transition: color 0.2s;\n white-space: nowrap;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n &::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background-color: transparent;\n transition: background-color 0.2s;\n }\n\n &:hover:not(&--disabled) {\n color: #424242;\n }\n\n &:focus {\n outline: 2px solid #1976d2;\n outline-offset: -2px;\n }\n\n &--active {\n color: #1976d2;\n\n &::after {\n background-color: #1976d2;\n }\n\n .nav-tabs--secondary & {\n color: #9c27b0;\n\n &::after {\n background-color: #9c27b0;\n }\n }\n }\n\n &--disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n}\n\n.nav-tabs--secondary {\n .nav-tabs__tab {\n &:hover:not(.nav-tabs__tab--disabled) {\n color: #7b1fa2;\n }\n }\n}","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\n\nexport interface NavTabItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n@Component({\n tag: 'xplor-nav-tabs',\n styleUrl: 'xplor-nav-tabs.scss',\n scoped: true,\n})\nexport class XplorNavTabs {\n @Prop({ mutable: true }) value: string;\n @Prop() items: NavTabItem[] = [];\n @Prop() color: 'primary' | 'secondary' = 'primary';\n @Prop() grow: boolean = false;\n\n @Event() xplorChange: EventEmitter<string>;\n\n private handleTabClick = (item: NavTabItem) => {\n if (item.disabled) return;\n\n this.value = item.value;\n this.xplorChange.emit(item.value);\n };\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'nav-tabs': true,\n 'nav-tabs--grow': this.grow,\n [`nav-tabs--${this.color}`]: true,\n }}\n role=\"tablist\"\n >\n {this.items.map((item) => (\n <button\n key={item.value}\n class={{\n 'nav-tabs__tab': true,\n 'nav-tabs__tab--active': this.value === item.value,\n 'nav-tabs__tab--disabled': item.disabled,\n }}\n onClick={() => this.handleTabClick(item)}\n disabled={item.disabled}\n role=\"tab\"\n aria-selected={this.value === item.value ? 'true' : 'false'}\n type=\"button\"\n >\n {item.label}\n </button>\n ))}\n <slot />\n </div>\n </Host>\n );\n }\n}\n","@use '../../styles/colours.scss' as colours;\n@use '../../styles/spacing.scss' as spacing;\n\n:host {\n display: block;\n}\n\n.section-card {\n background: white;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &--outlined {\n border: 2px solid #D0C7E5;\n }\n\n &--rounded {\n border-radius: 1rem;\n }\n\n &__body {\n flex: 1;\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 0.5rem;\n\n &:empty {\n display: none;\n }\n }\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-section-card',\n styleUrl: 'xplor-section-card.scss',\n scoped: true,\n})\nexport class XplorSectionCard {\n @Prop() outlined: boolean = true;\n @Prop() rounded: boolean = true;\n @Prop() padding: string = '1.5rem';\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'section-card': true,\n 'section-card--outlined': this.outlined,\n 'section-card--rounded': this.rounded,\n }}\n style={{ padding: this.padding }}\n >\n <slot name=\"title\" />\n <slot name=\"subtitle\" />\n <div class=\"section-card__body\">\n <slot name=\"body\" />\n </div>\n <div class=\"section-card__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n font-size: 1rem;\n}\n\n.section-heading {\n line-height: 1.33;\n letter-spacing: 3.2px;\n text-transform: uppercase;\n font-weight: 500;\n\n &--small {\n font-size: 0.9em;\n }\n\n &--large {\n font-size: 1.1em;\n }\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-section-heading',\n styleUrl: 'xplor-section-heading.scss',\n scoped: true,\n})\nexport class XplorSectionHeading {\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n @Prop() text: string;\n\n render() {\n return (\n <Host>\n <span\n class={{\n 'section-heading': true,\n 'section-heading--small': this.size === 'small',\n 'section-heading--large': this.size === 'large',\n }}\n >\n <slot>{this.text}</slot>\n </span>\n </Host>\n );\n }\n}\n","import {\n Component,\n Prop,\n State,\n Element,\n Event,\n EventEmitter,\n h,\n Watch,\n Host,\n} from '@stencil/core';\nconst getIconType = (sortType) => {\n switch (sortType) {\n case 'asc':\n return 'arrow-up';\n case 'desc':\n return 'arrow-down';\n default:\n return 'dash';\n }\n};\n\n@Component({\n tag: 'xplor-table',\n // styleUrl: 'xplor-table.scss',\n shadow: true,\n})\n\nexport class XplorTable {\n @Element() el: HTMLXplorTableElement;\n\n /**\n * The header values for each column.\n */\n @Prop() columns?: string[];\n\n /**\n * The data for the body of the table.\n */\n @Prop() data?: string[][];\n\n /**\n * When true, the first column of the table is sticky and will cover the leftmost rows in a horizontally scrollable container.\n */\n @Prop() freeze?: boolean;\n\n /**\n * Toggles a selectable checkbox for each row in the table\n */\n @Prop() multiselect?: boolean;\n\n /**\n * Toggles an optional styling of the background of each even row of the table body.\n */\n @Prop() striped?: boolean;\n\n /**\n * The values for the input for each row when multiselect is activated.\n */\n @Prop() selectedValues?: string[] = [];\n\n /**\n * Toggles to show the sort button on each table head\n */\n @Prop() isSortable?: boolean = true;\n\n /**\n * Manually determined if the column is sortable\n */\n @Prop() sortableColumns?: boolean[] = [];\n\n @State() areAllSelected = false;\n\n @State() rowData: string[][];\n\n @State() hasScrolled = false;\n\n @State() selected: (string | boolean)[];\n\n @State() sortTypeArray: ('asc' | 'desc' | null)[] = [];\n @State() selectedDateRange: string = 'All';\n /**\n * Callback function that is called when the checkbox for a row of a\n * `multiselect` table is checked\n */\n @State() currentPage: number = 1;\n @State() totalPages: number = 3;\n @Event() tableSelect: EventEmitter;\n private handlePagination = (direction: 'first' | 'prev' | 'next' | 'last') => {\n switch (direction) {\n case 'first':\n this.currentPage = 1;\n break;\n case 'prev':\n if (this.currentPage > 1) this.currentPage--;\n break;\n case 'next':\n if (this.currentPage < this.totalPages) this.currentPage++;\n break;\n case 'last':\n this.currentPage = this.totalPages;\n break;\n }\n };\n \n private handleDateRangeChange = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n this.selectedDateRange = target.value;\n };\n\n private handleFilterReports = () => {\n console.log('Filter reports clicked');\n };\n\n private handleDownloadAll = () => {\n console.log('Download all clicked');\n };\n\n // private handleDownloadReport = (index: number) => {\n // console.log(`Download report ${index} clicked`);\n // };\n private selectAllValue = Math.random().toString(36).slice(2);\n\n private container!: HTMLDivElement;\n\n private selectAll = (e: Event) => {\n const { target } = e;\n\n if (!(target instanceof HTMLInputElement)) return;\n\n const { checked } = target;\n\n this.areAllSelected = checked;\n\n this.selected =\n this.selectedValues.length > 0\n ? // gets all checkboxes in body\n Array.from(\n this.el.querySelectorAll('tbody td:first-child input'),\n ).map((input: HTMLInputElement) =>\n // if the select all checkbox is checked, return\n // the value from the current input. If false, set all to false.\n checked ? input?.value : checked,\n )\n : this.selected.map(() => checked);\n this.onChange();\n };\n\n private selectOne = (e: Event, checkboxIdx: number) => {\n const { target } = e;\n if (!(target instanceof HTMLInputElement)) return;\n\n const { checked, value } = target;\n\n this.areAllSelected = false;\n this.selected = this.selected.map((v, selectedIdx) => {\n // if the checkbox that fired the event is not the current idx\n // return the current value\n if (selectedIdx !== checkboxIdx) return v;\n\n /**\n * If there are values in this.selectedValues, either return the value\n * for that checkbox or false, dependent on if the checkbox is checked or not.\n * If there are no values in this.selectedValues, return the value\n * to either true or false, dependent on if the checkbox is checked or not.\n *\n */\n return this.selectedValues.length > 0\n ? checked\n ? value\n : checked\n : checked;\n });\n this.onChange();\n };\n\n private onChange = () => {\n this.tableSelect.emit({\n selected: this.selected,\n areAllSelected: this.areAllSelected,\n });\n };\n\n private onScroll = () => {\n this.hasScrolled = this.container.scrollLeft > 0;\n };\n\n private sortBy = (col: number) => {\n this.sortTypeArray = this.sortTypeArray.map((val, idx) => {\n if (idx !== col) return null;\n\n switch (val) {\n case 'asc':\n return 'desc';\n case 'desc':\n return null;\n default:\n return 'asc';\n }\n });\n\n const handleSort = (a, b) => {\n if (a[col].toLocaleLowerCase() < b[col].toLocaleLowerCase()) {\n return -1;\n }\n if (a[col].toLocaleLowerCase() > b[col].toLocaleLowerCase()) {\n return 1;\n }\n return 0;\n };\n\n if (this.sortTypeArray[col] === 'asc') {\n this.rowData.sort((a, b) => handleSort(a, b));\n } else if (this.sortTypeArray[col] === 'desc') {\n this.rowData.sort((a, b) => handleSort(b, a));\n } else {\n this.rowData = this.data;\n this.sortTypeArray[col] = null;\n }\n\n this.rowData = Array.from(this.rowData);\n this.render();\n };\n\n private setData = () => {\n this.rowData = this.data !== undefined ? Array.from(this.data) : [];\n };\n\n // Add this method to paginate rowData\nprivate getPaginatedData(): string[][] {\n const startIndex = (this.currentPage - 1) * 10;\n const endIndex = startIndex + 10;\n return this.rowData.slice(startIndex, endIndex);\n}\n\n @Watch('data')\n watchData() {\n this.setData();\n }\n\n componentWillLoad() {\n this.areAllSelected = false;\n this.setData();\n this.selected = new Array(this.rowData.length).fill(false);\n // Fill the Sort Type Array to default null depends on number of columns\n this.sortTypeArray = this.columns && this.columns.map(() => null);\n }\n\n render() {\n let className = 'xpl-table';\n if (this.striped) className += ' xpl-table--striped';\n if (this.freeze) className += ' xpl-table--freeze';\n if (this.hasScrolled) className += ' xpl-table--has-scrolled';\n\n const paginatedData = this.getPaginatedData();\n\n return (\n <Host class=\"xplor-table\">\n <div class=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6 max-w-6xl mx-auto\">\n <div\n class=\"xpl-table-container\"\n onScroll={this.onScroll}\n ref={(el) => {\n this.container = el;\n }}\n >\n {/* Header */}\n <div class=\"mb-6\">\n <h1 class=\"text-xl font-semibold text-gray-900 mb-4\">Head Counts Report</h1>\n \n {/* Filter Controls */}\n <div class=\"flex flex-wrap items-center gap-4 mb-6\">\n <div class=\"flex items-center gap-2\">\n <label class=\"text-sm text-gray-600 font-medium\">Date Range</label>\n <select \n class=\"border border-gray-300 rounded px-3 py-1.5 text-sm bg-white focus:outline-none focus:ring-2 focus:ring-teal-500 focus:border-teal-500\"\n // value={this.selectedDateRange}\n onInput={this.handleDateRangeChange}\n >\n <option value=\"All\">All</option>\n <option value=\"Today\">Today</option>\n <option value=\"This Week\">This Week</option>\n <option value=\"This Month\">This Month</option>\n <option value=\"Custom\">Custom Range</option>\n </select>\n <button class=\"p-1.5 border border-gray-300 rounded hover:bg-gray-50\">\n <svg class=\"w-4 h-4 text-gray-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </button>\n </div>\n \n <button \n onClick={this.handleFilterReports}\n class=\"bg-teal-600 hover:bg-teal-700 text-white px-4 py-1.5 rounded text-sm font-medium transition-colors\"\n >\n Filter Reports\n </button>\n \n <button \n onClick={this.handleDownloadAll}\n class=\"flex items-center gap-2 text-gray-600 hover:text-gray-800 text-sm\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"/>\n </svg>\n Download All\n </button>\n </div>\n </div>\n\n <table class={`w-full ${className}`}>\n {this.columns && (\n <thead>\n {this.columns.map((column, i) => {\n const iconType = getIconType(\n this.sortTypeArray[i],\n );\n const isColumnSortable = !!(\n this.isSortable &&\n this.sortableColumns[i]\n );\n return (\n <th class=\"text-left py-3 px-4 text-sm font-medium text-gray-600\">\n {this.multiselect && i === 0 ? (\n <label\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n debugger\n if (isColumnSortable) {\n this.sortBy(i);\n }\n }}\n class={\n isColumnSortable\n ? 'cursor-pointer'\n : ''\n }\n >\n <input\n checked={\n this.areAllSelected\n }\n id=\"__xpl-table-th\"\n // appear indeterminate when at least one but not all\n // are selected\n\n indeterminate={\n !this\n .areAllSelected &&\n this.selected.some(\n (a) => a,\n )\n }\n onClick={(e) => {\n e.stopPropagation();\n this.selectAll(e);\n }}\n type=\"checkbox\"\n value={`select-all-${this.selectAllValue}`}\n />\n {column}\n {isColumnSortable &&\n !!this.sortTypeArray[\n i\n ] && (\n <xpl-icon\n icon={iconType}\n size={16}\n ></xpl-icon>\n )}\n </label>\n ) : (\n <label\n onClick={() =>\n isColumnSortable &&\n this.sortBy(i)\n }\n class={\n isColumnSortable\n ? 'cursor-pointer'\n : ''\n }\n >\n {column}\n {isColumnSortable &&\n !!this.sortTypeArray[\n i\n ] && (\n <svg width=\"11\" height=\"6\" viewBox=\"0 0 11 6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.5 5.5L5.5 0.5L0.5 5.5L10.5 5.5Z\" fill=\"currentColor\"></path></svg>\n // <xpl-icon\n // icon={iconType}\n // size={16}\n // id=\"__xpl-icon-sort\"\n // ></xpl-icon>\n )}\n </label>\n )}\n </th>\n );\n })}\n </thead>\n )}\n <tbody>\n {paginatedData.map((row, rowNum) => (\n <tr\n class={`border-b border-gray-100 hover:bg-gray-50`}\n >\n {row.map((cell, i) => (\n <td class=\"py-3 px-4 text-sm text-gray-900\">\n {this.multiselect && i === 0 ? (\n <label\n class=\"flex items-center gap-2\"\n htmlFor={`__xpl-table-row-${\n rowNum\n }`}\n >\n <input\n id={`__xpl-table-row-${\n rowNum\n }`}\n checked={\n !!this.selected[\n rowNum\n ]\n }\n type=\"checkbox\"\n onChange={(e) =>\n this.selectOne(\n e,\n rowNum,\n )\n }\n value={\n this.selectedValues\n .length > 0\n ? this\n .selectedValues[\n rowNum\n ]\n : `xpl-table-checkbox-${rowNum}`\n }\n />\n <div innerHTML={cell} />\n </label>\n ) : (\n <div innerHTML={cell} />\n )}\n </td>\n ))}\n </tr>\n ))}\n \n </tbody>\n </table>\n {/* Pagination */}\n <div id=\"pagination\" class=\"w-full flex items-center justify-between mt-6 text-sm\">\n <div class=\"flex items-center gap-2\">\n <button \n onClick={() => this.handlePagination('first')}\n class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n disabled={this.currentPage === 1}\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\"/>\n </svg>\n </button>\n <button \n onClick={() => this.handlePagination('prev')}\n class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n disabled={this.currentPage === 1}\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"/>\n </svg>\n </button>\n </div>\n\n <span class=\"text-gray-600\">\n Page {this.currentPage} of {this.totalPages}\n </span>\n\n <div class=\"flex items-center gap-2\">\n <button \n onClick={() => this.handlePagination('next')}\n class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n disabled={this.currentPage === this.totalPages}\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n </button>\n <button \n onClick={() => this.handlePagination('last')}\n class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n disabled={this.currentPage === this.totalPages}\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 5l7 7-7 7M5 5l7 7-7 7\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n </Host>\n\n );\n }\n}\n\n\n\n\n////////////// ######################## ///////////////////////////////// This code is commented out as it is not currently in use.\n\n\n\n\n// import { Component, Prop, State, h } from '@stencil/core';\n// import { StyledHost } from '../x-styles/x-styles';\n\n// interface ReportData {\n// submitDate: string;\n// time: string;\n// educatorName: string;\n// room: string;\n// }\n\n\n// @Component({\n// tag: 'xplor-table',\n// styleUrl: 'xplor-table.scss',\n// shadow: true,\n// })\n\n\n// export class XplorTable {\n// @State() selectedDateRange: string = 'All';\n// @State() currentPage: number = 1;\n// @State() totalPages: number = 1;\n// @State() sortBy: string = '';\n// @State() sortDirection: 'asc' | 'desc' = 'asc';\n// @Prop() tablecContent: ReportData[]\n// private reportData: ReportData[] = [\n// {\n// submitDate: '14/01/2025',\n// time: '10:01:21',\n// educatorName: 'Andi Kelman',\n// room: '2025 Holiday Programme'\n// },\n// {\n// submitDate: '10/10/2023',\n// time: '10:44:46',\n// educatorName: 'Andi Kelman',\n// room: '3 Kinder 3 - 23'\n// },\n// {\n// submitDate: '10/10/2023',\n// time: '10:36:15',\n// educatorName: 'Andi Kelman',\n// room: '3 Kinder 3 - 23'\n// },\n// {\n// submitDate: '28/03/2023',\n// time: '15:51:51',\n// educatorName: 'Cara Bierenkrant',\n// room: '8 KINDER 8 - CRECHE Kinder 8 2023'\n// }\n// ];\n\n// private handleDateRangeChange = (event: Event) => {\n// const target = event.target as HTMLSelectElement;\n// this.selectedDateRange = target.value;\n// };\n\n// private handleFilterReports = () => {\n// console.log('Filter reports clicked');\n// };\n\n// private handleDownloadAll = () => {\n// console.log('Download all clicked');\n// };\n\n// private handleDownloadReport = (index: number) => {\n// console.log(`Download report ${index} clicked`);\n// };\n\n// private handleSort = (column: string) => {\n// if (this.sortBy === column) {\n// this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n// } else {\n// this.sortBy = column;\n// this.sortDirection = 'asc';\n// }\n// };\n\n// private handlePagination = (direction: 'first' | 'prev' | 'next' | 'last') => {\n// switch (direction) {\n// case 'first':\n// this.currentPage = 1;\n// break;\n// case 'prev':\n// if (this.currentPage > 1) this.currentPage--;\n// break;\n// case 'next':\n// if (this.currentPage < this.totalPages) this.currentPage++;\n// break;\n// case 'last':\n// this.currentPage = this.totalPages;\n// break;\n// }\n// };\n\n// private getSortIcon(column: string) {\n// if (this.sortBy !== column) {\n// // Unsorted\n// return (\n// <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 9l4-4 4 4m0 6l-4 4-4-4\"/>\n// </svg>\n// );\n// }\n// if (this.sortDirection === 'asc') {\n// // Ascending\n// return (\n// <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 15l4-4 4 4\"/>\n// </svg>\n// );\n// }\n// // Descending\n// return (\n// <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 9l-4 4-4-4\"/>\n// </svg>\n// );\n// }\n\n// render() {\n// return (\n// <StyledHost class=\"xplor-table\">\n// <div class=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6 max-w-6xl mx-auto\">\n// {/* Header */}\n// <div class=\"mb-6\">\n// <h1 class=\"text-xl font-semibold text-gray-900 mb-4\">Head Counts Report</h1>\n \n// {/* Filter Controls */}\n// <div class=\"flex flex-wrap items-center gap-4 mb-6\">\n// <div class=\"flex items-center gap-2\">\n// <label class=\"text-sm text-gray-600 font-medium\">Date Range</label>\n// <select \n// class=\"border border-gray-300 rounded px-3 py-1.5 text-sm bg-white focus:outline-none focus:ring-2 focus:ring-teal-500 focus:border-teal-500\"\n// // value={this.selectedDateRange}\n// onInput={this.handleDateRangeChange}\n// >\n// <option value=\"All\">All</option>\n// <option value=\"Today\">Today</option>\n// <option value=\"This Week\">This Week</option>\n// <option value=\"This Month\">This Month</option>\n// <option value=\"Custom\">Custom Range</option>\n// </select>\n// <button class=\"p-1.5 border border-gray-300 rounded hover:bg-gray-50\">\n// <svg class=\"w-4 h-4 text-gray-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n// </svg>\n// </button>\n// </div>\n \n// <button \n// onClick={this.handleFilterReports}\n// class=\"bg-teal-600 hover:bg-teal-700 text-white px-4 py-1.5 rounded text-sm font-medium transition-colors\"\n// >\n// Filter Reports\n// </button>\n \n// <button \n// onClick={this.handleDownloadAll}\n// class=\"flex items-center gap-2 text-gray-600 hover:text-gray-800 text-sm\"\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"/>\n// </svg>\n// Download All\n// </button>\n// </div>\n// </div>\n\n// {/* Table */}\n// <div class=\"overflow-x-auto\">\n// <table class=\"w-full\">\n// <thead>\n// <tr class=\"border-b border-gray-200\">\n// <th class=\"text-left py-3 px-4 text-sm font-medium text-gray-600\">\n// <button \n// onClick={() => this.handleSort('submitDate')}\n// class=\"flex items-center gap-1 hover:text-gray-900\"\n// >\n// Submit Date\n// {this.getSortIcon('submitDate')}\n// </button>\n// </th>\n// <th class=\"text-left py-3 px-4 text-sm font-medium text-gray-600\">\n// <button \n// onClick={() => this.handleSort('time')}\n// class=\"flex items-center gap-1 hover:text-gray-900\"\n// >\n// Time\n// {this.getSortIcon('time')}\n// </button>\n// </th>\n// <th class=\"text-left py-3 px-4 text-sm font-medium text-gray-600\">\n// <button \n// onClick={() => this.handleSort('educatorName')}\n// class=\"flex items-center gap-1 hover:text-gray-900\"\n// >\n// Educator Name\n// {this.getSortIcon('educatorName')}\n// </button>\n// </th>\n// <th class=\"text-left py-3 px-4 text-sm font-medium text-gray-600\">\n// <button \n// onClick={() => this.handleSort('room')}\n// class=\"flex items-center gap-1 hover:text-gray-900\"\n// >\n// Room(s)\n// {this.getSortIcon('room')}\n// </button>\n// </th>\n// <th class=\"text-center py-3 px-4 text-sm font-medium text-gray-600\">\n// Download Report\n// </th>\n// </tr>\n// </thead>\n// <tbody>\n// {this.reportData.map((row, index) => (\n// <tr key={index} class=\"border-b border-gray-100 hover:bg-gray-50\">\n// <td class=\"py-3 px-4 text-sm text-gray-900\">{row.submitDate}</td>\n// <td class=\"py-3 px-4 text-sm text-gray-900\">{row.time}</td>\n// <td class=\"py-3 px-4 text-sm text-gray-900\">{row.educatorName}</td>\n// <td class=\"py-3 px-4 text-sm text-gray-900\">{row.room}</td>\n// <td class=\"py-3 px-4 text-center\">\n// <div class=\"flex items-center justify-center gap-2\">\n// <span class=\"bg-gray-100 text-gray-700 px-2 py-1 rounded text-xs\">\n// Toggle SortBy\n// </span>\n// <button \n// onClick={() => this.handleDownloadReport(index)}\n// class=\"p-1.5 text-teal-600 hover:text-teal-800 hover:bg-teal-50 rounded\"\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"/>\n// </svg>\n// </button>\n// </div>\n// </td>\n// </tr>\n// ))}\n// </tbody>\n// </table>\n// </div>\n\n// {/* Pagination */}\n// <div class=\"flex items-center justify-between mt-6 text-sm\">\n// <div class=\"flex items-center gap-2\">\n// <button \n// onClick={() => this.handlePagination('first')}\n// class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n// disabled={this.currentPage === 1}\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\"/>\n// </button>\n// <button \n// onClick={() => this.handlePagination('prev')}\n// class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n// disabled={this.currentPage === 1}\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"/>\n// </button>\n// </div>\n\n// <span class=\"text-gray-600\">\n// Page {this.currentPage} of {this.totalPages}\n// </span>\n\n// <div class=\"flex items-center gap-2\">\n// <button \n// onClick={() => this.handlePagination('next')}\n// class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n// disabled={this.currentPage === this.totalPages}\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n// </button>\n// <button \n// onClick={() => this.handlePagination('last')}\n// class=\"p-1.5 text-gray-400 hover:text-gray-600 disabled:opacity-50\"\n// disabled={this.currentPage === this.totalPages}\n// >\n// <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n// <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 5l7 7-7 7M5 5l7 7-7 7\"/>\n// </svg>\n// </button>\n// </div>\n// </div>\n// </div>\n// </StyledHost>\n// );\n// }\n// }",":host {\n display: block;\n}\n\n.text-bubble {\n border-radius: 16px;\n padding: 12px;\n color: #000;\n\n &--green {\n border: 1px solid #00B2A8;\n background: #DFF2F1;\n }\n\n &--orange {\n border: 1px solid #F28602;\n background: #FEF2E0;\n }\n}\n","import { Component, Host, h, Prop } from '@stencil/core';\n\n@Component({\n tag: 'xplor-text-bubble',\n styleUrl: 'xplor-text-bubble.scss',\n scoped: true,\n})\nexport class XplorTextBubble {\n @Prop() color: 'green' | 'orange' = 'orange';\n\n render() {\n return (\n <Host>\n <div\n class={{\n 'text-bubble': true,\n 'text-bubble--green': this.color === 'green',\n 'text-bubble--orange': this.color === 'orange',\n }}\n >\n <slot />\n </div>\n </Host>\n );\n }\n}\n","@use '../../styles/colours.scss' as colours;\n@use '../../styles/spacing.scss' as spacing;\n@use '../../styles/mixins.scss' as mixins;\n\n:host {\n display: block;\n}\n\n.xplor-text-field {\n position: relative;\n width: 100%;\n\n &__wrapper {\n position: relative;\n display: flex;\n align-items: center;\n border-radius: 16px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n &__input-wrapper {\n position: relative;\n flex: 1;\n display: flex;\n align-items: center;\n min-height: 56px;\n padding: 0 12px;\n }\n\n &__input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: 1rem;\n line-height: 1.5;\n padding: 8px 0;\n color: rgba(0, 0, 0, 0.87);\n margin-top: 8px;\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 &__label {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n font-size: 1rem;\n color: rgba(0, 0, 0, 0.6);\n background-color: transparent;\n padding: 0 4px;\n max-width: calc(100% - 24px);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &--floating {\n top: 0;\n transform: translateY(0);\n font-size: 0.75rem;\n background-color: inherit;\n }\n }\n\n &__required {\n color: colours.$error;\n margin-left: 2px;\n }\n\n &__append-inner {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n }\n\n &__append {\n display: flex;\n align-items: center;\n padding-right: 8px;\n }\n\n &__clear-btn {\n @include mixins.reset-button;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n color: rgba(0, 0, 0, 0.54);\n transition: all 0.2s ease;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.87);\n }\n\n &:focus-visible {\n @include mixins.focus-ring;\n }\n }\n\n // Outlined variant (fieldset border)\n &__outline {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n margin: 0;\n padding: 0;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 16px;\n pointer-events: none;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n &__outline-legend {\n padding: 0 4px;\n font-size: 0.75rem;\n visibility: hidden;\n max-width: 0.01px;\n transition: max-width 0.05s cubic-bezier(0, 0, 0.2, 1);\n white-space: nowrap;\n\n &--floating {\n max-width: 100%;\n transition: max-width 0.1s cubic-bezier(0.4, 0, 0.2, 1) 0.05s;\n }\n\n span {\n padding: 0 4px;\n display: inline-block;\n }\n }\n\n &__details {\n padding: 4px 12px 0;\n min-height: 22px;\n }\n\n &__error-messages {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n &__error {\n font-size: 0.75rem;\n line-height: 1.5;\n color: colours.$error;\n }\n\n // Focused state\n &--focused {\n .xplor-text-field__outline {\n border-width: 2px;\n }\n\n .xplor-text-field__label {\n color: colours.$secondary;\n }\n }\n\n // Dirty state (field has been modified)\n &--dirty {\n .xplor-text-field__outline {\n border-color: #008480;\n border-width: 2px;\n }\n\n .xplor-text-field__label {\n color: #008480;\n }\n }\n\n // Error state\n &--error {\n .xplor-text-field__outline {\n border-color: colours.$error;\n }\n\n .xplor-text-field__label {\n color: colours.$error;\n }\n }\n\n // Disabled state\n &--disabled {\n opacity: 0.6;\n\n .xplor-text-field__outline {\n border-style: dashed;\n }\n\n .xplor-text-field__input {\n cursor: not-allowed;\n }\n }\n\n // Readonly state\n &--readonly {\n .xplor-text-field__input {\n cursor: default;\n }\n }\n\n // Color variants\n &--primary {\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-color: colours.$primary;\n }\n\n .xplor-text-field__label {\n color: colours.$primary;\n }\n }\n }\n\n &--secondary {\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-color: colours.$secondary;\n }\n\n .xplor-text-field__label {\n color: colours.$secondary;\n }\n }\n }\n\n &--success {\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-color: colours.$success;\n }\n\n .xplor-text-field__label {\n color: colours.$success;\n }\n }\n }\n\n &--warning {\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-color: colours.$warning;\n }\n\n .xplor-text-field__label {\n color: colours.$warning;\n }\n }\n }\n\n &--info {\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-color: colours.$info;\n }\n\n .xplor-text-field__label {\n color: colours.$info;\n }\n }\n }\n\n // Filled variant\n &--filled {\n .xplor-text-field__wrapper {\n background-color: rgba(0, 0, 0, 0.06);\n border-radius: 4px 4px 0 0;\n }\n\n .xplor-text-field__outline {\n border: none;\n border-bottom: 1px solid rgba(0, 0, 0, 0.42);\n border-radius: 0;\n }\n\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-bottom-width: 2px;\n }\n }\n }\n\n // Underlined variant\n &--underlined {\n .xplor-text-field__wrapper {\n background-color: transparent;\n }\n\n .xplor-text-field__outline {\n border: none;\n border-bottom: 1px solid rgba(0, 0, 0, 0.42);\n border-radius: 0;\n }\n\n &.xplor-text-field--focused {\n .xplor-text-field__outline {\n border-bottom-width: 2px;\n }\n }\n }\n}\n","import { Component, Host, h, Prop, State, Event, EventEmitter, Watch, Element } from '@stencil/core';\n\n@Component({\n tag: 'xplor-text-field',\n styleUrl: 'xplor-text-field.scss',\n scoped: true,\n})\nexport class XplorTextField {\n @Element() el: HTMLElement;\n\n /**\n * The current value of the text field\n */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * The label text for the input\n */\n @Prop() label: string = '';\n\n /**\n * Placeholder text when input is empty\n */\n @Prop() placeholder: string = '';\n\n /**\n * Input type (text, email, password, number, etc.)\n */\n @Prop() type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' = 'text';\n\n /**\n * Color variant (primary, secondary, success, error, warning, info)\n */\n @Prop() color: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' = 'secondary';\n\n /**\n * Visual variant style\n */\n @Prop() variant: 'outlined' | 'filled' | 'underlined' = 'outlined';\n\n /**\n * Background color\n */\n @Prop() bgColor: string = 'white';\n\n /**\n * Error messages to display\n */\n @Prop() errorMessages: string[] = [];\n\n /**\n * When to show details: true (always), false (never), 'auto' (only when error)\n */\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n\n /**\n * Whether the field is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the field is readonly\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Whether the field is required\n */\n @Prop() required: boolean = false;\n\n /**\n * Whether the field has been modified (dirty state)\n */\n @Prop() isDirty: boolean = false;\n\n /**\n * Whether the field should be clearable\n */\n @Prop() clearable: boolean = false;\n\n /**\n * Custom CSS classes to apply\n */\n @Prop() customClass: string = '';\n\n /**\n * Maximum length of input\n */\n @Prop() maxlength: number;\n\n /**\n * Minimum value (for number type)\n */\n @Prop() min: number;\n\n /**\n * Maximum value (for number type)\n */\n @Prop() max: number;\n\n /**\n * Internal focused state\n */\n @State() isFocused: boolean = false;\n\n /**\n * Internal hasValue state\n */\n @State() hasValue: boolean = false;\n\n /**\n * Emitted when value changes\n */\n @Event() valueChange: EventEmitter<string>;\n\n /**\n * Emitted when input loses focus\n */\n @Event() inputBlur: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when input gains focus\n */\n @Event() inputFocus: EventEmitter<FocusEvent>;\n\n /**\n * Emitted when clear button is clicked\n */\n @Event() clearClick: EventEmitter<void>;\n\n private inputElement?: HTMLInputElement;\n\n @Watch('value')\n handleValueChange(newValue: string) {\n this.hasValue = !!newValue;\n }\n\n componentWillLoad() {\n this.hasValue = !!this.value;\n }\n\n private handleInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n this.value = target.value;\n this.valueChange.emit(target.value);\n };\n\n private handleFocus = (e: FocusEvent) => {\n this.isFocused = true;\n this.inputFocus.emit(e);\n };\n\n private handleBlur = (e: FocusEvent) => {\n this.isFocused = false;\n this.inputBlur.emit(e);\n };\n\n private handleClear = (e: MouseEvent) => {\n e.stopPropagation();\n this.value = '';\n this.valueChange.emit('');\n this.clearClick.emit();\n if (this.inputElement) {\n this.inputElement.focus();\n }\n };\n\n private get hasError(): boolean {\n return this.errorMessages && this.errorMessages.length > 0;\n }\n\n private get showDetails(): boolean {\n if (typeof this.hideDetails === 'boolean') {\n return !this.hideDetails;\n }\n // hideDetails === 'auto'\n return this.hasError;\n }\n\n private get computedClasses(): { [key: string]: boolean } {\n return {\n 'xplor-text-field': true,\n [`xplor-text-field--${this.variant}`]: true,\n [`xplor-text-field--${this.color}`]: true,\n 'xplor-text-field--focused': this.isFocused,\n 'xplor-text-field--error': this.hasError,\n 'xplor-text-field--disabled': this.disabled,\n 'xplor-text-field--readonly': this.readonly,\n 'xplor-text-field--dirty': this.isDirty,\n 'xplor-text-field--has-value': this.hasValue || this.isFocused,\n [this.customClass]: !!this.customClass,\n };\n }\n\n render() {\n const labelFloating = this.isFocused || this.hasValue;\n\n return (\n <Host>\n <div class={this.computedClasses}>\n <div class=\"xplor-text-field__wrapper\" style={{ backgroundColor: this.bgColor }}>\n <div class=\"xplor-text-field__input-wrapper\">\n {/* Label */}\n {this.label && (\n <label\n class={{\n 'xplor-text-field__label': true,\n 'xplor-text-field__label--floating': labelFloating,\n }}\n >\n <slot name=\"label\">{this.label}</slot>\n {this.required && <span class=\"xplor-text-field__required\">*</span>}\n </label>\n )}\n\n {/* Input */}\n <input\n ref={(el) => (this.inputElement = el)}\n class=\"xplor-text-field__input\"\n type={this.type}\n value={this.value}\n placeholder={this.isFocused ? this.placeholder : ''}\n disabled={this.disabled}\n readonly={this.readonly}\n required={this.required}\n maxlength={this.maxlength}\n min={this.min}\n max={this.max}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n aria-invalid={this.hasError ? 'true' : 'false'}\n aria-describedby={this.hasError ? 'error-messages' : undefined}\n />\n\n {/* Append Inner Slot */}\n <div class=\"xplor-text-field__append-inner\">\n {this.clearable && this.hasValue && !this.disabled && !this.readonly && (\n <button\n type=\"button\"\n class=\"xplor-text-field__clear-btn\"\n onClick={this.handleClear}\n aria-label=\"Clear\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" />\n </svg>\n </button>\n )}\n <slot name=\"append-inner\" />\n </div>\n\n {/* Field Outline */}\n <fieldset class=\"xplor-text-field__outline\">\n <legend class={{ 'xplor-text-field__outline-legend': true, 'xplor-text-field__outline-legend--floating': labelFloating }}>\n {labelFloating && this.label ? <span>{this.label}{this.required && '*'}</span> : <span></span>}\n </legend>\n </fieldset>\n </div>\n\n {/* Append Slot (outside input wrapper) */}\n <div class=\"xplor-text-field__append\">\n <slot name=\"append\" />\n </div>\n </div>\n\n {/* Details (error messages) */}\n {this.showDetails && (\n <div class=\"xplor-text-field__details\">\n {this.hasError && (\n <div id=\"error-messages\" class=\"xplor-text-field__error-messages\">\n {this.errorMessages.map((error) => (\n <div class=\"xplor-text-field__error\">{error}</div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n width: 100%;\n}\n\n.time-picker {\n position: relative;\n width: 100%;\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &__label {\n display: block;\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 position: relative;\n display: flex;\n align-items: center;\n border: 1px solid rgba(0, 0, 0, 0.23);\n border-radius: 1rem;\n transition: border-color 0.2s ease;\n background: white;\n\n &:focus-within {\n border-color: #008480;\n border-width: 2px;\n\n .time-picker__input {\n padding: calc(0.875rem - 1px) calc(1rem - 1px);\n }\n }\n }\n\n &--error &__field {\n border-color: #d32f2f;\n }\n\n &__input {\n flex: 1;\n width: 100%;\n padding: 0.875rem 1rem;\n font-size: 1rem;\n font-family: inherit;\n border: none;\n border-radius: 1rem;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: rgba(0, 0, 0, 0.38);\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding-right: 0.5rem;\n flex-shrink: 0;\n }\n\n &__clear {\n background: none;\n border: none;\n font-size: 1.25rem;\n cursor: pointer;\n padding: 0;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: #f5f5f5;\n color: #212121;\n }\n }\n\n &__icon-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n border-radius: 50%;\n transition: background-color 0.2s;\n\n &:hover:not(:disabled) {\n background-color: #f5f5f5;\n color: #212121;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n &__icon-svg {\n display: block;\n }\n\n &__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n background-color: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 1rem;\n }\n\n &__columns {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n &__column {\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 48px;\n\n &--period {\n margin-left: 0.5rem;\n }\n }\n\n &__separator {\n font-size: 1.25rem;\n font-weight: 600;\n color: #424242;\n padding: 0 0.125rem;\n align-self: center;\n }\n\n &__spinner-btn {\n background: none;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n cursor: pointer;\n padding: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n transition: background-color 0.2s, border-color 0.2s;\n width: 100%;\n\n &:hover {\n background-color: #f5f5f5;\n border-color: #bdbdbd;\n color: #212121;\n }\n }\n\n &__value {\n font-size: 1.5rem;\n font-weight: 600;\n color: #212121;\n padding: 0.5rem 0;\n text-align: center;\n min-width: 48px;\n font-variant-numeric: tabular-nums;\n\n &--period {\n font-size: 1rem;\n font-weight: 500;\n color: #008480;\n }\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","import { Component, Host, h, Prop, State, Event, EventEmitter, Element, Listen } from '@stencil/core';\n\n@Component({\n tag: 'xplor-time-picker',\n styleUrl: 'xplor-time-picker.scss',\n scoped: true,\n})\nexport class XplorTimePicker {\n @Element() el: HTMLElement;\n\n /** Time value in HH:mm:ss 24-hour format */\n @Prop({ mutable: true }) value: string = '';\n\n @Prop() label: string = '';\n @Prop() placeholder: string = 'Select time';\n @Prop() clearable: boolean = false;\n\n /** Auto-fill current time on focus if value is empty */\n @Prop() prefill: boolean = false;\n\n @Prop() bgColor: string = 'white';\n @Prop() showSeconds: boolean = false;\n @Prop() disabled: boolean = false;\n @Prop() readonly: boolean = false;\n @Prop() error: string = '';\n @Prop() hideDetails: boolean | 'auto' = 'auto';\n @Prop() required: boolean = false;\n\n @State() isOpen: boolean = false;\n @State() inputText: string = '';\n @State() hours: number = 12;\n @State() minutes: number = 0;\n @State() seconds: number = 0;\n @State() period: 'AM' | 'PM' = 'AM';\n @State() lastGoodValue: string = '';\n\n @Event() timeChange: EventEmitter<string>;\n @Event() xplorFocus: EventEmitter<FocusEvent>;\n @Event() xplorBlur: EventEmitter<FocusEvent>;\n @Event() xplorClear: EventEmitter<void>;\n\n componentWillLoad() {\n if (this.value) {\n this.parseValueToState(this.value);\n this.inputText = this.formatDisplayTime();\n this.lastGoodValue = this.inputText;\n }\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent) {\n const target = event.target as Node;\n if (!this.el.contains(target)) {\n this.isOpen = false;\n }\n }\n\n /** Parse HH:mm:ss (24h) into component state */\n private parseValueToState(val: string) {\n if (!val) return;\n const parts = val.split(':');\n let h = parseInt(parts[0], 10) || 0;\n const m = parseInt(parts[1], 10) || 0;\n const s = parseInt(parts[2], 10) || 0;\n\n this.period = h >= 12 ? 'PM' : 'AM';\n if (h === 0) {\n h = 12;\n } else if (h > 12) {\n h -= 12;\n }\n\n this.hours = h;\n this.minutes = m;\n this.seconds = s;\n }\n\n /** Convert current state to HH:mm:ss (24h) */\n private stateToValue(): string {\n let h = this.hours;\n if (this.period === 'AM' && h === 12) h = 0;\n else if (this.period === 'PM' && h !== 12) h += 12;\n\n const hStr = String(h).padStart(2, '0');\n const mStr = String(this.minutes).padStart(2, '0');\n const sStr = String(this.seconds).padStart(2, '0');\n return `${hStr}:${mStr}:${sStr}`;\n }\n\n /** Format for display: \"12:00 PM\" or \"12:00:00 PM\" */\n private formatDisplayTime(): string {\n const h = this.hours;\n const m = String(this.minutes).padStart(2, '0');\n if (this.showSeconds) {\n const s = String(this.seconds).padStart(2, '0');\n return `${h}:${m}:${s} ${this.period}`;\n }\n return `${h}:${m} ${this.period}`;\n }\n\n /** Port of Vue handleOnBlur time parsing logic */\n private parseInputText(text: string): boolean {\n const raw = text.trim();\n if (!raw) return false;\n\n // Handle bare am/pm\n if (raw.toLowerCase() === 'am' || raw.toLowerCase() === 'pm') {\n this.hours = 12;\n this.minutes = 0;\n this.seconds = 0;\n this.period = raw.toLowerCase() === 'pm' ? 'PM' : 'AM';\n return true;\n }\n\n // Detect AM/PM suffix\n let suffix: 'am' | 'pm' = 'am';\n if (raw.toLowerCase().indexOf('p') !== -1) {\n suffix = 'pm';\n }\n\n // Strip am/pm text\n const sanitised = raw.replace(/(\\s*)(pm|am|p|a)/gi, '').trim();\n const withColons = sanitised.replace(/\\./g, ':');\n const splits = withColons.split(':');\n\n let hour: number;\n let minute = 0;\n let second = 0;\n\n if (splits.length === 1) {\n // No colons: interpret based on length\n const num = sanitised.trim();\n if (num.length === 3) {\n hour = parseInt(num.substring(0, 1), 10);\n minute = parseInt(num.substring(1, 3), 10);\n } else if (num.length === 4) {\n hour = parseInt(num.substring(0, 2), 10);\n minute = parseInt(num.substring(2, 4), 10);\n } else if (num.length === 6) {\n hour = parseInt(num.substring(0, 2), 10);\n minute = parseInt(num.substring(2, 4), 10);\n second = parseInt(num.substring(4, 6), 10);\n } else {\n hour = parseInt(num, 10);\n }\n } else if (splits.length === 2) {\n hour = parseInt(splits[0].trim(), 10);\n minute = parseInt(splits[1].trim(), 10);\n } else if (splits.length === 3) {\n hour = parseInt(splits[0].trim(), 10);\n minute = parseInt(splits[1].trim(), 10);\n second = parseInt(splits[2].trim(), 10);\n } else {\n return false;\n }\n\n if (isNaN(hour) || hour < 0) return false;\n if (isNaN(minute)) minute = 0;\n if (isNaN(second)) second = 0;\n\n // Handle minute overflow\n if (minute >= 60) {\n hour += Math.floor(minute / 60);\n minute = minute % 60;\n }\n\n // Normalize hour and determine AM/PM\n if (hour >= 12) {\n suffix = 'pm';\n if (hour >= 24) {\n hour = hour % 24;\n suffix = hour >= 12 ? 'pm' : 'am';\n }\n if (hour > 12) {\n hour -= 12;\n }\n }\n\n if (hour === 0) {\n hour = 12;\n suffix = 'am';\n }\n\n // Clamp seconds\n if (second >= 60) second = 59;\n\n this.hours = hour;\n this.minutes = minute;\n this.seconds = second;\n this.period = suffix === 'pm' ? 'PM' : 'AM';\n return true;\n }\n\n private emitChange() {\n const val = this.stateToValue();\n this.value = val;\n this.inputText = this.formatDisplayTime();\n this.lastGoodValue = this.inputText;\n this.timeChange.emit(val);\n }\n\n private toggleDropdown = () => {\n if (this.disabled || this.readonly) return;\n this.isOpen = !this.isOpen;\n };\n\n private handleInputFocus = (event: FocusEvent) => {\n this.xplorFocus.emit(event);\n if (this.prefill && !this.value) {\n const now = new Date();\n this.hours = now.getHours() % 12 || 12;\n this.minutes = now.getMinutes();\n this.seconds = now.getSeconds();\n this.period = now.getHours() >= 12 ? 'PM' : 'AM';\n this.emitChange();\n }\n };\n\n private handleInputBlur = (event: FocusEvent) => {\n this.xplorBlur.emit(event);\n if (this.inputText.trim() === '') {\n return;\n }\n const ok = this.parseInputText(this.inputText);\n if (ok) {\n this.emitChange();\n } else {\n // Revert to last good value\n this.inputText = this.lastGoodValue;\n }\n };\n\n private handleInputChange = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.inputText = input.value;\n };\n\n private handleClear = (event: Event) => {\n event.stopPropagation();\n this.value = '';\n this.inputText = '';\n this.lastGoodValue = '';\n this.hours = 12;\n this.minutes = 0;\n this.seconds = 0;\n this.period = 'AM';\n this.timeChange.emit('');\n this.xplorClear.emit();\n };\n\n private incrementHours = () => {\n this.hours = this.hours >= 12 ? 1 : this.hours + 1;\n this.emitChange();\n };\n\n private decrementHours = () => {\n this.hours = this.hours <= 1 ? 12 : this.hours - 1;\n this.emitChange();\n };\n\n private incrementMinutes = () => {\n if (this.minutes >= 59) {\n this.minutes = 0;\n this.incrementHours();\n } else {\n this.minutes++;\n this.emitChange();\n }\n };\n\n private decrementMinutes = () => {\n if (this.minutes <= 0) {\n this.minutes = 59;\n this.decrementHours();\n } else {\n this.minutes--;\n this.emitChange();\n }\n };\n\n private incrementSeconds = () => {\n if (this.seconds >= 59) {\n this.seconds = 0;\n this.incrementMinutes();\n } else {\n this.seconds++;\n this.emitChange();\n }\n };\n\n private decrementSeconds = () => {\n if (this.seconds <= 0) {\n this.seconds = 59;\n this.decrementMinutes();\n } else {\n this.seconds--;\n this.emitChange();\n }\n };\n\n private togglePeriod = () => {\n this.period = this.period === 'AM' ? 'PM' : 'AM';\n this.emitChange();\n };\n\n private renderChevronUp() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n );\n }\n\n private renderChevronDown() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n );\n }\n\n render() {\n const showDetails = this.hideDetails === false || (this.hideDetails === 'auto' && this.error);\n\n const clockIcon = (\n <svg class=\"time-picker__icon-svg\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <polyline points=\"12 6 12 12 16 14\"></polyline>\n </svg>\n );\n\n return (\n <Host>\n <div class={{\n 'time-picker': true,\n 'time-picker--disabled': this.disabled,\n 'time-picker--error': !!this.error,\n 'time-picker--open': this.isOpen,\n }}>\n {this.label && (\n <label class=\"time-picker__label\">\n {this.label}\n {this.required && <span class=\"time-picker__required\">*</span>}\n </label>\n )}\n\n <div class=\"time-picker__field\">\n <input\n type=\"text\"\n class=\"time-picker__input\"\n value={this.inputText}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readonly={this.readonly}\n onFocus={this.handleInputFocus}\n onBlur={this.handleInputBlur}\n onInput={this.handleInputChange}\n style={{ backgroundColor: this.bgColor }}\n />\n <div class=\"time-picker__actions\">\n {this.clearable && this.value && !this.disabled && !this.readonly && (\n <button type=\"button\" class=\"time-picker__clear\" onClick={this.handleClear} aria-label=\"Clear\">\n ×\n </button>\n )}\n <button type=\"button\" class=\"time-picker__icon-btn\" onClick={this.toggleDropdown} disabled={this.disabled} aria-label=\"Open time picker\">\n {clockIcon}\n </button>\n </div>\n </div>\n\n {showDetails && (\n <div class=\"time-picker__details\">\n {this.error && <div class=\"time-picker__error-message\">{this.error}</div>}\n </div>\n )}\n\n {this.isOpen && (\n <div class=\"time-picker__dropdown\">\n <div class=\"time-picker__columns\">\n {/* Hours column */}\n <div class=\"time-picker__column\">\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.incrementHours} aria-label=\"Increase hours\">\n {this.renderChevronUp()}\n </button>\n <div class=\"time-picker__value\">{String(this.hours).padStart(2, '0')}</div>\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.decrementHours} aria-label=\"Decrease hours\">\n {this.renderChevronDown()}\n </button>\n </div>\n\n <div class=\"time-picker__separator\">:</div>\n\n {/* Minutes column */}\n <div class=\"time-picker__column\">\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.incrementMinutes} aria-label=\"Increase minutes\">\n {this.renderChevronUp()}\n </button>\n <div class=\"time-picker__value\">{String(this.minutes).padStart(2, '0')}</div>\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.decrementMinutes} aria-label=\"Decrease minutes\">\n {this.renderChevronDown()}\n </button>\n </div>\n\n {this.showSeconds && [\n <div class=\"time-picker__separator\">:</div>,\n <div class=\"time-picker__column\">\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.incrementSeconds} aria-label=\"Increase seconds\">\n {this.renderChevronUp()}\n </button>\n <div class=\"time-picker__value\">{String(this.seconds).padStart(2, '0')}</div>\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.decrementSeconds} aria-label=\"Decrease seconds\">\n {this.renderChevronDown()}\n </button>\n </div>\n ]}\n\n {/* AM/PM column */}\n <div class=\"time-picker__column time-picker__column--period\">\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.togglePeriod} aria-label=\"Toggle AM/PM\">\n {this.renderChevronUp()}\n </button>\n <div class=\"time-picker__value time-picker__value--period\">{this.period}</div>\n <button type=\"button\" class=\"time-picker__spinner-btn\" onClick={this.togglePeriod} aria-label=\"Toggle AM/PM\">\n {this.renderChevronDown()}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n position: relative;\n}\n\n.tooltip-trigger {\n display: inline-flex;\n cursor: pointer;\n}\n\n.tooltip {\n position: fixed;\n z-index: 9999;\n background-color: #424242;\n color: #fff;\n border-radius: 4px;\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.4;\n max-width: 300px;\n word-wrap: break-word;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n pointer-events: none;\n opacity: 0;\n animation: tooltipFadeIn 0.2s ease forwards;\n}\n\n@keyframes tooltipFadeIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.tooltip__content {\n position: relative;\n z-index: 1;\n}\n\n.tooltip__arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background-color: #424242;\n z-index: 0;\n}\n\n.tooltip--top .tooltip__arrow {\n margin-top: -6px;\n box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.tooltip--bottom .tooltip__arrow {\n box-shadow: -2px -2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.tooltip--left .tooltip__arrow {\n margin-left: -6px;\n display: block;\n box-shadow: 2px -2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.tooltip--right .tooltip__arrow {\n box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.1);\n}","import { Component, Host, h, Prop, State, Element, Listen } from '@stencil/core';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type TooltipTrigger = 'hover' | 'click' | 'manual';\n\n@Component({\n tag: 'xplor-tooltip',\n styleUrl: 'xplor-tooltip.scss',\n scoped: true,\n})\nexport class XplorTooltip {\n @Element() el: HTMLElement;\n\n @Prop() position: TooltipPosition = 'top';\n @Prop() trigger: TooltipTrigger = 'hover';\n @Prop() arrow: boolean = true;\n @Prop({ mutable: true }) open: boolean = false;\n @Prop() content: string;\n @Prop() disabled: boolean = false;\n\n @State() tooltipStyle: any = {};\n @State() arrowStyle: any = {};\n\n private triggerEl: HTMLDivElement;\n private tooltipEl: HTMLDivElement;\n private hideTimeout: any;\n\n componentDidLoad() {\n if (this.trigger === 'hover') {\n this.setupHoverListeners();\n }\n }\n\n disconnectedCallback() {\n this.cleanupListeners();\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n }\n }\n\n private setupHoverListeners() {\n if (this.triggerEl) {\n this.triggerEl.addEventListener('mouseenter', this.handleMouseEnter);\n this.triggerEl.addEventListener('mouseleave', this.handleMouseLeave);\n }\n }\n\n private cleanupListeners() {\n if (this.triggerEl) {\n this.triggerEl.removeEventListener('mouseenter', this.handleMouseEnter);\n this.triggerEl.removeEventListener('mouseleave', this.handleMouseLeave);\n }\n }\n\n private handleMouseEnter = () => {\n if (this.disabled) return;\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n }\n this.showTooltip();\n };\n\n private handleMouseLeave = () => {\n if (this.disabled) return;\n this.hideTimeout = setTimeout(() => {\n this.hideTooltip();\n }, 100);\n };\n\n private handleClick = () => {\n if (this.disabled) return;\n if (this.trigger === 'click') {\n this.open = !this.open;\n if (this.open) {\n requestAnimationFrame(() => this.updatePosition());\n }\n }\n };\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent) {\n if (this.trigger === 'click' && this.open) {\n const target = event.target as Node;\n if (!this.el.contains(target)) {\n this.open = false;\n }\n }\n }\n\n private showTooltip() {\n this.open = true;\n requestAnimationFrame(() => this.updatePosition());\n }\n\n private hideTooltip() {\n this.open = false;\n }\n\n private updatePosition() {\n if (!this.triggerEl || !this.tooltipEl) return;\n\n const triggerRect = this.triggerEl.getBoundingClientRect();\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n const gap = 8; // Space between trigger and tooltip\n const arrowSize = this.arrow ? 6 : 0;\n\n let top = 0;\n let left = 0;\n let arrowTop = '';\n let arrowLeft = '';\n let arrowTransform = '';\n\n switch (this.position) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap - arrowSize;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n arrowTop = '100%';\n arrowLeft = '50%';\n arrowTransform = 'translateX(-50%) rotate(45deg)';\n break;\n\n case 'bottom':\n top = triggerRect.bottom + gap + arrowSize;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n arrowTop = '-6px';\n arrowLeft = '50%';\n arrowTransform = 'translateX(-50%) rotate(45deg)';\n break;\n\n case 'left':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap - arrowSize;\n arrowTop = '50%';\n arrowLeft = '100%';\n arrowTransform = 'translateY(-50%) rotate(45deg)';\n break;\n\n case 'right':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap + arrowSize;\n arrowTop = '50%';\n arrowLeft = '-6px';\n arrowTransform = 'translateY(-50%) rotate(45deg)';\n break;\n }\n\n // Keep tooltip within viewport\n const viewportPadding = 8;\n if (left < viewportPadding) {\n left = viewportPadding;\n } else if (left + tooltipRect.width > window.innerWidth - viewportPadding) {\n left = window.innerWidth - tooltipRect.width - viewportPadding;\n }\n\n if (top < viewportPadding) {\n top = viewportPadding;\n } else if (top + tooltipRect.height > window.innerHeight - viewportPadding) {\n top = window.innerHeight - tooltipRect.height - viewportPadding;\n }\n\n this.tooltipStyle = {\n top: `${top}px`,\n left: `${left}px`,\n };\n\n this.arrowStyle = {\n top: arrowTop,\n left: arrowLeft,\n transform: arrowTransform,\n };\n }\n\n render() {\n return (\n <Host>\n <div\n class=\"tooltip-trigger\"\n ref={(el) => (this.triggerEl = el)}\n onClick={this.handleClick}\n >\n <slot name=\"trigger\" />\n </div>\n\n {this.open && (\n <div\n class={{\n 'tooltip': true,\n [`tooltip--${this.position}`]: true,\n }}\n style={this.tooltipStyle}\n ref={(el) => (this.tooltipEl = el)}\n role=\"tooltip\"\n >\n <div class=\"tooltip__content\">\n <slot>{this.content}</slot>\n </div>\n {this.arrow && (\n <div\n class=\"tooltip__arrow\"\n style={this.arrowStyle}\n />\n )}\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|