@ojiepermana/angular 22.1.14 → 22.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/README.md +8 -6
  2. package/SUPPORT.md +3 -3
  3. package/chart/README.md +1 -1
  4. package/component/README.md +2 -2
  5. package/component/calendar/README.md +3 -15
  6. package/component/drawer/README.md +1 -2
  7. package/fesm2022/ojiepermana-angular-chart-area.mjs +352 -137
  8. package/fesm2022/ojiepermana-angular-chart-bar.mjs +744 -524
  9. package/fesm2022/ojiepermana-angular-chart-core.mjs +1140 -1344
  10. package/fesm2022/ojiepermana-angular-chart-line.mjs +393 -147
  11. package/fesm2022/ojiepermana-angular-chart-pie.mjs +408 -179
  12. package/fesm2022/ojiepermana-angular-chart-primitives.mjs +1262 -920
  13. package/fesm2022/ojiepermana-angular-chart-radar.mjs +473 -205
  14. package/fesm2022/ojiepermana-angular-chart-radial.mjs +425 -182
  15. package/fesm2022/ojiepermana-angular-chart-scatter.mjs +386 -210
  16. package/fesm2022/ojiepermana-angular-chart.mjs +3 -19
  17. package/fesm2022/ojiepermana-angular-component-accordion.mjs +485 -243
  18. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +963 -325
  19. package/fesm2022/ojiepermana-angular-component-alert.mjs +266 -103
  20. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +80 -35
  21. package/fesm2022/ojiepermana-angular-component-avatar.mjs +402 -135
  22. package/fesm2022/ojiepermana-angular-component-badge.mjs +109 -59
  23. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +410 -142
  24. package/fesm2022/ojiepermana-angular-component-button-group.mjs +249 -96
  25. package/fesm2022/ojiepermana-angular-component-button.mjs +153 -75
  26. package/fesm2022/ojiepermana-angular-component-calendar.mjs +531 -418
  27. package/fesm2022/ojiepermana-angular-component-card.mjs +457 -171
  28. package/fesm2022/ojiepermana-angular-component-carousel.mjs +642 -272
  29. package/fesm2022/ojiepermana-angular-component-checkbox.mjs +312 -108
  30. package/fesm2022/ojiepermana-angular-component-collapsible.mjs +299 -115
  31. package/fesm2022/ojiepermana-angular-component-combobox.mjs +396 -183
  32. package/fesm2022/ojiepermana-angular-component-command.mjs +807 -347
  33. package/fesm2022/ojiepermana-angular-component-composer.mjs +807 -330
  34. package/fesm2022/ojiepermana-angular-component-context-menu.mjs +196 -161
  35. package/fesm2022/ojiepermana-angular-component-date-picker.mjs +650 -338
  36. package/fesm2022/ojiepermana-angular-component-dialog.mjs +710 -316
  37. package/fesm2022/ojiepermana-angular-component-drawer.mjs +1 -5
  38. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +1212 -646
  39. package/fesm2022/ojiepermana-angular-component-editor.mjs +987 -502
  40. package/fesm2022/ojiepermana-angular-component-empty.mjs +350 -137
  41. package/fesm2022/ojiepermana-angular-component-form.mjs +813 -434
  42. package/fesm2022/ojiepermana-angular-component-hover-card.mjs +486 -277
  43. package/fesm2022/ojiepermana-angular-component-icon.mjs +241 -140
  44. package/fesm2022/ojiepermana-angular-component-input-group.mjs +449 -176
  45. package/fesm2022/ojiepermana-angular-component-input-otp.mjs +891 -488
  46. package/fesm2022/ojiepermana-angular-component-input.mjs +86 -55
  47. package/fesm2022/ojiepermana-angular-component-item.mjs +713 -261
  48. package/fesm2022/ojiepermana-angular-component-kanban.mjs +714 -216
  49. package/fesm2022/ojiepermana-angular-component-kbd.mjs +124 -52
  50. package/fesm2022/ojiepermana-angular-component-label.mjs +82 -31
  51. package/fesm2022/ojiepermana-angular-component-menubar.mjs +479 -329
  52. package/fesm2022/ojiepermana-angular-component-native-select.mjs +167 -65
  53. package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +683 -380
  54. package/fesm2022/ojiepermana-angular-component-pagination.mjs +277 -94
  55. package/fesm2022/ojiepermana-angular-component-pillbox.mjs +1283 -607
  56. package/fesm2022/ojiepermana-angular-component-popover.mjs +291 -204
  57. package/fesm2022/ojiepermana-angular-component-progress.mjs +176 -53
  58. package/fesm2022/ojiepermana-angular-component-radio.mjs +449 -142
  59. package/fesm2022/ojiepermana-angular-component-resizable.mjs +659 -453
  60. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +117 -39
  61. package/fesm2022/ojiepermana-angular-component-segmented-control.mjs +351 -172
  62. package/fesm2022/ojiepermana-angular-component-select.mjs +475 -345
  63. package/fesm2022/ojiepermana-angular-component-separator.mjs +102 -35
  64. package/fesm2022/ojiepermana-angular-component-sheet.mjs +797 -347
  65. package/fesm2022/ojiepermana-angular-component-skeleton.mjs +62 -29
  66. package/fesm2022/ojiepermana-angular-component-slider.mjs +592 -376
  67. package/fesm2022/ojiepermana-angular-component-spinner.mjs +135 -38
  68. package/fesm2022/ojiepermana-angular-component-switch.mjs +315 -103
  69. package/fesm2022/ojiepermana-angular-component-table.mjs +440 -153
  70. package/fesm2022/ojiepermana-angular-component-tabs.mjs +590 -317
  71. package/fesm2022/ojiepermana-angular-component-textarea.mjs +85 -50
  72. package/fesm2022/ojiepermana-angular-component-timeline.mjs +609 -231
  73. package/fesm2022/ojiepermana-angular-component-toast.mjs +229 -243
  74. package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +573 -288
  75. package/fesm2022/ojiepermana-angular-component-toggle.mjs +187 -78
  76. package/fesm2022/ojiepermana-angular-component-tooltip.mjs +798 -517
  77. package/fesm2022/ojiepermana-angular-component-utils-core.mjs +159 -292
  78. package/fesm2022/ojiepermana-angular-component-utils-overlay.mjs +46 -58
  79. package/fesm2022/ojiepermana-angular-component-utils-scale.mjs +76 -38
  80. package/fesm2022/ojiepermana-angular-component-utils.mjs +2 -8
  81. package/fesm2022/ojiepermana-angular-component.mjs +0 -10
  82. package/fesm2022/ojiepermana-angular-navigation-core.mjs +13 -23
  83. package/fesm2022/ojiepermana-angular-navigation-icon.mjs +35 -24
  84. package/fesm2022/ojiepermana-angular-navigation-navigation-badge-count.component-DYuysKVf.mjs +129 -0
  85. package/fesm2022/ojiepermana-angular-navigation-navigation-dockbar-menu.component-COiTaw34.mjs +812 -0
  86. package/fesm2022/{ojiepermana-angular-navigation-navigation-entry-grid.component-COQ-60DS.mjs → ojiepermana-angular-navigation-navigation-entry-grid.component-YIz0IsIb.mjs} +392 -207
  87. package/fesm2022/ojiepermana-angular-navigation-navigation-flyout-menu.component-D2vwEwBY.mjs +650 -0
  88. package/fesm2022/ojiepermana-angular-navigation-navigation-horizontal.component-B5D7yXfb.mjs +662 -0
  89. package/fesm2022/ojiepermana-angular-navigation-navigation-item.component-CUb68MZH.mjs +1219 -0
  90. package/fesm2022/ojiepermana-angular-navigation-navigation-list.component-CrK16trj.mjs +327 -0
  91. package/fesm2022/ojiepermana-angular-navigation-service.mjs +544 -724
  92. package/fesm2022/ojiepermana-angular-navigation-types.mjs +139 -56
  93. package/fesm2022/ojiepermana-angular-navigation.mjs +3256 -4
  94. package/fesm2022/ojiepermana-angular-sdk.mjs +91 -201
  95. package/fesm2022/ojiepermana-angular-theme-component-settings.mjs +1125 -737
  96. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +245 -328
  97. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +35 -38
  98. package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +1928 -553
  99. package/fesm2022/ojiepermana-angular-theme-layout.mjs +847 -496
  100. package/fesm2022/ojiepermana-angular-theme-page-core.mjs +288 -358
  101. package/fesm2022/ojiepermana-angular-theme-page-filter.mjs +362 -224
  102. package/fesm2022/ojiepermana-angular-theme-page-overview.mjs +88 -0
  103. package/fesm2022/ojiepermana-angular-theme-page-root.mjs +576 -254
  104. package/fesm2022/ojiepermana-angular-theme-page-side.mjs +317 -177
  105. package/fesm2022/ojiepermana-angular-theme-page-slots.mjs +256 -112
  106. package/fesm2022/ojiepermana-angular-theme-page.mjs +7 -12
  107. package/fesm2022/ojiepermana-angular-theme-shell-services.mjs +215 -326
  108. package/fesm2022/ojiepermana-angular-theme-shell-types.mjs +68 -129
  109. package/fesm2022/ojiepermana-angular-theme-shell.mjs +907 -378
  110. package/fesm2022/ojiepermana-angular-theme-styles.mjs +521 -720
  111. package/fesm2022/ojiepermana-angular-theme.mjs +0 -10
  112. package/fesm2022/ojiepermana-angular.mjs +5 -24
  113. package/navigation/README.md +69 -18
  114. package/package.json +16 -12
  115. package/sdk/README.md +1 -1
  116. package/sdk/src/writer/index.js +2 -2
  117. package/theme/README.md +1 -1
  118. package/theme/layout/README.md +2 -4
  119. package/theme/page/README.md +50 -0
  120. package/theme/styles/README.md +10 -10
  121. package/theme/styles/css/base/prefers-dark.css +1 -1
  122. package/theme/styles/css/base/status.css +1 -1
  123. package/theme/styles/css/color/amber.css +1 -1
  124. package/theme/styles/css/color/blue.css +1 -1
  125. package/theme/styles/css/color/cyan.css +1 -1
  126. package/theme/styles/css/color/emerald.css +1 -1
  127. package/theme/styles/css/color/fuchsia.css +1 -1
  128. package/theme/styles/css/color/green.css +1 -1
  129. package/theme/styles/css/color/indigo.css +1 -1
  130. package/theme/styles/css/color/lime.css +1 -1
  131. package/theme/styles/css/color/orange.css +1 -1
  132. package/theme/styles/css/color/pink.css +1 -1
  133. package/theme/styles/css/color/purple.css +1 -1
  134. package/theme/styles/css/color/red.css +1 -1
  135. package/theme/styles/css/color/rose.css +1 -1
  136. package/theme/styles/css/color/sky.css +1 -1
  137. package/theme/styles/css/color/teal.css +1 -1
  138. package/theme/styles/css/color/violet.css +1 -1
  139. package/theme/styles/css/color/yellow.css +1 -1
  140. package/theme/styles/css/neutral/gray.css +1 -1
  141. package/theme/styles/css/neutral/mauve.css +1 -1
  142. package/theme/styles/css/neutral/mist.css +1 -1
  143. package/theme/styles/css/neutral/neutral.css +1 -1
  144. package/theme/styles/css/neutral/olive.css +1 -1
  145. package/theme/styles/css/neutral/slate.css +1 -1
  146. package/theme/styles/css/neutral/stone.css +1 -1
  147. package/theme/styles/css/neutral/taupe.css +1 -1
  148. package/theme/styles/css/neutral/zinc.css +1 -1
  149. package/types/ojiepermana-angular-chart-area.d.ts +126 -63
  150. package/types/ojiepermana-angular-chart-bar.d.ts +244 -154
  151. package/types/ojiepermana-angular-chart-core.d.ts +409 -398
  152. package/types/ojiepermana-angular-chart-line.d.ts +141 -68
  153. package/types/ojiepermana-angular-chart-pie.d.ts +192 -121
  154. package/types/ojiepermana-angular-chart-primitives.d.ts +283 -214
  155. package/types/ojiepermana-angular-chart-radar.d.ts +189 -108
  156. package/types/ojiepermana-angular-chart-radial.d.ts +177 -106
  157. package/types/ojiepermana-angular-chart-scatter.d.ts +166 -110
  158. package/types/ojiepermana-angular-chart.d.ts +3 -2
  159. package/types/ojiepermana-angular-component-accordion.d.ts +135 -81
  160. package/types/ojiepermana-angular-component-alert-dialog.d.ts +271 -123
  161. package/types/ojiepermana-angular-component-alert.d.ts +69 -39
  162. package/types/ojiepermana-angular-component-aspect-ratio.d.ts +20 -12
  163. package/types/ojiepermana-angular-component-avatar.d.ts +103 -49
  164. package/types/ojiepermana-angular-component-badge.d.ts +36 -24
  165. package/types/ojiepermana-angular-component-breadcrumb.d.ts +79 -40
  166. package/types/ojiepermana-angular-component-button-group.d.ts +48 -24
  167. package/types/ojiepermana-angular-component-button.d.ts +44 -27
  168. package/types/ojiepermana-angular-component-calendar.d.ts +145 -107
  169. package/types/ojiepermana-angular-component-card.d.ts +112 -63
  170. package/types/ojiepermana-angular-component-carousel.d.ts +150 -81
  171. package/types/ojiepermana-angular-component-checkbox.d.ts +96 -38
  172. package/types/ojiepermana-angular-component-collapsible.d.ts +65 -39
  173. package/types/ojiepermana-angular-component-combobox.d.ts +100 -55
  174. package/types/ojiepermana-angular-component-command.d.ts +206 -121
  175. package/types/ojiepermana-angular-component-composer.d.ts +184 -84
  176. package/types/ojiepermana-angular-component-context-menu.d.ts +51 -41
  177. package/types/ojiepermana-angular-component-date-picker.d.ts +199 -109
  178. package/types/ojiepermana-angular-component-dialog.d.ts +200 -105
  179. package/types/ojiepermana-angular-component-drawer.d.ts +2 -1
  180. package/types/ojiepermana-angular-component-dropdown-menu.d.ts +324 -202
  181. package/types/ojiepermana-angular-component-editor.d.ts +215 -117
  182. package/types/ojiepermana-angular-component-empty.d.ts +80 -45
  183. package/types/ojiepermana-angular-component-form.d.ts +185 -121
  184. package/types/ojiepermana-angular-component-hover-card.d.ts +130 -72
  185. package/types/ojiepermana-angular-component-icon.d.ts +87 -57
  186. package/types/ojiepermana-angular-component-input-group.d.ts +93 -46
  187. package/types/ojiepermana-angular-component-input-otp.d.ts +243 -150
  188. package/types/ojiepermana-angular-component-input.d.ts +27 -17
  189. package/types/ojiepermana-angular-component-item.d.ts +160 -84
  190. package/types/ojiepermana-angular-component-kanban.d.ts +157 -62
  191. package/types/ojiepermana-angular-component-kbd.d.ts +24 -15
  192. package/types/ojiepermana-angular-component-label.d.ts +19 -11
  193. package/types/ojiepermana-angular-component-menubar.d.ts +120 -90
  194. package/types/ojiepermana-angular-component-native-select.d.ts +37 -24
  195. package/types/ojiepermana-angular-component-navigation-menu.d.ts +157 -98
  196. package/types/ojiepermana-angular-component-pagination.d.ts +78 -28
  197. package/types/ojiepermana-angular-component-pillbox.d.ts +361 -204
  198. package/types/ojiepermana-angular-component-popover.d.ts +94 -64
  199. package/types/ojiepermana-angular-component-progress.d.ts +45 -17
  200. package/types/ojiepermana-angular-component-radio.d.ts +129 -53
  201. package/types/ojiepermana-angular-component-resizable.d.ts +160 -112
  202. package/types/ojiepermana-angular-component-scroll-area.d.ts +33 -15
  203. package/types/ojiepermana-angular-component-segmented-control.d.ts +94 -50
  204. package/types/ojiepermana-angular-component-select.d.ts +94 -77
  205. package/types/ojiepermana-angular-component-separator.d.ts +26 -14
  206. package/types/ojiepermana-angular-component-sheet.d.ts +226 -116
  207. package/types/ojiepermana-angular-component-skeleton.d.ts +13 -10
  208. package/types/ojiepermana-angular-component-slider.d.ts +140 -75
  209. package/types/ojiepermana-angular-component-spinner.d.ts +31 -13
  210. package/types/ojiepermana-angular-component-switch.d.ts +97 -40
  211. package/types/ojiepermana-angular-component-table.d.ts +102 -50
  212. package/types/ojiepermana-angular-component-tabs.d.ts +174 -115
  213. package/types/ojiepermana-angular-component-textarea.d.ts +27 -17
  214. package/types/ojiepermana-angular-component-timeline.d.ts +141 -59
  215. package/types/ojiepermana-angular-component-toast.d.ts +51 -55
  216. package/types/ojiepermana-angular-component-toggle-group.d.ts +159 -88
  217. package/types/ojiepermana-angular-component-toggle.d.ts +47 -25
  218. package/types/ojiepermana-angular-component-tooltip.d.ts +222 -132
  219. package/types/ojiepermana-angular-component-utils-core.d.ts +81 -90
  220. package/types/ojiepermana-angular-component-utils-overlay.d.ts +7 -11
  221. package/types/ojiepermana-angular-component-utils-scale.d.ts +20 -12
  222. package/types/ojiepermana-angular-component-utils.d.ts +2 -2
  223. package/types/ojiepermana-angular-component.d.ts +1 -2
  224. package/types/ojiepermana-angular-navigation-core.d.ts +46 -50
  225. package/types/ojiepermana-angular-navigation-icon.d.ts +9 -12
  226. package/types/ojiepermana-angular-navigation-service.d.ts +112 -115
  227. package/types/ojiepermana-angular-navigation-types.d.ts +166 -125
  228. package/types/ojiepermana-angular-navigation.d.ts +708 -375
  229. package/types/ojiepermana-angular-sdk.d.ts +69 -71
  230. package/types/ojiepermana-angular-theme-component-settings.d.ts +120 -86
  231. package/types/ojiepermana-angular-theme-layout-services.d.ts +119 -124
  232. package/types/ojiepermana-angular-theme-layout-types.d.ts +27 -31
  233. package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +446 -187
  234. package/types/ojiepermana-angular-theme-layout.d.ts +201 -113
  235. package/types/ojiepermana-angular-theme-page-core.d.ts +136 -142
  236. package/types/ojiepermana-angular-theme-page-filter.d.ts +112 -62
  237. package/types/ojiepermana-angular-theme-page-overview.d.ts +28 -0
  238. package/types/ojiepermana-angular-theme-page-root.d.ts +172 -88
  239. package/types/ojiepermana-angular-theme-page-side.d.ts +89 -49
  240. package/types/ojiepermana-angular-theme-page-slots.d.ts +58 -37
  241. package/types/ojiepermana-angular-theme-page.d.ts +7 -5
  242. package/types/ojiepermana-angular-theme-shell-services.d.ts +119 -125
  243. package/types/ojiepermana-angular-theme-shell-types.d.ts +38 -41
  244. package/types/ojiepermana-angular-theme-shell.d.ts +139 -61
  245. package/types/ojiepermana-angular-theme-styles.d.ts +184 -196
  246. package/types/ojiepermana-angular-theme.d.ts +1 -2
  247. package/types/ojiepermana-angular.d.ts +5 -5
  248. package/fesm2022/ojiepermana-angular-navigation-navigation-badge-count.component-Be3IqzG4.mjs +0 -91
  249. package/fesm2022/ojiepermana-angular-navigation-navigation-dockbar-menu.component-Bc7DWK3R.mjs +0 -522
  250. package/fesm2022/ojiepermana-angular-navigation-navigation-flyout-menu.component-DA8VPEn7.mjs +0 -404
  251. package/fesm2022/ojiepermana-angular-navigation-navigation-horizontal.component-U2TJTzlW.mjs +0 -466
  252. package/fesm2022/ojiepermana-angular-navigation-ojiepermana-angular-navigation-CIUhmytH.mjs +0 -2668
