@aquera/nile-elements 0.0.19 → 0.0.21
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/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/index.d.ts +3 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/index.js +3 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/index.js.map +1 -1
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-calendar/nile-calendar.css.js +2 -5
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-calendar/nile-calendar.css.js.map +1 -1
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-calendar/nile-calendar.d.ts +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-calendar/nile-calendar.js +8 -16
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-calendar/nile-calendar.js.map +1 -1
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-content-editor/nile-content-editor.js +1 -1
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-content-editor/nile-content-editor.js.map +1 -1
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/index.d.ts +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/index.js +2 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/index.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.css.d.ts +12 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.css.js +80 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.css.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.d.ts +55 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.js +129 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab/nile-tab.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/index.d.ts +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/index.js +2 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/index.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.css.d.ts +12 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.css.js +245 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.css.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.d.ts +82 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.js +392 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-group/nile-tab-group.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/index.d.ts +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/index.js +2 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/index.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.css.d.ts +12 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.css.js +32 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.css.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.d.ts +38 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.js +71 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/src/nile-tab-panel/nile-tab-panel.js.map +1 -0
- package/.rollup.cache/opt/atlassian/pipelines/agent/build/packages/nile-elements/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +460 -86
- package/dist/nile-calendar/nile-calendar.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.cjs.js.map +1 -1
- package/dist/nile-calendar/nile-calendar.css.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.css.cjs.js.map +1 -1
- package/dist/nile-calendar/nile-calendar.css.esm.js +2 -5
- package/dist/nile-calendar/nile-calendar.esm.js +8 -16
- package/dist/nile-content-editor/nile-content-editor.cjs.js +1 -1
- package/dist/nile-content-editor/nile-content-editor.cjs.js.map +1 -1
- package/dist/nile-content-editor/nile-content-editor.esm.js +1 -1
- package/dist/nile-tab/index.cjs.js +2 -0
- package/dist/nile-tab/index.cjs.js.map +1 -0
- package/dist/nile-tab/index.esm.js +1 -0
- package/dist/nile-tab/nile-tab.cjs.js +2 -0
- package/dist/nile-tab/nile-tab.cjs.js.map +1 -0
- package/dist/nile-tab/nile-tab.css.cjs.js +2 -0
- package/dist/nile-tab/nile-tab.css.cjs.js.map +1 -0
- package/dist/nile-tab/nile-tab.css.esm.js +68 -0
- package/dist/nile-tab/nile-tab.esm.js +21 -0
- package/dist/nile-tab-group/index.cjs.js +2 -0
- package/dist/nile-tab-group/index.cjs.js.map +1 -0
- package/dist/nile-tab-group/index.esm.js +1 -0
- package/dist/nile-tab-group/nile-tab-group.cjs.js +2 -0
- package/dist/nile-tab-group/nile-tab-group.cjs.js.map +1 -0
- package/dist/nile-tab-group/nile-tab-group.css.cjs.js +2 -0
- package/dist/nile-tab-group/nile-tab-group.css.cjs.js.map +1 -0
- package/dist/nile-tab-group/nile-tab-group.css.esm.js +233 -0
- package/dist/nile-tab-group/nile-tab-group.esm.js +43 -0
- package/dist/nile-tab-panel/index.cjs.js +2 -0
- package/dist/nile-tab-panel/index.cjs.js.map +1 -0
- package/dist/nile-tab-panel/index.esm.js +1 -0
- package/dist/nile-tab-panel/nile-tab-panel.cjs.js +2 -0
- package/dist/nile-tab-panel/nile-tab-panel.cjs.js.map +1 -0
- package/dist/nile-tab-panel/nile-tab-panel.css.cjs.js +2 -0
- package/dist/nile-tab-panel/nile-tab-panel.css.cjs.js.map +1 -0
- package/dist/nile-tab-panel/nile-tab-panel.css.esm.js +20 -0
- package/dist/nile-tab-panel/nile-tab-panel.esm.js +6 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/nile-calendar/nile-calendar.css.js +2 -5
- package/dist/src/nile-calendar/nile-calendar.css.js.map +1 -1
- package/dist/src/nile-calendar/nile-calendar.d.ts +1 -0
- package/dist/src/nile-calendar/nile-calendar.js +8 -16
- package/dist/src/nile-calendar/nile-calendar.js.map +1 -1
- package/dist/src/nile-content-editor/nile-content-editor.js +1 -1
- package/dist/src/nile-content-editor/nile-content-editor.js.map +1 -1
- package/dist/src/nile-tab/index.d.ts +1 -0
- package/dist/src/nile-tab/index.js +2 -0
- package/dist/src/nile-tab/index.js.map +1 -0
- package/dist/src/nile-tab/nile-tab.css.d.ts +12 -0
- package/dist/src/nile-tab/nile-tab.css.js +80 -0
- package/dist/src/nile-tab/nile-tab.css.js.map +1 -0
- package/dist/src/nile-tab/nile-tab.d.ts +55 -0
- package/dist/src/nile-tab/nile-tab.js +129 -0
- package/dist/src/nile-tab/nile-tab.js.map +1 -0
- package/dist/src/nile-tab-group/index.d.ts +1 -0
- package/dist/src/nile-tab-group/index.js +2 -0
- package/dist/src/nile-tab-group/index.js.map +1 -0
- package/dist/src/nile-tab-group/nile-tab-group.css.d.ts +12 -0
- package/dist/src/nile-tab-group/nile-tab-group.css.js +245 -0
- package/dist/src/nile-tab-group/nile-tab-group.css.js.map +1 -0
- package/dist/src/nile-tab-group/nile-tab-group.d.ts +82 -0
- package/dist/src/nile-tab-group/nile-tab-group.js +392 -0
- package/dist/src/nile-tab-group/nile-tab-group.js.map +1 -0
- package/dist/src/nile-tab-panel/index.d.ts +1 -0
- package/dist/src/nile-tab-panel/index.js +2 -0
- package/dist/src/nile-tab-panel/index.js.map +1 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.css.d.ts +12 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.css.js +32 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.css.js.map +1 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.d.ts +38 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.js +71 -0
- package/dist/src/nile-tab-panel/nile-tab-panel.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -0
- package/src/nile-calendar/nile-calendar.css.ts +2 -5
- package/src/nile-calendar/nile-calendar.ts +9 -16
- package/src/nile-content-editor/nile-content-editor.ts +1 -1
- package/src/nile-tab/index.ts +1 -0
- package/src/nile-tab/nile-tab.css.ts +82 -0
- package/src/nile-tab/nile-tab.ts +129 -0
- package/src/nile-tab-group/index.ts +1 -0
- package/src/nile-tab-group/nile-tab-group.css.ts +247 -0
- package/src/nile-tab-group/nile-tab-group.ts +441 -0
- package/src/nile-tab-panel/index.ts +1 -0
- package/src/nile-tab-panel/nile-tab-panel.css.ts +34 -0
- package/src/nile-tab-panel/nile-tab-panel.ts +74 -0
@@ -0,0 +1,392 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
import { __decorate } from "tslib";
|
8
|
+
import { html, property } from 'lit-element';
|
9
|
+
import { customElement } from 'lit/decorators.js';
|
10
|
+
import { styles } from './nile-tab-group.css';
|
11
|
+
import '../nile-icon-button/nile-icon-button';
|
12
|
+
import { classMap } from 'lit/directives/class-map.js';
|
13
|
+
import { query, state } from 'lit/decorators.js';
|
14
|
+
import { scrollIntoView } from '../internal/scroll';
|
15
|
+
import { watch } from '../internal/watch';
|
16
|
+
import NileElement from '../internal/nile-element';
|
17
|
+
/**
|
18
|
+
* Nile icon component.
|
19
|
+
*
|
20
|
+
* @tag nile-tab-group
|
21
|
+
*
|
22
|
+
* @slot - Used for grouping tab panels in the tab group. Must be `<nile-tab-panel>` elements.
|
23
|
+
* @slot nav - Used for grouping tabs in the tab group. Must be `<nile-tab>` elements.
|
24
|
+
*
|
25
|
+
* @event {{ name: String }} nile-tab-show - Emitted when a tab is shown.
|
26
|
+
* @event {{ name: String }} nile-tab-hide - Emitted when a tab is hidden.
|
27
|
+
*
|
28
|
+
* @csspart base - The component's base wrapper.
|
29
|
+
* @csspart nav - The tab group's navigation container where tabs are slotted in.
|
30
|
+
* @csspart tabs - The container that wraps the tabs.
|
31
|
+
* @csspart active-tab-indicator - The line that highlights the currently selected tab.
|
32
|
+
* @csspart body - The tab group's body where tab panels are slotted in.
|
33
|
+
* @csspart scroll-button - The previous/next scroll buttons that show when tabs are scrollable, an `<nile-icon-button>`.
|
34
|
+
* @csspart scroll-button--start - The starting scroll button.
|
35
|
+
* @csspart scroll-button--end - The ending scroll button.
|
36
|
+
* @csspart scroll-button__base - The scroll button's exported `base` part.
|
37
|
+
*
|
38
|
+
* @cssproperty --indicator-color - The color of the active tab indicator.
|
39
|
+
* @cssproperty --track-color - The color of the indicator's track (the line that separates tabs from panels).
|
40
|
+
* @cssproperty --track-width - The width of the indicator's track (the line that separates tabs from panels).
|
41
|
+
*
|
42
|
+
*/
|
43
|
+
let NileTabGroup = class NileTabGroup extends NileElement {
|
44
|
+
constructor() {
|
45
|
+
super(...arguments);
|
46
|
+
this.tabs = [];
|
47
|
+
this.panels = [];
|
48
|
+
this.hasScrollControls = false;
|
49
|
+
/** The placement of the tabs. */
|
50
|
+
this.placement = 'top';
|
51
|
+
/**
|
52
|
+
* When set to auto, navigating tabs with the arrow keys will instantly show the corresponding tab panel. When set to
|
53
|
+
* manual, the tab will receive focus but will not show until the user presses spacebar or enter.
|
54
|
+
*/
|
55
|
+
this.activation = 'auto';
|
56
|
+
/** Disables the scroll arrows that appear when tabs overflow. */
|
57
|
+
this.noScrollControls = false;
|
58
|
+
}
|
59
|
+
connectedCallback() {
|
60
|
+
const whenAllDefined = Promise.allSettled([
|
61
|
+
customElements.whenDefined('nile-tab'),
|
62
|
+
customElements.whenDefined('nile-tab-panel')
|
63
|
+
]);
|
64
|
+
super.connectedCallback();
|
65
|
+
this.resizeObserver = new ResizeObserver(() => {
|
66
|
+
this.repositionIndicator();
|
67
|
+
this.updateScrollControls();
|
68
|
+
});
|
69
|
+
this.mutationObserver = new MutationObserver(mutations => {
|
70
|
+
// Update aria labels when the DOM changes
|
71
|
+
if (mutations.some(m => !['aria-labelledby', 'aria-controls'].includes(m.attributeName))) {
|
72
|
+
setTimeout(() => this.setAriaLabels());
|
73
|
+
}
|
74
|
+
// Sync tabs when disabled states change
|
75
|
+
if (mutations.some(m => m.attributeName === 'disabled')) {
|
76
|
+
this.syncTabsAndPanels();
|
77
|
+
}
|
78
|
+
});
|
79
|
+
// After the first update...
|
80
|
+
this.updateComplete.then(() => {
|
81
|
+
this.syncTabsAndPanels();
|
82
|
+
this.mutationObserver.observe(this, { attributes: true, childList: true, subtree: true });
|
83
|
+
this.resizeObserver.observe(this.nav);
|
84
|
+
// Wait for tabs and tab panels to be registered
|
85
|
+
whenAllDefined.then(() => {
|
86
|
+
// Set initial tab state when the tabs become visible
|
87
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
88
|
+
if (entries[0].intersectionRatio > 0) {
|
89
|
+
this.setAriaLabels();
|
90
|
+
this.setActiveTab(this.getActiveTab() ?? this.tabs[0], { emitEvents: false });
|
91
|
+
observer.unobserve(entries[0].target);
|
92
|
+
}
|
93
|
+
});
|
94
|
+
intersectionObserver.observe(this.tabGroup);
|
95
|
+
});
|
96
|
+
});
|
97
|
+
}
|
98
|
+
disconnectedCallback() {
|
99
|
+
this.mutationObserver.disconnect();
|
100
|
+
this.resizeObserver.unobserve(this.nav);
|
101
|
+
}
|
102
|
+
getAllTabs(options = { includeDisabled: true }) {
|
103
|
+
const slot = this.shadowRoot.querySelector('slot[name="nav"]');
|
104
|
+
return [...slot.assignedElements()].filter(el => {
|
105
|
+
return options.includeDisabled
|
106
|
+
? el.tagName.toLowerCase() === 'nile-tab'
|
107
|
+
: el.tagName.toLowerCase() === 'nile-tab' && !el.disabled;
|
108
|
+
});
|
109
|
+
}
|
110
|
+
getAllPanels() {
|
111
|
+
return [...this.body.assignedElements()].filter(el => el.tagName.toLowerCase() === 'nile-tab-panel');
|
112
|
+
}
|
113
|
+
getActiveTab() {
|
114
|
+
return this.tabs.find(el => el.active);
|
115
|
+
}
|
116
|
+
handleClick(event) {
|
117
|
+
const target = event.target;
|
118
|
+
const tab = target.closest('nile-tab');
|
119
|
+
const tabGroup = tab?.closest('nile-tab-group');
|
120
|
+
// Ensure the target tab is in this tab group
|
121
|
+
if (tabGroup !== this) {
|
122
|
+
return;
|
123
|
+
}
|
124
|
+
if (tab !== null) {
|
125
|
+
this.setActiveTab(tab, { scrollBehavior: 'smooth' });
|
126
|
+
}
|
127
|
+
}
|
128
|
+
handleKeyDown(event) {
|
129
|
+
const target = event.target;
|
130
|
+
const tab = target.closest('nile-tab');
|
131
|
+
const tabGroup = tab?.closest('nile-tab-group');
|
132
|
+
// Ensure the target tab is in this tab group
|
133
|
+
if (tabGroup !== this) {
|
134
|
+
return;
|
135
|
+
}
|
136
|
+
// Activate a tab
|
137
|
+
if (['Enter', ' '].includes(event.key)) {
|
138
|
+
if (tab !== null) {
|
139
|
+
this.setActiveTab(tab, { scrollBehavior: 'smooth' });
|
140
|
+
event.preventDefault();
|
141
|
+
}
|
142
|
+
}
|
143
|
+
// Move focus left or right
|
144
|
+
if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {
|
145
|
+
const activeEl = this.tabs.find(t => t.matches(':focus'));
|
146
|
+
const isRtl = false;
|
147
|
+
if (activeEl?.tagName.toLowerCase() === 'nile-tab') {
|
148
|
+
let index = this.tabs.indexOf(activeEl);
|
149
|
+
if (event.key === 'Home') {
|
150
|
+
index = 0;
|
151
|
+
}
|
152
|
+
else if (event.key === 'End') {
|
153
|
+
index = this.tabs.length - 1;
|
154
|
+
}
|
155
|
+
else if ((['top', 'bottom'].includes(this.placement) && event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft')) ||
|
156
|
+
(['start', 'end'].includes(this.placement) && event.key === 'ArrowUp')) {
|
157
|
+
index--;
|
158
|
+
}
|
159
|
+
else if ((['top', 'bottom'].includes(this.placement) && event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight')) ||
|
160
|
+
(['start', 'end'].includes(this.placement) && event.key === 'ArrowDown')) {
|
161
|
+
index++;
|
162
|
+
}
|
163
|
+
if (index < 0) {
|
164
|
+
index = this.tabs.length - 1;
|
165
|
+
}
|
166
|
+
if (index > this.tabs.length - 1) {
|
167
|
+
index = 0;
|
168
|
+
}
|
169
|
+
this.tabs[index].focus({ preventScroll: true });
|
170
|
+
if (this.activation === 'auto') {
|
171
|
+
this.setActiveTab(this.tabs[index], { scrollBehavior: 'smooth' });
|
172
|
+
}
|
173
|
+
if (['top', 'bottom'].includes(this.placement)) {
|
174
|
+
scrollIntoView(this.tabs[index], this.nav, 'horizontal');
|
175
|
+
}
|
176
|
+
event.preventDefault();
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
handleScrollToStart() {
|
181
|
+
this.nav.scroll({
|
182
|
+
left: true
|
183
|
+
? this.nav.scrollLeft + this.nav.clientWidth
|
184
|
+
: this.nav.scrollLeft - this.nav.clientWidth,
|
185
|
+
behavior: 'smooth'
|
186
|
+
});
|
187
|
+
}
|
188
|
+
handleScrollToEnd() {
|
189
|
+
this.nav.scroll({
|
190
|
+
left: true
|
191
|
+
? this.nav.scrollLeft - this.nav.clientWidth
|
192
|
+
: this.nav.scrollLeft + this.nav.clientWidth,
|
193
|
+
behavior: 'smooth'
|
194
|
+
});
|
195
|
+
}
|
196
|
+
setActiveTab(tab, options) {
|
197
|
+
options = {
|
198
|
+
emitEvents: true,
|
199
|
+
scrollBehavior: 'auto',
|
200
|
+
...options
|
201
|
+
};
|
202
|
+
if (tab !== this.activeTab && !tab.disabled) {
|
203
|
+
const previousTab = this.activeTab;
|
204
|
+
this.activeTab = tab;
|
205
|
+
// Sync active tab and panel
|
206
|
+
this.tabs.map(el => (el.active = el === this.activeTab));
|
207
|
+
this.panels.map(el => (el.active = el.name === this.activeTab?.panel));
|
208
|
+
this.syncIndicator();
|
209
|
+
if (['top', 'bottom'].includes(this.placement)) {
|
210
|
+
scrollIntoView(this.activeTab, this.nav, 'horizontal', options.scrollBehavior);
|
211
|
+
}
|
212
|
+
// Emit events
|
213
|
+
if (options.emitEvents) {
|
214
|
+
if (previousTab) {
|
215
|
+
this.emit('nile-tab-hide', { value: previousTab.panel });
|
216
|
+
}
|
217
|
+
this.emit('nile-tab-show', { value: this.activeTab.panel });
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
setAriaLabels() {
|
222
|
+
// Link each tab with its corresponding panel
|
223
|
+
this.tabs.forEach(tab => {
|
224
|
+
const panel = this.panels.find(el => el.name === tab.panel);
|
225
|
+
if (panel) {
|
226
|
+
tab.setAttribute('aria-controls', panel.getAttribute('id'));
|
227
|
+
panel.setAttribute('aria-labelledby', tab.getAttribute('id'));
|
228
|
+
}
|
229
|
+
});
|
230
|
+
}
|
231
|
+
repositionIndicator() {
|
232
|
+
const currentTab = this.getActiveTab();
|
233
|
+
if (!currentTab) {
|
234
|
+
return;
|
235
|
+
}
|
236
|
+
const width = currentTab.clientWidth;
|
237
|
+
const height = currentTab.clientHeight;
|
238
|
+
const isRtl = false;
|
239
|
+
// We can't used offsetLeft/offsetTop here due to a shadow parent issue where neither can getBoundingClientRect
|
240
|
+
// because it provides invalid values for animating elements: https://bugs.chromium.org/p/chromium/issues/detail?id=920069
|
241
|
+
const allTabs = this.getAllTabs();
|
242
|
+
const precedingTabs = allTabs.slice(0, allTabs.indexOf(currentTab));
|
243
|
+
const offset = precedingTabs.reduce((previous, current) => ({
|
244
|
+
left: previous.left + current.clientWidth + 24,
|
245
|
+
top: previous.top + current.clientHeight
|
246
|
+
}), { left: 0, top: 0 });
|
247
|
+
switch (this.placement) {
|
248
|
+
case 'top':
|
249
|
+
case 'bottom':
|
250
|
+
this.indicator.style.width = `${width}px`;
|
251
|
+
this.indicator.style.height = 'auto';
|
252
|
+
this.indicator.style.translate = `${offset.left}px`;
|
253
|
+
break;
|
254
|
+
case 'start':
|
255
|
+
case 'end':
|
256
|
+
this.indicator.style.width = 'auto';
|
257
|
+
this.indicator.style.height = `${height}px`;
|
258
|
+
this.indicator.style.translate = `0 ${offset.top}px`;
|
259
|
+
break;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
// This stores tabs and panels so we can refer to a cache instead of calling querySelectorAll() multiple times.
|
263
|
+
syncTabsAndPanels() {
|
264
|
+
this.tabs = this.getAllTabs({ includeDisabled: false });
|
265
|
+
this.panels = this.getAllPanels();
|
266
|
+
this.syncIndicator();
|
267
|
+
// After updating, show or hide scroll controls as needed
|
268
|
+
this.updateComplete.then(() => this.updateScrollControls());
|
269
|
+
}
|
270
|
+
updateScrollControls() {
|
271
|
+
if (this.noScrollControls) {
|
272
|
+
this.hasScrollControls = false;
|
273
|
+
}
|
274
|
+
else {
|
275
|
+
this.hasScrollControls =
|
276
|
+
['top', 'bottom'].includes(this.placement) && this.nav.scrollWidth > this.nav.clientWidth;
|
277
|
+
this.hasScrollControls = false;
|
278
|
+
}
|
279
|
+
}
|
280
|
+
syncIndicator() {
|
281
|
+
const tab = this.getActiveTab();
|
282
|
+
if (tab) {
|
283
|
+
this.indicator.style.display = 'block';
|
284
|
+
this.repositionIndicator();
|
285
|
+
}
|
286
|
+
else {
|
287
|
+
this.indicator.style.display = 'none';
|
288
|
+
}
|
289
|
+
}
|
290
|
+
/** Shows the specified tab panel. */
|
291
|
+
show(panel) {
|
292
|
+
const tab = this.tabs.find(el => el.panel === panel);
|
293
|
+
if (tab) {
|
294
|
+
this.setActiveTab(tab, { scrollBehavior: 'smooth' });
|
295
|
+
}
|
296
|
+
}
|
297
|
+
render() {
|
298
|
+
const isRtl = true;
|
299
|
+
return html `
|
300
|
+
<div
|
301
|
+
part="base"
|
302
|
+
class=${classMap({
|
303
|
+
'tab-group': true,
|
304
|
+
'tab-group--top': this.placement === 'top',
|
305
|
+
'tab-group--bottom': this.placement === 'bottom',
|
306
|
+
'tab-group--start': this.placement === 'start',
|
307
|
+
'tab-group--end': this.placement === 'end',
|
308
|
+
'tab-group--rtl': true,
|
309
|
+
'tab-group--has-scroll-controls': this.hasScrollControls
|
310
|
+
})}
|
311
|
+
@click=${this.handleClick}
|
312
|
+
@keydown=${this.handleKeyDown}
|
313
|
+
>
|
314
|
+
<div class="tab-group__nav-container" part="nav">
|
315
|
+
${this.hasScrollControls
|
316
|
+
? html `
|
317
|
+
<nile-icon-button
|
318
|
+
part="scroll-button scroll-button--start"
|
319
|
+
exportparts="base:scroll-button__base"
|
320
|
+
class="tab-group__scroll-button tab-group__scroll-button--start"
|
321
|
+
name='arrowright'
|
322
|
+
library="system"
|
323
|
+
label="scrollToStart"
|
324
|
+
@click=${this.handleScrollToStart}
|
325
|
+
></nile-icon-button>
|
326
|
+
`
|
327
|
+
: ''}
|
328
|
+
|
329
|
+
<div class="tab-group__nav">
|
330
|
+
<div part="tabs" class="tab-group__tabs" role="tablist">
|
331
|
+
<div part="active-tab-indicator" class="tab-group__indicator"></div>
|
332
|
+
<slot name="nav" @slotchange=${this.syncTabsAndPanels}></slot>
|
333
|
+
</div>
|
334
|
+
</div>
|
335
|
+
|
336
|
+
${this.hasScrollControls
|
337
|
+
? html `
|
338
|
+
<nile-icon-button
|
339
|
+
part="scroll-button scroll-button--end"
|
340
|
+
exportparts="base:scroll-button__base"
|
341
|
+
class="tab-group__scroll-button tab-group__scroll-button--end"
|
342
|
+
name='arrowleft'
|
343
|
+
library="system"
|
344
|
+
label="scrollToEnd"
|
345
|
+
@click=${this.handleScrollToEnd}
|
346
|
+
></nile-icon-button>
|
347
|
+
`
|
348
|
+
: ''}
|
349
|
+
</div>
|
350
|
+
|
351
|
+
<slot part="body" class="tab-group__body" @slotchange=${this.syncTabsAndPanels}></slot>
|
352
|
+
</div>
|
353
|
+
`;
|
354
|
+
}
|
355
|
+
};
|
356
|
+
NileTabGroup.styles = styles;
|
357
|
+
__decorate([
|
358
|
+
query('.tab-group')
|
359
|
+
], NileTabGroup.prototype, "tabGroup", void 0);
|
360
|
+
__decorate([
|
361
|
+
query('.tab-group__body')
|
362
|
+
], NileTabGroup.prototype, "body", void 0);
|
363
|
+
__decorate([
|
364
|
+
query('.tab-group__nav')
|
365
|
+
], NileTabGroup.prototype, "nav", void 0);
|
366
|
+
__decorate([
|
367
|
+
query('.tab-group__indicator')
|
368
|
+
], NileTabGroup.prototype, "indicator", void 0);
|
369
|
+
__decorate([
|
370
|
+
state()
|
371
|
+
], NileTabGroup.prototype, "hasScrollControls", void 0);
|
372
|
+
__decorate([
|
373
|
+
property()
|
374
|
+
], NileTabGroup.prototype, "placement", void 0);
|
375
|
+
__decorate([
|
376
|
+
property()
|
377
|
+
], NileTabGroup.prototype, "activation", void 0);
|
378
|
+
__decorate([
|
379
|
+
property({ attribute: 'no-scroll-controls', type: Boolean })
|
380
|
+
], NileTabGroup.prototype, "noScrollControls", void 0);
|
381
|
+
__decorate([
|
382
|
+
watch('noScrollControls', { waitUntilFirstUpdate: true })
|
383
|
+
], NileTabGroup.prototype, "updateScrollControls", null);
|
384
|
+
__decorate([
|
385
|
+
watch('placement', { waitUntilFirstUpdate: true })
|
386
|
+
], NileTabGroup.prototype, "syncIndicator", null);
|
387
|
+
NileTabGroup = __decorate([
|
388
|
+
customElement('nile-tab-group')
|
389
|
+
], NileTabGroup);
|
390
|
+
export { NileTabGroup };
|
391
|
+
export default NileTabGroup;
|
392
|
+
//# sourceMappingURL=nile-tab-group.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nile-tab-group.js","sourceRoot":"","sources":["../../../src/nile-tab-group/nile-tab-group.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {LitElement, html, property, CSSResultArray, TemplateResult} from 'lit-element';\nimport { customElement } from 'lit/decorators.js';\nimport {styles} from './nile-tab-group.css';\n\nimport '../nile-icon-button/nile-icon-button';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { query, state } from 'lit/decorators.js';\nimport { scrollIntoView } from '../internal/scroll';\nimport { watch } from '../internal/watch';\nimport NileElement from '../internal/nile-element';\nimport type { CSSResultGroup } from 'lit';\nimport type NileTab from '../nile-tab/nile-tab';\nimport type NileTabPanel from '../nile-tab-panel/nile-tab-panel';\n\n/**\n * Nile icon component.\n *\n * @tag nile-tab-group\n *\n * @slot - Used for grouping tab panels in the tab group. Must be `<nile-tab-panel>` elements.\n * @slot nav - Used for grouping tabs in the tab group. Must be `<nile-tab>` elements.\n *\n * @event {{ name: String }} nile-tab-show - Emitted when a tab is shown.\n * @event {{ name: String }} nile-tab-hide - Emitted when a tab is hidden.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The tab group's navigation container where tabs are slotted in.\n * @csspart tabs - The container that wraps the tabs.\n * @csspart active-tab-indicator - The line that highlights the currently selected tab.\n * @csspart body - The tab group's body where tab panels are slotted in.\n * @csspart scroll-button - The previous/next scroll buttons that show when tabs are scrollable, an `<nile-icon-button>`.\n * @csspart scroll-button--start - The starting scroll button.\n * @csspart scroll-button--end - The ending scroll button.\n * @csspart scroll-button__base - The scroll button's exported `base` part.\n *\n * @cssproperty --indicator-color - The color of the active tab indicator.\n * @cssproperty --track-color - The color of the indicator's track (the line that separates tabs from panels).\n * @cssproperty --track-width - The width of the indicator's track (the line that separates tabs from panels).\n *\n */\n@customElement('nile-tab-group')\nexport class NileTabGroup extends NileElement {\n\n\tstatic styles: CSSResultGroup = styles;\n\n private activeTab?: NileTab;\n private mutationObserver: MutationObserver;\n private resizeObserver: ResizeObserver;\n private tabs: NileTab[] = [];\n private panels: NileTabPanel[] = [];\n\n @query('.tab-group') tabGroup: HTMLElement;\n @query('.tab-group__body') body: HTMLSlotElement;\n @query('.tab-group__nav') nav: HTMLElement;\n @query('.tab-group__indicator') indicator: HTMLElement;\n\n @state() private hasScrollControls = false;\n\n /** The placement of the tabs. */\n @property() placement: 'top' | 'bottom' | 'start' | 'end' = 'top';\n\n /**\n * When set to auto, navigating tabs with the arrow keys will instantly show the corresponding tab panel. When set to\n * manual, the tab will receive focus but will not show until the user presses spacebar or enter.\n */\n @property() activation: 'auto' | 'manual' = 'auto';\n\n /** Disables the scroll arrows that appear when tabs overflow. */\n @property({ attribute: 'no-scroll-controls', type: Boolean }) noScrollControls = false;\n\n connectedCallback() {\n const whenAllDefined = Promise.allSettled([\n customElements.whenDefined('nile-tab'),\n customElements.whenDefined('nile-tab-panel')\n ]);\n\n super.connectedCallback();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.repositionIndicator();\n this.updateScrollControls();\n });\n\n this.mutationObserver = new MutationObserver(mutations => {\n // Update aria labels when the DOM changes\n if (mutations.some(m => !['aria-labelledby', 'aria-controls'].includes(m.attributeName!))) {\n setTimeout(() => this.setAriaLabels());\n }\n\n // Sync tabs when disabled states change\n if (mutations.some(m => m.attributeName === 'disabled')) {\n this.syncTabsAndPanels();\n }\n });\n\n // After the first update...\n this.updateComplete.then(() => {\n this.syncTabsAndPanels();\n this.mutationObserver.observe(this, { attributes: true, childList: true, subtree: true });\n this.resizeObserver.observe(this.nav);\n\n // Wait for tabs and tab panels to be registered\n whenAllDefined.then(() => {\n // Set initial tab state when the tabs become visible\n const intersectionObserver = new IntersectionObserver((entries, observer) => {\n if (entries[0].intersectionRatio > 0) {\n this.setAriaLabels();\n this.setActiveTab(this.getActiveTab() ?? this.tabs[0], { emitEvents: false });\n observer.unobserve(entries[0].target);\n }\n });\n intersectionObserver.observe(this.tabGroup);\n });\n });\n }\n\n disconnectedCallback() {\n this.mutationObserver.disconnect();\n this.resizeObserver.unobserve(this.nav);\n }\n\n private getAllTabs(options: { includeDisabled: boolean } = { includeDisabled: true }) {\n const slot = this.shadowRoot!.querySelector<HTMLSlotElement>('slot[name=\"nav\"]')!;\n\n return [...(slot.assignedElements() as NileTab[])].filter(el => {\n return options.includeDisabled\n ? el.tagName.toLowerCase() === 'nile-tab'\n : el.tagName.toLowerCase() === 'nile-tab' && !el.disabled;\n });\n }\n\n private getAllPanels() {\n return [...this.body.assignedElements()].filter(el => el.tagName.toLowerCase() === 'nile-tab-panel') as [NileTabPanel];\n }\n\n private getActiveTab() {\n return this.tabs.find(el => el.active);\n }\n\n private handleClick(event: MouseEvent) {\n const target = event.target as HTMLElement;\n const tab = target.closest('nile-tab');\n const tabGroup = tab?.closest('nile-tab-group');\n\n // Ensure the target tab is in this tab group\n if (tabGroup !== this) {\n return;\n }\n\n if (tab !== null) {\n this.setActiveTab(tab, { scrollBehavior: 'smooth' });\n }\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n const target = event.target as HTMLElement;\n const tab = target.closest('nile-tab');\n const tabGroup = tab?.closest('nile-tab-group');\n\n // Ensure the target tab is in this tab group\n if (tabGroup !== this) {\n return;\n }\n\n // Activate a tab\n if (['Enter', ' '].includes(event.key)) {\n if (tab !== null) {\n this.setActiveTab(tab, { scrollBehavior: 'smooth' });\n event.preventDefault();\n }\n }\n\n // Move focus left or right\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n const activeEl = this.tabs.find(t => t.matches(':focus'));\n const isRtl = false;\n\n if (activeEl?.tagName.toLowerCase() === 'nile-tab') {\n let index = this.tabs.indexOf(activeEl);\n\n if (event.key === 'Home') {\n index = 0;\n } else if (event.key === 'End') {\n index = this.tabs.length - 1;\n } else if (\n (['top', 'bottom'].includes(this.placement) && event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft')) ||\n (['start', 'end'].includes(this.placement) && event.key === 'ArrowUp')\n ) {\n index--;\n } else if (\n (['top', 'bottom'].includes(this.placement) && event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight')) ||\n (['start', 'end'].includes(this.placement) && event.key === 'ArrowDown')\n ) {\n index++;\n }\n\n if (index < 0) {\n index = this.tabs.length - 1;\n }\n\n if (index > this.tabs.length - 1) {\n index = 0;\n }\n\n this.tabs[index].focus({ preventScroll: true });\n\n if (this.activation === 'auto') {\n this.setActiveTab(this.tabs[index], { scrollBehavior: 'smooth' });\n }\n\n if (['top', 'bottom'].includes(this.placement)) {\n scrollIntoView(this.tabs[index], this.nav, 'horizontal');\n }\n\n event.preventDefault();\n }\n }\n }\n\n private handleScrollToStart() {\n this.nav.scroll({\n left:\n true\n ? this.nav.scrollLeft + this.nav.clientWidth\n : this.nav.scrollLeft - this.nav.clientWidth,\n behavior: 'smooth'\n });\n }\n\n private handleScrollToEnd() {\n this.nav.scroll({\n left:\n true\n ? this.nav.scrollLeft - this.nav.clientWidth\n : this.nav.scrollLeft + this.nav.clientWidth,\n behavior: 'smooth'\n });\n }\n\n private setActiveTab(tab: NileTab, options?: { emitEvents?: boolean; scrollBehavior?: 'auto' | 'smooth' }) {\n\n options = {\n emitEvents: true,\n scrollBehavior: 'auto',\n ...options\n };\n\n if (tab !== this.activeTab && !tab.disabled) {\n\n const previousTab = this.activeTab;\n this.activeTab = tab;\n\n\n // Sync active tab and panel\n this.tabs.map(el => (el.active = el === this.activeTab));\n this.panels.map(el => (el.active = el.name === this.activeTab?.panel));\n this.syncIndicator();\n\n if (['top', 'bottom'].includes(this.placement)) {\n scrollIntoView(this.activeTab, this.nav, 'horizontal', options.scrollBehavior);\n }\n\n // Emit events\n if (options.emitEvents) {\n if (previousTab) {\n this.emit('nile-tab-hide', { value: previousTab.panel });\n }\n\n this.emit('nile-tab-show', { value: this.activeTab.panel });\n }\n }\n }\n\n private setAriaLabels() {\n // Link each tab with its corresponding panel\n this.tabs.forEach(tab => {\n const panel = this.panels.find(el => el.name === tab.panel);\n if (panel) {\n tab.setAttribute('aria-controls', panel.getAttribute('id')!);\n panel.setAttribute('aria-labelledby', tab.getAttribute('id')!);\n }\n });\n }\n\n private repositionIndicator() {\n const currentTab = this.getActiveTab();\n\n if (!currentTab) {\n return;\n }\n\n const width = currentTab.clientWidth;\n const height = currentTab.clientHeight;\n const isRtl = false;\n\n // We can't used offsetLeft/offsetTop here due to a shadow parent issue where neither can getBoundingClientRect\n // because it provides invalid values for animating elements: https://bugs.chromium.org/p/chromium/issues/detail?id=920069\n const allTabs = this.getAllTabs();\n const precedingTabs = allTabs.slice(0, allTabs.indexOf(currentTab));\n const offset = precedingTabs.reduce(\n (previous, current) => ({\n left: previous.left + current.clientWidth + 24,\n top: previous.top + current.clientHeight\n }),\n { left: 0, top: 0 }\n );\n\n switch (this.placement) {\n case 'top':\n case 'bottom':\n this.indicator.style.width = `${width}px`;\n this.indicator.style.height = 'auto';\n this.indicator.style.translate = `${offset.left}px`;\n break;\n\n case 'start':\n case 'end':\n this.indicator.style.width = 'auto';\n this.indicator.style.height = `${height}px`;\n this.indicator.style.translate = `0 ${offset.top}px`;\n break;\n }\n }\n\n // This stores tabs and panels so we can refer to a cache instead of calling querySelectorAll() multiple times.\n private syncTabsAndPanels() {\n this.tabs = this.getAllTabs({ includeDisabled: false });\n this.panels = this.getAllPanels();\n this.syncIndicator();\n\n // After updating, show or hide scroll controls as needed\n this.updateComplete.then(() => this.updateScrollControls());\n }\n\n @watch('noScrollControls', { waitUntilFirstUpdate: true })\n updateScrollControls() {\n if (this.noScrollControls) {\n this.hasScrollControls = false;\n } else {\n this.hasScrollControls =\n ['top', 'bottom'].includes(this.placement) && this.nav.scrollWidth > this.nav.clientWidth;\n this.hasScrollControls = false;\n }\n }\n\n @watch('placement', { waitUntilFirstUpdate: true })\n syncIndicator() {\n const tab = this.getActiveTab();\n\n if (tab) {\n this.indicator.style.display = 'block';\n this.repositionIndicator();\n } else {\n this.indicator.style.display = 'none';\n }\n }\n\n /** Shows the specified tab panel. */\n show(panel: string) {\n const tab = this.tabs.find(el => el.panel === panel);\n\n if (tab) {\n this.setActiveTab(tab, { scrollBehavior: 'smooth' });\n }\n }\n\n render() {\n const isRtl = true;\n\n return html`\n <div\n part=\"base\"\n class=${classMap({\n 'tab-group': true,\n 'tab-group--top': this.placement === 'top',\n 'tab-group--bottom': this.placement === 'bottom',\n 'tab-group--start': this.placement === 'start',\n 'tab-group--end': this.placement === 'end',\n 'tab-group--rtl': true,\n 'tab-group--has-scroll-controls': this.hasScrollControls\n })}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n >\n <div class=\"tab-group__nav-container\" part=\"nav\">\n ${this.hasScrollControls\n ? html`\n <nile-icon-button\n part=\"scroll-button scroll-button--start\"\n exportparts=\"base:scroll-button__base\"\n class=\"tab-group__scroll-button tab-group__scroll-button--start\"\n name='arrowright'\n library=\"system\"\n label=\"scrollToStart\"\n @click=${this.handleScrollToStart}\n ></nile-icon-button>\n `\n : ''}\n\n <div class=\"tab-group__nav\">\n <div part=\"tabs\" class=\"tab-group__tabs\" role=\"tablist\">\n <div part=\"active-tab-indicator\" class=\"tab-group__indicator\"></div>\n <slot name=\"nav\" @slotchange=${this.syncTabsAndPanels}></slot>\n </div>\n </div>\n\n ${this.hasScrollControls\n ? html`\n <nile-icon-button\n part=\"scroll-button scroll-button--end\"\n exportparts=\"base:scroll-button__base\"\n class=\"tab-group__scroll-button tab-group__scroll-button--end\"\n name='arrowleft'\n library=\"system\"\n label=\"scrollToEnd\"\n @click=${this.handleScrollToEnd}\n ></nile-icon-button>\n `\n : ''}\n </div>\n\n <slot part=\"body\" class=\"tab-group__body\" @slotchange=${this.syncTabsAndPanels}></slot>\n </div>\n `;\n }\n}\n\nexport default NileTabGroup;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-tab-group': NileTabGroup;\n }\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { NileTabPanel } from './nile-tab-panel';
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nile-tab-panel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { NileTabPanel } from './nile-tab-panel';\n"]}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
/**
|
8
|
+
* TabPanel CSS
|
9
|
+
*/
|
10
|
+
export declare const styles: import("lit-element").CSSResult;
|
11
|
+
declare const _default: import("lit-element").CSSResult[];
|
12
|
+
export default _default;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
import { css } from 'lit-element';
|
8
|
+
/**
|
9
|
+
* TabPanel CSS
|
10
|
+
*/
|
11
|
+
export const styles = css `
|
12
|
+
[hidden] {
|
13
|
+
display: none !important;
|
14
|
+
}
|
15
|
+
|
16
|
+
:host {
|
17
|
+
--padding: 0;
|
18
|
+
|
19
|
+
display: none;
|
20
|
+
}
|
21
|
+
|
22
|
+
:host([active]) {
|
23
|
+
display: block;
|
24
|
+
}
|
25
|
+
|
26
|
+
.tab-panel {
|
27
|
+
display: block;
|
28
|
+
padding: var(--padding);
|
29
|
+
}
|
30
|
+
`;
|
31
|
+
export default [styles];
|
32
|
+
//# sourceMappingURL=nile-tab-panel.css.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nile-tab-panel.css.js","sourceRoot":"","sources":["../../../src/nile-tab-panel/nile-tab-panel.css.ts"],"names":[],"mappings":"AAAA;;;;;EAKE;AAEF,OAAO,EAAC,GAAG,EAAC,MAAM,aAAa,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["/**\n* Copyright Aquera Inc 2023\n*\n* This source code is licensed under the BSD-3-Clause license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport {css} from 'lit-element';\n\n/**\n * TabPanel CSS\n */\nexport const styles = css`\n [hidden] {\n display: none !important;\n }\n\n :host {\n --padding: 0;\n\n display: none;\n }\n\n :host([active]) {\n display: block;\n }\n\n .tab-panel {\n display: block;\n padding: var(--padding);\n }\n`;\n\nexport default [styles];\n"]}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
import { TemplateResult } from 'lit-element';
|
8
|
+
import NileElement from '../internal/nile-element';
|
9
|
+
import type { CSSResultGroup } from 'lit';
|
10
|
+
/**
|
11
|
+
* Nile icon component.
|
12
|
+
*
|
13
|
+
* @tag nile-tab-panel
|
14
|
+
*
|
15
|
+
* @slot - The tab panel's content.
|
16
|
+
*
|
17
|
+
* @csspart base - The component's base wrapper.
|
18
|
+
*
|
19
|
+
* @cssproperty --padding - The tab panel's padding.
|
20
|
+
*/
|
21
|
+
export declare class NileTabPanel extends NileElement {
|
22
|
+
static styles: CSSResultGroup;
|
23
|
+
private readonly attrId;
|
24
|
+
private readonly componentId;
|
25
|
+
/** The tab panel's name. */
|
26
|
+
name: string;
|
27
|
+
/** When true, the tab panel will be shown. */
|
28
|
+
active: boolean;
|
29
|
+
connectedCallback(): void;
|
30
|
+
handleActiveChange(): void;
|
31
|
+
render(): TemplateResult<1>;
|
32
|
+
}
|
33
|
+
export default NileTabPanel;
|
34
|
+
declare global {
|
35
|
+
interface HTMLElementTagNameMap {
|
36
|
+
'nile-tab-panel': NileTabPanel;
|
37
|
+
}
|
38
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
import { __decorate } from "tslib";
|
8
|
+
import { html, property } from 'lit-element';
|
9
|
+
import { customElement } from 'lit/decorators.js';
|
10
|
+
import { styles } from './nile-tab-panel.css';
|
11
|
+
import { classMap } from 'lit/directives/class-map.js';
|
12
|
+
import { watch } from '../internal/watch';
|
13
|
+
import NileElement from '../internal/nile-element';
|
14
|
+
let id = 0;
|
15
|
+
/**
|
16
|
+
* Nile icon component.
|
17
|
+
*
|
18
|
+
* @tag nile-tab-panel
|
19
|
+
*
|
20
|
+
* @slot - The tab panel's content.
|
21
|
+
*
|
22
|
+
* @csspart base - The component's base wrapper.
|
23
|
+
*
|
24
|
+
* @cssproperty --padding - The tab panel's padding.
|
25
|
+
*/
|
26
|
+
let NileTabPanel = class NileTabPanel extends NileElement {
|
27
|
+
constructor() {
|
28
|
+
super(...arguments);
|
29
|
+
this.attrId = ++id;
|
30
|
+
this.componentId = `nile-tab-panel-${this.attrId}`;
|
31
|
+
/** The tab panel's name. */
|
32
|
+
this.name = '';
|
33
|
+
/** When true, the tab panel will be shown. */
|
34
|
+
this.active = false;
|
35
|
+
}
|
36
|
+
connectedCallback() {
|
37
|
+
super.connectedCallback();
|
38
|
+
this.id = this.id.length > 0 ? this.id : this.componentId;
|
39
|
+
this.setAttribute('role', 'tabpanel');
|
40
|
+
}
|
41
|
+
handleActiveChange() {
|
42
|
+
this.setAttribute('aria-hidden', this.active ? 'false' : 'true');
|
43
|
+
}
|
44
|
+
render() {
|
45
|
+
return html `
|
46
|
+
<slot
|
47
|
+
part="base"
|
48
|
+
class=${classMap({
|
49
|
+
'tab-panel': true,
|
50
|
+
'tab-panel--active': this.active
|
51
|
+
})}
|
52
|
+
></slot>
|
53
|
+
`;
|
54
|
+
}
|
55
|
+
};
|
56
|
+
NileTabPanel.styles = styles;
|
57
|
+
__decorate([
|
58
|
+
property({ reflect: true })
|
59
|
+
], NileTabPanel.prototype, "name", void 0);
|
60
|
+
__decorate([
|
61
|
+
property({ type: Boolean, reflect: true })
|
62
|
+
], NileTabPanel.prototype, "active", void 0);
|
63
|
+
__decorate([
|
64
|
+
watch('active')
|
65
|
+
], NileTabPanel.prototype, "handleActiveChange", null);
|
66
|
+
NileTabPanel = __decorate([
|
67
|
+
customElement('nile-tab-panel')
|
68
|
+
], NileTabPanel);
|
69
|
+
export { NileTabPanel };
|
70
|
+
export default NileTabPanel;
|
71
|
+
//# sourceMappingURL=nile-tab-panel.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nile-tab-panel.js","sourceRoot":"","sources":["../../../src/nile-tab-panel/nile-tab-panel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAEH,OAAO,EAAa,IAAI,EAAE,QAAQ,EAAiC,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAGnD,IAAI,EAAE,GAAG,CAAC,CAAC;AAEX;;;;;;;;;;GAUG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,WAAW;IAAtC;;QAIY,WAAM,GAAG,EAAE,EAAE,CAAC;QACd,gBAAW,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/D,4BAA4B;QACC,SAAI,GAAG,EAAE,CAAC;QAEvC,8CAA8C;QACF,WAAM,GAAG,KAAK,CAAC;IAwB7D,CAAC;IAtBC,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAGD,kBAAkB;QAChB,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;gBAGC,QAAQ,CAAC;YACf,WAAW,EAAE,IAAI;YACjB,mBAAmB,EAAE,IAAI,CAAC,MAAM;SACjC,CAAC;;KAEL,CAAC;IACJ,CAAC;;AAhCM,mBAAM,GAAmB,MAAM,CAAC;AAMV;IAA5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;0CAAW;AAGK;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;4CAAgB;AAS3D;IADC,KAAK,CAAC,QAAQ,CAAC;sDAGf;AAtBU,YAAY;IADxB,aAAa,CAAC,gBAAgB,CAAC;GACnB,YAAY,CAmCxB;SAnCY,YAAY;AAqCzB,eAAe,YAAY,CAAC","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {LitElement, html, property, CSSResultArray, TemplateResult} from 'lit-element';\nimport { customElement } from 'lit/decorators.js';\nimport {styles} from './nile-tab-panel.css';\n\nimport { classMap } from 'lit/directives/class-map.js';\nimport { watch } from '../internal/watch';\nimport NileElement from '../internal/nile-element';\nimport type { CSSResultGroup } from 'lit';\n\nlet id = 0;\n\n/**\n * Nile icon component.\n *\n * @tag nile-tab-panel\n *\n * @slot - The tab panel's content.\n *\n * @csspart base - The component's base wrapper.\n *\n * @cssproperty --padding - The tab panel's padding.\n */\n@customElement('nile-tab-panel')\nexport class NileTabPanel extends NileElement {\n\n static styles: CSSResultGroup = styles;\n\n private readonly attrId = ++id;\n private readonly componentId = `nile-tab-panel-${this.attrId}`;\n\n /** The tab panel's name. */\n @property({ reflect: true }) name = '';\n\n /** When true, the tab panel will be shown. */\n @property({ type: Boolean, reflect: true }) active = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.id = this.id.length > 0 ? this.id : this.componentId;\n this.setAttribute('role', 'tabpanel');\n }\n\n @watch('active')\n handleActiveChange() {\n this.setAttribute('aria-hidden', this.active ? 'false' : 'true');\n }\n\n render() {\n return html`\n <slot\n part=\"base\"\n class=${classMap({\n 'tab-panel': true,\n 'tab-panel--active': this.active\n })}\n ></slot>\n `;\n }\n}\n\nexport default NileTabPanel;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-tab-panel': NileTabPanel;\n }\n}\n"]}
|