@snatuva/primitives 0.0.2 → 0.0.4
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 +103 -7
- package/fesm2022/snatuva-primitives.mjs +201 -28
- package/fesm2022/snatuva-primitives.mjs.map +1 -1
- package/package.json +1 -1
- package/types/snatuva-primitives.d.ts +67 -15
package/README.md
CHANGED
|
@@ -42,11 +42,12 @@ import {
|
|
|
42
42
|
|
|
43
43
|
- `apTabs` — root tabs scope/state provider.
|
|
44
44
|
- `apTabList` — list container for tab triggers.
|
|
45
|
+
- Optional input: `orientation: 'horizontal' | 'vertical'` (default: 'horizontal')
|
|
45
46
|
- `apTabTrigger` — interactive tab trigger.
|
|
46
47
|
- Required input: `tabId: string`
|
|
47
48
|
- Optional input: `disabled: boolean`
|
|
48
49
|
- `apTabPanel` — panel region.
|
|
49
|
-
-
|
|
50
|
+
- Required input: `id: string` (used for ARIA relationships and state management)
|
|
50
51
|
- Optional input: `disabled: boolean`
|
|
51
52
|
- `apTabContent` — structural directive to conditionally render active panel content.
|
|
52
53
|
- Required input: `tabId: string`
|
|
@@ -56,20 +57,18 @@ import {
|
|
|
56
57
|
```html
|
|
57
58
|
<div apTabs>
|
|
58
59
|
<div apTabList>
|
|
60
|
+
<!-- Automatically gets role="tab", aria-selected, aria-controls -->
|
|
59
61
|
<button apTabTrigger tabId="overview">Overview</button>
|
|
60
62
|
<button apTabTrigger tabId="details">Details</button>
|
|
61
63
|
</div>
|
|
62
64
|
|
|
65
|
+
<!-- Automatically gets role="tabpanel", aria-labelledby, aria-hidden -->
|
|
63
66
|
<section apTabPanel id="overview">
|
|
64
|
-
<
|
|
65
|
-
<p>Overview content</p>
|
|
66
|
-
</ng-template>
|
|
67
|
+
<p>Overview content</p>
|
|
67
68
|
</section>
|
|
68
69
|
|
|
69
70
|
<section apTabPanel id="details">
|
|
70
|
-
<
|
|
71
|
-
<p>Details content</p>
|
|
72
|
-
</ng-template>
|
|
71
|
+
<p>Details content</p>
|
|
73
72
|
</section>
|
|
74
73
|
</div>
|
|
75
74
|
```
|
|
@@ -80,6 +79,48 @@ import {
|
|
|
80
79
|
- Selecting a disabled tab is ignored.
|
|
81
80
|
- When an active panel is removed, selection falls back to the next available panel.
|
|
82
81
|
|
|
82
|
+
### Accessibility (ARIA)
|
|
83
|
+
|
|
84
|
+
✅ **Automatic - No manual configuration needed!**
|
|
85
|
+
|
|
86
|
+
**Built-in ARIA attributes:**
|
|
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
|
|
90
|
+
|
|
91
|
+
**Built-in keyboard navigation:**
|
|
92
|
+
- <kbd>Arrow Right</kbd> / <kbd>Arrow Left</kbd> — Switch between tabs
|
|
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
|
|
97
|
+
|
|
98
|
+
**CSS Styling Example:**
|
|
99
|
+
|
|
100
|
+
```css
|
|
101
|
+
/* Target active tab */
|
|
102
|
+
[apTabTrigger][aria-selected='true'] {
|
|
103
|
+
border-bottom: 2px solid #2196f3;
|
|
104
|
+
font-weight: bold;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Target disabled tab */
|
|
108
|
+
[apTabTrigger][aria-disabled='true'] {
|
|
109
|
+
opacity: 0.5;
|
|
110
|
+
cursor: not-allowed;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Style tab panels */
|
|
114
|
+
[apTabPanel] {
|
|
115
|
+
padding: 20px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Hide inactive panels */
|
|
119
|
+
[apTabPanel][aria-hidden='true'] {
|
|
120
|
+
display: none;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
83
124
|
## Tooltip
|
|
84
125
|
|
|
85
126
|
### Directives
|
|
@@ -92,8 +133,10 @@ import {
|
|
|
92
133
|
|
|
93
134
|
```html
|
|
94
135
|
<div apTooltip>
|
|
136
|
+
<!-- Automatically gets role="button", aria-describedby, aria-expanded, tabindex -->
|
|
95
137
|
<button apTooltipTrigger type="button">Hover or focus me</button>
|
|
96
138
|
|
|
139
|
+
<!-- Automatically gets role="tooltip" and unique id -->
|
|
97
140
|
<ng-template apTooltipContent>
|
|
98
141
|
<span>Helpful tooltip content</span>
|
|
99
142
|
</ng-template>
|
|
@@ -105,6 +148,59 @@ import {
|
|
|
105
148
|
- Opens on `mouseenter` and `focus`.
|
|
106
149
|
- Closes on `mouseleave`, `blur`, or <kbd>Escape</kbd>.
|
|
107
150
|
|
|
151
|
+
### Accessibility (ARIA)
|
|
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
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
108
204
|
## Development
|
|
109
205
|
|
|
110
206
|
### Build library
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, computed, Injectable, Directive, inject, Input, ElementRef, HostBinding, effect, TemplateRef, contentChild, contentChildren, ViewContainerRef, Injector, runInInjectionContext } from '@angular/core';
|
|
2
|
+
import { signal, computed, Injectable, Directive, inject, Input, ElementRef, HostBinding, effect, input, TemplateRef, contentChild, contentChildren, ViewContainerRef, Injector, 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
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
5
6
|
import { Overlay } from '@angular/cdk/overlay';
|
|
6
7
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
7
8
|
import { Subject, fromEvent, filter, takeUntil } from 'rxjs';
|
|
@@ -25,7 +26,7 @@ class TabsState {
|
|
|
25
26
|
this._activeId.set(this._panels()[0]?.id ?? null);
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
activate(id) {
|
|
29
30
|
const panel = this._panels().find(p => p.id === id && !p.disabled);
|
|
30
31
|
if (panel) {
|
|
31
32
|
this._activeId.set(id);
|
|
@@ -75,11 +76,15 @@ class TabPanelDirective {
|
|
|
75
76
|
this.state.unregister(this.ariaPanel.value());
|
|
76
77
|
}
|
|
77
78
|
isActive() {
|
|
78
|
-
// 3. Compare the active state against the primitive's value
|
|
79
79
|
return this.state.activeId() === this.ariaPanel.value();
|
|
80
80
|
}
|
|
81
|
+
onKeydown(event) {
|
|
82
|
+
if (event.key === 'Escape') {
|
|
83
|
+
event.stopPropagation();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
81
86
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabPanelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
82
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TabPanelDirective, isStandalone: true, selector: "[apTabPanel]", inputs: { disabled: "disabled" }, host: { attributes: { "role": "tabpanel" }, properties: { "attr.aria-labelledby": "`ap-tab-${ariaPanel.value}`", "style.display": "isActive() ? \"block\" : \"none\"", "
|
|
87
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TabPanelDirective, isStandalone: true, selector: "[apTabPanel]", inputs: { disabled: "disabled" }, host: { attributes: { "role": "tabpanel" }, properties: { "attr.aria-labelledby": "`ap-tab-${ariaPanel.value()}`", "attr.id": "`ap-panel-${ariaPanel.value()}`", "style.display": "isActive() ? \"block\" : \"none\"", "hidden": "!isActive()" } }, exportAs: ["apTabPanel"], hostDirectives: [{ directive: i1.TabPanel, inputs: ["id", "id", "value", "value"] }], ngImport: i0 });
|
|
83
88
|
}
|
|
84
89
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabPanelDirective, decorators: [{
|
|
85
90
|
type: Directive,
|
|
@@ -89,10 +94,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
89
94
|
exportAs: 'apTabPanel',
|
|
90
95
|
host: {
|
|
91
96
|
'role': 'tabpanel',
|
|
92
|
-
|
|
93
|
-
'[attr.
|
|
97
|
+
'[attr.aria-labelledby]': '`ap-tab-${ariaPanel.value()}`',
|
|
98
|
+
'[attr.id]': '`ap-panel-${ariaPanel.value()}`',
|
|
94
99
|
'[style.display]': 'isActive() ? "block" : "none"',
|
|
95
|
-
'[
|
|
100
|
+
'[hidden]': '!isActive()'
|
|
96
101
|
},
|
|
97
102
|
hostDirectives: [{
|
|
98
103
|
directive: TabPanel,
|
|
@@ -110,29 +115,46 @@ class TabTriggerDirective {
|
|
|
110
115
|
disabled = false;
|
|
111
116
|
state = inject(TabsState);
|
|
112
117
|
el = inject((ElementRef));
|
|
113
|
-
// constructor(@Host() private tabs: TabsDirective) { }
|
|
114
118
|
activate() {
|
|
115
|
-
this.state.
|
|
119
|
+
this.state.activate(this.tabId);
|
|
120
|
+
}
|
|
121
|
+
onKeydown(event) {
|
|
122
|
+
const active = this.state.panels().filter(t => !t.disabled);
|
|
123
|
+
const idx = active.findIndex(t => t.id === this.tabId);
|
|
124
|
+
let next;
|
|
125
|
+
switch (event.key) {
|
|
126
|
+
case 'ArrowRight':
|
|
127
|
+
case 'ArrowDown':
|
|
128
|
+
next = active[(idx + 1) % active.length];
|
|
129
|
+
break;
|
|
130
|
+
case 'ArrowLeft':
|
|
131
|
+
case 'ArrowUp':
|
|
132
|
+
next = active[(idx - 1 + active.length) % active.length];
|
|
133
|
+
break;
|
|
134
|
+
case 'Home':
|
|
135
|
+
next = active[0];
|
|
136
|
+
break;
|
|
137
|
+
case 'End':
|
|
138
|
+
next = active[active.length - 1];
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
if (next) {
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
this.state.activate(next.id);
|
|
144
|
+
this.focus();
|
|
145
|
+
}
|
|
116
146
|
}
|
|
117
147
|
focus() {
|
|
118
148
|
this.el.nativeElement.focus();
|
|
119
149
|
}
|
|
120
|
-
// @HostListener('keydown', ['$event'])
|
|
121
|
-
// onKeydown(event: KeyboardEvent) {
|
|
122
|
-
// this.tabs.handleKeydown(event);
|
|
123
|
-
// }
|
|
124
|
-
tabindex = '-1';
|
|
125
150
|
get id() {
|
|
126
151
|
return `ap-tab-${this.tabId}`;
|
|
127
152
|
}
|
|
128
153
|
get controls() {
|
|
129
154
|
return `ap-panel-${this.tabId}`;
|
|
130
155
|
}
|
|
131
|
-
setActive(isActive) {
|
|
132
|
-
this.tabindex = isActive ? '0' : '-1';
|
|
133
|
-
}
|
|
134
156
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
135
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TabTriggerDirective, isStandalone: true, selector: "[apTabTrigger]", inputs: { tabId: "tabId", disabled: "disabled" }, host: { attributes: { "role": "tab" }, listeners: { "click": "activate()" }, properties: { "attr.aria-selected": "state.activeId() === tabId", "attr.aria-disabled": "disabled", "
|
|
157
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TabTriggerDirective, isStandalone: true, selector: "[apTabTrigger]", inputs: { tabId: "tabId", disabled: "disabled" }, host: { attributes: { "role": "tab" }, listeners: { "keydown": "onKeydown($event)", "click": "activate()" }, properties: { "attr.aria-selected": "state.activeId() === tabId", "attr.aria-disabled": "disabled", "tabindex": "state.activeId() === tabId ? \"0\" : \"-1\"", "attr.id": "this.id", "attr.aria-controls": "this.controls" } }, providers: [
|
|
136
158
|
{ provide: Tab, useExisting: Tab }
|
|
137
159
|
], hostDirectives: [{ directive: i1.Tab, inputs: ["value", "tabId"] }], ngImport: i0 });
|
|
138
160
|
}
|
|
@@ -145,6 +167,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
145
167
|
'role': 'tab',
|
|
146
168
|
'[attr.aria-selected]': 'state.activeId() === tabId',
|
|
147
169
|
'[attr.aria-disabled]': 'disabled',
|
|
170
|
+
'[tabindex]': 'state.activeId() === tabId ? "0" : "-1"',
|
|
171
|
+
'(keydown)': 'onKeydown($event)',
|
|
148
172
|
'(click)': 'activate()'
|
|
149
173
|
},
|
|
150
174
|
providers: [
|
|
@@ -160,9 +184,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
160
184
|
args: [{ required: true }]
|
|
161
185
|
}], disabled: [{
|
|
162
186
|
type: Input
|
|
163
|
-
}], tabindex: [{
|
|
164
|
-
type: HostBinding,
|
|
165
|
-
args: ['attr.tabindex']
|
|
166
187
|
}], id: [{
|
|
167
188
|
type: HostBinding,
|
|
168
189
|
args: ['attr.id']
|
|
@@ -196,23 +217,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
196
217
|
}] } });
|
|
197
218
|
|
|
198
219
|
class TabListDirective {
|
|
220
|
+
//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.
|
|
221
|
+
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
199
222
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
200
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
223
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.6", type: TabListDirective, isStandalone: true, selector: "[apTabList]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "tablist" }, properties: { "attr.aria-orientation": "orientation()" } }, hostDirectives: [{ directive: i1.TabList }], ngImport: i0 });
|
|
201
224
|
}
|
|
202
225
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabListDirective, decorators: [{
|
|
203
226
|
type: Directive,
|
|
204
227
|
args: [{
|
|
205
228
|
selector: '[apTabList]',
|
|
206
229
|
standalone: true,
|
|
230
|
+
host: {
|
|
231
|
+
'role': 'tablist',
|
|
232
|
+
'[attr.aria-orientation]': 'orientation()',
|
|
233
|
+
},
|
|
207
234
|
hostDirectives: [{
|
|
208
235
|
directive: TabList
|
|
209
236
|
}]
|
|
210
237
|
}]
|
|
211
|
-
}] });
|
|
238
|
+
}], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
|
|
239
|
+
|
|
240
|
+
class TabTriggerHarness extends ComponentHarness {
|
|
241
|
+
static hostSelector = '[apTabTrigger]';
|
|
242
|
+
async getText() {
|
|
243
|
+
return (await this.host()).text();
|
|
244
|
+
}
|
|
245
|
+
async isActive() {
|
|
246
|
+
const host = await this.host();
|
|
247
|
+
const ariaSelected = await host.getAttribute('aria-selected');
|
|
248
|
+
return ariaSelected === 'true';
|
|
249
|
+
}
|
|
250
|
+
async click() {
|
|
251
|
+
const host = await this.host();
|
|
252
|
+
return host.click();
|
|
253
|
+
}
|
|
254
|
+
async getTabId() {
|
|
255
|
+
const host = await this.host();
|
|
256
|
+
return host.getAttribute('tabId');
|
|
257
|
+
}
|
|
258
|
+
async isDisabled() {
|
|
259
|
+
const host = await this.host();
|
|
260
|
+
const ariaDisabled = await host.getAttribute('aria-disabled');
|
|
261
|
+
return ariaDisabled === 'true';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
class TabPanelHarness extends ComponentHarness {
|
|
265
|
+
static hostSelector = '[apTabPanel]';
|
|
266
|
+
async getText() {
|
|
267
|
+
return (await this.host()).text();
|
|
268
|
+
}
|
|
269
|
+
async isActive() {
|
|
270
|
+
const host = await this.host();
|
|
271
|
+
const ariaHidden = await host.getAttribute('aria-hidden');
|
|
272
|
+
return ariaHidden !== 'true';
|
|
273
|
+
}
|
|
274
|
+
async getRole() {
|
|
275
|
+
const host = await this.host();
|
|
276
|
+
return host.getAttribute('role');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
class TabsHarness extends ComponentHarness {
|
|
280
|
+
static hostSelector = '[apTabs]';
|
|
281
|
+
async getTabTriggers() {
|
|
282
|
+
return this.locatorForAll(TabTriggerHarness)();
|
|
283
|
+
}
|
|
284
|
+
async getTabPanels() {
|
|
285
|
+
return this.locatorForAll(TabPanelHarness)();
|
|
286
|
+
}
|
|
287
|
+
async getActiveTab() {
|
|
288
|
+
const triggers = await this.getTabTriggers();
|
|
289
|
+
for (const trigger of triggers) {
|
|
290
|
+
if (await trigger.isActive()) {
|
|
291
|
+
return trigger;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
async selectTabByText(text) {
|
|
297
|
+
const triggers = await this.getTabTriggers();
|
|
298
|
+
for (const trigger of triggers) {
|
|
299
|
+
if ((await trigger.getText()) === text) {
|
|
300
|
+
await trigger.click();
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
throw new Error(`Tab with text "${text}" not found`);
|
|
305
|
+
}
|
|
306
|
+
async selectTabByIndex(index) {
|
|
307
|
+
const triggers = await this.getTabTriggers();
|
|
308
|
+
if (index < 0 || index >= triggers.length) {
|
|
309
|
+
throw new Error(`Tab index ${index} out of range`);
|
|
310
|
+
}
|
|
311
|
+
await triggers[index].click();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
212
314
|
|
|
213
315
|
class TooltipState {
|
|
214
316
|
/** Whether tooltip is open */
|
|
215
317
|
open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
|
|
318
|
+
/** ID of the tooltip content */
|
|
319
|
+
tooltipId = signal(null, ...(ngDevMode ? [{ debugName: "tooltipId" }] : []));
|
|
216
320
|
openTooltip() {
|
|
217
321
|
this.open.set(true);
|
|
218
322
|
}
|
|
@@ -222,6 +326,9 @@ class TooltipState {
|
|
|
222
326
|
toggle() {
|
|
223
327
|
this.open.update(v => !v);
|
|
224
328
|
}
|
|
329
|
+
setTooltipId(id) {
|
|
330
|
+
this.tooltipId.set(id);
|
|
331
|
+
}
|
|
225
332
|
}
|
|
226
333
|
|
|
227
334
|
class TooltipTriggerDirective {
|
|
@@ -239,8 +346,11 @@ class TooltipTriggerDirective {
|
|
|
239
346
|
onBlur() {
|
|
240
347
|
this.state.closeTooltip();
|
|
241
348
|
}
|
|
349
|
+
onEscape() {
|
|
350
|
+
this.state.closeTooltip();
|
|
351
|
+
}
|
|
242
352
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
243
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipTriggerDirective, isStandalone: true, selector: "[apTooltipTrigger]", host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" } }, ngImport: i0 });
|
|
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 });
|
|
244
354
|
}
|
|
245
355
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipTriggerDirective, decorators: [{
|
|
246
356
|
type: Directive,
|
|
@@ -248,18 +358,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
248
358
|
selector: '[apTooltipTrigger]',
|
|
249
359
|
standalone: true,
|
|
250
360
|
host: {
|
|
361
|
+
'role': 'button',
|
|
362
|
+
'[attr.tabindex]': '0',
|
|
251
363
|
'(mouseenter)': 'onMouseEnter()',
|
|
252
364
|
'(mouseleave)': 'onMouseLeave()',
|
|
253
365
|
'(focus)': 'onFocus()',
|
|
254
366
|
'(blur)': 'onBlur()',
|
|
367
|
+
'(keydown.escape)': 'onEscape()',
|
|
368
|
+
'[attr.aria-describedby]': 'state.tooltipId()',
|
|
369
|
+
'[attr.aria-expanded]': 'state.open()'
|
|
255
370
|
}
|
|
256
371
|
}]
|
|
257
372
|
}] });
|
|
258
373
|
|
|
259
374
|
class TooltipContentDirective {
|
|
260
375
|
template = inject((TemplateRef));
|
|
376
|
+
tooltipId = `ap-tooltip-${Math.random().toString(36).substr(2, 9)}`;
|
|
261
377
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
262
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TooltipContentDirective, isStandalone: true, selector: "[apTooltipContent]", host: { attributes: { "role": "tooltip" } }, ngImport: i0 });
|
|
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 });
|
|
263
379
|
}
|
|
264
380
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TooltipContentDirective, decorators: [{
|
|
265
381
|
type: Directive,
|
|
@@ -267,10 +383,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
267
383
|
selector: '[apTooltipContent]',
|
|
268
384
|
standalone: true,
|
|
269
385
|
host: {
|
|
270
|
-
'role': 'tooltip'
|
|
386
|
+
'role': 'tooltip',
|
|
387
|
+
'[id]': 'tooltipId'
|
|
271
388
|
}
|
|
272
389
|
}]
|
|
273
|
-
}]
|
|
390
|
+
}], propDecorators: { tooltipId: [{
|
|
391
|
+
type: Input
|
|
392
|
+
}] } });
|
|
274
393
|
|
|
275
394
|
class TooltipOverlay {
|
|
276
395
|
overlay;
|
|
@@ -362,6 +481,7 @@ class TooltipDirective {
|
|
|
362
481
|
if (!content || triggers.length === 0) {
|
|
363
482
|
return;
|
|
364
483
|
}
|
|
484
|
+
this.state.setTooltipId(content.tooltipId);
|
|
365
485
|
// Create overlay only once
|
|
366
486
|
if (!this.overlay) {
|
|
367
487
|
const origin = triggers[0].element.nativeElement;
|
|
@@ -416,11 +536,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
416
536
|
}]
|
|
417
537
|
}], ctorParameters: () => [], propDecorators: { content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TooltipContentDirective), { isSignal: true }] }], triggers: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TooltipTriggerDirective), { isSignal: true }] }] } });
|
|
418
538
|
|
|
539
|
+
class TooltipTriggerHarness extends ComponentHarness {
|
|
540
|
+
static hostSelector = '[apTooltipTrigger]';
|
|
541
|
+
async getAriaDescribedBy() {
|
|
542
|
+
const host = await this.host();
|
|
543
|
+
return host.getAttribute('aria-describedby');
|
|
544
|
+
}
|
|
545
|
+
async click() {
|
|
546
|
+
const host = await this.host();
|
|
547
|
+
return host.click();
|
|
548
|
+
}
|
|
549
|
+
async focus() {
|
|
550
|
+
const host = await this.host();
|
|
551
|
+
return host.focus();
|
|
552
|
+
}
|
|
553
|
+
async blur() {
|
|
554
|
+
const host = await this.host();
|
|
555
|
+
return host.blur();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
class TooltipContentHarness extends ComponentHarness {
|
|
559
|
+
static hostSelector = '[apTooltipContent]';
|
|
560
|
+
async getRole() {
|
|
561
|
+
const host = await this.host();
|
|
562
|
+
return host.getAttribute('role');
|
|
563
|
+
}
|
|
564
|
+
async getId() {
|
|
565
|
+
const host = await this.host();
|
|
566
|
+
return host.getAttribute('id');
|
|
567
|
+
}
|
|
568
|
+
async getText() {
|
|
569
|
+
return (await this.host()).text();
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
class TooltipHarness extends ComponentHarness {
|
|
573
|
+
static hostSelector = '[apTooltip]';
|
|
574
|
+
async getTrigger() {
|
|
575
|
+
return this.locatorFor(TooltipTriggerHarness)();
|
|
576
|
+
}
|
|
577
|
+
async getContent() {
|
|
578
|
+
return this.locatorFor(TooltipContentHarness)();
|
|
579
|
+
}
|
|
580
|
+
async isOpen() {
|
|
581
|
+
// Check if content is present or visible
|
|
582
|
+
try {
|
|
583
|
+
const content = await this.getContent();
|
|
584
|
+
return true; // If found, assume open
|
|
585
|
+
}
|
|
586
|
+
catch {
|
|
587
|
+
return false;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
419
592
|
// public-api.ts
|
|
420
593
|
|
|
421
594
|
/**
|
|
422
595
|
* Generated bundle index. Do not edit.
|
|
423
596
|
*/
|
|
424
597
|
|
|
425
|
-
export { TabContentDirective, TabListDirective, TabPanelDirective, TabTriggerDirective, TabsDirective, TooltipContentDirective, TooltipDirective, TooltipState, TooltipTriggerDirective };
|
|
598
|
+
export { TabContentDirective, TabListDirective, TabPanelDirective, TabPanelHarness, TabTriggerDirective, TabTriggerHarness, TabsDirective, TabsHarness, TooltipContentDirective, TooltipContentHarness, TooltipDirective, TooltipHarness, TooltipState, TooltipTriggerDirective, TooltipTriggerHarness };
|
|
426
599
|
//# sourceMappingURL=snatuva-primitives.mjs.map
|
|
@@ -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/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/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 select(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\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 // state = inject(TabsState);\n // public activeTab = this.state.activeId;\n // @ContentChildren(TabTriggerDirective, { descendants: true })\n // private readonly triggers!: QueryList<TabTriggerDirective>;\n\n // // private readonly keyboard = new TabsKeyboardController();\n // private readonly injector = inject(Injector);\n // constructor(public readonly state: TabsState) {\n // }\n\n // ngAfterContentInit(): void {\n // // const triggers = this.triggers.toArray();\n\n // // this.keyboard.init(triggers);\n\n // // runInInjectionContext(this.injector, () => {\n // // effect(() => {\n // // const id = this.state.activeId();\n\n // // triggers.forEach(trigger =>\n // // trigger.setActive(trigger.tabId === id)\n // // );\n\n // // if (id) {\n // // this.keyboard.setActiveById(id);\n // // }\n // // });\n // // });\n // }\n\n // // onKeydown(event: KeyboardEvent) {\n // // this.keyboard.handleKeydown(event);\n // // }\n\n\n\n}\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 // Use the ID from the injected ariaPanel\n '[attr.aria-labelledby]': '`ap-tab-${ariaPanel.value}`',\n '[style.display]': 'isActive() ? \"block\" : \"none\"',\n '[attr.aria-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 // 3. Compare the active state against the primitive's value\n return this.state.activeId() === this.ariaPanel.value();\n }\n}","import { Directive, ElementRef, Host, HostBinding, HostListener, inject, Input, input } from '@angular/core';\nimport { FocusableOption } from '@angular/cdk/a11y';\nimport { 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 '(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 // constructor(@Host() private tabs: TabsDirective) { }\n activate(): void {\n this.state.select(this.tabId);\n }\n\n focus(): void {\n this.el.nativeElement.focus();\n }\n\n // @HostListener('keydown', ['$event'])\n // onKeydown(event: KeyboardEvent) {\n // this.tabs.handleKeydown(event);\n // }\n\n @HostBinding('attr.tabindex')\n tabindex = '-1';\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\n setActive(isActive: boolean): void {\n this.tabindex = isActive ? '0' : '-1';\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 } from '@angular/core';\nimport { TabList } from '@angular/aria/tabs';\n\n@Directive({\n selector: '[apTabList]',\n standalone: true,\n hostDirectives: [{\n directive: TabList\n }]\n})\nexport class TabListDirective { }","import { signal } from '@angular/core';\n\nexport class TooltipState {\n /** Whether tooltip is open */\n readonly open = signal(false);\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","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 '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n }\n})\nexport class TooltipTriggerDirective {\n private 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\n","import {\n Directive,\n TemplateRef,\n inject,\n} from '@angular/core';\n\n@Directive({\n selector: '[apTooltipContent]',\n standalone: true,\n host: {\n 'role': 'tooltip'\n }\n})\nexport class TooltipContentDirective {\n readonly template = inject(TemplateRef<void>);\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 // 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}","// 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 /** 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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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,9 @@ import { OnInit, OnDestroy, ElementRef, TemplateRef, ViewContainerRef, AfterCont
|
|
|
3
3
|
import * as i1 from '@angular/aria/tabs';
|
|
4
4
|
import { TabPanel as TabPanel$1 } from '@angular/aria/tabs';
|
|
5
5
|
import { FocusableOption } from '@angular/cdk/a11y';
|
|
6
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
6
7
|
|
|
8
|
+
type SelectionMode = 'follow' | 'explicit';
|
|
7
9
|
declare class TabsDirective {
|
|
8
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<TabsDirective, never>;
|
|
9
11
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TabsDirective, "[apTabs]", ["apTabs"], {}, {}, never, never, true, [{ directive: typeof i1.Tabs; inputs: {}; outputs: {}; }]>;
|
|
@@ -16,6 +18,7 @@ declare class TabPanelDirective implements OnInit, OnDestroy {
|
|
|
16
18
|
ngOnInit(): void;
|
|
17
19
|
ngOnDestroy(): void;
|
|
18
20
|
isActive(): boolean;
|
|
21
|
+
onKeydown(event: KeyboardEvent): void;
|
|
19
22
|
static ɵfac: i0.ɵɵFactoryDeclaration<TabPanelDirective, never>;
|
|
20
23
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TabPanelDirective, "[apTabPanel]", ["apTabPanel"], { "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.TabPanel; inputs: { "id": "id"; "value": "value"; }; outputs: {}; }]>;
|
|
21
24
|
}
|
|
@@ -32,7 +35,7 @@ declare class TabsState {
|
|
|
32
35
|
readonly activePanel: i0.Signal<TabPanel | undefined>;
|
|
33
36
|
register(panel: TabPanel): void;
|
|
34
37
|
unregister(id: string): void;
|
|
35
|
-
|
|
38
|
+
activate(id: string): void;
|
|
36
39
|
static ɵfac: i0.ɵɵFactoryDeclaration<TabsState, never>;
|
|
37
40
|
static ɵprov: i0.ɵɵInjectableDeclaration<TabsState>;
|
|
38
41
|
}
|
|
@@ -43,11 +46,10 @@ declare class TabTriggerDirective implements FocusableOption {
|
|
|
43
46
|
state: TabsState;
|
|
44
47
|
el: ElementRef<any>;
|
|
45
48
|
activate(): void;
|
|
49
|
+
onKeydown(event: KeyboardEvent): void;
|
|
46
50
|
focus(): void;
|
|
47
|
-
tabindex: string;
|
|
48
51
|
get id(): string;
|
|
49
52
|
get controls(): string;
|
|
50
|
-
setActive(isActive: boolean): void;
|
|
51
53
|
static ɵfac: i0.ɵɵFactoryDeclaration<TabTriggerDirective, never>;
|
|
52
54
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TabTriggerDirective, "[apTabTrigger]", never, { "tabId": { "alias": "tabId"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.Tab; inputs: { "value": "tabId"; }; outputs: {}; }]>;
|
|
53
55
|
}
|
|
@@ -61,33 +63,62 @@ declare class TabContentDirective {
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
declare class TabListDirective {
|
|
66
|
+
orientation: i0.InputSignal<string>;
|
|
64
67
|
static ɵfac: i0.ɵɵFactoryDeclaration<TabListDirective, never>;
|
|
65
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<TabListDirective, "[apTabList]", never, {}, {}, never, never, true, [{ directive: typeof i1.TabList; inputs: {}; outputs: {}; }]>;
|
|
68
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TabListDirective, "[apTabList]", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.TabList; inputs: {}; outputs: {}; }]>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
declare class TabTriggerHarness extends ComponentHarness {
|
|
72
|
+
static hostSelector: string;
|
|
73
|
+
getText(): Promise<string>;
|
|
74
|
+
isActive(): Promise<boolean>;
|
|
75
|
+
click(): Promise<void>;
|
|
76
|
+
getTabId(): Promise<string | null>;
|
|
77
|
+
isDisabled(): Promise<boolean>;
|
|
78
|
+
}
|
|
79
|
+
declare class TabPanelHarness extends ComponentHarness {
|
|
80
|
+
static hostSelector: string;
|
|
81
|
+
getText(): Promise<string>;
|
|
82
|
+
isActive(): Promise<boolean>;
|
|
83
|
+
getRole(): Promise<string | null>;
|
|
84
|
+
}
|
|
85
|
+
declare class TabsHarness extends ComponentHarness {
|
|
86
|
+
static hostSelector: string;
|
|
87
|
+
getTabTriggers(): Promise<TabTriggerHarness[]>;
|
|
88
|
+
getTabPanels(): Promise<TabPanelHarness[]>;
|
|
89
|
+
getActiveTab(): Promise<TabTriggerHarness | null>;
|
|
90
|
+
selectTabByText(text: string): Promise<void>;
|
|
91
|
+
selectTabByIndex(index: number): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
declare class TooltipState {
|
|
95
|
+
/** Whether tooltip is open */
|
|
96
|
+
readonly open: i0.WritableSignal<boolean>;
|
|
97
|
+
/** ID of the tooltip content */
|
|
98
|
+
readonly tooltipId: i0.WritableSignal<string | null>;
|
|
99
|
+
openTooltip(): void;
|
|
100
|
+
closeTooltip(): void;
|
|
101
|
+
toggle(): void;
|
|
102
|
+
setTooltipId(id: string): void;
|
|
66
103
|
}
|
|
67
104
|
|
|
68
105
|
declare class TooltipTriggerDirective {
|
|
69
|
-
|
|
106
|
+
readonly state: TooltipState;
|
|
70
107
|
readonly element: ElementRef<any>;
|
|
71
108
|
onMouseEnter(): void;
|
|
72
109
|
onMouseLeave(): void;
|
|
73
110
|
onFocus(): void;
|
|
74
111
|
onBlur(): void;
|
|
112
|
+
onEscape(): void;
|
|
75
113
|
static ɵfac: i0.ɵɵFactoryDeclaration<TooltipTriggerDirective, never>;
|
|
76
114
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipTriggerDirective, "[apTooltipTrigger]", never, {}, {}, never, never, true, never>;
|
|
77
115
|
}
|
|
78
116
|
|
|
79
117
|
declare class TooltipContentDirective {
|
|
80
118
|
readonly template: TemplateRef<any>;
|
|
119
|
+
tooltipId: string;
|
|
81
120
|
static ɵfac: i0.ɵɵFactoryDeclaration<TooltipContentDirective, never>;
|
|
82
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipContentDirective, "[apTooltipContent]", never, {}, {}, never, never, true, never>;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
declare class TooltipState {
|
|
86
|
-
/** Whether tooltip is open */
|
|
87
|
-
readonly open: i0.WritableSignal<boolean>;
|
|
88
|
-
openTooltip(): void;
|
|
89
|
-
closeTooltip(): void;
|
|
90
|
-
toggle(): void;
|
|
121
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipContentDirective, "[apTooltipContent]", never, { "tooltipId": { "alias": "tooltipId"; "required": false; }; }, {}, never, never, true, never>;
|
|
91
122
|
}
|
|
92
123
|
|
|
93
124
|
declare class TooltipDirective implements AfterContentInit, OnDestroy {
|
|
@@ -109,4 +140,25 @@ declare class TooltipDirective implements AfterContentInit, OnDestroy {
|
|
|
109
140
|
static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipDirective, "[apTooltip]", never, {}, {}, ["content", "triggers"], never, true, never>;
|
|
110
141
|
}
|
|
111
142
|
|
|
112
|
-
|
|
143
|
+
declare class TooltipTriggerHarness extends ComponentHarness {
|
|
144
|
+
static hostSelector: string;
|
|
145
|
+
getAriaDescribedBy(): Promise<string | null>;
|
|
146
|
+
click(): Promise<void>;
|
|
147
|
+
focus(): Promise<void>;
|
|
148
|
+
blur(): Promise<void>;
|
|
149
|
+
}
|
|
150
|
+
declare class TooltipContentHarness extends ComponentHarness {
|
|
151
|
+
static hostSelector: string;
|
|
152
|
+
getRole(): Promise<string | null>;
|
|
153
|
+
getId(): Promise<string | null>;
|
|
154
|
+
getText(): Promise<string>;
|
|
155
|
+
}
|
|
156
|
+
declare class TooltipHarness extends ComponentHarness {
|
|
157
|
+
static hostSelector: string;
|
|
158
|
+
getTrigger(): Promise<TooltipTriggerHarness>;
|
|
159
|
+
getContent(): Promise<TooltipContentHarness>;
|
|
160
|
+
isOpen(): Promise<boolean>;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { TabContentDirective, TabListDirective, TabPanelDirective, TabPanelHarness, TabTriggerDirective, TabTriggerHarness, TabsDirective, TabsHarness, TooltipContentDirective, TooltipContentHarness, TooltipDirective, TooltipHarness, TooltipState, TooltipTriggerDirective, TooltipTriggerHarness };
|
|
164
|
+
export type { SelectionMode };
|