@snatuva/primitives 0.0.6 → 0.0.7

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  🚀 **Signals-first Angular primitives library** for building scalable, reusable UI components.
4
4
 
5
- Designed for modern Angular (v17+), this library provides low-level building blocks ("primitives") to help you create consistent, accessible, and high-performance UI systems.
5
+ Designed for modern Angular (v21+), this library provides low-level building blocks ("primitives") to help you create consistent, accessible, and high-performance UI systems.
6
6
 
7
7
  ---
8
8
 
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, Injectable, Directive, inject, Input, ElementRef, HostBinding, effect, input, TemplateRef, contentChild, contentChildren, ViewContainerRef, Injector, runInInjectionContext } from '@angular/core';
2
+ import { signal, computed, Injectable, Directive, inject, Input, ElementRef, HostBinding, effect, input, TemplateRef, ViewContainerRef, Injector, contentChild, runInInjectionContext } from '@angular/core';
3
3
  import * as i1 from '@angular/aria/tabs';
4
4
  import { Tabs, TabPanel, Tab, TabList } from '@angular/aria/tabs';
5
5
  import { ComponentHarness } from '@angular/cdk/testing';
@@ -313,9 +313,10 @@ class TabsHarness extends ComponentHarness {
313
313
  }
314
314
 
315
315
  class TooltipState {
316
- /** Whether tooltip is open */
316
+ constructor() {
317
+ console.log('TooltipState created');
318
+ }
317
319
  open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
318
- /** ID of the tooltip content */
319
320
  tooltipId = signal(null, ...(ngDevMode ? [{ debugName: "tooltipId" }] : []));
320
321
  openTooltip() {
321
322
  this.open.set(true);
@@ -334,23 +335,48 @@ class TooltipState {
334
335
  class TooltipTriggerDirective {
335
336
  state = inject(TooltipState);
336
337
  element = inject((ElementRef));
338
+ showDelay = 300;
339
+ hideDelay = 150;
340
+ showTimeout;
341
+ hideTimeout;
337
342
  onMouseEnter() {
338
- this.state.openTooltip();
343
+ this.clearTimeouts();
344
+ this.showTimeout = window.setTimeout(() => {
345
+ this.state.openTooltip();
346
+ }, this.showDelay);
339
347
  }
340
348
  onMouseLeave() {
341
- this.state.closeTooltip();
349
+ this.clearTimeouts();
350
+ this.hideTimeout = window.setTimeout(() => {
351
+ this.state.closeTooltip();
352
+ }, this.hideDelay);
342
353
  }
343
354
  onFocus() {
355
+ this.clearTimeouts();
344
356
  this.state.openTooltip();
345
357
  }
346
358
  onBlur() {
347
- this.state.closeTooltip();
359
+ this.clearTimeouts();
360
+ this.hideTimeout = window.setTimeout(() => {
361
+ this.state.closeTooltip();
362
+ }, this.hideDelay);
348
363
  }
349
364
  onEscape() {
365
+ this.clearTimeouts();
350
366
  this.state.closeTooltip();
351
367
  }
368
+ clearTimeouts() {
369
+ if (this.showTimeout) {
370
+ clearTimeout(this.showTimeout);
371
+ this.showTimeout = undefined;
372
+ }
373
+ if (this.hideTimeout) {
374
+ clearTimeout(this.hideTimeout);
375
+ this.hideTimeout = undefined;
376
+ }
377
+ }
352
378
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
353
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipTriggerDirective, isStandalone: true, selector: "[apTooltipTrigger]", host: { attributes: { "role": "button" }, listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()", "keydown.escape": "onEscape()" }, properties: { "attr.tabindex": "0", "attr.aria-describedby": "state.tooltipId()", "attr.aria-expanded": "state.open()" } }, ngImport: i0 });
379
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipTriggerDirective, isStandalone: true, selector: "[apTooltipTrigger]", inputs: { showDelay: "showDelay", hideDelay: "hideDelay" }, host: { attributes: { "role": "button" }, listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()", "keydown.escape": "onEscape()" }, properties: { "attr.tabindex": "0", "attr.aria-describedby": "state.tooltipId()", "attr.aria-expanded": "state.open()" } }, ngImport: i0 });
354
380
  }
355
381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipTriggerDirective, decorators: [{
356
382
  type: Directive,
@@ -369,23 +395,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
369
395
  '[attr.aria-expanded]': 'state.open()'
370
396
  }
371
397
  }]
372
- }] });
398
+ }], propDecorators: { showDelay: [{
399
+ type: Input
400
+ }], hideDelay: [{
401
+ type: Input
402
+ }] } });
373
403
 
374
404
  class TooltipContentDirective {
375
- template = inject((TemplateRef));
376
405
  tooltipId = `ap-tooltip-${Math.random().toString(36).substr(2, 9)}`;
406
+ templateRef = inject(TemplateRef);
407
+ vcr = inject(ViewContainerRef);
377
408
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
378
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipContentDirective, isStandalone: true, selector: "[apTooltipContent]", inputs: { tooltipId: "tooltipId" }, host: { attributes: { "role": "tooltip" }, properties: { "id": "tooltipId" } }, ngImport: i0 });
409
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipContentDirective, isStandalone: true, selector: "ng-template[apTooltipContent]", inputs: { tooltipId: "tooltipId" }, ngImport: i0 });
379
410
  }
