@ojiepermana/angular 0.0.2 → 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.
Files changed (42) hide show
  1. package/README.md +50 -7
  2. package/fesm2022/ojiepermana-angular-internal.mjs +417 -2
  3. package/fesm2022/ojiepermana-angular-internal.mjs.map +1 -1
  4. package/fesm2022/ojiepermana-angular-layout.mjs +8 -18
  5. package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
  6. package/fesm2022/ojiepermana-angular-navigation-horizontal.mjs +785 -0
  7. package/fesm2022/ojiepermana-angular-navigation-horizontal.mjs.map +1 -0
  8. package/fesm2022/ojiepermana-angular-navigation-vertical.mjs +1568 -0
  9. package/fesm2022/ojiepermana-angular-navigation-vertical.mjs.map +1 -0
  10. package/fesm2022/ojiepermana-angular-navigation.mjs +176 -0
  11. package/fesm2022/ojiepermana-angular-navigation.mjs.map +1 -0
  12. package/fesm2022/ojiepermana-angular-theme-component.mjs +14 -28
  13. package/fesm2022/ojiepermana-angular-theme-component.mjs.map +1 -1
  14. package/fesm2022/ojiepermana-angular-theme-service.mjs +5 -7
  15. package/fesm2022/ojiepermana-angular-theme-service.mjs.map +1 -1
  16. package/fesm2022/ojiepermana-angular.mjs.map +1 -1
  17. package/layout/README.md +2 -1
  18. package/navigation/README.md +215 -0
  19. package/package.json +13 -1
  20. package/styles/index.css +1 -1
  21. package/theme/README.md +1 -4
  22. package/theme/styles/adapters/material-ui/index.css +1 -6
  23. package/theme/styles/layout/horizontal.css +109 -0
  24. package/theme/styles/layout/index.css +19 -1
  25. package/theme/styles/layout/vertical.css +75 -0
  26. package/theme/styles/presets/colors/blue.css +35 -0
  27. package/theme/styles/presets/colors/brand.css +41 -0
  28. package/theme/styles/presets/colors/cyan.css +35 -0
  29. package/theme/styles/presets/colors/green.css +35 -0
  30. package/theme/styles/presets/colors/orange.css +35 -0
  31. package/theme/styles/presets/colors/purple.css +35 -0
  32. package/theme/styles/presets/colors/red.css +35 -0
  33. package/theme/styles/presets/styles/flat.css +51 -20
  34. package/theme/styles/presets/styles/glass.css +1 -7
  35. package/theme/styles/presets/styles/index.css +1 -1
  36. package/theme/styles/roles/index.css +18 -0
  37. package/theme/styles/tokens/foundation.css +4 -7
  38. package/types/ojiepermana-angular-internal.d.ts +64 -1
  39. package/types/ojiepermana-angular-navigation-horizontal.d.ts +77 -0
  40. package/types/ojiepermana-angular-navigation-vertical.d.ts +260 -0
  41. package/types/ojiepermana-angular-navigation.d.ts +182 -0
  42. package/layout/styles/index.css +0 -157
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @ojiepermana/angular
2
2
 
3
- Theme and layout primitives for Angular applications.
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 the shell components render `RouterOutlet`.
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":"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"}