@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
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.735 0.031 260.347);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='blue'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='blue'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='blue'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='blue'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='blue'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='blue'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -9,3 +9,44 @@
9
9
  --theme-neutral: oklch(0.736 0.035 265.705);
10
10
  --theme-on-neutral: oklch(0.205 0.012 285.9);
11
11
  }
12
+
13
+ :root :where(h1, h2, h3, h4, h5, h6, a),
14
+ [data-theme-color='brand'] :where(h1, h2, h3, h4, h5, h6, a) {
15
+ color: var(--primary);
16
+ }
17
+
18
+ :root :where(a),
19
+ [data-theme-color='brand'] :where(a) {
20
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
21
+ text-decoration-thickness: 0.08em;
22
+ text-underline-offset: 0.18em;
23
+ transition:
24
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
25
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
26
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
27
+ }
28
+
29
+ :root :where(a:hover),
30
+ [data-theme-color='brand'] :where(a:hover) {
31
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
32
+ text-decoration-color: currentColor;
33
+ }
34
+
35
+ :root :where(a:visited),
36
+ [data-theme-color='brand'] :where(a:visited) {
37
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
38
+ }
39
+
40
+ :root :where(a:active),
41
+ [data-theme-color='brand'] :where(a:active) {
42
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
43
+ text-decoration-color: currentColor;
44
+ }
45
+
46
+ :root :where(a:focus-visible),
47
+ [data-theme-color='brand'] :where(a:focus-visible) {
48
+ outline: 2px solid var(--control-focus-ring);
49
+ outline-offset: 2px;
50
+ border-radius: 0.15em;
51
+ text-decoration-color: currentColor;
52
+ }
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.756 0.024 242.306);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='cyan'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='cyan'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='cyan'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='cyan'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='cyan'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='cyan'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.749 0.02 176.021);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='green'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='green'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='green'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='green'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='green'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='green'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.757 0.016 44.49);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='orange'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='orange'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='orange'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='orange'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='orange'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='orange'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.74 0.039 307.23);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='purple'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='purple'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='purple'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='purple'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='purple'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='purple'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -8,3 +8,38 @@
8
8
  --theme-neutral: oklch(0.742 0.032 8.67);
9
9
  --theme-on-neutral: oklch(0.205 0.012 285.9);
10
10
  }
11
+
12
+ [data-theme-color='red'] :where(h1, h2, h3, h4, h5, h6, a) {
13
+ color: var(--primary);
14
+ }
15
+
16
+ [data-theme-color='red'] :where(a) {
17
+ text-decoration-color: color-mix(in oklab, currentColor 36%, transparent);
18
+ text-decoration-thickness: 0.08em;
19
+ text-underline-offset: 0.18em;
20
+ transition:
21
+ color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
22
+ text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
23
+ outline-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
24
+ }
25
+
26
+ [data-theme-color='red'] :where(a:hover) {
27
+ color: color-mix(in oklab, var(--primary) 84%, var(--foreground));
28
+ text-decoration-color: currentColor;
29
+ }
30
+
31
+ [data-theme-color='red'] :where(a:visited) {
32
+ color: color-mix(in oklab, var(--primary) 72%, var(--tertiary-solid) 28%);
33
+ }
34
+
35
+ [data-theme-color='red'] :where(a:active) {
36
+ color: color-mix(in oklab, var(--primary) 70%, var(--foreground));
37
+ text-decoration-color: currentColor;
38
+ }
39
+
40
+ [data-theme-color='red'] :where(a:focus-visible) {
41
+ outline: 2px solid var(--control-focus-ring);
42
+ outline-offset: 2px;
43
+ border-radius: 0.15em;
44
+ text-decoration-color: currentColor;
45
+ }
@@ -1,30 +1,61 @@
1
1
  :root,
