@ojiepermana/angular 21.3.4 → 22.0.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 (290) hide show
  1. package/README.md +10 -6
  2. package/component/accordion/README.md +195 -0
  3. package/component/alert/README.md +182 -0
  4. package/component/alert-dialog/README.md +239 -0
  5. package/component/aspect-ratio/README.md +112 -0
  6. package/component/avatar/README.md +176 -0
  7. package/component/badge/README.md +133 -0
  8. package/component/breadcrumb/README.md +216 -0
  9. package/component/button/README.md +139 -0
  10. package/component/button-group/README.md +208 -0
  11. package/component/calendar/README.md +132 -0
  12. package/component/card/README.md +220 -0
  13. package/component/carousel/README.md +276 -0
  14. package/component/checkbox/README.md +149 -0
  15. package/component/collapsible/README.md +195 -0
  16. package/component/combobox/README.md +198 -0
  17. package/component/command/README.md +275 -0
  18. package/component/composer/README.md +235 -0
  19. package/component/composer/package.json +4 -0
  20. package/component/context-menu/README.md +267 -0
  21. package/component/date-picker/README.md +177 -0
  22. package/component/dialog/README.md +237 -0
  23. package/component/drawer/README.md +145 -0
  24. package/component/dropdown-menu/README.md +311 -0
  25. package/component/editor/README.md +136 -0
  26. package/component/editor/package.json +4 -0
  27. package/component/empty/README.md +183 -0
  28. package/component/empty/package.json +4 -0
  29. package/component/form/README.md +210 -0
  30. package/component/hover-card/README.md +146 -0
  31. package/component/hover-card/package.json +4 -0
  32. package/component/input/README.md +159 -0
  33. package/component/input-group/README.md +239 -0
  34. package/component/input-otp/README.md +278 -0
  35. package/component/input-otp/package.json +4 -0
  36. package/component/item/README.md +247 -0
  37. package/component/kanban/README.md +81 -0
  38. package/component/kanban/package.json +4 -0
  39. package/component/kbd/README.md +139 -0
  40. package/component/kbd/package.json +4 -0
  41. package/component/label/README.md +136 -0
  42. package/component/menubar/README.md +269 -0
  43. package/component/menubar/package.json +4 -0
  44. package/component/native-select/README.md +176 -0
  45. package/component/native-select/package.json +4 -0
  46. package/component/navigation-menu/README.md +160 -0
  47. package/component/navigation-menu/package.json +4 -0
  48. package/component/pagination/README.md +144 -0
  49. package/component/pillbox/README.md +67 -0
  50. package/component/pillbox/package.json +4 -0
  51. package/component/popover/README.md +43 -0
  52. package/component/progress/README.md +160 -0
  53. package/component/radio/README.md +209 -0
  54. package/component/resizable/README.md +168 -0
  55. package/component/resizable/package.json +4 -0
  56. package/component/scroll-area/README.md +143 -0
  57. package/component/select/README.md +174 -0
  58. package/component/separator/README.md +170 -0
  59. package/component/sheet/README.md +183 -0
  60. package/component/skeleton/README.md +158 -0
  61. package/component/slider/README.md +207 -0
  62. package/component/spinner/README.md +160 -0
  63. package/component/spinner/package.json +4 -0
  64. package/component/switch/README.md +166 -0
  65. package/component/table/README.md +291 -0
  66. package/component/tabs/README.md +219 -0
  67. package/component/textarea/README.md +154 -0
  68. package/component/timeline/README.md +94 -0
  69. package/component/timeline/package.json +4 -0
  70. package/component/toast/README.md +321 -0
  71. package/component/toggle/README.md +131 -0
  72. package/component/toggle/package.json +4 -0
  73. package/component/toggle-group/README.md +206 -0
  74. package/component/toggle-group/package.json +4 -0
  75. package/component/tooltip/README.md +211 -0
  76. package/fesm2022/ojiepermana-angular-component-accordion.mjs +45 -30
  77. package/fesm2022/ojiepermana-angular-component-accordion.mjs.map +1 -1
  78. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +95 -61
  79. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs.map +1 -1
  80. package/fesm2022/ojiepermana-angular-component-alert.mjs +30 -21
  81. package/fesm2022/ojiepermana-angular-component-alert.mjs.map +1 -1
  82. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +11 -7
  83. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs.map +1 -1
  84. package/fesm2022/ojiepermana-angular-component-avatar.mjs +50 -34
  85. package/fesm2022/ojiepermana-angular-component-avatar.mjs.map +1 -1
  86. package/fesm2022/ojiepermana-angular-component-badge.mjs +9 -6
  87. package/fesm2022/ojiepermana-angular-component-badge.mjs.map +1 -1
  88. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +49 -35
  89. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs.map +1 -1
  90. package/fesm2022/ojiepermana-angular-component-button-group.mjs +25 -17
  91. package/fesm2022/ojiepermana-angular-component-button-group.mjs.map +1 -1
  92. package/fesm2022/ojiepermana-angular-component-button.mjs +11 -7
  93. package/fesm2022/ojiepermana-angular-component-button.mjs.map +1 -1
  94. package/fesm2022/ojiepermana-angular-component-calendar.mjs +23 -13
  95. package/fesm2022/ojiepermana-angular-component-calendar.mjs.map +1 -1
  96. package/fesm2022/ojiepermana-angular-component-card.mjs +51 -36
  97. package/fesm2022/ojiepermana-angular-component-card.mjs.map +1 -1
  98. package/fesm2022/ojiepermana-angular-component-carousel.mjs +66 -42
  99. package/fesm2022/ojiepermana-angular-component-carousel.mjs.map +1 -1
  100. package/fesm2022/ojiepermana-angular-component-chart.mjs +494 -283
  101. package/fesm2022/ojiepermana-angular-component-chart.mjs.map +1 -1
  102. package/fesm2022/ojiepermana-angular-component-checkbox.mjs +23 -13
  103. package/fesm2022/ojiepermana-angular-component-checkbox.mjs.map +1 -1
  104. package/fesm2022/ojiepermana-angular-component-collapsible.mjs +28 -20
  105. package/fesm2022/ojiepermana-angular-component-collapsible.mjs.map +1 -1
  106. package/fesm2022/ojiepermana-angular-component-combobox.mjs +27 -18
  107. package/fesm2022/ojiepermana-angular-component-combobox.mjs.map +1 -1
  108. package/fesm2022/ojiepermana-angular-component-command.mjs +77 -52
  109. package/fesm2022/ojiepermana-angular-component-command.mjs.map +1 -1
  110. package/fesm2022/ojiepermana-angular-component-composer.mjs +352 -0
  111. package/fesm2022/ojiepermana-angular-component-composer.mjs.map +1 -0
  112. package/fesm2022/ojiepermana-angular-component-context-menu.mjs +9 -6
  113. package/fesm2022/ojiepermana-angular-component-context-menu.mjs.map +1 -1
  114. package/fesm2022/ojiepermana-angular-component-date-picker.mjs +34 -19
  115. package/fesm2022/ojiepermana-angular-component-date-picker.mjs.map +1 -1
  116. package/fesm2022/ojiepermana-angular-component-dialog.mjs +55 -38
  117. package/fesm2022/ojiepermana-angular-component-dialog.mjs.map +1 -1
  118. package/fesm2022/ojiepermana-angular-component-drawer.mjs.map +1 -1
  119. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +108 -74
  120. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs.map +1 -1
  121. package/fesm2022/ojiepermana-angular-component-editor.mjs +717 -0
  122. package/fesm2022/ojiepermana-angular-component-editor.mjs.map +1 -0
  123. package/fesm2022/ojiepermana-angular-component-empty.mjs +145 -0
  124. package/fesm2022/ojiepermana-angular-component-empty.mjs.map +1 -0
  125. package/fesm2022/ojiepermana-angular-component-form.mjs +200 -42
  126. package/fesm2022/ojiepermana-angular-component-form.mjs.map +1 -1
  127. package/fesm2022/ojiepermana-angular-component-hover-card.mjs +297 -0
  128. package/fesm2022/ojiepermana-angular-component-hover-card.mjs.map +1 -0
  129. package/fesm2022/ojiepermana-angular-component-input-group.mjs +48 -33
  130. package/fesm2022/ojiepermana-angular-component-input-group.mjs.map +1 -1
  131. package/fesm2022/ojiepermana-angular-component-input-otp.mjs +514 -0
  132. package/fesm2022/ojiepermana-angular-component-input-otp.mjs.map +1 -0
  133. package/fesm2022/ojiepermana-angular-component-input.mjs +7 -5
  134. package/fesm2022/ojiepermana-angular-component-input.mjs.map +1 -1
  135. package/fesm2022/ojiepermana-angular-component-item.mjs +76 -53
  136. package/fesm2022/ojiepermana-angular-component-item.mjs.map +1 -1
  137. package/fesm2022/ojiepermana-angular-component-kanban.mjs +314 -0
  138. package/fesm2022/ojiepermana-angular-component-kanban.mjs.map +1 -0
  139. package/fesm2022/ojiepermana-angular-component-kbd.mjs +55 -0
  140. package/fesm2022/ojiepermana-angular-component-kbd.mjs.map +1 -0
  141. package/fesm2022/ojiepermana-angular-component-label.mjs +9 -6
  142. package/fesm2022/ojiepermana-angular-component-label.mjs.map +1 -1
  143. package/fesm2022/ojiepermana-angular-component-menubar.mjs +308 -0
  144. package/fesm2022/ojiepermana-angular-component-menubar.mjs.map +1 -0
  145. package/fesm2022/ojiepermana-angular-component-native-select.mjs +67 -0
  146. package/fesm2022/ojiepermana-angular-component-native-select.mjs.map +1 -0
  147. package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +413 -0
  148. package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs.map +1 -0
  149. package/fesm2022/ojiepermana-angular-component-pagination.mjs +65 -31
  150. package/fesm2022/ojiepermana-angular-component-pagination.mjs.map +1 -1
  151. package/fesm2022/ojiepermana-angular-component-pillbox.mjs +812 -0
  152. package/fesm2022/ojiepermana-angular-component-pillbox.mjs.map +1 -0
  153. package/fesm2022/ojiepermana-angular-component-popover.mjs +18 -12
  154. package/fesm2022/ojiepermana-angular-component-popover.mjs.map +1 -1
  155. package/fesm2022/ojiepermana-angular-component-progress.mjs +17 -10
  156. package/fesm2022/ojiepermana-angular-component-progress.mjs.map +1 -1
  157. package/fesm2022/ojiepermana-angular-component-radio.mjs +47 -17
  158. package/fesm2022/ojiepermana-angular-component-radio.mjs.map +1 -1
  159. package/fesm2022/ojiepermana-angular-component-resizable.mjs +481 -0
  160. package/fesm2022/ojiepermana-angular-component-resizable.mjs.map +1 -0
  161. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +15 -9
  162. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs.map +1 -1
  163. package/fesm2022/ojiepermana-angular-component-select.mjs +71 -26
  164. package/fesm2022/ojiepermana-angular-component-select.mjs.map +1 -1
  165. package/fesm2022/ojiepermana-angular-component-separator.mjs +11 -7
  166. package/fesm2022/ojiepermana-angular-component-separator.mjs.map +1 -1
  167. package/fesm2022/ojiepermana-angular-component-sheet.mjs +91 -42
  168. package/fesm2022/ojiepermana-angular-component-sheet.mjs.map +1 -1
  169. package/fesm2022/ojiepermana-angular-component-skeleton.mjs +7 -5
  170. package/fesm2022/ojiepermana-angular-component-skeleton.mjs.map +1 -1
  171. package/fesm2022/ojiepermana-angular-component-slider.mjs +401 -7
  172. package/fesm2022/ojiepermana-angular-component-slider.mjs.map +1 -1
  173. package/fesm2022/ojiepermana-angular-component-spinner.mjs +60 -0
  174. package/fesm2022/ojiepermana-angular-component-spinner.mjs.map +1 -0
  175. package/fesm2022/ojiepermana-angular-component-switch.mjs +47 -15
  176. package/fesm2022/ojiepermana-angular-component-switch.mjs.map +1 -1
  177. package/fesm2022/ojiepermana-angular-component-table.mjs +56 -40
  178. package/fesm2022/ojiepermana-angular-component-table.mjs.map +1 -1
  179. package/fesm2022/ojiepermana-angular-component-tabs.mjs +58 -38
  180. package/fesm2022/ojiepermana-angular-component-tabs.mjs.map +1 -1
  181. package/fesm2022/ojiepermana-angular-component-textarea.mjs +8 -6
  182. package/fesm2022/ojiepermana-angular-component-textarea.mjs.map +1 -1
  183. package/fesm2022/ojiepermana-angular-component-timeline.mjs +237 -0
  184. package/fesm2022/ojiepermana-angular-component-timeline.mjs.map +1 -0
  185. package/fesm2022/ojiepermana-angular-component-toast.mjs +28 -4
  186. package/fesm2022/ojiepermana-angular-component-toast.mjs.map +1 -1
  187. package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +289 -0
  188. package/fesm2022/ojiepermana-angular-component-toggle-group.mjs.map +1 -0
  189. package/fesm2022/ojiepermana-angular-component-toggle.mjs +82 -0
  190. package/fesm2022/ojiepermana-angular-component-toggle.mjs.map +1 -0
  191. package/fesm2022/ojiepermana-angular-component-tooltip.mjs +304 -6
  192. package/fesm2022/ojiepermana-angular-component-tooltip.mjs.map +1 -1
  193. package/fesm2022/ojiepermana-angular-component-utils.mjs.map +1 -1
  194. package/fesm2022/ojiepermana-angular-layout-component.mjs +45 -24
  195. package/fesm2022/ojiepermana-angular-layout-component.mjs.map +1 -1
  196. package/fesm2022/ojiepermana-angular-layout-provider.mjs.map +1 -1
  197. package/fesm2022/ojiepermana-angular-layout-services.mjs +7 -5
  198. package/fesm2022/ojiepermana-angular-layout-services.mjs.map +1 -1
  199. package/fesm2022/ojiepermana-angular-layout-shell.mjs +3 -3
  200. package/fesm2022/ojiepermana-angular-layout-shell.mjs.map +1 -1
  201. package/fesm2022/ojiepermana-angular-layout-token-directive.mjs +9 -6
  202. package/fesm2022/ojiepermana-angular-layout-token-directive.mjs.map +1 -1
  203. package/fesm2022/ojiepermana-angular-layout-token.mjs.map +1 -1
  204. package/fesm2022/{ojiepermana-angular-layout-empty.mjs → ojiepermana-angular-layout-type-empty.mjs} +4 -4
  205. package/fesm2022/ojiepermana-angular-layout-type-empty.mjs.map +1 -0
  206. package/fesm2022/{ojiepermana-angular-layout-horizontal.mjs → ojiepermana-angular-layout-type-horizontal.mjs} +26 -17
  207. package/fesm2022/ojiepermana-angular-layout-type-horizontal.mjs.map +1 -0
  208. package/fesm2022/{ojiepermana-angular-layout-vertical.mjs → ojiepermana-angular-layout-type-vertical.mjs} +28 -18
  209. package/fesm2022/ojiepermana-angular-layout-type-vertical.mjs.map +1 -0
  210. package/fesm2022/ojiepermana-angular-layout.mjs +74 -50
  211. package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
  212. package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs.map +1 -1
  213. package/fesm2022/ojiepermana-angular-navigation-icon.mjs +11 -7
  214. package/fesm2022/ojiepermana-angular-navigation-icon.mjs.map +1 -1
  215. package/fesm2022/ojiepermana-angular-navigation-item.mjs +27 -16
  216. package/fesm2022/ojiepermana-angular-navigation-item.mjs.map +1 -1
  217. package/fesm2022/ojiepermana-angular-navigation-service.mjs +29 -20
  218. package/fesm2022/ojiepermana-angular-navigation-service.mjs.map +1 -1
  219. package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs +71 -43
  220. package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs.map +1 -1
  221. package/fesm2022/ojiepermana-angular-navigation-topbar.mjs +261 -24
  222. package/fesm2022/ojiepermana-angular-navigation-topbar.mjs.map +1 -1
  223. package/fesm2022/ojiepermana-angular-theme-provider.mjs.map +1 -1
  224. package/fesm2022/ojiepermana-angular-theme-services.mjs +19 -11
  225. package/fesm2022/ojiepermana-angular-theme-services.mjs.map +1 -1
  226. package/fesm2022/ojiepermana-angular-theme-token.mjs.map +1 -1
  227. package/fesm2022/ojiepermana-angular-theme.mjs +19 -11
  228. package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -1
  229. package/generator/api/bin/src/emit/client.js +4 -2
  230. package/generator/api/bin/src/writer/index.js +2 -2
  231. package/generator/guide/bin/schematics/build/index.js +3 -2
  232. package/generator/guide/bin/src/engine/component.js +2 -2
  233. package/generator/guide/bin/src/engine/index.js +3 -3
  234. package/generator/guide/bin/src/engine/render.js +10 -5
  235. package/layout/type/empty/package.json +4 -0
  236. package/layout/type/horizontal/package.json +4 -0
  237. package/layout/type/vertical/package.json +4 -0
  238. package/navigation/topbar/README.md +196 -0
  239. package/package.json +89 -25
  240. package/theme/README.md +110 -3
  241. package/theme/styles/integrations/material/autocomplete.css +178 -0
  242. package/theme/styles/integrations/material/button.css +468 -0
  243. package/theme/styles/integrations/material/dialog.css +152 -0
  244. package/theme/styles/integrations/material/select.css +175 -0
  245. package/theme/styles/integrations/material/slide-toggle.css +234 -0
  246. package/theme/styles/integrations/material/slider.css +194 -0
  247. package/theme/styles/integrations/material/tabs.css +229 -0
  248. package/theme/styles/integrations/material.css +70 -60
  249. package/types/ojiepermana-angular-component-combobox.d.ts +1 -2
  250. package/types/ojiepermana-angular-component-composer.d.ts +90 -0
  251. package/types/ojiepermana-angular-component-dropdown-menu.d.ts +2 -0
  252. package/types/ojiepermana-angular-component-editor.d.ts +123 -0
  253. package/types/ojiepermana-angular-component-empty.d.ts +50 -0
  254. package/types/ojiepermana-angular-component-form.d.ts +52 -3
  255. package/types/ojiepermana-angular-component-hover-card.d.ts +74 -0
  256. package/types/ojiepermana-angular-component-input-otp.d.ts +136 -0
  257. package/types/ojiepermana-angular-component-kanban.d.ts +70 -0
  258. package/types/ojiepermana-angular-component-kbd.d.ts +16 -0
  259. package/types/ojiepermana-angular-component-menubar.d.ts +67 -0
  260. package/types/ojiepermana-angular-component-native-select.d.ts +26 -0
  261. package/types/ojiepermana-angular-component-navigation-menu.d.ts +96 -0
  262. package/types/ojiepermana-angular-component-pagination.d.ts +10 -4
  263. package/types/ojiepermana-angular-component-pillbox.d.ts +157 -0
  264. package/types/ojiepermana-angular-component-radio.d.ts +7 -1
  265. package/types/ojiepermana-angular-component-resizable.d.ts +99 -0
  266. package/types/ojiepermana-angular-component-select.d.ts +17 -5
  267. package/types/ojiepermana-angular-component-sheet.d.ts +3 -1
  268. package/types/ojiepermana-angular-component-slider.d.ts +59 -1
  269. package/types/ojiepermana-angular-component-spinner.d.ts +13 -0
  270. package/types/ojiepermana-angular-component-switch.d.ts +13 -3
  271. package/types/ojiepermana-angular-component-timeline.d.ts +63 -0
  272. package/types/ojiepermana-angular-component-toast.d.ts +12 -3
  273. package/types/ojiepermana-angular-component-toggle-group.d.ts +89 -0
  274. package/types/ojiepermana-angular-component-toggle.d.ts +25 -0
  275. package/types/ojiepermana-angular-component-tooltip.d.ts +72 -5
  276. package/types/{ojiepermana-angular-layout-horizontal.d.ts → ojiepermana-angular-layout-type-horizontal.d.ts} +3 -3
  277. package/types/{ojiepermana-angular-layout-vertical.d.ts → ojiepermana-angular-layout-type-vertical.d.ts} +3 -3
  278. package/types/ojiepermana-angular-layout.d.ts +5 -5
  279. package/types/ojiepermana-angular-navigation-item.d.ts +1 -1
  280. package/types/ojiepermana-angular-navigation-service.d.ts +7 -7
  281. package/types/ojiepermana-angular-navigation-sidebar.d.ts +8 -8
  282. package/types/ojiepermana-angular-navigation-topbar.d.ts +24 -4
  283. package/types/ojiepermana-angular-navigation-types.d.ts +14 -8
  284. package/fesm2022/ojiepermana-angular-layout-empty.mjs.map +0 -1
  285. package/fesm2022/ojiepermana-angular-layout-horizontal.mjs.map +0 -1
  286. package/fesm2022/ojiepermana-angular-layout-vertical.mjs.map +0 -1
  287. package/layout/empty/package.json +0 -4
  288. package/layout/horizontal/package.json +0 -4
  289. package/layout/vertical/package.json +0 -4
  290. /package/types/{ojiepermana-angular-layout-empty.d.ts → ojiepermana-angular-layout-type-empty.d.ts} +0 -0
