@fluid-topics/ftds-tabs 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/build/define.d.ts +1 -0
- package/build/define.js +3 -0
- package/build/definitions.d.ts +7 -0
- package/build/definitions.js +6 -0
- package/build/ftds-tab.d.ts +21 -0
- package/build/ftds-tab.js +67 -0
- package/build/ftds-tab.properties.d.ts +11 -0
- package/build/ftds-tab.properties.js +1 -0
- package/build/ftds-tab.styles.d.ts +1 -0
- package/build/ftds-tab.styles.js +1 -0
- package/build/ftds-tabs.d.ts +33 -0
- package/build/ftds-tabs.js +205 -0
- package/build/ftds-tabs.light.js +1154 -0
- package/build/ftds-tabs.min.js +1275 -0
- package/build/ftds-tabs.properties.d.ts +18 -0
- package/build/ftds-tabs.properties.js +15 -0
- package/build/ftds-tabs.styles.d.ts +2 -0
- package/build/ftds-tabs.styles.js +182 -0
- package/build/index.d.ts +7 -0
- package/build/index.js +7 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
The design system tabs component
|
|
2
|
+
|
|
3
|
+
## Install
|
|
4
|
+
|
|
5
|
+
```shell
|
|
6
|
+
npm install @fluid-topics/ftds-tabs
|
|
7
|
+
yarn add @fluid-topics/ftds-tabs
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { html } from "lit"
|
|
14
|
+
import "@fluid-topics/ftds-tabs"
|
|
15
|
+
|
|
16
|
+
function render() {
|
|
17
|
+
return html` <ftds-tabs foo="bar"></ftds-tabs> `
|
|
18
|
+
}
|
|
19
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/build/define.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ElementDefinitionsMap, FtLitElement } from "@fluid-topics/ft-wc-utils";
|
|
2
|
+
import { PropertyValues } from "lit";
|
|
3
|
+
import { FtdsTabProperties } from "./ftds-tab.properties";
|
|
4
|
+
import { FtdsIconVariants } from "@fluid-topics/ftds-icon/build/ftds-icon.properties";
|
|
5
|
+
import { FtdsIcons } from "@fluid-topics/ftds-icon";
|
|
6
|
+
export declare class FtdsTab extends FtLitElement implements FtdsTabProperties {
|
|
7
|
+
static elementDefinitions: ElementDefinitionsMap;
|
|
8
|
+
label: string;
|
|
9
|
+
icon?: FtdsIcons;
|
|
10
|
+
iconVariant?: FtdsIconVariants;
|
|
11
|
+
active: boolean;
|
|
12
|
+
disabled: boolean;
|
|
13
|
+
private readonly uniqueId;
|
|
14
|
+
id: string;
|
|
15
|
+
color?: string;
|
|
16
|
+
rippleColor?: string;
|
|
17
|
+
ariaLabelledBy?: string;
|
|
18
|
+
protected render(): unknown;
|
|
19
|
+
protected update(props: PropertyValues): void;
|
|
20
|
+
protected updated(props: PropertyValues): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { FtLitElement, randomId, } from "@fluid-topics/ft-wc-utils";
|
|
8
|
+
import { html, unsafeCSS, } from "lit";
|
|
9
|
+
import { property } from "lit/decorators.js";
|
|
10
|
+
export class FtdsTab extends FtLitElement {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.label = "";
|
|
14
|
+
this.active = false;
|
|
15
|
+
this.disabled = false;
|
|
16
|
+
this.uniqueId = randomId(5, "tab-");
|
|
17
|
+
}
|
|
18
|
+
render() {
|
|
19
|
+
return html `
|
|
20
|
+
<style>
|
|
21
|
+
:host {
|
|
22
|
+
display: ${unsafeCSS(this.active ? "block" : "none")};
|
|
23
|
+
}
|
|
24
|
+
</style>
|
|
25
|
+
<slot></slot>
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
28
|
+
update(props) {
|
|
29
|
+
super.update(props);
|
|
30
|
+
if (!this.id) {
|
|
31
|
+
this.id = this.uniqueId;
|
|
32
|
+
}
|
|
33
|
+
this.ariaLabelledBy = this.id + "-control";
|
|
34
|
+
}
|
|
35
|
+
updated(props) {
|
|
36
|
+
super.updated(props);
|
|
37
|
+
this.dispatchEvent(new Event("updated"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
FtdsTab.elementDefinitions = {};
|
|
41
|
+
__decorate([
|
|
42
|
+
property({ type: String })
|
|
43
|
+
], FtdsTab.prototype, "label", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
property({ type: String })
|
|
46
|
+
], FtdsTab.prototype, "icon", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
property({ type: String })
|
|
49
|
+
], FtdsTab.prototype, "iconVariant", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
property({ type: Boolean, reflect: true })
|
|
52
|
+
], FtdsTab.prototype, "active", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
property({ type: Boolean })
|
|
55
|
+
], FtdsTab.prototype, "disabled", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
property({ reflect: true })
|
|
58
|
+
], FtdsTab.prototype, "id", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
property()
|
|
61
|
+
], FtdsTab.prototype, "color", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
property()
|
|
64
|
+
], FtdsTab.prototype, "rippleColor", void 0);
|
|
65
|
+
__decorate([
|
|
66
|
+
property({ reflect: true, attribute: "aria-labelledby" })
|
|
67
|
+
], FtdsTab.prototype, "ariaLabelledBy", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FtdsIconVariants } from "@fluid-topics/ftds-icon/build/ftds-icon.properties";
|
|
2
|
+
import { FtdsIcons } from "@fluid-topics/ftds-icon";
|
|
3
|
+
export interface FtdsTabProperties {
|
|
4
|
+
label?: string;
|
|
5
|
+
icon?: FtdsIcons;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
color?: string;
|
|
8
|
+
rippleColor?: string;
|
|
9
|
+
iconVariant?: FtdsIconVariants;
|
|
10
|
+
horizontal?: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FtdsTabCssVariables: {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const FtdsTabCssVariables = {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ClassInfo } from "lit/directives/class-map.js";
|
|
2
|
+
import { ElementDefinitionsMap, FtLitElement, Optional } from "@fluid-topics/ft-wc-utils";
|
|
3
|
+
import { PropertyValues, TemplateResult } from "lit";
|
|
4
|
+
import { FtdsTabsAlignment, FtdsTabsProperties, FtdsTabsStructure } from "./ftds-tabs.properties";
|
|
5
|
+
import { FtdsTab } from "./ftds-tab";
|
|
6
|
+
export declare class IndexChangeEvent extends CustomEvent<Optional<number>> {
|
|
7
|
+
constructor(index: Optional<number>);
|
|
8
|
+
}
|
|
9
|
+
export declare class FtdsTabs extends FtLitElement implements FtdsTabsProperties {
|
|
10
|
+
static elementDefinitions: ElementDefinitionsMap;
|
|
11
|
+
alignTabs: FtdsTabsAlignment;
|
|
12
|
+
private ftdsTabs;
|
|
13
|
+
private tabsContainer?;
|
|
14
|
+
private activeTab?;
|
|
15
|
+
private activeTabIndicator?;
|
|
16
|
+
horizontal: boolean;
|
|
17
|
+
activeIndex?: number;
|
|
18
|
+
structure: FtdsTabsStructure;
|
|
19
|
+
static styles: import("lit").CSSResult[];
|
|
20
|
+
get tabsClasses(): ClassInfo;
|
|
21
|
+
protected render(): TemplateResult<1>;
|
|
22
|
+
private updateDebouncer;
|
|
23
|
+
private onTabUpdated;
|
|
24
|
+
private onContentChange;
|
|
25
|
+
protected update(props: PropertyValues): void;
|
|
26
|
+
private resizeObserver;
|
|
27
|
+
protected contentAvailableCallback(props: PropertyValues): void;
|
|
28
|
+
private placeIndicator;
|
|
29
|
+
protected placeActiveTabIndicator(activeTabIndicator?: HTMLDivElement, activeTab?: HTMLButtonElement): void;
|
|
30
|
+
protected toggleTab(index: number): void;
|
|
31
|
+
private updateTabs;
|
|
32
|
+
protected addTooltipIfNecessary(tab: FtdsTab, button: TemplateResult): TemplateResult;
|
|
33
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { classMap, } from "lit/directives/class-map.js";
|
|
8
|
+
import { Debouncer, FtLitElement, numberProperty, PostResizeEvent, PreResizeEvent, safariEllipsisFix, } from "@fluid-topics/ft-wc-utils";
|
|
9
|
+
import { designSystemStyles } from "./ftds-tabs.styles";
|
|
10
|
+
import { property, query, state, } from "lit/decorators.js";
|
|
11
|
+
import { FtdsTypography, FtdsTypographyVariants, } from "@fluid-topics/ftds-typography";
|
|
12
|
+
import { html, } from "lit";
|
|
13
|
+
import { when } from "lit/directives/when.js";
|
|
14
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
15
|
+
import { FtRipple, FtRippleCssVariables, } from "@fluid-topics/ft-ripple";
|
|
16
|
+
import { FtdsIcon } from "@fluid-topics/ftds-icon";
|
|
17
|
+
import { FtTooltip } from "@fluid-topics/ft-tooltip";
|
|
18
|
+
import { FtdsTabsAlignment, FtdsTabsStructure, } from "./ftds-tabs.properties";
|
|
19
|
+
export class IndexChangeEvent extends CustomEvent {
|
|
20
|
+
constructor(index) {
|
|
21
|
+
super("index-change", { detail: index });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class FtdsTabs extends FtLitElement {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this.alignTabs = FtdsTabsAlignment.justify;
|
|
28
|
+
this.ftdsTabs = [];
|
|
29
|
+
this.horizontal = false;
|
|
30
|
+
this.activeIndex = 0;
|
|
31
|
+
this.structure = FtdsTabsStructure.sideIcon;
|
|
32
|
+
this.updateDebouncer = new Debouncer(2);
|
|
33
|
+
this.onTabUpdated = () => this.updateDebouncer.run(() => {
|
|
34
|
+
this.requestUpdate();
|
|
35
|
+
this.dispatchEvent(new PostResizeEvent());
|
|
36
|
+
});
|
|
37
|
+
this.resizeObserver = new ResizeObserver(() => this.placeIndicator());
|
|
38
|
+
}
|
|
39
|
+
get tabsClasses() {
|
|
40
|
+
return {
|
|
41
|
+
"ftds-tabs": true,
|
|
42
|
+
["ftds-tabs--align-" + this.alignTabs]: true,
|
|
43
|
+
"ftds-tabs--horizontal": this.horizontal,
|
|
44
|
+
"ftds-tabs--side-icon": this.structure == FtdsTabsStructure.sideIcon,
|
|
45
|
+
"ftds-tabs--icon-only": this.structure == FtdsTabsStructure.iconOnly,
|
|
46
|
+
"ftds-tabs--label-only": this.structure == FtdsTabsStructure.labelOnly,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
render() {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
const activeTabColor = (_b = this.ftdsTabs[(_a = this.activeIndex) !== null && _a !== void 0 ? _a : 0]) === null || _b === void 0 ? void 0 : _b.color;
|
|
52
|
+
return html `
|
|
53
|
+
<div class="${classMap(this.tabsClasses)}" part="container">
|
|
54
|
+
<div role="tablist" part="tablist">
|
|
55
|
+
${repeat(this.ftdsTabs, (tab, index) => this.addTooltipIfNecessary(tab, html `
|
|
56
|
+
<button class="${classMap({
|
|
57
|
+
"ftds-tabs--tab-with-icon": !!tab.icon,
|
|
58
|
+
"ftds-tabs--tab-with-label": !!tab.label,
|
|
59
|
+
})}"
|
|
60
|
+
?disabled=${tab.disabled}
|
|
61
|
+
@click=${() => this.toggleTab(index)}
|
|
62
|
+
role="tab"
|
|
63
|
+
part="tab tab-${tab.id}${tab.active ? " active-tab" : ""}"
|
|
64
|
+
id="${tab.ariaLabelledBy}"
|
|
65
|
+
aria-label="${tab.label}"
|
|
66
|
+
aria-selected="${tab.active ? "true" : "false"}"
|
|
67
|
+
tabindex="${tab.disabled ? "-1" : "0"}"
|
|
68
|
+
aria-controls="${tab.id}"
|
|
69
|
+
style="${tab.color ? `color: ${tab.color} !important;` : ""}">
|
|
70
|
+
<ft-ripple primary
|
|
71
|
+
?disabled=${tab.disabled}
|
|
72
|
+
part="tab-ripple${tab.active ? " active-tab-ripple" : ""}"
|
|
73
|
+
style="${(tab.color || tab.rippleColor)
|
|
74
|
+
? FtRippleCssVariables.color.set(tab.color || tab.rippleColor)
|
|
75
|
+
: ""}"></ft-ripple>
|
|
76
|
+
${when(tab.icon, () => html `
|
|
77
|
+
<ftds-icon class="ftds-tabs--tab-icon"
|
|
78
|
+
part="tab-icon${tab.active ? " active-tab-icon" : ""}"
|
|
79
|
+
icon="${tab.icon}"
|
|
80
|
+
.variant=${tab.iconVariant}>
|
|
81
|
+
</ftds-icon>
|
|
82
|
+
`)}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
<ftds-typography class="ftds-tabs--tab-label"
|
|
86
|
+
part="tab-label${tab.active ? " active-tab-label" : ""}"
|
|
87
|
+
variant="${FtdsTypographyVariants.body2medium}">
|
|
88
|
+
${tab.label}
|
|
89
|
+
</ftds-typography>
|
|
90
|
+
</button>
|
|
91
|
+
`))}
|
|
92
|
+
<div class="ftds-tabs--active-tab-indicator"
|
|
93
|
+
part="active-tab-indicator"
|
|
94
|
+
style="${activeTabColor ? `background-color: ${activeTabColor} !important;` : ""}">
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="ftds-tabs--content" part="content">
|
|
98
|
+
<slot @slotchange=${this.onContentChange}></slot>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
onContentChange(e) {
|
|
104
|
+
const slot = e.composedPath()[0];
|
|
105
|
+
this.ftdsTabs = slot.assignedElements().map((n) => n);
|
|
106
|
+
this.ftdsTabs.forEach((tab) => {
|
|
107
|
+
tab.removeEventListener("updated", this.onTabUpdated);
|
|
108
|
+
tab.addEventListener("updated", this.onTabUpdated);
|
|
109
|
+
});
|
|
110
|
+
this.updateTabs();
|
|
111
|
+
}
|
|
112
|
+
update(props) {
|
|
113
|
+
super.update(props);
|
|
114
|
+
if (props.has("activeIndex")) {
|
|
115
|
+
this.dispatchEvent(new PreResizeEvent());
|
|
116
|
+
}
|
|
117
|
+
if (props.has("ftdsTabs") || props.has("activeIndex")) {
|
|
118
|
+
this.updateTabs();
|
|
119
|
+
}
|
|
120
|
+
if (props.has("activeIndex")) {
|
|
121
|
+
this.dispatchEvent(new IndexChangeEvent(this.activeIndex));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
contentAvailableCallback(props) {
|
|
125
|
+
super.contentAvailableCallback(props);
|
|
126
|
+
if (this.tabsContainer) {
|
|
127
|
+
this.resizeObserver.observe(this.tabsContainer);
|
|
128
|
+
}
|
|
129
|
+
this.placeIndicator();
|
|
130
|
+
}
|
|
131
|
+
placeIndicator() {
|
|
132
|
+
this.placeActiveTabIndicator(this.activeTabIndicator, this.activeTab);
|
|
133
|
+
}
|
|
134
|
+
placeActiveTabIndicator(activeTabIndicator, activeTab) {
|
|
135
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
136
|
+
if (activeTabIndicator) {
|
|
137
|
+
const target = (_a = activeTab === null || activeTab === void 0 ? void 0 : activeTab.closest(".ftds-tabs--tab-tooltip")) !== null && _a !== void 0 ? _a : activeTab;
|
|
138
|
+
if (target) {
|
|
139
|
+
const targetHeight = (_c = (_b = target === null || target === void 0 ? void 0 : target.getBoundingClientRect()) === null || _b === void 0 ? void 0 : _b.height) !== null && _c !== void 0 ? _c : 0;
|
|
140
|
+
const targetWidth = (_e = (_d = target === null || target === void 0 ? void 0 : target.getBoundingClientRect()) === null || _d === void 0 ? void 0 : _d.width) !== null && _e !== void 0 ? _e : 0;
|
|
141
|
+
if (this.horizontal) {
|
|
142
|
+
activeTabIndicator.style.height = targetHeight + "px";
|
|
143
|
+
activeTabIndicator.style.width = "3px";
|
|
144
|
+
activeTabIndicator.style.left = ((_f = target === null || target === void 0 ? void 0 : target.offsetLeft) !== null && _f !== void 0 ? _f : 0) + targetWidth - 3 + "px";
|
|
145
|
+
activeTabIndicator.style.top = ((_g = target === null || target === void 0 ? void 0 : target.offsetTop) !== null && _g !== void 0 ? _g : 0) + "px";
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
activeTabIndicator.style.height = "3px";
|
|
149
|
+
activeTabIndicator.style.width = targetWidth + "px";
|
|
150
|
+
activeTabIndicator.style.left = ((_h = target === null || target === void 0 ? void 0 : target.offsetLeft) !== null && _h !== void 0 ? _h : 0) + "px";
|
|
151
|
+
activeTabIndicator.style.top = (((_j = target === null || target === void 0 ? void 0 : target.offsetTop) !== null && _j !== void 0 ? _j : 0) + targetHeight - 3) + "px";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
activeTabIndicator.style.height = "0px";
|
|
156
|
+
activeTabIndicator.style.width = "0px";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
toggleTab(index) {
|
|
161
|
+
this.activeIndex = index;
|
|
162
|
+
}
|
|
163
|
+
updateTabs() {
|
|
164
|
+
this.ftdsTabs.forEach((tab, index) => {
|
|
165
|
+
tab.active = index == this.activeIndex;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
addTooltipIfNecessary(tab, button) {
|
|
169
|
+
return button;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
FtdsTabs.elementDefinitions = {
|
|
173
|
+
"ft-ripple": FtRipple,
|
|
174
|
+
"ft-tooltip": FtTooltip,
|
|
175
|
+
"ftds-icon": FtdsIcon,
|
|
176
|
+
"ftds-typography": FtdsTypography,
|
|
177
|
+
};
|
|
178
|
+
FtdsTabs.styles = [
|
|
179
|
+
safariEllipsisFix,
|
|
180
|
+
designSystemStyles,
|
|
181
|
+
];
|
|
182
|
+
__decorate([
|
|
183
|
+
property()
|
|
184
|
+
], FtdsTabs.prototype, "alignTabs", void 0);
|
|
185
|
+
__decorate([
|
|
186
|
+
state()
|
|
187
|
+
], FtdsTabs.prototype, "ftdsTabs", void 0);
|
|
188
|
+
__decorate([
|
|
189
|
+
query("[role='tablist']")
|
|
190
|
+
], FtdsTabs.prototype, "tabsContainer", void 0);
|
|
191
|
+
__decorate([
|
|
192
|
+
query("[aria-selected='true']")
|
|
193
|
+
], FtdsTabs.prototype, "activeTab", void 0);
|
|
194
|
+
__decorate([
|
|
195
|
+
query(".ftds-tabs--active-tab-indicator")
|
|
196
|
+
], FtdsTabs.prototype, "activeTabIndicator", void 0);
|
|
197
|
+
__decorate([
|
|
198
|
+
property({ type: Boolean })
|
|
199
|
+
], FtdsTabs.prototype, "horizontal", void 0);
|
|
200
|
+
__decorate([
|
|
201
|
+
numberProperty({ reflect: true })
|
|
202
|
+
], FtdsTabs.prototype, "activeIndex", void 0);
|
|
203
|
+
__decorate([
|
|
204
|
+
property()
|
|
205
|
+
], FtdsTabs.prototype, "structure", void 0);
|