@nuralyui/tabs 0.0.18 → 0.0.20
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/bundle.js +1753 -8
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/react.js.map +1 -1
- package/tabs.component.d.ts +35 -6
- package/tabs.component.js +170 -6
- package/tabs.component.js.map +1 -1
- package/tabs.constant.js.map +1 -1
- package/tabs.style.js +365 -120
- package/tabs.style.js.map +1 -1
- package/tabs.types.d.ts +102 -2
- package/tabs.types.js.map +1 -1
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/tabs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAEhC,qEAAqE;AACrE,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './tabs.component.js';\nexport * from './tabs.types.js';\n\n// For backward compatibility - will be removed in next major version\nexport { NrTabsElement as TabsComponent } from './tabs.component.js';\n"]}
|
package/package.json
CHANGED
package/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../../src/components/tabs/react.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,eAAe,CAAC;IACpC,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,aAAa;IAC3B,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE;QACN,YAAY,EAAE,cAAc;QAC5B,aAAa,EAAE,eAAe;QAC9B,UAAU,EAAE,YAAY;QACxB,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,aAAa;QAC1B,kBAAkB,EAAE,qBAAqB;KAC1C;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { createComponent } from '@lit-labs/react';\nimport * as React from 'react';\nimport { NrTabsElement } from './tabs.component.js';\n\n/**\n * React wrapper for the nr-tabs component.\n * \n * @example\n * ```jsx\n * import { NrTabs } from '@nuralyui/tabs/react';\n * \n * const tabs = [\n * { label: 'Tab 1', content: <div>Content 1</div> },\n * { label: 'Tab 2', content: <div>Content 2</div> }\n * ];\n * \n * function MyComponent() {\n * return (\n * <NrTabs \n * tabs={tabs}\n * activeTab={0}\n * orientation=\"horizontal\"\n * onNrTabClick={(e) => console.log('Tab clicked:', e.detail)}\n * />\n * );\n * }\n * ```\n */\nexport const NrTabs = createComponent({\n tagName: 'nr-tabs',\n elementClass: NrTabsElement,\n react: React,\n events: {\n onNrTabClick: 'nr-tab-click',\n onNrTabChange: 'nr-tab-change',\n onNrTabAdd: 'nr-tab-add',\n onNrTabRemove: 'nr-tab-remove',\n onNrTabEdit: 'nr-tab-edit',\n onNrTabOrderChange: 'nr-tab-order-change',\n },\n});\n\n/**\n * @deprecated Use NrTabs instead. Will be removed in next major version.\n */\nexport const HyTabsComponent = NrTabs;\n"]}
|
package/tabs.component.d.ts
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { LitElement, PropertyValueMap } from 'lit';
|
|
7
|
-
import { TabOrientation, TabsAlign, TabSize, TabType, TabEditable, TabItem } from './tabs.types.js';
|
|
8
|
-
import
|
|
7
|
+
import { TabOrientation, TabsAlign, TabSize, TabType, TabEditable, TabsPanelConfig, TabPopOutConfig, TabItem } from './tabs.types.js';
|
|
8
|
+
import '../panel/index.js';
|
|
9
|
+
import { type TabsKeyboardHost, type TabsDragDropHost, type TabsEditableHost, type TabsEventHost, type TabsPopOutHost } from './controllers/index.js';
|
|
9
10
|
declare const NrTabsElement_base: (new (...args: any[]) => import("@nuralyui/common/mixins").DependencyAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").ThemeAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").EventHandlerCapable) & typeof LitElement;
|
|
10
11
|
/**
|
|
11
|
-
* Versatile tabs component with support for multiple orientations, editable tabs,
|
|
12
|
+
* Versatile tabs component with support for multiple orientations, editable tabs, drag & drop, and optional panel wrapper.
|
|
12
13
|
*
|
|
13
14
|
* @example
|
|
14
15
|
* ```html
|
|
@@ -20,6 +21,12 @@ declare const NrTabsElement_base: (new (...args: any[]) => import("@nuralyui/com
|
|
|
20
21
|
*
|
|
21
22
|
* <!-- Vertical orientation -->
|
|
22
23
|
* <nr-tabs .tabs=${tabs} orientation="vertical" align="left"></nr-tabs>
|
|
24
|
+
*
|
|
25
|
+
* <!-- Stretch tabs to fill full width with equal sizes -->
|
|
26
|
+
* <nr-tabs .tabs=${tabs} align="stretch"></nr-tabs>
|
|
27
|
+
*
|
|
28
|
+
* <!-- Pannable tabs (disabled by default) -->
|
|
29
|
+
* <nr-tabs .tabs=${tabs} .panelConfig=${{enabled: true, resizable: true, title: "My Tabs"}}></nr-tabs>
|
|
23
30
|
* ```
|
|
24
31
|
*
|
|
25
32
|
* @fires nr-tab-click - Tab clicked
|
|
@@ -28,16 +35,19 @@ declare const NrTabsElement_base: (new (...args: any[]) => import("@nuralyui/com
|
|
|
28
35
|
* @fires nr-tab-remove - Tab removal requested
|
|
29
36
|
* @fires nr-tab-edit - Tab edited
|
|
30
37
|
* @fires nr-tab-order-change - Tab order changed via drag & drop
|
|
38
|
+
* @fires nr-tabs-panel-close - Panel closed (when pannable)
|
|
39
|
+
* @fires nr-tabs-panel-minimize - Panel minimized (when pannable)
|
|
40
|
+
* @fires nr-tabs-panel-resize - Panel resized (when pannable)
|
|
31
41
|
*
|
|
32
42
|
* @slot default - Tab content
|
|
33
43
|
*/
|
|
34
|
-
export declare class NrTabsElement extends NrTabsElement_base implements TabsKeyboardHost, TabsDragDropHost, TabsEditableHost, TabsEventHost {
|
|
44
|
+
export declare class NrTabsElement extends NrTabsElement_base implements TabsKeyboardHost, TabsDragDropHost, TabsEditableHost, TabsEventHost, TabsPopOutHost {
|
|
35
45
|
static styles: import("lit").CSSResult;
|
|
36
46
|
/** Currently active tab index */
|
|
37
47
|
activeTab: number;
|
|
38
48
|
/** Tab orientation (horizontal, vertical) */
|
|
39
49
|
orientation: TabOrientation;
|
|
40
|
-
/** Tab alignment (left, center, right) */
|
|
50
|
+
/** Tab alignment (left, center, right, stretch) */
|
|
41
51
|
align: TabsAlign;
|
|
42
52
|
/** Tab size (small, medium, large) */
|
|
43
53
|
tabSize: TabSize;
|
|
@@ -53,19 +63,38 @@ export declare class NrTabsElement extends NrTabsElement_base implements TabsKey
|
|
|
53
63
|
destroyInactiveTabPane: boolean;
|
|
54
64
|
/** Custom aria-label for the tabs container */
|
|
55
65
|
tabsAriaLabel: string;
|
|
66
|
+
/** Panel configuration for making tabs pannable */
|
|
67
|
+
panelConfig?: TabsPanelConfig;
|
|
68
|
+
/** Pop-out configuration for making tabs pop-outable */
|
|
69
|
+
popOut?: TabPopOutConfig;
|
|
56
70
|
requiredComponents: string[];
|
|
57
71
|
private keyboardController;
|
|
58
72
|
private dragDropController;
|
|
59
73
|
private editableController;
|
|
60
74
|
private eventController;
|
|
75
|
+
private popOutController;
|
|
61
76
|
connectedCallback(): void;
|
|
62
|
-
render():
|
|
77
|
+
render(): any;
|
|
78
|
+
private renderTabsContent;
|
|
79
|
+
private renderWithPanel;
|
|
63
80
|
private observeChildrenChanges;
|
|
64
81
|
private renderDeleteIcon;
|
|
82
|
+
private renderPopOutIcon;
|
|
65
83
|
private renderTabs;
|
|
66
84
|
updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
|
|
67
85
|
private renderActiveTab;
|
|
68
86
|
setActiveTab(index: number, event?: Event): void;
|
|
87
|
+
private handlePanelClose;
|
|
88
|
+
private handlePanelMinimize;
|
|
89
|
+
private handlePanelResize;
|
|
90
|
+
/**
|
|
91
|
+
* Public method to pop in a tab from placeholder
|
|
92
|
+
*/
|
|
93
|
+
popInTab(popOutId: string): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Public method to pop out a tab
|
|
96
|
+
*/
|
|
97
|
+
popOutTab(tabIndex: number): Promise<void>;
|
|
69
98
|
}
|
|
70
99
|
export {};
|
|
71
100
|
//# sourceMappingURL=tabs.component.d.ts.map
|
package/tabs.component.js
CHANGED
|
@@ -9,16 +9,28 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
9
9
|
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;
|
|
10
10
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
11
11
|
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
12
21
|
import { html, LitElement, nothing } from 'lit';
|
|
13
22
|
import { customElement, property } from 'lit/decorators.js';
|
|
14
23
|
import { classMap } from 'lit/directives/class-map.js';
|
|
15
24
|
import { styles } from './tabs.style.js';
|
|
16
25
|
import { EMPTY_STRING, DEFAULT_ACTIVE_TAB } from './tabs.types.js';
|
|
17
26
|
import { NuralyUIBaseMixin } from '@nuralyui/common/mixins';
|
|
27
|
+
// Import panel component
|
|
28
|
+
import '../panel/index.js';
|
|
29
|
+
import { PanelMode } from '../panel/panel.types.js';
|
|
18
30
|
// Import controllers
|
|
19
|
-
import { TabsKeyboardController, TabsDragDropController, TabsEditableController, TabsEventController } from './controllers/index.js';
|
|
31
|
+
import { TabsKeyboardController, TabsDragDropController, TabsEditableController, TabsEventController, TabsPopOutController } from './controllers/index.js';
|
|
20
32
|
/**
|
|
21
|
-
* Versatile tabs component with support for multiple orientations, editable tabs,
|
|
33
|
+
* Versatile tabs component with support for multiple orientations, editable tabs, drag & drop, and optional panel wrapper.
|
|
22
34
|
*
|
|
23
35
|
* @example
|
|
24
36
|
* ```html
|
|
@@ -30,6 +42,12 @@ import { TabsKeyboardController, TabsDragDropController, TabsEditableController,
|
|
|
30
42
|
*
|
|
31
43
|
* <!-- Vertical orientation -->
|
|
32
44
|
* <nr-tabs .tabs=${tabs} orientation="vertical" align="left"></nr-tabs>
|
|
45
|
+
*
|
|
46
|
+
* <!-- Stretch tabs to fill full width with equal sizes -->
|
|
47
|
+
* <nr-tabs .tabs=${tabs} align="stretch"></nr-tabs>
|
|
48
|
+
*
|
|
49
|
+
* <!-- Pannable tabs (disabled by default) -->
|
|
50
|
+
* <nr-tabs .tabs=${tabs} .panelConfig=${{enabled: true, resizable: true, title: "My Tabs"}}></nr-tabs>
|
|
33
51
|
* ```
|
|
34
52
|
*
|
|
35
53
|
* @fires nr-tab-click - Tab clicked
|
|
@@ -38,6 +56,9 @@ import { TabsKeyboardController, TabsDragDropController, TabsEditableController,
|
|
|
38
56
|
* @fires nr-tab-remove - Tab removal requested
|
|
39
57
|
* @fires nr-tab-edit - Tab edited
|
|
40
58
|
* @fires nr-tab-order-change - Tab order changed via drag & drop
|
|
59
|
+
* @fires nr-tabs-panel-close - Panel closed (when pannable)
|
|
60
|
+
* @fires nr-tabs-panel-minimize - Panel minimized (when pannable)
|
|
61
|
+
* @fires nr-tabs-panel-resize - Panel resized (when pannable)
|
|
41
62
|
*
|
|
42
63
|
* @slot default - Tab content
|
|
43
64
|
*/
|
|
@@ -48,7 +69,7 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
48
69
|
this.activeTab = DEFAULT_ACTIVE_TAB;
|
|
49
70
|
/** Tab orientation (horizontal, vertical) */
|
|
50
71
|
this.orientation = "horizontal" /* TabOrientation.Horizontal */;
|
|
51
|
-
/** Tab alignment (left, center, right) */
|
|
72
|
+
/** Tab alignment (left, center, right, stretch) */
|
|
52
73
|
this.align = "left" /* TabsAlign.Left */;
|
|
53
74
|
/** Tab size (small, medium, large) */
|
|
54
75
|
this.tabSize = "medium" /* TabSize.Medium */;
|
|
@@ -62,12 +83,13 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
62
83
|
this.destroyInactiveTabPane = false;
|
|
63
84
|
/** Custom aria-label for the tabs container */
|
|
64
85
|
this.tabsAriaLabel = EMPTY_STRING;
|
|
65
|
-
this.requiredComponents = ['nr-icon'];
|
|
86
|
+
this.requiredComponents = ['nr-icon', 'nr-panel'];
|
|
66
87
|
// Controllers - automatically connected via Lit's reactive controller system
|
|
67
88
|
this.keyboardController = new TabsKeyboardController(this);
|
|
68
89
|
this.dragDropController = new TabsDragDropController(this);
|
|
69
90
|
this.editableController = new TabsEditableController(this);
|
|
70
91
|
this.eventController = new TabsEventController(this);
|
|
92
|
+
this.popOutController = new TabsPopOutController(this);
|
|
71
93
|
}
|
|
72
94
|
connectedCallback() {
|
|
73
95
|
super.connectedCallback();
|
|
@@ -78,17 +100,36 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
78
100
|
void this.dragDropController;
|
|
79
101
|
void this.editableController;
|
|
80
102
|
void this.eventController;
|
|
103
|
+
void this.popOutController;
|
|
81
104
|
}
|
|
82
105
|
render() {
|
|
106
|
+
var _a;
|
|
107
|
+
// If all tabs are popped out (no visible tabs), hide completely
|
|
108
|
+
if (this.tabs.length === 0) {
|
|
109
|
+
return nothing;
|
|
110
|
+
}
|
|
111
|
+
const tabsContent = this.renderTabsContent();
|
|
112
|
+
// Only wrap with panel if explicitly enabled
|
|
113
|
+
if ((_a = this.panelConfig) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
114
|
+
return this.renderWithPanel(tabsContent);
|
|
115
|
+
}
|
|
116
|
+
// Default: return just the tabs content
|
|
117
|
+
return tabsContent;
|
|
118
|
+
}
|
|
119
|
+
renderTabsContent() {
|
|
120
|
+
// Check if all tabs are popped out (no visible tabs)
|
|
121
|
+
const hasVisibleTabs = this.tabs.length > 0;
|
|
83
122
|
return html `
|
|
84
123
|
<div
|
|
85
124
|
class=${classMap({
|
|
86
125
|
'tabs-container': true,
|
|
126
|
+
'no-visible-tabs': !hasVisibleTabs,
|
|
87
127
|
'vertical-align': this.orientation === "vertical" /* TabOrientation.Vertical */,
|
|
88
128
|
'horizontal-align': this.orientation === "horizontal" /* TabOrientation.Horizontal */,
|
|
89
129
|
'right-align': this.align === "right" /* TabsAlign.Right */,
|
|
90
130
|
'left-align': this.align === "left" /* TabsAlign.Left */,
|
|
91
131
|
'center-align': this.align === "center" /* TabsAlign.Center */,
|
|
132
|
+
'stretch-align': this.align === "stretch" /* TabsAlign.Stretch */,
|
|
92
133
|
})}
|
|
93
134
|
role="tablist"
|
|
94
135
|
aria-label="${this.tabsAriaLabel || nothing}"
|
|
@@ -110,6 +151,58 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
110
151
|
</div>
|
|
111
152
|
`;
|
|
112
153
|
}
|
|
154
|
+
renderWithPanel(tabsContent) {
|
|
155
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
156
|
+
if (!this.isComponentAvailable('nr-panel')) {
|
|
157
|
+
console.warn('[nr-tabs] Panel component not available. Rendering without panel.');
|
|
158
|
+
return tabsContent;
|
|
159
|
+
}
|
|
160
|
+
// Only pass width/height if explicitly set, otherwise let panel size naturally
|
|
161
|
+
const panelProps = {
|
|
162
|
+
mode: ((_a = this.panelConfig) === null || _a === void 0 ? void 0 : _a.mode) || PanelMode.Embedded,
|
|
163
|
+
size: ((_b = this.panelConfig) === null || _b === void 0 ? void 0 : _b.size) || this.tabSize,
|
|
164
|
+
resizable: (_d = (_c = this.panelConfig) === null || _c === void 0 ? void 0 : _c.resizable) !== null && _d !== void 0 ? _d : true,
|
|
165
|
+
draggable: (_f = (_e = this.panelConfig) === null || _e === void 0 ? void 0 : _e.draggable) !== null && _f !== void 0 ? _f : true,
|
|
166
|
+
closable: (_h = (_g = this.panelConfig) === null || _g === void 0 ? void 0 : _g.closable) !== null && _h !== void 0 ? _h : false,
|
|
167
|
+
minimizable: (_k = (_j = this.panelConfig) === null || _j === void 0 ? void 0 : _j.minimizable) !== null && _k !== void 0 ? _k : true,
|
|
168
|
+
title: ((_l = this.panelConfig) === null || _l === void 0 ? void 0 : _l.title) || 'Tabs',
|
|
169
|
+
icon: ((_m = this.panelConfig) === null || _m === void 0 ? void 0 : _m.icon) || ''
|
|
170
|
+
};
|
|
171
|
+
// Only set dimensions if explicitly provided
|
|
172
|
+
if ((_o = this.panelConfig) === null || _o === void 0 ? void 0 : _o.width) {
|
|
173
|
+
panelProps.width = this.panelConfig.width;
|
|
174
|
+
}
|
|
175
|
+
if ((_p = this.panelConfig) === null || _p === void 0 ? void 0 : _p.height) {
|
|
176
|
+
panelProps.height = this.panelConfig.height;
|
|
177
|
+
}
|
|
178
|
+
return html `
|
|
179
|
+
<nr-panel
|
|
180
|
+
class="tabs-panel-wrapper"
|
|
181
|
+
.mode=${panelProps.mode}
|
|
182
|
+
.size=${panelProps.size}
|
|
183
|
+
.resizable=${panelProps.resizable}
|
|
184
|
+
.draggable=${panelProps.draggable}
|
|
185
|
+
.closable=${panelProps.closable}
|
|
186
|
+
.minimizable=${panelProps.minimizable}
|
|
187
|
+
.title=${panelProps.title}
|
|
188
|
+
.icon=${panelProps.icon}
|
|
189
|
+
.width=${panelProps.width || ''}
|
|
190
|
+
.height=${panelProps.height || ''}
|
|
191
|
+
@panel-close=${this.handlePanelClose}
|
|
192
|
+
@panel-minimize=${this.handlePanelMinimize}
|
|
193
|
+
@panel-resize=${this.handlePanelResize}
|
|
194
|
+
style="
|
|
195
|
+
${((_q = this.panelConfig) === null || _q === void 0 ? void 0 : _q.mode) === PanelMode.Embedded ?
|
|
196
|
+
'width: 100% !important; height: auto !important; min-height: 0;' :
|
|
197
|
+
''}
|
|
198
|
+
${!panelProps.width && ((_r = this.panelConfig) === null || _r === void 0 ? void 0 : _r.mode) !== PanelMode.Embedded ? 'width: auto;' : ''}
|
|
199
|
+
${!panelProps.height && ((_s = this.panelConfig) === null || _s === void 0 ? void 0 : _s.mode) !== PanelMode.Embedded ? 'height: auto;' : ''}
|
|
200
|
+
"
|
|
201
|
+
>
|
|
202
|
+
${tabsContent}
|
|
203
|
+
</nr-panel>
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
113
206
|
observeChildrenChanges() {
|
|
114
207
|
const mutationObserver = new MutationObserver(() => {
|
|
115
208
|
// Handle dynamic tab changes if needed
|
|
@@ -126,7 +219,8 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
126
219
|
}
|
|
127
220
|
return html `
|
|
128
221
|
<nr-icon
|
|
129
|
-
name="
|
|
222
|
+
name="x"
|
|
223
|
+
size="small"
|
|
130
224
|
class="close-icon"
|
|
131
225
|
@mousedown=${(e) => {
|
|
132
226
|
e.stopPropagation();
|
|
@@ -135,6 +229,38 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
135
229
|
></nr-icon>
|
|
136
230
|
`;
|
|
137
231
|
}
|
|
232
|
+
renderPopOutIcon(tab, tabIndex) {
|
|
233
|
+
if (!this.popOutController.canPopOut(tab))
|
|
234
|
+
return nothing;
|
|
235
|
+
if (!this.isComponentAvailable('nr-icon')) {
|
|
236
|
+
console.warn('[nr-tabs] Icon component not available. Pop-out icon will not render.');
|
|
237
|
+
return nothing;
|
|
238
|
+
}
|
|
239
|
+
const isPlaceholder = tab.popOutState === "placeholder" /* TabPopOutState.Placeholder */;
|
|
240
|
+
const iconName = isPlaceholder ? 'window-maximize' : 'maximize';
|
|
241
|
+
const title = isPlaceholder ? 'Pop back in' : 'Pop out to window';
|
|
242
|
+
return html `
|
|
243
|
+
<nr-icon
|
|
244
|
+
name="${iconName}"
|
|
245
|
+
class="pop-out-icon"
|
|
246
|
+
title="${title}"
|
|
247
|
+
@mousedown=${(e) => {
|
|
248
|
+
e.stopPropagation();
|
|
249
|
+
if (isPlaceholder) {
|
|
250
|
+
// Find the pop-out ID from placeholder content
|
|
251
|
+
const placeholderContent = tab.content;
|
|
252
|
+
const matches = placeholderContent.match(/data-pop-out-id="([^"]+)"/);
|
|
253
|
+
if (matches) {
|
|
254
|
+
this.popOutController.handlePopInRequest(matches[1]);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
this.popOutController.handlePopOutRequest(tabIndex);
|
|
259
|
+
}
|
|
260
|
+
}}
|
|
261
|
+
></nr-icon>
|
|
262
|
+
`;
|
|
263
|
+
}
|
|
138
264
|
renderTabs() {
|
|
139
265
|
const tabs = [];
|
|
140
266
|
for (let tabIndex = 0; tabIndex < this.tabs.length; tabIndex++) {
|
|
@@ -157,6 +283,7 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
157
283
|
'tab-label': true,
|
|
158
284
|
'active': isActive,
|
|
159
285
|
'disabled': !!tab.disabled,
|
|
286
|
+
'tab-placeholder-state': tab.popOutState === "placeholder" /* TabPopOutState.Placeholder */,
|
|
160
287
|
'first-tab': isFirstTab && this.orientation === "horizontal" /* TabOrientation.Horizontal */,
|
|
161
288
|
'middle-tab': isMiddleTab && this.orientation === "horizontal" /* TabOrientation.Horizontal */,
|
|
162
289
|
'last-tab': isLastTab && this.orientation === "horizontal" /* TabOrientation.Horizontal */,
|
|
@@ -178,7 +305,10 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
178
305
|
@keydown=${(event) => this.editableController.handleTabTitleKeyDown(event, tabIndex)}
|
|
179
306
|
>${tab.label}</span>
|
|
180
307
|
|
|
181
|
-
|
|
308
|
+
<div class="tab-actions">
|
|
309
|
+
${this.renderPopOutIcon(tab, tabIndex)}
|
|
310
|
+
${this.renderDeleteIcon(tab, tabIndex)}
|
|
311
|
+
</div>
|
|
182
312
|
</div>
|
|
183
313
|
`;
|
|
184
314
|
tabs.push(tabElement);
|
|
@@ -258,6 +388,34 @@ let NrTabsElement = class NrTabsElement extends NuralyUIBaseMixin(LitElement) {
|
|
|
258
388
|
});
|
|
259
389
|
}
|
|
260
390
|
}
|
|
391
|
+
handlePanelClose() {
|
|
392
|
+
this.dispatchEvent(new CustomEvent('nr-tabs-panel-close', { bubbles: true }));
|
|
393
|
+
}
|
|
394
|
+
handlePanelMinimize() {
|
|
395
|
+
this.dispatchEvent(new CustomEvent('nr-tabs-panel-minimize', { bubbles: true }));
|
|
396
|
+
}
|
|
397
|
+
handlePanelResize(event) {
|
|
398
|
+
this.dispatchEvent(new CustomEvent('nr-tabs-panel-resize', {
|
|
399
|
+
bubbles: true,
|
|
400
|
+
detail: event.detail
|
|
401
|
+
}));
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Public method to pop in a tab from placeholder
|
|
405
|
+
*/
|
|
406
|
+
popInTab(popOutId) {
|
|
407
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
408
|
+
yield this.popOutController.handlePopInRequest(popOutId);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Public method to pop out a tab
|
|
413
|
+
*/
|
|
414
|
+
popOutTab(tabIndex) {
|
|
415
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
416
|
+
yield this.popOutController.handlePopOutRequest(tabIndex);
|
|
417
|
+
});
|
|
418
|
+
}
|
|
261
419
|
};
|
|
262
420
|
NrTabsElement.styles = styles;
|
|
263
421
|
__decorate([
|
|
@@ -290,6 +448,12 @@ __decorate([
|
|
|
290
448
|
__decorate([
|
|
291
449
|
property({ type: String })
|
|
292
450
|
], NrTabsElement.prototype, "tabsAriaLabel", void 0);
|
|
451
|
+
__decorate([
|
|
452
|
+
property({ type: Object })
|
|
453
|
+
], NrTabsElement.prototype, "panelConfig", void 0);
|
|
454
|
+
__decorate([
|
|
455
|
+
property({ type: Object })
|
|
456
|
+
], NrTabsElement.prototype, "popOut", void 0);
|
|
293
457
|
NrTabsElement = __decorate([
|
|
294
458
|
customElement('nr-tabs')
|
|
295
459
|
], NrTabsElement);
|
package/tabs.component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.component.js","sourceRoot":"","sources":["../../../src/components/tabs/tabs.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { html, LitElement, nothing, PropertyValueMap } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styles } from './tabs.style.js';\nimport {\n TabOrientation,\n TabsAlign,\n TabSize,\n TabType,\n TabEditable,\n TabEvent,\n TabItem,\n TabClickEventDetail,\n EMPTY_STRING,\n DEFAULT_ACTIVE_TAB\n} from './tabs.types.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\n\n// Import controllers\nimport {\n TabsKeyboardController,\n TabsDragDropController,\n TabsEditableController,\n TabsEventController,\n type TabsKeyboardHost,\n type TabsDragDropHost,\n type TabsEditableHost,\n type TabsEventHost\n} from './controllers/index.js';\n\n/**\n * Versatile tabs component with support for multiple orientations, editable tabs, and drag & drop.\n * \n * @example\n * ```html\n * <!-- Basic usage -->\n * <nr-tabs .tabs=${tabs} activeTab=\"0\"></nr-tabs>\n * \n * <!-- With editing capabilities -->\n * <nr-tabs .tabs=${tabs} .editable=${{canAddTab: true, canDeleteTab: true}}></nr-tabs>\n * \n * <!-- Vertical orientation -->\n * <nr-tabs .tabs=${tabs} orientation=\"vertical\" align=\"left\"></nr-tabs>\n * ```\n * \n * @fires nr-tab-click - Tab clicked\n * @fires nr-tab-change - Active tab changed\n * @fires nr-tab-add - New tab requested\n * @fires nr-tab-remove - Tab removal requested\n * @fires nr-tab-edit - Tab edited\n * @fires nr-tab-order-change - Tab order changed via drag & drop\n * \n * @slot default - Tab content\n */\n@customElement('nr-tabs')\nexport class NrTabsElement extends NuralyUIBaseMixin(LitElement) implements \n TabsKeyboardHost,\n TabsDragDropHost,\n TabsEditableHost,\n TabsEventHost {\n static override styles = styles;\n \n /** Currently active tab index */\n @property({ type: Number })\n activeTab = DEFAULT_ACTIVE_TAB;\n\n /** Tab orientation (horizontal, vertical) */\n @property({ type: String })\n orientation: TabOrientation = TabOrientation.Horizontal;\n\n /** Tab alignment (left, center, right) */\n @property({ type: String })\n align: TabsAlign = TabsAlign.Left;\n\n /** Tab size (small, medium, large) */\n @property({ type: String, attribute: 'size' })\n tabSize: TabSize = TabSize.Medium;\n\n /** Tab type/variant */\n @property({ type: String, attribute: 'type' })\n variant: TabType = TabType.Default;\n\n /** Editable configuration */\n @property({ type: Object })\n editable?: TabEditable;\n\n /** Array of tab items */\n @property({ type: Array })\n tabs: TabItem[] = [];\n\n /** Whether tabs are animated */\n @property({ type: Boolean })\n animated = true;\n\n /** Whether to destroy inactive tab content */\n @property({ type: Boolean })\n destroyInactiveTabPane = false;\n\n /** Custom aria-label for the tabs container */\n @property({ type: String })\n tabsAriaLabel = EMPTY_STRING;\n\n override requiredComponents = ['nr-icon'];\n\n // Controllers - automatically connected via Lit's reactive controller system\n private keyboardController = new TabsKeyboardController(this);\n private dragDropController = new TabsDragDropController(this);\n private editableController = new TabsEditableController(this);\n private eventController = new TabsEventController(this);\n\n override connectedCallback() {\n super.connectedCallback();\n this.validateDependencies();\n this.observeChildrenChanges();\n \n // Ensure controllers are properly referenced for TypeScript\n void this.keyboardController;\n void this.dragDropController;\n void this.editableController;\n void this.eventController;\n }\n\n override render() {\n return html`\n <div\n class=${classMap({\n 'tabs-container': true,\n 'vertical-align': this.orientation === TabOrientation.Vertical,\n 'horizontal-align': this.orientation === TabOrientation.Horizontal,\n 'right-align': this.align === TabsAlign.Right,\n 'left-align': this.align === TabsAlign.Left,\n 'center-align': this.align === TabsAlign.Center,\n })}\n role=\"tablist\"\n aria-label=\"${this.tabsAriaLabel || nothing}\"\n data-theme=\"${this.currentTheme}\"\n data-size=\"${this.tabSize}\"\n data-type=\"${this.variant}\"\n >\n <div\n class=\"tab-labels\"\n style=\"flex-direction: ${this.orientation === TabOrientation.Vertical ? 'column' : 'row'}\"\n >\n <div></div>\n ${this.renderTabs()}\n <div></div>\n </div>\n <div class=\"tab-content\" role=\"tabpanel\">\n ${this.renderActiveTab()}\n </div>\n </div>\n `;\n }\n\n private observeChildrenChanges() {\n const mutationObserver = new MutationObserver(() => {\n // Handle dynamic tab changes if needed\n this.requestUpdate();\n });\n\n mutationObserver.observe(this, { childList: true });\n }\n\n private renderDeleteIcon(tab: TabItem, tabIndex: number) {\n if (!this.editableController.canDeleteTab(tab)) return nothing;\n\n if (!this.isComponentAvailable('nr-icon')) {\n console.warn('[nr-tabs] Icon component not available. Delete icon will not render.');\n return nothing;\n }\n\n return html`\n <nr-icon\n name=\"window-close\"\n class=\"close-icon\"\n @mousedown=${(e: MouseEvent) => {\n e.stopPropagation();\n this.editableController.handleRemoveTab(tabIndex);\n }}\n ></nr-icon>\n `;\n }\n\n private renderTabs() {\n const tabs = [];\n \n for (let tabIndex = 0; tabIndex < this.tabs.length; tabIndex++) {\n const tab = this.tabs[tabIndex];\n const isActive = tabIndex === this.activeTab;\n \n // Determine tab position for border radius\n const isFirstTab = tabIndex === 0;\n const isLastTab = tabIndex === this.tabs.length - 1;\n const isSingleTab = this.tabs.length === 1;\n const isMiddleTab = !isFirstTab && !isLastTab && !isSingleTab;\n \n const tabElement = html`\n <div\n data-index=${tabIndex}\n draggable=${this.dragDropController.getDraggableState() ? 'true' : 'false'}\n @dragenter=${(e: DragEvent) => this.dragDropController.handleDragEnter(e)}\n @dragleave=${(e: DragEvent) => this.dragDropController.handleDragLeave(e)}\n @dragstart=${(e: DragEvent) => this.dragDropController.handleDragStart(e)}\n @drop=${(e: DragEvent) => this.dragDropController.handleDrop(e)}\n class=${classMap({\n 'tab-label': true,\n 'active': isActive,\n 'disabled': !!tab.disabled,\n 'first-tab': isFirstTab && this.orientation === TabOrientation.Horizontal,\n 'middle-tab': isMiddleTab && this.orientation === TabOrientation.Horizontal,\n 'last-tab': isLastTab && this.orientation === TabOrientation.Horizontal,\n 'single-tab': isSingleTab && this.orientation === TabOrientation.Horizontal\n })}\n role=\"tab\"\n aria-selected=${isActive ? 'true' : 'false'}\n aria-disabled=${tab.disabled ? 'true' : 'false'}\n tabindex=${isActive ? '0' : '-1'}\n @click=${(e: MouseEvent) => this.eventController.handleTabClick(tabIndex, e)}\n >\n ${tab.icon && this.isComponentAvailable('nr-icon') \n ? html`<nr-icon name=${tab.icon} class=\"tab-icon\"></nr-icon>` \n : nothing}\n \n <span class=\"tab-text\" \n contenteditable=${this.editableController.getContentEditableAttribute(tab) || nothing}\n @blur=${(event: Event) => this.editableController.handleTabTitleBlur(event, tabIndex)}\n @keydown=${(event: KeyboardEvent) => this.editableController.handleTabTitleKeyDown(event, tabIndex)}\n >${tab.label}</span>\n \n ${this.renderDeleteIcon(tab, tabIndex)}\n </div>\n `;\n tabs.push(tabElement);\n }\n\n // Add tab button\n if (this.editableController.canAddTab()) {\n const addTabElement = html`\n <div\n class=\"tab-label add-tab-label\"\n role=\"button\"\n aria-label=\"Add new tab\"\n tabindex=\"0\"\n @mousedown=${() => {\n this.editableController.handleAddTab();\n }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.editableController.handleAddTab();\n }\n }}\n >\n ${this.isComponentAvailable('nr-icon') \n ? html`<nr-icon name=\"plus\" class=\"add-tab-icon\"></nr-icon>`\n : html`<span>+</span>`}\n </div>\n `;\n tabs.push(addTabElement);\n }\n\n return tabs;\n }\n\n override updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n \n // Validate active tab index\n if (this.activeTab >= this.tabs.length) {\n this.activeTab = Math.max(0, this.tabs.length - 1);\n } else if (this.activeTab < 0) {\n this.activeTab = 0;\n }\n }\n\n private renderActiveTab() {\n if (this.tabs.length === 0 || this.activeTab < 0 || this.activeTab >= this.tabs.length) {\n return nothing;\n }\n\n const activeTab = this.tabs[this.activeTab];\n return html`${activeTab.content || nothing}`;\n }\n\n setActiveTab(index: number, event?: Event) {\n // Handle MouseEvent specifically for drag behavior\n if (event instanceof MouseEvent) {\n // For click events when drag is enabled, we don't need to prevent default\n // as the drag operation should take precedence over click for dragging\n const canMove = this.editable?.canMove ?? false;\n if (!canMove) {\n event.preventDefault();\n }\n }\n \n if (index < 0 || index >= this.tabs.length || this.tabs[index].disabled) {\n return;\n }\n\n const previousIndex = this.activeTab;\n const tab = this.tabs[index];\n \n this.activeTab = index;\n \n // Dispatch events\n this.dispatchEventWithMetadata(TabEvent.TabClick, {\n index,\n tab,\n previousIndex\n } as TabClickEventDetail);\n \n if (previousIndex !== index) {\n this.dispatchEventWithMetadata(TabEvent.TabChange, {\n index,\n tab,\n previousIndex\n } as TabClickEventDetail);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tabs.component.js","sourceRoot":"","sources":["../../../../src/components/tabs/tabs.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { html, LitElement, nothing, PropertyValueMap } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styles } from './tabs.style.js';\nimport {\n TabOrientation,\n TabsAlign,\n TabSize,\n TabType,\n TabEditable,\n TabsPanelConfig,\n TabPopOutConfig,\n TabPopOutState,\n TabEvent,\n TabItem,\n TabClickEventDetail,\n EMPTY_STRING,\n DEFAULT_ACTIVE_TAB\n} from './tabs.types.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\n\n// Import panel component\nimport '../panel/index.js';\nimport { PanelMode } from '../panel/panel.types.js';\n\n// Import controllers\nimport {\n TabsKeyboardController,\n TabsDragDropController,\n TabsEditableController,\n TabsEventController,\n TabsPopOutController,\n type TabsKeyboardHost,\n type TabsDragDropHost,\n type TabsEditableHost,\n type TabsEventHost,\n type TabsPopOutHost\n} from './controllers/index.js';\n\n/**\n * Versatile tabs component with support for multiple orientations, editable tabs, drag & drop, and optional panel wrapper.\n * \n * @example\n * ```html\n * <!-- Basic usage -->\n * <nr-tabs .tabs=${tabs} activeTab=\"0\"></nr-tabs>\n * \n * <!-- With editing capabilities -->\n * <nr-tabs .tabs=${tabs} .editable=${{canAddTab: true, canDeleteTab: true}}></nr-tabs>\n * \n * <!-- Vertical orientation -->\n * <nr-tabs .tabs=${tabs} orientation=\"vertical\" align=\"left\"></nr-tabs>\n * \n * <!-- Stretch tabs to fill full width with equal sizes -->\n * <nr-tabs .tabs=${tabs} align=\"stretch\"></nr-tabs>\n * \n * <!-- Pannable tabs (disabled by default) -->\n * <nr-tabs .tabs=${tabs} .panelConfig=${{enabled: true, resizable: true, title: \"My Tabs\"}}></nr-tabs>\n * ```\n * \n * @fires nr-tab-click - Tab clicked\n * @fires nr-tab-change - Active tab changed\n * @fires nr-tab-add - New tab requested\n * @fires nr-tab-remove - Tab removal requested\n * @fires nr-tab-edit - Tab edited\n * @fires nr-tab-order-change - Tab order changed via drag & drop\n * @fires nr-tabs-panel-close - Panel closed (when pannable)\n * @fires nr-tabs-panel-minimize - Panel minimized (when pannable)\n * @fires nr-tabs-panel-resize - Panel resized (when pannable)\n * \n * @slot default - Tab content\n */\n@customElement('nr-tabs')\nexport class NrTabsElement extends NuralyUIBaseMixin(LitElement) implements \n TabsKeyboardHost,\n TabsDragDropHost,\n TabsEditableHost,\n TabsEventHost,\n TabsPopOutHost {\n static override styles = styles;\n \n /** Currently active tab index */\n @property({ type: Number })\n activeTab = DEFAULT_ACTIVE_TAB;\n\n /** Tab orientation (horizontal, vertical) */\n @property({ type: String })\n orientation: TabOrientation = TabOrientation.Horizontal;\n\n /** Tab alignment (left, center, right, stretch) */\n @property({ type: String })\n align: TabsAlign = TabsAlign.Left;\n\n /** Tab size (small, medium, large) */\n @property({ type: String, attribute: 'size' })\n tabSize: TabSize = TabSize.Medium;\n\n /** Tab type/variant */\n @property({ type: String, attribute: 'type' })\n variant: TabType = TabType.Default;\n\n /** Editable configuration */\n @property({ type: Object })\n editable?: TabEditable;\n\n /** Array of tab items */\n @property({ type: Array })\n tabs: TabItem[] = [];\n\n /** Whether tabs are animated */\n @property({ type: Boolean })\n animated = true;\n\n /** Whether to destroy inactive tab content */\n @property({ type: Boolean })\n destroyInactiveTabPane = false;\n\n /** Custom aria-label for the tabs container */\n @property({ type: String })\n tabsAriaLabel = EMPTY_STRING;\n\n /** Panel configuration for making tabs pannable */\n @property({ type: Object })\n panelConfig?: TabsPanelConfig;\n\n /** Pop-out configuration for making tabs pop-outable */\n @property({ type: Object })\n popOut?: TabPopOutConfig;\n\n override requiredComponents = ['nr-icon', 'nr-panel'];\n\n // Controllers - automatically connected via Lit's reactive controller system\n private keyboardController = new TabsKeyboardController(this);\n private dragDropController = new TabsDragDropController(this);\n private editableController = new TabsEditableController(this);\n private eventController = new TabsEventController(this);\n private popOutController = new TabsPopOutController(this);\n\n override connectedCallback() {\n super.connectedCallback();\n this.validateDependencies();\n this.observeChildrenChanges();\n \n // Ensure controllers are properly referenced for TypeScript\n void this.keyboardController;\n void this.dragDropController;\n void this.editableController;\n void this.eventController;\n void this.popOutController;\n }\n\n override render() {\n // If all tabs are popped out (no visible tabs), hide completely\n if (this.tabs.length === 0) {\n return nothing;\n }\n \n const tabsContent = this.renderTabsContent();\n \n // Only wrap with panel if explicitly enabled\n if (this.panelConfig?.enabled) {\n return this.renderWithPanel(tabsContent);\n }\n \n // Default: return just the tabs content\n return tabsContent;\n }\n\n private renderTabsContent() {\n // Check if all tabs are popped out (no visible tabs)\n const hasVisibleTabs = this.tabs.length > 0;\n \n return html`\n <div\n class=${classMap({\n 'tabs-container': true,\n 'no-visible-tabs': !hasVisibleTabs,\n 'vertical-align': this.orientation === TabOrientation.Vertical,\n 'horizontal-align': this.orientation === TabOrientation.Horizontal,\n 'right-align': this.align === TabsAlign.Right,\n 'left-align': this.align === TabsAlign.Left,\n 'center-align': this.align === TabsAlign.Center,\n 'stretch-align': this.align === TabsAlign.Stretch,\n })}\n role=\"tablist\"\n aria-label=\"${this.tabsAriaLabel || nothing}\"\n data-theme=\"${this.currentTheme}\"\n data-size=\"${this.tabSize}\"\n data-type=\"${this.variant}\"\n >\n <div\n class=\"tab-labels\"\n style=\"flex-direction: ${this.orientation === TabOrientation.Vertical ? 'column' : 'row'}\"\n >\n <div></div>\n ${this.renderTabs()}\n <div></div>\n </div>\n <div class=\"tab-content\" role=\"tabpanel\">\n ${this.renderActiveTab()}\n </div>\n </div>\n `;\n }\n\n private renderWithPanel(tabsContent: any) {\n if (!this.isComponentAvailable('nr-panel')) {\n console.warn('[nr-tabs] Panel component not available. Rendering without panel.');\n return tabsContent;\n }\n\n // Only pass width/height if explicitly set, otherwise let panel size naturally\n const panelProps: any = {\n mode: this.panelConfig?.mode || PanelMode.Embedded,\n size: this.panelConfig?.size || this.tabSize, // Use tabs size if panel size not specified\n resizable: this.panelConfig?.resizable ?? true,\n draggable: this.panelConfig?.draggable ?? true,\n closable: this.panelConfig?.closable ?? false,\n minimizable: this.panelConfig?.minimizable ?? true,\n title: this.panelConfig?.title || 'Tabs',\n icon: this.panelConfig?.icon || ''\n };\n\n // Only set dimensions if explicitly provided\n if (this.panelConfig?.width) {\n panelProps.width = this.panelConfig.width;\n }\n if (this.panelConfig?.height) {\n panelProps.height = this.panelConfig.height;\n }\n\n return html`\n <nr-panel\n class=\"tabs-panel-wrapper\"\n .mode=${panelProps.mode}\n .size=${panelProps.size}\n .resizable=${panelProps.resizable}\n .draggable=${panelProps.draggable}\n .closable=${panelProps.closable}\n .minimizable=${panelProps.minimizable}\n .title=${panelProps.title}\n .icon=${panelProps.icon}\n .width=${panelProps.width || ''}\n .height=${panelProps.height || ''}\n @panel-close=${this.handlePanelClose}\n @panel-minimize=${this.handlePanelMinimize}\n @panel-resize=${this.handlePanelResize}\n style=\"\n ${this.panelConfig?.mode === PanelMode.Embedded ? \n 'width: 100% !important; height: auto !important; min-height: 0;' : \n ''}\n ${!panelProps.width && this.panelConfig?.mode !== PanelMode.Embedded ? 'width: auto;' : ''}\n ${!panelProps.height && this.panelConfig?.mode !== PanelMode.Embedded ? 'height: auto;' : ''}\n \"\n >\n ${tabsContent}\n </nr-panel>\n `;\n }\n\n private observeChildrenChanges() {\n const mutationObserver = new MutationObserver(() => {\n // Handle dynamic tab changes if needed\n this.requestUpdate();\n });\n\n mutationObserver.observe(this, { childList: true });\n }\n\n private renderDeleteIcon(tab: TabItem, tabIndex: number) {\n if (!this.editableController.canDeleteTab(tab)) return nothing;\n\n if (!this.isComponentAvailable('nr-icon')) {\n console.warn('[nr-tabs] Icon component not available. Delete icon will not render.');\n return nothing;\n }\n\n return html`\n <nr-icon\n name=\"x\"\n size=\"small\"\n class=\"close-icon\"\n @mousedown=${(e: MouseEvent) => {\n e.stopPropagation();\n this.editableController.handleRemoveTab(tabIndex);\n }}\n ></nr-icon>\n `;\n }\n\n private renderPopOutIcon(tab: TabItem, tabIndex: number) {\n if (!this.popOutController.canPopOut(tab)) return nothing;\n\n if (!this.isComponentAvailable('nr-icon')) {\n console.warn('[nr-tabs] Icon component not available. Pop-out icon will not render.');\n return nothing;\n }\n\n const isPlaceholder = tab.popOutState === TabPopOutState.Placeholder;\n const iconName = isPlaceholder ? 'window-maximize' : 'maximize';\n const title = isPlaceholder ? 'Pop back in' : 'Pop out to window';\n\n return html`\n <nr-icon\n name=\"${iconName}\"\n class=\"pop-out-icon\"\n title=\"${title}\"\n @mousedown=${(e: MouseEvent) => {\n e.stopPropagation();\n if (isPlaceholder) {\n // Find the pop-out ID from placeholder content\n const placeholderContent = tab.content as string;\n const matches = placeholderContent.match(/data-pop-out-id=\"([^\"]+)\"/);\n if (matches) {\n this.popOutController.handlePopInRequest(matches[1]);\n }\n } else {\n this.popOutController.handlePopOutRequest(tabIndex);\n }\n }}\n ></nr-icon>\n `;\n }\n\n private renderTabs() {\n const tabs = [];\n \n for (let tabIndex = 0; tabIndex < this.tabs.length; tabIndex++) {\n const tab = this.tabs[tabIndex];\n const isActive = tabIndex === this.activeTab;\n \n // Determine tab position for border radius\n const isFirstTab = tabIndex === 0;\n const isLastTab = tabIndex === this.tabs.length - 1;\n const isSingleTab = this.tabs.length === 1;\n const isMiddleTab = !isFirstTab && !isLastTab && !isSingleTab;\n \n const tabElement = html`\n <div\n data-index=${tabIndex}\n draggable=${this.dragDropController.getDraggableState() ? 'true' : 'false'}\n @dragenter=${(e: DragEvent) => this.dragDropController.handleDragEnter(e)}\n @dragleave=${(e: DragEvent) => this.dragDropController.handleDragLeave(e)}\n @dragstart=${(e: DragEvent) => this.dragDropController.handleDragStart(e)}\n @drop=${(e: DragEvent) => this.dragDropController.handleDrop(e)}\n class=${classMap({\n 'tab-label': true,\n 'active': isActive,\n 'disabled': !!tab.disabled,\n 'tab-placeholder-state': tab.popOutState === TabPopOutState.Placeholder,\n 'first-tab': isFirstTab && this.orientation === TabOrientation.Horizontal,\n 'middle-tab': isMiddleTab && this.orientation === TabOrientation.Horizontal,\n 'last-tab': isLastTab && this.orientation === TabOrientation.Horizontal,\n 'single-tab': isSingleTab && this.orientation === TabOrientation.Horizontal\n })}\n role=\"tab\"\n aria-selected=${isActive ? 'true' : 'false'}\n aria-disabled=${tab.disabled ? 'true' : 'false'}\n tabindex=${isActive ? '0' : '-1'}\n @click=${(e: MouseEvent) => this.eventController.handleTabClick(tabIndex, e)}\n >\n ${tab.icon && this.isComponentAvailable('nr-icon') \n ? html`<nr-icon name=${tab.icon} class=\"tab-icon\"></nr-icon>` \n : nothing}\n \n <span class=\"tab-text\" \n contenteditable=${this.editableController.getContentEditableAttribute(tab) || nothing}\n @blur=${(event: Event) => this.editableController.handleTabTitleBlur(event, tabIndex)}\n @keydown=${(event: KeyboardEvent) => this.editableController.handleTabTitleKeyDown(event, tabIndex)}\n >${tab.label}</span>\n \n <div class=\"tab-actions\">\n ${this.renderPopOutIcon(tab, tabIndex)}\n ${this.renderDeleteIcon(tab, tabIndex)}\n </div>\n </div>\n `;\n tabs.push(tabElement);\n }\n\n // Add tab button\n if (this.editableController.canAddTab()) {\n const addTabElement = html`\n <div\n class=\"tab-label add-tab-label\"\n role=\"button\"\n aria-label=\"Add new tab\"\n tabindex=\"0\"\n @mousedown=${() => {\n this.editableController.handleAddTab();\n }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.editableController.handleAddTab();\n }\n }}\n >\n ${this.isComponentAvailable('nr-icon') \n ? html`<nr-icon name=\"plus\" class=\"add-tab-icon\"></nr-icon>`\n : html`<span>+</span>`}\n </div>\n `;\n tabs.push(addTabElement);\n }\n\n return tabs;\n }\n\n override updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n \n // Validate active tab index\n if (this.activeTab >= this.tabs.length) {\n this.activeTab = Math.max(0, this.tabs.length - 1);\n } else if (this.activeTab < 0) {\n this.activeTab = 0;\n }\n }\n\n private renderActiveTab() {\n if (this.tabs.length === 0 || this.activeTab < 0 || this.activeTab >= this.tabs.length) {\n return nothing;\n }\n\n const activeTab = this.tabs[this.activeTab];\n return html`${activeTab.content || nothing}`;\n }\n\n setActiveTab(index: number, event?: Event) {\n // Handle MouseEvent specifically for drag behavior\n if (event instanceof MouseEvent) {\n // For click events when drag is enabled, we don't need to prevent default\n // as the drag operation should take precedence over click for dragging\n const canMove = this.editable?.canMove ?? false;\n if (!canMove) {\n event.preventDefault();\n }\n }\n \n if (index < 0 || index >= this.tabs.length || this.tabs[index].disabled) {\n return;\n }\n\n const previousIndex = this.activeTab;\n const tab = this.tabs[index];\n \n this.activeTab = index;\n \n // Dispatch events\n this.dispatchEventWithMetadata(TabEvent.TabClick, {\n index,\n tab,\n previousIndex\n } as TabClickEventDetail);\n \n if (previousIndex !== index) {\n this.dispatchEventWithMetadata(TabEvent.TabChange, {\n index,\n tab,\n previousIndex\n } as TabClickEventDetail);\n }\n }\n\n private handlePanelClose() {\n this.dispatchEvent(new CustomEvent('nr-tabs-panel-close', { bubbles: true }));\n }\n\n private handlePanelMinimize() {\n this.dispatchEvent(new CustomEvent('nr-tabs-panel-minimize', { bubbles: true }));\n }\n\n private handlePanelResize(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('nr-tabs-panel-resize', { \n bubbles: true, \n detail: event.detail \n }));\n }\n\n /**\n * Public method to pop in a tab from placeholder\n */\n async popInTab(popOutId: string): Promise<void> {\n await this.popOutController.handlePopInRequest(popOutId);\n }\n\n /**\n * Public method to pop out a tab\n */\n async popOutTab(tabIndex: number): Promise<void> {\n await this.popOutController.handlePopOutRequest(tabIndex);\n }\n}\n"]}
|
package/tabs.constant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.constant.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"tabs.constant.js","sourceRoot":"","sources":["../../../../src/components/tabs/tabs.constant.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+DAA+D;AAC/D,OAAO,EAKL,YAAY,EACZ,cAAc,EACd,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,MAAM,EAAE,QAAQ;CACR,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n * \n * @deprecated This file is deprecated. Please import types from './tabs.types.js' instead.\n * This file will be removed in the next major version.\n */\n\n// Re-export from the new types file for backward compatibility\nexport {\n TabOrientation,\n TabsAlign,\n TabEditable,\n TabEvent,\n EMPTY_STRING,\n NOTHING_STRING,\n LABEL_ATTRIBUTES\n} from './tabs.types.js';\n\n/**\n * @deprecated Use TabEvent from tabs.types.js instead\n */\nexport const TabEvent_DEPRECATED = {\n removeTab: 'removeTab',\n tabEdited: 'tabEdited',\n tabTilteClick: 'tabTilteClick',\n tabOrderChange: 'tabOrderChange',\n addTab: 'addTab',\n} as const;\n"]}
|