@@ -19,24 +19,50 @@ class TopbarComponent {
19
19
  vcr = inject(ViewContainerRef);
20
20
  host = inject(ElementRef);
21
21
  destroyRef = inject(DestroyRef);
22
- items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
22
+ items = input([], /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
23
24
  /** Registry key di `NavigationService`. Default `'main'`. */
24
- navigationId = input(DEFAULT_NAVIGATION_ID, ...(ngDevMode ? [{ debugName: "navigationId" }] : /* istanbul ignore next */ []));
25
- appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
26
- ariaLabel = input('Primary', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
27
- class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
25
+ navigationId = input(DEFAULT_NAVIGATION_ID, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "navigationId" }] : /* istanbul ignore next */ []));
27
+ variant = input('default', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
29
+ ariaLabel = input('Primary', /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
31
+ class = input('', /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
28
33
  /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */
29
- autoRegister = input(true, ...(ngDevMode ? [{ debugName: "autoRegister" }] : /* istanbul ignore next */ []));
34
+ autoRegister = input(true, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "autoRegister" }] : /* istanbul ignore next */ []));
30
36
  /** Tampilkan hamburger di `< md` yang men-toggle mobile drawer sidebar. */
31
- showHamburger = input(true, ...(ngDevMode ? [{ debugName: "showHamburger" }] : /* istanbul ignore next */ []));
32
- hamburgerLabel = input('Open navigation', ...(ngDevMode ? [{ debugName: "hamburgerLabel" }] : /* istanbul ignore next */ []));
37
+ showHamburger = input(true, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "showHamburger" }] : /* istanbul ignore next */ []));
39
+ hamburgerLabel = input('Open navigation', /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "hamburgerLabel" }] : /* istanbul ignore next */ []));
33
41
  mobileOpen = this.nav.mobileOpen;
