{"version":3,"file":"BqSegmentedControl-BOiSw1kR.cjs","names":[],"sources":["../src/components/segmented-control/BqSegmentedControl.ts"],"sourcesContent":["/**\r\n * Segmented control for single-choice view and filter toggles.\r\n * @element bq-segmented-control\r\n * @prop {string} label\r\n * @prop {string} hint\r\n * @prop {string} name\r\n * @prop {string} value\r\n * @prop {string} size       - sm | md | lg\r\n * @prop {boolean} full-width\r\n * @prop {boolean} disabled\r\n * @prop {string} aria-label - Accessible label when no visible label is rendered\r\n * @slot - Segment buttons (use <button value=\"...\">Label</button>)\r\n * @fires bq-change - { value: string }\r\n */\r\nimport type { ComponentDefinition } from '@bquery/bquery/component';\r\nimport { component, html } 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 { createFormProxy, type FormProxy } from '../../utils/form.js';\r\nimport { getBaseStyles } from '../../utils/styles.js';\r\n\r\ntype BqSegmentedControlProps = {\r\n  label: string;\r\n  hint: string;\r\n  name: string;\r\n  value: string;\r\n  size: string;\r\n  'full-width': boolean;\r\n  disabled: boolean;\r\n  'aria-label': string;\r\n};\r\n\r\ntype BqSegmentedControlState = {\r\n  uid: string;\r\n};\r\n\r\nconst definition: ComponentDefinition<\r\n  BqSegmentedControlProps,\r\n  BqSegmentedControlState\r\n> = {\r\n  props: {\r\n    label: { type: String, default: '' },\r\n    hint: { type: String, default: '' },\r\n    name: { type: String, default: '' },\r\n    value: { type: String, default: '' },\r\n    size: { type: String, default: 'md' },\r\n    'full-width': { type: Boolean, default: false },\r\n    disabled: { type: Boolean, default: false },\r\n    'aria-label': { type: String, default: '' },\r\n  },\r\n  state: {\r\n    uid: '',\r\n  },\r\n  styles: `\r\n    ${getBaseStyles()}\r\n    *, *::before, *::after { box-sizing: border-box; }\r\n    :host { display: block; }\r\n    .field { display: flex; flex-direction: column; gap: 0.375rem; }\r\n    .label {\r\n      font-family: var(--bq-font-family-sans);\r\n      font-size: var(--bq-font-size-sm,0.875rem);\r\n      font-weight: var(--bq-font-weight-medium,500);\r\n      color: var(--bq-text-base,#0f172a);\r\n      line-height: 1.5;\r\n    }\r\n    .control {\r\n      display: inline-flex;\r\n      align-items: stretch;\r\n      gap: 0.25rem;\r\n      width: fit-content;\r\n      min-width: 0;\r\n      padding: 0.25rem;\r\n      border: 1px solid var(--bq-border-base,#e2e8f0);\r\n      border-radius: var(--bq-radius-xl,0.75rem);\r\n      background: var(--bq-bg-subtle,#f8fafc);\r\n      min-height: 2.75rem;\r\n    }\r\n    :host([full-width]) .control {\r\n      display: flex;\r\n      width: 100%;\r\n    }\r\n    :host([disabled]) .control {\r\n      opacity: 0.7;\r\n    }\r\n    .hint {\r\n      font-family: var(--bq-font-family-sans);\r\n      font-size: var(--bq-font-size-sm,0.875rem);\r\n      color: var(--bq-text-muted,#475569);\r\n      line-height: 1.5;\r\n    }\r\n    ::slotted(button) {\r\n      appearance: none;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 0.375rem;\r\n      min-height: 2.25rem;\r\n      min-width: 2.75rem;\r\n      padding: 0.5rem 0.875rem;\r\n      border: none;\r\n      border-radius: var(--bq-radius-lg,0.5rem);\r\n      background: transparent;\r\n      color: var(--bq-text-muted,#475569);\r\n      font-family: var(--bq-font-family-sans);\r\n      font-size: var(--bq-font-size-sm,0.875rem);\r\n      font-weight: var(--bq-font-weight-medium,500);\r\n      line-height: 1.25;\r\n      text-align: center;\r\n      white-space: nowrap;\r\n      cursor: pointer;\r\n      transition:\r\n        background var(--bq-duration-fast,150ms) var(--bq-easing-standard),\r\n        color var(--bq-duration-fast,150ms) var(--bq-easing-standard),\r\n        box-shadow var(--bq-duration-fast,150ms) var(--bq-easing-standard);\r\n    }\r\n    :host([size=\"sm\"]) ::slotted(button) {\r\n      min-height: 2rem;\r\n      padding: 0.375rem 0.75rem;\r\n      font-size: var(--bq-font-size-xs,0.75rem);\r\n    }\r\n    :host([size=\"lg\"]) ::slotted(button) {\r\n      min-height: 2.75rem;\r\n      padding: 0.625rem 1rem;\r\n      font-size: var(--bq-font-size-md,1rem);\r\n    }\r\n    :host([full-width]) ::slotted(button) {\r\n      flex: 1 1 0;\r\n      min-width: 0;\r\n    }\r\n    ::slotted(button:hover:not(:disabled):not([aria-disabled=\"true\"]):not([data-selected=\"true\"])) {\r\n      color: var(--bq-text-base,#0f172a);\r\n      background: var(--bq-bg-muted,#f1f5f9);\r\n    }\r\n    ::slotted(button[data-selected=\"true\"]) {\r\n      background: var(--bq-bg-base,#ffffff);\r\n      color: var(--bq-color-primary-600,#2563eb);\r\n      box-shadow: var(--bq-shadow-sm);\r\n    }\r\n    ::slotted(button:focus-visible) {\r\n      outline: 2px solid transparent;\r\n      box-shadow: var(--bq-focus-ring);\r\n    }\r\n    ::slotted(button:disabled),\r\n    ::slotted(button[aria-disabled=\"true\"]) {\r\n      opacity: 0.5;\r\n      cursor: not-allowed;\r\n    }\r\n    @media (prefers-reduced-motion: reduce) {\r\n      ::slotted(button) { transition: none; }\r\n    }\r\n  `,\r\n  connected() {\r\n    type BQEl = HTMLElement & {\r\n      setState(key: 'uid', value: string): void;\r\n      getState<T>(key: string): T;\r\n    };\r\n\r\n    const self = this as unknown as BQEl & Record<string, unknown>;\r\n\r\n    if (!self.getState<string>('uid')) {\r\n      self.setState('uid', uniqueId('bq-segmented'));\r\n    }\r\n\r\n    const proxy = createFormProxy(\r\n      self,\r\n      self.getAttribute('name') ?? '',\r\n      self.getAttribute('value') ?? '',\r\n      self.hasAttribute('disabled')\r\n    );\r\n    self['_formProxy'] = proxy;\r\n\r\n    const getButtons = (): HTMLButtonElement[] => {\r\n      const slot = self.shadowRoot?.querySelector(\r\n        'slot:not([name])'\r\n      ) as HTMLSlotElement | null;\r\n      if (!slot) return [];\r\n      return slot\r\n        .assignedElements({ flatten: true })\r\n        .filter(\r\n          (element): element is HTMLButtonElement =>\r\n            element instanceof HTMLElement && element.tagName === 'BUTTON'\r\n        );\r\n    };\r\n\r\n    const getButtonValue = (button: HTMLButtonElement): string =>\r\n      button.getAttribute('value') ||\r\n      button.getAttribute('data-value') ||\r\n      button.textContent?.trim() ||\r\n      '';\r\n\r\n    const isButtonDisabled = (button: HTMLButtonElement): boolean =>\r\n      self.hasAttribute('disabled') ||\r\n      button.disabled ||\r\n      button.getAttribute('aria-disabled') === 'true';\r\n\r\n    const ensureSelectedValue = (): string => {\r\n      const buttons = getButtons();\r\n      const currentValue = self.getAttribute('value') ?? '';\r\n      const selectedButton = buttons.find(\r\n        (button) =>\r\n          !isButtonDisabled(button) && getButtonValue(button) === currentValue\r\n      );\r\n      if (selectedButton) return currentValue;\r\n\r\n      const fallbackButton = buttons.find(\r\n        (button) => !isButtonDisabled(button)\r\n      );\r\n      const fallbackValue = fallbackButton\r\n        ? getButtonValue(fallbackButton)\r\n        : '';\r\n\r\n      if (fallbackValue && fallbackValue !== currentValue) {\r\n        self.setAttribute('value', fallbackValue);\r\n      } else if (!fallbackValue && currentValue) {\r\n        self.removeAttribute('value');\r\n      }\r\n\r\n      return fallbackValue;\r\n    };\r\n\r\n    const syncButtons = () => {\r\n      const buttons = getButtons();\r\n      const selectedValue = ensureSelectedValue();\r\n      const enabledButtons = buttons.filter(\r\n        (button) => !isButtonDisabled(button)\r\n      );\r\n      const focusValue =\r\n        selectedValue ||\r\n        (enabledButtons[0] ? getButtonValue(enabledButtons[0]) : '');\r\n\r\n      buttons.forEach((button) => {\r\n        const value = getButtonValue(button);\r\n        const disabled = isButtonDisabled(button);\r\n        const selected = value !== '' && value === selectedValue;\r\n\r\n        if (!button.hasAttribute('type')) {\r\n          button.setAttribute('type', 'button');\r\n        }\r\n\r\n        button.setAttribute('role', 'radio');\r\n        button.setAttribute('aria-checked', selected ? 'true' : 'false');\r\n        button.setAttribute('aria-disabled', disabled ? 'true' : 'false');\r\n\r\n        if (selected) {\r\n          button.setAttribute('data-selected', 'true');\r\n        } else {\r\n          button.removeAttribute('data-selected');\r\n        }\r\n\r\n        button.setAttribute(\r\n          'tabindex',\r\n          !disabled && value === focusValue ? '0' : '-1'\r\n        );\r\n\r\n        button.removeEventListener('keydown', keyHandler);\r\n        button.addEventListener('keydown', keyHandler);\r\n      });\r\n\r\n      proxy.setName(self.getAttribute('name') ?? '');\r\n      proxy.setValue(selectedValue);\r\n      proxy.setDisabled(self.hasAttribute('disabled'));\r\n    };\r\n\r\n    const selectButton = (\r\n      button: HTMLButtonElement,\r\n      options: { focus?: boolean; emit?: boolean } = {}\r\n    ) => {\r\n      if (isButtonDisabled(button)) return;\r\n\r\n      const nextValue = getButtonValue(button);\r\n      if (!nextValue) return;\r\n\r\n      const previousValue = self.getAttribute('value') ?? '';\r\n      if (nextValue !== previousValue) {\r\n        self.setAttribute('value', nextValue);\r\n        syncButtons();\r\n\r\n        if (options.emit !== false) {\r\n          self.dispatchEvent(\r\n            new CustomEvent('bq-change', {\r\n              detail: { value: nextValue },\r\n              bubbles: true,\r\n              composed: true,\r\n            })\r\n          );\r\n        }\r\n      } else {\r\n        syncButtons();\r\n      }\r\n\r\n      if (options.focus) {\r\n        button.focus();\r\n      }\r\n    };\r\n\r\n    const moveSelection = (\r\n      currentButton: HTMLButtonElement,\r\n      direction: 'next' | 'prev' | 'first' | 'last'\r\n    ) => {\r\n      const enabledButtons = getButtons().filter(\r\n        (button) => !isButtonDisabled(button)\r\n      );\r\n      if (enabledButtons.length === 0) return;\r\n\r\n      let nextButton: HTMLButtonElement | null = enabledButtons[0] ?? null;\r\n\r\n      if (direction === 'last') {\r\n        nextButton = enabledButtons[enabledButtons.length - 1] ?? null;\r\n      } else if (direction === 'next' || direction === 'prev') {\r\n        const currentIndex = enabledButtons.indexOf(currentButton);\r\n        if (currentIndex === -1) {\r\n          nextButton = enabledButtons[0] ?? null;\r\n        } else if (direction === 'next') {\r\n          nextButton =\r\n            enabledButtons[(currentIndex + 1) % enabledButtons.length] ?? null;\r\n        } else {\r\n          nextButton =\r\n            enabledButtons[\r\n              (currentIndex - 1 + enabledButtons.length) % enabledButtons.length\r\n            ] ?? null;\r\n        }\r\n      }\r\n\r\n      if (!nextButton) return;\r\n      selectButton(nextButton, { focus: true });\r\n    };\r\n\r\n    const clickHandler = (event: Event) => {\r\n      const target = event.target as Element | null;\r\n      const button = target?.closest('button') as HTMLButtonElement | null;\r\n      if (!button || !getButtons().includes(button)) return;\r\n\r\n      selectButton(button);\r\n    };\r\n\r\n    const keyHandler = (event: Event) => {\r\n      const keyboardEvent = event as KeyboardEvent;\r\n      const target = event.target as Element | null;\r\n      const button = target?.closest('button') as HTMLButtonElement | null;\r\n      if (!button || !getButtons().includes(button)) return;\r\n\r\n      const docView = self.ownerDocument?.defaultView;\r\n      const computedStyle = docView?.getComputedStyle?.(self);\r\n      const isRtl = computedStyle?.direction === 'rtl';\r\n\r\n      switch (keyboardEvent.key) {\r\n        case 'ArrowRight':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, isRtl ? 'prev' : 'next');\r\n          break;\r\n        case 'ArrowLeft':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, isRtl ? 'next' : 'prev');\r\n          break;\r\n        case 'ArrowDown':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, 'next');\r\n          break;\r\n        case 'ArrowUp':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, 'prev');\r\n          break;\r\n        case 'Home':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, 'first');\r\n          break;\r\n        case 'End':\r\n          keyboardEvent.preventDefault();\r\n          moveSelection(button, 'last');\r\n          break;\r\n        case 'Enter':\r\n        case ' ':\r\n          keyboardEvent.preventDefault();\r\n          selectButton(button, { focus: true });\r\n          break;\r\n      }\r\n    };\r\n\r\n    const slotChangeHandler = () => {\r\n      syncButtons();\r\n    };\r\n\r\n    const observer = new MutationObserver(() => {\r\n      syncButtons();\r\n    });\r\n    observer.observe(self, {\r\n      childList: true,\r\n      subtree: true,\r\n      characterData: true,\r\n      attributes: true,\r\n      attributeFilter: ['disabled', 'value', 'data-value'],\r\n    });\r\n\r\n    self['_syncButtons'] = syncButtons;\r\n    self['_clickHandler'] = clickHandler;\r\n    self['_keyHandler'] = keyHandler;\r\n    self['_slotChangeHandler'] = slotChangeHandler;\r\n    self['_observer'] = observer;\r\n\r\n    self.addEventListener('click', clickHandler);\r\n    self.shadowRoot\r\n      ?.querySelector('slot:not([name])')\r\n      ?.addEventListener('slotchange', slotChangeHandler);\r\n\r\n    requestAnimationFrame(syncButtons);\r\n  },\r\n  disconnected() {\r\n    const self = this as unknown as Record<string, unknown>;\r\n\r\n    const clickHandler = self['_clickHandler'] as EventListener | undefined;\r\n    const keyHandler = self['_keyHandler'] as EventListener | undefined;\r\n    const slotChangeHandler = self['_slotChangeHandler'] as\r\n      | EventListener\r\n      | undefined;\r\n    const observer = self['_observer'] as MutationObserver | undefined;\r\n    const proxy = self['_formProxy'] as FormProxy | undefined;\r\n\r\n    if (clickHandler) this.removeEventListener('click', clickHandler);\r\n    if (keyHandler) {\r\n      const buttons = this.querySelectorAll('button');\r\n      buttons.forEach((button) =>\r\n        button.removeEventListener('keydown', keyHandler)\r\n      );\r\n    }\r\n    if (slotChangeHandler) {\r\n      this.shadowRoot\r\n        ?.querySelector('slot:not([name])')\r\n        ?.removeEventListener('slotchange', slotChangeHandler);\r\n    }\r\n\r\n    observer?.disconnect();\r\n    proxy?.cleanup();\r\n  },\r\n  updated() {\r\n    const syncButtons = (this as unknown as Record<string, unknown>)[\r\n      '_syncButtons'\r\n    ] as (() => void) | undefined;\r\n    syncButtons?.();\r\n  },\r\n  render({ props, state }) {\r\n    const uid = state.uid || 'bq-segmented';\r\n    const labelId = `${uid}-label`;\r\n    const hintId = `${uid}-hint`;\r\n    const fallbackGroupLabel = t('segmentedControl.defaultLabel');\r\n\r\n    const labelAttribute = props.label\r\n      ? `aria-labelledby=\"${labelId}\"`\r\n      : props['aria-label']\r\n        ? `aria-label=\"${escapeHtml(props['aria-label'])}\"`\r\n        : `aria-label=\"${escapeHtml(props.name || fallbackGroupLabel)}\"`;\r\n\r\n    const descriptionAttribute = props.hint\r\n      ? `aria-describedby=\"${hintId}\"`\r\n      : '';\r\n\r\n    return html`\r\n      <div class=\"field\" part=\"field\">\r\n        ${props.label\r\n          ? `<div class=\"label\" id=\"${labelId}\" part=\"label\">${escapeHtml(props.label)}</div>`\r\n          : ''}\r\n        <div\r\n          class=\"control\"\r\n          part=\"control\"\r\n          role=\"radiogroup\"\r\n          ${labelAttribute}\r\n          ${descriptionAttribute}\r\n        >\r\n          <slot></slot>\r\n        </div>\r\n        ${props.hint\r\n          ? `<div class=\"hint\" id=\"${hintId}\" part=\"hint\">${escapeHtml(props.hint)}</div>`\r\n          : ''}\r\n      </div>\r\n    `;\r\n  },\r\n};\r\n\r\ncomponent<BqSegmentedControlProps, BqSegmentedControlState>(\r\n  'bq-segmented-control',\r\n  definition\r\n);\r\n"],"mappings":"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"}