@tociva/tailng-ui 0.12.0 → 0.13.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/fesm2022/tociva-tailng-ui-buttons-indicators.mjs +497 -16
- package/fesm2022/tociva-tailng-ui-buttons-indicators.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-data-table-structure.mjs +802 -17
- package/fesm2022/tociva-tailng-ui-data-table-structure.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-form-controls.mjs +3096 -17
- package/fesm2022/tociva-tailng-ui-form-controls.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-layout.mjs +438 -17
- package/fesm2022/tociva-tailng-ui-layout.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-navigation.mjs +780 -17
- package/fesm2022/tociva-tailng-ui-navigation.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-popups-overlays.mjs +1115 -17
- package/fesm2022/tociva-tailng-ui-popups-overlays.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui-utilities.mjs +129 -16
- package/fesm2022/tociva-tailng-ui-utilities.mjs.map +1 -1
- package/fesm2022/tociva-tailng-ui.mjs +15 -17
- package/fesm2022/tociva-tailng-ui.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1,22 +1,443 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Directive, input, booleanAttribute, output, contentChild, computed, signal, effect, Component, contentChildren, inject, HostListener, HostBinding } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* OPEN-state icon marker.
|
|
6
|
+
* Consumer must import this directive where the icon is used.
|
|
7
|
+
*/
|
|
8
|
+
class TngExpansionIconOpen {
|
|
9
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
10
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TngExpansionIconOpen, isStandalone: true, selector: "[tngExpansionIconOpen]", ngImport: i0 });
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconOpen, decorators: [{
|
|
13
|
+
type: Directive,
|
|
14
|
+
args: [{
|
|
15
|
+
selector: '[tngExpansionIconOpen]',
|
|
16
|
+
standalone: true,
|
|
17
|
+
}]
|
|
18
|
+
}] });
|
|
19
|
+
/**
|
|
20
|
+
* CLOSE-state icon marker.
|
|
21
|
+
* Consumer must import this directive where the icon is used.
|
|
22
|
+
*/
|
|
23
|
+
class TngExpansionIconClose {
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconClose, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
25
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TngExpansionIconClose, isStandalone: true, selector: "[tngExpansionIconClose]", ngImport: i0 });
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconClose, decorators: [{
|
|
28
|
+
type: Directive,
|
|
29
|
+
args: [{
|
|
30
|
+
selector: '[tngExpansionIconClose]',
|
|
31
|
+
standalone: true,
|
|
32
|
+
}]
|
|
33
|
+
}] });
|
|
34
|
+
class TngExpansionPanel {
|
|
35
|
+
/* =====================
|
|
36
|
+
* Inputs
|
|
37
|
+
* ===================== */
|
|
38
|
+
open = input(false, { ...(ngDevMode ? { debugName: "open" } : {}), transform: booleanAttribute });
|
|
39
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
|
|
40
|
+
padded = input(true, { ...(ngDevMode ? { debugName: "padded" } : {}), transform: booleanAttribute });
|
|
41
|
+
/* =====================
|
|
42
|
+
* Outputs
|
|
43
|
+
* ===================== */
|
|
44
|
+
openChange = output();
|
|
45
|
+
/* =====================
|
|
46
|
+
* Klass hooks
|
|
47
|
+
* ===================== */
|
|
48
|
+
rootKlass = input('rounded-lg border border-border bg-bg', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
|
|
49
|
+
headerKlass = input('flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground ' +
|
|
50
|
+
'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ' +
|
|
51
|
+
'disabled:cursor-not-allowed disabled:opacity-60', ...(ngDevMode ? [{ debugName: "headerKlass" }] : []));
|
|
52
|
+
titleKlass = input('flex-1', ...(ngDevMode ? [{ debugName: "titleKlass" }] : []));
|
|
53
|
+
iconWrapperKlass = input('ml-2 shrink-0 inline-flex items-center justify-center', ...(ngDevMode ? [{ debugName: "iconWrapperKlass" }] : []));
|
|
54
|
+
chevronKlass = input('h-4 w-4 shrink-0 transition-transform duration-200', ...(ngDevMode ? [{ debugName: "chevronKlass" }] : []));
|
|
55
|
+
contentOuterKlass = input('grid transition-[grid-template-rows] duration-200 ease-in-out', ...(ngDevMode ? [{ debugName: "contentOuterKlass" }] : []));
|
|
56
|
+
contentClipKlass = input('overflow-hidden', ...(ngDevMode ? [{ debugName: "contentClipKlass" }] : []));
|
|
57
|
+
contentBodyKlass = input('text-sm text-muted-foreground', ...(ngDevMode ? [{ debugName: "contentBodyKlass" }] : []));
|
|
58
|
+
contentPaddingKlass = input('px-4 pb-4 pt-2', ...(ngDevMode ? [{ debugName: "contentPaddingKlass" }] : []));
|
|
59
|
+
/* =====================
|
|
60
|
+
* Slots (state icons only)
|
|
61
|
+
* ===================== */
|
|
62
|
+
iconOpen = contentChild(TngExpansionIconOpen, ...(ngDevMode ? [{ debugName: "iconOpen" }] : []));
|
|
63
|
+
iconClose = contentChild(TngExpansionIconClose, ...(ngDevMode ? [{ debugName: "iconClose" }] : []));
|
|
64
|
+
hasOpenIcon = computed(() => !!this.iconOpen(), ...(ngDevMode ? [{ debugName: "hasOpenIcon" }] : []));
|
|
65
|
+
hasCloseIcon = computed(() => !!this.iconClose(), ...(ngDevMode ? [{ debugName: "hasCloseIcon" }] : []));
|
|
66
|
+
hasAnyCustomIcon = computed(() => this.hasOpenIcon() || this.hasCloseIcon(), ...(ngDevMode ? [{ debugName: "hasAnyCustomIcon" }] : []));
|
|
67
|
+
// Stable rendering flags (avoid ng-content inside @if)
|
|
68
|
+
showOpenIcon = computed(() => {
|
|
69
|
+
if (!this.hasAnyCustomIcon())
|
|
70
|
+
return false;
|
|
71
|
+
if (this.hasOpenIcon() && this.hasCloseIcon())
|
|
72
|
+
return this.isOpen();
|
|
73
|
+
if (this.hasOpenIcon())
|
|
74
|
+
return true; // only open provided -> use for both states
|
|
75
|
+
return false;
|
|
76
|
+
}, ...(ngDevMode ? [{ debugName: "showOpenIcon" }] : []));
|
|
77
|
+
showCloseIcon = computed(() => {
|
|
78
|
+
if (!this.hasAnyCustomIcon())
|
|
79
|
+
return false;
|
|
80
|
+
if (this.hasOpenIcon() && this.hasCloseIcon())
|
|
81
|
+
return !this.isOpen();
|
|
82
|
+
if (this.hasCloseIcon())
|
|
83
|
+
return true; // only close provided -> use for both states
|
|
84
|
+
return false;
|
|
85
|
+
}, ...(ngDevMode ? [{ debugName: "showCloseIcon" }] : []));
|
|
86
|
+
/* =====================
|
|
87
|
+
* State
|
|
88
|
+
* ===================== */
|
|
89
|
+
_isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : []));
|
|
90
|
+
isOpen = this._isOpen.asReadonly();
|
|
91
|
+
constructor() {
|
|
92
|
+
effect(() => {
|
|
93
|
+
this._isOpen.set(this.open());
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
toggle() {
|
|
97
|
+
if (this.disabled())
|
|
98
|
+
return;
|
|
99
|
+
const next = !this._isOpen();
|
|
100
|
+
this._isOpen.set(next);
|
|
101
|
+
this.openChange.emit(next);
|
|
102
|
+
}
|
|
103
|
+
/* =====================
|
|
104
|
+
* Computed
|
|
105
|
+
* ===================== */
|
|
106
|
+
contentRowsKlass = computed(() => this.isOpen() ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]', ...(ngDevMode ? [{ debugName: "contentRowsKlass" }] : []));
|
|
107
|
+
chevronRotateKlass = computed(() => (this.isOpen() ? 'rotate-180' : ''), ...(ngDevMode ? [{ debugName: "chevronRotateKlass" }] : []));
|
|
108
|
+
/* =====================
|
|
109
|
+
* Final Klass (defaults + user overrides)
|
|
110
|
+
* ===================== */
|
|
111
|
+
finalRootKlass = computed(() => this.join('rounded-lg border border-border bg-bg', this.rootKlass()), ...(ngDevMode ? [{ debugName: "finalRootKlass" }] : []));
|
|
112
|
+
finalHeaderKlass = computed(() => this.join('flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary', 'disabled:cursor-not-allowed disabled:opacity-60', this.headerKlass()), ...(ngDevMode ? [{ debugName: "finalHeaderKlass" }] : []));
|
|
113
|
+
finalTitleKlass = computed(() => this.join('flex-1', this.titleKlass()), ...(ngDevMode ? [{ debugName: "finalTitleKlass" }] : []));
|
|
114
|
+
finalIconWrapperKlass = computed(() => this.join('ml-2 shrink-0 inline-flex items-center justify-center', this.iconWrapperKlass()), ...(ngDevMode ? [{ debugName: "finalIconWrapperKlass" }] : []));
|
|
115
|
+
finalChevronKlass = computed(() => this.join('h-4 w-4 shrink-0 transition-transform duration-200', this.chevronKlass()), ...(ngDevMode ? [{ debugName: "finalChevronKlass" }] : []));
|
|
116
|
+
finalContentOuterKlass = computed(() => this.join('grid transition-[grid-template-rows] duration-200 ease-in-out', this.contentOuterKlass()), ...(ngDevMode ? [{ debugName: "finalContentOuterKlass" }] : []));
|
|
117
|
+
finalContentClipKlass = computed(() => this.join('overflow-hidden', this.contentClipKlass()), ...(ngDevMode ? [{ debugName: "finalContentClipKlass" }] : []));
|
|
118
|
+
finalContentBodyKlass = computed(() => {
|
|
119
|
+
const pad = this.padded() ? this.contentPaddingKlass() : '';
|
|
120
|
+
return this.join('text-sm text-muted-foreground', pad, this.contentBodyKlass());
|
|
121
|
+
}, ...(ngDevMode ? [{ debugName: "finalContentBodyKlass" }] : []));
|
|
122
|
+
join(...parts) {
|
|
123
|
+
return parts
|
|
124
|
+
.map((p) => (p ?? '').trim())
|
|
125
|
+
.filter(Boolean)
|
|
126
|
+
.join(' ');
|
|
127
|
+
}
|
|
128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
129
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngExpansionPanel, isStandalone: true, selector: "tng-expansion-panel", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, padded: { classPropertyName: "padded", publicName: "padded", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, headerKlass: { classPropertyName: "headerKlass", publicName: "headerKlass", isSignal: true, isRequired: false, transformFunction: null }, titleKlass: { classPropertyName: "titleKlass", publicName: "titleKlass", isSignal: true, isRequired: false, transformFunction: null }, iconWrapperKlass: { classPropertyName: "iconWrapperKlass", publicName: "iconWrapperKlass", isSignal: true, isRequired: false, transformFunction: null }, chevronKlass: { classPropertyName: "chevronKlass", publicName: "chevronKlass", isSignal: true, isRequired: false, transformFunction: null }, contentOuterKlass: { classPropertyName: "contentOuterKlass", publicName: "contentOuterKlass", isSignal: true, isRequired: false, transformFunction: null }, contentClipKlass: { classPropertyName: "contentClipKlass", publicName: "contentClipKlass", isSignal: true, isRequired: false, transformFunction: null }, contentBodyKlass: { classPropertyName: "contentBodyKlass", publicName: "contentBodyKlass", isSignal: true, isRequired: false, transformFunction: null }, contentPaddingKlass: { classPropertyName: "contentPaddingKlass", publicName: "contentPaddingKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openChange: "openChange" }, queries: [{ propertyName: "iconOpen", first: true, predicate: TngExpansionIconOpen, descendants: true, isSignal: true }, { propertyName: "iconClose", first: true, predicate: TngExpansionIconClose, descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n" });
|
|
130
|
+
}
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionPanel, decorators: [{
|
|
132
|
+
type: Component,
|
|
133
|
+
args: [{ selector: 'tng-expansion-panel', standalone: true, template: "<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
134
|
+
}], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], padded: [{ type: i0.Input, args: [{ isSignal: true, alias: "padded", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], headerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerKlass", required: false }] }], titleKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleKlass", required: false }] }], iconWrapperKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconWrapperKlass", required: false }] }], chevronKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "chevronKlass", required: false }] }], contentOuterKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentOuterKlass", required: false }] }], contentClipKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentClipKlass", required: false }] }], contentBodyKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBodyKlass", required: false }] }], contentPaddingKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPaddingKlass", required: false }] }], iconOpen: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TngExpansionIconOpen), { isSignal: true }] }], iconClose: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TngExpansionIconClose), { isSignal: true }] }] } });
|
|
135
|
+
|
|
136
|
+
class TngAccordion {
|
|
137
|
+
/* =====================
|
|
138
|
+
* Inputs
|
|
139
|
+
* ===================== */
|
|
140
|
+
/** Allow multiple panels to be open at once */
|
|
141
|
+
multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : {}), transform: booleanAttribute });
|
|
142
|
+
/**
|
|
143
|
+
* If false: prevents closing the last open panel (at least one stays open)
|
|
144
|
+
* If true: all can be collapsed
|
|
145
|
+
*/
|
|
146
|
+
collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : {}), transform: booleanAttribute });
|
|
147
|
+
/** If true: when all panels are closed, open the first panel automatically */
|
|
148
|
+
autoOpenFirst = input(false, { ...(ngDevMode ? { debugName: "autoOpenFirst" } : {}), transform: booleanAttribute });
|
|
149
|
+
/* =====================
|
|
150
|
+
* Outputs
|
|
151
|
+
* ===================== */
|
|
152
|
+
/** Emits current open indexes when changes happen */
|
|
153
|
+
openIndexesChange = output();
|
|
154
|
+
/* =====================
|
|
155
|
+
* Klass hooks
|
|
156
|
+
* ===================== */
|
|
157
|
+
rootKlass = input('w-full', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
|
|
158
|
+
stackKlass = input('space-y-2', ...(ngDevMode ? [{ debugName: "stackKlass" }] : []));
|
|
159
|
+
/* =====================
|
|
160
|
+
* Children
|
|
161
|
+
* ===================== */
|
|
162
|
+
// All projected expansion panels (descendants enabled so nested layouts still work)
|
|
163
|
+
panels = contentChildren(TngExpansionPanel, { ...(ngDevMode ? { debugName: "panels" } : {}), descendants: true });
|
|
164
|
+
constructor() {
|
|
165
|
+
effect((onCleanup) => {
|
|
166
|
+
const panels = this.panels();
|
|
167
|
+
// Subscribe to openChange from each panel
|
|
168
|
+
const subs = panels.map((p) => p.openChange.subscribe((nextOpen) => {
|
|
169
|
+
this.onPanelToggled(p, nextOpen);
|
|
170
|
+
}));
|
|
171
|
+
// Emit initial state + optionally auto open first
|
|
172
|
+
this.emitOpenIndexes();
|
|
173
|
+
if (this.autoOpenFirst() && this.getOpenPanels().length === 0 && panels.length > 0) {
|
|
174
|
+
// open first panel
|
|
175
|
+
if (!panels[0].isOpen())
|
|
176
|
+
panels[0].toggle();
|
|
177
|
+
}
|
|
178
|
+
onCleanup(() => subs.forEach((s) => s.unsubscribe()));
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
onPanelToggled(panel, nextOpen) {
|
|
182
|
+
const panels = this.panels();
|
|
183
|
+
// If a panel just opened and multiple is false, close all others.
|
|
184
|
+
if (nextOpen && !this.multiple()) {
|
|
185
|
+
for (const p of panels) {
|
|
186
|
+
if (p !== panel && p.isOpen()) {
|
|
187
|
+
p.toggle();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// If a panel just closed and collapsible is false, ensure at least one stays open.
|
|
192
|
+
if (!nextOpen && !this.collapsible()) {
|
|
193
|
+
// After close, if none are open, reopen this one.
|
|
194
|
+
if (this.getOpenPanels().length === 0) {
|
|
195
|
+
// Reopen the same panel (guard against disabled)
|
|
196
|
+
if (!panel.disabled()) {
|
|
197
|
+
panel.toggle();
|
|
198
|
+
return; // the toggle will trigger emit later
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.emitOpenIndexes();
|
|
203
|
+
}
|
|
204
|
+
getOpenPanels() {
|
|
205
|
+
return this.panels().filter((p) => p.isOpen());
|
|
206
|
+
}
|
|
207
|
+
emitOpenIndexes() {
|
|
208
|
+
const panels = this.panels();
|
|
209
|
+
const openIndexes = panels
|
|
210
|
+
.map((p, i) => (p.isOpen() ? i : -1))
|
|
211
|
+
.filter((i) => i >= 0);
|
|
212
|
+
this.openIndexesChange.emit(openIndexes);
|
|
213
|
+
}
|
|
214
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
215
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.6", type: TngAccordion, isStandalone: true, selector: "tng-accordion", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, autoOpenFirst: { classPropertyName: "autoOpenFirst", publicName: "autoOpenFirst", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, stackKlass: { classPropertyName: "stackKlass", publicName: "stackKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openIndexesChange: "openIndexesChange" }, queries: [{ propertyName: "panels", predicate: TngExpansionPanel, descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n" });
|
|
216
|
+
}
|
|
217
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngAccordion, decorators: [{
|
|
218
|
+
type: Component,
|
|
219
|
+
args: [{ selector: 'tng-accordion', standalone: true, template: "<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
|
|
220
|
+
}], ctorParameters: () => [], propDecorators: { multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], autoOpenFirst: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoOpenFirst", required: false }] }], openIndexesChange: [{ type: i0.Output, args: ["openIndexesChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], stackKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "stackKlass", required: false }] }], panels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TngExpansionPanel), { ...{ descendants: true }, isSignal: true }] }] } });
|
|
221
|
+
|
|
222
|
+
class TngCard {
|
|
223
|
+
/* =====================
|
|
224
|
+
* Klass hooks
|
|
225
|
+
* ===================== */
|
|
226
|
+
rootKlass = input('', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
|
|
227
|
+
headerKlass = input('', ...(ngDevMode ? [{ debugName: "headerKlass" }] : []));
|
|
228
|
+
contentKlass = input('', ...(ngDevMode ? [{ debugName: "contentKlass" }] : []));
|
|
229
|
+
footerKlass = input('', ...(ngDevMode ? [{ debugName: "footerKlass" }] : []));
|
|
230
|
+
klass = input('', ...(ngDevMode ? [{ debugName: "klass" }] : []));
|
|
231
|
+
// Presence checks only (no `read` needed)
|
|
232
|
+
headerMarker = contentChild('[tngCardHeader]', ...(ngDevMode ? [{ debugName: "headerMarker" }] : []));
|
|
233
|
+
footerMarker = contentChild('[tngCardFooter]', ...(ngDevMode ? [{ debugName: "footerMarker" }] : []));
|
|
234
|
+
hasHeader = computed(() => !!this.headerMarker(), ...(ngDevMode ? [{ debugName: "hasHeader" }] : []));
|
|
235
|
+
hasFooter = computed(() => !!this.footerMarker(), ...(ngDevMode ? [{ debugName: "hasFooter" }] : []));
|
|
236
|
+
rootClasses = computed(() => ('block rounded-lg border border-border bg-bg text-fg shadow-sm ' +
|
|
237
|
+
this.rootKlass() +
|
|
238
|
+
' ' +
|
|
239
|
+
this.klass()).trim(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : []));
|
|
240
|
+
headerClasses = computed(() => ('border-b border-border px-4 py-3 ' + this.headerKlass()).trim(), ...(ngDevMode ? [{ debugName: "headerClasses" }] : []));
|
|
241
|
+
contentClasses = computed(() => ('px-4 py-4 ' + this.contentKlass()).trim(), ...(ngDevMode ? [{ debugName: "contentClasses" }] : []));
|
|
242
|
+
footerClasses = computed(() => ('border-t border-border px-4 py-3 ' + this.footerKlass()).trim(), ...(ngDevMode ? [{ debugName: "footerClasses" }] : []));
|
|
243
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
244
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngCard, isStandalone: true, selector: "tng-card", inputs: { rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, headerKlass: { classPropertyName: "headerKlass", publicName: "headerKlass", isSignal: true, isRequired: false, transformFunction: null }, contentKlass: { classPropertyName: "contentKlass", publicName: "contentKlass", isSignal: true, isRequired: false, transformFunction: null }, footerKlass: { classPropertyName: "footerKlass", publicName: "footerKlass", isSignal: true, isRequired: false, transformFunction: null }, klass: { classPropertyName: "klass", publicName: "klass", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "headerMarker", first: true, predicate: ["[tngCardHeader]"], descendants: true, isSignal: true }, { propertyName: "footerMarker", first: true, predicate: ["[tngCardFooter]"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n" });
|
|
245
|
+
}
|
|
246
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCard, decorators: [{
|
|
247
|
+
type: Component,
|
|
248
|
+
args: [{ selector: 'tng-card', standalone: true, template: "<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n" }]
|
|
249
|
+
}], propDecorators: { rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], headerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerKlass", required: false }] }], contentKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentKlass", required: false }] }], footerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerKlass", required: false }] }], klass: [{ type: i0.Input, args: [{ isSignal: true, alias: "klass", required: false }] }], headerMarker: [{ type: i0.ContentChild, args: ['[tngCardHeader]', { isSignal: true }] }], footerMarker: [{ type: i0.ContentChild, args: ['[tngCardFooter]', { isSignal: true }] }] } });
|
|
250
|
+
|
|
251
|
+
class TngDivider {
|
|
252
|
+
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
253
|
+
label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
|
|
254
|
+
align = input('center', ...(ngDevMode ? [{ debugName: "align" }] : []));
|
|
255
|
+
dashed = input(false, { ...(ngDevMode ? { debugName: "dashed" } : {}), transform: booleanAttribute });
|
|
256
|
+
/* klass hooks */
|
|
257
|
+
rootKlass = input('', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
|
|
258
|
+
/** Must include border color: border-border or border-slate-300 */
|
|
259
|
+
lineKlass = input('border-border', ...(ngDevMode ? [{ debugName: "lineKlass" }] : []));
|
|
260
|
+
labelKlass = input('text-xs text-fg/70', ...(ngDevMode ? [{ debugName: "labelKlass" }] : []));
|
|
261
|
+
gapKlass = input('my-4', ...(ngDevMode ? [{ debugName: "gapKlass" }] : []));
|
|
262
|
+
thicknessKlass = input('border-t', ...(ngDevMode ? [{ debugName: "thicknessKlass" }] : []));
|
|
263
|
+
/** NEW: vertical height that does NOT depend on parent height */
|
|
264
|
+
verticalHeightKlass = input('h-6', ...(ngDevMode ? [{ debugName: "verticalHeightKlass" }] : []));
|
|
265
|
+
isVertical = computed(() => this.orientation() === 'vertical', ...(ngDevMode ? [{ debugName: "isVertical" }] : []));
|
|
266
|
+
rootClasses = computed(() => {
|
|
267
|
+
if (this.isVertical()) {
|
|
268
|
+
// no h-full dependency anymore
|
|
269
|
+
return (`inline-flex shrink-0 items-stretch ${this.rootKlass()}`).trim();
|
|
270
|
+
}
|
|
271
|
+
return (`flex w-full items-center ${this.gapKlass()} ${this.rootKlass()}`).trim();
|
|
272
|
+
}, ...(ngDevMode ? [{ debugName: "rootClasses" }] : []));
|
|
273
|
+
lineClasses = computed(() => {
|
|
274
|
+
const style = this.dashed() ? 'border-dashed' : 'border-solid';
|
|
275
|
+
if (this.isVertical()) {
|
|
276
|
+
// Always visible: w-px + explicit height
|
|
277
|
+
return (`w-px ${this.verticalHeightKlass()} self-stretch shrink-0 ` +
|
|
278
|
+
`border-l ${style} ${this.lineKlass()}`).trim();
|
|
279
|
+
}
|
|
280
|
+
return (`${this.thicknessKlass()} ${style} ${this.lineKlass()}`).trim();
|
|
281
|
+
}, ...(ngDevMode ? [{ debugName: "lineClasses" }] : []));
|
|
282
|
+
leftGrow = computed(() => {
|
|
283
|
+
const a = this.align();
|
|
284
|
+
if (a === 'start')
|
|
285
|
+
return 'grow-0 w-6';
|
|
286
|
+
if (a === 'end')
|
|
287
|
+
return 'grow';
|
|
288
|
+
return 'grow';
|
|
289
|
+
}, ...(ngDevMode ? [{ debugName: "leftGrow" }] : []));
|
|
290
|
+
rightGrow = computed(() => {
|
|
291
|
+
const a = this.align();
|
|
292
|
+
if (a === 'start')
|
|
293
|
+
return 'grow';
|
|
294
|
+
if (a === 'end')
|
|
295
|
+
return 'grow-0 w-6';
|
|
296
|
+
return 'grow';
|
|
297
|
+
}, ...(ngDevMode ? [{ debugName: "rightGrow" }] : []));
|
|
298
|
+
labelClasses = computed(() => (`px-3 whitespace-nowrap ${this.labelKlass()}`).trim(), ...(ngDevMode ? [{ debugName: "labelClasses" }] : []));
|
|
299
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngDivider, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
300
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngDivider, isStandalone: true, selector: "tng-divider", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, dashed: { classPropertyName: "dashed", publicName: "dashed", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, lineKlass: { classPropertyName: "lineKlass", publicName: "lineKlass", isSignal: true, isRequired: false, transformFunction: null }, labelKlass: { classPropertyName: "labelKlass", publicName: "labelKlass", isSignal: true, isRequired: false, transformFunction: null }, gapKlass: { classPropertyName: "gapKlass", publicName: "gapKlass", isSignal: true, isRequired: false, transformFunction: null }, thicknessKlass: { classPropertyName: "thicknessKlass", publicName: "thicknessKlass", isSignal: true, isRequired: false, transformFunction: null }, verticalHeightKlass: { classPropertyName: "verticalHeightKlass", publicName: "verticalHeightKlass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n" });
|
|
301
|
+
}
|
|
302
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngDivider, decorators: [{
|
|
303
|
+
type: Component,
|
|
304
|
+
args: [{ selector: 'tng-divider', standalone: true, template: "<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n" }]
|
|
305
|
+
}], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], dashed: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashed", required: false }] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], lineKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineKlass", required: false }] }], labelKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelKlass", required: false }] }], gapKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "gapKlass", required: false }] }], thicknessKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "thicknessKlass", required: false }] }], verticalHeightKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalHeightKlass", required: false }] }] } });
|
|
306
|
+
|
|
307
|
+
class TngTabs {
|
|
308
|
+
/* =====================
|
|
309
|
+
* Inputs
|
|
310
|
+
* ===================== */
|
|
311
|
+
/** Controlled value */
|
|
312
|
+
value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
313
|
+
/** Default value (uncontrolled init) */
|
|
314
|
+
defaultValue = input(null, ...(ngDevMode ? [{ debugName: "defaultValue" }] : []));
|
|
315
|
+
/** Orientation */
|
|
316
|
+
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
317
|
+
/* =====================
|
|
318
|
+
* Outputs
|
|
319
|
+
* ===================== */
|
|
320
|
+
valueChange = output();
|
|
321
|
+
/* =====================
|
|
322
|
+
* Klass hooks
|
|
323
|
+
* ===================== */
|
|
324
|
+
rootKlass = input('w-full', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
|
|
325
|
+
listKlass = input('flex gap-2 border-b border-border', ...(ngDevMode ? [{ debugName: "listKlass" }] : []));
|
|
326
|
+
panelKlass = input('pt-4', ...(ngDevMode ? [{ debugName: "panelKlass" }] : []));
|
|
327
|
+
/* =====================
|
|
328
|
+
* State
|
|
329
|
+
* ===================== */
|
|
330
|
+
_value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : []));
|
|
331
|
+
activeValue = this._value.asReadonly();
|
|
332
|
+
constructor() {
|
|
333
|
+
effect(() => {
|
|
334
|
+
const controlled = this.value();
|
|
335
|
+
if (controlled !== null) {
|
|
336
|
+
this._value.set(controlled);
|
|
337
|
+
}
|
|
338
|
+
else if (this._value() === null) {
|
|
339
|
+
this._value.set(this.defaultValue());
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
setValue(v) {
|
|
344
|
+
this._value.set(v);
|
|
345
|
+
this.valueChange.emit(v);
|
|
346
|
+
}
|
|
347
|
+
isActive(v) {
|
|
348
|
+
return this.activeValue() === v;
|
|
349
|
+
}
|
|
350
|
+
orientationAttr = computed(() => this.orientation() === 'vertical' ? 'vertical' : 'horizontal', ...(ngDevMode ? [{ debugName: "orientationAttr" }] : []));
|
|
351
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
352
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTabs, isStandalone: true, selector: "tng-tabs", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, listKlass: { classPropertyName: "listKlass", publicName: "listKlass", isSignal: true, isRequired: false, transformFunction: null }, panelKlass: { classPropertyName: "panelKlass", publicName: "panelKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n" });
|
|
353
|
+
}
|
|
354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabs, decorators: [{
|
|
355
|
+
type: Component,
|
|
356
|
+
args: [{ selector: 'tng-tabs', standalone: true, template: "<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n" }]
|
|
357
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], listKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "listKlass", required: false }] }], panelKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelKlass", required: false }] }] } });
|
|
358
|
+
|
|
359
|
+
class TngTab {
|
|
360
|
+
tabs = inject(TngTabs);
|
|
361
|
+
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
362
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
|
|
363
|
+
tabKlass = input('px-3 py-2 text-sm font-medium border-b-2 border-transparent', ...(ngDevMode ? [{ debugName: "tabKlass" }] : []));
|
|
364
|
+
activeKlass = input('border-primary text-primary', ...(ngDevMode ? [{ debugName: "activeKlass" }] : []));
|
|
365
|
+
inactiveKlass = input('text-muted-foreground', ...(ngDevMode ? [{ debugName: "inactiveKlass" }] : []));
|
|
366
|
+
disabledKlass = input('opacity-50 cursor-not-allowed', ...(ngDevMode ? [{ debugName: "disabledKlass" }] : []));
|
|
367
|
+
role = 'tab';
|
|
368
|
+
get selected() {
|
|
369
|
+
return this.tabs.isActive(this.value());
|
|
370
|
+
}
|
|
371
|
+
get tabindex() {
|
|
372
|
+
return this.tabs.isActive(this.value()) ? 0 : -1;
|
|
373
|
+
}
|
|
374
|
+
get klass() {
|
|
375
|
+
if (this.disabled())
|
|
376
|
+
return `${this.tabKlass()} ${this.disabledKlass()}`;
|
|
377
|
+
return this.tabs.isActive(this.value())
|
|
378
|
+
? `${this.tabKlass()} ${this.activeKlass()}`
|
|
379
|
+
: `${this.tabKlass()} ${this.inactiveKlass()}`;
|
|
380
|
+
}
|
|
381
|
+
onClick() {
|
|
382
|
+
if (!this.disabled()) {
|
|
383
|
+
this.tabs.setValue(this.value());
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTab, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
387
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTab, isStandalone: true, selector: "tng-tab", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tabKlass: { classPropertyName: "tabKlass", publicName: "tabKlass", isSignal: true, isRequired: false, transformFunction: null }, activeKlass: { classPropertyName: "activeKlass", publicName: "activeKlass", isSignal: true, isRequired: false, transformFunction: null }, inactiveKlass: { classPropertyName: "inactiveKlass", publicName: "inactiveKlass", isSignal: true, isRequired: false, transformFunction: null }, disabledKlass: { classPropertyName: "disabledKlass", publicName: "disabledKlass", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" }, properties: { "attr.role": "this.role", "attr.aria-selected": "this.selected", "attr.tabindex": "this.tabindex", "class": "this.klass" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
|
|
388
|
+
}
|
|
389
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTab, decorators: [{
|
|
390
|
+
type: Component,
|
|
391
|
+
args: [{
|
|
392
|
+
selector: 'tng-tab',
|
|
393
|
+
standalone: true,
|
|
394
|
+
template: `<ng-content />`,
|
|
395
|
+
}]
|
|
396
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], tabKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabKlass", required: false }] }], activeKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeKlass", required: false }] }], inactiveKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "inactiveKlass", required: false }] }], disabledKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledKlass", required: false }] }], role: [{
|
|
397
|
+
type: HostBinding,
|
|
398
|
+
args: ['attr.role']
|
|
399
|
+
}], selected: [{
|
|
400
|
+
type: HostBinding,
|
|
401
|
+
args: ['attr.aria-selected']
|
|
402
|
+
}], tabindex: [{
|
|
403
|
+
type: HostBinding,
|
|
404
|
+
args: ['attr.tabindex']
|
|
405
|
+
}], klass: [{
|
|
406
|
+
type: HostBinding,
|
|
407
|
+
args: ['class']
|
|
408
|
+
}], onClick: [{
|
|
409
|
+
type: HostListener,
|
|
410
|
+
args: ['click']
|
|
411
|
+
}] } });
|
|
412
|
+
|
|
413
|
+
class TngTabPanel {
|
|
414
|
+
tabs = inject(TngTabs);
|
|
415
|
+
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
416
|
+
role = 'tabpanel';
|
|
417
|
+
get hidden() {
|
|
418
|
+
return !this.tabs.isActive(this.value());
|
|
419
|
+
}
|
|
420
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
421
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTabPanel, isStandalone: true, selector: "tng-tab-panel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "attr.role": "this.role", "hidden": "this.hidden" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
|
|
422
|
+
}
|
|
423
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabPanel, decorators: [{
|
|
424
|
+
type: Component,
|
|
425
|
+
args: [{
|
|
426
|
+
selector: 'tng-tab-panel',
|
|
427
|
+
standalone: true,
|
|
428
|
+
template: `<ng-content />`,
|
|
429
|
+
}]
|
|
430
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], role: [{
|
|
431
|
+
type: HostBinding,
|
|
432
|
+
args: ['attr.role']
|
|
433
|
+
}], hidden: [{
|
|
434
|
+
type: HostBinding,
|
|
435
|
+
args: ['hidden']
|
|
436
|
+
}] } });
|
|
18
437
|
|
|
19
438
|
/**
|
|
20
439
|
* Generated bundle index. Do not edit.
|
|
21
440
|
*/
|
|
441
|
+
|
|
442
|
+
export { TngAccordion, TngCard, TngDivider, TngExpansionIconClose, TngExpansionIconOpen, TngExpansionPanel, TngTab, TngTabPanel, TngTabs };
|
|
22
443
|
//# sourceMappingURL=tociva-tailng-ui-layout.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tociva-tailng-ui-layout.mjs","sources":["../../../../libs/ui/layout/src/public-api.ts","../../../../libs/ui/layout/src/tociva-tailng-ui-layout.ts"],"sourcesContent":["export * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,EAAA,OAAA,CAAA;;ACAA;;AAEG"}
|
|
1
|
+
{"version":3,"file":"tociva-tailng-ui-layout.mjs","sources":["../../../../libs/ui/layout/src/lib/expansion-panel/expansion-panel.component.ts","../../../../libs/ui/layout/src/lib/expansion-panel/expansion-panel.component.html","../../../../libs/ui/layout/src/lib/accordion/accordion.component.ts","../../../../libs/ui/layout/src/lib/accordion/accordion.component.html","../../../../libs/ui/layout/src/lib/card/card.component.ts","../../../../libs/ui/layout/src/lib/card/card.component.html","../../../../libs/ui/layout/src/lib/divider/divider.component.ts","../../../../libs/ui/layout/src/lib/divider/divider.component.html","../../../../libs/ui/layout/src/lib/tabs/tabs.component.ts","../../../../libs/ui/layout/src/lib/tabs/tabs.component.html","../../../../libs/ui/layout/src/lib/tabs/tab.component.ts","../../../../libs/ui/layout/src/lib/tabs/tab-panel.component.ts","../../../../libs/ui/layout/src/tociva-tailng-ui-layout.ts"],"sourcesContent":["import {\n Component,\n Directive,\n computed,\n contentChild,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\n/**\n * OPEN-state icon marker.\n * Consumer must import this directive where the icon is used.\n */\n@Directive({\n selector: '[tngExpansionIconOpen]',\n standalone: true,\n})\nexport class TngExpansionIconOpen {}\n\n/**\n * CLOSE-state icon marker.\n * Consumer must import this directive where the icon is used.\n */\n@Directive({\n selector: '[tngExpansionIconClose]',\n standalone: true,\n})\nexport class TngExpansionIconClose {}\n\n@Component({\n selector: 'tng-expansion-panel',\n standalone: true,\n templateUrl: './expansion-panel.component.html',\n})\nexport class TngExpansionPanel {\n /* =====================\n * Inputs\n * ===================== */\n\n open = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n padded = input(true, { transform: booleanAttribute });\n\n /* =====================\n * Outputs\n * ===================== */\n\n openChange = output<boolean>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('rounded-lg border border-border bg-bg');\n\n headerKlass = input<string>(\n 'flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ' +\n 'disabled:cursor-not-allowed disabled:opacity-60'\n );\n\n titleKlass = input<string>('flex-1');\n\n iconWrapperKlass = input<string>(\n 'ml-2 shrink-0 inline-flex items-center justify-center'\n );\n\n chevronKlass = input<string>(\n 'h-4 w-4 shrink-0 transition-transform duration-200'\n );\n\n contentOuterKlass = input<string>(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out'\n );\n\n contentClipKlass = input<string>('overflow-hidden');\n contentBodyKlass = input<string>('text-sm text-muted-foreground');\n contentPaddingKlass = input<string>('px-4 pb-4 pt-2');\n\n /* =====================\n * Slots (state icons only)\n * ===================== */\n\n readonly iconOpen = contentChild(TngExpansionIconOpen);\n readonly iconClose = contentChild(TngExpansionIconClose);\n \n readonly hasOpenIcon = computed(() => !!this.iconOpen());\n readonly hasCloseIcon = computed(() => !!this.iconClose());\n readonly hasAnyCustomIcon = computed(() => this.hasOpenIcon() || this.hasCloseIcon());\n \n // Stable rendering flags (avoid ng-content inside @if)\n readonly showOpenIcon = computed(() => {\n if (!this.hasAnyCustomIcon()) return false;\n if (this.hasOpenIcon() && this.hasCloseIcon()) return this.isOpen();\n if (this.hasOpenIcon()) return true; // only open provided -> use for both states\n return false;\n });\n \n readonly showCloseIcon = computed(() => {\n if (!this.hasAnyCustomIcon()) return false;\n if (this.hasOpenIcon() && this.hasCloseIcon()) return !this.isOpen();\n if (this.hasCloseIcon()) return true; // only close provided -> use for both states\n return false;\n });\n \n\n /* =====================\n * State\n * ===================== */\n\n private readonly _isOpen = signal(false);\n readonly isOpen = this._isOpen.asReadonly();\n\n constructor() {\n effect(() => {\n this._isOpen.set(this.open());\n });\n }\n\n toggle(): void {\n if (this.disabled()) return;\n const next = !this._isOpen();\n this._isOpen.set(next);\n this.openChange.emit(next);\n }\n\n /* =====================\n * Computed\n * ===================== */\n\n readonly contentRowsKlass = computed(() =>\n this.isOpen() ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n );\n\n readonly chevronRotateKlass = computed(() => (this.isOpen() ? 'rotate-180' : ''));\n\n /* =====================\n * Final Klass (defaults + user overrides)\n * ===================== */\n\n readonly finalRootKlass = computed(() =>\n this.join('rounded-lg border border-border bg-bg', this.rootKlass()),\n );\n\n readonly finalHeaderKlass = computed(() =>\n this.join(\n 'flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary',\n 'disabled:cursor-not-allowed disabled:opacity-60',\n this.headerKlass(),\n ),\n );\n\n readonly finalTitleKlass = computed(() => this.join('flex-1', this.titleKlass()));\n\n readonly finalIconWrapperKlass = computed(() =>\n this.join('ml-2 shrink-0 inline-flex items-center justify-center', this.iconWrapperKlass()),\n );\n\n readonly finalChevronKlass = computed(() =>\n this.join('h-4 w-4 shrink-0 transition-transform duration-200', this.chevronKlass()),\n );\n\n readonly finalContentOuterKlass = computed(() =>\n this.join(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n this.contentOuterKlass(),\n ),\n );\n\n readonly finalContentClipKlass = computed(() =>\n this.join('overflow-hidden', this.contentClipKlass()),\n );\n\n readonly finalContentBodyKlass = computed(() => {\n const pad = this.padded() ? this.contentPaddingKlass() : '';\n return this.join('text-sm text-muted-foreground', pad, this.contentBodyKlass());\n });\n\n private join(...parts: Array<string | null | undefined>): string {\n return parts\n .map((p) => (p ?? '').trim())\n .filter(Boolean)\n .join(' ');\n }\n}\n","<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import {\n booleanAttribute,\n Component,\n contentChildren,\n effect,\n input,\n output\n} from '@angular/core';\nimport { TngExpansionPanel } from '../expansion-panel/expansion-panel.component';\n\n@Component({\n selector: 'tng-accordion',\n standalone: true,\n templateUrl: './accordion.component.html',\n})\nexport class TngAccordion {\n /* =====================\n * Inputs\n * ===================== */\n\n /** Allow multiple panels to be open at once */\n multiple = input(false, { transform: booleanAttribute });\n\n /**\n * If false: prevents closing the last open panel (at least one stays open)\n * If true: all can be collapsed\n */\n collapsible = input(true, { transform: booleanAttribute });\n\n /** If true: when all panels are closed, open the first panel automatically */\n autoOpenFirst = input(false, { transform: booleanAttribute });\n\n /* =====================\n * Outputs\n * ===================== */\n\n /** Emits current open indexes when changes happen */\n openIndexesChange = output<number[]>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('w-full');\n stackKlass = input<string>('space-y-2');\n\n /* =====================\n * Children\n * ===================== */\n\n // All projected expansion panels (descendants enabled so nested layouts still work)\n readonly panels = contentChildren(TngExpansionPanel, { descendants: true });\n\n\n constructor() {\n effect((onCleanup) => {\n const panels = this.panels();\n\n // Subscribe to openChange from each panel\n const subs = panels.map((p) =>\n p.openChange.subscribe((nextOpen) => {\n this.onPanelToggled(p, nextOpen);\n })\n );\n\n // Emit initial state + optionally auto open first\n this.emitOpenIndexes();\n if (this.autoOpenFirst() && this.getOpenPanels().length === 0 && panels.length > 0) {\n // open first panel\n if (!panels[0].isOpen()) panels[0].toggle();\n }\n\n onCleanup(() => subs.forEach((s) => s.unsubscribe()));\n });\n }\n\n private onPanelToggled(panel: TngExpansionPanel, nextOpen: boolean): void {\n const panels = this.panels();\n\n // If a panel just opened and multiple is false, close all others.\n if (nextOpen && !this.multiple()) {\n for (const p of panels) {\n if (p !== panel && p.isOpen()) {\n p.toggle();\n }\n }\n }\n\n // If a panel just closed and collapsible is false, ensure at least one stays open.\n if (!nextOpen && !this.collapsible()) {\n // After close, if none are open, reopen this one.\n if (this.getOpenPanels().length === 0) {\n // Reopen the same panel (guard against disabled)\n if (!panel.disabled()) {\n panel.toggle();\n return; // the toggle will trigger emit later\n }\n }\n }\n\n this.emitOpenIndexes();\n }\n\n private getOpenPanels(): TngExpansionPanel[] {\n return this.panels().filter((p) => p.isOpen());\n }\n\n private emitOpenIndexes(): void {\n const panels = this.panels();\n const openIndexes = panels\n .map((p, i) => (p.isOpen() ? i : -1))\n .filter((i) => i >= 0);\n\n this.openIndexesChange.emit(openIndexes);\n }\n}\n","<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { Component, computed, contentChild, input } from '@angular/core';\n\n@Component({\n selector: 'tng-card',\n standalone: true,\n templateUrl: './card.component.html',\n})\nexport class TngCard {\n /* =====================\n * Klass hooks\n * ===================== */\n rootKlass = input<string>('');\n headerKlass = input<string>('');\n contentKlass = input<string>('');\n footerKlass = input<string>('');\n klass = input<string>('');\n\n // Presence checks only (no `read` needed)\n private headerMarker = contentChild('[tngCardHeader]');\n private footerMarker = contentChild('[tngCardFooter]');\n\n readonly hasHeader = computed(() => !!this.headerMarker());\n readonly hasFooter = computed(() => !!this.footerMarker());\n\n readonly rootClasses = computed(() =>\n (\n 'block rounded-lg border border-border bg-bg text-fg shadow-sm ' +\n this.rootKlass() +\n ' ' +\n this.klass()\n ).trim()\n );\n\n readonly headerClasses = computed(() =>\n ('border-b border-border px-4 py-3 ' + this.headerKlass()).trim()\n );\n\n readonly contentClasses = computed(() =>\n ('px-4 py-4 ' + this.contentKlass()).trim()\n );\n\n readonly footerClasses = computed(() =>\n ('border-t border-border px-4 py-3 ' + this.footerKlass()).trim()\n );\n}\n","<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\nexport type TngDividerOrientation = 'horizontal' | 'vertical';\nexport type TngDividerAlign = 'start' | 'center' | 'end';\n\n@Component({\n selector: 'tng-divider',\n standalone: true,\n templateUrl: './divider.component.html',\n})\nexport class TngDivider {\n orientation = input<TngDividerOrientation>('horizontal');\n label = input<string>('');\n align = input<TngDividerAlign>('center');\n dashed = input(false, { transform: booleanAttribute });\n\n /* klass hooks */\n rootKlass = input<string>('');\n\n /** Must include border color: border-border or border-slate-300 */\n lineKlass = input<string>('border-border');\n\n labelKlass = input<string>('text-xs text-fg/70');\n gapKlass = input<string>('my-4');\n thicknessKlass = input<string>('border-t');\n\n /** NEW: vertical height that does NOT depend on parent height */\n verticalHeightKlass = input<string>('h-6');\n\n readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n readonly rootClasses = computed(() => {\n if (this.isVertical()) {\n // no h-full dependency anymore\n return (`inline-flex shrink-0 items-stretch ${this.rootKlass()}`).trim();\n }\n return (`flex w-full items-center ${this.gapKlass()} ${this.rootKlass()}`).trim();\n });\n\n readonly lineClasses = computed(() => {\n const style = this.dashed() ? 'border-dashed' : 'border-solid';\n\n if (this.isVertical()) {\n // Always visible: w-px + explicit height\n return (\n `w-px ${this.verticalHeightKlass()} self-stretch shrink-0 ` +\n `border-l ${style} ${this.lineKlass()}`\n ).trim();\n }\n\n return (`${this.thicknessKlass()} ${style} ${this.lineKlass()}`).trim();\n });\n\n readonly leftGrow = computed(() => {\n const a = this.align();\n if (a === 'start') return 'grow-0 w-6';\n if (a === 'end') return 'grow';\n return 'grow';\n });\n\n readonly rightGrow = computed(() => {\n const a = this.align();\n if (a === 'start') return 'grow';\n if (a === 'end') return 'grow-0 w-6';\n return 'grow';\n });\n\n readonly labelClasses = computed(\n () => (`px-3 whitespace-nowrap ${this.labelKlass()}`).trim()\n );\n}\n","<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\n@Component({\n selector: 'tng-tabs',\n standalone: true,\n templateUrl: './tabs.component.html',\n})\nexport class TngTabs {\n /* =====================\n * Inputs\n * ===================== */\n\n /** Controlled value */\n value = input<string | null>(null);\n\n /** Default value (uncontrolled init) */\n defaultValue = input<string | null>(null);\n\n /** Orientation */\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /* =====================\n * Outputs\n * ===================== */\n\n valueChange = output<string>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('w-full');\n listKlass = input<string>('flex gap-2 border-b border-border');\n panelKlass = input<string>('pt-4');\n\n /* =====================\n * State\n * ===================== */\n\n private readonly _value = signal<string | null>(null);\n readonly activeValue = this._value.asReadonly();\n\n constructor() {\n effect(() => {\n const controlled = this.value();\n if (controlled !== null) {\n this._value.set(controlled);\n } else if (this._value() === null) {\n this._value.set(this.defaultValue());\n }\n });\n }\n\n setValue(v: string) {\n this._value.set(v);\n this.valueChange.emit(v);\n }\n\n isActive(v: string) {\n return this.activeValue() === v;\n }\n\n readonly orientationAttr = computed(() =>\n this.orientation() === 'vertical' ? 'vertical' : 'horizontal'\n );\n}\n","<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n","import {\n Component,\n HostBinding,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\nimport { TngTabs } from './tabs.component';\n\n@Component({\n selector: 'tng-tab',\n standalone: true,\n template: `<ng-content />`,\n})\nexport class TngTab {\n private readonly tabs = inject(TngTabs);\n\n value = input.required<string>();\n disabled = input(false, { transform: booleanAttribute });\n\n tabKlass = input<string>(\n 'px-3 py-2 text-sm font-medium border-b-2 border-transparent'\n );\n activeKlass = input<string>('border-primary text-primary');\n inactiveKlass = input<string>('text-muted-foreground');\n disabledKlass = input<string>('opacity-50 cursor-not-allowed');\n\n @HostBinding('attr.role') role = 'tab';\n\n @HostBinding('attr.aria-selected')\n get selected() {\n return this.tabs.isActive(this.value());\n }\n\n @HostBinding('attr.tabindex')\n get tabindex() {\n return this.tabs.isActive(this.value()) ? 0 : -1;\n }\n\n @HostBinding('class')\n get klass() {\n if (this.disabled()) return `${this.tabKlass()} ${this.disabledKlass()}`;\n return this.tabs.isActive(this.value())\n ? `${this.tabKlass()} ${this.activeKlass()}`\n : `${this.tabKlass()} ${this.inactiveKlass()}`;\n }\n\n @HostListener('click')\n onClick() {\n if (!this.disabled()) {\n this.tabs.setValue(this.value());\n }\n }\n}\n","import { Component, HostBinding, inject, input } from '@angular/core';\nimport { TngTabs } from './tabs.component';\n\n@Component({\n selector: 'tng-tab-panel',\n standalone: true,\n template: `<ng-content />`,\n})\nexport class TngTabPanel {\n private readonly tabs = inject(TngTabs);\n\n value = input.required<string>();\n\n @HostBinding('attr.role') role = 'tabpanel';\n\n @HostBinding('hidden')\n get hidden() {\n return !this.tabs.isActive(this.value());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|