42
+ isFlyout = computed(() => this.variant() === 'flyout', /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "isFlyout" }] : /* istanbul ignore next */ []));
44
+ exactMatch = {
45
+ exact: true,
46
+ paths: 'exact',
47
+ queryParams: 'exact',
48
+ fragment: 'exact',
49
+ matrixParams: 'exact',
50
+ };
51
+ inexactMatch = {
52
+ exact: false,
53
+ paths: 'subset',
54
+ queryParams: 'subset',
55
+ fragment: 'ignored',
56
+ matrixParams: 'ignored',
57
+ };
34
58
  /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */
35
59
  resolvedItems = computed(() => {
36
60
  const explicit = this.items();
37
61
  return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();
38
- }, ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
39
- openId = signal(null, ...(ngDevMode ? [{ debugName: "openId" }] : /* istanbul ignore next */ []));
62
+ }, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
64
+ openId = signal(null, /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "openId" }] : /* istanbul ignore next */ []));
40
66
  active = null;
41
67
  dropdownTpl = viewChild.required('dropdownTpl');
42
68
  constructor() {
@@ -49,12 +75,14 @@ class TopbarComponent {
49
75
  }
50
76
  hostClasses = computed(() => {
51
77
  return ['sticky top-0 z-20 flex h-11 w-full items-center', this.class()].join(' ');
52
- }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
78
+ }, /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
53
80
  endSlotClasses = computed(() => {
54
81
  const base = ['flex h-full shrink-0 items-center justify-end gap-2 overflow-hidden'];
55
82
  base.push('[&>[topbar-end]]:flex', '[&>[topbar-end]]:min-w-0', '[&>[topbar-end]]:max-w-full', '[&>[topbar-end]]:items-center', '[&>[topbar-end]]:justify-end', '[&>[topbar-end]]:gap-2', '[&>[topbar-end]>*]:w-auto', '[&>[topbar-end]>*]:max-w-full', '[&>[topbar-end]>*]:justify-end', '[&>[topbar-end]>*]:gap-0', '[&>[topbar-end]>*]:px-2', '[&>[topbar-end]>*>*:first-child]:ml-auto', '[&>[topbar-end]>*>*:nth-child(n+2)]:hidden');
56
83
  return base.join(' ');
57
- }, ...(ngDevMode ? [{ debugName: "endSlotClasses" }] : /* istanbul ignore next */ []));
84
+ }, /* @ts-ignore */
85
+ ...(ngDevMode ? [{ debugName: "endSlotClasses" }] : /* istanbul ignore next */ []));
58
86
  asBasic(i) {
59
87
  return i;
60
88
  }
