@tociva/tailng-ui 0.12.0 → 0.13.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"tociva-tailng-ui-popups-overlays.mjs","sources":["../../../../libs/ui/popups-overlays/src/public-api.ts","../../../../libs/ui/popups-overlays/src/tociva-tailng-ui-popups-overlays.ts"],"sourcesContent":["export * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,EAAA,OAAA,CAAA;;ACAA;;AAEG"}
1
+ {"version":3,"file":"tociva-tailng-ui-popups-overlays.mjs","sources":["../../../../libs/ui/popups-overlays/src/lib/connected-overlay/connected-overlay.component.ts","../../../../libs/ui/popups-overlays/src/lib/connected-overlay/connected-overlay.component.html","../../../../libs/ui/popups-overlays/src/lib/overlay-ref/overlay-ref.component.ts","../../../../libs/ui/popups-overlays/src/lib/overlay-ref/overlay-ref.component.html","../../../../libs/ui/popups-overlays/src/lib/overlay-panel/overlay-panel.component.ts","../../../../libs/ui/popups-overlays/src/lib/overlay-panel/overlay-panel.component.html","../../../../libs/ui/popups-overlays/src/lib/dialog/dialog.component.ts","../../../../libs/ui/popups-overlays/src/lib/dialog/dialog.component.html","../../../../libs/ui/popups-overlays/src/lib/dialog/dialog-initial-focus.directive.ts","../../../../libs/ui/popups-overlays/src/lib/option-list/option-list.component.ts","../../../../libs/ui/popups-overlays/src/lib/option-list/option-list.component.html","../../../../libs/ui/popups-overlays/src/lib/popover/popover.component.ts","../../../../libs/ui/popups-overlays/src/lib/popover/popover.component.html","../../../../libs/ui/popups-overlays/src/lib/snackbar/snackbar-host.component.ts","../../../../libs/ui/popups-overlays/src/lib/snackbar/snackbar-host.component.html","../../../../libs/ui/popups-overlays/src/lib/tooltip/tooltip.component.ts","../../../../libs/ui/popups-overlays/src/lib/tooltip/tooltip.component.html","../../../../libs/ui/popups-overlays/src/tociva-tailng-ui-popups-overlays.ts"],"sourcesContent":["import { NgStyle } from '@angular/common';\nimport {\n Component,\n ElementRef,\n HostListener,\n ViewChild,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport type TngOverlayPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end';\n\nexport type TngConnectedOverlayCloseReason =\n | 'outside-click'\n | 'inside-click'\n | 'escape'\n | 'programmatic'\n | 'detach';\n\n@Component({\n selector: 'tng-connected-overlay',\n standalone: true,\n imports: [NgStyle],\n templateUrl: './connected-overlay.component.html',\n})\nexport class TngConnectedOverlay {\n /**\n * Control\n */\n readonly open = input<boolean>(false);\n\n /**\n * Anchor: pass either ElementRef<HTMLElement> or HTMLElement\n * Example: [anchor]=\"inputEl\" where inputEl is ElementRef<HTMLInputElement>\n */\n readonly anchor = input<ElementRef<HTMLElement> | HTMLElement | null>(null);\n\n /**\n * Position / size\n */\n readonly placement = input<TngOverlayPlacement>('bottom-start');\n readonly offset = input<number>(6);\n readonly width = input<'anchor' | number>('anchor');\n\n /**\n * Close behavior\n */\n readonly closeOnOutsideClick = input<boolean>(true);\n readonly closeOnInsideClick = input<boolean>(true);\n readonly closeOnEscape = input<boolean>(true);\n\n /**\n * Backdrop (modal semantics)\n */\n readonly hasBackdrop = input<boolean>(false);\n readonly backdropClass = input<string>('fixed inset-0 bg-black/40 z-[999]');\n\n /**\n * Events\n */\n readonly opened = output<void>();\n readonly closed = output<TngConnectedOverlayCloseReason>();\n readonly backdropClick = output<void>();\n\n @ViewChild('overlayRoot', { static: false })\n private overlayRoot?: ElementRef<HTMLElement>;\n\n // Internal position state\n private readonly topPx = signal<number>(0);\n private readonly leftPx = signal<number>(0);\n private readonly widthPx = signal<number | null>(null);\n private readonly minWidthPx = signal<number | null>(null);\n\n // Cache whether we already emitted \"opened\" for current open cycle\n private didEmitOpened = false;\n\n // RAF guard for resize/scroll repositioning\n private raf = 0;\n\n /**\n * Resolve anchor element\n */\n readonly anchorEl = computed<HTMLElement | null>(() => {\n const a = this.anchor();\n if (!a) return null;\n return a instanceof ElementRef ? a.nativeElement : a;\n });\n\n /**\n * Overlay style for template\n */\n readonly overlayStyle = computed(() => {\n const top = this.topPx();\n const left = this.leftPx();\n const width = this.widthPx();\n const minWidth = this.minWidthPx();\n\n return {\n top: `${top}px`,\n left: `${left}px`,\n width: width != null ? `${width}px` : undefined,\n minWidth: minWidth != null ? `${minWidth}px` : undefined,\n } as Record<string, string | undefined>;\n });\n\n constructor() {\n // When open/anchor changes, recompute position\n effect(() => {\n const isOpen = this.open();\n const anchorEl = this.anchorEl();\n\n if (!isOpen || !anchorEl) {\n this.didEmitOpened = false;\n return;\n }\n\n // Initial calc\n this.updatePosition();\n\n // Recalc after content renders so we can measure height (top placements + clamping)\n queueMicrotask(() => {\n if (this.open()) this.updatePosition();\n });\n\n if (!this.didEmitOpened) {\n this.didEmitOpened = true;\n this.opened.emit();\n }\n });\n }\n\n /**\n * Public API: parent can call close programmatically (optional)\n */\n close(reason: TngConnectedOverlayCloseReason = 'programmatic'): void {\n // Controlled component: parent must set [open]=false.\n this.closed.emit(reason);\n }\n\n /**\n * Recompute overlay position\n */\n updatePosition(): void {\n const anchor = this.anchorEl();\n if (!anchor) {\n this.close('detach');\n return;\n }\n\n const rect = anchor.getBoundingClientRect();\n const offset = this.offset();\n const placement = this.placement();\n\n // Determine width setting (style)\n const w = this.width();\n if (w === 'anchor') {\n this.minWidthPx.set(rect.width);\n this.widthPx.set(rect.width);\n } else if (typeof w === 'number') {\n this.minWidthPx.set(null);\n this.widthPx.set(w);\n } else {\n this.minWidthPx.set(null);\n this.widthPx.set(null);\n }\n\n // Measure panel if present\n const panelEl = this.overlayRoot?.nativeElement ?? null;\n const panelRect = panelEl?.getBoundingClientRect() ?? null;\n\n const panelW = panelRect?.width ?? this.getOverlayWidthForPosition(rect);\n const panelH = panelRect?.height ?? 0;\n\n // Position calculation (viewport coords; overlay is `position: fixed`)\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'bottom-start':\n top = rect.bottom + offset;\n left = rect.left;\n break;\n\n case 'bottom-end':\n top = rect.bottom + offset;\n left = rect.right - panelW;\n break;\n\n case 'top-start':\n top = rect.top - offset - panelH;\n left = rect.left;\n break;\n\n case 'top-end':\n top = rect.top - offset - panelH;\n left = rect.right - panelW;\n break;\n }\n\n // Viewport clamping\n const pad = 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const maxLeft = Math.max(pad, vw - pad - panelW);\n const maxTop = Math.max(pad, vh - pad - panelH);\n\n left = Math.max(pad, Math.min(left, maxLeft));\n top = Math.max(pad, Math.min(top, maxTop));\n\n this.leftPx.set(left);\n this.topPx.set(top);\n }\n\n private getOverlayWidthForPosition(anchorRect: DOMRect): number {\n const w = this.width();\n if (w === 'anchor') return anchorRect.width;\n if (typeof w === 'number') return w;\n\n // fallback: use rendered width if available, else anchor width\n return this.overlayRoot?.nativeElement?.getBoundingClientRect().width ?? anchorRect.width;\n }\n\n private requestReposition(): void {\n if (this.raf) return;\n this.raf = requestAnimationFrame(() => {\n this.raf = 0;\n if (this.open()) this.updatePosition();\n });\n }\n\n /**\n * Backdrop pointerdown (if enabled)\n */\n onBackdropPointerDown(ev: PointerEvent): void {\n if (!this.open()) return;\n\n ev.preventDefault();\n this.backdropClick.emit();\n\n if (this.closeOnOutsideClick()) {\n this.close('outside-click');\n }\n }\n\n /**\n * Close on escape\n */\n @HostListener('document:keydown', ['$event'])\n onDocKeydown(ev: KeyboardEvent): void {\n if (!this.open()) return;\n if (!this.closeOnEscape()) return;\n\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.close('escape');\n }\n }\n\n /**\n * Close on outside click (and optionally inside click)\n * Use pointerdown so it works for mouse/touch/pen and is earlier than click.\n */\n @HostListener('document:pointerdown', ['$event'])\n onDocPointerDown(ev: PointerEvent): void {\n if (!this.open()) return;\n\n const target = ev.target as Node | null;\n if (!target) return;\n\n const anchor = this.anchorEl();\n const panel = this.overlayRoot?.nativeElement ?? null;\n\n const inAnchor = !!anchor && anchor.contains(target);\n const inPanel = !!panel && panel.contains(target);\n\n // Anchor should never be treated as outside.\n if (inAnchor) return;\n\n // If backdrop is enabled and we clicked backdrop, the backdrop handler will run.\n // Still, keep logic safe: treat it as outside.\n if (inPanel) {\n if (this.closeOnInsideClick()) this.close('inside-click');\n return;\n }\n\n if (this.closeOnOutsideClick()) this.close('outside-click');\n }\n\n /**\n * Keep position in sync on viewport changes\n */\n @HostListener('window:resize')\n onResize(): void {\n this.requestReposition();\n }\n\n @HostListener('window:scroll')\n onScroll(): void {\n this.requestReposition();\n }\n}\n","@if (open() && anchorEl()) {\n @if (hasBackdrop()) {\n <div\n [class]=\"backdropClass()\"\n (pointerdown)=\"onBackdropPointerDown($event)\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <div\n #overlayRoot\n class=\"fixed z-[1000]\"\n [ngStyle]=\"overlayStyle()\"\n role=\"presentation\"\n >\n <ng-content />\n </div>\n}\n","import { Component, computed, input, output } from '@angular/core';\n\nexport type TngOverlayCloseReason =\n | 'selection'\n | 'escape'\n | 'outside-click'\n | 'blur'\n | 'programmatic';\n\n@Component({\n selector: 'tng-overlay-ref',\n standalone: true,\n templateUrl: './overlay-ref.component.html',\n exportAs: 'tngOverlayRef',\n})\nexport class TngOverlayRef<R = TngOverlayCloseReason> {\n /**\n * Controlled open state (parent owns state).\n * Use [(open)]=\"signal()\" style with openChange.\n */\n readonly open = input<boolean>(false);\n readonly openChange = output<boolean>();\n\n /** Lifecycle outputs */\n readonly opened = output<void>();\n readonly closed = output<R>();\n\n /** Read-only computed */\n readonly isOpen = computed(() => this.open());\n\n /** Request open (controlled) */\n requestOpen() {\n if (this.open()) return;\n this.openChange.emit(true);\n this.opened.emit();\n }\n\n /** Request close (controlled) */\n requestClose(reason: R) {\n if (!this.open()) return;\n this.openChange.emit(false);\n this.closed.emit(reason);\n }\n\n /** Convenience aliases */\n openOverlay() {\n this.requestOpen();\n }\n\n close(reason: R) {\n this.requestClose(reason);\n }\n\n toggle() {\n this.open() ? this.requestClose('programmatic' as R) : this.requestOpen();\n }\n}\n","<ng-content />\n","import { Component, computed, input } from '@angular/core';\nimport { TngFocusTrap } from '@tociva/tailng-cdk/a11y';\n\n@Component({\n selector: 'tng-overlay-panel',\n standalone: true,\n imports: [TngFocusTrap],\n templateUrl: './overlay-panel.component.html',\n})\nexport class TngOverlayPanel {\n /** Consumer-provided class overrides / extensions */\n readonly klass = input<string>('');\n\n /**\n * When true, treat panel as modal surface:\n * - trap focus\n * - restore focus on destroy\n * - aria-modal=\"true\"\n */\n readonly modal = input<boolean>(false);\n\n /** a11y */\n readonly role = input<'dialog' | 'menu' | 'listbox' | 'region' | 'presentation'>('presentation');\n readonly ariaLabel = input<string>('');\n readonly ariaLabelledby = input<string>('');\n readonly ariaDescribedby = input<string>('');\n\n /** Focus trap options (only meaningful when modal=true) */\n readonly restoreFocus = input<boolean>(true);\n readonly autoCapture = input<boolean>(true);\n readonly deferCaptureElements = input<boolean>(false);\n\n /** Base themed Tailwind classes */\n private readonly baseClasses =\n 'bg-bg text-fg border border-border rounded-md shadow-lg max-h-60 overflow-auto outline-none';\n\n /** Final merged class string */\n readonly classes = computed(() => `${this.baseClasses} ${this.klass()}`.trim());\n\n /** For ARIA: only true when modal */\n readonly ariaModal = computed(() => (this.modal() ? 'true' : null));\n}\n","<div\n [class]=\"classes()\"\n [attr.role]=\"role()\"\n [attr.aria-modal]=\"ariaModal()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n tabindex=\"-1\"\n [tngFocusTrap]=\"modal()\"\n [restoreFocus]=\"restoreFocus()\"\n [autoCapture]=\"autoCapture()\"\n [deferCaptureElements]=\"deferCaptureElements()\"\n>\n <ng-content />\n</div>\n","import {\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n runInInjectionContext,\n viewChild,\n} from '@angular/core';\nimport { TngFocusTrap } from '@tociva/tailng-cdk/a11y';\n\nexport type TngDialogCloseReason =\n | 'confirm'\n | 'cancel'\n | 'escape'\n | 'outside-click'\n | 'programmatic';\n\n@Component({\n selector: 'tng-dialog',\n standalone: true,\n imports: [TngFocusTrap],\n templateUrl: './dialog.component.html',\n})\nexport class TngDialog {\n /** Controlled open state */\n readonly open = input<boolean>(false);\n\n /** Close behavior */\n readonly closeOnBackdropClick = input<boolean>(true);\n readonly closeOnEscape = input<boolean>(true);\n\n /** a11y */\n readonly ariaLabel = input<string>('Dialog');\n\n /** Focus trap (a11y) */\n readonly trapFocus = input<boolean>(true);\n readonly restoreFocus = input<boolean>(true);\n readonly autoCapture = input<boolean>(true);\n readonly deferCaptureElements = input<boolean>(false);\n\n /** When no tabbables exist, focus the panel */\n readonly autoFocusPanelWhenEmpty = input<boolean>(true);\n\n /** Klass inputs */\n readonly backdropKlass = input<string>('fixed inset-0 bg-black/40');\n readonly panelKlass = input<string>(\n [\n 'fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n 'w-[min(32rem,calc(100vw-2rem))]',\n 'max-h-[calc(100vh-2rem)] overflow-auto',\n 'rounded-lg border border-border bg-bg shadow-xl outline-none',\n ].join(' ')\n );\n\n readonly headerWrapKlass = input<string>('border-b border-border px-4 py-3');\n readonly bodyWrapKlass = input<string>('px-4 py-4');\n readonly footerWrapKlass = input<string>('border-t border-border px-4 py-3');\n\n /** Outputs */\n readonly closed = output<TngDialogCloseReason>();\n readonly opened = output<void>();\n\n /** Derived */\n readonly isOpen = computed(() => this.open());\n\n /** Panel ref */\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n\n private readonly injector = inject(Injector);\n\n private didEmitOpened = false;\n\n constructor() {\n effect(() => {\n if (!this.isOpen()) return;\n\n // afterNextRender must be called inside injection context\n runInInjectionContext(this.injector, () => {\n afterNextRender(() => this.focusPanelIfNoTabbable());\n });\n });\n }\n\n ngDoCheck(): void {\n if (this.isOpen() && !this.didEmitOpened) {\n this.didEmitOpened = true;\n this.opened.emit();\n\n // Optional extra attempt\n queueMicrotask(() => this.focusPanelIfNoTabbable());\n }\n if (!this.isOpen() && this.didEmitOpened) {\n this.didEmitOpened = false;\n }\n }\n\n requestClose(reason: TngDialogCloseReason) {\n if (!this.open()) return;\n this.closed.emit(reason);\n }\n\n onBackdropClick() {\n if (!this.closeOnBackdropClick()) return;\n this.requestClose('outside-click');\n }\n\n onPanelKeydown(ev: KeyboardEvent) {\n if (!this.open()) return;\n if (!this.closeOnEscape()) return;\n if (ev.defaultPrevented) return;\n\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.requestClose('escape');\n }\n }\n\n private focusPanelIfNoTabbable(): void {\n if (!this.isOpen()) return;\n if (!this.trapFocus()) return;\n if (!this.autoFocusPanelWhenEmpty()) return;\n\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n\n const active = document.activeElement as HTMLElement | null;\n if (active && panel.contains(active)) return;\n\n if (this.hasTabbable(panel)) return;\n\n panel.focus();\n }\n\n private hasTabbable(root: HTMLElement): boolean {\n const candidates = root.querySelectorAll<HTMLElement>(\n [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[tabindex]',\n '[contenteditable=\"true\"]',\n ].join(',')\n );\n\n for (const el of Array.from(candidates)) {\n if (el === root) continue;\n if (el.hasAttribute('disabled')) continue;\n if ((el as HTMLInputElement).type === 'hidden') continue;\n\n const tabindexAttr = el.getAttribute('tabindex');\n const tabindex = tabindexAttr == null ? 0 : Number(tabindexAttr);\n if (Number.isNaN(tabindex) || tabindex < 0) continue;\n\n if (el.getClientRects().length === 0) continue;\n\n return true;\n }\n return false;\n }\n}\n","@if (open()) {\n <div [class]=\"backdropKlass()\" (click)=\"onBackdropClick()\"></div>\n\n <div\n #panel\n [class]=\"panelKlass()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onPanelKeydown($event)\"\n [tngFocusTrap]=\"isOpen() && trapFocus()\"\n [restoreFocus]=\"restoreFocus()\"\n [autoCapture]=\"autoCapture()\"\n [deferCaptureElements]=\"deferCaptureElements()\"\n >\n <!-- Header slot -->\n @if (true) {\n <div [class]=\"headerWrapKlass()\">\n <ng-content select=\"[tngDialogHeader]\"></ng-content>\n </div>\n }\n\n <!-- Body -->\n <div [class]=\"bodyWrapKlass()\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer slot -->\n <div [class]=\"footerWrapKlass()\">\n <ng-content select=\"[tngDialogFooter]\"></ng-content>\n </div>\n </div>\n}\n","import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tngDialogInitialFocus]',\n standalone: true,\n})\nexport class TngDialogInitialFocus {\n // Attribute CDK FocusTrap looks for\n @HostBinding('attr.cdk-focus-initial')\n readonly cdkFocusInitialAttr = '';\n\n // Optional camelCase alias (harmless, future-proof)\n @HostBinding('attr.cdkFocusInitial')\n readonly cdkFocusInitialCamelAttr = '';\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n ContentChild,\n ElementRef,\n effect,\n input,\n output,\n signal,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { OptionTplContext } from '@tociva/tailng-cdk/util';\n\nimport { TngOverlayPanel } from '../overlay-panel/overlay-panel.component';\n\ntype TypeaheadMatchMode = 'startsWith' | 'includes';\nexport type TngOptionListKeyAction = 'move' | 'select' | 'typeahead' | 'none';\n\nexport type TngOptionListKeyStroke = {\n key: string;\n handled: boolean;\n prevented: boolean;\n action: TngOptionListKeyAction;\n nextActiveIndex?: number;\n query?: string;\n originalEvent: KeyboardEvent;\n};\n\n@Component({\n selector: 'tng-option-list',\n standalone: true,\n imports: [CommonModule, TngOverlayPanel],\n templateUrl: './option-list.component.html',\n})\nexport class TngOptionList<T> {\n // IMPORTANT: because #listbox is under @if branches (modal/non-modal),\n // keep static:false so Angular always resolves the *current* element.\n @ViewChild('listbox', { read: ElementRef })\n listbox?: ElementRef<HTMLElement>;\n\n /* =====================\n * Modal (optional)\n * ===================== */\n readonly modal = input<boolean>(false);\n\n /** overlay-panel options (only used when modal=true) */\n readonly panelKlass = input<string>('p-0');\n readonly restoreFocus = input<boolean>(true);\n readonly autoCapture = input<boolean>(true);\n readonly deferCaptureElements = input<boolean>(false);\n\n /** a11y (for listbox container) */\n readonly ariaLabel = input<string>(''); // applied to listbox container\n readonly ariaLabelledby = input<string>('');\n readonly ariaDescribedby = input<string>('');\n\n /**\n * tabindex for listbox container:\n * - Default: 0 (focusable, good for keyboard + typeahead)\n * - Set -1 for programmatic focus only\n * - Set null to omit tabindex attribute\n */\n readonly tabindex = input<number | null>(0);\n\n /* =====================\n * Templates + data\n * ===================== */\n readonly optionTemplate = input<TemplateRef<OptionTplContext<T>> | null>(null);\n\n readonly items = input<T[]>([]);\n readonly activeIndex = input<number>(-1);\n\n readonly displayWith = input<(item: T) => string>((v) => String(v));\n readonly emptyText = input<string>('No results');\n\n readonly containerKlass = input<string>('py-1 overflow-auto max-h-60');\n readonly optionKlass = input<string>('px-3 py-2 text-sm cursor-pointer select-none');\n readonly optionActiveKlass = input<string>('bg-primary text-on-primary');\n readonly optionInactiveKlass = input<string>('bg-bg text-fg');\n readonly emptyKlass = input<string>('px-3 py-2 text-sm text-disable');\n\n @ContentChild(TemplateRef, { descendants: true })\n optionTpl?: TemplateRef<OptionTplContext<T>>;\n\n /* =====================\n * Outputs\n * ===================== */\n readonly optionMouseDown = output<{ item: T; index: number }>();\n readonly optionHover = output<number>();\n\n /** Parent-controlled active index */\n readonly activeIndexChange = output<number>();\n\n /** Parent decides what selection means */\n readonly requestSelectActive = output<void>();\n\n /** Optional: parent can observe typeahead match */\n readonly requestTypeaheadMatch = output<{ query: string; index: number }>();\n\n /** Optional: key stroke propagation */\n readonly propagateKeys = input<boolean>(false);\n readonly keyStroke = output<TngOptionListKeyStroke>();\n\n /* =====================\n * Keyboard / typeahead config\n * ===================== */\n readonly keyboard = input<boolean>(true);\n readonly loop = input<boolean>(true);\n readonly selectOnEnter = input<boolean>(true);\n readonly typeahead = input<boolean>(true);\n readonly typeaheadMode = input<TypeaheadMatchMode>('startsWith');\n readonly typeaheadResetMs = input<number>(500);\n readonly pageJumpSize = input<number>(8);\n\n private readonly typeaheadQuery = signal('');\n private typeaheadTimer: number | null = null;\n\n /* =====================\n * Computeds\n * ===================== */\n readonly hasItems = computed(() => (this.items()?.length ?? 0) > 0);\n\n constructor() {\n /**\n * Scroll follows the controlled `activeIndex`:\n * This guarantees scrolling even when parent changes activeIndex via:\n * - hover\n * - open() initialization\n * - programmatic updates\n * - any external state\n *\n * (Not just when OptionList handles keydown.)\n */\n effect(() => {\n const i = this.activeIndex();\n if (i < 0) return;\n\n // Wait for DOM update / projection / overlay paint\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollIndexIntoView(i));\n });\n });\n }\n\n get tpl(): TemplateRef<OptionTplContext<T>> | undefined {\n return this.optionTemplate() ?? this.optionTpl;\n }\n\n display(item: T) {\n return this.displayWith()(item);\n }\n\n isActive(i: number) {\n return i === this.activeIndex();\n }\n\n optionClasses(i: number) {\n const state = this.isActive(i) ? this.optionActiveKlass() : this.optionInactiveKlass();\n return `${this.optionKlass()} ${state}`.trim();\n }\n\n onMouseDown(item: T, index: number, ev: MouseEvent) {\n ev.preventDefault();\n this.optionMouseDown.emit({ item, index });\n }\n\n onMouseEnter(index: number) {\n this.optionHover.emit(index);\n }\n\n /* =====================\n * Keyboard handling\n * ===================== */\n onKeydown(ev: KeyboardEvent): void {\n const key = ev.key;\n\n if (!this.hasItems()) {\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n return;\n }\n\n if (ev.defaultPrevented) {\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n return;\n }\n\n const anyEv = ev as any;\n if (anyEv.isComposing === true || anyEv.keyCode === 229) {\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n return;\n }\n\n if (!this.keyboard()) {\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n return;\n }\n\n // Navigation\n if (key === 'ArrowDown') {\n ev.preventDefault();\n const next = this.computeNextIndex(1);\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n if (key === 'ArrowUp') {\n ev.preventDefault();\n const next = this.computeNextIndex(-1);\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n if (key === 'Home') {\n ev.preventDefault();\n const next = 0;\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n if (key === 'End') {\n ev.preventDefault();\n const next = this.items().length - 1;\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n if (key === 'PageDown') {\n ev.preventDefault();\n const next = this.computeNextIndex(this.pageJumpSize());\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n if (key === 'PageUp') {\n ev.preventDefault();\n const next = this.computeNextIndex(-this.pageJumpSize());\n this.commitActive(next);\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'move', nextActiveIndex: next, originalEvent: ev });\n return;\n }\n\n // Selection\n if (key === 'Enter') {\n if (!this.selectOnEnter()) {\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n return;\n }\n ev.preventDefault();\n this.requestSelectActive.emit();\n this.emitKeyStroke({ key, handled: true, prevented: true, action: 'select', originalEvent: ev });\n return;\n }\n\n // Typeahead\n if (this.typeahead() && this.isPrintableKey(ev)) {\n const { query, matchIndex } = this.onTypeaheadKey(key);\n\n if (matchIndex >= 0) {\n this.commitActive(matchIndex);\n this.emitKeyStroke({\n key,\n handled: true,\n prevented: false,\n action: 'typeahead',\n nextActiveIndex: matchIndex,\n query,\n originalEvent: ev,\n });\n return;\n }\n\n this.emitKeyStroke({ key, handled: true, prevented: false, action: 'typeahead', query, originalEvent: ev });\n return;\n }\n\n this.emitKeyStroke({ key, handled: false, prevented: false, action: 'none', originalEvent: ev });\n }\n\n private emitKeyStroke(e: TngOptionListKeyStroke): void {\n if (!this.propagateKeys()) return;\n this.keyStroke.emit(e);\n }\n\n private computeNextIndex(delta: number): number {\n const len = this.items().length;\n if (len <= 0) return -1;\n\n const current = this.activeIndex();\n const base = current < 0 ? (delta < 0 && this.loop() ? len - 1 : 0) : current;\n\n const nextRaw = base + delta;\n\n if (this.loop()) {\n return ((nextRaw % len) + len) % len;\n }\n\n return Math.max(0, Math.min(len - 1, nextRaw));\n }\n\n /**\n * Controlled activeIndex\n * - Emit activeIndexChange (parent owns state)\n * - Scrolling is handled by the effect() reacting to activeIndex()\n */\n private commitActive(index: number): void {\n if (index < 0) return;\n this.activeIndexChange.emit(index);\n }\n\n /**\n * Scroll the active option into view.\n * Let the browser pick the nearest scrollable ancestor.\n */\n private scrollIndexIntoView(index: number): void {\n const root = this.listbox?.nativeElement;\n if (!root) return;\n\n const optionEl = root.querySelector<HTMLElement>(`[data-index=\"${index}\"]`);\n if (!optionEl) return;\n\n optionEl.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'auto',\n });\n }\n\n /* =====================\n * Typeahead\n * ===================== */\n private onTypeaheadKey(char: string): { query: string; matchIndex: number } {\n if (this.typeaheadTimer != null) {\n window.clearTimeout(this.typeaheadTimer);\n }\n\n const nextQuery = (this.typeaheadQuery() + char).toLowerCase();\n this.typeaheadQuery.set(nextQuery);\n\n this.typeaheadTimer = window.setTimeout(() => {\n this.typeaheadQuery.set('');\n this.typeaheadTimer = null;\n }, this.typeaheadResetMs());\n\n const idx = this.findTypeaheadMatch(nextQuery);\n if (idx >= 0) {\n this.requestTypeaheadMatch.emit({ query: nextQuery, index: idx });\n }\n\n return { query: nextQuery, matchIndex: idx };\n }\n\n private findTypeaheadMatch(query: string): number {\n const items = this.items();\n const mode = this.typeaheadMode();\n\n const start = this.activeIndex();\n const from = start < 0 ? 0 : start + 1;\n\n const matches = (item: T) => {\n const label = this.display(item).toLowerCase();\n return mode === 'includes' ? label.includes(query) : label.startsWith(query);\n };\n\n for (let i = from; i < items.length; i++) if (matches(items[i])) return i;\n for (let i = 0; i < from && i < items.length; i++) if (matches(items[i])) return i;\n\n return -1;\n }\n\n private isPrintableKey(ev: KeyboardEvent): boolean {\n if (ev.ctrlKey || ev.metaKey || ev.altKey) return false;\n if (ev.key.length !== 1) return false;\n if (ev.key === ' ') return false;\n return true;\n }\n}\n","<!-- option-list.component.html -->\n@let active = activeIndex();\n\n@if (modal()) {\n <tng-overlay-panel\n [modal]=\"true\"\n [klass]=\"panelKlass()\"\n [restoreFocus]=\"restoreFocus()\"\n [autoCapture]=\"autoCapture()\"\n [deferCaptureElements]=\"deferCaptureElements()\"\n >\n <div\n #listbox\n role=\"listbox\"\n [class]=\"containerKlass()\"\n [attr.tabindex]=\"tabindex()\"\n (keydown)=\"onKeydown($event)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-activedescendant]=\"active >= 0 ? 'tng-opt-' + active : null\"\n >\n @if (hasItems()) {\n @for (item of items(); let i = $index; track i) {\n <div\n role=\"option\"\n [id]=\"'tng-opt-' + i\"\n [class]=\"optionClasses(i)\"\n [attr.aria-selected]=\"isActive(i) ? 'true' : 'false'\"\n [attr.data-index]=\"i\"\n (mousedown)=\"onMouseDown(item, i, $event)\"\n (mouseenter)=\"onMouseEnter(i)\"\n >\n @if (tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: i, active: isActive(i) }\"\n />\n } @else {\n {{ display(item) }}\n }\n </div>\n }\n } @else {\n <div [class]=\"emptyKlass()\">{{ emptyText() }}</div>\n }\n </div>\n </tng-overlay-panel>\n} @else {\n <div\n #listbox\n role=\"listbox\"\n [class]=\"containerKlass()\"\n [attr.tabindex]=\"tabindex()\"\n (keydown)=\"onKeydown($event)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-describedby]=\"ariaDescribedby() || null\"\n [attr.aria-activedescendant]=\"active >= 0 ? 'tng-opt-' + active : null\"\n >\n @if (hasItems()) {\n @for (item of items(); let i = $index; track i) {\n <div\n role=\"option\"\n [id]=\"'tng-opt-' + i\"\n [class]=\"optionClasses(i)\"\n [attr.aria-selected]=\"isActive(i) ? 'true' : 'false'\"\n [attr.data-index]=\"i\"\n (mousedown)=\"onMouseDown(item, i, $event)\"\n (mouseenter)=\"onMouseEnter(i)\"\n >\n @if (tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: i, active: isActive(i) }\"\n />\n } @else {\n {{ display(item) }}\n }\n </div>\n }\n } @else {\n <div [class]=\"emptyKlass()\">{{ emptyText() }}</div>\n }\n </div>\n}\n","import { Component, ContentChild, ElementRef, TemplateRef, ViewChild, computed, effect, input, output, signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { TngConnectedOverlay } from '../connected-overlay/connected-overlay.component';\nimport { TngOverlayPanel } from '../overlay-panel/overlay-panel.component';\nimport { TngOverlayRef } from '../overlay-ref/overlay-ref.component';\n\nexport type TngPopoverPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\nexport type TngPopoverCloseReason = 'outside-click' | 'escape' | 'programmatic';\n\n@Component({\n selector: 'tng-popover',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n TngConnectedOverlay,\n TngOverlayPanel,\n TngOverlayRef,\n ],\n templateUrl: './popover.component.html',\n})\nexport class TngPopover {\n /* =====================\n * Slots\n * ===================== */\n @ContentChild('popoverContent', { read: TemplateRef })\n contentTpl?: TemplateRef<unknown>;\n\n @ViewChild('triggerEl', { static: true })\n triggerEl!: ElementRef<HTMLElement>;\n\n /* =====================\n * Inputs / outputs\n * ===================== */\n readonly open = input<boolean | null>(null); // optional controlled\n readonly placement = input<TngPopoverPlacement>('bottom-start');\n readonly offset = input<number>(6);\n readonly width = input<'anchor' | number>('anchor');\n\n readonly closeOnOutsideClick = input<boolean>(true);\n readonly closeOnEscape = input<boolean>(true);\n\n readonly rootKlass = input<string>('relative inline-flex');\n readonly triggerKlass = input<string>('inline-flex');\n readonly panelKlass = input<string>('p-2');\n\n readonly opened = output<void>();\n readonly closed = output<TngPopoverCloseReason>();\n readonly openChange = output<boolean>(); // for controlled usage if desired\n\n /* =====================\n * State\n * ===================== */\n private readonly internalOpen = signal(false);\n readonly isOpen = computed(() => (this.open() == null ? this.internalOpen() : !!this.open()));\n\n constructor() {\n // If externally controlled, keep internal in sync for animation consistency\n effect(() => {\n const ext = this.open();\n if (ext == null) return;\n this.internalOpen.set(!!ext);\n });\n }\n\n toggle() {\n this.isOpen() ? this.requestClose('programmatic') : this.requestOpen();\n }\n\n requestOpen() {\n if (this.isOpen()) return;\n if (this.open() == null) this.internalOpen.set(true);\n this.openChange.emit(true);\n this.opened.emit();\n }\n\n requestClose(reason: TngPopoverCloseReason) {\n if (!this.isOpen()) return;\n if (this.open() == null) this.internalOpen.set(false);\n this.openChange.emit(false);\n this.closed.emit(reason);\n queueMicrotask(() => this.triggerEl?.nativeElement?.focus());\n }\n\n onOverlayClosed(reason: any) {\n // Map connected-overlay reasons\n if (reason === 'escape') this.requestClose('escape');\n else if (reason === 'outside-click') this.requestClose('outside-click');\n else this.requestClose('programmatic');\n }\n\n onTriggerClick() {\n this.toggle();\n }\n}\n","<div [class]=\"rootKlass()\">\n <button\n #triggerEl\n type=\"button\"\n [class]=\"triggerKlass()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"onTriggerClick()\"\n >\n <ng-content select=\"[tngPopoverTrigger]\"></ng-content>\n </button>\n\n <tng-overlay-ref\n [open]=\"isOpen()\"\n (openChange)=\"openChange.emit($event)\"\n (opened)=\"opened.emit()\"\n (closed)=\"onOverlayClosed($event)\"\n >\n <tng-connected-overlay\n [open]=\"isOpen()\"\n [anchor]=\"triggerEl\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [width]=\"width()\"\n [closeOnOutsideClick]=\"closeOnOutsideClick()\"\n [closeOnEscape]=\"closeOnEscape()\"\n (closed)=\"onOverlayClosed($event)\"\n >\n <tng-overlay-panel [klass]=\"panelKlass()\">\n @if (contentTpl) {\n <ng-container [ngTemplateOutlet]=\"contentTpl\"></ng-container>\n } @else {\n <ng-content select=\"[tngPopoverContent]\"></ng-content>\n }\n </tng-overlay-panel>\n </tng-connected-overlay>\n </tng-overlay-ref>\n</div>\n","import { Component, computed, effect, input, output, signal } from '@angular/core';\nimport { TngSnackbarItem, TngSnackbarIntent } from './snackbar.types';\n\nexport type TngSnackbarPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\n@Component({\n selector: 'tng-snackbar-host',\n standalone: true,\n templateUrl: './snackbar-host.component.html',\n})\nexport class TngSnackbarHost {\n /** Controlled items array */\n readonly items = input<TngSnackbarItem[]>([]);\n\n /** Placement on screen */\n readonly position = input<TngSnackbarPosition>('bottom-center');\n\n /** Max stack size (visual). Consumer should also enforce if desired. */\n readonly max = input<number>(3);\n\n /** Outputs */\n readonly dismiss = output<{ id: string; reason: 'timeout' | 'dismiss' | 'action' }>();\n\n /* =====================\n * Klass inputs\n * ===================== */\n readonly hostKlass = input<string>('fixed z-[1100] flex flex-col gap-2 p-4');\n readonly itemKlass = input<string>(\n 'pointer-events-auto w-[min(28rem,calc(100vw-2rem))] rounded-md border border-border bg-bg shadow-lg'\n );\n readonly itemInnerKlass = input<string>('flex items-start gap-3 px-4 py-3');\n readonly messageKlass = input<string>('text-sm text-foreground');\n readonly actionKlass = input<string>('text-sm font-medium text-primary hover:underline');\n readonly dismissBtnKlass = input<string>('text-muted-foreground hover:text-foreground');\n\n /** Intent -> klass mapping */\n readonly intentKlass = input<(intent: TngSnackbarIntent) => string>((intent) => {\n switch (intent) {\n case 'success':\n return 'border-success/30';\n case 'info':\n return 'border-info/30';\n case 'warning':\n return 'border-warning/30';\n case 'error':\n return 'border-danger/30';\n case 'default':\n default:\n return '';\n }\n });\n\n /* =====================\n * Derived / internal\n * ===================== */\n readonly hostPositionKlass = computed(() => {\n const base = this.hostKlass();\n switch (this.position()) {\n case 'top-left':\n return `${base} top-0 left-0 items-start`;\n case 'top-center':\n return `${base} top-0 left-1/2 -translate-x-1/2 items-center`;\n case 'top-right':\n return `${base} top-0 right-0 items-end`;\n case 'bottom-left':\n return `${base} bottom-0 left-0 items-start`;\n case 'bottom-center':\n return `${base} bottom-0 left-1/2 -translate-x-1/2 items-center`;\n case 'bottom-right':\n return `${base} bottom-0 right-0 items-end`;\n }\n });\n\n /** Track which ids have active timers */\n private readonly timers = new Map<string, number>();\n\n constructor() {\n effect(() => {\n const incoming = (this.items() ?? []).slice(0, Math.max(1, this.max()));\n\n // Start timers for new items with duration\n for (const item of incoming) {\n const dur = item.durationMs ?? 0;\n if (dur > 0 && !this.timers.has(item.id)) {\n const t = window.setTimeout(() => {\n this.timers.delete(item.id);\n this.dismiss.emit({ id: item.id, reason: 'timeout' });\n }, dur);\n this.timers.set(item.id, t);\n }\n }\n\n // Clear timers for removed items\n const ids = new Set(incoming.map((x) => x.id));\n for (const [id, t] of Array.from(this.timers.entries())) {\n if (!ids.has(id)) {\n window.clearTimeout(t);\n this.timers.delete(id);\n }\n }\n });\n }\n\n itemClasses(item: TngSnackbarItem): string {\n const intent = item.intent ?? 'default';\n const intentCls = this.intentKlass()(intent);\n return `${this.itemKlass()} ${intentCls}`.trim();\n }\n\n onDismiss(id: string) {\n const t = this.timers.get(id);\n if (t != null) {\n window.clearTimeout(t);\n this.timers.delete(id);\n }\n this.dismiss.emit({ id, reason: 'dismiss' });\n }\n\n onAction(id: string) {\n const t = this.timers.get(id);\n if (t != null) {\n window.clearTimeout(t);\n this.timers.delete(id);\n }\n this.dismiss.emit({ id, reason: 'action' });\n }\n}\n","@if ((items()?.length ?? 0) > 0) {\n <div [class]=\"hostPositionKlass()\">\n @for (item of items().slice(0, max()); track item.id) {\n <div [class]=\"itemClasses(item)\">\n <div [class]=\"itemInnerKlass()\">\n <div class=\"flex-1\">\n <div [class]=\"messageKlass()\">{{ item.message }}</div>\n </div>\n\n @if (item.actionLabel) {\n <button type=\"button\" [class]=\"actionKlass()\" (click)=\"onAction(item.id)\">\n {{ item.actionLabel }}\n </button>\n }\n\n <button\n type=\"button\"\n [class]=\"dismissBtnKlass()\"\n aria-label=\"Dismiss\"\n (click)=\"onDismiss(item.id)\"\n >\n ✕\n </button>\n </div>\n </div>\n }\n </div>\n}\n","import {\n Component,\n ContentChild,\n ElementRef,\n HostListener,\n TemplateRef,\n ViewChild,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { TngConnectedOverlay } from '../connected-overlay/connected-overlay.component';\nimport { TngOverlayPanel } from '../overlay-panel/overlay-panel.component';\n\nexport type TngTooltipPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\nexport type TngTooltipCloseReason = 'escape' | 'blur' | 'programmatic';\n\n@Component({\n selector: 'tng-tooltip',\n standalone: true,\n imports: [NgTemplateOutlet, TngConnectedOverlay, TngOverlayPanel],\n templateUrl: './tooltip.component.html',\n})\nexport class TngTooltip {\n @ViewChild('triggerEl', { static: true })\n triggerEl!: ElementRef<HTMLElement>;\n\n /**\n * Option B: projected template support\n * Usage:\n * <tng-tooltip>\n * <ng-template #tooltipContent>...</ng-template>\n * <button>...</button>\n * </tng-tooltip>\n */\n @ContentChild('tooltipContent', { read: TemplateRef })\n projectedTpl?: TemplateRef<unknown>;\n\n /** Option A: explicit input template (kept for flexibility) */\n readonly contentTpl = input<TemplateRef<unknown> | null>(null);\n\n /** Simple text tooltip */\n readonly text = input<string>('');\n\n /** Behavior */\n readonly placement = input<TngTooltipPlacement>('top-start');\n readonly offset = input<number>(8);\n readonly showDelay = input<number>(250);\n readonly hideDelay = input<number>(100);\n readonly disabled = input<boolean>(false);\n\n /** Klass */\n readonly panelKlass = input<string>('px-3 py-2 text-xs text-foreground');\n readonly surfaceKlass = input<string>('rounded-md border border-border bg-bg shadow-md');\n\n /** Events */\n readonly opened = output<void>();\n readonly closed = output<TngTooltipCloseReason>();\n\n readonly open = signal(false);\n\n private showTimer: number | null = null;\n private hideTimer: number | null = null;\n\n /** Resolved template (Option A overrides Option B) */\n readonly tpl = computed(() => this.contentTpl() ?? this.projectedTpl ?? null);\n\n readonly hasContent = computed(() => !!this.tpl() || !!this.text());\n\n private clearTimers() {\n if (this.showTimer != null) {\n window.clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer != null) {\n window.clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private requestOpen() {\n if (this.disabled()) return;\n if (!this.hasContent()) return;\n\n this.clearTimers();\n const delay = Math.max(0, this.showDelay());\n\n this.showTimer = window.setTimeout(() => {\n this.open.set(true);\n this.opened.emit();\n }, delay);\n }\n\n private requestClose(reason: TngTooltipCloseReason) {\n this.clearTimers();\n const delay = Math.max(0, this.hideDelay());\n\n this.hideTimer = window.setTimeout(() => {\n if (!this.open()) return;\n this.open.set(false);\n this.closed.emit(reason);\n }, delay);\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n this.requestOpen();\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n this.requestClose('programmatic');\n }\n\n @HostListener('focusin')\n onFocusIn() {\n this.requestOpen();\n }\n\n @HostListener('focusout')\n onFocusOut() {\n this.requestClose('blur');\n }\n\n @HostListener('document:keydown', ['$event'])\n onDocKeydown(ev: KeyboardEvent) {\n if (!this.open()) return;\n\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.requestClose('escape');\n }\n }\n}\n","<span #triggerEl class=\"inline-flex\">\n <ng-content></ng-content>\n</span>\n\n<tng-connected-overlay\n [open]=\"open()\"\n [anchor]=\"triggerEl\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [width]=\"'anchor'\"\n [closeOnOutsideClick]=\"false\"\n [closeOnEscape]=\"false\"\n>\n <tng-overlay-panel [klass]=\"surfaceKlass() + ' ' + panelKlass()\">\n @if (tpl()) {\n <ng-container [ngTemplateOutlet]=\"tpl()\"></ng-container>\n } @else {\n {{ text() }}\n }\n </tng-overlay-panel>\n</tng-connected-overlay>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,22 +1,135 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, viewChild, computed, signal, Component } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+
5
+ class TngCodeBlock {
6
+ sanitizer = inject(DomSanitizer);
7
+ // -------------------------
8
+ // API
9
+ // -------------------------
10
+ content = input(null, ...(ngDevMode ? [{ debugName: "content" }] : []));
11
+ language = input('text', ...(ngDevMode ? [{ debugName: "language" }] : []));
12
+ showLineNumbers = input(false, ...(ngDevMode ? [{ debugName: "showLineNumbers" }] : []));
13
+ wrap = input(false, ...(ngDevMode ? [{ debugName: "wrap" }] : []));
14
+ highlighter = input(null, ...(ngDevMode ? [{ debugName: "highlighter" }] : []));
15
+ // -------------------------
16
+ // klass hooks
17
+ // -------------------------
18
+ rootKlass = input('', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
19
+ bodyKlass = input('', ...(ngDevMode ? [{ debugName: "bodyKlass" }] : []));
20
+ gutterKlass = input('', ...(ngDevMode ? [{ debugName: "gutterKlass" }] : []));
21
+ preKlass = input('', ...(ngDevMode ? [{ debugName: "preKlass" }] : []));
22
+ codeKlass = input('', ...(ngDevMode ? [{ debugName: "codeKlass" }] : []));
23
+ projectedEl = viewChild('projected', ...(ngDevMode ? [{ debugName: "projectedEl" }] : []));
24
+ code = computed(() => {
25
+ const c = this.content();
26
+ if (c != null)
27
+ return c;
28
+ return this.projectedEl()?.nativeElement?.innerText ?? '';
29
+ }, ...(ngDevMode ? [{ debugName: "code" }] : []));
30
+ lines = computed(() => {
31
+ const text = this.code();
32
+ return text ? text.split(/\r\n|\r|\n/).length : 0;
33
+ }, ...(ngDevMode ? [{ debugName: "lines" }] : []));
34
+ lineNumbers = computed(() => Array.from({ length: this.lines() }, (_, i) => i + 1), ...(ngDevMode ? [{ debugName: "lineNumbers" }] : []));
35
+ /**
36
+ * IMPORTANT:
37
+ * - Without highlighter: return escaped string (safe)
38
+ * - With highlighter: return SafeHtml via bypassSecurityTrustHtml
39
+ * because Shiki uses inline styles which Angular sanitization strips.
40
+ */
41
+ renderedHtml = computed(() => {
42
+ const text = this.code();
43
+ if (!text)
44
+ return '';
45
+ const h = this.highlighter();
46
+ if (!h)
47
+ return this.escapeHtml(text);
48
+ const html = h.highlight(text, this.language());
49
+ return this.sanitizer.bypassSecurityTrustHtml(html);
50
+ }, ...(ngDevMode ? [{ debugName: "renderedHtml" }] : []));
51
+ // -------------------------
52
+ // klass finals
53
+ // -------------------------
54
+ rootKlassFinal = computed(() => this.join('relative rounded-lg border border-border bg-alternate-background text-fg', this.rootKlass()), ...(ngDevMode ? [{ debugName: "rootKlassFinal" }] : []));
55
+ bodyKlassFinal = computed(() => this.join('relative', this.bodyKlass()), ...(ngDevMode ? [{ debugName: "bodyKlassFinal" }] : []));
56
+ gutterKlassFinal = computed(() => this.join('absolute inset-y-0 left-0 w-10 select-none border-r border-border bg-bg px-2 py-4 text-right text-xs leading-6 text-fg/60', this.gutterKlass()), ...(ngDevMode ? [{ debugName: "gutterKlassFinal" }] : []));
57
+ preKlassFinal = computed(() => this.join('overflow-auto p-4 text-xs leading-6 text-fg', this.showLineNumbers() ? 'pl-14' : '', this.wrap() ? 'whitespace-pre-wrap break-words' : 'whitespace-pre', this.preKlass()), ...(ngDevMode ? [{ debugName: "preKlassFinal" }] : []));
58
+ codeKlassFinal = computed(() => this.join('block', this.codeKlass()), ...(ngDevMode ? [{ debugName: "codeKlassFinal" }] : []));
59
+ join(...parts) {
60
+ return parts.map((p) => (p ?? '').trim()).filter(Boolean).join(' ');
61
+ }
62
+ escapeHtml(s) {
63
+ return s
64
+ .replaceAll('&', '&amp;')
65
+ .replaceAll('<', '&lt;')
66
+ .replaceAll('>', '&gt;')
67
+ .replaceAll('"', '&quot;')
68
+ .replaceAll("'", '&#39;');
69
+ }
70
+ copyklass = input('absolute top-2 right-2 px-1 py-1 rounded cursor-pointer text-black text-xs', ...(ngDevMode ? [{ debugName: "copyklass" }] : []));
71
+ copyLabel = input('Copy', ...(ngDevMode ? [{ debugName: "copyLabel" }] : []));
72
+ text = input('', ...(ngDevMode ? [{ debugName: "text" }] : []));
73
+ copied = signal(false, ...(ngDevMode ? [{ debugName: "copied" }] : []));
74
+ copyCode() {
75
+ navigator.clipboard.writeText(this.text()).then(() => {
76
+ this.copied.set(true);
77
+ setTimeout(() => this.copied.set(false), 2000);
78
+ });
7
79
  }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports$1) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./lib"), exports);
80
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngCodeBlock, isStandalone: true, selector: "tng-code-block", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, showLineNumbers: { classPropertyName: "showLineNumbers", publicName: "showLineNumbers", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, highlighter: { classPropertyName: "highlighter", publicName: "highlighter", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, bodyKlass: { classPropertyName: "bodyKlass", publicName: "bodyKlass", isSignal: true, isRequired: false, transformFunction: null }, gutterKlass: { classPropertyName: "gutterKlass", publicName: "gutterKlass", isSignal: true, isRequired: false, transformFunction: null }, preKlass: { classPropertyName: "preKlass", publicName: "preKlass", isSignal: true, isRequired: false, transformFunction: null }, codeKlass: { classPropertyName: "codeKlass", publicName: "codeKlass", isSignal: true, isRequired: false, transformFunction: null }, copyklass: { classPropertyName: "copyklass", publicName: "copyklass", isSignal: true, isRequired: false, transformFunction: null }, copyLabel: { classPropertyName: "copyLabel", publicName: "copyLabel", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "projectedEl", first: true, predicate: ["projected"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"rootKlassFinal()\">\n <div [class]=\"bodyKlassFinal()\">\n @if (showLineNumbers()) {\n <div [class]=\"gutterKlassFinal()\" aria-hidden=\"true\">\n @for (n of lineNumbers(); track n) {\n <div>{{ n }}</div>\n }\n </div>\n }\n\n <pre [class]=\"preKlassFinal()\">\n <span (click)=\"copyCode()\" [class]=\"copyklass()\">\n {{ copyLabel() }}\n</span>\n\n<code [class]=\"codeKlassFinal()\" [innerHTML]=\"renderedHtml()\"></code>\n\n<span #projected class=\"hidden\"><ng-content></ng-content></span>\n </pre>\n </div>\n</div>\n" });
82
+ }
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCodeBlock, decorators: [{
84
+ type: Component,
85
+ args: [{ selector: 'tng-code-block', standalone: true, template: "<div [class]=\"rootKlassFinal()\">\n <div [class]=\"bodyKlassFinal()\">\n @if (showLineNumbers()) {\n <div [class]=\"gutterKlassFinal()\" aria-hidden=\"true\">\n @for (n of lineNumbers(); track n) {\n <div>{{ n }}</div>\n }\n </div>\n }\n\n <pre [class]=\"preKlassFinal()\">\n <span (click)=\"copyCode()\" [class]=\"copyklass()\">\n {{ copyLabel() }}\n</span>\n\n<code [class]=\"codeKlassFinal()\" [innerHTML]=\"renderedHtml()\"></code>\n\n<span #projected class=\"hidden\"><ng-content></ng-content></span>\n </pre>\n </div>\n</div>\n" }]
86
+ }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], showLineNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLineNumbers", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }], highlighter: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlighter", required: false }] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], bodyKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "bodyKlass", required: false }] }], gutterKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutterKlass", required: false }] }], preKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "preKlass", required: false }] }], codeKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "codeKlass", required: false }] }], projectedEl: [{ type: i0.ViewChild, args: ['projected', { isSignal: true }] }], copyklass: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyklass", required: false }] }], copyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyLabel", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
87
+
88
+ class TngCopyButton {
89
+ text = input.required(...(ngDevMode ? [{ debugName: "text" }] : []));
90
+ variant = input('ghost', ...(ngDevMode ? [{ debugName: "variant" }] : []));
91
+ size = input('sm', ...(ngDevMode ? [{ debugName: "size" }] : []));
92
+ /** how long to show "copied" state */
93
+ resetAfterMs = input(1500, ...(ngDevMode ? [{ debugName: "resetAfterMs" }] : []));
94
+ copied = signal(false, ...(ngDevMode ? [{ debugName: "copied" }] : []));
95
+ resetTimer = null;
96
+ async copy() {
97
+ try {
98
+ await navigator.clipboard.writeText(this.text());
99
+ this.copied.set(true);
100
+ if (this.resetTimer)
101
+ window.clearTimeout(this.resetTimer);
102
+ this.resetTimer = window.setTimeout(() => {
103
+ this.copied.set(false);
104
+ this.resetTimer = null;
105
+ }, this.resetAfterMs());
106
+ }
107
+ catch {
108
+ // clipboard may be blocked; ignore
109
+ }
110
+ }
111
+ base = 'inline-flex items-center gap-1.5 font-medium transition select-none';
112
+ sizes = {
113
+ sm: 'px-2 py-1 text-xs',
114
+ md: 'px-3 py-1.5 text-sm',
115
+ };
116
+ variants = {
117
+ ghost: 'text-slate-600 hover:bg-slate-100',
118
+ outline: 'border border-slate-300 text-slate-700 hover:bg-slate-50',
119
+ solid: 'bg-primary text-white hover:opacity-90',
120
+ };
121
+ klass = computed(() => [this.base, this.sizes[this.size()], this.variants[this.variant()]].join(' '), ...(ngDevMode ? [{ debugName: "klass" }] : []));
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCopyButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngCopyButton, isStandalone: true, selector: "tng-copy-button", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, resetAfterMs: { classPropertyName: "resetAfterMs", publicName: "resetAfterMs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<button type=\"button\" (click)=\"copy()\" [class]=\"klass()\">\n @if (!copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content />\n </span>\n }\n\n @if (copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content select=\"[tngCopied]\" />\n </span>\n }\n</button>\n" });
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCopyButton, decorators: [{
126
+ type: Component,
127
+ args: [{ selector: 'tng-copy-button', standalone: true, template: "<button type=\"button\" (click)=\"copy()\" [class]=\"klass()\">\n @if (!copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content />\n </span>\n }\n\n @if (copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content select=\"[tngCopied]\" />\n </span>\n }\n</button>\n" }]
128
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], resetAfterMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetAfterMs", required: false }] }] } });
18
129
 
19
130
  /**
20
131
  * Generated bundle index. Do not edit.
21
132
  */
133
+
134
+ export { TngCodeBlock, TngCopyButton };
22
135
  //# sourceMappingURL=tociva-tailng-ui-utilities.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tociva-tailng-ui-utilities.mjs","sources":["../../../../libs/ui/utilities/src/public-api.ts","../../../../libs/ui/utilities/src/tociva-tailng-ui-utilities.ts"],"sourcesContent":["export * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,EAAA,OAAA,CAAA;;ACAA;;AAEG"}
1
+ {"version":3,"file":"tociva-tailng-ui-utilities.mjs","sources":["../../../../libs/ui/utilities/src/lib/code-block/code-block.component.ts","../../../../libs/ui/utilities/src/lib/code-block/code-block.component.html","../../../../libs/ui/utilities/src/lib/copy-button/copy-button.component.ts","../../../../libs/ui/utilities/src/lib/copy-button/copy-button.component.html","../../../../libs/ui/utilities/src/tociva-tailng-ui-utilities.ts"],"sourcesContent":["import { Component, ElementRef, computed, input, viewChild, inject, signal } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { TngCodeHighlighter, TngCodeLanguage } from './code-highlighter.type';\n\n@Component({\n selector: 'tng-code-block',\n standalone: true,\n templateUrl: './code-block.component.html',\n})\nexport class TngCodeBlock {\n private sanitizer = inject(DomSanitizer);\n\n // -------------------------\n // API\n // -------------------------\n content = input<string | null>(null);\n language = input<TngCodeLanguage>('text');\n showLineNumbers = input<boolean>(false);\n wrap = input<boolean>(false);\n highlighter = input<TngCodeHighlighter | null>(null);\n\n // -------------------------\n // klass hooks\n // -------------------------\n rootKlass = input<string>('');\n bodyKlass = input<string>('');\n gutterKlass = input<string>('');\n preKlass = input<string>('');\n codeKlass = input<string>('');\n\n private projectedEl = viewChild<ElementRef<HTMLElement>>('projected');\n\n readonly code = computed(() => {\n const c = this.content();\n if (c != null) return c;\n return this.projectedEl()?.nativeElement?.innerText ?? '';\n });\n\n readonly lines = computed(() => {\n const text = this.code();\n return text ? text.split(/\\r\\n|\\r|\\n/).length : 0;\n });\n\n readonly lineNumbers = computed(() =>\n Array.from({ length: this.lines() }, (_, i) => i + 1),\n );\n\n /**\n * IMPORTANT:\n * - Without highlighter: return escaped string (safe)\n * - With highlighter: return SafeHtml via bypassSecurityTrustHtml\n * because Shiki uses inline styles which Angular sanitization strips.\n */\n readonly renderedHtml = computed((): string | SafeHtml => {\n const text = this.code();\n if (!text) return '';\n\n const h = this.highlighter();\n if (!h) return this.escapeHtml(text);\n\n const html = h.highlight(text, this.language());\n return this.sanitizer.bypassSecurityTrustHtml(html);\n });\n\n // -------------------------\n // klass finals\n // -------------------------\n readonly rootKlassFinal = computed(() =>\n this.join(\n 'relative rounded-lg border border-border bg-alternate-background text-fg',\n this.rootKlass(),\n ),\n );\n\n readonly bodyKlassFinal = computed(() => this.join('relative', this.bodyKlass()));\n\n readonly gutterKlassFinal = computed(() =>\n this.join(\n 'absolute inset-y-0 left-0 w-10 select-none border-r border-border bg-bg px-2 py-4 text-right text-xs leading-6 text-fg/60',\n this.gutterKlass(),\n ),\n );\n\n readonly preKlassFinal = computed(() =>\n this.join(\n 'overflow-auto p-4 text-xs leading-6 text-fg',\n this.showLineNumbers() ? 'pl-14' : '',\n this.wrap() ? 'whitespace-pre-wrap break-words' : 'whitespace-pre',\n this.preKlass(),\n ),\n );\n\n readonly codeKlassFinal = computed(() => this.join('block', this.codeKlass()));\n\n private join(...parts: Array<string | null | undefined>): string {\n return parts.map((p) => (p ?? '').trim()).filter(Boolean).join(' ');\n }\n\n private escapeHtml(s: string): string {\n return s\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n }\n \ncopyklass = input<string>(\n 'absolute top-2 right-2 px-1 py-1 rounded cursor-pointer text-black text-xs'\n);\n\ncopyLabel = input<string>('Copy');\n\n text = input<string>('');\n copied = signal(false);\n copyCode() {\n navigator.clipboard.writeText(this.text()).then(() => {\n this.copied.set(true);\n setTimeout(() => this.copied.set(false), 2000);\n });\n }\n}\n","<div [class]=\"rootKlassFinal()\">\n <div [class]=\"bodyKlassFinal()\">\n @if (showLineNumbers()) {\n <div [class]=\"gutterKlassFinal()\" aria-hidden=\"true\">\n @for (n of lineNumbers(); track n) {\n <div>{{ n }}</div>\n }\n </div>\n }\n\n <pre [class]=\"preKlassFinal()\">\n <span (click)=\"copyCode()\" [class]=\"copyklass()\">\n {{ copyLabel() }}\n</span>\n\n<code [class]=\"codeKlassFinal()\" [innerHTML]=\"renderedHtml()\"></code>\n\n<span #projected class=\"hidden\"><ng-content></ng-content></span>\n </pre>\n </div>\n</div>\n","import { Component, computed, input, signal } from '@angular/core';\n\ntype CopyButtonVariant = 'ghost' | 'outline' | 'solid';\ntype CopyButtonSize = 'sm' | 'md';\n\n@Component({\n selector: 'tng-copy-button',\n standalone: true,\n templateUrl: './copy-button.component.html',\n})\nexport class TngCopyButton {\n text = input.required<string>();\n\n variant = input<CopyButtonVariant>('ghost');\n size = input<CopyButtonSize>('sm');\n\n /** how long to show \"copied\" state */\n resetAfterMs = input<number>(1500);\n\n copied = signal(false);\n private resetTimer: number | null = null;\n\n async copy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.text());\n this.copied.set(true);\n\n if (this.resetTimer) window.clearTimeout(this.resetTimer);\n this.resetTimer = window.setTimeout(() => {\n this.copied.set(false);\n this.resetTimer = null;\n }, this.resetAfterMs());\n } catch {\n // clipboard may be blocked; ignore\n }\n }\n\n private base = 'inline-flex items-center gap-1.5 font-medium transition select-none';\n private sizes: Record<CopyButtonSize, string> = {\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-sm',\n };\n private variants: Record<CopyButtonVariant, string> = {\n ghost: 'text-slate-600 hover:bg-slate-100',\n outline: 'border border-slate-300 text-slate-700 hover:bg-slate-50',\n solid: 'bg-primary text-white hover:opacity-90',\n };\n\n klass = computed(() => [this.base, this.sizes[this.size()], this.variants[this.variant()]].join(' '));\n}\n","<button type=\"button\" (click)=\"copy()\" [class]=\"klass()\">\n @if (!copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content />\n </span>\n }\n\n @if (copied()) {\n <span class=\"inline-flex items-center gap-1.5\">\n <ng-content select=\"[tngCopied]\" />\n </span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,22 +1,20 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports$1) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./info/info.component"), exports);
1
+ import * as i0 from '@angular/core';
2
+ import { Component } from '@angular/core';
3
+
4
+ class TngInfo {
5
+ docsUrl = 'https://tailng.dev';
6
+ githubUrl = 'https://github.com/tociva/tailng';
7
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngInfo, deps: [], target: i0.ɵɵFactoryTarget.Component });
8
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: TngInfo, isStandalone: true, selector: "tng-info", ngImport: i0, template: "<div class=\"rounded border p-4 text-sm\">\n <h3 class=\"font-semibold\">tailng UI</h3>\n\n <p class=\"mt-2\">\n A modern Angular UI library powered by Tailwind CSS.\n </p>\n\n <ul class=\"mt-3 space-y-1\">\n <li>\n Docs:\n <a [href]=\"docsUrl\" target=\"_blank\" class=\"underline\">\n {{ docsUrl }}\n </a>\n </li>\n <li>\n GitHub:\n <a [href]=\"githubUrl\" target=\"_blank\" class=\"underline\">\n {{ githubUrl }}\n </a>\n </li>\n </ul>\n</div>" });
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngInfo, decorators: [{
11
+ type: Component,
12
+ args: [{ standalone: true, selector: 'tng-info', template: "<div class=\"rounded border p-4 text-sm\">\n <h3 class=\"font-semibold\">tailng UI</h3>\n\n <p class=\"mt-2\">\n A modern Angular UI library powered by Tailwind CSS.\n </p>\n\n <ul class=\"mt-3 space-y-1\">\n <li>\n Docs:\n <a [href]=\"docsUrl\" target=\"_blank\" class=\"underline\">\n {{ docsUrl }}\n </a>\n </li>\n <li>\n GitHub:\n <a [href]=\"githubUrl\" target=\"_blank\" class=\"underline\">\n {{ githubUrl }}\n </a>\n </li>\n </ul>\n</div>" }]
13
+ }] });
18
14
 