2
2
  [data-theme-style='flat'] {
3
- --typeface-plain: var(
4
- --theme-style-flat-plain-font,
5
- ui-sans-serif,
6
- system-ui,
7
- -apple-system,
8
- BlinkMacSystemFont,
9
- 'Segoe UI',
10
- sans-serif
11
- );
3
+ --typeface-plain: var(--theme-style-flat-plain-font, 'Helvetica Neue', 'Arial Nova', sans-serif);
12
4
  --typeface-brand: var(--theme-style-flat-brand-font, var(--typeface-plain));
13
- --typeface-mono: var(
14
- --theme-style-flat-mono-font,
15
- 'SFMono-Regular',
16
- 'Cascadia Mono',
17
- 'Liberation Mono',
18
- ui-monospace,
19
- monospace
20
- );
5
+ --typeface-mono: var(--theme-style-flat-mono-font, 'Azeret Mono', ui-monospace, monospace);
6
+ --radius: 0.5rem;
7
+ --background: #f2f1ed;
8
+ --foreground: #26251e;
9
+ --card: #ebeae5;
10
+ --card-foreground: var(--foreground);
11
+ --popover: #f7f7f4;
12
+ --popover-foreground: var(--foreground);
13
+ --muted: #e6e5e0;
14
+ --muted-foreground: rgb(38 37 30 / 0.62);
15
+ --border: oklab(0.263084 -0.00230259 0.0124794 / 0.1);
16
+ --input: oklab(0.263084 -0.00230259 0.0124794 / 0.16);
17
+ --ring: color-mix(in oklab, var(--theme-primary) 34%, var(--foreground));
18
+ --sidebar: #e6e5e0;
19
+ --sidebar-foreground: var(--foreground);
20
+ --sidebar-primary: color-mix(in oklab, var(--foreground) 8%, var(--background));
21
+ --sidebar-primary-foreground: var(--foreground);
22
+ --sidebar-accent: color-mix(in oklab, var(--theme-primary) 12%, var(--sidebar));
23
+ --sidebar-accent-foreground: var(--foreground);
21
24
  --shell-surface: var(--card);
22
25
  --shell-foreground: var(--card-foreground);
23
26
  --shell-border: var(--border);
24
- --shell-shadow: var(--shadow-xs);
27
+ --shell-shadow:
28
+ rgb(0 0 0 / 0.14) 0 28px 70px, rgb(0 0 0 / 0.1) 0 14px 32px, oklab(0.263084 -0.00230259 0.0124794 / 0.1) 0 0 0 1px;
25
29
  --shell-backdrop: var(--backdrop);
26
30
  --surface-elevated: var(--popover);
27
31
  --surface-elevated-foreground: var(--popover-foreground);
28
- --surface-elevated-border: var(--border);
29
- --surface-elevated-shadow: var(--shadow-sm);
32
+ --surface-elevated-border: oklab(0.263084 -0.00230259 0.0124794 / 0.2);
33
+ --surface-elevated-shadow:
34
+ rgb(0 0 0 / 0.12) 0 24px 52px, rgb(0 0 0 / 0.08) 0 10px 24px, oklab(0.263084 -0.00230259 0.0124794 / 0.1) 0 0 0 1px;
35
+ }
36
+
37
+ .dark[data-theme-style='flat'] {
38
+ --background: #181710;
39
+ --foreground: #ebe7de;
40
+ --card: #24221a;
41
+ --card-foreground: var(--foreground);
42
+ --popover: #2b2820;
43
+ --popover-foreground: var(--foreground);
44
+ --muted: #302d24;
45
+ --muted-foreground: rgb(235 231 222 / 0.72);
46
+ --border: rgb(235 231 222 / 0.12);
47
+ --input: rgb(235 231 222 / 0.18);
48
+ --ring: color-mix(in oklab, var(--theme-primary) 48%, var(--foreground));
49
+ --sidebar: #1f1d16;
50
+ --sidebar-foreground: var(--foreground);
51
+ --sidebar-primary: color-mix(in oklab, var(--foreground) 12%, var(--background));
52
+ --sidebar-primary-foreground: var(--foreground);
53
+ --sidebar-accent: color-mix(in oklab, var(--theme-primary) 18%, var(--sidebar));
54
+ --sidebar-accent-foreground: var(--foreground);
55
+ --shell-shadow: rgb(0 0 0 / 0.44) 0 28px 70px, rgb(0 0 0 / 0.28) 0 14px 32px, rgb(235 231 222 / 0.08) 0 0 0 1px;
56
+ --surface-elevated: #2b2820;
57
+ --surface-elevated-foreground: var(--foreground);
58
+ --surface-elevated-border: rgb(235 231 222 / 0.12);
59
+ --surface-elevated-shadow:
60
+ rgb(0 0 0 / 0.42) 0 24px 60px, rgb(0 0 0 / 0.28) 0 12px 28px, rgb(235 231 222 / 0.08) 0 0 0 1px;
30
61
  }