@@ -64,9 +92,38 @@ class TopbarComponent {
64
92
  asGroup(i) {
65
93
  return i;
66
94
  }
95
+ panelClasses(item) {
96
+ const classes = [
97
+ 'rounded-xl border border-border bg-background/95 p-2 text-foreground shadow-xl backdrop-blur supports-[backdrop-filter]:bg-background/90',
98
+ ];
99
+ if (this.isFlyout()) {
100
+ classes.push(item.children.length >= 4 ? 'w-[min(92vw,42rem)]' : 'w-[min(92vw,28rem)]');
101
+ }
102
+ else {
103
+ classes.push('min-w-56');
104
+ }
105
+ return classes.join(' ');
106
+ }
107
+ panelGridClasses(item) {
108
+ const classes = ['grid gap-2'];
109
+ if (item.children.length >= 4) {
110
+ classes.push('md:grid-cols-2');
111
+ }
112
+ return classes.join(' ');
113
+ }
114
+ flyoutItemClasses(active) {
115
+ return [
116
+ 'block rounded-lg border border-transparent px-4 py-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
117
+ active ? 'border-border bg-accent/50 text-foreground' : 'hover:bg-accent/50 hover:text-accent-foreground',
118
+ ].join(' ');
119
+ }
67
120
  isItemActive(id) {
68
121
  return this.nav.isActive(id);
69
122
  }
123
+ runMenuAction(item) {
124
+ item.action?.(item);
125
+ this.closeAll();
126
+ }
70
127
  toggleMobile() {
71
128
  this.nav.toggleMobile();
72
129
  }
@@ -200,8 +257,8 @@ class TopbarComponent {
200
257
  const items = this.collectPanelFocusables(panel);
201
258
  items[0]?.focus();
202
259
  }
203
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
204
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: TopbarComponent, isStandalone: true, selector: "topbar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, navigationId: { classPropertyName: "navigationId", publicName: "navigationId", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, autoRegister: { classPropertyName: "autoRegister", publicName: "autoRegister", isSignal: true, isRequired: false, transformFunction: null }, showHamburger: { classPropertyName: "showHamburger", publicName: "showHamburger", isSignal: true, isRequired: false, transformFunction: null }, hamburgerLabel: { classPropertyName: "hamburgerLabel", publicName: "hamburgerLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, properties: { "attr.aria-label": "ariaLabel()", "class": "hostClasses()", "attr.data-appearance": "appearance()" } }, viewQueries: [{ propertyName: "dropdownTpl", first: true, predicate: ["dropdownTpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
260
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: TopbarComponent, isStandalone: true, selector: "topbar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, navigationId: { classPropertyName: "navigationId", publicName: "navigationId", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, autoRegister: { classPropertyName: "autoRegister", publicName: "autoRegister", isSignal: true, isRequired: false, transformFunction: null }, showHamburger: { classPropertyName: "showHamburger", publicName: "showHamburger", isSignal: true, isRequired: false, transformFunction: null }, hamburgerLabel: { classPropertyName: "hamburgerLabel", publicName: "hamburgerLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, properties: { "attr.aria-label": "ariaLabel()", "class": "hostClasses()", "attr.data-variant": "variant()" } }, viewQueries: [{ propertyName: "dropdownTpl", first: true, predicate: ["dropdownTpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
205
262
  <div class="flex h-full w-full items-center gap-3 px-1">
206
263
  <div data-topbar-slot="start" class="flex shrink-0 items-center gap-2">
207
264
  @if (showHamburger()) {
@@ -298,15 +355,105 @@ class TopbarComponent {
298
355
 
299
356
  <!-- Dropdown template -->
300
357
  <ng-template #dropdownTpl let-item>
301
- <div role="menu" class="min-w-56 border border-brand bg-background/95 p-1" (keydown)="onPanelKeydown($event)">
302
- @for (child of item.children; track child.id) {
303
- <ui-nav-item [item]="child" />
358
+ <div role="menu" [class]="panelClasses(item)" (keydown)="onPanelKeydown($event)">
359
+ @if (isFlyout()) {
360
+ <div [class]="panelGridClasses(item)">
361
+ @for (child of item.children; track child.id) {
362
+ @switch (child.type) {
363
+ @case ('basic') {
364
+ @let basic = asBasic(child);
365
+ @if (basic.link && !basic.externalLink) {
366
+ <a
367
+ role="menuitem"
368
+ [class]="flyoutItemClasses(rla.isActive)"
369
+ [routerLink]="basic.link"
370
+ [queryParams]="basic.queryParams"
371
+ [queryParamsHandling]="basic.queryParamsHandling ?? null"
372
+ [fragment]="basic.fragment ?? undefined"
373
+ [preserveFragment]="basic.preserveFragment ?? false"
374
+ [target]="basic.target ?? undefined"
375
+ routerLinkActive
376
+ #rla="routerLinkActive"
377
+ [routerLinkActiveOptions]="
378
+ basic.isActiveMatchOptions ?? (basic.exactMatch ? exactMatch : inexactMatch)
379
+ "
380
+ [attr.aria-current]="rla.isActive ? 'page' : null"
381
+ (click)="closeAll()">
382
+ <div class="flex items-start gap-3">
383
+ @if (basic.icon) {
384
+ <span
385
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
386
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
387
+ </span>
388
+ }
389
+ <div class="min-w-0 space-y-1">
390
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
391
+ @if (basic.subtitle) {
392
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
393
+ }
394
+ </div>
395
+ </div>
396
+ </a>
397
+ } @else if (basic.link && basic.externalLink) {
398
+ <a
399
+ role="menuitem"
400
+ [class]="flyoutItemClasses(false)"
401
+ [attr.href]="basic.link"
402
+ [attr.target]="basic.target ?? '_blank'"
403
+ rel="noopener noreferrer"
404
+ (click)="closeAll()">
405
+ <div class="flex items-start gap-3">
406
+ @if (basic.icon) {
407
+ <span
408
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
409
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
410
+ </span>
411
+ }
412
+ <div class="min-w-0 space-y-1">
413
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
414
+ @if (basic.subtitle) {
415
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
416
+ }
417
+ </div>
418
+ </div>
419
+ </a>
420
+ } @else {
421
+ <button type="button" [class]="flyoutItemClasses(false)" (click)="runMenuAction(basic)">
422
+ <div class="flex items-start gap-3 text-left">
423
+ @if (basic.icon) {
424
+ <span
425
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
426
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
427
+ </span>
428
+ }
429
+ <div class="min-w-0 space-y-1">
430
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
431
+ @if (basic.subtitle) {
432
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
433
+ }
434
+ </div>
435
+ </div>
436
+ </button>
437
+ }
438
+ }
439
+ @default {
440
+ <div class="md:col-span-2">
441
+ <ui-nav-item [item]="child" />
442
+ </div>
443
+ }
444
+ }
445
+ }
446
+ </div>
447
+ } @else {
448
+ @for (child of item.children; track child.id) {
449
+ <ui-nav-item [item]="child" />
450
+ }
304
451
  }
305
452
  </div>
306
453
  </ng-template>
307
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: UiNavIconComponent, selector: "ui-nav-icon", inputs: ["name", "class", "size"] }, { kind: "component", type: UiNavItemComponent, selector: "ui-nav-item", inputs: ["item", "level", "compact", "railConnector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
454
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: UiNavIconComponent, selector: "ui-nav-icon", inputs: ["name", "class", "size"] }, { kind: "component", type: UiNavItemComponent, selector: "ui-nav-item", inputs: ["item", "level", "compact", "railConnector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
308
455
  }
309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TopbarComponent, decorators: [{
456
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TopbarComponent, decorators: [{
310
457
  type: Component,
311
458
  args: [{
312
459
  selector: 'topbar',
@@ -316,7 +463,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
316
463
  role: 'navigation',
317
464
  '[attr.aria-label]': 'ariaLabel()',
318
465
  '[class]': 'hostClasses()',
319
- '[attr.data-appearance]': 'appearance()',
466
+ '[attr.data-variant]': 'variant()',
320
467
  },
321
468
  template: `
322
469
  <div class="flex h-full w-full items-center gap-3 px-1">
@@ -415,15 +562,105 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
415
562
 
416
563
  <!-- Dropdown template -->
417
564
  <ng-template #dropdownTpl let-item>
418
- <div role="menu" class="min-w-56 border border-brand bg-background/95 p-1" (keydown)="onPanelKeydown($event)">
419
- @for (child of item.children; track child.id) {
420
- <ui-nav-item [item]="child" />
565
+ <div role="menu" [class]="panelClasses(item)" (keydown)="onPanelKeydown($event)">
566
+ @if (isFlyout()) {
567
+ <div [class]="panelGridClasses(item)">
568
+ @for (child of item.children; track child.id) {
569
+ @switch (child.type) {
570
+ @case ('basic') {
571
+ @let basic = asBasic(child);
572
+ @if (basic.link && !basic.externalLink) {
573
+ <a
574
+ role="menuitem"
575
+ [class]="flyoutItemClasses(rla.isActive)"
576
+ [routerLink]="basic.link"
577
+ [queryParams]="basic.queryParams"
578
+ [queryParamsHandling]="basic.queryParamsHandling ?? null"
579
+ [fragment]="basic.fragment ?? undefined"
580
+ [preserveFragment]="basic.preserveFragment ?? false"
581
+ [target]="basic.target ?? undefined"
582
+ routerLinkActive
583
+ #rla="routerLinkActive"
584
+ [routerLinkActiveOptions]="
585
+ basic.isActiveMatchOptions ?? (basic.exactMatch ? exactMatch : inexactMatch)
586
+ "
587
+ [attr.aria-current]="rla.isActive ? 'page' : null"
588
+ (click)="closeAll()">
589
+ <div class="flex items-start gap-3">
590
+ @if (basic.icon) {
591
+ <span
592
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
593
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
594
+ </span>
595
+ }
596
+ <div class="min-w-0 space-y-1">
597
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
598
+ @if (basic.subtitle) {
599
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
600
+ }
601
+ </div>
602
+ </div>
603
+ </a>
604
+ } @else if (basic.link && basic.externalLink) {
605
+ <a
606
+ role="menuitem"
607
+ [class]="flyoutItemClasses(false)"
608
+ [attr.href]="basic.link"
609
+ [attr.target]="basic.target ?? '_blank'"
610
+ rel="noopener noreferrer"
611
+ (click)="closeAll()">
612
+ <div class="flex items-start gap-3">
613
+ @if (basic.icon) {
614
+ <span
615
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
616
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
617
+ </span>
618
+ }
619
+ <div class="min-w-0 space-y-1">
620
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
621
+ @if (basic.subtitle) {
622
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
623
+ }
624
+ </div>
625
+ </div>
626
+ </a>
627
+ } @else {
628
+ <button type="button" [class]="flyoutItemClasses(false)" (click)="runMenuAction(basic)">
629
+ <div class="flex items-start gap-3 text-left">
630
+ @if (basic.icon) {
631
+ <span
632
+ class="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground">
633
+ <ui-nav-icon [name]="basic.icon" [size]="18" />
634
+ </span>
635
+ }
636
+ <div class="min-w-0 space-y-1">
637
+ <div class="font-medium leading-none text-foreground">{{ basic.title }}</div>
638
+ @if (basic.subtitle) {
639
+ <p class="line-clamp-2 text-sm leading-5 text-muted-foreground">{{ basic.subtitle }}</p>
640
+ }
641
+ </div>
642
+ </div>
643
+ </button>
644
+ }
645
+ }
646
+ @default {
647
+ <div class="md:col-span-2">
648
+ <ui-nav-item [item]="child" />
649
+ </div>
650
+ }
651
+ }
652
+ }
653
+ </div>
654
+ } @else {
655
+ @for (child of item.children; track child.id) {
656
+ <ui-nav-item [item]="child" />
657
+ }
421
658
  }
422
659
  </div>
423
660
  </ng-template>
424
661
  `,
425
662
  }]
426
- }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], navigationId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationId", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], autoRegister: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoRegister", required: false }] }], showHamburger: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHamburger", required: false }] }], hamburgerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hamburgerLabel", required: false }] }], dropdownTpl: [{ type: i0.ViewChild, args: ['dropdownTpl', { isSignal: true }] }] } });
663
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], navigationId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationId", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], autoRegister: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoRegister", required: false }] }], showHamburger: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHamburger", required: false }] }], hamburgerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hamburgerLabel", required: false }] }], dropdownTpl: [{ type: i0.ViewChild, args: ['dropdownTpl', { isSignal: true }] }] } });
427
664
 
