{"version":3,"sources":["jsdelivr-header.js","/npm/@bquery/ui@1.1.0/src/tokens/colors.ts","/npm/@bquery/ui@1.1.0/src/tokens/typography.ts","/npm/@bquery/ui@1.1.0/src/tokens/motion.ts","/npm/@bquery/ui@1.1.0/src/tokens/index.ts","/npm/@bquery/ui@1.1.0/src/theme/dark.ts","/npm/@bquery/ui@1.1.0/src/theme/default.ts","/npm/@bquery/ui@1.1.0/src/theme/index.ts","/npm/@bquery/ui@1.1.0/src/i18n/en.ts","/npm/@bquery/ui@1.1.0/src/i18n/index.ts","/npm/@bquery/ui@1.1.0/src/utils/dom.ts","/npm/@bquery/ui@1.1.0/src/utils/form.ts","/npm/@bquery/ui@1.1.0/src/utils/styles.ts","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/sanitize-Bs2dkMby.js","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/effect-AFRW_Plg.js","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/object-qGpWr6-J.js","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/config-DRmZZno3.js","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/untrack-B0rVscTc.js","/npm/@bquery/ui@1.1.0/node_modules/@bquery/bquery/dist/component-BEQgt5hl.js","/npm/@bquery/ui@1.1.0/src/components/accordion/BqAccordion.ts","/npm/@bquery/ui@1.1.0/src/components/alert/BqAlert.ts","/npm/@bquery/ui@1.1.0/src/components/avatar/BqAvatar.ts","/npm/@bquery/ui@1.1.0/src/components/badge/BqBadge.ts","/npm/@bquery/ui@1.1.0/src/components/breadcrumbs/BqBreadcrumbs.ts","/npm/@bquery/ui@1.1.0/src/components/button/BqButton.ts","/npm/@bquery/ui@1.1.0/src/components/card/BqCard.ts","/npm/@bquery/ui@1.1.0/src/components/checkbox/BqCheckbox.ts","/npm/@bquery/ui@1.1.0/src/components/chip/BqChip.ts","/npm/@bquery/ui@1.1.0/src/components/dialog/BqDialog.ts","/npm/@bquery/ui@1.1.0/src/components/divider/BqDivider.ts","/npm/@bquery/ui@1.1.0/src/components/dropdown-menu/BqDropdownMenu.ts","/npm/@bquery/ui@1.1.0/src/components/drawer/BqDrawer.ts","/npm/@bquery/ui@1.1.0/src/components/empty-state/BqEmptyState.ts","/npm/@bquery/ui@1.1.0/src/components/icon-button/BqIconButton.ts","/npm/@bquery/ui@1.1.0/src/components/input/BqInput.ts","/npm/@bquery/ui@1.1.0/src/components/pagination/BqPagination.ts","/npm/@bquery/ui@1.1.0/src/components/progress/BqProgress.ts","/npm/@bquery/ui@1.1.0/src/components/radio/BqRadio.ts","/npm/@bquery/ui@1.1.0/src/components/select/BqSelect.ts","/npm/@bquery/ui@1.1.0/src/components/segmented-control/BqSegmentedControl.ts","/npm/@bquery/ui@1.1.0/src/components/skeleton/BqSkeleton.ts","/npm/@bquery/ui@1.1.0/src/components/slider/BqSlider.ts","/npm/@bquery/ui@1.1.0/src/components/spinner/BqSpinner.ts","/npm/@bquery/ui@1.1.0/src/components/stat-card/BqStatCard.ts","/npm/@bquery/ui@1.1.0/src/components/switch/BqSwitch.ts","/npm/@bquery/ui@1.1.0/src/components/table/BqTable.ts","/npm/@bquery/ui@1.1.0/src/components/tabs/BqTabs.ts","/npm/@bquery/ui@1.1.0/src/components/textarea/BqTextarea.ts","/npm/@bquery/ui@1.1.0/src/components/toast/BqToast.ts","/npm/@bquery/ui@1.1.0/src/components/tooltip/BqTooltip.ts","/npm/@bquery/ui@1.1.0/src/register.ts","/npm/@bquery/ui@1.1.0/src/index.ts","/npm/@bquery/ui@1.1.0/src/utils/aria.ts","/npm/@bquery/ui@1.1.0/src/utils/cn.ts"],"names":[],"mappings":"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","file":"/npm/@bquery/ui@1.1.0/dist/index.umd.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@bquery/ui@1.1.0/dist/index.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Design token color definitions for @bquery/ui\n */\nexport const colors = {\n  // Brand - Primary (Blue)\n  primary50: '#eff6ff',\n  primary100: '#dbeafe',\n  primary200: '#bfdbfe',\n  primary300: '#93c5fd',\n  primary400: '#60a5fa',\n  primary500: '#3b82f6',\n  primary600: '#2563eb',\n  primary700: '#1d4ed8',\n  primary800: '#1e40af',\n  primary900: '#1e3a8a',\n\n  // Secondary (Slate)\n  secondary50: '#f8fafc',\n  secondary100: '#f1f5f9',\n  secondary200: '#e2e8f0',\n  secondary300: '#cbd5e1',\n  secondary400: '#94a3b8',\n  secondary500: '#64748b',\n  secondary600: '#475569',\n  secondary700: '#334155',\n  secondary800: '#1e293b',\n  secondary900: '#0f172a',\n\n  // Danger (Red)\n  danger50: '#fef2f2',\n  danger100: '#fee2e2',\n  danger200: '#fecaca',\n  danger300: '#fca5a5',\n  danger400: '#f87171',\n  danger500: '#ef4444',\n  danger600: '#dc2626',\n  danger700: '#b91c1c',\n  danger800: '#991b1b',\n  danger900: '#7f1d1d',\n\n  // Success (Green)\n  success50: '#f0fdf4',\n  success100: '#dcfce7',\n  success200: '#bbf7d0',\n  success300: '#86efac',\n  success400: '#4ade80',\n  success500: '#22c55e',\n  success600: '#16a34a',\n  success700: '#15803d',\n  success800: '#166534',\n  success900: '#14532d',\n\n  // Warning (Amber)\n  warning50: '#fffbeb',\n  warning100: '#fef3c7',\n  warning200: '#fde68a',\n  warning300: '#fcd34d',\n  warning400: '#fbbf24',\n  warning500: '#f59e0b',\n  warning600: '#d97706',\n  warning700: '#b45309',\n  warning800: '#92400e',\n  warning900: '#78350f',\n\n  // Info (Blue alias)\n  info50: '#eff6ff',\n  info100: '#dbeafe',\n  info200: '#bfdbfe',\n  info300: '#93c5fd',\n  info400: '#60a5fa',\n  info500: '#3b82f6',\n  info600: '#2563eb',\n  info700: '#1d4ed8',\n  info800: '#1e40af',\n  info900: '#1e3a8a',\n\n  // Neutral\n  white: '#ffffff',\n  black: '#000000',\n  transparent: 'transparent',\n} as const;\n\nexport type ColorToken = keyof typeof colors;\n","/**\n * Typography design tokens for @bquery/ui\n */\nexport const typography = {\n  // Font families\n  fontFamilySans: \"'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n  fontFamilyMono: \"'JetBrains Mono', 'Fira Code', Consolas, 'Courier New', monospace\",\n  fontFamilySerif: \"Georgia, Cambria, 'Times New Roman', Times, serif\",\n\n  // Font sizes\n  fontSizeXs: '0.75rem',    // 12px\n  fontSizeSm: '0.875rem',   // 14px\n  fontSizeMd: '1rem',       // 16px\n  fontSizeLg: '1.125rem',   // 18px\n  fontSizeXl: '1.25rem',    // 20px\n  fontSize2xl: '1.5rem',    // 24px\n  fontSize3xl: '1.875rem',  // 30px\n  fontSize4xl: '2.25rem',   // 36px\n\n  // Font weights\n  fontWeightLight: '300',\n  fontWeightNormal: '400',\n  fontWeightMedium: '500',\n  fontWeightSemibold: '600',\n  fontWeightBold: '700',\n  fontWeightExtrabold: '800',\n\n  // Line heights\n  lineHeightNone: '1',\n  lineHeightTight: '1.25',\n  lineHeightSnug: '1.375',\n  lineHeightNormal: '1.5',\n  lineHeightRelaxed: '1.625',\n  lineHeightLoose: '2',\n\n  // Letter spacing\n  letterSpacingTighter: '-0.05em',\n  letterSpacingTight: '-0.025em',\n  letterSpacingNormal: '0em',\n  letterSpacingWide: '0.025em',\n  letterSpacingWider: '0.05em',\n  letterSpacingWidest: '0.1em',\n} as const;\n\nexport type TypographyToken = keyof typeof typography;\n","/**\n * Motion / animation design tokens for @bquery/ui\n */\nexport const motion = {\n  // Durations\n  durationInstant: '0ms',\n  durationFast: '150ms',\n  durationNormal: '200ms',\n  durationSlow: '300ms',\n  durationSlower: '500ms',\n\n  // Easing functions\n  easingLinear: 'linear',\n  easingStandard: 'cubic-bezier(0.4, 0, 0.2, 1)',\n  easingDecelerate: 'cubic-bezier(0, 0, 0.2, 1)',\n  easingAccelerate: 'cubic-bezier(0.4, 0, 1, 1)',\n  easingEmphasized: 'cubic-bezier(0.2, 0, 0, 1)',\n  easingSpring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n} as const;\n\nexport type MotionToken = keyof typeof motion;\n","/**\n * Design tokens index - exports all token groups and the CSS custom properties string.\n */\nexport { colors } from './colors.js';\nexport type { ColorToken } from './colors.js';\n\nexport { typography } from './typography.js';\nexport type { TypographyToken } from './typography.js';\n\nexport { motion } from './motion.js';\nexport type { MotionToken } from './motion.js';\n\n/**\n * Returns the complete CSS custom property declaration block for all design tokens.\n * Embed this in a `:root` or `:host` block.\n */\nexport function getTokensCSS(): string {\n  return `\n  /* === Colors: Primary === */\n  --bq-color-primary-50: #eff6ff;\n  --bq-color-primary-100: #dbeafe;\n  --bq-color-primary-200: #bfdbfe;\n  --bq-color-primary-300: #93c5fd;\n  --bq-color-primary-400: #60a5fa;\n  --bq-color-primary-500: #3b82f6;\n  --bq-color-primary-600: #2563eb;\n  --bq-color-primary-700: #1d4ed8;\n  --bq-color-primary-800: #1e40af;\n  --bq-color-primary-900: #1e3a8a;\n\n  /* === Colors: Secondary === */\n  --bq-color-secondary-50: #f8fafc;\n  --bq-color-secondary-100: #f1f5f9;\n  --bq-color-secondary-200: #e2e8f0;\n  --bq-color-secondary-300: #cbd5e1;\n  --bq-color-secondary-400: #94a3b8;\n  --bq-color-secondary-500: #64748b;\n  --bq-color-secondary-600: #475569;\n  --bq-color-secondary-700: #334155;\n  --bq-color-secondary-800: #1e293b;\n  --bq-color-secondary-900: #0f172a;\n\n  /* === Colors: Danger === */\n  --bq-color-danger-50: #fef2f2;\n  --bq-color-danger-100: #fee2e2;\n  --bq-color-danger-200: #fecaca;\n  --bq-color-danger-300: #fca5a5;\n  --bq-color-danger-400: #f87171;\n  --bq-color-danger-500: #ef4444;\n  --bq-color-danger-600: #dc2626;\n  --bq-color-danger-700: #b91c1c;\n  --bq-color-danger-800: #991b1b;\n  --bq-color-danger-900: #7f1d1d;\n\n  /* === Colors: Success === */\n  --bq-color-success-50: #f0fdf4;\n  --bq-color-success-100: #dcfce7;\n  --bq-color-success-200: #bbf7d0;\n  --bq-color-success-300: #86efac;\n  --bq-color-success-400: #4ade80;\n  --bq-color-success-500: #22c55e;\n  --bq-color-success-600: #16a34a;\n  --bq-color-success-700: #15803d;\n  --bq-color-success-800: #166534;\n  --bq-color-success-900: #14532d;\n\n  /* === Colors: Warning === */\n  --bq-color-warning-50: #fffbeb;\n  --bq-color-warning-100: #fef3c7;\n  --bq-color-warning-200: #fde68a;\n  --bq-color-warning-300: #fcd34d;\n  --bq-color-warning-400: #fbbf24;\n  --bq-color-warning-500: #f59e0b;\n  --bq-color-warning-600: #d97706;\n  --bq-color-warning-700: #b45309;\n  --bq-color-warning-800: #92400e;\n  --bq-color-warning-900: #78350f;\n\n  /* === Colors: Info === */\n  --bq-color-info-50: #eff6ff;\n  --bq-color-info-100: #dbeafe;\n  --bq-color-info-200: #bfdbfe;\n  --bq-color-info-300: #93c5fd;\n  --bq-color-info-400: #60a5fa;\n  --bq-color-info-500: #3b82f6;\n  --bq-color-info-600: #2563eb;\n  --bq-color-info-700: #1d4ed8;\n  --bq-color-info-800: #1e40af;\n  --bq-color-info-900: #1e3a8a;\n\n  /* === Typography === */\n  --bq-font-family-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n  --bq-font-family-mono: 'JetBrains Mono', 'Fira Code', Consolas, 'Courier New', monospace;\n  --bq-font-size-xs: 0.75rem;\n  --bq-font-size-sm: 0.875rem;\n  --bq-font-size-md: 1rem;\n  --bq-font-size-lg: 1.125rem;\n  --bq-font-size-xl: 1.25rem;\n  --bq-font-size-2xl: 1.5rem;\n  --bq-font-weight-normal: 400;\n  --bq-font-weight-medium: 500;\n  --bq-font-weight-semibold: 600;\n  --bq-font-weight-bold: 700;\n  --bq-line-height-tight: 1.25;\n  --bq-line-height-normal: 1.5;\n  --bq-line-height-relaxed: 1.625;\n\n  /* === Spacing === */\n  --bq-space-0: 0;\n  --bq-space-1: 0.25rem;\n  --bq-space-2: 0.5rem;\n  --bq-space-3: 0.75rem;\n  --bq-space-4: 1rem;\n  --bq-space-5: 1.25rem;\n  --bq-space-6: 1.5rem;\n  --bq-space-8: 2rem;\n  --bq-space-10: 2.5rem;\n  --bq-space-12: 3rem;\n  --bq-space-16: 4rem;\n\n  /* === Border Radius === */\n  --bq-radius-none: 0;\n  --bq-radius-sm: 0.25rem;\n  --bq-radius-md: 0.375rem;\n  --bq-radius-lg: 0.5rem;\n  --bq-radius-xl: 0.75rem;\n  --bq-radius-2xl: 1rem;\n  --bq-radius-full: 9999px;\n\n  /* === Shadows === */\n  --bq-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n  --bq-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n  --bq-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n  --bq-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n  --bq-shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06);\n\n  /* === Motion === */\n  --bq-duration-fast: 150ms;\n  --bq-duration-normal: 200ms;\n  --bq-duration-slow: 300ms;\n  --bq-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);\n  --bq-easing-decelerate: cubic-bezier(0, 0, 0.2, 1);\n  --bq-easing-accelerate: cubic-bezier(0.4, 0, 1, 1);\n  --bq-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);\n\n  /* === Z-Index === */\n  --bq-z-base: 0;\n  --bq-z-raised: 10;\n  --bq-z-dropdown: 100;\n  --bq-z-sticky: 200;\n  --bq-z-overlay: 300;\n  --bq-z-modal: 400;\n  --bq-z-popover: 500;\n  --bq-z-toast: 600;\n  --bq-z-tooltip: 700;\n`.trim();\n}\n","/**\n * Dark theme for @bquery/ui\n */\nexport const darkTheme = {\n  name: 'dark',\n  colorScheme: 'dark' as const,\n  tokens: {\n    '--bq-bg-base': '#0f172a',\n    '--bq-bg-subtle': '#1e293b',\n    '--bq-bg-muted': '#334155',\n    '--bq-bg-emphasis': '#475569',\n\n    '--bq-text-base': '#f8fafc',\n    '--bq-text-muted': '#cbd5e1',\n    '--bq-text-subtle': '#94a3b8',\n    '--bq-text-on-primary': '#ffffff',\n    '--bq-text-on-danger': '#ffffff',\n\n    '--bq-border-base': '#334155',\n    '--bq-border-emphasis': '#475569',\n    '--bq-border-focus': '#60a5fa',\n\n    '--bq-focus-ring': '0 0 0 3px rgba(96, 165, 250, 0.35)',\n    '--bq-focus-ring-danger': '0 0 0 3px rgba(248, 113, 113, 0.35)',\n  },\n};\n\n/**\n * Generates the CSS for the dark theme overrides.\n */\nexport function getDarkThemeCSS(): string {\n  return `\n:host([data-theme=\"dark\"]),\n:host-context([data-theme=\"dark\"]) {\n  /* Semantic tokens (dark) */\n  --bq-bg-base: #0f172a;\n  --bq-bg-subtle: #1e293b;\n  --bq-bg-muted: #334155;\n  --bq-bg-emphasis: #475569;\n\n  --bq-text-base: #f8fafc;\n  --bq-text-muted: #cbd5e1;\n  --bq-text-subtle: #94a3b8;\n  --bq-text-on-primary: #ffffff;\n  --bq-text-on-danger: #ffffff;\n\n  --bq-border-base: #334155;\n  --bq-border-emphasis: #475569;\n  --bq-border-focus: #60a5fa;\n\n  --bq-focus-ring: 0 0 0 3px rgba(96, 165, 250, 0.35);\n  --bq-focus-ring-danger: 0 0 0 3px rgba(248, 113, 113, 0.35);\n\n  /* Dark color overrides */\n  --bq-color-primary-600: #3b82f6;\n  --bq-color-primary-700: #2563eb;\n  --bq-color-danger-600: #ef4444;\n  --bq-color-success-600: #22c55e;\n  --bq-color-warning-600: #f59e0b;\n}\n`.trim();\n}\n","import { getTokensCSS } from '../tokens/index.js';\n\n/**\n * Default (light) theme for @bquery/ui\n */\nexport const defaultTheme = {\n  name: 'default',\n  colorScheme: 'light' as const,\n  tokens: {\n    // Semantic color mappings\n    '--bq-bg-base': '#ffffff',\n    '--bq-bg-subtle': '#f8fafc',\n    '--bq-bg-muted': '#f1f5f9',\n    '--bq-bg-emphasis': '#e2e8f0',\n\n    '--bq-text-base': '#0f172a',\n    '--bq-text-muted': '#475569',\n    '--bq-text-subtle': '#94a3b8',\n    '--bq-text-on-primary': '#ffffff',\n    '--bq-text-on-danger': '#ffffff',\n\n    '--bq-border-base': '#e2e8f0',\n    '--bq-border-emphasis': '#cbd5e1',\n    '--bq-border-focus': '#2563eb',\n\n    '--bq-focus-ring': '0 0 0 3px rgba(37, 99, 235, 0.35)',\n    '--bq-focus-ring-danger': '0 0 0 3px rgba(239, 68, 68, 0.35)',\n  },\n};\n\n/**\n * Generates the CSS for the default light theme, including all design tokens.\n */\nexport function getDefaultThemeCSS(): string {\n  return `\n:host {\n  ${getTokensCSS()}\n\n  /* Semantic tokens (light) */\n  --bq-bg-base: #ffffff;\n  --bq-bg-subtle: #f8fafc;\n  --bq-bg-muted: #f1f5f9;\n  --bq-bg-emphasis: #e2e8f0;\n\n  --bq-text-base: #0f172a;\n  --bq-text-muted: #475569;\n  --bq-text-subtle: #94a3b8;\n  --bq-text-on-primary: #ffffff;\n  --bq-text-on-danger: #ffffff;\n\n  --bq-border-base: #e2e8f0;\n  --bq-border-emphasis: #cbd5e1;\n  --bq-border-focus: #2563eb;\n\n  --bq-focus-ring: 0 0 0 3px rgba(37, 99, 235, 0.35);\n  --bq-focus-ring-danger: 0 0 0 3px rgba(239, 68, 68, 0.35);\n}\n`.trim();\n}\n","/**\n * Theme system for @bquery/ui\n */\nexport { darkTheme, getDarkThemeCSS } from './dark.js';\nexport { defaultTheme, getDefaultThemeCSS } from './default.js';\n\nexport type ColorScheme = 'light' | 'dark' | 'auto';\n\nexport interface BqTheme {\n  name: string;\n  colorScheme: 'light' | 'dark';\n  tokens: Record<string, string>;\n}\n\nlet currentTheme: ColorScheme = 'auto';\nlet autoListener: ((e: MediaQueryListEvent) => void) | null = null;\n\nfunction applyAutoScheme(): void {\n  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n  const root = document.documentElement;\n  if (prefersDark) {\n    root.setAttribute('data-theme', 'dark');\n  } else {\n    root.removeAttribute('data-theme');\n  }\n}\n\nfunction cleanupAutoListener(): void {\n  if (autoListener) {\n    window\n      .matchMedia('(prefers-color-scheme: dark)')\n      .removeEventListener('change', autoListener);\n    autoListener = null;\n  }\n}\n\n/**\n * Set the global color scheme. Pass 'auto' to follow the user's OS preference\n * (listens for changes in real time).\n */\nexport function setColorScheme(scheme: ColorScheme): void {\n  cleanupAutoListener();\n  currentTheme = scheme;\n  const root = document.documentElement;\n  if (scheme === 'dark') {\n    root.setAttribute('data-theme', 'dark');\n  } else if (scheme === 'light') {\n    root.removeAttribute('data-theme');\n  } else {\n    applyAutoScheme();\n    autoListener = () => applyAutoScheme();\n    window\n      .matchMedia('(prefers-color-scheme: dark)')\n      .addEventListener('change', autoListener);\n  }\n}\n\n/** Get the current color scheme setting. */\nexport function getColorScheme(): ColorScheme {\n  return currentTheme;\n}\n\n/**\n * Apply custom CSS variable overrides to the document root.\n */\nexport function applyThemeTokens(tokens: Record<string, string>): void {\n  const root = document.documentElement;\n  for (const [key, value] of Object.entries(tokens)) {\n    root.style.setProperty(key, value);\n  }\n}\n","/**\n * English (default) locale strings for @bquery/ui\n */\nexport const en = {\n  common: {\n    close: 'Close',\n    open: 'Open',\n    loading: 'Loading',\n    error: 'Error',\n    success: 'Success',\n    warning: 'Warning',\n    info: 'Information',\n    required: 'Required',\n    optional: 'Optional',\n    clear: 'Clear',\n    search: 'Search',\n    noResults: 'No results found',\n  },\n  dialog: {\n    close: 'Close dialog',\n    confirm: 'Confirm',\n    cancel: 'Cancel',\n    ariaLabel: 'Dialog',\n  },\n  drawer: {\n    close: 'Close drawer',\n  },\n  toast: {\n    close: 'Dismiss notification',\n    success: 'Success',\n    error: 'Error',\n    warning: 'Warning',\n    info: 'Information',\n  },\n  pagination: {\n    prev: 'Previous page',\n    next: 'Next page',\n    page: 'Page',\n    of: 'of',\n    nav: 'Pagination',\n    goToPage: 'Go to page',\n    firstPage: 'First page',\n    lastPage: 'Last page',\n  },\n  input: {\n    showPassword: 'Show password',\n    hidePassword: 'Hide password',\n    clearValue: 'Clear value',\n    characterCount: '{count} of {max} characters',\n  },\n  select: {\n    placeholder: 'Select an option',\n    noOptions: 'No options available',\n    clearSelection: 'Clear selection',\n    openMenu: 'Open menu',\n  },\n  table: {\n    sortAscending: 'Sort ascending',\n    sortDescending: 'Sort descending',\n    noData: 'No data available',\n    loading: 'Loading data…',\n    rowsPerPage: 'Rows per page',\n  },\n  progress: {\n    ariaLabel: 'Progress',\n  },\n  accordion: {\n    expand: 'Expand',\n    collapse: 'Collapse',\n  },\n  tabs: {\n    listLabel: 'Tabs',\n  },\n  slider: {\n    ariaLabel: 'Slider',\n    valueText: 'Value: {value}',\n  },\n  emptyState: {\n    title: 'Nothing here yet',\n    description: 'There is no content to display.',\n  },\n  chip: {\n    remove: 'Remove',\n  },\n  breadcrumbs: {\n    nav: 'Breadcrumb',\n  },\n  iconButton: {\n    defaultLabel: 'Icon button',\n  },\n  dropdownMenu: {\n    open: 'Open menu',\n    close: 'Close menu',\n  },\n  segmentedControl: {\n    defaultLabel: 'Options',\n  },\n} as const;\n\nexport type EnLocale = typeof en;\n","/**\n * i18n / locale system for @bquery/ui\n *\n * Usage:\n *   import { setLocale, t } from '@bquery/ui/i18n';\n *   setLocale({ dialog: { close: 'Schließen' } });\n *   t('dialog.close'); // → 'Schließen'\n */\nimport { en } from './en.js';\n\nexport { en };\nexport type { EnLocale } from './en.js';\n\n/** Deep partial helper for locale overrides */\ntype DeepPartial<T> = {\n  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport type BqLocale = typeof en;\nexport type BqLocaleOverride = DeepPartial<BqLocale>;\n\nfunction cloneLocale<T>(value: T): T {\n  if (Array.isArray(value)) {\n    return value.map((item) => cloneLocale(item)) as T;\n  }\n\n  if (value && typeof value === 'object') {\n    const entries = Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n      key,\n      cloneLocale(item),\n    ]);\n    return Object.fromEntries(entries) as T;\n  }\n\n  return value;\n}\n\nlet _locale: BqLocale = cloneLocale(en);\n\n/**\n * Override locale strings. Merges shallowly at the top level, deeply at the second level.\n */\nexport function setLocale(overrides: BqLocaleOverride): void {\n  _locale = deepMerge(_locale, overrides) as BqLocale;\n}\n\n/** Restores the active locale to the default English locale. */\nexport function resetLocale(): void {\n  _locale = cloneLocale(en);\n}\n\n/** Returns the currently active locale object. */\nexport function getLocale(): BqLocale {\n  return _locale;\n}\n\n/**\n * Translate a dot-notation key, with optional template variable substitution.\n *\n * @example\n *   t('dialog.close')                        // 'Close dialog'\n *   t('input.characterCount', { count: 5, max: 100 })  // '5 of 100 characters'\n */\nexport function t(\n  key: string,\n  vars?: Record<string, string | number>,\n): string {\n  const parts = key.split('.');\n  let value: unknown = _locale;\n  for (const part of parts) {\n    if (value == null || typeof value !== 'object') return key;\n    value = (value as Record<string, unknown>)[part];\n  }\n  if (typeof value !== 'string') return key;\n  if (!vars) return value;\n  return value.replace(/\\{(\\w+)\\}/g, (_: string, k: string) =>\n    vars[k] !== undefined ? String(vars[k]) : `{${k}}`,\n  );\n}\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction deepMerge<T extends object>(base: T, overrides: DeepPartial<T>): T {\n  const result = { ...base } as T;\n  for (const key in overrides) {\n    const k = key as keyof T;\n    const ov = overrides[k];\n    if (ov !== undefined) {\n      if (\n        typeof ov === 'object' &&\n        !Array.isArray(ov) &&\n        typeof base[k] === 'object' &&\n        !Array.isArray(base[k])\n      ) {\n        (result as Record<keyof T, unknown>)[k] = deepMerge(\n          base[k] as object,\n          ov as DeepPartial<object>,\n        );\n      } else {\n        (result as Record<keyof T, unknown>)[k] = ov as T[keyof T];\n      }\n    }\n  }\n  return result;\n}\n","/**\n * DOM utility helpers for @bquery/ui components.\n */\n\n/** Dispatch a custom event from a host element with bubbles + composed. */\nexport function dispatch<T = unknown>(\n  element: HTMLElement,\n  name: string,\n  detail?: T,\n  options?: Partial<CustomEventInit<T>>\n): boolean {\n  const init: CustomEventInit<T> = {\n    bubbles: true,\n    composed: true,\n    cancelable: true,\n    ...options,\n  };\n  // Only set detail when provided to respect exactOptionalPropertyTypes\n  if (detail !== undefined) {\n    init.detail = detail;\n  }\n  return element.dispatchEvent(new CustomEvent<T>(name, init));\n}\n\n/** Query a slot's assigned elements (flattened). */\nexport function getSlotted(shadow: ShadowRoot, slotName?: string): Element[] {\n  const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n  const slot = shadow.querySelector<HTMLSlotElement>(selector);\n  return slot ? slot.assignedElements({ flatten: true }) : [];\n}\n\n/** Returns true if element is focusable. */\nexport function isFocusable(el: Element): el is HTMLElement {\n  if (!(el instanceof HTMLElement)) return false;\n  if ((el as HTMLElement & { disabled?: boolean }).disabled) return false;\n  if (el.getAttribute('tabindex') === '-1') return false;\n  const style = window.getComputedStyle(el);\n  if (style.display === 'none' || style.visibility === 'hidden') return false;\n  return true;\n}\n\n/** Get all focusable descendants within a container. */\nexport function getFocusableElements(container: Element): HTMLElement[] {\n  const candidates = Array.from(\n    container.querySelectorAll<HTMLElement>(\n      'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]), details > summary'\n    )\n  );\n  return candidates.filter(isFocusable);\n}\n\n/** Trap focus within a container element. Returns a cleanup function. */\nexport function trapFocus(container: HTMLElement): () => void {\n  const handleKeyDown = (e: KeyboardEvent) => {\n    if (e.key !== 'Tab') return;\n    const focusable = getFocusableElements(container);\n    if (focusable.length === 0) {\n      e.preventDefault();\n      return;\n    }\n    const first = focusable[0];\n    const last = focusable[focusable.length - 1];\n    if (!first || !last) return;\n\n    if (e.shiftKey) {\n      if (document.activeElement === first) {\n        e.preventDefault();\n        last.focus();\n      }\n    } else {\n      if (document.activeElement === last) {\n        e.preventDefault();\n        first.focus();\n      }\n    }\n  };\n  container.addEventListener('keydown', handleKeyDown);\n  return () => container.removeEventListener('keydown', handleKeyDown);\n}\n\n/** Generate a unique element ID. */\nlet _counter = 0;\nexport function uniqueId(prefix = 'bq'): string {\n  return `${prefix}-${++_counter}`;\n}\n\nfunction parseTimeValueToMs(value: string): number {\n  const trimmed = value.trim();\n  if (!trimmed) return 0;\n  if (trimmed.endsWith('ms')) return Number.parseFloat(trimmed);\n  if (trimmed.endsWith('s')) return Number.parseFloat(trimmed) * 1000;\n  return Number.parseFloat(trimmed) || 0;\n}\n\nexport function getAnimationTimeoutMs(\n  el: Element,\n  fallbackDuration = '0ms'\n): number {\n  const fallbackMs = parseTimeValueToMs(fallbackDuration);\n  const view = el.ownerDocument.defaultView;\n  if (!view?.getComputedStyle) return fallbackMs;\n\n  const styles = view.getComputedStyle(el);\n  const animationDuration = styles.animationDuration || '';\n  const animationDelay = styles.animationDelay || '';\n  const animationName = styles.animationName || '';\n  const durationValues = animationDuration.split(',');\n  const delayValues = animationDelay.split(',');\n  const hasTimingValues =\n    durationValues.some((value) => value.trim() !== '') ||\n    delayValues.some((value) => value.trim() !== '');\n  const hasRealAnimationName = animationName.split(',').some((name) => {\n    const trimmed = name.trim();\n    return trimmed !== '' && trimmed !== 'none';\n  });\n\n  if (!hasTimingValues) return fallbackMs;\n\n  const durations = durationValues.map((value) => parseTimeValueToMs(value));\n  const delays = delayValues.map((value) => parseTimeValueToMs(value));\n  const count = Math.max(durations.length, delays.length);\n\n  let longest = 0;\n  for (let i = 0; i < count; i += 1) {\n    const duration = durations[i] ?? durations[durations.length - 1] ?? 0;\n    const delay = delays[i] ?? delays[delays.length - 1] ?? 0;\n    longest = Math.max(longest, duration + delay);\n  }\n\n  if (!hasRealAnimationName) return fallbackMs;\n  return longest;\n}\n\n/**\n * Manages focus trapping, initial focus, and focus restoration for overlay\n * components (Dialog, Drawer). Call from `updated()`.\n */\nexport interface OverlayFocusState {\n  _wasOpen?: boolean;\n  _previousFocus?: HTMLElement | null;\n  _focusRaf?: number;\n  _releaseFocus?: () => void;\n}\n\nexport function updateOverlayFocus(\n  host: HTMLElement,\n  state: OverlayFocusState,\n  panelSelector: string\n): void {\n  const wasOpen = state._wasOpen === true;\n  const isOpen = host.hasAttribute('open');\n\n  if (isOpen && !wasOpen) {\n    state._wasOpen = true;\n    if (!state._previousFocus) {\n      state._previousFocus = document.activeElement as HTMLElement | null;\n    }\n    const panel = host.shadowRoot?.querySelector(\n      panelSelector\n    ) as HTMLElement | null;\n    if (panel) {\n      state._releaseFocus?.();\n      state._releaseFocus = trapFocus(panel);\n      if (state._focusRaf !== undefined) cancelAnimationFrame(state._focusRaf);\n      state._focusRaf = requestAnimationFrame(() => {\n        delete state._focusRaf;\n        if (!host.hasAttribute('open') || !host.isConnected) return;\n        const focusable = panel.querySelector<HTMLElement>(\n          'button, a[href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n        );\n        (focusable ?? panel).focus();\n      });\n    }\n  } else if (!isOpen && wasOpen) {\n    state._wasOpen = false;\n    if (state._focusRaf !== undefined) cancelAnimationFrame(state._focusRaf);\n    delete state._focusRaf;\n    state._releaseFocus?.();\n    delete state._releaseFocus;\n    const prev = state._previousFocus;\n    if (prev && typeof prev.focus === 'function') {\n      prev.focus();\n    }\n    delete state._previousFocus;\n  } else if (!isOpen) {\n    state._wasOpen = false;\n  }\n}\n\nexport function cleanupOverlayFocus(state: OverlayFocusState): void {\n  if (state._focusRaf !== undefined) cancelAnimationFrame(state._focusRaf);\n  state._releaseFocus?.();\n  const prev = state._previousFocus;\n  if (prev && typeof prev.focus === 'function') prev.focus();\n  delete state._previousFocus;\n  delete state._wasOpen;\n  delete state._focusRaf;\n  delete state._releaseFocus;\n}\n","/**\n * Form participation utility for custom elements.\n *\n * Since @bquery/bquery does not support `static formAssociated = true`,\n * this module provides a hidden-input proxy pattern that allows custom\n * elements to participate in native `<form>` submission.\n */\n\nexport type FormProxy = {\n  /** Update the proxied form value */\n  setValue(value: string): void;\n  /** Update the proxied name attribute */\n  setName(name: string): void;\n  /** Enable or disable the proxy */\n  setDisabled(disabled: boolean): void;\n  /** Remove the proxy from the DOM */\n  cleanup(): void;\n};\n\n/**\n * Creates a hidden `<input type=\"hidden\">` in the light DOM immediately\n * after the host element. The hidden input mirrors name/value/disabled\n * so that the custom element data is included in native form submission.\n */\nexport function createFormProxy(\n  host: HTMLElement,\n  name: string,\n  value: string,\n  disabled = false\n): FormProxy {\n  const input = document.createElement('input');\n  input.type = 'hidden';\n  input.name = name;\n  input.value = value;\n  input.disabled = disabled;\n  input.setAttribute('data-bq-form-proxy', '');\n\n  host.insertAdjacentElement('afterend', input);\n\n  return {\n    setValue(v: string) {\n      input.value = v;\n    },\n    setName(n: string) {\n      input.name = n;\n    },\n    setDisabled(d: boolean) {\n      input.disabled = d;\n    },\n    cleanup() {\n      input.remove();\n    },\n  };\n}\n","/**\n * Shared style utilities – generates inline CSS strings for use in Shadow DOM.\n */\nimport { getDefaultThemeCSS } from '../theme/default.js';\nimport { getDarkThemeCSS } from '../theme/dark.js';\n\n/** Returns the full theme + token CSS block suitable for embedding in a :host style block. */\nexport function getBaseStyles(): string {\n  return `${getDefaultThemeCSS()}\\n${getDarkThemeCSS()}`;\n}\n\n/** Focus-visible outline using the CSS custom property --bq-focus-ring. */\nexport const focusVisibleStyles = `\n  :host(:focus-within) *:focus-visible,\n  *:focus-visible {\n    outline: 2px solid transparent;\n    outline-offset: 2px;\n    box-shadow: var(--bq-focus-ring, 0 0 0 3px rgba(37, 99, 235, 0.35));\n  }\n`;\n\n/** Visually-hidden utility for screen-reader-only text. */\nexport const srOnlyStyles = `\n  .sr-only {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip: rect(0, 0, 0, 0);\n    white-space: nowrap;\n    border-width: 0;\n  }\n`;\n","var T = \"bquery-sanitizer\", U = /* @__PURE__ */ new Set([\n  \"a\",\n  \"abbr\",\n  \"address\",\n  \"article\",\n  \"aside\",\n  \"b\",\n  \"bdi\",\n  \"bdo\",\n  \"blockquote\",\n  \"br\",\n  \"button\",\n  \"caption\",\n  \"cite\",\n  \"code\",\n  \"col\",\n  \"colgroup\",\n  \"data\",\n  \"dd\",\n  \"del\",\n  \"details\",\n  \"dfn\",\n  \"div\",\n  \"dl\",\n  \"dt\",\n  \"em\",\n  \"figcaption\",\n  \"figure\",\n  \"footer\",\n  \"form\",\n  \"h1\",\n  \"h2\",\n  \"h3\",\n  \"h4\",\n  \"h5\",\n  \"h6\",\n  \"header\",\n  \"hgroup\",\n  \"hr\",\n  \"i\",\n  \"img\",\n  \"input\",\n  \"ins\",\n  \"kbd\",\n  \"label\",\n  \"legend\",\n  \"li\",\n  \"main\",\n  \"mark\",\n  \"nav\",\n  \"ol\",\n  \"optgroup\",\n  \"option\",\n  \"p\",\n  \"picture\",\n  \"pre\",\n  \"progress\",\n  \"q\",\n  \"rp\",\n  \"rt\",\n  \"ruby\",\n  \"s\",\n  \"samp\",\n  \"section\",\n  \"select\",\n  \"small\",\n  \"source\",\n  \"span\",\n  \"strong\",\n  \"sub\",\n  \"summary\",\n  \"sup\",\n  \"table\",\n  \"tbody\",\n  \"td\",\n  \"textarea\",\n  \"tfoot\",\n  \"th\",\n  \"thead\",\n  \"time\",\n  \"tr\",\n  \"u\",\n  \"ul\",\n  \"var\",\n  \"wbr\"\n]), S = /* @__PURE__ */ new Set([\n  \"script\",\n  \"iframe\",\n  \"frame\",\n  \"frameset\",\n  \"object\",\n  \"embed\",\n  \"applet\",\n  \"link\",\n  \"meta\",\n  \"style\",\n  \"base\",\n  \"template\",\n  \"math\",\n  \"svg\",\n  \"foreignobject\",\n  \"noscript\"\n]), O = /* @__PURE__ */ new Set([\n  \"document\",\n  \"window\",\n  \"location\",\n  \"top\",\n  \"self\",\n  \"parent\",\n  \"frames\",\n  \"history\",\n  \"navigator\",\n  \"screen\",\n  \"alert\",\n  \"confirm\",\n  \"prompt\",\n  \"eval\",\n  \"function\",\n  \"cookie\",\n  \"domain\",\n  \"referrer\",\n  \"body\",\n  \"head\",\n  \"forms\",\n  \"images\",\n  \"links\",\n  \"scripts\",\n  \"children\",\n  \"parentnode\",\n  \"firstchild\",\n  \"lastchild\",\n  \"innerhtml\",\n  \"outerhtml\",\n  \"textcontent\"\n]), F = /* @__PURE__ */ new Set([\n  \"alt\",\n  \"class\",\n  \"dir\",\n  \"height\",\n  \"hidden\",\n  \"href\",\n  \"id\",\n  \"lang\",\n  \"loading\",\n  \"name\",\n  \"rel\",\n  \"role\",\n  \"src\",\n  \"srcset\",\n  \"tabindex\",\n  \"target\",\n  \"title\",\n  \"type\",\n  \"width\",\n  \"aria-*\"\n]), W = [\n  \"on\",\n  \"formaction\",\n  \"xlink:\",\n  \"xmlns:\"\n], k = [\n  \"javascript:\",\n  \"data:\",\n  \"vbscript:\",\n  \"file:\"\n], z = (e, t, r) => {\n  const a = e.toLowerCase();\n  for (const l of W) if (a.startsWith(l)) return !1;\n  return r && a.startsWith(\"data-\") || a.startsWith(\"aria-\") ? !0 : t.has(a);\n}, M = (e) => {\n  const t = e.toLowerCase().trim();\n  return !O.has(t);\n}, P = (e) => e.replace(/[\\u0000-\\u001F\\u007F]+/g, \"\").replace(/[\\u200B-\\u200D\\uFEFF\\u2028\\u2029]+/g, \"\").replace(/\\\\u[\\da-fA-F]{4}/g, \"\").replace(/\\s+/g, \"\").toLowerCase(), L = (e) => {\n  const t = P(e);\n  for (const r of k) if (t.startsWith(r)) return !1;\n  return !0;\n}, q = (e) => {\n  const t = e.split(\",\");\n  for (const r of t) {\n    const a = r.trim().split(/\\s+/)[0];\n    if (a && !L(a)) return !1;\n  }\n  return !0;\n}, I = (e) => {\n  try {\n    const t = e.trim();\n    if (t.startsWith(\"//\")) return !0;\n    const r = t.toLowerCase();\n    return /^[a-z][a-z0-9+.-]*:/i.test(t) && !r.startsWith(\"http://\") && !r.startsWith(\"https://\") ? !0 : !r.startsWith(\"http://\") && !r.startsWith(\"https://\") ? !1 : typeof window > \"u\" || !window.location ? !0 : new URL(t, window.location.href).origin !== window.location.origin;\n  } catch {\n    return !0;\n  }\n}, V = (e) => new DOMParser().parseFromString(e, \"text/html\"), A = (e) => {\n  const t = (typeof e == \"string\" ? e : String(e ?? \"\")).trim(), r = document.createDocumentFragment();\n  if (t.length === 0) return r;\n  if (!(t.includes(\"<\") || t.includes(\">\")))\n    return r.appendChild(document.createTextNode(t)), r;\n  const a = V(t).body;\n  if (!a) return r;\n  for (; a.firstChild; ) r.appendChild(a.firstChild);\n  return r;\n}, f = (e, t = {}) => {\n  const { allowTags: r = [], allowAttributes: a = [], allowDataAttributes: l = !0, stripAllTags: x = !1 } = t, H = new Set([...U, ...r.map((n) => n.toLowerCase())].filter((n) => !S.has(n))), _ = /* @__PURE__ */ new Set([...F, ...a.map((n) => n.toLowerCase())]), c = A(e);\n  if (x) return c.textContent ?? \"\";\n  const g = document.createTreeWalker(c, NodeFilter.SHOW_ELEMENT), p = [];\n  for (; g.nextNode(); ) {\n    const n = g.currentNode, i = n.tagName.toLowerCase();\n    if (S.has(i)) {\n      p.push(n);\n      continue;\n    }\n    if (!H.has(i)) {\n      p.push(n);\n      continue;\n    }\n    const u = [];\n    for (const o of Array.from(n.attributes)) {\n      const s = o.name.toLowerCase();\n      if (!z(s, _, l)) {\n        u.push(o.name);\n        continue;\n      }\n      if ((s === \"id\" || s === \"name\") && !M(o.value)) {\n        u.push(o.name);\n        continue;\n      }\n      if ((s === \"href\" || s === \"src\" || s === \"action\") && !L(o.value)) {\n        u.push(o.name);\n        continue;\n      }\n      s === \"srcset\" && !q(o.value) && u.push(o.name);\n    }\n    for (const o of u) n.removeAttribute(o);\n    if (i === \"a\") {\n      const o = n.getAttribute(\"href\"), s = n.getAttribute(\"target\")?.toLowerCase() === \"_blank\", D = o && I(o);\n      if (s || D) {\n        const y = n.getAttribute(\"rel\"), m = new Set(y ? y.split(/\\s+/).filter(Boolean) : []);\n        m.add(\"noopener\"), m.add(\"noreferrer\"), n.setAttribute(\"rel\", Array.from(m).join(\" \"));\n      }\n    }\n  }\n  for (const n of p) n.remove();\n  const w = (n) => {\n    const i = document.createElement(\"div\");\n    return i.appendChild(n.cloneNode(!0)), i.innerHTML;\n  }, b = w(c), v = w(A(b));\n  return b !== v ? c.textContent ?? \"\" : v;\n}, R = /* @__PURE__ */ Symbol(\"bquery.trusted-html.brand\"), h = /* @__PURE__ */ Symbol(\"bquery.trusted-html\"), j = (e) => e, B = (e) => {\n  const t = String(e);\n  return Object.freeze({\n    [R]: !0,\n    [h]: t,\n    toString: () => t\n  });\n}, $ = (e) => typeof e == \"object\" && e !== null && R in e && h in e, X = (e) => e[h], E = 1024, C = 8192, K = (e = 16) => {\n  if (!Number.isInteger(e) || e < 1) throw new RangeError(\"generateNonce length must be a positive integer\");\n  if (e > E) throw new RangeError(`generateNonce length must not exceed ${E}`);\n  if (typeof globalThis.crypto > \"u\" || typeof globalThis.crypto.getRandomValues != \"function\") throw new Error(\"generateNonce requires crypto.getRandomValues (not available in this environment)\");\n  if (typeof globalThis.btoa != \"function\") throw new Error(\"generateNonce requires btoa (not available in this environment)\");\n  const t = new Uint8Array(e);\n  globalThis.crypto.getRandomValues(t);\n  let r = \"\";\n  for (let a = 0; a < t.length; a += C) {\n    const l = t.subarray(a, Math.min(a + C, t.length));\n    r += String.fromCharCode(...l);\n  }\n  return globalThis.btoa(r).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}, Q = (e) => {\n  if (typeof document > \"u\") return !1;\n  const t = document.querySelector('meta[http-equiv=\"Content-Security-Policy\"]');\n  return t ? (t.getAttribute(\"content\") ?? \"\").includes(e) : !1;\n}, d = null, N = !1, Y = () => typeof window < \"u\" && typeof window.trustedTypes < \"u\", G = () => {\n  if (d) return d;\n  if (N || typeof window > \"u\") return null;\n  const e = window;\n  if (!e.trustedTypes) return null;\n  N = !0;\n  try {\n    return d = e.trustedTypes.createPolicy(T, { createHTML: (t) => f(t) }), d;\n  } catch (t) {\n    const r = t instanceof Error ? t.message : String(t);\n    return console.warn(`bQuery: Could not create Trusted Types policy \"${T}\": ${r}`), null;\n  }\n}, Z = (e) => {\n  const t = G();\n  return t ? t.createHTML(e) : f(e);\n}, J = (e, t = {}) => j(f(e, t)), ee = (e) => {\n  const t = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': \"&quot;\",\n    \"'\": \"&#x27;\",\n    \"`\": \"&#x60;\"\n  };\n  return e.replace(/[&<>\"'`]/g, (r) => t[r]);\n}, te = (e) => f(e, { stripAllTags: !0 });\nexport {\n  G as a,\n  Q as c,\n  B as d,\n  X as f,\n  Z as i,\n  $ as l,\n  J as n,\n  Y as o,\n  te as r,\n  K as s,\n  ee as t,\n  j as u\n};\n\n//# sourceMappingURL=sanitize-Bs2dkMby.js.map","var a = [], s = 0, i = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new WeakMap(), f = (e, r) => {\n  a.push(e);\n  try {\n    return r();\n  } finally {\n    a.pop();\n  }\n}, p = () => a[a.length - 1], d = (e) => {\n  a.push(void 0);\n  try {\n    return e();\n  } finally {\n    a.pop();\n  }\n}, b = (e) => {\n  if (s > 0) {\n    i.add(e);\n    return;\n  }\n  e();\n}, l = () => {\n  for (const e of Array.from(i)) {\n    i.delete(e);\n    try {\n      e();\n    } catch (r) {\n      console.error(\"bQuery reactive: Error in observer during batch flush\", r);\n    }\n  }\n}, h = () => {\n  s += 1;\n}, y = () => {\n  s <= 0 || (s -= 1, s === 0 && l());\n}, g = (e, r) => {\n  let t = c.get(e);\n  t || (t = /* @__PURE__ */ new Set(), c.set(e, t)), t.add(r);\n}, D = (e, r) => {\n  const t = c.get(e);\n  t && t.delete(r);\n}, u = (e) => {\n  const r = c.get(e);\n  if (r) {\n    for (const t of r) t.unsubscribe(e);\n    r.clear();\n  }\n}, O = (e) => {\n  let r, t = !1;\n  const v = () => {\n    if (r) {\n      try {\n        r();\n      } catch (o) {\n        console.error(\"bQuery reactive: Error in effect cleanup\", o);\n      }\n      r = void 0;\n    }\n  }, n = () => {\n    if (!t) {\n      v(), u(n);\n      try {\n        r = f(n, e);\n      } catch (o) {\n        console.error(\"bQuery reactive: Error in effect\", o);\n      }\n    }\n  };\n  return n(), () => {\n    t = !0, v(), u(n);\n  };\n};\nexport {\n  p as a,\n  b as c,\n  y as i,\n  f as l,\n  h as n,\n  g as o,\n  u as r,\n  D as s,\n  O as t,\n  d as u\n};\n\n//# sourceMappingURL=effect-AFRW_Plg.js.map","function c(t) {\n  return Object.prototype.toString.call(t) === \"[object Object]\";\n}\nfunction s(t) {\n  return t === \"__proto__\" || t === \"constructor\" || t === \"prototype\";\n}\nfunction i(t) {\n  return typeof structuredClone == \"function\" ? structuredClone(t) : JSON.parse(JSON.stringify(t));\n}\nfunction u(...t) {\n  const o = {};\n  for (const r of t) for (const [n, e] of Object.entries(r))\n    s(n) || (c(e) && c(o[n]) ? o[n] = u(o[n], e) : o[n] = e);\n  return o;\n}\nfunction f(t, o) {\n  const r = {};\n  for (const n of o) n in t && (r[n] = t[n]);\n  return r;\n}\nfunction l(t, o) {\n  const r = { ...t };\n  for (const n of o) delete r[n];\n  return r;\n}\nfunction a(t, o) {\n  return Object.prototype.hasOwnProperty.call(t, o);\n}\nexport {\n  l as a,\n  u as i,\n  a as n,\n  f as o,\n  c as r,\n  i as t\n};\n\n//# sourceMappingURL=object-qGpWr6-J.js.map","import { i as o, r as f } from \"./object-qGpWr6-J.js\";\nvar s = {\n  fetch: {\n    headers: {},\n    parseAs: \"json\"\n  },\n  cookies: {\n    path: \"/\",\n    sameSite: \"Lax\",\n    secure: !1\n  },\n  announcer: {\n    politeness: \"polite\",\n    atomic: !0,\n    delay: 16,\n    clearDelay: 1e3\n  },\n  pageMeta: {},\n  transitions: {\n    skipOnReducedMotion: !1,\n    classes: [],\n    types: []\n  },\n  components: { prefix: \"bq\" }\n}, r = (e) => {\n  if (typeof Headers < \"u\" && e instanceof Headers) return new Headers(e);\n  if (Array.isArray(e)) return e.map((n) => r(n));\n  if (f(e)) {\n    const n = {};\n    for (const [a, i] of Object.entries(e)) n[a] = r(i);\n    return n;\n  }\n  return e;\n}, t = r(s), d = (e) => (t = r(o(s, t, e)), c()), c = () => r(t);\nexport {\n  c as n,\n  d as t\n};\n\n//# sourceMappingURL=config-DRmZZno3.js.map","import { u as t } from \"./effect-AFRW_Plg.js\";\nvar e = (r) => t(r);\nexport {\n  e as t\n};\n\n//# sourceMappingURL=untrack-B0rVscTc.js.map","import { f as A, l as q, n as z, t as _, u as M } from \"./sanitize-Bs2dkMby.js\";\nimport { t as O } from \"./effect-AFRW_Plg.js\";\nimport { n as B } from \"./config-DRmZZno3.js\";\nimport { t as E } from \"./untrack-B0rVscTc.js\";\nvar H = (r, t) => {\n  const { type: a } = t;\n  if (a === String) return r;\n  if (a === Number) return Number(r);\n  if (a === Boolean) {\n    const e = r.trim().toLowerCase();\n    return e === \"\" || e === \"true\" || e === \"1\" ? !0 : e === \"false\" || e === \"0\" ? !1 : !!r;\n  }\n  if (a === Object || a === Array) try {\n    return JSON.parse(r);\n  } catch {\n    return r;\n  }\n  if (typeof a == \"function\") {\n    const e = a, n = a;\n    if (t.construct === !0) return Reflect.construct(n, [r]);\n    if (t.construct === !1) return e(r);\n    const l = a.prototype !== void 0 && a.prototype !== null, x = (l ? Object.getOwnPropertyNames(a.prototype) : []).length > 1, s = l && a.prototype.constructor !== a, i = /^class\\s/.test(Function.prototype.toString.call(a));\n    if (x || s || i) try {\n      return Reflect.construct(n, [r]);\n    } catch {\n      return e(r);\n    }\n    try {\n      const o = e(r);\n      if (o === void 0 && l) try {\n        return Reflect.construct(n, [r]);\n      } catch {\n        return o;\n      }\n      return o;\n    } catch (o) {\n      if (o instanceof TypeError && /cannot be invoked without 'new'|is not a function/i.test(o.message)) return Reflect.construct(n, [r]);\n      throw o;\n    }\n  }\n  return r;\n}, L = [\"slot\"], I = [\n  \"part\",\n  \"disabled\",\n  \"checked\",\n  \"placeholder\",\n  \"value\",\n  \"rows\",\n  \"cols\",\n  \"readonly\",\n  \"required\",\n  \"maxlength\",\n  \"minlength\",\n  \"max\",\n  \"min\",\n  \"step\",\n  \"pattern\",\n  \"autocomplete\",\n  \"autofocus\",\n  \"for\",\n  \"multiple\",\n  \"selected\",\n  \"wrap\"\n], S = (r, t) => {\n  const a = [...L, ...t.sanitize?.allowTags ?? []], e = [...I, ...t.sanitize?.allowAttributes ?? []], n = Object.values(t.signals ?? {});\n  class l extends HTMLElement {\n    constructor() {\n      super(), this.state = { ...t.state ?? {} }, this.props = {}, this.missingRequiredProps = /* @__PURE__ */ new Set(), this.hasMounted = !1, this.attachShadow({ mode: \"open\" }), this.syncProps();\n    }\n    static get observedAttributes() {\n      return Object.keys(t.props ?? {});\n    }\n    connectedCallback() {\n      try {\n        if (!this.hasMounted && this.missingRequiredProps.size > 0) return;\n        if (this.hasMounted) {\n          try {\n            t.connected?.call(this);\n          } catch (s) {\n            this.handleError(s);\n          }\n          this.setupSignalSubscriptions(!0);\n          return;\n        }\n        this.mount();\n      } catch (s) {\n        this.handleError(s);\n      }\n    }\n    mount() {\n      this.hasMounted || (t.beforeMount?.call(this), t.connected?.call(this), this.render(), this.setupSignalSubscriptions(), this.hasMounted = !0);\n    }\n    disconnectedCallback() {\n      try {\n        this.signalEffectCleanup?.(), this.signalEffectCleanup = void 0, t.disconnected?.call(this);\n      } catch (s) {\n        this.handleError(s);\n      }\n    }\n    attributeChangedCallback(s, i, o) {\n      try {\n        const u = this.cloneProps();\n        this.syncProps(), this.hasMounted ? this.render(!0, u, {\n          name: s,\n          oldValue: i,\n          newValue: o\n        }) : this.isConnected && this.missingRequiredProps.size === 0 && this.mount();\n      } catch (u) {\n        this.handleError(u);\n      }\n    }\n    handleError(s) {\n      t.onError ? t.onError.call(this, s) : console.error(`bQuery component error in <${r}>:`, s);\n    }\n    setState(s, i) {\n      this.state[s] = i, this.render(!0, this.cloneProps(), void 0, !1);\n    }\n    getState(s) {\n      return this.state[s];\n    }\n    setupSignalSubscriptions(s = !1) {\n      if (this.signalEffectCleanup || n.length === 0) return;\n      let i = !0;\n      this.signalEffectCleanup = O(() => {\n        try {\n          for (const u of n) u.value;\n          if (i) {\n            if (i = !1, s && this.hasMounted && this.isConnected) {\n              const u = this.cloneProps();\n              E(() => {\n                this.render(!0, u, void 0, !1);\n              });\n            }\n            return;\n          }\n          if (!this.hasMounted || !this.isConnected) return;\n          const o = this.cloneProps();\n          E(() => {\n            this.render(!0, o, void 0, !1);\n          });\n        } catch (o) {\n          this.handleError(o);\n        }\n      });\n    }\n    syncProps() {\n      const s = t.props ?? {};\n      for (const [i, o] of Object.entries(s)) {\n        const u = this.getAttribute(i);\n        let d;\n        if (u == null ? o.required && o.default === void 0 ? (this.missingRequiredProps.add(i), d = void 0) : d = o.default ?? void 0 : (this.missingRequiredProps.has(i) && this.missingRequiredProps.delete(i), d = H(u, o)), o.validator && d !== void 0 && !o.validator(d))\n          throw new Error(`bQuery component: validation failed for prop \"${i}\" with value ${JSON.stringify(d)}`);\n        this.props[i] = d;\n      }\n    }\n    cloneProps() {\n      return { ...this.props };\n    }\n    render(s = !1, i, o, u = !0) {\n      try {\n        if (s && u && t.beforeUpdate) {\n          if (!i) throw new Error(\"bQuery component: previous props are required for update renders\");\n          if (t.beforeUpdate.call(this, this.props, i) === !1) return;\n        }\n        const d = (h, T) => {\n          this.dispatchEvent(new CustomEvent(h, {\n            detail: T,\n            bubbles: !0,\n            composed: !0\n          }));\n        };\n        if (!this.shadowRoot) return;\n        const R = z(t.render({\n          props: this.props,\n          state: this.state,\n          signals: t.signals ?? {},\n          emit: d\n        }), {\n          allowTags: a,\n          allowAttributes: e\n        });\n        let m = null;\n        if (t.styles && (m = this.shadowRoot.querySelector(\"style[data-bquery-component-style]\")), this.shadowRoot.innerHTML = R, t.styles) {\n          const h = m ?? document.createElement(\"style\");\n          m || h.setAttribute(\"data-bquery-component-style\", \"\"), h.textContent = t.styles, this.shadowRoot.prepend(h);\n        }\n        s && t.updated?.call(this, o);\n      } catch (d) {\n        this.handleError(d);\n      }\n    }\n  }\n  return l;\n};\nfunction K(r, t) {\n  return S(r, t);\n}\nfunction f(r, t) {\n  const a = S(r, t);\n  customElements.get(r) || customElements.define(r, a);\n}\nvar k = /* @__PURE__ */ Symbol(\"bquery.booleanAttribute\"), N = /^[^\\0-\\x20\"'/>=]+$/, C = (r) => {\n  if (typeof r != \"object\" || r === null) return !1;\n  const t = r;\n  return t[k] === !0 && typeof t.enabled == \"boolean\" && typeof t.name == \"string\";\n}, w = (r) => C(r) ? r.enabled ? r.name : \"\" : String(r ?? \"\"), j = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#x27;\",\n  \"`\": \"&#x60;\"\n}, P = (r) => C(r) ? r.enabled ? r.name : \"\" : w(r).replace(/[&<>\"'`]/g, (t) => j[t]), Y = (r, t) => {\n  if (!N.test(r)) throw new TypeError(`Invalid boolean attribute name: ${r}`);\n  const a = {\n    [k]: !0,\n    enabled: !!t,\n    name: r\n  };\n  return Object.freeze(a);\n}, p = (r, ...t) => r.reduce((a, e, n) => `${a}${e}${w(t[n])}`, \"\"), X = (r, ...t) => {\n  const a = (e) => q(e) ? A(e) : P(e);\n  return M(r.reduce((e, n, l) => `${e}${n}${l < t.length ? a(t[l]) : \"\"}`, \"\"));\n}, b = `\n  :host {\n    color: inherit;\n    font: inherit;\n  }\n`, $ = `\n  ${b}\n  .field {\n    display: inline-flex;\n    flex-direction: column;\n    gap: 0.375rem;\n    width: 100%;\n  }\n  .label {\n    color: #334155;\n    font-size: 0.875rem;\n    font-weight: 600;\n  }\n  .control {\n    border: 1px solid #cbd5e1;\n    border-radius: 0.75rem;\n    box-sizing: border-box;\n    font: inherit;\n    min-height: 2.75rem;\n    outline: none;\n    padding: 0.75rem 0.875rem;\n    width: 100%;\n    background: #fff;\n    color: #0f172a;\n    transition: border-color 160ms ease, box-shadow 160ms ease;\n  }\n  .control:focus {\n    border-color: #2563eb;\n    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);\n  }\n  .control:disabled {\n    background: #f8fafc;\n    color: #94a3b8;\n    cursor: not-allowed;\n  }\n`, c = (r) => _(r), v = /* @__PURE__ */ new WeakMap(), y = (r, t) => v.get(r)?.[t], g = (r, t, a) => {\n  const e = v.get(r) ?? {};\n  e[t] = a, v.set(r, e);\n}, U = (r, t, a) => {\n  if (a.label !== t.label || a.type !== t.type || a.placeholder !== t.placeholder || a.name !== t.name || a.disabled !== t.disabled) return !1;\n  const e = r.shadowRoot?.querySelector(\"input.control\");\n  return e ? (e.value !== t.value && (e.value = t.value), !0) : !1;\n}, Q = (r, t, a) => {\n  if (a.label !== t.label || a.placeholder !== t.placeholder || a.name !== t.name || a.rows !== t.rows || a.disabled !== t.disabled) return !1;\n  const e = r.shadowRoot?.querySelector(\"textarea.control\");\n  return e ? (e.value !== t.value && (e.value = t.value), !0) : !1;\n}, D = (r) => [\n  \"<textarea\",\n  ' part=\"control\"',\n  ' class=\"control\"',\n  ` placeholder=\"${c(r.placeholder)}\"`,\n  ` name=\"${c(r.name)}\"`,\n  ` rows=\"${r.rows}\"`,\n  r.disabled ? \" disabled\" : \"\",\n  `>${c(r.value)}</textarea>`\n].join(\"\"), Z = (r = {}) => {\n  const t = r.prefix ?? B().components?.prefix ?? \"bq\", a = {\n    button: `${t}-button`,\n    card: `${t}-card`,\n    input: `${t}-input`,\n    textarea: `${t}-textarea`,\n    checkbox: `${t}-checkbox`\n  };\n  return f(a.button, {\n    props: {\n      label: {\n        type: String,\n        default: \"\"\n      },\n      variant: {\n        type: String,\n        default: \"primary\"\n      },\n      size: {\n        type: String,\n        default: \"md\"\n      },\n      type: {\n        type: String,\n        default: \"button\"\n      },\n      disabled: {\n        type: Boolean,\n        default: !1\n      }\n    },\n    styles: `\n      ${b}\n      button {\n        appearance: none;\n        border: 0;\n        border-radius: 999px;\n        cursor: pointer;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        font: inherit;\n        font-weight: 600;\n        gap: 0.5rem;\n        min-height: 2.5rem;\n        padding: 0.65rem 1rem;\n        transition: transform 160ms ease, opacity 160ms ease, background 160ms ease;\n        background: #2563eb;\n        color: #fff;\n      }\n      button[data-variant='secondary'] {\n        background: #e2e8f0;\n        color: #0f172a;\n      }\n      button[data-size='sm'] {\n        min-height: 2.125rem;\n        padding: 0.5rem 0.875rem;\n      }\n      button[data-size='lg'] {\n        min-height: 3rem;\n        padding: 0.875rem 1.25rem;\n      }\n      button:hover:not(:disabled) {\n        transform: translateY(-1px);\n      }\n      button:disabled {\n        cursor: not-allowed;\n        opacity: 0.6;\n      }\n    `,\n    render: ({ props: e }) => p`\n      <button\n        part=\"button\"\n        type=\"${c(e.type)}\"\n        data-variant=\"${c(e.variant)}\"\n        data-size=\"${c(e.size)}\"\n        ${e.disabled ? \"disabled\" : \"\"}\n      >\n        <slot>${c(e.label)}</slot>\n      </button>\n    `\n  }), f(a.card, {\n    props: {\n      title: {\n        type: String,\n        default: \"\"\n      },\n      footer: {\n        type: String,\n        default: \"\"\n      },\n      elevated: {\n        type: Boolean,\n        default: !0\n      }\n    },\n    styles: `\n      ${b}\n      article {\n        background: #fff;\n        border: 1px solid #e2e8f0;\n        border-radius: 1rem;\n        box-shadow: 0 10px 25px rgba(15, 23, 42, 0.08);\n        color: #0f172a;\n        display: block;\n        padding: 1rem;\n      }\n      article[data-elevated='false'] {\n        box-shadow: none;\n      }\n      header, footer {\n        color: #475569;\n        font-size: 0.95rem;\n        font-weight: 600;\n      }\n      header {\n        margin-bottom: 0.75rem;\n      }\n      footer {\n        margin-top: 0.75rem;\n      }\n    `,\n    render: ({ props: e }) => p`\n      <article part=\"card\" data-elevated=\"${String(e.elevated)}\">\n        ${e.title ? `<header part=\"header\">${c(e.title)}</header>` : \"\"}\n        <section part=\"body\"><slot></slot></section>\n        ${e.footer ? `<footer part=\"footer\">${c(e.footer)}</footer>` : \"\"}\n      </article>\n    `\n  }), f(a.input, {\n    props: {\n      label: {\n        type: String,\n        default: \"\"\n      },\n      type: {\n        type: String,\n        default: \"text\"\n      },\n      value: {\n        type: String,\n        default: \"\"\n      },\n      placeholder: {\n        type: String,\n        default: \"\"\n      },\n      name: {\n        type: String,\n        default: \"\"\n      },\n      disabled: {\n        type: Boolean,\n        default: !1\n      }\n    },\n    styles: $,\n    beforeUpdate(e, n) {\n      return !U(this, e, n);\n    },\n    connected() {\n      const e = (n) => {\n        const l = n.target;\n        l?.matches(\"input\") && (n.stopPropagation(), this.setAttribute(\"value\", l.value), this.dispatchEvent(new CustomEvent(\"input\", {\n          detail: { value: l.value },\n          bubbles: !0,\n          composed: !0\n        })));\n      };\n      g(this, \"__bqueryInputHandler\", e), this.shadowRoot?.addEventListener(\"input\", e);\n    },\n    disconnected() {\n      const e = y(this, \"__bqueryInputHandler\");\n      e && this.shadowRoot?.removeEventListener(\"input\", e);\n    },\n    render: ({ props: e }) => p`\n      <label part=\"field\" class=\"field\">\n        ${e.label ? `<span part=\"label\" class=\"label\">${c(e.label)}</span>` : \"\"}\n        <input\n          part=\"control\"\n          class=\"control\"\n          type=\"${c(e.type)}\"\n          value=\"${c(e.value)}\"\n          placeholder=\"${c(e.placeholder)}\"\n          name=\"${c(e.name)}\"\n          ${e.disabled ? \"disabled\" : \"\"}\n        />\n      </label>\n    `\n  }), f(a.textarea, {\n    props: {\n      label: {\n        type: String,\n        default: \"\"\n      },\n      value: {\n        type: String,\n        default: \"\"\n      },\n      placeholder: {\n        type: String,\n        default: \"\"\n      },\n      name: {\n        type: String,\n        default: \"\"\n      },\n      rows: {\n        type: Number,\n        default: 4\n      },\n      disabled: {\n        type: Boolean,\n        default: !1\n      }\n    },\n    styles: `${$}\n      textarea.control {\n        min-height: 6rem;\n        resize: vertical;\n      }\n    `,\n    beforeUpdate(e, n) {\n      return !Q(this, e, n);\n    },\n    connected() {\n      const e = (n) => {\n        const l = n.target;\n        l?.matches(\"textarea\") && (n.stopPropagation(), this.setAttribute(\"value\", l.value), this.dispatchEvent(new CustomEvent(\"input\", {\n          detail: { value: l.value },\n          bubbles: !0,\n          composed: !0\n        })));\n      };\n      g(this, \"__bqueryTextareaHandler\", e), this.shadowRoot?.addEventListener(\"input\", e);\n    },\n    disconnected() {\n      const e = y(this, \"__bqueryTextareaHandler\");\n      e && this.shadowRoot?.removeEventListener(\"input\", e);\n    },\n    render: ({ props: e }) => p`\n      <label part=\"field\" class=\"field\">\n        ${e.label ? `<span part=\"label\" class=\"label\">${c(e.label)}</span>` : \"\"}\n        ${D(e)}\n      </label>\n    `\n  }), f(a.checkbox, {\n    props: {\n      label: {\n        type: String,\n        default: \"\"\n      },\n      checked: {\n        type: Boolean,\n        default: !1\n      },\n      disabled: {\n        type: Boolean,\n        default: !1\n      }\n    },\n    styles: `\n      ${b}\n      label {\n        align-items: center;\n        color: #0f172a;\n        cursor: pointer;\n        display: inline-flex;\n        gap: 0.625rem;\n      }\n      input {\n        accent-color: #2563eb;\n        block-size: 1rem;\n        inline-size: 1rem;\n      }\n      input:disabled {\n        cursor: not-allowed;\n      }\n    `,\n    connected() {\n      const e = (n) => {\n        const l = n.target;\n        l?.matches('input[type=\"checkbox\"]') && (n.stopPropagation(), l.checked ? this.setAttribute(\"checked\", \"true\") : this.removeAttribute(\"checked\"), this.dispatchEvent(new CustomEvent(\"change\", {\n          detail: { checked: l.checked },\n          bubbles: !0,\n          composed: !0\n        })));\n      };\n      g(this, \"__bqueryCheckboxHandler\", e), this.shadowRoot?.addEventListener(\"change\", e);\n    },\n    disconnected() {\n      const e = y(this, \"__bqueryCheckboxHandler\");\n      e && this.shadowRoot?.removeEventListener(\"change\", e);\n    },\n    render: ({ props: e }) => p`\n      <label part=\"label\">\n        <input\n          part=\"control\"\n          type=\"checkbox\"\n          ${e.checked ? \"checked\" : \"\"}\n          ${e.disabled ? \"disabled\" : \"\"}\n        />\n        <span part=\"text\"><slot>${c(e.label)}</slot></span>\n      </label>\n    `\n  }), a;\n};\nexport {\n  f as a,\n  X as i,\n  Y as n,\n  K as o,\n  p as r,\n  Z as t\n};\n\n//# sourceMappingURL=component-BEQgt5hl.js.map","/**\n * Accordion / disclosure component.\n * @element bq-accordion\n * @prop {string}  label   - Trigger label\n * @prop {boolean} open    - Expanded state\n * @prop {boolean} disabled\n * @prop {string}  variant - default | bordered | flush\n * @slot - Accordion panel content\n * @fires bq-toggle - { open: boolean }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getAnimationTimeoutMs, uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqAccordionProps = {\n  label: string;\n  open: boolean;\n  disabled: boolean;\n  variant: string;\n};\ntype BqAccordionState = { uid: string };\n\nconst DEFAULT_SLOW_DURATION = '300ms';\n\nconst definition: ComponentDefinition<BqAccordionProps, BqAccordionState> = {\n  props: {\n    label: { type: String, default: '' },\n    open: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n    variant: { type: String, default: 'default' },\n  },\n  state: {\n    uid: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    :host([variant=\"bordered\"]) .accordion { border: 1.5px solid var(--bq-border-base,#e2e8f0); border-radius: var(--bq-radius-lg); }\n    :host([variant=\"flush\"]) .accordion { border-bottom: 1px solid var(--bq-border-base,#e2e8f0); }\n    .accordion { font-family: var(--bq-font-family-sans); }\n    .trigger {\n      display: flex; align-items: center; justify-content: space-between;\n      width: 100%; padding: var(--bq-space-4,1rem); background: none; border: none;\n      cursor: pointer; color: var(--bq-text-base,#0f172a);\n      font-size: var(--bq-font-size-md,1rem); font-weight: var(--bq-font-weight-semibold,600);\n      font-family: inherit; text-align: left;\n      transition: background var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    .trigger:hover:not([disabled]) { background: var(--bq-bg-subtle,#f8fafc); }\n    .trigger[disabled] { opacity: 0.5; cursor: not-allowed; }\n    .trigger:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .icon { flex-shrink: 0; font-size: 1rem; color: var(--bq-text-muted,#475569); transition: transform var(--bq-duration-fast) var(--bq-easing-standard); }\n    :host([open]:not([data-closing])) .icon { transform: rotate(180deg); }\n    .panel { display: grid; grid-template-rows: 0fr; overflow: hidden; }\n    .panel-inner { overflow: hidden; min-height: 0; padding: 0 var(--bq-space-4,1rem) var(--bq-space-4,1rem); color: var(--bq-text-muted,#475569); font-size: var(--bq-font-size-sm,0.875rem); line-height: var(--bq-line-height-relaxed,1.625); }\n    :host([open]:not([data-closing])) .panel { grid-template-rows: 1fr; animation: panel-open var(--bq-duration-slow,${DEFAULT_SLOW_DURATION}) var(--bq-easing-standard); }\n    :host([data-closing]) .panel { grid-template-rows: 1fr; animation: panel-close var(--bq-duration-slow,${DEFAULT_SLOW_DURATION}) var(--bq-easing-standard) forwards; }\n    @keyframes panel-open { from { grid-template-rows: 0fr; } }\n    @keyframes panel-close { from { grid-template-rows: 1fr; } to { grid-template-rows: 0fr; } }\n    @media (prefers-reduced-motion: reduce) {\n      .panel { animation: none !important; }\n      .icon { transition: none; }\n      .trigger { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'uid', v: string): void;\n      getState<T>(k: string): T;\n    };\n\n    const self = this as unknown as BQEl;\n    const record = self as unknown as Record<string, unknown>;\n\n    if (!self.getState<string>('uid')) self.setState('uid', uniqueId('bq-acc'));\n\n    const clearCloseFallback = () => {\n      const timeoutId = record['_closeTimeout'] as\n        | ReturnType<typeof setTimeout>\n        | undefined;\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n        delete record['_closeTimeout'];\n      }\n    };\n\n    const finishClose = () => {\n      if (!self.hasAttribute('data-closing')) return;\n      clearCloseFallback();\n      self.removeAttribute('data-closing');\n    };\n\n    const handler = (e: Event) => {\n      if (!(e.target as Element).closest('.trigger')) return;\n      if (self.hasAttribute('disabled') || self.hasAttribute('data-closing')) {\n        return;\n      }\n\n      const isOpen = self.hasAttribute('open');\n      if (isOpen) {\n        // Close with animation via data-closing (no re-render, CSS animation on existing DOM)\n        const reducedMotion = self.ownerDocument.defaultView?.matchMedia?.(\n          '(prefers-reduced-motion: reduce)'\n        )?.matches;\n\n        if (reducedMotion) {\n          self.removeAttribute('open');\n          self.dispatchEvent(\n            new CustomEvent('bq-toggle', {\n              detail: { open: false },\n              bubbles: true,\n              composed: true,\n            })\n          );\n          return;\n        }\n\n        self.setAttribute('data-closing', '');\n        self.removeAttribute('open');\n        self.dispatchEvent(\n          new CustomEvent('bq-toggle', {\n            detail: { open: false },\n            bubbles: true,\n            composed: true,\n          })\n        );\n        clearCloseFallback();\n\n        const panel = self.shadowRoot?.querySelector('.panel');\n        const timeoutMs = panel\n          ? getAnimationTimeoutMs(panel, DEFAULT_SLOW_DURATION)\n          : 0;\n\n        if (timeoutMs <= 0) {\n          finishClose();\n        } else {\n          record['_closeTimeout'] = setTimeout(\n            finishClose,\n            Math.ceil(timeoutMs) + 20\n          );\n        }\n        return;\n      }\n\n      // Open — setting open triggers re-render, CSS animation plays on new DOM\n      self.setAttribute('open', '');\n      self.dispatchEvent(\n        new CustomEvent('bq-toggle', {\n          detail: { open: true },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n\n    const kh = (e: Event) => {\n      const ke = e as KeyboardEvent;\n      if (\n        (ke.key === 'Enter' || ke.key === ' ') &&\n        (e.target as Element).closest('.trigger')\n      ) {\n        ke.preventDefault();\n        handler(e);\n      }\n    };\n\n    const ah = (e: Event) => {\n      const target = e.target as Element | null;\n      const animationName = (e as Event & { animationName?: string })\n        .animationName;\n\n      if (\n        !self.hasAttribute('data-closing') ||\n        !target?.classList.contains('panel') ||\n        animationName !== 'panel-close'\n      ) {\n        return;\n      }\n\n      finishClose();\n    };\n\n    record['_handler'] = handler;\n    record['_kh'] = kh;\n    record['_ah'] = ah;\n\n    self.shadowRoot?.addEventListener('click', handler);\n    self.shadowRoot?.addEventListener('keydown', kh);\n    self.shadowRoot?.addEventListener('animationend', ah);\n  },\n  disconnected() {\n    const self = this as unknown as Record<string, unknown>;\n    const h = self['_handler'] as EventListener | undefined;\n    const kh = self['_kh'] as EventListener | undefined;\n    const ah = self['_ah'] as EventListener | undefined;\n    const closeTimeout = self['_closeTimeout'] as\n      | ReturnType<typeof setTimeout>\n      | undefined;\n    if (h) this.shadowRoot?.removeEventListener('click', h);\n    if (kh) this.shadowRoot?.removeEventListener('keydown', kh);\n    if (ah) this.shadowRoot?.removeEventListener('animationend', ah);\n    if (closeTimeout) clearTimeout(closeTimeout);\n  },\n  render({ props, state }) {\n    const uid = state.uid || 'bq-acc';\n    const triggerId = `${uid}-trigger`;\n    const panelId = `${uid}-panel`;\n    return html`\n      <div\n        part=\"accordion\"\n        class=\"accordion\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n      >\n        <button\n          part=\"trigger\"\n          class=\"trigger\"\n          type=\"button\"\n          id=\"${triggerId}\"\n          aria-expanded=\"${props.open ? 'true' : 'false'}\"\n          aria-controls=\"${panelId}\"\n          ${props.disabled ? 'disabled aria-disabled=\"true\"' : ''}\n        >\n          <span part=\"label\">${escapeHtml(props.label)}</span>\n          <span class=\"icon\" aria-hidden=\"true\">&#9662;</span>\n        </button>\n        <div\n          part=\"panel\"\n          class=\"panel\"\n          id=\"${panelId}\"\n          role=\"region\"\n          aria-labelledby=\"${triggerId}\"\n          aria-hidden=\"${!props.open ? 'true' : 'false'}\"\n        >\n          <div class=\"panel-inner\"><slot></slot></div>\n        </div>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqAccordionProps, BqAccordionState>('bq-accordion', definition);\n","/**\n * Alert component - contextual status message.\n * @element bq-alert\n * @prop {string}  variant    - info | success | warning | danger\n * @prop {string}  title      - Alert heading\n * @prop {boolean} dismissible - Show close button\n * @slot - Alert body content\n * @fires bq-close\n */\nimport { component, html } from '@bquery/bquery/component';\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\nimport { t } from '../../i18n/index.js';\n\ntype BqAlertProps = { variant: string; title: string; dismissible: boolean };\n\nconst definition: ComponentDefinition<BqAlertProps> = {\n  props: {\n    variant:    { type: String, default: 'info' },\n    title:      { type: String, default: '' },\n    dismissible:{ type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    :host([hidden]) { display: none; }\n    .alert {\n      display: flex; align-items: flex-start; gap: 0.75rem;\n      padding: var(--bq-space-4,1rem); border-radius: var(--bq-radius-lg,0.5rem);\n      border: 1.5px solid transparent; font-family: var(--bq-font-family-sans);\n    }\n    .alert[data-variant=\"info\"]    { background: var(--bq-color-info-50,#eff6ff);    border-color: var(--bq-color-info-500,#3b82f6);    color: var(--bq-color-info-700,#1d4ed8); }\n    .alert[data-variant=\"success\"] { background: var(--bq-color-success-50,#f0fdf4); border-color: var(--bq-color-success-500,#22c55e); color: var(--bq-color-success-700,#15803d); }\n    .alert[data-variant=\"warning\"] { background: var(--bq-color-warning-50,#fffbeb); border-color: var(--bq-color-warning-500,#f59e0b); color: var(--bq-color-warning-700,#b45309); }\n    .alert[data-variant=\"danger\"]  { background: var(--bq-color-danger-50,#fef2f2);  border-color: var(--bq-color-danger-500,#ef4444);  color: var(--bq-color-danger-700,#b91c1c); }\n    .icon { font-size: 1.1em; flex-shrink: 0; margin-top: 0.1em; }\n    .content { flex: 1; min-width: 0; }\n    .alert-title { font-weight: var(--bq-font-weight-semibold,600); font-size: var(--bq-font-size-sm,0.875rem); margin-bottom: 0.25rem; }\n    .body { font-size: var(--bq-font-size-sm,0.875rem); }\n    .close { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; background: none; border: none; cursor: pointer; color: inherit; padding: 0.25rem; border-radius: var(--bq-radius-md,0.375rem); opacity: 0.7; font-size: 0.875rem; }\n    .close:hover { opacity: 1; background: rgba(0,0,0,0.08); }\n    .close:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n  `,\n  connected() {\n    const self = this;\n    const handler = (e: Event) => {\n      if ((e.target as Element).closest('.close')) {\n        self.setAttribute('hidden', '');\n        self.dispatchEvent(new CustomEvent('bq-close', { bubbles: true, composed: true }));\n      }\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    self.shadowRoot?.addEventListener('click', handler);\n  },\n  disconnected() {\n    const handler = (this as unknown as Record<string, unknown>)['_handler'] as EventListener | undefined;\n    if (handler) this.shadowRoot?.removeEventListener('click', handler);\n  },\n  render({ props }) {\n    const icons: Record<string, string> = { info: 'ℹ', success: '✓', warning: '⚠', danger: '✕' };\n    const icon = icons[props.variant] ?? 'ℹ';\n    const isAlert = props.variant === 'warning' || props.variant === 'danger';\n    return html`\n      <div part=\"alert\" class=\"alert\" data-variant=\"${escapeHtml(props.variant)}\"\n        role=\"${isAlert ? 'alert' : 'status'}\" aria-live=\"${isAlert ? 'assertive' : 'polite'}\">\n        <span class=\"icon\" aria-hidden=\"true\">${icon}</span>\n        <div class=\"content\">\n          ${props.title ? `<div class=\"alert-title\">${escapeHtml(props.title)}</div>` : ''}\n          <div class=\"body\"><slot></slot></div>\n        </div>\n        ${props.dismissible ? `<button type=\"button\" class=\"close\" aria-label=\"${t('common.close')}\">✕</button>` : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqAlertProps>('bq-alert', definition);\n","/**\n * Avatar component - user/entity image or initials.\n * @element bq-avatar\n * @prop {string} src    - Image URL\n * @prop {string} alt    - Alt text / initials source\n * @prop {string} size   - xs | sm | md | lg | xl\n * @prop {string} shape  - circle | square\n * @prop {string} status - online | away | busy | offline | \"\"\n * @slot - Custom content\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqAvatarProps = {\n  src: string;\n  alt: string;\n  size: string;\n  shape: string;\n  status: string;\n};\n\ntype GraphemeSegment = { segment: string };\ntype GraphemeSegmenter = {\n  segment(input: string): Iterable<GraphemeSegment>;\n};\n\nfunction getGraphemes(value: string): string[] {\n  if (!value) return [];\n\n  const intlWithSegmenter = Intl as typeof Intl & {\n    Segmenter?: new (\n      locales?: string | string[],\n      options?: { granularity: 'grapheme' }\n    ) => GraphemeSegmenter;\n  };\n\n  if (intlWithSegmenter.Segmenter) {\n    const segmenter = new intlWithSegmenter.Segmenter(undefined, {\n      granularity: 'grapheme',\n    });\n    return Array.from(segmenter.segment(value), (part) => part.segment);\n  }\n\n  return Array.from(value);\n}\n\nfunction getInitials(alt: string): string {\n  const words = alt.trim().split(/\\s+/).filter(Boolean);\n  if (!words.length || !words[0]) return '?';\n\n  if (words.length === 1) {\n    const word = words[0];\n    const graphemes = getGraphemes(word);\n    if (!graphemes.length) return '?';\n\n    const isLatinLike = /[\\p{Script=Latin}\\p{Number}]/u.test(word);\n    const initials = isLatinLike\n      ? (graphemes[0] ?? '')\n      : graphemes.slice(0, 2).join('');\n    return initials ? initials.toLocaleUpperCase() : '?';\n  }\n\n  const firstWord = words[0] ?? '';\n  const lastWord = words[words.length - 1] ?? firstWord;\n  const first = getGraphemes(firstWord)[0] ?? '';\n  const last = getGraphemes(lastWord)[0] ?? '';\n  return `${first}${last}`.toLocaleUpperCase();\n}\n\nconst definition: ComponentDefinition<BqAvatarProps> = {\n  props: {\n    src: { type: String, default: '' },\n    alt: { type: String, default: '' },\n    size: { type: String, default: 'md' },\n    shape: { type: String, default: 'circle' },\n    status: { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: inline-block; position: relative; }\n    .avatar {\n      overflow: hidden; display: flex; align-items: center; justify-content: center;\n      background: var(--bq-color-primary-100,#dbeafe); color: var(--bq-color-primary-700,#1d4ed8);\n      font-weight: var(--bq-font-weight-semibold,600); font-family: var(--bq-font-family-sans);\n      user-select: none; flex-shrink: 0;\n    }\n    .avatar[data-shape=\"circle\"] { border-radius: var(--bq-radius-full,9999px); }\n    .avatar[data-shape=\"square\"] { border-radius: var(--bq-radius-lg,0.5rem); }\n    .avatar[data-size=\"xs\"]  { width: 1.5rem; height: 1.5rem; font-size: 0.5625rem; }\n    .avatar[data-size=\"sm\"]  { width: 2rem;   height: 2rem;   font-size: 0.75rem; }\n    .avatar[data-size=\"md\"]  { width: 2.5rem; height: 2.5rem; font-size: 0.9375rem; }\n    .avatar[data-size=\"lg\"]  { width: 3rem;   height: 3rem;   font-size: 1.125rem; }\n    .avatar[data-size=\"xl\"]  { width: 4rem;   height: 4rem;   font-size: 1.5rem; }\n    .avatar img { width: 100%; height: 100%; object-fit: cover; }\n    .status {\n      position: absolute; bottom: 0; right: 0; border-radius: var(--bq-radius-full,9999px);\n      border: 2px solid var(--bq-bg-base,#fff);\n    }\n    :host([size=\"xs\"])  .status { width: 0.4rem;  height: 0.4rem; }\n    :host([size=\"sm\"])  .status { width: 0.5rem;  height: 0.5rem; }\n    :host([size=\"md\"])  .status { width: 0.7rem;  height: 0.7rem; }\n    :host([size=\"lg\"])  .status { width: 0.85rem; height: 0.85rem; }\n    :host([size=\"xl\"])  .status { width: 1.1rem;  height: 1.1rem; }\n    .status[data-status=\"online\"]  { background: #22c55e; }\n    .status[data-status=\"away\"]    { background: #f59e0b; }\n    .status[data-status=\"busy\"]    { background: #ef4444; }\n    .status[data-status=\"offline\"] { background: #94a3b8; }\n  `,\n  render({ props }) {\n    const content = props.src\n      ? `<img src=\"${escapeHtml(props.src)}\" alt=\"${escapeHtml(props.alt)}\" />`\n      : `<slot>${escapeHtml(getInitials(props.alt))}</slot>`;\n    const statusEl = props.status\n      ? `<span part=\"status\" class=\"status\" data-status=\"${escapeHtml(props.status)}\" role=\"img\" aria-label=\"${escapeHtml(props.status)}\"></span>`\n      : '';\n    return html`\n      <div\n        part=\"avatar\"\n        class=\"avatar\"\n        data-size=\"${escapeHtml(props.size)}\"\n        data-shape=\"${escapeHtml(props.shape)}\"\n        role=\"img\"\n        aria-label=\"${escapeHtml(props.alt)}\"\n      >\n        ${content}\n      </div>\n      ${statusEl}\n    `;\n  },\n};\n\ncomponent<BqAvatarProps>('bq-avatar', definition);\n","/**\n * Badge component - small status/label indicator.\n * @element bq-badge\n * @prop {string}  variant - primary | secondary | success | danger | warning | info | outline\n * @prop {string}  size    - sm | md | lg\n * @prop {boolean} pill    - fully-rounded\n * @slot - Badge content\n */\nimport { component, html } from '@bquery/bquery/component';\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqBadgeProps = { variant: string; size: string; pill: boolean };\n\nconst definition: ComponentDefinition<BqBadgeProps> = {\n  props: {\n    variant: { type: String, default: 'primary' },\n    size:    { type: String, default: 'md' },\n    pill:    { type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: inline-flex; }\n    .badge {\n      display: inline-flex; align-items: center; gap: 0.25rem;\n      font-weight: var(--bq-font-weight-semibold,600); line-height: 1; white-space: nowrap;\n      border-radius: var(--bq-radius-md,0.375rem);\n    }\n    :host([pill]) .badge { border-radius: var(--bq-radius-full,9999px); }\n    .badge[data-size=\"sm\"] { font-size: 0.6875rem; padding: 0.125rem 0.5rem; }\n    .badge[data-size=\"md\"] { font-size: 0.75rem; padding: 0.2rem 0.6rem; }\n    .badge[data-size=\"lg\"] { font-size: 0.875rem; padding: 0.3rem 0.75rem; }\n    .badge[data-variant=\"primary\"]   { background: var(--bq-color-primary-100,#dbeafe); color: var(--bq-color-primary-700,#1d4ed8); }\n    .badge[data-variant=\"secondary\"] { background: var(--bq-color-secondary-100,#f1f5f9); color: var(--bq-color-secondary-700,#334155); }\n    .badge[data-variant=\"success\"]   { background: var(--bq-color-success-100,#dcfce7); color: var(--bq-color-success-700,#15803d); }\n    .badge[data-variant=\"danger\"]    { background: var(--bq-color-danger-100,#fee2e2); color: var(--bq-color-danger-700,#b91c1c); }\n    .badge[data-variant=\"warning\"]   { background: var(--bq-color-warning-100,#fef3c7); color: var(--bq-color-warning-700,#b45309); }\n    .badge[data-variant=\"info\"]      { background: var(--bq-color-info-100,#dbeafe); color: var(--bq-color-info-700,#1d4ed8); }\n    .badge[data-variant=\"outline\"]   { background: transparent; color: var(--bq-text-base,#0f172a); border: 1.5px solid var(--bq-border-emphasis,#cbd5e1); }\n  `,\n  render({ props }) {\n    return html`<span part=\"badge\" class=\"badge\" data-variant=\"${escapeHtml(props.variant)}\" data-size=\"${escapeHtml(props.size)}\"><slot></slot></span>`;\n  },\n};\n\ncomponent<BqBadgeProps>('bq-badge', definition);\n","/**\n * Breadcrumbs navigation.\n * @element bq-breadcrumbs\n * @prop {string} separator - Separator character or text (default: /)\n * @slot - <a> or other link elements\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqBreadcrumbsProps = { separator: string };\nconst SEPARATOR_ATTR = 'data-bq-breadcrumb-separator';\n\nconst isSeparatorElement = (element: Element): boolean =>\n  element.hasAttribute(SEPARATOR_ATTR);\n\nconst getBreadcrumbSignature = (items: Element[], separator: string): string =>\n  `${separator}::${items.map((item) => `${item.tagName}:${item.getAttribute('href') ?? ''}:${item.textContent?.trim() ?? ''}`).join('|')}`;\n\nconst definition: ComponentDefinition<BqBreadcrumbsProps> = {\n  props: {\n    separator: { type: String, default: '/' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .breadcrumbs { display: flex; align-items: center; flex-wrap: wrap; list-style: none; margin: 0; padding: 0; font-family: var(--bq-font-family-sans); font-size: var(--bq-font-size-sm,0.875rem); gap: 0; }\n    ::slotted(a) { color: var(--bq-text-muted,#475569); text-decoration: none; transition: color var(--bq-duration-fast); }\n    ::slotted(a:hover) { color: var(--bq-color-primary-600,#2563eb); text-decoration: underline; }\n    ::slotted([aria-current=\"page\"]) { color: var(--bq-text-base,#0f172a); font-weight: var(--bq-font-weight-medium,500); pointer-events: none; }\n    ::slotted([data-bq-breadcrumb-separator]) { color: var(--bq-text-subtle,#94a3b8); margin: 0 var(--bq-space-2,0.5rem); user-select: none; }\n    @media (prefers-reduced-motion: reduce) {\n      ::slotted(a) { transition: none; }\n    }\n  `,\n  connected() {\n    const self = this;\n    const applyAttrs = () => {\n      const slot = self.shadowRoot?.querySelector(\n        'slot'\n      ) as HTMLSlotElement | null;\n      if (!slot) return;\n      const items = slot\n        .assignedElements({ flatten: true })\n        .filter((item) => !isSeparatorElement(item));\n      const separatorText = self.getAttribute('separator') || '/';\n      const state = self as unknown as Record<string, unknown>;\n      if (state['_syncingSeparators']) return;\n      const signature = getBreadcrumbSignature(items, separatorText);\n\n      items.forEach((item, i) => {\n        if (i === items.length - 1) item.setAttribute('aria-current', 'page');\n        else item.removeAttribute('aria-current');\n      });\n\n      const separatorCount = self.querySelectorAll<HTMLElement>(\n        `[${SEPARATOR_ATTR}]`\n      ).length;\n      if (\n        state['_separatorSignature'] === signature &&\n        separatorCount === Math.max(0, items.length - 1)\n      ) {\n        return;\n      }\n\n      state['_syncingSeparators'] = true;\n      state['_separatorSignature'] = signature;\n      try {\n        self\n          .querySelectorAll<HTMLElement>(`[${SEPARATOR_ATTR}]`)\n          .forEach((separator) => separator.remove());\n        items.forEach((item, i) => {\n          if (i < items.length - 1) {\n            const separator = document.createElement('span');\n            separator.setAttribute(SEPARATOR_ATTR, '');\n            separator.setAttribute('aria-hidden', 'true');\n            separator.textContent = separatorText;\n            item.after(separator);\n          }\n        });\n      } finally {\n        state['_syncingSeparators'] = false;\n      }\n    };\n    (self as unknown as Record<string, unknown>)['_applyAttrs'] = applyAttrs;\n    queueMicrotask(() => {\n      const slot = self.shadowRoot?.querySelector(\n        'slot'\n      ) as HTMLSlotElement | null;\n      if (!slot) return;\n      slot.addEventListener('slotchange', applyAttrs);\n      (self as unknown as Record<string, unknown>)['_slot'] = slot;\n      applyAttrs();\n    });\n  },\n  disconnected() {\n    const self = this as unknown as Record<string, unknown>;\n    const applyAttrs = self['_applyAttrs'] as EventListener | undefined;\n    const slot = self['_slot'] as HTMLSlotElement | null | undefined;\n    if (slot && applyAttrs) slot.removeEventListener('slotchange', applyAttrs);\n  },\n  updated() {\n    const applyAttrs = (this as unknown as Record<string, unknown>)[\n      '_applyAttrs'\n    ] as (() => void) | undefined;\n    applyAttrs?.();\n  },\n  render({ props }) {\n    return html`\n      <nav aria-label=\"${t('breadcrumbs.nav')}\" part=\"nav\">\n        <ol class=\"breadcrumbs\" part=\"list\">\n          <slot></slot>\n        </ol>\n      </nav>\n    `;\n  },\n};\n\ncomponent<BqBreadcrumbsProps>('bq-breadcrumbs', definition);\n","/**\n * Button component - primary interactive control.\n * @element bq-button\n * @prop {string}  variant  - primary | secondary | outline | ghost | danger\n * @prop {string}  size     - sm | md | lg | xl\n * @prop {boolean} disabled\n * @prop {boolean} loading\n * @prop {string}  type     - button | submit | reset\n * @prop {string}  href\n * @prop {string}  target\n * @prop {string}  label    - Optional accessible label override\n * @slot          - Button content\n * @slot prefix-icon - Icon before content\n * @slot suffix-icon - Icon after content\n * @fires bq-click - { originalEvent: Event }\n */\nimport { component, html } from '@bquery/bquery/component';\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqButtonProps = {\n  variant: string;\n  size: string;\n  disabled: boolean;\n  loading: boolean;\n  type: string;\n  href: string;\n  target: string;\n  label: string;\n};\ntype BqButtonState = { statusId: string };\n\nconst definition: ComponentDefinition<BqButtonProps, BqButtonState> = {\n  props: {\n    variant: { type: String, default: 'primary' },\n    size:    { type: String, default: 'md' },\n    disabled:{ type: Boolean, default: false },\n    loading: { type: Boolean, default: false },\n    type:    { type: String, default: 'button' },\n    href:    { type: String, default: '' },\n    target:  { type: String, default: '' },\n    label:   { type: String, default: '' },\n  },\n  state: {\n    statusId: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: inline-block; }\n    :host([hidden]) { display: none; }\n\n    .btn {\n      display: inline-flex; align-items: center; justify-content: center;\n      gap: 0.5rem; border: 1.5px solid transparent;\n      border-radius: var(--bq-radius-lg, 0.5rem);\n      font-family: var(--bq-font-family-sans);\n      font-weight: var(--bq-font-weight-semibold, 600);\n      line-height: 1; cursor: pointer; text-decoration: none;\n      transition: background-color var(--bq-duration-fast) var(--bq-easing-standard),\n                  border-color var(--bq-duration-fast) var(--bq-easing-standard),\n                  box-shadow var(--bq-duration-fast) var(--bq-easing-standard),\n                  opacity var(--bq-duration-fast) var(--bq-easing-standard);\n      white-space: nowrap; user-select: none; -webkit-user-select: none;\n      position: relative; overflow: hidden;\n    }\n    /* Sizes */\n    .btn[data-size=\"sm\"] { font-size: 0.875rem; padding: 0.375rem 0.75rem; min-height: 2rem; }\n    .btn[data-size=\"md\"] { font-size: 1rem; padding: 0.5rem 1rem; min-height: 2.5rem; }\n    .btn[data-size=\"lg\"] { font-size: 1.125rem; padding: 0.625rem 1.25rem; min-height: 3rem; }\n    .btn[data-size=\"xl\"] { font-size: 1.25rem; padding: 0.75rem 1.5rem; min-height: 3.5rem; }\n    /* Variants */\n    .btn[data-variant=\"primary\"] { background-color: var(--bq-color-primary-600,#2563eb); color: #fff; border-color: var(--bq-color-primary-600,#2563eb); }\n    .btn[data-variant=\"primary\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-primary-700,#1d4ed8); border-color: var(--bq-color-primary-700,#1d4ed8); }\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); }\n    .btn[data-variant=\"secondary\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-secondary-200,#e2e8f0); }\n    .btn[data-variant=\"outline\"] { background-color: transparent; color: var(--bq-color-primary-600,#2563eb); border-color: var(--bq-color-primary-600,#2563eb); }\n    .btn[data-variant=\"outline\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-primary-50,#eff6ff); }\n    .btn[data-variant=\"ghost\"] { background-color: transparent; color: var(--bq-color-secondary-700,#334155); border-color: transparent; }\n    .btn[data-variant=\"ghost\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-secondary-100,#f1f5f9); }\n    .btn[data-variant=\"danger\"] { background-color: var(--bq-color-danger-600,#dc2626); color: #fff; border-color: var(--bq-color-danger-600,#dc2626); }\n    .btn[data-variant=\"danger\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-danger-700,#b91c1c); }\n    /* States */\n    .btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .btn[data-variant=\"danger\"]:focus-visible { box-shadow: var(--bq-focus-ring-danger); }\n    .btn:disabled, .btn[aria-disabled=\"true\"] { opacity: 0.5; cursor: not-allowed; }\n    /* Loading spinner */\n    .spinner { width: 1em; height: 1em; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: spin 0.7s linear infinite; }\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; }\n    @keyframes spin { to { transform: rotate(360deg); } }\n    @media (prefers-reduced-motion: reduce) {\n      .btn, .spinner { transition: none; animation: none; }\n    }\n  `,\n  connected() {\n    type BqButtonElement = HTMLElement & { setState(k: 'statusId', v: string): void; getState<T>(k: string): T };\n    const self = this as unknown as BqButtonElement;\n    if (!self.getState<string>('statusId')) self.setState('statusId', uniqueId('bq-button-status'));\n    const handler = (e: Event) => {\n      if (self.hasAttribute('disabled') || self.hasAttribute('loading')) {\n        e.preventDefault(); e.stopPropagation(); return;\n      }\n      self.dispatchEvent(new CustomEvent('bq-click', { detail: { originalEvent: e }, bubbles: true, composed: true }));\n    };\n    (self as unknown as Record<string, unknown>)['_clickHandler'] = handler;\n    self.shadowRoot?.addEventListener('click', handler);\n  },\n  disconnected() {\n    const self = this;\n    const handler = (self as unknown as Record<string, unknown>)['_clickHandler'] as EventListener | undefined;\n    if (handler) self.shadowRoot?.removeEventListener('click', handler);\n  },\n  render({ props, state }) {\n    const tag = props.href ? 'a' : 'button';\n    const isLink = tag === 'a';\n    const disabled = props.disabled || props.loading;\n    const accessibleLabel = props.label.trim();\n    const loadingLabel = t('common.loading');\n    const statusId = state.statusId || 'bq-button-status';\n    const normalizedTarget = props.target.trim();\n    const safeRel = normalizedTarget.toLowerCase() === '_blank' ? 'noopener noreferrer' : '';\n    return html`\n      <${tag}\n        part=\"button\"\n        class=\"btn\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n        data-size=\"${escapeHtml(props.size)}\"\n        ${!isLink ? `type=\"${escapeHtml(props.type)}\"` : ''}\n        ${props.href ? `href=\"${escapeHtml(props.href)}\"` : ''}\n        ${isLink && normalizedTarget ? `target=\"${escapeHtml(normalizedTarget)}\"` : ''}\n        ${isLink && safeRel ? `rel=\"${escapeHtml(safeRel)}\"` : ''}\n        ${!isLink && disabled ? 'disabled' : ''}\n        ${disabled ? 'aria-disabled=\"true\"' : ''}\n        ${isLink && disabled ? 'tabindex=\"-1\"' : ''}\n        ${props.loading ? 'aria-busy=\"true\"' : ''}\n        ${props.loading ? `aria-describedby=\"${escapeHtml(statusId)}\"` : ''}\n        ${accessibleLabel ? `aria-label=\"${escapeHtml(accessibleLabel)}\"` : ''}\n      >\n        <slot name=\"prefix-icon\"></slot>\n        ${props.loading ? '<span class=\"spinner\" aria-hidden=\"true\"></span>' : ''}\n        <slot></slot>\n        <slot name=\"suffix-icon\"></slot>\n      </${tag}>\n      ${props.loading ? `<span class=\"sr-only\" id=\"${escapeHtml(statusId)}\" role=\"status\" aria-live=\"polite\">${escapeHtml(loadingLabel)}</span>` : ''}\n    `;\n  },\n};\n\ncomponent<BqButtonProps, BqButtonState>('bq-button', definition);\n","/**\n * Card component - content container with optional header and footer.\n * @element bq-card\n * @prop {string}  title    - Card header title\n * @prop {boolean} elevated - box-shadow elevation\n * @prop {string}  padding  - none | sm | md | lg\n * @slot         - Card body content\n * @slot header  - Custom header\n * @slot footer  - Card footer\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqCardProps = { title: string; elevated: boolean; padding: string };\n\nconst definition: ComponentDefinition<BqCardProps> = {\n  props: {\n    title: { type: String, default: '' },\n    elevated: { type: Boolean, default: true },\n    padding: { type: String, default: 'md' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .card {\n      background: var(--bq-bg-base,#fff);\n      border-radius: var(--bq-radius-xl,0.75rem);\n      border: 1px solid var(--bq-border-base,#e2e8f0);\n      overflow: hidden; font-family: var(--bq-font-family-sans);\n    }\n    :host([elevated]) .card { box-shadow: var(--bq-shadow-md); }\n    .card-header {\n      padding: var(--bq-space-5,1.25rem) var(--bq-space-6,1.5rem);\n      border-bottom: 1px solid var(--bq-border-base,#e2e8f0);\n    }\n    .card-header:empty { display: none; }\n    .card-title { font-size: var(--bq-font-size-lg,1.125rem); font-weight: var(--bq-font-weight-semibold,600); color: var(--bq-text-base,#0f172a); margin: 0; }\n    .card-body[data-padding=\"none\"] { padding: 0; }\n    .card-body[data-padding=\"sm\"]   { padding: var(--bq-space-3,0.75rem); }\n    .card-body[data-padding=\"md\"]   { padding: var(--bq-space-6,1.5rem); }\n    .card-body[data-padding=\"lg\"]   { padding: var(--bq-space-8,2rem); }\n    .card-footer {\n      padding: var(--bq-space-4,1rem) var(--bq-space-6,1.5rem);\n      border-top: 1px solid var(--bq-border-base,#e2e8f0);\n      background: var(--bq-bg-subtle,#f8fafc);\n    }\n    .card-footer:empty { display: none; }\n  `,\n  render({ props }) {\n    const headerContent = props.title\n      ? `<div class=\"card-header\" part=\"header\"><h3 class=\"card-title\">${escapeHtml(props.title)}</h3><slot name=\"header\"></slot></div>`\n      : '<slot name=\"header\"></slot>';\n    return html`\n      <article part=\"card\" class=\"card\">\n        ${headerContent}\n        <div\n          part=\"body\"\n          class=\"card-body\"\n          data-padding=\"${escapeHtml(props.padding)}\"\n        >\n          <slot></slot>\n        </div>\n        <div part=\"footer\" class=\"card-footer\"><slot name=\"footer\"></slot></div>\n      </article>\n    `;\n  },\n};\n\ncomponent<BqCardProps>('bq-card', definition);\n","/**\n * Checkbox form control.\n * @element bq-checkbox\n * @prop {string}  label         - Visible label\n * @prop {string}  name          - Input name\n * @prop {string}  value         - Input value\n * @prop {boolean} checked\n * @prop {boolean} indeterminate\n * @prop {boolean} disabled\n * @prop {boolean} required\n * @prop {string}  hint\n * @fires bq-change - { checked: boolean, value: string }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqCheckboxProps = {\n  label: string;\n  name: string;\n  value: string;\n  checked: boolean;\n  indeterminate: boolean;\n  disabled: boolean;\n  required: boolean;\n  hint: string;\n};\n\nconst definition: ComponentDefinition<BqCheckboxProps> = {\n  props: {\n    label: { type: String, default: '' },\n    name: { type: String, default: '' },\n    value: { type: String, default: '' },\n    checked: { type: Boolean, default: false },\n    indeterminate: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n    required: { type: Boolean, default: false },\n    hint: { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .wrapper { display: flex; flex-direction: column; gap: 0.25rem; }\n    .control { display: flex; align-items: flex-start; gap: 0.625rem; cursor: pointer; }\n    :host([disabled]) .control { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n    input[type=\"checkbox\"] {\n      width: 1.125rem; height: 1.125rem; flex-shrink: 0;\n      border: 2px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-sm,0.25rem);\n      background: var(--bq-bg-base,#fff); cursor: pointer;\n      accent-color: var(--bq-color-primary-600,#2563eb);\n      margin-top: 0.125rem;\n    }\n    input[type=\"checkbox\"]:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .label-text { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); line-height: 1.5; }\n    .hint { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); padding-inline-start: 1.75rem; }\n  `,\n  connected() {\n    const self = this;\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.hasAttribute('checked')\n      ? self.getAttribute('value') || 'on'\n      : '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const handler = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (input?.type !== 'checkbox') return;\n      if (input.checked) self.setAttribute('checked', '');\n      else self.removeAttribute('checked');\n      proxy.setValue(input.checked ? self.getAttribute('value') || 'on' : '');\n      self.dispatchEvent(\n        new CustomEvent('bq-change', {\n          detail: {\n            checked: input.checked,\n            value: self.getAttribute('value') ?? '',\n          },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    self.shadowRoot?.addEventListener('change', handler);\n  },\n  disconnected() {\n    const h = (this as unknown as Record<string, unknown>)['_handler'] as\n      | EventListener\n      | undefined;\n    if (h) this.shadowRoot?.removeEventListener('change', h);\n    (\n      (this as unknown as Record<string, unknown>)['_formProxy'] as\n        | FormProxy\n        | undefined\n    )?.cleanup();\n  },\n  updated() {\n    const input = this.shadowRoot?.querySelector(\n      'input'\n    ) as HTMLInputElement | null;\n    if (input) input.indeterminate = this.hasAttribute('indeterminate');\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(\n        this.hasAttribute('checked') ? this.getAttribute('value') || 'on' : ''\n      );\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props }) {\n    return html`\n      <div class=\"wrapper\" part=\"wrapper\">\n        <label class=\"control\" part=\"control\">\n          <input\n            type=\"checkbox\"\n            part=\"input\"\n            name=\"${escapeHtml(props.name)}\"\n            value=\"${escapeHtml(props.value)}\"\n            ${props.checked ? 'checked' : ''}\n            ${props.disabled ? 'disabled' : ''}\n            ${props.required ? 'required' : ''}\n          />\n          ${props.label\n            ? `<span class=\"label-text\" part=\"label\">${escapeHtml(props.label)}${props.required ? '<span class=\"required-mark\" aria-hidden=\"true\"> *</span>' : ''}</span>`\n            : ''}\n        </label>\n        ${props.hint\n          ? `<span class=\"hint\" part=\"hint\">${escapeHtml(props.hint)}</span>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqCheckboxProps>('bq-checkbox', definition);\n","/**\n * Chip / tag component.\n * @element bq-chip\n * @prop {string}  variant  - primary | secondary | success | danger | warning | info\n * @prop {string}  size     - sm | md | lg\n * @prop {boolean} removable\n * @prop {boolean} selected\n * @prop {boolean} disabled\n * @slot - Chip label\n * @fires bq-remove\n * @fires bq-click\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqChipProps = {\n  variant: string;\n  size: string;\n  removable: boolean;\n  selected: boolean;\n  disabled: boolean;\n};\n\nconst definition: ComponentDefinition<BqChipProps> = {\n  props: {\n    variant: { type: String, default: 'primary' },\n    size: { type: String, default: 'md' },\n    removable: { type: Boolean, default: false },\n    selected: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: inline-flex; }\n    .chip {\n      display: inline-flex; align-items: center; gap: 0.375rem;\n      border-radius: var(--bq-radius-full,9999px); font-family: var(--bq-font-family-sans);\n      font-weight: var(--bq-font-weight-medium,500); white-space: nowrap; cursor: pointer;\n      border: 1.5px solid transparent;\n      transition: all var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    .chip[data-size=\"sm\"] { font-size: 0.75rem; padding: 0.25rem 0.625rem; }\n    .chip[data-size=\"md\"] { font-size: 0.875rem; padding: 0.375rem 0.75rem; }\n    .chip[data-size=\"lg\"] { font-size: 1rem; padding: 0.5rem 1rem; }\n    .chip[data-variant=\"primary\"]   { background: var(--bq-color-primary-100,#dbeafe); color: var(--bq-color-primary-700,#1d4ed8); }\n    .chip[data-variant=\"secondary\"] { background: var(--bq-color-secondary-100,#f1f5f9); color: var(--bq-color-secondary-700,#334155); }\n    .chip[data-variant=\"success\"]   { background: var(--bq-color-success-100,#dcfce7); color: var(--bq-color-success-700,#15803d); }\n    .chip[data-variant=\"danger\"]    { background: var(--bq-color-danger-100,#fee2e2); color: var(--bq-color-danger-700,#b91c1c); }\n    .chip[data-variant=\"warning\"]   { background: var(--bq-color-warning-100,#fef3c7); color: var(--bq-color-warning-700,#b45309); }\n    .chip[data-variant=\"info\"]      { background: var(--bq-color-info-100,#dbeafe); color: var(--bq-color-info-700,#1d4ed8); }\n    .chip[aria-pressed=\"true\"] { border-color: currentColor; }\n    .chip[aria-disabled=\"true\"] { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n    .remove-btn {\n      display: inline-flex; align-items: center; justify-content: center;\n      background: none; border: none; cursor: pointer; color: inherit;\n      padding: 0; width: 1rem; height: 1rem; border-radius: 50%; font-size: 0.75rem; opacity: 0.7;\n    }\n    .remove-btn:hover { opacity: 1; }\n    .remove-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    @media (prefers-reduced-motion: reduce) {\n      .chip { transition: none; }\n    }\n  `,\n  connected() {\n    const self = this;\n    const handler = (e: Event) => {\n      if (self.hasAttribute('disabled')) return;\n      const target = e.target as Element;\n      if (target.closest('.remove-btn')) {\n        e.stopPropagation();\n        self.dispatchEvent(\n          new CustomEvent('bq-remove', { bubbles: true, composed: true })\n        );\n        return;\n      }\n      self.dispatchEvent(\n        new CustomEvent('bq-click', { bubbles: true, composed: true })\n      );\n    };\n    const keyHandler = (e: Event) => {\n      if (self.hasAttribute('disabled')) return;\n      const ke = e as KeyboardEvent;\n      const target = e.target as HTMLElement | null;\n      if (!target?.classList.contains('chip')) return;\n      const isSpaceKeydown = ke.type === 'keydown' && ke.key === ' ';\n      const isEnterKeydown =\n        ke.type === 'keydown' && ke.key === 'Enter' && !ke.repeat;\n      const isSpaceKeyup = ke.type === 'keyup' && ke.key === ' ';\n      if (isSpaceKeydown) {\n        e.preventDefault();\n        return;\n      }\n      if (!isEnterKeydown && !isSpaceKeyup) return;\n      e.preventDefault();\n      // Handle remove button activation via keyboard\n      const focusedTarget = ke.target as HTMLElement | null;\n      if (focusedTarget?.closest('.remove-btn')) {\n        self.dispatchEvent(\n          new CustomEvent('bq-remove', { bubbles: true, composed: true })\n        );\n        return;\n      }\n      self.dispatchEvent(\n        new CustomEvent('bq-click', { bubbles: true, composed: true })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    (self as unknown as Record<string, unknown>)['_keyHandler'] = keyHandler;\n    self.shadowRoot?.addEventListener('click', handler);\n    self.shadowRoot?.addEventListener('keydown', keyHandler);\n    self.shadowRoot?.addEventListener('keyup', keyHandler);\n  },\n  disconnected() {\n    const handler = (this as unknown as Record<string, unknown>)['_handler'] as\n      | EventListener\n      | undefined;\n    const keyHandler = (this as unknown as Record<string, unknown>)[\n      '_keyHandler'\n    ] as EventListener | undefined;\n    if (handler) this.shadowRoot?.removeEventListener('click', handler);\n    if (keyHandler) this.shadowRoot?.removeEventListener('keydown', keyHandler);\n    if (keyHandler) this.shadowRoot?.removeEventListener('keyup', keyHandler);\n  },\n  render({ props }) {\n    return html`\n      <span\n        part=\"chip\"\n        class=\"chip\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n        data-size=\"${escapeHtml(props.size)}\"\n        role=\"button\"\n        tabindex=\"${props.disabled ? '-1' : '0'}\"\n        aria-pressed=\"${props.selected ? 'true' : 'false'}\"\n        aria-disabled=\"${props.disabled ? 'true' : 'false'}\"\n      >\n        <slot></slot>\n        ${props.removable\n          ? `<button type=\"button\" class=\"remove-btn\" aria-label=\"${t('chip.remove')}\">✕</button>`\n          : ''}\n      </span>\n    `;\n  },\n};\n\ncomponent<BqChipProps>('bq-chip', definition);\n","/**\n * Dialog / modal overlay.\n * @element bq-dialog\n * @prop {boolean} open\n * @prop {string}  title\n * @prop {string}  size        - sm | md | lg | xl | full\n * @prop {boolean} dismissible - Show close button\n * @slot        - Dialog body\n * @slot footer - Dialog footer actions\n * @fires bq-close\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport type { OverlayFocusState } from '../../utils/dom.js';\nimport {\n  cleanupOverlayFocus,\n  getAnimationTimeoutMs,\n  uniqueId,\n  updateOverlayFocus,\n} from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqDialogProps = {\n  open: boolean;\n  title: string;\n  size: string;\n  dismissible: boolean;\n};\ntype BqDialogState = { titleId: string };\nconst NORMAL_DURATION = '200ms';\n\nconst definition: ComponentDefinition<BqDialogProps, BqDialogState> = {\n  props: {\n    open: { type: Boolean, default: false },\n    title: { type: String, default: '' },\n    size: { type: String, default: 'md' },\n    dismissible: { type: Boolean, default: true },\n  },\n  state: {\n    titleId: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    :host(:not([open])) .overlay { display: none; }\n    .overlay {\n      position: fixed; inset: 0; z-index: var(--bq-z-modal,400);\n      background: rgba(0,0,0,0.5);\n      display: flex; align-items: center; justify-content: center;\n      padding: var(--bq-space-4,1rem);\n      animation: fadeIn var(--bq-duration-normal,200ms) var(--bq-easing-decelerate);\n    }\n    @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n    .dialog {\n      background: var(--bq-bg-base,#fff); border-radius: var(--bq-radius-xl,0.75rem);\n      box-shadow: var(--bq-shadow-xl); width: 100%;\n      max-height: calc(100vh - 4rem); display: flex; flex-direction: column;\n      animation: scaleIn var(--bq-duration-normal,200ms) var(--bq-easing-spring);\n      font-family: var(--bq-font-family-sans); overflow: hidden;\n    }\n    @keyframes scaleIn { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n    :host([data-closing]) .overlay { animation: dlgFadeOut var(--bq-duration-normal,200ms) var(--bq-easing-accelerate) forwards; }\n    :host([data-closing]) .dialog { animation: dlgScaleOut var(--bq-duration-normal,200ms) var(--bq-easing-accelerate) forwards; }\n    @keyframes dlgFadeOut { to { opacity: 0; } }\n    @keyframes dlgScaleOut { to { transform: scale(0.95); opacity: 0; } }\n    .dialog[data-size=\"sm\"] { max-width: 28rem; }\n    .dialog[data-size=\"md\"] { max-width: 36rem; }\n    .dialog[data-size=\"lg\"] { max-width: 48rem; }\n    .dialog[data-size=\"xl\"] { max-width: 64rem; }\n    .dialog[data-size=\"full\"] { max-width: 100vw; max-height: 100vh; border-radius: 0; }\n    .header { display: flex; align-items: center; justify-content: space-between; padding: var(--bq-space-5,1.25rem) var(--bq-space-6,1.5rem); border-bottom: 1px solid var(--bq-border-base,#e2e8f0); flex-shrink: 0; }\n    .header-title { font-size: var(--bq-font-size-lg,1.125rem); font-weight: var(--bq-font-weight-semibold,600); color: var(--bq-text-base,#0f172a); margin: 0; flex: 1; }\n    .close-btn { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; background: none; border: none; cursor: pointer; color: var(--bq-text-muted,#475569); border-radius: var(--bq-radius-md,0.375rem); font-size: 1rem; flex-shrink: 0; transition: background var(--bq-duration-fast); }\n    .close-btn:hover { background: var(--bq-bg-muted,#f1f5f9); }\n    .close-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .body { padding: var(--bq-space-6,1.5rem); overflow-y: auto; flex: 1; color: var(--bq-text-muted,#475569); font-size: var(--bq-font-size-md,1rem); line-height: var(--bq-line-height-relaxed,1.625); }\n    .footer { padding: var(--bq-space-4,1rem) var(--bq-space-6,1.5rem); border-top: 1px solid var(--bq-border-base,#e2e8f0); display: flex; align-items: center; justify-content: flex-end; gap: var(--bq-space-3,0.75rem); flex-shrink: 0; background: var(--bq-bg-subtle,#f8fafc); }\n    @media (prefers-reduced-motion: reduce) {\n      .overlay, .dialog { animation: none !important; }\n      .close-btn { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'titleId', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    const record = self as unknown as Record<string, unknown>;\n    if (!self.getState<string>('titleId'))\n      self.setState('titleId', uniqueId('bq-dlg-title'));\n    // Escape key handler\n    const kh = (e: Event) => {\n      if ((e as KeyboardEvent).key === 'Escape' && self.hasAttribute('open'))\n        close();\n    };\n    // Click-outside handler\n    const oh = (e: Event) => {\n      if ((e.target as Element).classList.contains('overlay')) close();\n    };\n    const close = () => {\n      if (self.hasAttribute('data-closing')) return;\n      const clearCloseTimer = () => {\n        const closeTimer = record['_closeTimer'] as\n          | ReturnType<typeof setTimeout>\n          | undefined;\n        if (closeTimer) {\n          clearTimeout(closeTimer);\n          delete record['_closeTimer'];\n        }\n      };\n      const reducedMotion = self.ownerDocument.defaultView?.matchMedia?.(\n        '(prefers-reduced-motion: reduce)'\n      )?.matches;\n      const finalize = () => {\n        clearCloseTimer();\n        self.removeAttribute('data-closing');\n        self.removeAttribute('open');\n        self.dispatchEvent(\n          new CustomEvent('bq-close', { bubbles: true, composed: true })\n        );\n      };\n      if (reducedMotion) {\n        finalize();\n      } else {\n        self.setAttribute('data-closing', '');\n        const overlay = self.shadowRoot?.querySelector('.overlay');\n        const timeoutMs = overlay\n          ? getAnimationTimeoutMs(overlay, NORMAL_DURATION)\n          : 0;\n        if (timeoutMs <= 0) {\n          finalize();\n        } else {\n          record['_closeTimer'] = setTimeout(finalize, Math.ceil(timeoutMs) + 20);\n        }\n      }\n    };\n    const ch = (e: Event) => {\n      if ((e.target as Element).closest('.close-btn')) close();\n    };\n    (self as unknown as Record<string, unknown>)['_kh'] = kh;\n    (self as unknown as Record<string, unknown>)['_oh'] = oh;\n    (self as unknown as Record<string, unknown>)['_ch'] = ch;\n    document.addEventListener('keydown', kh);\n    self.shadowRoot?.addEventListener('click', oh);\n    self.shadowRoot?.addEventListener('click', ch);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    cleanupOverlayFocus(s as unknown as OverlayFocusState);\n    const kh = s['_kh'] as EventListener | undefined;\n    if (kh) document.removeEventListener('keydown', kh);\n    const oh = s['_oh'] as EventListener | undefined;\n    if (oh) this.shadowRoot?.removeEventListener('click', oh);\n    const ch = s['_ch'] as EventListener | undefined;\n    if (ch) this.shadowRoot?.removeEventListener('click', ch);\n    const closeTimer = s['_closeTimer'] as ReturnType<typeof setTimeout> | undefined;\n    if (closeTimer) {\n      clearTimeout(closeTimer);\n      delete s['_closeTimer'];\n      this.removeAttribute('data-closing');\n      this.removeAttribute('open');\n    }\n  },\n  updated() {\n    updateOverlayFocus(this, this as unknown as OverlayFocusState, '.dialog');\n  },\n  render({ props, state }) {\n    const titleId = state.titleId || 'bq-dlg-title';\n    return html`\n      <div part=\"overlay\" class=\"overlay\" role=\"presentation\">\n        <div\n          part=\"dialog\"\n          class=\"dialog\"\n          data-size=\"${escapeHtml(props.size)}\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-labelledby=\"${escapeHtml(titleId)}\"\n          tabindex=\"-1\"\n        >\n          <div class=\"header\" part=\"header\">\n            <h2 class=\"header-title\" id=\"${escapeHtml(titleId)}\" part=\"title\">\n              ${escapeHtml(props.title)}\n            </h2>\n            ${props.dismissible\n              ? `<button class=\"close-btn\" type=\"button\" aria-label=\"${t('dialog.close')}\" part=\"close\">&#10005;</button>`\n              : ''}\n          </div>\n          <div class=\"body\" part=\"body\"><slot></slot></div>\n          <div class=\"footer\" part=\"footer\"><slot name=\"footer\"></slot></div>\n        </div>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqDialogProps, BqDialogState>('bq-dialog', definition);\n","/**\n * Divider component - horizontal or vertical separator.\n * @element bq-divider\n * @prop {string} orientation - horizontal | vertical\n * @prop {string} variant     - solid | dashed | dotted\n * @prop {string} label       - Optional center label\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqDividerProps = { orientation: string; variant: string; label: string };\n\nconst definition: ComponentDefinition<BqDividerProps> = {\n  props: {\n    orientation: { type: String, default: 'horizontal' },\n    variant: { type: String, default: 'solid' },\n    label: { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: block; }\n    .divider {\n      display: flex; align-items: center; gap: 0.75rem;\n      color: var(--bq-text-subtle,#94a3b8);\n      font-family: var(--bq-font-family-sans);\n      font-size: var(--bq-font-size-sm,0.875rem);\n    }\n    .line {\n      flex: 1; border: none; border-top: 1px solid var(--bq-border-base,#e2e8f0); margin: 0;\n    }\n    .divider[data-variant=\"dashed\"] .line { border-top-style: dashed; }\n    .divider[data-variant=\"dotted\"] .line { border-top-style: dotted; }\n    :host([orientation=\"vertical\"]) .divider { flex-direction: column; height: 100%; width: fit-content; }\n    :host([orientation=\"vertical\"]) .line { flex: 1; border-top: none; border-left: 1px solid var(--bq-border-base,#e2e8f0); width: 0; }\n    :host([orientation=\"vertical\"]) [part=\"label\"] {\n      writing-mode: vertical-rl;\n      text-orientation: mixed;\n      line-height: 1;\n      white-space: nowrap;\n    }\n  `,\n  render({ props }) {\n    const label = props.label\n      ? `<span part=\"label\">${escapeHtml(props.label)}</span>`\n      : '';\n    return html`<div\n      part=\"divider\"\n      class=\"divider\"\n      data-variant=\"${escapeHtml(props.variant)}\"\n      role=\"separator\"\n      aria-orientation=\"${escapeHtml(props.orientation)}\"\n    >\n      <hr class=\"line\" part=\"line\" />\n      ${label} ${props.label ? '<hr class=\"line\" part=\"line\" />' : ''}\n    </div>`;\n  },\n};\n\ncomponent<BqDividerProps>('bq-divider', definition);\n","/**\n * Dropdown menu component — a trigger-activated overlay for actions or navigation.\n * @element bq-dropdown-menu\n * @prop {string}  label      - Accessible label for the dropdown menu\n * @prop {string}  placement  - bottom-start | bottom-end | top-start | top-end\n * @prop {boolean} open       - Whether the menu is open\n * @prop {boolean} disabled\n * @slot trigger  - Element that opens the menu (button, link, etc.)\n * @slot          - Menu items (typically <button> or <a> elements)\n * @fires bq-open\n * @fires bq-close\n * @fires bq-select - { value: string } — emitted when a menu item is activated\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getAnimationTimeoutMs, uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqDropdownMenuProps = {\n  label: string;\n  placement: string;\n  open: boolean;\n  disabled: boolean;\n};\ntype BqDropdownMenuState = { uid: string };\nconst FAST_DURATION = '150ms';\n\nconst definition: ComponentDefinition<\n  BqDropdownMenuProps,\n  BqDropdownMenuState\n> = {\n  props: {\n    label: { type: String, default: '' },\n    placement: { type: String, default: 'bottom-start' },\n    open: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n  },\n  state: {\n    uid: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: inline-block; position: relative; }\n    .trigger-wrap { display: inline-flex; }\n    .menu {\n      display: none; position: absolute; z-index: var(--bq-z-dropdown,100);\n      min-width: 10rem; max-height: 20rem; overflow-y: auto;\n      background: var(--bq-bg-base,#fff); border: 1px solid var(--bq-border-base,#e2e8f0);\n      border-radius: var(--bq-radius-lg,0.5rem); box-shadow: var(--bq-shadow-lg);\n      padding: var(--bq-space-1,0.25rem) 0; font-family: var(--bq-font-family-sans);\n      animation: menuFadeIn var(--bq-duration-fast,150ms) var(--bq-easing-decelerate);\n    }\n    :host([open]:not([data-closing])) .menu { display: block; }\n    :host([open][data-closing]) .menu { display: block; animation: menuFadeOut var(--bq-duration-fast,150ms) var(--bq-easing-accelerate) forwards; }\n    @keyframes menuFadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }\n    @keyframes menuFadeOut { to { opacity: 0; transform: translateY(-4px); } }\n    :host([placement=\"bottom-start\"]) .menu { top: 100%; left: 0; margin-top: 0.25rem; }\n    :host([placement=\"bottom-end\"]) .menu { top: 100%; right: 0; margin-top: 0.25rem; }\n    :host([placement=\"top-start\"]) .menu { bottom: 100%; left: 0; margin-bottom: 0.25rem; }\n    :host([placement=\"top-end\"]) .menu { bottom: 100%; right: 0; margin-bottom: 0.25rem; }\n    :host(:not([placement])) .menu { top: 100%; left: 0; margin-top: 0.25rem; }\n    ::slotted(button),\n    ::slotted(a) {\n      display: flex; align-items: center; gap: 0.5rem; width: 100%;\n      padding: 0.5rem 0.875rem; border: none; background: none;\n      color: var(--bq-text-base,#0f172a); font-size: var(--bq-font-size-sm,0.875rem);\n      font-family: var(--bq-font-family-sans); text-align: left; cursor: pointer;\n      text-decoration: none; white-space: nowrap;\n      transition: background var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    ::slotted(button:hover),\n    ::slotted(a:hover) { background: var(--bq-bg-subtle,#f8fafc); }\n    ::slotted(button:focus-visible),\n    ::slotted(a:focus-visible) { outline: none; background: var(--bq-bg-muted,#f1f5f9); box-shadow: inset 0 0 0 2px var(--bq-border-focus,#2563eb); }\n    ::slotted(button[disabled]),\n    ::slotted(a[disabled]),\n    ::slotted(a[aria-disabled=\"true\"]) { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n    ::slotted(hr) { border: none; border-top: 1px solid var(--bq-border-base,#e2e8f0); margin: 0.25rem 0; }\n    @media (prefers-reduced-motion: reduce) {\n      .menu { animation: none !important; }\n      ::slotted(button),\n      ::slotted(a) { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'uid', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    const record = self as unknown as Record<string, unknown>;\n    if (!self.getState<string>('uid')) self.setState('uid', uniqueId('bq-dm'));\n\n    const getTrigger = (): HTMLElement | null =>\n      self.querySelector('[slot=\"trigger\"]') as HTMLElement | null;\n\n    const isDisabledItem = (el: HTMLElement): boolean =>\n      el.hasAttribute('disabled') ||\n      el.getAttribute('aria-disabled') === 'true';\n\n    const getItemLabel = (el: HTMLElement): string =>\n      (el.getAttribute('data-value') || el.textContent || '')\n        .trim()\n        .toLowerCase();\n\n    const getMenuRoots = (): HTMLElement[] => {\n      const slot = self.shadowRoot?.querySelector(\n        'slot:not([name])'\n      ) as HTMLSlotElement | null;\n      if (!slot) return [];\n      return slot\n        .assignedElements({ flatten: true })\n        .filter((el): el is HTMLElement => el instanceof HTMLElement);\n    };\n\n    const syncTriggerA11y = () => {\n      const trigger = getTrigger();\n      if (!trigger) return;\n      const uid = self.getState<string>('uid') || 'bq-dm';\n      const isDisabled = self.hasAttribute('disabled');\n      trigger.setAttribute('aria-haspopup', 'menu');\n      trigger.setAttribute(\n        'aria-expanded',\n        self.hasAttribute('open') ? 'true' : 'false'\n      );\n      trigger.setAttribute('aria-controls', `${uid}-menu`);\n      trigger.setAttribute('aria-disabled', isDisabled ? 'true' : 'false');\n      if (trigger.tagName === 'BUTTON') {\n        (trigger as HTMLButtonElement).disabled = isDisabled;\n      }\n    };\n\n    const syncMenuItemRoles = () => {\n      getMenuRoots().forEach((el) => {\n        if (el.tagName === 'HR') {\n          el.setAttribute('role', 'separator');\n          return;\n        }\n        if (el.tagName === 'BUTTON' || el.tagName === 'A') {\n          if (!el.hasAttribute('role')) el.setAttribute('role', 'menuitem');\n          if (el.tagName === 'BUTTON' && !el.hasAttribute('type')) {\n            el.setAttribute('type', 'button');\n          }\n          if (isDisabledItem(el)) {\n            if (el.tagName === 'A') el.setAttribute('aria-disabled', 'true');\n            el.setAttribute('tabindex', '-1');\n            return;\n          }\n          if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '-1');\n        }\n      });\n    };\n\n    const open = () => {\n      if (self.hasAttribute('disabled') || self.hasAttribute('open')) return;\n      self.setAttribute('open', '');\n      syncTriggerA11y();\n      self.dispatchEvent(\n        new CustomEvent('bq-open', { bubbles: true, composed: true })\n      );\n      // Focus first item\n      requestAnimationFrame(() => {\n        if (!self.hasAttribute('open') || self.hasAttribute('data-closing'))\n          return;\n        const items = getMenuItems();\n        if (items.length > 0) items[0]!.focus();\n      });\n    };\n    const close = ({\n      restoreFocus = false,\n    }: { restoreFocus?: boolean } = {}) => {\n      if (!self.hasAttribute('open') || self.hasAttribute('data-closing'))\n        return;\n      clearTypeaheadBuffer();\n      const clearCloseTimer = () => {\n        const closeTimer = record['_closeTimer'] as\n          | ReturnType<typeof setTimeout>\n          | undefined;\n        if (closeTimer) {\n          clearTimeout(closeTimer);\n          delete record['_closeTimer'];\n        }\n      };\n      const reducedMotion = self.ownerDocument.defaultView?.matchMedia?.(\n        '(prefers-reduced-motion: reduce)'\n      )?.matches;\n      const finalize = () => {\n        clearCloseTimer();\n        self.removeAttribute('data-closing');\n        self.removeAttribute('open');\n        syncTriggerA11y();\n        self.dispatchEvent(\n          new CustomEvent('bq-close', { bubbles: true, composed: true })\n        );\n        if (restoreFocus) getTrigger()?.focus();\n      };\n      if (reducedMotion) {\n        finalize();\n      } else {\n        self.setAttribute('data-closing', '');\n        const menu = self.shadowRoot?.querySelector('.menu');\n        const timeoutMs = menu ? getAnimationTimeoutMs(menu, FAST_DURATION) : 0;\n        if (timeoutMs <= 0) {\n          finalize();\n        } else {\n          record['_closeTimer'] = setTimeout(finalize, Math.ceil(timeoutMs) + 20);\n        }\n      }\n    };\n    const toggle = () => {\n      if (self.hasAttribute('open')) close();\n      else open();\n    };\n\n    let typeaheadBuffer = '';\n    let typeaheadTimeout = 0;\n\n    const clearTypeaheadBuffer = () => {\n      typeaheadBuffer = '';\n      if (typeaheadTimeout) {\n        clearTimeout(typeaheadTimeout);\n        typeaheadTimeout = 0;\n      }\n    };\n\n    const focusTypeaheadMatch = (search: string, currentIndex: number) => {\n      const items = getMenuItems();\n      if (items.length === 0) return;\n\n      const orderedItems =\n        currentIndex >= 0\n          ? [\n              ...items.slice(currentIndex + 1),\n              ...items.slice(0, currentIndex + 1),\n            ]\n          : items;\n\n      const match = orderedItems.find((item) =>\n        getItemLabel(item).startsWith(search)\n      );\n      match?.focus();\n    };\n\n    const getMenuItems = (): HTMLElement[] => {\n      return getMenuRoots().filter(\n        (el): el is HTMLElement =>\n          (el.tagName === 'BUTTON' || el.tagName === 'A') && !isDisabledItem(el)\n      );\n    };\n\n    // Trigger click\n    const triggerHandler = (e: Event) => {\n      const triggerSlot = self.shadowRoot?.querySelector(\n        'slot[name=\"trigger\"]'\n      ) as HTMLSlotElement | null;\n      if (!triggerSlot) return;\n      const assigned = triggerSlot.assignedElements({ flatten: true });\n      const clickedTrigger = assigned.some(\n        (el) => el === e.target || el.contains(e.target as Node)\n      );\n      if (clickedTrigger) {\n        e.preventDefault();\n        toggle();\n      }\n    };\n\n    // Menu item click\n    const menuClickHandler = (e: Event) => {\n      const target = e.target as HTMLElement | null;\n      if (!target) return;\n\n      const trigger = getTrigger();\n      if (trigger && (target === trigger || trigger.contains(target))) return;\n\n      const item = target.closest('button, a') as HTMLElement | null;\n      if (!item) return;\n\n      if (isDisabledItem(item)) {\n        e.preventDefault();\n        return;\n      }\n\n      const isInMenu = getMenuRoots().some(\n        (el) => el === item || el.contains(item)\n      );\n      if (!isInMenu) return;\n\n      const value =\n        item.getAttribute('data-value') || item.textContent?.trim() || '';\n      self.dispatchEvent(\n        new CustomEvent('bq-select', {\n          detail: { value },\n          bubbles: true,\n          composed: true,\n        })\n      );\n      close({ restoreFocus: true });\n    };\n\n    // Keyboard navigation\n    const keyHandler = (e: Event) => {\n      const ke = e as KeyboardEvent;\n      if (self.hasAttribute('disabled')) return;\n\n      // On trigger: open on ArrowDown/Enter/Space\n      const triggerSlot = self.shadowRoot?.querySelector(\n        'slot[name=\"trigger\"]'\n      ) as HTMLSlotElement | null;\n      const triggerEls = triggerSlot?.assignedElements({ flatten: true }) ?? [];\n      const isOnTrigger = triggerEls.some(\n        (el) => el === ke.target || el.contains(ke.target as Node)\n      );\n\n      if (isOnTrigger) {\n        if (ke.key === 'ArrowDown' || ke.key === 'Enter' || ke.key === ' ') {\n          ke.preventDefault();\n          open();\n          return;\n        }\n        if (ke.key === 'Escape') {\n          close({ restoreFocus: true });\n          return;\n        }\n      }\n\n      // Inside menu\n      if (!self.hasAttribute('open')) return;\n      const items = getMenuItems();\n      const currentItem = (ke.target as HTMLElement | null)?.closest(\n        'button, a'\n      ) as HTMLElement | null;\n      const currentIndex = currentItem ? items.indexOf(currentItem) : -1;\n\n      switch (ke.key) {\n        case 'ArrowDown': {\n          ke.preventDefault();\n          const next = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n          items[next]?.focus();\n          break;\n        }\n        case 'ArrowUp': {\n          ke.preventDefault();\n          const prev = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n          items[prev]?.focus();\n          break;\n        }\n        case 'Home': {\n          ke.preventDefault();\n          items[0]?.focus();\n          break;\n        }\n        case 'End': {\n          ke.preventDefault();\n          items[items.length - 1]?.focus();\n          break;\n        }\n        case 'Enter':\n        case ' ': {\n          if (currentIndex === -1) break;\n          ke.preventDefault();\n          currentItem?.click();\n          break;\n        }\n        case 'Escape':\n          close({ restoreFocus: true });\n          break;\n        case 'Tab': {\n          close();\n          break;\n        }\n        default: {\n          if (ke.key.length === 1 && !ke.altKey && !ke.ctrlKey && !ke.metaKey) {\n            typeaheadBuffer = `${typeaheadBuffer}${ke.key.toLowerCase()}`;\n            if (typeaheadTimeout) clearTimeout(typeaheadTimeout);\n            typeaheadTimeout = window.setTimeout(() => {\n              typeaheadBuffer = '';\n              typeaheadTimeout = 0;\n            }, 500);\n            focusTypeaheadMatch(typeaheadBuffer, currentIndex);\n          }\n        }\n      }\n    };\n\n    // Click outside\n    const outsideHandler = (e: Event) => {\n      if (!self.hasAttribute('open')) return;\n      if (!self.contains(e.target as Node)) close({ restoreFocus: true });\n    };\n    let outsideListening = false;\n    const syncOutsideListener = () => {\n      if (self.hasAttribute('open')) {\n        if (!outsideListening) {\n          document.addEventListener('click', outsideHandler);\n          outsideListening = true;\n        }\n        return;\n      }\n      if (outsideListening) {\n        document.removeEventListener('click', outsideHandler);\n        outsideListening = false;\n      }\n    };\n\n    const slotChangeHandler = () => {\n      syncTriggerA11y();\n      syncMenuItemRoles();\n    };\n\n    const s = self as unknown as Record<string, unknown>;\n    s['_triggerHandler'] = triggerHandler;\n    s['_menuClickHandler'] = menuClickHandler;\n    s['_keyHandler'] = keyHandler;\n    s['_outsideHandler'] = outsideHandler;\n    s['_syncOutsideListener'] = syncOutsideListener;\n    s['_slotChangeHandler'] = slotChangeHandler;\n    s['_clearTypeaheadBuffer'] = clearTypeaheadBuffer;\n\n    self.addEventListener('click', triggerHandler);\n    self.addEventListener('click', menuClickHandler);\n    self.addEventListener('keydown', keyHandler);\n    self.shadowRoot\n      ?.querySelector('slot[name=\"trigger\"]')\n      ?.addEventListener('slotchange', slotChangeHandler);\n    self.shadowRoot\n      ?.querySelector('slot:not([name])')\n      ?.addEventListener('slotchange', slotChangeHandler);\n\n    requestAnimationFrame(() => {\n      syncTriggerA11y();\n      syncMenuItemRoles();\n      syncOutsideListener();\n    });\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const triggerHandler = s['_triggerHandler'] as EventListener | undefined;\n    const menuClickHandler = s['_menuClickHandler'] as\n      | EventListener\n      | undefined;\n    const keyHandler = s['_keyHandler'] as EventListener | undefined;\n    const outsideHandler = s['_outsideHandler'] as EventListener | undefined;\n    const slotChangeHandler = s['_slotChangeHandler'] as\n      | EventListener\n      | undefined;\n    const clearTypeaheadBuffer = s['_clearTypeaheadBuffer'] as\n      | (() => void)\n      | undefined;\n    const closeTimer = s['_closeTimer'] as ReturnType<typeof setTimeout> | undefined;\n    if (triggerHandler) this.removeEventListener('click', triggerHandler);\n    if (menuClickHandler) this.removeEventListener('click', menuClickHandler);\n    if (keyHandler) this.removeEventListener('keydown', keyHandler);\n    if (outsideHandler) document.removeEventListener('click', outsideHandler);\n    clearTypeaheadBuffer?.();\n    if (closeTimer) {\n      clearTimeout(closeTimer);\n      delete s['_closeTimer'];\n      this.removeAttribute('data-closing');\n      this.removeAttribute('open');\n    }\n    if (slotChangeHandler) {\n      this.shadowRoot\n        ?.querySelector('slot[name=\"trigger\"]')\n        ?.removeEventListener('slotchange', slotChangeHandler);\n      this.shadowRoot\n        ?.querySelector('slot:not([name])')\n        ?.removeEventListener('slotchange', slotChangeHandler);\n    }\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const syncOutsideListener = s['_syncOutsideListener'] as\n      | (() => void)\n      | undefined;\n    syncOutsideListener?.();\n    const trigger = this.querySelector(\n      '[slot=\"trigger\"]'\n    ) as HTMLElement | null;\n    if (trigger)\n      trigger.setAttribute(\n        'aria-expanded',\n        this.hasAttribute('open') ? 'true' : 'false'\n      );\n  },\n  render({ props, state }) {\n    const uid = state.uid || 'bq-dm';\n    const menuId = `${uid}-menu`;\n    return html`\n      <div class=\"trigger-wrap\" part=\"trigger\">\n        <slot name=\"trigger\"></slot>\n      </div>\n      <div\n        class=\"menu\"\n        id=\"${menuId}\"\n        part=\"menu\"\n        role=\"menu\"\n        ${props.label ? `aria-label=\"${escapeHtml(props.label)}\"` : ''}\n      >\n        <slot></slot>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqDropdownMenuProps, BqDropdownMenuState>(\n  'bq-dropdown-menu',\n  definition\n);\n","/**\n * Drawer / side panel overlay.\n * @element bq-drawer\n * @prop {boolean} open\n * @prop {string}  title\n * @prop {string}  placement - right | left | top | bottom\n * @prop {string}  size      - sm | md | lg | full\n * @slot        - Drawer body\n * @slot footer - Footer actions\n * @fires bq-close\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport type { OverlayFocusState } from '../../utils/dom.js';\nimport {\n  cleanupOverlayFocus,\n  getAnimationTimeoutMs,\n  uniqueId,\n  updateOverlayFocus,\n} from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqDrawerProps = {\n  open: boolean;\n  title: string;\n  placement: string;\n  size: string;\n};\ntype BqDrawerState = { titleId: string };\nconst NORMAL_DURATION = '200ms';\n\nconst definition: ComponentDefinition<BqDrawerProps, BqDrawerState> = {\n  props: {\n    open: { type: Boolean, default: false },\n    title: { type: String, default: '' },\n    placement: { type: String, default: 'right' },\n    size: { type: String, default: 'md' },\n  },\n  state: {\n    titleId: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    :host(:not([open])) .backdrop { display: none; }\n    .backdrop {\n      position: fixed; inset: 0; z-index: var(--bq-z-overlay,300);\n      background: rgba(0,0,0,0.5);\n      animation: fadeIn var(--bq-duration-normal) var(--bq-easing-decelerate);\n    }\n    @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n    .drawer {\n      position: fixed; z-index: calc(var(--bq-z-overlay,300) + 1);\n      background: var(--bq-bg-base,#fff); box-shadow: var(--bq-shadow-xl);\n      display: flex; flex-direction: column;\n      font-family: var(--bq-font-family-sans);\n    }\n    .drawer[data-placement=\"right\"]  { right: 0; top: 0; bottom: 0; animation: slideInRight var(--bq-duration-normal) var(--bq-easing-decelerate); }\n    .drawer[data-placement=\"left\"]   { left: 0; top: 0; bottom: 0; animation: slideInLeft var(--bq-duration-normal) var(--bq-easing-decelerate); }\n    .drawer[data-placement=\"top\"]    { top: 0; left: 0; right: 0; animation: slideInTop var(--bq-duration-normal) var(--bq-easing-decelerate); }\n    .drawer[data-placement=\"bottom\"] { bottom: 0; left: 0; right: 0; animation: slideInBottom var(--bq-duration-normal) var(--bq-easing-decelerate); }\n    .drawer[data-placement=\"right\"][data-size=\"sm\"],  .drawer[data-placement=\"left\"][data-size=\"sm\"]  { width: 20rem; }\n    .drawer[data-placement=\"right\"][data-size=\"md\"],  .drawer[data-placement=\"left\"][data-size=\"md\"]  { width: 28rem; }\n    .drawer[data-placement=\"right\"][data-size=\"lg\"],  .drawer[data-placement=\"left\"][data-size=\"lg\"]  { width: 40rem; }\n    .drawer[data-placement=\"right\"][data-size=\"full\"],.drawer[data-placement=\"left\"][data-size=\"full\"] { width: 100vw; }\n    .drawer[data-placement=\"top\"][data-size=\"sm\"],    .drawer[data-placement=\"bottom\"][data-size=\"sm\"]    { height: 16rem; }\n    .drawer[data-placement=\"top\"][data-size=\"md\"],    .drawer[data-placement=\"bottom\"][data-size=\"md\"]    { height: 22rem; }\n    .drawer[data-placement=\"top\"][data-size=\"lg\"],    .drawer[data-placement=\"bottom\"][data-size=\"lg\"]    { height: 36rem; }\n    @keyframes slideInRight  { from { transform: translateX(100%); } to { transform: translateX(0); } }\n    @keyframes slideInLeft   { from { transform: translateX(-100%); } to { transform: translateX(0); } }\n    @keyframes slideInTop    { from { transform: translateY(-100%); } to { transform: translateY(0); } }\n    @keyframes slideInBottom { from { transform: translateY(100%); } to { transform: translateY(0); } }\n    :host([data-closing]) .backdrop { animation: drwFadeOut var(--bq-duration-normal) var(--bq-easing-accelerate) forwards; }\n    :host([data-closing]) .drawer[data-placement=\"right\"]  { animation: slideOutRight var(--bq-duration-normal) var(--bq-easing-accelerate) forwards; }\n    :host([data-closing]) .drawer[data-placement=\"left\"]   { animation: slideOutLeft var(--bq-duration-normal) var(--bq-easing-accelerate) forwards; }\n    :host([data-closing]) .drawer[data-placement=\"top\"]    { animation: slideOutTop var(--bq-duration-normal) var(--bq-easing-accelerate) forwards; }\n    :host([data-closing]) .drawer[data-placement=\"bottom\"] { animation: slideOutBottom var(--bq-duration-normal) var(--bq-easing-accelerate) forwards; }\n    @keyframes drwFadeOut { to { opacity: 0; } }\n    @keyframes slideOutRight  { to { transform: translateX(100%); } }\n    @keyframes slideOutLeft   { to { transform: translateX(-100%); } }\n    @keyframes slideOutTop    { to { transform: translateY(-100%); } }\n    @keyframes slideOutBottom { to { transform: translateY(100%); } }\n    .header { display: flex; align-items: center; justify-content: space-between; padding: var(--bq-space-5,1.25rem) var(--bq-space-6,1.5rem); border-bottom: 1px solid var(--bq-border-base,#e2e8f0); flex-shrink: 0; }\n    .title { font-size: var(--bq-font-size-lg,1.125rem); font-weight: var(--bq-font-weight-semibold,600); color: var(--bq-text-base,#0f172a); margin: 0; flex: 1; }\n    .close-btn { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; background: none; border: none; cursor: pointer; color: var(--bq-text-muted,#475569); border-radius: var(--bq-radius-md,0.375rem); font-size: 1rem; transition: background var(--bq-duration-fast); }\n    .close-btn:hover { background: var(--bq-bg-muted,#f1f5f9); }\n    .close-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .body { padding: var(--bq-space-6,1.5rem); overflow-y: auto; flex: 1; }\n    .footer { padding: var(--bq-space-4,1rem) var(--bq-space-6,1.5rem); border-top: 1px solid var(--bq-border-base,#e2e8f0); display: flex; gap: var(--bq-space-3,0.75rem); justify-content: flex-end; flex-shrink: 0; background: var(--bq-bg-subtle,#f8fafc); }\n    @media (prefers-reduced-motion: reduce) {\n      .backdrop, .drawer { animation: none !important; }\n      .close-btn { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'titleId', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    const record = self as unknown as Record<string, unknown>;\n    if (!self.getState<string>('titleId'))\n      self.setState('titleId', uniqueId('bq-drawer-title'));\n    const close = () => {\n      if (self.hasAttribute('data-closing')) return;\n      const clearCloseTimer = () => {\n        const closeTimer = record['_closeTimer'] as\n          | ReturnType<typeof setTimeout>\n          | undefined;\n        if (closeTimer) {\n          clearTimeout(closeTimer);\n          delete record['_closeTimer'];\n        }\n      };\n      const reducedMotion = self.ownerDocument.defaultView?.matchMedia?.(\n        '(prefers-reduced-motion: reduce)'\n      )?.matches;\n      const finalize = () => {\n        clearCloseTimer();\n        self.removeAttribute('data-closing');\n        self.removeAttribute('open');\n        self.dispatchEvent(\n          new CustomEvent('bq-close', { bubbles: true, composed: true })\n        );\n      };\n      if (reducedMotion) {\n        finalize();\n      } else {\n        self.setAttribute('data-closing', '');\n        const drawer = self.shadowRoot?.querySelector('.drawer');\n        const timeoutMs = drawer\n          ? getAnimationTimeoutMs(drawer, NORMAL_DURATION)\n          : 0;\n        if (timeoutMs <= 0) {\n          finalize();\n        } else {\n          record['_closeTimer'] = setTimeout(finalize, Math.ceil(timeoutMs) + 20);\n        }\n      }\n    };\n    const kh = (e: Event) => {\n      if ((e as KeyboardEvent).key === 'Escape' && self.hasAttribute('open'))\n        close();\n    };\n    const bh = (e: Event) => {\n      if ((e.target as Element).classList.contains('backdrop')) close();\n    };\n    const ch = (e: Event) => {\n      if ((e.target as Element).closest('.close-btn')) close();\n    };\n    const s = self as unknown as Record<string, unknown>;\n    s['_kh'] = kh;\n    s['_bh'] = bh;\n    s['_ch'] = ch;\n    document.addEventListener('keydown', kh);\n    self.shadowRoot?.addEventListener('click', bh);\n    self.shadowRoot?.addEventListener('click', ch);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    cleanupOverlayFocus(s as unknown as OverlayFocusState);\n    const kh = s['_kh'] as EventListener | undefined;\n    if (kh) document.removeEventListener('keydown', kh);\n    const bh = s['_bh'] as EventListener | undefined;\n    if (bh) this.shadowRoot?.removeEventListener('click', bh);\n    const ch = s['_ch'] as EventListener | undefined;\n    if (ch) this.shadowRoot?.removeEventListener('click', ch);\n    const closeTimer = s['_closeTimer'] as ReturnType<typeof setTimeout> | undefined;\n    if (closeTimer) {\n      clearTimeout(closeTimer);\n      delete s['_closeTimer'];\n      this.removeAttribute('data-closing');\n      this.removeAttribute('open');\n    }\n  },\n  updated() {\n    updateOverlayFocus(this, this as unknown as OverlayFocusState, '.drawer');\n  },\n  render({ props, state }) {\n    const titleId = state.titleId || 'bq-drawer-title';\n    return html`\n      <div class=\"backdrop\" part=\"backdrop\" role=\"presentation\">\n        <div\n          class=\"drawer\"\n          part=\"drawer\"\n          data-placement=\"${escapeHtml(props.placement)}\"\n          data-size=\"${escapeHtml(props.size)}\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-labelledby=\"${escapeHtml(titleId)}\"\n          tabindex=\"-1\"\n        >\n          <div class=\"header\" part=\"header\">\n            <h2 class=\"title\" id=\"${escapeHtml(titleId)}\" part=\"title\">\n              ${escapeHtml(props.title)}\n            </h2>\n            <button\n              class=\"close-btn\"\n              type=\"button\"\n              aria-label=\"${t('drawer.close')}\"\n              part=\"close\"\n            >\n              &#10005;\n            </button>\n          </div>\n          <div class=\"body\" part=\"body\"><slot></slot></div>\n          <div class=\"footer\" part=\"footer\"><slot name=\"footer\"></slot></div>\n        </div>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqDrawerProps, BqDrawerState>('bq-drawer', definition);\n","/**\n * Empty state component - placeholder for empty content areas.\n * @element bq-empty-state\n * @prop {string} title       - Main heading\n * @prop {string} description - Descriptive text\n * @prop {string} icon        - Icon character/emoji\n * @slot - Additional content (e.g. action button)\n */\nimport { component, html } from '@bquery/bquery/component';\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqEmptyStateProps = { title: string; description: string; icon: string };\n\nconst definition: ComponentDefinition<BqEmptyStateProps> = {\n  props: {\n    title:       { type: String, default: '' },\n    description: { type: String, default: '' },\n    icon:        { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .empty {\n      display: flex; flex-direction: column; align-items: center; justify-content: center;\n      text-align: center; padding: var(--bq-space-12,3rem) var(--bq-space-6,1.5rem);\n      font-family: var(--bq-font-family-sans);\n    }\n    .icon { font-size: 3rem; line-height: 1; margin-bottom: var(--bq-space-4,1rem); color: var(--bq-text-subtle,#94a3b8); }\n    .title { font-size: var(--bq-font-size-xl,1.25rem); font-weight: var(--bq-font-weight-semibold,600); color: var(--bq-text-base,#0f172a); margin: 0 0 0.5rem; }\n    .description { font-size: var(--bq-font-size-md,1rem); color: var(--bq-text-muted,#475569); margin: 0 0 var(--bq-space-6,1.5rem); max-width: 28rem; }\n    .actions { display: flex; gap: var(--bq-space-3,0.75rem); flex-wrap: wrap; justify-content: center; }\n  `,\n  render({ props }) {\n    const title = props.title.trim() || t('emptyState.title');\n    const description = props.description.trim() || t('emptyState.description');\n    return html`\n      <div part=\"empty-state\" class=\"empty\" role=\"status\" aria-live=\"polite\">\n        ${props.icon ? `<span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${escapeHtml(props.icon)}</span>` : ''}\n        ${title ? `<h3 class=\"title\" part=\"title\">${escapeHtml(title)}</h3>` : ''}\n        ${description ? `<p class=\"description\" part=\"description\">${escapeHtml(description)}</p>` : ''}\n        <div class=\"actions\" part=\"actions\"><slot></slot></div>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqEmptyStateProps>('bq-empty-state', definition);\n","/**\n * Icon button component - square button for icon-only actions.\n * @element bq-icon-button\n * @prop {string}  variant  - primary | secondary | outline | ghost | danger\n * @prop {string}  size     - sm | md | lg\n * @prop {boolean} disabled\n * @prop {boolean} loading\n * @prop {string}  label    - Preferred accessible label\n * @prop {string}  title    - Optional tooltip and accessible-name fallback\n * @prop {string}  href\n * @slot - Icon content\n * @fires bq-click\n */\nimport { component, html } from '@bquery/bquery/component';\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqIconButtonProps = {\n  variant: string; size: string; disabled: boolean; loading: boolean;\n  label: string; href: string; title: string;\n};\ntype BqIconButtonState = { statusId: string };\n\nconst definition: ComponentDefinition<BqIconButtonProps, BqIconButtonState> = {\n  props: {\n    variant: { type: String, default: 'ghost' },\n    size:    { type: String, default: 'md' },\n    disabled:{ type: Boolean, default: false },\n    loading: { type: Boolean, default: false },\n    label:   { type: String, default: '' },\n    href:    { type: String, default: '' },\n    title:   { type: String, default: '' },\n  },\n  state: {\n    statusId: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: inline-block; }\n    .btn {\n      display: inline-flex; align-items: center; justify-content: center;\n      border: 1.5px solid transparent; border-radius: var(--bq-radius-lg,0.5rem);\n      font-family: var(--bq-font-family-sans); cursor: pointer;\n      text-decoration: none; transition: background-color var(--bq-duration-fast) var(--bq-easing-standard),\n        border-color var(--bq-duration-fast) var(--bq-easing-standard), opacity var(--bq-duration-fast);\n      flex-shrink: 0;\n    }\n    .btn[data-size=\"sm\"] { width: 2rem; height: 2rem; font-size: 1rem; }\n    .btn[data-size=\"md\"] { width: 2.5rem; height: 2.5rem; font-size: 1.125rem; }\n    .btn[data-size=\"lg\"] { width: 3rem; height: 3rem; font-size: 1.25rem; }\n    .btn[data-variant=\"primary\"] { background-color: var(--bq-color-primary-600,#2563eb); color: #fff; border-color: var(--bq-color-primary-600,#2563eb); }\n    .btn[data-variant=\"primary\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-primary-700,#1d4ed8); }\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); }\n    .btn[data-variant=\"outline\"] { background-color: transparent; color: var(--bq-color-primary-600,#2563eb); border-color: var(--bq-color-primary-600,#2563eb); }\n    .btn[data-variant=\"ghost\"] { background-color: transparent; color: var(--bq-color-secondary-700,#334155); }\n    .btn[data-variant=\"ghost\"]:hover:not(:disabled):not([aria-disabled=\"true\"]) { background-color: var(--bq-color-secondary-100,#f1f5f9); }\n    .btn[data-variant=\"danger\"] { background-color: var(--bq-color-danger-600,#dc2626); color: #fff; border-color: var(--bq-color-danger-600,#dc2626); }\n    .btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .btn:disabled, .btn[aria-disabled=\"true\"] { opacity: 0.5; cursor: not-allowed; }\n    .spinner { width: 1em; height: 1em; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: spin 0.7s linear infinite; }\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; }\n    @keyframes spin { to { transform: rotate(360deg); } }\n    @media (prefers-reduced-motion: reduce) {\n      .btn, .spinner { transition: none; animation: none; }\n    }\n  `,\n  connected() {\n    type BqIconButtonElement = HTMLElement & { setState(k: 'statusId', v: string): void; getState<T>(k: string): T };\n    const self = this as unknown as BqIconButtonElement;\n    if (!self.getState<string>('statusId')) self.setState('statusId', uniqueId('bq-icon-button-status'));\n    const handler = (e: Event) => {\n      if (self.hasAttribute('disabled') || self.hasAttribute('loading')) { e.preventDefault(); e.stopPropagation(); return; }\n      self.dispatchEvent(new CustomEvent('bq-click', { detail: { originalEvent: e }, bubbles: true, composed: true }));\n    };\n    (self as unknown as Record<string, unknown>)['_clickHandler'] = handler;\n    self.shadowRoot?.addEventListener('click', handler);\n  },\n  disconnected() {\n    const handler = (this as unknown as Record<string, unknown>)['_clickHandler'] as EventListener | undefined;\n    if (handler) this.shadowRoot?.removeEventListener('click', handler);\n  },\n  render({ props, state }) {\n    const tag = props.href ? 'a' : 'button';\n    const isLink = tag === 'a';\n    const disabled = props.disabled || props.loading;\n    const trimmedLabel = props.label.trim();\n    const trimmedTitle = props.title.trim();\n    const accessibleLabel = trimmedLabel || trimmedTitle || t('iconButton.defaultLabel');\n    const loadingLabel = t('common.loading');\n    const statusId = state.statusId || 'bq-icon-button-status';\n    const statusMarkup = props.loading\n      ? `<span class=\"sr-only\" id=\"${escapeHtml(statusId)}\" role=\"status\" aria-live=\"polite\">${escapeHtml(loadingLabel)}</span>`\n      : '';\n    return html`\n      <${tag}\n        part=\"button\"\n        class=\"btn\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n        data-size=\"${escapeHtml(props.size)}\"\n        aria-label=\"${escapeHtml(accessibleLabel)}\"\n        ${trimmedTitle ? `title=\"${escapeHtml(trimmedTitle)}\"` : ''}\n        ${!isLink ? 'type=\"button\"' : ''}\n        ${props.href ? `href=\"${escapeHtml(props.href)}\"` : ''}\n        ${!isLink && disabled ? 'disabled' : ''}\n        ${disabled ? 'aria-disabled=\"true\"' : ''}\n        ${isLink && disabled ? 'tabindex=\"-1\"' : ''}\n        ${props.loading ? `aria-busy=\"true\" aria-describedby=\"${escapeHtml(statusId)}\"` : ''}\n      >\n        ${props.loading ? '<span class=\"spinner\" aria-hidden=\"true\"></span>' : ''}\n        <slot></slot>\n      </${tag}>\n      ${statusMarkup}\n    `;\n  },\n};\n\ncomponent<BqIconButtonProps, BqIconButtonState>('bq-icon-button', definition);\n","/**\n * Text input form field.\n * @element bq-input\n * @prop {string}  label       - Field label\n * @prop {string}  type        - text | email | password | number | tel | url | search\n * @prop {string}  value\n * @prop {string}  placeholder\n * @prop {string}  name\n * @prop {string}  size        - sm | md | lg\n * @prop {boolean} disabled\n * @prop {boolean} readonly\n * @prop {boolean} required\n * @prop {string}  error       - Error message (non-empty = error state)\n * @prop {string}  hint\n * @prop {string}  maxlength\n * @prop {boolean} show-counter - Show character counter when maxlength is set\n * @slot prefix - Leading icon/element\n * @slot suffix - Trailing icon/element\n * @fires bq-input  - { value: string }\n * @fires bq-change - { value: string }\n * @fires bq-focus\n * @fires bq-blur\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqInputProps = {\n  label: string;\n  type: string;\n  value: string;\n  placeholder: string;\n  name: string;\n  size: string;\n  disabled: boolean;\n  readonly: boolean;\n  required: boolean;\n  error: string;\n  hint: string;\n  maxlength: string;\n  'show-counter': boolean;\n};\ntype BqInputState = { uid: string; passwordVisible: boolean };\ntype BqInputEl = HTMLElement & {\n  setState(k: 'uid' | 'passwordVisible', v: string | boolean): void;\n  getState<T>(k: string): T;\n};\n\nconst definition: ComponentDefinition<BqInputProps, BqInputState> = {\n  props: {\n    label: { type: String, default: '' },\n    type: { type: String, default: 'text' },\n    value: { type: String, default: '' },\n    placeholder: { type: String, default: '' },\n    name: { type: String, default: '' },\n    size: { type: String, default: 'md' },\n    disabled: { type: Boolean, default: false },\n    readonly: { type: Boolean, default: false },\n    required: { type: Boolean, default: false },\n    error: { type: String, default: '' },\n    hint: { type: String, default: '' },\n    maxlength: { type: String, default: '' },\n    'show-counter': { type: Boolean, default: false },\n  },\n  state: {\n    uid: '',\n    passwordVisible: false,\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .field { display: flex; flex-direction: column; gap: 0.375rem; }\n    .label { display: flex; align-items: center; gap: 0.25rem; font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500); color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); }\n    .required-mark { color: var(--bq-color-danger-600,#dc2626); }\n    .input-wrap {\n      display: flex; align-items: center;\n      border: 1.5px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-lg,0.5rem);\n      background: var(--bq-bg-base,#fff);\n      transition: border-color var(--bq-duration-fast) var(--bq-easing-standard), box-shadow var(--bq-duration-fast) var(--bq-easing-standard);\n      overflow: hidden;\n    }\n    .input-wrap:focus-within { border-color: var(--bq-border-focus,#2563eb); box-shadow: var(--bq-focus-ring); }\n    :host([error]:not([error=\"\"])) .input-wrap { border-color: var(--bq-color-danger-500,#ef4444); }\n    :host([error]:not([error=\"\"])) .input-wrap:focus-within { border-color: var(--bq-color-danger-500,#ef4444); box-shadow: var(--bq-focus-ring-danger); }\n    :host([disabled]) .input-wrap { opacity: 0.5; cursor: not-allowed; background: var(--bq-bg-muted,#f1f5f9); }\n    .slot-wrap { display: flex; align-items: center; padding: 0 0.5rem; color: var(--bq-text-muted,#475569); }\n    input {\n      flex: 1; border: none; outline: none; background: transparent;\n      color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); width: 100%;\n    }\n    :host([size=\"sm\"]) input { font-size: 0.875rem; padding: 0.375rem 0.75rem; min-height: 2rem; }\n    :host([size=\"md\"]) input, :host(:not([size])) input { font-size: 1rem; padding: 0.5rem 0.875rem; min-height: 2.5rem; }\n    :host([size=\"lg\"]) input { font-size: 1.125rem; padding: 0.625rem 1rem; min-height: 3rem; }\n    input::placeholder { color: var(--bq-text-subtle,#94a3b8); }\n    input:disabled { cursor: not-allowed; }\n    .hint { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); }\n    .error-msg { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-color-danger-600,#dc2626); font-family: var(--bq-font-family-sans); }\n    .footer { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }\n    .counter { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); margin-left: auto; }\n    .counter[data-over=\"true\"] { color: var(--bq-color-danger-600,#dc2626); }\n    .password-toggle {\n      display: inline-flex; align-items: center; justify-content: center;\n      background: none; border: none; cursor: pointer; padding: 0 0.25rem;\n      color: var(--bq-text-muted,#475569); font-size: 0.875rem; line-height: 1;\n    }\n    .password-toggle:hover { color: var(--bq-text-base,#0f172a); }\n    .password-toggle:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); border-radius: var(--bq-radius-sm,0.25rem); }\n    .pw-icon { font-size: 1.125rem; line-height: 1; }\n    @media (prefers-reduced-motion: reduce) {\n      input, .input-wrap { transition: none; }\n    }\n  `,\n  connected() {\n    const self = this as unknown as BqInputEl;\n    if (!self.getState<string>('uid'))\n      self.setState('uid', uniqueId('bq-input'));\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.getAttribute('value') ?? '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const ih = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (input?.tagName === 'INPUT') {\n        self.setAttribute('value', input.value);\n        proxy.setValue(input.value);\n        self.dispatchEvent(\n          new CustomEvent('bq-input', {\n            detail: { value: input.value },\n            bubbles: true,\n            composed: true,\n          })\n        );\n      }\n    };\n    const ch = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (input?.tagName === 'INPUT')\n        self.dispatchEvent(\n          new CustomEvent('bq-change', {\n            detail: { value: input.value },\n            bubbles: true,\n            composed: true,\n          })\n        );\n    };\n    const fh = (e: Event) => {\n      if ((e.target as Element)?.tagName === 'INPUT')\n        self.dispatchEvent(\n          new CustomEvent('bq-focus', { bubbles: true, composed: true })\n        );\n    };\n    const bh = (e: Event) => {\n      if ((e.target as Element)?.tagName === 'INPUT')\n        self.dispatchEvent(\n          new CustomEvent('bq-blur', { bubbles: true, composed: true })\n        );\n    };\n    // Password visibility toggle\n    const pwToggle = (e: Event) => {\n      if (self.hasAttribute('disabled') || self.hasAttribute('readonly'))\n        return;\n      if ((e.target as Element)?.closest('.password-toggle')) {\n        const current = self.getState<boolean>('passwordVisible');\n        self.setState('passwordVisible', !current);\n      }\n    };\n    const s = self as unknown as Record<string, unknown>;\n    s['_ih'] = ih;\n    s['_ch'] = ch;\n    s['_fh'] = fh;\n    s['_bh'] = bh;\n    s['_pwToggle'] = pwToggle;\n    self.shadowRoot?.addEventListener('input', ih);\n    self.shadowRoot?.addEventListener('change', ch);\n    self.shadowRoot?.addEventListener('focusin', fh);\n    self.shadowRoot?.addEventListener('focusout', bh);\n    self.shadowRoot?.addEventListener('click', pwToggle);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const sr = this.shadowRoot;\n    const ih = s['_ih'] as EventListener | undefined;\n    if (ih) sr?.removeEventListener('input', ih);\n    const ch = s['_ch'] as EventListener | undefined;\n    if (ch) sr?.removeEventListener('change', ch);\n    const fh = s['_fh'] as EventListener | undefined;\n    if (fh) sr?.removeEventListener('focusin', fh);\n    const bh = s['_bh'] as EventListener | undefined;\n    if (bh) sr?.removeEventListener('focusout', bh);\n    const pwToggle = s['_pwToggle'] as EventListener | undefined;\n    if (pwToggle) sr?.removeEventListener('click', pwToggle);\n    (s['_formProxy'] as FormProxy | undefined)?.cleanup();\n  },\n  updated() {\n    const self = this as unknown as BqInputEl;\n    if (\n      this.getAttribute('type') !== 'password' &&\n      self.getState<boolean>('passwordVisible')\n    ) {\n      self.setState('passwordVisible', false);\n    }\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(this.getAttribute('value') ?? '');\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props, state }) {\n    const hasError = Boolean(props.error);\n    const uid = state.uid || 'bq-input';\n    const isPassword = props.type === 'password';\n    const effectiveType =\n      isPassword && state.passwordVisible ? 'text' : props.type;\n    const maxLen = props.maxlength ? parseInt(props.maxlength, 10) : 0;\n    const showCounter = props['show-counter'] && maxLen > 0;\n    const charCount = props.value.length;\n    const isOver = showCounter && charCount > maxLen;\n    const hasFooter = hasError || Boolean(props.hint) || showCounter;\n    const describedByParts: string[] = [];\n    if (hasError) describedByParts.push(`${uid}-err`);\n    else if (props.hint) describedByParts.push(`${uid}-hint`);\n    if (showCounter) describedByParts.push(`${uid}-counter`);\n    const describedBy = describedByParts.join(' ');\n    return html`\n      <div class=\"field\" part=\"field\">\n        ${props.label\n          ? `<label class=\"label\" for=\"${uid}\" part=\"label\">${escapeHtml(props.label)}${props.required ? '<span class=\"required-mark\" aria-hidden=\"true\"> *</span>' : ''}</label>`\n          : ''}\n        <div class=\"input-wrap\" part=\"input-wrap\">\n          <span class=\"slot-wrap\" part=\"prefix\"\n            ><slot name=\"prefix\"></slot\n          ></span>\n          <input\n            part=\"input\"\n            id=\"${uid}\"\n            type=\"${escapeHtml(effectiveType)}\"\n            name=\"${escapeHtml(props.name)}\"\n            placeholder=\"${escapeHtml(props.placeholder)}\"\n            value=\"${escapeHtml(props.value)}\"\n            ${props.maxlength\n              ? `maxlength=\"${escapeHtml(props.maxlength)}\"`\n              : ''}\n            ${props.disabled ? 'disabled' : ''}\n            ${props.readonly ? 'readonly' : ''}\n            ${props.required ? 'required' : ''}\n            aria-invalid=\"${hasError ? 'true' : 'false'}\"\n            ${props.required ? 'aria-required=\"true\"' : ''}\n            ${describedBy ? `aria-describedby=\"${describedBy}\"` : ''}\n          />\n          ${isPassword\n            ? `<button type=\"button\" class=\"password-toggle\" part=\"password-toggle\" aria-label=\"${escapeHtml(state.passwordVisible ? t('input.hidePassword') : t('input.showPassword'))}\" aria-pressed=\"${state.passwordVisible ? 'true' : 'false'}\" ${props.disabled || props.readonly ? 'disabled aria-disabled=\"true\"' : ''}>\n                <span class=\"pw-icon\" aria-hidden=\"true\">${state.passwordVisible ? '&#9673;' : '&#9678;'}</span>\n              </button>`\n            : ''}\n          <span class=\"slot-wrap\" part=\"suffix\"\n            ><slot name=\"suffix\"></slot\n          ></span>\n        </div>\n        ${hasFooter\n          ? `<div class=\"footer\" part=\"footer\">\n              <span>\n                ${\n                  hasError\n                    ? `<span class=\"error-msg\" id=\"${uid}-err\" role=\"alert\" part=\"error\">${escapeHtml(props.error)}</span>`\n                    : ''\n                }\n                ${\n                  props.hint && !hasError\n                    ? `<span class=\"hint\" id=\"${uid}-hint\" part=\"hint\">${escapeHtml(props.hint)}</span>`\n                    : ''\n                }\n              </span>\n              ${\n                showCounter\n                  ? `<span class=\"counter\" id=\"${uid}-counter\" part=\"counter\" data-over=\"${isOver ? 'true' : 'false'}\" aria-live=\"polite\">${escapeHtml(t('input.characterCount', { count: charCount, max: maxLen }))}</span>`\n                  : ''\n              }\n            </div>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqInputProps, BqInputState>('bq-input', definition);\n","/**\n * Pagination navigation component.\n * @element bq-pagination\n * @prop {number}  page          - Current page (1-based)\n * @prop {number}  total         - Total number of pages\n * @prop {number}  sibling-count - Number of sibling pages each side\n * @prop {boolean} disabled\n * @fires bq-page-change - { page: number }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqPaginationProps = {\n  page: number;\n  total: number;\n  'sibling-count': number;\n  disabled: boolean;\n};\n\nfunction buildPages(\n  page: number,\n  total: number,\n  siblings: number\n): Array<number | '...'> {\n  if (total <= 0) return [1];\n  const validPage = Math.max(1, Math.min(page, total));\n  if (total <= 7 + siblings * 2)\n    return Array.from({ length: total }, (_, i) => i + 1);\n  const left = Math.max(2, validPage - siblings);\n  const right = Math.min(total - 1, validPage + siblings);\n  const showLeft = left > 2;\n  const showRight = right < total - 1;\n  const pages: Array<number | '...'> = [1];\n  if (showLeft) pages.push('...');\n  for (let i = left; i <= right; i++) pages.push(i);\n  if (showRight) pages.push('...');\n  pages.push(total);\n  return pages;\n}\n\nconst definition: ComponentDefinition<BqPaginationProps> = {\n  props: {\n    page: { type: Number, default: 1 },\n    total: { type: Number, default: 1 },\n    'sibling-count': { type: Number, default: 1 },\n    disabled: { type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .pagination { display: flex; align-items: center; gap: 0.25rem; flex-wrap: wrap; font-family: var(--bq-font-family-sans); }\n    :host([disabled]) .pagination { opacity: 0.5; pointer-events: none; }\n    .page-btn {\n      display: inline-flex; align-items: center; justify-content: center;\n      min-width: 2.25rem; height: 2.25rem; padding: 0 0.5rem;\n      border: 1.5px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-md,0.375rem);\n      background: var(--bq-bg-base,#fff); color: var(--bq-text-base,#0f172a);\n      font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500);\n      cursor: pointer; font-family: inherit;\n      transition: all var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    .page-btn:hover:not(:disabled):not([data-current=\"true\"]) { background: var(--bq-bg-muted,#f1f5f9); border-color: var(--bq-color-primary-300,#93c5fd); }\n    .page-btn[data-current=\"true\"] { background: var(--bq-color-primary-600,#2563eb); border-color: var(--bq-color-primary-600,#2563eb); color: #fff; }\n    .page-btn:disabled { opacity: 0.45; cursor: not-allowed; }\n    .page-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .ellipsis { display: inline-flex; align-items: center; justify-content: center; min-width: 2.25rem; height: 2.25rem; color: var(--bq-text-subtle,#94a3b8); font-size: var(--bq-font-size-sm,0.875rem); }\n    @media (prefers-reduced-motion: reduce) {\n      .page-btn { transition: none; }\n    }\n  `,\n  connected() {\n    const self = this;\n    const handler = (e: Event) => {\n      const btn = (e.target as Element).closest(\n        '.page-btn'\n      ) as HTMLElement | null;\n      if (!btn || btn.hasAttribute('disabled') || self.hasAttribute('disabled'))\n        return;\n      const p = parseInt(btn.getAttribute('data-page') ?? '0', 10);\n      if (!p || isNaN(p)) return;\n      self.setAttribute('page', String(p));\n      self.dispatchEvent(\n        new CustomEvent('bq-page-change', {\n          detail: { page: p },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    self.shadowRoot?.addEventListener('click', handler);\n  },\n  disconnected() {\n    const h = (this as unknown as Record<string, unknown>)['_handler'] as\n      | EventListener\n      | undefined;\n    if (h) this.shadowRoot?.removeEventListener('click', h);\n  },\n  render({ props }) {\n    const page = Math.max(1, Math.min(props.page, props.total || 1));\n    const total = props.total;\n    const siblings = props['sibling-count'];\n    const pages = buildPages(page, total, siblings);\n    const prevDisabled = page <= 1 || props.disabled;\n    const nextDisabled = page >= total || props.disabled;\n    const pageItems = pages\n      .map((p) => {\n        if (p === '...')\n          return '<span class=\"ellipsis\" role=\"separator\" aria-hidden=\"true\">&#8230;</span>';\n        return `<button class=\"page-btn\" data-page=\"${p}\" data-current=\"${p === page ? 'true' : 'false'}\" ${p === page ? 'aria-current=\"page\"' : ''} type=\"button\" aria-label=\"${t('pagination.page')} ${p}\">${p}</button>`;\n      })\n      .join('');\n    return html`\n      <nav aria-label=\"${t('pagination.nav')}\" part=\"nav\">\n        <div class=\"pagination\" part=\"pagination\">\n          <button\n            class=\"page-btn\"\n            data-page=\"${String(page - 1)}\"\n            ${prevDisabled ? 'disabled' : ''}\n            aria-label=\"${t('pagination.prev')}\"\n            type=\"button\"\n          >\n            &#8249;\n          </button>\n          ${pageItems}\n          <button\n            class=\"page-btn\"\n            data-page=\"${String(page + 1)}\"\n            ${nextDisabled ? 'disabled' : ''}\n            aria-label=\"${t('pagination.next')}\"\n            type=\"button\"\n          >\n            &#8250;\n          </button>\n        </div>\n      </nav>\n    `;\n  },\n};\n\ncomponent<BqPaginationProps>('bq-pagination', definition);\n","/**\n * Progress bar component.\n * @element bq-progress\n * @prop {number}  value         - Current value (0-max)\n * @prop {number}  max           - Maximum value\n * @prop {string}  size          - sm | md | lg\n * @prop {string}  variant       - primary | success | danger | warning\n * @prop {boolean} indeterminate - Indeterminate/loading state\n * @prop {string}  label         - Accessible label\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqProgressProps = {\n  value: number;\n  max: number;\n  size: string;\n  variant: string;\n  indeterminate: boolean;\n  label: string;\n};\n\nconst definition: ComponentDefinition<BqProgressProps> = {\n  props: {\n    value: { type: Number, default: 0 },\n    max: { type: Number, default: 100 },\n    size: { type: String, default: 'md' },\n    variant: { type: String, default: 'primary' },\n    indeterminate: { type: Boolean, default: false },\n    label: { type: String, default: '' },\n  },\n  sanitize: {\n    allowAttributes: ['style'],\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: block; }\n    .track {\n      background: var(--bq-bg-emphasis,#e2e8f0); border-radius: var(--bq-radius-full,9999px);\n      overflow: hidden; width: 100%;\n    }\n    .track[data-size=\"sm\"] { height: 0.375rem; }\n    .track[data-size=\"md\"] { height: 0.625rem; }\n    .track[data-size=\"lg\"] { height: 1rem; }\n    .bar {\n      height: 100%; border-radius: inherit;\n      transition: width var(--bq-duration-normal) var(--bq-easing-standard);\n    }\n    .bar[data-variant=\"primary\"] { background: var(--bq-color-primary-600,#2563eb); }\n    .bar[data-variant=\"success\"] { background: var(--bq-color-success-600,#16a34a); }\n    .bar[data-variant=\"danger\"]  { background: var(--bq-color-danger-600,#dc2626); }\n    .bar[data-variant=\"warning\"] { background: var(--bq-color-warning-600,#d97706); }\n    :host([indeterminate]) .bar {\n      width: 40% !important;\n      animation: indeterminate 1.4s linear infinite;\n      will-change: transform;\n    }\n    @keyframes indeterminate { 0% { transform: translateX(-150%); } 100% { transform: translateX(350%); } }\n    .label { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); margin-bottom: 0.375rem; font-family: var(--bq-font-family-sans); }\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; }\n    @media (prefers-reduced-motion: reduce) {\n      .bar { transition: none; }\n      :host([indeterminate]) .bar { animation: none; width: 40% !important; opacity: 0.7; }\n    }\n  `,\n  render({ props }) {\n    const max = props.max > 0 ? props.max : 100;\n    const value = Math.min(max, Math.max(0, props.value));\n    const pct = props.indeterminate\n      ? 0\n      : Math.min(100, Math.max(0, (value / max) * 100));\n    const accessibleLabel =\n      props.label ||\n      (props.indeterminate ? t('common.loading') : t('progress.ariaLabel'));\n    const valueText = props.indeterminate\n      ? t('common.loading')\n      : `${Math.round(pct)}%`;\n    return html`\n      ${props.label\n        ? `<div class=\"label\" part=\"label\">${escapeHtml(props.label)}</div>`\n        : ''}\n      <div\n        part=\"track\"\n        class=\"track\"\n        data-size=\"${escapeHtml(props.size)}\"\n        role=\"progressbar\"\n        ${props.indeterminate\n          ? `aria-busy=\"true\" aria-valuetext=\"${escapeHtml(valueText)}\"`\n          : `aria-valuenow=\"${String(value)}\" aria-valuemin=\"0\" aria-valuemax=\"${String(max)}\" aria-valuetext=\"${escapeHtml(valueText)}\"`}\n        aria-label=\"${escapeHtml(accessibleLabel)}\"\n      >\n        <div\n          part=\"bar\"\n          class=\"bar\"\n          data-variant=\"${escapeHtml(props.variant)}\"\n          data-value=\"${String(Math.round(pct))}\"\n          style=\"width:${String(Math.round(pct))}%\"\n        ></div>\n      </div>\n      <span class=\"sr-only\"\n        >${escapeHtml(\n          props.indeterminate\n            ? accessibleLabel\n            : props.label\n              ? `${props.label}: ${Math.round(pct)}%`\n              : `${Math.round(pct)}%`\n        )}</span\n      >\n    `;\n  },\n};\n\ncomponent<BqProgressProps>('bq-progress', definition);\n","/**\n * Radio button form control.\n * @element bq-radio\n * @prop {string}  label    - Visible label\n * @prop {string}  name     - Input name (group)\n * @prop {string}  value    - Input value\n * @prop {boolean} checked\n * @prop {boolean} disabled\n * @prop {boolean} required\n * @prop {string}  hint\n * @fires bq-change - { value: string, checked: boolean }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqRadioProps = {\n  label: string;\n  name: string;\n  value: string;\n  checked: boolean;\n  disabled: boolean;\n  required: boolean;\n  hint: string;\n};\n\nconst definition: ComponentDefinition<BqRadioProps> = {\n  props: {\n    label: { type: String, default: '' },\n    name: { type: String, default: '' },\n    value: { type: String, default: '' },\n    checked: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n    required: { type: Boolean, default: false },\n    hint: { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .wrapper { display: flex; flex-direction: column; gap: 0.25rem; }\n    .control { display: flex; align-items: flex-start; gap: 0.625rem; cursor: pointer; }\n    :host([disabled]) .control { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n    input[type=\"radio\"] {\n      width: 1.125rem; height: 1.125rem; flex-shrink: 0;\n      border: 2px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: 50%; background: var(--bq-bg-base,#fff);\n      cursor: pointer; accent-color: var(--bq-color-primary-600,#2563eb); margin-top: 0.125rem;\n    }\n    input[type=\"radio\"]:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .label-text { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); line-height: 1.5; }\n    .required-mark { color: var(--bq-color-danger-600,#dc2626); }\n    .hint { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); padding-inline-start: 1.75rem; }\n  `,\n  connected() {\n    const self = this;\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.hasAttribute('checked')\n      ? (self.getAttribute('value') ?? '')\n      : '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const handler = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (input?.type !== 'radio') return;\n      if (input.checked) self.setAttribute('checked', '');\n      else self.removeAttribute('checked');\n      proxy.setValue(input.checked ? (self.getAttribute('value') ?? '') : '');\n      self.dispatchEvent(\n        new CustomEvent('bq-change', {\n          detail: {\n            value: self.getAttribute('value') ?? '',\n            checked: input.checked,\n          },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    self.shadowRoot?.addEventListener('change', handler);\n  },\n  disconnected() {\n    const h = (this as unknown as Record<string, unknown>)['_handler'] as\n      | EventListener\n      | undefined;\n    if (h) this.shadowRoot?.removeEventListener('change', h);\n    (\n      (this as unknown as Record<string, unknown>)['_formProxy'] as\n        | FormProxy\n        | undefined\n    )?.cleanup();\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(\n        this.hasAttribute('checked') ? (this.getAttribute('value') ?? '') : ''\n      );\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props }) {\n    return html`\n      <div class=\"wrapper\" part=\"wrapper\">\n        <label class=\"control\" part=\"control\">\n          <input\n            type=\"radio\"\n            part=\"input\"\n            name=\"${escapeHtml(props.name)}\"\n            value=\"${escapeHtml(props.value)}\"\n            ${props.checked ? 'checked' : ''}\n            ${props.disabled ? 'disabled' : ''}\n            ${props.required ? 'required' : ''}\n          />\n          ${props.label\n            ? `<span class=\"label-text\" part=\"label\">${escapeHtml(props.label)}${props.required ? '<span class=\"required-mark\" aria-hidden=\"true\"> *</span>' : ''}</span>`\n            : ''}\n        </label>\n        ${props.hint\n          ? `<span class=\"hint\" part=\"hint\">${escapeHtml(props.hint)}</span>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqRadioProps>('bq-radio', definition);\n","/**\n * Select / dropdown form field.\n * @element bq-select\n * @prop {string}  label\n * @prop {string}  value\n * @prop {string}  placeholder\n * @prop {string}  name\n * @prop {boolean} disabled\n * @prop {boolean} required\n * @prop {string}  error\n * @prop {string}  hint\n * @prop {string}  size    - sm | md | lg\n * @slot - <option> elements\n * @fires bq-change - { value: string }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { uniqueId } from '../../utils/dom.js';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSelectProps = {\n  label: string;\n  value: string;\n  placeholder: string;\n  name: string;\n  disabled: boolean;\n  required: boolean;\n  error: string;\n  hint: string;\n  size: string;\n};\ntype BqSelectState = { uid: string; optionsMarkup: string };\n\nconst serializeOption = (\n  option: Element,\n  selectedValue: string,\n  hasExplicitValue: boolean\n): string => {\n  const optionValue =\n    option.getAttribute('value') ?? option.textContent?.trim() ?? '';\n  const attrs = [`value=\"${escapeHtml(optionValue)}\"`];\n  if (option.hasAttribute('disabled')) attrs.push('disabled');\n  if (\n    hasExplicitValue\n      ? optionValue === selectedValue\n      : option.hasAttribute('selected')\n  ) {\n    attrs.push('selected');\n  }\n  return `<option ${attrs.join(' ')}>${escapeHtml(option.textContent?.trim() ?? '')}</option>`;\n};\n\nconst serializeOptGroup = (\n  group: Element,\n  selectedValue: string,\n  hasExplicitValue: boolean\n): string => {\n  const optionsMarkup = Array.from(group.children)\n    .filter((child) => child.tagName.toLowerCase() === 'option')\n    .map((option) => serializeOption(option, selectedValue, hasExplicitValue))\n    .join('');\n  const disabled = group.hasAttribute('disabled') ? ' disabled' : '';\n  return `<optgroup label=\"${escapeHtml(group.getAttribute('label') ?? '')}\"${disabled}>${optionsMarkup}</optgroup>`;\n};\n\nconst buildOptionsMarkup = (host: HTMLElement, placeholder: string): string => {\n  const selectedValue = host.getAttribute('value') ?? '';\n  const hasExplicitValue = host.hasAttribute('value');\n  const placeholderMarkup = placeholder\n    ? `<option value=\"\" ${!selectedValue ? 'selected' : ''} disabled>${escapeHtml(placeholder)}</option>`\n    : '';\n  const childrenMarkup = Array.from(host.children)\n    .map((child) => {\n      if (child.tagName.toLowerCase() === 'option') {\n        return serializeOption(child, selectedValue, hasExplicitValue);\n      }\n      if (child.tagName.toLowerCase() === 'optgroup') {\n        return serializeOptGroup(child, selectedValue, hasExplicitValue);\n      }\n      return '';\n    })\n    .join('');\n  return `${placeholderMarkup}${childrenMarkup}`;\n};\n\nconst syncSelectValue = (host: HTMLElement): void => {\n  const select = host.shadowRoot?.querySelector(\n    'select'\n  ) as HTMLSelectElement | null;\n  if (!select) return;\n\n  const attrValue = host.getAttribute('value');\n  const options = Array.from(select.options);\n  const hasMatchingValue =\n    attrValue !== null && options.some((option) => option.value === attrValue);\n\n  if (hasMatchingValue) {\n    select.value = attrValue;\n  }\n\n  const normalizedValue = select.value;\n  if ((attrValue ?? '') !== normalizedValue) {\n    host.setAttribute('value', normalizedValue);\n  }\n\n  const proxy = (host as unknown as Record<string, unknown>)['_formProxy'] as\n    | FormProxy\n    | undefined;\n  proxy?.setValue(normalizedValue);\n};\n\nconst definition: ComponentDefinition<BqSelectProps, BqSelectState> = {\n  props: {\n    label: { type: String, default: '' },\n    value: { type: String, default: '' },\n    placeholder: { type: String, default: '' },\n    name: { type: String, default: '' },\n    disabled: { type: Boolean, default: false },\n    required: { type: Boolean, default: false },\n    error: { type: String, default: '' },\n    hint: { type: String, default: '' },\n    size: { type: String, default: 'md' },\n  },\n  state: {\n    uid: '',\n    optionsMarkup: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .field { display: flex; flex-direction: column; gap: 0.375rem; }\n    .label { font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500); color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); }\n    .required-mark { color: var(--bq-color-danger-600,#dc2626); }\n    .select-wrap { position: relative; }\n    select {\n      display: block; width: 100%;\n      border: 1.5px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-lg,0.5rem); background: var(--bq-bg-base,#fff);\n      color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans);\n      appearance: none; -webkit-appearance: none;\n      padding-right: 2rem; outline: none; cursor: pointer;\n      transition: border-color var(--bq-duration-fast) var(--bq-easing-standard), box-shadow var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    :host([size=\"sm\"]) select { font-size: 0.875rem; padding: 0.375rem 2rem 0.375rem 0.75rem; min-height: 2rem; }\n    :host([size=\"md\"]) select, :host(:not([size])) select { font-size: 1rem; padding: 0.5rem 2rem 0.5rem 0.875rem; min-height: 2.5rem; }\n    :host([size=\"lg\"]) select { font-size: 1.125rem; padding: 0.625rem 2rem 0.625rem 1rem; min-height: 3rem; }\n    select:focus { border-color: var(--bq-border-focus,#2563eb); box-shadow: var(--bq-focus-ring); }\n    :host([error]:not([error=\"\"])) select { border-color: var(--bq-color-danger-500,#ef4444); }\n    :host([disabled]) select { opacity: 0.5; cursor: not-allowed; background: var(--bq-bg-muted,#f1f5f9); }\n    .arrow { position: absolute; right: 0.75rem; top: 50%; transform: translateY(-50%); pointer-events: none; color: var(--bq-text-muted,#475569); font-size: 0.75rem; }\n    .hint { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); }\n    .error-msg { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-color-danger-600,#dc2626); font-family: var(--bq-font-family-sans); }\n    @media (prefers-reduced-motion: reduce) {\n      select { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'uid' | 'optionsMarkup', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    if (!self.getState<string>('uid'))\n      self.setState('uid', uniqueId('bq-select'));\n    const syncOptions = () => {\n      const markup = buildOptionsMarkup(\n        self,\n        self.getAttribute('placeholder') ?? ''\n      );\n      if (self.getState<string>('optionsMarkup') !== markup) {\n        self.setState('optionsMarkup', markup);\n      }\n      requestAnimationFrame(() => syncSelectValue(self));\n    };\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.getAttribute('value') ?? '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const handler = (e: Event) => {\n      const select = e.target as HTMLSelectElement | null;\n      if (select?.tagName === 'SELECT') {\n        self.setAttribute('value', select.value);\n        proxy.setValue(select.value);\n        self.dispatchEvent(\n          new CustomEvent('bq-change', {\n            detail: { value: select.value },\n            bubbles: true,\n            composed: true,\n          })\n        );\n      }\n    };\n    const observer = new MutationObserver(() => {\n      syncOptions();\n    });\n    observer.observe(self, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n      attributes: true,\n      attributeFilter: ['disabled', 'label', 'selected', 'value'],\n    });\n\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    (self as unknown as Record<string, unknown>)['_syncOptions'] = syncOptions;\n    (self as unknown as Record<string, unknown>)['_observer'] = observer;\n    self.shadowRoot?.addEventListener('change', handler);\n    syncOptions();\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const h = s['_handler'] as EventListener | undefined;\n    if (h) this.shadowRoot?.removeEventListener('change', h);\n    const observer = s['_observer'] as MutationObserver | undefined;\n    observer?.disconnect();\n    (s['_formProxy'] as FormProxy | undefined)?.cleanup();\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(this.getAttribute('value') ?? '');\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n    (s['_syncOptions'] as (() => void) | undefined)?.();\n  },\n  render({ props, state }) {\n    const hasError = Boolean(props.error);\n    const hasHint = Boolean(props.hint) && !hasError;\n    const uid = state.uid || 'bq-select';\n    const optionsMarkup = state.optionsMarkup || '';\n    const describedParts: string[] = [];\n    if (hasError) describedParts.push(`${uid}-err`);\n    if (hasHint) describedParts.push(`${uid}-hint`);\n    const describedBy = describedParts.join(' ');\n    return html`\n      <div class=\"field\" part=\"field\">\n        ${props.label\n          ? `<label class=\"label\" for=\"${uid}\" part=\"label\">${escapeHtml(props.label)}${props.required ? '<span class=\"required-mark\" aria-hidden=\"true\"> *</span>' : ''}</label>`\n          : ''}\n        <div class=\"select-wrap\">\n          <select\n            part=\"select\"\n            id=\"${uid}\"\n            name=\"${escapeHtml(props.name)}\"\n            ${props.disabled ? 'disabled' : ''}\n            ${props.required ? 'required' : ''}\n            aria-invalid=\"${hasError ? 'true' : 'false'}\"\n            ${props.required ? 'aria-required=\"true\"' : ''}\n            ${describedBy ? `aria-describedby=\"${describedBy}\"` : ''}\n          >\n            ${optionsMarkup}\n          </select>\n          <span class=\"arrow\" aria-hidden=\"true\">&#9660;</span>\n        </div>\n        ${hasHint\n          ? `<span class=\"hint\" id=\"${uid}-hint\" part=\"hint\">${escapeHtml(props.hint)}</span>`\n          : ''}\n        ${hasError\n          ? `<span class=\"error-msg\" id=\"${uid}-err\" role=\"alert\" part=\"error\">${escapeHtml(props.error)}</span>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqSelectProps, BqSelectState>('bq-select', definition);\n","/**\n * Segmented control for single-choice view and filter toggles.\n * @element bq-segmented-control\n * @prop {string} label\n * @prop {string} hint\n * @prop {string} name\n * @prop {string} value\n * @prop {string} size       - sm | md | lg\n * @prop {boolean} full-width\n * @prop {boolean} disabled\n * @prop {string} aria-label - Accessible label when no visible label is rendered\n * @slot - Segment buttons (use <button value=\"...\">Label</button>)\n * @fires bq-change - { value: string }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSegmentedControlProps = {\n  label: string;\n  hint: string;\n  name: string;\n  value: string;\n  size: string;\n  'full-width': boolean;\n  disabled: boolean;\n  'aria-label': string;\n};\n\ntype BqSegmentedControlState = {\n  uid: string;\n};\n\nconst definition: ComponentDefinition<\n  BqSegmentedControlProps,\n  BqSegmentedControlState\n> = {\n  props: {\n    label: { type: String, default: '' },\n    hint: { type: String, default: '' },\n    name: { type: String, default: '' },\n    value: { type: String, default: '' },\n    size: { type: String, default: 'md' },\n    'full-width': { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n    'aria-label': { type: String, default: '' },\n  },\n  state: {\n    uid: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .field { display: flex; flex-direction: column; gap: 0.375rem; }\n    .label {\n      font-family: var(--bq-font-family-sans);\n      font-size: var(--bq-font-size-sm,0.875rem);\n      font-weight: var(--bq-font-weight-medium,500);\n      color: var(--bq-text-base,#0f172a);\n      line-height: 1.5;\n    }\n    .control {\n      display: inline-flex;\n      align-items: stretch;\n      gap: 0.25rem;\n      width: fit-content;\n      min-width: 0;\n      padding: 0.25rem;\n      border: 1px solid var(--bq-border-base,#e2e8f0);\n      border-radius: var(--bq-radius-xl,0.75rem);\n      background: var(--bq-bg-subtle,#f8fafc);\n      min-height: 2.75rem;\n    }\n    :host([full-width]) .control {\n      display: flex;\n      width: 100%;\n    }\n    :host([disabled]) .control {\n      opacity: 0.7;\n    }\n    .hint {\n      font-family: var(--bq-font-family-sans);\n      font-size: var(--bq-font-size-sm,0.875rem);\n      color: var(--bq-text-muted,#475569);\n      line-height: 1.5;\n    }\n    ::slotted(button) {\n      appearance: none;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 0.375rem;\n      min-height: 2.25rem;\n      min-width: 2.75rem;\n      padding: 0.5rem 0.875rem;\n      border: none;\n      border-radius: var(--bq-radius-lg,0.5rem);\n      background: transparent;\n      color: var(--bq-text-muted,#475569);\n      font-family: var(--bq-font-family-sans);\n      font-size: var(--bq-font-size-sm,0.875rem);\n      font-weight: var(--bq-font-weight-medium,500);\n      line-height: 1.25;\n      text-align: center;\n      white-space: nowrap;\n      cursor: pointer;\n      transition:\n        background var(--bq-duration-fast,150ms) var(--bq-easing-standard),\n        color var(--bq-duration-fast,150ms) var(--bq-easing-standard),\n        box-shadow var(--bq-duration-fast,150ms) var(--bq-easing-standard);\n    }\n    :host([size=\"sm\"]) ::slotted(button) {\n      min-height: 2rem;\n      padding: 0.375rem 0.75rem;\n      font-size: var(--bq-font-size-xs,0.75rem);\n    }\n    :host([size=\"lg\"]) ::slotted(button) {\n      min-height: 2.75rem;\n      padding: 0.625rem 1rem;\n      font-size: var(--bq-font-size-md,1rem);\n    }\n    :host([full-width]) ::slotted(button) {\n      flex: 1 1 0;\n      min-width: 0;\n    }\n    ::slotted(button:hover:not(:disabled):not([aria-disabled=\"true\"]):not([data-selected=\"true\"])) {\n      color: var(--bq-text-base,#0f172a);\n      background: var(--bq-bg-muted,#f1f5f9);\n    }\n    ::slotted(button[data-selected=\"true\"]) {\n      background: var(--bq-bg-base,#ffffff);\n      color: var(--bq-color-primary-600,#2563eb);\n      box-shadow: var(--bq-shadow-sm);\n    }\n    ::slotted(button:focus-visible) {\n      outline: 2px solid transparent;\n      box-shadow: var(--bq-focus-ring);\n    }\n    ::slotted(button:disabled),\n    ::slotted(button[aria-disabled=\"true\"]) {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n    @media (prefers-reduced-motion: reduce) {\n      ::slotted(button) { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(key: 'uid', value: string): void;\n      getState<T>(key: string): T;\n    };\n\n    const self = this as unknown as BQEl & Record<string, unknown>;\n\n    if (!self.getState<string>('uid')) {\n      self.setState('uid', uniqueId('bq-segmented'));\n    }\n\n    const proxy = createFormProxy(\n      self,\n      self.getAttribute('name') ?? '',\n      self.getAttribute('value') ?? '',\n      self.hasAttribute('disabled')\n    );\n    self['_formProxy'] = proxy;\n\n    const getButtons = (): HTMLButtonElement[] => {\n      const slot = self.shadowRoot?.querySelector(\n        'slot:not([name])'\n      ) as HTMLSlotElement | null;\n      if (!slot) return [];\n      return slot\n        .assignedElements({ flatten: true })\n        .filter(\n          (element): element is HTMLButtonElement =>\n            element instanceof HTMLElement && element.tagName === 'BUTTON'\n        );\n    };\n\n    const getButtonValue = (button: HTMLButtonElement): string =>\n      button.getAttribute('value') ||\n      button.getAttribute('data-value') ||\n      button.textContent?.trim() ||\n      '';\n\n    const isButtonDisabled = (button: HTMLButtonElement): boolean =>\n      self.hasAttribute('disabled') ||\n      button.disabled ||\n      button.getAttribute('aria-disabled') === 'true';\n\n    const ensureSelectedValue = (): string => {\n      const buttons = getButtons();\n      const currentValue = self.getAttribute('value') ?? '';\n      const selectedButton = buttons.find(\n        (button) =>\n          !isButtonDisabled(button) && getButtonValue(button) === currentValue\n      );\n      if (selectedButton) return currentValue;\n\n      const fallbackButton = buttons.find(\n        (button) => !isButtonDisabled(button)\n      );\n      const fallbackValue = fallbackButton\n        ? getButtonValue(fallbackButton)\n        : '';\n\n      if (fallbackValue && fallbackValue !== currentValue) {\n        self.setAttribute('value', fallbackValue);\n      } else if (!fallbackValue && currentValue) {\n        self.removeAttribute('value');\n      }\n\n      return fallbackValue;\n    };\n\n    const syncButtons = () => {\n      const buttons = getButtons();\n      const selectedValue = ensureSelectedValue();\n      const enabledButtons = buttons.filter(\n        (button) => !isButtonDisabled(button)\n      );\n      const focusValue =\n        selectedValue ||\n        (enabledButtons[0] ? getButtonValue(enabledButtons[0]) : '');\n\n      buttons.forEach((button) => {\n        const value = getButtonValue(button);\n        const disabled = isButtonDisabled(button);\n        const selected = value !== '' && value === selectedValue;\n\n        if (!button.hasAttribute('type')) {\n          button.setAttribute('type', 'button');\n        }\n\n        button.setAttribute('role', 'radio');\n        button.setAttribute('aria-checked', selected ? 'true' : 'false');\n        button.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n\n        if (selected) {\n          button.setAttribute('data-selected', 'true');\n        } else {\n          button.removeAttribute('data-selected');\n        }\n\n        button.setAttribute(\n          'tabindex',\n          !disabled && value === focusValue ? '0' : '-1'\n        );\n\n        button.removeEventListener('keydown', keyHandler);\n        button.addEventListener('keydown', keyHandler);\n      });\n\n      proxy.setName(self.getAttribute('name') ?? '');\n      proxy.setValue(selectedValue);\n      proxy.setDisabled(self.hasAttribute('disabled'));\n    };\n\n    const selectButton = (\n      button: HTMLButtonElement,\n      options: { focus?: boolean; emit?: boolean } = {}\n    ) => {\n      if (isButtonDisabled(button)) return;\n\n      const nextValue = getButtonValue(button);\n      if (!nextValue) return;\n\n      const previousValue = self.getAttribute('value') ?? '';\n      if (nextValue !== previousValue) {\n        self.setAttribute('value', nextValue);\n        syncButtons();\n\n        if (options.emit !== false) {\n          self.dispatchEvent(\n            new CustomEvent('bq-change', {\n              detail: { value: nextValue },\n              bubbles: true,\n              composed: true,\n            })\n          );\n        }\n      } else {\n        syncButtons();\n      }\n\n      if (options.focus) {\n        button.focus();\n      }\n    };\n\n    const moveSelection = (\n      currentButton: HTMLButtonElement,\n      direction: 'next' | 'prev' | 'first' | 'last'\n    ) => {\n      const enabledButtons = getButtons().filter(\n        (button) => !isButtonDisabled(button)\n      );\n      if (enabledButtons.length === 0) return;\n\n      let nextButton: HTMLButtonElement | null = enabledButtons[0] ?? null;\n\n      if (direction === 'last') {\n        nextButton = enabledButtons[enabledButtons.length - 1] ?? null;\n      } else if (direction === 'next' || direction === 'prev') {\n        const currentIndex = enabledButtons.indexOf(currentButton);\n        if (currentIndex === -1) {\n          nextButton = enabledButtons[0] ?? null;\n        } else if (direction === 'next') {\n          nextButton =\n            enabledButtons[(currentIndex + 1) % enabledButtons.length] ?? null;\n        } else {\n          nextButton =\n            enabledButtons[\n              (currentIndex - 1 + enabledButtons.length) % enabledButtons.length\n            ] ?? null;\n        }\n      }\n\n      if (!nextButton) return;\n      selectButton(nextButton, { focus: true });\n    };\n\n    const clickHandler = (event: Event) => {\n      const target = event.target as Element | null;\n      const button = target?.closest('button') as HTMLButtonElement | null;\n      if (!button || !getButtons().includes(button)) return;\n\n      selectButton(button);\n    };\n\n    const keyHandler = (event: Event) => {\n      const keyboardEvent = event as KeyboardEvent;\n      const target = event.target as Element | null;\n      const button = target?.closest('button') as HTMLButtonElement | null;\n      if (!button || !getButtons().includes(button)) return;\n\n      const docView = self.ownerDocument?.defaultView;\n      const computedStyle = docView?.getComputedStyle?.(self);\n      const isRtl = computedStyle?.direction === 'rtl';\n\n      switch (keyboardEvent.key) {\n        case 'ArrowRight':\n          keyboardEvent.preventDefault();\n          moveSelection(button, isRtl ? 'prev' : 'next');\n          break;\n        case 'ArrowLeft':\n          keyboardEvent.preventDefault();\n          moveSelection(button, isRtl ? 'next' : 'prev');\n          break;\n        case 'ArrowDown':\n          keyboardEvent.preventDefault();\n          moveSelection(button, 'next');\n          break;\n        case 'ArrowUp':\n          keyboardEvent.preventDefault();\n          moveSelection(button, 'prev');\n          break;\n        case 'Home':\n          keyboardEvent.preventDefault();\n          moveSelection(button, 'first');\n          break;\n        case 'End':\n          keyboardEvent.preventDefault();\n          moveSelection(button, 'last');\n          break;\n        case 'Enter':\n        case ' ':\n          keyboardEvent.preventDefault();\n          selectButton(button, { focus: true });\n          break;\n      }\n    };\n\n    const slotChangeHandler = () => {\n      syncButtons();\n    };\n\n    const observer = new MutationObserver(() => {\n      syncButtons();\n    });\n    observer.observe(self, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n      attributes: true,\n      attributeFilter: ['disabled', 'value', 'data-value'],\n    });\n\n    self['_syncButtons'] = syncButtons;\n    self['_clickHandler'] = clickHandler;\n    self['_keyHandler'] = keyHandler;\n    self['_slotChangeHandler'] = slotChangeHandler;\n    self['_observer'] = observer;\n\n    self.addEventListener('click', clickHandler);\n    self.shadowRoot\n      ?.querySelector('slot:not([name])')\n      ?.addEventListener('slotchange', slotChangeHandler);\n\n    requestAnimationFrame(syncButtons);\n  },\n  disconnected() {\n    const self = this as unknown as Record<string, unknown>;\n\n    const clickHandler = self['_clickHandler'] as EventListener | undefined;\n    const keyHandler = self['_keyHandler'] as EventListener | undefined;\n    const slotChangeHandler = self['_slotChangeHandler'] as\n      | EventListener\n      | undefined;\n    const observer = self['_observer'] as MutationObserver | undefined;\n    const proxy = self['_formProxy'] as FormProxy | undefined;\n\n    if (clickHandler) this.removeEventListener('click', clickHandler);\n    if (keyHandler) {\n      const buttons = this.querySelectorAll('button');\n      buttons.forEach((button) =>\n        button.removeEventListener('keydown', keyHandler)\n      );\n    }\n    if (slotChangeHandler) {\n      this.shadowRoot\n        ?.querySelector('slot:not([name])')\n        ?.removeEventListener('slotchange', slotChangeHandler);\n    }\n\n    observer?.disconnect();\n    proxy?.cleanup();\n  },\n  updated() {\n    const syncButtons = (this as unknown as Record<string, unknown>)[\n      '_syncButtons'\n    ] as (() => void) | undefined;\n    syncButtons?.();\n  },\n  render({ props, state }) {\n    const uid = state.uid || 'bq-segmented';\n    const labelId = `${uid}-label`;\n    const hintId = `${uid}-hint`;\n    const fallbackGroupLabel = t('segmentedControl.defaultLabel');\n\n    const labelAttribute = props.label\n      ? `aria-labelledby=\"${labelId}\"`\n      : props['aria-label']\n        ? `aria-label=\"${escapeHtml(props['aria-label'])}\"`\n        : `aria-label=\"${escapeHtml(props.name || fallbackGroupLabel)}\"`;\n\n    const descriptionAttribute = props.hint\n      ? `aria-describedby=\"${hintId}\"`\n      : '';\n\n    return html`\n      <div class=\"field\" part=\"field\">\n        ${props.label\n          ? `<div class=\"label\" id=\"${labelId}\" part=\"label\">${escapeHtml(props.label)}</div>`\n          : ''}\n        <div\n          class=\"control\"\n          part=\"control\"\n          role=\"radiogroup\"\n          ${labelAttribute}\n          ${descriptionAttribute}\n        >\n          <slot></slot>\n        </div>\n        ${props.hint\n          ? `<div class=\"hint\" id=\"${hintId}\" part=\"hint\">${escapeHtml(props.hint)}</div>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqSegmentedControlProps, BqSegmentedControlState>(\n  'bq-segmented-control',\n  definition\n);\n","/**\n * Skeleton loading placeholder.\n * @element bq-skeleton\n * @prop {string}  variant  - text | circle | rect | card\n * @prop {string}  width    - CSS width value\n * @prop {string}  height   - CSS height value\n * @prop {number}  lines    - Number of text lines\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSkeletonProps = {\n  variant: string;\n  width: string;\n  height: string;\n  lines: number;\n};\n\nconst DISALLOWED_DIMENSION_PATTERN =\n  /[;{}]|(?:url\\s*\\(|expression\\s*\\(|javascript:|data:|@import)|[\\r\\n]/i;\n\nconst sanitizeDimension = (value: string): string => {\n  const trimmed = value.trim();\n\n  if (!trimmed) return '';\n  if (DISALLOWED_DIMENSION_PATTERN.test(trimmed)) return '';\n\n  return trimmed;\n};\n\nconst getStyleAttribute = (\n  width: string,\n  height: string,\n  widthOverride?: string\n): string => {\n  const styles: string[] = [];\n  const safeWidth = sanitizeDimension(widthOverride ?? width);\n  const safeHeight = sanitizeDimension(height);\n\n  if (safeWidth) styles.push(`width:${safeWidth}`);\n  if (safeHeight) styles.push(`height:${safeHeight}`);\n\n  return styles.join(';');\n};\n\nconst definition: ComponentDefinition<BqSkeletonProps> = {\n  props: {\n    variant: { type: String, default: 'text' },\n    width: { type: String, default: '100%' },\n    height: { type: String, default: '' },\n    lines: { type: Number, default: 1 },\n  },\n  sanitize: {\n    allowAttributes: ['style'],\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: block; }\n    .skeleton {\n      background: var(--bq-bg-emphasis,#e2e8f0);\n      border-radius: var(--bq-radius-md,0.375rem);\n      overflow: hidden; position: relative;\n    }\n    .skeleton::after {\n      content: ''; position: absolute; inset: 0;\n      background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.4) 50%, transparent 100%);\n      animation: shimmer 1.5s infinite;\n    }\n    @keyframes shimmer { from { transform: translateX(-100%); } to { transform: translateX(100%); } }\n    @media (prefers-reduced-motion: reduce) {\n      .skeleton::after { animation: none; }\n    }\n    .skeleton[data-variant=\"circle\"] { border-radius: var(--bq-radius-full,9999px); }\n    .skeleton[data-variant=\"text\"]   { height: 1em; margin-bottom: 0.5em; }\n    .skeleton[data-variant=\"text\"]:last-child { width: 70%; }\n    .lines { display: flex; flex-direction: column; gap: 0.5rem; }\n  `,\n  render({ props }) {\n    if (props.variant === 'text' && props.lines > 1) {\n      const lineStyle = getStyleAttribute(props.width, props.height);\n      const items = Array.from(\n        { length: props.lines },\n        (_, i) =>\n          `<div class=\"skeleton\" data-variant=\"text\" part=\"skeleton\" style=\"${escapeHtml(i === props.lines - 1 ? getStyleAttribute(props.width, props.height, '70%') : lineStyle)}\"></div>`\n      ).join('');\n      return html`<div class=\"lines\" part=\"lines\">${items}</div>`;\n    }\n    return html`<div\n      part=\"skeleton\"\n      class=\"skeleton\"\n      data-variant=\"${escapeHtml(props.variant)}\"\n      style=\"${escapeHtml(getStyleAttribute(props.width, props.height))}\"\n    ></div>`;\n  },\n};\n\ncomponent<BqSkeletonProps>('bq-skeleton', definition);\n","/**\n * Range slider input.\n * @element bq-slider\n * @prop {number}  value\n * @prop {number}  min\n * @prop {number}  max\n * @prop {number}  step\n * @prop {string}  label\n * @prop {boolean} disabled\n * @prop {boolean} show-value\n * @fires bq-input  - { value: number }\n * @fires bq-change - { value: number }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSliderProps = {\n  value: number;\n  min: number;\n  max: number;\n  step: number;\n  label: string;\n  disabled: boolean;\n  'show-value': boolean;\n};\n\nfunction syncInputAccessibility(input: HTMLInputElement, value: number): void {\n  input.setAttribute('aria-valuenow', String(value));\n  input.setAttribute('aria-valuetext', t('slider.valueText', { value }));\n}\n\nconst definition: ComponentDefinition<BqSliderProps> = {\n  props: {\n    value: { type: Number, default: 50 },\n    min: { type: Number, default: 0 },\n    max: { type: Number, default: 100 },\n    step: { type: Number, default: 1 },\n    label: { type: String, default: '' },\n    disabled: { type: Boolean, default: false },\n    'show-value': { type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .wrapper { display: flex; flex-direction: column; gap: 0.375rem; font-family: var(--bq-font-family-sans); }\n    .header { display: flex; justify-content: space-between; align-items: center; }\n    .label-text { font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500); color: var(--bq-text-base,#0f172a); }\n    .value { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); }\n    input[type=\"range\"] {\n      width: 100%; height: 0.375rem; cursor: pointer;\n      accent-color: var(--bq-color-primary-600,#2563eb);\n    }\n    input[type=\"range\"]:disabled { opacity: 0.5; cursor: not-allowed; }\n    input[type=\"range\"]:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n  `,\n  connected() {\n    const self = this;\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.getAttribute('value') ?? '50';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const ih = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (!input) return;\n      const v = Number(input.value);\n      // Update form proxy and value display directly without re-rendering (prevents jank during drag)\n      proxy.setValue(String(v));\n      syncInputAccessibility(input, v);\n      const valueSpan = self.shadowRoot?.querySelector('.value');\n      if (valueSpan) valueSpan.textContent = String(v);\n      self.dispatchEvent(\n        new CustomEvent('bq-input', {\n          detail: { value: v },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    const ch = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (!input) return;\n      const v = Number(input.value);\n      // Commit value to attribute on change (drag end) — triggers one clean re-render\n      self.setAttribute('value', String(v));\n      proxy.setValue(String(v));\n      syncInputAccessibility(input, v);\n      self.dispatchEvent(\n        new CustomEvent('bq-change', {\n          detail: { value: v },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_ih'] = ih;\n    (self as unknown as Record<string, unknown>)['_ch'] = ch;\n    self.shadowRoot?.addEventListener('input', ih);\n    self.shadowRoot?.addEventListener('change', ch);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const ih = s['_ih'] as EventListener | undefined;\n    const ch = s['_ch'] as EventListener | undefined;\n    if (ih) this.shadowRoot?.removeEventListener('input', ih);\n    if (ch) this.shadowRoot?.removeEventListener('change', ch);\n    (\n      (this as unknown as Record<string, unknown>)['_formProxy'] as\n        | FormProxy\n        | undefined\n    )?.cleanup();\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(this.getAttribute('value') ?? '50');\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props }) {\n    return html`\n      <div class=\"wrapper\" part=\"wrapper\">\n        ${props.label || props['show-value']\n          ? `<div class=\"header\">\n          ${props.label ? `<label class=\"label-text\" part=\"label\">${escapeHtml(props.label)}</label>` : ''}\n          ${props['show-value'] ? `<span class=\"value\" part=\"value\" aria-live=\"polite\">${String(props.value)}</span>` : ''}\n        </div>`\n          : ''}\n        <input\n          type=\"range\"\n          part=\"input\"\n          min=\"${String(props.min)}\"\n          max=\"${String(props.max)}\"\n          value=\"${String(props.value)}\"\n          step=\"${String(props.step)}\"\n          ${props.disabled ? 'disabled' : ''}\n          aria-label=\"${escapeHtml(props.label || t('slider.ariaLabel'))}\"\n          aria-valuemin=\"${String(props.min)}\"\n          aria-valuemax=\"${String(props.max)}\"\n          aria-valuenow=\"${String(props.value)}\"\n          aria-valuetext=\"${escapeHtml(\n            t('slider.valueText', { value: props.value })\n          )}\"\n        />\n      </div>\n    `;\n  },\n};\n\ncomponent<BqSliderProps>('bq-slider', definition);\n","/**\n * Spinner / loading indicator.\n * @element bq-spinner\n * @prop {string} size    - xs | sm | md | lg | xl\n * @prop {string} variant - primary | secondary | danger | success | white\n * @prop {string} label   - Accessible label (sr-only)\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSpinnerProps = { size: string; variant: string; label: string };\n\nconst definition: ComponentDefinition<BqSpinnerProps> = {\n  props: {\n    size: { type: String, default: 'md' },\n    variant: { type: String, default: 'primary' },\n    label: { type: String, default: '' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: inline-flex; align-items: center; justify-content: center; }\n    .spinner {\n      border-radius: 50%; border-style: solid; border-width: 2.5px; border-color: transparent;\n      animation: spin 0.7s linear infinite;\n    }\n    .spinner[data-size=\"xs\"] { width: 1rem;   height: 1rem;   border-width: 2px; }\n    .spinner[data-size=\"sm\"] { width: 1.25rem; height: 1.25rem; border-width: 2px; }\n    .spinner[data-size=\"md\"] { width: 1.75rem; height: 1.75rem; border-width: 2.5px; }\n    .spinner[data-size=\"lg\"] { width: 2.5rem; height: 2.5rem; border-width: 3px; }\n    .spinner[data-size=\"xl\"] { width: 3.5rem; height: 3.5rem; border-width: 4px; }\n    .spinner[data-variant=\"primary\"]   { border-color: var(--bq-color-primary-200,#bfdbfe); border-top-color: var(--bq-color-primary-600,#2563eb); }\n    .spinner[data-variant=\"secondary\"] { border-color: var(--bq-color-secondary-200,#e2e8f0); border-top-color: var(--bq-color-secondary-600,#475569); }\n    .spinner[data-variant=\"danger\"]    { border-color: var(--bq-color-danger-100,#fee2e2); border-top-color: var(--bq-color-danger-600,#dc2626); }\n    .spinner[data-variant=\"success\"]   { border-color: var(--bq-color-success-100,#dcfce7); border-top-color: var(--bq-color-success-600,#16a34a); }\n    .spinner[data-variant=\"white\"]     { border-color: rgba(255,255,255,0.3); border-top-color: #fff; }\n    @keyframes spin { to { transform: rotate(360deg); } }\n    @media (prefers-reduced-motion: reduce) {\n      .spinner { animation: none; }\n    }\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; }\n  `,\n  render({ props }) {\n    const trimmedLabel = props.label.trim();\n    const label = trimmedLabel !== '' ? trimmedLabel : t('common.loading');\n    return html`<div\n      class=\"spinner-root\"\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-label=\"${escapeHtml(label)}\"\n    >\n      <div\n        part=\"spinner\"\n        class=\"spinner\"\n        data-size=\"${escapeHtml(props.size)}\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n        aria-hidden=\"true\"\n      ></div>\n      <span class=\"sr-only\">${escapeHtml(label)}</span>\n    </div>`;\n  },\n};\n\ncomponent<BqSpinnerProps>('bq-spinner', definition);\n","/**\n * Stat card component - compact metric surface for dashboards and summaries.\n * @element bq-stat-card\n * @prop {string}  label   - Metric label\n * @prop {string}  value   - Primary metric value\n * @prop {string}  change  - Secondary delta or comparison value\n * @prop {string}  hint    - Supporting description\n * @prop {string}  trend   - up | down | neutral\n * @prop {string}  size    - sm | md\n * @prop {boolean} loading - Displays a loading skeleton while data is pending\n * @slot        - Additional supporting content rendered below the hint\n * @slot icon   - Optional icon or badge for the metric\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles, srOnlyStyles } from '../../utils/styles.js';\n\ntype BqStatCardProps = {\n  label: string;\n  value: string;\n  change: string;\n  hint: string;\n  trend: string;\n  size: string;\n  loading: boolean;\n};\ntype BqStatCardState = { uid: string };\n\nfunction getTrend(trend: string): 'up' | 'down' | 'neutral' {\n  if (trend === 'up' || trend === 'down') return trend;\n  return 'neutral';\n}\n\nfunction getSize(size: string): 'sm' | 'md' {\n  return size === 'sm' ? 'sm' : 'md';\n}\n\nconst definition: ComponentDefinition<BqStatCardProps, BqStatCardState> = {\n  props: {\n    label: { type: String, default: '' },\n    value: { type: String, default: '' },\n    change: { type: String, default: '' },\n    hint: { type: String, default: '' },\n    trend: { type: String, default: 'neutral' },\n    size: { type: String, default: 'md' },\n    loading: { type: Boolean, default: false },\n  },\n  state: {\n    uid: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    ${srOnlyStyles}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .card {\n      display: grid;\n      gap: var(--bq-space-4,1rem);\n      min-height: 100%;\n      padding: var(--bq-space-6,1.5rem);\n      border-radius: var(--bq-radius-xl,0.75rem);\n      border: 1px solid var(--bq-border-base,#e2e8f0);\n      background: var(--bq-bg-base,#fff);\n      box-shadow: var(--bq-shadow-sm);\n      color: var(--bq-text-base,#0f172a);\n      font-family: var(--bq-font-family-sans);\n    }\n    .card[data-size=\"sm\"] {\n      gap: var(--bq-space-3,0.75rem);\n      padding: var(--bq-space-4,1rem);\n    }\n    .header {\n      display: flex;\n      align-items: flex-start;\n      justify-content: space-between;\n      gap: var(--bq-space-3,0.75rem);\n    }\n    .label {\n      margin: 0;\n      font-size: var(--bq-font-size-sm,0.875rem);\n      font-weight: var(--bq-font-weight-medium,500);\n      color: var(--bq-text-muted,#475569);\n      line-height: 1.4;\n    }\n    .icon-slot {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--bq-color-primary-600,#2563eb);\n      min-width: 0;\n      flex-shrink: 0;\n    }\n    .icon-slot slot[name=\"icon\"]::slotted(*) {\n      max-width: 100%;\n    }\n    .value-row {\n      display: flex;\n      align-items: flex-end;\n      justify-content: space-between;\n      gap: var(--bq-space-3,0.75rem);\n      flex-wrap: wrap;\n    }\n    .value {\n      margin: 0;\n      font-size: clamp(1.75rem, 4vw, 2.25rem);\n      font-weight: var(--bq-font-weight-bold,700);\n      line-height: 1.1;\n      letter-spacing: -0.02em;\n      color: var(--bq-text-base,#0f172a);\n    }\n    .card[data-size=\"sm\"] .value {\n      font-size: clamp(1.375rem, 3.5vw, 1.875rem);\n    }\n    .change {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.375rem;\n      min-height: 2rem;\n      padding: 0.25rem 0.625rem;\n      border-radius: var(--bq-radius-full,9999px);\n      font-size: var(--bq-font-size-sm,0.875rem);\n      font-weight: var(--bq-font-weight-semibold,600);\n      white-space: nowrap;\n      background: var(--bq-bg-subtle,#f8fafc);\n      color: var(--bq-text-muted,#475569);\n    }\n    .change[data-trend=\"up\"] {\n      background: rgba(34, 197, 94, 0.14);\n      background: color-mix(in srgb, var(--bq-color-success-500,#22c55e) 14%, transparent);\n      color: var(--bq-color-success-700,#15803d);\n    }\n    .change[data-trend=\"down\"] {\n      background: rgba(239, 68, 68, 0.14);\n      background: color-mix(in srgb, var(--bq-color-danger-500,#ef4444) 14%, transparent);\n      color: var(--bq-color-danger-700,#b91c1c);\n    }\n    .hint {\n      margin: 0;\n      font-size: var(--bq-font-size-sm,0.875rem);\n      line-height: 1.5;\n      color: var(--bq-text-muted,#475569);\n    }\n    .loading-layout {\n      display: grid;\n      gap: var(--bq-space-3,0.75rem);\n    }\n    .skeleton {\n      position: relative;\n      overflow: hidden;\n      display: block;\n      border-radius: var(--bq-radius-md,0.375rem);\n      background: var(--bq-bg-subtle,#e2e8f0);\n    }\n    .skeleton::after {\n      content: '';\n      position: absolute;\n      inset: 0;\n      transform: translateX(-100%);\n      background: linear-gradient(90deg, transparent, rgba(255,255,255,0.45), transparent);\n      animation: stat-card-shimmer 1.5s infinite;\n    }\n    .skeleton-label { width: 40%; height: 0.875rem; }\n    .skeleton-value { width: 55%; height: 2.25rem; }\n    .skeleton-hint  { width: 75%; height: 0.875rem; }\n    @keyframes stat-card-shimmer {\n      100% { transform: translateX(100%); }\n    }\n    @media (prefers-reduced-motion: reduce) {\n      .skeleton::after { animation: none; }\n    }\n  `,\n  connected() {\n    type BqStatCardElement = HTMLElement & {\n      setState(k: 'uid', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BqStatCardElement;\n    if (!self.getState<string>('uid'))\n      self.setState('uid', uniqueId('bq-stat-card'));\n  },\n  render({ props, state }) {\n    const label = props.label.trim();\n    const value = props.value.trim();\n    const change = props.change.trim();\n    const hint = props.hint.trim();\n    const trend = getTrend(props.trend);\n    const size = getSize(props.size);\n    const uid = state.uid || 'bq-stat-card';\n    const labelId = `${uid}-label`;\n    const hintId = `${uid}-hint`;\n    const statusId = `${uid}-status`;\n    const describedByIds = props.loading ? statusId : hint ? hintId : '';\n    const describedBy = describedByIds\n      ? ` aria-describedby=\"${escapeHtml(describedByIds)}\"`\n      : '';\n    const labelledBy = label ? ` aria-labelledby=\"${escapeHtml(labelId)}\"` : '';\n    const busy = props.loading ? ' aria-busy=\"true\"' : '';\n\n    const body = props.loading\n      ? `\n        <div class=\"loading-layout\" part=\"loading\">\n          <span class=\"skeleton skeleton-label\" aria-hidden=\"true\"></span>\n          <span class=\"skeleton skeleton-value\" aria-hidden=\"true\"></span>\n          <span class=\"skeleton skeleton-hint\" aria-hidden=\"true\"></span>\n          <span class=\"sr-only\" id=\"${escapeHtml(statusId)}\" role=\"status\" aria-live=\"polite\">${escapeHtml(t('common.loading'))}</span>\n        </div>\n      `\n      : `\n        <div class=\"value-row\">\n          ${value ? `<p class=\"value\" part=\"value\">${escapeHtml(value)}</p>` : ''}\n          ${change ? `<span class=\"change\" part=\"change\" data-trend=\"${trend}\">${escapeHtml(change)}</span>` : ''}\n        </div>\n        ${hint ? `<p class=\"hint\" id=\"${escapeHtml(hintId)}\" part=\"hint\">${escapeHtml(hint)}</p>` : ''}\n        <slot></slot>\n      `;\n\n    return html`\n      <article\n        part=\"card\"\n        class=\"card\"\n        data-size=\"${size}\"\n        ${labelledBy}${describedBy}${busy}\n      >\n        <div class=\"header\" part=\"header\">\n          ${label\n            ? `<p class=\"label\" id=\"${escapeHtml(labelId)}\" part=\"label\">${escapeHtml(label)}</p>`\n            : '<span></span>'}\n          <div class=\"icon-slot\"><slot name=\"icon\"></slot></div>\n        </div>\n        ${body}\n      </article>\n    `;\n  },\n};\n\ncomponent<BqStatCardProps, BqStatCardState>('bq-stat-card', definition);\n","/**\n * Toggle switch form control.\n * @element bq-switch\n * @prop {string}  label   - Visible label\n * @prop {string}  name    - Input name\n * @prop {boolean} checked\n * @prop {boolean} disabled\n * @prop {string}  size    - sm | md | lg\n * @fires bq-change - { checked: boolean }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqSwitchProps = {\n  label: string;\n  name: string;\n  checked: boolean;\n  disabled: boolean;\n  size: string;\n};\n\nconst definition: ComponentDefinition<BqSwitchProps> = {\n  props: {\n    label: { type: String, default: '' },\n    name: { type: String, default: '' },\n    checked: { type: Boolean, default: false },\n    disabled: { type: Boolean, default: false },\n    size: { type: String, default: 'md' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: inline-flex; }\n    .control { display: inline-flex; align-items: center; gap: 0.625rem; cursor: pointer; font-family: var(--bq-font-family-sans); }\n    :host([disabled]) .control { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n    .track {\n      position: relative; display: inline-block; background: var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-full,9999px);\n      transition: background var(--bq-duration-fast) var(--bq-easing-standard);\n      flex-shrink: 0;\n    }\n    .track[data-size=\"sm\"] { width: 1.75rem; height: 1rem; }\n    .track[data-size=\"md\"] { width: 2.5rem; height: 1.375rem; }\n    .track[data-size=\"lg\"] { width: 3rem; height: 1.625rem; }\n    input { position: absolute; opacity: 0; width: 0; height: 0; }\n    .thumb {\n      position: absolute; top: 2px; left: 2px; background: #fff;\n      border-radius: 50%; transition: transform var(--bq-duration-fast) var(--bq-easing-standard);\n      box-shadow: var(--bq-shadow-sm);\n    }\n    .track[data-size=\"sm\"]  .thumb { width: calc(1rem - 4px);    height: calc(1rem - 4px); }\n    .track[data-size=\"md\"]  .thumb { width: calc(1.375rem - 4px); height: calc(1.375rem - 4px); }\n    .track[data-size=\"lg\"]  .thumb { width: calc(1.625rem - 4px); height: calc(1.625rem - 4px); }\n    :host([checked]) .track { background: var(--bq-color-primary-600,#2563eb); }\n    :host([checked]) .track[data-size=\"sm\"]  .thumb { transform: translateX(0.75rem); }\n    :host([checked]) .track[data-size=\"md\"]  .thumb { transform: translateX(1.125rem); }\n    :host([checked]) .track[data-size=\"lg\"]  .thumb { transform: translateX(1.375rem); }\n    input:focus-visible + .thumb { box-shadow: var(--bq-focus-ring); }\n    .label-text { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-base,#0f172a); }\n    @media (prefers-reduced-motion: reduce) {\n      .track, .thumb { transition: none; }\n    }\n  `,\n  connected() {\n    const self = this;\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.hasAttribute('checked') ? 'on' : '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const handler = (e: Event) => {\n      const input = e.target as HTMLInputElement | null;\n      if (input?.type !== 'checkbox') return;\n      if (input.checked) self.setAttribute('checked', '');\n      else self.removeAttribute('checked');\n      proxy.setValue(input.checked ? 'on' : '');\n      self.dispatchEvent(\n        new CustomEvent('bq-change', {\n          detail: { checked: input.checked },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    self.shadowRoot?.addEventListener('change', handler);\n  },\n  disconnected() {\n    const h = (this as unknown as Record<string, unknown>)['_handler'] as\n      | EventListener\n      | undefined;\n    if (h) this.shadowRoot?.removeEventListener('change', h);\n    (\n      (this as unknown as Record<string, unknown>)['_formProxy'] as\n        | FormProxy\n        | undefined\n    )?.cleanup();\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(this.hasAttribute('checked') ? 'on' : '');\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props }) {\n    return html`\n      <label class=\"control\" part=\"control\">\n        <span class=\"track\" data-size=\"${escapeHtml(props.size)}\">\n          <input\n            type=\"checkbox\"\n            part=\"input\"\n            name=\"${escapeHtml(props.name)}\"\n            ${props.checked ? 'checked' : ''}\n            ${props.disabled ? 'disabled' : ''}\n            role=\"switch\"\n            aria-checked=\"${props.checked ? 'true' : 'false'}\"\n            aria-label=\"${escapeHtml(props.label)}\"\n          />\n          <span class=\"thumb\" part=\"thumb\"></span>\n        </span>\n        ${props.label\n          ? `<span class=\"label-text\" part=\"label\">${escapeHtml(props.label)}</span>`\n          : ''}\n      </label>\n    `;\n  },\n};\n\ncomponent<BqSwitchProps>('bq-switch', definition);\n","/**\n * Data table component.\n * @element bq-table\n * @prop {string}  columns  - JSON array of { key, label, sortable? }\n * @prop {string}  rows     - JSON array of row objects\n * @prop {string}  caption  - Accessible table caption\n * @prop {string}  sort-key\n * @prop {string}  sort-dir - asc | desc\n * @prop {boolean} striped\n * @prop {boolean} bordered\n * @prop {boolean} hover\n * @prop {boolean} loading\n * @fires bq-sort - { key: string, dir: string }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype ColDef = { key: string; label: string; sortable?: boolean };\ntype BqTableProps = {\n  columns: string;\n  rows: string;\n  caption: string;\n  'sort-key': string;\n  'sort-dir': string;\n  striped: boolean;\n  bordered: boolean;\n  hover: boolean;\n  loading: boolean;\n};\n\nconst definition: ComponentDefinition<BqTableProps> = {\n  props: {\n    columns: { type: String, default: '[]' },\n    rows: { type: String, default: '[]' },\n    caption: { type: String, default: '' },\n    'sort-key': { type: String, default: '' },\n    'sort-dir': { type: String, default: 'asc' },\n    striped: { type: Boolean, default: false },\n    bordered: { type: Boolean, default: false },\n    hover: { type: Boolean, default: false },\n    loading: { type: Boolean, default: false },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; overflow-x: auto; }\n    table { width: 100%; border-collapse: collapse; font-family: var(--bq-font-family-sans); font-size: var(--bq-font-size-sm,0.875rem); }\n    :host([bordered]) table { border: 1px solid var(--bq-border-base,#e2e8f0); }\n    th, td { padding: 0.75rem 1rem; text-align: left; border-bottom: 1px solid var(--bq-border-base,#e2e8f0); }\n    caption { caption-side: top; text-align: left; font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); padding: 0.5rem 1rem; font-family: var(--bq-font-family-sans); }\n    :host([bordered]) th, :host([bordered]) td { border: 1px solid var(--bq-border-base,#e2e8f0); }\n    th { background: var(--bq-bg-subtle,#f8fafc); font-weight: var(--bq-font-weight-semibold,600); color: var(--bq-text-base,#0f172a); white-space: nowrap; }\n    td { color: var(--bq-text-muted,#475569); }\n    .sortable { cursor: pointer; user-select: none; }\n    .sortable:hover { background: var(--bq-bg-emphasis,#e2e8f0); }\n    .sort-icon { display: inline-block; margin-left: 0.375rem; opacity: 0.4; }\n    .sort-icon[data-active=\"true\"] { opacity: 1; }\n    :host([striped]) tbody tr:nth-child(even) td { background: var(--bq-bg-subtle,#f8fafc); }\n    :host([hover]) tbody tr:hover td { background: var(--bq-bg-muted,#f1f5f9); }\n    .empty-row td { text-align: center; color: var(--bq-text-subtle,#94a3b8); padding: 2rem; }\n    .loading-overlay { text-align: center; padding: 2rem; color: var(--bq-text-muted,#475569); }\n  `,\n  connected() {\n    const self = this;\n    const sortHandler = (th: HTMLElement) => {\n      const key = th.getAttribute('data-sort-key') ?? '';\n      const curDir = self.getAttribute('sort-dir') ?? 'asc';\n      const curKey = self.getAttribute('sort-key') ?? '';\n      const newDir = key === curKey && curDir === 'asc' ? 'desc' : 'asc';\n      self.setAttribute('sort-key', key);\n      self.setAttribute('sort-dir', newDir);\n      self.dispatchEvent(\n        new CustomEvent('bq-sort', {\n          detail: { key, dir: newDir },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    };\n    const handler = (e: Event) => {\n      const th = (e.target as Element).closest(\n        'th.sortable'\n      ) as HTMLElement | null;\n      if (!th) return;\n      sortHandler(th);\n    };\n    const keyHandler = (e: Event) => {\n      const ke = e as KeyboardEvent;\n      const th = (ke.target as Element).closest(\n        'th.sortable'\n      ) as HTMLElement | null;\n      if (!th) return;\n      const isSpaceKeydown = ke.type === 'keydown' && ke.key === ' ';\n      const isEnterKeydown =\n        ke.type === 'keydown' && ke.key === 'Enter' && !ke.repeat;\n      const isSpaceKeyup = ke.type === 'keyup' && ke.key === ' ';\n      if (isSpaceKeydown) {\n        e.preventDefault();\n        return;\n      }\n      if (!isEnterKeydown && !isSpaceKeyup) return;\n      e.preventDefault();\n      sortHandler(th);\n    };\n    (self as unknown as Record<string, unknown>)['_handler'] = handler;\n    (self as unknown as Record<string, unknown>)['_keyHandler'] = keyHandler;\n    self.shadowRoot?.addEventListener('click', handler);\n    self.shadowRoot?.addEventListener('keydown', keyHandler);\n    self.shadowRoot?.addEventListener('keyup', keyHandler);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const h = s['_handler'] as EventListener | undefined;\n    const kh = s['_keyHandler'] as EventListener | undefined;\n    if (h) this.shadowRoot?.removeEventListener('click', h);\n    if (kh) this.shadowRoot?.removeEventListener('keydown', kh);\n    if (kh) this.shadowRoot?.removeEventListener('keyup', kh);\n  },\n  render({ props }) {\n    let cols: ColDef[] = [];\n    let rows: Record<string, unknown>[] = [];\n    try {\n      cols = JSON.parse(props.columns) as ColDef[];\n    } catch {\n      cols = [];\n    }\n    try {\n      rows = JSON.parse(props.rows) as Record<string, unknown>[];\n    } catch {\n      rows = [];\n    }\n    const sortKey = props['sort-key'];\n    const sortDir = props['sort-dir'];\n    const theads = cols\n      .map((col) => {\n        const isSorted = col.key === sortKey;\n        const sortIcon = col.sortable\n          ? `<span class=\"sort-icon\" data-active=\"${isSorted ? 'true' : 'false'}\" aria-hidden=\"true\">${isSorted && sortDir === 'desc' ? '&#9650;' : '&#9660;'}</span>`\n          : '';\n        const sortLabel = col.sortable\n          ? isSorted\n            ? sortDir === 'asc'\n              ? t('table.sortDescending')\n              : t('table.sortAscending')\n            : t('table.sortAscending')\n          : '';\n        const sortableAttrs = col.sortable\n          ? `class=\"sortable\" data-sort-key=\"${escapeHtml(col.key)}\" tabindex=\"0\" aria-sort=\"${isSorted ? (sortDir === 'asc' ? 'ascending' : 'descending') : 'none'}\" title=\"${escapeHtml(sortLabel)}\"`\n          : '';\n        return `<th part=\"th\" scope=\"col\" role=\"columnheader\" ${sortableAttrs}>${escapeHtml(col.label)}${sortIcon}</th>`;\n      })\n      .join('');\n    const tbodies = props.loading\n      ? `<tr><td colspan=\"${cols.length}\" class=\"loading-overlay\">${escapeHtml(t('table.loading'))}</td></tr>`\n      : rows.length === 0\n        ? `<tr class=\"empty-row\"><td colspan=\"${cols.length}\">${escapeHtml(t('table.noData'))}</td></tr>`\n        : rows\n            .map(\n              (row) =>\n                `<tr part=\"row\">${cols.map((col) => `<td part=\"td\">${escapeHtml(String(row[col.key] ?? ''))}</td>`).join('')}</tr>`\n            )\n            .join('');\n    return html`\n      <table part=\"table\">\n        ${props.caption\n          ? `<caption part=\"caption\">${escapeHtml(props.caption)}</caption>`\n          : ''}\n        <thead part=\"thead\">\n          <tr part=\"header-row\">\n            ${theads}\n          </tr>\n        </thead>\n        <tbody part=\"tbody\">\n          ${tbodies}\n        </tbody>\n      </table>\n    `;\n  },\n};\n\ncomponent<BqTableProps>('bq-table', definition);\n","/**\n * Tabs navigation component.\n * @element bq-tabs\n * @prop {string} active-tab - ID of active tab\n * @prop {string} variant    - default | pills | underline\n * Tabs: add elements with [data-tab-item] and id attribute; panels: [data-tab=\"<id>\"]\n * @fires bq-tab-change - { tabId: string }\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqTabsProps = { 'active-tab': string; variant: string };\n\nfunction getAriaIdPart(tabId: string): string | null {\n  const trimmed = tabId.trim();\n  return trimmed ? encodeURIComponent(trimmed) : null;\n}\n\nfunction getTabButtonId(tabId: string): string | null {\n  const ariaIdPart = getAriaIdPart(tabId);\n  return ariaIdPart ? `tab-${ariaIdPart}` : null;\n}\n\nfunction getPanelId(tabId: string): string | null {\n  const ariaIdPart = getAriaIdPart(tabId);\n  return ariaIdPart ? `panel-${ariaIdPart}` : null;\n}\n\nconst definition: ComponentDefinition<BqTabsProps> = {\n  props: {\n    'active-tab': { type: String, default: '' },\n    variant: { type: String, default: 'default' },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .tabs { display: flex; flex-direction: column; }\n    .tablist { display: flex; gap: 0.25rem; }\n    .tablist[data-variant=\"default\"] { background: var(--bq-bg-subtle,#f8fafc); border-radius: var(--bq-radius-lg); padding: 0.25rem; }\n    .tablist[data-variant=\"underline\"] { border-bottom: 2px solid var(--bq-border-base,#e2e8f0); }\n    .tab {\n      display: inline-flex; align-items: center; justify-content: center; gap: 0.375rem;\n      font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500);\n      font-family: var(--bq-font-family-sans); cursor: pointer; background: none; border: none;\n      color: var(--bq-text-muted,#475569); white-space: nowrap;\n      transition: all var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    .tab[data-variant=\"default\"]  { padding: 0.375rem 0.875rem; border-radius: var(--bq-radius-md,0.375rem); }\n    .tab[data-variant=\"underline\"] { padding: 0.625rem 1rem; border-bottom: 2px solid transparent; margin-bottom: -2px; border-radius: 0; }\n    .tab[data-variant=\"pills\"]    { padding: 0.375rem 0.875rem; border-radius: var(--bq-radius-full,9999px); }\n    .tab:hover:not([disabled]):not([aria-selected=\"true\"]) { color: var(--bq-text-base,#0f172a); }\n    .tab[data-variant=\"default\"]:hover:not([disabled]):not([aria-selected=\"true\"]) { background: var(--bq-bg-emphasis,#e2e8f0); }\n    .tab[aria-selected=\"true\"][data-variant=\"default\"]   { background: var(--bq-bg-base,#fff); box-shadow: var(--bq-shadow-sm); color: var(--bq-color-primary-600,#2563eb); }\n    .tab[aria-selected=\"true\"][data-variant=\"underline\"] { border-bottom-color: var(--bq-color-primary-600,#2563eb); color: var(--bq-color-primary-600,#2563eb); }\n    .tab[aria-selected=\"true\"][data-variant=\"pills\"]     { background: var(--bq-color-primary-600,#2563eb); color: #fff; }\n    .tab[disabled] { opacity: 0.45; cursor: not-allowed; }\n    .tab:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    .panels { padding-top: var(--bq-space-4,1rem); }\n    @media (prefers-reduced-motion: reduce) {\n      .tab { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: string, v: unknown): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl &\n      HTMLElement &\n      Record<string, unknown>;\n\n    const readTabs = () => {\n      const items = Array.from(\n        (self as HTMLElement).querySelectorAll('[data-tab-item]')\n      ).map((el) => ({\n        id: el.getAttribute('id') ?? el.getAttribute('data-tab-item') ?? '',\n        label: el.getAttribute('label') ?? el.textContent?.trim() ?? '',\n        disabled: el.hasAttribute('disabled'),\n      }));\n      self.setState('tabs', items);\n    };\n    readTabs();\n\n    // MutationObserver to re-render when child items change\n    const obs = new MutationObserver(() => {\n      readTabs();\n      // Trigger re-render by touching an attribute\n      const cur = (self as HTMLElement).getAttribute('active-tab') ?? '';\n      (self as HTMLElement).setAttribute('active-tab', cur);\n    });\n    obs.observe(self as HTMLElement, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['label', 'disabled', 'id'],\n    });\n    self['_obs'] = obs;\n\n    const clickH = (e: Event) => {\n      const btn = (e.target as Element).closest(\n        '[data-tab-id]'\n      ) as HTMLElement | null;\n      if (!btn || btn.hasAttribute('disabled')) return;\n      const tabId = btn.getAttribute('data-tab-id') ?? '';\n      (self as HTMLElement).setAttribute('active-tab', tabId);\n      (self as HTMLElement).dispatchEvent(\n        new CustomEvent('bq-tab-change', {\n          detail: { tabId },\n          bubbles: true,\n          composed: true,\n        })\n      );\n      updatePanels(tabId);\n    };\n    const keyH = (e: Event) => {\n      const ke = e as KeyboardEvent;\n      const shadow = (self as HTMLElement).shadowRoot;\n      const tablist = shadow?.querySelector('.tablist');\n      if (!tablist) return;\n      const btns = Array.from(\n        tablist.querySelectorAll<HTMLElement>('.tab:not([disabled])')\n      );\n      // Use shadowRoot.activeElement — document.activeElement returns the host in shadow DOM\n      const active = shadow?.activeElement as HTMLElement | null;\n      const idx = btns.findIndex((b) => b === active);\n      let next = -1;\n      if (ke.key === 'ArrowRight') next = (idx + 1) % btns.length;\n      if (ke.key === 'ArrowLeft') next = (idx - 1 + btns.length) % btns.length;\n      if (ke.key === 'Home') next = 0;\n      if (ke.key === 'End') next = btns.length - 1;\n      if (next >= 0) {\n        ke.preventDefault();\n        btns[next]?.focus();\n        btns[next]?.click();\n      }\n    };\n    const updatePanels = (activeId: string) => {\n      (self as HTMLElement)\n        .querySelectorAll<HTMLElement>('[data-tab]')\n        .forEach((panel) => {\n          panel.hidden = panel.getAttribute('data-tab') !== activeId;\n        });\n    };\n    self['_clickH'] = clickH;\n    self['_keyH'] = keyH;\n    (self as HTMLElement).shadowRoot?.addEventListener('click', clickH);\n    (self as HTMLElement).shadowRoot?.addEventListener('keydown', keyH);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const obs = s['_obs'] as MutationObserver | undefined;\n    if (obs) obs.disconnect();\n    const ch = s['_clickH'] as EventListener | undefined;\n    if (ch) this.shadowRoot?.removeEventListener('click', ch);\n    const kh = s['_keyH'] as EventListener | undefined;\n    if (kh) this.shadowRoot?.removeEventListener('keydown', kh);\n  },\n  updated() {\n    // Sync panel visibility after each render\n    const active = this.getAttribute('active-tab') ?? '';\n    this.querySelectorAll<HTMLElement>('[data-tab]').forEach((panel) => {\n      const tabId = panel.getAttribute('data-tab') ?? '';\n      const isActive = tabId === active;\n      const panelId = panel.id || getPanelId(tabId);\n      const button = Array.from(\n        this.shadowRoot?.querySelectorAll<HTMLElement>('.tab[data-tab-id]') ?? []\n      ).find((candidate) => candidate.getAttribute('data-tab-id') === tabId);\n      const labelledBy = button?.id || (button ? getTabButtonId(tabId) : null);\n\n      if (panelId) {\n        panel.id = panelId;\n      }\n      panel.hidden = !isActive;\n      panel.setAttribute('role', 'tabpanel');\n      panel.setAttribute('tabindex', isActive ? '0' : '-1');\n      if (labelledBy) {\n        panel.setAttribute('aria-labelledby', labelledBy);\n      } else {\n        panel.removeAttribute('aria-labelledby');\n      }\n      panel.setAttribute('aria-hidden', isActive ? 'false' : 'true');\n      if (button) {\n        if (panelId) {\n          button.setAttribute('aria-controls', panelId);\n        } else {\n          button.removeAttribute('aria-controls');\n        }\n      }\n    });\n  },\n  render({ props, state }) {\n    const items =\n      (state['tabs'] as\n        | Array<{ id: string; label: string; disabled: boolean }>\n        | undefined) ?? [];\n    const active = props['active-tab'] || items[0]?.id || '';\n    const tabsHtml = items\n      .map((tab) => {\n        const buttonId = getTabButtonId(tab.id);\n        const panelId = getPanelId(tab.id);\n        return `\n       <button part=\"tab\" class=\"tab\" data-variant=\"${escapeHtml(props.variant)}\"\n        role=\"tab\" ${buttonId ? `id=\"${escapeHtml(buttonId)}\"` : ''} data-tab-id=\"${escapeHtml(tab.id)}\"\n        aria-selected=\"${tab.id === active ? 'true' : 'false'}\"\n        ${panelId ? `aria-controls=\"${escapeHtml(panelId)}\"` : ''}\n        tabindex=\"${tab.id === active ? '0' : '-1'}\"\n        ${tab.disabled ? 'disabled aria-disabled=\"true\"' : ''}\n      >${escapeHtml(tab.label)}</button>\n    `;\n      })\n      .join('');\n    return html`\n      <div class=\"tabs\" part=\"tabs\">\n        <div\n          class=\"tablist\"\n          part=\"tablist\"\n          role=\"tablist\"\n          aria-label=\"${t('tabs.listLabel')}\"\n          data-variant=\"${escapeHtml(props.variant)}\"\n        >\n          ${tabsHtml}\n        </div>\n        <div class=\"panels\" part=\"panels\"><slot></slot></div>\n      </div>\n    `;\n  },\n};\n\ncomponent<BqTabsProps>('bq-tabs', definition);\n","/**\n * Textarea form field.\n * @element bq-textarea\n * @prop {string}  label\n * @prop {string}  value\n * @prop {string}  placeholder\n * @prop {string}  name\n * @prop {number}  rows\n * @prop {boolean} disabled\n * @prop {boolean} readonly\n * @prop {boolean} required\n * @prop {string}  error\n * @prop {string}  hint\n * @prop {string}  maxlength\n * @prop {boolean} show-counter - Show character counter when maxlength is set\n * @fires bq-input  - { value: string }\n * @fires bq-change - { value: string }\n * @fires bq-focus\n * @fires bq-blur\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { uniqueId } from '../../utils/dom.js';\nimport { createFormProxy, type FormProxy } from '../../utils/form.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqTextareaProps = {\n  label: string;\n  value: string;\n  placeholder: string;\n  name: string;\n  rows: number;\n  disabled: boolean;\n  readonly: boolean;\n  required: boolean;\n  error: string;\n  hint: string;\n  maxlength: string;\n  'show-counter': boolean;\n};\ntype BqTextareaState = { uid: string };\n\nconst definition: ComponentDefinition<BqTextareaProps, BqTextareaState> = {\n  props: {\n    label: { type: String, default: '' },\n    value: { type: String, default: '' },\n    placeholder: { type: String, default: '' },\n    name: { type: String, default: '' },\n    rows: { type: Number, default: 4 },\n    disabled: { type: Boolean, default: false },\n    readonly: { type: Boolean, default: false },\n    required: { type: Boolean, default: false },\n    error: { type: String, default: '' },\n    hint: { type: String, default: '' },\n    maxlength: { type: String, default: '' },\n    'show-counter': { type: Boolean, default: false },\n  },\n  state: {\n    uid: '',\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .field { display: flex; flex-direction: column; gap: 0.375rem; }\n    .label { font-size: var(--bq-font-size-sm,0.875rem); font-weight: var(--bq-font-weight-medium,500); color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans); display: flex; align-items: center; gap: 0.25rem; }\n    .required-mark { color: var(--bq-color-danger-600,#dc2626); }\n    textarea {\n      display: block; width: 100%; border: 1.5px solid var(--bq-border-emphasis,#cbd5e1);\n      border-radius: var(--bq-radius-lg,0.5rem); background: var(--bq-bg-base,#fff);\n      color: var(--bq-text-base,#0f172a); font-family: var(--bq-font-family-sans);\n      font-size: var(--bq-font-size-md,1rem); padding: 0.5rem 0.875rem;\n      resize: vertical; outline: none;\n      transition: border-color var(--bq-duration-fast) var(--bq-easing-standard), box-shadow var(--bq-duration-fast) var(--bq-easing-standard);\n    }\n    textarea:focus { border-color: var(--bq-border-focus,#2563eb); box-shadow: var(--bq-focus-ring); }\n    :host([error]:not([error=\"\"])) textarea { border-color: var(--bq-color-danger-500,#ef4444); }\n    :host([error]:not([error=\"\"])) textarea:focus { border-color: var(--bq-color-danger-500,#ef4444); box-shadow: var(--bq-focus-ring-danger); }\n    :host([disabled]) textarea { opacity: 0.5; cursor: not-allowed; background: var(--bq-bg-muted,#f1f5f9); }\n    textarea::placeholder { color: var(--bq-text-subtle,#94a3b8); }\n    .hint { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); }\n    .error-msg { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-color-danger-600,#dc2626); font-family: var(--bq-font-family-sans); }\n    .footer { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }\n    .counter { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); font-family: var(--bq-font-family-sans); margin-left: auto; }\n    .counter[data-over=\"true\"] { color: var(--bq-color-danger-600,#dc2626); }\n    @media (prefers-reduced-motion: reduce) {\n      textarea { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'uid', v: string): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    if (!self.getState<string>('uid')) self.setState('uid', uniqueId('bq-ta'));\n\n    // Form proxy for native <form> participation\n    const name = self.getAttribute('name') ?? '';\n    const value = self.getAttribute('value') ?? '';\n    const disabled = self.hasAttribute('disabled');\n    const proxy = createFormProxy(self, name, value, disabled);\n    (self as unknown as Record<string, unknown>)['_formProxy'] = proxy;\n\n    const ih = (e: Event) => {\n      const t = e.target as HTMLTextAreaElement | null;\n      if (t?.tagName === 'TEXTAREA') {\n        self.setAttribute('value', t.value);\n        proxy.setValue(t.value);\n        self.dispatchEvent(\n          new CustomEvent('bq-input', {\n            detail: { value: t.value },\n            bubbles: true,\n            composed: true,\n          })\n        );\n      }\n    };\n    const ch = (e: Event) => {\n      const t = e.target as HTMLTextAreaElement | null;\n      if (t?.tagName === 'TEXTAREA')\n        self.dispatchEvent(\n          new CustomEvent('bq-change', {\n            detail: { value: t.value },\n            bubbles: true,\n            composed: true,\n          })\n        );\n    };\n    const fh = (e: Event) => {\n      if ((e.target as Element)?.tagName === 'TEXTAREA')\n        self.dispatchEvent(\n          new CustomEvent('bq-focus', { bubbles: true, composed: true })\n        );\n    };\n    const bh = (e: Event) => {\n      if ((e.target as Element)?.tagName === 'TEXTAREA')\n        self.dispatchEvent(\n          new CustomEvent('bq-blur', { bubbles: true, composed: true })\n        );\n    };\n    const s = self as unknown as Record<string, unknown>;\n    s['_ih'] = ih;\n    s['_ch'] = ch;\n    s['_fh'] = fh;\n    s['_bh'] = bh;\n    self.shadowRoot?.addEventListener('input', ih);\n    self.shadowRoot?.addEventListener('change', ch);\n    self.shadowRoot?.addEventListener('focusin', fh);\n    self.shadowRoot?.addEventListener('focusout', bh);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const sr = this.shadowRoot;\n    (['_ih', '_ch', '_fh', '_bh'] as const).forEach((k) => {\n      const h = s[k] as EventListener | undefined;\n      if (h)\n        sr?.removeEventListener(\n          k === '_ih'\n            ? 'input'\n            : k === '_ch'\n              ? 'change'\n              : k === '_fh'\n                ? 'focusin'\n                : 'focusout',\n          h\n        );\n    });\n    (s['_formProxy'] as FormProxy | undefined)?.cleanup();\n  },\n  updated() {\n    const s = this as unknown as Record<string, unknown>;\n    const proxy = s['_formProxy'] as FormProxy | undefined;\n    if (proxy) {\n      proxy.setName(this.getAttribute('name') ?? '');\n      proxy.setValue(this.getAttribute('value') ?? '');\n      proxy.setDisabled(this.hasAttribute('disabled'));\n    }\n  },\n  render({ props, state }) {\n    const hasError = Boolean(props.error);\n    const uid = state.uid || 'bq-ta';\n    const maxLen = props.maxlength ? parseInt(props.maxlength, 10) : 0;\n    const showCounter = props['show-counter'] && maxLen > 0;\n    const charCount = props.value.length;\n    const isOver = showCounter && charCount > maxLen;\n    const hasFooter = hasError || Boolean(props.hint) || showCounter;\n    const describedByParts: string[] = [];\n    if (hasError) describedByParts.push(`${uid}-err`);\n    else if (props.hint) describedByParts.push(`${uid}-hint`);\n    if (showCounter) describedByParts.push(`${uid}-counter`);\n    const describedBy = describedByParts.join(' ');\n    return html`\n      <div class=\"field\" part=\"field\">\n        ${props.label\n          ? `<label class=\"label\" for=\"${uid}\" part=\"label\">${escapeHtml(props.label)}${props.required ? '<span class=\"required-mark\" aria-hidden=\"true\"> *</span>' : ''}</label>`\n          : ''}\n        <textarea\n          part=\"textarea\"\n          id=\"${uid}\"\n          name=\"${escapeHtml(props.name)}\"\n          rows=\"${String(props.rows)}\"\n          placeholder=\"${escapeHtml(props.placeholder)}\"\n          ${props.maxlength ? `maxlength=\"${escapeHtml(props.maxlength)}\"` : ''}\n          ${props.disabled ? 'disabled' : ''}\n          ${props.readonly ? 'readonly' : ''}\n          ${props.required ? 'required' : ''}\n          aria-invalid=\"${hasError ? 'true' : 'false'}\"\n          ${props.required ? 'aria-required=\"true\"' : ''}\n          ${describedBy ? `aria-describedby=\"${describedBy}\"` : ''}\n        >${escapeHtml(props.value)}</textarea>\n        ${hasFooter\n          ? `<div class=\"footer\" part=\"footer\">\n              <span>\n                ${\n                  hasError\n                    ? `<span class=\"error-msg\" id=\"${uid}-err\" role=\"alert\" part=\"error\">${escapeHtml(props.error)}</span>`\n                    : ''\n                }\n                ${\n                  props.hint && !hasError\n                    ? `<span class=\"hint\" id=\"${uid}-hint\" part=\"hint\">${escapeHtml(props.hint)}</span>`\n                    : ''\n                }\n              </span>\n              ${\n                showCounter\n                  ? `<span class=\"counter\" id=\"${uid}-counter\" part=\"counter\" data-over=\"${isOver ? 'true' : 'false'}\" aria-live=\"polite\">${escapeHtml(\n                      t('input.characterCount', {\n                        count: charCount,\n                        max: maxLen,\n                      })\n                    )}</span>`\n                  : ''\n              }\n            </div>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqTextareaProps, BqTextareaState>('bq-textarea', definition);\n","/**\n * Toast / notification snackbar.\n * @element bq-toast\n * @prop {string}  variant    - success | error | warning | info\n * @prop {string}  message\n * @prop {number}  duration   - Auto-dismiss ms. 0 = persistent.\n * @prop {boolean} dismissible\n * @fires bq-close\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { t } from '../../i18n/index.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqToastProps = {\n  variant: string;\n  message: string;\n  duration: number;\n  dismissible: boolean;\n};\n\nconst definition: ComponentDefinition<BqToastProps> = {\n  props: {\n    variant: { type: String, default: 'info' },\n    message: { type: String, default: '' },\n    duration: { type: Number, default: 4000 },\n    dismissible: { type: Boolean, default: true },\n  },\n  styles: `\n    ${getBaseStyles()}\n    *, *::before, *::after { box-sizing: border-box; }\n    :host { display: block; }\n    .toast {\n      display: flex; align-items: flex-start; gap: 0.75rem;\n      padding: 0.875rem var(--bq-space-4,1rem); border-radius: var(--bq-radius-lg,0.5rem);\n      border: 1.5px solid transparent; font-family: var(--bq-font-family-sans);\n      box-shadow: var(--bq-shadow-lg); min-width: 18rem; max-width: 28rem;\n      animation: slideIn var(--bq-duration-normal,200ms) var(--bq-easing-decelerate);\n    }\n    @keyframes slideIn { from { opacity: 0; transform: translateY(-0.5rem); } to { opacity: 1; transform: translateY(0); } }\n    .toast[data-variant=\"success\"] { background: var(--bq-color-success-50,#f0fdf4); border-color: var(--bq-color-success-500,#22c55e); color: var(--bq-color-success-700,#15803d); }\n    .toast[data-variant=\"error\"]   { background: var(--bq-color-danger-50,#fef2f2);  border-color: var(--bq-color-danger-500,#ef4444);  color: var(--bq-color-danger-700,#b91c1c); }\n    .toast[data-variant=\"warning\"] { background: var(--bq-color-warning-50,#fffbeb); border-color: var(--bq-color-warning-500,#f59e0b); color: var(--bq-color-warning-700,#b45309); }\n    .toast[data-variant=\"info\"]    { background: var(--bq-color-info-50,#eff6ff);    border-color: var(--bq-color-info-500,#3b82f6);    color: var(--bq-color-info-700,#1d4ed8); }\n    .icon { font-size: 1.1em; flex-shrink: 0; margin-top: 0.05em; }\n    .content { flex: 1; min-width: 0; font-size: var(--bq-font-size-sm,0.875rem); line-height: var(--bq-line-height-normal,1.5); }\n    .close { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; background: none; border: none; cursor: pointer; color: inherit; padding: 0.125rem; border-radius: var(--bq-radius-sm,0.25rem); opacity: 0.7; font-size: 0.875rem; }\n    .close:hover { opacity: 1; background: rgba(0,0,0,0.08); }\n    .close:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); }\n    @media (prefers-reduced-motion: reduce) {\n      .toast { animation: none; }\n    }\n  `,\n  connected() {\n    const self = this;\n    const close = () => {\n      self.dispatchEvent(\n        new CustomEvent('bq-close', { bubbles: true, composed: true })\n      );\n      self.remove();\n    };\n    const ch = (e: Event) => {\n      if ((e.target as Element).closest('.close')) close();\n    };\n    const dur = parseInt(self.getAttribute('duration') ?? '4000', 10);\n    if (dur > 0) {\n      const timer = setTimeout(close, dur);\n      (self as unknown as Record<string, unknown>)['_timer'] = timer;\n    }\n    (self as unknown as Record<string, unknown>)['_ch'] = ch;\n    self.shadowRoot?.addEventListener('click', ch);\n  },\n  disconnected() {\n    const s = this as unknown as Record<string, unknown>;\n    const timer = s['_timer'] as ReturnType<typeof setTimeout> | undefined;\n    if (timer) clearTimeout(timer);\n    const ch = s['_ch'] as EventListener | undefined;\n    if (ch) this.shadowRoot?.removeEventListener('click', ch);\n  },\n  render({ props }) {\n    const icons: Record<string, string> = {\n      success: '✓',\n      error: '✕',\n      warning: '⚠',\n      info: 'ℹ',\n    };\n    const icon = icons[props.variant] ?? 'ℹ';\n    const isAlert = props.variant === 'error' || props.variant === 'warning';\n    return html`\n      <div\n        part=\"toast\"\n        class=\"toast\"\n        data-variant=\"${escapeHtml(props.variant)}\"\n        role=\"${isAlert ? 'alert' : 'status'}\"\n        aria-live=\"${isAlert ? 'assertive' : 'polite'}\"\n        aria-atomic=\"true\"\n      >\n        <span class=\"icon\" aria-hidden=\"true\">${icon}</span>\n        <span class=\"content\" part=\"content\"\n          ><slot>${escapeHtml(props.message)}</slot></span\n        >\n        ${props.dismissible\n          ? `<button type=\"button\" class=\"close\" aria-label=\"${t('toast.close')}\">&#10005;</button>`\n          : ''}\n      </div>\n    `;\n  },\n};\n\n/** Imperative toast API */\nexport interface ToastOptions {\n  message: string;\n  variant?: 'success' | 'error' | 'warning' | 'info';\n  duration?: number;\n}\n\nconst TOAST_CONTAINER_ID = 'bq-toast-container';\n\nfunction getOrCreateContainer(): HTMLElement {\n  let container = document.getElementById(TOAST_CONTAINER_ID);\n  if (!container) {\n    container = document.createElement('div');\n    container.id = TOAST_CONTAINER_ID;\n    container.setAttribute('role', 'region');\n    container.setAttribute('aria-label', 'Notifications');\n    container.style.cssText = `\n      position: fixed; top: 1rem; right: 1rem; z-index: var(--bq-z-toast, 600);\n      display: flex; flex-direction: column; gap: 0.5rem; pointer-events: none;\n      max-height: 100vh; overflow: hidden;\n    `.replace(/\\s+/g, ' ');\n    document.body.appendChild(container);\n  }\n  return container;\n}\n\nexport function showToast(\n  options: ToastOptions,\n  container?: HTMLElement\n): HTMLElement {\n  const host = container ?? getOrCreateContainer();\n  const toast = document.createElement('bq-toast');\n  toast.style.pointerEvents = 'auto';\n  toast.setAttribute('message', options.message);\n  if (options.variant) toast.setAttribute('variant', options.variant);\n  if (options.duration !== undefined)\n    toast.setAttribute('duration', String(options.duration));\n  host.appendChild(toast);\n  return toast;\n}\n\ncomponent<BqToastProps>('bq-toast', definition);\n","/**\n * Tooltip component - contextual popup on hover/focus.\n * @element bq-tooltip\n * @prop {string} content   - Tooltip text\n * @prop {string} placement - top | bottom | left | right\n * @prop {number} delay     - Show delay in ms\n * @slot - The trigger element\n */\nimport type { ComponentDefinition } from '@bquery/bquery/component';\nimport { component, html } from '@bquery/bquery/component';\nimport { escapeHtml } from '@bquery/bquery/security';\nimport { uniqueId } from '../../utils/dom.js';\nimport { getBaseStyles } from '../../utils/styles.js';\n\ntype BqTooltipProps = { content: string; placement: string; delay: number };\ntype BqTooltipState = { visible: boolean; uid: string };\n\nfunction addDescribedBy(element: HTMLElement, tooltipId: string): void {\n  const current = element.getAttribute('aria-describedby');\n  const tokens = new Set((current ?? '').split(/\\s+/).filter(Boolean));\n  tokens.add(tooltipId);\n  element.setAttribute('aria-describedby', Array.from(tokens).join(' '));\n}\n\nfunction removeDescribedBy(element: HTMLElement, tooltipId: string): void {\n  const current = element.getAttribute('aria-describedby');\n  if (!current) return;\n  const tokens = current\n    .split(/\\s+/)\n    .filter((token) => token && token !== tooltipId);\n  if (tokens.length > 0) {\n    element.setAttribute('aria-describedby', tokens.join(' '));\n    return;\n  }\n  element.removeAttribute('aria-describedby');\n}\n\nconst definition: ComponentDefinition<BqTooltipProps, BqTooltipState> = {\n  props: {\n    content: { type: String, default: '' },\n    placement: { type: String, default: 'top' },\n    delay: { type: Number, default: 200 },\n  },\n  state: { visible: false, uid: '' },\n  styles: `\n    ${getBaseStyles()}\n    :host { display: inline-block; position: relative; }\n    .tip {\n      position: absolute; z-index: var(--bq-z-tooltip,700);\n      background: var(--bq-color-secondary-900,#0f172a); color: #fff;\n      font-family: var(--bq-font-family-sans); font-size: var(--bq-font-size-sm,0.875rem);\n      padding: 0.375rem 0.625rem; border-radius: var(--bq-radius-md,0.375rem);\n      white-space: nowrap; pointer-events: none;\n      opacity: 0; transition: opacity var(--bq-duration-fast);\n    }\n    .tip[data-visible=\"true\"] { opacity: 1; }\n    .tip[data-placement=\"top\"]    { bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); }\n    .tip[data-placement=\"bottom\"] { top:  calc(100% + 6px); left: 50%; transform: translateX(-50%); }\n    .tip[data-placement=\"left\"]   { right: calc(100% + 6px); top: 50%; transform: translateY(-50%); }\n    .tip[data-placement=\"right\"]  { left:  calc(100% + 6px); top: 50%; transform: translateY(-50%); }\n    @media (prefers-reduced-motion: reduce) {\n      .tip { transition: none; }\n    }\n  `,\n  connected() {\n    type BQEl = HTMLElement & {\n      setState(k: 'visible' | 'uid', v: unknown): void;\n      getState<T>(k: string): T;\n    };\n    const self = this as unknown as BQEl;\n    const internalState = self as unknown as Record<string, unknown>;\n    if (!self.getState<string>('uid')) {\n      self.setState('uid', uniqueId('bq-tooltip'));\n    }\n    const clearShowTimer = () => {\n      const timer = internalState['_showTimer'] as\n        | ReturnType<typeof setTimeout>\n        | null\n        | undefined;\n      if (timer) {\n        clearTimeout(timer);\n      }\n      internalState['_showTimer'] = null;\n    };\n    const show = () => {\n      clearShowTimer();\n      const d = parseInt(self.getAttribute('delay') ?? '200', 10);\n      internalState['_showTimer'] = setTimeout(() => {\n        internalState['_showTimer'] = null;\n        self.setState('visible', true);\n      }, d);\n    };\n    const hide = () => {\n      clearShowTimer();\n      self.setState('visible', false);\n    };\n    const kh = (e: Event) => {\n      if ((e as KeyboardEvent).key === 'Escape') hide();\n    };\n    const syncTrigger = () => {\n      const state = self as unknown as Record<string, unknown>;\n      const tooltipId = self.getState<string>('uid');\n      const previous =\n        (state['_triggerElements'] as HTMLElement[] | undefined) ?? [];\n      previous.forEach((element) => removeDescribedBy(element, tooltipId));\n\n      const slot = self.shadowRoot?.querySelector(\n        'slot'\n      ) as HTMLSlotElement | null;\n      if (!slot) {\n        state['_triggerElements'] = [];\n        return;\n      }\n\n      const content = self.getAttribute('content')?.trim() ?? '';\n      const next = slot\n        .assignedElements({ flatten: true })\n        .filter(\n          (element): element is HTMLElement => element instanceof HTMLElement\n        );\n\n      if (content) {\n        next.forEach((element) => addDescribedBy(element, tooltipId));\n      }\n      state['_triggerElements'] = next;\n    };\n    internalState['_show'] = show;\n    internalState['_hide'] = hide;\n    internalState['_kh'] = kh;\n    internalState['_syncTrigger'] = syncTrigger;\n    internalState['_clearShowTimer'] = clearShowTimer;\n    self.addEventListener('mouseenter', show);\n    self.addEventListener('mouseleave', hide);\n    self.addEventListener('focusin', show);\n    self.addEventListener('focusout', hide);\n    document.addEventListener('keydown', kh);\n    queueMicrotask(() => {\n      if (!self.isConnected) return;\n      const slot = self.shadowRoot?.querySelector(\n        'slot'\n      ) as HTMLSlotElement | null;\n      if (!slot) return;\n      slot.addEventListener('slotchange', syncTrigger);\n      internalState['_slot'] = slot;\n      syncTrigger();\n    });\n  },\n  disconnected() {\n    const self = this as unknown as Record<string, unknown>;\n    const show = self['_show'] as EventListener;\n    const hide = self['_hide'] as EventListener;\n    const kh = self['_kh'] as EventListener;\n    const slot = self['_slot'] as HTMLSlotElement | undefined;\n    const syncTrigger = self['_syncTrigger'] as EventListener | undefined;\n    const clearShowTimer = self['_clearShowTimer'] as (() => void) | undefined;\n    const triggerElements =\n      (self['_triggerElements'] as HTMLElement[] | undefined) ?? [];\n    const tooltipId =\n      (this as unknown as { getState?<T>(key: string): T }).getState?.<string>(\n        'uid'\n      ) ?? this.id;\n    clearShowTimer?.();\n    this.removeEventListener('mouseenter', show);\n    this.removeEventListener('mouseleave', hide);\n    this.removeEventListener('focusin', show);\n    this.removeEventListener('focusout', hide);\n    document.removeEventListener('keydown', kh);\n    if (slot && syncTrigger)\n      slot.removeEventListener('slotchange', syncTrigger);\n    triggerElements.forEach((element) => removeDescribedBy(element, tooltipId));\n  },\n  updated() {\n    const syncTrigger = (this as unknown as Record<string, unknown>)[\n      '_syncTrigger'\n    ] as (() => void) | undefined;\n    syncTrigger?.();\n  },\n  render({ props, state }) {\n    const visible = Boolean(state['visible']);\n    const uid = state['uid'] || 'bq-tooltip';\n    return html`\n      <slot></slot>\n      <div\n        id=\"${escapeHtml(uid)}\"\n        part=\"tooltip\"\n        class=\"tip\"\n        role=\"tooltip\"\n        aria-hidden=\"${visible ? 'false' : 'true'}\"\n        data-placement=\"${escapeHtml(props.placement)}\"\n        data-visible=\"${visible ? 'true' : 'false'}\"\n      >\n        ${escapeHtml(props.content)}\n      </div>\n    `;\n  },\n};\n\ncomponent<BqTooltipProps, BqTooltipState>('bq-tooltip', definition);\n","import './components/index.js';\n\n/** @deprecated Components self-register on import; options passed to `registerAll()` are ignored. */\nexport interface RegisterOptions {\n  /** @deprecated Custom prefixes are no longer supported. Components always register as `bq-*`. */\n  prefix?: string;\n}\n\nlet didWarnDeprecatedRegisterOptions = false;\n\n/**\n * @deprecated Components now self-register on import. Passing options no longer changes registration behavior.\n */\nexport function registerAll(options: RegisterOptions = {}): void {\n  if (Object.keys(options).length === 0) return;\n  if (didWarnDeprecatedRegisterOptions) return;\n\n  didWarnDeprecatedRegisterOptions = true;\n\n  let warning = '@bquery/ui registerAll() no longer accepts registration options because components self-register on import.';\n\n  if (options.prefix === 'bq') {\n    warning = '@bquery/ui registerAll() no longer needs a `prefix` option because components self-register on import as \"bq-*\".';\n  } else if (options.prefix) {\n    warning = `@bquery/ui registerAll() no longer supports custom prefixes; received \"${options.prefix}\" but components always register as \"bq-*\".`;\n  }\n\n  console.warn(warning);\n}\n","/**\n * @bquery/ui — Main entry point\n *\n * Importing this package registers all bq components via the native @bquery/bquery component API.\n */\n\n// Design tokens\nexport * from './tokens/index.js';\n\n// Theme system\nexport * from './theme/index.js';\n\n// i18n\nexport * from './i18n/index.js';\n\n// Utilities\nexport * from './utils/index.js';\n\nimport { registerAll } from './register.js';\n\n// Components\nimport { __bqComponentEntry as accordionComponentEntry } from './components/accordion/index.js';\nimport { __bqComponentEntry as alertComponentEntry } from './components/alert/index.js';\nimport { __bqComponentEntry as avatarComponentEntry } from './components/avatar/index.js';\nimport { __bqComponentEntry as badgeComponentEntry } from './components/badge/index.js';\nimport { __bqComponentEntry as breadcrumbsComponentEntry } from './components/breadcrumbs/index.js';\nimport { __bqComponentEntry as buttonComponentEntry } from './components/button/index.js';\nimport { __bqComponentEntry as cardComponentEntry } from './components/card/index.js';\nimport { __bqComponentEntry as checkboxComponentEntry } from './components/checkbox/index.js';\nimport { __bqComponentEntry as chipComponentEntry } from './components/chip/index.js';\nimport { __bqComponentEntry as dialogComponentEntry } from './components/dialog/index.js';\nimport { __bqComponentEntry as dividerComponentEntry } from './components/divider/index.js';\nimport { __bqComponentEntry as drawerComponentEntry } from './components/drawer/index.js';\nimport { __bqComponentEntry as dropdownMenuComponentEntry } from './components/dropdown-menu/index.js';\nimport { __bqComponentEntry as emptyStateComponentEntry } from './components/empty-state/index.js';\nimport { __bqComponentEntry as iconButtonComponentEntry } from './components/icon-button/index.js';\nimport { __bqComponentEntry as inputComponentEntry } from './components/input/index.js';\nimport { __bqComponentEntry as paginationComponentEntry } from './components/pagination/index.js';\nimport { __bqComponentEntry as progressComponentEntry } from './components/progress/index.js';\nimport { __bqComponentEntry as radioComponentEntry } from './components/radio/index.js';\nimport { __bqComponentEntry as selectComponentEntry } from './components/select/index.js';\nimport { __bqComponentEntry as segmentedControlComponentEntry } from './components/segmented-control/index.js';\nimport { __bqComponentEntry as skeletonComponentEntry } from './components/skeleton/index.js';\nimport { __bqComponentEntry as sliderComponentEntry } from './components/slider/index.js';\nimport { __bqComponentEntry as spinnerComponentEntry } from './components/spinner/index.js';\nimport { __bqComponentEntry as statCardComponentEntry } from './components/stat-card/index.js';\nimport { __bqComponentEntry as switchComponentEntry } from './components/switch/index.js';\nimport { __bqComponentEntry as tableComponentEntry } from './components/table/index.js';\nimport { __bqComponentEntry as tabsComponentEntry } from './components/tabs/index.js';\nimport { __bqComponentEntry as textareaComponentEntry } from './components/textarea/index.js';\nimport { __bqComponentEntry as tooltipComponentEntry } from './components/tooltip/index.js';\n// Toast is imported directly because its wrapper both registers the component and re-exports showToast().\nimport './components/toast/index.js';\n\n// Keep component wrappers reachable from a private symbol-keyed property so the root bundle\n// preserves import-time registration without adding a typed public API surface.\nconst COMPONENT_ENTRY_MAP_KEY = Symbol.for('@bquery/ui.componentEntryMap');\n\nObject.defineProperty(registerAll, COMPONENT_ENTRY_MAP_KEY, {\n  value: {\n    'accordion': accordionComponentEntry,\n    'alert': alertComponentEntry,\n    'avatar': avatarComponentEntry,\n    'badge': badgeComponentEntry,\n    'breadcrumbs': breadcrumbsComponentEntry,\n    'button': buttonComponentEntry,\n    'card': cardComponentEntry,\n    'checkbox': checkboxComponentEntry,\n    'chip': chipComponentEntry,\n    'dialog': dialogComponentEntry,\n    'divider': dividerComponentEntry,\n    'drawer': drawerComponentEntry,\n    'dropdown-menu': dropdownMenuComponentEntry,\n    'empty-state': emptyStateComponentEntry,\n    'icon-button': iconButtonComponentEntry,\n    'input': inputComponentEntry,\n    'pagination': paginationComponentEntry,\n    'progress': progressComponentEntry,\n    'radio': radioComponentEntry,\n    'select': selectComponentEntry,\n    'segmented-control': segmentedControlComponentEntry,\n    'skeleton': skeletonComponentEntry,\n    'slider': sliderComponentEntry,\n    'spinner': spinnerComponentEntry,\n    'stat-card': statCardComponentEntry,\n    'switch': switchComponentEntry,\n    'table': tableComponentEntry,\n    'tabs': tabsComponentEntry,\n    'textarea': textareaComponentEntry,\n    'tooltip': tooltipComponentEntry,\n  },\n  writable: false,\n  enumerable: false,\n  configurable: false,\n});\n\n// Re-export the toast API while other components continue to register via import side effects only.\nexport * from './components/toast/index.js';\n\n// Legacy compatibility helpers\nexport { registerAll };\nexport type { RegisterOptions } from './register.js';\n","/**\n * ARIA helper utilities for @bquery/ui components.\n */\n\n/** Sets or removes an aria attribute based on a boolean condition. */\nexport function ariaBoolean(\n  el: Element,\n  attribute: string,\n  value: boolean,\n): void {\n  if (value) {\n    el.setAttribute(attribute, 'true');\n  } else {\n    el.setAttribute(attribute, 'false');\n  }\n}\n\n/** Links an element as described-by another element's id. */\nexport function linkDescribedBy(el: Element, ...ids: string[]): void {\n  const existing = el.getAttribute('aria-describedby');\n  const existingIds = existing ? existing.split(' ').filter(Boolean) : [];\n  const merged = [...new Set([...existingIds, ...ids.filter(Boolean)])];\n  if (merged.length > 0) {\n    el.setAttribute('aria-describedby', merged.join(' '));\n  }\n}\n\n/** Remove ids from aria-describedby. */\nexport function unlinkDescribedBy(el: Element, ...ids: string[]): void {\n  const existing = el.getAttribute('aria-describedby');\n  if (!existing) return;\n  const remaining = existing\n    .split(' ')\n    .filter((id) => !ids.includes(id))\n    .join(' ');\n  if (remaining) {\n    el.setAttribute('aria-describedby', remaining);\n  } else {\n    el.removeAttribute('aria-describedby');\n  }\n}\n\n/** Sets aria-labelledby. */\nexport function setLabelledBy(el: Element, ...ids: string[]): void {\n  const valid = ids.filter(Boolean);\n  if (valid.length > 0) {\n    el.setAttribute('aria-labelledby', valid.join(' '));\n  } else {\n    el.removeAttribute('aria-labelledby');\n  }\n}\n\n/** Announce a message via an ARIA live region. */\nexport function announce(\n  message: string,\n  politeness: 'polite' | 'assertive' = 'polite',\n): void {\n  const existing = document.getElementById('bq-aria-live');\n  const el: HTMLElement = (existing as HTMLElement | null) ?? (() => {\n    const div = document.createElement('div');\n    div.id = 'bq-aria-live';\n    div.setAttribute('aria-live', politeness);\n    div.setAttribute('aria-relevant', 'additions');\n    div.setAttribute('aria-atomic', 'true');\n    Object.assign(div.style, {\n      position: 'absolute',\n      width: '1px',\n      height: '1px',\n      padding: '0',\n      overflow: 'hidden',\n      clip: 'rect(0,0,0,0)',\n      whiteSpace: 'nowrap',\n      border: '0',\n    });\n    document.body.appendChild(div);\n    return div;\n  })();\n  el.setAttribute('aria-live', politeness);\n  el.textContent = '';\n  requestAnimationFrame(() => { el.textContent = message; });\n}\n","/**\n * Class name utility - similar to clsx / classnames.\n *\n * Accepts any mix of strings, string arrays, or conditional record objects\n * and returns a single space-separated class string.\n */\n\ntype ClassValue =\n  | string\n  | number\n  | null\n  | undefined\n  | boolean\n  | ClassValue[]\n  | Record<string, unknown>;\n\nexport function cn(...inputs: ClassValue[]): string {\n  const classes: string[] = [];\n  for (const input of inputs) {\n    if (!input) continue;\n    if (typeof input === 'string' || typeof input === 'number') {\n      classes.push(String(input));\n    } else if (Array.isArray(input)) {\n      const inner = cn(...input);\n      if (inner) classes.push(inner);\n    } else if (typeof input === 'object') {\n      for (const [key, value] of Object.entries(input)) {\n        if (value) classes.push(key);\n      }\n    }\n  }\n  return classes.join(' ');\n}\n"]}