{"version":3,"file":"ngx-com-components-code-block.mjs","sources":["../../../projects/com/components/code-block/code-block.variants.ts","../../../projects/com/components/code-block/code-block.component.ts","../../../projects/com/components/code-block/ngx-com-components-code-block.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\n\nexport type CodeBlockVariant = 'filled' | 'outlined';\n\n/**\n * CVA variants for the code block container.\n *\n * @tokens `--color-muted`, `--color-foreground`,\n *         `--color-border`, `--color-border-subtle`,\n *         `--radius-card`, `--font-mono`\n */\nexport const codeBlockVariants: (props?: {\n  variant?: CodeBlockVariant;\n}) => string = cva(\n  [\n    'relative',\n    'flex',\n    'flex-col',\n    'rounded-card',\n    'overflow-hidden',\n    'font-mono',\n    'text-sm',\n  ],\n  {\n    variants: {\n      variant: {\n        filled: 'bg-muted text-foreground border border-border-subtle',\n        outlined: 'bg-transparent text-foreground border border-border',\n      },\n    },\n    defaultVariants: {\n      variant: 'filled',\n    },\n  },\n);\n\nexport type CodeBlockVariants = VariantProps<typeof codeBlockVariants>;\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  input,\n  output,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  InputSignal,\n  OutputEmitterRef,\n  Signal,\n  WritableSignal,\n} from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { mergeClasses } from 'ngx-com/utils';\nimport { codeBlockVariants } from './code-block.variants';\nimport type { CodeBlockVariant } from './code-block.variants';\n\n/**\n * Code block component for displaying code snippets with a language label\n * and copy-to-clipboard functionality.\n *\n * Renders plain monospace text in a styled container — no syntax highlighting.\n * The header bar shows an optional language label and a copy button that\n * provides visual feedback (checkmark icon for 2 seconds) after copying.\n *\n * @tokens `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n *         `--color-foreground`, `--color-border`, `--color-border-subtle`,\n *         `--color-ring`, `--color-success`,\n *         `--font-mono`, `--radius-card`\n *\n * @example Basic usage with language label\n * ```html\n * <com-code-block code=\"const x = 42;\" language=\"TypeScript\" />\n * ```\n *\n * @example Outlined variant\n * ```html\n * <com-code-block [code]=\"htmlSnippet\" language=\"HTML\" variant=\"outlined\" />\n * ```\n */\n@Component({\n  selector: 'com-code-block',\n  exportAs: 'comCodeBlock',\n  host: {\n    '[class]': 'hostClasses()',\n  },\n  template: `\n    <div class=\"flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground\">\n      @if (language()) {\n        <span class=\"select-none font-sans font-medium\">{{ language() }}</span>\n      } @else {\n        <span></span>\n      }\n      <button\n        type=\"button\"\n        class=\"inline-flex items-center justify-center rounded-interactive-sm p-1\n               text-muted-foreground hover:text-foreground hover:bg-muted-hover\n               transition-colors outline-none\n               focus-visible:outline-2 focus-visible:outline-offset-2\n               focus-visible:outline-[--color-ring]\"\n        [attr.aria-label]=\"isCopied() ? 'Copied' : 'Copy code'\"\n      \t(click)=\"copyToClipboard()\"\n      >\n        @if (isCopied()) {\n          <com-icon name=\"check\" size=\"sm\" class=\"text-success\" aria-hidden=\"true\" />\n        } @else {\n          <com-icon name=\"clipboard\" size=\"sm\" aria-hidden=\"true\" />\n        }\n      </button>\n    </div>\n    <pre class=\"overflow-auto p-4 m-0 flex-1\" tabindex=\"0\" role=\"region\" [attr.aria-label]=\"language() ? language() + ' code' : 'Code'\"><code class=\"whitespace-pre font-mono\">{{ code() }}</code></pre>\n    <span\n      class=\"sr-only\"\n      aria-live=\"polite\"\n    >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>\n  `,\n  styles: `\n    :host {\n      display: block;\n    }\n  `,\n  imports: [ComIcon],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class ComCodeBlock {\n  /** The raw code string to display. */\n  readonly code: InputSignal<string> = input.required<string>();\n\n  /** Language label shown in the header (e.g. 'TypeScript', 'HTML'). */\n  readonly language: InputSignal<string | undefined> = input<string>();\n\n  /** Visual variant. */\n  readonly variant: InputSignal<CodeBlockVariant> = input<CodeBlockVariant>('filled');\n\n  /** Consumer CSS classes — merged with variant classes. */\n  readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n  /** Emitted when code is successfully copied to clipboard. */\n  readonly copied: OutputEmitterRef<void> = output<void>();\n\n  /** @internal Tracks copy feedback state. */\n  protected readonly isCopied: WritableSignal<boolean> = signal(false);\n\n  /** @internal Computed host element classes. */\n  protected readonly hostClasses: Signal<string> = computed(() =>\n    mergeClasses(\n      codeBlockVariants({ variant: this.variant() }),\n      this.userClass(),\n    ),\n  );\n\n  private readonly clipboard = inject(Clipboard);\n  private readonly destroyRef = inject(DestroyRef);\n  private copyTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  /** Copies the code to clipboard and shows feedback for 2 seconds. */\n  protected copyToClipboard(): void {\n    this.clipboard.copy(this.code());\n    this.isCopied.set(true);\n    this.copied.emit();\n\n    clearTimeout(this.copyTimeoutId);\n    this.copyTimeoutId = setTimeout(() => this.isCopied.set(false), 2000);\n\n    this.destroyRef.onDestroy(() => clearTimeout(this.copyTimeoutId));\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}