@@ -7,13 +7,7 @@
7
7
  ui-sans-serif,
8
8
  sans-serif
9
9
  );
10
- --typeface-brand: var(
11
- --theme-style-glass-brand-font,
12
- ui-rounded,
13
- 'Avenir Next',
14
- 'Segoe UI',
15
- sans-serif
16
- );
10
+ --typeface-brand: var(--theme-style-glass-brand-font, ui-rounded, 'Avenir Next', 'Segoe UI', sans-serif);
17
11
  --typeface-mono: var(
18
12
  --theme-style-glass-mono-font,
19
13
  'SFMono-Regular',
@@ -1,2 +1,2 @@
1
1
  @import './flat.css';
2
- @import './glass.css';
2
+ @import './glass.css';
@@ -3,6 +3,24 @@
3
3
  --nav-surface: color-mix(in oklab, var(--shell-surface) 92%, transparent);
4
4
  --nav-foreground: var(--shell-foreground);
5
5
  --nav-border: var(--shell-border);
6
+ --nav-font-family: var(--typeface-plain);
7
+ --nav-item-font-size: 0.875rem;
8
+ --nav-item-line-height: 1.25rem;
9
+ --nav-item-font-weight: 500;
10
+ --nav-item-active-font-weight: 600;
11
+ --nav-subtitle-font-size: 0.75rem;
12
+ --nav-subtitle-line-height: 1rem;
13
+ --nav-subtitle-font-weight: 400;
14
+ --nav-badge-font-size: 0.75rem;
15
+ --nav-badge-line-height: 1rem;
16
+ --nav-badge-font-weight: 600;
17
+ --nav-group-title-font-size: 0.75rem;
18
+ --nav-group-title-line-height: 1rem;
19
+ --nav-group-title-font-weight: 600;
20
+ --nav-group-title-letter-spacing: 0.08em;
21
+ --nav-group-subtitle-font-size: 0.75rem;
22
+ --nav-group-subtitle-line-height: 1rem;
23
+ --nav-group-subtitle-font-weight: 400;
6
24
  --nav-item-hover-surface: var(--tertiary-container);
7
25
  --nav-item-hover-foreground: var(--tertiary-container-foreground);
8
26
  --nav-item-active-surface: var(--secondary-container);
@@ -87,8 +87,7 @@
87
87
 
88
88
  /* Keep these radius tokens in :root as well so non-Tailwind consumers get the same values as @theme. */
89
89
  :root {
90
- --typeface-plain:
91
- ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
90
+ --typeface-plain: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
92
91
  --typeface-brand: var(--typeface-plain);
93
92
  --typeface-mono: 'SFMono-Regular', 'Cascadia Mono', 'Liberation Mono', ui-monospace, monospace;
94
93
  --radius: 0.75rem;
@@ -115,7 +114,7 @@
115
114
  --layout-shell-max-width: 100%;
116
115
  --layout-shell-padding: 0rem;
117
116
  --layout-shell-radius: 0rem;
118
- --layout-sidebar-width: 17rem;
117
+ --layout-sidebar-width: 280px;
119
118
  --layout-header-height: 3.75rem;
120
119
  --layout-header-display: grid;
121
120
  --layout-sidebar-display: flex;
@@ -131,9 +130,7 @@
131
130
  text-decoration-color var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard),
132
131
  backdrop-filter var(--ngt-motion-duration-medium) var(--ngt-motion-ease-standard);
133
132
  --ngt-shell-transition:
134
- var(--ngt-chrome-transition),
135
- border-radius var(--ngt-motion-duration-medium) var(--ngt-motion-ease-standard);
133
+ var(--ngt-chrome-transition), border-radius var(--ngt-motion-duration-medium) var(--ngt-motion-ease-standard);
136
134
  --ngt-control-transition:
137
- var(--ngt-chrome-transition),
138
- transform var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
135
+ var(--ngt-chrome-transition), transform var(--ngt-motion-duration-fast) var(--ngt-motion-ease-standard);
139
136
  }
