{"version":3,"file":"BqSkeleton-CVgecIAo.cjs","names":[],"sources":["../src/components/skeleton/BqSkeleton.ts"],"sourcesContent":["/**\r\n * Skeleton loading placeholder.\r\n * @element bq-skeleton\r\n * @prop {string}  variant  - text | circle | rect | card\r\n * @prop {string}  width    - CSS width value\r\n * @prop {string}  height   - CSS height value\r\n * @prop {number}  lines    - Number of text lines\r\n */\r\nimport type { ComponentDefinition } from '@bquery/bquery/component';\r\nimport { component, html } from '@bquery/bquery/component';\r\nimport { escapeHtml } from '@bquery/bquery/security';\r\nimport { getBaseStyles } from '../../utils/styles.js';\r\n\r\ntype BqSkeletonProps = {\r\n  variant: string;\r\n  width: string;\r\n  height: string;\r\n  lines: number;\r\n};\r\n\r\nconst DISALLOWED_DIMENSION_PATTERN =\r\n  /[;{}]|(?:url\\s*\\(|expression\\s*\\(|javascript:|data:|@import)|[\\r\\n]/i;\r\n\r\nconst sanitizeDimension = (value: string): string => {\r\n  const trimmed = value.trim();\r\n\r\n  if (!trimmed) return '';\r\n  if (DISALLOWED_DIMENSION_PATTERN.test(trimmed)) return '';\r\n\r\n  return trimmed;\r\n};\r\n\r\nconst getStyleAttribute = (\r\n  width: string,\r\n  height: string,\r\n  widthOverride?: string\r\n): string => {\r\n  const styles: string[] = [];\r\n  const safeWidth = sanitizeDimension(widthOverride ?? width);\r\n  const safeHeight = sanitizeDimension(height);\r\n\r\n  if (safeWidth) styles.push(`width:${safeWidth}`);\r\n  if (safeHeight) styles.push(`height:${safeHeight}`);\r\n\r\n  return styles.join(';');\r\n};\r\n\r\nconst definition: ComponentDefinition<BqSkeletonProps> = {\r\n  props: {\r\n    variant: { type: String, default: 'text' },\r\n    width: { type: String, default: '100%' },\r\n    height: { type: String, default: '' },\r\n    lines: { type: Number, default: 1 },\r\n  },\r\n  sanitize: {\r\n    allowAttributes: ['style'],\r\n  },\r\n  styles: `\r\n    ${getBaseStyles()}\r\n    :host { display: block; }\r\n    .skeleton {\r\n      background: var(--bq-bg-emphasis,#e2e8f0);\r\n      border-radius: var(--bq-radius-md,0.375rem);\r\n      overflow: hidden; position: relative;\r\n    }\r\n    .skeleton::after {\r\n      content: ''; position: absolute; inset: 0;\r\n      background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.4) 50%, transparent 100%);\r\n      animation: shimmer 1.5s infinite;\r\n    }\r\n    @keyframes shimmer { from { transform: translateX(-100%); } to { transform: translateX(100%); } }\r\n    @media (prefers-reduced-motion: reduce) {\r\n      .skeleton::after { animation: none; }\r\n    }\r\n    .skeleton[data-variant=\"circle\"] { border-radius: var(--bq-radius-full,9999px); }\r\n    .skeleton[data-variant=\"text\"]   { height: 1em; margin-bottom: 0.5em; }\r\n    .skeleton[data-variant=\"text\"]:last-child { width: 70%; }\r\n    .lines { display: flex; flex-direction: column; gap: 0.5rem; }\r\n  `,\r\n  render({ props }) {\r\n    if (props.variant === 'text' && props.lines > 1) {\r\n      const lineStyle = getStyleAttribute(props.width, props.height);\r\n      const items = Array.from(\r\n        { length: props.lines },\r\n        (_, i) =>\r\n          `<div class=\"skeleton\" data-variant=\"text\" part=\"skeleton\" style=\"${escapeHtml(i === props.lines - 1 ? getStyleAttribute(props.width, props.height, '70%') : lineStyle)}\"></div>`\r\n      ).join('');\r\n      return html`<div class=\"lines\" part=\"lines\">${items}</div>`;\r\n    }\r\n    return html`<div\r\n      part=\"skeleton\"\r\n      class=\"skeleton\"\r\n      data-variant=\"${escapeHtml(props.variant)}\"\r\n      style=\"${escapeHtml(getStyleAttribute(props.width, props.height))}\"\r\n    ></div>`;\r\n  },\r\n};\r\n\r\ncomponent<BqSkeletonProps>('bq-skeleton', definition);\r\n"],"mappings":";;;;;AAoBA,IAAM,+BACJ;AAEF,IAAM,qBAAqB,UAA0B;CACnD,MAAM,UAAU,MAAM,MAAM;AAE5B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,6BAA6B,KAAK,QAAQ,CAAE,QAAO;AAEvD,QAAO;;AAGT,IAAM,qBACJ,OACA,QACA,kBACW;CACX,MAAM,SAAmB,EAAE;CAC3B,MAAM,YAAY,kBAAkB,iBAAiB,MAAM;CAC3D,MAAM,aAAa,kBAAkB,OAAO;AAE5C,KAAI,UAAW,QAAO,KAAK,SAAS,YAAY;AAChD,KAAI,WAAY,QAAO,KAAK,UAAU,aAAa;AAEnD,QAAO,OAAO,KAAK,IAAI;;AAsDzB,2BAAA,EAA2B,eAAe;CAlDxC,OAAO;EACL,SAAS;GAAE,MAAM;GAAQ,SAAS;GAAQ;EAC1C,OAAO;GAAE,MAAM;GAAQ,SAAS;GAAQ;EACxC,QAAQ;GAAE,MAAM;GAAQ,SAAS;GAAI;EACrC,OAAO;GAAE,MAAM;GAAQ,SAAS;GAAG;EACpC;CACD,UAAU,EACR,iBAAiB,CAAC,QAAQ,EAC3B;CACD,QAAQ;MACJ,eAAA,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBpB,OAAO,EAAE,SAAS;AAChB,MAAI,MAAM,YAAY,UAAU,MAAM,QAAQ,GAAG;GAC/C,MAAM,YAAY,kBAAkB,MAAM,OAAO,MAAM,OAAO;AAM9D,UAAO,2BAAA,CAAI,mCALG,MAAM,KAClB,EAAE,QAAQ,MAAM,OAAO,GACtB,GAAG,MACF,oEAAoE,2BAAA,GAAW,MAAM,MAAM,QAAQ,IAAI,kBAAkB,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,UAAU,CAAC,UAC3K,CAAC,KAAK,GACuC,CAAM;;AAEtD,SAAO,2BAAA,CAAI;;;sBAGO,2BAAA,GAAW,MAAM,QAAQ,CAAC;eACjC,2BAAA,GAAW,kBAAkB,MAAM,OAAO,MAAM,OAAO,CAAC,CAAC;;;CAK9B,CAAW"}