ngx-com 0.0.19 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/ngx-com-components-alert.mjs +346 -0
  2. package/fesm2022/ngx-com-components-alert.mjs.map +1 -0
  3. package/fesm2022/ngx-com-components-button.mjs +1 -1
  4. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  5. package/fesm2022/ngx-com-components-calendar.mjs +29 -36
  6. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  7. package/fesm2022/ngx-com-components-card.mjs +1 -1
  8. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  9. package/fesm2022/ngx-com-components-carousel.mjs +708 -0
  10. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -0
  11. package/fesm2022/ngx-com-components-checkbox.mjs +17 -8
  12. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  13. package/fesm2022/ngx-com-components-code-block.mjs +158 -0
  14. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -0
  15. package/fesm2022/ngx-com-components-collapsible.mjs +1 -1
  16. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  17. package/fesm2022/ngx-com-components-confirm.mjs +3 -3
  18. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  19. package/fesm2022/ngx-com-components-dialog.mjs +703 -0
  20. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -0
  21. package/fesm2022/ngx-com-components-dropdown.mjs +36 -31
  22. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  23. package/fesm2022/ngx-com-components-form-field.mjs +48 -8
  24. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  25. package/fesm2022/ngx-com-components-item.mjs +1 -1
  26. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  27. package/fesm2022/ngx-com-components-paginator.mjs +3 -3
  28. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  29. package/fesm2022/ngx-com-components-radio.mjs +16 -9
  30. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  31. package/fesm2022/ngx-com-components-segmented-control.mjs +1 -1
  32. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  33. package/fesm2022/ngx-com-components-separator.mjs +102 -0
  34. package/fesm2022/ngx-com-components-separator.mjs.map +1 -0
  35. package/fesm2022/ngx-com-components-switch.mjs +258 -0
  36. package/fesm2022/ngx-com-components-switch.mjs.map +1 -0
  37. package/fesm2022/ngx-com-components-table.mjs +631 -0
  38. package/fesm2022/ngx-com-components-table.mjs.map +1 -0
  39. package/fesm2022/ngx-com-components-tabs.mjs +2 -2
  40. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  41. package/fesm2022/ngx-com-components-toast.mjs +783 -0
  42. package/fesm2022/ngx-com-components-toast.mjs.map +1 -0
  43. package/package.json +33 -1
  44. package/types/ngx-com-components-alert.d.ts +166 -0
  45. package/types/ngx-com-components-carousel.d.ts +281 -0
  46. package/types/ngx-com-components-checkbox.d.ts +7 -2
  47. package/types/ngx-com-components-code-block.d.ts +66 -0
  48. package/types/ngx-com-components-confirm.d.ts +2 -2
  49. package/types/ngx-com-components-dialog.d.ts +264 -0
  50. package/types/ngx-com-components-dropdown.d.ts +8 -5
  51. package/types/ngx-com-components-form-field.d.ts +19 -3
  52. package/types/ngx-com-components-radio.d.ts +5 -3
  53. package/types/ngx-com-components-separator.d.ts +75 -0
  54. package/types/ngx-com-components-switch.d.ts +110 -0
  55. package/types/ngx-com-components-table.d.ts +377 -0
  56. package/types/ngx-com-components-toast.d.ts +217 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-com-components-carousel.mjs","sources":["../../../projects/com/components/carousel/carousel.variants.ts","../../../projects/com/components/carousel/carousel-item.directive.ts","../../../projects/com/components/carousel/carousel-prev-tpl.directive.ts","../../../projects/com/components/carousel/carousel-next-tpl.directive.ts","../../../projects/com/components/carousel/carousel-pagination-tpl.directive.ts","../../../projects/com/components/carousel/carousel.component.ts","../../../projects/com/components/carousel/index.ts","../../../projects/com/components/carousel/ngx-com-components-carousel.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n// ─── Container ───\n\nexport const carouselContainerVariants: () => string = cva('relative overflow-hidden');\n\n// ─── Navigation Button ───\n\nexport const carouselNavButtonVariants: (props?: {\n position?: 'prev' | 'next';\n}) => string = cva(\n [\n 'absolute top-1/2 -translate-y-1/2 z-10',\n 'inline-flex items-center justify-center',\n 'h-10 w-10 rounded-control',\n 'bg-background text-foreground',\n 'border border-border-subtle shadow-sm',\n 'transition-colors duration-150',\n 'hover:bg-muted-hover',\n 'outline-none focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:bg-disabled disabled:text-disabled-foreground disabled:cursor-not-allowed disabled:shadow-none',\n ],\n {\n variants: {\n position: {\n prev: 'left-2',\n next: 'right-2',\n },\n },\n defaultVariants: {\n position: 'prev',\n },\n }\n);\n\nexport type CarouselNavButtonVariants = VariantProps<typeof carouselNavButtonVariants>;\n\n// ─── Pagination Dot ───\n\nexport const carouselDotVariants: (props?: {\n active?: boolean;\n}) => string = cva(\n [\n 'inline-block h-2 w-2 rounded-pill',\n 'transition-colors duration-150',\n 'outline-none focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n ],\n {\n variants: {\n active: {\n true: 'bg-primary',\n false: 'bg-muted hover:bg-muted-hover',\n },\n },\n defaultVariants: {\n active: false,\n },\n }\n);\n\nexport type CarouselDotVariants = VariantProps<typeof carouselDotVariants>;\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n/**\n * Marks an element as a carousel slide item.\n *\n * Apply this directive to each direct child element that should be\n * treated as a slide within `<com-carousel>`.\n *\n * @example\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <div comCarouselItem>Slide 2</div>\n * </com-carousel>\n * ```\n */\n@Directive({\n selector: '[comCarouselItem]',\n})\nexport class ComCarouselItem {\n readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { CarouselPrevContext } from './carousel.models';\n\n/**\n * Template directive for a custom \"previous\" navigation button.\n *\n * The template receives a boolean context (`$implicit`) indicating\n * whether the carousel can navigate backward.\n *\n * @example\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <ng-template comCarouselPrev let-canGo>\n * <button [disabled]=\"!canGo\">Back</button>\n * </ng-template>\n * </com-carousel>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCarouselPrev]',\n})\nexport class ComCarouselPrevTpl {\n readonly templateRef: TemplateRef<CarouselPrevContext> = inject(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: ComCarouselPrevTpl,\n _ctx: unknown\n ): _ctx is CarouselPrevContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { CarouselNextContext } from './carousel.models';\n\n/**\n * Template directive for a custom \"next\" navigation button.\n *\n * The template receives a boolean context (`$implicit`) indicating\n * whether the carousel can navigate forward.\n *\n * @example\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <ng-template comCarouselNext let-canGo>\n * <button [disabled]=\"!canGo\">Forward</button>\n * </ng-template>\n * </com-carousel>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCarouselNext]',\n})\nexport class ComCarouselNextTpl {\n readonly templateRef: TemplateRef<CarouselNextContext> = inject(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: ComCarouselNextTpl,\n _ctx: unknown\n ): _ctx is CarouselNextContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { CarouselPaginationContext } from './carousel.models';\n\n/**\n * Template directive for custom pagination indicators.\n *\n * Rendered once per \"page\" in the carousel. The template receives\n * a context with the page index, active state, and total count.\n *\n * @example\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <div comCarouselItem>Slide 2</div>\n * <ng-template comCarouselPagination let-idx let-active=\"active\">\n * <span\n * class=\"inline-block h-3 w-3 rounded-pill transition-colors\"\n * [class]=\"active ? 'bg-primary' : 'bg-muted'\"\n * ></span>\n * </ng-template>\n * </com-carousel>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCarouselPagination]',\n})\nexport class ComCarouselPaginationTpl {\n readonly templateRef: TemplateRef<CarouselPaginationContext> = inject(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: ComCarouselPaginationTpl,\n _ctx: unknown\n ): _ctx is CarouselPaginationContext {\n return true;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n Renderer2,\n signal,\n viewChild,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Platform } from '@angular/cdk/platform';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { ComCarouselItem } from './carousel-item.directive';\nimport { ComCarouselPrevTpl } from './carousel-prev-tpl.directive';\nimport { ComCarouselNextTpl } from './carousel-next-tpl.directive';\nimport { ComCarouselPaginationTpl } from './carousel-pagination-tpl.directive';\nimport type { CarouselNextContext, CarouselPaginationContext, CarouselPrevContext } from './carousel.models';\nimport {\n carouselContainerVariants,\n carouselNavButtonVariants,\n carouselDotVariants,\n} from './carousel.variants';\n\n/**\n * Carousel component — a horizontal slider that navigates content screens\n * using percentage-based CSS `transform: translateX()`.\n *\n * Items are projected via `ng-content` and marked with `comCarouselItem`.\n * Navigation is screen-based: each index step moves one full viewport of items.\n * Supports multi-item views, auto-play, loop, touch/swipe, keyboard\n * navigation, and custom templates for navigation and pagination.\n *\n * @tokens `--color-background`, `--color-foreground`, `--color-muted`,\n * `--color-muted-hover`, `--color-primary`, `--color-border-subtle`,\n * `--color-ring`, `--color-disabled`, `--color-disabled-foreground`\n *\n * @example Basic usage\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <div comCarouselItem>Slide 2</div>\n * <div comCarouselItem>Slide 3</div>\n * </com-carousel>\n * ```\n *\n * @example Multiple items per view\n * ```html\n * <com-carousel [slidesPerView]=\"3\">\n * @for (product of products(); track product.id) {\n * <com-card comCarouselItem>{{ product.name }}</com-card>\n * }\n * </com-carousel>\n * ```\n *\n * @example Auto-play with loop\n * ```html\n * <com-carousel autoPlay loop [autoPlayInterval]=\"4000\">\n * <img comCarouselItem *ngFor=\"let img of images\" [src]=\"img.url\" [alt]=\"img.alt\" />\n * </com-carousel>\n * ```\n *\n * @example Two-way index binding\n * ```html\n * <com-carousel [(index)]=\"currentSlide\">\n * <div comCarouselItem>A</div>\n * <div comCarouselItem>B</div>\n * </com-carousel>\n * ```\n *\n * @example Custom navigation\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <ng-template comCarouselPrev let-canGo>\n * <button [disabled]=\"!canGo\">Back</button>\n * </ng-template>\n * <ng-template comCarouselNext let-canGo>\n * <button [disabled]=\"!canGo\">Forward</button>\n * </ng-template>\n * </com-carousel>\n * ```\n *\n * @example Custom pagination\n * ```html\n * <com-carousel>\n * <div comCarouselItem>Slide 1</div>\n * <ng-template comCarouselPagination let-idx let-active=\"active\">\n * <span [class]=\"active ? 'bg-primary' : 'bg-muted'\" class=\"h-3 w-3 rounded-pill inline-block\"></span>\n * </ng-template>\n * </com-carousel>\n * ```\n */\n@Component({\n selector: 'com-carousel',\n template: `\n <div [class]=\"containerClasses()\">\n <!-- Slide track -->\n <div\n #track\n class=\"flex\"\n [style.transform]=\"translateX()\"\n [style.transition]=\"animating() ? 'transform ' + transitionDuration() + 'ms ease-out' : 'none'\"\n [attr.aria-live]=\"ariaLiveMode()\"\n >\n <ng-content select=\"[comCarouselItem]\" />\n </div>\n\n <!-- Navigation: Previous -->\n @if (showNavigation()) {\n @if (customPrev(); as prevTpl) {\n <ng-container\n [ngTemplateOutlet]=\"prevTpl.templateRef\"\n [ngTemplateOutletContext]=\"prevContext()\"\n />\n } @else {\n <button\n type=\"button\"\n [class]=\"prevButtonClasses()\"\n [disabled]=\"!canGoPrev()\"\n [attr.aria-label]=\"'Previous slide'\"\n (click)=\"prev()\"\n >\n <com-icon name=\"chevron-left\" size=\"md\" />\n </button>\n }\n }\n\n <!-- Navigation: Next -->\n @if (showNavigation()) {\n @if (customNext(); as nextTpl) {\n <ng-container\n [ngTemplateOutlet]=\"nextTpl.templateRef\"\n [ngTemplateOutletContext]=\"nextContext()\"\n />\n } @else {\n <button\n type=\"button\"\n [class]=\"nextButtonClasses()\"\n [disabled]=\"!canGoNext()\"\n [attr.aria-label]=\"'Next slide'\"\n (click)=\"next()\"\n >\n <com-icon name=\"chevron-right\" size=\"md\" />\n </button>\n }\n }\n </div>\n\n <!-- Pagination -->\n @if (showPagination() && totalScreens() > 1) {\n <div\n class=\"flex items-center justify-center gap-2 py-3\"\n role=\"tablist\"\n [attr.aria-label]=\"'Slide navigation'\"\n >\n @for (page of pages(); track page; let i = $index) {\n @if (customPagination(); as paginationTpl) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === clampedIndex()\"\n [attr.aria-label]=\"'Go to slide ' + (i + 1)\"\n [tabindex]=\"i === clampedIndex() ? 0 : -1\"\n (click)=\"goToPage(i)\"\n (keydown)=\"onPaginationKeydown($event, i)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"paginationTpl.templateRef\"\n [ngTemplateOutletContext]=\"getPaginationContext(i)\"\n />\n </button>\n } @else {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === clampedIndex()\"\n [attr.aria-label]=\"'Go to slide ' + (i + 1)\"\n [tabindex]=\"i === clampedIndex() ? 0 : -1\"\n [class]=\"getDotClasses(i)\"\n (click)=\"goToPage(i)\"\n (keydown)=\"onPaginationKeydown($event, i)\"\n ></button>\n }\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n imports: [NgTemplateOutlet, ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'com-carousel',\n 'role': 'region',\n '[attr.aria-roledescription]': '\"carousel\"',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'pauseAutoPlay()',\n '(mouseleave)': 'resumeAutoPlay()',\n '(focusin)': 'pauseAutoPlay()',\n '(focusout)': 'resumeAutoPlay()',\n },\n})\nexport class ComCarouselComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly renderer = inject(Renderer2);\n private readonly platform = inject(Platform);\n private readonly hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // ─── Inputs ───\n\n /** Number of items visible at once. */\n readonly slidesPerView: InputSignal<number> = input<number>(1);\n\n /** Wrap from last to first and vice versa. */\n readonly loop: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Enable auto-advancing slides. */\n readonly autoPlay: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Auto-play interval in milliseconds. */\n readonly autoPlayInterval: InputSignal<number> = input<number>(5000);\n\n /** Slide transition duration in milliseconds. */\n readonly transitionDuration: InputSignal<number> = input<number>(300);\n\n /** Show prev/next navigation buttons. */\n readonly showNavigation: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n /** Show pagination dot indicators. */\n readonly showPagination: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n /** Accessible label for the carousel region. */\n readonly ariaLabel: InputSignal<string> = input<string>('Carousel', {\n alias: 'aria-label',\n });\n\n // ─── Model ───\n\n /** Two-way bindable current screen index. */\n readonly index: ModelSignal<number> = model<number>(0);\n\n // ─── Content Children ───\n\n readonly items: Signal<readonly ComCarouselItem[]> = contentChildren<ComCarouselItem>(ComCarouselItem);\n readonly customPrev: Signal<ComCarouselPrevTpl | undefined> = contentChild<ComCarouselPrevTpl>(ComCarouselPrevTpl);\n readonly customNext: Signal<ComCarouselNextTpl | undefined> = contentChild<ComCarouselNextTpl>(ComCarouselNextTpl);\n readonly customPagination: Signal<ComCarouselPaginationTpl | undefined> = contentChild<ComCarouselPaginationTpl>(ComCarouselPaginationTpl);\n\n // ─── View Children ───\n\n readonly trackEl: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('track');\n\n // ─── Internal State ───\n\n private readonly paused: WritableSignal<boolean> = signal(false);\n readonly animating: WritableSignal<boolean> = signal(true);\n private autoPlayTimerId: ReturnType<typeof setInterval> | null = null;\n\n // ─── Computed ───\n\n readonly totalSlides: Signal<number> = computed(() => this.items().length);\n\n /** Total number of screens (pages). */\n readonly totalScreens: Signal<number> = computed(() =>\n Math.max(1, Math.ceil(this.totalSlides() / this.slidesPerView()))\n );\n\n readonly maxIndex: Signal<number> = computed(() =>\n Math.max(0, this.totalScreens() - 1)\n );\n\n /** Clamp index when items or slidesPerView changes. */\n readonly clampedIndex: Signal<number> = linkedSignal(() => {\n const idx = this.index();\n const max = this.maxIndex();\n return Math.max(0, Math.min(idx, max));\n });\n\n readonly canGoPrev: Signal<boolean> = computed(() =>\n this.loop() || this.clampedIndex() > 0\n );\n\n readonly canGoNext: Signal<boolean> = computed(() =>\n this.loop() || this.clampedIndex() < this.maxIndex()\n );\n\n readonly pages: Signal<number[]> = computed(() =>\n Array.from({ length: this.totalScreens() }, (_, i) => i)\n );\n\n /** Percentage-based translateX — each screen step moves by 100%. */\n readonly translateX: Signal<string> = computed(() =>\n `translateX(${-this.clampedIndex() * 100}%)`\n );\n\n /** Item width as a percentage string. */\n private readonly itemWidth: Signal<string> = computed(() =>\n `${100 / this.slidesPerView()}%`\n );\n\n readonly ariaLiveMode: Signal<string> = computed(() =>\n this.autoPlay() && !this.paused() ? 'off' : 'polite'\n );\n\n // ─── CVA Classes ───\n\n readonly containerClasses: Signal<string> = computed(() => carouselContainerVariants());\n\n readonly prevButtonClasses: Signal<string> = computed(() =>\n carouselNavButtonVariants({ position: 'prev' })\n );\n\n readonly nextButtonClasses: Signal<string> = computed(() =>\n carouselNavButtonVariants({ position: 'next' })\n );\n\n // ─── Template Contexts ───\n\n readonly prevContext: Signal<CarouselPrevContext> = computed(() => ({\n $implicit: this.canGoPrev(),\n prev: () => this.prev(),\n }));\n\n readonly nextContext: Signal<CarouselNextContext> = computed(() => ({\n $implicit: this.canGoNext(),\n next: () => this.next(),\n }));\n\n constructor() {\n // Sync clamped index back to the model\n effect(() => {\n const clamped = this.clampedIndex();\n if (this.index() !== clamped) {\n this.index.set(clamped);\n }\n });\n\n // Apply percentage-based width and ARIA attributes to each projected item\n effect(() => {\n const allItems = this.items();\n const total = allItems.length;\n const width = this.itemWidth();\n\n allItems.forEach((item, i) => {\n const el = item.elementRef.nativeElement;\n this.renderer.setStyle(el, 'min-width', width);\n this.renderer.setStyle(el, 'max-width', width);\n this.renderer.setStyle(el, 'flex-shrink', '0');\n this.renderer.setStyle(el, 'box-sizing', 'border-box');\n this.renderer.setAttribute(el, 'role', 'group');\n this.renderer.setAttribute(el, 'aria-roledescription', 'slide');\n this.renderer.setAttribute(el, 'aria-label', `${i + 1} of ${total}`);\n });\n });\n\n // Auto-play effect\n effect(() => {\n const shouldAutoPlay = this.autoPlay();\n const isPaused = this.paused();\n const interval = this.autoPlayInterval();\n\n this.clearAutoPlay();\n\n if (shouldAutoPlay && !isPaused) {\n this.autoPlayTimerId = setInterval(() => {\n this.next();\n }, interval);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.clearAutoPlay();\n this.cleanupSwipe();\n });\n\n // Set up touch/swipe after view init\n if (this.platform.isBrowser) {\n effect(() => {\n const track = this.trackEl();\n if (track) {\n this.setupSwipe(track.nativeElement);\n }\n });\n }\n }\n\n // ─── Public Methods ───\n\n /** Navigate to the next screen. */\n next(): void {\n const current = this.clampedIndex();\n const max = this.maxIndex();\n\n if (current < max) {\n this.goToPage(current + 1);\n } else if (this.loop()) {\n this.goToPage(0);\n }\n }\n\n /** Navigate to the previous screen. */\n prev(): void {\n const current = this.clampedIndex();\n\n if (current > 0) {\n this.goToPage(current - 1);\n } else if (this.loop()) {\n this.goToPage(this.maxIndex());\n }\n }\n\n /** Navigate to a specific page index. */\n goToPage(pageIndex: number): void {\n if (pageIndex >= 0 && pageIndex <= this.maxIndex()) {\n this.animating.set(true);\n this.index.set(pageIndex);\n }\n }\n\n /** Get CVA classes for a pagination dot at the given index. */\n getDotClasses(pageIndex: number): string {\n return carouselDotVariants({ active: pageIndex === this.clampedIndex() });\n }\n\n /** Build template context for a custom pagination dot. */\n getPaginationContext(pageIndex: number): CarouselPaginationContext {\n return {\n $implicit: pageIndex,\n active: pageIndex === this.clampedIndex(),\n total: this.totalScreens(),\n index: pageIndex,\n };\n }\n\n /** Handle keyboard navigation on pagination dots. */\n onPaginationKeydown(event: KeyboardEvent, currentIndex: number): void {\n const total = this.totalScreens();\n let targetIndex: number | null = null;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n targetIndex = (currentIndex + 1) % total;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n targetIndex = (currentIndex - 1 + total) % total;\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = total - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n this.goToPage(targetIndex);\n this.focusDotAt(targetIndex);\n }\n\n // ─── Host Event Handlers ───\n\n protected pauseAutoPlay(): void {\n if (this.autoPlay()) {\n this.paused.set(true);\n }\n }\n\n protected resumeAutoPlay(): void {\n if (this.autoPlay()) {\n this.paused.set(false);\n }\n }\n\n // ─── Private: Auto-play ───\n\n private clearAutoPlay(): void {\n if (this.autoPlayTimerId !== null) {\n clearInterval(this.autoPlayTimerId);\n this.autoPlayTimerId = null;\n }\n }\n\n // ─── Private: Touch/Swipe ───\n\n private swipeCleanupFns: Array<() => void> = [];\n private pointerStartX = 0;\n private pointerStartY = 0;\n private isSwiping = false;\n\n private setupSwipe(trackElement: HTMLElement): void {\n this.cleanupSwipe();\n\n const unlistenDown = this.renderer.listen(trackElement, 'pointerdown', (e: PointerEvent) => {\n this.pointerStartX = e.clientX;\n this.pointerStartY = e.clientY;\n this.isSwiping = true;\n this.animating.set(false);\n });\n\n const unlistenMove = this.renderer.listen(trackElement, 'pointermove', (e: PointerEvent) => {\n if (!this.isSwiping) return;\n // Prevent vertical scroll when swiping horizontally\n const dx = Math.abs(e.clientX - this.pointerStartX);\n const dy = Math.abs(e.clientY - this.pointerStartY);\n if (dx > dy && dx > 10) {\n e.preventDefault();\n }\n });\n\n const unlistenUp = this.renderer.listen(trackElement, 'pointerup', (e: PointerEvent) => {\n if (!this.isSwiping) return;\n this.isSwiping = false;\n this.animating.set(true);\n\n const delta = e.clientX - this.pointerStartX;\n const threshold = 50;\n\n if (delta < -threshold) {\n this.next();\n } else if (delta > threshold) {\n this.prev();\n }\n });\n\n const unlistenCancel = this.renderer.listen(trackElement, 'pointercancel', () => {\n this.isSwiping = false;\n this.animating.set(true);\n });\n\n this.swipeCleanupFns = [unlistenDown, unlistenMove, unlistenUp, unlistenCancel];\n }\n\n private cleanupSwipe(): void {\n this.swipeCleanupFns.forEach((fn) => fn());\n this.swipeCleanupFns = [];\n }\n\n // ─── Private: Focus Management ───\n\n private focusDotAt(index: number): void {\n const host = this.hostEl.nativeElement;\n const dots = host.querySelectorAll('[role=\"tab\"]');\n const dot = dots[index] as HTMLElement | undefined;\n dot?.focus();\n }\n}\n","// Public API for the carousel component\n\n// Types\nexport type {\n CarouselPrevContext,\n CarouselNextContext,\n CarouselPaginationContext,\n} from './carousel.models';\n\n// Variants\nexport {\n carouselContainerVariants,\n carouselNavButtonVariants,\n carouselDotVariants,\n} from './carousel.variants';\nexport type {\n CarouselNavButtonVariants,\n CarouselDotVariants,\n} from './carousel.variants';\n\n// Template directives\nexport { ComCarouselItem } from './carousel-item.directive';\nexport { ComCarouselPrevTpl } from './carousel-prev-tpl.directive';\nexport { ComCarouselNextTpl } from './carousel-next-tpl.directive';\nexport { ComCarouselPaginationTpl } from './carousel-pagination-tpl.directive';\n\n// Main component\nexport { ComCarouselComponent } from './carousel.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ const checkboxBoxVariants = cva([
