bromcom-ui-next 0.1.24 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bromcom-ui/bcm-button.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-drawer.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-dropdown-item.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-dropdown.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-input.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-linked.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-shortcut.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bcm-switch.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-tabs-list.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-tabs-trigger.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-tabs.entry.esm.js.map +1 -1
- package/dist/bromcom-ui/bcm-text.entry.esm.js.map +1 -0
- package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
- package/dist/bromcom-ui/p-00dc393e.entry.js +2 -0
- package/dist/bromcom-ui/p-00dc393e.entry.js.map +1 -0
- package/dist/bromcom-ui/p-0421d64a.entry.js +2 -0
- package/dist/bromcom-ui/p-0421d64a.entry.js.map +1 -0
- package/dist/bromcom-ui/p-06656239.entry.js +2 -0
- package/dist/bromcom-ui/p-06656239.entry.js.map +1 -0
- package/dist/bromcom-ui/p-10de6d9c.entry.js +2 -0
- package/dist/bromcom-ui/p-10de6d9c.entry.js.map +1 -0
- package/dist/bromcom-ui/p-48c554fc.entry.js +2 -0
- package/dist/bromcom-ui/p-48c554fc.entry.js.map +1 -0
- package/dist/bromcom-ui/{p-b02f5178.entry.js → p-7f117b72.entry.js} +2 -2
- package/dist/bromcom-ui/p-a07a257f.entry.js +2 -0
- package/dist/bromcom-ui/p-a07a257f.entry.js.map +1 -0
- package/dist/bromcom-ui/{p-5c1b22b5.entry.js → p-a18d34c7.entry.js} +2 -2
- package/dist/bromcom-ui/p-b37f2434.entry.js +2 -0
- package/dist/bromcom-ui/p-b37f2434.entry.js.map +1 -0
- package/dist/bromcom-ui/p-c709842a.entry.js +2 -0
- package/dist/bromcom-ui/p-c709842a.entry.js.map +1 -0
- package/dist/bromcom-ui/p-e989b918.entry.js +2 -0
- package/dist/bromcom-ui/p-e989b918.entry.js.map +1 -0
- package/dist/bromcom-ui/p-ed796a79.entry.js +2 -0
- package/dist/bromcom-ui/p-ed796a79.entry.js.map +1 -0
- package/dist/bromcom-ui/p-edd01d0d.entry.js +2 -0
- package/dist/bromcom-ui/p-edd01d0d.entry.js.map +1 -0
- package/dist/bromcom-ui/p-f34bfa88.entry.js +2 -0
- package/dist/bromcom-ui/p-f34bfa88.entry.js.map +1 -0
- package/dist/cjs/bcm-button.cjs.entry.js +316 -0
- package/dist/cjs/bcm-button.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-button.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-drawer.cjs.entry.js +206 -0
- package/dist/cjs/bcm-drawer.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-drawer.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-dropdown-item.cjs.entry.js +61 -0
- package/dist/cjs/bcm-dropdown-item.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-dropdown-item.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-dropdown.cjs.entry.js +54 -0
- package/dist/cjs/bcm-dropdown.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-dropdown.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-input.cjs.entry.js +315 -0
- package/dist/cjs/bcm-input.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-input.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-linked.cjs.entry.js +343 -0
- package/dist/cjs/bcm-linked.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-linked.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-shortcut.cjs.entry.js +50 -0
- package/dist/cjs/bcm-shortcut.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-shortcut.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-switch.cjs.entry.js +7 -7
- package/dist/cjs/bcm-switch.cjs.entry.js.map +1 -1
- package/dist/cjs/bcm-switch.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-tabs-list.cjs.entry.js +49 -6
- package/dist/cjs/bcm-tabs-list.cjs.entry.js.map +1 -1
- package/dist/cjs/bcm-tabs-list.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-tabs-trigger.cjs.entry.js +38 -6
- package/dist/cjs/bcm-tabs-trigger.cjs.entry.js.map +1 -1
- package/dist/cjs/bcm-tabs-trigger.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-tabs.cjs.entry.js +106 -17
- package/dist/cjs/bcm-tabs.cjs.entry.js.map +1 -1
- package/dist/cjs/bcm-tabs.entry.cjs.js.map +1 -1
- package/dist/cjs/bcm-text.cjs.entry.js +124 -0
- package/dist/cjs/bcm-text.cjs.entry.js.map +1 -0
- package/dist/cjs/bcm-text.entry.cjs.js.map +1 -0
- package/dist/cjs/bcm-textarea.cjs.entry.js +3 -3
- package/dist/cjs/bcm-tooltip.cjs.entry.js +1 -1
- package/dist/cjs/bromcom-ui.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/button/button.css +1 -1
- package/dist/collection/components/switch/switch.component.js +6 -6
- package/dist/collection/components/switch/switch.component.js.map +1 -1
- package/dist/collection/components/switch/switch.css +1 -1
- package/dist/collection/components/tabs/bcm-tabs.css +1 -1
- package/dist/collection/components/tabs/tabs-list.component.js +92 -5
- package/dist/collection/components/tabs/tabs-list.component.js.map +1 -1
- package/dist/collection/components/tabs/tabs-list.css +1 -1
- package/dist/collection/components/tabs/tabs-trigger.component.js +77 -5
- package/dist/collection/components/tabs/tabs-trigger.component.js.map +1 -1
- package/dist/collection/components/tabs/tabs-trigger.css +1 -1
- package/dist/collection/components/tabs/tabs.component.js +148 -15
- package/dist/collection/components/tabs/tabs.component.js.map +1 -1
- package/dist/collection/components/text/text.component.js +1 -1
- package/dist/collection/components/textarea/textarea.component.js +3 -3
- package/dist/collection/components/tooltip/tooltip.component.js +1 -1
- package/dist/components/bcm-button.js +1 -1
- package/dist/components/bcm-dropdown.js +1 -1
- package/dist/components/bcm-pop-confirm.js +1 -1
- package/dist/components/bcm-switch.js +7 -7
- package/dist/components/bcm-switch.js.map +1 -1
- package/dist/components/bcm-tabs-list.js +53 -7
- package/dist/components/bcm-tabs-list.js.map +1 -1
- package/dist/components/bcm-tabs-trigger.js +41 -7
- package/dist/components/bcm-tabs-trigger.js.map +1 -1
- package/dist/components/bcm-tabs.js +111 -18
- package/dist/components/bcm-tabs.js.map +1 -1
- package/dist/components/bcm-text.js +1 -1
- package/dist/components/bcm-textarea.js +3 -3
- package/dist/components/bcm-tooltip.js +1 -1
- package/dist/components/{p-BdGAZ8M0.js → p-e6quW4es.js} +3 -3
- package/dist/components/{p-BdGAZ8M0.js.map → p-e6quW4es.js.map} +1 -1
- package/dist/esm/bcm-button.entry.js +314 -0
- package/dist/esm/bcm-button.entry.js.map +1 -0
- package/dist/esm/bcm-drawer.entry.js +204 -0
- package/dist/esm/bcm-drawer.entry.js.map +1 -0
- package/dist/esm/bcm-dropdown-item.entry.js +59 -0
- package/dist/esm/bcm-dropdown-item.entry.js.map +1 -0
- package/dist/esm/bcm-dropdown.entry.js +52 -0
- package/dist/esm/bcm-dropdown.entry.js.map +1 -0
- package/dist/esm/bcm-input.entry.js +313 -0
- package/dist/esm/bcm-input.entry.js.map +1 -0
- package/dist/esm/bcm-linked.entry.js +341 -0
- package/dist/esm/bcm-linked.entry.js.map +1 -0
- package/dist/esm/bcm-shortcut.entry.js +48 -0
- package/dist/esm/bcm-shortcut.entry.js.map +1 -0
- package/dist/esm/bcm-switch.entry.js +7 -7
- package/dist/esm/bcm-switch.entry.js.map +1 -1
- package/dist/esm/bcm-tabs-list.entry.js +49 -6
- package/dist/esm/bcm-tabs-list.entry.js.map +1 -1
- package/dist/esm/bcm-tabs-trigger.entry.js +38 -6
- package/dist/esm/bcm-tabs-trigger.entry.js.map +1 -1
- package/dist/esm/bcm-tabs.entry.js +106 -17
- package/dist/esm/bcm-tabs.entry.js.map +1 -1
- package/dist/esm/bcm-text.entry.js +122 -0
- package/dist/esm/bcm-text.entry.js.map +1 -0
- package/dist/esm/bcm-textarea.entry.js +3 -3
- package/dist/esm/bcm-tooltip.entry.js +1 -1
- package/dist/esm/bromcom-ui.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/types/components/tabs/tabs-list.component.d.ts +8 -0
- package/dist/types/components/tabs/tabs-trigger.component.d.ts +8 -0
- package/dist/types/components/tabs/tabs.component.d.ts +15 -0
- package/dist/types/components.d.ts +60 -0
- package/package.json +1 -1
- package/dist/bromcom-ui/bcm-button.bcm-drawer.bcm-dropdown.bcm-dropdown-item.bcm-input.bcm-linked.bcm-shortcut.bcm-text.entry.esm.js.map +0 -1
- package/dist/bromcom-ui/p-1d79c9de.entry.js +0 -2
- package/dist/bromcom-ui/p-1d79c9de.entry.js.map +0 -1
- package/dist/bromcom-ui/p-4766474f.entry.js +0 -2
- package/dist/bromcom-ui/p-4766474f.entry.js.map +0 -1
- package/dist/bromcom-ui/p-4f0851e2.entry.js +0 -2
- package/dist/bromcom-ui/p-4f0851e2.entry.js.map +0 -1
- package/dist/bromcom-ui/p-88d35bcf.entry.js +0 -2
- package/dist/bromcom-ui/p-88d35bcf.entry.js.map +0 -1
- package/dist/bromcom-ui/p-d04246f0.entry.js +0 -2
- package/dist/bromcom-ui/p-d04246f0.entry.js.map +0 -1
- package/dist/cjs/bcm-button.bcm-drawer.bcm-dropdown.bcm-dropdown-item.bcm-input.bcm-linked.bcm-shortcut.bcm-text.entry.cjs.js.map +0 -1
- package/dist/cjs/bcm-button_8.cjs.entry.js +0 -1414
- package/dist/cjs/bcm-button_8.cjs.entry.js.map +0 -1
- package/dist/esm/bcm-button.bcm-drawer.bcm-dropdown.bcm-dropdown-item.bcm-input.bcm-linked.bcm-shortcut.bcm-text.entry.js.map +0 -1
- package/dist/esm/bcm-button_8.entry.js +0 -1405
- package/dist/esm/bcm-button_8.entry.js.map +0 -1
- /package/dist/bromcom-ui/{p-b02f5178.entry.js.map → p-7f117b72.entry.js.map} +0 -0
- /package/dist/bromcom-ui/{p-5c1b22b5.entry.js.map → p-a18d34c7.entry.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["variantOptions","save","text","status","icon","iconPosition","kind","ok","new","add","create","prev","next","apply","submit","send","delete","cancel","decline","close","archive","remove","edit","export","import","filter","update","reset","download","buttonCss","BcmButton","constructor","hostRef","this","size","iconOnly","fullWidth","type","loading","disabled","active","handleClick","event","bcmClick","emit","handleFocus","bcmFocus","handleBlur","bcmBlur","buttonClass","tv","base","variants","small","medium","large","primary","ghost","outline","true","false","position","first","middle","last","defaultVariants","twMerge","buttonText","variant","buttonIcon","buttonStatus","buttonStyles","kindStyleMap","internalDefaultStyles","finalEffectiveStyles","Object","assign","render","h","Host","key","label","expanded","controls","onClick","onFocus","onBlur","style","class","name","drawerCss","BcmDrawer","open","noHeader","drawerClass","slots","backdrop","wrapper","header","title","closeButton","content","left","right","top","bottom","compoundVariants","handleOpenChange","isOpen","document","body","overflow","bcmOpen","bcmClose","handleKeyDown","hide","show","bcmBeforeOpen","defaultPrevented","bcmBeforeClose","disconnectedCallback","getWrapperStyle","width","height","part","role","headerText","dropdownCss","Dropdown","isReady","dropdownItems","dropdownClass","handleSlotChange","Array","from","host","querySelectorAll","length","console","warn","componentDidLoad","button","shadowRoot","querySelector","buttonRef","handleDropdownItemChange","element","selected","detail","_a","forEach","item","bcmDropdownChange","targetElement","onSlotchange","dropdownItemCss","DropdownItem","error","dropdownItemClass","bcmDropDownItemChange","rightIcons","map","checkSlotContent","slotName","slot","assignedNodes","inputCss","BcmInput","isFocused","isValid","internalStatus","isPasswordVisible","value","_id","generateId","readonly","required","useNativeValidation","onInput","input","target","bcmInput","validateInput","onChange","bcmChange","onKeyDown","bcmKeyDown","onKeyUp","bcmKeyUp","styleClass","inputClass","default","success","warning","info","focused","togglePasswordVisibility","inputRef","PasswordToggleButton","iconSize","handleValueChange","newValue","watchStatus","watchErrorMessage","internalErrorMessage","setFocus","focus","setBlur","blur","select","setLocale","locale","messages","setValidationMessages","componentWillLoad","defaultValidationMessages","errorMessage","validationMessage","getValidationMessage","minLength","min","maxLength","max","pattern","RegExp","test","numValue","parseFloat","undefined","hasSlotContent","el","getDefaultIconForType","inputId","classNames","htmlFor","prefixIcon","ref","id","placeholder","autocomplete","minlength","maxlength","step","labelledby","describedby","suffixIcon","captionText","linkedCss","BcmLinked","trigger","placement","showDelay","hideDelay","offset","arrow","zIndex","appendToBody","destroyOnHide","isVisible","handleMouseEnter","clearTimeouts","showTimeout","setTimeout","handleMouseLeave","hideTimeout","handleFloatingMouseEnter","handleFloatingMouseLeave","e","stopPropagation","toggle","setupTarget","disconnectTarget","connectTarget","onVisibilityChange","updatePosition","bcmShown","bcmHidden","Promise","resolve","requestAnimationFrame","floatingEl","setupFloatingObserver","log","cleanup","call","_b","resizeObserver","disconnect","originalParent","appendChild","targetEl","targetId","getElementById","previousElementSibling","parentElement","setupEventListeners","autoUpdate","ResizeObserver","observe","removeEventListeners","addEventListener","setupClickOutside","removeEventListener","removeClickOutside","clickOutsideHandler","contains","clearTimeout","middleware","flip","fallbackPlacements","shift","padding","x","y","computePosition","strategy","toString","updateArrow","className","side","split","classList","bcmShow","parentNode","originalNextSibling","nextSibling","bcmHide","insertBefore","removeChild","updatePositioning","floatingClasses","display","visibility","opacity","pointerEvents","shortcutCss","osKeys","ctrl","alt","del","backspace","enter","return","BcmShortcut","isMac","window","navigator","userAgent","getHotkey","includes","keys","k","join","hotkey","cs","variantTagMap","heading1","heading2","title1","title2","title3","bodyAccent","helper","caption","link","infoAccent","textCss","BcmText","variantClassMap","getTextClass","variantClasses","getOverflowClass","Tag","variantClass","overflowClass"],"sources":["src/components/button/types.ts","src/components/button/button.css?tag=bcm-button&encapsulation=shadow","src/components/button/button.component.tsx","src/components/drawer/drawer.css?tag=bcm-drawer&encapsulation=shadow","src/components/drawer/drawer.component.tsx","src/components/dropdown/dropdown.css?tag=bcm-dropdown&encapsulation=shadow","src/components/dropdown/dropdown.component.tsx","src/components/dropdown-item/dropdown-item.css?tag=bcm-dropdown-item&encapsulation=shadow","src/components/dropdown-item/dropdown-item.component.tsx","src/utils/slot/check-slot-content.ts","src/components/input/input.scss?tag=bcm-input&encapsulation=shadow","src/components/input/input.component.tsx","src/components/linked/linked.css?tag=bcm-linked","src/components/linked/linked.component.tsx","src/components/shortcut/shortcut.css?tag=bcm-shortcut&encapsulation=shadow","src/components/shortcut/shortcut.tsx","src/components/text/text.utils.ts","src/components/text/text.scss?tag=bcm-text&encapsulation=shadow","src/components/text/text.component.tsx"],"sourcesContent":["export type ButtonKind = 'primary' | 'ghost' | 'text' | 'outline';\nexport type ButtonSize = 'small' | 'medium' | 'large';\nexport type ButtonType = 'button' | 'reset' | 'submit';\nexport type ButtonStatus = 'default' | 'success' | 'error' | 'warning' | 'info';\nexport type IconPosition = 'prefix' | 'suffix';\n\n// Button group position\nexport type ButtonPosition = 'first' | 'middle' | 'last' | null;\n\nexport interface VariantOption {\n text: string;\n icon?: string;\n iconPosition?: IconPosition;\n status?: ButtonStatus;\n kind?: ButtonKind;\n}\n\nexport const variantOptions: Record<string, VariantOption> = {\n save: {\n text: 'Save',\n status: 'success',\n icon: 'far fa-save',\n iconPosition: 'prefix',\n kind: 'primary',\n },\n ok: {\n text: 'Ok',\n status: 'success',\n icon: 'far fa-check',\n iconPosition: 'prefix',\n },\n new: {\n text: 'New',\n status: 'success',\n icon: 'far fa-plus',\n iconPosition: 'prefix',\n },\n add: {\n text: 'Add',\n status: 'success',\n icon: 'far fa-plus',\n iconPosition: 'prefix',\n },\n create: {\n text: 'Create',\n status: 'success',\n icon: 'far fa-plus',\n iconPosition: 'prefix',\n },\n prev: {\n text: 'Prev',\n status: 'default',\n icon: 'far fa-arrow-left',\n iconPosition: 'prefix',\n },\n next: {\n text: 'Next',\n status: 'default',\n icon: 'far fa-arrow-right',\n iconPosition: 'suffix',\n },\n apply: {\n text: 'Apply',\n status: 'default',\n icon: 'far fa-check-circle',\n iconPosition: 'prefix',\n },\n submit: {\n text: 'Submit',\n status: 'default',\n icon: 'far fa-save',\n iconPosition: 'prefix',\n },\n send: {\n text: 'Send',\n status: 'success',\n icon: 'far fa-paper-plane',\n iconPosition: 'prefix',\n },\n delete: {\n text: 'Delete',\n status: 'error',\n icon: 'far fa-trash',\n iconPosition: 'prefix',\n },\n cancel: {\n text: 'Cancel',\n status: 'error',\n icon: 'far fa-times',\n iconPosition: 'prefix',\n },\n decline: {\n text: 'Decline',\n status: 'error',\n icon: 'far fa-ban',\n iconPosition: 'prefix',\n },\n close: {\n text: 'Close',\n status: 'error',\n icon: 'far fa-times-circle',\n iconPosition: 'prefix',\n },\n archive: {\n text: 'Archive',\n status: 'error',\n icon: 'far fa-folder-open',\n iconPosition: 'prefix',\n },\n remove: {\n text: 'Remove',\n status: 'error',\n icon: 'far fa-minus-circle',\n iconPosition: 'prefix',\n },\n edit: {\n text: 'Edit',\n status: 'default',\n icon: 'far fa-edit',\n iconPosition: 'prefix',\n },\n export: {\n text: 'Export',\n status: 'default',\n icon: 'far fa-sign-out',\n iconPosition: 'prefix',\n },\n import: {\n text: 'Import',\n status: 'default',\n icon: 'far fa-sign-in',\n iconPosition: 'prefix',\n },\n filter: {\n text: 'Filter',\n status: 'default',\n icon: 'far fa-filter',\n iconPosition: 'prefix',\n },\n update: {\n text: 'Update',\n status: 'default',\n icon: 'far fa-sync',\n iconPosition: 'prefix',\n },\n reset: {\n text: 'Reset',\n status: 'default',\n icon: 'far fa-sync',\n iconPosition: 'prefix',\n },\n download: {\n text: 'Download',\n status: 'default',\n icon: 'far fa-download',\n iconPosition: 'prefix',\n },\n};\n\nexport type ButtonVariant = keyof typeof variantOptions;\n",":host {\n display: inline-flex;\n position: relative;\n height: fit-content;\n width: fit-content;\n}\n\n:host([full-width]) {\n width: 100%;\n}\n\n:host([position='first']) .bcm-button {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n:host([position='middle']) .bcm-button {\n border-radius: 0;\n}\n\n:host([position='last']) .bcm-button {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n:host([position='first'].orientation-vertical) .bcm-button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-top-right-radius: var(--bcm-ui-border-radius, 4px);\n border-top-left-radius: var(--bcm-ui-border-radius, 4px);\n}\n\n:host([position='middle'].orientation-vertical) .bcm-button {\n border-radius: 0;\n}\n\n:host([position='last'].orientation-vertical) .bcm-button {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: var(--bcm-ui-border-radius, 4px);\n border-bottom-left-radius: var(--bcm-ui-border-radius, 4px);\n}\n","import { Component, Prop, h, Event, EventEmitter, Host } from '@stencil/core';\nimport { ButtonKind, ButtonSize, ButtonType, ButtonStatus, ButtonVariant, IconPosition, ButtonPosition, variantOptions } from './types';\nimport { tv } from '@utils/tv';\n\n@Component({\n tag: 'bcm-button',\n styleUrl: 'button.css',\n shadow: true,\n})\nexport class BcmButton {\n /** Defines the main visual style of the button */\n @Prop()\n kind: ButtonKind = 'primary';\n\n /** Controls the button size */\n @Prop()\n size: ButtonSize = 'medium';\n\n /** Defines the button's status/state color */\n @Prop()\n status: ButtonStatus = 'default';\n\n /** Predefined button variants */\n @Prop()\n variant?: ButtonVariant;\n\n /** Button position in button group (first, middle, last) */\n @Prop({ reflect: true })\n position?: ButtonPosition;\n\n /** Icon class name */\n @Prop()\n icon?: string;\n\n /** Icon placement (prefix/suffix) */\n @Prop()\n iconPosition: IconPosition = 'prefix';\n\n /** Icon-only button mode */\n @Prop()\n iconOnly = false;\n\n /** Full width button */\n @Prop({ attribute: 'full-width', reflect: true })\n fullWidth = false;\n\n /** HTML button type */\n @Prop()\n type: ButtonType = 'button';\n\n /** Loading state */\n @Prop()\n loading = false;\n\n /** Disabled state */\n @Prop()\n disabled = false;\n\n /** Button text content */\n @Prop()\n text?: string;\n\n /** Active state */\n @Prop()\n active = false;\n\n /** Form association */\n @Prop()\n form: string;\n\n @Prop()\n value: string;\n\n @Prop()\n name: string;\n\n /** Screen reader label */\n @Prop()\n label: string;\n\n /** Expanded state for expandable content */\n @Prop()\n expanded?: string;\n\n /** ID of controlled element */\n @Prop()\n controls: string;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmClick: EventEmitter<MouseEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmFocus: EventEmitter<FocusEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmBlur: EventEmitter<FocusEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.disabled && !this.loading) {\n this.bcmClick.emit(event);\n }\n };\n\n private handleFocus = (event: FocusEvent) => {\n this.bcmFocus.emit(event);\n };\n\n private handleBlur = (event: FocusEvent) => {\n this.bcmBlur.emit(event);\n };\n\n private get buttonText(): string {\n return this.text || (this.variant ? variantOptions[this.variant].text : '');\n }\n\n private get buttonIcon(): { icon?: string; position: IconPosition } {\n if (this.variant && variantOptions[this.variant].icon) {\n return {\n icon: variantOptions[this.variant].icon,\n position: variantOptions[this.variant].iconPosition || 'prefix',\n };\n }\n\n return {\n icon: this.icon,\n position: this.iconPosition,\n };\n }\n\n private get buttonStatus(): ButtonStatus {\n return this.variant ? variantOptions[this.variant].status : this.status;\n }\n\n private get buttonStyles() {\n const status = this.buttonStatus === 'default' ? 'primary' : this.buttonStatus;\n\n // These are the internal default styles based on component props (kind, status)\n const kindStyleMap = {\n primary: {\n '--bcm-button-bg': `var(--bcm-ui-color-background-${status}-default)`,\n '--bcm-button-bg-hover': `var(--bcm-ui-color-background-${status}-hover)`,\n '--bcm-button-bg-active': `var(--bcm-ui-color-background-${status}-active)`,\n '--bcm-button-border': 'transparent',\n '--bcm-button-text': 'var(--bcm-ui-color-text-base)',\n },\n outline: {\n '--bcm-button-bg': 'var(--bcm-ui-color-background-default-default)',\n '--bcm-button-bg-hover': 'var(--bcm-ui-color-background-default-hover)',\n '--bcm-button-bg-active': 'var(--bcm-ui-color-background-default-active)',\n '--bcm-button-border': `var(--bcm-ui-color-border-${this.buttonStatus})`,\n '--bcm-button-text': `var(--bcm-ui-color-text-${this.buttonStatus})`,\n },\n ghost: {\n '--bcm-button-bg': 'transparent',\n '--bcm-button-bg-hover': 'var(--bcm-ui-color-background-default-hover)',\n '--bcm-button-bg-active': 'var(--bcm-ui-color-background-default-active)',\n '--bcm-button-border': 'transparent',\n '--bcm-button-text': `var(--bcm-ui-color-text-${this.buttonStatus})`,\n },\n text: {\n '--bcm-button-bg': 'transparent',\n '--bcm-button-bg-hover': 'var(--bcm-ui-color-background-default-hover)',\n '--bcm-button-bg-active': 'var(--bcm-ui-color-background-default-active)',\n '--bcm-button-border': 'transparent',\n '--bcm-button-text': `var(--bcm-ui-color-text-${status})`,\n },\n };\n const internalDefaultStyles = kindStyleMap[this.kind];\n\n // These are the \"final\" CSS custom properties used by the component's styling.\n // They use the \"--bcm-button-custom-...\" token if provided by the user,\n // otherwise, they fall back to the internal \"--bcm-button-...\" style defined above.\n const finalEffectiveStyles = {\n '--bcm-final-text-color': `var(--bcm-button-custom-text-color, ${internalDefaultStyles['--bcm-button-text']})`,\n '--bcm-final-border-color': `var(--bcm-button-custom-border-color, ${internalDefaultStyles['--bcm-button-border']})`,\n '--bcm-final-bg-color': `var(--bcm-button-custom-bg-color, ${internalDefaultStyles['--bcm-button-bg']})`,\n '--bcm-final-hover-bg-color': `var(--bcm-button-custom-hover-bg-color, ${internalDefaultStyles['--bcm-button-bg-hover']})`,\n '--bcm-final-active-bg-color': `var(--bcm-button-custom-active-bg-color, ${internalDefaultStyles['--bcm-button-bg-active']})`,\n };\n\n // return kindStyleMap[this.kind];\n\n return {\n ...internalDefaultStyles, // Provides the fallback values like --bcm-button-text\n ...finalEffectiveStyles, // Defines the --bcm-final-xxx tokens that handle the override logic\n };\n }\n\n private buttonClass = tv(\n {\n base: 'bcm-button appearance-none inline-flex items-center justify-center border border-solid rounded outline-0',\n variants: {\n size: {\n small: 'text-size-4 py-px px-2 min-h-6',\n medium: 'text-size-5 py-0.5 px-3 min-h-8',\n large: 'text-size-6 py-1 px-3 min-h-10',\n },\n kind: {\n primary: 'kind-primary',\n ghost: 'kind-ghost',\n text: 'kind-text',\n outline: 'kind-outline',\n },\n fullWidth: {\n true: 'full-width w-full',\n },\n disabled: {\n true: 'disabled cursor-not-allowed bg-[--bcm-ui-color-background-disabled-default] text-color-disabled border-color-disabled',\n false: [\n 'cursor-pointer',\n 'bg-[--bcm-final-bg-color] text-[--bcm-final-text-color] border-[--bcm-final-border-color]',\n 'hover:bg-[--bcm-final-hover-bg-color]',\n 'active:bg-[--bcm-final-active-bg-color]',\n 'focus-visible:ring',\n ],\n },\n loading: {\n true: '',\n },\n position: {\n first: 'position-first',\n middle: 'position-middle',\n last: 'position-last',\n },\n },\n defaultVariants: {\n size: 'medium',\n kind: 'primary',\n fullWidth: false,\n disabled: false,\n loading: false,\n },\n },\n {\n twMerge: false,\n },\n );\n\n render() {\n const { icon, position } = this.buttonIcon;\n\n return (\n <Host>\n <button\n type={this.type}\n disabled={this.disabled || this.loading}\n aria-label={this.label}\n aria-expanded={this.expanded}\n aria-controls={this.controls}\n aria-disabled={this.disabled}\n onClick={this.handleClick}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n style={this.buttonStyles}\n class={this.buttonClass({\n size: this.size,\n kind: this.kind,\n fullWidth: this.fullWidth,\n disabled: this.disabled,\n loading: this.loading,\n position: this.position,\n })}\n >\n {this.loading && <slot name=\"loading\"></slot>}\n <span>\n <slot name=\"prefix\">{position === 'prefix' && icon && <i class={' leading-none ' + icon}></i>}</slot>\n </span>\n <slot>{this.buttonText}</slot>\n <span>\n <slot name=\"suffix\">{position === 'suffix' && icon && <i class={' leading-none ' + icon}></i>}</slot>\n </span>\n </button>\n </Host>\n );\n }\n}\n",":host {\n display: contents;\n}\n","import { Component, Prop, h, Element, Event, EventEmitter, Method, Watch, Listen } from '@stencil/core';\nimport { tv } from '@utils/tv';\nimport { DrawerPosition, DrawerSize } from './types';\n\n@Component({\n tag: 'bcm-drawer',\n styleUrl: 'drawer.css',\n shadow: true,\n})\nexport class BcmDrawer {\n @Element() host: HTMLElement;\n\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n @Prop() size: DrawerSize = 'medium';\n @Prop() position: DrawerPosition = 'right';\n @Prop({ attribute: 'full-width' }) fullWidth: boolean = false;\n @Prop() headerText?: string;\n @Prop({ attribute: 'no-header' }) noHeader: boolean = false;\n\n @Event() bcmOpen: EventEmitter<void>;\n @Event() bcmClose: EventEmitter<void>;\n @Event({ cancelable: true }) bcmBeforeOpen: EventEmitter<void>;\n @Event({ cancelable: true }) bcmBeforeClose: EventEmitter<void>;\n\n private drawerClass = tv({\n slots: {\n backdrop: 'fixed inset-0 bg-color-transparent z-40 transition-opacity duration-300',\n wrapper: 'bcm-ui-element fixed bg-color-base text-color-default z-50 transform transition-transform duration-300 ease-in-out flex flex-col',\n header: 'flex justify-between items-center bg-color-default text-color-default',\n title: 'font-semibold m-0 text-size-6',\n closeButton: 'text-size-5 font-medium text-color-default bg-transparent border-none p-0 h-6 w-6 hover:bg-color-default-hover cursor-pointer active:bg-color-default-active',\n content: 'overflow-y-auto flex-grow',\n },\n variants: {\n open: {\n true: {\n backdrop: 'opacity-100 visible',\n },\n false: {\n backdrop: 'opacity-0 invisible',\n },\n },\n position: {\n left: {\n wrapper: 'top-0 left-0 bottom-0',\n },\n right: {\n wrapper: 'top-0 right-0 bottom-0',\n },\n top: {\n wrapper: 'top-0 left-0 right-0',\n },\n bottom: {\n wrapper: 'bottom-0 left-0 right-0',\n },\n },\n size: {\n small: {\n header: 'py-3 px-4',\n content: 'p-4',\n },\n medium: {\n header: 'py-3 px-4',\n content: 'p-4',\n },\n large: {\n header: 'py-3 px-4',\n content: 'p-4',\n },\n },\n noHeader: {\n true: {\n header: 'hidden',\n },\n },\n },\n compoundVariants: [\n {\n open: true,\n position: ['left', 'right'],\n class: {\n wrapper: 'translate-x-0',\n },\n },\n {\n open: true,\n position: ['top', 'bottom'],\n class: {\n wrapper: 'translate-y-0',\n },\n },\n {\n open: false,\n position: 'left',\n class: {\n wrapper: '-translate-x-full',\n },\n },\n {\n open: false,\n position: 'right',\n class: {\n wrapper: 'translate-x-full',\n },\n },\n {\n open: false,\n position: 'top',\n class: {\n wrapper: '-translate-y-full',\n },\n },\n {\n open: false,\n position: 'bottom',\n class: {\n wrapper: 'translate-y-full',\n },\n },\n ],\n });\n\n @Watch('open')\n handleOpenChange(isOpen: boolean) {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n this.bcmOpen.emit();\n } else {\n document.body.style.overflow = '';\n this.bcmClose.emit();\n }\n }\n\n @Listen('keydown', { target: 'window' })\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.open) {\n this.hide();\n }\n }\n\n @Method()\n async show(): Promise<void> {\n const event = this.bcmBeforeOpen.emit();\n if (!event.defaultPrevented) {\n this.open = true;\n }\n }\n\n @Method()\n async hide(): Promise<void> {\n const event = this.bcmBeforeClose.emit();\n if (!event.defaultPrevented) {\n this.open = false;\n }\n }\n\n disconnectedCallback() {\n document.body.style.overflow = '';\n }\n\n private getWrapperStyle() {\n const style: { [key: string]: string } = {};\n\n if (this.fullWidth) {\n if (this.position === 'left' || this.position === 'right') {\n style.width = '100vw';\n } else {\n style.height = '100vh';\n }\n return style;\n }\n\n if (this.position === 'left' || this.position === 'right') {\n switch (this.size) {\n case 'small':\n style.width = '320px';\n break;\n case 'medium':\n style.width = '480px';\n break;\n case 'large':\n style.width = '1064px';\n break;\n }\n } else {\n switch (this.size) {\n case 'small':\n style.height = '40vh';\n break;\n case 'medium':\n style.height = '60vh';\n break;\n case 'large':\n style.height = '90vh';\n break;\n }\n }\n\n return style;\n }\n\n render() {\n const { backdrop, wrapper, header, title, closeButton, content } = this.drawerClass({\n open: this.open,\n position: this.position,\n size: this.size,\n noHeader: this.noHeader,\n });\n\n return (\n <div part=\"base\">\n <div part=\"backdrop\" class={backdrop()} onClick={() => this.hide()} />\n <div\n part=\"wrapper\"\n class={wrapper()}\n style={this.getWrapperStyle()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden={!this.open ? 'true' : 'false'}\n aria-label={this.headerText}\n >\n <div part=\"header\" class={header()}>\n <h2 part=\"title\" class={title()}>\n <slot name=\"header\">{this.headerText}</slot>\n </h2>\n <button part=\"close-button\" class={closeButton()} onClick={() => this.hide()} aria-label=\"Close\">\n <bcm-icon name=\"fa-solid fa-xmark\"></bcm-icon>\n </button>\n </div>\n <div part=\"content\" class={content()}>\n <slot />\n </div>\n <div part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n );\n }\n}\n","/* :host {\n --dropdown-box-min-weight: 32px;\n --dropdown-box-max-width: 384px;\n --dropdown-box-max-height: 384px;\n --dropdown-box-background-color: var(--bcm-ui-color-background-basic-panel);\n} */\n/* \n.scroll {\n height: 140px;\n width: 140px;\n overflow-y: auto;\n}\n\n.scroll:active::-webkit-scrollbar-thumb,\n.scroll:focus::-webkit-scrollbar-thumb,\n.scroll:hover::-webkit-scrollbar-thumb {\n visibility: visible;\n}\n.scroll::-webkit-scrollbar-thumb {\n background-color: darkgrey;\n visibility: hidden;\n}\n\n.scroll::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n} */\n","import { Component, ComponentInterface, h, Prop, State, Element, Host, Event, EventEmitter, Listen } from '@stencil/core';\nimport { tv } from '@utils/tv';\n\n@Component({\n tag: 'bcm-dropdown',\n styleUrl: 'dropdown.css',\n shadow: true,\n})\nexport class Dropdown implements ComponentInterface {\n @Element() host: HTMLElement;\n\n @Prop() text?: string;\n\n @State() isReady: boolean = false;\n\n @State() dropdownItems: HTMLBcmDropdownItemElement[] = [];\n\n protected buttonRef?: HTMLBcmButtonElement;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n eventName: 'bcmDropdownChange',\n })\n bcmDropdownChange: EventEmitter<any>;\n\n componentDidLoad() {\n const button = this.host.shadowRoot.querySelector('bcm-button') as HTMLBcmButtonElement;\n if (button) {\n this.buttonRef = button;\n this.isReady = true;\n }\n }\n\n @Listen('bcmDropDownItemChange', { capture: true })\n handleDropdownItemChange(event: CustomEvent) {\n const { element, selected } = event?.detail;\n\n this.dropdownItems?.forEach(item => {\n if (item != element) {\n item.selected = false;\n }\n });\n\n this.bcmDropdownChange.emit({\n element: element,\n selected,\n });\n }\n\n private dropdownClass = tv({\n base: 'dropdown flex flex-col items-center min-w-10 shadow-3 max-w-64 max-h-64 w-full bg-color-basic-panel rounded-lg py-1.5 overflow-y-auto',\n });\n\n private handleSlotChange = () => {\n this.dropdownItems = Array.from(this.host.querySelectorAll('bcm-dropdown-item'));\n\n if (this.dropdownItems.length === 0) {\n console.warn('No dropdown items found in dropdown component');\n }\n };\n\n render() {\n return (\n <Host>\n <bcm-button kind=\"outline\">\n <span part=\"text\">{this.text}</span>\n </bcm-button>\n {this.isReady && (\n <bcm-linked targetElement={this.buttonRef}>\n <div part=\"dropdown-container\" class={this.dropdownClass()}>\n <slot onSlotchange={this.handleSlotChange}></slot>\n </div>\n </bcm-linked>\n )}\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n width: 100%;\n}\n\n::slotted([slot='left-content']) {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n::slotted([slot='right-content']) {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n","import { Component, ComponentInterface, h, Prop, Event, EventEmitter, Element } from '@stencil/core';\nimport { tv } from '@utils/tv';\n\n@Component({\n tag: 'bcm-dropdown-item',\n styleUrl: 'dropdown-item.css',\n shadow: true,\n})\nexport class DropdownItem implements ComponentInterface {\n @Element() host: HTMLElement;\n @Prop() text: string;\n @Prop() icon: string;\n @Prop() rightIcons: string[];\n @Prop({ reflect: true }) selected: boolean = false;\n @Prop({ reflect: true }) error: boolean = false;\n @Prop({ reflect: true }) disabled: boolean = false;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n eventName: 'bcmDropDownItemChange',\n })\n bcmDropDownItemChange: EventEmitter<any>;\n\n private handleClick() {\n this.selected = true;\n this.bcmDropDownItemChange.emit({\n element: this.host,\n selected: this.selected,\n });\n }\n\n private dropdownItemClass = tv(\n {\n base: 'dropdown-item bcm-ui-element bcm-ui-content-display flex flex-row gap-2 py-2 px-4 cursor-pointer text-color',\n variants: {\n selected: {\n true: 'bg-[var(--bcm-ui-color-background-base-active)] hover:bg-[var(--bcm-ui-color-background-base-active)]',\n false: 'hover:bg-[var(--bcm-ui-color-background-base-hover)]',\n },\n error: {\n true: 'bg-[var(--bcm-ui-color-background-palette-red-default)] hover:bg-[var(--bcm-ui-color-background-palette-red-default)]',\n false: '',\n },\n disabled: {\n true: '', // should be discuss with ux team\n false: '',\n },\n },\n defaultVariants: {\n selected: false,\n error: false,\n disabled: false,\n },\n },\n {\n twMerge: false,\n },\n );\n\n render() {\n return (\n <div\n aria-checked={this.selected}\n class={this.dropdownItemClass({\n selected: this.selected,\n error: this.error,\n })}\n onClick={() => this.handleClick()}\n >\n <slot name=\"left-content\">{this.icon && <bcm-icon icon-name={this.icon}></bcm-icon>}</slot>\n <div class=\"flex flex-row text-pretty w-full\">\n <slot>{this.text}</slot>\n </div>\n <slot name=\"right-content\">\n {this.rightIcons?.map(icon => (\n <bcm-icon icon-name={icon}></bcm-icon>\n ))}\n </slot>\n </div>\n );\n }\n}\n","/**\n * Checks if a named slot has any content\n * @param element - The host element (component instance)\n * @param slotName - Name of the slot to check\n * @returns boolean indicating if the slot has any assigned nodes\n */\nexport const checkSlotContent = (element: HTMLElement, slotName: string): boolean => {\n const slot = element.shadowRoot?.querySelector(`slot[name=\"${slotName}\"]`) as HTMLSlotElement;\n if (!slot) return false;\n\n const assignedNodes = slot.assignedNodes();\n return assignedNodes.length > 0;\n};\n",":host {\n display: inline-block;\n}\n","import { Component, Prop, h, Event, EventEmitter, Method, State, Watch, Element } from '@stencil/core';\nimport { InputSize, InputStatus, InputType } from './types';\nimport { tv } from '@utils/tv';\nimport classNames from 'classnames';\nimport { generateId } from '../../utils/id/generate-id';\nimport { checkSlotContent } from '../../utils/slot/check-slot-content';\nimport { getValidationMessage, setValidationMessages, defaultValidationMessages } from '../../utils/validation-messages';\n\n@Component({\n tag: 'bcm-input',\n styleUrl: 'input.scss',\n shadow: true,\n})\nexport class BcmInput {\n @Element() el: HTMLElement;\n private inputRef: HTMLInputElement;\n\n @State() isFocused = false;\n @State() validationMessage: string;\n @State() isValid = true;\n @State() internalStatus: InputStatus = 'default';\n @State() internalErrorMessage: string;\n @State() isPasswordVisible = false;\n\n /** Input value */\n @Prop({ mutable: true, reflect: true })\n value: string = '';\n\n /** Input placeholder text */\n @Prop()\n placeholder?: string;\n\n /** Input name */\n @Prop()\n name?: string;\n\n /** Input id */\n @Prop({ attribute: 'id', reflect: true })\n _id?: string = generateId('input');\n\n /** Controls the input size */\n @Prop()\n size: InputSize = 'medium';\n\n /** Defines the input's status/state */\n @Prop()\n status: InputStatus = 'default';\n\n /** Full width input */\n @Prop({ attribute: 'full-width', reflect: true })\n fullWidth = false;\n\n /** HTML input type */\n @Prop()\n type: InputType = 'text';\n\n /** Whether the input is disabled */\n @Prop()\n disabled = false;\n\n /** Whether the input is readonly */\n @Prop()\n readonly = false;\n\n /** Whether the input is required */\n @Prop()\n required = false;\n\n /** Input autocomplete attribute */\n @Prop()\n autocomplete?: string;\n\n /** Min length for text input */\n @Prop()\n minLength?: number;\n\n /** Max length for text input */\n @Prop()\n maxLength?: number;\n\n /** Min value for number input */\n @Prop()\n min?: number;\n\n /** Max value for number input */\n @Prop()\n max?: number;\n\n /** Step value for number input */\n @Prop()\n step?: number;\n\n /** Pattern for validation */\n @Prop()\n pattern?: string;\n\n /** Input label for accessibility */\n @Prop()\n label?: string;\n\n /** Error message to display */\n @Prop()\n errorMessage?: string;\n\n /** Caption text to display below input */\n @Prop()\n captionText?: string;\n\n /** ID of associated label element */\n @Prop()\n labelledby?: string;\n\n /** ID of associated caption/error text element */\n @Prop()\n describedby?: string;\n\n /** Prefix icon class name */\n @Prop()\n prefixIcon?: string;\n\n /** Suffix icon class name */\n @Prop()\n suffixIcon?: string;\n\n /** Whether to use native form validation\n * If false, component will handle validation internally\n */\n @Prop()\n useNativeValidation = true;\n\n /** Custom validation function */\n @Prop()\n validator?: (value: string) => string | undefined;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmInput: EventEmitter<InputEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmChange: EventEmitter<Event>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmFocus: EventEmitter<FocusEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmBlur: EventEmitter<FocusEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmKeyDown: EventEmitter<KeyboardEvent>;\n\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmKeyUp: EventEmitter<KeyboardEvent>;\n\n @Watch('value')\n handleValueChange(newValue: string) {\n if (this.inputRef) {\n this.inputRef.value = newValue;\n }\n }\n\n @Watch('status')\n watchStatus(newValue: InputStatus) {\n this.internalStatus = newValue;\n }\n\n @Watch('errorMessage')\n watchErrorMessage(newValue: string) {\n this.internalErrorMessage = newValue;\n }\n\n @Method()\n async setFocus() {\n this.inputRef?.focus();\n }\n\n @Method()\n async setBlur() {\n this.inputRef?.blur();\n }\n\n @Method()\n async select() {\n this.inputRef?.select();\n }\n\n /** Sets locale and messages for all inputs */\n @Method()\n async setLocale(locale: string, messages: Record<string, string>) {\n // Set messages and update validation immediately\n setValidationMessages(locale, messages);\n\n // Mevcut validasyon mesajını güncelle\n if (!this.isValid) {\n this.validateInput();\n }\n }\n\n componentWillLoad() {\n // I18n için default mesajları set et\n setValidationMessages('en', defaultValidationMessages);\n this.internalStatus = this.status;\n this.internalErrorMessage = this.errorMessage;\n }\n\n private validateInput(): void {\n if (!this.inputRef) return;\n\n // Reset validation state\n this.isValid = true;\n this.validationMessage = '';\n\n const value = this.inputRef.value;\n\n // Required check\n if (this.required && !value) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('required');\n this.internalStatus = 'error';\n this.internalErrorMessage = this.validationMessage;\n return;\n }\n\n // Minimum length check\n else if (this.minLength && value.length < this.minLength) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('minlength', { min: this.minLength });\n }\n // Maximum length check\n else if (this.maxLength && value.length > this.maxLength) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('maxlength', { max: this.maxLength });\n }\n // Pattern check\n else if (this.pattern && !new RegExp(this.pattern).test(value)) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('pattern');\n }\n // Email check\n else if (this.type === 'email' && value && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('email');\n }\n // Number range check\n else if (this.type === 'number' && value) {\n const numValue = parseFloat(value);\n if (this.min !== undefined && numValue < this.min) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('min', { min: this.min });\n } else if (this.max !== undefined && numValue > this.max) {\n this.isValid = false;\n this.validationMessage = getValidationMessage('max', { max: this.max });\n }\n }\n\n // Update component state\n this.internalStatus = this.isValid ? 'default' : 'error';\n this.internalErrorMessage = this.validationMessage;\n }\n\n private onInput = (event: InputEvent) => {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n this.bcmInput.emit(event);\n this.validateInput();\n };\n\n private onChange = (event: Event) => {\n this.bcmChange.emit(event);\n };\n\n private onFocus = (event: FocusEvent) => {\n this.isFocused = true;\n this.bcmFocus.emit(event);\n };\n\n private onBlur = (event: FocusEvent) => {\n this.isFocused = false;\n this.bcmBlur.emit(event);\n this.validateInput();\n };\n\n private onKeyDown = (event: KeyboardEvent) => {\n this.bcmKeyDown.emit(event);\n };\n\n private onKeyUp = (event: KeyboardEvent) => {\n this.bcmKeyUp.emit(event);\n };\n\n private hasSlotContent(slotName: string): boolean {\n return checkSlotContent(this.el, slotName);\n }\n\n private styleClass = tv(\n {\n slots: {\n base: [\n 'bcm-input bcm-input__container',\n 'bg-[--bcm-ui-color-background-base-default]',\n 'text-[--bcm-ui-color-text-default]',\n 'border border-solid rounded',\n 'flex items-center justify-between',\n 'transition-colors duration-200',\n 'px-2',\n ],\n inputClass: [\n 'input',\n 'w-full flex-1',\n 'border-0 outline-0 bg-transparent',\n 'appearance-none text-ellipsis',\n 'text-[--bcm-ui-color-text-default] placeholder:text-[--bcm-ui-color-text-placeholder] placeholder:font-normal',\n 'font-sans antialiased font-medium',\n 'px-1',\n '[appearance:textfield][&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none',\n ],\n },\n variants: {\n size: {\n small: {\n base: '',\n inputClass: 'text-size-4 py-px',\n },\n medium: {\n base: '',\n inputClass: 'text-size-5 leading-6 py-1',\n },\n large: {\n base: '',\n inputClass: 'text-size-6 py-2',\n },\n },\n status: {\n default: {\n base: ['border-[--bcm-ui-color-border-default]', 'hover:border-[--bcm-ui-color-border-primary]', 'has-[:focus]:border-[--bcm-ui-color-border-primary]'],\n },\n error: {\n base: ['border-[--bcm-ui-color-border-error]', 'hover:border-[--bcm-ui-color-border-error]', 'has-[:focus]:border-[--bcm-ui-color-border-error]'],\n },\n success: {\n base: ['border-[--bcm-ui-color-border-success]', 'hover:border-[--bcm-ui-color-border-success]', 'has-[:focus]:border-[--bcm-ui-color-border-success]'],\n },\n warning: {\n base: ['border-[--bcm-ui-color-border-warning]', 'hover:border-[--bcm-ui-color-border-warning]', 'has-[:focus]:border-[--bcm-ui-color-border-warning]'],\n },\n info: {\n base: ['border-[--bcm-ui-color-border-info]', 'hover:border-[--bcm-ui-color-border-info]', 'has-[:focus]:border-[--bcm-ui-color-border-info]'],\n },\n },\n fullWidth: {\n true: 'full-width w-full',\n },\n disabled: {\n true: 'disabled cursor-not-allowed',\n false: '',\n },\n focused: {\n true: {\n base: '',\n },\n },\n },\n defaultVariants: {\n size: 'medium',\n status: 'default',\n fullWidth: false,\n disabled: false,\n focused: false,\n },\n },\n {\n twMerge: false,\n },\n );\n\n private getDefaultIconForType(): string | undefined {\n return; // TODO: Will be implemented later\n // return defaultIcons[this.type as keyof typeof defaultIcons];\n }\n\n private togglePasswordVisibility = () => {\n this.isPasswordVisible = !this.isPasswordVisible;\n this.inputRef.type = this.isPasswordVisible ? 'text' : 'password';\n };\n\n private PasswordToggleButton = () => {\n if (this.type !== 'password' || this.disabled || this.readonly || this.value?.length === 0) return null;\n return (\n <button class=\"appearance-none flex items-center w-6 h-full justify-center\" onClick={this.togglePasswordVisibility} type=\"button\">\n <bcm-icon name={this.isPasswordVisible ? 'fa-eye-slash fa-regular' : 'fa-regular fa-eye'} size={this.iconSize}></bcm-icon>\n </button>\n );\n };\n\n private iconSize = {\n small: 14,\n medium: 16,\n large: 18,\n }[this.size];\n\n render() {\n const inputId = this._id + '-input' || this.name;\n\n const { base, inputClass } = this.styleClass({\n size: this.size,\n status: this.internalStatus,\n fullWidth: this.fullWidth,\n disabled: this.disabled,\n focused: this.isFocused,\n });\n\n return (\n <div class=\"bcm-ui-element\">\n {this.label && (\n <label\n class={classNames(\n 'input-label font-medium',\n {\n 'text-color-label': !this.disabled,\n 'text-color-disabled': this.disabled,\n },\n {\n 'text-size-3': this.size === 'small',\n 'text-size-4': this.size === 'medium',\n 'text-size-5': this.size === 'large',\n },\n )}\n htmlFor={inputId}\n >\n <slot name=\"label\">{this.label}</slot>\n {this.required && <span>*</span>}\n </label>\n )}\n\n <div class={base()}>\n {(this.hasSlotContent('prefix') || this.prefixIcon || this.getDefaultIconForType()) && (\n <div class=\"flex items-center gap-2 px-2\">\n {(this.prefixIcon || this.getDefaultIconForType()) && (\n <bcm-icon class=\"prefix-icon\" icon-name={this.prefixIcon || this.getDefaultIconForType()} size={this.iconSize}></bcm-icon>\n )}\n <slot name=\"prefix\"></slot>\n </div>\n )}\n <input\n ref={el => (this.inputRef = el)}\n id={inputId}\n class={inputClass()}\n type={this.type}\n name={this.name}\n disabled={this.disabled}\n readonly={this.readonly}\n required={this.required}\n placeholder={this.placeholder}\n autocomplete={this.autocomplete}\n minlength={this.minLength}\n maxlength={this.maxLength}\n min={this.min}\n max={this.max}\n step={this.step}\n pattern={this.pattern}\n aria-invalid={this.status === 'error'}\n aria-required={this.required}\n aria-labelledby={this.labelledby}\n aria-describedby={this.describedby}\n value={this.value}\n onInput={this.onInput}\n onChange={this.onChange}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n onKeyDown={this.onKeyDown}\n onKeyUp={this.onKeyUp}\n />\n {(this.hasSlotContent('suffix') || this.suffixIcon) && (\n <div class=\"flex items-center gap-2 px-2\">\n <slot name=\"suffix\"></slot>\n {this.suffixIcon && <bcm-icon class=\"suffix-icon\" icon-name={this.suffixIcon} size={this.iconSize}></bcm-icon>}\n </div>\n )}\n {/* {this.type === 'password' && this.value?.length > 0 && !this.disabled && ( \n // <bcm-icon\n // class=\"password-toggle-icon cursor-pointer\"\n // icon-name={this.isPasswordVisible ? 'fa-regular fa-eye-slash' : 'fa-regular fa-eye'}\n // size={iconSize}\n // onClick={this.togglePasswordVisibility}\n // ></bcm-icon>\n // )}*/}\n {this.PasswordToggleButton()}\n </div>\n {(this.captionText || this.internalErrorMessage || this.validationMessage) && (\n <div\n class={classNames(\n 'input-caption-text font-regular mt-1',\n {\n 'text-[--bcm-ui-color-text-caption]': !this.disabled && this.internalStatus === 'default',\n 'text-[--bcm-ui-color-text-error]': !this.disabled && (this.internalStatus === 'error' || !this.isValid),\n 'text-[--bcm-ui-color-text-success]': !this.disabled && this.internalStatus === 'success',\n 'text-[--bcm-ui-color-text-warning]': !this.disabled && this.internalStatus === 'warning',\n 'text-[--bcm-ui-color-text-info]': !this.disabled && this.internalStatus === 'info',\n 'text-[--bcm-ui-color-text-disabled]': this.disabled,\n },\n {\n 'text-size-3': this.size === 'small',\n 'text-size-4': this.size === 'medium',\n 'text-size-5': this.size === 'large',\n },\n )}\n >\n {!this.isValid ? this.validationMessage : this.internalStatus === 'error' ? this.internalErrorMessage : this.captionText}\n </div>\n )}\n </div>\n );\n }\n}\n","bcm-linked {\n display: block;\n position: relative;\n}\nbcm-linked[append-to-body] {\n display: none;\n}\n\n.floating-content {\n min-width: max-content;\n transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease;\n will-change: transform, opacity;\n}\n\n.floating-visible {\n animation: fadeInScale 0.2s ease-out;\n}\n\n.floating-hidden {\n display: none !important;\n pointer-events: none;\n}\n\n.floating-wrapper {\n position: relative;\n z-index: 1;\n}\n\n/* Animations */\n@keyframes fadeInScale {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Arrow Styles */\n.floating-arrow {\n position: absolute;\n width: 10px;\n height: 10px;\n z-index: -1;\n}\n\n.floating-arrow::before {\n content: '';\n position: absolute;\n width: 10px;\n height: 10px;\n background: white;\n border: 1px solid #e2e8f0;\n transform: rotate(45deg);\n}\n\n/* Arrow positioning based on placement */\n.arrow-top {\n bottom: -5px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.arrow-bottom {\n top: -5px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.arrow-left {\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.arrow-right {\n left: -5px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n/* Arrow border fix for bordered popups */\n.arrow-top::before {\n border-bottom: 0;\n border-right: 0;\n}\n\n.arrow-bottom::before {\n border-top: 0;\n border-left: 0;\n}\n\n.arrow-left::before {\n border-top: 0;\n border-right: 0;\n}\n\n.arrow-right::before {\n border-bottom: 0;\n border-left: 0;\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .floating-content {\n max-width: calc(100vw - 32px);\n max-height: calc(100vh - 32px);\n }\n}\n","import { Component, ComponentInterface, Prop, Element, State, h, Event, EventEmitter, Watch, Method, Host } from '@stencil/core';\nimport { computePosition, shift, offset, autoUpdate, flip, type Placement } from '@floating-ui/dom';\n\nexport type TriggerType = 'hover' | 'click' | 'focus' | 'manual';\n\n@Component({\n tag: 'bcm-linked',\n styleUrl: 'linked.css',\n shadow: false,\n})\nexport class BcmLinked implements ComponentInterface {\n @Element() host: HTMLElement;\n\n // Target configuration\n @Prop({ reflect: true, attribute: 'target-id' }) targetId?: string;\n @Prop() targetElement?: HTMLElement;\n\n // Trigger configuration\n @Prop() trigger: TriggerType = 'click';\n @Prop() placement: Placement = 'bottom-start';\n\n // Timing configuration\n @Prop() showDelay: number = 0;\n @Prop() hideDelay: number = 0;\n\n // Positioning configuration\n @Prop() offset: number = 8;\n @Prop() arrow: boolean = false;\n @Prop() disabled: boolean = false;\n\n // Style configuration\n @Prop() zIndex: number = 1000;\n @Prop() appendToBody: boolean = false;\n @Prop() destroyOnHide: boolean = false;\n\n // State\n @State() isVisible: boolean = false;\n @State() isReady: boolean = false;\n\n // Events\n @Event() bcmShow: EventEmitter<void>;\n @Event() bcmHide: EventEmitter<void>;\n @Event() bcmShown: EventEmitter<void>;\n @Event() bcmHidden: EventEmitter<void>;\n\n // Private properties\n private floatingEl?: HTMLElement;\n private targetEl?: HTMLElement;\n private showTimeout?: NodeJS.Timeout;\n private hideTimeout?: NodeJS.Timeout;\n private cleanup?: () => void;\n private clickOutsideHandler?: (e: MouseEvent) => void;\n private resizeObserver?: ResizeObserver;\n private originalParent?: Node;\n private originalNextSibling?: Node;\n\n // Watch for changes\n @Watch('targetId')\n @Watch('targetElement')\n setupTarget() {\n this.disconnectTarget();\n this.connectTarget();\n }\n\n @Watch('isVisible')\n onVisibilityChange(newValue: boolean) {\n if (newValue) {\n this.updatePosition();\n this.bcmShown.emit();\n } else {\n this.bcmHidden.emit();\n }\n }\n\n async componentDidLoad() {\n // Wait for render\n await new Promise(resolve => requestAnimationFrame(resolve));\n\n this.floatingEl = this.host.querySelector('.floating-content') as HTMLElement;\n\n if (this.floatingEl) {\n this.isReady = true;\n this.connectTarget();\n this.setupFloatingObserver();\n console.log('✅ bcm-linked initialized successfully');\n } else {\n console.error('❌ Could not find .floating-content element');\n }\n }\n\n disconnectedCallback() {\n this.disconnectTarget();\n this.clearTimeouts();\n this.cleanup?.();\n this.resizeObserver?.disconnect();\n\n // Restore element to original position if component is destroyed while in portal\n if (this.appendToBody && this.floatingEl && this.originalParent) {\n this.originalParent.appendChild(this.floatingEl);\n }\n }\n\n private connectTarget() {\n if (!this.isReady) return;\n\n // Find target element\n this.targetEl =\n this.targetElement || (this.targetId ? document.getElementById(this.targetId) : null) || (this.host.previousElementSibling as HTMLElement) || this.host.parentElement;\n\n if (!this.targetEl) {\n console.warn('bcm-linked: No target element found');\n return;\n }\n\n // Setup event listeners based on trigger type\n this.setupEventListeners();\n\n // Setup auto-update for position\n if (this.targetEl && this.floatingEl) {\n this.cleanup = autoUpdate(this.targetEl, this.floatingEl, () => {\n if (this.isVisible) {\n this.updatePosition();\n }\n });\n }\n\n // Setup resize observer for responsive positioning\n this.resizeObserver = new ResizeObserver(() => {\n if (this.isVisible) {\n this.updatePosition();\n }\n });\n this.resizeObserver.observe(this.floatingEl);\n }\n\n private disconnectTarget() {\n if (this.targetEl) {\n this.removeEventListeners();\n }\n this.cleanup?.();\n this.resizeObserver?.disconnect();\n }\n\n private setupEventListeners() {\n if (!this.targetEl || this.disabled) return;\n\n switch (this.trigger) {\n case 'hover':\n this.targetEl.addEventListener('mouseenter', this.handleMouseEnter);\n this.targetEl.addEventListener('mouseleave', this.handleMouseLeave);\n this.floatingEl?.addEventListener('mouseenter', this.handleFloatingMouseEnter);\n this.floatingEl?.addEventListener('mouseleave', this.handleFloatingMouseLeave);\n break;\n\n case 'click':\n this.targetEl.addEventListener('click', this.handleClick);\n this.setupClickOutside();\n break;\n\n case 'focus':\n this.targetEl.addEventListener('focus', this.handleFocus);\n this.targetEl.addEventListener('blur', this.handleBlur);\n break;\n }\n }\n\n private removeEventListeners() {\n if (!this.targetEl) return;\n\n this.targetEl.removeEventListener('mouseenter', this.handleMouseEnter);\n this.targetEl.removeEventListener('mouseleave', this.handleMouseLeave);\n this.targetEl.removeEventListener('click', this.handleClick);\n this.targetEl.removeEventListener('focus', this.handleFocus);\n this.targetEl.removeEventListener('blur', this.handleBlur);\n\n this.floatingEl?.removeEventListener('mouseenter', this.handleFloatingMouseEnter);\n this.floatingEl?.removeEventListener('mouseleave', this.handleFloatingMouseLeave);\n\n this.removeClickOutside();\n }\n\n private setupClickOutside() {\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!this.floatingEl?.contains(target) && !this.targetEl?.contains(target) && !this.host.contains(target)) {\n this.hide();\n }\n };\n document.addEventListener('click', this.clickOutsideHandler, true);\n }\n\n private removeClickOutside() {\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler, true);\n this.clickOutsideHandler = undefined;\n }\n }\n\n private handleMouseEnter = () => {\n this.clearTimeouts();\n if (this.showDelay > 0) {\n this.showTimeout = setTimeout(() => this.show(), this.showDelay);\n } else {\n this.show();\n }\n };\n\n private handleMouseLeave = () => {\n this.clearTimeouts();\n if (this.hideDelay > 0) {\n this.hideTimeout = setTimeout(() => this.hide(), this.hideDelay);\n } else {\n this.hide();\n }\n };\n\n private handleFloatingMouseEnter = () => {\n this.clearTimeouts();\n };\n\n private handleFloatingMouseLeave = () => {\n this.clearTimeouts();\n if (this.hideDelay > 0) {\n this.hideTimeout = setTimeout(() => this.hide(), this.hideDelay);\n } else {\n this.hide();\n }\n };\n\n private handleClick = (e: Event) => {\n e.stopPropagation();\n this.toggle();\n };\n\n private handleFocus = () => {\n this.show();\n };\n\n private handleBlur = () => {\n this.hide();\n };\n\n private clearTimeouts() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = undefined;\n }\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n }\n }\n\n private async updatePosition() {\n if (!this.targetEl || !this.floatingEl || !this.isVisible) return;\n\n // Use autoPlacement only for bottom-start (dropdown default)\n // For other placements, respect the manual placement with flip fallback\n // const useAutoPlacement = this.placement === 'bottom-start';\n\n const middleware = [\n offset(this.offset),\n // useAutoPlacement\n // ? autoPlacement({\n // allowedPlacements: ['bottom-start', 'bottom-end', 'bottom', 'top-start', 'top-end', 'top', 'right-start', 'right-end', 'right', 'left-start', 'left-end', 'left'],\n // boundary: document.body,\n // })\n // :\n flip({\n fallbackPlacements: ['top', 'bottom', 'left', 'right', 'top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-start', 'left-end', 'right-start', 'right-end'],\n }),\n shift({\n padding: 8,\n }),\n ];\n\n const { x, y, placement } = await computePosition(this.targetEl, this.floatingEl, {\n placement: this.placement,\n middleware,\n strategy: 'fixed',\n });\n\n Object.assign(this.floatingEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n zIndex: this.zIndex.toString(),\n });\n\n // Update arrow if enabled\n if (this.arrow) {\n this.updateArrow(placement);\n }\n }\n\n private updateArrow(placement: Placement) {\n const arrow = this.floatingEl?.querySelector('.floating-arrow') as HTMLElement;\n if (!arrow) return;\n\n // Remove all arrow classes\n arrow.className = 'floating-arrow';\n\n // Add placement-specific class\n const side = placement.split('-')[0];\n arrow.classList.add(`arrow-${side}`);\n }\n\n @Method()\n async show(): Promise<void> {\n if (this.disabled || this.isVisible) return;\n\n this.bcmShow.emit();\n\n // Portalling: Move the floating element to the body\n if (this.appendToBody && this.floatingEl) {\n this.originalParent = this.floatingEl.parentNode;\n this.originalNextSibling = this.floatingEl.nextSibling;\n document.body.appendChild(this.floatingEl);\n }\n\n this.isVisible = true;\n\n // Use requestAnimationFrame to ensure the element is visible before positioning\n await new Promise(resolve => requestAnimationFrame(resolve));\n await this.updatePosition();\n }\n\n @Method()\n async hide(): Promise<void> {\n if (!this.isVisible) return;\n\n this.bcmHide.emit();\n this.isVisible = false;\n\n // Portalling: Restore the floating element to its original position\n if (this.appendToBody && this.floatingEl && this.originalParent) {\n if (this.originalNextSibling) {\n this.originalParent.insertBefore(this.floatingEl, this.originalNextSibling);\n } else {\n this.originalParent.appendChild(this.floatingEl);\n }\n this.originalParent = undefined;\n this.originalNextSibling = undefined;\n }\n\n if (this.destroyOnHide && this.floatingEl && this.floatingEl.parentNode) {\n this.floatingEl.parentNode.removeChild(this.floatingEl);\n }\n }\n\n @Method()\n async toggle(): Promise<void> {\n if (this.isVisible) {\n await this.hide();\n } else {\n await this.show();\n }\n }\n\n @Method()\n async updatePositioning(): Promise<void> {\n await this.updatePosition();\n }\n\n private setupFloatingObserver() {\n if (!this.floatingEl) return;\n\n // Observe floating element size changes for position updates\n this.resizeObserver = new ResizeObserver(() => {\n if (this.isVisible) {\n this.updatePosition();\n }\n });\n\n this.resizeObserver.observe(this.floatingEl);\n }\n\n render() {\n const floatingClasses = {\n 'floating-content': true,\n 'floating-visible': this.isVisible,\n 'floating-hidden': !this.isVisible,\n 'floating-with-arrow': this.arrow,\n 'floating-destroy-on-hide': this.destroyOnHide,\n };\n\n return (\n <Host>\n <div\n class={floatingClasses}\n style={{\n position: 'fixed',\n top: '0px',\n left: '0px',\n zIndex: this.zIndex.toString(),\n display: this.isVisible ? 'block' : 'none',\n visibility: this.isVisible ? 'visible' : 'hidden',\n opacity: this.isVisible ? '1' : '0',\n pointerEvents: this.isVisible ? 'auto' : 'none',\n }}\n >\n {this.arrow && <div class=\"floating-arrow\" />}\n <div class=\"floating-wrapper\">\n <slot></slot>\n </div>\n </div>\n <div style={{ display: 'none' }}>\n <slot name=\"fallback\"></slot>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: inline-block;\n}\n","import { Component, ComponentInterface, Prop, h } from '@stencil/core';\nimport cs from 'classnames';\n\nconst osKeys = {\n ctrl: '⌘',\n alt: '⌥',\n shift: '⇧',\n del: '⌫',\n delete: '⌫',\n backspace: '⌦',\n enter: '⏎',\n return: '⏎',\n};\n\n@Component({\n tag: 'bcm-shortcut',\n styleUrl: './shortcut.css',\n shadow: true,\n})\nexport class BcmShortcut implements ComponentInterface {\n @Prop() hotkey: string;\n @Prop() size: 'small' | 'medium' | 'large' = 'small';\n\n private readonly isMac = /Mac/.test(window.navigator.userAgent);\n\n getHotkey(key: string): string {\n if (!key) {\n return '';\n }\n if (this.isMac && (key.includes(' ') || key.includes('+'))) {\n const keys = key.split(/[\\s+]+/);\n return keys.map(k => osKeys[k] || k).join('');\n } else {\n return key;\n }\n }\n\n render() {\n const { size, hotkey } = this;\n\n return (\n <div\n class={cs(\n 'bcm-ui-element bcm-ui-content-display',\n 'block h-fit w-fit rounded border border-solid px-1',\n 'border-color-default bg-color-default text-color-default',\n 'text-center font-medium capitalize',\n {\n 'text-size-2': size === 'small',\n 'text-size-3': size === 'medium',\n 'text-size-4': size === 'large',\n },\n )}\n >\n {this.getHotkey(hotkey)}\n </div>\n );\n }\n}\n","import { TextVariant, TextTag } from './text.types';\n\nexport const variantTagMap: Record<TextVariant, TextTag> = {\n display: 'h1',\n heading1: 'h2',\n heading2: 'h3',\n title1: 'h4',\n title2: 'h5',\n title3: 'h6',\n body: 'p',\n bodyAccent: 'p',\n helper: 'p',\n caption: 'p',\n label: 'label',\n placeholder: 'p',\n link: 'a',\n info: 'p',\n infoAccent: 'p',\n};\n",null,"import { Component, h, Prop } from '@stencil/core';\nimport cs from 'classnames';\nimport { TextVariant, TextSize } from './text.types';\nimport { variantTagMap } from './text.utils';\n\n@Component({\n tag: 'bcm-text',\n styleUrl: 'text.scss',\n shadow: true,\n})\nexport class BcmText {\n /** Text content */\n @Prop()\n text: string;\n\n /** Text variant */\n @Prop()\n variant: TextVariant = 'body';\n\n /** Text size */\n @Prop()\n size: TextSize = 'medium';\n\n /** Text overflow behavior */\n @Prop()\n overflow: boolean = false;\n\n private readonly variantClassMap = {\n display: 'font-semibold text-size-12 text-color-header',\n heading1: 'font-semibold text-size-7 text-color-header',\n heading2: 'font-semibold text-size-6 text-color-header',\n title1: {\n small: 'font-semibold text-size-5 text-color-header',\n medium: 'font-semibold text-size-6 text-color-header',\n large: 'font-semibold text-size-7 text-color-header',\n },\n title2: {\n small: 'font-semibold text-size-4 text-color-default',\n medium: 'font-semibold text-size-5 text-color-default',\n large: 'font-semibold text-size-6 text-color-default',\n },\n title3: {\n small: 'font-semibold text-size-3 text-color-disabled',\n medium: 'font-semibold text-size-4 text-color-disabled',\n large: 'font-semibold text-size-5 text-color-disabled',\n },\n body: {\n small: 'font-regular text-size-4 text-color-default',\n medium: 'font-regular text-size-5 text-color-default',\n large: 'font-regular text-size-6 text-color-default',\n },\n bodyAccent: {\n small: 'font-medium text-size-4 text-color-default',\n medium: 'font-medium text-size-5 text-color-default',\n large: 'font-medium text-size-6 text-color-default',\n },\n helper: {\n small: 'font-regular text-size-4 text-color-helper',\n medium: 'font-regular text-size-5 text-color-helper',\n large: 'font-regular text-size-6 text-color-helper',\n },\n caption: {\n small: 'font-regular text-size-3 text-color-caption',\n medium: 'font-regular text-size-4 text-color-caption',\n large: 'font-regular text-size-5 text-color-caption',\n },\n link: {\n small: 'font-medium text-size-4 underline text-color-primary',\n medium: 'font-medium text-size-5 underline text-color-primary',\n large: 'font-medium text-size-6 underline text-color-primary',\n },\n label: {\n small: 'font-medium text-size-3 text-color-label',\n medium: 'font-medium text-size-4 text-color-label',\n large: 'font-medium text-size-5 text-color-label',\n },\n placeholder: {\n small: 'font-regular text-size-4 text-color-placeholder',\n medium: 'font-regular text-size-5 text-color-placeholder',\n large: 'font-regular text-size-6 text-color-placeholder',\n },\n info: {\n small: 'font-regular text-size-3 text-color-default',\n medium: 'font-regular text-size-4 text-color-default',\n large: 'font-regular text-size-5 text-color-default',\n },\n infoAccent: {\n small: 'font-medium text-size-3 text-color-header',\n medium: 'font-medium text-size-4 text-color-header',\n large: 'font-medium text-size-5 text-color-header',\n },\n } as const;\n\n private getTextClass = (variant: TextVariant, size: TextSize): string => {\n const variantClasses = this.variantClassMap[variant];\n\n if (typeof variantClasses === 'string') {\n return variantClasses;\n }\n\n return variantClasses[size];\n };\n\n private getOverflowClass = (overflow: boolean): string => {\n return overflow ? 'truncate' : '';\n };\n\n render() {\n const Tag = variantTagMap[this.variant];\n const variantClass = this.getTextClass(this.variant, this.size);\n const overflowClass = this.getOverflowClass(this.overflow ?? false);\n\n return (\n <Tag class={cs('bcm-text appearance-none m-0 p-0', variantClass, overflowClass)} part=\"text\">\n <slot>{this.text}</slot>\n </Tag>\n );\n }\n}\n"],"mappings":"oRAiBO,MAAMA,EAAgD,CAC3DC,KAAM,CACJC,KAAM,OACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,SACdC,KAAM,WAERC,GAAI,CACFL,KAAM,KACNC,OAAQ,UACRC,KAAM,eACNC,aAAc,UAEhBG,IAAK,CACHN,KAAM,MACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBI,IAAK,CACHP,KAAM,MACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBK,OAAQ,CACNR,KAAM,SACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBM,KAAM,CACJT,KAAM,OACNC,OAAQ,UACRC,KAAM,oBACNC,aAAc,UAEhBO,KAAM,CACJV,KAAM,OACNC,OAAQ,UACRC,KAAM,qBACNC,aAAc,UAEhBQ,MAAO,CACLX,KAAM,QACNC,OAAQ,UACRC,KAAM,sBACNC,aAAc,UAEhBS,OAAQ,CACNZ,KAAM,SACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBU,KAAM,CACJb,KAAM,OACNC,OAAQ,UACRC,KAAM,qBACNC,aAAc,UAEhBW,OAAQ,CACNd,KAAM,SACNC,OAAQ,QACRC,KAAM,eACNC,aAAc,UAEhBY,OAAQ,CACNf,KAAM,SACNC,OAAQ,QACRC,KAAM,eACNC,aAAc,UAEhBa,QAAS,CACPhB,KAAM,UACNC,OAAQ,QACRC,KAAM,aACNC,aAAc,UAEhBc,MAAO,CACLjB,KAAM,QACNC,OAAQ,QACRC,KAAM,sBACNC,aAAc,UAEhBe,QAAS,CACPlB,KAAM,UACNC,OAAQ,QACRC,KAAM,qBACNC,aAAc,UAEhBgB,OAAQ,CACNnB,KAAM,SACNC,OAAQ,QACRC,KAAM,sBACNC,aAAc,UAEhBiB,KAAM,CACJpB,KAAM,OACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBkB,OAAQ,CACNrB,KAAM,SACNC,OAAQ,UACRC,KAAM,kBACNC,aAAc,UAEhBmB,OAAQ,CACNtB,KAAM,SACNC,OAAQ,UACRC,KAAM,iBACNC,aAAc,UAEhBoB,OAAQ,CACNvB,KAAM,SACNC,OAAQ,UACRC,KAAM,gBACNC,aAAc,UAEhBqB,OAAQ,CACNxB,KAAM,SACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBsB,MAAO,CACLzB,KAAM,QACNC,OAAQ,UACRC,KAAM,cACNC,aAAc,UAEhBuB,SAAU,CACR1B,KAAM,WACNC,OAAQ,UACRC,KAAM,kBACNC,aAAc,WC3JlB,MAAMwB,EAAY,q+K,MCSLC,EAAS,MALtB,WAAAC,CAAAC,G,iHAQEC,KAAI3B,KAAe,UAInB2B,KAAIC,KAAe,SAInBD,KAAM9B,OAAiB,UAgBvB8B,KAAY5B,aAAiB,SAI7B4B,KAAQE,SAAG,MAIXF,KAASG,UAAG,MAIZH,KAAII,KAAe,SAInBJ,KAAOK,QAAG,MAIVL,KAAQM,SAAG,MAQXN,KAAMO,OAAG,MA6CDP,KAAAQ,YAAeC,IACrB,IAAKT,KAAKM,WAAaN,KAAKK,QAAS,CACnCL,KAAKU,SAASC,KAAKF,E,GAIfT,KAAAY,YAAeH,IACrBT,KAAKa,SAASF,KAAKF,EAAM,EAGnBT,KAAAc,WAAcL,IACpBT,KAAKe,QAAQJ,KAAKF,EAAM,EAgFlBT,KAAWgB,YAAGC,EACpB,CACEC,KAAM,2GACNC,SAAU,CACRlB,KAAM,CACJmB,MAAO,iCACPC,OAAQ,kCACRC,MAAO,kCAETjD,KAAM,CACJkD,QAAS,eACTC,MAAO,aACPvD,KAAM,YACNwD,QAAS,gBAEXtB,UAAW,CACTuB,KAAM,qBAERpB,SAAU,CACRoB,KAAM,wHACNC,MAAO,CACL,iBACA,4FACA,wCACA,0CACA,uBAGJtB,QAAS,CACPqB,KAAM,IAERE,SAAU,CACRC,MAAO,iBACPC,OAAQ,kBACRC,KAAM,kBAGVC,gBAAiB,CACf/B,KAAM,SACN5B,KAAM,UACN8B,UAAW,MACXG,SAAU,MACVD,QAAS,QAGb,CACE4B,QAAS,OAyCd,CApKC,cAAYC,GACV,OAAOlC,KAAK/B,OAAS+B,KAAKmC,QAAUpE,EAAeiC,KAAKmC,SAASlE,KAAO,G,CAG1E,cAAYmE,GACV,GAAIpC,KAAKmC,SAAWpE,EAAeiC,KAAKmC,SAAShE,KAAM,CACrD,MAAO,CACLA,KAAMJ,EAAeiC,KAAKmC,SAAShE,KACnCyD,SAAU7D,EAAeiC,KAAKmC,SAAS/D,cAAgB,S,CAI3D,MAAO,CACLD,KAAM6B,KAAK7B,KACXyD,SAAU5B,KAAK5B,a,CAInB,gBAAYiE,GACV,OAAOrC,KAAKmC,QAAUpE,EAAeiC,KAAKmC,SAASjE,OAAS8B,KAAK9B,M,CAGnE,gBAAYoE,GACV,MAAMpE,EAAS8B,KAAKqC,eAAiB,UAAY,UAAYrC,KAAKqC,aAGlE,MAAME,EAAe,CACnBhB,QAAS,CACP,kBAAmB,iCAAiCrD,aACpD,wBAAyB,iCAAiCA,WAC1D,yBAA0B,iCAAiCA,YAC3D,sBAAuB,cACvB,oBAAqB,iCAEvBuD,QAAS,CACP,kBAAmB,iDACnB,wBAAyB,+CACzB,yBAA0B,gDAC1B,sBAAuB,6BAA6BzB,KAAKqC,gBACzD,oBAAqB,2BAA2BrC,KAAKqC,iBAEvDb,MAAO,CACL,kBAAmB,cACnB,wBAAyB,+CACzB,yBAA0B,gDAC1B,sBAAuB,cACvB,oBAAqB,2BAA2BxB,KAAKqC,iBAEvDpE,KAAM,CACJ,kBAAmB,cACnB,wBAAyB,+CACzB,yBAA0B,gDAC1B,sBAAuB,cACvB,oBAAqB,2BAA2BC,OAGpD,MAAMsE,EAAwBD,EAAavC,KAAK3B,MAKhD,MAAMoE,EAAuB,CAC3B,yBAA0B,uCAAuCD,EAAsB,wBACvF,2BAA4B,yCAAyCA,EAAsB,0BAC3F,uBAAwB,qCAAqCA,EAAsB,sBACnF,6BAA8B,2CAA2CA,EAAsB,4BAC/F,8BAA+B,4CAA4CA,EAAsB,8BAKnG,OACKE,OAAAC,OAAAD,OAAAC,OAAA,GAAAH,GACAC,E,CAsDP,MAAAG,GACE,MAAMzE,KAAEA,EAAIyD,SAAEA,GAAa5B,KAAKoC,WAEhC,OACES,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,UAAAE,IAAA,2CACE3C,KAAMJ,KAAKI,KACXE,SAAUN,KAAKM,UAAYN,KAAKK,QAAO,aAC3BL,KAAKgD,MAAK,gBACPhD,KAAKiD,SAAQ,gBACbjD,KAAKkD,SAAQ,gBACblD,KAAKM,SACpB6C,QAASnD,KAAKQ,YACd4C,QAASpD,KAAKY,YACdyC,OAAQrD,KAAKc,WACbwC,MAAOtD,KAAKsC,aACZiB,MAAOvD,KAAKgB,YAAY,CACtBf,KAAMD,KAAKC,KACX5B,KAAM2B,KAAK3B,KACX8B,UAAWH,KAAKG,UAChBG,SAAUN,KAAKM,SACfD,QAASL,KAAKK,QACduB,SAAU5B,KAAK4B,YAGhB5B,KAAKK,SAAWwC,EAAA,QAAAE,IAAA,2CAAMS,KAAK,YAC5BX,EAAA,QAAAE,IAAA,4CACEF,EAAA,QAAAE,IAAA,2CAAMS,KAAK,UAAU5B,IAAa,UAAYzD,GAAQ0E,EAAA,KAAAE,IAAA,2CAAGQ,MAAO,iBAAmBpF,MAErF0E,EAAO,QAAAE,IAAA,4CAAA/C,KAAKkC,YACZW,EAAA,QAAAE,IAAA,4CACEF,EAAM,QAAAE,IAAA,2CAAAS,KAAK,UAAU5B,IAAa,UAAYzD,GAAQ0E,EAAA,KAAAE,IAAA,2CAAGQ,MAAO,iBAAmBpF,O,aCzR/F,MAAMsF,EAAY,6xG,MCSLC,EAAS,MALtB,WAAA5D,CAAAC,G,0KAQ0CC,KAAI2D,KAAY,MAChD3D,KAAIC,KAAe,SACnBD,KAAQ4B,SAAmB,QACA5B,KAASG,UAAY,MAEtBH,KAAQ4D,SAAY,MAO9C5D,KAAW6D,YAAG5C,EAAG,CACvB6C,MAAO,CACLC,SAAU,0EACVC,QAAS,mIACTC,OAAQ,wEACRC,MAAO,gCACPC,YAAa,+JACbC,QAAS,6BAEXjD,SAAU,CACRwC,KAAM,CACJjC,KAAM,CACJqC,SAAU,uBAEZpC,MAAO,CACLoC,SAAU,wBAGdnC,SAAU,CACRyC,KAAM,CACJL,QAAS,yBAEXM,MAAO,CACLN,QAAS,0BAEXO,IAAK,CACHP,QAAS,wBAEXQ,OAAQ,CACNR,QAAS,4BAGb/D,KAAM,CACJmB,MAAO,CACL6C,OAAQ,YACRG,QAAS,OAEX/C,OAAQ,CACN4C,OAAQ,YACRG,QAAS,OAEX9C,MAAO,CACL2C,OAAQ,YACRG,QAAS,QAGbR,SAAU,CACRlC,KAAM,CACJuC,OAAQ,YAIdQ,iBAAkB,CAChB,CACEd,KAAM,KACN/B,SAAU,CAAC,OAAQ,SACnB2B,MAAO,CACLS,QAAS,kBAGb,CACEL,KAAM,KACN/B,SAAU,CAAC,MAAO,UAClB2B,MAAO,CACLS,QAAS,kBAGb,CACEL,KAAM,MACN/B,SAAU,OACV2B,MAAO,CACLS,QAAS,sBAGb,CACEL,KAAM,MACN/B,SAAU,QACV2B,MAAO,CACLS,QAAS,qBAGb,CACEL,KAAM,MACN/B,SAAU,MACV2B,MAAO,CACLS,QAAS,sBAGb,CACEL,KAAM,MACN/B,SAAU,SACV2B,MAAO,CACLS,QAAS,uBA2HlB,CApHC,gBAAAU,CAAiBC,GACf,GAAIA,EAAQ,CACVC,SAASC,KAAKvB,MAAMwB,SAAW,SAC/B9E,KAAK+E,QAAQpE,M,KACR,CACLiE,SAASC,KAAKvB,MAAMwB,SAAW,GAC/B9E,KAAKgF,SAASrE,M,EAKlB,aAAAsE,CAAcxE,GACZ,GAAIA,EAAMsC,MAAQ,UAAY/C,KAAK2D,KAAM,CACvC3D,KAAKkF,M,EAKT,UAAMC,GACJ,MAAM1E,EAAQT,KAAKoF,cAAczE,OACjC,IAAKF,EAAM4E,iBAAkB,CAC3BrF,KAAK2D,KAAO,I,EAKhB,UAAMuB,GACJ,MAAMzE,EAAQT,KAAKsF,eAAe3E,OAClC,IAAKF,EAAM4E,iBAAkB,CAC3BrF,KAAK2D,KAAO,K,EAIhB,oBAAA4B,GACEX,SAASC,KAAKvB,MAAMwB,SAAW,E,CAGzB,eAAAU,GACN,MAAMlC,EAAmC,GAEzC,GAAItD,KAAKG,UAAW,CAClB,GAAIH,KAAK4B,WAAa,QAAU5B,KAAK4B,WAAa,QAAS,CACzD0B,EAAMmC,MAAQ,O,KACT,CACLnC,EAAMoC,OAAS,O,CAEjB,OAAOpC,C,CAGT,GAAItD,KAAK4B,WAAa,QAAU5B,KAAK4B,WAAa,QAAS,CACzD,OAAQ5B,KAAKC,MACX,IAAK,QACHqD,EAAMmC,MAAQ,QACd,MACF,IAAK,SACHnC,EAAMmC,MAAQ,QACd,MACF,IAAK,QACHnC,EAAMmC,MAAQ,SACd,M,KAEC,CACL,OAAQzF,KAAKC,MACX,IAAK,QACHqD,EAAMoC,OAAS,OACf,MACF,IAAK,SACHpC,EAAMoC,OAAS,OACf,MACF,IAAK,QACHpC,EAAMoC,OAAS,OACf,M,CAIN,OAAOpC,C,CAGT,MAAAV,GACE,MAAMmB,SAAEA,EAAQC,QAAEA,EAAOC,OAAEA,EAAMC,MAAEA,EAAKC,YAAEA,EAAWC,QAAEA,GAAYpE,KAAK6D,YAAY,CAClFF,KAAM3D,KAAK2D,KACX/B,SAAU5B,KAAK4B,SACf3B,KAAMD,KAAKC,KACX2D,SAAU5D,KAAK4D,WAGjB,OACEf,EAAA,OAAAE,IAAA,2CAAK4C,KAAK,QACR9C,EAAA,OAAAE,IAAA,2CAAK4C,KAAK,WAAWpC,MAAOQ,IAAYZ,QAAS,IAAMnD,KAAKkF,SAC5DrC,EAAA,OAAAE,IAAA,2CACE4C,KAAK,UACLpC,MAAOS,IACPV,MAAOtD,KAAKwF,kBACZI,KAAK,SAAQ,aACF,OACE,eAAC5F,KAAK2D,KAAO,OAAS,QACvB,aAAA3D,KAAK6F,YAEjBhD,EAAA,OAAAE,IAAA,2CAAK4C,KAAK,SAASpC,MAAOU,KACxBpB,EAAA,MAAAE,IAAA,2CAAI4C,KAAK,QAAQpC,MAAOW,KACtBrB,EAAM,QAAAE,IAAA,2CAAAS,KAAK,UAAUxD,KAAK6F,aAE5BhD,EAAA,UAAAE,IAAA,2CAAQ4C,KAAK,eAAepC,MAAOY,IAAehB,QAAS,IAAMnD,KAAKkF,OAAM,aAAa,SACvFrC,EAAA,YAAAE,IAAA,2CAAUS,KAAK,wBAGnBX,EAAA,OAAAE,IAAA,2CAAK4C,KAAK,UAAUpC,MAAOa,KACzBvB,EAAA,QAAAE,IAAA,8CAEFF,EAAK,OAAAE,IAAA,2CAAA4C,KAAK,UACR9C,EAAM,QAAAE,IAAA,2CAAAS,KAAK,a,+FCzOvB,MAAMsC,EAAc,o0B,MCQPC,EAAQ,MALrB,WAAAjG,CAAAC,G,+DAUWC,KAAOgG,QAAY,MAEnBhG,KAAaiG,cAAiC,GAoC/CjG,KAAakG,cAAGjF,EAAG,CACzBC,KAAM,0IAGAlB,KAAgBmG,iBAAG,KACzBnG,KAAKiG,cAAgBG,MAAMC,KAAKrG,KAAKsG,KAAKC,iBAAiB,sBAE3D,GAAIvG,KAAKiG,cAAcO,SAAW,EAAG,CACnCC,QAAQC,KAAK,gD,EAoBlB,CApDC,gBAAAC,GACE,MAAMC,EAAS5G,KAAKsG,KAAKO,WAAWC,cAAc,cAClD,GAAIF,EAAQ,CACV5G,KAAK+G,UAAYH,EACjB5G,KAAKgG,QAAU,I,EAKnB,wBAAAgB,CAAyBvG,G,MACvB,MAAMwG,QAAEA,EAAOC,SAAEA,GAAazG,IAAK,MAALA,SAAK,SAALA,EAAO0G,QAErCC,EAAApH,KAAKiG,iBAAa,MAAAmB,SAAA,SAAAA,EAAEC,SAAQC,IAC1B,GAAIA,GAAQL,EAAS,CACnBK,EAAKJ,SAAW,K,KAIpBlH,KAAKuH,kBAAkB5G,KAAK,CAC1BsG,QAASA,EACTC,Y,CAgBJ,MAAAtE,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAY,cAAAE,IAAA,2CAAA1E,KAAK,WACfwE,EAAM,QAAAE,IAAA,2CAAA4C,KAAK,QAAQ3F,KAAK/B,OAEzB+B,KAAKgG,SACJnD,EAAA,cAAAE,IAAA,2CAAYyE,cAAexH,KAAK+G,WAC9BlE,EAAK,OAAAE,IAAA,2CAAA4C,KAAK,qBAAqBpC,MAAOvD,KAAKkG,iBACzCrD,EAAM,QAAAE,IAAA,2CAAA0E,aAAczH,KAAKmG,qB,uCCxEvC,MAAMuB,EAAkB,+6C,MCQXC,EAAY,MALzB,WAAA7H,CAAAC,G,uEAU2BC,KAAQkH,SAAY,MACpBlH,KAAK4H,MAAY,MACjB5H,KAAQM,SAAY,MAkBrCN,KAAiB6H,kBAAG5G,EAC1B,CACEC,KAAM,8GACNC,SAAU,CACR+F,SAAU,CACRxF,KAAM,wGACNC,MAAO,wDAETiG,MAAO,CACLlG,KAAM,wHACNC,MAAO,IAETrB,SAAU,CACRoB,KAAM,GACNC,MAAO,KAGXK,gBAAiB,CACfkF,SAAU,MACVU,MAAO,MACPtH,SAAU,QAGd,CACE2B,QAAS,OA0Bd,CA1DS,WAAAzB,GACNR,KAAKkH,SAAW,KAChBlH,KAAK8H,sBAAsBnH,KAAK,CAC9BsG,QAASjH,KAAKsG,KACdY,SAAUlH,KAAKkH,U,CAgCnB,MAAAtE,G,MACE,OACEC,EACgB,OAAAE,IAAA,0DAAA/C,KAAKkH,SACnB3D,MAAOvD,KAAK6H,kBAAkB,CAC5BX,SAAUlH,KAAKkH,SACfU,MAAO5H,KAAK4H,QAEdzE,QAAS,IAAMnD,KAAKQ,eAEpBqC,EAAA,QAAAE,IAAA,2CAAMS,KAAK,gBAAgBxD,KAAK7B,MAAQ0E,EAAqB,YAAAE,IAAA,uDAAA/C,KAAK7B,QAClE0E,EAAK,OAAAE,IAAA,2CAAAQ,MAAM,oCACTV,EAAA,QAAAE,IAAA,4CAAO/C,KAAK/B,OAEd4E,EAAM,QAAAE,IAAA,2CAAAS,KAAK,kBACR4D,EAAApH,KAAK+H,cAAY,MAAAX,SAAA,SAAAA,EAAAY,KAAI7J,GACpB0E,EAAA,wBAAqB1E,O,uCCvE1B,MAAM8J,EAAmB,CAAChB,EAAsBiB,K,MACrD,MAAMC,GAAOf,EAAAH,EAAQJ,cAAY,MAAAO,SAAA,SAAAA,EAAAN,cAAc,cAAcoB,OAC7D,IAAKC,EAAM,OAAO,MAElB,MAAMC,EAAgBD,EAAKC,gBAC3B,OAAOA,EAAc5B,OAAS,CAAC,ECXjC,MAAM6B,EAAW,6oP,MCaJC,EAAQ,MALrB,WAAAxI,CAAAC,G,gOASWC,KAASuI,UAAG,MAEZvI,KAAOwI,QAAG,KACVxI,KAAcyI,eAAgB,UAE9BzI,KAAiB0I,kBAAG,MAI7B1I,KAAK2I,MAAW,GAYhB3I,KAAA4I,IAAeC,EAAW,SAI1B7I,KAAIC,KAAc,SAIlBD,KAAM9B,OAAgB,UAItB8B,KAASG,UAAG,MAIZH,KAAII,KAAc,OAIlBJ,KAAQM,SAAG,MAIXN,KAAQ8I,SAAG,MAIX9I,KAAQ+I,SAAG,MA8DX/I,KAAmBgJ,oBAAG,KA0JdhJ,KAAAiJ,QAAWxI,IACjB,MAAMyI,EAAQzI,EAAM0I,OACpBnJ,KAAK2I,MAAQO,EAAMP,MACnB3I,KAAKoJ,SAASzI,KAAKF,GACnBT,KAAKqJ,eAAe,EAGdrJ,KAAAsJ,SAAY7I,IAClBT,KAAKuJ,UAAU5I,KAAKF,EAAM,EAGpBT,KAAAoD,QAAW3C,IACjBT,KAAKuI,UAAY,KACjBvI,KAAKa,SAASF,KAAKF,EAAM,EAGnBT,KAAAqD,OAAU5C,IAChBT,KAAKuI,UAAY,MACjBvI,KAAKe,QAAQJ,KAAKF,GAClBT,KAAKqJ,eAAe,EAGdrJ,KAAAwJ,UAAa/I,IACnBT,KAAKyJ,WAAW9I,KAAKF,EAAM,EAGrBT,KAAA0J,QAAWjJ,IACjBT,KAAK2J,SAAShJ,KAAKF,EAAM,EAOnBT,KAAU4J,WAAG3I,EACnB,CACE6C,MAAO,CACL5C,KAAM,CACJ,iCACA,8CACA,qCACA,8BACA,oCACA,iCACA,QAEF2I,WAAY,CACV,QACA,gBACA,oCACA,gCACA,gHACA,oCACA,OACA,wHAGJ1I,SAAU,CACRlB,KAAM,CACJmB,MAAO,CACLF,KAAM,GACN2I,WAAY,qBAEdxI,OAAQ,CACNH,KAAM,GACN2I,WAAY,8BAEdvI,MAAO,CACLJ,KAAM,GACN2I,WAAY,qBAGhB3L,OAAQ,CACN4L,QAAS,CACP5I,KAAM,CAAC,yCAA0C,+CAAgD,wDAEnG0G,MAAO,CACL1G,KAAM,CAAC,uCAAwC,6CAA8C,sDAE/F6I,QAAS,CACP7I,KAAM,CAAC,yCAA0C,+CAAgD,wDAEnG8I,QAAS,CACP9I,KAAM,CAAC,yCAA0C,+CAAgD,wDAEnG+I,KAAM,CACJ/I,KAAM,CAAC,sCAAuC,4CAA6C,sDAG/Ff,UAAW,CACTuB,KAAM,qBAERpB,SAAU,CACRoB,KAAM,8BACNC,MAAO,IAETuI,QAAS,CACPxI,KAAM,CACJR,KAAM,MAIZc,gBAAiB,CACf/B,KAAM,SACN/B,OAAQ,UACRiC,UAAW,MACXG,SAAU,MACV4J,QAAS,QAGb,CACEjI,QAAS,QASLjC,KAAwBmK,yBAAG,KACjCnK,KAAK0I,mBAAqB1I,KAAK0I,kBAC/B1I,KAAKoK,SAAShK,KAAOJ,KAAK0I,kBAAoB,OAAS,UAAU,EAG3D1I,KAAoBqK,qBAAG,K,MAC7B,GAAIrK,KAAKI,OAAS,YAAcJ,KAAKM,UAAYN,KAAK8I,YAAY1B,EAAApH,KAAK2I,SAAK,MAAAvB,SAAA,SAAAA,EAAEZ,UAAW,EAAG,OAAO,KACnG,OACE3D,EAAA,UAAQU,MAAM,8DAA8DJ,QAASnD,KAAKmK,yBAA0B/J,KAAK,UACvHyC,EAAU,YAAAW,KAAMxD,KAAK0I,kBAAoB,0BAA4B,oBAAqBzI,KAAMD,KAAKsK,WAC9F,EAILtK,KAAAsK,SAAW,CACjBlJ,MAAO,GACPC,OAAQ,GACRC,MAAO,IACPtB,KAAKC,KAmHR,CAtWC,iBAAAsK,CAAkBC,GAChB,GAAIxK,KAAKoK,SAAU,CACjBpK,KAAKoK,SAASzB,MAAQ6B,C,EAK1B,WAAAC,CAAYD,GACVxK,KAAKyI,eAAiB+B,C,CAIxB,iBAAAE,CAAkBF,GAChBxK,KAAK2K,qBAAuBH,C,CAI9B,cAAMI,G,OACJxD,EAAApH,KAAKoK,YAAU,MAAAhD,SAAA,SAAAA,EAAAyD,O,CAIjB,aAAMC,G,OACJ1D,EAAApH,KAAKoK,YAAU,MAAAhD,SAAA,SAAAA,EAAA2D,M,CAIjB,YAAMC,G,OACJ5D,EAAApH,KAAKoK,YAAU,MAAAhD,SAAA,SAAAA,EAAA4D,Q,CAKjB,eAAMC,CAAUC,EAAgBC,GAE9BC,EAAsBF,EAAQC,GAG9B,IAAKnL,KAAKwI,QAAS,CACjBxI,KAAKqJ,e,EAIT,iBAAAgC,GAEED,EAAsB,KAAME,GAC5BtL,KAAKyI,eAAiBzI,KAAK9B,OAC3B8B,KAAK2K,qBAAuB3K,KAAKuL,Y,CAG3B,aAAAlC,GACN,IAAKrJ,KAAKoK,SAAU,OAGpBpK,KAAKwI,QAAU,KACfxI,KAAKwL,kBAAoB,GAEzB,MAAM7C,EAAQ3I,KAAKoK,SAASzB,MAG5B,GAAI3I,KAAK+I,WAAaJ,EAAO,CAC3B3I,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,YAC9CzL,KAAKyI,eAAiB,QACtBzI,KAAK2K,qBAAuB3K,KAAKwL,kBACjC,M,MAIG,GAAIxL,KAAK0L,WAAa/C,EAAMnC,OAASxG,KAAK0L,UAAW,CACxD1L,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,YAAa,CAAEE,IAAK3L,KAAK0L,W,MAGpE,GAAI1L,KAAK4L,WAAajD,EAAMnC,OAASxG,KAAK4L,UAAW,CACxD5L,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,YAAa,CAAEI,IAAK7L,KAAK4L,W,MAGpE,GAAI5L,KAAK8L,UAAY,IAAIC,OAAO/L,KAAK8L,SAASE,KAAKrD,GAAQ,CAC9D3I,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,U,MAG3C,GAAIzL,KAAKI,OAAS,SAAWuI,IAAU,6BAA6BqD,KAAKrD,GAAQ,CACpF3I,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,Q,MAG3C,GAAIzL,KAAKI,OAAS,UAAYuI,EAAO,CACxC,MAAMsD,EAAWC,WAAWvD,GAC5B,GAAI3I,KAAK2L,MAAQQ,WAAaF,EAAWjM,KAAK2L,IAAK,CACjD3L,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,MAAO,CAAEE,IAAK3L,KAAK2L,K,MAC5D,GAAI3L,KAAK6L,MAAQM,WAAaF,EAAWjM,KAAK6L,IAAK,CACxD7L,KAAKwI,QAAU,MACfxI,KAAKwL,kBAAoBC,EAAqB,MAAO,CAAEI,IAAK7L,KAAK6L,K,EAKrE7L,KAAKyI,eAAiBzI,KAAKwI,QAAU,UAAY,QACjDxI,KAAK2K,qBAAuB3K,KAAKwL,iB,CAiC3B,cAAAY,CAAelE,GACrB,OAAOD,EAAiBjI,KAAKqM,GAAInE,E,CAoF3B,qBAAAoE,GACN,M,CAwBF,MAAA1J,GACE,MAAM2J,EAAUvM,KAAK4I,IAAM,UAAY5I,KAAKwD,KAE5C,MAAMtC,KAAEA,EAAI2I,WAAEA,GAAe7J,KAAK4J,WAAW,CAC3C3J,KAAMD,KAAKC,KACX/B,OAAQ8B,KAAKyI,eACbtI,UAAWH,KAAKG,UAChBG,SAAUN,KAAKM,SACf4J,QAASlK,KAAKuI,YAGhB,OACE1F,EAAA,OAAAE,IAAA,2CAAKQ,MAAM,kBACRvD,KAAKgD,OACJH,EAAA,SAAAE,IAAA,2CACEQ,MAAOiJ,EACL,0BACA,CACE,oBAAqBxM,KAAKM,SAC1B,sBAAuBN,KAAKM,UAE9B,CACE,cAAeN,KAAKC,OAAS,QAC7B,cAAeD,KAAKC,OAAS,SAC7B,cAAeD,KAAKC,OAAS,UAGjCwM,QAASF,GAET1J,EAAA,QAAAE,IAAA,2CAAMS,KAAK,SAASxD,KAAKgD,OACxBhD,KAAK+I,UAAYlG,EAAA,QAAAE,IAAA,kDAItBF,EAAK,OAAAE,IAAA,2CAAAQ,MAAOrC,MACRlB,KAAKoM,eAAe,WAAapM,KAAK0M,YAAc1M,KAAKsM,0BACzDzJ,EAAA,OAAAE,IAAA,2CAAKQ,MAAM,iCACPvD,KAAK0M,YAAc1M,KAAKsM,0BACxBzJ,EAAA,YAAAE,IAAA,2CAAUQ,MAAM,cAAyB,YAAAvD,KAAK0M,YAAc1M,KAAKsM,wBAAyBrM,KAAMD,KAAKsK,WAEvGzH,EAAA,QAAAE,IAAA,2CAAMS,KAAK,YAGfX,EAAA,SAAAE,IAAA,2CACE4J,IAAKN,GAAOrM,KAAKoK,SAAWiC,EAC5BO,GAAIL,EACJhJ,MAAOsG,IACPzJ,KAAMJ,KAAKI,KACXoD,KAAMxD,KAAKwD,KACXlD,SAAUN,KAAKM,SACfwI,SAAU9I,KAAK8I,SACfC,SAAU/I,KAAK+I,SACf8D,YAAa7M,KAAK6M,YAClBC,aAAc9M,KAAK8M,aACnBC,UAAW/M,KAAK0L,UAChBsB,UAAWhN,KAAK4L,UAChBD,IAAK3L,KAAK2L,IACVE,IAAK7L,KAAK6L,IACVoB,KAAMjN,KAAKiN,KACXnB,QAAS9L,KAAK8L,QACA,eAAA9L,KAAK9B,SAAW,QAAO,gBACtB8B,KAAK+I,SACH,kBAAA/I,KAAKkN,WAAU,mBACdlN,KAAKmN,YACvBxE,MAAO3I,KAAK2I,MACZM,QAASjJ,KAAKiJ,QACdK,SAAUtJ,KAAKsJ,SACflG,QAASpD,KAAKoD,QACdC,OAAQrD,KAAKqD,OACbmG,UAAWxJ,KAAKwJ,UAChBE,QAAS1J,KAAK0J,WAEd1J,KAAKoM,eAAe,WAAapM,KAAKoN,aACtCvK,EAAK,OAAAE,IAAA,2CAAAQ,MAAM,gCACTV,EAAM,QAAAE,IAAA,2CAAAS,KAAK,WACVxD,KAAKoN,YAAcvK,EAAA,YAAAE,IAAA,2CAAUQ,MAAM,cAAyB,YAAAvD,KAAKoN,WAAYnN,KAAMD,KAAKsK,YAW5FtK,KAAKqK,yBAENrK,KAAKqN,aAAerN,KAAK2K,sBAAwB3K,KAAKwL,oBACtD3I,EACE,OAAAE,IAAA,2CAAAQ,MAAOiJ,EACL,uCACA,CACE,sCAAuCxM,KAAKM,UAAYN,KAAKyI,iBAAmB,UAChF,oCAAqCzI,KAAKM,WAAaN,KAAKyI,iBAAmB,UAAYzI,KAAKwI,SAChG,sCAAuCxI,KAAKM,UAAYN,KAAKyI,iBAAmB,UAChF,sCAAuCzI,KAAKM,UAAYN,KAAKyI,iBAAmB,UAChF,mCAAoCzI,KAAKM,UAAYN,KAAKyI,iBAAmB,OAC7E,sCAAuCzI,KAAKM,UAE9C,CACE,cAAeN,KAAKC,OAAS,QAC7B,cAAeD,KAAKC,OAAS,SAC7B,cAAeD,KAAKC,OAAS,YAI/BD,KAAKwI,QAAUxI,KAAKwL,kBAAoBxL,KAAKyI,iBAAmB,QAAUzI,KAAK2K,qBAAuB3K,KAAKqN,a,yJCjhBzH,MAAMC,EAAY,yyF,MCULC,EAAS,MALtB,WAAAzN,CAAAC,G,oJAaUC,KAAOwN,QAAgB,QACvBxN,KAASyN,UAAc,eAGvBzN,KAAS0N,UAAW,EACpB1N,KAAS2N,UAAW,EAGpB3N,KAAM4N,OAAW,EACjB5N,KAAK6N,MAAY,MACjB7N,KAAQM,SAAY,MAGpBN,KAAM8N,OAAW,IACjB9N,KAAY+N,aAAY,MACxB/N,KAAagO,cAAY,MAGxBhO,KAASiO,UAAY,MACrBjO,KAAOgG,QAAY,MAiKpBhG,KAAgBkO,iBAAG,KACzBlO,KAAKmO,gBACL,GAAInO,KAAK0N,UAAY,EAAG,CACtB1N,KAAKoO,YAAcC,YAAW,IAAMrO,KAAKmF,QAAQnF,KAAK0N,U,KACjD,CACL1N,KAAKmF,M,GAIDnF,KAAgBsO,iBAAG,KACzBtO,KAAKmO,gBACL,GAAInO,KAAK2N,UAAY,EAAG,CACtB3N,KAAKuO,YAAcF,YAAW,IAAMrO,KAAKkF,QAAQlF,KAAK2N,U,KACjD,CACL3N,KAAKkF,M,GAIDlF,KAAwBwO,yBAAG,KACjCxO,KAAKmO,eAAe,EAGdnO,KAAwByO,yBAAG,KACjCzO,KAAKmO,gBACL,GAAInO,KAAK2N,UAAY,EAAG,CACtB3N,KAAKuO,YAAcF,YAAW,IAAMrO,KAAKkF,QAAQlF,KAAK2N,U,KACjD,CACL3N,KAAKkF,M,GAIDlF,KAAAQ,YAAekO,IACrBA,EAAEC,kBACF3O,KAAK4O,QAAQ,EAGP5O,KAAWY,YAAG,KACpBZ,KAAKmF,MAAM,EAGLnF,KAAUc,WAAG,KACnBd,KAAKkF,MAAM,CA4Kd,CAhWC,WAAA2J,GACE7O,KAAK8O,mBACL9O,KAAK+O,e,CAIP,kBAAAC,CAAmBxE,GACjB,GAAIA,EAAU,CACZxK,KAAKiP,iBACLjP,KAAKkP,SAASvO,M,KACT,CACLX,KAAKmP,UAAUxO,M,EAInB,sBAAMgG,SAEE,IAAIyI,SAAQC,GAAWC,sBAAsBD,KAEnDrP,KAAKuP,WAAavP,KAAKsG,KAAKQ,cAAc,qBAE1C,GAAI9G,KAAKuP,WAAY,CACnBvP,KAAKgG,QAAU,KACfhG,KAAK+O,gBACL/O,KAAKwP,wBACL/I,QAAQgJ,IAAI,wC,KACP,CACLhJ,QAAQmB,MAAM,6C,EAIlB,oBAAArC,G,QACEvF,KAAK8O,mBACL9O,KAAKmO,iBACL/G,EAAApH,KAAK0P,WAAO,MAAAtI,SAAA,SAAAA,EAAAuI,KAAA3P,OACZ4P,EAAA5P,KAAK6P,kBAAgB,MAAAD,SAAA,SAAAA,EAAAE,aAGrB,GAAI9P,KAAK+N,cAAgB/N,KAAKuP,YAAcvP,KAAK+P,eAAgB,CAC/D/P,KAAK+P,eAAeC,YAAYhQ,KAAKuP,W,EAIjC,aAAAR,GACN,IAAK/O,KAAKgG,QAAS,OAGnBhG,KAAKiQ,SACHjQ,KAAKwH,gBAAkBxH,KAAKkQ,SAAWtL,SAASuL,eAAenQ,KAAKkQ,UAAY,OAAUlQ,KAAKsG,KAAK8J,wBAA0CpQ,KAAKsG,KAAK+J,cAE1J,IAAKrQ,KAAKiQ,SAAU,CAClBxJ,QAAQC,KAAK,uCACb,M,CAIF1G,KAAKsQ,sBAGL,GAAItQ,KAAKiQ,UAAYjQ,KAAKuP,WAAY,CACpCvP,KAAK0P,QAAUa,EAAWvQ,KAAKiQ,SAAUjQ,KAAKuP,YAAY,KACxD,GAAIvP,KAAKiO,UAAW,CAClBjO,KAAKiP,gB,KAMXjP,KAAK6P,eAAiB,IAAIW,gBAAe,KACvC,GAAIxQ,KAAKiO,UAAW,CAClBjO,KAAKiP,gB,KAGTjP,KAAK6P,eAAeY,QAAQzQ,KAAKuP,W,CAG3B,gBAAAT,G,QACN,GAAI9O,KAAKiQ,SAAU,CACjBjQ,KAAK0Q,sB,EAEPtJ,EAAApH,KAAK0P,WAAO,MAAAtI,SAAA,SAAAA,EAAAuI,KAAA3P,OACZ4P,EAAA5P,KAAK6P,kBAAgB,MAAAD,SAAA,SAAAA,EAAAE,Y,CAGf,mBAAAQ,G,QACN,IAAKtQ,KAAKiQ,UAAYjQ,KAAKM,SAAU,OAErC,OAAQN,KAAKwN,SACX,IAAK,QACHxN,KAAKiQ,SAASU,iBAAiB,aAAc3Q,KAAKkO,kBAClDlO,KAAKiQ,SAASU,iBAAiB,aAAc3Q,KAAKsO,mBAClDlH,EAAApH,KAAKuP,cAAU,MAAAnI,SAAA,SAAAA,EAAEuJ,iBAAiB,aAAc3Q,KAAKwO,2BACrDoB,EAAA5P,KAAKuP,cAAU,MAAAK,SAAA,SAAAA,EAAEe,iBAAiB,aAAc3Q,KAAKyO,0BACrD,MAEF,IAAK,QACHzO,KAAKiQ,SAASU,iBAAiB,QAAS3Q,KAAKQ,aAC7CR,KAAK4Q,oBACL,MAEF,IAAK,QACH5Q,KAAKiQ,SAASU,iBAAiB,QAAS3Q,KAAKY,aAC7CZ,KAAKiQ,SAASU,iBAAiB,OAAQ3Q,KAAKc,YAC5C,M,CAIE,oBAAA4P,G,QACN,IAAK1Q,KAAKiQ,SAAU,OAEpBjQ,KAAKiQ,SAASY,oBAAoB,aAAc7Q,KAAKkO,kBACrDlO,KAAKiQ,SAASY,oBAAoB,aAAc7Q,KAAKsO,kBACrDtO,KAAKiQ,SAASY,oBAAoB,QAAS7Q,KAAKQ,aAChDR,KAAKiQ,SAASY,oBAAoB,QAAS7Q,KAAKY,aAChDZ,KAAKiQ,SAASY,oBAAoB,OAAQ7Q,KAAKc,aAE/CsG,EAAApH,KAAKuP,cAAU,MAAAnI,SAAA,SAAAA,EAAEyJ,oBAAoB,aAAc7Q,KAAKwO,2BACxDoB,EAAA5P,KAAKuP,cAAU,MAAAK,SAAA,SAAAA,EAAEiB,oBAAoB,aAAc7Q,KAAKyO,0BAExDzO,KAAK8Q,oB,CAGC,iBAAAF,GACN5Q,KAAK+Q,oBAAuBrC,I,QAC1B,MAAMvF,EAASuF,EAAEvF,OACjB,MAAK/B,EAAApH,KAAKuP,cAAY,MAAAnI,SAAA,SAAAA,EAAA4J,SAAS7H,QAAYyG,EAAA5P,KAAKiQ,YAAQ,MAAAL,SAAA,SAAAA,EAAEoB,SAAS7H,MAAYnJ,KAAKsG,KAAK0K,SAAS7H,GAAS,CACzGnJ,KAAKkF,M,GAGTN,SAAS+L,iBAAiB,QAAS3Q,KAAK+Q,oBAAqB,K,CAGvD,kBAAAD,GACN,GAAI9Q,KAAK+Q,oBAAqB,CAC5BnM,SAASiM,oBAAoB,QAAS7Q,KAAK+Q,oBAAqB,MAChE/Q,KAAK+Q,oBAAsB5E,S,EAgDvB,aAAAgC,GACN,GAAInO,KAAKoO,YAAa,CACpB6C,aAAajR,KAAKoO,aAClBpO,KAAKoO,YAAcjC,S,CAErB,GAAInM,KAAKuO,YAAa,CACpB0C,aAAajR,KAAKuO,aAClBvO,KAAKuO,YAAcpC,S,EAIf,oBAAM8C,GACZ,IAAKjP,KAAKiQ,WAAajQ,KAAKuP,aAAevP,KAAKiO,UAAW,OAM3D,MAAMiD,EAAa,CACjBtD,EAAO5N,KAAK4N,QAOZuD,EAAK,CACHC,mBAAoB,CAAC,MAAO,SAAU,OAAQ,QAAS,YAAa,UAAW,eAAgB,aAAc,aAAc,WAAY,cAAe,eAExJC,EAAM,CACJC,QAAS,KAIb,MAAMC,EAAEA,EAACC,EAAEA,EAAC/D,UAAEA,SAAoBgE,EAAgBzR,KAAKiQ,SAAUjQ,KAAKuP,WAAY,CAChF9B,UAAWzN,KAAKyN,UAChByD,aACAQ,SAAU,UAGZhP,OAAOC,OAAO3C,KAAKuP,WAAWjM,MAAO,CACnCe,KAAM,GAAGkN,MACThN,IAAK,GAAGiN,MACR1D,OAAQ9N,KAAK8N,OAAO6D,aAItB,GAAI3R,KAAK6N,MAAO,CACd7N,KAAK4R,YAAYnE,E,EAIb,WAAAmE,CAAYnE,G,MAClB,MAAMI,GAAQzG,EAAApH,KAAKuP,cAAU,MAAAnI,SAAA,SAAAA,EAAEN,cAAc,mBAC7C,IAAK+G,EAAO,OAGZA,EAAMgE,UAAY,iBAGlB,MAAMC,EAAOrE,EAAUsE,MAAM,KAAK,GAClClE,EAAMmE,UAAUxT,IAAI,SAASsT,I,CAI/B,UAAM3M,GACJ,GAAInF,KAAKM,UAAYN,KAAKiO,UAAW,OAErCjO,KAAKiS,QAAQtR,OAGb,GAAIX,KAAK+N,cAAgB/N,KAAKuP,WAAY,CACxCvP,KAAK+P,eAAiB/P,KAAKuP,WAAW2C,WACtClS,KAAKmS,oBAAsBnS,KAAKuP,WAAW6C,YAC3CxN,SAASC,KAAKmL,YAAYhQ,KAAKuP,W,CAGjCvP,KAAKiO,UAAY,WAGX,IAAImB,SAAQC,GAAWC,sBAAsBD,WAC7CrP,KAAKiP,gB,CAIb,UAAM/J,GACJ,IAAKlF,KAAKiO,UAAW,OAErBjO,KAAKqS,QAAQ1R,OACbX,KAAKiO,UAAY,MAGjB,GAAIjO,KAAK+N,cAAgB/N,KAAKuP,YAAcvP,KAAK+P,eAAgB,CAC/D,GAAI/P,KAAKmS,oBAAqB,CAC5BnS,KAAK+P,eAAeuC,aAAatS,KAAKuP,WAAYvP,KAAKmS,oB,KAClD,CACLnS,KAAK+P,eAAeC,YAAYhQ,KAAKuP,W,CAEvCvP,KAAK+P,eAAiB5D,UACtBnM,KAAKmS,oBAAsBhG,S,CAG7B,GAAInM,KAAKgO,eAAiBhO,KAAKuP,YAAcvP,KAAKuP,WAAW2C,WAAY,CACvElS,KAAKuP,WAAW2C,WAAWK,YAAYvS,KAAKuP,W,EAKhD,YAAMX,GACJ,GAAI5O,KAAKiO,UAAW,OACZjO,KAAKkF,M,KACN,OACClF,KAAKmF,M,EAKf,uBAAMqN,SACExS,KAAKiP,gB,CAGL,qBAAAO,GACN,IAAKxP,KAAKuP,WAAY,OAGtBvP,KAAK6P,eAAiB,IAAIW,gBAAe,KACvC,GAAIxQ,KAAKiO,UAAW,CAClBjO,KAAKiP,gB,KAITjP,KAAK6P,eAAeY,QAAQzQ,KAAKuP,W,CAGnC,MAAA3M,GACE,MAAM6P,EAAkB,CACtB,mBAAoB,KACpB,mBAAoBzS,KAAKiO,UACzB,mBAAoBjO,KAAKiO,UACzB,sBAAuBjO,KAAK6N,MAC5B,2BAA4B7N,KAAKgO,eAGnC,OACEnL,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,OAAAE,IAAA,2CACEQ,MAAOkP,EACPnP,MAAO,CACL1B,SAAU,QACV2C,IAAK,MACLF,KAAM,MACNyJ,OAAQ9N,KAAK8N,OAAO6D,WACpBe,QAAS1S,KAAKiO,UAAY,QAAU,OACpC0E,WAAY3S,KAAKiO,UAAY,UAAY,SACzC2E,QAAS5S,KAAKiO,UAAY,IAAM,IAChC4E,cAAe7S,KAAKiO,UAAY,OAAS,SAG1CjO,KAAK6N,OAAShL,EAAA,OAAAE,IAAA,2CAAKQ,MAAM,mBAC1BV,EAAK,OAAAE,IAAA,2CAAAQ,MAAM,oBACTV,EAAA,QAAAE,IAAA,+CAGJF,EAAA,OAAAE,IAAA,2CAAKO,MAAO,CAAEoP,QAAS,SACrB7P,EAAA,QAAAE,IAAA,2CAAMS,KAAK,c,6JCtZrB,MAAMsP,EAAc,msCCGpB,MAAMC,EAAS,CACbC,KAAM,IACNC,IAAK,IACL5B,MAAO,IACP6B,IAAK,IACLnU,OAAQ,IACRoU,UAAW,IACXC,MAAO,IACPC,OAAQ,K,MAQGC,EAAW,MALxB,WAAAxT,CAAAC,G,UAOUC,KAAIC,KAAiC,QAE5BD,KAAKuT,MAAG,MAAMvH,KAAKwH,OAAOC,UAAUC,UAmCtD,CAjCC,SAAAC,CAAU5Q,GACR,IAAKA,EAAK,CACR,MAAO,E,CAET,GAAI/C,KAAKuT,QAAUxQ,EAAI6Q,SAAS,MAAQ7Q,EAAI6Q,SAAS,MAAO,CAC1D,MAAMC,EAAO9Q,EAAIgP,MAAM,UACvB,OAAO8B,EAAK7L,KAAI8L,GAAKf,EAAOe,IAAMA,IAAGC,KAAK,G,KACrC,CACL,OAAOhR,C,EAIX,MAAAH,GACE,MAAM3C,KAAEA,EAAI+T,OAAEA,GAAWhU,KAEzB,OACE6C,EAAA,OAAAE,IAAA,2CACEQ,MAAO0Q,EACL,wCACA,qDACA,2DACA,qCACA,CACE,cAAehU,IAAS,QACxB,cAAeA,IAAS,SACxB,cAAeA,IAAS,WAI3BD,KAAK2T,UAAUK,G,aCpDjB,MAAME,EAA8C,CACzDxB,QAAS,KACTyB,SAAU,KACVC,SAAU,KACVC,OAAQ,KACRC,OAAQ,KACRC,OAAQ,KACR1P,KAAM,IACN2P,WAAY,IACZC,OAAQ,IACRC,QAAS,IACT1R,MAAO,QACP6J,YAAa,IACb8H,KAAM,IACN1K,KAAM,IACN2K,WAAY,KCjBd,MAAMC,EAAU,+/C,MCUHC,EAAO,MALpB,WAAAhV,CAAAC,G,UAYEC,KAAOmC,QAAgB,OAIvBnC,KAAIC,KAAa,SAIjBD,KAAQ8E,SAAY,MAEH9E,KAAA+U,gBAAkB,CACjCrC,QAAS,+CACTyB,SAAU,8CACVC,SAAU,8CACVC,OAAQ,CACNjT,MAAO,8CACPC,OAAQ,8CACRC,MAAO,+CAETgT,OAAQ,CACNlT,MAAO,+CACPC,OAAQ,+CACRC,MAAO,gDAETiT,OAAQ,CACNnT,MAAO,gDACPC,OAAQ,gDACRC,MAAO,iDAETuD,KAAM,CACJzD,MAAO,8CACPC,OAAQ,8CACRC,MAAO,+CAETkT,WAAY,CACVpT,MAAO,6CACPC,OAAQ,6CACRC,MAAO,8CAETmT,OAAQ,CACNrT,MAAO,6CACPC,OAAQ,6CACRC,MAAO,8CAEToT,QAAS,CACPtT,MAAO,8CACPC,OAAQ,8CACRC,MAAO,+CAETqT,KAAM,CACJvT,MAAO,uDACPC,OAAQ,uDACRC,MAAO,wDAET0B,MAAO,CACL5B,MAAO,2CACPC,OAAQ,2CACRC,MAAO,4CAETuL,YAAa,CACXzL,MAAO,kDACPC,OAAQ,kDACRC,MAAO,mDAET2I,KAAM,CACJ7I,MAAO,8CACPC,OAAQ,8CACRC,MAAO,+CAETsT,WAAY,CACVxT,MAAO,4CACPC,OAAQ,4CACRC,MAAO,8CAIHtB,KAAAgV,aAAe,CAAC7S,EAAsBlC,KAC5C,MAAMgV,EAAiBjV,KAAK+U,gBAAgB5S,GAE5C,UAAW8S,IAAmB,SAAU,CACtC,OAAOA,C,CAGT,OAAOA,EAAehV,EAAK,EAGrBD,KAAAkV,iBAAoBpQ,GACnBA,EAAW,WAAa,EAclC,CAXC,MAAAlC,G,MACE,MAAMuS,EAAMjB,EAAclU,KAAKmC,SAC/B,MAAMiT,EAAepV,KAAKgV,aAAahV,KAAKmC,QAASnC,KAAKC,MAC1D,MAAMoV,EAAgBrV,KAAKkV,kBAAiB9N,EAAApH,KAAK8E,YAAY,MAAAsC,SAAA,EAAAA,EAAA,OAE7D,OACEvE,EAACsS,EAAI,CAAApS,IAAA,2CAAAQ,MAAO0Q,EAAG,mCAAoCmB,EAAcC,GAAgB1P,KAAK,QACpF9C,EAAA,QAAAE,IAAA,4CAAO/C,KAAK/B,M","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,c as i,h as s,H as e,a}from"./p-B84DzIAh.js";import{t as n}from"./p-CEcVC0yX.js";const o=".relative{position:relative}.block{display:block}:host{display:block;position:relative;width:100%}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.bcm-ui-element{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.static{position:static}.flex{display:flex}.contents{display:contents}.w-full{width:100%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.flex-col{flex-direction:column}.shadow{--tw-shadow:var(--bcm-ui-box-shadow-default);--tw-shadow-colored:var(--bcm-ui-box-shadow-default);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}";const h=class{constructor(s){t(this,s);this.bcmTabChange=i(this,"bcmTabChange",1);this.size="medium";this.triggers=[];this.contents=[];this.tabClass=n({base:"tabs-container bcm-ui-element flex flex-col w-full"})}componentWillLoad(){this.activeTab=this.defaultValue}componentDidLoad(){this.refreshElementReferences();this.updateTriggerProperties();this.setupRelations();this.updateInkbar();this.updateContentVisibility()}refreshElementReferences(){this.triggers=Array.from(this.el.querySelectorAll("bcm-tabs-trigger"));this.contents=Array.from(this.el.querySelectorAll("bcm-tabs-content"));this.tabsList=this.el.querySelector("bcm-tabs-list")}setupRelations(){this.triggers.forEach((t=>{t.active=t.value===this.activeTab;const i=this.contents.find((i=>i.value===t.value));if(i){const s=`panel-${t.value}`;i.id=s;t.setAttribute("aria-controls",s);i.setAttribute("aria-labelledby",`trigger-${t.value}`);t.id=`trigger-${t.value}`}}))}updateTriggerProperties(){var t;if(((t=this.triggers)===null||t===void 0?void 0:t.length)>0){this.triggers.forEach((t=>{t.size=this.size}))}}handleSizeChange(){this.updateTriggerProperties()}async disableTab(t){const i=this.triggers.find((i=>i.value===t));if(i){i.disabled=true}}async enableTab(t){const i=this.triggers.find((i=>i.value===t));if(i){i.disabled=false}}async disableAllTabs(){this.triggers.forEach((t=>{t.disabled=true}))}async enableAllTabs(){this.triggers.forEach((t=>{t.disabled=false}))}async getActiveTab(){return this.activeTab}async setActiveTab(t){const i=this.triggers.find((i=>i.value===t));if(i&&!i.disabled){this.previousTab=this.activeTab;this.activeTab=t;this.updateInkbar();this.updateContentVisibility();this.updateTabStatus();this.bcmTabChange.emit({activeTab:this.activeTab,element:i,previousTab:this.previousTab})}}updateTabStatus(){this.triggers.forEach((t=>{const i=t.value===this.activeTab;t.active=i}))}handleResize(){this.updateInkbar()}handleTabSelected(t){this.previousTab=this.activeTab;this.activeTab=t.detail;this.updateTabStatus();this.updateInkbar();this.updateContentVisibility();const i=this.triggers.find((t=>t.value===this.activeTab));if(i){this.bcmTabChange.emit({activeTab:this.activeTab,element:i,previousTab:this.previousTab})}}updateContentVisibility(){this.contents.forEach((t=>{const i=t.value===this.activeTab;t.style.display=i?"block":"none";t.setAttribute("aria-hidden",(!i).toString())}))}updateInkbar(){var t,i,s,e,a;if(!this.tabsList){console.warn("bcm-tabs-list not found");return}const n=this.triggers.length;if(n===0)return;const o=(i=(t=this.tabsList)===null||t===void 0?void 0:t.shadowRoot)===null||i===void 0?void 0:i.querySelector(".inkbar");const h=this.triggers.find((t=>t.value===this.activeTab));if(h&&o){const t=h.getBoundingClientRect();const i=(a=(e=(s=this.tabsList)===null||s===void 0?void 0:s.shadowRoot)===null||e===void 0?void 0:e.querySelector(".tabs-list"))===null||a===void 0?void 0:a.getBoundingClientRect();if(t&&i){const s=t.left-i.left;const e=t.width;o.style.width=`${e}px`;o.style.transform=`translateX(${s}px)`;o.style.opacity="1"}else{console.warn("Group or trigger rect calculation failed");o.style.opacity="0"}}else{if(o)o.style.opacity="0"}}render(){return s(e,{key:"2bc33f644ca746b98c5be1b630471f2d2812a4e3"},s("div",{key:"29c8e9bb573d2944cf2ece084036c6a5582fe6ca",class:this.tabClass()},s("slot",{key:"2c302a219cadc0141dbd00cd489676796a684125",name:"tabs-list"}),s("slot",{key:"66f0612d4294eea35f19eee59742db7c9e973a58"})))}get el(){return a(this)}static get watchers(){return{size:["handleSizeChange"]}}};h.style=o;export{h as bcm_tabs};
|
|
2
|
-
//# sourceMappingURL=p-4766474f.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["bcmTabsCss","BcmTabs","constructor","hostRef","this","size","triggers","contents","tabClass","tv","base","componentWillLoad","activeTab","defaultValue","componentDidLoad","refreshElementReferences","updateTriggerProperties","setupRelations","updateInkbar","updateContentVisibility","Array","from","el","querySelectorAll","tabsList","querySelector","forEach","trigger","active","value","panel","find","content","panelId","id","setAttribute","_a","length","handleSizeChange","disableTab","t","disabled","enableTab","disableAllTabs","enableAllTabs","getActiveTab","setActiveTab","previousTab","updateTabStatus","bcmTabChange","emit","element","isActive","handleResize","handleTabSelected","event","detail","activeElement","isVisible","style","display","toString","console","warn","totalTriggers","inkbar","_b","shadowRoot","activeTrigger","triggerRect","getBoundingClientRect","groupRect","_e","_d","_c","left","width","transform","opacity","render","h","Host","key","class","name"],"sources":["src/components/tabs/bcm-tabs.css?tag=bcm-tabs&encapsulation=shadow","src/components/tabs/tabs.component.tsx"],"sourcesContent":[":host {\n display: block;\n position: relative;\n width: 100%;\n}\n","import { Component, State, Prop, Element, h, Host, Listen, ComponentInterface, Event, EventEmitter, Watch, Method } from '@stencil/core';\nimport { tv } from '@utils/tv';\n\n/**\n * @description Tab interface component\n * @slot - Default slot for content area\n * @slot tabs-list - Special slot for tab list\n */\n@Component({\n tag: 'bcm-tabs',\n styleUrl: 'bcm-tabs.css',\n shadow: true,\n})\nexport class BcmTabs implements ComponentInterface {\n @Element() el: HTMLElement;\n\n /**\n * Default active tab value\n */\n @Prop({ reflect: true })\n defaultValue: string;\n\n /**\n * Tab size\n */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * Triggers when tab changes\n */\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n eventName: 'bcmTabChange',\n })\n bcmTabChange: EventEmitter<{\n activeTab: string;\n element: HTMLBcmTabsTriggerElement;\n previousTab?: string;\n }>;\n\n /**\n * Active tab value\n */\n @State() activeTab: string;\n\n /**\n * Previous active tab value\n */\n @State() previousTab: string;\n\n private triggers: HTMLBcmTabsTriggerElement[] = [];\n private contents: HTMLBcmTabsContentElement[] = [];\n private tabsList: HTMLBcmTabsListElement;\n\n componentWillLoad() {\n this.activeTab = this.defaultValue;\n }\n\n componentDidLoad() {\n this.refreshElementReferences();\n this.updateTriggerProperties();\n this.setupRelations();\n this.updateInkbar();\n this.updateContentVisibility();\n }\n\n /**\n * Refreshes DOM element references\n */\n private refreshElementReferences() {\n this.triggers = Array.from(this.el.querySelectorAll('bcm-tabs-trigger'));\n this.contents = Array.from(this.el.querySelectorAll('bcm-tabs-content'));\n this.tabsList = this.el.querySelector('bcm-tabs-list');\n }\n\n /**\n * Establishes relationships between tabs and content\n */\n private setupRelations() {\n this.triggers.forEach(trigger => {\n trigger.active = trigger.value === this.activeTab;\n const panel = this.contents.find(content => content.value === trigger.value);\n if (panel) {\n const panelId = `panel-${trigger.value}`;\n panel.id = panelId;\n trigger.setAttribute('aria-controls', panelId);\n panel.setAttribute('aria-labelledby', `trigger-${trigger.value}`);\n trigger.id = `trigger-${trigger.value}`;\n }\n });\n }\n\n private updateTriggerProperties() {\n if (this.triggers?.length > 0) {\n this.triggers.forEach(trigger => {\n trigger.size = this.size;\n });\n }\n }\n\n @Watch('size')\n handleSizeChange() {\n this.updateTriggerProperties();\n }\n\n @Method()\n async disableTab(value: string): Promise<void> {\n const trigger = this.triggers.find(t => t.value === value);\n if (trigger) {\n trigger.disabled = true;\n }\n }\n\n @Method()\n async enableTab(value: string): Promise<void> {\n const trigger = this.triggers.find(t => t.value === value);\n if (trigger) {\n trigger.disabled = false;\n }\n }\n\n /**\n * Disables all tabs\n */\n @Method()\n async disableAllTabs() {\n this.triggers.forEach(trigger => {\n trigger.disabled = true;\n });\n }\n\n /**\n * Enables all tabs\n */\n @Method()\n async enableAllTabs() {\n this.triggers.forEach(trigger => {\n trigger.disabled = false;\n });\n }\n\n /**\n * Returns the active tab value\n */\n @Method()\n async getActiveTab(): Promise<string> {\n return this.activeTab;\n }\n\n /**\n * Sets the active tab\n */\n @Method()\n async setActiveTab(value: string): Promise<void> {\n const trigger = this.triggers.find(t => t.value === value);\n if (trigger && !trigger.disabled) {\n this.previousTab = this.activeTab;\n this.activeTab = value;\n this.updateInkbar();\n this.updateContentVisibility();\n this.updateTabStatus();\n\n this.bcmTabChange.emit({\n activeTab: this.activeTab,\n element: trigger,\n previousTab: this.previousTab,\n });\n }\n }\n\n /**\n * Updates tab status\n */\n private updateTabStatus() {\n this.triggers.forEach(trigger => {\n const isActive = trigger.value === this.activeTab;\n trigger.active = isActive;\n });\n }\n\n @Listen('resize', { target: 'window' })\n handleResize() {\n this.updateInkbar();\n }\n\n /**\n * Triggered when a tab is selected\n */\n @Listen('bcmTabSelected', { capture: true })\n handleTabSelected(event: CustomEvent<string>) {\n this.previousTab = this.activeTab;\n this.activeTab = event.detail;\n\n this.updateTabStatus();\n this.updateInkbar();\n this.updateContentVisibility();\n\n const activeElement = this.triggers.find(trigger => trigger.value === this.activeTab);\n if (activeElement) {\n this.bcmTabChange.emit({\n activeTab: this.activeTab,\n element: activeElement,\n previousTab: this.previousTab,\n });\n }\n }\n\n /**\n * Updates content visibility\n */\n private updateContentVisibility() {\n this.contents.forEach(content => {\n const isVisible = content.value === this.activeTab;\n content.style.display = isVisible ? 'block' : 'none';\n content.setAttribute('aria-hidden', (!isVisible).toString());\n });\n }\n\n /**\n * Updates inkbar position\n */\n private updateInkbar() {\n if (!this.tabsList) {\n console.warn('bcm-tabs-list not found');\n return;\n }\n\n const totalTriggers = this.triggers.length;\n if (totalTriggers === 0) return;\n\n const inkbar = this.tabsList?.shadowRoot?.querySelector('.inkbar') as HTMLElement;\n const activeTrigger = this.triggers.find(trigger => trigger.value === this.activeTab);\n\n if (activeTrigger && inkbar) {\n const triggerRect = activeTrigger.getBoundingClientRect();\n const groupRect = this.tabsList?.shadowRoot?.querySelector('.tabs-list')?.getBoundingClientRect();\n\n if (triggerRect && groupRect) {\n const left = triggerRect.left - groupRect.left;\n const width = triggerRect.width;\n\n inkbar.style.width = `${width}px`;\n inkbar.style.transform = `translateX(${left}px)`;\n inkbar.style.opacity = '1';\n } else {\n console.warn('Group or trigger rect calculation failed');\n inkbar.style.opacity = '0';\n }\n } else {\n if (inkbar) inkbar.style.opacity = '0';\n }\n }\n\n /**\n * Tab container class\n */\n private tabClass = tv({\n base: 'tabs-container bcm-ui-element flex flex-col w-full',\n });\n\n render() {\n return (\n <Host>\n <div class={this.tabClass()}>\n <slot name=\"tabs-list\" />\n <slot></slot>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,h as i}from"./p-B84DzIAh.js";import{t as a}from"./p-CEcVC0yX.js";const o=".relative{position:relative}.block{display:block}:host{display:block;position:relative;width:100%}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.static{position:static}.absolute{position:absolute}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.z-10{z-index:10}.flex{display:flex}.h-0\\.5{height:.125rem}.w-full{width:100%}.flex-row{flex-direction:row}.items-center{align-items:center}.bg-\\[--bcm-ui-color-text-primary\\]{background-color:var(--bcm-ui-color-text-primary)}.opacity-0{opacity:0}.shadow{--tw-shadow:var(--bcm-ui-box-shadow-default);--tw-shadow-colored:var(--bcm-ui-box-shadow-default);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}";const e=class{constructor(i){t(this,i);this.class=a({slots:{container:"flex flex-row items-center w-full relative",inkbar:"inkbar absolute bottom-0 left-0 right-0 h-0.5 bg-[--bcm-ui-color-text-primary] transition-all duration-200 ease-in-out z-10 opacity-0",tabList:"tabs-list flex flex-row items-center w-full relative"}})}render(){const{container:t,inkbar:a,tabList:o}=this.class();return i("div",{key:"9752a4024488845eda6a6701818364dab7fe96f2",class:t(),slot:"tabs-list"},i("div",{key:"c97ec0649dc5054b1dc374e5dd47d37eaaf0001a",class:a()}),i("div",{key:"f0da62c82904ad4bc90cf02ec19c3da48118471c",class:o(),role:"tablist"},i("slot",{key:"c4f7086fac00127505adfc74032bc4a2cd8fbb11"})))}};e.style=o;export{e as bcm_tabs_list};
|
|
2
|
-
//# sourceMappingURL=p-4f0851e2.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["tabsListCss","BcmTabsList","constructor","hostRef","this","class","tv","slots","container","inkbar","tabList","render","h","key","slot","role"],"sources":["src/components/tabs/tabs-list.css?tag=bcm-tabs-list&encapsulation=shadow","src/components/tabs/tabs-list.component.tsx"],"sourcesContent":["/* tabs-list.css */\n:host {\n display: block;\n position: relative;\n width: 100%;\n}\n","import { Component, h, ComponentInterface } from '@stencil/core';\nimport { tv } from '@utils/tv';\n\n/**\n * @description Container component for tab triggers that includes the sliding indicator (inkbar)\n * @slot - Default slot for tab trigger elements\n */\n@Component({\n tag: 'bcm-tabs-list',\n styleUrl: 'tabs-list.css',\n shadow: true,\n})\nexport class BcmTabsList implements ComponentInterface {\n /**\n * Tailwind variants configuration for styling the tabs list container and inkbar\n */\n private class = tv({\n slots: {\n /**\n * Main container that holds both the tablist and inkbar\n */\n container: 'flex flex-row items-center w-full relative',\n\n /**\n * The sliding indicator that appears under the active tab\n */\n inkbar: 'inkbar absolute bottom-0 left-0 right-0 h-0.5 bg-[--bcm-ui-color-text-primary] transition-all duration-200 ease-in-out z-10 opacity-0',\n\n /**\n * The container for tab trigger elements\n */\n tabList: 'tabs-list flex flex-row items-center w-full relative',\n },\n });\n\n render() {\n const { container, inkbar, tabList } = this.class();\n return (\n <div class={container()} slot=\"tabs-list\">\n <div class={inkbar()}></div>\n <div class={tabList()} role=\"tablist\">\n <slot></slot>\n </div>\n </div>\n );\n }\n}\n"],"mappings":"+EAAA,MAAMA,EAAc,kpC,MCYPC,EAAW,MALxB,WAAAC,CAAAC,G,UASUC,KAAKC,MAAGC,EAAG,CACjBC,MAAO,CAILC,UAAW,6CAKXC,OAAQ,wIAKRC,QAAS,yDAed,CAXC,MAAAC,GACE,MAAMH,UAAEA,EAASC,OAAEA,EAAMC,QAAEA,GAAYN,KAAKC,QAC5C,OACEO,EAAA,OAAAC,IAAA,2CAAKR,MAAOG,IAAaM,KAAK,aAC5BF,EAAA,OAAAC,IAAA,2CAAKR,MAAOI,MACZG,EAAA,OAAAC,IAAA,2CAAKR,MAAOK,IAAWK,KAAK,WAC1BH,EAAa,QAAAC,IAAA,8C","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,c as e,h as i,H as o,a as r}from"./p-B84DzIAh.js";import{t as a}from"./p-CEcVC0yX.js";const s=".relative{position:relative}.block{display:block}:host{display:block;position:relative;width:100%}.bcm-ui-element{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.static{position:static}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.flex{display:flex}.h-\\[2px\\]{height:2px}.w-full{width:100%}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.flex-row{flex-direction:row}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-2\\.5{gap:.625rem}.gap-3{gap:.75rem}.border-none{border-style:none}.bg-\\[--bcm-ui-color-text-default\\]{background-color:var(--bcm-ui-color-text-default)}.bg-\\[--bcm-ui-color-text-disabled\\]{background-color:var(--bcm-ui-color-text-disabled)}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.px-3{padding-left:.75rem;padding-right:.75rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.text-center{text-align:center}.text-size-4{font-size:var(--bcm-ui-font-size-4,14px);line-height:var(--bcm-ui-line-height-4,20px)}.text-size-5{font-size:var(--bcm-ui-font-size-5,16px);line-height:var(--bcm-ui-line-height-5,24px)}.text-size-6{font-size:var(--bcm-ui-font-size-6,18px);line-height:var(--bcm-ui-line-height-6,24px)}.font-medium{font-weight:500}.text-color-default{color:var(--bcm-ui-color-text-default)}.text-color-disabled{color:var(--bcm-ui-color-text-disabled)}.text-color-primary{color:var(--bcm-ui-color-text-primary)}.shadow{--tw-shadow:var(--bcm-ui-box-shadow-default);--tw-shadow-colored:var(--bcm-ui-box-shadow-default);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\\:text-color-primary:hover{color:var(--bcm-ui-color-text-primary)}";const l=class{constructor(i){t(this,i);this.bcmTabSelected=e(this,"bcmTabSelected",1);this.active=false;this.size="medium";this.disabled=false;this.class=a({slots:{tab:"bcm-ui-element text-center flex flex-row justify-center items-center font-medium transition-all duration-200 ease-in-out py-1 px-3 w-full bg-white border-none",borderLine:"bottom-0 w-full left-0 right-0 h-[2px] transition-all duration-200 ease-in-out"},variants:{size:{small:{tab:"text-size-4 gap-2"},medium:{tab:"text-size-5 gap-2.5"},large:{tab:"text-size-6 gap-3"}},active:{true:{tab:"text-color-primary"},false:{tab:"text-color-default"}},disabled:{true:{tab:"cursor-not-allowed text-color-disabled",borderLine:"bg-[--bcm-ui-color-text-disabled]"},false:{tab:"cursor-pointer text-color hover:text-color-primary",borderLine:"bg-[--bcm-ui-color-text-default]"}}},defaultVariants:{size:"medium",active:false,disabled:false}},{twMerge:false})}handleClick(){if(this.disabled)return;this.bcmTabSelected.emit(this.value)}render(){const{tab:t,borderLine:e}=this.class({size:this.size,active:this.active,disabled:this.disabled});return i(o,{key:"d8d56bc1536edf98cda1f2a2499d2c2442dc10f3",role:"tab","aria-selected":this.active.toString(),"aria-disabled":this.disabled},i("button",{key:"d943223c1fcc2876b3360af9ab4913f4dc4dd8e9",class:t(),disabled:this.disabled,part:"tab",onClick:()=>this.handleClick()},i("slot",{key:"499f0f1586cc55e451396b588720aa81a488e253"})),i("div",{key:"73e8da795af83ced549dd45a118e72b23a84daed",class:e()}))}get el(){return r(this)}};l.style=s;export{l as bcm_tabs_trigger};
|
|
2
|
-
//# sourceMappingURL=p-88d35bcf.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["tabsTriggerCss","BcmTabsTrigger","constructor","hostRef","this","active","size","disabled","class","tv","slots","tab","borderLine","variants","small","medium","large","true","false","defaultVariants","twMerge","handleClick","bcmTabSelected","emit","value","render","h","Host","key","role","toString","part","onClick"],"sources":["src/components/tabs/tabs-trigger.css?tag=bcm-tabs-trigger&encapsulation=shadow","src/components/tabs/tabs-trigger.component.tsx"],"sourcesContent":[":host {\n position: relative;\n display: block;\n width: 100%;\n}\n","import { Component, Prop, h, Host, Element, Event, EventEmitter, ComponentInterface } from '@stencil/core';\nimport { tv } from '@utils/tv';\n\n/**\n * @description Tab trigger component that functions as a clickable tab button\n * @slot - Default slot for tab label content\n */\n@Component({\n tag: 'bcm-tabs-trigger',\n styleUrl: 'tabs-trigger.css',\n shadow: true,\n})\nexport class BcmTabsTrigger implements ComponentInterface {\n /**\n * Reference to the host element\n */\n @Element() el: HTMLElement;\n\n /**\n * Unique identifier value for the tab\n */\n @Prop({ reflect: true })\n value: string;\n\n /**\n * Whether the tab is currently active\n */\n @Prop({ reflect: true })\n active: boolean = false;\n\n /**\n * Size of the tab\n */\n @Prop({ reflect: true })\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * Whether the tab is disabled\n */\n @Prop({ reflect: true })\n disabled: boolean = false;\n\n /**\n * Event emitted when this tab is selected\n */\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n eventName: 'bcmTabSelected',\n })\n bcmTabSelected: EventEmitter<string>;\n\n /**\n * Handles click events on the tab\n * Emits bcmTabSelected event with tab value if not disabled\n */\n private handleClick() {\n if (this.disabled) return;\n this.bcmTabSelected.emit(this.value);\n }\n\n /**\n * Tailwind variants configuration for styling\n */\n private class = tv(\n {\n slots: {\n tab: 'bcm-ui-element text-center flex flex-row justify-center items-center font-medium transition-all duration-200 ease-in-out py-1 px-3 w-full bg-white border-none',\n borderLine: 'bottom-0 w-full left-0 right-0 h-[2px] transition-all duration-200 ease-in-out',\n },\n variants: {\n size: {\n small: { tab: 'text-size-4 gap-2' },\n medium: { tab: 'text-size-5 gap-2.5' },\n large: { tab: 'text-size-6 gap-3' },\n },\n active: {\n true: {\n tab: 'text-color-primary',\n },\n false: {\n tab: 'text-color-default',\n },\n },\n disabled: {\n true: {\n tab: 'cursor-not-allowed text-color-disabled',\n borderLine: 'bg-[--bcm-ui-color-text-disabled]',\n },\n false: {\n tab: 'cursor-pointer text-color hover:text-color-primary',\n borderLine: 'bg-[--bcm-ui-color-text-default]',\n },\n },\n },\n defaultVariants: {\n size: 'medium',\n active: false,\n disabled: false,\n },\n },\n {\n twMerge: false,\n },\n );\n\n render() {\n const { tab, borderLine } = this.class({\n size: this.size,\n active: this.active,\n disabled: this.disabled,\n });\n return (\n <Host role=\"tab\" aria-selected={this.active.toString()} aria-disabled={this.disabled}>\n <button class={tab()} disabled={this.disabled} part=\"tab\" onClick={() => this.handleClick()}>\n <slot />\n </button>\n <div class={borderLine()}></div>\n </Host>\n );\n }\n}\n"],"mappings":"oGAAA,MAAMA,EAAiB,i9D,MCYVC,EAAc,MAL3B,WAAAC,CAAAC,G,yDAqBEC,KAAMC,OAAY,MAMlBD,KAAIE,KAAiC,SAMrCF,KAAQG,SAAY,MAyBZH,KAAKI,MAAGC,EACd,CACEC,MAAO,CACLC,IAAK,iKACLC,WAAY,kFAEdC,SAAU,CACRP,KAAM,CACJQ,MAAO,CAAEH,IAAK,qBACdI,OAAQ,CAAEJ,IAAK,uBACfK,MAAO,CAAEL,IAAK,sBAEhBN,OAAQ,CACNY,KAAM,CACJN,IAAK,sBAEPO,MAAO,CACLP,IAAK,uBAGTJ,SAAU,CACRU,KAAM,CACJN,IAAK,yCACLC,WAAY,qCAEdM,MAAO,CACLP,IAAK,qDACLC,WAAY,sCAIlBO,gBAAiB,CACfb,KAAM,SACND,OAAQ,MACRE,SAAU,QAGd,CACEa,QAAS,OAmBd,CAjES,WAAAC,GACN,GAAIjB,KAAKG,SAAU,OACnBH,KAAKkB,eAAeC,KAAKnB,KAAKoB,M,CAgDhC,MAAAC,GACE,MAAMd,IAAEA,EAAGC,WAAEA,GAAeR,KAAKI,MAAM,CACrCF,KAAMF,KAAKE,KACXD,OAAQD,KAAKC,OACbE,SAAUH,KAAKG,WAEjB,OACEmB,EAACC,EAAK,CAAAC,IAAA,2CAAAC,KAAK,MAAK,gBAAgBzB,KAAKC,OAAOyB,WAA2B,gBAAA1B,KAAKG,UAC1EmB,EAAQ,UAAAE,IAAA,2CAAApB,MAAOG,IAAOJ,SAAUH,KAAKG,SAAUwB,KAAK,MAAMC,QAAS,IAAM5B,KAAKiB,eAC5EK,EAAA,QAAAE,IAAA,8CAEFF,EAAA,OAAAE,IAAA,2CAAKpB,MAAOI,M","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,c as t,h as i,a as r}from"./p-B84DzIAh.js";import{g as o}from"./p-IBjzkjef.js";import{t as s}from"./p-CEcVC0yX.js";const a=":host{display:inline-block}.bcm-ui-element{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.static{position:static}.absolute{position:absolute}.relative{position:relative}.left-0\\.5{left:.125rem}.left-\\[18px\\]{left:18px}.left-\\[20px\\]{left:20px}.left-\\[22px\\]{left:22px}.order-2{order:2}.flex{display:flex}.hidden{display:none}.size-3{height:.75rem;width:.75rem}.size-3\\.5{height:.875rem;width:.875rem}.size-4{width:1rem}.h-4,.size-4{height:1rem}.h-5{height:1.25rem}.h-\\[18px\\]{height:18px}.w-10{width:2.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.gap-0\\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-2\\.5{gap:.625rem}.gap-3{gap:.75rem}.rounded-full{border-radius:var(--bcm-ui-border-radius-full,9999px)}.bg-\\[--switch-bg\\]{background-color:var(--switch-bg)}.bg-\\[--switch-dot-bg\\]{background-color:var(--switch-dot-bg)}.text-size-3{font-size:var(--bcm-ui-font-size-3,12px);line-height:var(--bcm-ui-line-height-3,16px)}.text-size-4{font-size:var(--bcm-ui-font-size-4,14px);line-height:var(--bcm-ui-line-height-4,20px)}.text-size-5{font-size:var(--bcm-ui-font-size-5,16px);line-height:var(--bcm-ui-line-height-5,24px)}.text-size-6{font-size:var(--bcm-ui-font-size-6,18px);line-height:var(--bcm-ui-line-height-6,24px)}.font-medium{font-weight:500}.font-normal{font-weight:400}.\\!text-color-error{color:var(--bcm-ui-color-text-error)!important}.shadow{--tw-shadow:var(--bcm-ui-box-shadow-default);--tw-shadow-colored:var(--bcm-ui-box-shadow-default)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--bcm-ui-box-shadow-sm);--tw-shadow-colored:var(--bcm-ui-box-shadow-sm)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.group:hover .group-hover\\:bg-\\[--switch-bg-hover\\],.hover\\:bg-\\[--switch-bg-hover\\]:hover{background-color:var(--switch-bg-hover)}.peer:focus-visible~.peer-focus-visible\\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.peer:focus-visible~.peer-focus-visible\\:ring-blue-300{--tw-ring-color:oklch(0.809 0.105 251.813)}.peer:focus-visible~.peer-focus-visible\\:ring-offset-2{--tw-ring-offset-width:2px}.peer:disabled~.peer-disabled\\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\\:\\!text-color-disabled{color:var(--bcm-ui-color-text-disabled)!important}";const c=class{constructor(i){e(this,i);this.bcmSwitchChange=t(this,"bcmSwitchChange",1);this.checked=false;this.disabled=false;this.labelPosition="right";this.error=false;this.size="medium";this.readonly=false;this.required=false;this.switchId=o("switch");this.switchStyle=()=>{const e={"--switch-bg":"var(--bcm-ui-color-background-default-dark-default)","--switch-bg-hover":"var(--bcm-ui-color-background-default-dark-hover)","--switch-dot-bg":"var(--bcm-ui-color-background-base-default)"};const t={"--switch-bg":"var(--bcm-ui-color-background-info-default)","--switch-bg-hover":"var(--bcm-ui-color-background-info-hover)"};const i={"--switch-bg":"var(--bcm-ui-color-background-error-default)","--switch-bg-hover":"var(--bcm-ui-color-background-error-hover)"};const r={"--switch-bg":"var(--bcm-ui-color-background-default-dark-default)","--switch-bg-hover":"var(--bcm-ui-color-background-default-dark-default)","--switch-dot-bg":"var(--bcm-ui-color-background-disabled-default)"};const o={"--switch-bg":"var(--bcm-ui-color-background-disabled-default)","--switch-bg-hover":"var(--bcm-ui-color-background-disabled-default)","--switch-dot-bg":"var(--bcm-ui-color-background-default-default)"};return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),this.checked&&t),this.error&&i),this.readonly&&r),this.disabled&&o)};this.switchClass=s({slots:{base:"bcm-ui-element flex flex-col",switchWrapper:"flex items-center group",dotContainer:"relative flex items-center rounded-full cursor-pointer bg-[--switch-bg] group-hover:bg-[--switch-bg-hover] peer-disabled:cursor-not-allowed transition-colors duration-300",dot:"absolute bg-[--switch-dot-bg] rounded-full shadow-sm transition-all duration-300 ease-in-out peer-disabled:cursor-not-allowed",caption:"!text-color-error font-normal",label:"!text-color font-medium peer-disabled:!text-color-disabled peer-disabled:cursor-not-allowed"},variants:{size:{small:{dotContainer:"w-8 h-4",dot:"size-3",label:"text-size-4",caption:"text-size-3",switchWrapper:"gap-2",base:"gap-0.5"},medium:{dotContainer:"w-9 h-[18px]",dot:"size-3.5",label:"text-size-5",caption:"text-size-4",switchWrapper:"gap-2.5",base:"gap-1"},large:{dotContainer:"w-10 h-5",dot:"size-4",label:"text-size-6",caption:"text-size-5",switchWrapper:"gap-3",base:"gap-2"}},labelPosition:{left:{label:""},right:{label:"order-2"}},checked:{true:{dot:""},false:{dot:"left-0.5"}},disabled:{true:"",false:{switchWrapper:""}},readonly:{true:{switchWrapper:"cursor-default",dotContainer:"cursor-default",dot:"cursor-default"},false:{switchWrapper:"cursor-pointer",dotContainer:"cursor-pointer hover:bg-[--switch-bg-hover]"}}},compoundVariants:[{size:"small",checked:true,class:{dot:"left-[18px]"}},{size:"medium",checked:true,class:{dot:"left-[20px]"}},{size:"large",checked:true,class:{dot:"left-[22px]"}},{readonly:false,disabled:false,class:{dotContainer:"peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-blue-300"}}]})}toggleSwitch(){if(this.disabled||this.readonly)return;this.checked=!this.checked;this.bcmSwitchChange.emit(this.checked)}render(){const{base:e,switchWrapper:t,label:r,dot:o,dotContainer:s,caption:a}=this.switchClass({size:this.size,checked:this.checked,disabled:this.disabled,labelPosition:this.labelPosition,readonly:this.readonly});const c=Object.assign({role:"switch","aria-checked":this.checked.toString(),"aria-disabled":this.disabled.toString(),"aria-readonly":this.readonly.toString()},this.required&&{"aria-required":"true"});const d=!this.readonly&&!this.disabled?{tabindex:"0"}:{};return i("div",{key:"6073bf409136e2470b9dbb4086b275bbae37e0cf",class:e()},i("label",{key:"2f4aabe9e2faa9e6427722923b7b671fdde63d0d",class:t(),style:this.switchStyle()},i("input",{key:"790195d6a1e03f81d2c3c0582e35053fdcbf88de",id:this.switchId,type:"checkbox",class:"hidden peer",checked:this.checked,name:this.name,value:this.value,disabled:this.disabled,readOnly:this.readonly,required:this.required,onChange:()=>this.toggleSwitch()}),this.label&&i("span",{key:"696ed4067822d9cb2c6c259ddc7e89add1e84550",class:r()},i("slot",{key:"9ee1058077e3e26e90fc662756964504f6f8449c"},this.label)),i("label",Object.assign({key:"7fbc66b8357a5af8200279fd9b2c705f0d73530b",htmlFor:this.switchId,class:s()},d,c,{onKeyDown:e=>{if((e.key==="Enter"||e.key===" ")&&!this.readonly&&!this.disabled){e.preventDefault();this.toggleSwitch()}}}),i("div",{key:"0ee2aca9dddfcd1c4cd52dd60d6f1964e6dcdd28",class:o()}))),this.error&&this.caption&&i("span",{key:"80000e73d4f695d5620ed3347350ed049a247bf9",class:a()},this.caption),i("slot",{key:"6bfa76d6062426e21c6c41474fb102177d304a1f",name:"caption"}))}get el(){return r(this)}};c.style=a;export{c as bcm_switch};
|
|
2
|
-
//# sourceMappingURL=p-d04246f0.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["switchCss","BcmSwitch","constructor","hostRef","this","checked","disabled","labelPosition","error","size","readonly","required","switchId","generateId","switchStyle","defaultStyle","checkedStyle","errorStyle","readonlyStyle","disabledStyle","Object","assign","switchClass","tv","slots","base","switchWrapper","dotContainer","dot","caption","label","variants","small","medium","large","left","right","true","false","compoundVariants","class","toggleSwitch","bcmSwitchChange","emit","render","ariaAttributes","role","toString","tabIndexAttr","tabindex","h","key","style","id","type","name","value","readOnly","onChange","htmlFor","onKeyDown","event","preventDefault"],"sources":["src/components/switch/switch.css?tag=bcm-switch&encapsulation=shadow","src/components/switch/switch.component.tsx"],"sourcesContent":[":host {\n display: inline-block;\n}\n","import { Component, Prop, h, Event, EventEmitter, Element, ComponentInterface } from '@stencil/core';\nimport { generateId } from '../../utils/id/generate-id';\nimport { tv } from '@utils/tv';\n\n/**\n * @component BcmSwitch\n * @description A customizable toggle switch component that provides an intuitive way to enable or disable options.\n * Supports different sizes, label positions, error states, and accessibility features.\n *\n * @example Basic usage\n * <bcm-switch label=\"Enable notifications\"></bcm-switch>\n *\n * @example With error state\n * <bcm-switch\n * label=\"Accept terms\"\n * error={true}\n * caption=\"You must accept the terms to continue\">\n * </bcm-switch>\n *\n * @example Disabled state\n * <bcm-switch\n * label=\"Advanced features\"\n * disabled={true}>\n * </bcm-switch>\n *\n * @example With custom size and label position\n * <bcm-switch\n * label=\"Dark mode\"\n * size=\"large\"\n * labelPosition=\"left\">\n * </bcm-switch>\n */\n@Component({\n tag: 'bcm-switch',\n styleUrl: 'switch.css',\n shadow: true,\n})\nexport class BcmSwitch implements ComponentInterface {\n /** Reference to the host element */\n @Element()\n el: HTMLElement;\n\n /** Whether the switch is checked or not */\n @Prop({ reflect: true, mutable: true })\n checked: boolean = false;\n\n /** Whether the switch is disabled */\n @Prop()\n disabled: boolean = false;\n\n /** The name attribute for the hidden input element */\n @Prop()\n name: string;\n\n /** The value attribute for the hidden input element */\n @Prop()\n value: string;\n\n /** Text label for the switch */\n @Prop()\n label: string;\n\n /** Position of the label relative to the switch */\n @Prop()\n labelPosition: 'left' | 'right' = 'right';\n\n /** Whether to display the switch in an error state */\n @Prop()\n error: boolean = false;\n\n /** Text to display as an error message when error is true */\n @Prop()\n caption?: string;\n\n /** Size variant of the switch */\n @Prop()\n size: 'small' | 'medium' | 'large' = 'medium';\n\n /** Whether the switch is in readonly mode */\n @Prop()\n readonly: boolean = false;\n\n /** Whether the switch is required in a form */\n @Prop()\n required: boolean = false;\n\n /** Emitted when the switch state changes */\n @Event({\n composed: false,\n bubbles: false,\n cancelable: true,\n })\n bcmSwitchChange: EventEmitter<boolean>;\n\n private switchId = generateId('switch');\n\n private toggleSwitch(): void {\n if (this.disabled || this.readonly) return;\n this.checked = !this.checked;\n this.bcmSwitchChange.emit(this.checked);\n }\n\n private switchStyle = () => {\n const defaultStyle = {\n '--switch-bg': 'var(--bcm-ui-color-background-default-dark-default)',\n '--switch-bg-hover': 'var(--bcm-ui-color-background-default-dark-hover)',\n '--switch-dot-bg': 'var(--bcm-ui-color-background-base-default)',\n };\n\n const checkedStyle = {\n '--switch-bg': 'var(--bcm-ui-color-background-info-default)',\n '--switch-bg-hover': 'var(--bcm-ui-color-background-info-hover)',\n };\n\n const errorStyle = {\n '--switch-bg': 'var(--bcm-ui-color-background-error-default)',\n '--switch-bg-hover': 'var(--bcm-ui-color-background-error-hover)',\n };\n\n const readonlyStyle = {\n '--switch-bg': 'var(--bcm-ui-color-background-default-dark-default)',\n '--switch-bg-hover': 'var(--bcm-ui-color-background-default-dark-default)',\n '--switch-dot-bg': 'var(--bcm-ui-color-background-disabled-default)',\n };\n\n const disabledStyle = {\n '--switch-bg': 'var(--bcm-ui-color-background-disabled-default)',\n '--switch-bg-hover': 'var(--bcm-ui-color-background-disabled-default)',\n '--switch-dot-bg': 'var(--bcm-ui-color-background-default-default)',\n };\n\n return {\n ...defaultStyle,\n ...(this.checked && checkedStyle),\n ...(this.error && errorStyle),\n ...(this.readonly && readonlyStyle),\n ...(this.disabled && disabledStyle),\n };\n };\n\n private switchClass = tv({\n slots: {\n base: 'bcm-ui-element flex flex-col',\n switchWrapper: 'flex items-center group',\n dotContainer:\n 'relative flex items-center rounded-full cursor-pointer bg-[--switch-bg] group-hover:bg-[--switch-bg-hover] peer-disabled:cursor-not-allowed transition-colors duration-300',\n dot: 'absolute bg-[--switch-dot-bg] rounded-full shadow-sm transition-all duration-300 ease-in-out peer-disabled:cursor-not-allowed',\n caption: '!text-color-error font-normal',\n label: '!text-color font-medium peer-disabled:!text-color-disabled peer-disabled:cursor-not-allowed',\n },\n variants: {\n size: {\n small: {\n dotContainer: 'w-8 h-4',\n dot: 'size-3',\n label: 'text-size-4',\n caption: 'text-size-3',\n switchWrapper: 'gap-2',\n base: 'gap-0.5',\n },\n medium: {\n dotContainer: 'w-9 h-[18px]',\n dot: 'size-3.5',\n label: 'text-size-5',\n caption: 'text-size-4',\n switchWrapper: 'gap-2.5',\n base: 'gap-1',\n },\n large: {\n dotContainer: 'w-10 h-5',\n dot: 'size-4',\n label: 'text-size-6',\n caption: 'text-size-5',\n switchWrapper: 'gap-3',\n base: 'gap-2',\n },\n },\n labelPosition: {\n left: {\n label: '',\n },\n right: {\n label: 'order-2',\n },\n },\n checked: {\n true: {\n dot: '',\n },\n false: {\n dot: 'left-0.5',\n },\n },\n disabled: {\n true: '',\n false: {\n switchWrapper: '',\n },\n },\n readonly: {\n true: {\n switchWrapper: 'cursor-default',\n dotContainer: 'cursor-default',\n dot: 'cursor-default',\n },\n false: {\n switchWrapper: 'cursor-pointer',\n dotContainer: 'cursor-pointer hover:bg-[--switch-bg-hover]',\n },\n },\n },\n compoundVariants: [\n {\n size: 'small',\n checked: true,\n class: {\n dot: 'left-[18px]',\n },\n },\n {\n size: 'medium',\n checked: true,\n class: {\n dot: 'left-[20px]',\n },\n },\n {\n size: 'large',\n checked: true,\n class: {\n dot: 'left-[22px]',\n },\n },\n {\n readonly: false,\n disabled: false,\n class: {\n dotContainer: 'peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-blue-300',\n },\n },\n ],\n });\n\n render() {\n const { base, switchWrapper, label, dot, dotContainer, caption } = this.switchClass({\n size: this.size,\n checked: this.checked,\n disabled: this.disabled,\n labelPosition: this.labelPosition,\n readonly: this.readonly,\n });\n\n const ariaAttributes = {\n 'role': 'switch',\n 'aria-checked': this.checked.toString(),\n 'aria-disabled': this.disabled.toString(),\n 'aria-readonly': this.readonly.toString(),\n ...(this.required && { 'aria-required': 'true' }),\n };\n\n const tabIndexAttr = !this.readonly && !this.disabled ? { tabindex: '0' } : {};\n\n return (\n <div class={base()}>\n <label class={switchWrapper()} style={this.switchStyle()}>\n <input\n id={this.switchId}\n type=\"checkbox\"\n class=\"hidden peer\"\n checked={this.checked}\n name={this.name}\n value={this.value}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n onChange={() => this.toggleSwitch()}\n />\n\n {this.label && (\n <span class={label()}>\n <slot>{this.label}</slot>\n </span>\n )}\n <label\n htmlFor={this.switchId}\n class={dotContainer()}\n {...tabIndexAttr}\n {...ariaAttributes}\n onKeyDown={event => {\n if ((event.key === 'Enter' || event.key === ' ') && !this.readonly && !this.disabled) {\n event.preventDefault();\n this.toggleSwitch();\n }\n }}\n >\n <div class={dot()}></div>\n </label>\n </label>\n\n {this.error && this.caption && <span class={caption()}>{this.caption}</span>}\n <slot name=\"caption\"></slot>\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|