@@ -1,4 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { TemplateRef } from '@angular/core';
3
+ import { LucideIcon } from '@lucide/angular';
4
+ import { NavigationItem } from '@ojiepermana/angular/navigation';
2
5
 
3
6
  declare const libraryLucideConfigProvider: _angular_core.Provider;
4
7
 
@@ -23,4 +26,64 @@ declare class LocalStorageStateAdapter<Axis extends string> {
23
26
  private legacyKey;
24
27
  }
25
28
 
26
- export { LocalStorageStateAdapter, libraryLucideConfigProvider };
29
+ type NavigationItemContentVariant = 'horizontal' | 'vertical' | 'vertical-group';
30
+ declare class NavigationItemContent {
31
+ item: _angular_core.InputSignal<NavigationItem>;
32
+ level: _angular_core.InputSignal<number>;
33
+ variant: _angular_core.InputSignal<NavigationItemContentVariant>;
34
+ protected readonly resolvedIcon: _angular_core.Signal<LucideIcon | null>;
35
+ protected readonly horizontalIconClass: _angular_core.Signal<string | null>;
36
+ protected readonly verticalIconClass: _angular_core.Signal<string | null>;
37
+ protected readonly horizontalTitleClass: _angular_core.Signal<string | null>;
38
+ protected readonly titleClass: _angular_core.Signal<string | null>;
39
+ protected readonly subtitleClass: _angular_core.Signal<string | null>;
40
+ protected readonly horizontalBadgeClass: _angular_core.Signal<string | null>;
41
+ protected readonly verticalBadgeClass: _angular_core.Signal<string | null>;
42
+ protected readonly titleContainerClass: _angular_core.Signal<"kit-navigation-group-title" | "kit-navigation-item-title">;
43
+ protected readonly subtitleContainerClass: _angular_core.Signal<"kit-navigation-group-subtitle" | "kit-navigation-item-subtitle">;
44
+ private joinClasses;
45
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavigationItemContent, never>;
46
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NavigationItemContent, "navigation-item-content", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
47
+ }
48
+
49
+ type NavigationTreeTemplateData = Record<string, unknown>;
50
+ interface NavigationTreeItemContext {
51
+ $implicit: NavigationItem;
52
+ level: number;
53
+ parentKey: string;
54
+ isLast: boolean;
55
+ data: NavigationTreeTemplateData | null;
56
+ }
57
+ declare class NavigationTreeOutlet {
58
+ items: _angular_core.InputSignal<NavigationItem[]>;
59
+ level: _angular_core.InputSignal<number>;
60
+ parentKey: _angular_core.InputSignal<string>;
61
+ data: _angular_core.InputSignal<NavigationTreeTemplateData | null>;
62
+ branchTemplate: _angular_core.InputSignal<TemplateRef<NavigationTreeItemContext>>;
63
+ leafTemplate: _angular_core.InputSignal<TemplateRef<NavigationTreeItemContext>>;
64
+ groupTemplate: _angular_core.InputSignal<TemplateRef<NavigationTreeItemContext>>;
65
+ dividerTemplate: _angular_core.InputSignal<TemplateRef<NavigationTreeItemContext> | null>;
66
+ spacerTemplate: _angular_core.InputSignal<TemplateRef<NavigationTreeItemContext> | null>;
67
+ trackByFn: _angular_core.InputSignal<(index: number, item: NavigationItem) => string | number | undefined>;
68
+ shouldRenderItemFn: _angular_core.InputSignal<(item: NavigationItem) => boolean>;
69
+ hasChildrenFn: _angular_core.InputSignal<(item: NavigationItem) => boolean>;
70
+ resolveParentKeyFn: _angular_core.InputSignal<(parentKey: string, item: NavigationItem) => string>;
71
+ trackItem(index: number, item: NavigationItem): string | number | undefined;
72
+ shouldRender(item: NavigationItem): boolean;
73
+ hasChildren(item: NavigationItem): boolean;
74
+ resolveParentKey(parentKey: string, item: NavigationItem): string;
75
+ templateContext(item: NavigationItem, isLast: boolean): NavigationTreeItemContext;
76
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavigationTreeOutlet, never>;
77
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NavigationTreeOutlet, "navigation-tree-outlet", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "parentKey": { "alias": "parentKey"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "branchTemplate": { "alias": "branchTemplate"; "required": true; "isSignal": true; }; "leafTemplate": { "alias": "leafTemplate"; "required": true; "isSignal": true; }; "groupTemplate": { "alias": "groupTemplate"; "required": true; "isSignal": true; }; "dividerTemplate": { "alias": "dividerTemplate"; "required": false; "isSignal": true; }; "spacerTemplate": { "alias": "spacerTemplate"; "required": false; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "shouldRenderItemFn": { "alias": "shouldRenderItemFn"; "required": false; "isSignal": true; }; "hasChildrenFn": { "alias": "hasChildrenFn"; "required": false; "isSignal": true; }; "resolveParentKeyFn": { "alias": "resolveParentKeyFn"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
78
+ }
79
+
80
+ type NavigationExpandedItemsByParent = Record<string, string>;
81
+ declare function trackNavigationTreeItem(index: number, item: NavigationItem): string | number | undefined;
82
+ declare function getNavigationTreePathKey(parentKey: string, item: NavigationItem): string;
83
+ declare function isNavigationTreeItemExpanded(expandedByParent: NavigationExpandedItemsByParent, parentKey: string, item: NavigationItem): boolean;
84
+ declare function toggleNavigationTreeItemExpanded(expandedByParent: NavigationExpandedItemsByParent, parentKey: string, item: NavigationItem): NavigationExpandedItemsByParent;
85
+ declare function hasActiveNavigationDescendant(item: NavigationItem, isItemActive: (item: NavigationItem) => boolean): boolean;
86
+ declare function isNavigationTreeDescendant(parent: NavigationItem, item: NavigationItem): boolean;
87
+
88
+ export { LocalStorageStateAdapter, NavigationItemContent, NavigationTreeOutlet, getNavigationTreePathKey, hasActiveNavigationDescendant, isNavigationTreeDescendant, isNavigationTreeItemExpanded, libraryLucideConfigProvider, toggleNavigationTreeItemExpanded, trackNavigationTreeItem };
89
+ export type { NavigationExpandedItemsByParent, NavigationTreeItemContext, NavigationTreeTemplateData };
@@ -0,0 +1,77 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NavigationItem, shouldRenderNavigationItem, hasNavigationChildren } from '@ojiepermana/angular/navigation';
3
+ import { trackNavigationTreeItem, getNavigationTreePathKey } from '@ojiepermana/angular/internal';
4
+
5
+ declare class HorizontalNavigationBranchItem {
6
+ private _menuTrigger?;
7
+ private _rootTrigger?;
8
+ private _activeChildBranch;
9
+ private readonly _document;
10
+ readonly isMenuOpen: _angular_core.WritableSignal<boolean>;
11
+ readonly expandedInlineBranchByParent: _angular_core.WritableSignal<Record<string, string>>;
12
+ item: _angular_core.InputSignal<NavigationItem>;
13
+ menuItem: _angular_core.InputSignal<boolean>;
14
+ nested: _angular_core.InputSignal<boolean>;
15
+ itemClicked: _angular_core.OutputEmitterRef<NavigationItem>;
16
+ branchOpened: _angular_core.OutputEmitterRef<HorizontalNavigationBranchItem>;
17
+ branchClosed: _angular_core.OutputEmitterRef<HorizontalNavigationBranchItem>;
18
+ readonly itemChildren: _angular_core.Signal<NavigationItem[]>;
19
+ readonly treeTemplateData: _angular_core.Signal<{
20
+ inlineBranch: boolean;
21
+ }>;
22
+ readonly treeTrackByFn: typeof trackNavigationTreeItem;
23
+ readonly treeShouldRenderItemFn: typeof shouldRenderNavigationItem;
24
+ readonly treeHasChildrenFn: typeof hasNavigationChildren;
25
+ readonly treeResolveParentKeyFn: typeof getNavigationTreePathKey;
26
+ readonly menuPanelClass: _angular_core.Signal<"horizontal-navigation-menu horizontal-navigation-menu--nested" | "horizontal-navigation-menu horizontal-navigation-menu--root">;
27
+ hasChildren(item: NavigationItem): boolean;
28
+ shouldRenderItem(item: NavigationItem): boolean;
29
+ trackByFn(index: number, item: NavigationItem): string | number;
30
+ onMenuItemTriggerClick(event: MouseEvent): void;
31
+ onChildItemClicked(child: NavigationItem): void;
32
+ isInlineBranchExpanded(item: NavigationItem, parentKey: string): boolean;
33
+ toggleInlineBranch(item: NavigationItem, parentKey: string): void;
34
+ onInlineBranchHeaderClick(event: MouseEvent, item: NavigationItem, parentKey: string): void;
35
+ getPathKey(parentKey: string, item: NavigationItem): string;
36
+ onChildBranchOpened(branch: HorizontalNavigationBranchItem): void;
37
+ onChildBranchClosed(branch: HorizontalNavigationBranchItem): void;
38
+ handleMenuOpened(): void;
39
+ handleMenuClosed(): void;
40
+ closeMenu(): void;
41
+ private _syncRootTriggerWidth;
42
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HorizontalNavigationBranchItem, never>;
43
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HorizontalNavigationBranchItem, "horizontal-navigation-branch-item", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "menuItem": { "alias": "menuItem"; "required": false; "isSignal": true; }; "nested": { "alias": "nested"; "required": false; "isSignal": true; }; }, { "itemClicked": "itemClicked"; "branchOpened": "branchOpened"; "branchClosed": "branchClosed"; }, never, never, true, never>;
44
+ }
45
+
46
+ declare class HorizontalNavigation {
47
+ private _navigationService;
48
+ private _activeRootBranch;
49
+ name: _angular_core.InputSignal<string>;
50
+ navigation: _angular_core.InputSignal<NavigationItem[]>;
51
+ itemClicked: _angular_core.OutputEmitterRef<NavigationItem>;
52
+ navigationData: _angular_core.Signal<NavigationItem[]>;
53
+ /**
54
+ * Handle item click
55
+ */
56
+ onItemClicked(item: NavigationItem): void;
57
+ onRootBranchOpened(branch: HorizontalNavigationBranchItem): void;
58
+ onRootBranchClosed(branch: HorizontalNavigationBranchItem): void;
59
+ shouldRenderItem(item: NavigationItem): boolean;
60
+ hasChildren(item: NavigationItem): boolean;
61
+ /**
62
+ * Get flat navigation for utility purposes
63
+ */
64
+ getFlatNavigation(): NavigationItem[];
65
+ /**
66
+ * Get navigation item by ID
67
+ */
68
+ getItem(id: string): NavigationItem | null;
69
+ /**
70
+ * Get navigation item parent by ID
71
+ */
72
+ getItemParent(id: string): NavigationItem[] | NavigationItem | null;
73
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HorizontalNavigation, never>;
74
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HorizontalNavigation, "horizontal-navigation", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "navigation": { "alias": "navigation"; "required": false; "isSignal": true; }; }, { "itemClicked": "itemClicked"; }, never, never, true, never>;
75
+ }
76
+
77
+ export { HorizontalNavigation, HorizontalNavigationBranchItem };