22
22
  'inline-flex shrink-0 items-center justify-center',
23
23
  'rounded-interactive-sm border-2 border-border',
24
24
  'transition-colors duration-150',
25
- 'peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',
25
+ 'peer-focus-visible:outline-[1px] peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',
26
26
  'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',
27
27
  ], {
28
28
  variants: {
@@ -127,8 +127,13 @@ class ComCheckbox {
127
127
  checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
128
128
  indeterminate = model(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : []));
129
129
  disabled = model(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
130
- value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
130
+ htmlValue = input(undefined, { ...(ngDevMode ? { debugName: "htmlValue" } : {}), alias: 'value' });
131
131
  name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
132
+ // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives
133
+ touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : []));
134
+ invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : []));
135
+ sfErrors = input([], { ...(ngDevMode ? { debugName: "sfErrors" } : {}), alias: 'errors' });
136
+ sfRequired = input(false, { ...(ngDevMode ? { debugName: "sfRequired" } : {}), alias: 'required' });
132
137
  id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : []));
133
138
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : {}), alias: 'aria-label' });
134
139
  ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : {}), alias: 'aria-labelledby' });
@@ -170,6 +175,10 @@ class ComCheckbox {
170
175
  this.disabled.set(isDisabled);
171
176
  }