428
665
  /**
429
666
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ojiepermana-angular-navigation-topbar.mjs","sources":["../../../projects/angular/navigation/topbar/src/lib/topbar.component.ts","../../../projects/angular/navigation/topbar/ojiepermana-angular-navigation-topbar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { UiNavIconComponent } from '@ojiepermana/angular/navigation/icon';\nimport { UiNavItemComponent } from '@ojiepermana/angular/navigation/item';\nimport { DEFAULT_NAVIGATION_ID, NavigationService } from '@ojiepermana/angular/navigation/service';\nimport type {\n NavigationBasicItem,\n NavigationCollapsableItem,\n NavigationGroupItem,\n NavigationItem,\n TopbarAppearance,\n} from '@ojiepermana/angular/navigation/types';\n\ninterface ActiveOverlay {\n ref: OverlayRef;\n id: string;\n}\n\n/**\n * Horizontal navigation (topbar) — shadcn-styled.\n */\n@Component({\n selector: 'topbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, RouterLinkActive, UiNavIconComponent, UiNavItemComponent],\n host: {\n role: 'navigation',\n '[attr.aria-label]': 'ariaLabel()',\n '[class]': 'hostClasses()',\n '[attr.data-appearance]': 'appearance()',\n },\n template: `\n <div class=\"flex h-full w-full items-center gap-3 px-1\">\n <div data-topbar-slot=\"start\" class=\"flex shrink-0 items-center gap-2\">\n @if (showHamburger()) {\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden\"\n [attr.aria-label]=\"hamburgerLabel()\"\n [attr.aria-expanded]=\"mobileOpen()\"\n (click)=\"toggleMobile()\">\n <ui-nav-icon name=\"menu\" [size]=\"18\" />\n </button>\n }\n <ng-content select=\"[topbar-start]\" />\n </div>\n\n <div data-topbar-slot=\"nav\" class=\"flex min-w-0 flex-1 items-center justify-center\">\n <ul\n class=\"flex min-w-0 flex-1 items-center justify-center gap-1\"\n role=\"menubar\"\n (keydown)=\"onMenubarKeydown($event)\">\n @for (item of resolvedItems(); track item.id) {\n <li role=\"none\" class=\"relative\">\n @switch (item.type) {\n @case ('basic') {\n @let basic = asBasic(item);\n <a\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary\"\n [routerLink]=\"basic.link\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [class.text-primary]=\"rla.isActive\"\n [attr.aria-current]=\"rla.isActive ? 'page' : null\"\n [target]=\"basic.target ?? undefined\">\n @if (basic.icon) {\n <ui-nav-icon [name]=\"basic.icon\" [size]=\"18\" />\n }\n <span>{{ basic.title }}</span>\n </a>\n }\n @case ('collapsable') {\n @let col = asCollapsable(item);\n <button\n #trigger\n type=\"button\"\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n [class.text-primary]=\"isItemActive(col.id)\"\n [attr.aria-expanded]=\"openId() === col.id\"\n [attr.aria-haspopup]=\"'menu'\"\n (click)=\"toggleDropdown(trigger, item)\"\n (mouseenter)=\"openDropdown(trigger, item)\">\n @if (col.icon) {\n <ui-nav-icon [name]=\"col.icon\" [size]=\"18\" />\n }\n <span>{{ col.title }}</span>\n <ui-nav-icon name=\"expand_more\" [size]=\"18\" />\n </button>\n }\n @case ('group') {\n @let group = asGroup(item);\n <button\n #trigger\n type=\"button\"\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n [class.text-primary]=\"isItemActive(group.id)\"\n [attr.aria-expanded]=\"openId() === group.id\"\n [attr.aria-haspopup]=\"'menu'\"\n (click)=\"toggleDropdown(trigger, item)\"\n (mouseenter)=\"openDropdown(trigger, item)\">\n @if (group.icon) {\n <ui-nav-icon [name]=\"group.icon\" [size]=\"18\" />\n }\n <span>{{ group.title }}</span>\n <ui-nav-icon name=\"expand_more\" [size]=\"18\" />\n </button>\n }\n @default {\n <span class=\"ui-nav-heading px-3 py-2 text-muted-foreground\">\n {{ item.title }}\n </span>\n }\n }\n </li>\n }\n </ul>\n </div>\n\n <div data-topbar-slot=\"end\" [class]=\"endSlotClasses()\">\n <ng-content select=\"[topbar-end]\" />\n </div>\n </div>\n\n <!-- Dropdown template -->\n <ng-template #dropdownTpl let-item>\n <div role=\"menu\" class=\"min-w-56 border border-brand bg-background/95 p-1\" (keydown)=\"onPanelKeydown($event)\">\n @for (child of item.children; track child.id) {\n <ui-nav-item [item]=\"child\" />\n }\n </div>\n </ng-template>\n `,\n})\nexport class TopbarComponent {\n protected readonly nav = inject(NavigationService);\n private readonly overlay = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly items = input<NavigationItem[]>([]);\n /** Registry key di `NavigationService`. Default `'main'`. */\n readonly navigationId = input<string>(DEFAULT_NAVIGATION_ID);\n readonly appearance = input<TopbarAppearance>('default');\n readonly ariaLabel = input<string>('Primary');\n readonly class = input<string>('');\n /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */\n readonly autoRegister = input<boolean>(true);\n /** Tampilkan hamburger di `< md` yang men-toggle mobile drawer sidebar. */\n readonly showHamburger = input<boolean>(true);\n readonly hamburgerLabel = input<string>('Open navigation');\n protected readonly mobileOpen = this.nav.mobileOpen;\n\n /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */\n protected readonly resolvedItems = computed(() => {\n const explicit = this.items();\n return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();\n });\n\n protected readonly openId = signal<string | null>(null);\n private active: ActiveOverlay | null = null;\n\n private readonly dropdownTpl = viewChild.required<TemplateRef<unknown>>('dropdownTpl');\n\n constructor() {\n effect(() => {\n const explicit = this.items();\n if (this.autoRegister() && explicit.length > 0) this.nav.registerItems(this.navigationId(), explicit);\n });\n this.destroyRef.onDestroy(() => this.closeAll());\n }\n\n protected readonly hostClasses = computed(() => {\n return ['sticky top-0 z-20 flex h-11 w-full items-center', this.class()].join(' ');\n });\n\n protected readonly endSlotClasses = computed(() => {\n const base = ['flex h-full shrink-0 items-center justify-end gap-2 overflow-hidden'];\n base.push(\n '[&>[topbar-end]]:flex',\n '[&>[topbar-end]]:min-w-0',\n '[&>[topbar-end]]:max-w-full',\n '[&>[topbar-end]]:items-center',\n '[&>[topbar-end]]:justify-end',\n '[&>[topbar-end]]:gap-2',\n '[&>[topbar-end]>*]:w-auto',\n '[&>[topbar-end]>*]:max-w-full',\n '[&>[topbar-end]>*]:justify-end',\n '[&>[topbar-end]>*]:gap-0',\n '[&>[topbar-end]>*]:px-2',\n '[&>[topbar-end]>*>*:first-child]:ml-auto',\n '[&>[topbar-end]>*>*:nth-child(n+2)]:hidden',\n );\n return base.join(' ');\n });\n\n protected asBasic(i: NavigationItem): NavigationBasicItem {\n return i as NavigationBasicItem;\n }\n protected asCollapsable(i: NavigationItem): NavigationCollapsableItem {\n return i as NavigationCollapsableItem;\n }\n protected asGroup(i: NavigationItem): NavigationGroupItem {\n return i as NavigationGroupItem;\n }\n\n protected isItemActive(id: string | undefined): boolean {\n return this.nav.isActive(id);\n }\n\n protected toggleMobile(): void {\n this.nav.toggleMobile();\n }\n\n protected toggleDropdown(trigger: HTMLElement, item: NavigationItem): void {\n if (this.openId() === item.id) this.closeAll();\n else this.openDropdown(trigger, item);\n }\n\n protected openDropdown(trigger: HTMLElement, item: NavigationItem): void {\n if (this.openId() === item.id) return;\n this.closeAll();\n this.attach(trigger, item, this.dropdownTpl());\n }\n\n private attach(trigger: HTMLElement, item: NavigationItem, tpl: TemplateRef<unknown>): void {\n const strategy = this.overlay\n .position()\n .flexibleConnectedTo(trigger)\n .withFlexibleDimensions(false)\n .withPush(false)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n },\n ]);\n\n const ref = this.overlay.create({\n positionStrategy: strategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: ['ui-dropdown-panel'],\n });\n\n const portal = new TemplatePortal(tpl, this.vcr, { $implicit: item });\n ref.attach(portal);\n this.active = { ref, id: item.id ?? '' };\n this.openId.set(item.id ?? null);\n\n merge(ref.backdropClick(), ref.keydownEvents().pipe(filter((e) => e.key === 'Escape')))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.closeAll();\n trigger.focus();\n });\n }\n\n protected closeAll(): void {\n if (this.active) {\n this.active.ref.dispose();\n this.active = null;\n }\n this.openId.set(null);\n }\n\n /** Menubar keyboard navigation: ArrowLeft/Right antar trigger, Home/End, ArrowDown fokus panel. */\n protected onMenubarKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const root = this.host.nativeElement;\n const triggers = Array.from(root.querySelectorAll<HTMLElement>('ul[role=\"menubar\"] [role=\"menuitem\"]')).filter(\n (el) => !el.hasAttribute('disabled'),\n );\n if (triggers.length === 0) return;\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (key === 'ArrowDown' && currentIndex !== -1) {\n event.preventDefault();\n // Jika open, fokus item pertama panel; jika belum, focus tetap (panel akan dibuka via click/mouseenter).\n queueMicrotask(() => this.focusFirstInPanel());\n return;\n }\n if (key !== 'ArrowLeft' && key !== 'ArrowRight' && key !== 'Home' && key !== 'End') return;\n let nextIndex = currentIndex;\n if (key === 'ArrowRight') nextIndex = (currentIndex + 1 + triggers.length) % triggers.length;\n else if (key === 'ArrowLeft') nextIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n else if (key === 'Home') nextIndex = 0;\n else if (key === 'End') nextIndex = triggers.length - 1;\n if (nextIndex !== currentIndex && triggers[nextIndex]) {\n event.preventDefault();\n triggers[nextIndex].focus();\n }\n }\n\n /** Arrow-key navigation dalam dropdown panel. */\n protected onPanelKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (\n key !== 'ArrowDown' &&\n key !== 'ArrowUp' &&\n key !== 'ArrowLeft' &&\n key !== 'ArrowRight' &&\n key !== 'Home' &&\n key !== 'End'\n )\n return;\n const panel = this.active?.ref.overlayElement;\n if (!panel) return;\n const items = this.collectPanelFocusables(panel);\n if (items.length === 0) return;\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let nextIndex = currentIndex;\n if (key === 'ArrowDown' || key === 'ArrowRight') nextIndex = (currentIndex + 1 + items.length) % items.length;\n else if (key === 'ArrowUp' || key === 'ArrowLeft') nextIndex = (currentIndex - 1 + items.length) % items.length;\n else if (key === 'Home') nextIndex = 0;\n else if (key === 'End') nextIndex = items.length - 1;\n if (nextIndex !== currentIndex && items[nextIndex]) {\n event.preventDefault();\n items[nextIndex].focus();\n }\n }\n\n private collectPanelFocusables(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'),\n ).filter((el) => el.offsetParent !== null || el.getClientRects().length > 0);\n }\n\n private focusFirstInPanel(): void {\n const panel = this.active?.ref.overlayElement;\n if (!panel) return;\n const items = this.collectPanelFocusables(panel);\n items[0]?.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;AAoCA;;AAEG;MAoHU,eAAe,CAAA;AACP,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC9B,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,IAAA,KAAK,GAAG,KAAK,CAAmB,EAAE,4EAAC;;AAEnC,IAAA,YAAY,GAAG,KAAK,CAAS,qBAAqB,mFAAC;AACnD,IAAA,UAAU,GAAG,KAAK,CAAmB,SAAS,iFAAC;AAC/C,IAAA,SAAS,GAAG,KAAK,CAAS,SAAS,gFAAC;AACpC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAEzB,IAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;;AAEnC,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,oFAAC;AACpC,IAAA,cAAc,GAAG,KAAK,CAAS,iBAAiB,qFAAC;AACvC,IAAA,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;;AAGhC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;QAC7B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE;AAClF,IAAA,CAAC,oFAAC;AAEiB,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,6EAAC;IAC/C,MAAM,GAAyB,IAAI;AAE1B,IAAA,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAuB,aAAa,CAAC;AAEtF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC;AACvG,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClD;AAEmB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpF,IAAA,CAAC,kFAAC;AAEiB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,IAAI,GAAG,CAAC,qEAAqE,CAAC;AACpF,QAAA,IAAI,CAAC,IAAI,CACP,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,EAC3B,+BAA+B,EAC/B,gCAAgC,EAChC,0BAA0B,EAC1B,yBAAyB,EACzB,0CAA0C,EAC1C,4CAA4C,CAC7C;AACD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACvB,IAAA,CAAC,qFAAC;AAEQ,IAAA,OAAO,CAAC,CAAiB,EAAA;AACjC,QAAA,OAAO,CAAwB;IACjC;AACU,IAAA,aAAa,CAAC,CAAiB,EAAA;AACvC,QAAA,OAAO,CAA8B;IACvC;AACU,IAAA,OAAO,CAAC,CAAiB,EAAA;AACjC,QAAA,OAAO,CAAwB;IACjC;AAEU,IAAA,YAAY,CAAC,EAAsB,EAAA;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEU,cAAc,CAAC,OAAoB,EAAE,IAAoB,EAAA;AACjE,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,QAAQ,EAAE;;AACzC,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;IACvC;IAEU,YAAY,CAAC,OAAoB,EAAE,IAAoB,EAAA;AAC/D,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;YAAE;QAC/B,IAAI,CAAC,QAAQ,EAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAChD;AAEQ,IAAA,MAAM,CAAC,OAAoB,EAAE,IAAoB,EAAE,GAAyB,EAAA;AAClF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA,QAAQ;aACR,mBAAmB,CAAC,OAAO;aAC3B,sBAAsB,CAAC,KAAK;aAC5B,QAAQ,CAAC,KAAK;AACd,aAAA,aAAa,CAAC;AACb,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,CAAC,CAAC;AACZ,aAAA;AACF,SAAA,CAAC;AAEJ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9B,YAAA,gBAAgB,EAAE,QAAQ;YAC1B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC1D,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;YACjD,UAAU,EAAE,CAAC,mBAAmB,CAAC;AAClC,SAAA,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACrE,QAAA,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;QAEhC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;AACnF,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,EAAE;YACf,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,CAAC,CAAC;IACN;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QACpB;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;;AAGU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACpC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,sCAAsC,CAAC,CAAC,CAAC,MAAM,CAC5G,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CACrC;AACD,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;QAC3B,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,aAA4B,CAAC;QAE5E,IAAI,GAAG,KAAK,WAAW,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;;YAEtB,cAAc,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C;QACF;AACA,QAAA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK;YAAE;QACpF,IAAI,SAAS,GAAG,YAAY;QAC5B,IAAI,GAAG,KAAK,YAAY;AAAE,YAAA,SAAS,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;aACvF,IAAI,GAAG,KAAK,WAAW;AAAE,YAAA,SAAS,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;aAC3F,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS,GAAG,CAAC;aACjC,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QACvD,IAAI,SAAS,KAAK,YAAY,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE;QAC7B;IACF;;AAGU,IAAA,cAAc,CAAC,KAAoB,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;QACrB,IACE,GAAG,KAAK,WAAW;AACnB,YAAA,GAAG,KAAK,SAAS;AACjB,YAAA,GAAG,KAAK,WAAW;AACnB,YAAA,GAAG,KAAK,YAAY;AACpB,YAAA,GAAG,KAAK,MAAM;AACd,YAAA,GAAG,KAAK,KAAK;YAEb;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc;AAC7C,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QACxB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAA4B,CAAC;QACzE,IAAI,SAAS,GAAG,YAAY;AAC5B,QAAA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY;AAAE,YAAA,SAAS,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AACxG,aAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW;AAAE,YAAA,SAAS,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;aAC1G,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS,GAAG,CAAC;aACjC,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QACpD,IAAI,SAAS,KAAK,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE;QAC1B;IACF;AAEQ,IAAA,sBAAsB,CAAC,IAAiB,EAAA;AAC9C,QAAA,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,CAAC,gBAAgB,CAAc,kEAAkE,CAAC,CACvG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E;IAEQ,iBAAiB,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc;AAC7C,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAChD,QAAA,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;IACnB;wGAnNW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzGhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9GS,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,2FAAE,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAgHnE,eAAe,EAAA,UAAA,EAAA,CAAA;kBAnH3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC;AAC/E,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,wBAAwB,EAAE,cAAc;AACzC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGT,EAAA,CAAA;AACF,iBAAA;m4BA8ByE,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACvLvF;;AAEG;;;;"}
1
+ {"version":3,"file":"ojiepermana-angular-navigation-topbar.mjs","sources":["../../../projects/angular/navigation/topbar/default/topbar.component.ts","../../../projects/angular/navigation/topbar/ojiepermana-angular-navigation-topbar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { UiNavIconComponent } from '@ojiepermana/angular/navigation/icon';\nimport { UiNavItemComponent } from '@ojiepermana/angular/navigation/item';\nimport { DEFAULT_NAVIGATION_ID, NavigationService } from '@ojiepermana/angular/navigation/service';\nimport type {\n NavigationBasicItem,\n NavigationCollapsableItem,\n NavigationGroupItem,\n NavigationItem,\n TopbarVariant,\n} from '@ojiepermana/angular/navigation/types';\n\ninterface ActiveOverlay {\n ref: OverlayRef;\n id: string;\n}\n\ntype DropdownPanelItem = NavigationCollapsableItem | NavigationGroupItem;\n\n/**\n * Horizontal navigation (topbar) — shadcn-styled.\n */\n@Component({\n selector: 'topbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, RouterLinkActive, UiNavIconComponent, UiNavItemComponent],\n host: {\n role: 'navigation',\n '[attr.aria-label]': 'ariaLabel()',\n '[class]': 'hostClasses()',\n '[attr.data-variant]': 'variant()',\n },\n template: `\n <div class=\"flex h-full w-full items-center gap-3 px-1\">\n <div data-topbar-slot=\"start\" class=\"flex shrink-0 items-center gap-2\">\n @if (showHamburger()) {\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden\"\n [attr.aria-label]=\"hamburgerLabel()\"\n [attr.aria-expanded]=\"mobileOpen()\"\n (click)=\"toggleMobile()\">\n <ui-nav-icon name=\"menu\" [size]=\"18\" />\n </button>\n }\n <ng-content select=\"[topbar-start]\" />\n </div>\n\n <div data-topbar-slot=\"nav\" class=\"flex min-w-0 flex-1 items-center justify-center\">\n <ul\n class=\"flex min-w-0 flex-1 items-center justify-center gap-1\"\n role=\"menubar\"\n (keydown)=\"onMenubarKeydown($event)\">\n @for (item of resolvedItems(); track item.id) {\n <li role=\"none\" class=\"relative\">\n @switch (item.type) {\n @case ('basic') {\n @let basic = asBasic(item);\n <a\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary\"\n [routerLink]=\"basic.link\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [class.text-primary]=\"rla.isActive\"\n [attr.aria-current]=\"rla.isActive ? 'page' : null\"\n [target]=\"basic.target ?? undefined\">\n @if (basic.icon) {\n <ui-nav-icon [name]=\"basic.icon\" [size]=\"18\" />\n }\n <span>{{ basic.title }}</span>\n </a>\n }\n @case ('collapsable') {\n @let col = asCollapsable(item);\n <button\n #trigger\n type=\"button\"\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n [class.text-primary]=\"isItemActive(col.id)\"\n [attr.aria-expanded]=\"openId() === col.id\"\n [attr.aria-haspopup]=\"'menu'\"\n (click)=\"toggleDropdown(trigger, item)\"\n (mouseenter)=\"openDropdown(trigger, item)\">\n @if (col.icon) {\n <ui-nav-icon [name]=\"col.icon\" [size]=\"18\" />\n }\n <span>{{ col.title }}</span>\n <ui-nav-icon name=\"expand_more\" [size]=\"18\" />\n </button>\n }\n @case ('group') {\n @let group = asGroup(item);\n <button\n #trigger\n type=\"button\"\n role=\"menuitem\"\n class=\"ui-nav-text inline-flex items-center gap-2 rounded-md px-3 py-2 text-foreground/80 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n [class.text-primary]=\"isItemActive(group.id)\"\n [attr.aria-expanded]=\"openId() === group.id\"\n [attr.aria-haspopup]=\"'menu'\"\n (click)=\"toggleDropdown(trigger, item)\"\n (mouseenter)=\"openDropdown(trigger, item)\">\n @if (group.icon) {\n <ui-nav-icon [name]=\"group.icon\" [size]=\"18\" />\n }\n <span>{{ group.title }}</span>\n <ui-nav-icon name=\"expand_more\" [size]=\"18\" />\n </button>\n }\n @default {\n <span class=\"ui-nav-heading px-3 py-2 text-muted-foreground\">\n {{ item.title }}\n </span>\n }\n }\n </li>\n }\n </ul>\n </div>\n\n <div data-topbar-slot=\"end\" [class]=\"endSlotClasses()\">\n <ng-content select=\"[topbar-end]\" />\n </div>\n </div>\n\n <!-- Dropdown template -->\n <ng-template #dropdownTpl let-item>\n <div role=\"menu\" [class]=\"panelClasses(item)\" (keydown)=\"onPanelKeydown($event)\">\n @if (isFlyout()) {\n <div [class]=\"panelGridClasses(item)\">\n @for (child of item.children; track child.id) {\n @switch (child.type) {\n @case ('basic') {\n @let basic = asBasic(child);\n @if (basic.link && !basic.externalLink) {\n <a\n role=\"menuitem\"\n [class]=\"flyoutItemClasses(rla.isActive)\"\n [routerLink]=\"basic.link\"\n [queryParams]=\"basic.queryParams\"\n [queryParamsHandling]=\"basic.queryParamsHandling ?? null\"\n [fragment]=\"basic.fragment ?? undefined\"\n [preserveFragment]=\"basic.preserveFragment ?? false\"\n [target]=\"basic.target ?? undefined\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"\n basic.isActiveMatchOptions ?? (basic.exactMatch ? exactMatch : inexactMatch)\n \"\n [attr.aria-current]=\"rla.isActive ? 'page' : null\"\n (click)=\"closeAll()\">\n <div class=\"flex items-start gap-3\">\n @if (basic.icon) {\n <span\n class=\"mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground\">\n <ui-nav-icon [name]=\"basic.icon\" [size]=\"18\" />\n </span>\n }\n <div class=\"min-w-0 space-y-1\">\n <div class=\"font-medium leading-none text-foreground\">{{ basic.title }}</div>\n @if (basic.subtitle) {\n <p class=\"line-clamp-2 text-sm leading-5 text-muted-foreground\">{{ basic.subtitle }}</p>\n }\n </div>\n </div>\n </a>\n } @else if (basic.link && basic.externalLink) {\n <a\n role=\"menuitem\"\n [class]=\"flyoutItemClasses(false)\"\n [attr.href]=\"basic.link\"\n [attr.target]=\"basic.target ?? '_blank'\"\n rel=\"noopener noreferrer\"\n (click)=\"closeAll()\">\n <div class=\"flex items-start gap-3\">\n @if (basic.icon) {\n <span\n class=\"mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground\">\n <ui-nav-icon [name]=\"basic.icon\" [size]=\"18\" />\n </span>\n }\n <div class=\"min-w-0 space-y-1\">\n <div class=\"font-medium leading-none text-foreground\">{{ basic.title }}</div>\n @if (basic.subtitle) {\n <p class=\"line-clamp-2 text-sm leading-5 text-muted-foreground\">{{ basic.subtitle }}</p>\n }\n </div>\n </div>\n </a>\n } @else {\n <button type=\"button\" [class]=\"flyoutItemClasses(false)\" (click)=\"runMenuAction(basic)\">\n <div class=\"flex items-start gap-3 text-left\">\n @if (basic.icon) {\n <span\n class=\"mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-muted/40 text-foreground\">\n <ui-nav-icon [name]=\"basic.icon\" [size]=\"18\" />\n </span>\n }\n <div class=\"min-w-0 space-y-1\">\n <div class=\"font-medium leading-none text-foreground\">{{ basic.title }}</div>\n @if (basic.subtitle) {\n <p class=\"line-clamp-2 text-sm leading-5 text-muted-foreground\">{{ basic.subtitle }}</p>\n }\n </div>\n </div>\n </button>\n }\n }\n @default {\n <div class=\"md:col-span-2\">\n <ui-nav-item [item]=\"child\" />\n </div>\n }\n }\n }\n </div>\n } @else {\n @for (child of item.children; track child.id) {\n <ui-nav-item [item]=\"child\" />\n }\n }\n </div>\n </ng-template>\n `,\n})\nexport class TopbarComponent {\n protected readonly nav = inject(NavigationService);\n private readonly overlay = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly items = input<NavigationItem[]>([]);\n /** Registry key di `NavigationService`. Default `'main'`. */\n readonly navigationId = input<string>(DEFAULT_NAVIGATION_ID);\n readonly variant = input<TopbarVariant>('default');\n readonly ariaLabel = input<string>('Primary');\n readonly class = input<string>('');\n /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */\n readonly autoRegister = input<boolean>(true);\n /** Tampilkan hamburger di `< md` yang men-toggle mobile drawer sidebar. */\n readonly showHamburger = input<boolean>(true);\n readonly hamburgerLabel = input<string>('Open navigation');\n protected readonly mobileOpen = this.nav.mobileOpen;\n protected readonly isFlyout = computed(() => this.variant() === 'flyout');\n protected readonly exactMatch = {\n exact: true,\n paths: 'exact',\n queryParams: 'exact',\n fragment: 'exact',\n matrixParams: 'exact',\n } as const;\n protected readonly inexactMatch = {\n exact: false,\n paths: 'subset',\n queryParams: 'subset',\n fragment: 'ignored',\n matrixParams: 'ignored',\n } as const;\n\n /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */\n protected readonly resolvedItems = computed(() => {\n const explicit = this.items();\n return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();\n });\n\n protected readonly openId = signal<string | null>(null);\n private active: ActiveOverlay | null = null;\n\n private readonly dropdownTpl = viewChild.required<TemplateRef<unknown>>('dropdownTpl');\n\n constructor() {\n effect(() => {\n const explicit = this.items();\n if (this.autoRegister() && explicit.length > 0) this.nav.registerItems(this.navigationId(), explicit);\n });\n this.destroyRef.onDestroy(() => this.closeAll());\n }\n\n protected readonly hostClasses = computed(() => {\n return ['sticky top-0 z-20 flex h-11 w-full items-center', this.class()].join(' ');\n });\n\n protected readonly endSlotClasses = computed(() => {\n const base = ['flex h-full shrink-0 items-center justify-end gap-2 overflow-hidden'];\n base.push(\n '[&>[topbar-end]]:flex',\n '[&>[topbar-end]]:min-w-0',\n '[&>[topbar-end]]:max-w-full',\n '[&>[topbar-end]]:items-center',\n '[&>[topbar-end]]:justify-end',\n '[&>[topbar-end]]:gap-2',\n '[&>[topbar-end]>*]:w-auto',\n '[&>[topbar-end]>*]:max-w-full',\n '[&>[topbar-end]>*]:justify-end',\n '[&>[topbar-end]>*]:gap-0',\n '[&>[topbar-end]>*]:px-2',\n '[&>[topbar-end]>*>*:first-child]:ml-auto',\n '[&>[topbar-end]>*>*:nth-child(n+2)]:hidden',\n );\n return base.join(' ');\n });\n\n protected asBasic(i: NavigationItem): NavigationBasicItem {\n return i as NavigationBasicItem;\n }\n protected asCollapsable(i: NavigationItem): NavigationCollapsableItem {\n return i as NavigationCollapsableItem;\n }\n protected asGroup(i: NavigationItem): NavigationGroupItem {\n return i as NavigationGroupItem;\n }\n\n protected panelClasses(item: DropdownPanelItem): string {\n const classes = [\n 'rounded-xl border border-border bg-background/95 p-2 text-foreground shadow-xl backdrop-blur supports-[backdrop-filter]:bg-background/90',\n ];\n\n if (this.isFlyout()) {\n classes.push(item.children.length >= 4 ? 'w-[min(92vw,42rem)]' : 'w-[min(92vw,28rem)]');\n } else {\n classes.push('min-w-56');\n }\n\n return classes.join(' ');\n }\n\n protected panelGridClasses(item: DropdownPanelItem): string {\n const classes = ['grid gap-2'];\n\n if (item.children.length >= 4) {\n classes.push('md:grid-cols-2');\n }\n\n return classes.join(' ');\n }\n\n protected flyoutItemClasses(active: boolean): string {\n return [\n 'block rounded-lg border border-transparent px-4 py-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n active ? 'border-border bg-accent/50 text-foreground' : 'hover:bg-accent/50 hover:text-accent-foreground',\n ].join(' ');\n }\n\n protected isItemActive(id: string | undefined): boolean {\n return this.nav.isActive(id);\n }\n\n protected runMenuAction(item: NavigationBasicItem): void {\n item.action?.(item);\n this.closeAll();\n }\n\n protected toggleMobile(): void {\n this.nav.toggleMobile();\n }\n\n protected toggleDropdown(trigger: HTMLElement, item: NavigationItem): void {\n if (this.openId() === item.id) this.closeAll();\n else this.openDropdown(trigger, item);\n }\n\n protected openDropdown(trigger: HTMLElement, item: NavigationItem): void {\n if (this.openId() === item.id) return;\n this.closeAll();\n this.attach(trigger, item, this.dropdownTpl());\n }\n\n private attach(trigger: HTMLElement, item: NavigationItem, tpl: TemplateRef<unknown>): void {\n const strategy = this.overlay\n .position()\n .flexibleConnectedTo(trigger)\n .withFlexibleDimensions(false)\n .withPush(false)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n },\n ]);\n\n const ref = this.overlay.create({\n positionStrategy: strategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: ['ui-dropdown-panel'],\n });\n\n const portal = new TemplatePortal(tpl, this.vcr, { $implicit: item });\n ref.attach(portal);\n this.active = { ref, id: item.id ?? '' };\n this.openId.set(item.id ?? null);\n\n merge(ref.backdropClick(), ref.keydownEvents().pipe(filter((e) => e.key === 'Escape')))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.closeAll();\n trigger.focus();\n });\n }\n\n protected closeAll(): void {\n if (this.active) {\n this.active.ref.dispose();\n this.active = null;\n }\n this.openId.set(null);\n }\n\n /** Menubar keyboard navigation: ArrowLeft/Right antar trigger, Home/End, ArrowDown fokus panel. */\n protected onMenubarKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const root = this.host.nativeElement;\n const triggers = Array.from(root.querySelectorAll<HTMLElement>('ul[role=\"menubar\"] [role=\"menuitem\"]')).filter(\n (el) => !el.hasAttribute('disabled'),\n );\n if (triggers.length === 0) return;\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (key === 'ArrowDown' && currentIndex !== -1) {\n event.preventDefault();\n // Jika open, fokus item pertama panel; jika belum, focus tetap (panel akan dibuka via click/mouseenter).\n queueMicrotask(() => this.focusFirstInPanel());\n return;\n }\n if (key !== 'ArrowLeft' && key !== 'ArrowRight' && key !== 'Home' && key !== 'End') return;\n let nextIndex = currentIndex;\n if (key === 'ArrowRight') nextIndex = (currentIndex + 1 + triggers.length) % triggers.length;\n else if (key === 'ArrowLeft') nextIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n else if (key === 'Home') nextIndex = 0;\n else if (key === 'End') nextIndex = triggers.length - 1;\n if (nextIndex !== currentIndex && triggers[nextIndex]) {\n event.preventDefault();\n triggers[nextIndex].focus();\n }\n }\n\n /** Arrow-key navigation dalam dropdown panel. */\n protected onPanelKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (\n key !== 'ArrowDown' &&\n key !== 'ArrowUp' &&\n key !== 'ArrowLeft' &&\n key !== 'ArrowRight' &&\n key !== 'Home' &&\n key !== 'End'\n )\n return;\n const panel = this.active?.ref.overlayElement;\n if (!panel) return;\n const items = this.collectPanelFocusables(panel);\n if (items.length === 0) return;\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let nextIndex = currentIndex;\n if (key === 'ArrowDown' || key === 'ArrowRight') nextIndex = (currentIndex + 1 + items.length) % items.length;\n else if (key === 'ArrowUp' || key === 'ArrowLeft') nextIndex = (currentIndex - 1 + items.length) % items.length;\n else if (key === 'Home') nextIndex = 0;\n else if (key === 'End') nextIndex = items.length - 1;\n if (nextIndex !== currentIndex && items[nextIndex]) {\n event.preventDefault();\n items[nextIndex].focus();\n }\n }\n\n private collectPanelFocusables(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'),\n ).filter((el) => el.offsetParent !== null || el.getClientRects().length > 0);\n }\n\n private focusFirstInPanel(): void {\n const panel = this.active?.ref.overlayElement;\n if (!panel) return;\n const items = this.collectPanelFocusables(panel);\n items[0]?.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-provider.mjs","sources":["../../../projects/angular/theme/provider/src/lib/theme.provider.ts","../../../projects/angular/theme/provider/ojiepermana-angular-theme-provider.ts"],"sourcesContent":["import {\n inject,\n type EnvironmentProviders,\n type Provider,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { THEME_PANEL_THEME_PORT } from '@ojiepermana/angular/layout/component';\nimport { ThemeService } from '@ojiepermana/angular/theme/services';\nimport { MATERIAL_THEME_CONFIG, type MaterialThemeConfig } from '@ojiepermana/angular/theme/token';\nimport { MAT_RIPPLE_GLOBAL_OPTIONS } from '@angular/material/core';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\n\nexport interface MaterialThemeFeature {\n readonly providers: Provider[];\n}\n\nexport function provideMaterialTheme(\n config: MaterialThemeConfig = {},\n ...features: MaterialThemeFeature[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MATERIAL_THEME_CONFIG, useValue: config },\n { provide: THEME_PANEL_THEME_PORT, useExisting: ThemeService },\n provideEnvironmentInitializer(() => {\n inject(ThemeService);\n }),\n ...features.flatMap((feature) => feature.providers),\n ]);\n}\n\nexport function withMaterialDefaults(): MaterialThemeFeature {\n return {\n providers: [\n { provide: MAT_RIPPLE_GLOBAL_OPTIONS, useValue: { disabled: true } },\n {\n provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n useValue: { appearance: 'outline', subscriptSizing: 'dynamic' },\n },\n ],\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;SAiBgB,oBAAoB,CAClC,SAA8B,EAAE,EAChC,GAAG,QAAgC,EAAA;AAEnC,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE;AACpD,QAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE;QAC9D,6BAA6B,CAAC,MAAK;YACjC,MAAM,CAAC,YAAY,CAAC;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC;AACpD,KAAA,CAAC;AACJ;SAEgB,oBAAoB,GAAA;IAClC,OAAO;AACL,QAAA,SAAS,EAAE;YACT,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;AACpE,YAAA;AACE,gBAAA,OAAO,EAAE,8BAA8B;gBACvC,QAAQ,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE;AAChE,aAAA;AACF,SAAA;KACF;AACH;;ACzCA;;AAEG;;;;"}
1
+ {"version":3,"file":"ojiepermana-angular-theme-provider.mjs","sources":["../../../projects/angular/theme/provider/theme.provider.ts","../../../projects/angular/theme/provider/ojiepermana-angular-theme-provider.ts"],"sourcesContent":["import {\n inject,\n type EnvironmentProviders,\n type Provider,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { THEME_PANEL_THEME_PORT } from '@ojiepermana/angular/layout/component';\nimport { ThemeService } from '@ojiepermana/angular/theme/services';\nimport { MATERIAL_THEME_CONFIG, type MaterialThemeConfig } from '@ojiepermana/angular/theme/token';\nimport { MAT_RIPPLE_GLOBAL_OPTIONS } from '@angular/material/core';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\n\nexport interface MaterialThemeFeature {\n readonly providers: Provider[];\n}\n\nexport function provideMaterialTheme(\n config: MaterialThemeConfig = {},\n ...features: MaterialThemeFeature[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MATERIAL_THEME_CONFIG, useValue: config },\n { provide: THEME_PANEL_THEME_PORT, useExisting: ThemeService },\n provideEnvironmentInitializer(() => {\n inject(ThemeService);\n }),\n ...features.flatMap((feature) => feature.providers),\n ]);\n}\n\nexport function withMaterialDefaults(): MaterialThemeFeature {\n return {\n providers: [\n { provide: MAT_RIPPLE_GLOBAL_OPTIONS, useValue: { disabled: true } },\n {\n provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n useValue: { appearance: 'outline', subscriptSizing: 'dynamic' },\n },\n ],\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;SAiBgB,oBAAoB,CAClC,SAA8B,EAAE,EAChC,GAAG,QAAgC,EAAA;AAEnC,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE;AACpD,QAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE;QAC9D,6BAA6B,CAAC,MAAK;YACjC,MAAM,CAAC,YAAY,CAAC;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC;AACpD,KAAA,CAAC;AACJ;SAEgB,oBAAoB,GAAA;IAClC,OAAO;AACL,QAAA,SAAS,EAAE;YACT,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;AACpE,YAAA;AACE,gBAAA,OAAO,EAAE,8BAA8B;gBACvC,QAAQ,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE;AAChE,aAAA;AACF,SAAA;KACF;AACH;;ACzCA;;AAEG;;;;"}
@@ -8,24 +8,32 @@ class ThemeService {
8
8
  destroyRef = inject(DestroyRef);
9
9
  config = this.resolveConfig();
10
10
  initialBrand = this.readPersistedBrand() ?? this.config.defaultBrand;
11
- _modePreference = signal(this.readPersistedMode() ?? this.config.defaultMode, ...(ngDevMode ? [{ debugName: "_modePreference" }] : /* istanbul ignore next */ []));
12
- _brand = signal(this.initialBrand, ...(ngDevMode ? [{ debugName: "_brand" }] : /* istanbul ignore next */ []));
13
- _color = signal(this.initialBrand ? this.config.defaultColor : (this.readPersistedColor() ?? this.config.defaultColor), ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
14
- _style = signal(this.initialBrand ? this.config.defaultStyle : (this.readPersistedStyle() ?? this.config.defaultStyle), ...(ngDevMode ? [{ debugName: "_style" }] : /* istanbul ignore next */ []));
15
- _systemPrefersDark = signal(this.prefersDark(), ...(ngDevMode ? [{ debugName: "_systemPrefersDark" }] : /* istanbul ignore next */ []));
11
+ _modePreference = signal(this.readPersistedMode() ?? this.config.defaultMode, /* @ts-ignore */
12
+ ...(ngDevMode ? [{ debugName: "_modePreference" }] : /* istanbul ignore next */ []));
13
+ _brand = signal(this.initialBrand, /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "_brand" }] : /* istanbul ignore next */ []));
15
+ _color = signal(this.initialBrand ? this.config.defaultColor : (this.readPersistedColor() ?? this.config.defaultColor), /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
17
+ _style = signal(this.initialBrand ? this.config.defaultStyle : (this.readPersistedStyle() ?? this.config.defaultStyle), /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "_style" }] : /* istanbul ignore next */ []));
19
+ _systemPrefersDark = signal(this.prefersDark(), /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "_systemPrefersDark" }] : /* istanbul ignore next */ []));
16
21
  scheme = this._modePreference.asReadonly();
