@snatuva/primitives 0.0.5 → 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 +132 -145
- package/fesm2022/snatuva-primitives.mjs +141 -88
- package/fesm2022/snatuva-primitives.mjs.map +1 -1
- package/package.json +1 -1
- package/types/snatuva-primitives.d.ts +22 -16
package/README.md
CHANGED
|
@@ -1,42 +1,50 @@
|
|
|
1
1
|
# @snatuva/primitives
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
and composability.
|
|
3
|
+
🚀 **Signals-first Angular primitives library** for building scalable, reusable UI components.
|
|
5
4
|
|
|
6
|
-
|
|
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.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
- Tooltip primitives
|
|
7
|
+
---
|
|
10
8
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
- **Headless**: no styling is imposed by the library.
|
|
14
|
-
- **Directive-first**: compose behavior into your own markup.
|
|
15
|
-
- **Scoped state**: each primitive root creates an isolated state scope.
|
|
16
|
-
- **Accessible by default**: ARIA semantics are wired into directives.
|
|
17
|
-
|
|
18
|
-
## Installation
|
|
9
|
+
## 📦 Installation
|
|
19
10
|
|
|
20
11
|
```bash
|
|
21
12
|
npm install @snatuva/primitives
|
|
22
13
|
```
|
|
23
14
|
|
|
24
|
-
|
|
15
|
+
---
|
|
25
16
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
17
|
+
## ⚡ Why this library?
|
|
18
|
+
|
|
19
|
+
Most Angular component libraries are:
|
|
20
|
+
|
|
21
|
+
* ❌ Heavy and opinionated
|
|
22
|
+
* ❌ Hard to customize
|
|
23
|
+
* ❌ Not aligned with modern Angular (Signals, standalone)
|
|
24
|
+
|
|
25
|
+
**@snatuva/primitives focuses on:**
|
|
26
|
+
|
|
27
|
+
* ✅ Lightweight, composable primitives
|
|
28
|
+
* ✅ Signals-first architecture
|
|
29
|
+
* ✅ Standalone component support
|
|
30
|
+
* ✅ Tree-shakable design
|
|
31
|
+
* ✅ Clean API for enterprise scalability
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🧩 What are “Primitives”?
|
|
36
|
+
|
|
37
|
+
Primitives are **low-level UI building blocks** (not full components).
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
Instead of giving you a “ready-made UI”, this library gives:
|
|
40
|
+
|
|
41
|
+
* Flexible foundations
|
|
42
|
+
* Full control over styling and behavior
|
|
43
|
+
* Better reusability across projects
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Tabs Usage
|
|
40
48
|
|
|
41
49
|
### Directives
|
|
42
50
|
|
|
@@ -52,6 +60,19 @@ import {
|
|
|
52
60
|
- `apTabContent` — structural directive to conditionally render active panel content.
|
|
53
61
|
- Required input: `tabId: string`
|
|
54
62
|
|
|
63
|
+
### Import into your Angular app
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import {
|
|
67
|
+
TabsDirective,
|
|
68
|
+
TabListDirective,
|
|
69
|
+
TabTriggerDirective,
|
|
70
|
+
TabPanelDirective
|
|
71
|
+
} from '@snatuva/primitives';
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
55
76
|
### Minimal usage
|
|
56
77
|
|
|
57
78
|
```html
|
|
@@ -73,144 +94,110 @@ import {
|
|
|
73
94
|
</div>
|
|
74
95
|
```
|
|
75
96
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- The first registered panel is selected by default.
|
|
79
|
-
- Selecting a disabled tab is ignored.
|
|
80
|
-
- When an active panel is removed, selection falls back to the next available panel.
|
|
81
|
-
|
|
82
|
-
### Accessibility (ARIA)
|
|
97
|
+
---
|
|
83
98
|
|
|
84
|
-
|
|
99
|
+
## 🧠 Core Concepts
|
|
85
100
|
|
|
86
|
-
|
|
87
|
-
- `apTabList` → `role="tablist"`
|
|
88
|
-
- `apTabTrigger` → `role="tab"`, `aria-selected="true|false"`, `aria-controls="[panel-id]"`, `tabindex` management
|
|
89
|
-
- `apTabPanel` → `role="tabpanel"`, `aria-labelledby="[trigger-id]"`, `aria-hidden="true|false"`, `id` auto-generated
|
|
101
|
+
### 1. Signals-first design
|
|
90
102
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- <kbd>Arrow Down</kbd> / <kbd>Arrow Up</kbd> — Switch between tabs
|
|
94
|
-
- <kbd>Home</kbd> — Jump to first tab
|
|
95
|
-
- <kbd>End</kbd> — Jump to last tab
|
|
96
|
-
- <kbd>Tab</kbd> — Focus management with roving tabindex
|
|
103
|
+
* Uses Angular Signals for state management
|
|
104
|
+
* Minimal RxJS usage (only where necessary)
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
### 2. Standalone components
|
|
99
107
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
[apTabTrigger][aria-selected='true'] {
|
|
103
|
-
border-bottom: 2px solid #2196f3;
|
|
104
|
-
font-weight: bold;
|
|
105
|
-
}
|
|
108
|
+
* No NgModules required
|
|
109
|
+
* Easy integration in modern Angular apps
|
|
106
110
|
|
|
107
|
-
|
|
108
|
-
[apTabTrigger][aria-disabled='true'] {
|
|
109
|
-
opacity: 0.5;
|
|
110
|
-
cursor: not-allowed;
|
|
111
|
-
}
|
|
111
|
+
### 3. Composition over configuration
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
padding: 20px;
|
|
116
|
-
}
|
|
113
|
+
* Build your own components using primitives
|
|
114
|
+
* Avoid rigid APIs
|
|
117
115
|
|
|
118
|
-
|
|
119
|
-
[apTabPanel][aria-hidden='true'] {
|
|
120
|
-
display: none;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
116
|
+
---
|
|
123
117
|
|
|
124
|
-
##
|
|
118
|
+
## ♿ Accessibility (A11y)
|
|
125
119
|
|
|
126
|
-
|
|
120
|
+
This library is designed with accessibility in mind:
|
|
127
121
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
* Semantic HTML by default
|
|
123
|
+
* Keyboard interaction support
|
|
124
|
+
* ARIA best practices
|
|
125
|
+
* Focus management patterns
|
|
131
126
|
|
|
132
|
-
|
|
127
|
+
---
|
|
133
128
|
|
|
134
|
-
|
|
135
|
-
<div apTooltip>
|
|
136
|
-
<!-- Automatically gets role="button", aria-describedby, aria-expanded, tabindex -->
|
|
137
|
-
<button apTooltipTrigger type="button">Hover or focus me</button>
|
|
138
|
-
|
|
139
|
-
<!-- Automatically gets role="tooltip" and unique id -->
|
|
140
|
-
<ng-template apTooltipContent>
|
|
141
|
-
<span>Helpful tooltip content</span>
|
|
142
|
-
</ng-template>
|
|
143
|
-
</div>
|
|
144
|
-
```
|
|
129
|
+
## 📁 Project Structure
|
|
145
130
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
✅ **Automatic - No manual configuration needed!**
|
|
154
|
-
|
|
155
|
-
**Built-in ARIA attributes:**
|
|
156
|
-
- `apTooltipContent` → `role="tooltip"`, unique `id` auto-generated
|
|
157
|
-
- `apTooltipTrigger` → `role="button"`, `aria-describedby="[tooltip-id]"`, `aria-expanded="true|false"`, `tabindex="0"`
|
|
158
|
-
|
|
159
|
-
**Built-in keyboard navigation:**
|
|
160
|
-
- <kbd>Enter</kbd> / <kbd>Space</kbd> — Open tooltip (if not already open)
|
|
161
|
-
- <kbd>Escape</kbd> — Close tooltip
|
|
162
|
-
- <kbd>Tab</kbd> — Move focus (closes tooltip automatically on blur)
|
|
163
|
-
- Mouse hover / Focus events — Auto show/hide
|
|
164
|
-
|
|
165
|
-
**Best Practices:**
|
|
166
|
-
- Use tooltips for supplemental information only.
|
|
167
|
-
- Don't rely on tooltips for critical information.
|
|
168
|
-
- Ensure tooltip content is concise and helpful.
|
|
169
|
-
|
|
170
|
-
**CSS Styling Example:**
|
|
171
|
-
|
|
172
|
-
```css
|
|
173
|
-
/* Style tooltip trigger */
|
|
174
|
-
[apTooltipTrigger] {
|
|
175
|
-
cursor: help;
|
|
176
|
-
text-decoration: underline dotted;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/* Style tooltip content */
|
|
180
|
-
[apTooltipContent] {
|
|
181
|
-
background: #333;
|
|
182
|
-
color: #fff;
|
|
183
|
-
padding: 8px 12px;
|
|
184
|
-
border-radius: 4px;
|
|
185
|
-
font-size: 12px;
|
|
186
|
-
max-width: 200px;
|
|
187
|
-
z-index: 1000;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/* Add arrow pointer (optional) */
|
|
191
|
-
[apTooltipContent]::before {
|
|
192
|
-
content: '';
|
|
193
|
-
position: absolute;
|
|
194
|
-
bottom: -4px;
|
|
195
|
-
left: 50%;
|
|
196
|
-
transform: translateX(-50%);
|
|
197
|
-
width: 8px;
|
|
198
|
-
height: 8px;
|
|
199
|
-
background: #333;
|
|
200
|
-
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
|
|
201
|
-
}
|
|
131
|
+
```bash
|
|
132
|
+
projects/
|
|
133
|
+
primitives/
|
|
134
|
+
src/
|
|
135
|
+
lib/
|
|
136
|
+
public-api.ts
|
|
202
137
|
```
|
|
203
138
|
|
|
204
|
-
|
|
139
|
+
---
|
|
205
140
|
|
|
206
|
-
|
|
141
|
+
## 🧪 Development
|
|
207
142
|
|
|
208
143
|
```bash
|
|
209
144
|
ng build primitives
|
|
210
145
|
```
|
|
211
146
|
|
|
212
|
-
|
|
147
|
+
---
|
|
213
148
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
149
|
+
## 📌 Versioning
|
|
150
|
+
|
|
151
|
+
This project follows semantic versioning:
|
|
152
|
+
|
|
153
|
+
* PATCH → bug fixes
|
|
154
|
+
* MINOR → new features
|
|
155
|
+
* MAJOR → breaking changes
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 🤝 Contributing
|
|
160
|
+
|
|
161
|
+
Contributions are welcome!
|
|
162
|
+
|
|
163
|
+
If you have ideas for:
|
|
164
|
+
|
|
165
|
+
* New primitives
|
|
166
|
+
* Performance improvements
|
|
167
|
+
* Accessibility enhancements
|
|
168
|
+
|
|
169
|
+
Feel free to open an issue or PR.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 📊 Roadmap
|
|
174
|
+
|
|
175
|
+
* [ ] Core primitives expansion
|
|
176
|
+
* [ ] Accessibility utilities
|
|
177
|
+
* [ ] CDK integrations
|
|
178
|
+
* [ ] Advanced composition patterns
|
|
179
|
+
* [ ] Documentation site
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 👨💻 Author
|
|
184
|
+
|
|
185
|
+
Developed by **Siva Sridhar Natuva**
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## ⭐ Support
|
|
190
|
+
|
|
191
|
+
If you find this useful:
|
|
192
|
+
|
|
193
|
+
* Star the repo ⭐
|
|
194
|
+
* Share with Angular community
|
|
195
|
+
* Use it in your projects
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 🔍 Keywords
|
|
200
|
+
|
|
201
|
+
Angular • Signals • UI Primitives • Component Library • Standalone Components • Design System
|
|
202
|
+
|
|
203
|
+
---
|
|
@@ -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,
|
|
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
|
-
|
|
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.
|
|
343
|
+
this.clearTimeouts();
|
|
344
|
+
this.showTimeout = window.setTimeout(() => {
|
|
345
|
+
this.state.openTooltip();
|
|
346
|
+
}, this.showDelay);
|
|
339
347
|
}
|
|
340
348
|
onMouseLeave() {
|
|
341
|
-
this.
|
|
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.
|
|
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" },
|
|
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,
|
|
425
|
+
constructor(overlay, origin) {
|
|
400
426
|
this.overlay = overlay;
|
|
401
|
-
this.vcr = vcr;
|
|
402
427
|
this.origin = origin;
|
|
403
428
|
}
|
|
404
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
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
|
-
|
|
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(
|
|
507
|
-
|
|
549
|
+
showTooltip() {
|
|
550
|
+
const content = this.contentTemplate();
|
|
551
|
+
const triggerElement = this.trigger()?.element.nativeElement;
|
|
552
|
+
if (!content || !triggerElement)
|
|
508
553
|
return;
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
this.
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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: "
|
|
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
|
-
}],
|
|
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 = '
|
|
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
|
|
634
|
+
// Check if tooltip content exists in overlay
|
|
582
635
|
try {
|
|
583
|
-
const
|
|
584
|
-
return
|
|
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":";;;;;;;;;;MAQa,SAAS,CAAA;AACD,IAAA,OAAO,GAAG,MAAM,CAAa,EAAE,mDAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AAE/C,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;IAEtC,WAAW,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACtD;AAED,IAAA,QAAQ,CAAC,KAAe,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAEvC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC;IACJ;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;QACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAEpD,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QACrD;IACJ;AAEA,IAAA,QAAQ,CAAC,EAAU,EAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;IACJ;uGAhCS,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAT,SAAS,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB;;;MCYY,aAAa,CAAA;uGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAPX;YACP;AACH,SAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAKQ,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,SAAS,EAAE;wBACP;AACH,qBAAA;AACD,oBAAA,cAAc,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE;yBACd;AACJ,iBAAA;;;MCIY,iBAAiB,CAAA;;AAEhB,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE7B,QAAQ,GAAG,KAAK;AACjB,IAAA,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,QAAQ,GAAA;;AAEJ,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAChB,YAAA,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAY;YACpC,QAAQ,EAAE,IAAI,CAAC;AAClB,SAAA,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAY,CAAC;IAC3D;IAEA,QAAQ,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IAC3D;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC1B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACxB,KAAK,CAAC,eAAe,EAAE;QAC3B;IACJ;uGA3BS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sBAAA,EAAA,+BAAA,EAAA,SAAA,EAAA,iCAAA,EAAA,eAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,IAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAlB7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,UAAU;AAClB,wBAAA,wBAAwB,EAAE,+BAA+B;AACzD,wBAAA,WAAW,EAAE,iCAAiC;AAC9C,wBAAA,iBAAiB,EAAE,+BAA+B;AAClD,wBAAA,UAAU,EAAE;AACf,qBAAA;AACD,oBAAA,cAAc,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE,QAAQ;;;AAGnB,4BAAA,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO;yBACzB;AACJ,iBAAA;;sBAKI;;;MCFQ,mBAAmB,CAAA;IACD,KAAK,GAAW,EAAE;IACpC,QAAQ,GAAG,KAAK;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;AACzB,IAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;IACpC,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC;AACtD,QAAA,IAAI,IAA0B;AAC9B,QAAA,QAAQ,KAAK,CAAC,GAAG;AAEb,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,WAAW;AACZ,gBAAA,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAE;AAC9C,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,SAAS;AACV,gBAAA,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAE;AAC9D,YAAA,KAAK,MAAM;AAAE,gBAAA,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;gBAAE;AAC/B,YAAA,KAAK,KAAK;gBAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAAE;;QAGlD,IAAI,IAAI,EAAE;YACN,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,EAAE;QAChB;IACJ;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACjC;AAEA,IAAA,IACI,EAAE,GAAA;AACF,QAAA,OAAO,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,EAAE;IACjC;AAEA,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,OAAO,CAAA,SAAA,EAAY,IAAI,CAAC,KAAK,EAAE;IACnC;uGA5CS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,KAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,6CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,SAAA,EARjB;AACP,YAAA,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;AACnC,SAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAMQ,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAnB/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,sBAAsB,EAAE,4BAA4B;AACpD,wBAAA,sBAAsB,EAAE,UAAU;AAClC,wBAAA,YAAY,EAAE,yCAAyC;AACvD,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,SAAS,EAAE;AACd,qBAAA;AACD,oBAAA,SAAS,EAAE;AACP,wBAAA,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;AACnC,qBAAA;AACD,oBAAA,cAAc,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE,GAAG;4BACd,MAAM,EAAE,CAAC,cAAc;yBAC1B;AACJ,iBAAA;;sBAEI,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBAkCA,WAAW;uBAAC,SAAS;;sBAKrB,WAAW;uBAAC,oBAAoB;;;MC3DxB,mBAAmB,CAAA;AACD,IAAA,KAAK;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,WAAA,CACI,QAA8B,EAC9B,GAAqB,EAAA;QAErB,MAAM,CAAC,MAAK;YACR,GAAG,CAAC,KAAK,EAAE;YAEX,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AACtC,gBAAA,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC;YACpC;AACJ,QAAA,CAAC,CAAC;IACN;uGAdS,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE;AACb,iBAAA;;sBAEI,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;MCOhB,gBAAgB,CAAA;;AAEzB,IAAA,WAAW,GAAG,KAAK,CAAC,YAAY,uDAAC;uGAFxB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,OAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,yBAAyB,EAAE,eAAe;AAC7C,qBAAA;AACD,oBAAA,cAAc,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE;yBACd;AACJ,iBAAA;;;ACXK,MAAO,iBAAkB,SAAQ,gBAAgB,CAAA;AACnD,IAAA,OAAO,YAAY,GAAG,gBAAgB;AAEtC,IAAA,MAAM,OAAO,GAAA;QACT,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;IACrC;AAEA,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;QAC7D,OAAO,YAAY,KAAK,MAAM;IAClC;AAEA,IAAA,MAAM,KAAK,GAAA;AACP,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACvB;AAEA,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACrC;AAEA,IAAA,MAAM,UAAU,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;QAC7D,OAAO,YAAY,KAAK,MAAM;IAClC;;AAGE,MAAO,eAAgB,SAAQ,gBAAgB,CAAA;AACjD,IAAA,OAAO,YAAY,GAAG,cAAc;AAEpC,IAAA,MAAM,OAAO,GAAA;QACT,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;IACrC;AAEA,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QACzD,OAAO,UAAU,KAAK,MAAM;IAChC;AAEA,IAAA,MAAM,OAAO,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACpC;;AAGE,MAAO,WAAY,SAAQ,gBAAgB,CAAA;AAC7C,IAAA,OAAO,YAAY,GAAG,UAAU;AAEhC,IAAA,MAAM,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE;IAClD;AAEA,IAAA,MAAM,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE;IAChD;AAEA,IAAA,MAAM,YAAY,GAAA;AACd,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;AAC5C,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC5B,YAAA,IAAI,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE;AAC1B,gBAAA,OAAO,OAAO;YAClB;QACJ;AACA,QAAA,OAAO,IAAI;IACf;IAEA,MAAM,eAAe,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;AAC5C,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC5B,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE;AACpC,gBAAA,MAAM,OAAO,CAAC,KAAK,EAAE;gBACrB;YACJ;QACJ;AACA,QAAA,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAA,WAAA,CAAa,CAAC;IACxD;IAEA,MAAM,gBAAgB,CAAC,KAAa,EAAA;AAChC,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;QAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;AACvC,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAA,aAAA,CAAe,CAAC;QACtD;AACA,QAAA,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;IACjC;;;MCvFS,YAAY,CAAA;;AAEZ,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,gDAAC;;AAEpB,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;IAEhD,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B;AAEA,IAAA,YAAY,CAAC,EAAU,EAAA;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B;AACH;;MCAY,uBAAuB,CAAA;AACvB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,IAAA,OAAO,GAAG,MAAM,EAAC,UAAuB,EAAC;IAElD,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;IAC5B;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC7B;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;IAC5B;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC7B;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC7B;uGAtBS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,GAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAfnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,iBAAiB,EAAE,GAAG;AACtB,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,QAAQ,EAAE,UAAU;AACpB,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,yBAAyB,EAAE,mBAAmB;AAC9C,wBAAA,sBAAsB,EAAE;AAC3B;AACJ,iBAAA;;;MCPY,uBAAuB,CAAA;AACvB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAiB,EAAC;AACpC,IAAA,SAAS,GAAW,CAAA,WAAA,EAAc,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;uGAF3E,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBARnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,MAAM,EAAE;AACX;AACJ,iBAAA;;sBAGI;;;MCTQ,cAAc,CAAA;AAIF,IAAA,OAAA;AACA,IAAA,GAAA;AACA,IAAA,MAAA;AALb,IAAA,UAAU;AAElB,IAAA,WAAA,CACqB,OAAgB,EAChB,GAAqB,EACrB,MAAmB,EAAA;QAFnB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,MAAM,GAAN,MAAM;IACvB;AAEJ,IAAA,MAAM,CAAC,QAA8B,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;QAC1C;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC;AACrD,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC;IACJ;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;IAC7B;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;IAC9B;IAEA,aAAa,GAAA;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,IAAI;IACnD;IAEQ,aAAa,GAAA;AACjB,QAAA,MAAM,gBAAgB,GAClB,IAAI,CAAC,OAAO,CAAC,QAAQ;AAChB,aAAA,mBAAmB,CAAC,IAAI,CAAC,MAAM;AAC/B,aAAA,aAAa,CAAC;AACX,YAAA;AACI,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,CAAC;AACb,aAAA;AACD,YAAA;AACI,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,OAAO,EAAE;AACZ;AACJ,SAAA,CAAC;AAEV,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACvB,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC1D,YAAA,WAAW,EAAE;AAChB,SAAA,CAAC;IACN;AACH;;MC1CY,gBAAgB,CAAA;AAER,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC/C,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAE5B,IAAA,OAAO,GAAG,YAAY,CAAC,uBAAuB,mDAAC;AAC/C,IAAA,QAAQ,GAAG,eAAe,CAAC,uBAAuB,oDAAC;IAE3C,OAAO,GAA0B,IAAI;AAE5B,IAAA,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC;AAChC,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC9B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE5C,IAAA,WAAA,GAAA;AACI,QAAA,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAK;YACtC,MAAM,CAAC,MAAK;gBACR,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;oBACpB;gBACJ;gBAEA,MAAM,GAAG,GAAG,SAAS,CACjB,IAAI,CAAC,QAAQ,EACb,SAAS;qBAER,IAAI,CACD,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC/B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAE3B,SAAS,CAAC,MAAK;AACZ,oBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC7B,gBAAA,CAAC,CAAC;;AAGN,gBAAA,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE;AAClC,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;IAEA,kBAAkB,GAAA;AACd,QAAA,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAK;YACtC,MAAM,CAAC,MAAK;AACR,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;;gBAGhC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBACnC;gBACJ;gBAEA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;;AAG1C,gBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBACf,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;AAChD,oBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAC7B,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,GAAG,EACR,MAAM,CACT;AAED,oBAAA,IAAI,CAAC;AACA,yBAAA,aAAa;0BACZ,IAAI,CACF,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,EACvC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;yBAE3B,SAAS,CAAC,MAAK;AACZ,wBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC7B,oBAAA,CAAC,CAAC;gBACV;;AAGA,gBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACnB,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC7B;qBAAO;oBACH,IAAI,CAAC,WAAW,EAAE;gBACtB;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,WAAW,CAAC,OAAgC,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;;AAGnB,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;;QAE9B,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;;IAEjD;IAEQ,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;IAC1B;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAEnB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC5B;uGA1GS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,0DAFd,CAAC,YAAY,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAOF,uBAAuB,8EACnB,uBAAuB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FANzC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAL5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,SAAS,EAAE,CAAC,YAAY,CAAC;AAC5B,iBAAA;AAM0B,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,uBAAuB,6FACnB,uBAAuB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC7BhD,MAAO,qBAAsB,SAAQ,gBAAgB,CAAA;AACvD,IAAA,OAAO,YAAY,GAAG,oBAAoB;AAE1C,IAAA,MAAM,kBAAkB,GAAA;AACpB,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAChD;AAEA,IAAA,MAAM,KAAK,GAAA;AACP,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACvB;AAEA,IAAA,MAAM,KAAK,GAAA;AACP,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACvB;AAEA,IAAA,MAAM,IAAI,GAAA;AACN,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACtB;;AAGE,MAAO,qBAAsB,SAAQ,gBAAgB,CAAA;AACvD,IAAA,OAAO,YAAY,GAAG,oBAAoB;AAE1C,IAAA,MAAM,OAAO,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACpC;AAEA,IAAA,MAAM,KAAK,GAAA;AACP,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAClC;AAEA,IAAA,MAAM,OAAO,GAAA;QACT,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;IACrC;;AAGE,MAAO,cAAe,SAAQ,gBAAgB,CAAA;AAChD,IAAA,OAAO,YAAY,GAAG,aAAa;AAEnC,IAAA,MAAM,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE;IACnD;AAEA,IAAA,MAAM,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE;IACnD;AAEA,IAAA,MAAM,MAAM,GAAA;;AAER,QAAA,IAAI;AACA,YAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;YACvC,OAAO,IAAI,CAAC;QAChB;AAAE,QAAA,MAAM;AACJ,YAAA,OAAO,KAAK;QAChB;IACJ;;;AC/DJ;;ACAA;;AAEG;;;;"}
|
|
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
|
@@ -92,9 +92,8 @@ declare class TabsHarness extends ComponentHarness {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
declare class TooltipState {
|
|
95
|
-
|
|
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
|
|
131
|
-
private
|
|
132
|
-
private
|
|
133
|
-
private
|
|
134
|
-
|
|
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, {}, {}, ["
|
|
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
|
|