ng-hub-ui-board 19.2.1 → 19.3.1
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/.npmignore +2 -0
- package/README.md +1 -1
- package/fesm2022/ng-hub-ui-board.mjs +153 -99
- package/fesm2022/ng-hub-ui-board.mjs.map +1 -1
- package/index.d.ts +392 -3
- package/ng-hub-ui-board-19.3.1.tgz +0 -0
- package/package.json +64 -21
- package/lib/board.module.d.ts +0 -38
- package/lib/components/board/board.component.d.ts +0 -57
- package/lib/directives/board-column-footer.directive.d.ts +0 -33
- package/lib/directives/board-column-header.directive.d.ts +0 -31
- package/lib/directives/card-template.directive.d.ts +0 -30
- package/lib/models/board-card.d.ts +0 -42
- package/lib/models/board-column.d.ts +0 -58
- package/lib/models/board.d.ts +0 -34
- package/lib/models/reached-end-event.d.ts +0 -8
- package/lib/pipes/invert-color.pipe.d.ts +0 -7
- package/ng-hub-ui-board-19.2.1.tgz +0 -0
- package/public-api.d.ts +0 -10
- package/src/lib/styles/base.scss +0 -206
package/.npmignore
ADDED
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
This component is part of the ng-hub-ui ecosystem, which includes:
|
|
8
8
|
|
|
9
|
-
- [ng-hub-ui-
|
|
9
|
+
- [ng-hub-ui-paginable](https://www.npmjs.com/package/ng-hub-ui-paginable)
|
|
10
10
|
- [ng-hub-ui-modal](https://www.npmjs.com/package/ng-hub-ui-modal)
|
|
11
11
|
- [ng-hub-ui-stepper](https://www.npmjs.com/package/ng-hub-ui-stepper)
|
|
12
12
|
- [ng-hub-ui-breadcrumbs](https://www.npmjs.com/package/ng-hub-ui-breadcrumbs)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Directive, input, computed, contentChild, TemplateRef,
|
|
2
|
+
import { Directive, input, computed, contentChild, TemplateRef, output, Component, NgModule, Pipe } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/cdk/drag-drop';
|
|
4
4
|
import { moveItemInArray, transferArrayItem, DragDropModule } from '@angular/cdk/drag-drop';
|
|
5
5
|
import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
@@ -11,6 +11,8 @@ import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
|
11
11
|
* perfect for displaying summary information, quick actions, statistics,
|
|
12
12
|
* or any column-specific controls at the bottom of each column.
|
|
13
13
|
*
|
|
14
|
+
* @publicApi
|
|
15
|
+
*
|
|
14
16
|
* @example
|
|
15
17
|
* ```html
|
|
16
18
|
* <ng-template columnFooterTpt let-column="column">
|
|
@@ -25,6 +27,7 @@ import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
|
25
27
|
* ```
|
|
26
28
|
*/
|
|
27
29
|
class BoardColumnFooterDirective {
|
|
30
|
+
templateRef;
|
|
28
31
|
/**
|
|
29
32
|
* Creates a new BoardColumnFooterDirective instance.
|
|
30
33
|
*
|
|
@@ -33,10 +36,10 @@ class BoardColumnFooterDirective {
|
|
|
33
36
|
constructor(templateRef) {
|
|
34
37
|
this.templateRef = templateRef;
|
|
35
38
|
}
|
|
36
|
-
static
|
|
37
|
-
static
|
|
39
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardColumnFooterDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
40
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.3", type: BoardColumnFooterDirective, isStandalone: true, selector: "[columnFooterTpt]", ngImport: i0 });
|
|
38
41
|
}
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardColumnFooterDirective, decorators: [{
|
|
40
43
|
type: Directive,
|
|
41
44
|
args: [{
|
|
42
45
|
selector: '[columnFooterTpt]',
|
|
@@ -51,6 +54,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
51
54
|
* giving developers full control over the appearance and functionality of column headers
|
|
52
55
|
* including titles, descriptions, actions, and metadata display.
|
|
53
56
|
*
|
|
57
|
+
* @publicApi
|
|
58
|
+
*
|
|
54
59
|
* @example
|
|
55
60
|
* ```html
|
|
56
61
|
* <ng-template columnHeaderTpt let-column="column">
|
|
@@ -63,6 +68,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
63
68
|
* ```
|
|
64
69
|
*/
|
|
65
70
|
class BoardColumnHeaderDirective {
|
|
71
|
+
templateRef;
|
|
66
72
|
/**
|
|
67
73
|
* Creates a new BoardColumnHeaderDirective instance.
|
|
68
74
|
*
|
|
@@ -71,10 +77,10 @@ class BoardColumnHeaderDirective {
|
|
|
71
77
|
constructor(templateRef) {
|
|
72
78
|
this.templateRef = templateRef;
|
|
73
79
|
}
|
|
74
|
-
static
|
|
75
|
-
static
|
|
80
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardColumnHeaderDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
81
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.3", type: BoardColumnHeaderDirective, isStandalone: true, selector: "[columnHeaderTpt]", ngImport: i0 });
|
|
76
82
|
}
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
83
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardColumnHeaderDirective, decorators: [{
|
|
78
84
|
type: Directive,
|
|
79
85
|
args: [{
|
|
80
86
|
selector: '[columnHeaderTpt]',
|
|
@@ -89,6 +95,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
89
95
|
* It provides access to the template reference that can be used by the board component
|
|
90
96
|
* to render cards with custom layouts and styling.
|
|
91
97
|
*
|
|
98
|
+
* @publicApi
|
|
99
|
+
*
|
|
92
100
|
* @example
|
|
93
101
|
* ```html
|
|
94
102
|
* <ng-template cardTpt let-card="item" let-column="column">
|
|
@@ -100,6 +108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
100
108
|
* ```
|
|
101
109
|
*/
|
|
102
110
|
class CardTemplateDirective {
|
|
111
|
+
templateRef;
|
|
103
112
|
/**
|
|
104
113
|
* Creates a new CardTemplateDirective instance.
|
|
105
114
|
*
|
|
@@ -108,10 +117,10 @@ class CardTemplateDirective {
|
|
|
108
117
|
constructor(templateRef) {
|
|
109
118
|
this.templateRef = templateRef;
|
|
110
119
|
}
|
|
111
|
-
static
|
|
112
|
-
static
|
|
120
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: CardTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
121
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.3", type: CardTemplateDirective, isStandalone: true, selector: "[cardTpt]", ngImport: i0 });
|
|
113
122
|
}
|
|
114
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: CardTemplateDirective, decorators: [{
|
|
115
124
|
type: Directive,
|
|
116
125
|
args: [{
|
|
117
126
|
selector: '[cardTpt]',
|
|
@@ -119,69 +128,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
119
128
|
}]
|
|
120
129
|
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
121
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Standalone Kanban-style board component that provides column-based drag-and-drop,
|
|
133
|
+
* custom templates and infinite-scroll detection.
|
|
134
|
+
*
|
|
135
|
+
* @publicApi
|
|
136
|
+
*/
|
|
122
137
|
class HubBoardComponent {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Reactive input containing the full board definition (columns and cards).
|
|
140
|
+
*/
|
|
141
|
+
board = input(...(ngDevMode ? [undefined, { debugName: "board" }] : []));
|
|
142
|
+
/**
|
|
143
|
+
* Pixel threshold used when determining whether a column has reached scroll end.
|
|
144
|
+
* Allows for fractional scroll values across different browsers.
|
|
145
|
+
*/
|
|
146
|
+
scrollDetectionPadding = 1;
|
|
147
|
+
/**
|
|
148
|
+
* Derived list of board columns exposed as a signal to the template.
|
|
149
|
+
*/
|
|
150
|
+
columns = computed(() => {
|
|
151
|
+
return this.board()?.columns ?? [];
|
|
152
|
+
}, ...(ngDevMode ? [{ debugName: "columns" }] : []));
|
|
153
|
+
/**
|
|
154
|
+
* When true, column reordering via drag-and-drop is disabled.
|
|
155
|
+
*/
|
|
156
|
+
columnSortingDisabled = input(false, ...(ngDevMode ? [{ debugName: "columnSortingDisabled" }] : []));
|
|
157
|
+
/**
|
|
158
|
+
* Custom card template supplied via the `cardTpt` structural directive.
|
|
159
|
+
*/
|
|
160
|
+
cardTpt = contentChild(CardTemplateDirective, ...(ngDevMode ? [{ debugName: "cardTpt", read: (TemplateRef) }] : [{
|
|
132
161
|
read: (TemplateRef)
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
|
|
162
|
+
}]));
|
|
163
|
+
/**
|
|
164
|
+
* Custom column header template supplied via the `columnHeaderTpt` structural directive.
|
|
165
|
+
*/
|
|
166
|
+
columnHeaderTpt = contentChild(BoardColumnHeaderDirective, ...(ngDevMode ? [{ debugName: "columnHeaderTpt", read: (TemplateRef) }] : [{
|
|
136
167
|
read: (TemplateRef)
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
|
|
168
|
+
}]));
|
|
169
|
+
/**
|
|
170
|
+
* Custom column footer template supplied via the `columnFooterTpt` structural directive.
|
|
171
|
+
*/
|
|
172
|
+
columnFooterTpt = contentChild(BoardColumnFooterDirective, ...(ngDevMode ? [{ debugName: "columnFooterTpt", read: (TemplateRef) }] : [{
|
|
140
173
|
read: (TemplateRef)
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Default predicate function that allows all drag and drop operations.
|
|
152
|
-
* This function is used when no custom predicate is provided for a column.
|
|
153
|
-
*
|
|
154
|
-
* @returns Always returns true, allowing any card to be dropped in any column
|
|
155
|
-
*/
|
|
156
|
-
this.defaultEnterPredicateFn = () => true;
|
|
157
|
-
}
|
|
174
|
+
}]));
|
|
175
|
+
/**
|
|
176
|
+
* Emits each time a card is clicked within the board.
|
|
177
|
+
*/
|
|
178
|
+
onCardClick = output();
|
|
179
|
+
/**
|
|
180
|
+
* Emits when a card has been repositioned, either within the same column or into another column.
|
|
181
|
+
*/
|
|
182
|
+
onCardMoved = output();
|
|
158
183
|
/**
|
|
159
|
-
*
|
|
160
|
-
|
|
184
|
+
* Emits when columns are reordered through drag-and-drop.
|
|
185
|
+
*/
|
|
186
|
+
onColumnMoved = output();
|
|
187
|
+
/**
|
|
188
|
+
* Emits when a column body is scrolled to its end, enabling infinite-scroll behaviour.
|
|
189
|
+
*/
|
|
190
|
+
reachedEnd = output();
|
|
191
|
+
/**
|
|
192
|
+
* Default predicate that allows any card to be dropped into any column.
|
|
161
193
|
*
|
|
162
|
-
* @
|
|
194
|
+
* @returns Always `true`, indicating that drop operations are permitted.
|
|
195
|
+
*/
|
|
196
|
+
defaultEnterPredicateFn = () => true;
|
|
197
|
+
/**
|
|
198
|
+
* Emits the clicked card through {@link onCardClick}.
|
|
199
|
+
*
|
|
200
|
+
* @param item - The card that triggered the click event.
|
|
163
201
|
*/
|
|
164
202
|
cardClick(item) {
|
|
165
|
-
this.onCardClick.
|
|
203
|
+
this.onCardClick.emit(item);
|
|
166
204
|
}
|
|
167
205
|
/**
|
|
168
|
-
*
|
|
169
|
-
* This method updates the column positions in the array and emits a column moved event.
|
|
206
|
+
* Updates column order when a drag-and-drop operation completes and emits the resulting event.
|
|
170
207
|
*
|
|
171
|
-
* @param event -
|
|
208
|
+
* @param event - Drag-and-drop metadata describing the column movement.
|
|
172
209
|
*/
|
|
173
210
|
dropColumn(event) {
|
|
174
211
|
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
|
|
175
212
|
this.onColumnMoved.emit(event);
|
|
176
213
|
}
|
|
177
214
|
/**
|
|
178
|
-
*
|
|
179
|
-
*
|
|
215
|
+
* Applies card reordering or transfer logic depending on the drag-drop target,
|
|
216
|
+
* then emits the corresponding drag event metadata.
|
|
180
217
|
*
|
|
181
|
-
* @param event -
|
|
218
|
+
* @param event - Drag-and-drop metadata describing the card movement.
|
|
182
219
|
*/
|
|
183
220
|
dropCard(event) {
|
|
184
|
-
// Check if the card was moved within the same column
|
|
185
221
|
if (event.previousContainer === event.container) {
|
|
186
222
|
// Reorder the card within the same column
|
|
187
223
|
moveItemInArray(event.container.data.cards, event.previousIndex, event.currentIndex);
|
|
@@ -193,38 +229,36 @@ class HubBoardComponent {
|
|
|
193
229
|
this.onCardMoved.emit(event);
|
|
194
230
|
}
|
|
195
231
|
/**
|
|
196
|
-
*
|
|
197
|
-
* This is useful for implementing lazy loading or infinite scroll functionality.
|
|
232
|
+
* Emits {@link reachedEnd} once a column body is scrolled to its bottom.
|
|
198
233
|
*
|
|
199
|
-
* @param index -
|
|
200
|
-
* @param event -
|
|
234
|
+
* @param index - Index of the scrolled column within the board.
|
|
235
|
+
* @param event - Browser scroll event originating from the column body element.
|
|
201
236
|
*/
|
|
202
237
|
onScroll(index, event) {
|
|
203
238
|
const el = event.target;
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
239
|
+
if (!el) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const scrolledToBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - this.scrollDetectionPadding;
|
|
243
|
+
if (!scrolledToBottom) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const column = this.board()?.columns?.[index];
|
|
247
|
+
if (!column) {
|
|
248
|
+
return;
|
|
211
249
|
}
|
|
250
|
+
this.reachedEnd.emit({
|
|
251
|
+
index,
|
|
252
|
+
data: column
|
|
253
|
+
});
|
|
212
254
|
}
|
|
213
|
-
static
|
|
214
|
-
static
|
|
255
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HubBoardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
256
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: HubBoardComponent, isStandalone: true, selector: "hub-board, hub-ui-board", inputs: { board: { classPropertyName: "board", publicName: "board", isSignal: true, isRequired: false, transformFunction: null }, columnSortingDisabled: { classPropertyName: "columnSortingDisabled", publicName: "columnSortingDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCardClick: "onCardClick", onCardMoved: "onCardMoved", onColumnMoved: "onColumnMoved", reachedEnd: "reachedEnd" }, queries: [{ propertyName: "cardTpt", first: true, predicate: CardTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "columnHeaderTpt", first: true, predicate: BoardColumnHeaderDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "columnFooterTpt", first: true, predicate: BoardColumnFooterDirective, descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "@if (columns().length) {\n\t<div\n\t\tclass=\"hub-board\"\n\t\tcdkDropList\n\t\tcdkDropListOrientation=\"horizontal\"\n\t\t[cdkDropListData]=\"columns()\"\n\t\t(cdkDropListDropped)=\"dropColumn($event)\"\n\t\t[cdkDropListSortingDisabled]=\"columnSortingDisabled()\"\n\t>\n\t\t<div cdkDropListGroup class=\"hub-board__columns\">\n\t\t\t@for (column of columns(); let index = $index; track column) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-board__column-container\"\n\t\t\t\t\tcdkDrag\n\t\t\t\t\t[cdkDragData]=\"column\"\n\t\t\t\t\t[cdkDragDisabled]=\"column.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-board__column\"\n\t\t\t\t\t\t[ngClass]=\"column.classlist\"\n\t\t\t\t\t\t[ngStyle]=\"column.style\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"hub-board__column-header\">\n\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\tcolumnHeaderTpt() || defaultColumnHeaderTpt\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ column: column }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-board__column-body\"\n\t\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t\t[cdkDropListData]=\"column\"\n\t\t\t\t\t\t\t(cdkDropListDropped)=\"dropCard($event)\"\n\t\t\t\t\t\t\t(scroll)=\"onScroll(index, $event)\"\n\t\t\t\t\t\t\t[cdkDropListEnterPredicate]=\"\n\t\t\t\t\t\t\t\tcolumn.predicate ?? defaultEnterPredicateFn\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t[cdkDropListSortingDisabled]=\"\n\t\t\t\t\t\t\t\tcolumn.cardSortingDisabled\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\t\tcard of column.cards;\n\t\t\t\t\t\t\t\tlet index = $index;\n\t\t\t\t\t\t\t\ttrack card\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"hub-board__card\"\n\t\t\t\t\t\t\t\t\t[class.hub-board__card--disabled]=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\t\t\t\t[cdkDragData]=\"card\"\n\t\t\t\t\t\t\t\t\t[cdkDragDisabled]=\"card.disabled\"\n\t\t\t\t\t\t\t\t\t(click)=\"cardClick(card)\"\n\t\t\t\t\t\t\t\t\t(mousedown)=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled &&\n\t\t\t\t\t\t\t\t\t\t\t$event.stopPropagation()\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngClass]=\"card.classlist\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"card.style\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"hub-board__card-body\">\n\t\t\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\t\t\tcardTpt() || defaultCardTpt\n\t\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\t\t\titem: card,\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn\n\t\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t@if (columnFooterTpt()) {\n\t\t\t\t\t\t\t<div class=\"hub-board__column-footer\">\n\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\tcolumnFooterTpt() ?? null\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\tcolumn: column\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n}\n\n<ng-template #defaultCardTpt let-item=\"item\">\n\t<h6>{{ item.title }}</h6>\n\t<p class=\"card-text\">{{ item.description }}</p>\n</ng-template>\n\n<ng-template #defaultColumnHeaderTpt let-column=\"column\">\n\t<div class=\"d-flex flex-column\">\n\t\t<h5 class=\"hub-board__column-header-title\">\n\t\t\t{{ column.title }}\n\t\t</h5>\n\t\t<h6 class=\"hub-board__column-header-subtitle\">\n\t\t\t{{ column.description }}\n\t\t</h6>\n\t</div>\n</ng-template>\n", styles: [":host{display:block;overflow:auto;width:100%;height:100%}.hub-board__column-body{min-height:128px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cards.cdk-drop-list-dragging .card:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] });
|
|
215
257
|
}
|
|
216
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
258
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HubBoardComponent, decorators: [{
|
|
217
259
|
type: Component,
|
|
218
260
|
args: [{ selector: 'hub-board, hub-ui-board', standalone: true, imports: [NgClass, NgStyle, NgTemplateOutlet, DragDropModule], template: "@if (columns().length) {\n\t<div\n\t\tclass=\"hub-board\"\n\t\tcdkDropList\n\t\tcdkDropListOrientation=\"horizontal\"\n\t\t[cdkDropListData]=\"columns()\"\n\t\t(cdkDropListDropped)=\"dropColumn($event)\"\n\t\t[cdkDropListSortingDisabled]=\"columnSortingDisabled()\"\n\t>\n\t\t<div cdkDropListGroup class=\"hub-board__columns\">\n\t\t\t@for (column of columns(); let index = $index; track column) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-board__column-container\"\n\t\t\t\t\tcdkDrag\n\t\t\t\t\t[cdkDragData]=\"column\"\n\t\t\t\t\t[cdkDragDisabled]=\"column.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-board__column\"\n\t\t\t\t\t\t[ngClass]=\"column.classlist\"\n\t\t\t\t\t\t[ngStyle]=\"column.style\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"hub-board__column-header\">\n\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\tcolumnHeaderTpt() || defaultColumnHeaderTpt\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ column: column }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-board__column-body\"\n\t\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t\t[cdkDropListData]=\"column\"\n\t\t\t\t\t\t\t(cdkDropListDropped)=\"dropCard($event)\"\n\t\t\t\t\t\t\t(scroll)=\"onScroll(index, $event)\"\n\t\t\t\t\t\t\t[cdkDropListEnterPredicate]=\"\n\t\t\t\t\t\t\t\tcolumn.predicate ?? defaultEnterPredicateFn\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t[cdkDropListSortingDisabled]=\"\n\t\t\t\t\t\t\t\tcolumn.cardSortingDisabled\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\t\tcard of column.cards;\n\t\t\t\t\t\t\t\tlet index = $index;\n\t\t\t\t\t\t\t\ttrack card\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"hub-board__card\"\n\t\t\t\t\t\t\t\t\t[class.hub-board__card--disabled]=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\t\t\t\t[cdkDragData]=\"card\"\n\t\t\t\t\t\t\t\t\t[cdkDragDisabled]=\"card.disabled\"\n\t\t\t\t\t\t\t\t\t(click)=\"cardClick(card)\"\n\t\t\t\t\t\t\t\t\t(mousedown)=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled &&\n\t\t\t\t\t\t\t\t\t\t\t$event.stopPropagation()\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngClass]=\"card.classlist\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"card.style\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"hub-board__card-body\">\n\t\t\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\t\t\tcardTpt() || defaultCardTpt\n\t\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\t\t\titem: card,\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn\n\t\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t@if (columnFooterTpt()) {\n\t\t\t\t\t\t\t<div class=\"hub-board__column-footer\">\n\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\tcolumnFooterTpt() ?? null\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\tcolumn: column\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n}\n\n<ng-template #defaultCardTpt let-item=\"item\">\n\t<h6>{{ item.title }}</h6>\n\t<p class=\"card-text\">{{ item.description }}</p>\n</ng-template>\n\n<ng-template #defaultColumnHeaderTpt let-column=\"column\">\n\t<div class=\"d-flex flex-column\">\n\t\t<h5 class=\"hub-board__column-header-title\">\n\t\t\t{{ column.title }}\n\t\t</h5>\n\t\t<h6 class=\"hub-board__column-header-subtitle\">\n\t\t\t{{ column.description }}\n\t\t</h6>\n\t</div>\n</ng-template>\n", styles: [":host{display:block;overflow:auto;width:100%;height:100%}.hub-board__column-body{min-height:128px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cards.cdk-drop-list-dragging .card:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
|
|
219
|
-
}]
|
|
220
|
-
type: Output
|
|
221
|
-
}], onCardMoved: [{
|
|
222
|
-
type: Output
|
|
223
|
-
}], onColumnMoved: [{
|
|
224
|
-
type: Output
|
|
225
|
-
}], reachedEnd: [{
|
|
226
|
-
type: Output
|
|
227
|
-
}] } });
|
|
261
|
+
}] });
|
|
228
262
|
|
|
229
263
|
/**
|
|
230
264
|
* Angular module that provides board functionality with drag-and-drop support.
|
|
@@ -233,6 +267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
233
267
|
* Kanban-style boards with customizable columns, cards, and templates.
|
|
234
268
|
*
|
|
235
269
|
* @deprecated Use standalone components instead. Import individual components and directives directly.
|
|
270
|
+
* @publicApi
|
|
236
271
|
*
|
|
237
272
|
* @example
|
|
238
273
|
* ```typescript
|
|
@@ -255,17 +290,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
255
290
|
* ```
|
|
256
291
|
*/
|
|
257
292
|
class BoardModule {
|
|
258
|
-
static
|
|
259
|
-
static
|
|
293
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
294
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.2.3", ngImport: i0, type: BoardModule, imports: [HubBoardComponent,
|
|
260
295
|
CardTemplateDirective,
|
|
261
296
|
BoardColumnHeaderDirective,
|
|
262
297
|
BoardColumnFooterDirective], exports: [HubBoardComponent,
|
|
263
298
|
CardTemplateDirective,
|
|
264
299
|
BoardColumnHeaderDirective,
|
|
265
|
-
BoardColumnFooterDirective] });
|
|
266
|
-
static
|
|
300
|
+
BoardColumnFooterDirective] });
|
|
301
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardModule, imports: [HubBoardComponent] });
|
|
267
302
|
}
|
|
268
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
303
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BoardModule, decorators: [{
|
|
269
304
|
type: NgModule,
|
|
270
305
|
args: [{
|
|
271
306
|
declarations: [],
|
|
@@ -284,39 +319,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
|
284
319
|
}]
|
|
285
320
|
}] });
|
|
286
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Converts a hexadecimal color string into its inverted counterpart, offering both
|
|
324
|
+
* high-contrast black/white and full-spectrum inversion modes.
|
|
325
|
+
*
|
|
326
|
+
* @publicApi
|
|
327
|
+
*/
|
|
287
328
|
class InvertColorPipe {
|
|
329
|
+
/**
|
|
330
|
+
* Inverts a HEX color value.
|
|
331
|
+
*
|
|
332
|
+
* @param hex - Color expressed as a 3- or 6-digit HEX string with or without a hash prefix.
|
|
333
|
+
* @param bw - When `true`, returns either black or white based on perceived brightness to maximise contrast.
|
|
334
|
+
* @returns The inverted color represented as a 6-digit HEX string (always prefixed with `#`).
|
|
335
|
+
* @throws Error if the provided value cannot be parsed as a valid HEX color.
|
|
336
|
+
*/
|
|
288
337
|
transform(hex, bw) {
|
|
289
338
|
if (!hex) {
|
|
290
339
|
return '#000000';
|
|
291
340
|
}
|
|
292
|
-
|
|
293
|
-
|
|
341
|
+
let normalizedHex = hex;
|
|
342
|
+
if (normalizedHex.indexOf('#') === 0) {
|
|
343
|
+
normalizedHex = normalizedHex.slice(1);
|
|
294
344
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
345
|
+
if (normalizedHex.length === 3) {
|
|
346
|
+
// Convert shorthand notation (e.g., #abc) to full length (#aabbcc)
|
|
347
|
+
normalizedHex =
|
|
348
|
+
normalizedHex[0] +
|
|
349
|
+
normalizedHex[0] +
|
|
350
|
+
normalizedHex[1] +
|
|
351
|
+
normalizedHex[1] +
|
|
352
|
+
normalizedHex[2] +
|
|
353
|
+
normalizedHex[2];
|
|
298
354
|
}
|
|
299
|
-
if (
|
|
355
|
+
if (normalizedHex.length !== 6) {
|
|
300
356
|
throw new Error('Invalid HEX color.');
|
|
301
357
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
358
|
+
const r = parseInt(normalizedHex.slice(0, 2), 16);
|
|
359
|
+
const g = parseInt(normalizedHex.slice(2, 4), 16);
|
|
360
|
+
const b = parseInt(normalizedHex.slice(4, 6), 16);
|
|
305
361
|
if (bw) {
|
|
306
362
|
// http://stackoverflow.com/a/3943023/112731
|
|
307
363
|
return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';
|
|
308
364
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
// pad each with zeros and return
|
|
314
|
-
return '#' + r.padStart(2, 0) + g.padStart(2, 0) + b.padStart(2, 0);
|
|
365
|
+
const invertedR = (255 - r).toString(16).padStart(2, '0');
|
|
366
|
+
const invertedG = (255 - g).toString(16).padStart(2, '0');
|
|
367
|
+
const invertedB = (255 - b).toString(16).padStart(2, '0');
|
|
368
|
+
return `#${invertedR}${invertedG}${invertedB}`;
|
|
315
369
|
}
|
|
316
|
-
static
|
|
317
|
-
static
|
|
370
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: InvertColorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
371
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.2.3", ngImport: i0, type: InvertColorPipe, isStandalone: true, name: "invertColor" });
|
|
318
372
|
}
|
|
319
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
373
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: InvertColorPipe, decorators: [{
|
|
320
374
|
type: Pipe,
|
|
321
375
|
args: [{
|
|
322
376
|
name: 'invertColor',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-hub-ui-board.mjs","sources":["../../../projects/board/src/lib/directives/board-column-footer.directive.ts","../../../projects/board/src/lib/directives/board-column-header.directive.ts","../../../projects/board/src/lib/directives/card-template.directive.ts","../../../projects/board/src/lib/components/board/board.component.ts","../../../projects/board/src/lib/components/board/board.component.html","../../../projects/board/src/lib/board.module.ts","../../../projects/board/src/lib/pipes/invert-color.pipe.ts","../../../projects/board/src/public-api.ts","../../../projects/board/src/ng-hub-ui-board.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column footer templates within board columns.\n * \n * This directive enables developers to define custom templates for column footers,\n * perfect for displaying summary information, quick actions, statistics,\n * or any column-specific controls at the bottom of each column.\n * \n * @example\n * ```html\n * <ng-template columnFooterTpt let-column=\"column\">\n * <div class=\"custom-footer\">\n * <div class=\"column-summary\">\n * <span>Total: {{ column.cards.length }}</span>\n * <span>Priority Items: {{ getPriorityItems(column) }}</span>\n * </div>\n * <button (click)=\"quickAddCard(column)\">Quick Add</button>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnFooterTpt]',\n\tstandalone: true\n})\nexport class BoardColumnFooterDirective {\n\t/**\n\t * Creates a new BoardColumnFooterDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column footer layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column header templates within board columns.\n * \n * This directive provides the ability to define custom templates for rendering column headers,\n * giving developers full control over the appearance and functionality of column headers\n * including titles, descriptions, actions, and metadata display.\n * \n * @example\n * ```html\n * <ng-template columnHeaderTpt let-column=\"column\">\n * <div class=\"custom-header\">\n * <h2>{{ column.title }}</h2>\n * <span class=\"card-count\">{{ column.cards.length }} items</span>\n * <button (click)=\"addCard(column)\">Add Card</button>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnHeaderTpt]',\n\tstandalone: true\n})\nexport class BoardColumnHeaderDirective {\n\t/**\n\t * Creates a new BoardColumnHeaderDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column header layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of card templates within board columns.\n * \n * This directive is used to define custom templates for rendering board cards.\n * It provides access to the template reference that can be used by the board component\n * to render cards with custom layouts and styling.\n * \n * @example\n * ```html\n * <ng-template cardTpt let-card=\"item\" let-column=\"column\">\n * <div class=\"custom-card\">\n * <h3>{{ card.title }}</h3>\n * <p>{{ card.description }}</p>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[cardTpt]',\n\tstandalone: true\n})\nexport class CardTemplateDirective {\n\t/**\n\t * Creates a new CardTemplateDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom card layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import {\n\tCdkDragDrop,\n\tDragDropModule,\n\tmoveItemInArray,\n\ttransferArrayItem\n} from '@angular/cdk/drag-drop';\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport {\n\tComponent,\n\tEventEmitter,\n\tOutput,\n\tSignal,\n\tTemplateRef,\n\tcomputed,\n\tcontentChild,\n\tinput\n} from '@angular/core';\nimport { BoardColumnFooterDirective } from '../../directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from '../../directives/board-column-header.directive';\nimport { CardTemplateDirective } from '../../directives/card-template.directive';\nimport { Board } from '../../models/board';\nimport { BoardCard } from '../../models/board-card';\nimport { BoardColumn } from '../../models/board-column';\nimport { ReachedEndEvent } from '../../models/reached-end-event';\n\n@Component({\n\tselector: 'hub-board, hub-ui-board',\n\ttemplateUrl: './board.component.html',\n\tstyleUrls: ['./board.component.scss'],\n\tstandalone: true,\n\timports: [NgClass, NgStyle, NgTemplateOutlet, DragDropModule]\n})\nexport class HubBoardComponent {\n\treadonly board = input<Board>();\n\n\tcolumns: Signal<Array<BoardColumn>> = computed(() => {\n\t\treturn this.board()?.columns ?? [];\n\t});\n\n\t// Used to disable the sorting of columns in the board\n\treadonly columnSortingDisabled = input<boolean>(false);\n\n\t// A template reference for the card template\n\treadonly cardTpt = contentChild(CardTemplateDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t// A template reference for the column header template\n\treadonly columnHeaderTpt = contentChild(BoardColumnHeaderDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t// A template reference for the column footer template\n\treadonly columnFooterTpt = contentChild(BoardColumnFooterDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t// triggered when a card is clicked\n\t@Output() onCardClick = new EventEmitter<BoardCard>();\n\n\t// triggered when a card is moved\n\t@Output() onCardMoved = new EventEmitter<\n\t\tCdkDragDrop<BoardColumn, BoardColumn, BoardCard<any>>\n\t>();\n\n\t// triggered when a column is moved\n\t@Output() onColumnMoved = new EventEmitter<CdkDragDrop<BoardColumn[]>>();\n\n\t// emit an event when the user has scrolled to the end of a specific column in the board.\n\t@Output() reachedEnd = new EventEmitter<ReachedEndEvent>();\n\n\t/**\n\t * Default predicate function that allows all drag and drop operations.\n\t * This function is used when no custom predicate is provided for a column.\n\t * \n\t * @returns Always returns true, allowing any card to be dropped in any column\n\t */\n\tdefaultEnterPredicateFn = () => true;\n\n\t/**\n\t * Handles card click events and emits the clicked card data.\n\t * This method is triggered when a user clicks on a card within the board.\n\t *\n\t * @param item - The card data object that was clicked\n\t */\n\tcardClick(item: BoardCard) {\n\t\tthis.onCardClick.next(item);\n\t}\n\n\t/**\n\t * Handles column reordering when a column is dropped after being dragged.\n\t * This method updates the column positions in the array and emits a column moved event.\n\t *\n\t * @param event - The drag and drop event containing information about the moved column\n\t */\n\tdropColumn(event: CdkDragDrop<BoardColumn[]>) {\n\t\tmoveItemInArray(\n\t\t\tevent.container.data,\n\t\t\tevent.previousIndex,\n\t\t\tevent.currentIndex\n\t\t);\n\t\tthis.onColumnMoved.emit(event);\n\t}\n\n\t/**\n\t * Handles card drag and drop operations, supporting both reordering within the same column\n\t * and transferring cards between different columns.\n\t *\n\t * @param event - The drag and drop event containing source/target containers and card data\n\t */\n\tdropCard(event: CdkDragDrop<BoardColumn, BoardColumn, BoardCard<any>>) {\n\t\t// Check if the card was moved within the same column\n\t\tif (event.previousContainer === event.container) {\n\t\t\t// Reorder the card within the same column\n\t\t\tmoveItemInArray(\n\t\t\t\tevent.container.data.cards,\n\t\t\t\tevent.previousIndex,\n\t\t\t\tevent.currentIndex\n\t\t\t);\n\t\t} else {\n\t\t\t// Transfer the card from one column to another\n\t\t\ttransferArrayItem(\n\t\t\t\tevent.previousContainer.data.cards,\n\t\t\t\tevent.container.data.cards,\n\t\t\t\tevent.previousIndex,\n\t\t\t\tevent.currentIndex\n\t\t\t);\n\t\t}\n\t\tthis.onCardMoved.emit(event);\n\t}\n\n\t/**\n\t * Detects when a column has been scrolled to the bottom and emits a reachedEnd event.\n\t * This is useful for implementing lazy loading or infinite scroll functionality.\n\t *\n\t * @param index - The index of the column that was scrolled\n\t * @param event - The scroll event containing target element and scroll position information\n\t */\n\tonScroll(index: number, event: Event) {\n\t\tconst el = event.target as HTMLElement;\n\t\t\n\t\t// Check if the element exists and if we've scrolled to the bottom\n\t\tif (el && el.scrollTop + el.clientHeight >= el.scrollHeight) {\n\t\t\t// Emit event with column index and data for lazy loading purposes\n\t\t\tthis.reachedEnd.emit({\n\t\t\t\tindex,\n\t\t\t\tdata: this.board()?.columns?.[index] ?? []\n\t\t\t});\n\t\t}\n\t}\n}\n","@if (columns().length) {\n\t<div\n\t\tclass=\"hub-board\"\n\t\tcdkDropList\n\t\tcdkDropListOrientation=\"horizontal\"\n\t\t[cdkDropListData]=\"columns()\"\n\t\t(cdkDropListDropped)=\"dropColumn($event)\"\n\t\t[cdkDropListSortingDisabled]=\"columnSortingDisabled()\"\n\t>\n\t\t<div cdkDropListGroup class=\"hub-board__columns\">\n\t\t\t@for (column of columns(); let index = $index; track column) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-board__column-container\"\n\t\t\t\t\tcdkDrag\n\t\t\t\t\t[cdkDragData]=\"column\"\n\t\t\t\t\t[cdkDragDisabled]=\"column.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-board__column\"\n\t\t\t\t\t\t[ngClass]=\"column.classlist\"\n\t\t\t\t\t\t[ngStyle]=\"column.style\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"hub-board__column-header\">\n\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\tcolumnHeaderTpt() || defaultColumnHeaderTpt\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ column: column }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-board__column-body\"\n\t\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t\t[cdkDropListData]=\"column\"\n\t\t\t\t\t\t\t(cdkDropListDropped)=\"dropCard($event)\"\n\t\t\t\t\t\t\t(scroll)=\"onScroll(index, $event)\"\n\t\t\t\t\t\t\t[cdkDropListEnterPredicate]=\"\n\t\t\t\t\t\t\t\tcolumn.predicate ?? defaultEnterPredicateFn\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t[cdkDropListSortingDisabled]=\"\n\t\t\t\t\t\t\t\tcolumn.cardSortingDisabled\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\t\tcard of column.cards;\n\t\t\t\t\t\t\t\tlet index = $index;\n\t\t\t\t\t\t\t\ttrack card\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"hub-board__card\"\n\t\t\t\t\t\t\t\t\t[class.hub-board__card--disabled]=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\t\t\t\t[cdkDragData]=\"card\"\n\t\t\t\t\t\t\t\t\t[cdkDragDisabled]=\"card.disabled\"\n\t\t\t\t\t\t\t\t\t(click)=\"cardClick(card)\"\n\t\t\t\t\t\t\t\t\t(mousedown)=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled &&\n\t\t\t\t\t\t\t\t\t\t\t$event.stopPropagation()\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngClass]=\"card.classlist\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"card.style\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"hub-board__card-body\">\n\t\t\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\t\t\tcardTpt() || defaultCardTpt\n\t\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\t\t\titem: card,\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn\n\t\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t@if (columnFooterTpt()) {\n\t\t\t\t\t\t\t<div class=\"hub-board__column-footer\">\n\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\tcolumnFooterTpt() ?? null\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\tcolumn: column\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n}\n\n<ng-template #defaultCardTpt let-item=\"item\">\n\t<h6>{{ item.title }}</h6>\n\t<p class=\"card-text\">{{ item.description }}</p>\n</ng-template>\n\n<ng-template #defaultColumnHeaderTpt let-column=\"column\">\n\t<div class=\"d-flex flex-column\">\n\t\t<h5 class=\"hub-board__column-header-title\">\n\t\t\t{{ column.title }}\n\t\t</h5>\n\t\t<h6 class=\"hub-board__column-header-subtitle\">\n\t\t\t{{ column.description }}\n\t\t</h6>\n\t</div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { HubBoardComponent } from './components/board/board.component';\nimport { BoardColumnFooterDirective } from './directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from './directives/board-column-header.directive';\nimport { CardTemplateDirective } from './directives/card-template.directive';\n\n/**\n * Angular module that provides board functionality with drag-and-drop support.\n * \n * This module includes all the necessary components and directives for creating\n * Kanban-style boards with customizable columns, cards, and templates.\n * \n * @deprecated Use standalone components instead. Import individual components and directives directly.\n * \n * @example\n * ```typescript\n * // Legacy module approach (not recommended)\n * import { BoardModule } from 'ng-hub-ui-board';\n * \n * @NgModule({\n * imports: [BoardModule]\n * })\n * export class AppModule {}\n * \n * // Recommended standalone approach\n * import { HubBoardComponent, CardTemplateDirective } from 'ng-hub-ui-board';\n * \n * @Component({\n * standalone: true,\n * imports: [HubBoardComponent, CardTemplateDirective]\n * })\n * export class MyComponent {}\n * ```\n */\n@NgModule({\n\tdeclarations: [],\n\timports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective\n\t],\n\texports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective\n\t]\n})\nexport class BoardModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'invertColor',\n\tstandalone: true\n})\nexport class InvertColorPipe implements PipeTransform {\n\ttransform(hex: string, bw: boolean): unknown {\n\t\tif (!hex) {\n\t\t\treturn '#000000';\n\t\t}\n\n\t\tif (hex.indexOf('#') === 0) {\n\t\t\thex = hex.slice(1);\n\t\t}\n\n\t\t// convert 3-digit hex to 6-digits.\n\t\tif (hex.length === 3) {\n\t\t\thex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n\t\t}\n\t\tif (hex.length !== 6) {\n\t\t\tthrow new Error('Invalid HEX color.');\n\t\t}\n\t\tlet r: any = parseInt(hex.slice(0, 2), 16);\n\t\tlet g: any = parseInt(hex.slice(2, 4), 16);\n\t\tlet b: any = parseInt(hex.slice(4, 6), 16);\n\t\tif (bw) {\n\t\t\t// http://stackoverflow.com/a/3943023/112731\n\t\t\treturn r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';\n\t\t}\n\t\t// invert color components\n\t\tr = (255 - r).toString(16);\n\t\tg = (255 - g).toString(16);\n\t\tb = (255 - b).toString(16);\n\t\t// pad each with zeros and return\n\t\treturn '#' + r.padStart(2, 0) + g.padStart(2, 0) + b.padStart(2, 0);\n\t}\n}\n","/*\n * Public API Surface of board\n */\n\n// module\nexport * from './lib/board.module';\n\n// directives\nexport * from './lib/directives/board-column-footer.directive';\nexport * from './lib/directives/board-column-header.directive';\nexport * from './lib/directives/card-template.directive';\n\n// components\nexport * from './lib/components/board/board.component';\n\n// pipes\nexport * from './lib/pipes/invert-color.pipe';\n\n// models\nexport * from './lib/models/board';\nexport * from './lib/models/board-card';\nexport * from './lib/models/board-column';\nexport * from './lib/models/reached-end-event';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-hub-ui-board.mjs","sources":["../../../projects/board/src/lib/directives/board-column-footer.directive.ts","../../../projects/board/src/lib/directives/board-column-header.directive.ts","../../../projects/board/src/lib/directives/card-template.directive.ts","../../../projects/board/src/lib/components/board/board.component.ts","../../../projects/board/src/lib/components/board/board.component.html","../../../projects/board/src/lib/board.module.ts","../../../projects/board/src/lib/pipes/invert-color.pipe.ts","../../../projects/board/src/public-api.ts","../../../projects/board/src/ng-hub-ui-board.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column footer templates within board columns.\n * \n * This directive enables developers to define custom templates for column footers,\n * perfect for displaying summary information, quick actions, statistics,\n * or any column-specific controls at the bottom of each column.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template columnFooterTpt let-column=\"column\">\n * <div class=\"custom-footer\">\n * <div class=\"column-summary\">\n * <span>Total: {{ column.cards.length }}</span>\n * <span>Priority Items: {{ getPriorityItems(column) }}</span>\n * </div>\n * <button (click)=\"quickAddCard(column)\">Quick Add</button>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnFooterTpt]',\n\tstandalone: true\n})\nexport class BoardColumnFooterDirective {\n\t/**\n\t * Creates a new BoardColumnFooterDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column footer layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column header templates within board columns.\n * \n * This directive provides the ability to define custom templates for rendering column headers,\n * giving developers full control over the appearance and functionality of column headers\n * including titles, descriptions, actions, and metadata display.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template columnHeaderTpt let-column=\"column\">\n * <div class=\"custom-header\">\n * <h2>{{ column.title }}</h2>\n * <span class=\"card-count\">{{ column.cards.length }} items</span>\n * <button (click)=\"addCard(column)\">Add Card</button>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnHeaderTpt]',\n\tstandalone: true\n})\nexport class BoardColumnHeaderDirective {\n\t/**\n\t * Creates a new BoardColumnHeaderDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column header layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of card templates within board columns.\n * \n * This directive is used to define custom templates for rendering board cards.\n * It provides access to the template reference that can be used by the board component\n * to render cards with custom layouts and styling.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template cardTpt let-card=\"item\" let-column=\"column\">\n * <div class=\"custom-card\">\n * <h3>{{ card.title }}</h3>\n * <p>{{ card.description }}</p>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[cardTpt]',\n\tstandalone: true\n})\nexport class CardTemplateDirective {\n\t/**\n\t * Creates a new CardTemplateDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom card layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import {\n\tCdkDragDrop,\n\tDragDropModule,\n\tmoveItemInArray,\n\ttransferArrayItem\n} from '@angular/cdk/drag-drop';\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport {\n\tComponent,\n\tSignal,\n\tTemplateRef,\n\tcomputed,\n\tcontentChild,\n\tinput,\n\toutput\n} from '@angular/core';\nimport { BoardColumnFooterDirective } from '../../directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from '../../directives/board-column-header.directive';\nimport { CardTemplateDirective } from '../../directives/card-template.directive';\nimport { Board } from '../../models/board';\nimport { BoardCard } from '../../models/board-card';\nimport { BoardColumn } from '../../models/board-column';\nimport { ReachedEndEvent } from '../../models/reached-end-event';\n\n/**\n * Standalone Kanban-style board component that provides column-based drag-and-drop,\n * custom templates and infinite-scroll detection.\n *\n * @publicApi\n */\n@Component({\n\tselector: 'hub-board, hub-ui-board',\n\ttemplateUrl: './board.component.html',\n\tstyleUrls: ['./board.component.scss'],\n\tstandalone: true,\n\timports: [NgClass, NgStyle, NgTemplateOutlet, DragDropModule]\n})\nexport class HubBoardComponent {\n\t/**\n\t * Reactive input containing the full board definition (columns and cards).\n\t */\n\treadonly board = input<Board>();\n\n\t/**\n\t * Pixel threshold used when determining whether a column has reached scroll end.\n\t * Allows for fractional scroll values across different browsers.\n\t */\n\tprivate readonly scrollDetectionPadding = 1;\n\n\t/**\n\t * Derived list of board columns exposed as a signal to the template.\n\t */\n\tcolumns: Signal<Array<BoardColumn>> = computed(() => {\n\t\treturn this.board()?.columns ?? [];\n\t});\n\n\t/**\n\t * When true, column reordering via drag-and-drop is disabled.\n\t */\n\treadonly columnSortingDisabled = input<boolean>(false);\n\n\t/**\n\t * Custom card template supplied via the `cardTpt` structural directive.\n\t */\n\treadonly cardTpt = contentChild(CardTemplateDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column header template supplied via the `columnHeaderTpt` structural directive.\n\t */\n\treadonly columnHeaderTpt = contentChild(BoardColumnHeaderDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column footer template supplied via the `columnFooterTpt` structural directive.\n\t */\n\treadonly columnFooterTpt = contentChild(BoardColumnFooterDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Emits each time a card is clicked within the board.\n\t */\n\treadonly onCardClick = output<BoardCard>();\n\n\t/**\n\t * Emits when a card has been repositioned, either within the same column or into another column.\n\t */\n\treadonly onCardMoved = output<CdkDragDrop<BoardColumn, BoardColumn, BoardCard<any>>>();\n\n\t/**\n\t * Emits when columns are reordered through drag-and-drop.\n\t */\n\treadonly onColumnMoved = output<CdkDragDrop<BoardColumn[]>>();\n\n\t/**\n\t * Emits when a column body is scrolled to its end, enabling infinite-scroll behaviour.\n\t */\n\treadonly reachedEnd = output<ReachedEndEvent>();\n\n\t/**\n\t * Default predicate that allows any card to be dropped into any column.\n\t *\n\t * @returns Always `true`, indicating that drop operations are permitted.\n\t */\n\tdefaultEnterPredicateFn = () => true;\n\n\t/**\n\t * Emits the clicked card through {@link onCardClick}.\n\t *\n\t * @param item - The card that triggered the click event.\n\t */\n\tcardClick(item: BoardCard) {\n\t\tthis.onCardClick.emit(item);\n\t}\n\n\t/**\n\t * Updates column order when a drag-and-drop operation completes and emits the resulting event.\n\t *\n\t * @param event - Drag-and-drop metadata describing the column movement.\n\t */\n\tdropColumn(event: CdkDragDrop<BoardColumn[]>) {\n\t\tmoveItemInArray(\n\t\t\tevent.container.data,\n\t\t\tevent.previousIndex,\n\t\t\tevent.currentIndex\n\t\t);\n\t\tthis.onColumnMoved.emit(event);\n\t}\n\n\t/**\n\t * Applies card reordering or transfer logic depending on the drag-drop target,\n\t * then emits the corresponding drag event metadata.\n\t *\n\t * @param event - Drag-and-drop metadata describing the card movement.\n\t */\n\tdropCard(event: CdkDragDrop<BoardColumn, BoardColumn, BoardCard<any>>) {\n\t\tif (event.previousContainer === event.container) {\n\t\t\t// Reorder the card within the same column\n\t\t\tmoveItemInArray(\n\t\t\t\tevent.container.data.cards,\n\t\t\t\tevent.previousIndex,\n\t\t\t\tevent.currentIndex\n\t\t\t);\n\t\t} else {\n\t\t\t// Transfer the card from one column to another\n\t\t\ttransferArrayItem(\n\t\t\t\tevent.previousContainer.data.cards,\n\t\t\t\tevent.container.data.cards,\n\t\t\t\tevent.previousIndex,\n\t\t\t\tevent.currentIndex\n\t\t\t);\n\t\t}\n\t\tthis.onCardMoved.emit(event);\n\t}\n\n\t/**\n\t * Emits {@link reachedEnd} once a column body is scrolled to its bottom.\n\t *\n\t * @param index - Index of the scrolled column within the board.\n\t * @param event - Browser scroll event originating from the column body element.\n\t */\n\tonScroll(index: number, event: Event) {\n\t\tconst el = event.target as HTMLElement | null;\n\t\tif (!el) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scrolledToBottom =\n\t\t\tel.scrollTop + el.clientHeight >= el.scrollHeight - this.scrollDetectionPadding;\n\n\t\tif (!scrolledToBottom) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst column = this.board()?.columns?.[index];\n\t\tif (!column) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reachedEnd.emit({\n\t\t\tindex,\n\t\t\tdata: column\n\t\t});\n\t}\n}\n","@if (columns().length) {\n\t<div\n\t\tclass=\"hub-board\"\n\t\tcdkDropList\n\t\tcdkDropListOrientation=\"horizontal\"\n\t\t[cdkDropListData]=\"columns()\"\n\t\t(cdkDropListDropped)=\"dropColumn($event)\"\n\t\t[cdkDropListSortingDisabled]=\"columnSortingDisabled()\"\n\t>\n\t\t<div cdkDropListGroup class=\"hub-board__columns\">\n\t\t\t@for (column of columns(); let index = $index; track column) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-board__column-container\"\n\t\t\t\t\tcdkDrag\n\t\t\t\t\t[cdkDragData]=\"column\"\n\t\t\t\t\t[cdkDragDisabled]=\"column.disabled\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-board__column\"\n\t\t\t\t\t\t[ngClass]=\"column.classlist\"\n\t\t\t\t\t\t[ngStyle]=\"column.style\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"hub-board__column-header\">\n\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\tcolumnHeaderTpt() || defaultColumnHeaderTpt\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ column: column }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-board__column-body\"\n\t\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t\t[cdkDropListData]=\"column\"\n\t\t\t\t\t\t\t(cdkDropListDropped)=\"dropCard($event)\"\n\t\t\t\t\t\t\t(scroll)=\"onScroll(index, $event)\"\n\t\t\t\t\t\t\t[cdkDropListEnterPredicate]=\"\n\t\t\t\t\t\t\t\tcolumn.predicate ?? defaultEnterPredicateFn\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t[cdkDropListSortingDisabled]=\"\n\t\t\t\t\t\t\t\tcolumn.cardSortingDisabled\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (\n\t\t\t\t\t\t\t\tcard of column.cards;\n\t\t\t\t\t\t\t\tlet index = $index;\n\t\t\t\t\t\t\t\ttrack card\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"hub-board__card\"\n\t\t\t\t\t\t\t\t\t[class.hub-board__card--disabled]=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\t\t\t\t[cdkDragData]=\"card\"\n\t\t\t\t\t\t\t\t\t[cdkDragDisabled]=\"card.disabled\"\n\t\t\t\t\t\t\t\t\t(click)=\"cardClick(card)\"\n\t\t\t\t\t\t\t\t\t(mousedown)=\"\n\t\t\t\t\t\t\t\t\t\tcard.disabled &&\n\t\t\t\t\t\t\t\t\t\t\t$event.stopPropagation()\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngClass]=\"card.classlist\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"card.style\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"hub-board__card-body\">\n\t\t\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\t\t\tcardTpt() || defaultCardTpt\n\t\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\t\t\titem: card,\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn\n\t\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t@if (columnFooterTpt()) {\n\t\t\t\t\t\t\t<div class=\"hub-board__column-footer\">\n\t\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\t\t\t\t\t\tcolumnFooterTpt() ?? null\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\t\tcolumn: column\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n}\n\n<ng-template #defaultCardTpt let-item=\"item\">\n\t<h6>{{ item.title }}</h6>\n\t<p class=\"card-text\">{{ item.description }}</p>\n</ng-template>\n\n<ng-template #defaultColumnHeaderTpt let-column=\"column\">\n\t<div class=\"d-flex flex-column\">\n\t\t<h5 class=\"hub-board__column-header-title\">\n\t\t\t{{ column.title }}\n\t\t</h5>\n\t\t<h6 class=\"hub-board__column-header-subtitle\">\n\t\t\t{{ column.description }}\n\t\t</h6>\n\t</div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { HubBoardComponent } from './components/board/board.component';\nimport { BoardColumnFooterDirective } from './directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from './directives/board-column-header.directive';\nimport { CardTemplateDirective } from './directives/card-template.directive';\n\n/**\n * Angular module that provides board functionality with drag-and-drop support.\n * \n * This module includes all the necessary components and directives for creating\n * Kanban-style boards with customizable columns, cards, and templates.\n * \n * @deprecated Use standalone components instead. Import individual components and directives directly.\n * @publicApi\n * \n * @example\n * ```typescript\n * // Legacy module approach (not recommended)\n * import { BoardModule } from 'ng-hub-ui-board';\n * \n * @NgModule({\n * imports: [BoardModule]\n * })\n * export class AppModule {}\n * \n * // Recommended standalone approach\n * import { HubBoardComponent, CardTemplateDirective } from 'ng-hub-ui-board';\n * \n * @Component({\n * standalone: true,\n * imports: [HubBoardComponent, CardTemplateDirective]\n * })\n * export class MyComponent {}\n * ```\n */\n@NgModule({\n\tdeclarations: [],\n\timports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective\n\t],\n\texports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective\n\t]\n})\nexport class BoardModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Converts a hexadecimal color string into its inverted counterpart, offering both\n * high-contrast black/white and full-spectrum inversion modes.\n *\n * @publicApi\n */\n@Pipe({\n\tname: 'invertColor',\n\tstandalone: true\n})\nexport class InvertColorPipe implements PipeTransform {\n\t/**\n\t * Inverts a HEX color value.\n\t *\n\t * @param hex - Color expressed as a 3- or 6-digit HEX string with or without a hash prefix.\n\t * @param bw - When `true`, returns either black or white based on perceived brightness to maximise contrast.\n\t * @returns The inverted color represented as a 6-digit HEX string (always prefixed with `#`).\n\t * @throws Error if the provided value cannot be parsed as a valid HEX color.\n\t */\n\ttransform(hex: string, bw: boolean): string {\n\t\tif (!hex) {\n\t\t\treturn '#000000';\n\t\t}\n\n\t\tlet normalizedHex = hex;\n\t\tif (normalizedHex.indexOf('#') === 0) {\n\t\t\tnormalizedHex = normalizedHex.slice(1);\n\t\t}\n\n\t\tif (normalizedHex.length === 3) {\n\t\t\t// Convert shorthand notation (e.g., #abc) to full length (#aabbcc)\n\t\t\tnormalizedHex =\n\t\t\t\tnormalizedHex[0] +\n\t\t\t\tnormalizedHex[0] +\n\t\t\t\tnormalizedHex[1] +\n\t\t\t\tnormalizedHex[1] +\n\t\t\t\tnormalizedHex[2] +\n\t\t\t\tnormalizedHex[2];\n\t\t}\n\n\t\tif (normalizedHex.length !== 6) {\n\t\t\tthrow new Error('Invalid HEX color.');\n\t\t}\n\n\t\tconst r = parseInt(normalizedHex.slice(0, 2), 16);\n\t\tconst g = parseInt(normalizedHex.slice(2, 4), 16);\n\t\tconst b = parseInt(normalizedHex.slice(4, 6), 16);\n\n\t\tif (bw) {\n\t\t\t// http://stackoverflow.com/a/3943023/112731\n\t\t\treturn r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';\n\t\t}\n\n\t\tconst invertedR = (255 - r).toString(16).padStart(2, '0');\n\t\tconst invertedG = (255 - g).toString(16).padStart(2, '0');\n\t\tconst invertedB = (255 - b).toString(16).padStart(2, '0');\n\n\t\treturn `#${invertedR}${invertedG}${invertedB}`;\n\t}\n}\n","/*\n * Public API Surface of board\n */\n\n// module\nexport * from './lib/board.module';\n\n// directives\nexport * from './lib/directives/board-column-footer.directive';\nexport * from './lib/directives/board-column-header.directive';\nexport * from './lib/directives/card-template.directive';\n\n// components\nexport * from './lib/components/board/board.component';\n\n// pipes\nexport * from './lib/pipes/invert-color.pipe';\n\n// models\nexport * from './lib/models/board';\nexport * from './lib/models/board-card';\nexport * from './lib/models/board-column';\nexport * from './lib/models/reached-end-event';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAEA;;;;;;;;;;;;;;;;;;;;;AAqBG;MAKU,0BAA0B,CAAA;AAMnB,IAAA,WAAA;AALnB;;;;AAIG;AACH,IAAA,WAAA,CAAmB,WAAiC,EAAA;QAAjC,IAAA,CAAA,WAAW,GAAX,WAAW;IAAyB;uGAN3C,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACzBD;;;;;;;;;;;;;;;;;;;AAmBG;MAKU,0BAA0B,CAAA;AAMnB,IAAA,WAAA;AALnB;;;;AAIG;AACH,IAAA,WAAA,CAAmB,WAAiC,EAAA;QAAjC,IAAA,CAAA,WAAW,GAAX,WAAW;IAAyB;uGAN3C,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACvBD;;;;;;;;;;;;;;;;;;AAkBG;MAKU,qBAAqB,CAAA;AAMd,IAAA,WAAA;AALnB;;;;AAIG;AACH,IAAA,WAAA,CAAmB,WAAiC,EAAA;QAAjC,IAAA,CAAA,WAAW,GAAX,WAAW;IAAyB;uGAN3C,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACAD;;;;;AAKG;MAQU,iBAAiB,CAAA;AAC7B;;AAEG;IACM,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAS;AAE/B;;;AAGG;IACc,sBAAsB,GAAG,CAAC;AAE3C;;AAEG;AACH,IAAA,OAAO,GAA+B,QAAQ,CAAC,MAAK;QACnD,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE;AACnC,IAAA,CAAC,mDAAC;AAEF;;AAEG;AACM,IAAA,qBAAqB,GAAG,KAAK,CAAU,KAAK,iEAAC;AAEtD;;AAEG;IACM,OAAO,GAAG,YAAY,CAAC,qBAAqB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EACpD,IAAI,GAAE,WAAoB,CAAA,EAAA,CAAA,GAAA,CAD4B;YACtD,IAAI,GAAE,WAAoB;AAC1B,SAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;IACM,eAAe,GAAG,YAAY,CAAC,0BAA0B,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EACjE,IAAI,GAAE,WAAoB,CAAA,EAAA,CAAA,GAAA,CADyC;YACnE,IAAI,GAAE,WAAoB;AAC1B,SAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;IACM,eAAe,GAAG,YAAY,CAAC,0BAA0B,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EACjE,IAAI,GAAE,WAAoB,CAAA,EAAA,CAAA,GAAA,CADyC;YACnE,IAAI,GAAE,WAAoB;AAC1B,SAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;IACM,WAAW,GAAG,MAAM,EAAa;AAE1C;;AAEG;IACM,WAAW,GAAG,MAAM,EAAyD;AAEtF;;AAEG;IACM,aAAa,GAAG,MAAM,EAA8B;AAE7D;;AAEG;IACM,UAAU,GAAG,MAAM,EAAmB;AAE/C;;;;AAIG;AACH,IAAA,uBAAuB,GAAG,MAAM,IAAI;AAEpC;;;;AAIG;AACH,IAAA,SAAS,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,KAAiC,EAAA;AAC3C,QAAA,eAAe,CACd,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CAClB;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEA;;;;;AAKG;AACH,IAAA,QAAQ,CAAC,KAA4D,EAAA;QACpE,IAAI,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS,EAAE;;AAEhD,YAAA,eAAe,CACd,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAC1B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CAClB;QACF;aAAO;;YAEN,iBAAiB,CAChB,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAClC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAC1B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CAClB;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA;;;;;AAKG;IACH,QAAQ,CAAC,KAAa,EAAE,KAAY,EAAA;AACnC,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAA4B;QAC7C,IAAI,CAAC,EAAE,EAAE;YACR;QACD;AAEA,QAAA,MAAM,gBAAgB,GACrB,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,sBAAsB;QAEhF,IAAI,CAAC,gBAAgB,EAAE;YACtB;QACD;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE;YACZ;QACD;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACpB,KAAK;AACL,YAAA,IAAI,EAAE;AACN,SAAA,CAAC;IACH;uGArJY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA2BG,qBAAqB,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAC9C,WAAW,+EAMsB,0BAA0B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAC3D,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAMsB,0BAA0B,2BAC3D,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/EnB,+sHAoHA,EAAA,MAAA,EAAA,CAAA,ucAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjFW,OAAO,oFAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEhD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;+BACC,yBAAyB,EAAA,UAAA,EAGvB,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,+sHAAA,EAAA,MAAA,EAAA,CAAA,ucAAA,CAAA,EAAA;;;AE7B9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;MAgBU,WAAW,CAAA;uGAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YAZtB,iBAAiB;YACjB,qBAAqB;YACrB,0BAA0B;AAC1B,YAAA,0BAA0B,aAG1B,iBAAiB;YACjB,qBAAqB;YACrB,0BAA0B;YAC1B,0BAA0B,CAAA,EAAA,CAAA;AAGf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YAZtB,iBAAiB,CAAA,EAAA,CAAA;;2FAYN,WAAW,EAAA,UAAA,EAAA,CAAA;kBAfvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACR,iBAAiB;wBACjB,qBAAqB;wBACrB,0BAA0B;wBAC1B;AACA,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACR,iBAAiB;wBACjB,qBAAqB;wBACrB,0BAA0B;wBAC1B;AACA;AACD,iBAAA;;;AC/CD;;;;;AAKG;MAKU,eAAe,CAAA;AAC3B;;;;;;;AAOG;IACH,SAAS,CAAC,GAAW,EAAE,EAAW,EAAA;QACjC,IAAI,CAAC,GAAG,EAAE;AACT,YAAA,OAAO,SAAS;QACjB;QAEA,IAAI,aAAa,GAAG,GAAG;QACvB,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACrC,YAAA,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC;AAEA,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;;YAE/B,aAAa;gBACZ,aAAa,CAAC,CAAC,CAAC;oBAChB,aAAa,CAAC,CAAC,CAAC;oBAChB,aAAa,CAAC,CAAC,CAAC;oBAChB,aAAa,CAAC,CAAC,CAAC;oBAChB,aAAa,CAAC,CAAC,CAAC;oBAChB,aAAa,CAAC,CAAC,CAAC;QAClB;AAEA,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;QACtC;AAEA,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACjD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACjD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAEjD,IAAI,EAAE,EAAE;;YAEP,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,SAAS,GAAG,SAAS;QACvE;AAEA,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACzD,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACzD,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAEzD,QAAA,OAAO,IAAI,SAAS,CAAA,EAAG,SAAS,CAAA,EAAG,SAAS,EAAE;IAC/C;uGAhDY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACL,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACXD;;AAEG;AAEH;;ACJA;;AAEG;;;;"}
|