380
411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipContentDirective, decorators: [{
381
412
  type: Directive,
382
413
  args: [{
383
- selector: '[apTooltipContent]',
414
+ selector: 'ng-template[apTooltipContent]',
384
415
  standalone: true,
385
- host: {
386
- 'role': 'tooltip',
387
- '[id]': 'tooltipId'
388
- }
389
416
  }]
390
417
  }], propDecorators: { tooltipId: [{
391
418
  type: Input
@@ -393,23 +420,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
393
420
 
394
421
  class TooltipOverlay {
395
422
  overlay;
396
- vcr;
397
423
  origin;
398
424
  overlayRef;
399
- constructor(overlay, vcr, origin) {
425
+ constructor(overlay, origin) {
400
426
  this.overlay = overlay;
401
- this.vcr = vcr;
402
427
  this.origin = origin;
403
428
  }
404
- attach(template) {
429
+ // tooltip.overlay.ts
430
+ attach(template, vcr) {
405
431
  if (!this.overlayRef) {
406
432
  this.overlayRef = this.createOverlay();
407
433
  }
408
434
  if (!this.overlayRef.hasAttached()) {
409
- const portal = new TemplatePortal(template, this.vcr);
435
+ const portal = new TemplatePortal(template, vcr); // ✅ correct vcr
410
436
  this.overlayRef.attach(portal);
411
437
  }
412
438
  }
439
+ setAttributes(attrs) {
440
+ if (this.overlayRef) {
441
+ const element = this.overlayRef.overlayElement;
442
+ for (const [key, value] of Object.entries(attrs)) {
443
+ element.setAttribute(key, value);
444
+ }
445
+ }
446
+ }
413
447
  detach() {
414
448
  this.overlayRef?.detach();
415
449
  }
@@ -436,96 +470,106 @@ class TooltipOverlay {
436
470
  overlayX: 'center',
437
471
  overlayY: 'top',
438
472
  offsetY: 8
473
+ },
474
+ {
475
+ originX: 'start',
476
+ originY: 'top',
477
+ overlayX: 'start',
478
+ overlayY: 'bottom',
479
+ offsetY: -8
480
+ },
481
+ {
482
+ originX: 'end',
483
+ originY: 'top',
484
+ overlayX: 'end',
485
+ overlayY: 'bottom',
486
+ offsetY: -8
487
+ },
488
+ {
489
+ originX: 'start',
490
+ originY: 'bottom',
491
+ overlayX: 'start',
492
+ overlayY: 'top',
493
+ offsetY: 8
494
+ },
495
+ {
496
+ originX: 'end',
497
+ originY: 'bottom',
498
+ overlayX: 'end',
499
+ overlayY: 'top',
500
+ offsetY: 8
439
501
  }
440
502
  ]);
441
503
  return this.overlay.create({
442
504
  positionStrategy,
443
505
  scrollStrategy: this.overlay.scrollStrategies.reposition(),
444
- hasBackdrop: false
506
+ hasBackdrop: false,
507
+ panelClass: 'ap-tooltip-panel'
445
508
  });
446
509
  }
447
510
  }
448
511
 
449
512
  class TooltipDirective {
450
- destroy$ = new Subject();
451
513
  state = inject(TooltipState);
452
- content = contentChild(TooltipContentDirective, ...(ngDevMode ? [{ debugName: "content" }] : []));
453
- triggers = contentChildren(TooltipTriggerDirective, ...(ngDevMode ? [{ debugName: "triggers" }] : []));
454
- overlay = null;
455
- overlayService = inject(Overlay);
514
+ overlay = inject(Overlay);
456
515
  vcr = inject(ViewContainerRef);
457
516
  injector = inject(Injector);
458
517
  document = inject(DOCUMENT);
459
- constructor() {
460
- runInInjectionContext(this.injector, () => {
461
- effect(() => {
462
- if (!this.state.open()) {
463
- return;
464
- }
465
- const sub = fromEvent(this.document, 'keydown')
466
- .pipe(filter(e => e.key === 'Escape'), takeUntil(this.destroy$))
467
- .subscribe(() => {
468
- this.state.closeTooltip();
469
- });
470
- // Cleanup when tooltip closes
471
- return () => sub.unsubscribe();
472
- });
473
- });
474
- }
518
+ tooltipOverlay;
519
+ destroy$ = new Subject();
520
+ contentTemplate = contentChild(TooltipContentDirective, ...(ngDevMode ? [{ debugName: "contentTemplate" }] : []));
521
+ trigger = contentChild(TooltipTriggerDirective, ...(ngDevMode ? [{ debugName: "trigger" }] : []));
475
522
  ngAfterContentInit() {
523
+ console.log('contentTemplate', this.contentTemplate());
524
+ console.log('trigger', this.trigger());
525
+ console.log('templateRef', this.contentTemplate()?.templateRef);
526
+ console.log('vcr', this.contentTemplate()?.vcr);
527
+ const content = this.contentTemplate();
528
+ if (content) {
529
+ this.state.setTooltipId(content.tooltipId);
530
+ }
531
+ fromEvent(this.document, 'keydown')
532
+ .pipe(filter(event => event.key === 'Escape'), takeUntil(this.destroy$))
533
+ .subscribe(() => this.state.closeTooltip());
476
534
  runInInjectionContext(this.injector, () => {
477
535
  effect(() => {
478
- const content = this.content();
479
- const triggers = this.triggers();
480
- // Early return if required elements are missing
481
- if (!content || triggers.length === 0) {
482
- return;
536
+ const isOpen = this.state.open();
537
+ const template = this.contentTemplate()?.templateRef;
538
+ const triggerElement = this.trigger()?.element.nativeElement;
539
+ // Read all signals first, then act — avoids partial reactive state
540
+ if (isOpen && template && triggerElement) {
541
+ this.showTooltip();
483
542
  }
484
- this.state.setTooltipId(content.tooltipId);
485
- // Create overlay only once
486
- if (!this.overlay) {
487
- const origin = triggers[0].element.nativeElement;
488
- this.overlay = new TooltipOverlay(this.overlayService, this.vcr, origin);
489
- this.overlay
490
- .keydownEvents()
491
- ?.pipe(filter(event => event.key === 'Escape'), takeUntil(this.destroy$))
492
- .subscribe(() => {
493
- this.state.closeTooltip();
494
- });
495
- }
496
- // Toggle tooltip visibility
497
- if (this.state.open()) {
498
- this.showTooltip(content);
499
- }
500
- else {
543
+ else if (!isOpen) {
501
544
  this.hideTooltip();
502
545
  }
503
546
  });
504
547
  });
505
548
  }
506
- showTooltip(content) {
507
- if (!this.overlay)
549
+ showTooltip() {
550
+ const content = this.contentTemplate();
551
+ const triggerElement = this.trigger()?.element.nativeElement;
552
+ if (!content || !triggerElement)
508
553
  return;
509
- // Clear any existing content
510
- this.vcr.clear();
511
- console.log('Showing tooltip');
512
- // Create and attach the tooltip content
513
- this.vcr.createEmbeddedView(content.template);
514
- // this.overlay.attach(viewRef);
515
- }
516
- hideTooltip() {
517
- this.vcr.clear();
518
- this.overlay?.detach();
554
+ if (!this.tooltipOverlay) {
555
+ this.tooltipOverlay = new TooltipOverlay(this.overlay, triggerElement);
556
+ }
557
+ this.tooltipOverlay.attach(content.templateRef, content.vcr); //
558
+ this.tooltipOverlay.setAttributes({
559
+ role: 'tooltip',
560
+ id: this.state.tooltipId() ?? 'tooltip'
561
+ });
519
562
  }
520
563
  ngOnDestroy() {
521
- this.vcr.clear();
522
- this.overlay?.destroy();
523
- this.overlay = null;
524
564
  this.destroy$.next();
525
565
  this.destroy$.complete();
566
+ this.tooltipOverlay?.destroy();
567
+ }
568
+ hideTooltip() {
569
+ this.tooltipOverlay?.detach();
526
570
  }
527
571
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
528
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.0.6", type: TooltipDirective, isStandalone: true, selector: "[apTooltip]", providers: [TooltipState], queries: [{ propertyName: "content", first: true, predicate: TooltipContentDirective, descendants: true, isSignal: true }, { propertyName: "triggers", predicate: TooltipTriggerDirective, isSignal: true }], ngImport: i0 });
572
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.0.6", type: TooltipDirective, isStandalone: true, selector: "[apTooltip]", providers: [TooltipState], queries: [{ propertyName: "contentTemplate", first: true, predicate: TooltipContentDirective, descendants: true, isSignal: true }, { propertyName: "trigger", first: true, predicate: TooltipTriggerDirective, descendants: true, isSignal: true }], ngImport: i0 });
529
573
  }
530
574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipDirective, decorators: [{
531
575
  type: Directive,
@@ -534,7 +578,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
534
578
  standalone: true,
535
579
  providers: [TooltipState],
536
580
  }]
537
- }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TooltipContentDirective), { isSignal: true }] }], triggers: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TooltipTriggerDirective), { isSignal: true }] }] } });
581
+ }], propDecorators: { contentTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TooltipContentDirective), { isSignal: true }] }], trigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TooltipTriggerDirective), { isSignal: true }] }] } });
538
582
 