19
15
  /**
20
16
  * Generated bundle index. Do not edit.
21
17
  */
18
+
19
+ export { TngInfo };
22
20
  //# sourceMappingURL=tociva-tailng-ui.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tociva-tailng-ui.mjs","sources":["../../../../libs/ui/src/public-api.ts","../../../../libs/ui/src/tociva-tailng-ui.ts"],"sourcesContent":["export * from './info/info.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,YAAA,CAAA,OAAA,CAAA,uBAAA,CAAA,EAAA,OAAA,CAAA;;ACAA;;AAEG"}
1
+ {"version":3,"file":"tociva-tailng-ui.mjs","sources":["../../../../libs/ui/src/info/info.component.ts","../../../../libs/ui/src/info/info.component.html","../../../../libs/ui/src/tociva-tailng-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n standalone: true,\n selector: 'tng-info',\n templateUrl: './info.component.html',\n})\nexport class TngInfo {\n readonly docsUrl = 'https://tailng.dev';\n readonly githubUrl = 'https://github.com/tociva/tailng';\n}","<div class=\"rounded border p-4 text-sm\">\n <h3 class=\"font-semibold\">tailng UI</h3>\n\n <p class=\"mt-2\">\n A modern Angular UI library powered by Tailwind CSS.\n </p>\n\n <ul class=\"mt-3 space-y-1\">\n <li>\n Docs:\n <a [href]=\"docsUrl\" target=\"_blank\" class=\"underline\">\n {{ docsUrl }}\n </a>\n </li>\n <li>\n GitHub:\n <a [href]=\"githubUrl\" target=\"_blank\" class=\"underline\">\n {{ githubUrl }}\n </a>\n </li>\n </ul>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAOa,OAAO,CAAA;IACT,OAAO,GAAG,oBAAoB;IAC9B,SAAS,GAAG,kCAAkC;uGAF5C,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,oECPpB,ggBAqBM,EAAA,CAAA;;2FDdO,OAAO,EAAA,UAAA,EAAA,CAAA;kBALnB,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,YACN,UAAU,EAAA,QAAA,EAAA,ggBAAA,EAAA;;;AEJtB;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tociva/tailng-ui",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Modern Angular UI components powered by Tailwind CSS",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -16,7 +16,7 @@
16
16
  "@angular/core": "^21.0.0",
17
17
  "@angular/common": "^21.0.0",
18
18
  "@angular/forms": "^21.0.0",
19
- "@tociva/tailng-cdk": "^0.11.0"
19
+ "@tociva/tailng-cdk": "^0.12.0"
20
20
  },
21
21
  "dependencies": {
22
22
  "tslib": "^2.6.0"