172
177
  // Event handlers
178
+ onBlur() {
179
+ this.onTouched();
180
+ this.touched.set(true);
181
+ }
173
182
  onInputChange(event) {
174
183
  const input = event.target;
175
184
  const newChecked = input.checked;
@@ -199,7 +208,7 @@ class ComCheckbox {
199
208
  this.changed.emit({ checked: newChecked, source: this });
200
209
  }
201
210
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
202
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCheckbox, isStandalone: true, selector: "com-checkbox", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", indeterminate: "indeterminateChange", disabled: "disabledChange", changed: "changed" }, host: { properties: { "class.com-checkbox--disabled": "disabled()", "class.com-checkbox--checked": "checked()", "class.com-checkbox--indeterminate": "indeterminate()" }, classAttribute: "com-checkbox inline-block align-middle" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], exportAs: ["comCheckbox"], ngImport: i0, template: `
211
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCheckbox, isStandalone: true, selector: "com-checkbox", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, htmlValue: { classPropertyName: "htmlValue", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, sfErrors: { classPropertyName: "sfErrors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, sfRequired: { classPropertyName: "sfRequired", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", indeterminate: "indeterminateChange", disabled: "disabledChange", touched: "touchedChange", changed: "changed" }, host: { properties: { "class.com-checkbox--disabled": "disabled()", "class.com-checkbox--checked": "checked()", "class.com-checkbox--indeterminate": "indeterminate()" }, classAttribute: "com-checkbox inline-block align-middle" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], exportAs: ["comCheckbox"], ngImport: i0, template: `
203
212
  <label
204
213
  class="group relative inline-flex items-center"
205
214
  [class.cursor-pointer]="!disabled()"
@@ -213,12 +222,12 @@ class ComCheckbox {
213
222
  [checked]="checked()"
214
223
  [disabled]="disabled()"
215
224
  [attr.name]="name()"
216
- [attr.value]="value()"
225
+ [attr.value]="htmlValue()"
217
226
  [attr.aria-label]="ariaLabel()"
218
227
  [attr.aria-labelledby]="ariaLabelledby()"
219
228
  [attr.aria-describedby]="ariaDescribedby()"
220
229
  (change)="onInputChange($event)"
221
- (blur)="onTouched()"
230
+ (blur)="onBlur()"
222
231
  /></span>
223
232
  <span [class]="boxClasses()">
224
233
  @if (checked() && !indeterminate()) {
@@ -278,12 +287,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
278
287
  [checked]="checked()"
279
288
  [disabled]="disabled()"
280
289
  [attr.name]="name()"
281
- [attr.value]="value()"
290
+ [attr.value]="htmlValue()"
282
291
  [attr.aria-label]="ariaLabel()"
283
292
  [attr.aria-labelledby]="ariaLabelledby()"
284
293
  [attr.aria-describedby]="ariaDescribedby()"
285
294
  (change)="onInputChange($event)"
286
- (blur)="onTouched()"
295
+ (blur)="onBlur()"
287
296
  /></span>
288
297
  <span [class]="boxClasses()">
289
298
  @if (checked() && !indeterminate()) {
@@ -331,7 +340,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
331
340
  '[class.com-checkbox--checked]': 'checked()',
332
341
  '[class.com-checkbox--indeterminate]': 'indeterminate()',
333
342
  }, styles: [".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"] }]
334
- }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }, { type: i0.Output, args: ["indeterminateChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
343
+ }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }, { type: i0.Output, args: ["indeterminateChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], htmlValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], sfErrors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], sfRequired: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
335
344
 
336
345
  // Public API for the checkbox component
337
346
  // Main component
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-checkbox.mjs","sources":["../../../projects/com/components/checkbox/checkbox.variants.ts","../../../projects/com/components/checkbox/checkbox.component.ts","../../../projects/com/components/checkbox/index.ts","../../../projects/com/components/checkbox/ngx-com-components-checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/** Checkbox size variants. */\nexport type CheckboxSize = 'sm' | 'md' | 'lg';\n\n/** Checkbox color variants. */\nexport type CheckboxVariant = 'primary' | 'accent' | 'warn';\n\n/**\n * CVA variants for the visual checkbox box.\n *\n * Uses `peer` selectors to style based on native input state:\n * - `peer-checked:` for checked state\n * - `peer-indeterminate:` for indeterminate state\n * - `peer-focus-visible:` for keyboard focus\n * - `peer-disabled:` for disabled state\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`\n */\nexport const checkboxBoxVariants: (props?: {\n variant?: CheckboxVariant;\n size?: CheckboxSize;\n}) => string = cva(\n [\n 'com-checkbox__box',\n 'inline-flex shrink-0 items-center justify-center',\n 'rounded-interactive-sm border-2 border-border',\n 'transition-colors duration-150',\n 'peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',\n 'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',\n 'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',\n 'group-hover:border-primary-hover',\n 'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',\n 'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',\n ],\n accent: [\n 'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',\n 'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',\n 'group-hover:border-accent-hover',\n 'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',\n 'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',\n ],\n warn: [\n 'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',\n 'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',\n 'group-hover:border-warn-hover',\n 'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',\n 'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',\n ],\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\n/** Size-based classes for the checkmark SVG icon. */\nexport const CHECKBOX_ICON_SIZES: Record<CheckboxSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n/** Size-based classes for the label content. */\nexport const CHECKBOX_LABEL_SIZES: Record<CheckboxSize, string> = {\n sm: 'text-sm ms-2',\n md: 'text-base ms-2.5',\n lg: 'text-lg ms-3',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\nimport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n\n/** Event emitted when checkbox state changes. */\nexport interface CheckboxChange {\n checked: boolean;\n source: ComCheckbox;\n}\n\n/** Auto-incrementing ID counter for unique checkbox IDs. */\nlet nextId = 0;\n\n/**\n * Production-grade checkbox component with full accessibility support.\n *\n * Uses a native `<input type=\"checkbox\">` for built-in keyboard handling,\n * `:checked` and `:indeterminate` pseudo-classes, and screen reader support.\n *\n * Implements `ControlValueAccessor` for Reactive Forms integration via\n * `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <com-checkbox [(checked)]=\"isActive\">Enable feature</com-checkbox>\n * ```\n *\n * @example With reactive forms\n * ```html\n * <com-checkbox formControlName=\"acceptTerms\">\n * I accept the <a href=\"/terms\">terms and conditions</a>\n * </com-checkbox>\n * ```\n *\n * @example Indeterminate state\n * ```html\n * <com-checkbox [(indeterminate)]=\"hasPartialSelection\" (changed)=\"onSelectAll($event)\">\n * Select all\n * </com-checkbox>\n * ```\n *\n * @example Variants and sizes\n * ```html\n * <com-checkbox variant=\"accent\" size=\"lg\">Large accent checkbox</com-checkbox>\n * <com-checkbox variant=\"warn\" size=\"sm\">Small warning checkbox</com-checkbox>\n * ```\n */\n@Component({\n selector: 'com-checkbox',\n exportAs: 'comCheckbox',\n template: `\n <label\n class=\"group relative inline-flex items-center\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span><input\n #inputElement\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"inputId()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.name]=\"name()\"\n [attr.value]=\"value()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n /></span>\n <span [class]=\"boxClasses()\">\n @if (checked() && !indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polyline points=\"4 12 9 17 20 6\" />\n </svg>\n }\n @if (indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n }\n </span>\n <span\n class=\"com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground\"\n [class]=\"labelSizeClass()\"\n >\n <ng-content />\n </span>\n </label>\n `,\n styles: `\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: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-checkbox inline-block align-middle',\n '[class.com-checkbox--disabled]': 'disabled()',\n '[class.com-checkbox--checked]': 'checked()',\n '[class.com-checkbox--indeterminate]': 'indeterminate()',\n },\n})\nexport class ComCheckbox implements ControlValueAccessor {\n /** Optional NgControl for reactive forms integration. */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Reference to the native input element. */\n readonly inputRef: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n /** Unique ID for this checkbox instance. */\n private readonly uniqueId: string = `com-checkbox-${nextId++}`;\n\n // Inputs\n readonly size: InputSignal<CheckboxSize> = input<CheckboxSize>('md');\n readonly variant: InputSignal<CheckboxVariant> = input<CheckboxVariant>('primary');\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n readonly indeterminate: ModelSignal<boolean> = model<boolean>(false);\n readonly disabled: ModelSignal<boolean> = model<boolean>(false);\n readonly value: InputSignal<string | undefined> = input<string>();\n readonly name: InputSignal<string | undefined> = input<string>();\n readonly id: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-describedby' });\n\n // Outputs\n readonly changed: OutputEmitterRef<CheckboxChange> = output<CheckboxChange>();\n\n // Computed state\n readonly inputId: Signal<string> = computed(() => this.id() ?? this.uniqueId);\n\n protected readonly boxClasses: Signal<string> = computed(() =>\n checkboxBoxVariants({ variant: this.variant(), size: this.size() })\n );\n\n protected readonly iconSizeClass: Signal<string> = computed(() => CHECKBOX_ICON_SIZES[this.size()]);\n protected readonly labelSizeClass: Signal<string> = computed(() => CHECKBOX_LABEL_SIZES[this.size()]);\n\n // CVA callbacks\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)\n effect(() => {\n const isIndeterminate = this.indeterminate();\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.indeterminate = isIndeterminate;\n }\n });\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this.checked.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // Event handlers\n protected onInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newChecked = input.checked;\n\n // Clear indeterminate on user interaction\n if (this.indeterminate()) {\n this.indeterminate.set(false);\n input.indeterminate = false;\n }\n\n this.checked.set(newChecked);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n\n // Public API\n /** Focuses this checkbox's input element. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Toggles the checkbox state programmatically. */\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n const newChecked = !this.checked();\n this.checked.set(newChecked);\n this.indeterminate.set(false);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n}\n","// Public API for the checkbox component\n\n// Main component\nexport { ComCheckbox } from './checkbox.component';\n\n// Types\nexport type { CheckboxChange } from './checkbox.component';\n\n// Variants (for advanced customization)\nexport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\n\nexport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-checkbox.mjs","sources":["../../../projects/com/components/checkbox/checkbox.variants.ts","../../../projects/com/components/checkbox/checkbox.component.ts","../../../projects/com/components/checkbox/index.ts","../../../projects/com/components/checkbox/ngx-com-components-checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/** Checkbox size variants. */\nexport type CheckboxSize = 'sm' | 'md' | 'lg';\n\n/** Checkbox color variants. */\nexport type CheckboxVariant = 'primary' | 'accent' | 'warn';\n\n/**\n * CVA variants for the visual checkbox box.\n *\n * Uses `peer` selectors to style based on native input state:\n * - `peer-checked:` for checked state\n * - `peer-indeterminate:` for indeterminate state\n * - `peer-focus-visible:` for keyboard focus\n * - `peer-disabled:` for disabled state\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`\n */\nexport const checkboxBoxVariants: (props?: {\n variant?: CheckboxVariant;\n size?: CheckboxSize;\n}) => string = cva(\n [\n 'com-checkbox__box',\n 'inline-flex shrink-0 items-center justify-center',\n 'rounded-interactive-sm border-2 border-border',\n 'transition-colors duration-150',\n 'peer-focus-visible:outline-[1px] peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',\n 'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',\n 'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',\n 'group-hover:border-primary-hover',\n 'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',\n 'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',\n ],\n accent: [\n 'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',\n 'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',\n 'group-hover:border-accent-hover',\n 'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',\n 'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',\n ],\n warn: [\n 'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',\n 'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',\n 'group-hover:border-warn-hover',\n 'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',\n 'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',\n ],\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\n/** Size-based classes for the checkmark SVG icon. */\nexport const CHECKBOX_ICON_SIZES: Record<CheckboxSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n/** Size-based classes for the label content. */\nexport const CHECKBOX_LABEL_SIZES: Record<CheckboxSize, string> = {\n sm: 'text-sm ms-2',\n md: 'text-base ms-2.5',\n lg: 'text-lg ms-3',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\nimport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n\n/** Event emitted when checkbox state changes. */\nexport interface CheckboxChange {\n checked: boolean;\n source: ComCheckbox;\n}\n\n/** Auto-incrementing ID counter for unique checkbox IDs. */\nlet nextId = 0;\n\n/**\n * Production-grade checkbox component with full accessibility support.\n *\n * Uses a native `<input type=\"checkbox\">` for built-in keyboard handling,\n * `:checked` and `:indeterminate` pseudo-classes, and screen reader support.\n *\n * Implements `ControlValueAccessor` for Reactive Forms integration via\n * `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <com-checkbox [(checked)]=\"isActive\">Enable feature</com-checkbox>\n * ```\n *\n * @example With reactive forms\n * ```html\n * <com-checkbox formControlName=\"acceptTerms\">\n * I accept the <a href=\"/terms\">terms and conditions</a>\n * </com-checkbox>\n * ```\n *\n * @example Indeterminate state\n * ```html\n * <com-checkbox [(indeterminate)]=\"hasPartialSelection\" (changed)=\"onSelectAll($event)\">\n * Select all\n * </com-checkbox>\n * ```\n *\n * @example Variants and sizes\n * ```html\n * <com-checkbox variant=\"accent\" size=\"lg\">Large accent checkbox</com-checkbox>\n * <com-checkbox variant=\"warn\" size=\"sm\">Small warning checkbox</com-checkbox>\n * ```\n */\n@Component({\n selector: 'com-checkbox',\n exportAs: 'comCheckbox',\n template: `\n <label\n class=\"group relative inline-flex items-center\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span><input\n #inputElement\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"inputId()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.name]=\"name()\"\n [attr.value]=\"htmlValue()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n /></span>\n <span [class]=\"boxClasses()\">\n @if (checked() && !indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polyline points=\"4 12 9 17 20 6\" />\n </svg>\n }\n @if (indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n }\n </span>\n <span\n class=\"com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground\"\n [class]=\"labelSizeClass()\"\n >\n <ng-content />\n </span>\n </label>\n `,\n styles: `\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: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-checkbox inline-block align-middle',\n '[class.com-checkbox--disabled]': 'disabled()',\n '[class.com-checkbox--checked]': 'checked()',\n '[class.com-checkbox--indeterminate]': 'indeterminate()',\n },\n})\nexport class ComCheckbox implements ControlValueAccessor {\n /** Optional NgControl for reactive forms integration. */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Reference to the native input element. */\n readonly inputRef: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n /** Unique ID for this checkbox instance. */\n private readonly uniqueId: string = `com-checkbox-${nextId++}`;\n\n // Inputs\n readonly size: InputSignal<CheckboxSize> = input<CheckboxSize>('md');\n readonly variant: InputSignal<CheckboxVariant> = input<CheckboxVariant>('primary');\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n readonly indeterminate: ModelSignal<boolean> = model<boolean>(false);\n readonly disabled: ModelSignal<boolean> = model<boolean>(false);\n readonly htmlValue: InputSignal<string | undefined> = input<string | undefined>(undefined, { alias: 'value' });\n readonly name: InputSignal<string | undefined> = input<string>();\n\n // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives\n readonly touched: ModelSignal<boolean> = model<boolean>(false);\n readonly invalid: InputSignal<boolean> = input<boolean>(false);\n readonly sfErrors: InputSignal<readonly unknown[]> = input<readonly unknown[]>([], { alias: 'errors' });\n readonly sfRequired: InputSignal<boolean> = input<boolean>(false, { alias: 'required' });\n readonly id: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-describedby' });\n\n // Outputs\n readonly changed: OutputEmitterRef<CheckboxChange> = output<CheckboxChange>();\n\n // Computed state\n readonly inputId: Signal<string> = computed(() => this.id() ?? this.uniqueId);\n\n protected readonly boxClasses: Signal<string> = computed(() =>\n checkboxBoxVariants({ variant: this.variant(), size: this.size() })\n );\n\n protected readonly iconSizeClass: Signal<string> = computed(() => CHECKBOX_ICON_SIZES[this.size()]);\n protected readonly labelSizeClass: Signal<string> = computed(() => CHECKBOX_LABEL_SIZES[this.size()]);\n\n // CVA callbacks\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)\n effect(() => {\n const isIndeterminate = this.indeterminate();\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.indeterminate = isIndeterminate;\n }\n });\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this.checked.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // Event handlers\n protected onBlur(): void {\n this.onTouched();\n this.touched.set(true);\n }\n\n protected onInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newChecked = input.checked;\n\n // Clear indeterminate on user interaction\n if (this.indeterminate()) {\n this.indeterminate.set(false);\n input.indeterminate = false;\n }\n\n this.checked.set(newChecked);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n\n // Public API\n /** Focuses this checkbox's input element. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Toggles the checkbox state programmatically. */\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n const newChecked = !this.checked();\n this.checked.set(newChecked);\n this.indeterminate.set(false);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n}\n","// Public API for the checkbox component\n\n// Main component\nexport { ComCheckbox } from './checkbox.component';\n\n// Types\nexport type { CheckboxChange } from './checkbox.component';\n\n// Variants (for advanced customization)\nexport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\n\nexport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, inject, DestroyRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { Clipboard } from '@angular/cdk/clipboard';
4
+ import { ComIcon } from 'ngx-com/components/icon';
5
+ import { mergeClasses } from 'ngx-com/utils';
6
+ import { cva } from 'class-variance-authority';
7
+
8
+ /**
9
+ * CVA variants for the code block container.
10
+ *
11
+ * @tokens `--color-muted`, `--color-foreground`,
12
+ * `--color-border`, `--color-border-subtle`,
13
+ * `--radius-card`, `--font-mono`
14
+ */
15
+ const codeBlockVariants = cva([
16
+ 'relative',
17
+ 'flex',
18
+ 'flex-col',
19
+ 'rounded-card',
20
+ 'overflow-hidden',
21
+ 'font-mono',
22
+ 'text-sm',
23
+ ], {
24
+ variants: {
25
+ variant: {
26
+ filled: 'bg-muted text-foreground border border-border-subtle',
27
+ outlined: 'bg-transparent text-foreground border border-border',
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: 'filled',
32
+ },
33
+ });
34
+
35
+ /**
36
+ * Code block component for displaying code snippets with a language label
37
+ * and copy-to-clipboard functionality.
38
+ *
39
+ * Renders plain monospace text in a styled container — no syntax highlighting.
40
+ * The header bar shows an optional language label and a copy button that
41
+ * provides visual feedback (checkmark icon for 2 seconds) after copying.
42
+ *
43
+ * @tokens `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,
44
+ * `--color-foreground`, `--color-border`, `--color-border-subtle`,
45
+ * `--color-ring`, `--color-success`,
46
+ * `--font-mono`, `--radius-card`
47
+ *
48
+ * @example Basic usage with language label
49
+ * ```html
50
+ * <com-code-block code="const x = 42;" language="TypeScript" />
51
+ * ```
52
+ *
53
+ * @example Outlined variant
54
+ * ```html
55
+ * <com-code-block [code]="htmlSnippet" language="HTML" variant="outlined" />
56
+ * ```
57
+ */
58
+ class ComCodeBlockComponent {
59
+ /** The raw code string to display. */
60
+ code = input.required(...(ngDevMode ? [{ debugName: "code" }] : []));
61
+ /** Language label shown in the header (e.g. 'TypeScript', 'HTML'). */
62
+ language = input(...(ngDevMode ? [undefined, { debugName: "language" }] : []));
63
+ /** Visual variant. */
64
+ variant = input('filled', ...(ngDevMode ? [{ debugName: "variant" }] : []));
65
+ /** Consumer CSS classes — merged with variant classes. */
66
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : {}), alias: 'class' });
67
+ /** Emitted when code is successfully copied to clipboard. */
68
+ copied = output();
69
+ /** @internal Tracks copy feedback state. */
70
+ isCopied = signal(false, ...(ngDevMode ? [{ debugName: "isCopied" }] : []));
71
+ /** @internal Computed host element classes. */
72
+ hostClasses = computed(() => mergeClasses(codeBlockVariants({ variant: this.variant() }), this.userClass()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : []));
73
+ clipboard = inject(Clipboard);
74
+ destroyRef = inject(DestroyRef);
75
+ copyTimeoutId;
76
+ /** Copies the code to clipboard and shows feedback for 2 seconds. */
77
+ copyToClipboard() {
78
+ this.clipboard.copy(this.code());
79
+ this.isCopied.set(true);
80
+ this.copied.emit();
81
+ clearTimeout(this.copyTimeoutId);
82
+ this.copyTimeoutId = setTimeout(() => this.isCopied.set(false), 2000);
83
+ this.destroyRef.onDestroy(() => clearTimeout(this.copyTimeoutId));
84
+ }
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCodeBlockComponent, isStandalone: true, selector: "com-code-block", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: true, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { copied: "copied" }, host: { properties: { "class": "hostClasses()" } }, exportAs: ["comCodeBlock"], ngImport: i0, template: `
87
+ <div class="flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground">
88
+ @if (language()) {
89
+ <span class="select-none font-sans font-medium">{{ language() }}</span>
90
+ } @else {
91
+ <span></span>
92
+ }
93
+ <button
94
+ type="button"
95
+ class="inline-flex items-center justify-center rounded-md p-1
96
+ text-muted-foreground hover:text-foreground hover:bg-muted-hover
97
+ transition-colors outline-none
98
+ focus-visible:outline-2 focus-visible:outline-offset-2
99
+ focus-visible:outline-[--color-ring]"
100
+ [attr.aria-label]="isCopied() ? 'Copied' : 'Copy code'"
101
+ (click)="copyToClipboard()"
102
+ >
103
+ @if (isCopied()) {
104
+ <com-icon name="check" size="sm" class="text-success" aria-hidden="true" />
105
+ } @else {
106
+ <com-icon name="clipboard" size="sm" aria-hidden="true" />
107
+ }
108
+ </button>
109
+ </div>
110
+ <pre class="overflow-auto p-4 m-0 flex-1"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
111
+ <span
112
+ class="sr-only"
113
+ aria-live="polite"
114
+ >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>
115
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlockComponent, decorators: [{
118
+ type: Component,
119
+ args: [{ selector: 'com-code-block', exportAs: 'comCodeBlock', host: {
120
+ '[class]': 'hostClasses()',
121
+ }, template: `
122
+ <div class="flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground">
123
+ @if (language()) {
124
+ <span class="select-none font-sans font-medium">{{ language() }}</span>
125
+ } @else {
126
+ <span></span>
127
+ }
128
+ <button
129
+ type="button"
130
+ class="inline-flex items-center justify-center rounded-md p-1
131
+ text-muted-foreground hover:text-foreground hover:bg-muted-hover
132
+ transition-colors outline-none
133
+ focus-visible:outline-2 focus-visible:outline-offset-2
134
+ focus-visible:outline-[--color-ring]"
135
+ [attr.aria-label]="isCopied() ? 'Copied' : 'Copy code'"
136
+ (click)="copyToClipboard()"
137
+ >
138
+ @if (isCopied()) {
139
+ <com-icon name="check" size="sm" class="text-success" aria-hidden="true" />
140
+ } @else {
141
+ <com-icon name="clipboard" size="sm" aria-hidden="true" />
142
+ }
143
+ </button>
144
+ </div>
145
+ <pre class="overflow-auto p-4 m-0 flex-1"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
146
+ <span
147
+ class="sr-only"
148
+ aria-live="polite"
149
+ >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>
150
+ `, imports: [ComIcon], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [":host{display:block}\n"] }]
151
+ }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: true }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], copied: [{ type: i0.Output, args: ["copied"] }] } });
152
+
153
+ /**
154
+ * Generated bundle index. Do not edit.
155
+ */
156
+
157
+ export { ComCodeBlockComponent, codeBlockVariants };
158
+ //# sourceMappingURL=ngx-com-components-code-block.mjs.map
@@ -0,0 +1 @@
1
+ {"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-md 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\"><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 ComCodeBlockComponent {\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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"}
@@ -38,7 +38,7 @@ const collapsibleTriggerVariants = cva([
38
38
  'cursor-pointer select-none',
39
39
  'text-sm font-medium',
40
40
  'transition-colors',
41
- 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
41
+ 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
42
42
  'disabled:pointer-events-none disabled:text-disabled-foreground',
43
43
  '[&>svg]:transition-transform [&>svg]:duration-200',
44
44
  '[&>svg.com-collapsible-icon]:data-[state=open]:rotate-180',