539
583
  class TooltipTriggerHarness extends ComponentHarness {
540
584
  static hostSelector = '[apTooltipTrigger]';
@@ -542,6 +586,10 @@ class TooltipTriggerHarness extends ComponentHarness {
542
586
  const host = await this.host();
543
587
  return host.getAttribute('aria-describedby');
544
588
  }
589
+ async getAriaExpanded() {
590
+ const host = await this.host();
591
+ return host.getAttribute('aria-expanded');
592
+ }
545
593
  async click() {
546
594
  const host = await this.host();
547
595
  return host.click();
@@ -554,9 +602,17 @@ class TooltipTriggerHarness extends ComponentHarness {
554
602
  const host = await this.host();
555
603
  return host.blur();
556
604
  }
605
+ async hover() {
606
+ const host = await this.host();
607
+ await host.hover();
608
+ }
609
+ async unhover() {
610
+ const host = await this.host();
611
+ await host.mouseAway();
612
+ }
557
613
  }
558
614
  class TooltipContentHarness extends ComponentHarness {
559
- static hostSelector = '[apTooltipContent]';
615
+ static hostSelector = '.tooltip-content';
560
616
  async getRole() {
561
617
  const host = await this.host();
562
618
  return host.getAttribute('role');
@@ -574,14 +630,11 @@ class TooltipHarness extends ComponentHarness {
574
630
  async getTrigger() {
575
631
  return this.locatorFor(TooltipTriggerHarness)();
576
632
  }
577
- async getContent() {
578
- return this.locatorFor(TooltipContentHarness)();
579
- }
580
633
  async isOpen() {
581
- // Check if content is present or visible
634
+ // Check if tooltip content exists in overlay
582
635
  try {
583
- const content = await this.getContent();
584
- return true; // If found, assume open
636
+ const tooltipElements = document.querySelectorAll('[role="tooltip"]');
637
+ return tooltipElements.length > 0;
585
638
  }
586
639
  catch {
587
640
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"snatuva-primitives.mjs","sources":["../../../projects/primitives/src/lib/tabs/tabs.state.ts","../../../projects/primitives/src/lib/tabs/tabs.directive.ts","../../../projects/primitives/src/lib/tabs/tab-panel.directive.ts","../../../projects/primitives/src/lib/tabs/tab-trigger.directive.ts","../../../projects/primitives/src/lib/tabs/tab-content.directive.ts","../../../projects/primitives/src/lib/tabs/tabs-list.directive.ts","../../../projects/primitives/src/lib/tabs/tabs.harness.ts","../../../projects/primitives/src/lib/tooltip/tooltip.state.ts","../../../projects/primitives/src/lib/tooltip/tooltip-trigger.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip-content.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip.overlay.ts","../../../projects/primitives/src/lib/tooltip/tooltip.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip.harness.ts","../../../projects/primitives/src/public-api.ts","../../../projects/primitives/src/snatuva-primitives.ts"],"sourcesContent":["import { signal, computed, Inject, Injectable } from '@angular/core';\n\nexport interface TabPanel {\n id: string;\n disabled: boolean;\n}\n\n@Injectable()\nexport class TabsState {\n private readonly _panels = signal<TabPanel[]>([]);\n private readonly _activeId = signal<string | null>(null);\n\n readonly panels = this._panels.asReadonly();\n readonly activeId = this._activeId.asReadonly();\n\n readonly activePanel = computed(() =>\n this._panels().find(p => p.id === this._activeId())\n );\n\n register(panel: TabPanel): void {\n this._panels.update(p => [...p, panel]);\n\n if (!this._activeId()) {\n this._activeId.set(panel.id);\n }\n }\n\n unregister(id: string): void {\n this._panels.update(p => p.filter(x => x.id !== id));\n\n if (this._activeId() === id) {\n this._activeId.set(this._panels()[0]?.id ?? null);\n }\n }\n\n activate(id: string): void {\n const panel = this._panels().find(p => p.id === id && !p.disabled);\n if (panel) {\n this._activeId.set(id);\n }\n }\n}\n","import { AfterContentInit, ContentChildren, Directive, effect, HostListener, inject, Injector, QueryList, runInInjectionContext } from '@angular/core';\nimport { TabsState } from './tabs.state';\nimport { TabTriggerDirective } from './tab-trigger.directive';\n// import { TabsKeyboardController } from './tabs.keyboard';\nimport { Tabs } from '@angular/aria/tabs';\n\nexport type SelectionMode = 'follow' | 'explicit';\n\n@Directive({\n selector: '[apTabs]',\n standalone: true,\n exportAs: 'apTabs',\n providers: [\n TabsState\n ],\n hostDirectives: [{\n directive: Tabs\n }]\n})\nexport class TabsDirective { }\n","import { Directive, OnInit, OnDestroy, inject, Input } from '@angular/core';\nimport { TabsState } from './tabs.state';\nimport { TabPanel } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabPanel]',\n standalone: true,\n exportAs: 'apTabPanel',\n host: {\n 'role': 'tabpanel',\n '[attr.aria-labelledby]': '`ap-tab-${ariaPanel.value()}`',\n '[attr.id]': '`ap-panel-${ariaPanel.value()}`',\n '[style.display]': 'isActive() ? \"block\" : \"none\"',\n '[hidden]': '!isActive()'\n },\n hostDirectives: [{\n directive: TabPanel,\n // We map the public \"id\" attribute of your directive \n // to the \"value\" property of the TabPanel primitive.\n inputs: ['id', 'value']\n }]\n})\nexport class TabPanelDirective implements OnInit, OnDestroy {\n // 1. Inject the host directive instance\n protected ariaPanel = inject(TabPanel);\n\n @Input() disabled = false;\n private state = inject(TabsState);\n\n ngOnInit(): void {\n // 2. Use ariaPanel.value (which holds the 'id' passed by the user)\n this.state.register({\n id: this.ariaPanel.value() as string,\n disabled: this.disabled\n });\n }\n\n ngOnDestroy(): void {\n this.state.unregister(this.ariaPanel.value() as string);\n }\n\n isActive(): boolean {\n return this.state.activeId() === this.ariaPanel.value();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.stopPropagation();\n }\n }\n}","import { Directive, ElementRef, HostBinding, inject, Input } from '@angular/core';\nimport { FocusableOption } from '@angular/cdk/a11y';\nimport { TabPanel, TabsState } from './tabs.state';\nimport { Tab } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabTrigger]',\n standalone: true,\n host: {\n 'role': 'tab',\n '[attr.aria-selected]': 'state.activeId() === tabId',\n '[attr.aria-disabled]': 'disabled',\n '[tabindex]': 'state.activeId() === tabId ? \"0\" : \"-1\"',\n '(keydown)': 'onKeydown($event)',\n '(click)': 'activate()'\n },\n providers: [\n { provide: Tab, useExisting: Tab }\n ],\n hostDirectives: [{\n directive: Tab,\n inputs: ['value: tabId']\n }]\n})\nexport class TabTriggerDirective implements FocusableOption {\n @Input({ required: true }) tabId: string = '';\n @Input() disabled = false;\n state = inject(TabsState);\n el = inject(ElementRef<HTMLElement>);\n activate(): void {\n this.state.activate(this.tabId);\n }\n\n onKeydown(event: KeyboardEvent) {\n const active = this.state.panels().filter(t => !t.disabled);\n const idx = active.findIndex(t => t.id === this.tabId);\n let next: TabPanel | undefined;\n switch (event.key) {\n\n case 'ArrowRight':\n case 'ArrowDown':\n next = active[(idx + 1) % active.length]; break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = active[(idx - 1 + active.length) % active.length]; break;\n case 'Home': next = active[0]; break;\n case 'End': next = active[active.length - 1]; break;\n }\n\n if (next) {\n event.preventDefault();\n this.state.activate(next.id);\n this.focus();\n }\n }\n\n focus(): void {\n this.el.nativeElement.focus();\n }\n\n @HostBinding('attr.id')\n get id() {\n return `ap-tab-${this.tabId}`;\n }\n\n @HostBinding('attr.aria-controls')\n get controls() {\n return `ap-panel-${this.tabId}`;\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { TabsState } from './tabs.state';\n\n@Directive({\n selector: '[apTabContent]'\n})\nexport class TabContentDirective {\n @Input({ required: true }) tabId!: string;\n private state = inject(TabsState);\n constructor(\n template: TemplateRef<unknown>,\n vcr: ViewContainerRef\n ) {\n effect(() => {\n vcr.clear();\n\n if (this.state.activeId() === this.tabId) {\n vcr.createEmbeddedView(template);\n }\n });\n }\n}\n","import { Directive, input } from '@angular/core';\nimport { TabList } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabList]',\n standalone: true,\n host: {\n 'role': 'tablist',\n '[attr.aria-orientation]': 'orientation()',\n },\n hostDirectives: [{\n directive: TabList\n }]\n})\nexport class TabListDirective {\n //TODO: We can use the input() function to create a reactive input for orientation, which will automatically update the aria-orientation attribute when it changes.\n orientation = input('horizontal');\n}","import { ComponentHarness } from '@angular/cdk/testing';\n\nexport class TabTriggerHarness extends ComponentHarness {\n static hostSelector = '[apTabTrigger]';\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n async isActive(): Promise<boolean> {\n const host = await this.host();\n const ariaSelected = await host.getAttribute('aria-selected');\n return ariaSelected === 'true';\n }\n\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n async getTabId(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('tabId');\n }\n\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n const ariaDisabled = await host.getAttribute('aria-disabled');\n return ariaDisabled === 'true';\n }\n}\n\nexport class TabPanelHarness extends ComponentHarness {\n static hostSelector = '[apTabPanel]';\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n async isActive(): Promise<boolean> {\n const host = await this.host();\n const ariaHidden = await host.getAttribute('aria-hidden');\n return ariaHidden !== 'true';\n }\n\n async getRole(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('role');\n }\n}\n\nexport class TabsHarness extends ComponentHarness {\n static hostSelector = '[apTabs]';\n\n async getTabTriggers(): Promise<TabTriggerHarness[]> {\n return this.locatorForAll(TabTriggerHarness)();\n }\n\n async getTabPanels(): Promise<TabPanelHarness[]> {\n return this.locatorForAll(TabPanelHarness)();\n }\n\n async getActiveTab(): Promise<TabTriggerHarness | null> {\n const triggers = await this.getTabTriggers();\n for (const trigger of triggers) {\n if (await trigger.isActive()) {\n return trigger;\n }\n }\n return null;\n }\n\n async selectTabByText(text: string): Promise<void> {\n const triggers = await this.getTabTriggers();\n for (const trigger of triggers) {\n if ((await trigger.getText()) === text) {\n await trigger.click();\n return;\n }\n }\n throw new Error(`Tab with text \"${text}\" not found`);\n }\n\n async selectTabByIndex(index: number): Promise<void> {\n const triggers = await this.getTabTriggers();\n if (index < 0 || index >= triggers.length) {\n throw new Error(`Tab index ${index} out of range`);\n }\n await triggers[index].click();\n }\n}","import { signal } from '@angular/core';\n\nexport class TooltipState {\n /** Whether tooltip is open */\n readonly open = signal(false);\n /** ID of the tooltip content */\n readonly tooltipId = signal<string | null>(null);\n\n openTooltip() {\n this.open.set(true);\n }\n\n closeTooltip() {\n this.open.set(false);\n }\n\n toggle() {\n this.open.update(v => !v);\n }\n\n setTooltipId(id: string) {\n this.tooltipId.set(id);\n }\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n inject,\n} from '@angular/core';\nimport { TooltipState } from './tooltip.state';\n\n@Directive({\n selector: '[apTooltipTrigger]',\n standalone: true,\n host: {\n 'role': 'button',\n '[attr.tabindex]': '0',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(keydown.escape)': 'onEscape()',\n '[attr.aria-describedby]': 'state.tooltipId()',\n '[attr.aria-expanded]': 'state.open()'\n }\n})\nexport class TooltipTriggerDirective {\n readonly state = inject(TooltipState);\n readonly element = inject(ElementRef<HTMLElement>);\n\n onMouseEnter() {\n this.state.openTooltip();\n }\n\n onMouseLeave() {\n this.state.closeTooltip();\n }\n\n onFocus() {\n this.state.openTooltip();\n }\n\n onBlur() {\n this.state.closeTooltip();\n }\n\n onEscape() {\n this.state.closeTooltip();\n }\n}\n\n","import {\n Directive,\n TemplateRef,\n inject,\n Input,\n} from '@angular/core';\n\n@Directive({\n selector: '[apTooltipContent]',\n standalone: true,\n host: {\n 'role': 'tooltip',\n '[id]': 'tooltipId'\n }\n})\nexport class TooltipContentDirective {\n readonly template = inject(TemplateRef<void>);\n @Input() tooltipId: string = `ap-tooltip-${Math.random().toString(36).substr(2, 9)}`;\n}\n","import {\n Overlay,\n OverlayRef\n} from '@angular/cdk/overlay';\nimport { TemplateRef, ViewContainerRef } from '@angular/core';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Observable } from 'rxjs';\n\nexport class TooltipOverlay {\n private overlayRef?: OverlayRef;\n\n constructor(\n private readonly overlay: Overlay,\n private readonly vcr: ViewContainerRef,\n private readonly origin: HTMLElement\n ) { }\n\n attach(template: TemplateRef<unknown>): void {\n if (!this.overlayRef) {\n this.overlayRef = this.createOverlay();\n }\n\n if (!this.overlayRef.hasAttached()) {\n const portal = new TemplatePortal(template, this.vcr);\n this.overlayRef.attach(portal);\n }\n }\n\n detach(): void {\n this.overlayRef?.detach();\n }\n\n destroy(): void {\n this.overlayRef?.dispose();\n }\n\n keydownEvents(): Observable<KeyboardEvent> | null {\n return this.overlayRef?.keydownEvents() ?? null;\n }\n\n private createOverlay(): OverlayRef {\n const positionStrategy =\n this.overlay.position()\n .flexibleConnectedTo(this.origin)\n .withPositions([\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8\n }\n ]);\n\n return this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false\n });\n }\n}\n","import {\n AfterContentInit,\n contentChild,\n contentChildren,\n Directive,\n effect,\n inject,\n Injector,\n OnDestroy,\n runInInjectionContext,\n ViewContainerRef,\n} from '@angular/core';\nimport { TooltipState } from './tooltip.state';\nimport { TooltipContentDirective } from './tooltip-content.directive';\nimport { TooltipTriggerDirective } from './tooltip-trigger.directive';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { TooltipOverlay } from './tooltip.overlay';\nimport { filter, fromEvent, Subject, takeUntil } from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\n\n@Directive({\n selector: '[apTooltip]',\n standalone: true,\n providers: [TooltipState],\n})\nexport class TooltipDirective implements AfterContentInit, OnDestroy {\n\n private readonly destroy$ = new Subject<void>();\n state = inject(TooltipState);\n\n content = contentChild(TooltipContentDirective);\n triggers = contentChildren(TooltipTriggerDirective);\n\n private overlay: TooltipOverlay | null = null;\n\n private readonly overlayService = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n runInInjectionContext(this.injector, () => {\n effect(() => {\n if (!this.state.open()) {\n return;\n }\n\n const sub = fromEvent<KeyboardEvent>(\n this.document,\n 'keydown'\n )\n .pipe(\n filter(e => e.key === 'Escape'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.state.closeTooltip();\n });\n\n // Cleanup when tooltip closes\n return () => sub.unsubscribe();\n });\n });\n }\n\n ngAfterContentInit(): void {\n runInInjectionContext(this.injector, () => {\n effect(() => {\n const content = this.content();\n const triggers = this.triggers();\n\n // Early return if required elements are missing\n if (!content || triggers.length === 0) {\n return;\n }\n\n this.state.setTooltipId(content.tooltipId);\n\n // Create overlay only once\n if (!this.overlay) {\n const origin = triggers[0].element.nativeElement;\n this.overlay = new TooltipOverlay(\n this.overlayService,\n this.vcr,\n origin\n );\n\n this.overlay\n .keydownEvents()\n ?.pipe(\n filter(event => event.key === 'Escape'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.state.closeTooltip();\n });\n }\n\n // Toggle tooltip visibility\n if (this.state.open()) {\n this.showTooltip(content);\n } else {\n this.hideTooltip();\n }\n });\n });\n }\n\n private showTooltip(content: TooltipContentDirective): void {\n if (!this.overlay) return;\n\n // Clear any existing content\n this.vcr.clear();\n console.log('Showing tooltip');\n // Create and attach the tooltip content\n this.vcr.createEmbeddedView(content.template);\n // this.overlay.attach(viewRef);\n }\n\n private hideTooltip(): void {\n this.vcr.clear();\n this.overlay?.detach();\n }\n\n ngOnDestroy(): void {\n this.vcr.clear();\n this.overlay?.destroy();\n this.overlay = null;\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n}","import { ComponentHarness } from '@angular/cdk/testing';\n\nexport class TooltipTriggerHarness extends ComponentHarness {\n static hostSelector = '[apTooltipTrigger]';\n\n async getAriaDescribedBy(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('aria-describedby');\n }\n\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n async blur(): Promise<void> {\n const host = await this.host();\n return host.blur();\n }\n}\n\nexport class TooltipContentHarness extends ComponentHarness {\n static hostSelector = '[apTooltipContent]';\n\n async getRole(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('role');\n }\n\n async getId(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('id');\n }\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n}\n\nexport class TooltipHarness extends ComponentHarness {\n static hostSelector = '[apTooltip]';\n\n async getTrigger(): Promise<TooltipTriggerHarness> {\n return this.locatorFor(TooltipTriggerHarness)();\n }\n\n async getContent(): Promise<TooltipContentHarness> {\n return this.locatorFor(TooltipContentHarness)();\n }\n\n async isOpen(): Promise<boolean> {\n // Check if content is present or visible\n try {\n const content = await this.getContent();\n return true; // If found, assume open\n } catch {\n return false;\n }\n }\n}","// public-api.ts\n\nexport * from './lib/tabs';\nexport * from './lib/tooltip';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snatuva-primitives.mjs","sources":["../../../projects/primitives/src/lib/tabs/tabs.state.ts","../../../projects/primitives/src/lib/tabs/tabs.directive.ts","../../../projects/primitives/src/lib/tabs/tab-panel.directive.ts","../../../projects/primitives/src/lib/tabs/tab-trigger.directive.ts","../../../projects/primitives/src/lib/tabs/tab-content.directive.ts","../../../projects/primitives/src/lib/tabs/tabs-list.directive.ts","../../../projects/primitives/src/lib/tabs/tabs.harness.ts","../../../projects/primitives/src/lib/tooltip/tooltip.state.ts","../../../projects/primitives/src/lib/tooltip/tooltip-trigger.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip-content.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip.overlay.ts","../../../projects/primitives/src/lib/tooltip/tooltip.directive.ts","../../../projects/primitives/src/lib/tooltip/tooltip.harness.ts","../../../projects/primitives/src/public-api.ts","../../../projects/primitives/src/snatuva-primitives.ts"],"sourcesContent":["import { signal, computed, Inject, Injectable } from '@angular/core';\n\nexport interface TabPanel {\n id: string;\n disabled: boolean;\n}\n\n@Injectable()\nexport class TabsState {\n private readonly _panels = signal<TabPanel[]>([]);\n private readonly _activeId = signal<string | null>(null);\n\n readonly panels = this._panels.asReadonly();\n readonly activeId = this._activeId.asReadonly();\n\n readonly activePanel = computed(() =>\n this._panels().find(p => p.id === this._activeId())\n );\n\n register(panel: TabPanel): void {\n this._panels.update(p => [...p, panel]);\n\n if (!this._activeId()) {\n this._activeId.set(panel.id);\n }\n }\n\n unregister(id: string): void {\n this._panels.update(p => p.filter(x => x.id !== id));\n\n if (this._activeId() === id) {\n this._activeId.set(this._panels()[0]?.id ?? null);\n }\n }\n\n activate(id: string): void {\n const panel = this._panels().find(p => p.id === id && !p.disabled);\n if (panel) {\n this._activeId.set(id);\n }\n }\n}\n","import { AfterContentInit, ContentChildren, Directive, effect, HostListener, inject, Injector, QueryList, runInInjectionContext } from '@angular/core';\nimport { TabsState } from './tabs.state';\nimport { TabTriggerDirective } from './tab-trigger.directive';\n// import { TabsKeyboardController } from './tabs.keyboard';\nimport { Tabs } from '@angular/aria/tabs';\n\nexport type SelectionMode = 'follow' | 'explicit';\n\n@Directive({\n selector: '[apTabs]',\n standalone: true,\n exportAs: 'apTabs',\n providers: [\n TabsState\n ],\n hostDirectives: [{\n directive: Tabs\n }]\n})\nexport class TabsDirective { }\n","import { Directive, OnInit, OnDestroy, inject, Input } from '@angular/core';\nimport { TabsState } from './tabs.state';\nimport { TabPanel } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabPanel]',\n standalone: true,\n exportAs: 'apTabPanel',\n host: {\n 'role': 'tabpanel',\n '[attr.aria-labelledby]': '`ap-tab-${ariaPanel.value()}`',\n '[attr.id]': '`ap-panel-${ariaPanel.value()}`',\n '[style.display]': 'isActive() ? \"block\" : \"none\"',\n '[hidden]': '!isActive()'\n },\n hostDirectives: [{\n directive: TabPanel,\n // We map the public \"id\" attribute of your directive \n // to the \"value\" property of the TabPanel primitive.\n inputs: ['id', 'value']\n }]\n})\nexport class TabPanelDirective implements OnInit, OnDestroy {\n // 1. Inject the host directive instance\n protected ariaPanel = inject(TabPanel);\n\n @Input() disabled = false;\n private state = inject(TabsState);\n\n ngOnInit(): void {\n // 2. Use ariaPanel.value (which holds the 'id' passed by the user)\n this.state.register({\n id: this.ariaPanel.value() as string,\n disabled: this.disabled\n });\n }\n\n ngOnDestroy(): void {\n this.state.unregister(this.ariaPanel.value() as string);\n }\n\n isActive(): boolean {\n return this.state.activeId() === this.ariaPanel.value();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.stopPropagation();\n }\n }\n}","import { Directive, ElementRef, HostBinding, inject, Input } from '@angular/core';\nimport { FocusableOption } from '@angular/cdk/a11y';\nimport { TabPanel, TabsState } from './tabs.state';\nimport { Tab } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabTrigger]',\n standalone: true,\n host: {\n 'role': 'tab',\n '[attr.aria-selected]': 'state.activeId() === tabId',\n '[attr.aria-disabled]': 'disabled',\n '[tabindex]': 'state.activeId() === tabId ? \"0\" : \"-1\"',\n '(keydown)': 'onKeydown($event)',\n '(click)': 'activate()'\n },\n providers: [\n { provide: Tab, useExisting: Tab }\n ],\n hostDirectives: [{\n directive: Tab,\n inputs: ['value: tabId']\n }]\n})\nexport class TabTriggerDirective implements FocusableOption {\n @Input({ required: true }) tabId: string = '';\n @Input() disabled = false;\n state = inject(TabsState);\n el = inject(ElementRef<HTMLElement>);\n activate(): void {\n this.state.activate(this.tabId);\n }\n\n onKeydown(event: KeyboardEvent) {\n const active = this.state.panels().filter(t => !t.disabled);\n const idx = active.findIndex(t => t.id === this.tabId);\n let next: TabPanel | undefined;\n switch (event.key) {\n\n case 'ArrowRight':\n case 'ArrowDown':\n next = active[(idx + 1) % active.length]; break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = active[(idx - 1 + active.length) % active.length]; break;\n case 'Home': next = active[0]; break;\n case 'End': next = active[active.length - 1]; break;\n }\n\n if (next) {\n event.preventDefault();\n this.state.activate(next.id);\n this.focus();\n }\n }\n\n focus(): void {\n this.el.nativeElement.focus();\n }\n\n @HostBinding('attr.id')\n get id() {\n return `ap-tab-${this.tabId}`;\n }\n\n @HostBinding('attr.aria-controls')\n get controls() {\n return `ap-panel-${this.tabId}`;\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { TabsState } from './tabs.state';\n\n@Directive({\n selector: '[apTabContent]'\n})\nexport class TabContentDirective {\n @Input({ required: true }) tabId!: string;\n private state = inject(TabsState);\n constructor(\n template: TemplateRef<unknown>,\n vcr: ViewContainerRef\n ) {\n effect(() => {\n vcr.clear();\n\n if (this.state.activeId() === this.tabId) {\n vcr.createEmbeddedView(template);\n }\n });\n }\n}\n","import { Directive, input } from '@angular/core';\nimport { TabList } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabList]',\n standalone: true,\n host: {\n 'role': 'tablist',\n '[attr.aria-orientation]': 'orientation()',\n },\n hostDirectives: [{\n directive: TabList\n }]\n})\nexport class TabListDirective {\n //TODO: We can use the input() function to create a reactive input for orientation, which will automatically update the aria-orientation attribute when it changes.\n orientation = input('horizontal');\n}","import { ComponentHarness } from '@angular/cdk/testing';\n\nexport class TabTriggerHarness extends ComponentHarness {\n static hostSelector = '[apTabTrigger]';\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n async isActive(): Promise<boolean> {\n const host = await this.host();\n const ariaSelected = await host.getAttribute('aria-selected');\n return ariaSelected === 'true';\n }\n\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n async getTabId(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('tabId');\n }\n\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n const ariaDisabled = await host.getAttribute('aria-disabled');\n return ariaDisabled === 'true';\n }\n}\n\nexport class TabPanelHarness extends ComponentHarness {\n static hostSelector = '[apTabPanel]';\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n async isActive(): Promise<boolean> {\n const host = await this.host();\n const ariaHidden = await host.getAttribute('aria-hidden');\n return ariaHidden !== 'true';\n }\n\n async getRole(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('role');\n }\n}\n\nexport class TabsHarness extends ComponentHarness {\n static hostSelector = '[apTabs]';\n\n async getTabTriggers(): Promise<TabTriggerHarness[]> {\n return this.locatorForAll(TabTriggerHarness)();\n }\n\n async getTabPanels(): Promise<TabPanelHarness[]> {\n return this.locatorForAll(TabPanelHarness)();\n }\n\n async getActiveTab(): Promise<TabTriggerHarness | null> {\n const triggers = await this.getTabTriggers();\n for (const trigger of triggers) {\n if (await trigger.isActive()) {\n return trigger;\n }\n }\n return null;\n }\n\n async selectTabByText(text: string): Promise<void> {\n const triggers = await this.getTabTriggers();\n for (const trigger of triggers) {\n if ((await trigger.getText()) === text) {\n await trigger.click();\n return;\n }\n }\n throw new Error(`Tab with text \"${text}\" not found`);\n }\n\n async selectTabByIndex(index: number): Promise<void> {\n const triggers = await this.getTabTriggers();\n if (index < 0 || index >= triggers.length) {\n throw new Error(`Tab index ${index} out of range`);\n }\n await triggers[index].click();\n }\n}","import { signal } from '@angular/core';\n\nexport class TooltipState {\n constructor() {\n console.log('TooltipState created');\n }\n readonly open = signal(false);\n readonly tooltipId = signal<string | null>(null);\n\n openTooltip() {\n this.open.set(true);\n }\n\n closeTooltip() {\n this.open.set(false);\n }\n\n toggle() {\n this.open.update(v => !v);\n }\n\n setTooltipId(id: string) {\n this.tooltipId.set(id);\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n Input,\n} from '@angular/core';\nimport { TooltipState } from './tooltip.state';\n\n@Directive({\n selector: '[apTooltipTrigger]',\n standalone: true,\n host: {\n 'role': 'button',\n '[attr.tabindex]': '0',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(keydown.escape)': 'onEscape()',\n '[attr.aria-describedby]': 'state.tooltipId()',\n '[attr.aria-expanded]': 'state.open()'\n }\n})\nexport class TooltipTriggerDirective {\n readonly state = inject(TooltipState);\n readonly element = inject(ElementRef<HTMLElement>);\n\n @Input() showDelay: number = 300;\n @Input() hideDelay: number = 150;\n\n private showTimeout?: number;\n private hideTimeout?: number;\n\n onMouseEnter() {\n this.clearTimeouts();\n this.showTimeout = window.setTimeout(() => {\n this.state.openTooltip();\n }, this.showDelay);\n }\n\n onMouseLeave() {\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.state.closeTooltip();\n }, this.hideDelay);\n }\n\n onFocus() {\n this.clearTimeouts();\n this.state.openTooltip();\n }\n\n onBlur() {\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.state.closeTooltip();\n }, this.hideDelay);\n }\n\n onEscape() {\n this.clearTimeouts();\n this.state.closeTooltip();\n }\n\n private clearTimeouts() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = undefined;\n }\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n }\n }\n}\n\n","import {\n Directive,\n TemplateRef,\n inject,\n Input,\n ViewContainerRef,\n} from '@angular/core';\n\n@Directive({\n selector: 'ng-template[apTooltipContent]',\n standalone: true,\n})\nexport class TooltipContentDirective {\n @Input() tooltipId: string = `ap-tooltip-${Math.random().toString(36).substr(2, 9)}`;\n\n public templateRef = inject(TemplateRef);\n public vcr = inject(ViewContainerRef);\n\n}\n","import {\n Overlay,\n OverlayRef\n} from '@angular/cdk/overlay';\nimport { TemplateRef, ViewContainerRef } from '@angular/core';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Observable } from 'rxjs';\n\nexport class TooltipOverlay {\n private overlayRef?: OverlayRef;\n\n constructor(\n private readonly overlay: Overlay,\n private readonly origin: HTMLElement\n ) { }\n\n // tooltip.overlay.ts\n attach(template: TemplateRef<unknown>, vcr: ViewContainerRef): void {\n if (!this.overlayRef) {\n this.overlayRef = this.createOverlay();\n }\n if (!this.overlayRef.hasAttached()) {\n const portal = new TemplatePortal(template, vcr); // ✅ correct vcr\n this.overlayRef.attach(portal);\n }\n }\n\n setAttributes(attrs: Record<string, string>) {\n if (this.overlayRef) {\n const element = this.overlayRef.overlayElement;\n for (const [key, value] of Object.entries(attrs)) {\n element.setAttribute(key, value);\n }\n }\n }\n\n detach(): void {\n this.overlayRef?.detach();\n }\n\n destroy(): void {\n this.overlayRef?.dispose();\n }\n\n keydownEvents(): Observable<KeyboardEvent> | null {\n return this.overlayRef?.keydownEvents() ?? null;\n }\n\n private createOverlay(): OverlayRef {\n const positionStrategy =\n this.overlay.position()\n .flexibleConnectedTo(this.origin)\n .withPositions([\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -8\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 8\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8\n }\n ]);\n\n return this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'ap-tooltip-panel'\n });\n }\n}\n","import {\n AfterContentInit,\n contentChild,\n Directive,\n effect,\n inject,\n Injector,\n OnDestroy,\n runInInjectionContext,\n ViewContainerRef,\n} from '@angular/core';\nimport { TooltipState } from './tooltip.state';\nimport { TooltipContentDirective } from './tooltip-content.directive';\nimport { TooltipTriggerDirective } from './tooltip-trigger.directive';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { TooltipOverlay } from './tooltip.overlay';\nimport { filter, fromEvent, Subject, takeUntil } from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\n\n@Directive({\n selector: '[apTooltip]',\n standalone: true,\n providers: [TooltipState],\n})\nexport class TooltipDirective implements AfterContentInit, OnDestroy {\n state = inject(TooltipState);\n private overlay = inject(Overlay);\n private vcr = inject(ViewContainerRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n\n private tooltipOverlay?: TooltipOverlay;\n private destroy$ = new Subject<void>();\n\n contentTemplate = contentChild(TooltipContentDirective);\n trigger = contentChild(TooltipTriggerDirective);\n\n ngAfterContentInit() {\n console.log('contentTemplate', this.contentTemplate());\n console.log('trigger', this.trigger());\n console.log('templateRef', this.contentTemplate()?.templateRef);\n console.log('vcr', this.contentTemplate()?.vcr);\n\n\n const content = this.contentTemplate();\n if (content) {\n this.state.setTooltipId(content.tooltipId);\n }\n\n fromEvent<KeyboardEvent>(this.document, 'keydown')\n .pipe(\n filter(event => event.key === 'Escape'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => this.state.closeTooltip());\n\n runInInjectionContext(this.injector, () => {\n effect(() => {\n const isOpen = this.state.open();\n const template = this.contentTemplate()?.templateRef;\n const triggerElement = this.trigger()?.element.nativeElement;\n\n // Read all signals first, then act — avoids partial reactive state\n if (isOpen && template && triggerElement) {\n this.showTooltip();\n } else if (!isOpen) {\n this.hideTooltip();\n }\n });\n });\n }\n\n private showTooltip() {\n const content = this.contentTemplate();\n const triggerElement = this.trigger()?.element.nativeElement;\n\n if (!content || !triggerElement) return;\n\n if (!this.tooltipOverlay) {\n this.tooltipOverlay = new TooltipOverlay(this.overlay, triggerElement);\n }\n\n this.tooltipOverlay.attach(content.templateRef, content.vcr); // ✅\n this.tooltipOverlay.setAttributes({\n role: 'tooltip',\n id: this.state.tooltipId() ?? 'tooltip'\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.tooltipOverlay?.destroy();\n }\n\n private hideTooltip() {\n this.tooltipOverlay?.detach();\n }\n}","import { ComponentHarness } from '@angular/cdk/testing';\n\nexport class TooltipTriggerHarness extends ComponentHarness {\n static hostSelector = '[apTooltipTrigger]';\n\n async getAriaDescribedBy(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('aria-describedby');\n }\n\n async getAriaExpanded(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('aria-expanded');\n }\n\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n async blur(): Promise<void> {\n const host = await this.host();\n return host.blur();\n }\n\n async hover(): Promise<void> {\n const host = await this.host();\n await host.hover();\n }\n\n async unhover(): Promise<void> {\n const host = await this.host();\n await host.mouseAway();\n }\n}\n\nexport class TooltipContentHarness extends ComponentHarness {\n static hostSelector = '.tooltip-content';\n\n async getRole(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('role');\n }\n\n async getId(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('id');\n }\n\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n}\n\nexport class TooltipHarness extends ComponentHarness {\n static hostSelector = '[apTooltip]';\n\n async getTrigger(): Promise<TooltipTriggerHarness> {\n return this.locatorFor(TooltipTriggerHarness)();\n }\n\n async isOpen(): Promise<boolean> {\n // Check if tooltip content exists in overlay\n try {\n const tooltipElements = document.querySelectorAll('[role=\"tooltip\"]');\n return tooltipElements.length > 0;\n } catch {\n return false;\n }\n }\n}","// public-api.ts\n\nexport * from './lib/tabs';\nexport * from './lib/tooltip';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snatuva/primitives",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.2",
6
6
  "@angular/core": "^21.0.2",
@@ -92,9 +92,8 @@ declare class TabsHarness extends ComponentHarness {
92
92
  }
93
93
 
94
94
  declare class TooltipState {
95
- /** Whether tooltip is open */
95
+ constructor();
96
96
  readonly open: i0.WritableSignal<boolean>;
97
- /** ID of the tooltip content */
98
97
  readonly tooltipId: i0.WritableSignal<string | null>;
99
98
  openTooltip(): void;
100
99
  closeTooltip(): void;
@@ -105,47 +104,55 @@ declare class TooltipState {
105
104
  declare class TooltipTriggerDirective {
106
105
  readonly state: TooltipState;
107
106
  readonly element: ElementRef<any>;
107
+ showDelay: number;
108
+ hideDelay: number;
109
+ private showTimeout?;
110
+ private hideTimeout?;
108
111
  onMouseEnter(): void;
109
112
  onMouseLeave(): void;
110
113
  onFocus(): void;
111
114
  onBlur(): void;
112
115
  onEscape(): void;
116
+ private clearTimeouts;
113
117
  static ɵfac: i0.ɵɵFactoryDeclaration<TooltipTriggerDirective, never>;
114
- static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipTriggerDirective, "[apTooltipTrigger]", never, {}, {}, never, never, true, never>;
118
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipTriggerDirective, "[apTooltipTrigger]", never, { "showDelay": { "alias": "showDelay"; "required": false; }; "hideDelay": { "alias": "hideDelay"; "required": false; }; }, {}, never, never, true, never>;
115
119
  }
116
120
 
117
121
  declare class TooltipContentDirective {
118
- readonly template: TemplateRef<any>;
119
122
  tooltipId: string;
123
+ templateRef: TemplateRef<any>;
124
+ vcr: ViewContainerRef;
120
125
  static ɵfac: i0.ɵɵFactoryDeclaration<TooltipContentDirective, never>;
121
- static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipContentDirective, "[apTooltipContent]", never, { "tooltipId": { "alias": "tooltipId"; "required": false; }; }, {}, never, never, true, never>;
126
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipContentDirective, "ng-template[apTooltipContent]", never, { "tooltipId": { "alias": "tooltipId"; "required": false; }; }, {}, never, never, true, never>;
122
127
  }
123
128
 
124
129
  declare class TooltipDirective implements AfterContentInit, OnDestroy {
125
- private readonly destroy$;
126
130
  state: TooltipState;
127
- content: i0.Signal<TooltipContentDirective | undefined>;
128
- triggers: i0.Signal<readonly TooltipTriggerDirective[]>;
129
131
  private overlay;
130
- private readonly overlayService;
131
- private readonly vcr;
132
- private readonly injector;
133
- private readonly document;
134
- constructor();
132
+ private vcr;
133
+ private injector;
134
+ private document;
135
+ private tooltipOverlay?;
136
+ private destroy$;
137
+ contentTemplate: i0.Signal<TooltipContentDirective | undefined>;
138
+ trigger: i0.Signal<TooltipTriggerDirective | undefined>;
135
139
  ngAfterContentInit(): void;
136
140
  private showTooltip;
137
- private hideTooltip;
138
141
  ngOnDestroy(): void;
142
+ private hideTooltip;
139
143
  static ɵfac: i0.ɵɵFactoryDeclaration<TooltipDirective, never>;
140
- static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipDirective, "[apTooltip]", never, {}, {}, ["content", "triggers"], never, true, never>;
144
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipDirective, "[apTooltip]", never, {}, {}, ["contentTemplate", "trigger"], never, true, never>;
141
145
  }
142
146
 
143
147
  declare class TooltipTriggerHarness extends ComponentHarness {
144
148
  static hostSelector: string;
145
149
  getAriaDescribedBy(): Promise<string | null>;
150
+ getAriaExpanded(): Promise<string | null>;
146
151
  click(): Promise<void>;
147
152
  focus(): Promise<void>;
148
153
  blur(): Promise<void>;
154
+ hover(): Promise<void>;
155
+ unhover(): Promise<void>;
149
156
  }
150
157
  declare class TooltipContentHarness extends ComponentHarness {
151
158
  static hostSelector: string;
@@ -156,7 +163,6 @@ declare class TooltipContentHarness extends ComponentHarness {
156
163
  declare class TooltipHarness extends ComponentHarness {
157
164
  static hostSelector: string;
158
165
  getTrigger(): Promise<TooltipTriggerHarness>;
159
- getContent(): Promise<TooltipContentHarness>;
160
166
  isOpen(): Promise<boolean>;
161
167
  }
162
168