ngx-com 0.0.21 → 0.1.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.
Files changed (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-tooltip.mjs","sources":["../../../projects/com/components/tooltip/tooltip.variants.ts","../../../projects/com/components/tooltip/tooltip.utils.ts","../../../projects/com/components/tooltip/tooltip-panel.component.ts","../../../projects/com/components/tooltip/tooltip.directive.ts","../../../projects/com/components/tooltip/index.ts","../../../projects/com/components/tooltip/ngx-com-components-tooltip.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { TooltipColor, TooltipSize, TooltipSide } from './tooltip.models';\n\n/**\n * CVA variants for the tooltip panel wrapper.\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n */\nexport const tooltipPanelVariants: (props?: {\n color?: TooltipColor;\n size?: TooltipSize;\n}) => string = cva(\n [\n 'com-tooltip-panel',\n 'z-50',\n 'pointer-events-auto',\n 'select-none',\n 'leading-normal',\n ],\n {\n variants: {\n color: {\n default: 'bg-tooltip text-tooltip-foreground',\n primary: 'bg-primary text-primary-foreground',\n accent: 'bg-accent text-accent-foreground',\n warn: 'bg-warn text-warn-foreground',\n invert: 'bg-popover text-popover-foreground border border-border shadow-md',\n },\n size: {\n sm: 'px-2 py-1 text-xs max-w-48 rounded-md',\n md: 'px-3 py-1.5 text-sm max-w-64 rounded-lg',\n lg: 'px-4 py-2.5 text-sm max-w-80 rounded-xl',\n },\n },\n defaultVariants: {\n color: 'default',\n size: 'md',\n },\n },\n);\n\n/**\n * CVA variants for the tooltip arrow element.\n * The arrow points toward the trigger element.\n *\n * @tokens `--color-tooltip`, `--color-primary`, `--color-accent`, `--color-warn`,\n * `--color-popover`, `--color-border`\n */\nexport const tooltipArrowVariants: (props?: {\n color?: TooltipColor;\n side?: TooltipSide;\n}) => string = cva('absolute size-2 rotate-45', {\n variants: {\n color: {\n default: 'bg-tooltip',\n primary: 'bg-primary',\n accent: 'bg-accent',\n warn: 'bg-warn',\n invert: 'bg-popover border-l border-t border-border',\n },\n side: {\n // Arrow points DOWN (tooltip is above trigger)\n top: 'left-1/2 -translate-x-1/2 bottom-0 translate-y-1/2',\n // Arrow points UP (tooltip is below trigger)\n bottom: 'left-1/2 -translate-x-1/2 top-0 -translate-y-1/2',\n // Arrow points RIGHT (tooltip is left of trigger)\n left: 'top-1/2 -translate-y-1/2 right-0 translate-x-1/2',\n // Arrow points LEFT (tooltip is right of trigger)\n right: 'top-1/2 -translate-y-1/2 left-0 -translate-x-1/2',\n },\n },\n compoundVariants: [\n // Invert arrow needs different rotation for border visibility\n { color: 'invert', side: 'top', class: 'rotate-[225deg]' },\n { color: 'invert', side: 'bottom', class: 'rotate-45' },\n { color: 'invert', side: 'left', class: 'rotate-[135deg]' },\n { color: 'invert', side: 'right', class: '-rotate-45' },\n ],\n defaultVariants: {\n color: 'default',\n side: 'top',\n },\n});\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet tooltipIdCounter = 0;\n\n/**\n * Generate a unique ID for a tooltip instance.\n */\nexport function generateTooltipId(): string {\n return `tooltip-${++tooltipIdCounter}`;\n}\n","import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport type { Signal, TemplateRef, WritableSignal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { tooltipPanelVariants, tooltipArrowVariants } from './tooltip.variants';\nimport type { TooltipColor, TooltipSize, TooltipSide, TooltipTemplateContext } from './tooltip.models';\nimport { mergeClasses } from './tooltip.utils';\n\n/**\n * Internal tooltip panel component rendered inside the CDK overlay.\n * Receives content (string or template) and variant inputs from the directive.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n */\n@Component({\n selector: 'com-tooltip-panel',\n template: `\n <div\n class=\"relative\"\n [attr.data-state]=\"visible() ? 'visible' : 'hidden'\"\n [attr.data-side]=\"activeSide()\"\n >\n @if (showArrow()) {\n <span [class]=\"arrowClasses()\" aria-hidden=\"true\"></span>\n }\n <div\n [class]=\"panelClasses()\"\n role=\"tooltip\"\n [attr.id]=\"tooltipId()\"\n >\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n {{ textContent() }}\n }\n </div>\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n /* Animation styles */\n [data-state='visible'] {\n animation: tooltip-in 120ms ease-out;\n }\n\n [data-state='hidden'] {\n animation: tooltip-out 80ms ease-in forwards;\n }\n\n /* Transform origin based on side */\n [data-side='top'] {\n transform-origin: bottom center;\n }\n\n [data-side='bottom'] {\n transform-origin: top center;\n }\n\n [data-side='left'] {\n transform-origin: right center;\n }\n\n [data-side='right'] {\n transform-origin: left center;\n }\n\n @keyframes tooltip-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes tooltip-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='visible'],\n [data-state='hidden'] {\n animation: none;\n }\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TooltipPanelComponent {\n /** Plain text content to display. */\n readonly textContent: WritableSignal<string> = signal('');\n\n /** Optional template for rich content. */\n readonly templateRef: WritableSignal<TemplateRef<TooltipTemplateContext> | null> = signal(null);\n\n /** Color variant. */\n readonly color: WritableSignal<TooltipColor> = signal<TooltipColor>('default');\n\n /** Size variant. */\n readonly size: WritableSignal<TooltipSize> = signal<TooltipSize>('md');\n\n /** Whether to show the arrow. */\n readonly showArrow: WritableSignal<boolean> = signal(true);\n\n /** Which side the tooltip is positioned on. */\n readonly activeSide: WritableSignal<TooltipSide> = signal<TooltipSide>('top');\n\n /** Unique ID for accessibility. */\n readonly tooltipId: WritableSignal<string> = signal('');\n\n /** Whether the tooltip is visible (for animation state). */\n readonly visible: WritableSignal<boolean> = signal(false);\n\n /** Function to hide the tooltip (passed to template context). */\n readonly hideFn: WritableSignal<() => void> = signal(() => {});\n\n /** Computed template context. */\n protected readonly templateContext: Signal<TooltipTemplateContext> = computed(() => ({\n $implicit: this.textContent(),\n hide: this.hideFn(),\n }));\n\n /** Computed panel CSS classes. */\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(\n tooltipPanelVariants({\n color: this.color(),\n size: this.size(),\n }),\n ),\n );\n\n /** Computed arrow CSS classes. */\n protected readonly arrowClasses: Signal<string> = computed(() =>\n mergeClasses(\n tooltipArrowVariants({\n color: this.color(),\n side: this.activeSide(),\n }),\n ),\n );\n}\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n Renderer2,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n TemplateRef,\n WritableSignal,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport type { ConnectedPosition, ConnectedOverlayPositionChange, ConnectionPositionPair, FlexibleConnectedPositionStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { TooltipPanelComponent } from './tooltip-panel.component';\nimport { generateTooltipId } from './tooltip.utils';\nimport type {\n TooltipColor,\n TooltipPosition,\n TooltipSize,\n TooltipSide,\n TooltipTemplateContext,\n TooltipTouchGestures,\n} from './tooltip.models';\n\n/** Default show delay in milliseconds. */\nconst DEFAULT_SHOW_DELAY = 200;\n\n/** Default hide delay in milliseconds. */\nconst DEFAULT_HIDE_DELAY = 100;\n\n/** Offset between trigger and tooltip in pixels. */\nconst TOOLTIP_OFFSET = 8;\n\n/** Viewport margin in pixels. */\nconst VIEWPORT_MARGIN = 8;\n\n/**\n * Build position strategy entries for the tooltip.\n * Primary position is the preferred direction, with fallbacks.\n */\nfunction buildTooltipPositions(position: TooltipPosition): ConnectedPosition[] {\n const positions: Record<TooltipPosition, ConnectedPosition[]> = {\n top: [\n // Top center (preferred)\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n // Bottom center (flip)\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n // Right center (fallback)\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n // Left center (fallback)\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n ],\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n ],\n left: [\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n ],\n right: [\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n ],\n };\n\n return positions[position];\n}\n\n/**\n * Derive the tooltip side from a position change event.\n */\nfunction deriveSideFromPosition(pair: ConnectionPositionPair): TooltipSide {\n if (pair.originY === 'top' && pair.overlayY === 'bottom') return 'top';\n if (pair.originY === 'bottom' && pair.overlayY === 'top') return 'bottom';\n if (pair.originX === 'start' && pair.overlayX === 'end') return 'left';\n if (pair.originX === 'end' && pair.overlayX === 'start') return 'right';\n return 'top';\n}\n\n/**\n * Tooltip directive — displays supplementary information on hover/focus.\n *\n * Applied as an attribute directive to any trigger element. The tooltip panel\n * is rendered via CDK Overlay when triggered by mouse hover, keyboard focus,\n * or programmatically.\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n *\n * @example Simple text tooltip\n * ```html\n * <button comTooltip=\"Save your changes\">\n * <com-icon name=\"save\" />\n * </button>\n * ```\n *\n * @example Positioned\n * ```html\n * <button comTooltip=\"Settings\" comTooltipPosition=\"right\">\n * <com-icon name=\"settings\" />\n * </button>\n * ```\n *\n * @example Color variants\n * ```html\n * <com-icon name=\"alert-triangle\" comTooltip=\"3 warnings found\" comTooltipColor=\"warn\" />\n * ```\n *\n * @example Custom template\n * ```html\n * <button\n * comTooltip=\"Keyboard shortcuts\"\n * [comTooltipTpl]=\"shortcutsTpl\"\n * comTooltipSize=\"lg\"\n * >\n * <com-icon name=\"keyboard\" />\n * </button>\n *\n * <ng-template #shortcutsTpl let-hide=\"hide\">\n * <div class=\"flex flex-col gap-1\">\n * <span>Press Ctrl+S to save</span>\n * <button (click)=\"hide()\">Got it</button>\n * </div>\n * </ng-template>\n * ```\n *\n * @example Programmatic control\n * ```html\n * <input\n * #tooltipRef=\"comTooltip\"\n * comTooltip=\"Invalid email\"\n * comTooltipColor=\"warn\"\n * [comTooltipDisabled]=\"true\"\n * />\n * ```\n *\n * ```ts\n * // Show tooltip on validation error\n * if (emailInvalid) {\n * this.tooltipRef.show();\n * }\n * ```\n */\n@Directive({\n selector: '[comTooltip]',\n exportAs: 'comTooltip',\n host: {\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focusin)': 'onFocusIn()',\n '(focusout)': 'onFocusOut()',\n '(keydown.escape)': 'onEscapeKey()',\n '(touchstart)': 'onTouchStart($event)',\n },\n})\nexport class ComTooltip {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly renderer = inject(Renderer2);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n\n private overlayRef: OverlayRef | null = null;\n private panelInstance: TooltipPanelComponent | null = null;\n private showTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private hideTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private touchTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private readonly tooltipId = generateTooltipId();\n\n /** Current active side (updated from position changes). */\n private readonly activeSide: WritableSignal<TooltipSide> = signal<TooltipSide>('top');\n\n /** Whether the tooltip is currently visible. */\n private readonly isVisible: WritableSignal<boolean> = signal(false);\n\n // ─── Content Inputs ───\n\n /** Simple text content for the tooltip. Also serves as the directive selector. */\n readonly comTooltip: InputSignal<string> = input.required<string>();\n\n /** Custom template for rich tooltip content. Takes precedence over text when provided. */\n readonly comTooltipTpl: InputSignal<TemplateRef<TooltipTemplateContext> | null> =\n input<TemplateRef<TooltipTemplateContext> | null>(null);\n\n // ─── Positioning Inputs ───\n\n /** Preferred position direction. Default: 'top'. */\n readonly comTooltipPosition: InputSignal<TooltipPosition> = input<TooltipPosition>('top');\n\n // ─── Behavior Inputs ───\n\n /** Delay in ms before showing the tooltip. Default: 200. */\n readonly comTooltipShowDelay: InputSignalWithTransform<number, unknown> = input(DEFAULT_SHOW_DELAY, {\n transform: numberAttribute,\n });\n\n /** Delay in ms before hiding the tooltip. Default: 100. */\n readonly comTooltipHideDelay: InputSignalWithTransform<number, unknown> = input(DEFAULT_HIDE_DELAY, {\n transform: numberAttribute,\n });\n\n /** Disable the tooltip entirely. Default: false. */\n readonly comTooltipDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Touch device handling. Default: 'auto'. */\n readonly comTooltipTouchGestures: InputSignal<TooltipTouchGestures> = input<TooltipTouchGestures>('auto');\n\n // ─── Variant Inputs ───\n\n /** Color variant. Default: 'default'. */\n readonly comTooltipColor: InputSignal<TooltipColor> = input<TooltipColor>('default');\n\n /** Size variant. Default: 'md'. */\n readonly comTooltipSize: InputSignal<TooltipSize> = input<TooltipSize>('md');\n\n /** Whether to show the arrow/caret. Default: true. */\n readonly comTooltipHasArrow: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Outputs ───\n\n /** Emitted when the tooltip becomes visible (after delay + animation). */\n readonly comTooltipShown: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the tooltip is fully hidden. */\n readonly comTooltipHidden: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.clearTimers();\n this.disposeOverlay();\n });\n }\n\n // ─── Public API ───\n\n /** Programmatically show the tooltip (ignores disabled state for error validation use cases). */\n show(): void {\n if (this.isVisible()) return;\n this.clearTimers();\n this.createOverlay();\n this.attachPanel();\n }\n\n /** Programmatically hide the tooltip. */\n hide(): void {\n if (!this.isVisible()) return;\n this.clearTimers();\n this.detachPanel();\n }\n\n // ─── Event Handlers ───\n\n protected onMouseEnter(): void {\n if (this.comTooltipDisabled()) return;\n this.scheduleShow(this.comTooltipShowDelay());\n }\n\n protected onMouseLeave(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n protected onFocusIn(): void {\n if (this.comTooltipDisabled()) return;\n // Keyboard users get instant feedback\n this.scheduleShow(0);\n }\n\n protected onFocusOut(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n protected onEscapeKey(): void {\n if (this.isVisible()) {\n this.hide();\n }\n }\n\n protected onTouchStart(event: TouchEvent): void {\n const touchMode = this.comTooltipTouchGestures();\n if (touchMode === 'off' || this.comTooltipDisabled()) return;\n\n // Long-press to show (500ms)\n this.clearTimers();\n this.touchTimeoutId = setTimeout(() => {\n this.show();\n\n // Set up tap-elsewhere to hide\n const touchEndHandler = (e: Event): void => {\n const touch = (e as TouchEvent).changedTouches?.[0];\n if (touch) {\n const target = this.document.elementFromPoint(touch.clientX, touch.clientY);\n if (!this.overlayRef?.overlayElement.contains(target)) {\n this.hide();\n }\n }\n this.document.removeEventListener('touchend', touchEndHandler);\n };\n this.document.addEventListener('touchend', touchEndHandler);\n }, 500);\n\n // Cancel long-press if finger moves\n const touchMoveHandler = (): void => {\n this.clearTouchTimeout();\n this.document.removeEventListener('touchmove', touchMoveHandler);\n };\n this.document.addEventListener('touchmove', touchMoveHandler);\n\n // Cancel long-press if finger lifts before timeout\n const touchEndCancelHandler = (): void => {\n this.clearTouchTimeout();\n this.document.removeEventListener('touchend', touchEndCancelHandler);\n };\n this.document.addEventListener('touchend', touchEndCancelHandler);\n }\n\n // ─── Panel Mouse Events ───\n\n /** Called when mouse enters the tooltip panel. */\n private onPanelMouseEnter(): void {\n // Cancel hide timer when hovering over panel (for interactive templates)\n this.clearHideTimeout();\n }\n\n /** Called when mouse leaves the tooltip panel. */\n private onPanelMouseLeave(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n // ─── Timer Management ───\n\n private scheduleShow(delay: number): void {\n this.clearTimers();\n if (delay === 0) {\n this.createOverlay();\n this.attachPanel();\n } else {\n this.showTimeoutId = setTimeout(() => {\n this.createOverlay();\n this.attachPanel();\n }, delay);\n }\n }\n\n private scheduleHide(delay: number): void {\n this.clearShowTimeout();\n if (!this.isVisible()) return;\n\n if (delay === 0) {\n this.detachPanel();\n } else {\n this.hideTimeoutId = setTimeout(() => {\n this.detachPanel();\n }, delay);\n }\n }\n\n private clearTimers(): void {\n this.clearShowTimeout();\n this.clearHideTimeout();\n this.clearTouchTimeout();\n }\n\n private clearShowTimeout(): void {\n if (this.showTimeoutId !== null) {\n clearTimeout(this.showTimeoutId);\n this.showTimeoutId = null;\n }\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeoutId !== null) {\n clearTimeout(this.hideTimeoutId);\n this.hideTimeoutId = null;\n }\n }\n\n private clearTouchTimeout(): void {\n if (this.touchTimeoutId !== null) {\n clearTimeout(this.touchTimeoutId);\n this.touchTimeoutId = null;\n }\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n if (!isPlatformBrowser(this.platformId)) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(buildTooltipPositions(this.comTooltipPosition()))\n .withFlexibleDimensions(false)\n .withPush(true)\n .withViewportMargin(VIEWPORT_MARGIN);\n\n const scrollStrategy = this.overlay.scrollStrategies.reposition({ autoClose: true });\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n panelClass: 'com-tooltip-overlay',\n hasBackdrop: false,\n });\n\n // Track position changes for arrow orientation\n (positionStrategy as FlexibleConnectedPositionStrategy).positionChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((change: ConnectedOverlayPositionChange) => {\n const side = deriveSideFromPosition(change.connectionPair);\n this.activeSide.set(side);\n if (this.panelInstance) {\n this.panelInstance.activeSide.set(side);\n }\n });\n\n // Close when overlay detaches\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.handleDetachment();\n });\n }\n\n private attachPanel(): void {\n if (!this.overlayRef || this.overlayRef.hasAttached()) return;\n\n const portal = new ComponentPortal(TooltipPanelComponent, this.viewContainerRef, this.injector);\n const componentRef = this.overlayRef.attach(portal);\n this.panelInstance = componentRef.instance;\n\n // Configure panel inputs\n this.panelInstance.textContent.set(this.comTooltip());\n this.panelInstance.templateRef.set(this.comTooltipTpl());\n this.panelInstance.color.set(this.comTooltipColor());\n this.panelInstance.size.set(this.comTooltipSize());\n this.panelInstance.showArrow.set(this.comTooltipHasArrow());\n this.panelInstance.activeSide.set(this.activeSide());\n this.panelInstance.tooltipId.set(this.tooltipId);\n this.panelInstance.hideFn.set(() => this.hide());\n\n // Set up panel mouse events for interactive templates\n const overlayElement = this.overlayRef.overlayElement;\n this.renderer.listen(overlayElement, 'mouseenter', () => this.onPanelMouseEnter());\n this.renderer.listen(overlayElement, 'mouseleave', () => this.onPanelMouseLeave());\n\n // Set ARIA on trigger\n this.renderer.setAttribute(this.elementRef.nativeElement, 'aria-describedby', this.tooltipId);\n\n // Trigger show animation after a microtask (allows initial styles to apply)\n requestAnimationFrame(() => {\n if (this.panelInstance) {\n this.panelInstance.visible.set(true);\n }\n });\n\n this.isVisible.set(true);\n this.comTooltipShown.emit();\n }\n\n private detachPanel(): void {\n if (!this.panelInstance) return;\n\n // Trigger hide animation\n this.panelInstance.visible.set(false);\n\n // Wait for animation to complete before detaching\n setTimeout(() => {\n this.disposeOverlay();\n }, 80); // Match animation duration\n }\n\n private handleDetachment(): void {\n // Remove ARIA from trigger\n this.renderer.removeAttribute(this.elementRef.nativeElement, 'aria-describedby');\n\n this.isVisible.set(false);\n this.panelInstance = null;\n this.comTooltipHidden.emit();\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelInstance = null;\n this.isVisible.set(false);\n\n // Remove ARIA from trigger\n this.renderer.removeAttribute(this.elementRef.nativeElement, 'aria-describedby');\n }\n}\n","// Public API for the tooltip directive\n\n// Main directive\nexport { ComTooltip } from './tooltip.directive';\n\n// Types and interfaces\nexport type {\n TooltipPosition,\n TooltipColor,\n TooltipSize,\n TooltipTouchGestures,\n TooltipTemplateContext,\n} from './tooltip.models';\n\n// Variants (for advanced customization)\nexport { tooltipPanelVariants, tooltipArrowVariants } from './tooltip.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-tooltip.mjs","sources":["../../../projects/com/components/tooltip/tooltip.variants.ts","../../../projects/com/components/tooltip/tooltip.utils.ts","../../../projects/com/components/tooltip/tooltip-panel.component.ts","../../../projects/com/components/tooltip/tooltip.directive.ts","../../../projects/com/components/tooltip/index.ts","../../../projects/com/components/tooltip/ngx-com-components-tooltip.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { TooltipColor, TooltipSize, TooltipSide } from './tooltip.models';\n\n/**\n * CVA variants for the tooltip panel wrapper.\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n */\nexport const tooltipPanelVariants: (props?: {\n color?: TooltipColor;\n size?: TooltipSize;\n}) => string = cva(\n [\n 'com-tooltip-panel',\n 'z-50',\n 'pointer-events-auto',\n 'select-none',\n 'leading-normal',\n ],\n {\n variants: {\n color: {\n default: 'bg-tooltip text-tooltip-foreground',\n primary: 'bg-primary text-primary-foreground',\n accent: 'bg-accent text-accent-foreground',\n warn: 'bg-warn text-warn-foreground',\n invert: 'bg-popover text-popover-foreground border border-border shadow-overlay',\n },\n size: {\n sm: 'px-2 py-1 text-xs max-w-48 rounded-popover',\n md: 'px-3 py-1.5 text-sm max-w-64 rounded-popover',\n lg: 'px-4 py-2.5 text-sm max-w-80 rounded-popover',\n },\n },\n defaultVariants: {\n color: 'default',\n size: 'md',\n },\n },\n);\n\n/**\n * CVA variants for the tooltip arrow element.\n * The arrow points toward the trigger element.\n *\n * @tokens `--color-tooltip`, `--color-primary`, `--color-accent`, `--color-warn`,\n * `--color-popover`, `--color-border`\n */\nexport const tooltipArrowVariants: (props?: {\n color?: TooltipColor;\n side?: TooltipSide;\n}) => string = cva('absolute size-2 rotate-45', {\n variants: {\n color: {\n default: 'bg-tooltip',\n primary: 'bg-primary',\n accent: 'bg-accent',\n warn: 'bg-warn',\n invert: 'bg-popover border-l border-t border-border',\n },\n side: {\n // Arrow points DOWN (tooltip is above trigger)\n top: 'left-1/2 -translate-x-1/2 bottom-0 translate-y-1/2',\n // Arrow points UP (tooltip is below trigger)\n bottom: 'left-1/2 -translate-x-1/2 top-0 -translate-y-1/2',\n // Arrow points RIGHT (tooltip is left of trigger)\n left: 'top-1/2 -translate-y-1/2 right-0 translate-x-1/2',\n // Arrow points LEFT (tooltip is right of trigger)\n right: 'top-1/2 -translate-y-1/2 left-0 -translate-x-1/2',\n },\n },\n compoundVariants: [\n // Invert arrow needs different rotation for border visibility\n { color: 'invert', side: 'top', class: 'rotate-[225deg]' },\n { color: 'invert', side: 'bottom', class: 'rotate-45' },\n { color: 'invert', side: 'left', class: 'rotate-[135deg]' },\n { color: 'invert', side: 'right', class: '-rotate-45' },\n ],\n defaultVariants: {\n color: 'default',\n side: 'top',\n },\n});\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet tooltipIdCounter = 0;\n\n/**\n * Generate a unique ID for a tooltip instance.\n */\nexport function generateTooltipId(): string {\n return `tooltip-${++tooltipIdCounter}`;\n}\n","import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport type { Signal, TemplateRef, WritableSignal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { tooltipPanelVariants, tooltipArrowVariants } from './tooltip.variants';\nimport type { TooltipColor, TooltipSize, TooltipSide, TooltipTemplateContext } from './tooltip.models';\nimport { mergeClasses } from './tooltip.utils';\n\n/**\n * Internal tooltip panel component rendered inside the CDK overlay.\n * Receives content (string or template) and variant inputs from the directive.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n */\n@Component({\n selector: 'com-tooltip-panel',\n template: `\n <div\n class=\"relative\"\n [attr.data-state]=\"visible() ? 'visible' : 'hidden'\"\n [attr.data-side]=\"activeSide()\"\n >\n @if (showArrow()) {\n <span [class]=\"arrowClasses()\" aria-hidden=\"true\"></span>\n }\n <div\n [class]=\"panelClasses()\"\n role=\"tooltip\"\n [attr.id]=\"tooltipId()\"\n >\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n {{ textContent() }}\n }\n </div>\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n /* Animation styles */\n [data-state='visible'] {\n animation: tooltip-in 120ms ease-out;\n }\n\n [data-state='hidden'] {\n animation: tooltip-out 80ms ease-in forwards;\n }\n\n /* Transform origin based on side */\n [data-side='top'] {\n transform-origin: bottom center;\n }\n\n [data-side='bottom'] {\n transform-origin: top center;\n }\n\n [data-side='left'] {\n transform-origin: right center;\n }\n\n [data-side='right'] {\n transform-origin: left center;\n }\n\n @keyframes tooltip-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes tooltip-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='visible'],\n [data-state='hidden'] {\n animation: none;\n }\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TooltipPanelComponent {\n /** Plain text content to display. */\n readonly textContent: WritableSignal<string> = signal('');\n\n /** Optional template for rich content. */\n readonly templateRef: WritableSignal<TemplateRef<TooltipTemplateContext> | null> = signal(null);\n\n /** Color variant. */\n readonly color: WritableSignal<TooltipColor> = signal<TooltipColor>('default');\n\n /** Size variant. */\n readonly size: WritableSignal<TooltipSize> = signal<TooltipSize>('md');\n\n /** Whether to show the arrow. */\n readonly showArrow: WritableSignal<boolean> = signal(true);\n\n /** Which side the tooltip is positioned on. */\n readonly activeSide: WritableSignal<TooltipSide> = signal<TooltipSide>('top');\n\n /** Unique ID for accessibility. */\n readonly tooltipId: WritableSignal<string> = signal('');\n\n /** Whether the tooltip is visible (for animation state). */\n readonly visible: WritableSignal<boolean> = signal(false);\n\n /** Function to hide the tooltip (passed to template context). */\n readonly hideFn: WritableSignal<() => void> = signal(() => {});\n\n /** Computed template context. */\n protected readonly templateContext: Signal<TooltipTemplateContext> = computed(() => ({\n $implicit: this.textContent(),\n hide: this.hideFn(),\n }));\n\n /** Computed panel CSS classes. */\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(\n tooltipPanelVariants({\n color: this.color(),\n size: this.size(),\n }),\n ),\n );\n\n /** Computed arrow CSS classes. */\n protected readonly arrowClasses: Signal<string> = computed(() =>\n mergeClasses(\n tooltipArrowVariants({\n color: this.color(),\n side: this.activeSide(),\n }),\n ),\n );\n}\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n Renderer2,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n TemplateRef,\n WritableSignal,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport type { ConnectedPosition, ConnectedOverlayPositionChange, ConnectionPositionPair, FlexibleConnectedPositionStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { TooltipPanelComponent } from './tooltip-panel.component';\nimport { generateTooltipId } from './tooltip.utils';\nimport type {\n TooltipColor,\n TooltipPosition,\n TooltipSize,\n TooltipSide,\n TooltipTemplateContext,\n TooltipTouchGestures,\n} from './tooltip.models';\n\n/** Default show delay in milliseconds. */\nconst DEFAULT_SHOW_DELAY = 200;\n\n/** Default hide delay in milliseconds. */\nconst DEFAULT_HIDE_DELAY = 100;\n\n/** Offset between trigger and tooltip in pixels. */\nconst TOOLTIP_OFFSET = 8;\n\n/** Viewport margin in pixels. */\nconst VIEWPORT_MARGIN = 8;\n\n/**\n * Build position strategy entries for the tooltip.\n * Primary position is the preferred direction, with fallbacks.\n */\nfunction buildTooltipPositions(position: TooltipPosition): ConnectedPosition[] {\n const positions: Record<TooltipPosition, ConnectedPosition[]> = {\n top: [\n // Top center (preferred)\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n // Bottom center (flip)\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n // Right center (fallback)\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n // Left center (fallback)\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n ],\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n ],\n left: [\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n ],\n right: [\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: TOOLTIP_OFFSET },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -TOOLTIP_OFFSET },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: TOOLTIP_OFFSET },\n ],\n };\n\n return positions[position];\n}\n\n/**\n * Derive the tooltip side from a position change event.\n */\nfunction deriveSideFromPosition(pair: ConnectionPositionPair): TooltipSide {\n if (pair.originY === 'top' && pair.overlayY === 'bottom') return 'top';\n if (pair.originY === 'bottom' && pair.overlayY === 'top') return 'bottom';\n if (pair.originX === 'start' && pair.overlayX === 'end') return 'left';\n if (pair.originX === 'end' && pair.overlayX === 'start') return 'right';\n return 'top';\n}\n\n/**\n * Tooltip directive — displays supplementary information on hover/focus.\n *\n * Applied as an attribute directive to any trigger element. The tooltip panel\n * is rendered via CDK Overlay when triggered by mouse hover, keyboard focus,\n * or programmatically.\n *\n * @tokens `--color-tooltip`, `--color-tooltip-foreground`, `--color-primary`, `--color-primary-foreground`,\n * `--color-accent`, `--color-accent-foreground`, `--color-warn`, `--color-warn-foreground`,\n * `--color-popover`, `--color-popover-foreground`, `--color-border`\n *\n * @example Simple text tooltip\n * ```html\n * <button comTooltip=\"Save your changes\">\n * <com-icon name=\"save\" />\n * </button>\n * ```\n *\n * @example Positioned\n * ```html\n * <button comTooltip=\"Settings\" comTooltipPosition=\"right\">\n * <com-icon name=\"settings\" />\n * </button>\n * ```\n *\n * @example Color variants\n * ```html\n * <com-icon name=\"alert-triangle\" comTooltip=\"3 warnings found\" comTooltipColor=\"warn\" />\n * ```\n *\n * @example Custom template\n * ```html\n * <button\n * comTooltip=\"Keyboard shortcuts\"\n * [comTooltipTpl]=\"shortcutsTpl\"\n * comTooltipSize=\"lg\"\n * >\n * <com-icon name=\"keyboard\" />\n * </button>\n *\n * <ng-template #shortcutsTpl let-hide=\"hide\">\n * <div class=\"flex flex-col gap-1\">\n * <span>Press Ctrl+S to save</span>\n * <button (click)=\"hide()\">Got it</button>\n * </div>\n * </ng-template>\n * ```\n *\n * @example Programmatic control\n * ```html\n * <input\n * #tooltipRef=\"comTooltip\"\n * comTooltip=\"Invalid email\"\n * comTooltipColor=\"warn\"\n * [comTooltipDisabled]=\"true\"\n * />\n * ```\n *\n * ```ts\n * // Show tooltip on validation error\n * if (emailInvalid) {\n * this.tooltipRef.show();\n * }\n * ```\n */\n@Directive({\n selector: '[comTooltip]',\n exportAs: 'comTooltip',\n host: {\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focusin)': 'onFocusIn()',\n '(focusout)': 'onFocusOut()',\n '(keydown.escape)': 'onEscapeKey()',\n '(touchstart)': 'onTouchStart($event)',\n },\n})\nexport class ComTooltip {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly renderer = inject(Renderer2);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n\n private overlayRef: OverlayRef | null = null;\n private panelInstance: TooltipPanelComponent | null = null;\n private showTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private hideTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private touchTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private readonly tooltipId = generateTooltipId();\n\n /** Current active side (updated from position changes). */\n private readonly activeSide: WritableSignal<TooltipSide> = signal<TooltipSide>('top');\n\n /** Whether the tooltip is currently visible. */\n private readonly isVisible: WritableSignal<boolean> = signal(false);\n\n // ─── Content Inputs ───\n\n /** Simple text content for the tooltip. Also serves as the directive selector. */\n readonly comTooltip: InputSignal<string> = input.required<string>();\n\n /** Custom template for rich tooltip content. Takes precedence over text when provided. */\n readonly comTooltipTpl: InputSignal<TemplateRef<TooltipTemplateContext> | null> =\n input<TemplateRef<TooltipTemplateContext> | null>(null);\n\n // ─── Positioning Inputs ───\n\n /** Preferred position direction. Default: 'top'. */\n readonly comTooltipPosition: InputSignal<TooltipPosition> = input<TooltipPosition>('top');\n\n // ─── Behavior Inputs ───\n\n /** Delay in ms before showing the tooltip. Default: 200. */\n readonly comTooltipShowDelay: InputSignalWithTransform<number, unknown> = input(DEFAULT_SHOW_DELAY, {\n transform: numberAttribute,\n });\n\n /** Delay in ms before hiding the tooltip. Default: 100. */\n readonly comTooltipHideDelay: InputSignalWithTransform<number, unknown> = input(DEFAULT_HIDE_DELAY, {\n transform: numberAttribute,\n });\n\n /** Disable the tooltip entirely. Default: false. */\n readonly comTooltipDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Touch device handling. Default: 'auto'. */\n readonly comTooltipTouchGestures: InputSignal<TooltipTouchGestures> = input<TooltipTouchGestures>('auto');\n\n // ─── Variant Inputs ───\n\n /** Color variant. Default: 'default'. */\n readonly comTooltipColor: InputSignal<TooltipColor> = input<TooltipColor>('default');\n\n /** Size variant. Default: 'md'. */\n readonly comTooltipSize: InputSignal<TooltipSize> = input<TooltipSize>('md');\n\n /** Whether to show the arrow/caret. Default: true. */\n readonly comTooltipHasArrow: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Outputs ───\n\n /** Emitted when the tooltip becomes visible (after delay + animation). */\n readonly comTooltipShown: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the tooltip is fully hidden. */\n readonly comTooltipHidden: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.clearTimers();\n this.disposeOverlay();\n });\n }\n\n // ─── Public API ───\n\n /** Programmatically show the tooltip (ignores disabled state for error validation use cases). */\n show(): void {\n if (this.isVisible()) return;\n this.clearTimers();\n this.createOverlay();\n this.attachPanel();\n }\n\n /** Programmatically hide the tooltip. */\n hide(): void {\n if (!this.isVisible()) return;\n this.clearTimers();\n this.detachPanel();\n }\n\n // ─── Event Handlers ───\n\n protected onMouseEnter(): void {\n if (this.comTooltipDisabled()) return;\n this.scheduleShow(this.comTooltipShowDelay());\n }\n\n protected onMouseLeave(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n protected onFocusIn(): void {\n if (this.comTooltipDisabled()) return;\n // Keyboard users get instant feedback\n this.scheduleShow(0);\n }\n\n protected onFocusOut(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n protected onEscapeKey(): void {\n if (this.isVisible()) {\n this.hide();\n }\n }\n\n protected onTouchStart(_event: TouchEvent): void {\n const touchMode = this.comTooltipTouchGestures();\n if (touchMode === 'off' || this.comTooltipDisabled()) return;\n\n // Long-press to show (500ms)\n this.clearTimers();\n this.touchTimeoutId = setTimeout(() => {\n this.show();\n\n // Set up tap-elsewhere to hide\n const touchEndHandler = (e: Event): void => {\n const touch = (e as TouchEvent).changedTouches?.[0];\n if (touch) {\n const target = this.document.elementFromPoint(touch.clientX, touch.clientY);\n if (!this.overlayRef?.overlayElement.contains(target)) {\n this.hide();\n }\n }\n this.document.removeEventListener('touchend', touchEndHandler);\n };\n this.document.addEventListener('touchend', touchEndHandler);\n }, 500);\n\n // Cancel long-press if finger moves\n const touchMoveHandler = (): void => {\n this.clearTouchTimeout();\n this.document.removeEventListener('touchmove', touchMoveHandler);\n };\n this.document.addEventListener('touchmove', touchMoveHandler);\n\n // Cancel long-press if finger lifts before timeout\n const touchEndCancelHandler = (): void => {\n this.clearTouchTimeout();\n this.document.removeEventListener('touchend', touchEndCancelHandler);\n };\n this.document.addEventListener('touchend', touchEndCancelHandler);\n }\n\n // ─── Panel Mouse Events ───\n\n /** Called when mouse enters the tooltip panel. */\n private onPanelMouseEnter(): void {\n // Cancel hide timer when hovering over panel (for interactive templates)\n this.clearHideTimeout();\n }\n\n /** Called when mouse leaves the tooltip panel. */\n private onPanelMouseLeave(): void {\n this.scheduleHide(this.comTooltipHideDelay());\n }\n\n // ─── Timer Management ───\n\n private scheduleShow(delay: number): void {\n this.clearTimers();\n if (delay === 0) {\n this.createOverlay();\n this.attachPanel();\n } else {\n this.showTimeoutId = setTimeout(() => {\n this.createOverlay();\n this.attachPanel();\n }, delay);\n }\n }\n\n private scheduleHide(delay: number): void {\n this.clearShowTimeout();\n if (!this.isVisible()) return;\n\n if (delay === 0) {\n this.detachPanel();\n } else {\n this.hideTimeoutId = setTimeout(() => {\n this.detachPanel();\n }, delay);\n }\n }\n\n private clearTimers(): void {\n this.clearShowTimeout();\n this.clearHideTimeout();\n this.clearTouchTimeout();\n }\n\n private clearShowTimeout(): void {\n if (this.showTimeoutId !== null) {\n clearTimeout(this.showTimeoutId);\n this.showTimeoutId = null;\n }\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeoutId !== null) {\n clearTimeout(this.hideTimeoutId);\n this.hideTimeoutId = null;\n }\n }\n\n private clearTouchTimeout(): void {\n if (this.touchTimeoutId !== null) {\n clearTimeout(this.touchTimeoutId);\n this.touchTimeoutId = null;\n }\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n if (!isPlatformBrowser(this.platformId)) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(buildTooltipPositions(this.comTooltipPosition()))\n .withFlexibleDimensions(false)\n .withPush(true)\n .withViewportMargin(VIEWPORT_MARGIN);\n\n const scrollStrategy = this.overlay.scrollStrategies.reposition({ autoClose: true });\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n panelClass: 'com-tooltip-overlay',\n hasBackdrop: false,\n });\n\n // Track position changes for arrow orientation\n (positionStrategy as FlexibleConnectedPositionStrategy).positionChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((change: ConnectedOverlayPositionChange) => {\n const side = deriveSideFromPosition(change.connectionPair);\n this.activeSide.set(side);\n if (this.panelInstance) {\n this.panelInstance.activeSide.set(side);\n }\n });\n\n // Close when overlay detaches\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.handleDetachment();\n });\n }\n\n private attachPanel(): void {\n if (!this.overlayRef || this.overlayRef.hasAttached()) return;\n\n const portal = new ComponentPortal(TooltipPanelComponent, this.viewContainerRef, this.injector);\n const componentRef = this.overlayRef.attach(portal);\n this.panelInstance = componentRef.instance;\n\n // Configure panel inputs\n this.panelInstance.textContent.set(this.comTooltip());\n this.panelInstance.templateRef.set(this.comTooltipTpl());\n this.panelInstance.color.set(this.comTooltipColor());\n this.panelInstance.size.set(this.comTooltipSize());\n this.panelInstance.showArrow.set(this.comTooltipHasArrow());\n this.panelInstance.activeSide.set(this.activeSide());\n this.panelInstance.tooltipId.set(this.tooltipId);\n this.panelInstance.hideFn.set(() => this.hide());\n\n // Set up panel mouse events for interactive templates\n const overlayElement = this.overlayRef.overlayElement;\n this.renderer.listen(overlayElement, 'mouseenter', () => this.onPanelMouseEnter());\n this.renderer.listen(overlayElement, 'mouseleave', () => this.onPanelMouseLeave());\n\n // Set ARIA on trigger\n this.renderer.setAttribute(this.elementRef.nativeElement, 'aria-describedby', this.tooltipId);\n\n // Trigger show animation after a microtask (allows initial styles to apply)\n requestAnimationFrame(() => {\n if (this.panelInstance) {\n this.panelInstance.visible.set(true);\n }\n });\n\n this.isVisible.set(true);\n this.comTooltipShown.emit();\n }\n\n private detachPanel(): void {\n if (!this.panelInstance) return;\n\n // Trigger hide animation\n this.panelInstance.visible.set(false);\n\n // Wait for animation to complete before detaching\n setTimeout(() => {\n this.disposeOverlay();\n }, 80); // Match animation duration\n }\n\n private handleDetachment(): void {\n // Remove ARIA from trigger\n this.renderer.removeAttribute(this.elementRef.nativeElement, 'aria-describedby');\n\n this.isVisible.set(false);\n this.panelInstance = null;\n this.comTooltipHidden.emit();\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelInstance = null;\n this.isVisible.set(false);\n\n // Remove ARIA from trigger\n this.renderer.removeAttribute(this.elementRef.nativeElement, 'aria-describedby');\n }\n}\n","// Public API for the tooltip directive\n\n// Main directive\nexport { ComTooltip } from './tooltip.directive';\n\n// Types and interfaces\nexport type {\n TooltipPosition,\n TooltipColor,\n TooltipSize,\n TooltipTouchGestures,\n TooltipTemplateContext,\n} from './tooltip.models';\n\n// Variants (for advanced customization)\nexport { tooltipPanelVariants, tooltipArrowVariants } from './tooltip.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAGA;;;;;;AAMG;AACI,MAAM,oBAAoB,GAGlB,GAAG,CAChB;IACE,mBAAmB;IACnB,MAAM;IACN,qBAAqB;IACrB,aAAa;IACb,gBAAgB;CACjB,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,oCAAoC;AAC7C,YAAA,OAAO,EAAE,oCAAoC;AAC7C,YAAA,MAAM,EAAE,kCAAkC;AAC1C,YAAA,IAAI,EAAE,8BAA8B;AACpC,YAAA,MAAM,EAAE,wEAAwE;AACjF,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,4CAA4C;AAChD,YAAA,EAAE,EAAE,8CAA8C;AAClD,YAAA,EAAE,EAAE,8CAA8C;AACnD,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH;;;;;;AAMG;AACI,MAAM,oBAAoB,GAGlB,GAAG,CAAC,2BAA2B,EAAE;AAC9C,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,MAAM,EAAE,WAAW;AACnB,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,4CAA4C;AACrD,SAAA;AACD,QAAA,IAAI,EAAE;;AAEJ,YAAA,GAAG,EAAE,oDAAoD;;AAEzD,YAAA,MAAM,EAAE,kDAAkD;;AAE1D,YAAA,IAAI,EAAE,kDAAkD;;AAExD,YAAA,KAAK,EAAE,kDAAkD;AAC1D,SAAA;AACF,KAAA;AACD,IAAA,gBAAgB,EAAE;;QAEhB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC1D,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE;QACvD,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC3D,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;AACxD,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,KAAK;AACZ,KAAA;AACF,CAAA;;AClFD,IAAI,gBAAgB,GAAG,CAAC;AAExB;;AAEG;SACa,iBAAiB,GAAA;AAC/B,IAAA,OAAO,CAAA,QAAA,EAAW,EAAE,gBAAgB,CAAA,CAAE;AACxC;;ACFA;;;;;;;;;AASG;MA2FU,qBAAqB,CAAA;;AAEvB,IAAA,WAAW,GAA2B,MAAM,CAAC,EAAE,uDAAC;;AAGhD,IAAA,WAAW,GAA+D,MAAM,CAAC,IAAI,uDAAC;;AAGtF,IAAA,KAAK,GAAiC,MAAM,CAAe,SAAS,iDAAC;;AAGrE,IAAA,IAAI,GAAgC,MAAM,CAAc,IAAI,gDAAC;;AAG7D,IAAA,SAAS,GAA4B,MAAM,CAAC,IAAI,qDAAC;;AAGjD,IAAA,UAAU,GAAgC,MAAM,CAAc,KAAK,sDAAC;;AAGpE,IAAA,SAAS,GAA2B,MAAM,CAAC,EAAE,qDAAC;;AAG9C,IAAA,OAAO,GAA4B,MAAM,CAAC,KAAK,mDAAC;;IAGhD,MAAM,GAA+B,MAAM,CAAC,MAAK,EAAE,CAAC,kDAAC;;AAG3C,IAAA,eAAe,GAAmC,QAAQ,CAAC,OAAO;AACnF,QAAA,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE;AAC7B,QAAA,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;AACpB,KAAA,CAAC,2DAAC;;IAGgB,YAAY,GAAmB,QAAQ,CAAC,MACzD,YAAY,CACV,oBAAoB,CAAC;AACnB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KAClB,CAAC,CACH,wDACF;;IAGkB,YAAY,GAAmB,QAAQ,CAAC,MACzD,YAAY,CACV,oBAAoB,CAAC;AACnB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE;KACxB,CAAC,CACH,wDACF;uGApDU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxFtB;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,imBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA6DS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA1FjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,QAAA,EACnB;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,OAAA,EA6DQ,CAAC,gBAAgB,CAAC,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,imBAAA,CAAA,EAAA;;;ACnEjD;AACA,MAAM,kBAAkB,GAAG,GAAG;AAE9B;AACA,MAAM,kBAAkB,GAAG,GAAG;AAE9B;AACA,MAAM,cAAc,GAAG,CAAC;AAExB;AACA,MAAM,eAAe,GAAG,CAAC;AAEzB;;;AAGG;AACH,SAAS,qBAAqB,CAAC,QAAyB,EAAA;AACtD,IAAA,MAAM,SAAS,GAAiD;AAC9D,QAAA,GAAG,EAAE;;YAEH,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;;AAEvG,YAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE;;AAEtG,YAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;;YAErG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACvG,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE;YACtG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACvG,YAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;YACrG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACvG,SAAA;AACD,QAAA,IAAI,EAAE;YACJ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACtG,YAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;YACrG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACvG,YAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE;AACvG,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;YACrG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;YACtG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE;AACvG,YAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE;AACvG,SAAA;KACF;AAED,IAAA,OAAO,SAAS,CAAC,QAAQ,CAAC;AAC5B;AAEA;;AAEG;AACH,SAAS,sBAAsB,CAAC,IAA4B,EAAA;IAC1D,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IACtE,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;AAAE,QAAA,OAAO,QAAQ;IACzE,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;AAAE,QAAA,OAAO,MAAM;IACtE,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;AAAE,QAAA,OAAO,OAAO;AACvE,IAAA,OAAO,KAAK;AACd;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEG;MAaU,UAAU,CAAA;AACJ,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEpC,UAAU,GAAsB,IAAI;IACpC,aAAa,GAAiC,IAAI;IAClD,aAAa,GAAyC,IAAI;IAC1D,aAAa,GAAyC,IAAI;IAC1D,cAAc,GAAyC,IAAI;IAClD,SAAS,GAAG,iBAAiB,EAAE;;AAG/B,IAAA,UAAU,GAAgC,MAAM,CAAc,KAAK,sDAAC;;AAGpE,IAAA,SAAS,GAA4B,MAAM,CAAC,KAAK,qDAAC;;;AAK1D,IAAA,UAAU,GAAwB,KAAK,CAAC,QAAQ,qDAAU;;AAG1D,IAAA,aAAa,GACpB,KAAK,CAA6C,IAAI,yDAAC;;;AAKhD,IAAA,kBAAkB,GAAiC,KAAK,CAAkB,KAAK,8DAAC;;;IAKhF,mBAAmB,GAA8C,KAAK,CAAC,kBAAkB,gEAChG,SAAS,EAAE,eAAe,EAAA,CAC1B;;IAGO,mBAAmB,GAA8C,KAAK,CAAC,kBAAkB,gEAChG,SAAS,EAAE,eAAe,EAAA,CAC1B;;IAGO,kBAAkB,GAA+C,KAAK,CAAC,KAAK,+DACnF,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;AAGO,IAAA,uBAAuB,GAAsC,KAAK,CAAuB,MAAM,mEAAC;;;AAKhG,IAAA,eAAe,GAA8B,KAAK,CAAe,SAAS,2DAAC;;AAG3E,IAAA,cAAc,GAA6B,KAAK,CAAc,IAAI,0DAAC;;IAGnE,kBAAkB,GAA+C,KAAK,CAAC,IAAI,+DAClF,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;;IAKO,eAAe,GAA2B,MAAM,EAAQ;;IAGxD,gBAAgB,GAA2B,MAAM,EAAQ;AAElE,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,cAAc,EAAE;AACvB,QAAA,CAAC,CAAC;IACJ;;;IAKA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;QACtB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,WAAW,EAAE;IACpB;;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;QACvB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE;IACpB;;IAIU,YAAY,GAAA;QACpB,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAAE;QAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/C;IAEU,YAAY,GAAA;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/C;IAEU,SAAS,GAAA;QACjB,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAAE;;AAE/B,QAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/C;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEU,IAAA,YAAY,CAAC,MAAkB,EAAA;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE;AAChD,QAAA,IAAI,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAAE;;QAGtD,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;YACpC,IAAI,CAAC,IAAI,EAAE;;AAGX,YAAA,MAAM,eAAe,GAAG,CAAC,CAAQ,KAAU;gBACzC,MAAM,KAAK,GAAI,CAAgB,CAAC,cAAc,GAAG,CAAC,CAAC;gBACnD,IAAI,KAAK,EAAE;AACT,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;AAC3E,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;wBACrD,IAAI,CAAC,IAAI,EAAE;oBACb;gBACF;gBACA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,eAAe,CAAC;AAChE,YAAA,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC;QAC7D,CAAC,EAAE,GAAG,CAAC;;QAGP,MAAM,gBAAgB,GAAG,MAAW;YAClC,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC;AAClE,QAAA,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC;;QAG7D,MAAM,qBAAqB,GAAG,MAAW;YACvC,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,qBAAqB,CAAC;AACtE,QAAA,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,qBAAqB,CAAC;IACnE;;;IAKQ,iBAAiB,GAAA;;QAEvB,IAAI,CAAC,gBAAgB,EAAE;IACzB;;IAGQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/C;;AAIQ,IAAA,YAAY,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,WAAW,EAAE;QACpB;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;gBACnC,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB,CAAC,EAAE,KAAK,CAAC;QACX;IACF;AAEQ,IAAA,YAAY,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AAEvB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,IAAI,CAAC,WAAW,EAAE;QACpB;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;gBACnC,IAAI,CAAC,WAAW,EAAE;YACpB,CAAC,EAAE,KAAK,CAAC;QACX;IACF;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC/B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC/B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;;IAIQ,aAAa,GAAA;QACnB,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;AAEzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;AACR,aAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;aACnC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;aAC9D,sBAAsB,CAAC,KAAK;aAC5B,QAAQ,CAAC,IAAI;aACb,kBAAkB,CAAC,eAAe,CAAC;AAEtC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAEpF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;YAChB,cAAc;AACd,YAAA,UAAU,EAAE,qBAAqB;AACjC,YAAA,WAAW,EAAE,KAAK;AACnB,SAAA,CAAC;;AAGD,QAAA,gBAAsD,CAAC;AACrD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,MAAsC,KAAI;YACpD,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,cAAc,CAAC;AAC1D,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACzC;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC;AACF,aAAA,WAAW;AACX,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,gBAAgB,EAAE;AACzB,QAAA,CAAC,CAAC;IACN;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;YAAE;AAEvD,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC/F,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;AACnD,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,QAAQ;;AAG1C,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AACxD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;;AAGhD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;;AAGlF,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC;;QAG7F,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;;QAGzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;QAGrC,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,cAAc,EAAE;AACvB,QAAA,CAAC,EAAE,EAAE,CAAC,CAAC;IACT;IAEQ,gBAAgB,GAAA;;AAEtB,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,kBAAkB,CAAC;AAEhF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGzB,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAClF;uGA1VW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAZtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,IAAI,EAAE;AACJ,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,WAAW,EAAE,aAAa;AAC1B,wBAAA,YAAY,EAAE,cAAc;AAC5B,wBAAA,kBAAkB,EAAE,eAAe;AACnC,wBAAA,cAAc,EAAE,sBAAsB;AACvC,qBAAA;AACF,iBAAA;;;AChLD;AAEA;;ACFA;;AAEG;;;;"}
@@ -1,17 +1,4 @@
1
- /**
2
- * ngx-com/components
3
- * Component exports for ngx-com library
4
- *
5
- * Note: Components are exposed as secondary entry points:
6
- * - ngx-com/components/calendar
7
- *
8
- * Import from the specific secondary entry points for tree-shaking.
9
- */
10
- const COMPONENTS_PLACEHOLDER = true;
11
-
12
1
  /**
13
2
  * Generated bundle index. Do not edit.
14
3
  */
15
-
16
- export { COMPONENTS_PLACEHOLDER };
17
4
  //# sourceMappingURL=ngx-com-components.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components.mjs","sources":["../../../projects/com/components/src/index.ts","../../../projects/com/components/src/ngx-com-components.ts"],"sourcesContent":["/**\n * ngx-com/components\n * Component exports for ngx-com library\n *\n * Note: Components are exposed as secondary entry points:\n * - ngx-com/components/calendar\n *\n * Import from the specific secondary entry points for tree-shaking.\n */\n\nexport const COMPONENTS_PLACEHOLDER = true;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;;;;;;;AAQG;AAEI,MAAM,sBAAsB,GAAG;;ACVtC;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-com-components.mjs","sources":["../../../projects/com/components/src/ngx-com-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -1,12 +1,4 @@
1
- /**
2
- * ngx-com/tokens
3
- * Injection token exports for ngx-com library
4
- */
5
- const TOKENS_PLACEHOLDER = true;
6
-
7
1
  /**
8
2
  * Generated bundle index. Do not edit.
9
3
  */
10
-
11
- export { TOKENS_PLACEHOLDER };
12
4
  //# sourceMappingURL=ngx-com-tokens.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-tokens.mjs","sources":["../../../projects/com/tokens/src/index.ts","../../../projects/com/tokens/src/ngx-com-tokens.ts"],"sourcesContent":["/**\n * ngx-com/tokens\n * Injection token exports for ngx-com library\n */\n\nexport const TOKENS_PLACEHOLDER: boolean = true;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;;AAGG;AAEI,MAAM,kBAAkB,GAAY;;ACL3C;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-com-tokens.mjs","sources":["../../../projects/com/tokens/src/ngx-com-tokens.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -18,6 +18,18 @@ function mergeClasses(...inputs) {
18
18
  return twMerge(clsx(inputs));
19
19
  }
20
20
 
21
+ /**
22
+ * Joins CSS class strings, filtering out null/undefined values.
23
+ * Unlike `mergeClasses` from utils, this does NOT resolve Tailwind conflicts -
24
+ * it simply concatenates class strings. Use when classes are guaranteed not to conflict.
25
+ *
26
+ * @param classes - Class strings (may include null/undefined)
27
+ * @returns Space-separated class string
28
+ */
29
+ function joinClasses(...classes) {
30
+ return classes.filter(Boolean).join(' ');
31
+ }
32
+
21
33
  /**
22
34
  * Creates a debounced version of the provided function that delays invoking
23
35
  * until after the specified wait time has elapsed since the last call.
@@ -597,5 +609,5 @@ function groupBy(collection, predicate) {
597
609
  * Generated bundle index. Do not edit.
598
610
  */
599
611
 
600
- export { chunk, debounce, deepClone, deepEqual, deepMerge, groupBy, isPlainObject, mergeClasses, omit, partition, pick, resolvePath, retry, throttle };
612
+ export { chunk, debounce, deepClone, deepEqual, deepMerge, groupBy, isPlainObject, joinClasses, mergeClasses, omit, partition, pick, resolvePath, retry, throttle };
601
613
  //# sourceMappingURL=ngx-com-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-utils.mjs","sources":["../../../projects/com/utils/src/merge-classes.ts","../../../projects/com/utils/src/debounce.ts","../../../projects/com/utils/src/throttle.ts","../../../projects/com/utils/src/retry.ts","../../../projects/com/utils/src/pick.ts","../../../projects/com/utils/src/omit.ts","../../../projects/com/utils/src/deep-clone.ts","../../../projects/com/utils/src/is-plain-object.ts","../../../projects/com/utils/src/deep-merge.ts","../../../projects/com/utils/src/deep-equal.ts","../../../projects/com/utils/src/resolve-path.ts","../../../projects/com/utils/src/chunk.ts","../../../projects/com/utils/src/partition.ts","../../../projects/com/utils/src/group-by.ts","../../../projects/com/utils/src/index.ts","../../../projects/com/utils/src/ngx-com-utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges and deduplicates CSS class names using clsx and tailwind-merge.\n * Tailwind-merge ensures conflicting utility classes are resolved correctly.\n *\n * @param inputs - Class values to merge (strings, arrays, objects, or falsy values)\n * @returns A single string of merged, deduplicated class names\n *\n * @example\n * ```ts\n * mergeClasses('px-2 py-1', 'px-4'); // 'py-1 px-4'\n * mergeClasses('text-sm', condition && 'text-lg'); // 'text-lg' if condition is true\n * ```\n */\nexport function mergeClasses(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * A debounced function wrapper with cancel and flush capabilities.\n *\n * @template T - The type of the original function.\n */\nexport interface DebouncedFn<T extends (...args: never[]) => void> {\n /**\n * Calls the debounced function. The actual execution is delayed until\n * the specified wait time has passed without another call.\n */\n (...args: Parameters<T>): void;\n\n /**\n * Cancels any pending debounced call.\n * Useful for cleanup in component destruction or effect cleanup.\n */\n cancel(): void;\n\n /**\n * Immediately executes the pending debounced call if one exists.\n * Does nothing if no call is pending.\n */\n flush(): void;\n\n /**\n * Returns whether there is a pending debounced call.\n */\n pending(): boolean;\n}\n\n/**\n * Configuration options for the debounce function.\n */\nexport interface DebounceOptions {\n /**\n * The number of milliseconds to delay execution.\n * @default 300\n */\n readonly wait?: number;\n\n /**\n * If `true`, the function is invoked on the leading edge of the timeout\n * instead of the trailing edge.\n * @default false\n */\n readonly leading?: boolean;\n}\n\n/**\n * Creates a debounced version of the provided function that delays invoking\n * until after the specified wait time has elapsed since the last call.\n *\n * The debounced function includes `cancel()` to abort pending calls,\n * `flush()` to immediately execute pending calls, and `pending()` to check status.\n *\n * @template T - The type of the function to debounce.\n * @param fn - The function to debounce.\n * @param optionsOrWait - Wait time in ms or options object.\n * @returns The debounced function with control methods.\n *\n * @example\n * // Basic usage with default 300ms delay\n * const debouncedSearch = debounce((query: string) => {\n * console.log('Searching for:', query);\n * });\n * debouncedSearch('hello'); // Logs after 300ms if no subsequent calls\n *\n * @example\n * // With custom wait time\n * const debouncedSave = debounce(\n * (data: { id: number; value: string }) => saveToServer(data),\n * 500\n * );\n *\n * @example\n * // With options object and leading edge execution\n * const debouncedClick = debounce(\n * () => handleClick(),\n * { wait: 200, leading: true }\n * );\n *\n * @example\n * // Cleanup in Angular component\n * export class SearchComponent {\n * private debouncedSearch = debounce((q: string) => this.search(q), 300);\n *\n * ngOnDestroy(): void {\n * this.debouncedSearch.cancel();\n * }\n * }\n */\nexport function debounce<T extends (...args: never[]) => void>(\n fn: T,\n optionsOrWait: number | DebounceOptions = 300,\n): DebouncedFn<T> {\n const options: DebounceOptions =\n typeof optionsOrWait === 'number' ? { wait: optionsOrWait } : optionsOrWait;\n\n const wait = options.wait ?? 300;\n const leading = options.leading ?? false;\n\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let pendingArgs: Parameters<T> | null = null;\n let leadingInvoked = false;\n\n const invoke = (): void => {\n if (pendingArgs !== null) {\n fn(...pendingArgs);\n pendingArgs = null;\n }\n leadingInvoked = false;\n };\n\n const debounced = (...args: Parameters<T>): void => {\n pendingArgs = args;\n\n if (leading && !leadingInvoked) {\n leadingInvoked = true;\n invoke();\n }\n\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!leading || pendingArgs !== null) {\n invoke();\n }\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n pendingArgs = null;\n leadingInvoked = false;\n };\n\n debounced.flush = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n invoke();\n }\n };\n\n debounced.pending = (): boolean => timerId !== null;\n\n return debounced;\n}\n","/**\n * A throttled function wrapper with cancel capability.\n *\n * @template T - The type of the original function.\n */\nexport interface ThrottledFn<T extends (...args: never[]) => void> {\n /**\n * Calls the throttled function. Execution is rate-limited to at most\n * once per the specified wait period.\n */\n (...args: Parameters<T>): void;\n\n /**\n * Cancels any pending throttled call.\n * Useful for cleanup in component destruction.\n */\n cancel(): void;\n}\n\n/**\n * Creates a throttled version of the provided function that only invokes\n * at most once per the specified wait period.\n *\n * The function is invoked on the leading edge (immediately on first call)\n * and then at most once per wait period for subsequent calls.\n *\n * @template T - The type of the function to throttle.\n * @param fn - The function to throttle.\n * @param wait - The minimum time between invocations in milliseconds.\n * @returns The throttled function with a cancel method.\n *\n * @example\n * // Basic usage - scroll handler\n * const throttledScroll = throttle(() => {\n * console.log('Scroll position:', window.scrollY);\n * }, 100);\n * window.addEventListener('scroll', throttledScroll);\n *\n * @example\n * // With cleanup\n * export class ScrollComponent {\n * private throttledHandler = throttle((e: Event) => this.handleScroll(e), 100);\n *\n * ngOnDestroy(): void {\n * this.throttledHandler.cancel();\n * }\n * }\n */\nexport function throttle<T extends (...args: never[]) => void>(\n fn: T,\n wait: number,\n): ThrottledFn<T> {\n let lastCallTime = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let pendingArgs: Parameters<T> | null = null;\n\n const invoke = (args: Parameters<T>): void => {\n lastCallTime = Date.now();\n fn(...args);\n };\n\n const throttled = (...args: Parameters<T>): void => {\n const now = Date.now();\n const remaining = wait - (now - lastCallTime);\n\n if (remaining <= 0) {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n invoke(args);\n } else {\n pendingArgs = args;\n if (timerId === null) {\n timerId = setTimeout(() => {\n timerId = null;\n if (pendingArgs !== null) {\n invoke(pendingArgs);\n pendingArgs = null;\n }\n }, remaining);\n }\n }\n };\n\n throttled.cancel = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n pendingArgs = null;\n };\n\n return throttled;\n}\n","/**\n * Configuration options for the retry function.\n */\nexport interface RetryOptions {\n /**\n * Maximum number of retry attempts.\n */\n readonly attempts: number;\n\n /**\n * Delay between retries in milliseconds.\n */\n readonly delay: number;\n\n /**\n * Multiplier for exponential backoff (optional).\n * Each retry delay is multiplied by this factor.\n * @default 1\n */\n readonly backoff?: number;\n\n /**\n * Optional predicate to determine if an error should trigger a retry.\n * @param error - The error that occurred.\n * @returns `true` to retry, `false` to fail immediately.\n */\n readonly shouldRetry?: (error: unknown) => boolean;\n}\n\n/**\n * Retries an async function with configurable attempts, delay, and backoff.\n *\n * @template T - The return type of the async function.\n * @param fn - The async function to retry.\n * @param options - Retry configuration.\n * @returns The result of the successful call.\n * @throws The last error if all attempts fail.\n *\n * @example\n * // Basic retry with 3 attempts\n * const data = await retry(\n * () => fetch('/api/data').then(r => r.json()),\n * { attempts: 3, delay: 1000 }\n * );\n *\n * @example\n * // With exponential backoff\n * const result = await retry(\n * () => unreliableApiCall(),\n * { attempts: 5, delay: 100, backoff: 2 } // delays: 100, 200, 400, 800, 1600\n * );\n *\n * @example\n * // With conditional retry\n * const result = await retry(\n * () => apiCall(),\n * {\n * attempts: 3,\n * delay: 500,\n * shouldRetry: (err) => err instanceof NetworkError\n * }\n * );\n */\nexport async function retry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<T> {\n const { attempts, delay, backoff = 1, shouldRetry } = options;\n\n let lastError: unknown;\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (shouldRetry && !shouldRetry(error)) {\n throw error;\n }\n\n if (attempt < attempts) {\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n currentDelay *= backoff;\n }\n }\n }\n\n throw lastError;\n}\n","/**\n * Creates a new object with only the specified keys from the source object.\n *\n * @template T - The type of the source object.\n * @template K - The keys to pick.\n * @param obj - The source object.\n * @param keys - The keys to pick from the object.\n * @returns A new object containing only the specified keys.\n *\n * @example\n * const user = { id: 1, name: 'John', email: 'john@example.com', age: 30 };\n * pick(user, ['id', 'name']); // { id: 1, name: 'John' }\n *\n * @example\n * const config = { host: 'localhost', port: 3000, debug: true };\n * pick(config, ['host', 'port']); // { host: 'localhost', port: 3000 }\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n","/**\n * Creates a new object with the specified keys omitted from the source object.\n *\n * @template T - The type of the source object.\n * @template K - The keys to omit.\n * @param obj - The source object.\n * @param keys - The keys to omit from the object.\n * @returns A new object without the specified keys.\n *\n * @example\n * const user = { id: 1, name: 'John', password: 'secret', email: 'john@example.com' };\n * omit(user, ['password']); // { id: 1, name: 'John', email: 'john@example.com' }\n *\n * @example\n * const config = { host: 'localhost', port: 3000, debug: true };\n * omit(config, ['debug']); // { host: 'localhost', port: 3000 }\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n}\n","/**\n * Creates a deep clone of a value, handling objects, arrays, Date, and RegExp.\n * Note: Does not handle circular references, functions, or special objects like Map, Set.\n * For complex cloning needs, consider using `structuredClone()`.\n *\n * @template T - The type of the value to clone.\n * @param value - The value to deep clone.\n * @returns A deep clone of the value.\n *\n * @example\n * const original = { a: 1, b: { c: 2, d: [3, 4] } };\n * const cloned = deepClone(original);\n * cloned.b.c = 5;\n * console.log(original.b.c); // 2 (unchanged)\n *\n * @example\n * const arr = [{ id: 1 }, { id: 2 }];\n * const clonedArr = deepClone(arr);\n * clonedArr[0].id = 99;\n * console.log(arr[0].id); // 1 (unchanged)\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // At this point, value is guaranteed to be a plain object\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n","/**\n * Checks if a value is a plain object (not null, not an array).\n *\n * @param value - The value to check.\n * @returns `true` if value is a plain object; otherwise, `false`.\n *\n * @example\n * isPlainObject({ a: 1 }); // true\n * isPlainObject([1, 2]); // false\n * isPlainObject(null); // false\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { deepClone } from './deep-clone';\nimport { isPlainObject } from './is-plain-object';\n\n/**\n * Deep merges multiple source objects into a new object.\n * Later sources override earlier ones. Arrays are replaced, not merged.\n *\n * @template T - The type of the resulting object.\n * @param sources - The source objects to merge.\n * @returns A new deeply merged object.\n *\n * @example\n * const defaults = { theme: { color: 'blue', size: 'md' }, debug: false };\n * const userConfig = { theme: { color: 'red' }, debug: true };\n * deepMerge(defaults, userConfig);\n * // { theme: { color: 'red', size: 'md' }, debug: true }\n *\n * @example\n * const a = { arr: [1, 2], nested: { x: 1 } };\n * const b = { arr: [3, 4], nested: { y: 2 } };\n * deepMerge(a, b);\n * // { arr: [3, 4], nested: { x: 1, y: 2 } } - arrays are replaced\n */\nexport function deepMerge<T extends object>(...sources: Partial<T>[]): T {\n const result: Record<string, unknown> = {};\n\n for (const source of sources) {\n if (typeof source !== 'object' || source === null) {\n continue;\n }\n\n for (const key of Object.keys(source)) {\n const sourceValue = (source as Record<string, unknown>)[key];\n const resultValue = result[key];\n\n if (Array.isArray(sourceValue)) {\n result[key] = deepClone(sourceValue);\n } else if (isPlainObject(sourceValue) && isPlainObject(resultValue)) {\n result[key] = deepMerge(\n resultValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else if (isPlainObject(sourceValue)) {\n result[key] = deepClone(sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n }\n\n return result as T;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Performs a deep equality comparison between two values.\n * Handles primitives, objects, arrays, Date, and RegExp.\n *\n * @template T - The type of values to compare.\n * @param a - The first value.\n * @param b - The second value.\n * @returns `true` if values are deeply equal; otherwise, `false`.\n *\n * @example\n * deepEqual({ a: 1, b: { c: 2 } }, { a: 1, b: { c: 2 } }); // true\n * deepEqual({ a: 1 }, { a: 2 }); // false\n * deepEqual([1, [2, 3]], [1, [2, 3]]); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * deepEqual(new Date('2024-01-01'), new Date('2024-01-01')); // true\n */\nexport function deepEqual<T>(a: T, b: T): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null) {\n return a === b;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n if (typeof a !== 'object') {\n return a === b;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n return false;\n}\n","/**\n * Utility type that recursively maps the object type to the type of the resolved path.\n *\n * @example\n * type A = { user: { profile: { name: string } } };\n * type Result = ResolvePath<A, 'user.profile.name'>; // Result is string\n */\nexport type ResolvePath<T, P extends string> = P extends `${infer Head}.${infer Tail}`\n ? Head extends keyof T\n ? ResolvePath<T[Head], Tail>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/**\n * Resolves a nested path in an object, returning the value at the specified path.\n *\n * This function splits the provided `path` into keys and iterates through the object to access the\n * corresponding value at each key. If any part of the path is undefined or if the path leads to a non-object,\n * it returns `undefined`.\n *\n * @template T - The type of the object.\n * @template P - The dot-separated string path type.\n * @param obj - The object to resolve the path within.\n * @param path - The dot-separated string representing the path to the value.\n * @returns The value at the resolved path, or `undefined` if any part of the path is invalid.\n *\n * @example\n * const obj = { user: { profile: { name: 'John Doe' } } };\n * const result = resolvePath(obj, 'user.profile.name');\n * console.log(result); // 'John Doe'\n *\n * @example\n * const result2 = resolvePath(obj, 'user.address.city');\n * console.log(result2); // undefined\n */\nexport function resolvePath<T extends object, P extends string>(\n obj: T,\n path: P,\n): ResolvePath<T, P> | undefined {\n const keys = path.split('.') as (keyof T)[];\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current && typeof current === 'object' && key in current) {\n current = (current as Record<string | number | symbol, unknown>)[key];\n } else {\n return undefined;\n }\n }\n\n return current as ResolvePath<T, P>;\n}\n","/**\n * Splits an array into chunks of the specified size.\n *\n * @template T - The type of array elements.\n * @param array - The array to split.\n * @param size - The size of each chunk (must be positive).\n * @returns An array of chunks.\n *\n * @example\n * chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]\n * chunk([1, 2, 3, 4], 2); // [[1, 2], [3, 4]]\n * chunk([1, 2, 3], 5); // [[1, 2, 3]]\n * chunk([], 2); // []\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (size <= 0) {\n throw new Error('Chunk size must be a positive number');\n }\n\n const result: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n return result;\n}\n","/**\n * Splits an array into two groups based on a predicate function.\n * The first array contains elements that satisfy the predicate,\n * the second contains elements that don't.\n *\n * @template T - The type of array elements.\n * @param array - The array to partition.\n * @param predicate - The function to test each element.\n * @returns A tuple of [truthy, falsy] arrays.\n *\n * @example\n * const numbers = [1, 2, 3, 4, 5, 6];\n * partition(numbers, n => n % 2 === 0); // [[2, 4, 6], [1, 3, 5]]\n *\n * @example\n * const users = [\n * { name: 'Alice', active: true },\n * { name: 'Bob', active: false },\n * { name: 'Charlie', active: true }\n * ];\n * partition(users, u => u.active);\n * // [[{ name: 'Alice', active: true }, { name: 'Charlie', active: true }], [{ name: 'Bob', active: false }]]\n */\nexport function partition<T>(array: T[], predicate: (item: T) => boolean): [T[], T[]] {\n const truthy: T[] = [];\n const falsy: T[] = [];\n\n for (const item of array) {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n }\n\n return [truthy, falsy];\n}\n","/**\n * Groups an array of items based on a provided predicate function.\n *\n * @template K - The type of keys produced by the predicate, typically a string, number, or symbol.\n * @template V - The type of items in the collection.\n * @param collection - The array of items to be grouped.\n * @param predicate - A function that takes an item and returns a key by which to group the item.\n * @returns An object where each key is a group identifier produced by the predicate,\n * and the value is an array of items belonging to that group.\n *\n * @example\n * // Group an array of people by their age\n * const people = [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 25 }, { name: 'Charlie', age: 30 }];\n * const groupedByAge = groupBy(people, person => person.age);\n * // Output:\n * // {\n * // 25: [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 25 }],\n * // 30: [{ name: 'Charlie', age: 30 }]\n * // }\n */\nexport function groupBy<K extends string | number | symbol, V>(\n collection: V[],\n predicate: (item: V) => K,\n): Record<K, V[]> {\n return collection.reduce(\n (groups, item) => {\n const groupKey = predicate(item);\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(item);\n return groups;\n },\n {} as Record<K, V[]>,\n );\n}\n","/**\n * ngx-com/utils\n * Utility function exports for ngx-com library\n */\n\nexport { mergeClasses } from './merge-classes';\n\n// Function utilities\nexport { debounce, type DebouncedFn, type DebounceOptions } from './debounce';\nexport { throttle, type ThrottledFn } from './throttle';\nexport { retry, type RetryOptions } from './retry';\n\n// Object utilities\nexport { pick } from './pick';\nexport { omit } from './omit';\nexport { deepClone } from './deep-clone';\nexport { deepMerge } from './deep-merge';\nexport { deepEqual } from './deep-equal';\nexport { isPlainObject } from './is-plain-object';\nexport { resolvePath, type ResolvePath } from './resolve-path';\n\n// Array utilities\nexport { chunk } from './chunk';\nexport { partition } from './partition';\nexport { groupBy } from './group-by';\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-utils.mjs","sources":["../../../projects/com/utils/src/merge-classes.ts","../../../projects/com/utils/src/join-classes.ts","../../../projects/com/utils/src/debounce.ts","../../../projects/com/utils/src/throttle.ts","../../../projects/com/utils/src/retry.ts","../../../projects/com/utils/src/pick.ts","../../../projects/com/utils/src/omit.ts","../../../projects/com/utils/src/deep-clone.ts","../../../projects/com/utils/src/is-plain-object.ts","../../../projects/com/utils/src/deep-merge.ts","../../../projects/com/utils/src/deep-equal.ts","../../../projects/com/utils/src/resolve-path.ts","../../../projects/com/utils/src/chunk.ts","../../../projects/com/utils/src/partition.ts","../../../projects/com/utils/src/group-by.ts","../../../projects/com/utils/src/index.ts","../../../projects/com/utils/src/ngx-com-utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges and deduplicates CSS class names using clsx and tailwind-merge.\n * Tailwind-merge ensures conflicting utility classes are resolved correctly.\n *\n * @param inputs - Class values to merge (strings, arrays, objects, or falsy values)\n * @returns A single string of merged, deduplicated class names\n *\n * @example\n * ```ts\n * mergeClasses('px-2 py-1', 'px-4'); // 'py-1 px-4'\n * mergeClasses('text-sm', condition && 'text-lg'); // 'text-lg' if condition is true\n * ```\n */\nexport function mergeClasses(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Joins CSS class strings, filtering out null/undefined values.\n * Unlike `mergeClasses` from utils, this does NOT resolve Tailwind conflicts -\n * it simply concatenates class strings. Use when classes are guaranteed not to conflict.\n *\n * @param classes - Class strings (may include null/undefined)\n * @returns Space-separated class string\n */\nexport function joinClasses(...classes: (string | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * A debounced function wrapper with cancel and flush capabilities.\n *\n * @template T - The type of the original function.\n */\nexport interface DebouncedFn<T extends (...args: never[]) => void> {\n /**\n * Calls the debounced function. The actual execution is delayed until\n * the specified wait time has passed without another call.\n */\n (...args: Parameters<T>): void;\n\n /**\n * Cancels any pending debounced call.\n * Useful for cleanup in component destruction or effect cleanup.\n */\n cancel(): void;\n\n /**\n * Immediately executes the pending debounced call if one exists.\n * Does nothing if no call is pending.\n */\n flush(): void;\n\n /**\n * Returns whether there is a pending debounced call.\n */\n pending(): boolean;\n}\n\n/**\n * Configuration options for the debounce function.\n */\nexport interface DebounceOptions {\n /**\n * The number of milliseconds to delay execution.\n * @default 300\n */\n readonly wait?: number;\n\n /**\n * If `true`, the function is invoked on the leading edge of the timeout\n * instead of the trailing edge.\n * @default false\n */\n readonly leading?: boolean;\n}\n\n/**\n * Creates a debounced version of the provided function that delays invoking\n * until after the specified wait time has elapsed since the last call.\n *\n * The debounced function includes `cancel()` to abort pending calls,\n * `flush()` to immediately execute pending calls, and `pending()` to check status.\n *\n * @template T - The type of the function to debounce.\n * @param fn - The function to debounce.\n * @param optionsOrWait - Wait time in ms or options object.\n * @returns The debounced function with control methods.\n *\n * @example\n * // Basic usage with default 300ms delay\n * const debouncedSearch = debounce((query: string) => {\n * console.log('Searching for:', query);\n * });\n * debouncedSearch('hello'); // Logs after 300ms if no subsequent calls\n *\n * @example\n * // With custom wait time\n * const debouncedSave = debounce(\n * (data: { id: number; value: string }) => saveToServer(data),\n * 500\n * );\n *\n * @example\n * // With options object and leading edge execution\n * const debouncedClick = debounce(\n * () => handleClick(),\n * { wait: 200, leading: true }\n * );\n *\n * @example\n * // Cleanup in Angular component\n * export class SearchComponent {\n * private debouncedSearch = debounce((q: string) => this.search(q), 300);\n *\n * ngOnDestroy(): void {\n * this.debouncedSearch.cancel();\n * }\n * }\n */\nexport function debounce<T extends (...args: never[]) => void>(\n fn: T,\n optionsOrWait: number | DebounceOptions = 300,\n): DebouncedFn<T> {\n const options: DebounceOptions =\n typeof optionsOrWait === 'number' ? { wait: optionsOrWait } : optionsOrWait;\n\n const wait = options.wait ?? 300;\n const leading = options.leading ?? false;\n\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let pendingArgs: Parameters<T> | null = null;\n let leadingInvoked = false;\n\n const invoke = (): void => {\n if (pendingArgs !== null) {\n fn(...pendingArgs);\n pendingArgs = null;\n }\n leadingInvoked = false;\n };\n\n const debounced = (...args: Parameters<T>): void => {\n pendingArgs = args;\n\n if (leading && !leadingInvoked) {\n leadingInvoked = true;\n invoke();\n }\n\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!leading || pendingArgs !== null) {\n invoke();\n }\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n pendingArgs = null;\n leadingInvoked = false;\n };\n\n debounced.flush = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n invoke();\n }\n };\n\n debounced.pending = (): boolean => timerId !== null;\n\n return debounced;\n}\n","/**\n * A throttled function wrapper with cancel capability.\n *\n * @template T - The type of the original function.\n */\nexport interface ThrottledFn<T extends (...args: never[]) => void> {\n /**\n * Calls the throttled function. Execution is rate-limited to at most\n * once per the specified wait period.\n */\n (...args: Parameters<T>): void;\n\n /**\n * Cancels any pending throttled call.\n * Useful for cleanup in component destruction.\n */\n cancel(): void;\n}\n\n/**\n * Creates a throttled version of the provided function that only invokes\n * at most once per the specified wait period.\n *\n * The function is invoked on the leading edge (immediately on first call)\n * and then at most once per wait period for subsequent calls.\n *\n * @template T - The type of the function to throttle.\n * @param fn - The function to throttle.\n * @param wait - The minimum time between invocations in milliseconds.\n * @returns The throttled function with a cancel method.\n *\n * @example\n * // Basic usage - scroll handler\n * const throttledScroll = throttle(() => {\n * console.log('Scroll position:', window.scrollY);\n * }, 100);\n * window.addEventListener('scroll', throttledScroll);\n *\n * @example\n * // With cleanup\n * export class ScrollComponent {\n * private throttledHandler = throttle((e: Event) => this.handleScroll(e), 100);\n *\n * ngOnDestroy(): void {\n * this.throttledHandler.cancel();\n * }\n * }\n */\nexport function throttle<T extends (...args: never[]) => void>(\n fn: T,\n wait: number,\n): ThrottledFn<T> {\n let lastCallTime = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let pendingArgs: Parameters<T> | null = null;\n\n const invoke = (args: Parameters<T>): void => {\n lastCallTime = Date.now();\n fn(...args);\n };\n\n const throttled = (...args: Parameters<T>): void => {\n const now = Date.now();\n const remaining = wait - (now - lastCallTime);\n\n if (remaining <= 0) {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n invoke(args);\n } else {\n pendingArgs = args;\n if (timerId === null) {\n timerId = setTimeout(() => {\n timerId = null;\n if (pendingArgs !== null) {\n invoke(pendingArgs);\n pendingArgs = null;\n }\n }, remaining);\n }\n }\n };\n\n throttled.cancel = (): void => {\n if (timerId !== null) {\n clearTimeout(timerId);\n timerId = null;\n }\n pendingArgs = null;\n };\n\n return throttled;\n}\n","/**\n * Configuration options for the retry function.\n */\nexport interface RetryOptions {\n /**\n * Maximum number of retry attempts.\n */\n readonly attempts: number;\n\n /**\n * Delay between retries in milliseconds.\n */\n readonly delay: number;\n\n /**\n * Multiplier for exponential backoff (optional).\n * Each retry delay is multiplied by this factor.\n * @default 1\n */\n readonly backoff?: number;\n\n /**\n * Optional predicate to determine if an error should trigger a retry.\n * @param error - The error that occurred.\n * @returns `true` to retry, `false` to fail immediately.\n */\n readonly shouldRetry?: (error: unknown) => boolean;\n}\n\n/**\n * Retries an async function with configurable attempts, delay, and backoff.\n *\n * @template T - The return type of the async function.\n * @param fn - The async function to retry.\n * @param options - Retry configuration.\n * @returns The result of the successful call.\n * @throws The last error if all attempts fail.\n *\n * @example\n * // Basic retry with 3 attempts\n * const data = await retry(\n * () => fetch('/api/data').then(r => r.json()),\n * { attempts: 3, delay: 1000 }\n * );\n *\n * @example\n * // With exponential backoff\n * const result = await retry(\n * () => unreliableApiCall(),\n * { attempts: 5, delay: 100, backoff: 2 } // delays: 100, 200, 400, 800, 1600\n * );\n *\n * @example\n * // With conditional retry\n * const result = await retry(\n * () => apiCall(),\n * {\n * attempts: 3,\n * delay: 500,\n * shouldRetry: (err) => err instanceof NetworkError\n * }\n * );\n */\nexport async function retry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<T> {\n const { attempts, delay, backoff = 1, shouldRetry } = options;\n\n let lastError: unknown;\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (shouldRetry && !shouldRetry(error)) {\n throw error;\n }\n\n if (attempt < attempts) {\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n currentDelay *= backoff;\n }\n }\n }\n\n throw lastError;\n}\n","/**\n * Creates a new object with only the specified keys from the source object.\n *\n * @template T - The type of the source object.\n * @template K - The keys to pick.\n * @param obj - The source object.\n * @param keys - The keys to pick from the object.\n * @returns A new object containing only the specified keys.\n *\n * @example\n * const user = { id: 1, name: 'John', email: 'john@example.com', age: 30 };\n * pick(user, ['id', 'name']); // { id: 1, name: 'John' }\n *\n * @example\n * const config = { host: 'localhost', port: 3000, debug: true };\n * pick(config, ['host', 'port']); // { host: 'localhost', port: 3000 }\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n","/**\n * Creates a new object with the specified keys omitted from the source object.\n *\n * @template T - The type of the source object.\n * @template K - The keys to omit.\n * @param obj - The source object.\n * @param keys - The keys to omit from the object.\n * @returns A new object without the specified keys.\n *\n * @example\n * const user = { id: 1, name: 'John', password: 'secret', email: 'john@example.com' };\n * omit(user, ['password']); // { id: 1, name: 'John', email: 'john@example.com' }\n *\n * @example\n * const config = { host: 'localhost', port: 3000, debug: true };\n * omit(config, ['debug']); // { host: 'localhost', port: 3000 }\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n}\n","/**\n * Creates a deep clone of a value, handling objects, arrays, Date, and RegExp.\n * Note: Does not handle circular references, functions, or special objects like Map, Set.\n * For complex cloning needs, consider using `structuredClone()`.\n *\n * @template T - The type of the value to clone.\n * @param value - The value to deep clone.\n * @returns A deep clone of the value.\n *\n * @example\n * const original = { a: 1, b: { c: 2, d: [3, 4] } };\n * const cloned = deepClone(original);\n * cloned.b.c = 5;\n * console.log(original.b.c); // 2 (unchanged)\n *\n * @example\n * const arr = [{ id: 1 }, { id: 2 }];\n * const clonedArr = deepClone(arr);\n * clonedArr[0].id = 99;\n * console.log(arr[0].id); // 1 (unchanged)\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // At this point, value is guaranteed to be a plain object\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n","/**\n * Checks if a value is a plain object (not null, not an array).\n *\n * @param value - The value to check.\n * @returns `true` if value is a plain object; otherwise, `false`.\n *\n * @example\n * isPlainObject({ a: 1 }); // true\n * isPlainObject([1, 2]); // false\n * isPlainObject(null); // false\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { deepClone } from './deep-clone';\nimport { isPlainObject } from './is-plain-object';\n\n/**\n * Deep merges multiple source objects into a new object.\n * Later sources override earlier ones. Arrays are replaced, not merged.\n *\n * @template T - The type of the resulting object.\n * @param sources - The source objects to merge.\n * @returns A new deeply merged object.\n *\n * @example\n * const defaults = { theme: { color: 'blue', size: 'md' }, debug: false };\n * const userConfig = { theme: { color: 'red' }, debug: true };\n * deepMerge(defaults, userConfig);\n * // { theme: { color: 'red', size: 'md' }, debug: true }\n *\n * @example\n * const a = { arr: [1, 2], nested: { x: 1 } };\n * const b = { arr: [3, 4], nested: { y: 2 } };\n * deepMerge(a, b);\n * // { arr: [3, 4], nested: { x: 1, y: 2 } } - arrays are replaced\n */\nexport function deepMerge<T extends object>(...sources: Partial<T>[]): T {\n const result: Record<string, unknown> = {};\n\n for (const source of sources) {\n if (typeof source !== 'object' || source === null) {\n continue;\n }\n\n for (const key of Object.keys(source)) {\n const sourceValue = (source as Record<string, unknown>)[key];\n const resultValue = result[key];\n\n if (Array.isArray(sourceValue)) {\n result[key] = deepClone(sourceValue);\n } else if (isPlainObject(sourceValue) && isPlainObject(resultValue)) {\n result[key] = deepMerge(\n resultValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else if (isPlainObject(sourceValue)) {\n result[key] = deepClone(sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n }\n\n return result as T;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Performs a deep equality comparison between two values.\n * Handles primitives, objects, arrays, Date, and RegExp.\n *\n * @template T - The type of values to compare.\n * @param a - The first value.\n * @param b - The second value.\n * @returns `true` if values are deeply equal; otherwise, `false`.\n *\n * @example\n * deepEqual({ a: 1, b: { c: 2 } }, { a: 1, b: { c: 2 } }); // true\n * deepEqual({ a: 1 }, { a: 2 }); // false\n * deepEqual([1, [2, 3]], [1, [2, 3]]); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * deepEqual(new Date('2024-01-01'), new Date('2024-01-01')); // true\n */\nexport function deepEqual<T>(a: T, b: T): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null) {\n return a === b;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n if (typeof a !== 'object') {\n return a === b;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n return false;\n}\n","/**\n * Utility type that recursively maps the object type to the type of the resolved path.\n *\n * @example\n * type A = { user: { profile: { name: string } } };\n * type Result = ResolvePath<A, 'user.profile.name'>; // Result is string\n */\nexport type ResolvePath<T, P extends string> = P extends `${infer Head}.${infer Tail}`\n ? Head extends keyof T\n ? ResolvePath<T[Head], Tail>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/**\n * Resolves a nested path in an object, returning the value at the specified path.\n *\n * This function splits the provided `path` into keys and iterates through the object to access the\n * corresponding value at each key. If any part of the path is undefined or if the path leads to a non-object,\n * it returns `undefined`.\n *\n * @template T - The type of the object.\n * @template P - The dot-separated string path type.\n * @param obj - The object to resolve the path within.\n * @param path - The dot-separated string representing the path to the value.\n * @returns The value at the resolved path, or `undefined` if any part of the path is invalid.\n *\n * @example\n * const obj = { user: { profile: { name: 'John Doe' } } };\n * const result = resolvePath(obj, 'user.profile.name');\n * console.log(result); // 'John Doe'\n *\n * @example\n * const result2 = resolvePath(obj, 'user.address.city');\n * console.log(result2); // undefined\n */\nexport function resolvePath<T extends object, P extends string>(\n obj: T,\n path: P,\n): ResolvePath<T, P> | undefined {\n const keys = path.split('.') as (keyof T)[];\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current && typeof current === 'object' && key in current) {\n current = (current as Record<string | number | symbol, unknown>)[key];\n } else {\n return undefined;\n }\n }\n\n return current as ResolvePath<T, P>;\n}\n","/**\n * Splits an array into chunks of the specified size.\n *\n * @template T - The type of array elements.\n * @param array - The array to split.\n * @param size - The size of each chunk (must be positive).\n * @returns An array of chunks.\n *\n * @example\n * chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]\n * chunk([1, 2, 3, 4], 2); // [[1, 2], [3, 4]]\n * chunk([1, 2, 3], 5); // [[1, 2, 3]]\n * chunk([], 2); // []\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (size <= 0) {\n throw new Error('Chunk size must be a positive number');\n }\n\n const result: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n return result;\n}\n","/**\n * Splits an array into two groups based on a predicate function.\n * The first array contains elements that satisfy the predicate,\n * the second contains elements that don't.\n *\n * @template T - The type of array elements.\n * @param array - The array to partition.\n * @param predicate - The function to test each element.\n * @returns A tuple of [truthy, falsy] arrays.\n *\n * @example\n * const numbers = [1, 2, 3, 4, 5, 6];\n * partition(numbers, n => n % 2 === 0); // [[2, 4, 6], [1, 3, 5]]\n *\n * @example\n * const users = [\n * { name: 'Alice', active: true },\n * { name: 'Bob', active: false },\n * { name: 'Charlie', active: true }\n * ];\n * partition(users, u => u.active);\n * // [[{ name: 'Alice', active: true }, { name: 'Charlie', active: true }], [{ name: 'Bob', active: false }]]\n */\nexport function partition<T>(array: T[], predicate: (item: T) => boolean): [T[], T[]] {\n const truthy: T[] = [];\n const falsy: T[] = [];\n\n for (const item of array) {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n }\n\n return [truthy, falsy];\n}\n","/**\n * Groups an array of items based on a provided predicate function.\n *\n * @template K - The type of keys produced by the predicate, typically a string, number, or symbol.\n * @template V - The type of items in the collection.\n * @param collection - The array of items to be grouped.\n * @param predicate - A function that takes an item and returns a key by which to group the item.\n * @returns An object where each key is a group identifier produced by the predicate,\n * and the value is an array of items belonging to that group.\n *\n * @example\n * // Group an array of people by their age\n * const people = [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 25 }, { name: 'Charlie', age: 30 }];\n * const groupedByAge = groupBy(people, person => person.age);\n * // Output:\n * // {\n * // 25: [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 25 }],\n * // 30: [{ name: 'Charlie', age: 30 }]\n * // }\n */\nexport function groupBy<K extends string | number | symbol, V>(\n collection: V[],\n predicate: (item: V) => K,\n): Record<K, V[]> {\n return collection.reduce(\n (groups, item) => {\n const groupKey = predicate(item);\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(item);\n return groups;\n },\n {} as Record<K, V[]>,\n );\n}\n","/**\n * ngx-com/utils\n * Utility function exports for ngx-com library\n */\n\nexport { mergeClasses } from './merge-classes';\nexport { joinClasses } from './join-classes';\n\n// Function utilities\nexport { debounce, type DebouncedFn, type DebounceOptions } from './debounce';\nexport { throttle, type ThrottledFn } from './throttle';\nexport { retry, type RetryOptions } from './retry';\n\n// Object utilities\nexport { pick } from './pick';\nexport { omit } from './omit';\nexport { deepClone } from './deep-clone';\nexport { deepMerge } from './deep-merge';\nexport { deepEqual } from './deep-equal';\nexport { isPlainObject } from './is-plain-object';\nexport { resolvePath, type ResolvePath } from './resolve-path';\n\n// Array utilities\nexport { chunk } from './chunk';\nexport { partition } from './partition';\nexport { groupBy } from './group-by';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * - ngx-com/utils
7
7
  * - ngx-com/tokens
8
8
  */
9
- const VERSION = '0.0.1';
9
+ const VERSION = '0.1.0';
10
10
 
11
11
  /**
12
12
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com.mjs","sources":["../../../projects/com/src/public-api.ts","../../../projects/com/src/ngx-com.ts"],"sourcesContent":["/**\n * Public API Surface of ngx-com\n *\n * For specific imports, use subpaths:\n * - ngx-com/components\n * - ngx-com/utils\n * - ngx-com/tokens\n */\n\nexport const VERSION = '0.0.1';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEI,MAAM,OAAO,GAAG;;ACTvB;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-com.mjs","sources":["../../../projects/com/src/public-api.ts","../../../projects/com/src/ngx-com.ts"],"sourcesContent":["/**\n * Public API Surface of ngx-com\n *\n * For specific imports, use subpaths:\n * - ngx-com/components\n * - ngx-com/utils\n * - ngx-com/tokens\n */\n\nexport const VERSION: string = '0.1.0';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEI,MAAM,OAAO,GAAW;;ACT/B;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,26 +1,53 @@
1
1
  {
2
2
  "name": "ngx-com",
3
- "version": "0.0.21",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "description": "A modern Angular component library built with signals, Tailwind CSS, and semantic design tokens",
6
+ "keywords": [
7
+ "angular",
8
+ "components",
9
+ "ui",
10
+ "tailwind",
11
+ "signals",
12
+ "design-system",
13
+ "accessible"
14
+ ],
15
+ "author": "avs2001",
4
16
  "repository": {
5
17
  "type": "git",
6
- "url": "https://github.com/avs2001/ngx-com"
18
+ "url": "https://github.com/avs2001/ngx-com.git",
19
+ "directory": "projects/com"
7
20
  },
21
+ "bugs": {
22
+ "url": "https://github.com/avs2001/ngx-com/issues"
23
+ },
24
+ "homepage": "https://github.com/avs2001/ngx-com#readme",
8
25
  "peerDependencies": {
9
26
  "@angular/common": "^21.0.0",
10
27
  "@angular/core": "^21.0.0",
11
28
  "@angular/cdk": "^21.0.0",
12
29
  "@angular/forms": "^21.0.0",
13
30
  "@angular/router": "^21.0.0",
14
- "rxjs": "~7.8.0",
15
- "lucide-angular": ">=0.575.0 <1.0.0",
31
+ "rxjs": "^7.8.0",
32
+ "lucide-angular": ">=0.575.0 <1.0.0"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "@angular/router": {
36
+ "optional": true
37
+ },
38
+ "lucide-angular": {
39
+ "optional": true
40
+ }
41
+ },
42
+ "dependencies": {
43
+ "tslib": "^2.3.0",
16
44
  "class-variance-authority": "^0.7.1",
17
45
  "clsx": "^2.1.1",
18
46
  "tailwind-merge": "^3.5.0"
19
47
  },
20
- "dependencies": {
21
- "tslib": "^2.3.0"
22
- },
23
- "sideEffects": false,
48
+ "sideEffects": [
49
+ "*.css"
50
+ ],
24
51
  "module": "fesm2022/ngx-com.mjs",
25
52
  "typings": "types/ngx-com.d.ts",
26
53
  "exports": {
@@ -79,6 +106,10 @@
79
106
  "types": "./types/ngx-com-components-confirm.d.ts",
80
107
  "default": "./fesm2022/ngx-com-components-confirm.mjs"
81
108
  },
109
+ "./components/datepicker": {
110
+ "types": "./types/ngx-com-components-datepicker.d.ts",
111
+ "default": "./fesm2022/ngx-com-components-datepicker.mjs"
112
+ },
82
113
  "./components/dialog": {
83
114
  "types": "./types/ngx-com-components-dialog.d.ts",
84
115
  "default": "./fesm2022/ngx-com-components-dialog.mjs"
@@ -103,6 +134,10 @@
103
134
  "types": "./types/ngx-com-components-icon.d.ts",
104
135
  "default": "./fesm2022/ngx-com-components-icon.mjs"
105
136
  },
137
+ "./components/icon/lucide": {
138
+ "types": "./types/ngx-com-components-icon-lucide.d.ts",
139
+ "default": "./fesm2022/ngx-com-components-icon-lucide.mjs"
140
+ },
106
141
  "./components/item": {
107
142
  "types": "./types/ngx-com-components-item.d.ts",
108
143
  "default": "./fesm2022/ngx-com-components-item.mjs"
@@ -111,6 +146,10 @@
111
146
  "types": "./types/ngx-com-components-menu.d.ts",
112
147
  "default": "./fesm2022/ngx-com-components-menu.mjs"
113
148
  },
149
+ "./components/native-control": {
150
+ "types": "./types/ngx-com-components-native-control.d.ts",
151
+ "default": "./fesm2022/ngx-com-components-native-control.mjs"
152
+ },
114
153
  "./components/paginator": {
115
154
  "types": "./types/ngx-com-components-paginator.d.ts",
116
155
  "default": "./fesm2022/ngx-com-components-paginator.mjs"
@@ -151,6 +190,10 @@
151
190
  "types": "./types/ngx-com-components-tabs.d.ts",
152
191
  "default": "./fesm2022/ngx-com-components-tabs.mjs"
153
192
  },
193
+ "./components/timepicker": {
194
+ "types": "./types/ngx-com-components-timepicker.d.ts",
195
+ "default": "./fesm2022/ngx-com-components-timepicker.mjs"
196
+ },
154
197
  "./components/toast": {
155
198
  "types": "./types/ngx-com-components-toast.d.ts",
156
199
  "default": "./fesm2022/ngx-com-components-toast.mjs"
@@ -0,0 +1,38 @@
1
+ @keyframes fade-in {
2
+ from {
3
+ opacity: 0;
4
+ }
5
+ to {
6
+ opacity: 1;
7
+ }
8
+ }
9
+
10
+ @keyframes slide-up {
11
+ from {
12
+ opacity: 0;
13
+ transform: translateY(0.5rem);
14
+ }
15
+ to {
16
+ opacity: 1;
17
+ transform: translateY(0);
18
+ }
19
+ }
20
+
21
+ @keyframes scale-in {
22
+ from {
23
+ opacity: 0;
24
+ transform: scale(0.95);
25
+ }
26
+ to {
27
+ opacity: 1;
28
+ transform: scale(1);
29
+ }
30
+ }
31
+
32
+ @media (prefers-reduced-motion: reduce) {
33
+ .animate-fade-in,
34
+ .animate-slide-up,
35
+ .animate-scale-in {
36
+ animation: none !important;
37
+ }
38
+ }