@ojiepermana/angular 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -7
- package/fesm2022/ojiepermana-angular-internal.mjs +417 -2
- package/fesm2022/ojiepermana-angular-internal.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout.mjs +8 -18
- package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-horizontal.mjs +785 -0
- package/fesm2022/ojiepermana-angular-navigation-horizontal.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-vertical.mjs +1568 -0
- package/fesm2022/ojiepermana-angular-navigation-vertical.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation.mjs +176 -0
- package/fesm2022/ojiepermana-angular-navigation.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-component.mjs +12 -26
- package/fesm2022/ojiepermana-angular-theme-component.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-theme-service.mjs +2 -6
- package/fesm2022/ojiepermana-angular-theme-service.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular.mjs.map +1 -1
- package/navigation/README.md +215 -0
- package/package.json +13 -1
- package/theme/README.md +1 -4
- package/theme/styles/adapters/material-ui/index.css +1 -5
- package/theme/styles/layout/horizontal.css +2 -10
- package/theme/styles/layout/vertical.css +3 -5
- package/theme/styles/presets/styles/flat.css +3 -6
- package/theme/styles/presets/styles/glass.css +1 -7
- package/theme/styles/presets/styles/index.css +1 -1
- package/theme/styles/roles/index.css +18 -0
- package/theme/styles/tokens/foundation.css +4 -7
- package/types/ojiepermana-angular-internal.d.ts +64 -1
- package/types/ojiepermana-angular-navigation-horizontal.d.ts +77 -0
- package/types/ojiepermana-angular-navigation-vertical.d.ts +260 -0
- package/types/ojiepermana-angular-navigation.d.ts +182 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @ojiepermana/angular
|
|
2
2
|
|
|
3
|
-
Theme and
|
|
3
|
+
Theme, layout, and navigation primitives for Angular applications.
|
|
4
4
|
|
|
5
5
|
This package is organized around secondary entry points. The root TypeScript package is intentionally empty, so application code should not import APIs from `@ojiepermana/angular` directly.
|
|
6
6
|
|
|
@@ -12,6 +12,9 @@ Use these entry points in application code:
|
|
|
12
12
|
- `@ojiepermana/angular/theme/component`
|
|
13
13
|
- `@ojiepermana/angular/theme/directive`
|
|
14
14
|
- `@ojiepermana/angular/layout`
|
|
15
|
+
- `@ojiepermana/angular/navigation`
|
|
16
|
+
- `@ojiepermana/angular/navigation/vertical`
|
|
17
|
+
- `@ojiepermana/angular/navigation/horizontal`
|
|
15
18
|
- `@ojiepermana/angular/shell`
|
|
16
19
|
- `@ojiepermana/angular/styles/index.css`
|
|
17
20
|
- `@ojiepermana/angular/styles/resets.css` for optional application-level resets
|
|
@@ -31,6 +34,8 @@ Do not import consumer code from:
|
|
|
31
34
|
- Layout host mirroring through `LayoutHostDirective`.
|
|
32
35
|
- Reusable shell components through `LayoutVerticalComponent` and `LayoutHorizontalComponent`.
|
|
33
36
|
- Layout controls through `LayoutModeSwitcherComponent` and `LayoutContainerSwitcherComponent`.
|
|
37
|
+
- Navigation runtime state through `NavigationService` and shared navigation utilities.
|
|
38
|
+
- Reusable navigation components through `HorizontalNavigation` and the vertical navigation variants.
|
|
34
39
|
- A combined stylesheet bundle through `@ojiepermana/angular/styles/index.css`.
|
|
35
40
|
|
|
36
41
|
## Requirements
|
|
@@ -44,7 +49,7 @@ The published package currently declares peer dependencies for:
|
|
|
44
49
|
- `@lucide/angular` `>=1.0.0`
|
|
45
50
|
- `tailwindcss` `>=4.0.0`
|
|
46
51
|
|
|
47
|
-
If you use the layout shells, your application should also already be using Angular Router because
|
|
52
|
+
If you use the layout shells or the navigation components, your application should also already be using Angular Router because those APIs render router primitives such as `RouterOutlet` and `RouterLink`.
|
|
48
53
|
|
|
49
54
|
## Runtime Contract
|
|
50
55
|
|
|
@@ -141,10 +146,7 @@ If your application also wants the library's optional reset helpers, add this be
|
|
|
141
146
|
|
|
142
147
|
```ts
|
|
143
148
|
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
144
|
-
import {
|
|
145
|
-
LayoutContainerSwitcherComponent,
|
|
146
|
-
LayoutVerticalComponent,
|
|
147
|
-
} from '@ojiepermana/angular/layout';
|
|
149
|
+
import { LayoutContainerSwitcherComponent, LayoutVerticalComponent } from '@ojiepermana/angular/layout';
|
|
148
150
|
import {
|
|
149
151
|
StyleSwitcherComponent,
|
|
150
152
|
ColorPickerComponent,
|
|
@@ -223,6 +225,47 @@ export class AppShellComponent {}
|
|
|
223
225
|
- `LayoutModeSwitcherComponent`
|
|
224
226
|
- `LayoutContainerSwitcherComponent`
|
|
225
227
|
|
|
228
|
+
### `@ojiepermana/angular/navigation`
|
|
229
|
+
|
|
230
|
+
- `NavigationService`
|
|
231
|
+
- `NavigationItem`
|
|
232
|
+
- `NavigationBranchItem`
|
|
233
|
+
- `NavigationLeafItem`
|
|
234
|
+
- `NavigationBasicItem`
|
|
235
|
+
- `NavigationAsideItem`
|
|
236
|
+
- `NavigationCollapsableItem`
|
|
237
|
+
- `NavigationGroupItem`
|
|
238
|
+
- `NavigationDividerItem`
|
|
239
|
+
- `NavigationSpacerItem`
|
|
240
|
+
- `VerticalNavigationAppearance`
|
|
241
|
+
- `VerticalNavigationMode`
|
|
242
|
+
- `VerticalNavigationPosition`
|
|
243
|
+
- `getNavigationItemAction`
|
|
244
|
+
- `getNavigationChildren`
|
|
245
|
+
- `getNavigationItemVisibilityHandler`
|
|
246
|
+
- `hasNavigationChildren`
|
|
247
|
+
- `isNavigationItemHidden`
|
|
248
|
+
- `isNavigationRoutableItem`
|
|
249
|
+
- `shouldRenderNavigationItem`
|
|
250
|
+
|
|
251
|
+
### `@ojiepermana/angular/navigation/vertical`
|
|
252
|
+
|
|
253
|
+
- `VerticalNavigationDefaultComponent`
|
|
254
|
+
- `VerticalNavigationCompactComponent`
|
|
255
|
+
- `VerticalNavigationDenseComponent`
|
|
256
|
+
- `VerticalNavigationThinComponent`
|
|
257
|
+
- `VerticalNavigationAsideItemComponent`
|
|
258
|
+
- `VerticalNavigationBasicItemComponent`
|
|
259
|
+
- `VerticalNavigationCollapsableItemComponent`
|
|
260
|
+
- `VerticalNavigationDividerItemComponent`
|
|
261
|
+
- `VerticalNavigationGroupItemComponent`
|
|
262
|
+
- `VerticalNavigationSpacerItemComponent`
|
|
263
|
+
|
|
264
|
+
### `@ojiepermana/angular/navigation/horizontal`
|
|
265
|
+
|
|
266
|
+
- `HorizontalNavigation`
|
|
267
|
+
- `HorizontalNavigationBranchItem`
|
|
268
|
+
|
|
226
269
|
### `@ojiepermana/angular/shell`
|
|
227
270
|
|
|
228
271
|
- `provideNgShell`
|
|
@@ -234,4 +277,4 @@ export class AppShellComponent {}
|
|
|
234
277
|
- Document `@ojiepermana/angular/styles/index.css` as the consumer stylesheet entry point.
|
|
235
278
|
- Treat `@ojiepermana/angular/internal` as implementation-only. It exists so library entry points can share code without turning that code into a supported consumer contract.
|
|
236
279
|
- Do not add exports to `@ojiepermana/angular` unless the package contract changes intentionally.
|
|
237
|
-
- Keep the root README, theme README, layout README, and entrypoint smoke tests aligned whenever the public surface changes.
|
|
280
|
+
- Keep the root README, theme README, layout README, navigation README, and entrypoint smoke tests aligned whenever the public surface changes.
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import { provideLucideConfig } from '@lucide/angular';
|
|
1
|
+
import { provideLucideConfig, icons, LucideDynamicIcon } from '@lucide/angular';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, forwardRef } from '@angular/core';
|
|
4
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
5
|
+
import { getNavigationChildren, hasNavigationChildren, shouldRenderNavigationItem } from '@ojiepermana/angular/navigation';
|
|
2
6
|
|
|
3
7
|
const libraryLucideConfigProvider = provideLucideConfig({
|
|
4
8
|
absoluteStrokeWidth: true,
|
|
@@ -48,11 +52,422 @@ class LocalStorageStateAdapter {
|
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
|
|
55
|
+
const navigationLucideIconRegistry = buildNavigationLucideIconRegistry();
|
|
56
|
+
function buildNavigationLucideIconRegistry() {
|
|
57
|
+
const registry = new Map();
|
|
58
|
+
for (const icon of Object.values(icons)) {
|
|
59
|
+
registry.set(icon.icon.name, icon);
|
|
60
|
+
for (const alias of icon.icon.aliases ?? []) {
|
|
61
|
+
registry.set(alias, icon);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return registry;
|
|
65
|
+
}
|
|
66
|
+
class NavigationItemContent {
|
|
67
|
+
item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
|
|
68
|
+
level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
|
|
69
|
+
variant = input('horizontal', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
70
|
+
resolvedIcon = computed(() => {
|
|
71
|
+
const iconName = this.item().icon;
|
|
72
|
+
return iconName ? (navigationLucideIconRegistry.get(iconName) ?? null) : null;
|
|
73
|
+
}, ...(ngDevMode ? [{ debugName: "resolvedIcon" }] : /* istanbul ignore next */ []));
|
|
74
|
+
horizontalIconClass = computed(() => this.joinClasses('horizontal-navigation-item-icon', this.item().classes?.icon), ...(ngDevMode ? [{ debugName: "horizontalIconClass" }] : /* istanbul ignore next */ []));
|
|
75
|
+
verticalIconClass = computed(() => this.joinClasses('kit-navigation-item-icon', this.item().classes?.icon), ...(ngDevMode ? [{ debugName: "verticalIconClass" }] : /* istanbul ignore next */ []));
|
|
76
|
+
horizontalTitleClass = computed(() => this.joinClasses('horizontal-navigation-item-label', this.item().classes?.title), ...(ngDevMode ? [{ debugName: "horizontalTitleClass" }] : /* istanbul ignore next */ []));
|
|
77
|
+
titleClass = computed(() => this.item().classes?.title ?? null, ...(ngDevMode ? [{ debugName: "titleClass" }] : /* istanbul ignore next */ []));
|
|
78
|
+
subtitleClass = computed(() => this.item().classes?.subtitle ?? null, ...(ngDevMode ? [{ debugName: "subtitleClass" }] : /* istanbul ignore next */ []));
|
|
79
|
+
horizontalBadgeClass = computed(() => this.joinClasses('horizontal-navigation-item-badge', !this.item().badge?.classes ? 'bg-primary text-primary-foreground' : null, this.item().badge?.classes), ...(ngDevMode ? [{ debugName: "horizontalBadgeClass" }] : /* istanbul ignore next */ []));
|
|
80
|
+
verticalBadgeClass = computed(() => this.joinClasses('kit-navigation-item-badge-content', this.item().badge?.classes), ...(ngDevMode ? [{ debugName: "verticalBadgeClass" }] : /* istanbul ignore next */ []));
|
|
81
|
+
titleContainerClass = computed(() => this.variant() === 'vertical-group' ? 'kit-navigation-group-title' : 'kit-navigation-item-title', ...(ngDevMode ? [{ debugName: "titleContainerClass" }] : /* istanbul ignore next */ []));
|
|
82
|
+
subtitleContainerClass = computed(() => this.variant() === 'vertical-group' ? 'kit-navigation-group-subtitle' : 'kit-navigation-item-subtitle', ...(ngDevMode ? [{ debugName: "subtitleContainerClass" }] : /* istanbul ignore next */ []));
|
|
83
|
+
joinClasses(...classNames) {
|
|
84
|
+
const value = classNames.filter((className) => !!className).join(' ');
|
|
85
|
+
return value || null;
|
|
86
|
+
}
|
|
87
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NavigationItemContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
88
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NavigationItemContent, isStandalone: true, selector: "navigation-item-content", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, providers: [libraryLucideConfigProvider], ngImport: i0, template: `
|
|
89
|
+
@if (variant() === 'horizontal') {
|
|
90
|
+
<span class="horizontal-navigation-item-body">
|
|
91
|
+
<span
|
|
92
|
+
class="horizontal-navigation-item-leading"
|
|
93
|
+
[class.horizontal-navigation-item-leading--nested]="level() > 0">
|
|
94
|
+
@if (resolvedIcon(); as icon) {
|
|
95
|
+
<svg
|
|
96
|
+
[lucideIcon]="icon"
|
|
97
|
+
[absoluteStrokeWidth]="true"
|
|
98
|
+
[attr.class]="horizontalIconClass()"
|
|
99
|
+
aria-hidden="true"></svg>
|
|
100
|
+
}
|
|
101
|
+
<span [attr.class]="horizontalTitleClass()">
|
|
102
|
+
{{ item().title }}
|
|
103
|
+
</span>
|
|
104
|
+
</span>
|
|
105
|
+
|
|
106
|
+
@if (item().badge?.title) {
|
|
107
|
+
<span [attr.class]="horizontalBadgeClass()">
|
|
108
|
+
{{ item().badge?.title }}
|
|
109
|
+
</span>
|
|
110
|
+
}
|
|
111
|
+
</span>
|
|
112
|
+
} @else {
|
|
113
|
+
<span class="kit-navigation-item-content">
|
|
114
|
+
@if (resolvedIcon(); as icon) {
|
|
115
|
+
<svg
|
|
116
|
+
[lucideIcon]="icon"
|
|
117
|
+
[absoluteStrokeWidth]="true"
|
|
118
|
+
[attr.class]="verticalIconClass()"
|
|
119
|
+
[size]="18"
|
|
120
|
+
aria-hidden="true"></svg>
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
<div class="kit-navigation-item-title-wrapper">
|
|
124
|
+
<div [class]="titleContainerClass()">
|
|
125
|
+
<span [attr.class]="titleClass()">
|
|
126
|
+
{{ item().title }}
|
|
127
|
+
</span>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
@if (item().subtitle) {
|
|
131
|
+
<div [class]="subtitleContainerClass()">
|
|
132
|
+
<span [attr.class]="subtitleClass()">
|
|
133
|
+
{{ item().subtitle }}
|
|
134
|
+
</span>
|
|
135
|
+
</div>
|
|
136
|
+
}
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
@if (item().badge?.title) {
|
|
140
|
+
<div class="kit-navigation-item-badge">
|
|
141
|
+
<div [attr.class]="verticalBadgeClass()">
|
|
142
|
+
{{ item().badge?.title }}
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
}
|
|
146
|
+
</span>
|
|
147
|
+
}
|
|
148
|
+
`, isInline: true, styles: [":host{display:contents}.kit-navigation-item-content{display:flex;align-items:center;width:100%;min-width:0}.kit-navigation-item-title-wrapper{display:flex;flex:1 1 auto;min-width:0;flex-direction:column}.kit-navigation-item-title,.kit-navigation-group-title,.kit-navigation-item-subtitle,.kit-navigation-group-subtitle{min-width:0}\n"], dependencies: [{ kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
149
|
+
}
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NavigationItemContent, decorators: [{
|
|
151
|
+
type: Component,
|
|
152
|
+
args: [{ selector: 'navigation-item-content', template: `
|
|
153
|
+
@if (variant() === 'horizontal') {
|
|
154
|
+
<span class="horizontal-navigation-item-body">
|
|
155
|
+
<span
|
|
156
|
+
class="horizontal-navigation-item-leading"
|
|
157
|
+
[class.horizontal-navigation-item-leading--nested]="level() > 0">
|
|
158
|
+
@if (resolvedIcon(); as icon) {
|
|
159
|
+
<svg
|
|
160
|
+
[lucideIcon]="icon"
|
|
161
|
+
[absoluteStrokeWidth]="true"
|
|
162
|
+
[attr.class]="horizontalIconClass()"
|
|
163
|
+
aria-hidden="true"></svg>
|
|
164
|
+
}
|
|
165
|
+
<span [attr.class]="horizontalTitleClass()">
|
|
166
|
+
{{ item().title }}
|
|
167
|
+
</span>
|
|
168
|
+
</span>
|
|
169
|
+
|
|
170
|
+
@if (item().badge?.title) {
|
|
171
|
+
<span [attr.class]="horizontalBadgeClass()">
|
|
172
|
+
{{ item().badge?.title }}
|
|
173
|
+
</span>
|
|
174
|
+
}
|
|
175
|
+
</span>
|
|
176
|
+
} @else {
|
|
177
|
+
<span class="kit-navigation-item-content">
|
|
178
|
+
@if (resolvedIcon(); as icon) {
|
|
179
|
+
<svg
|
|
180
|
+
[lucideIcon]="icon"
|
|
181
|
+
[absoluteStrokeWidth]="true"
|
|
182
|
+
[attr.class]="verticalIconClass()"
|
|
183
|
+
[size]="18"
|
|
184
|
+
aria-hidden="true"></svg>
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
<div class="kit-navigation-item-title-wrapper">
|
|
188
|
+
<div [class]="titleContainerClass()">
|
|
189
|
+
<span [attr.class]="titleClass()">
|
|
190
|
+
{{ item().title }}
|
|
191
|
+
</span>
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
@if (item().subtitle) {
|
|
195
|
+
<div [class]="subtitleContainerClass()">
|
|
196
|
+
<span [attr.class]="subtitleClass()">
|
|
197
|
+
{{ item().subtitle }}
|
|
198
|
+
</span>
|
|
199
|
+
</div>
|
|
200
|
+
}
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
@if (item().badge?.title) {
|
|
204
|
+
<div class="kit-navigation-item-badge">
|
|
205
|
+
<div [attr.class]="verticalBadgeClass()">
|
|
206
|
+
{{ item().badge?.title }}
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
}
|
|
210
|
+
</span>
|
|
211
|
+
}
|
|
212
|
+
`, imports: [LucideDynamicIcon], providers: [libraryLucideConfigProvider], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [":host{display:contents}.kit-navigation-item-content{display:flex;align-items:center;width:100%;min-width:0}.kit-navigation-item-title-wrapper{display:flex;flex:1 1 auto;min-width:0;flex-direction:column}.kit-navigation-item-title,.kit-navigation-group-title,.kit-navigation-item-subtitle,.kit-navigation-group-subtitle{min-width:0}\n"] }]
|
|
213
|
+
}], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
|
|
214
|
+
|
|
215
|
+
function trackNavigationTreeItem(index, item) {
|
|
216
|
+
return item.id || item.title || index;
|
|
217
|
+
}
|
|
218
|
+
function getNavigationTreePathKey(parentKey, item) {
|
|
219
|
+
const key = item.id || item.title;
|
|
220
|
+
if (!key) {
|
|
221
|
+
return parentKey;
|
|
222
|
+
}
|
|
223
|
+
return `${parentKey}/${key}`;
|
|
224
|
+
}
|
|
225
|
+
function isNavigationTreeItemExpanded(expandedByParent, parentKey, item) {
|
|
226
|
+
return expandedByParent[parentKey] === getNavigationTreePathKey(parentKey, item);
|
|
227
|
+
}
|
|
228
|
+
function toggleNavigationTreeItemExpanded(expandedByParent, parentKey, item) {
|
|
229
|
+
const key = getNavigationTreePathKey(parentKey, item);
|
|
230
|
+
if (expandedByParent[parentKey] === key) {
|
|
231
|
+
const next = { ...expandedByParent };
|
|
232
|
+
delete next[parentKey];
|
|
233
|
+
return next;
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
...expandedByParent,
|
|
237
|
+
[parentKey]: key,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function hasActiveNavigationDescendant(item, isItemActive) {
|
|
241
|
+
for (const child of getNavigationChildren(item)) {
|
|
242
|
+
if (isItemActive(child)) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
if (hasNavigationChildren(child) && hasActiveNavigationDescendant(child, isItemActive)) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
function isNavigationTreeDescendant(parent, item) {
|
|
252
|
+
for (const child of getNavigationChildren(parent)) {
|
|
253
|
+
if (child === item) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (hasNavigationChildren(child) && isNavigationTreeDescendant(child, item)) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
class NavigationTreeOutlet {
|
|
264
|
+
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
265
|
+
level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
|
|
266
|
+
parentKey = input('root', ...(ngDevMode ? [{ debugName: "parentKey" }] : /* istanbul ignore next */ []));
|
|
267
|
+
data = input(null, ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
268
|
+
branchTemplate = input.required(...(ngDevMode ? [{ debugName: "branchTemplate" }] : /* istanbul ignore next */ []));
|
|
269
|
+
leafTemplate = input.required(...(ngDevMode ? [{ debugName: "leafTemplate" }] : /* istanbul ignore next */ []));
|
|
270
|
+
groupTemplate = input.required(...(ngDevMode ? [{ debugName: "groupTemplate" }] : /* istanbul ignore next */ []));
|
|
271
|
+
dividerTemplate = input(null, ...(ngDevMode ? [{ debugName: "dividerTemplate" }] : /* istanbul ignore next */ []));
|
|
272
|
+
spacerTemplate = input(null, ...(ngDevMode ? [{ debugName: "spacerTemplate" }] : /* istanbul ignore next */ []));
|
|
273
|
+
trackByFn = input(trackNavigationTreeItem, ...(ngDevMode ? [{ debugName: "trackByFn" }] : /* istanbul ignore next */ []));
|
|
274
|
+
shouldRenderItemFn = input(shouldRenderNavigationItem, ...(ngDevMode ? [{ debugName: "shouldRenderItemFn" }] : /* istanbul ignore next */ []));
|
|
275
|
+
hasChildrenFn = input(hasNavigationChildren, ...(ngDevMode ? [{ debugName: "hasChildrenFn" }] : /* istanbul ignore next */ []));
|
|
276
|
+
resolveParentKeyFn = input(getNavigationTreePathKey, ...(ngDevMode ? [{ debugName: "resolveParentKeyFn" }] : /* istanbul ignore next */ []));
|
|
277
|
+
trackItem(index, item) {
|
|
278
|
+
return this.trackByFn()(index, item);
|
|
279
|
+
}
|
|
280
|
+
shouldRender(item) {
|
|
281
|
+
return this.shouldRenderItemFn()(item);
|
|
282
|
+
}
|
|
283
|
+
hasChildren(item) {
|
|
284
|
+
return this.hasChildrenFn()(item);
|
|
285
|
+
}
|
|
286
|
+
resolveParentKey(parentKey, item) {
|
|
287
|
+
return this.resolveParentKeyFn()(parentKey, item);
|
|
288
|
+
}
|
|
289
|
+
templateContext(item, isLast) {
|
|
290
|
+
return {
|
|
291
|
+
$implicit: item,
|
|
292
|
+
level: this.level(),
|
|
293
|
+
parentKey: this.parentKey(),
|
|
294
|
+
isLast,
|
|
295
|
+
data: this.data(),
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NavigationTreeOutlet, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
299
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NavigationTreeOutlet, isStandalone: true, selector: "navigation-tree-outlet", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, parentKey: { classPropertyName: "parentKey", publicName: "parentKey", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, branchTemplate: { classPropertyName: "branchTemplate", publicName: "branchTemplate", isSignal: true, isRequired: true, transformFunction: null }, leafTemplate: { classPropertyName: "leafTemplate", publicName: "leafTemplate", isSignal: true, isRequired: true, transformFunction: null }, groupTemplate: { classPropertyName: "groupTemplate", publicName: "groupTemplate", isSignal: true, isRequired: true, transformFunction: null }, dividerTemplate: { classPropertyName: "dividerTemplate", publicName: "dividerTemplate", isSignal: true, isRequired: false, transformFunction: null }, spacerTemplate: { classPropertyName: "spacerTemplate", publicName: "spacerTemplate", isSignal: true, isRequired: false, transformFunction: null }, trackByFn: { classPropertyName: "trackByFn", publicName: "trackByFn", isSignal: true, isRequired: false, transformFunction: null }, shouldRenderItemFn: { classPropertyName: "shouldRenderItemFn", publicName: "shouldRenderItemFn", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenFn: { classPropertyName: "hasChildrenFn", publicName: "hasChildrenFn", isSignal: true, isRequired: false, transformFunction: null }, resolveParentKeyFn: { classPropertyName: "resolveParentKeyFn", publicName: "resolveParentKeyFn", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
300
|
+
@for (child of items(); track trackItem($index, child); let isLast = $last) {
|
|
301
|
+
@if (shouldRender(child)) {
|
|
302
|
+
@switch (child.type) {
|
|
303
|
+
@case ('basic') {
|
|
304
|
+
<ng-container
|
|
305
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
306
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
@case ('aside') {
|
|
310
|
+
@if (hasChildren(child)) {
|
|
311
|
+
<ng-container
|
|
312
|
+
[ngTemplateOutlet]="branchTemplate()"
|
|
313
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
314
|
+
} @else {
|
|
315
|
+
<ng-container
|
|
316
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
317
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
@case ('collapsable') {
|
|
322
|
+
@if (hasChildren(child)) {
|
|
323
|
+
<ng-container
|
|
324
|
+
[ngTemplateOutlet]="branchTemplate()"
|
|
325
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
326
|
+
} @else {
|
|
327
|
+
<ng-container
|
|
328
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
329
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@case ('group') {
|
|
334
|
+
@if (hasChildren(child)) {
|
|
335
|
+
<ng-container
|
|
336
|
+
[ngTemplateOutlet]="groupTemplate()"
|
|
337
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
338
|
+
<navigation-tree-outlet
|
|
339
|
+
[items]="child.children || []"
|
|
340
|
+
[level]="level() + 1"
|
|
341
|
+
[parentKey]="resolveParentKey(parentKey(), child)"
|
|
342
|
+
[data]="data()"
|
|
343
|
+
[branchTemplate]="branchTemplate()"
|
|
344
|
+
[leafTemplate]="leafTemplate()"
|
|
345
|
+
[groupTemplate]="groupTemplate()"
|
|
346
|
+
[dividerTemplate]="dividerTemplate()"
|
|
347
|
+
[spacerTemplate]="spacerTemplate()"
|
|
348
|
+
[trackByFn]="trackByFn()"
|
|
349
|
+
[shouldRenderItemFn]="shouldRenderItemFn()"
|
|
350
|
+
[hasChildrenFn]="hasChildrenFn()"
|
|
351
|
+
[resolveParentKeyFn]="resolveParentKeyFn()" />
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
@case ('divider') {
|
|
356
|
+
@if (dividerTemplate()) {
|
|
357
|
+
<ng-container
|
|
358
|
+
[ngTemplateOutlet]="dividerTemplate()"
|
|
359
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
@case ('spacer') {
|
|
364
|
+
@if (spacerTemplate()) {
|
|
365
|
+
<ng-container
|
|
366
|
+
[ngTemplateOutlet]="spacerTemplate()"
|
|
367
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@default {
|
|
372
|
+
<ng-container
|
|
373
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
374
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => NavigationTreeOutlet), selector: "navigation-tree-outlet", inputs: ["items", "level", "parentKey", "data", "branchTemplate", "leafTemplate", "groupTemplate", "dividerTemplate", "spacerTemplate", "trackByFn", "shouldRenderItemFn", "hasChildrenFn", "resolveParentKeyFn"] }, { kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
380
|
+
}
|
|
381
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NavigationTreeOutlet, decorators: [{
|
|
382
|
+
type: Component,
|
|
383
|
+
args: [{ selector: 'navigation-tree-outlet', template: `
|
|
384
|
+
@for (child of items(); track trackItem($index, child); let isLast = $last) {
|
|
385
|
+
@if (shouldRender(child)) {
|
|
386
|
+
@switch (child.type) {
|
|
387
|
+
@case ('basic') {
|
|
388
|
+
<ng-container
|
|
389
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
390
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
@case ('aside') {
|
|
394
|
+
@if (hasChildren(child)) {
|
|
395
|
+
<ng-container
|
|
396
|
+
[ngTemplateOutlet]="branchTemplate()"
|
|
397
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
398
|
+
} @else {
|
|
399
|
+
<ng-container
|
|
400
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
401
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
@case ('collapsable') {
|
|
406
|
+
@if (hasChildren(child)) {
|
|
407
|
+
<ng-container
|
|
408
|
+
[ngTemplateOutlet]="branchTemplate()"
|
|
409
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
410
|
+
} @else {
|
|
411
|
+
<ng-container
|
|
412
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
413
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
@case ('group') {
|
|
418
|
+
@if (hasChildren(child)) {
|
|
419
|
+
<ng-container
|
|
420
|
+
[ngTemplateOutlet]="groupTemplate()"
|
|
421
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
422
|
+
<navigation-tree-outlet
|
|
423
|
+
[items]="child.children || []"
|
|
424
|
+
[level]="level() + 1"
|
|
425
|
+
[parentKey]="resolveParentKey(parentKey(), child)"
|
|
426
|
+
[data]="data()"
|
|
427
|
+
[branchTemplate]="branchTemplate()"
|
|
428
|
+
[leafTemplate]="leafTemplate()"
|
|
429
|
+
[groupTemplate]="groupTemplate()"
|
|
430
|
+
[dividerTemplate]="dividerTemplate()"
|
|
431
|
+
[spacerTemplate]="spacerTemplate()"
|
|
432
|
+
[trackByFn]="trackByFn()"
|
|
433
|
+
[shouldRenderItemFn]="shouldRenderItemFn()"
|
|
434
|
+
[hasChildrenFn]="hasChildrenFn()"
|
|
435
|
+
[resolveParentKeyFn]="resolveParentKeyFn()" />
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
@case ('divider') {
|
|
440
|
+
@if (dividerTemplate()) {
|
|
441
|
+
<ng-container
|
|
442
|
+
[ngTemplateOutlet]="dividerTemplate()"
|
|
443
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
@case ('spacer') {
|
|
448
|
+
@if (spacerTemplate()) {
|
|
449
|
+
<ng-container
|
|
450
|
+
[ngTemplateOutlet]="spacerTemplate()"
|
|
451
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
@default {
|
|
456
|
+
<ng-container
|
|
457
|
+
[ngTemplateOutlet]="leafTemplate()"
|
|
458
|
+
[ngTemplateOutletContext]="templateContext(child, isLast)"></ng-container>
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
`, imports: [NgTemplateOutlet, forwardRef(() => NavigationTreeOutlet)], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [":host{display:block}\n"] }]
|
|
464
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], parentKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentKey", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], branchTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "branchTemplate", required: true }] }], leafTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "leafTemplate", required: true }] }], groupTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupTemplate", required: true }] }], dividerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividerTemplate", required: false }] }], spacerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacerTemplate", required: false }] }], trackByFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackByFn", required: false }] }], shouldRenderItemFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "shouldRenderItemFn", required: false }] }], hasChildrenFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenFn", required: false }] }], resolveParentKeyFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "resolveParentKeyFn", required: false }] }] } });
|
|
465
|
+
|
|
51
466
|
/* Internal composition utilities for library entrypoints. Not part of the supported consumer API. */
|
|
52
467
|
|
|
53
468
|
/**
|
|
54
469
|
* Generated bundle index. Do not edit.
|
|
55
470
|
*/
|
|
56
471
|
|
|
57
|
-
export { LocalStorageStateAdapter, libraryLucideConfigProvider };
|
|
472
|
+
export { LocalStorageStateAdapter, NavigationItemContent, NavigationTreeOutlet, getNavigationTreePathKey, hasActiveNavigationDescendant, isNavigationTreeDescendant, isNavigationTreeItemExpanded, libraryLucideConfigProvider, toggleNavigationTreeItemExpanded, trackNavigationTreeItem };
|
|
58
473
|
//# sourceMappingURL=ojiepermana-angular-internal.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ojiepermana-angular-internal.mjs","sources":["../../../projects/library/internal/src/lucide-config.provider.ts","../../../projects/library/internal/src/local-storage-state.ts","../../../projects/library/internal/public-api.ts","../../../projects/library/internal/ojiepermana-angular-internal.ts"],"sourcesContent":["import { provideLucideConfig } from '@lucide/angular';\n\nexport const libraryLucideConfigProvider = provideLucideConfig({\n absoluteStrokeWidth: true,\n strokeWidth: 1.35,\n});\n","interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\ninterface LocalStorageStateAdapterConfig<Axis extends string> {\n readonly isBrowser: boolean;\n readonly storage: StorageLike | null;\n readonly keys: Record<Axis, string>;\n readonly legacyPrefix: string;\n}\n\nexport class LocalStorageStateAdapter<Axis extends string> {\n constructor(private readonly config: LocalStorageStateAdapterConfig<Axis>) {}\n\n clear(axis: Axis): void {\n if (!this.config.isBrowser || !this.config.storage) {\n return;\n }\n\n this.config.storage.removeItem(this.key(axis));\n this.config.storage.removeItem(this.legacyKey(axis));\n }\n\n persist(axis: Axis, value: string): void {\n if (!this.config.isBrowser || !this.config.storage) {\n return;\n }\n\n this.config.storage.setItem(this.key(axis), value);\n this.config.storage.removeItem(this.legacyKey(axis));\n }\n\n read<T extends string>(axis: Axis, fallback: T, isValid: (value: string) => value is T): T {\n if (!this.config.isBrowser || !this.config.storage) {\n return fallback;\n }\n\n const storedValue = this.config.storage.getItem(this.key(axis));\n\n if (storedValue && isValid(storedValue)) {\n return storedValue;\n }\n\n const legacyValue = this.config.storage.getItem(this.legacyKey(axis));\n\n if (legacyValue && isValid(legacyValue)) {\n this.config.storage.setItem(this.key(axis), legacyValue);\n this.config.storage.removeItem(this.legacyKey(axis));\n return legacyValue;\n }\n\n return fallback;\n }\n\n private key(axis: Axis): string {\n return this.config.keys[axis];\n }\n\n private legacyKey(axis: Axis): string {\n return `${this.config.legacyPrefix}:${axis}`;\n }\n}\n","/* Internal composition utilities for library entrypoints. Not part of the supported consumer API. */\n\nexport { libraryLucideConfigProvider } from './src/lucide-config.provider';\nexport { LocalStorageStateAdapter } from './src/local-storage-state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAEO,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAC7D,IAAA,mBAAmB,EAAE,IAAI;AACzB,IAAA,WAAW,EAAE,IAAI;AAClB,CAAA;;MCQY,wBAAwB,CAAA;AACN,IAAA,MAAA;AAA7B,IAAA,WAAA,CAA6B,MAA4C,EAAA;QAA5C,IAAA,CAAA,MAAM,GAAN,MAAM;IAAyC;AAE5E,IAAA,KAAK,CAAC,IAAU,EAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAClD;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD;IAEA,OAAO,CAAC,IAAU,EAAE,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAClD;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;AAClD,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD;AAEA,IAAA,IAAI,CAAmB,IAAU,EAAE,QAAW,EAAE,OAAsC,EAAA;AACpF,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AAClD,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAE/D,QAAA,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACvC,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAErE,QAAA,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;AACxD,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpD,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,GAAG,CAAC,IAAU,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEQ,IAAA,SAAS,CAAC,IAAU,EAAA;QAC1B,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;IAC9C;AACD;;AC/DD;;ACAA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ojiepermana-angular-internal.mjs","sources":["../../../projects/library/internal/src/lucide-config.provider.ts","../../../projects/library/internal/src/local-storage-state.ts","../../../projects/library/internal/src/navigation/navigation-item-content.ts","../../../projects/library/internal/src/navigation/navigation-tree.utils.ts","../../../projects/library/internal/src/navigation/navigation-tree-outlet.ts","../../../projects/library/internal/public-api.ts","../../../projects/library/internal/ojiepermana-angular-internal.ts"],"sourcesContent":["import { provideLucideConfig } from '@lucide/angular';\n\nexport const libraryLucideConfigProvider = provideLucideConfig({\n absoluteStrokeWidth: true,\n strokeWidth: 1.35,\n});\n","interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\ninterface LocalStorageStateAdapterConfig<Axis extends string> {\n readonly isBrowser: boolean;\n readonly storage: StorageLike | null;\n readonly keys: Record<Axis, string>;\n readonly legacyPrefix: string;\n}\n\nexport class LocalStorageStateAdapter<Axis extends string> {\n constructor(private readonly config: LocalStorageStateAdapterConfig<Axis>) {}\n\n clear(axis: Axis): void {\n if (!this.config.isBrowser || !this.config.storage) {\n return;\n }\n\n this.config.storage.removeItem(this.key(axis));\n this.config.storage.removeItem(this.legacyKey(axis));\n }\n\n persist(axis: Axis, value: string): void {\n if (!this.config.isBrowser || !this.config.storage) {\n return;\n }\n\n this.config.storage.setItem(this.key(axis), value);\n this.config.storage.removeItem(this.legacyKey(axis));\n }\n\n read<T extends string>(axis: Axis, fallback: T, isValid: (value: string) => value is T): T {\n if (!this.config.isBrowser || !this.config.storage) {\n return fallback;\n }\n\n const storedValue = this.config.storage.getItem(this.key(axis));\n\n if (storedValue && isValid(storedValue)) {\n return storedValue;\n }\n\n const legacyValue = this.config.storage.getItem(this.legacyKey(axis));\n\n if (legacyValue && isValid(legacyValue)) {\n this.config.storage.setItem(this.key(axis), legacyValue);\n this.config.storage.removeItem(this.legacyKey(axis));\n return legacyValue;\n }\n\n return fallback;\n }\n\n private key(axis: Axis): string {\n return this.config.keys[axis];\n }\n\n private legacyKey(axis: Axis): string {\n return `${this.config.legacyPrefix}:${axis}`;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport { LucideDynamicIcon, icons as lucideIcons, type LucideIcon } from '@lucide/angular';\nimport { NavigationItem } from '@ojiepermana/angular/navigation';\n\nimport { libraryLucideConfigProvider } from '../lucide-config.provider';\n\ntype NavigationItemContentVariant = 'horizontal' | 'vertical' | 'vertical-group';\n\nconst navigationLucideIconRegistry = buildNavigationLucideIconRegistry();\n\nfunction buildNavigationLucideIconRegistry(): ReadonlyMap<string, LucideIcon> {\n const registry = new Map<string, LucideIcon>();\n\n for (const icon of Object.values(lucideIcons) as LucideIcon[]) {\n registry.set(icon.icon.name, icon);\n\n for (const alias of icon.icon.aliases ?? []) {\n registry.set(alias, icon);\n }\n }\n\n return registry;\n}\n\n@Component({\n selector: 'navigation-item-content',\n template: `\n @if (variant() === 'horizontal') {\n <span class=\"horizontal-navigation-item-body\">\n <span\n class=\"horizontal-navigation-item-leading\"\n [class.horizontal-navigation-item-leading--nested]=\"level() > 0\">\n @if (resolvedIcon(); as icon) {\n <svg\n [lucideIcon]=\"icon\"\n [absoluteStrokeWidth]=\"true\"\n [attr.class]=\"horizontalIconClass()\"\n aria-hidden=\"true\"></svg>\n }\n <span [attr.class]=\"horizontalTitleClass()\">\n {{ item().title }}\n </span>\n </span>\n\n @if (item().badge?.title) {\n <span [attr.class]=\"horizontalBadgeClass()\">\n {{ item().badge?.title }}\n </span>\n }\n </span>\n } @else {\n <span class=\"kit-navigation-item-content\">\n @if (resolvedIcon(); as icon) {\n <svg\n [lucideIcon]=\"icon\"\n [absoluteStrokeWidth]=\"true\"\n [attr.class]=\"verticalIconClass()\"\n [size]=\"18\"\n aria-hidden=\"true\"></svg>\n }\n\n <div class=\"kit-navigation-item-title-wrapper\">\n <div [class]=\"titleContainerClass()\">\n <span [attr.class]=\"titleClass()\">\n {{ item().title }}\n </span>\n </div>\n\n @if (item().subtitle) {\n <div [class]=\"subtitleContainerClass()\">\n <span [attr.class]=\"subtitleClass()\">\n {{ item().subtitle }}\n </span>\n </div>\n }\n </div>\n\n @if (item().badge?.title) {\n <div class=\"kit-navigation-item-badge\">\n <div [attr.class]=\"verticalBadgeClass()\">\n {{ item().badge?.title }}\n </div>\n </div>\n }\n </span>\n }\n `,\n styles: [\n `\n :host {\n display: contents;\n }\n\n .kit-navigation-item-content {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n }\n\n .kit-navigation-item-title-wrapper {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n flex-direction: column;\n }\n\n .kit-navigation-item-title,\n .kit-navigation-group-title,\n .kit-navigation-item-subtitle,\n .kit-navigation-group-subtitle {\n min-width: 0;\n }\n `,\n ],\n imports: [LucideDynamicIcon],\n providers: [libraryLucideConfigProvider],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NavigationItemContent {\n item = input.required<NavigationItem>();\n level = input(0);\n variant = input<NavigationItemContentVariant>('horizontal');\n\n protected readonly resolvedIcon = computed(() => {\n const iconName = this.item().icon;\n return iconName ? (navigationLucideIconRegistry.get(iconName) ?? null) : null;\n });\n\n protected readonly horizontalIconClass = computed(() =>\n this.joinClasses('horizontal-navigation-item-icon', this.item().classes?.icon),\n );\n protected readonly verticalIconClass = computed(() =>\n this.joinClasses('kit-navigation-item-icon', this.item().classes?.icon),\n );\n protected readonly horizontalTitleClass = computed(() =>\n this.joinClasses('horizontal-navigation-item-label', this.item().classes?.title),\n );\n protected readonly titleClass = computed(() => this.item().classes?.title ?? null);\n protected readonly subtitleClass = computed(() => this.item().classes?.subtitle ?? null);\n protected readonly horizontalBadgeClass = computed(() =>\n this.joinClasses(\n 'horizontal-navigation-item-badge',\n !this.item().badge?.classes ? 'bg-primary text-primary-foreground' : null,\n this.item().badge?.classes,\n ),\n );\n protected readonly verticalBadgeClass = computed(() =>\n this.joinClasses('kit-navigation-item-badge-content', this.item().badge?.classes),\n );\n protected readonly titleContainerClass = computed(() =>\n this.variant() === 'vertical-group' ? 'kit-navigation-group-title' : 'kit-navigation-item-title',\n );\n protected readonly subtitleContainerClass = computed(() =>\n this.variant() === 'vertical-group' ? 'kit-navigation-group-subtitle' : 'kit-navigation-item-subtitle',\n );\n\n private joinClasses(...classNames: Array<string | null | undefined | false>): string | null {\n const value = classNames.filter((className): className is string => !!className).join(' ');\n return value || null;\n }\n}\n","import { NavigationItem, getNavigationChildren, hasNavigationChildren } from '@ojiepermana/angular/navigation';\n\nexport type NavigationExpandedItemsByParent = Record<string, string>;\n\nexport function trackNavigationTreeItem(index: number, item: NavigationItem): string | number | undefined {\n return item.id || item.title || index;\n}\n\nexport function getNavigationTreePathKey(parentKey: string, item: NavigationItem): string {\n const key = item.id || item.title;\n if (!key) {\n return parentKey;\n }\n\n return `${parentKey}/${key}`;\n}\n\nexport function isNavigationTreeItemExpanded(\n expandedByParent: NavigationExpandedItemsByParent,\n parentKey: string,\n item: NavigationItem,\n): boolean {\n return expandedByParent[parentKey] === getNavigationTreePathKey(parentKey, item);\n}\n\nexport function toggleNavigationTreeItemExpanded(\n expandedByParent: NavigationExpandedItemsByParent,\n parentKey: string,\n item: NavigationItem,\n): NavigationExpandedItemsByParent {\n const key = getNavigationTreePathKey(parentKey, item);\n\n if (expandedByParent[parentKey] === key) {\n const next = { ...expandedByParent };\n delete next[parentKey];\n return next;\n }\n\n return {\n ...expandedByParent,\n [parentKey]: key,\n };\n}\n\nexport function hasActiveNavigationDescendant(\n item: NavigationItem,\n isItemActive: (item: NavigationItem) => boolean,\n): boolean {\n for (const child of getNavigationChildren(item)) {\n if (isItemActive(child)) {\n return true;\n }\n\n if (hasNavigationChildren(child) && hasActiveNavigationDescendant(child, isItemActive)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isNavigationTreeDescendant(parent: NavigationItem, item: NavigationItem): boolean {\n for (const child of getNavigationChildren(parent)) {\n if (child === item) {\n return true;\n }\n\n if (hasNavigationChildren(child) && isNavigationTreeDescendant(child, item)) {\n return true;\n }\n }\n\n return false;\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, input, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { NavigationItem, hasNavigationChildren, shouldRenderNavigationItem } from '@ojiepermana/angular/navigation';\n\nimport { getNavigationTreePathKey, trackNavigationTreeItem } from './navigation-tree.utils';\n\nexport type NavigationTreeTemplateData = Record<string, unknown>;\n\nexport interface NavigationTreeItemContext {\n $implicit: NavigationItem;\n level: number;\n parentKey: string;\n isLast: boolean;\n data: NavigationTreeTemplateData | null;\n}\n\n@Component({\n selector: 'navigation-tree-outlet',\n template: `\n @for (child of items(); track trackItem($index, child); let isLast = $last) {\n @if (shouldRender(child)) {\n @switch (child.type) {\n @case ('basic') {\n <ng-container\n [ngTemplateOutlet]=\"leafTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n\n @case ('aside') {\n @if (hasChildren(child)) {\n <ng-container\n [ngTemplateOutlet]=\"branchTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"leafTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n }\n\n @case ('collapsable') {\n @if (hasChildren(child)) {\n <ng-container\n [ngTemplateOutlet]=\"branchTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"leafTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n }\n\n @case ('group') {\n @if (hasChildren(child)) {\n <ng-container\n [ngTemplateOutlet]=\"groupTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n <navigation-tree-outlet\n [items]=\"child.children || []\"\n [level]=\"level() + 1\"\n [parentKey]=\"resolveParentKey(parentKey(), child)\"\n [data]=\"data()\"\n [branchTemplate]=\"branchTemplate()\"\n [leafTemplate]=\"leafTemplate()\"\n [groupTemplate]=\"groupTemplate()\"\n [dividerTemplate]=\"dividerTemplate()\"\n [spacerTemplate]=\"spacerTemplate()\"\n [trackByFn]=\"trackByFn()\"\n [shouldRenderItemFn]=\"shouldRenderItemFn()\"\n [hasChildrenFn]=\"hasChildrenFn()\"\n [resolveParentKeyFn]=\"resolveParentKeyFn()\" />\n }\n }\n\n @case ('divider') {\n @if (dividerTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"dividerTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n }\n\n @case ('spacer') {\n @if (spacerTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"spacerTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n }\n\n @default {\n <ng-container\n [ngTemplateOutlet]=\"leafTemplate()\"\n [ngTemplateOutletContext]=\"templateContext(child, isLast)\"></ng-container>\n }\n }\n }\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n imports: [NgTemplateOutlet, forwardRef(() => NavigationTreeOutlet)],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NavigationTreeOutlet {\n items = input<NavigationItem[]>([]);\n level = input(0);\n parentKey = input('root');\n data = input<NavigationTreeTemplateData | null>(null);\n\n branchTemplate = input.required<TemplateRef<NavigationTreeItemContext>>();\n leafTemplate = input.required<TemplateRef<NavigationTreeItemContext>>();\n groupTemplate = input.required<TemplateRef<NavigationTreeItemContext>>();\n dividerTemplate = input<TemplateRef<NavigationTreeItemContext> | null>(null);\n spacerTemplate = input<TemplateRef<NavigationTreeItemContext> | null>(null);\n\n trackByFn = input<(index: number, item: NavigationItem) => string | number | undefined>(trackNavigationTreeItem);\n shouldRenderItemFn = input<(item: NavigationItem) => boolean>(shouldRenderNavigationItem);\n hasChildrenFn = input<(item: NavigationItem) => boolean>(hasNavigationChildren);\n resolveParentKeyFn = input<(parentKey: string, item: NavigationItem) => string>(getNavigationTreePathKey);\n\n trackItem(index: number, item: NavigationItem): string | number | undefined {\n return this.trackByFn()(index, item);\n }\n\n shouldRender(item: NavigationItem): boolean {\n return this.shouldRenderItemFn()(item);\n }\n\n hasChildren(item: NavigationItem): boolean {\n return this.hasChildrenFn()(item);\n }\n\n resolveParentKey(parentKey: string, item: NavigationItem): string {\n return this.resolveParentKeyFn()(parentKey, item);\n }\n\n templateContext(item: NavigationItem, isLast: boolean): NavigationTreeItemContext {\n return {\n $implicit: item,\n level: this.level(),\n parentKey: this.parentKey(),\n isLast,\n data: this.data(),\n };\n }\n}\n","/* Internal composition utilities for library entrypoints. Not part of the supported consumer API. */\n\nexport { libraryLucideConfigProvider } from './src/lucide-config.provider';\nexport { LocalStorageStateAdapter } from './src/local-storage-state';\nexport { NavigationItemContent } from './src/navigation/navigation-item-content';\nexport {\n NavigationTreeOutlet,\n type NavigationTreeItemContext,\n type NavigationTreeTemplateData,\n} from './src/navigation/navigation-tree-outlet';\nexport {\n getNavigationTreePathKey,\n hasActiveNavigationDescendant,\n isNavigationTreeDescendant,\n isNavigationTreeItemExpanded,\n toggleNavigationTreeItemExpanded,\n trackNavigationTreeItem,\n type NavigationExpandedItemsByParent,\n} from './src/navigation/navigation-tree.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["lucideIcons"],"mappings":";;;;;;AAEO,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAC7D,IAAA,mBAAmB,EAAE,IAAI;AACzB,IAAA,WAAW,EAAE,IAAI;AAClB,CAAA;;MCQY,wBAAwB,CAAA;AACN,IAAA,MAAA;AAA7B,IAAA,WAAA,CAA6B,MAA4C,EAAA;QAA5C,IAAA,CAAA,MAAM,GAAN,MAAM;IAAyC;AAE5E,IAAA,KAAK,CAAC,IAAU,EAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAClD;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD;IAEA,OAAO,CAAC,IAAU,EAAE,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAClD;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;AAClD,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD;AAEA,IAAA,IAAI,CAAmB,IAAU,EAAE,QAAW,EAAE,OAAsC,EAAA;AACpF,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AAClD,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAE/D,QAAA,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACvC,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAErE,QAAA,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;AACxD,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpD,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,GAAG,CAAC,IAAU,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEQ,IAAA,SAAS,CAAC,IAAU,EAAA;QAC1B,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;IAC9C;AACD;;ACvDD,MAAM,4BAA4B,GAAG,iCAAiC,EAAE;AAExE,SAAS,iCAAiC,GAAA;AACxC,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB;IAE9C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAACA,KAAW,CAAiB,EAAE;QAC7D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAElC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE;AAC3C,YAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;QAC3B;IACF;AAEA,IAAA,OAAO,QAAQ;AACjB;MAkGa,qBAAqB,CAAA;AAChC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAkB;AACvC,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,4EAAC;AAChB,IAAA,OAAO,GAAG,KAAK,CAA+B,YAAY,8EAAC;AAExC,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI;AACjC,QAAA,OAAO,QAAQ,IAAI,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,IAAI;AAC/E,IAAA,CAAC,mFAAC;IAEiB,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,WAAW,CAAC,iCAAiC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC/E;IACkB,iBAAiB,GAAG,QAAQ,CAAC,MAC9C,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxE;IACkB,oBAAoB,GAAG,QAAQ,CAAC,MACjD,IAAI,CAAC,WAAW,CAAC,kCAAkC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjF;AACkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,iFAAC;AAC/D,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,oFAAC;AACrE,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MACjD,IAAI,CAAC,WAAW,CACd,kCAAkC,EAClC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,oCAAoC,GAAG,IAAI,EACzE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAC3B,2FACF;IACkB,kBAAkB,GAAG,QAAQ,CAAC,MAC/C,IAAI,CAAC,WAAW,CAAC,mCAAmC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClF;IACkB,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,OAAO,EAAE,KAAK,gBAAgB,GAAG,4BAA4B,GAAG,2BAA2B,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjG;IACkB,sBAAsB,GAAG,QAAQ,CAAC,MACnD,IAAI,CAAC,OAAO,EAAE,KAAK,gBAAgB,GAAG,+BAA+B,GAAG,8BAA8B,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACvG;IAEO,WAAW,CAAC,GAAG,UAAoD,EAAA;QACzE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,KAA0B,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1F,OAAO,KAAK,IAAI,IAAI;IACtB;uGAzCW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAJrB,CAAC,2BAA2B,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1F9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+UAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA6BS,iBAAiB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAKhB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAhGjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,QAAA,EACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA,EAAA,OAAA,EA6BQ,CAAC,iBAAiB,CAAC,EAAA,SAAA,EACjB,CAAC,2BAA2B,CAAC,EAAA,eAAA,EACvB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,MAAA,EAAA,CAAA,+UAAA,CAAA,EAAA;;;AClHjC,SAAU,uBAAuB,CAAC,KAAa,EAAE,IAAoB,EAAA;IACzE,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AACvC;AAEM,SAAU,wBAAwB,CAAC,SAAiB,EAAE,IAAoB,EAAA;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK;IACjC,IAAI,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,EAAE;AAC9B;SAEgB,4BAA4B,CAC1C,gBAAiD,EACjD,SAAiB,EACjB,IAAoB,EAAA;IAEpB,OAAO,gBAAgB,CAAC,SAAS,CAAC,KAAK,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC;AAClF;SAEgB,gCAAgC,CAC9C,gBAAiD,EACjD,SAAiB,EACjB,IAAoB,EAAA;IAEpB,MAAM,GAAG,GAAG,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC;AAErD,IAAA,IAAI,gBAAgB,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,gBAAgB,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC;AACtB,QAAA,OAAO,IAAI;IACb;IAEA,OAAO;AACL,QAAA,GAAG,gBAAgB;QACnB,CAAC,SAAS,GAAG,GAAG;KACjB;AACH;AAEM,SAAU,6BAA6B,CAC3C,IAAoB,EACpB,YAA+C,EAAA;IAE/C,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE;AAC/C,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,6BAA6B,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE;AACtF,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,0BAA0B,CAAC,MAAsB,EAAE,IAAoB,EAAA;IACrF,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE;AACjD,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AAC3E,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;MCqCa,oBAAoB,CAAA;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAmB,EAAE,4EAAC;AACnC,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,4EAAC;AAChB,IAAA,SAAS,GAAG,KAAK,CAAC,MAAM,gFAAC;AACzB,IAAA,IAAI,GAAG,KAAK,CAAoC,IAAI,2EAAC;AAErD,IAAA,cAAc,GAAG,KAAK,CAAC,QAAQ,oFAA0C;AACzE,IAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,kFAA0C;AACvE,IAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,mFAA0C;AACxE,IAAA,eAAe,GAAG,KAAK,CAAgD,IAAI,sFAAC;AAC5E,IAAA,cAAc,GAAG,KAAK,CAAgD,IAAI,qFAAC;AAE3E,IAAA,SAAS,GAAG,KAAK,CAAuE,uBAAuB,gFAAC;AAChH,IAAA,kBAAkB,GAAG,KAAK,CAAoC,0BAA0B,yFAAC;AACzF,IAAA,aAAa,GAAG,KAAK,CAAoC,qBAAqB,oFAAC;AAC/E,IAAA,kBAAkB,GAAG,KAAK,CAAsD,wBAAwB,yFAAC;IAEzG,SAAS,CAAC,KAAa,EAAE,IAAoB,EAAA;QAC3C,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACtC;AAEA,IAAA,YAAY,CAAC,IAAoB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC;IACxC;AAEA,IAAA,WAAW,CAAC,IAAoB,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;IACnC;IAEA,gBAAgB,CAAC,SAAiB,EAAE,IAAoB,EAAA;QACtD,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IACnD;IAEA,eAAe,CAAC,IAAoB,EAAE,MAAe,EAAA;QACnD,OAAO;AACL,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,MAAM;AACN,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;SAClB;IACH;uGAzCW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5FrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAYU,oBAAoB,2SAJrB,gBAAgB,CAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAIf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA9FhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,QAAA,EACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFT,EAAA,CAAA,EAAA,OAAA,EAQQ,CAAC,gBAAgB,EAAE,UAAU,CAAC,MAAK,oBAAqB,CAAC,CAAC,mBAClD,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;;AC5GvC;;ACAA;;AAEG;;;;"}
|