17
22
  brand = this._brand.asReadonly();
18
23
  color = this._color.asReadonly();
19
24
  theme = this._color.asReadonly();
20
25
  style = this._style.asReadonly();
21
- mode = computed(() => this.resolveMode(this._modePreference()), ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
26
+ mode = computed(() => this.resolveMode(this._modePreference()), /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
22
28
  snapshot = computed(() => ({
23
29
  mode: this.mode(),
24
30
  brand: this._brand(),
25
31
  color: this._color(),
26
32
  style: this._style(),
27
- }), ...(ngDevMode ? [{ debugName: "snapshot" }] : /* istanbul ignore next */ []));
28
- isDark = computed(() => this.mode() === 'dark', ...(ngDevMode ? [{ debugName: "isDark" }] : /* istanbul ignore next */ []));
33
+ }), /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "snapshot" }] : /* istanbul ignore next */ []));
35
+ isDark = computed(() => this.mode() === 'dark', /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "isDark" }] : /* istanbul ignore next */ []));
29
37
  constructor() {
30
38
  this.watchSystemScheme();
31
39
  effect(() => {
@@ -270,10 +278,10 @@ class ThemeService {
270
278
  /* ignore */
271
279
  }
272
280
  }
273
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
274
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ThemeService, providedIn: 'root' });
281
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
282
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ThemeService, providedIn: 'root' });
275
283
  }
276
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ThemeService, decorators: [{
284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ThemeService, decorators: [{
277
285
  type: Injectable,
278
286
  args: [{ providedIn: 'root' }]
279
287
  }], ctorParameters: () => [] });