@@ -1,404 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import * as i0 from '@angular/core';
3
- import { inject, ElementRef, Injector, input, output, computed, signal, effect, afterNextRender, Component } from '@angular/core';
4
- import { IconComponent } from '@ojiepermana/angular/component/icon';
5
- import { cn } from '@ojiepermana/angular/component/utils/core';
6
- import { N as NavigationEntryGridComponent } from './ojiepermana-angular-navigation-navigation-entry-grid.component-COQ-60DS.mjs';
7
- import { N as NavigationItemComponent, a as NavigationItemContentComponent } from './ojiepermana-angular-navigation-ojiepermana-angular-navigation-CIUhmytH.mjs';
8
- import { NAVIGATION_ADAPTER } from '@ojiepermana/angular/navigation/core';
9
-
10
- class NavigationFlyoutMenuComponent {
11
- nav = inject(NAVIGATION_ADAPTER);
12
- host = inject(ElementRef);
13
- injector = inject(Injector);
14
- document = inject(DOCUMENT);
15
- navId = input('default', /* @ts-ignore */
16
- ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
17
- items = input([], /* @ts-ignore */
18
- ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
19
- label = input('Menu', /* @ts-ignore */
20
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
21
- /** Nama Material Symbols untuk trigger; `null` = label saja (mode normal). */
22
- icon = input(null, /* @ts-ignore */
23
- ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
24
- /** Trigger hanya ikon — label tetap diumumkan via aria-label/title. */
25
- iconOnly = input(false, /* @ts-ignore */
26
- ...(ngDevMode ? [{ debugName: "iconOnly" }] : /* istanbul ignore next */ []));
27
- /** Penempatan ikon relatif label: `start` (default) atau `end`. */
28
- iconPosition = input('start', /* @ts-ignore */
29
- ...(ngDevMode ? [{ debugName: "iconPosition" }] : /* istanbul ignore next */ []));
30
- /** Bentuk visual tombol trigger: `button` (pil) | `link` | `plain` (ghost). */
31
- variant = input('button', /* @ts-ignore */
32
- ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
33
- /** Trigger mengambang (`fixed`) — host menjadi popover lepas, panel menempel ke trigger. */
34
- floating = input(false, /* @ts-ignore */
35
- ...(ngDevMode ? [{ debugName: "floating" }] : /* istanbul ignore next */ []));
36
- /** Panel floating menempel ke top viewport dan membentang selebar viewport. */
37
- viewport = input(false, /* @ts-ignore */
38
- ...(ngDevMode ? [{ debugName: "viewport" }] : /* istanbul ignore next */ []));
39
- /** Kelas Tailwind untuk host trigger (posisi pojok floating / styling wrapper in-flow). */
40
- triggerClass = input('', /* @ts-ignore */
41
- ...(ngDevMode ? [{ debugName: "triggerClass" }] : /* istanbul ignore next */ []));
42
- /** Kelas tambahan khusus tombol trigger; tidak diterapkan ke host atau item panel. */
43
- triggerButtonClass = input('', /* @ts-ignore */
44
- ...(ngDevMode ? [{ debugName: "triggerButtonClass" }] : /* istanbul ignore next */ []));
45
- /** `bottom` = bar berada di bawah konten; panel menempel sisi bawah container dan tumbuh ke atas. */
46
- position = input('top', /* @ts-ignore */
47
- ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
48
- typeStyle = input('flat', /* @ts-ignore */
49
- ...(ngDevMode ? [{ debugName: "typeStyle" }] : /* istanbul ignore next */ []));
50
- compact = input(false, /* @ts-ignore */
51
- ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
52
- itemClass = input('', /* @ts-ignore */
53
- ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
54
- /** Kelas Tailwind untuk container `<li>` tiap tab group (mengatur tinggi/border/padding container). */
55
- groupClass = input('', /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "groupClass" }] : /* istanbul ignore next */ []));
57
- activeIds = input(new Set(), /* @ts-ignore */
58
- ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
59
- activeUrl = input(null, /* @ts-ignore */
60
- ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
61
- iconTemplate = input(undefined, /* @ts-ignore */
62
- ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
63
- collapseTree = input('stairs', /* @ts-ignore */
64
- ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
65
- openedIds = input([], /* @ts-ignore */
66
- ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
67
- openedIdsChange = output();
68
- itemSelected = output();
69
- panelId = computed(() => `nav-flyout-${this.navId()}`, /* @ts-ignore */
70
- ...(ngDevMode ? [{ debugName: "panelId" }] : /* istanbul ignore next */ []));
71
- /** The region a tab controls: the grid of the branch it opens, not the tab bar. */
72
- panelContentId = computed(() => `${this.panelId()}-content`, /* @ts-ignore */
73
- ...(ngDevMode ? [{ debugName: "panelContentId" }] : /* istanbul ignore next */ []));
74
- isBorderRail = computed(() => this.typeStyle() === 'border-rail', /* @ts-ignore */
75
- ...(ngDevMode ? [{ debugName: "isBorderRail" }] : /* istanbul ignore next */ []));
76
- isBottom = computed(() => this.position() === 'bottom', /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "isBottom" }] : /* istanbul ignore next */ []));
78
- /** Compact (mobile) selalu icon-only; selain itu mengikuti input `iconOnly`. */
79
- showIconOnly = computed(() => this.compact() || this.iconOnly(), /* @ts-ignore */
80
- ...(ngDevMode ? [{ debugName: "showIconOnly" }] : /* istanbul ignore next */ []));
81
- triggerIcon = computed(() => this.icon() ?? (this.showIconOnly() ? 'menu' : null), /* @ts-ignore */
82
- ...(ngDevMode ? [{ debugName: "triggerIcon" }] : /* istanbul ignore next */ []));
83
- /** Kelas tambahan untuk NavigationItem di dalam flyout saat style border-rail aktif. */
84
- navItemClass = computed(() =>
85
- // Tinggi leaf mengikuti token item bersama agar border bawah row tidak
86
- // terdorong melewati posisi rail layout di density mana pun.
87
- cn(this.itemClass(), this.isBorderRail() &&
88
- 'h-(--nav-item-height) rounded-none hover:bg-transparent hover:text-primary'), /* @ts-ignore */
89
- ...(ngDevMode ? [{ debugName: "navItemClass" }] : /* istanbul ignore next */ []));
90
- branches = computed(() => this.items().filter((item) => item.children.length > 0), /* @ts-ignore */
91
- ...(ngDevMode ? [{ debugName: "branches" }] : /* istanbul ignore next */ []));
92
- activeBranch = computed(() => {
93
- const key = this.nav.currentPanelKey(this.navId());
94
- return this.branches().find((branch) => branch.key === key) ?? null;
95
- }, /* @ts-ignore */
96
- ...(ngDevMode ? [{ debugName: "activeBranch" }] : /* istanbul ignore next */ []));
97
- /**
98
- * Floating: sisi popover relatif trigger — `true` = rata kanan (buka ke kiri, untuk trigger di
99
- * pojok kanan), `false` = rata kiri (buka ke kanan). Diukur dari posisi trigger saat dibuka.
100
- */
101
- floatingAlignEnd = signal(true, /* @ts-ignore */
102
- ...(ngDevMode ? [{ debugName: "floatingAlignEnd" }] : /* istanbul ignore next */ []));
103
- /**
104
- * Offset panel terhadap host agar panel menimpa penuh container parent dari
105
- * `Navigation` (lebar sama persis; posisi atas di mode top, posisi bawah di
106
- * mode bottom). `null` berarti pengukuran tidak tersedia (mis. SSR/jsdom)
107
- * dan panel jatuh ke lebar host sendiri.
108
- */
109
- panelPlacement = signal(null, /* @ts-ignore */
110
- ...(ngDevMode ? [{ debugName: "panelPlacement" }] : /* istanbul ignore next */ []));
111
- panelWrapperClasses = computed(() => {
112
- if (this.floating()) {
113
- if (this.viewport()) {
114
- return 'fixed inset-x-0 top-0 z-50 m-0';
115
- }
116
- // Floating: popover menempel ke trigger — atas/bawah ikut nav-position; sisi kiri/kanan
117
- // ikut posisi trigger (floatingAlignEnd) agar tidak keluar layar saat trigger di pojok kiri.
118
- return cn('absolute z-50', this.floatingAlignEnd() ? 'right-0' : 'left-0', this.isBottom() ? 'bottom-full mb-2' : 'top-full mt-2');
119
- }
120
- // Default: panel menutupi (overlay) container bar persis — posisi & lebar ikut container.
121
- return cn('absolute z-50', !this.panelPlacement() && cn('inset-x-0', this.isBottom() ? 'bottom-0' : 'top-0'));
122
- }, /* @ts-ignore */
123
- ...(ngDevMode ? [{ debugName: "panelWrapperClasses" }] : /* istanbul ignore next */ []));
124
- /**
125
- * Mode bottom membalik urutan visual: grid entri di atas, bar di bawah (dekat bar trigger).
126
- * `min-h-0 flex-1` membuat menu mengisi penuh panel card (yang di-clip) sehingga ROW 2
127
- * bisa jadi satu-satunya area scroll.
128
- */
129
- menuClasses = computed(() => cn('flex min-h-0 flex-1', this.isBottom() ? 'flex-col-reverse' : 'flex-col'), /* @ts-ignore */
130
- ...(ngDevMode ? [{ debugName: "menuClasses" }] : /* istanbul ignore next */ []));
131
- /**
132
- * ROW 1 = bar flyout: satu baris horizontal seperti bar navbar —
133
- * Header (kiri) · menu item (tengah, flex-1) · Footer (kanan). `shrink-0` membuatnya DIAM
134
- * (tidak ikut scroll) — hanya ROW 2 (grid child) yang punya area scroll sendiri.
135
- * Border memisahkan bar dari ROW 2 di sisi yang menjauh dari bar (bawah di mode top).
136
- */
137
- barRowClasses = computed(() => cn('flex min-h-(--layout-topbar-height) shrink-0 items-center gap-2 bg-popover px-2 md:px-3', this.isBottom() ? 'border-t' : 'border-b', this.isBorderRail()
138
- ? 'border-border'
139
- : 'border-[hsl(var(--border)/var(--section-border-opacity))]'), /* @ts-ignore */
140
- ...(ngDevMode ? [{ debugName: "barRowClasses" }] : /* istanbul ignore next */ []));
141
- /**
142
- * ROW 2 = HANYA area ini yang scroll: children dari nav item aktif. `min-h-0 flex-1`
143
- * membatasi tingginya ke sisa ruang panel lalu `overflow-y-auto` men-scroll isinya —
144
- * bar ROW 1 & kontainer panel sendiri tetap diam.
145
- */
146
- scrollRegionClasses = computed(() => cn('min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain'), /* @ts-ignore */
147
- ...(ngDevMode ? [{ debugName: "scrollRegionClasses" }] : /* istanbul ignore next */ []));
148
- drawerOpen = computed(() => this.nav.isDrawerOpen(this.navId()), /* @ts-ignore */
149
- ...(ngDevMode ? [{ debugName: "drawerOpen" }] : /* istanbul ignore next */ []));
150
- isOpen() {
151
- return this.drawerOpen();
152
- }
153
- constructor() {
154
- // Host `(document:click)`/`(window:resize)` bindings mark this view dirty
155
- // before the handler runs, so every click in the app re-checked the trigger
156
- // even with the panel closed. Both listeners only matter while it is open.
157
- effect((onCleanup) => {
158
- if (!this.drawerOpen()) {
159
- return;
160
- }
161
- const view = this.document.defaultView;
162
- const onDocumentClick = (event) => this.closeOnOutsideClick(event);
163
- const onResize = () => this.measurePanelPlacement();
164
- this.document.addEventListener('click', onDocumentClick);
165
- view?.addEventListener('resize', onResize);
166
- onCleanup(() => {
167
- this.document.removeEventListener('click', onDocumentClick);
168
- view?.removeEventListener('resize', onResize);
169
- });
170
- });
171
- }
172
- measurePanelPlacement() {
173
- // Floating: panel anchored ke trigger via CSS, bukan overlay container. Pilih sisi popover
174
- // (kanan→buka kiri / kiri→buka kanan) dari posisi trigger agar tidak keluar layar.
175
- if (this.floating()) {
176
- const triggerEl = this.host.nativeElement.querySelector('[data-navigation-flyout-trigger="true"]');
177
- const rect = triggerEl?.getBoundingClientRect();
178
- if (rect && typeof window !== 'undefined' && window.innerWidth > 0) {
179
- this.floatingAlignEnd.set(rect.left + rect.width / 2 > window.innerWidth / 2);
180
- }
181
- this.panelPlacement.set(null);
182
- return;
183
- }
184
- const hostEl = this.host.nativeElement;
185
- const navEl = hostEl.closest('[data-navigation-id]');
186
- let container = navEl?.parentElement ?? hostEl.parentElement;
187
- // Wrapper display:contents punya rect kosong — naik terus sampai container yang punya box visual.
188
- while (container && container.getBoundingClientRect().width <= 0 && container.parentElement) {
189
- container = container.parentElement;
190
- }
191
- const containerRect = (container ?? hostEl).getBoundingClientRect();
192
- const hostRect = hostEl.getBoundingClientRect();
193
- if (containerRect.width <= 0) {
194
- this.panelPlacement.set(null);
195
- return;
196
- }
197
- this.panelPlacement.set({
198
- left: containerRect.left - hostRect.left,
199
- top: containerRect.top - hostRect.top,
200
- bottom: hostRect.bottom - containerRect.bottom,
201
- width: containerRect.width,
202
- });
203
- }
204
- toggleFlyout() {
205
- if (this.isOpen()) {
206
- this.closeFlyout(false);
207
- return;
208
- }
209
- this.measurePanelPlacement();
210
- this.nav.openDrawer(this.navId());
211
- const current = this.nav.currentPanelKey(this.navId());
212
- const branches = this.branches();
213
- if (!branches.some((branch) => branch.key === current)) {
214
- const first = branches.find((branch) => !branch.disabled) ?? branches[0];
215
- if (first) {
216
- this.nav.openPanel(this.navId(), first);
217
- }
218
- }
219
- // The panel renders under `@if (isOpen())`, so a microtask still runs before
220
- // it exists and the focus call finds nothing.
221
- afterNextRender({ read: () => this.focusFirstPanelItem() }, { injector: this.injector });
222
- }
223
- closeFlyout(restoreFocus) {
224
- this.nav.closeDrawer(this.navId());
225
- if (restoreFocus) {
226
- queueMicrotask(() => this.focusTrigger());
227
- }
228
- }
229
- onEscape(event) {
230
- if (!this.isOpen()) {
231
- return;
232
- }
233
- event.preventDefault();
234
- this.closeFlyout(true);
235
- }
236
- closeOnOutsideClick(event) {
237
- const target = event.target;
238
- if (target && !this.host.nativeElement.contains(target)) {
239
- this.closeFlyout(false);
240
- }
241
- }
242
- /**
243
- * Template method calls re-run on every check. Resolving the row once per
244
- * dependency change keeps a redraw from replaying an URL match — and a `cn()`
245
- * merge — for every tab in the bar.
246
- */
247
- itemState = computed(() => {
248
- const activeIds = this.activeIds();
249
- const activeUrl = this.activeUrl();
250
- const openKey = this.nav.currentPanelKey(this.navId());
251
- return new Map(this.items().map((item) => {
252
- const active = this.nav.isItemActive(item, activeIds, activeUrl);
253
- const open = openKey === item.key;
254
- return [item, { active, open, tabClasses: this.computeTabClasses(item, active, open) }];
255
- }));
256
- }, /* @ts-ignore */
257
- ...(ngDevMode ? [{ debugName: "itemState" }] : /* istanbul ignore next */ []));
258
- isItemActive(item) {
259
- return this.itemState().get(item)?.active ?? false;
260
- }
261
- isBranchOpen(item) {
262
- return this.itemState().get(item)?.open ?? false;
263
- }
264
- openBranch(item) {
265
- this.nav.openPanel(this.navId(), item);
266
- }
267
- /**
268
- * Host trigger+panel. Default `relative block w-full` (mengalir di dalam bar/div). Saat
269
- * `floating`, jadi `fixed` (mengambang) — default pojok kanan-atas, override via `triggerClass`.
270
- */
271
- hostClasses = computed(() => this.floating()
272
- ? cn('fixed z-50 block w-max', this.triggerClass() || 'right-6 top-6')
273
- : cn('relative block w-full', this.triggerClass()), /* @ts-ignore */
274
- ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
275
- /** Bentuk visual trigger: `button` (pil), `link` (tautan), atau `plain` (ghost); + ikon/teks. */
276
- triggerClasses() {
277
- const iconOnly = this.showIconOnly();
278
- const base = 'nav-trigger group/nav inline-flex min-w-0 items-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring';
279
- if (this.variant() === 'link') {
280
- return cn(base, 'nav-text underline-offset-4 hover:underline',
281
- // Icon-only tetap punya target persegi ≥ 24px (WCAG 2.5.8) walau tanpa chrome tautan.
282
- iconOnly ? 'h-(--nav-item-height) w-(--nav-item-height) justify-center gap-0' : 'gap-1.5', this.isOpen() ? 'text-primary underline' : 'text-primary/90 hover:text-primary', this.itemClass(), this.triggerButtonClass());
283
- }
284
- if (this.variant() === 'plain') {
285
- return cn(base, 'gap-(--nav-item-gap) rounded-md nav-text', iconOnly
286
- ? 'h-(--nav-item-height) w-(--nav-item-height) justify-center'
287
- : 'h-(--nav-item-height) px-(--nav-item-padding-x)', this.isOpen()
288
- ? 'bg-accent text-foreground'
289
- : 'text-foreground/80 hover:bg-accent hover:text-accent-foreground', this.itemClass(), this.triggerButtonClass());
290
- }
291
- // button (pil, default)
292
- return cn(base, 'h-(--nav-item-height) gap-(--nav-item-gap) rounded-full border border-[hsl(var(--border)/var(--section-border-opacity))] bg-background px-4 nav-text shadow-sm', iconOnly && 'w-(--nav-item-height) justify-center gap-0 px-0', this.isBorderRail()
293
- ? this.isOpen()
294
- ? 'text-primary'
295
- : 'text-foreground/80 hover:text-primary'
296
- : this.isOpen()
297
- ? 'bg-accent text-foreground'
298
- : 'text-foreground/80 hover:bg-accent hover:text-accent-foreground', this.itemClass(), this.triggerButtonClass());
299
- }
300
- panelCardClasses() {
301
- if (this.floating()) {
302
- // Floating: kartu popover mandiri (rounded penuh + border + shadow), tinggi dibatasi & di-clip;
303
- // hanya ROW 2 (children) yang scroll.
304
- return cn('relative flex flex-col rounded-xl border border-[hsl(var(--border)/var(--section-border-opacity))] bg-popover text-popover-foreground shadow-2xl', 'max-h-[min(28rem,70vh)] overflow-hidden');
305
- }
306
- // Border-rail: panel menutup tepat content-box frame layout, jadi garis
307
- // sisi bar memakai border frame (rail) itu sendiri — panel cukup menggambar
308
- // border senada rail pada sisi yang menjauh dari bar agar sambungan
309
- // tetap lurus (bawah di mode top, atas di mode bottom).
310
- return cn('relative flex flex-col bg-popover text-popover-foreground shadow-2xl',
311
- // Batasi tinggi panel ke viewport lalu CLIP — bukan scroll. Hanya ROW 2 (children, lihat
312
- // scrollRegionClasses) yang scroll; bar ROW 1 & kontainer panel sendiri tetap diam.
313
- 'max-h-[calc(100dvh-5rem)] overflow-hidden', this.isBorderRail()
314
- ? cn('rounded-none border-border', this.isBottom() ? 'border-t' : 'border-b')
315
- : 'rounded-[var(--layout-frame-radius)] border border-[hsl(var(--border)/var(--section-border-opacity))]');
316
- }
317
- rowClasses() {
318
- // Menu item = bagian tengah ROW 1: isi ruang antara Footer & Header (flex-1) lalu
319
- // di-center seperti menubar navbar. Saat jumlah/lebar item melebihi band, band ini
320
- // scroll horizontal (overflow-x-auto) agar tidak ada item ter-clip & takterjangkau
321
- // (panel card meng-clip overflow-x). Tinggi & border bar ditangani barRowClasses().
322
- return cn('m-0 flex min-w-0 flex-1 list-none items-center justify-center gap-1 overflow-x-auto overscroll-x-contain py-2');
323
- }
324
- /**
325
- * Container `<li>` tab group. Basis `flex -my-2 self-stretch` membuat tab setinggi
326
- * penuh row (lihat tabClasses); consumer dapat menimpa/menambah lewat `nav-group-class`
327
- * (global) atau `item.classes.container` (per-group) untuk fleksibilitas.
328
- */
329
- groupContainerClasses(item) {
330
- return cn('flex -my-2 self-stretch', this.groupClass(), item.classes?.container);
331
- }
332
- tabClasses(item) {
333
- return this.itemState().get(item)?.tabClasses ?? '';
334
- }
335
- computeTabClasses(item, active, open) {
336
- return cn(
337
- // Tinggi tab group mengikuti tinggi penuh row (parent). Wrapper <li> memakai
338
- // `-my-2 self-stretch` untuk membatalkan `py-2` row; tombol `h-full` mengisi penuh
339
- // sehingga sisinya rata dengan border row — sudut pada sisi border dibuat siku
340
- // agar menyambung (bawah di mode top, atas di mode bottom).
341
- 'nav-trigger nav-text group/nav inline-flex h-full min-h-(--nav-item-height) min-w-0 items-center gap-(--nav-item-gap) rounded-md px-(--nav-item-padding-x) transition-colors', this.isBottom() ? 'rounded-t-none' : 'rounded-b-none', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', this.isBorderRail()
342
- ? open || active
343
- ? 'rounded-none text-primary'
344
- : 'rounded-none text-foreground/80 hover:text-primary'
345
- : open
346
- ? 'bg-accent text-foreground'
347
- : active
348
- ? 'text-foreground hover:bg-accent hover:text-accent-foreground'
349
- : 'text-foreground/80 hover:bg-accent hover:text-accent-foreground', item.classes?.wrapper, this.itemClass());
350
- }
351
- tabChevronClasses(item) {
352
- return cn('shrink-0 self-center text-(length:--nav-icon-size-sub) text-current transition-transform duration-200', this.isBranchOpen(item) && 'rotate-90');
353
- }
354
- onRowKeydown(event) {
355
- if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft' && event.key !== 'ArrowDown') {
356
- return;
357
- }
358
- const rowItems = Array.from(this.host.nativeElement.querySelectorAll('[data-navigation-flyout-row="true"] [role="menuitem"]'));
359
- const currentIndex = rowItems.indexOf(document.activeElement);
360
- if (currentIndex === -1) {
361
- return;
362
- }
363
- event.preventDefault();
364
- if (event.key === 'ArrowDown') {
365
- const entry = this.host.nativeElement.querySelector('[data-navigation-flyout-content] [role="menuitem"]');
366
- entry?.focus();
367
- return;
368
- }
369
- const direction = event.key === 'ArrowRight' ? 1 : -1;
370
- rowItems[(currentIndex + direction + rowItems.length) % rowItems.length]?.focus();
371
- }
372
- focusFirstPanelItem() {
373
- const panel = this.host.nativeElement.querySelector('[data-navigation-flyout-panel="true"]');
374
- if (!panel) {
375
- return;
376
- }
377
- // Fokus awal ke menu item ROW 1 (lalu grid ROW 2) — BUKAN kontrol Header/Footer yang
378
- // juga ada di bar (mis. tombol logout). querySelector mengembalikan match pertama dalam
379
- // urutan DOM, dan Header/Footer bisa mendahului menu, jadi lingkup ke baris menu dulu.
380
- const target = panel.querySelector('[data-navigation-flyout-row="true"] [role="menuitem"], [data-navigation-flyout-row="true"] a[href]') ?? panel.querySelector('[role="menuitem"], a[href]');
381
- target?.focus();
382
- }
383
- focusTrigger() {
384
- this.host.nativeElement
385
- .querySelector('[data-navigation-flyout-trigger="true"]')
386
- ?.focus();
387
- }
388
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NavigationFlyoutMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
389
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: NavigationFlyoutMenuComponent, isStandalone: true, selector: "NavigationFlyoutMenu", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, floating: { classPropertyName: "floating", publicName: "floating", isSignal: true, isRequired: false, transformFunction: null }, viewport: { classPropertyName: "viewport", publicName: "viewport", isSignal: true, isRequired: false, transformFunction: null }, triggerClass: { classPropertyName: "triggerClass", publicName: "triggerClass", isSignal: true, isRequired: false, transformFunction: null }, triggerButtonClass: { classPropertyName: "triggerButtonClass", publicName: "triggerButtonClass", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, typeStyle: { classPropertyName: "typeStyle", publicName: "typeStyle", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, groupClass: { classPropertyName: "groupClass", publicName: "groupClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { listeners: { "keydown.escape": "onEscape($event)" }, properties: { "class": "hostClasses()" } }, ngImport: i0, template: "<button\n type=\"button\"\n data-navigation-flyout-trigger=\"true\"\n [class]=\"triggerClasses()\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId() : null\"\n [attr.aria-label]=\"showIconOnly() ? label() : null\"\n [attr.title]=\"showIconOnly() ? label() : null\"\n (click)=\"toggleFlyout()\"\n>\n @if (showIconOnly()) {\n <Icon\n [name]=\"triggerIcon() ?? 'menu'\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"text-(length:--nav-icon-size) text-current\"\n />\n } @else {\n @if (iconPosition() === 'start' && triggerIcon(); as iconName) {\n <Icon\n [name]=\"iconName\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"shrink-0 text-(length:--nav-icon-size) text-current\"\n />\n }\n\n <span class=\"truncate\">{{ label() }}</span>\n\n @if (iconPosition() === 'end' && triggerIcon(); as iconName) {\n <Icon\n [name]=\"iconName\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"shrink-0 text-(length:--nav-icon-size) text-current\"\n />\n }\n }\n</button>\n\n@if (isOpen()) {\n <div\n [id]=\"panelId()\"\n data-navigation-flyout-panel=\"true\"\n [attr.data-navigation-flyout-floating]=\"floating() ? 'true' : null\"\n [class]=\"panelWrapperClasses()\"\n [style.left.px]=\"floating() ? null : panelPlacement()?.left\"\n [style.top.px]=\"floating() || isBottom() ? null : panelPlacement()?.top\"\n [style.bottom.px]=\"!floating() && isBottom() ? panelPlacement()?.bottom : null\"\n [style.width.px]=\"floating() ? null : panelPlacement()?.width\"\n >\n <div\n [attr.data-navigation-flyout-floating-card]=\"floating() ? 'true' : null\"\n [class]=\"panelCardClasses()\"\n >\n <div data-navigation-flyout-menu-layout=\"true\" [class]=\"menuClasses()\">\n <!-- ROW 1 = bar (sticky, menutup bar trigger), struktur seperti bar navbar:\n Header (kiri) | menu item (tengah) | Footer (kanan). Hanya ROW 2 (grid child)\n di bawah bar yang ikut scroll. -->\n <div data-navigation-flyout-bar=\"true\" [class]=\"barRowClasses()\">\n <ng-content select=\"NavigationHeader\" />\n\n <ul\n role=\"menu\"\n tabindex=\"-1\"\n data-navigation-flyout-row=\"true\"\n [class]=\"rowClasses()\"\n [attr.aria-label]=\"label()\"\n (keydown)=\"onRowKeydown($event)\"\n >\n @for (item of items(); track item.key) {\n @switch (item.type) {\n @case ('divider') {\n <li role=\"separator\" class=\"mx-1 h-5 w-px bg-border\"></li>\n }\n @case ('spacer') {\n <li role=\"none\" aria-hidden=\"true\" class=\"flex-1\"></li>\n }\n @default {\n @if (item.children.length > 0) {\n <li\n role=\"none\"\n [class]=\"groupContainerClasses(item)\"\n [attr.data-navigation-item-key]=\"item.key\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n data-navigation-flyout-tab=\"true\"\n [class]=\"tabClasses(item)\"\n [attr.aria-expanded]=\"isBranchOpen(item)\"\n [attr.aria-controls]=\"isBranchOpen(item) ? panelContentId() : null\"\n [disabled]=\"item.disabled || null\"\n (click)=\"openBranch(item)\"\n >\n <NavigationItemContent\n [item]=\"item\"\n [active]=\"isItemActive(item)\"\n [compact]=\"false\"\n [orientation]=\"'horizontal'\"\n [level]=\"0\"\n [iconTemplate]=\"iconTemplate()\"\n />\n <Icon\n name=\"chevron_right\"\n size=\"inherit\"\n [class]=\"tabChevronClasses(item)\"\n />\n </button>\n </li>\n } @else {\n <li\n NavigationItem\n [navId]=\"navId()\"\n [item]=\"item\"\n [level]=\"0\"\n [orientation]=\"'horizontal'\"\n [compact]=\"false\"\n [itemClass]=\"navItemClass()\"\n [activeIds]=\"activeIds()\"\n [activeUrl]=\"activeUrl()\"\n [iconTemplate]=\"iconTemplate()\"\n [collapseTree]=\"collapseTree()\"\n [openedIds]=\"openedIds()\"\n (openedIdsChange)=\"openedIdsChange.emit($event)\"\n (itemSelected)=\"itemSelected.emit($event)\"\n ></li>\n }\n }\n }\n }\n </ul>\n\n <ng-content select=\"NavigationFooter\" />\n </div>\n\n <!-- ROW 2 = child dari menu item aktif; HANYA area ini yang men-scroll. -->\n <div\n [id]=\"panelContentId()\"\n data-navigation-flyout-scroll=\"true\"\n [attr.role]=\"activeBranch() ? 'menu' : null\"\n [attr.aria-label]=\"activeBranch()?.title || null\"\n [class]=\"scrollRegionClasses()\"\n >\n @if (activeBranch(); as branch) {\n <NavigationEntryGrid\n [navId]=\"navId()\"\n [branch]=\"branch\"\n [typeStyle]=\"typeStyle()\"\n [itemClass]=\"itemClass()\"\n [activeIds]=\"activeIds()\"\n [activeUrl]=\"activeUrl()\"\n [iconTemplate]=\"iconTemplate()\"\n [collapseTree]=\"collapseTree()\"\n [openedIds]=\"openedIds()\"\n (openedIdsChange)=\"openedIdsChange.emit($event)\"\n (itemSelected)=\"itemSelected.emit($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["[data-navigation-flyout-floating=true]{width:var(--nav-flyout-floating-width, min(22rem, 85vw));max-width:var(--nav-flyout-floating-max-width, 85vw)}[data-navigation-flyout-floating-card=true]{border-radius:var(--nav-flyout-floating-radius, var(--radius-xl))}[data-navigation-flyout-panel=true]{-webkit-app-region:no-drag;app-region:no-drag}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "Icon", inputs: ["name", "class", "size", "fill", "weight", "grade", "opticalSize"] }, { kind: "component", type: NavigationEntryGridComponent, selector: "NavigationEntryGrid", inputs: ["navId", "branch", "typeStyle", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavigationItemComponent, selector: "li[NavigationItem]", inputs: ["navId", "item", "level", "orientation", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "tooltip-position", "collapseTree", "straightRail", "stairsRail", "straightRailActive", "firstInBranch", "lastInBranch", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavigationItemContentComponent, selector: "NavigationItemContent", inputs: ["item", "active", "compact", "orientation", "level", "iconTemplate"] }] });
390
- }
391
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NavigationFlyoutMenuComponent, decorators: [{
392
- type: Component,
393
- args: [{ selector: 'NavigationFlyoutMenu', imports: [
394
- IconComponent,
395
- NavigationEntryGridComponent,
396
- NavigationItemComponent,
397
- NavigationItemContentComponent,
398
- ], host: {
399
- '[class]': 'hostClasses()',
400
- '(keydown.escape)': 'onEscape($event)',
401
- }, template: "<button\n type=\"button\"\n data-navigation-flyout-trigger=\"true\"\n [class]=\"triggerClasses()\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId() : null\"\n [attr.aria-label]=\"showIconOnly() ? label() : null\"\n [attr.title]=\"showIconOnly() ? label() : null\"\n (click)=\"toggleFlyout()\"\n>\n @if (showIconOnly()) {\n <Icon\n [name]=\"triggerIcon() ?? 'menu'\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"text-(length:--nav-icon-size) text-current\"\n />\n } @else {\n @if (iconPosition() === 'start' && triggerIcon(); as iconName) {\n <Icon\n [name]=\"iconName\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"shrink-0 text-(length:--nav-icon-size) text-current\"\n />\n }\n\n <span class=\"truncate\">{{ label() }}</span>\n\n @if (iconPosition() === 'end' && triggerIcon(); as iconName) {\n <Icon\n [name]=\"iconName\"\n size=\"inherit\"\n [fill]=\"1\"\n class=\"shrink-0 text-(length:--nav-icon-size) text-current\"\n />\n }\n }\n</button>\n\n@if (isOpen()) {\n <div\n [id]=\"panelId()\"\n data-navigation-flyout-panel=\"true\"\n [attr.data-navigation-flyout-floating]=\"floating() ? 'true' : null\"\n [class]=\"panelWrapperClasses()\"\n [style.left.px]=\"floating() ? null : panelPlacement()?.left\"\n [style.top.px]=\"floating() || isBottom() ? null : panelPlacement()?.top\"\n [style.bottom.px]=\"!floating() && isBottom() ? panelPlacement()?.bottom : null\"\n [style.width.px]=\"floating() ? null : panelPlacement()?.width\"\n >\n <div\n [attr.data-navigation-flyout-floating-card]=\"floating() ? 'true' : null\"\n [class]=\"panelCardClasses()\"\n >\n <div data-navigation-flyout-menu-layout=\"true\" [class]=\"menuClasses()\">\n <!-- ROW 1 = bar (sticky, menutup bar trigger), struktur seperti bar navbar:\n Header (kiri) | menu item (tengah) | Footer (kanan). Hanya ROW 2 (grid child)\n di bawah bar yang ikut scroll. -->\n <div data-navigation-flyout-bar=\"true\" [class]=\"barRowClasses()\">\n <ng-content select=\"NavigationHeader\" />\n\n <ul\n role=\"menu\"\n tabindex=\"-1\"\n data-navigation-flyout-row=\"true\"\n [class]=\"rowClasses()\"\n [attr.aria-label]=\"label()\"\n (keydown)=\"onRowKeydown($event)\"\n >\n @for (item of items(); track item.key) {\n @switch (item.type) {\n @case ('divider') {\n <li role=\"separator\" class=\"mx-1 h-5 w-px bg-border\"></li>\n }\n @case ('spacer') {\n <li role=\"none\" aria-hidden=\"true\" class=\"flex-1\"></li>\n }\n @default {\n @if (item.children.length > 0) {\n <li\n role=\"none\"\n [class]=\"groupContainerClasses(item)\"\n [attr.data-navigation-item-key]=\"item.key\"\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n data-navigation-flyout-tab=\"true\"\n [class]=\"tabClasses(item)\"\n [attr.aria-expanded]=\"isBranchOpen(item)\"\n [attr.aria-controls]=\"isBranchOpen(item) ? panelContentId() : null\"\n [disabled]=\"item.disabled || null\"\n (click)=\"openBranch(item)\"\n >\n <NavigationItemContent\n [item]=\"item\"\n [active]=\"isItemActive(item)\"\n [compact]=\"false\"\n [orientation]=\"'horizontal'\"\n [level]=\"0\"\n [iconTemplate]=\"iconTemplate()\"\n />\n <Icon\n name=\"chevron_right\"\n size=\"inherit\"\n [class]=\"tabChevronClasses(item)\"\n />\n </button>\n </li>\n } @else {\n <li\n NavigationItem\n [navId]=\"navId()\"\n [item]=\"item\"\n [level]=\"0\"\n [orientation]=\"'horizontal'\"\n [compact]=\"false\"\n [itemClass]=\"navItemClass()\"\n [activeIds]=\"activeIds()\"\n [activeUrl]=\"activeUrl()\"\n [iconTemplate]=\"iconTemplate()\"\n [collapseTree]=\"collapseTree()\"\n [openedIds]=\"openedIds()\"\n (openedIdsChange)=\"openedIdsChange.emit($event)\"\n (itemSelected)=\"itemSelected.emit($event)\"\n ></li>\n }\n }\n }\n }\n </ul>\n\n <ng-content select=\"NavigationFooter\" />\n </div>\n\n <!-- ROW 2 = child dari menu item aktif; HANYA area ini yang men-scroll. -->\n <div\n [id]=\"panelContentId()\"\n data-navigation-flyout-scroll=\"true\"\n [attr.role]=\"activeBranch() ? 'menu' : null\"\n [attr.aria-label]=\"activeBranch()?.title || null\"\n [class]=\"scrollRegionClasses()\"\n >\n @if (activeBranch(); as branch) {\n <NavigationEntryGrid\n [navId]=\"navId()\"\n [branch]=\"branch\"\n [typeStyle]=\"typeStyle()\"\n [itemClass]=\"itemClass()\"\n [activeIds]=\"activeIds()\"\n [activeUrl]=\"activeUrl()\"\n [iconTemplate]=\"iconTemplate()\"\n [collapseTree]=\"collapseTree()\"\n [openedIds]=\"openedIds()\"\n (openedIdsChange)=\"openedIdsChange.emit($event)\"\n (itemSelected)=\"itemSelected.emit($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["[data-navigation-flyout-floating=true]{width:var(--nav-flyout-floating-width, min(22rem, 85vw));max-width:var(--nav-flyout-floating-max-width, 85vw)}[data-navigation-flyout-floating-card=true]{border-radius:var(--nav-flyout-floating-radius, var(--radius-xl))}[data-navigation-flyout-panel=true]{-webkit-app-region:no-drag;app-region:no-drag}\n"] }]
402
- }], ctorParameters: () => [], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], iconPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPosition", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], floating: [{ type: i0.Input, args: [{ isSignal: true, alias: "floating", required: false }] }], viewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewport", required: false }] }], triggerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerClass", required: false }] }], triggerButtonClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerButtonClass", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], typeStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeStyle", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], groupClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
403
-
404
- export { NavigationFlyoutMenuComponent };