{"version":3,"file":"BqIconButton-z82wvBLv.cjs","names":[],"sources":["../src/components/icon-button/BqIconButton.ts"],"sourcesContent":["/**\r\n * Icon button component - square button for icon-only actions.\r\n * @element bq-icon-button\r\n * @prop {string}  variant  - primary | secondary | outline | ghost | danger\r\n * @prop {string}  size     - sm | md | lg\r\n * @prop {boolean} disabled\r\n * @prop {boolean} loading\r\n * @prop {string}  label    - Preferred accessible label\r\n * @prop {string}  title    - Optional tooltip and accessible-name fallback\r\n * @prop {string}  href\r\n * @slot - Icon content\r\n * @fires bq-click\r\n */\r\nimport { bool, component, html } from '@bquery/bquery/component';\r\nimport type { ComponentDefinition } from '@bquery/bquery/component';\r\nimport { escapeHtml } from '@bquery/bquery/security';\r\nimport { t } from '../../i18n/index.js';\r\nimport { uniqueId } from '../../utils/dom.js';\r\nimport { getBaseStyles } from '../../utils/styles.js';\r\n\r\ntype BqIconButtonProps = {\r\n  variant: string; size: string; disabled: boolean; loading: boolean;\r\n  label: string; href: string; title: string;\r\n};\r\ntype BqIconButtonState = { statusId: string };\r\n\r\nconst definition: ComponentDefinition<BqIconButtonProps, BqIconButtonState> = {\r\n  props: {\r\n    variant: { type: String, default: 'ghost' },\r\n    size:    { type: String, default: 'md' },\r\n    disabled:{ type: Boolean, default: false },\r\n    loading: { type: Boolean, default: false },\r\n    label:   { type: String, default: '' },\r\n    href:    { type: String, default: '' },\r\n    title:   { type: String, default: '' },\r\n  },\r\n  state: {\r\n    statusId: '',\r\n  },\r\n  styles: `\r\n    ${getBaseStyles()}\r\n    *, *::before, *::after { box-sizing: border-box; }\r\n    :host { display: inline-block; }\r\n    .btn {\r\n      display: inline-flex; align-items: center; justify-content: center;\r\n      border: 1.5px solid transparent; border-radius: var(--bq-radius-lg,0.5rem);\r\n      font-family: var(--bq-font-family-sans); cursor: pointer;\r\n      text-decoration: none; transition: background-color var(--bq-duration-fast) var(--bq-easing-standard),\r\n        border-color var(--bq-duration-fast) var(--bq-easing-standard), opacity var(--bq-duration-fast);\r\n      flex-shrink: 0;\r\n    }\r\n    .btn[data-size=\"sm\"] { width: 2rem; height: 2rem; font-size: 1rem; }\r\n    .btn[data-size=\"md\"] { width: 2.5rem; height: 2.5rem; font-size: 1.125rem; }\r\n    .btn[data-size=\"lg\"] { width: 3rem; height: 3rem; font-size: 1.25rem; }\r\n    .btn[data-variant=\"primary\"] { background-color: var(--bq-color-primary-600,#2563eb); color: #fff; border-color: var(--bq-color-primary-600,#2563eb); }\r\n    .btn[data-variant=\"primary\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-primary-700,#1d4ed8); }\r\n    .btn[data-variant=\"secondary\"] { background-color: var(--bq-color-secondary-100,#f1f5f9); color: var(--bq-color-secondary-700,#334155); border-color: var(--bq-color-secondary-200,#e2e8f0); }\r\n    .btn[data-variant=\"outline\"] { background-color: transparent; color: var(--bq-color-primary-600,#2563eb); border-color: var(--bq-color-primary-600,#2563eb); }\r\n    .btn[data-variant=\"ghost\"] { background-color: transparent; color: var(--bq-color-secondary-700,#334155); }\r\n    .btn[data-variant=\"ghost\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-secondary-100,#f1f5f9); }\r\n    .btn[data-variant=\"danger\"] { background-color: var(--bq-color-danger-600,#dc2626); color: #fff; border-color: var(--bq-color-danger-600,#dc2626); }\r\n    .btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\r\n    .btn:disabled, .btn[aria-disabled=\"true\"] { opacity: 0.5; cursor: not-allowed; }\r\n    .spinner { width: 1em; height: 1em; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: spin 0.7s linear infinite; }\r\n    .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }\r\n    @keyframes spin { to { transform: rotate(360deg); } }\r\n    @media (prefers-reduced-motion: reduce) {\r\n      .btn, .spinner { transition: none; animation: none; }\r\n    }\r\n  `,\r\n  connected() {\r\n    type BqIconButtonElement = HTMLElement & { setState(k: 'statusId', v: string): void; getState<T>(k: string): T };\r\n    const self = this as unknown as BqIconButtonElement;\r\n    if (!self.getState<string>('statusId')) self.setState('statusId', uniqueId('bq-icon-button-status'));\r\n    const handler = (e: Event) => {\r\n      if (self.hasAttribute('disabled') || self.hasAttribute('loading')) { e.preventDefault(); e.stopPropagation(); return; }\r\n      self.dispatchEvent(new CustomEvent('bq-click', { detail: { originalEvent: e }, bubbles: true, composed: true }));\r\n    };\r\n    (self as unknown as Record<string, unknown>)['_clickHandler'] = handler;\r\n    self.shadowRoot?.addEventListener('click', handler);\r\n  },\r\n  disconnected() {\r\n    const handler = (this as unknown as Record<string, unknown>)['_clickHandler'] as EventListener | undefined;\r\n    if (handler) this.shadowRoot?.removeEventListener('click', handler);\r\n  },\r\n  render({ props, state }) {\r\n    const tag = props.href ? 'a' : 'button';\r\n    const isLink = tag === 'a';\r\n    const disabled = props.disabled || props.loading;\r\n    const trimmedLabel = props.label.trim();\r\n    const trimmedTitle = props.title.trim();\r\n    const accessibleLabel = trimmedLabel || trimmedTitle || t('iconButton.defaultLabel');\r\n    const loadingLabel = t('common.loading');\r\n    const statusId = state.statusId || 'bq-icon-button-status';\r\n    const statusMarkup = props.loading\r\n      ? `<span class=\"sr-only\" id=\"${escapeHtml(statusId)}\" role=\"status\" aria-live=\"polite\">${escapeHtml(loadingLabel)}</span>`\r\n      : '';\r\n    return html`\r\n      <${tag}\r\n        part=\"button\"\r\n        class=\"btn\"\r\n        data-variant=\"${escapeHtml(props.variant)}\"\r\n        data-size=\"${escapeHtml(props.size)}\"\r\n        aria-label=\"${escapeHtml(accessibleLabel)}\"\r\n        ${trimmedTitle ? `title=\"${escapeHtml(trimmedTitle)}\"` : ''}\r\n        ${!isLink ? 'type=\"button\"' : ''}\r\n        ${props.href ? `href=\"${escapeHtml(props.href)}\"` : ''}\r\n        ${bool('disabled', !isLink && disabled)}\r\n        ${disabled ? 'aria-disabled=\"true\"' : ''}\r\n        ${isLink && disabled ? 'tabindex=\"-1\"' : ''}\r\n        ${props.loading ? `aria-busy=\"true\" aria-describedby=\"${escapeHtml(statusId)}\"` : ''}\r\n      >\r\n        ${props.loading ? '<span class=\"spinner\" aria-hidden=\"true\"></span>' : ''}\r\n        <slot></slot>\r\n      </${tag}>\r\n      ${statusMarkup}\r\n    `;\r\n  },\r\n};\r\n\r\ncomponent<BqIconButtonProps, BqIconButtonState>('bq-icon-button', definition);\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwHA,2BAAA,EAAgD,kBAAkB;CA7FhE,OAAO;EACL,SAAS;GAAE,MAAM;GAAQ,SAAS;GAAS;EAC3C,MAAS;GAAE,MAAM;GAAQ,SAAS;GAAM;EACxC,UAAS;GAAE,MAAM;GAAS,SAAS;GAAO;EAC1C,SAAS;GAAE,MAAM;GAAS,SAAS;GAAO;EAC1C,OAAS;GAAE,MAAM;GAAQ,SAAS;GAAI;EACtC,MAAS;GAAE,MAAM;GAAQ,SAAS;GAAI;EACtC,OAAS;GAAE,MAAM;GAAQ,SAAS;GAAI;EACvC;CACD,OAAO,EACL,UAAU,IACX;CACD,QAAQ;MACJ,eAAA,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BpB,YAAY;EAEV,MAAM,OAAO;AACb,MAAI,CAAC,KAAK,SAAiB,WAAW,CAAE,MAAK,SAAS,YAAY,YAAA,SAAS,wBAAwB,CAAC;EACpG,MAAM,WAAW,MAAa;AAC5B,OAAI,KAAK,aAAa,WAAW,IAAI,KAAK,aAAa,UAAU,EAAE;AAAE,MAAE,gBAAgB;AAAE,MAAE,iBAAiB;AAAE;;AAC9G,QAAK,cAAc,IAAI,YAAY,YAAY;IAAE,QAAQ,EAAE,eAAe,GAAG;IAAE,SAAS;IAAM,UAAU;IAAM,CAAC,CAAC;;AAEjH,OAA4C,mBAAmB;AAChE,OAAK,YAAY,iBAAiB,SAAS,QAAQ;;CAErD,eAAe;EACb,MAAM,UAAW,KAA4C;AAC7D,MAAI,QAAS,MAAK,YAAY,oBAAoB,SAAS,QAAQ;;CAErE,OAAO,EAAE,OAAO,SAAS;EACvB,MAAM,MAAM,MAAM,OAAO,MAAM;EAC/B,MAAM,SAAS,QAAQ;EACvB,MAAM,WAAW,MAAM,YAAY,MAAM;EACzC,MAAM,eAAe,MAAM,MAAM,MAAM;EACvC,MAAM,eAAe,MAAM,MAAM,MAAM;EACvC,MAAM,kBAAkB,gBAAgB,gBAAgB,aAAA,EAAE,0BAA0B;EACpF,MAAM,eAAe,aAAA,EAAE,iBAAiB;EACxC,MAAM,WAAW,MAAM,YAAY;EACnC,MAAM,eAAe,MAAM,UACvB,6BAA6B,2BAAA,GAAW,SAAS,CAAC,qCAAqC,2BAAA,GAAW,aAAa,CAAC,WAChH;AACJ,SAAO,2BAAA,CAAI;SACN,IAAI;;;wBAGW,2BAAA,GAAW,MAAM,QAAQ,CAAC;qBAC7B,2BAAA,GAAW,MAAM,KAAK,CAAC;sBACtB,2BAAA,GAAW,gBAAgB,CAAC;UACxC,eAAe,UAAU,2BAAA,GAAW,aAAa,CAAC,KAAK,GAAG;UAC1D,CAAC,SAAS,oBAAkB,GAAG;UAC/B,MAAM,OAAO,SAAS,2BAAA,GAAW,MAAM,KAAK,CAAC,KAAK,GAAG;UACrD,2BAAA,GAAK,YAAY,CAAC,UAAU,SAAS,CAAC;UACtC,WAAW,2BAAyB,GAAG;UACvC,UAAU,WAAW,oBAAkB,GAAG;UAC1C,MAAM,UAAU,sCAAsC,2BAAA,GAAW,SAAS,CAAC,KAAK,GAAG;;UAEnF,MAAM,UAAU,yDAAqD,GAAG;;UAExE,IAAI;QACN,aAAa;;;CAK6C,CAAW"}