@ojiepermana/angular 21.3.0 → 21.3.4

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 (442) hide show
  1. package/README.md +76 -12
  2. package/component/accordion/package.json +4 -0
  3. package/component/alert/package.json +4 -0
  4. package/component/alert-dialog/package.json +4 -0
  5. package/component/aspect-ratio/package.json +4 -0
  6. package/component/avatar/package.json +4 -0
  7. package/component/badge/package.json +4 -0
  8. package/component/breadcrumb/package.json +4 -0
  9. package/component/button/package.json +4 -0
  10. package/component/button-group/package.json +4 -0
  11. package/component/calendar/package.json +4 -0
  12. package/component/card/package.json +4 -0
  13. package/component/carousel/package.json +4 -0
  14. package/component/chart/area/package.json +4 -0
  15. package/component/chart/bar/package.json +4 -0
  16. package/component/chart/line/package.json +4 -0
  17. package/component/chart/package.json +4 -0
  18. package/component/chart/pie/package.json +4 -0
  19. package/component/chart/radar/package.json +4 -0
  20. package/component/chart/radial/package.json +4 -0
  21. package/component/chart/scatter/package.json +4 -0
  22. package/component/checkbox/package.json +4 -0
  23. package/component/collapsible/package.json +4 -0
  24. package/component/combobox/package.json +4 -0
  25. package/component/command/package.json +4 -0
  26. package/component/context-menu/package.json +4 -0
  27. package/component/date-picker/package.json +4 -0
  28. package/component/dialog/package.json +4 -0
  29. package/component/drawer/package.json +4 -0
  30. package/component/dropdown-menu/package.json +4 -0
  31. package/component/form/package.json +4 -0
  32. package/component/input/package.json +4 -0
  33. package/component/input-group/package.json +4 -0
  34. package/component/item/package.json +4 -0
  35. package/component/label/package.json +4 -0
  36. package/component/pagination/package.json +4 -0
  37. package/component/popover/package.json +4 -0
  38. package/component/progress/package.json +4 -0
  39. package/component/radio/package.json +4 -0
  40. package/component/scroll-area/package.json +4 -0
  41. package/component/select/package.json +4 -0
  42. package/component/separator/package.json +4 -0
  43. package/component/sheet/package.json +4 -0
  44. package/component/skeleton/package.json +4 -0
  45. package/component/slider/package.json +4 -0
  46. package/component/switch/package.json +4 -0
  47. package/component/table/package.json +4 -0
  48. package/component/tabs/package.json +4 -0
  49. package/component/textarea/package.json +4 -0
  50. package/component/toast/package.json +4 -0
  51. package/component/tooltip/package.json +4 -0
  52. package/component/utils/package.json +4 -0
  53. package/fesm2022/{ojiepermana-angular-ui-component-accordion.mjs → ojiepermana-angular-component-accordion.mjs} +1 -1
  54. package/fesm2022/ojiepermana-angular-component-accordion.mjs.map +1 -0
  55. package/fesm2022/{ojiepermana-angular-ui-component-alert-dialog.mjs → ojiepermana-angular-component-alert-dialog.mjs} +1 -1
  56. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs.map +1 -0
  57. package/fesm2022/{ojiepermana-angular-ui-component-alert.mjs → ojiepermana-angular-component-alert.mjs} +1 -1
  58. package/fesm2022/ojiepermana-angular-component-alert.mjs.map +1 -0
  59. package/fesm2022/{ojiepermana-angular-ui-component-aspect-ratio.mjs → ojiepermana-angular-component-aspect-ratio.mjs} +1 -1
  60. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs.map +1 -0
  61. package/fesm2022/{ojiepermana-angular-ui-component-avatar.mjs → ojiepermana-angular-component-avatar.mjs} +1 -1
  62. package/fesm2022/ojiepermana-angular-component-avatar.mjs.map +1 -0
  63. package/fesm2022/{ojiepermana-angular-ui-component-badge.mjs → ojiepermana-angular-component-badge.mjs} +1 -1
  64. package/fesm2022/ojiepermana-angular-component-badge.mjs.map +1 -0
  65. package/fesm2022/{ojiepermana-angular-ui-component-breadcrumb.mjs → ojiepermana-angular-component-breadcrumb.mjs} +1 -1
  66. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs.map +1 -0
  67. package/fesm2022/{ojiepermana-angular-ui-component-button-group.mjs → ojiepermana-angular-component-button-group.mjs} +1 -1
  68. package/fesm2022/ojiepermana-angular-component-button-group.mjs.map +1 -0
  69. package/fesm2022/{ojiepermana-angular-ui-component-button.mjs → ojiepermana-angular-component-button.mjs} +1 -1
  70. package/fesm2022/ojiepermana-angular-component-button.mjs.map +1 -0
  71. package/fesm2022/{ojiepermana-angular-ui-component-calendar.mjs → ojiepermana-angular-component-calendar.mjs} +1 -1
  72. package/fesm2022/ojiepermana-angular-component-calendar.mjs.map +1 -0
  73. package/fesm2022/{ojiepermana-angular-ui-component-card.mjs → ojiepermana-angular-component-card.mjs} +1 -1
  74. package/fesm2022/ojiepermana-angular-component-card.mjs.map +1 -0
  75. package/fesm2022/{ojiepermana-angular-ui-component-carousel.mjs → ojiepermana-angular-component-carousel.mjs} +1 -1
  76. package/fesm2022/ojiepermana-angular-component-carousel.mjs.map +1 -0
  77. package/fesm2022/{ojiepermana-angular-ui-component-chart-area.mjs → ojiepermana-angular-component-chart-area.mjs} +1 -1
  78. package/fesm2022/ojiepermana-angular-component-chart-area.mjs.map +1 -0
  79. package/fesm2022/{ojiepermana-angular-ui-component-chart-bar.mjs → ojiepermana-angular-component-chart-bar.mjs} +1 -1
  80. package/fesm2022/ojiepermana-angular-component-chart-bar.mjs.map +1 -0
  81. package/fesm2022/{ojiepermana-angular-ui-component-chart-line.mjs → ojiepermana-angular-component-chart-line.mjs} +1 -1
  82. package/fesm2022/ojiepermana-angular-component-chart-line.mjs.map +1 -0
  83. package/fesm2022/{ojiepermana-angular-ui-component-chart-pie.mjs → ojiepermana-angular-component-chart-pie.mjs} +1 -1
  84. package/fesm2022/ojiepermana-angular-component-chart-pie.mjs.map +1 -0
  85. package/fesm2022/{ojiepermana-angular-ui-component-chart-radar.mjs → ojiepermana-angular-component-chart-radar.mjs} +1 -1
  86. package/fesm2022/ojiepermana-angular-component-chart-radar.mjs.map +1 -0
  87. package/fesm2022/{ojiepermana-angular-ui-component-chart-radial.mjs → ojiepermana-angular-component-chart-radial.mjs} +1 -1
  88. package/fesm2022/ojiepermana-angular-component-chart-radial.mjs.map +1 -0
  89. package/fesm2022/{ojiepermana-angular-ui-component-chart-scatter.mjs → ojiepermana-angular-component-chart-scatter.mjs} +1 -1
  90. package/fesm2022/ojiepermana-angular-component-chart-scatter.mjs.map +1 -0
  91. package/fesm2022/{ojiepermana-angular-ui-component-chart.mjs → ojiepermana-angular-component-chart.mjs} +1 -1
  92. package/fesm2022/ojiepermana-angular-component-chart.mjs.map +1 -0
  93. package/fesm2022/{ojiepermana-angular-ui-component-checkbox.mjs → ojiepermana-angular-component-checkbox.mjs} +1 -1
  94. package/fesm2022/ojiepermana-angular-component-checkbox.mjs.map +1 -0
  95. package/fesm2022/{ojiepermana-angular-ui-component-collapsible.mjs → ojiepermana-angular-component-collapsible.mjs} +1 -1
  96. package/fesm2022/ojiepermana-angular-component-collapsible.mjs.map +1 -0
  97. package/fesm2022/{ojiepermana-angular-ui-component-combobox.mjs → ojiepermana-angular-component-combobox.mjs} +1 -1
  98. package/fesm2022/ojiepermana-angular-component-combobox.mjs.map +1 -0
  99. package/fesm2022/{ojiepermana-angular-ui-component-command.mjs → ojiepermana-angular-component-command.mjs} +1 -1
  100. package/fesm2022/ojiepermana-angular-component-command.mjs.map +1 -0
  101. package/fesm2022/{ojiepermana-angular-ui-component-context-menu.mjs → ojiepermana-angular-component-context-menu.mjs} +1 -1
  102. package/fesm2022/ojiepermana-angular-component-context-menu.mjs.map +1 -0
  103. package/fesm2022/{ojiepermana-angular-ui-component-date-picker.mjs → ojiepermana-angular-component-date-picker.mjs} +1 -1
  104. package/fesm2022/ojiepermana-angular-component-date-picker.mjs.map +1 -0
  105. package/fesm2022/{ojiepermana-angular-ui-component-dialog.mjs → ojiepermana-angular-component-dialog.mjs} +1 -1
  106. package/fesm2022/ojiepermana-angular-component-dialog.mjs.map +1 -0
  107. package/fesm2022/{ojiepermana-angular-ui-component-drawer.mjs → ojiepermana-angular-component-drawer.mjs} +1 -1
  108. package/fesm2022/ojiepermana-angular-component-drawer.mjs.map +1 -0
  109. package/fesm2022/{ojiepermana-angular-ui-component-dropdown-menu.mjs → ojiepermana-angular-component-dropdown-menu.mjs} +1 -1
  110. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs.map +1 -0
  111. package/fesm2022/{ojiepermana-angular-ui-component-form.mjs → ojiepermana-angular-component-form.mjs} +1 -1
  112. package/fesm2022/ojiepermana-angular-component-form.mjs.map +1 -0
  113. package/fesm2022/{ojiepermana-angular-ui-component-input-group.mjs → ojiepermana-angular-component-input-group.mjs} +1 -1
  114. package/fesm2022/ojiepermana-angular-component-input-group.mjs.map +1 -0
  115. package/fesm2022/{ojiepermana-angular-ui-component-input.mjs → ojiepermana-angular-component-input.mjs} +1 -1
  116. package/fesm2022/ojiepermana-angular-component-input.mjs.map +1 -0
  117. package/fesm2022/{ojiepermana-angular-ui-component-item.mjs → ojiepermana-angular-component-item.mjs} +1 -1
  118. package/fesm2022/ojiepermana-angular-component-item.mjs.map +1 -0
  119. package/fesm2022/{ojiepermana-angular-ui-component-label.mjs → ojiepermana-angular-component-label.mjs} +1 -1
  120. package/fesm2022/ojiepermana-angular-component-label.mjs.map +1 -0
  121. package/fesm2022/{ojiepermana-angular-ui-component-pagination.mjs → ojiepermana-angular-component-pagination.mjs} +1 -1
  122. package/fesm2022/ojiepermana-angular-component-pagination.mjs.map +1 -0
  123. package/fesm2022/{ojiepermana-angular-ui-component-popover.mjs → ojiepermana-angular-component-popover.mjs} +1 -1
  124. package/fesm2022/ojiepermana-angular-component-popover.mjs.map +1 -0
  125. package/fesm2022/{ojiepermana-angular-ui-component-progress.mjs → ojiepermana-angular-component-progress.mjs} +1 -1
  126. package/fesm2022/ojiepermana-angular-component-progress.mjs.map +1 -0
  127. package/fesm2022/{ojiepermana-angular-ui-component-radio.mjs → ojiepermana-angular-component-radio.mjs} +1 -1
  128. package/fesm2022/ojiepermana-angular-component-radio.mjs.map +1 -0
  129. package/fesm2022/{ojiepermana-angular-ui-component-scroll-area.mjs → ojiepermana-angular-component-scroll-area.mjs} +1 -1
  130. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs.map +1 -0
  131. package/fesm2022/{ojiepermana-angular-ui-component-select.mjs → ojiepermana-angular-component-select.mjs} +1 -1
  132. package/fesm2022/ojiepermana-angular-component-select.mjs.map +1 -0
  133. package/fesm2022/{ojiepermana-angular-ui-component-separator.mjs → ojiepermana-angular-component-separator.mjs} +1 -1
  134. package/fesm2022/ojiepermana-angular-component-separator.mjs.map +1 -0
  135. package/fesm2022/{ojiepermana-angular-ui-component-sheet.mjs → ojiepermana-angular-component-sheet.mjs} +1 -1
  136. package/fesm2022/ojiepermana-angular-component-sheet.mjs.map +1 -0
  137. package/fesm2022/{ojiepermana-angular-ui-component-skeleton.mjs → ojiepermana-angular-component-skeleton.mjs} +1 -1
  138. package/fesm2022/ojiepermana-angular-component-skeleton.mjs.map +1 -0
  139. package/fesm2022/{ojiepermana-angular-ui-component-slider.mjs → ojiepermana-angular-component-slider.mjs} +1 -1
  140. package/fesm2022/ojiepermana-angular-component-slider.mjs.map +1 -0
  141. package/fesm2022/{ojiepermana-angular-ui-component-switch.mjs → ojiepermana-angular-component-switch.mjs} +1 -1
  142. package/fesm2022/ojiepermana-angular-component-switch.mjs.map +1 -0
  143. package/fesm2022/{ojiepermana-angular-ui-component-table.mjs → ojiepermana-angular-component-table.mjs} +1 -1
  144. package/fesm2022/ojiepermana-angular-component-table.mjs.map +1 -0
  145. package/fesm2022/{ojiepermana-angular-ui-component-tabs.mjs → ojiepermana-angular-component-tabs.mjs} +1 -1
  146. package/fesm2022/ojiepermana-angular-component-tabs.mjs.map +1 -0
  147. package/fesm2022/{ojiepermana-angular-ui-component-textarea.mjs → ojiepermana-angular-component-textarea.mjs} +1 -1
  148. package/fesm2022/ojiepermana-angular-component-textarea.mjs.map +1 -0
  149. package/fesm2022/{ojiepermana-angular-ui-component-toast.mjs → ojiepermana-angular-component-toast.mjs} +1 -1
  150. package/fesm2022/ojiepermana-angular-component-toast.mjs.map +1 -0
  151. package/fesm2022/{ojiepermana-angular-ui-component-tooltip.mjs → ojiepermana-angular-component-tooltip.mjs} +1 -1
  152. package/fesm2022/ojiepermana-angular-component-tooltip.mjs.map +1 -0
  153. package/fesm2022/{ojiepermana-angular-ui-component-utils.mjs → ojiepermana-angular-component-utils.mjs} +1 -1
  154. package/fesm2022/ojiepermana-angular-component-utils.mjs.map +1 -0
  155. package/fesm2022/ojiepermana-angular-generator-api.mjs +2 -1
  156. package/fesm2022/ojiepermana-angular-generator-api.mjs.map +1 -1
  157. package/fesm2022/{ojiepermana-angular-layout-theme.mjs → ojiepermana-angular-layout-component.mjs} +1 -1
  158. package/fesm2022/ojiepermana-angular-layout-component.mjs.map +1 -0
  159. package/fesm2022/ojiepermana-angular-layout-empty.mjs +49 -0
  160. package/fesm2022/ojiepermana-angular-layout-empty.mjs.map +1 -0
  161. package/fesm2022/ojiepermana-angular-layout-horizontal.mjs +119 -0
  162. package/fesm2022/ojiepermana-angular-layout-horizontal.mjs.map +1 -0
  163. package/fesm2022/ojiepermana-angular-layout-provider.mjs +21 -0
  164. package/fesm2022/ojiepermana-angular-layout-provider.mjs.map +1 -0
  165. package/fesm2022/ojiepermana-angular-layout-services.mjs +114 -0
  166. package/fesm2022/ojiepermana-angular-layout-services.mjs.map +1 -0
  167. package/fesm2022/ojiepermana-angular-layout-shell.mjs +48 -0
  168. package/fesm2022/ojiepermana-angular-layout-shell.mjs.map +1 -0
  169. package/fesm2022/ojiepermana-angular-layout-token-directive.mjs +27 -0
  170. package/fesm2022/ojiepermana-angular-layout-token-directive.mjs.map +1 -0
  171. package/fesm2022/ojiepermana-angular-layout-token.mjs +33 -0
  172. package/fesm2022/ojiepermana-angular-layout-token.mjs.map +1 -0
  173. package/fesm2022/ojiepermana-angular-layout-vertical.mjs +113 -0
  174. package/fesm2022/ojiepermana-angular-layout-vertical.mjs.map +1 -0
  175. package/fesm2022/ojiepermana-angular-layout.mjs +140 -137
  176. package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
  177. package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs +334 -0
  178. package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs.map +1 -0
  179. package/fesm2022/ojiepermana-angular-navigation-icon.mjs.map +1 -1
  180. package/fesm2022/ojiepermana-angular-navigation-item.mjs +548 -0
  181. package/fesm2022/ojiepermana-angular-navigation-item.mjs.map +1 -0
  182. package/fesm2022/ojiepermana-angular-navigation-service.mjs +204 -0
  183. package/fesm2022/ojiepermana-angular-navigation-service.mjs.map +1 -0
  184. package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs +373 -0
  185. package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs.map +1 -0
  186. package/fesm2022/ojiepermana-angular-navigation-topbar.mjs +433 -0
  187. package/fesm2022/ojiepermana-angular-navigation-topbar.mjs.map +1 -0
  188. package/fesm2022/ojiepermana-angular-navigation-types.mjs +4 -0
  189. package/fesm2022/ojiepermana-angular-navigation-types.mjs.map +1 -0
  190. package/fesm2022/ojiepermana-angular-theme-provider.mjs +35 -0
  191. package/fesm2022/ojiepermana-angular-theme-provider.mjs.map +1 -0
  192. package/fesm2022/ojiepermana-angular-theme-services.mjs +286 -0
  193. package/fesm2022/ojiepermana-angular-theme-services.mjs.map +1 -0
  194. package/fesm2022/ojiepermana-angular-theme-token.mjs +56 -0
  195. package/fesm2022/ojiepermana-angular-theme-token.mjs.map +1 -0
  196. package/fesm2022/ojiepermana-angular-theme.mjs +31 -56
  197. package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -1
  198. package/fesm2022/ojiepermana-angular.mjs +3 -4
  199. package/fesm2022/ojiepermana-angular.mjs.map +1 -1
  200. package/generator/api/README.md +25 -19
  201. package/generator/api/bin/schematics/init/index.js +4 -2
  202. package/generator/api/bin/src/config/schema.js +2 -1
  203. package/generator/api/bin/src/emit/navigation.js +1 -1
  204. package/generator/api/bin/src/layout/per-domain.js +7 -3
  205. package/generator/api/bin/src/writer/index.js +45 -3
  206. package/generator/api/sdk.config.example.json +4 -2
  207. package/layout/component/package.json +4 -0
  208. package/layout/empty/package.json +4 -0
  209. package/layout/horizontal/package.json +4 -0
  210. package/layout/provider/package.json +4 -0
  211. package/layout/services/package.json +4 -0
  212. package/layout/shell/package.json +4 -0
  213. package/layout/token/directive/package.json +4 -0
  214. package/layout/token/package.json +4 -0
  215. package/layout/vertical/package.json +4 -0
  216. package/navigation/demo-data/package.json +4 -0
  217. package/navigation/icon/package.json +4 -0
  218. package/navigation/item/package.json +4 -0
  219. package/navigation/service/package.json +4 -0
  220. package/navigation/sidebar/package.json +4 -0
  221. package/navigation/topbar/package.json +4 -0
  222. package/navigation/types/package.json +4 -0
  223. package/package.json +196 -128
  224. package/theme/README.md +67 -0
  225. package/theme/provider/package.json +4 -0
  226. package/theme/services/package.json +4 -0
  227. package/theme/styles/index.css +12 -7
  228. package/theme/token/package.json +4 -0
  229. package/types/{ojiepermana-angular-ui-component-chart.d.ts → ojiepermana-angular-component-chart.d.ts} +15 -15
  230. package/types/ojiepermana-angular-generator-api.d.ts +2 -1
  231. package/types/ojiepermana-angular-layout-empty.d.ts +22 -0
  232. package/types/ojiepermana-angular-layout-horizontal.d.ts +36 -0
  233. package/types/ojiepermana-angular-layout-provider.d.ts +6 -0
  234. package/types/ojiepermana-angular-layout-services.d.ts +25 -0
  235. package/types/ojiepermana-angular-layout-shell.d.ts +8 -0
  236. package/types/ojiepermana-angular-layout-token-directive.d.ts +13 -0
  237. package/types/ojiepermana-angular-layout-token.d.ts +36 -0
  238. package/types/ojiepermana-angular-layout-vertical.d.ts +38 -0
  239. package/types/ojiepermana-angular-layout.d.ts +26 -25
  240. package/types/ojiepermana-angular-navigation-demo-data.d.ts +5 -0
  241. package/types/ojiepermana-angular-navigation-item.d.ts +54 -0
  242. package/types/ojiepermana-angular-navigation-service.d.ts +77 -0
  243. package/types/ojiepermana-angular-navigation-sidebar.d.ts +75 -0
  244. package/types/ojiepermana-angular-navigation-topbar.d.ts +54 -0
  245. package/types/ojiepermana-angular-navigation-types.d.ts +129 -0
  246. package/types/ojiepermana-angular-theme-provider.d.ts +11 -0
  247. package/types/ojiepermana-angular-theme-services.d.ts +55 -0
  248. package/types/ojiepermana-angular-theme-token.d.ts +57 -0
  249. package/types/ojiepermana-angular-theme.d.ts +11 -66
  250. package/fesm2022/ojiepermana-angular-layout-theme.mjs.map +0 -1
  251. package/fesm2022/ojiepermana-angular-navigation.mjs +0 -2317
  252. package/fesm2022/ojiepermana-angular-navigation.mjs.map +0 -1
  253. package/fesm2022/ojiepermana-angular-ui-component-accordion.mjs.map +0 -1
  254. package/fesm2022/ojiepermana-angular-ui-component-alert-dialog.mjs.map +0 -1
  255. package/fesm2022/ojiepermana-angular-ui-component-alert.mjs.map +0 -1
  256. package/fesm2022/ojiepermana-angular-ui-component-aspect-ratio.mjs.map +0 -1
  257. package/fesm2022/ojiepermana-angular-ui-component-avatar.mjs.map +0 -1
  258. package/fesm2022/ojiepermana-angular-ui-component-badge.mjs.map +0 -1
  259. package/fesm2022/ojiepermana-angular-ui-component-breadcrumb.mjs.map +0 -1
  260. package/fesm2022/ojiepermana-angular-ui-component-button-group.mjs.map +0 -1
  261. package/fesm2022/ojiepermana-angular-ui-component-button.mjs.map +0 -1
  262. package/fesm2022/ojiepermana-angular-ui-component-calendar.mjs.map +0 -1
  263. package/fesm2022/ojiepermana-angular-ui-component-card.mjs.map +0 -1
  264. package/fesm2022/ojiepermana-angular-ui-component-carousel.mjs.map +0 -1
  265. package/fesm2022/ojiepermana-angular-ui-component-chart-area.mjs.map +0 -1
  266. package/fesm2022/ojiepermana-angular-ui-component-chart-bar.mjs.map +0 -1
  267. package/fesm2022/ojiepermana-angular-ui-component-chart-line.mjs.map +0 -1
  268. package/fesm2022/ojiepermana-angular-ui-component-chart-pie.mjs.map +0 -1
  269. package/fesm2022/ojiepermana-angular-ui-component-chart-radar.mjs.map +0 -1
  270. package/fesm2022/ojiepermana-angular-ui-component-chart-radial.mjs.map +0 -1
  271. package/fesm2022/ojiepermana-angular-ui-component-chart-scatter.mjs.map +0 -1
  272. package/fesm2022/ojiepermana-angular-ui-component-chart.mjs.map +0 -1
  273. package/fesm2022/ojiepermana-angular-ui-component-checkbox.mjs.map +0 -1
  274. package/fesm2022/ojiepermana-angular-ui-component-collapsible.mjs.map +0 -1
  275. package/fesm2022/ojiepermana-angular-ui-component-combobox.mjs.map +0 -1
  276. package/fesm2022/ojiepermana-angular-ui-component-command.mjs.map +0 -1
  277. package/fesm2022/ojiepermana-angular-ui-component-context-menu.mjs.map +0 -1
  278. package/fesm2022/ojiepermana-angular-ui-component-date-picker.mjs.map +0 -1
  279. package/fesm2022/ojiepermana-angular-ui-component-dialog.mjs.map +0 -1
  280. package/fesm2022/ojiepermana-angular-ui-component-drawer.mjs.map +0 -1
  281. package/fesm2022/ojiepermana-angular-ui-component-dropdown-menu.mjs.map +0 -1
  282. package/fesm2022/ojiepermana-angular-ui-component-form.mjs.map +0 -1
  283. package/fesm2022/ojiepermana-angular-ui-component-input-group.mjs.map +0 -1
  284. package/fesm2022/ojiepermana-angular-ui-component-input.mjs.map +0 -1
  285. package/fesm2022/ojiepermana-angular-ui-component-item.mjs.map +0 -1
  286. package/fesm2022/ojiepermana-angular-ui-component-label.mjs.map +0 -1
  287. package/fesm2022/ojiepermana-angular-ui-component-pagination.mjs.map +0 -1
  288. package/fesm2022/ojiepermana-angular-ui-component-popover.mjs.map +0 -1
  289. package/fesm2022/ojiepermana-angular-ui-component-progress.mjs.map +0 -1
  290. package/fesm2022/ojiepermana-angular-ui-component-radio.mjs.map +0 -1
  291. package/fesm2022/ojiepermana-angular-ui-component-scroll-area.mjs.map +0 -1
  292. package/fesm2022/ojiepermana-angular-ui-component-select.mjs.map +0 -1
  293. package/fesm2022/ojiepermana-angular-ui-component-separator.mjs.map +0 -1
  294. package/fesm2022/ojiepermana-angular-ui-component-sheet.mjs.map +0 -1
  295. package/fesm2022/ojiepermana-angular-ui-component-skeleton.mjs.map +0 -1
  296. package/fesm2022/ojiepermana-angular-ui-component-slider.mjs.map +0 -1
  297. package/fesm2022/ojiepermana-angular-ui-component-switch.mjs.map +0 -1
  298. package/fesm2022/ojiepermana-angular-ui-component-table.mjs.map +0 -1
  299. package/fesm2022/ojiepermana-angular-ui-component-tabs.mjs.map +0 -1
  300. package/fesm2022/ojiepermana-angular-ui-component-textarea.mjs.map +0 -1
  301. package/fesm2022/ojiepermana-angular-ui-component-toast.mjs.map +0 -1
  302. package/fesm2022/ojiepermana-angular-ui-component-tooltip.mjs.map +0 -1
  303. package/fesm2022/ojiepermana-angular-ui-component-utils.mjs.map +0 -1
  304. package/layout/theme/package.json +0 -4
  305. package/navigation/package.json +0 -4
  306. package/navigation-icon/package.json +0 -4
  307. package/types/ojiepermana-angular-navigation.d.ts +0 -375
  308. package/ui/component/accordion/package.json +0 -4
  309. package/ui/component/alert/package.json +0 -4
  310. package/ui/component/alert-dialog/package.json +0 -4
  311. package/ui/component/aspect-ratio/package.json +0 -4
  312. package/ui/component/avatar/package.json +0 -4
  313. package/ui/component/badge/package.json +0 -4
  314. package/ui/component/breadcrumb/package.json +0 -4
  315. package/ui/component/button/package.json +0 -4
  316. package/ui/component/button-group/package.json +0 -4
  317. package/ui/component/calendar/package.json +0 -4
  318. package/ui/component/card/package.json +0 -4
  319. package/ui/component/carousel/package.json +0 -4
  320. package/ui/component/chart/area/package.json +0 -4
  321. package/ui/component/chart/bar/package.json +0 -4
  322. package/ui/component/chart/line/package.json +0 -4
  323. package/ui/component/chart/package.json +0 -4
  324. package/ui/component/chart/pie/package.json +0 -4
  325. package/ui/component/chart/radar/package.json +0 -4
  326. package/ui/component/chart/radial/package.json +0 -4
  327. package/ui/component/chart/scatter/package.json +0 -4
  328. package/ui/component/checkbox/package.json +0 -4
  329. package/ui/component/collapsible/package.json +0 -4
  330. package/ui/component/combobox/package.json +0 -4
  331. package/ui/component/command/package.json +0 -4
  332. package/ui/component/context-menu/package.json +0 -4
  333. package/ui/component/date-picker/package.json +0 -4
  334. package/ui/component/dialog/package.json +0 -4
  335. package/ui/component/drawer/package.json +0 -4
  336. package/ui/component/dropdown-menu/package.json +0 -4
  337. package/ui/component/form/package.json +0 -4
  338. package/ui/component/input/package.json +0 -4
  339. package/ui/component/input-group/package.json +0 -4
  340. package/ui/component/item/package.json +0 -4
  341. package/ui/component/label/package.json +0 -4
  342. package/ui/component/pagination/package.json +0 -4
  343. package/ui/component/popover/package.json +0 -4
  344. package/ui/component/progress/package.json +0 -4
  345. package/ui/component/radio/package.json +0 -4
  346. package/ui/component/scroll-area/package.json +0 -4
  347. package/ui/component/select/package.json +0 -4
  348. package/ui/component/separator/package.json +0 -4
  349. package/ui/component/sheet/package.json +0 -4
  350. package/ui/component/skeleton/package.json +0 -4
  351. package/ui/component/slider/package.json +0 -4
  352. package/ui/component/switch/package.json +0 -4
  353. package/ui/component/table/package.json +0 -4
  354. package/ui/component/tabs/package.json +0 -4
  355. package/ui/component/textarea/package.json +0 -4
  356. package/ui/component/toast/package.json +0 -4
  357. package/ui/component/tooltip/package.json +0 -4
  358. package/ui/component/utils/package.json +0 -4
  359. /package/{ui/component → component}/chart/README.md +0 -0
  360. /package/theme/styles/{themes/library/_components.css → foundation/components.css} +0 -0
  361. /package/theme/styles/{themes/library/_layers.css → foundation/layers.css} +0 -0
  362. /package/theme/styles/{themes/library/_tokens.css → foundation/tokens.css} +0 -0
  363. /package/theme/styles/{themes/library/_material-overrides.css → integrations/material.css} +0 -0
  364. /package/theme/styles/{themes → integrations}/tailwind.css +0 -0
  365. /package/theme/styles/{themes/library → variants}/color/amber.css +0 -0
  366. /package/theme/styles/{themes/library → variants}/color/base.css +0 -0
  367. /package/theme/styles/{themes/library → variants}/color/blue.css +0 -0
  368. /package/theme/styles/{themes/library → variants}/color/cyan.css +0 -0
  369. /package/theme/styles/{themes/library → variants}/color/emerald.css +0 -0
  370. /package/theme/styles/{themes/library → variants}/color/fuchsia.css +0 -0
  371. /package/theme/styles/{themes/library → variants}/color/green.css +0 -0
  372. /package/theme/styles/{themes/library → variants}/color/index.css +0 -0
  373. /package/theme/styles/{themes/library → variants}/color/indigo.css +0 -0
  374. /package/theme/styles/{themes/library → variants}/color/lime.css +0 -0
  375. /package/theme/styles/{themes/library → variants}/color/orange.css +0 -0
  376. /package/theme/styles/{themes/library → variants}/color/pink.css +0 -0
  377. /package/theme/styles/{themes/library → variants}/color/purple.css +0 -0
  378. /package/theme/styles/{themes/library → variants}/color/red.css +0 -0
  379. /package/theme/styles/{themes/library → variants}/color/rose.css +0 -0
  380. /package/theme/styles/{themes/library → variants}/color/sky.css +0 -0
  381. /package/theme/styles/{themes/library → variants}/color/teal.css +0 -0
  382. /package/theme/styles/{themes/library → variants}/color/violet.css +0 -0
  383. /package/theme/styles/{themes/library → variants}/color/yellow.css +0 -0
  384. /package/theme/styles/{themes → variants}/mode/dark.css +0 -0
  385. /package/theme/styles/{themes → variants}/mode/index.css +0 -0
  386. /package/theme/styles/{themes → variants}/mode/light.css +0 -0
  387. /package/theme/styles/{themes/library → variants}/style/brutal.css +0 -0
  388. /package/theme/styles/{themes/library → variants}/style/default.css +0 -0
  389. /package/theme/styles/{themes/library → variants}/style/index.css +0 -0
  390. /package/theme/styles/{themes/library → variants}/style/sharp.css +0 -0
  391. /package/theme/styles/{themes/library → variants}/style/soft.css +0 -0
  392. /package/types/{ojiepermana-angular-ui-component-accordion.d.ts → ojiepermana-angular-component-accordion.d.ts} +0 -0
  393. /package/types/{ojiepermana-angular-ui-component-alert-dialog.d.ts → ojiepermana-angular-component-alert-dialog.d.ts} +0 -0
  394. /package/types/{ojiepermana-angular-ui-component-alert.d.ts → ojiepermana-angular-component-alert.d.ts} +0 -0
  395. /package/types/{ojiepermana-angular-ui-component-aspect-ratio.d.ts → ojiepermana-angular-component-aspect-ratio.d.ts} +0 -0
  396. /package/types/{ojiepermana-angular-ui-component-avatar.d.ts → ojiepermana-angular-component-avatar.d.ts} +0 -0
  397. /package/types/{ojiepermana-angular-ui-component-badge.d.ts → ojiepermana-angular-component-badge.d.ts} +0 -0
  398. /package/types/{ojiepermana-angular-ui-component-breadcrumb.d.ts → ojiepermana-angular-component-breadcrumb.d.ts} +0 -0
  399. /package/types/{ojiepermana-angular-ui-component-button-group.d.ts → ojiepermana-angular-component-button-group.d.ts} +0 -0
  400. /package/types/{ojiepermana-angular-ui-component-button.d.ts → ojiepermana-angular-component-button.d.ts} +0 -0
  401. /package/types/{ojiepermana-angular-ui-component-calendar.d.ts → ojiepermana-angular-component-calendar.d.ts} +0 -0
  402. /package/types/{ojiepermana-angular-ui-component-card.d.ts → ojiepermana-angular-component-card.d.ts} +0 -0
  403. /package/types/{ojiepermana-angular-ui-component-carousel.d.ts → ojiepermana-angular-component-carousel.d.ts} +0 -0
  404. /package/types/{ojiepermana-angular-ui-component-chart-area.d.ts → ojiepermana-angular-component-chart-area.d.ts} +0 -0
  405. /package/types/{ojiepermana-angular-ui-component-chart-bar.d.ts → ojiepermana-angular-component-chart-bar.d.ts} +0 -0
  406. /package/types/{ojiepermana-angular-ui-component-chart-line.d.ts → ojiepermana-angular-component-chart-line.d.ts} +0 -0
  407. /package/types/{ojiepermana-angular-ui-component-chart-pie.d.ts → ojiepermana-angular-component-chart-pie.d.ts} +0 -0
  408. /package/types/{ojiepermana-angular-ui-component-chart-radar.d.ts → ojiepermana-angular-component-chart-radar.d.ts} +0 -0
  409. /package/types/{ojiepermana-angular-ui-component-chart-radial.d.ts → ojiepermana-angular-component-chart-radial.d.ts} +0 -0
  410. /package/types/{ojiepermana-angular-ui-component-chart-scatter.d.ts → ojiepermana-angular-component-chart-scatter.d.ts} +0 -0
  411. /package/types/{ojiepermana-angular-ui-component-checkbox.d.ts → ojiepermana-angular-component-checkbox.d.ts} +0 -0
  412. /package/types/{ojiepermana-angular-ui-component-collapsible.d.ts → ojiepermana-angular-component-collapsible.d.ts} +0 -0
  413. /package/types/{ojiepermana-angular-ui-component-combobox.d.ts → ojiepermana-angular-component-combobox.d.ts} +0 -0
  414. /package/types/{ojiepermana-angular-ui-component-command.d.ts → ojiepermana-angular-component-command.d.ts} +0 -0
  415. /package/types/{ojiepermana-angular-ui-component-context-menu.d.ts → ojiepermana-angular-component-context-menu.d.ts} +0 -0
  416. /package/types/{ojiepermana-angular-ui-component-date-picker.d.ts → ojiepermana-angular-component-date-picker.d.ts} +0 -0
  417. /package/types/{ojiepermana-angular-ui-component-dialog.d.ts → ojiepermana-angular-component-dialog.d.ts} +0 -0
  418. /package/types/{ojiepermana-angular-ui-component-drawer.d.ts → ojiepermana-angular-component-drawer.d.ts} +0 -0
  419. /package/types/{ojiepermana-angular-ui-component-dropdown-menu.d.ts → ojiepermana-angular-component-dropdown-menu.d.ts} +0 -0
  420. /package/types/{ojiepermana-angular-ui-component-form.d.ts → ojiepermana-angular-component-form.d.ts} +0 -0
  421. /package/types/{ojiepermana-angular-ui-component-input-group.d.ts → ojiepermana-angular-component-input-group.d.ts} +0 -0
  422. /package/types/{ojiepermana-angular-ui-component-input.d.ts → ojiepermana-angular-component-input.d.ts} +0 -0
  423. /package/types/{ojiepermana-angular-ui-component-item.d.ts → ojiepermana-angular-component-item.d.ts} +0 -0
  424. /package/types/{ojiepermana-angular-ui-component-label.d.ts → ojiepermana-angular-component-label.d.ts} +0 -0
  425. /package/types/{ojiepermana-angular-ui-component-pagination.d.ts → ojiepermana-angular-component-pagination.d.ts} +0 -0
  426. /package/types/{ojiepermana-angular-ui-component-popover.d.ts → ojiepermana-angular-component-popover.d.ts} +0 -0
  427. /package/types/{ojiepermana-angular-ui-component-progress.d.ts → ojiepermana-angular-component-progress.d.ts} +0 -0
  428. /package/types/{ojiepermana-angular-ui-component-radio.d.ts → ojiepermana-angular-component-radio.d.ts} +0 -0
  429. /package/types/{ojiepermana-angular-ui-component-scroll-area.d.ts → ojiepermana-angular-component-scroll-area.d.ts} +0 -0
  430. /package/types/{ojiepermana-angular-ui-component-select.d.ts → ojiepermana-angular-component-select.d.ts} +0 -0
  431. /package/types/{ojiepermana-angular-ui-component-separator.d.ts → ojiepermana-angular-component-separator.d.ts} +0 -0
  432. /package/types/{ojiepermana-angular-ui-component-sheet.d.ts → ojiepermana-angular-component-sheet.d.ts} +0 -0
  433. /package/types/{ojiepermana-angular-ui-component-skeleton.d.ts → ojiepermana-angular-component-skeleton.d.ts} +0 -0
  434. /package/types/{ojiepermana-angular-ui-component-slider.d.ts → ojiepermana-angular-component-slider.d.ts} +0 -0
  435. /package/types/{ojiepermana-angular-ui-component-switch.d.ts → ojiepermana-angular-component-switch.d.ts} +0 -0
  436. /package/types/{ojiepermana-angular-ui-component-table.d.ts → ojiepermana-angular-component-table.d.ts} +0 -0
  437. /package/types/{ojiepermana-angular-ui-component-tabs.d.ts → ojiepermana-angular-component-tabs.d.ts} +0 -0
  438. /package/types/{ojiepermana-angular-ui-component-textarea.d.ts → ojiepermana-angular-component-textarea.d.ts} +0 -0
  439. /package/types/{ojiepermana-angular-ui-component-toast.d.ts → ojiepermana-angular-component-toast.d.ts} +0 -0
  440. /package/types/{ojiepermana-angular-ui-component-tooltip.d.ts → ojiepermana-angular-component-tooltip.d.ts} +0 -0
  441. /package/types/{ojiepermana-angular-ui-component-utils.d.ts → ojiepermana-angular-component-utils.d.ts} +0 -0
  442. /package/types/{ojiepermana-angular-layout-theme.d.ts → ojiepermana-angular-layout-component.d.ts} +0 -0
@@ -1,2317 +0,0 @@
1
- import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
2
- import * as i0 from '@angular/core';
3
- import { inject, DestroyRef, signal, computed, effect, Injectable, input, ChangeDetectionStrategy, Component, ViewContainerRef, viewChild, ElementRef } from '@angular/core';
4
- import { Router, NavigationEnd, RouterLink, RouterLinkActive } from '@angular/router';
5
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
6
- import { filter, map } from 'rxjs/operators';
7
- import { UiNavIconComponent } from '@ojiepermana/angular/navigation-icon';
8
- export * from '@ojiepermana/angular/navigation-icon';
9
- import { MatTooltip } from '@angular/material/tooltip';
10
- import { clsx } from 'clsx';
11
- import { twMerge } from 'tailwind-merge';
12
- import { BreakpointObserver } from '@angular/cdk/layout';
13
- import { Overlay } from '@angular/cdk/overlay';
14
- import { TemplatePortal } from '@angular/cdk/portal';
15
- import { FocusTrapFactory } from '@angular/cdk/a11y';
16
- import { ScrollAreaComponent } from '@ojiepermana/angular/component/scroll-area';
17
- import { merge } from 'rxjs';
18
-
19
- /** Default registry key used when no id is specified. */
20
- const DEFAULT_NAVIGATION_ID = 'main';
21
- const SIDEBAR_COLLAPSE_STORAGE_KEY = 'sidebar-collapse';
22
- const LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY = 'sidebar-appearance';
23
- function parseSidebarCollapsed(value) {
24
- if (value === 'true')
25
- return true;
26
- if (value === 'false')
27
- return false;
28
- return null;
29
- }
30
- /**
31
- * Signal-based global state untuk navigation (sidebar/topbar).
32
- *
33
- * Items disimpan dalam registry ber-key. Key default adalah `'main'`.
34
- * Komponen `sidebar` / `topbar` memilih registry via input `navigationId`.
35
- */
36
- class NavigationService {
37
- doc = inject(DOCUMENT);
38
- router = inject(Router);
39
- destroyRef = inject(DestroyRef);
40
- persistedSidebarCollapsed = this.readPersistedSidebarCollapsed();
41
- /** Internal version counter — incremented on every registry mutation. */
42
- _version = signal(0, ...(ngDevMode ? [{ debugName: "_version" }] : /* istanbul ignore next */ []));
43
- /** Internal map of registered navigation trees. */
44
- _registry = new Map();
45
- _collapsed = signal(this.persistedSidebarCollapsed ?? false, ...(ngDevMode ? [{ debugName: "_collapsed" }] : /* istanbul ignore next */ []));
46
- _hasStoredSidebarCollapse = signal(this.persistedSidebarCollapsed !== null, ...(ngDevMode ? [{ debugName: "_hasStoredSidebarCollapse" }] : /* istanbul ignore next */ []));
47
- /**
48
- * Backward-compatible accessor — returns items for the default (`'main'`) key.
49
- * Prefer `getItems(id)` when working with named registries.
50
- */
51
- items = computed(() => this.getItems(DEFAULT_NAVIGATION_ID)(), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
52
- /** Sidebar appearance preference (`default` or `thin`). */
53
- sidebarAppearance = computed(() => (this._collapsed() ? 'thin' : 'default'), ...(ngDevMode ? [{ debugName: "sidebarAppearance" }] : /* istanbul ignore next */ []));
54
- hasStoredSidebarCollapse = this._hasStoredSidebarCollapse.asReadonly();
55
- /** Sidebar collapsed (default ↔ thin) toggle untuk desktop. */
56
- collapsed = this._collapsed.asReadonly();
57
- /** Sheet drawer terbuka di mobile. */
58
- mobileOpen = signal(false, ...(ngDevMode ? [{ debugName: "mobileOpen" }] : /* istanbul ignore next */ []));
59
- /** Set id grup / collapsable yang sedang terbuka. */
60
- openGroups = signal(new Set(), ...(ngDevMode ? [{ debugName: "openGroups" }] : /* istanbul ignore next */ []));
61
- /** URL aktif terakhir. Update otomatis dari Router `NavigationEnd`. */
62
- activeUrl = signal(this.router.url, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
63
- /** Trail id item yang sedang match dengan URL aktif (across ALL registries). */
64
- activeTrail = computed(() => {
65
- this._version(); // track changes
66
- const url = this.activeUrl();
67
- const trail = new Set();
68
- const walk = (list, ancestors) => {
69
- let matched = false;
70
- for (const item of list) {
71
- const id = item.id;
72
- const link = 'link' in item ? item.link : undefined;
73
- let selfMatch = false;
74
- if (link) {
75
- selfMatch = url === link || url.startsWith(link + '/') || url.startsWith(link + '?');
76
- }
77
- const children = 'children' in item ? (item.children ?? []) : [];
78
- const nextAncestors = id ? [...ancestors, id] : ancestors;
79
- const childMatch = children.length > 0 && walk(children, nextAncestors);
80
- if (selfMatch || childMatch) {
81
- if (id)
82
- trail.add(id);
83
- for (const a of ancestors)
84
- trail.add(a);
85
- matched = true;
86
- }
87
- }
88
- return matched;
89
- };
90
- for (const items of this._registry.values()) {
91
- walk(items, []);
92
- }
93
- return trail;
94
- }, ...(ngDevMode ? [{ debugName: "activeTrail" }] : /* istanbul ignore next */ []));
95
- constructor() {
96
- effect(() => {
97
- if (!this._hasStoredSidebarCollapse()) {
98
- return;
99
- }
100
- this.persistSidebarCollapsed(this._collapsed());
101
- });
102
- this.router.events
103
- .pipe(filter((e) => e instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
104
- .subscribe((e) => this.activeUrl.set(e.urlAfterRedirects));
105
- }
106
- registerItems(idOrItems, maybeItems) {
107
- const [id, items] = typeof idOrItems === 'string' ? [idOrItems, maybeItems] : [DEFAULT_NAVIGATION_ID, idOrItems];
108
- this._registry.set(id, items);
109
- this._version.update((v) => v + 1);
110
- }
111
- /** Remove a named registry entry. */
112
- removeItems(id) {
113
- this._registry.delete(id);
114
- this._version.update((v) => v + 1);
115
- }
116
- /**
117
- * Computed yang mengembalikan items untuk key tertentu.
118
- * Reactive terhadap perubahan registry.
119
- */
120
- getItems(id) {
121
- return computed(() => {
122
- this._version(); // track changes
123
- return this._registry.get(id) ?? [];
124
- });
125
- }
126
- setSidebarAppearance(value) {
127
- this.setCollapsed(value === 'thin');
128
- }
129
- toggleSidebarAppearance(currentAppearance = this.sidebarAppearance()) {
130
- this.setCollapsed(currentAppearance !== 'thin');
131
- }
132
- /** Toggle sidebar collapsed (default ↔ thin). */
133
- toggleCollapsed() {
134
- this.setCollapsed(!this._collapsed());
135
- }
136
- setCollapsed(value) {
137
- this._collapsed.set(value);
138
- this._hasStoredSidebarCollapse.set(true);
139
- }
140
- openMobile() {
141
- this.mobileOpen.set(true);
142
- }
143
- closeMobile() {
144
- this.mobileOpen.set(false);
145
- }
146
- toggleMobile() {
147
- this.mobileOpen.update((v) => !v);
148
- }
149
- isGroupOpen(id) {
150
- return this.openGroups().has(id);
151
- }
152
- toggleGroup(id) {
153
- const next = new Set(this.openGroups());
154
- if (next.has(id))
155
- next.delete(id);
156
- else
157
- next.add(id);
158
- this.openGroups.set(next);
159
- }
160
- setGroupOpen(id, open) {
161
- const next = new Set(this.openGroups());
162
- if (open)
163
- next.add(id);
164
- else
165
- next.delete(id);
166
- this.openGroups.set(next);
167
- }
168
- /** Apakah id termasuk dalam active trail saat ini. */
169
- isActive(id) {
170
- return !!id && this.activeTrail().has(id);
171
- }
172
- readPersistedSidebarCollapsed() {
173
- try {
174
- const storage = this.doc.defaultView?.localStorage;
175
- const collapsed = parseSidebarCollapsed(storage?.getItem(SIDEBAR_COLLAPSE_STORAGE_KEY));
176
- if (collapsed !== null) {
177
- return collapsed;
178
- }
179
- const legacyAppearance = storage?.getItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);
180
- if (legacyAppearance === 'thin') {
181
- return true;
182
- }
183
- if (legacyAppearance === 'default') {
184
- return false;
185
- }
186
- return null;
187
- }
188
- catch {
189
- return null;
190
- }
191
- }
192
- persistSidebarCollapsed(value) {
193
- try {
194
- const storage = this.doc.defaultView?.localStorage;
195
- storage?.setItem(SIDEBAR_COLLAPSE_STORAGE_KEY, String(value));
196
- storage?.removeItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);
197
- }
198
- catch {
199
- /* ignore */
200
- }
201
- }
202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
203
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, providedIn: 'root' });
204
- }
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, decorators: [{
206
- type: Injectable,
207
- args: [{ providedIn: 'root' }]
208
- }], ctorParameters: () => [] });
209
-
210
- /** Concatenate and dedupe Tailwind class names. */
211
- function cn(...inputs) {
212
- return twMerge(clsx(inputs));
213
- }
214
-
215
- /**
216
- * Recursive navigation item renderer (vertical context).
217
- *
218
- * Menerima item polymorphic dan delegasi ke template sesuai `type`.
219
- * Mega dirender sebagai group biasa saat muncul di konteks vertical.
220
- */
221
- class UiNavItemComponent {
222
- nav = inject(NavigationService);
223
- cn = cn;
224
- item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
225
- level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
226
- /** Compact / icon-only rendering (sidebar `thin`). */
227
- compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
228
- /** True when this branch sits inside a collapsable rail and can draw a connector back to it. */
229
- railConnector = input(false, ...(ngDevMode ? [{ debugName: "railConnector" }] : /* istanbul ignore next */ []));
230
- railConnectorDotClasses = 'pointer-events-none absolute -left-[11px] top-1/2 z-10 h-1 w-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-foreground/80';
231
- exactMatch = {
232
- exact: true,
233
- paths: 'exact',
234
- queryParams: 'exact',
235
- fragment: 'exact',
236
- matrixParams: 'exact',
237
- };
238
- inexactMatch = {
239
- paths: 'subset',
240
- queryParams: 'subset',
241
- fragment: 'ignored',
242
- matrixParams: 'ignored',
243
- };
244
- type = computed(() => this.item().type, ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
245
- groupItem = computed(() => this.item(), ...(ngDevMode ? [{ debugName: "groupItem" }] : /* istanbul ignore next */ []));
246
- collapsableItem = computed(() => this.item(), ...(ngDevMode ? [{ debugName: "collapsableItem" }] : /* istanbul ignore next */ []));
247
- megaItem = computed(() => this.item(), ...(ngDevMode ? [{ debugName: "megaItem" }] : /* istanbul ignore next */ []));
248
- asideItem = computed(() => this.item(), ...(ngDevMode ? [{ debugName: "asideItem" }] : /* istanbul ignore next */ []));
249
- basicItem = computed(() => this.item(), ...(ngDevMode ? [{ debugName: "basicItem" }] : /* istanbul ignore next */ []));
250
- headingId = computed(() => {
251
- const id = this.item().id ?? '';
252
- return `nav-group-${id}`;
253
- }, ...(ngDevMode ? [{ debugName: "headingId" }] : /* istanbul ignore next */ []));
254
- isGroupOpen() {
255
- const id = this.item().id;
256
- if (!id)
257
- return false;
258
- // auto-open when any descendant is active
259
- if (this.nav.isActive(id) && 'children' in this.item())
260
- return true;
261
- return this.nav.isGroupOpen(id);
262
- }
263
- isTrailActive() {
264
- return this.nav.isActive(this.item().id);
265
- }
266
- railConnectorClasses(active) {
267
- if (!active || !this.railConnector())
268
- return '';
269
- return ('relative after:pointer-events-none after:absolute after:-left-3 after:top-1/2 after:z-0 after:h-px ' +
270
- "after:w-3 after:-translate-y-1/2 after:rounded-full after:bg-primary/30 after:content-['']");
271
- }
272
- showRailConnector(active) {
273
- return active && this.railConnector();
274
- }
275
- toggleGroup() {
276
- const id = this.item().id;
277
- if (id)
278
- this.nav.toggleGroup(id);
279
- }
280
- runAction() {
281
- const item = this.item();
282
- if ('action' in item && typeof item.action === 'function') {
283
- item.action(item);
284
- }
285
- }
286
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: UiNavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
287
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: UiNavItemComponent, isStandalone: true, selector: "ui-nav-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, railConnector: { classPropertyName: "railConnector", publicName: "railConnector", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
288
- @switch (type()) {
289
- @case ('divider') {
290
- <hr class="my-2 border-t border-border" role="separator" />
291
- }
292
- @case ('spacer') {
293
- <div class="flex-1"></div>
294
- }
295
- @case ('group') {
296
- <div role="group" [attr.aria-labelledby]="headingId()">
297
- @if (!compact()) {
298
- <div class="sticky top-0 z-10 p-3 text-muted-foreground backdrop-blur-3xl bg-transparent">
299
- <div [id]="headingId()" [class]="cn('ui-nav-heading text-muted-foreground', item().classes?.title)">
300
- {{ item().title }}
301
- </div>
302
- </div>
303
- }
304
- <div class="flex flex-col gap-0.5">
305
- @for (child of groupItem().children; track child.id) {
306
- <ui-nav-item
307
- [item]="child"
308
- [level]="level() + 1"
309
- [compact]="compact()"
310
- [railConnector]="railConnector()" />
311
- }
312
- </div>
313
- </div>
314
- }
315
- @case ('collapsable') {
316
- @let id = collapsableItem().id ?? '';
317
- @let open = isGroupOpen();
318
- @let active = isTrailActive();
319
- <button
320
- type="button"
321
- [class]="
322
- cn(
323
- 'ui-nav-text ui-nav-hover-surface group/ni flex w-full items-center gap-3 rounded p-3 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
324
- active && 'text-primary',
325
- railConnectorClasses(active),
326
- item().classes?.wrapper
327
- )
328
- "
329
- [attr.aria-expanded]="open"
330
- [attr.aria-controls]="id + '-panel'"
331
- [disabled]="collapsableItem().disabled || null"
332
- [matTooltip]="compact() ? (collapsableItem().title ?? '') : ''"
333
- matTooltipPosition="right"
334
- [matTooltipDisabled]="!compact()"
335
- (click)="toggleGroup()">
336
- @if (showRailConnector(active)) {
337
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
338
- }
339
- @if (collapsableItem().icon) {
340
- <span
341
- [class]="
342
- cn(
343
- 'inline-flex shrink-0 items-center justify-center',
344
- open && 'h-7 w-7 rounded-full border border-brand'
345
- )
346
- ">
347
- <ui-nav-icon [name]="collapsableItem().icon!" [size]="18" [class]="item().classes?.icon ?? ''" />
348
- </span>
349
- }
350
- @if (!compact()) {
351
- <span [class]="cn('flex-1 truncate text-left', item().classes?.title)">
352
- {{ collapsableItem().title }}
353
- </span>
354
- @if (collapsableItem().badge; as badge) {
355
- <span [class]="badge.classes ?? 'ui-nav-badge ml-auto'">{{ badge.title }}</span>
356
- }
357
- <ui-nav-icon
358
- [name]="'chevron_right'"
359
- [size]="18"
360
- [class]="cn('transition-transform duration-200', open && 'rotate-90')" />
361
- }
362
- </button>
363
- @if (!compact() && open) {
364
- <div
365
- [id]="id + '-panel'"
366
- role="region"
367
- class="relative ml-6.5 mt-0.5 flex flex-col gap-0.5 pl-3 before:absolute before:bottom-0 before:left-0 before:-top-3.5 before:w-px before:bg-primary/30 before:content-['']">
368
- @for (child of collapsableItem().children; track child.id) {
369
- <ui-nav-item [item]="child" [level]="level() + 1" [compact]="false" [railConnector]="true" />
370
- }
371
- </div>
372
- }
373
- }
374
- @case ('mega') {
375
- <!-- Mega direndahkan ke group saat berada di sidebar vertical. -->
376
- <div class="mt-4 py-3 first:mt-0" role="group">
377
- @if (!compact()) {
378
- <div class="ui-nav-heading sticky top-0 z-10 bg-background px-3 pb-1 text-muted-foreground">
379
- {{ item().title }}
380
- </div>
381
- }
382
- <div class="flex flex-col gap-0.5">
383
- @for (child of megaItem().children; track child.id) {
384
- <ui-nav-item
385
- [item]="child"
386
- [level]="level() + 1"
387
- [compact]="compact()"
388
- [railConnector]="railConnector()" />
389
- }
390
- </div>
391
- </div>
392
- }
393
- @case ('aside') {
394
- <a
395
- [class]="
396
- cn(
397
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary',
398
- railConnectorClasses(rla.isActive),
399
- item().classes?.wrapper
400
- )
401
- "
402
- routerLinkActive="text-primary"
403
- #rla="routerLinkActive"
404
- [attr.aria-current]="rla.isActive ? 'page' : null"
405
- [routerLink]="asideItem().link"
406
- [queryParams]="asideItem().queryParams"
407
- [fragment]="asideItem().fragment ?? undefined"
408
- [target]="asideItem().target ?? undefined"
409
- [matTooltip]="compact() ? (asideItem().title ?? '') : ''"
410
- matTooltipPosition="right"
411
- [matTooltipDisabled]="!compact()">
412
- @if (showRailConnector(rla.isActive)) {
413
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
414
- }
415
- @if (asideItem().icon) {
416
- <ui-nav-icon [name]="asideItem().icon!" [size]="18" />
417
- }
418
- @if (!compact()) {
419
- <span class="flex-1 truncate">{{ asideItem().title }}</span>
420
- }
421
- </a>
422
- }
423
- @default {
424
- <!-- basic -->
425
- @if (basicItem().link && !basicItem().externalLink) {
426
- <a
427
- [class]="
428
- cn(
429
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary aria-disabled:pointer-events-none aria-disabled:opacity-50',
430
- railConnectorClasses(rla.isActive),
431
- item().classes?.wrapper
432
- )
433
- "
434
- routerLinkActive="text-primary"
435
- #rla="routerLinkActive"
436
- [routerLinkActiveOptions]="
437
- basicItem().isActiveMatchOptions ?? (basicItem().exactMatch ? exactMatch : inexactMatch)
438
- "
439
- [attr.aria-current]="rla.isActive ? 'page' : null"
440
- [attr.aria-disabled]="basicItem().disabled || null"
441
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
442
- matTooltipPosition="right"
443
- [matTooltipDisabled]="!compact()"
444
- [routerLink]="basicItem().link"
445
- [queryParams]="basicItem().queryParams"
446
- [queryParamsHandling]="basicItem().queryParamsHandling ?? null"
447
- [fragment]="basicItem().fragment ?? undefined"
448
- [preserveFragment]="basicItem().preserveFragment ?? false"
449
- [target]="basicItem().target ?? undefined"
450
- (click)="runAction()">
451
- @if (showRailConnector(rla.isActive)) {
452
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
453
- }
454
- @if (basicItem().icon) {
455
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" [class]="item().classes?.icon ?? ''" />
456
- }
457
- @if (!compact()) {
458
- <span [class]="cn('flex-1 truncate', item().classes?.title)">{{ basicItem().title }}</span>
459
- @if (basicItem().badge; as badge) {
460
- <span [class]="badge.classes ?? 'ui-nav-badge ml-auto'">{{ badge.title }}</span>
461
- }
462
- }
463
- </a>
464
- } @else if (basicItem().link && basicItem().externalLink) {
465
- <a
466
- [class]="
467
- cn(
468
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
469
- item().classes?.wrapper
470
- )
471
- "
472
- [attr.href]="basicItem().link"
473
- [attr.target]="basicItem().target ?? '_blank'"
474
- rel="noopener noreferrer"
475
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
476
- matTooltipPosition="right"
477
- [matTooltipDisabled]="!compact()">
478
- @if (basicItem().icon) {
479
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" />
480
- }
481
- @if (!compact()) {
482
- <span class="flex-1 truncate">{{ basicItem().title }}</span>
483
- }
484
- </a>
485
- } @else {
486
- <button
487
- type="button"
488
- [class]="
489
- cn(
490
- 'ui-nav-text ui-nav-hover-surface flex w-full items-center gap-3 rounded px-3 py-2 text-left text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
491
- item().classes?.wrapper
492
- )
493
- "
494
- [disabled]="basicItem().disabled || null"
495
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
496
- matTooltipPosition="right"
497
- [matTooltipDisabled]="!compact()"
498
- (click)="runAction()">
499
- @if (basicItem().icon) {
500
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" />
501
- }
502
- @if (!compact()) {
503
- <span class="flex-1 truncate">{{ basicItem().title }}</span>
504
- }
505
- </button>
506
- }
507
- }
508
- }
509
- `, isInline: true, dependencies: [{ kind: "component", type: UiNavItemComponent, selector: "ui-nav-item", inputs: ["item", "level", "compact", "railConnector"] }, { 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: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: UiNavIconComponent, selector: "ui-nav-icon", inputs: ["name", "class", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
510
- }
511
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: UiNavItemComponent, decorators: [{
512
- type: Component,
513
- args: [{
514
- selector: 'ui-nav-item',
515
- changeDetection: ChangeDetectionStrategy.OnPush,
516
- imports: [RouterLink, RouterLinkActive, MatTooltip, UiNavIconComponent],
517
- template: `
518
- @switch (type()) {
519
- @case ('divider') {
520
- <hr class="my-2 border-t border-border" role="separator" />
521
- }
522
- @case ('spacer') {
523
- <div class="flex-1"></div>
524
- }
525
- @case ('group') {
526
- <div role="group" [attr.aria-labelledby]="headingId()">
527
- @if (!compact()) {
528
- <div class="sticky top-0 z-10 p-3 text-muted-foreground backdrop-blur-3xl bg-transparent">
529
- <div [id]="headingId()" [class]="cn('ui-nav-heading text-muted-foreground', item().classes?.title)">
530
- {{ item().title }}
531
- </div>
532
- </div>
533
- }
534
- <div class="flex flex-col gap-0.5">
535
- @for (child of groupItem().children; track child.id) {
536
- <ui-nav-item
537
- [item]="child"
538
- [level]="level() + 1"
539
- [compact]="compact()"
540
- [railConnector]="railConnector()" />
541
- }
542
- </div>
543
- </div>
544
- }
545
- @case ('collapsable') {
546
- @let id = collapsableItem().id ?? '';
547
- @let open = isGroupOpen();
548
- @let active = isTrailActive();
549
- <button
550
- type="button"
551
- [class]="
552
- cn(
553
- 'ui-nav-text ui-nav-hover-surface group/ni flex w-full items-center gap-3 rounded p-3 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
554
- active && 'text-primary',
555
- railConnectorClasses(active),
556
- item().classes?.wrapper
557
- )
558
- "
559
- [attr.aria-expanded]="open"
560
- [attr.aria-controls]="id + '-panel'"
561
- [disabled]="collapsableItem().disabled || null"
562
- [matTooltip]="compact() ? (collapsableItem().title ?? '') : ''"
563
- matTooltipPosition="right"
564
- [matTooltipDisabled]="!compact()"
565
- (click)="toggleGroup()">
566
- @if (showRailConnector(active)) {
567
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
568
- }
569
- @if (collapsableItem().icon) {
570
- <span
571
- [class]="
572
- cn(
573
- 'inline-flex shrink-0 items-center justify-center',
574
- open && 'h-7 w-7 rounded-full border border-brand'
575
- )
576
- ">
577
- <ui-nav-icon [name]="collapsableItem().icon!" [size]="18" [class]="item().classes?.icon ?? ''" />
578
- </span>
579
- }
580
- @if (!compact()) {
581
- <span [class]="cn('flex-1 truncate text-left', item().classes?.title)">
582
- {{ collapsableItem().title }}
583
- </span>
584
- @if (collapsableItem().badge; as badge) {
585
- <span [class]="badge.classes ?? 'ui-nav-badge ml-auto'">{{ badge.title }}</span>
586
- }
587
- <ui-nav-icon
588
- [name]="'chevron_right'"
589
- [size]="18"
590
- [class]="cn('transition-transform duration-200', open && 'rotate-90')" />
591
- }
592
- </button>
593
- @if (!compact() && open) {
594
- <div
595
- [id]="id + '-panel'"
596
- role="region"
597
- class="relative ml-6.5 mt-0.5 flex flex-col gap-0.5 pl-3 before:absolute before:bottom-0 before:left-0 before:-top-3.5 before:w-px before:bg-primary/30 before:content-['']">
598
- @for (child of collapsableItem().children; track child.id) {
599
- <ui-nav-item [item]="child" [level]="level() + 1" [compact]="false" [railConnector]="true" />
600
- }
601
- </div>
602
- }
603
- }
604
- @case ('mega') {
605
- <!-- Mega direndahkan ke group saat berada di sidebar vertical. -->
606
- <div class="mt-4 py-3 first:mt-0" role="group">
607
- @if (!compact()) {
608
- <div class="ui-nav-heading sticky top-0 z-10 bg-background px-3 pb-1 text-muted-foreground">
609
- {{ item().title }}
610
- </div>
611
- }
612
- <div class="flex flex-col gap-0.5">
613
- @for (child of megaItem().children; track child.id) {
614
- <ui-nav-item
615
- [item]="child"
616
- [level]="level() + 1"
617
- [compact]="compact()"
618
- [railConnector]="railConnector()" />
619
- }
620
- </div>
621
- </div>
622
- }
623
- @case ('aside') {
624
- <a
625
- [class]="
626
- cn(
627
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary',
628
- railConnectorClasses(rla.isActive),
629
- item().classes?.wrapper
630
- )
631
- "
632
- routerLinkActive="text-primary"
633
- #rla="routerLinkActive"
634
- [attr.aria-current]="rla.isActive ? 'page' : null"
635
- [routerLink]="asideItem().link"
636
- [queryParams]="asideItem().queryParams"
637
- [fragment]="asideItem().fragment ?? undefined"
638
- [target]="asideItem().target ?? undefined"
639
- [matTooltip]="compact() ? (asideItem().title ?? '') : ''"
640
- matTooltipPosition="right"
641
- [matTooltipDisabled]="!compact()">
642
- @if (showRailConnector(rla.isActive)) {
643
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
644
- }
645
- @if (asideItem().icon) {
646
- <ui-nav-icon [name]="asideItem().icon!" [size]="18" />
647
- }
648
- @if (!compact()) {
649
- <span class="flex-1 truncate">{{ asideItem().title }}</span>
650
- }
651
- </a>
652
- }
653
- @default {
654
- <!-- basic -->
655
- @if (basicItem().link && !basicItem().externalLink) {
656
- <a
657
- [class]="
658
- cn(
659
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-primary aria-disabled:pointer-events-none aria-disabled:opacity-50',
660
- railConnectorClasses(rla.isActive),
661
- item().classes?.wrapper
662
- )
663
- "
664
- routerLinkActive="text-primary"
665
- #rla="routerLinkActive"
666
- [routerLinkActiveOptions]="
667
- basicItem().isActiveMatchOptions ?? (basicItem().exactMatch ? exactMatch : inexactMatch)
668
- "
669
- [attr.aria-current]="rla.isActive ? 'page' : null"
670
- [attr.aria-disabled]="basicItem().disabled || null"
671
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
672
- matTooltipPosition="right"
673
- [matTooltipDisabled]="!compact()"
674
- [routerLink]="basicItem().link"
675
- [queryParams]="basicItem().queryParams"
676
- [queryParamsHandling]="basicItem().queryParamsHandling ?? null"
677
- [fragment]="basicItem().fragment ?? undefined"
678
- [preserveFragment]="basicItem().preserveFragment ?? false"
679
- [target]="basicItem().target ?? undefined"
680
- (click)="runAction()">
681
- @if (showRailConnector(rla.isActive)) {
682
- <span aria-hidden="true" data-nav-rail-dot [class]="railConnectorDotClasses"></span>
683
- }
684
- @if (basicItem().icon) {
685
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" [class]="item().classes?.icon ?? ''" />
686
- }
687
- @if (!compact()) {
688
- <span [class]="cn('flex-1 truncate', item().classes?.title)">{{ basicItem().title }}</span>
689
- @if (basicItem().badge; as badge) {
690
- <span [class]="badge.classes ?? 'ui-nav-badge ml-auto'">{{ badge.title }}</span>
691
- }
692
- }
693
- </a>
694
- } @else if (basicItem().link && basicItem().externalLink) {
695
- <a
696
- [class]="
697
- cn(
698
- 'ui-nav-text ui-nav-hover-surface flex items-center gap-3 rounded px-3 py-2 text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
699
- item().classes?.wrapper
700
- )
701
- "
702
- [attr.href]="basicItem().link"
703
- [attr.target]="basicItem().target ?? '_blank'"
704
- rel="noopener noreferrer"
705
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
706
- matTooltipPosition="right"
707
- [matTooltipDisabled]="!compact()">
708
- @if (basicItem().icon) {
709
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" />
710
- }
711
- @if (!compact()) {
712
- <span class="flex-1 truncate">{{ basicItem().title }}</span>
713
- }
714
- </a>
715
- } @else {
716
- <button
717
- type="button"
718
- [class]="
719
- cn(
720
- 'ui-nav-text ui-nav-hover-surface flex w-full items-center gap-3 rounded px-3 py-2 text-left text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
721
- item().classes?.wrapper
722
- )
723
- "
724
- [disabled]="basicItem().disabled || null"
725
- [matTooltip]="compact() ? (basicItem().title ?? '') : ''"
726
- matTooltipPosition="right"
727
- [matTooltipDisabled]="!compact()"
728
- (click)="runAction()">
729
- @if (basicItem().icon) {
730
- <ui-nav-icon [name]="basicItem().icon!" [size]="18" />
731
- }
732
- @if (!compact()) {
733
- <span class="flex-1 truncate">{{ basicItem().title }}</span>
734
- }
735
- </button>
736
- }
737
- }
738
- }
739
- `,
740
- }]
741
- }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], railConnector: [{ type: i0.Input, args: [{ isSignal: true, alias: "railConnector", required: false }] }] } });
742
-
743
- /**
744
- * Vertical navigation (sidebar) — shadcn-styled.
745
- *
746
- * Variants:
747
- * - `default`: 17.5rem, label + icon
748
- * - `thin`: 4rem icon-only; hover memunculkan overlay expand (tidak push konten)
749
- *
750
- * Mobile (`< md`): saat `autoMobile=true` (default), host desktop disembunyikan
751
- * dan konten dirender lewat CDK Overlay drawer dengan focus trap. State buka
752
- * dikontrol lewat `NavigationService.mobileOpen`.
753
- */
754
- class SidebarComponent {
755
- nav = inject(NavigationService);
756
- bp = inject(BreakpointObserver);
757
- overlay = inject(Overlay);
758
- vcr = inject(ViewContainerRef);
759
- focusTrapFactory = inject(FocusTrapFactory);
760
- doc = inject(DOCUMENT);
761
- destroyRef = inject(DestroyRef);
762
- items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
763
- /** Registry key di `NavigationService`. Default `'main'`. */
764
- navigationId = input(DEFAULT_NAVIGATION_ID, ...(ngDevMode ? [{ debugName: "navigationId" }] : /* istanbul ignore next */ []));
765
- appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
766
- /** Desktop border can be owned by the sidebar or by the surrounding layout shell. */
767
- borderSource = input('component', ...(ngDevMode ? [{ debugName: "borderSource" }] : /* istanbul ignore next */ []));
768
- position = input('left', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
769
- ariaLabel = input('Primary', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
770
- header = input(true, ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
771
- class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
772
- /** Auto switch ke CDK overlay drawer saat viewport `< md`. */
773
- autoMobile = input(true, ...(ngDevMode ? [{ debugName: "autoMobile" }] : /* istanbul ignore next */ []));
774
- /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */
775
- autoRegister = input(true, ...(ngDevMode ? [{ debugName: "autoRegister" }] : /* istanbul ignore next */ []));
776
- /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */
777
- resolvedItems = computed(() => {
778
- const explicit = this.items();
779
- return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();
780
- }, ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
781
- hovered = signal(false, ...(ngDevMode ? [{ debugName: "hovered" }] : /* istanbul ignore next */ []));
782
- suppressHoverUntilLeave = signal(false, ...(ngDevMode ? [{ debugName: "suppressHoverUntilLeave" }] : /* istanbul ignore next */ []));
783
- drawerTpl = viewChild.required('drawerTpl');
784
- drawerRef = null;
785
- focusTrap = null;
786
- previouslyFocused = null;
787
- /** True saat viewport `< md` (767.98px). */
788
- isMobileMedia = toSignal(this.bp.observe('(max-width: 767.98px)').pipe(map((s) => s.matches)), {
789
- initialValue: false,
790
- });
791
- isMobile = computed(() => this.autoMobile() && this.isMobileMedia(), ...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
792
- resolvedCollapsed = computed(() => {
793
- if (this.nav.hasStoredSidebarCollapse()) {
794
- return this.nav.collapsed();
795
- }
796
- return this.appearance() === 'thin';
797
- }, ...(ngDevMode ? [{ debugName: "resolvedCollapsed" }] : /* istanbul ignore next */ []));
798
- resolvedAppearance = computed(() => {
799
- return this.resolvedCollapsed() ? 'thin' : 'default';
800
- }, ...(ngDevMode ? [{ debugName: "resolvedAppearance" }] : /* istanbul ignore next */ []));
801
- hoverActive = computed(() => this.hovered() && !this.suppressHoverUntilLeave(), ...(ngDevMode ? [{ debugName: "hoverActive" }] : /* istanbul ignore next */ []));
802
- isExpanded = computed(() => !this.resolvedCollapsed() || this.hoverActive(), ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
803
- isCompact = computed(() => !this.isMobile() && this.resolvedCollapsed() && !this.hoverActive(), ...(ngDevMode ? [{ debugName: "isCompact" }] : /* istanbul ignore next */ []));
804
- toggleButtonLabel = computed(() => this.resolvedCollapsed() ? 'Expand sidebar' : 'Collapse sidebar', ...(ngDevMode ? [{ debugName: "toggleButtonLabel" }] : /* istanbul ignore next */ []));
805
- constructor() {
806
- // Auto-register items ke service untuk active trail (hanya jika input non-kosong).
807
- effect(() => {
808
- const explicit = this.items();
809
- if (this.autoRegister() && explicit.length > 0)
810
- this.nav.registerItems(this.navigationId(), explicit);
811
- });
812
- // Kelola overlay drawer berdasarkan mobileOpen + isMobile.
813
- effect(() => {
814
- const open = this.nav.mobileOpen();
815
- const mobile = this.isMobile();
816
- if (mobile && open)
817
- this.openDrawer();
818
- else
819
- this.closeDrawer();
820
- });
821
- this.destroyRef.onDestroy(() => this.closeDrawer());
822
- }
823
- hostClasses = computed(() => {
824
- const base = ['relative flex shrink-0 text-foreground', 'transition-[width] duration-200 ease-out'];
825
- if (this.resolvedCollapsed())
826
- base.push('w-16');
827
- else
828
- base.push('[width:17.5rem]');
829
- if (this.borderSource() === 'component') {
830
- if (this.position() === 'right')
831
- base.push('border-l', 'border-primary/30');
832
- else
833
- base.push('border-r', 'border-primary/30');
834
- }
835
- return [...base, this.class()].join(' ');
836
- }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
837
- headerClasses = computed(() => {
838
- const base = ['flex items-center gap-1 border-b border-primary/30'];
839
- if (this.isCompact()) {
840
- base.push('h-12', 'justify-center', 'px-2');
841
- }
842
- else {
843
- base.push('h-12', 'pr-2');
844
- }
845
- return base.join(' ');
846
- }, ...(ngDevMode ? [{ debugName: "headerClasses" }] : /* istanbul ignore next */ []));
847
- headerSlotClasses = computed(() => {
848
- const base = ['min-w-0'];
849
- if (this.isCompact()) {
850
- base.push('flex flex-1 items-center justify-center overflow-hidden', '[&>[sidebar-header]>*]:mx-auto', '[&>[sidebar-header]>*]:w-auto', '[&>[sidebar-header]>*]:max-w-full', '[&>[sidebar-header]>*]:justify-center', '[&>[sidebar-header]>*]:gap-0', '[&>[sidebar-header]>*]:px-0', '[&>[sidebar-header]>*]:shrink-0', '[&>[sidebar-header]>*>*:first-child]:mx-auto', '[&>[sidebar-header]>*>*:nth-child(n+2)]:hidden');
851
- }
852
- else {
853
- base.push('flex min-w-0 flex-1 items-center');
854
- }
855
- return base.join(' ');
856
- }, ...(ngDevMode ? [{ debugName: "headerSlotClasses" }] : /* istanbul ignore next */ []));
857
- navClasses = computed(() => {
858
- const base = ['min-h-full'];
859
- if (this.isCompact()) {
860
- base.push('px-2', '[&_.ui-nav-text]:mx-auto', '[&_.ui-nav-text]:w-10', '[&_.ui-nav-text]:justify-center', '[&_.ui-nav-text]:px-0');
861
- }
862
- return base.join(' ');
863
- }, ...(ngDevMode ? [{ debugName: "navClasses" }] : /* istanbul ignore next */ []));
864
- scrollViewportClasses = computed(() => 'overflow-y-auto overflow-x-hidden scrollbar-thin scrollbar-thumb-primary scrollbar-track-primary/10', ...(ngDevMode ? [{ debugName: "scrollViewportClasses" }] : /* istanbul ignore next */ []));
865
- footerClasses = computed(() => {
866
- const base = ['h-12 border-t border-primary/30'];
867
- if (this.isCompact()) {
868
- base.push('flex items-center justify-center px-2');
869
- }
870
- return base.join(' ');
871
- }, ...(ngDevMode ? [{ debugName: "footerClasses" }] : /* istanbul ignore next */ []));
872
- footerSlotClasses = computed(() => {
873
- const base = ['h-full'];
874
- if (this.isCompact()) {
875
- base.push('flex h-full items-center justify-center overflow-hidden', '[&>[sidebar-footer]>*]:mx-auto', '[&>[sidebar-footer]>*]:w-auto', '[&>[sidebar-footer]>*]:max-w-full', '[&>[sidebar-footer]>*]:justify-center', '[&>[sidebar-footer]>*]:gap-0', '[&>[sidebar-footer]>*]:px-0', '[&>[sidebar-footer]>*>*:first-child]:mx-auto', '[&>[sidebar-footer]>*>*:nth-child(n+2)]:hidden');
876
- }
877
- else {
878
- base.push('w-full');
879
- }
880
- return base.join(' ');
881
- }, ...(ngDevMode ? [{ debugName: "footerSlotClasses" }] : /* istanbul ignore next */ []));
882
- innerClasses = computed(() => {
883
- const overlayActive = this.resolvedCollapsed() && this.hoverActive();
884
- const base = ['flex h-full flex-col transition-[width] duration-200 ease-out'];
885
- if (this.resolvedCollapsed()) {
886
- base.push('bg-background');
887
- }
888
- if (overlayActive) {
889
- base.push('absolute inset-y-0 z-30 border-l border-r border-primary/30 shadow-xl [width:17.5rem]', this.position() === 'right' ? 'right-0' : 'left-0');
890
- }
891
- else {
892
- base.push('w-full');
893
- }
894
- return base.join(' ');
895
- }, ...(ngDevMode ? [{ debugName: "innerClasses" }] : /* istanbul ignore next */ []));
896
- onHoverEnter() {
897
- if (!this.resolvedCollapsed() || this.isMobile() || this.suppressHoverUntilLeave())
898
- return;
899
- this.hovered.set(true);
900
- }
901
- onHoverLeave() {
902
- this.suppressHoverUntilLeave.set(false);
903
- if (this.resolvedCollapsed())
904
- this.hovered.set(false);
905
- }
906
- toggleAppearance(event) {
907
- event.stopPropagation();
908
- const nextCollapsed = !this.resolvedCollapsed();
909
- this.nav.setCollapsed(nextCollapsed);
910
- this.hovered.set(false);
911
- this.suppressHoverUntilLeave.set(nextCollapsed);
912
- }
913
- /** Touch fallback: tap pada strip thin (ketika belum expanded) untuk expand. */
914
- onHostClick(event) {
915
- if (!this.resolvedCollapsed() || this.isMobile())
916
- return;
917
- if (this.hovered())
918
- return;
919
- const target = event.target;
920
- // Biarkan klik pada control interaktif terus propagate (tidak intercept).
921
- if (target && target.closest('a,button,[role="menuitem"]'))
922
- return;
923
- this.hovered.set(true);
924
- }
925
- openDrawer() {
926
- if (this.drawerRef)
927
- return;
928
- const side = this.position();
929
- const pos = this.overlay.position().global().top('0');
930
- if (side === 'right')
931
- pos.right('0');
932
- else
933
- pos.left('0');
934
- this.drawerRef = this.overlay.create({
935
- positionStrategy: pos,
936
- height: '100vh',
937
- hasBackdrop: true,
938
- backdropClass: 'cdk-overlay-dark-backdrop',
939
- scrollStrategy: this.overlay.scrollStrategies.block(),
940
- panelClass: ['sidebar-drawer'],
941
- });
942
- const portal = new TemplatePortal(this.drawerTpl(), this.vcr);
943
- const viewRef = this.drawerRef.attach(portal);
944
- viewRef.detectChanges();
945
- const root = this.drawerRef.overlayElement;
946
- this.focusTrap = this.focusTrapFactory.create(root);
947
- this.previouslyFocused = this.doc.activeElement;
948
- queueMicrotask(() => this.focusTrap?.focusInitialElementWhenReady());
949
- this.drawerRef
950
- .backdropClick()
951
- .pipe(takeUntilDestroyed(this.destroyRef))
952
- .subscribe(() => this.nav.closeMobile());
953
- this.drawerRef
954
- .keydownEvents()
955
- .pipe(filter((e) => e.key === 'Escape'), takeUntilDestroyed(this.destroyRef))
956
- .subscribe(() => this.nav.closeMobile());
957
- }
958
- closeDrawer() {
959
- if (!this.drawerRef)
960
- return;
961
- this.focusTrap?.destroy();
962
- this.focusTrap = null;
963
- this.drawerRef.dispose();
964
- this.drawerRef = null;
965
- this.previouslyFocused?.focus?.();
966
- this.previouslyFocused = null;
967
- }
968
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
969
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: SidebarComponent, isStandalone: true, selector: "sidebar", 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 }, borderSource: { classPropertyName: "borderSource", publicName: "borderSource", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, autoMobile: { classPropertyName: "autoMobile", publicName: "autoMobile", isSignal: true, isRequired: false, transformFunction: null }, autoRegister: { classPropertyName: "autoRegister", publicName: "autoRegister", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, listeners: { "mouseenter": "onHoverEnter()", "mouseleave": "onHoverLeave()", "focusin": "onHoverEnter()", "click": "onHostClick($event)" }, properties: { "attr.aria-label": "ariaLabel()", "class": "hostClasses()", "attr.data-appearance": "resolvedAppearance()", "attr.data-position": "position()", "attr.data-expanded": "isExpanded()", "hidden": "isMobile()" } }, viewQueries: [{ propertyName: "drawerTpl", first: true, predicate: ["drawerTpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
970
- <div [class]="innerClasses()">
971
- <ng-container [ngTemplateOutlet]="body" />
972
- </div>
973
-
974
- <ng-template #body>
975
- @if (header()) {
976
- <div [class]="headerClasses()">
977
- <div [class]="headerSlotClasses()">
978
- <ng-content select="[sidebar-header]" />
979
- </div>
980
- @if (!isMobile() && !isCompact()) {
981
- <button
982
- type="button"
983
- data-sidebar-toggle
984
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
985
- [attr.aria-label]="toggleButtonLabel()"
986
- [attr.title]="toggleButtonLabel()"
987
- [attr.aria-pressed]="resolvedAppearance() === 'thin'"
988
- (click)="toggleAppearance($event)">
989
- <ui-nav-icon name="view_sidebar" [size]="18" class="text-current" />
990
- </button>
991
- }
992
- </div>
993
- }
994
- <ui-scroll-area class="min-h-0 flex-1" [viewportClass]="scrollViewportClasses()">
995
- <nav [class]="navClasses()">
996
- @for (item of resolvedItems(); track item.id) {
997
- <ui-nav-item [item]="item" [compact]="isCompact()" />
998
- }
999
- </nav>
1000
- </ui-scroll-area>
1001
- <div [class]="footerClasses()">
1002
- <div [class]="footerSlotClasses()">
1003
- <ng-content select="[sidebar-footer]" />
1004
- </div>
1005
- </div>
1006
- </ng-template>
1007
-
1008
- <ng-template #drawerTpl>
1009
- <div
1010
- role="dialog"
1011
- aria-modal="true"
1012
- [attr.aria-label]="ariaLabel()"
1013
- class="flex h-full w-72 max-w-[85vw] flex-col border-primary/30 text-foreground shadow-xl"
1014
- [class.border-r]="position() === 'left'"
1015
- [class.border-l]="position() === 'right'"
1016
- [class.border-primary/30]="position() === 'left' || position() === 'right'">
1017
- <ng-container [ngTemplateOutlet]="body" />
1018
- </div>
1019
- </ng-template>
1020
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ScrollAreaComponent, selector: "ui-scroll-area", inputs: ["class", "viewportClass", "viewportAriaLabel", "viewportTabIndex"] }, { 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 });
1021
- }
1022
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SidebarComponent, decorators: [{
1023
- type: Component,
1024
- args: [{
1025
- selector: 'sidebar',
1026
- changeDetection: ChangeDetectionStrategy.OnPush,
1027
- imports: [NgTemplateOutlet, ScrollAreaComponent, UiNavIconComponent, UiNavItemComponent],
1028
- host: {
1029
- role: 'navigation',
1030
- '[attr.aria-label]': 'ariaLabel()',
1031
- '[class]': 'hostClasses()',
1032
- '[attr.data-appearance]': 'resolvedAppearance()',
1033
- '[attr.data-position]': 'position()',
1034
- '[attr.data-expanded]': 'isExpanded()',
1035
- '[hidden]': 'isMobile()',
1036
- '(mouseenter)': 'onHoverEnter()',
1037
- '(mouseleave)': 'onHoverLeave()',
1038
- '(focusin)': 'onHoverEnter()',
1039
- '(click)': 'onHostClick($event)',
1040
- },
1041
- template: `
1042
- <div [class]="innerClasses()">
1043
- <ng-container [ngTemplateOutlet]="body" />
1044
- </div>
1045
-
1046
- <ng-template #body>
1047
- @if (header()) {
1048
- <div [class]="headerClasses()">
1049
- <div [class]="headerSlotClasses()">
1050
- <ng-content select="[sidebar-header]" />
1051
- </div>
1052
- @if (!isMobile() && !isCompact()) {
1053
- <button
1054
- type="button"
1055
- data-sidebar-toggle
1056
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
1057
- [attr.aria-label]="toggleButtonLabel()"
1058
- [attr.title]="toggleButtonLabel()"
1059
- [attr.aria-pressed]="resolvedAppearance() === 'thin'"
1060
- (click)="toggleAppearance($event)">
1061
- <ui-nav-icon name="view_sidebar" [size]="18" class="text-current" />
1062
- </button>
1063
- }
1064
- </div>
1065
- }
1066
- <ui-scroll-area class="min-h-0 flex-1" [viewportClass]="scrollViewportClasses()">
1067
- <nav [class]="navClasses()">
1068
- @for (item of resolvedItems(); track item.id) {
1069
- <ui-nav-item [item]="item" [compact]="isCompact()" />
1070
- }
1071
- </nav>
1072
- </ui-scroll-area>
1073
- <div [class]="footerClasses()">
1074
- <div [class]="footerSlotClasses()">
1075
- <ng-content select="[sidebar-footer]" />
1076
- </div>
1077
- </div>
1078
- </ng-template>
1079
-
1080
- <ng-template #drawerTpl>
1081
- <div
1082
- role="dialog"
1083
- aria-modal="true"
1084
- [attr.aria-label]="ariaLabel()"
1085
- class="flex h-full w-72 max-w-[85vw] flex-col border-primary/30 text-foreground shadow-xl"
1086
- [class.border-r]="position() === 'left'"
1087
- [class.border-l]="position() === 'right'"
1088
- [class.border-primary/30]="position() === 'left' || position() === 'right'">
1089
- <ng-container [ngTemplateOutlet]="body" />
1090
- </div>
1091
- </ng-template>
1092
- `,
1093
- }]
1094
- }], 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 }] }], borderSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderSource", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], autoMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoMobile", required: false }] }], autoRegister: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoRegister", required: false }] }], drawerTpl: [{ type: i0.ViewChild, args: ['drawerTpl', { isSignal: true }] }] } });
1095
-
1096
- /**
1097
- * Horizontal navigation (topbar) — shadcn-styled.
1098
- */
1099
- class TopbarComponent {
1100
- nav = inject(NavigationService);
1101
- overlay = inject(Overlay);
1102
- vcr = inject(ViewContainerRef);
1103
- host = inject(ElementRef);
1104
- destroyRef = inject(DestroyRef);
1105
- items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1106
- /** Registry key di `NavigationService`. Default `'main'`. */
1107
- navigationId = input(DEFAULT_NAVIGATION_ID, ...(ngDevMode ? [{ debugName: "navigationId" }] : /* istanbul ignore next */ []));
1108
- appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
1109
- ariaLabel = input('Primary', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
1110
- class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
1111
- /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */
1112
- autoRegister = input(true, ...(ngDevMode ? [{ debugName: "autoRegister" }] : /* istanbul ignore next */ []));
1113
- /** Tampilkan hamburger di `< md` yang men-toggle mobile drawer sidebar. */
1114
- showHamburger = input(true, ...(ngDevMode ? [{ debugName: "showHamburger" }] : /* istanbul ignore next */ []));
1115
- hamburgerLabel = input('Open navigation', ...(ngDevMode ? [{ debugName: "hamburgerLabel" }] : /* istanbul ignore next */ []));
1116
- /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */
1117
- resolvedItems = computed(() => {
1118
- const explicit = this.items();
1119
- return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();
1120
- }, ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
1121
- openId = signal(null, ...(ngDevMode ? [{ debugName: "openId" }] : /* istanbul ignore next */ []));
1122
- active = null;
1123
- dropdownTpl = viewChild.required('dropdownTpl');
1124
- constructor() {
1125
- effect(() => {
1126
- const explicit = this.items();
1127
- if (this.autoRegister() && explicit.length > 0)
1128
- this.nav.registerItems(this.navigationId(), explicit);
1129
- });
1130
- this.destroyRef.onDestroy(() => this.closeAll());
1131
- }
1132
- hostClasses = computed(() => {
1133
- return ['sticky top-0 z-20 flex h-11 w-full items-center', this.class()].join(' ');
1134
- }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1135
- endSlotClasses = computed(() => {
1136
- const base = ['flex h-full shrink-0 items-center justify-end gap-2 overflow-hidden'];
1137
- 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');
1138
- return base.join(' ');
1139
- }, ...(ngDevMode ? [{ debugName: "endSlotClasses" }] : /* istanbul ignore next */ []));
1140
- asBasic(i) {
1141
- return i;
1142
- }
1143
- asCollapsable(i) {
1144
- return i;
1145
- }
1146
- asGroup(i) {
1147
- return i;
1148
- }
1149
- isItemActive(id) {
1150
- return this.nav.isActive(id);
1151
- }
1152
- toggleDropdown(trigger, item) {
1153
- if (this.openId() === item.id)
1154
- this.closeAll();
1155
- else
1156
- this.openDropdown(trigger, item);
1157
- }
1158
- openDropdown(trigger, item) {
1159
- if (this.openId() === item.id)
1160
- return;
1161
- this.closeAll();
1162
- this.attach(trigger, item, this.dropdownTpl());
1163
- }
1164
- attach(trigger, item, tpl) {
1165
- const strategy = this.overlay
1166
- .position()
1167
- .flexibleConnectedTo(trigger)
1168
- .withFlexibleDimensions(false)
1169
- .withPush(false)
1170
- .withPositions([
1171
- {
1172
- originX: 'start',
1173
- originY: 'bottom',
1174
- overlayX: 'start',
1175
- overlayY: 'top',
1176
- offsetY: 4,
1177
- },
1178
- {
1179
- originX: 'start',
1180
- originY: 'top',
1181
- overlayX: 'start',
1182
- overlayY: 'bottom',
1183
- offsetY: -4,
1184
- },
1185
- ]);
1186
- const ref = this.overlay.create({
1187
- positionStrategy: strategy,
1188
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
1189
- hasBackdrop: true,
1190
- backdropClass: 'cdk-overlay-transparent-backdrop',
1191
- panelClass: ['ui-dropdown-panel'],
1192
- });
1193
- const portal = new TemplatePortal(tpl, this.vcr, { $implicit: item });
1194
- ref.attach(portal);
1195
- this.active = { ref, id: item.id ?? '' };
1196
- this.openId.set(item.id ?? null);
1197
- merge(ref.backdropClick(), ref.keydownEvents().pipe(filter((e) => e.key === 'Escape')))
1198
- .pipe(takeUntilDestroyed(this.destroyRef))
1199
- .subscribe(() => {
1200
- this.closeAll();
1201
- trigger.focus();
1202
- });
1203
- }
1204
- closeAll() {
1205
- if (this.active) {
1206
- this.active.ref.dispose();
1207
- this.active = null;
1208
- }
1209
- this.openId.set(null);
1210
- }
1211
- /** Menubar keyboard navigation: ArrowLeft/Right antar trigger, Home/End, ArrowDown fokus panel. */
1212
- onMenubarKeydown(event) {
1213
- const key = event.key;
1214
- const root = this.host.nativeElement;
1215
- const triggers = Array.from(root.querySelectorAll('ul[role="menubar"] [role="menuitem"]')).filter((el) => !el.hasAttribute('disabled'));
1216
- if (triggers.length === 0)
1217
- return;
1218
- const currentIndex = triggers.indexOf(document.activeElement);
1219
- if (key === 'ArrowDown' && currentIndex !== -1) {
1220
- event.preventDefault();
1221
- // Jika open, fokus item pertama panel; jika belum, focus tetap (panel akan dibuka via click/mouseenter).
1222
- queueMicrotask(() => this.focusFirstInPanel());
1223
- return;
1224
- }
1225
- if (key !== 'ArrowLeft' && key !== 'ArrowRight' && key !== 'Home' && key !== 'End')
1226
- return;
1227
- let nextIndex = currentIndex;
1228
- if (key === 'ArrowRight')
1229
- nextIndex = (currentIndex + 1 + triggers.length) % triggers.length;
1230
- else if (key === 'ArrowLeft')
1231
- nextIndex = (currentIndex - 1 + triggers.length) % triggers.length;
1232
- else if (key === 'Home')
1233
- nextIndex = 0;
1234
- else if (key === 'End')
1235
- nextIndex = triggers.length - 1;
1236
- if (nextIndex !== currentIndex && triggers[nextIndex]) {
1237
- event.preventDefault();
1238
- triggers[nextIndex].focus();
1239
- }
1240
- }
1241
- /** Arrow-key navigation dalam dropdown panel. */
1242
- onPanelKeydown(event) {
1243
- const key = event.key;
1244
- if (key !== 'ArrowDown' &&
1245
- key !== 'ArrowUp' &&
1246
- key !== 'ArrowLeft' &&
1247
- key !== 'ArrowRight' &&
1248
- key !== 'Home' &&
1249
- key !== 'End')
1250
- return;
1251
- const panel = this.active?.ref.overlayElement;
1252
- if (!panel)
1253
- return;
1254
- const items = this.collectPanelFocusables(panel);
1255
- if (items.length === 0)
1256
- return;
1257
- const currentIndex = items.indexOf(document.activeElement);
1258
- let nextIndex = currentIndex;
1259
- if (key === 'ArrowDown' || key === 'ArrowRight')
1260
- nextIndex = (currentIndex + 1 + items.length) % items.length;
1261
- else if (key === 'ArrowUp' || key === 'ArrowLeft')
1262
- nextIndex = (currentIndex - 1 + items.length) % items.length;
1263
- else if (key === 'Home')
1264
- nextIndex = 0;
1265
- else if (key === 'End')
1266
- nextIndex = items.length - 1;
1267
- if (nextIndex !== currentIndex && items[nextIndex]) {
1268
- event.preventDefault();
1269
- items[nextIndex].focus();
1270
- }
1271
- }
1272
- collectPanelFocusables(root) {
1273
- return Array.from(root.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter((el) => el.offsetParent !== null || el.getClientRects().length > 0);
1274
- }
1275
- focusFirstInPanel() {
1276
- const panel = this.active?.ref.overlayElement;
1277
- if (!panel)
1278
- return;
1279
- const items = this.collectPanelFocusables(panel);
1280
- items[0]?.focus();
1281
- }
1282
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1283
- 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: `
1284
- <div class="flex h-full w-full items-center gap-3 px-1">
1285
- <div data-topbar-slot="start" class="flex shrink-0 items-center gap-2">
1286
- @if (showHamburger()) {
1287
- <button
1288
- type="button"
1289
- 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"
1290
- [attr.aria-label]="hamburgerLabel()"
1291
- [attr.aria-expanded]="nav.mobileOpen()"
1292
- (click)="nav.toggleMobile()">
1293
- <ui-nav-icon name="menu" [size]="18" />
1294
- </button>
1295
- }
1296
- <ng-content select="[topbar-start]" />
1297
- </div>
1298
-
1299
- <div data-topbar-slot="nav" class="flex min-w-0 flex-1 items-center justify-center">
1300
- <ul
1301
- class="flex min-w-0 flex-1 items-center justify-center gap-1"
1302
- role="menubar"
1303
- (keydown)="onMenubarKeydown($event)">
1304
- @for (item of resolvedItems(); track item.id) {
1305
- <li role="none" class="relative">
1306
- @switch (item.type) {
1307
- @case ('basic') {
1308
- @let basic = asBasic(item);
1309
- <a
1310
- role="menuitem"
1311
- 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"
1312
- [routerLink]="basic.link"
1313
- routerLinkActive
1314
- #rla="routerLinkActive"
1315
- [class.text-primary]="rla.isActive"
1316
- [attr.aria-current]="rla.isActive ? 'page' : null"
1317
- [target]="basic.target ?? undefined">
1318
- @if (basic.icon) {
1319
- <ui-nav-icon [name]="basic.icon" [size]="18" />
1320
- }
1321
- <span>{{ basic.title }}</span>
1322
- </a>
1323
- }
1324
- @case ('collapsable') {
1325
- @let col = asCollapsable(item);
1326
- <button
1327
- #trigger
1328
- type="button"
1329
- role="menuitem"
1330
- 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"
1331
- [class.text-primary]="isItemActive(col.id)"
1332
- [attr.aria-expanded]="openId() === col.id"
1333
- [attr.aria-haspopup]="'menu'"
1334
- (click)="toggleDropdown(trigger, item)"
1335
- (mouseenter)="openDropdown(trigger, item)">
1336
- @if (col.icon) {
1337
- <ui-nav-icon [name]="col.icon" [size]="18" />
1338
- }
1339
- <span>{{ col.title }}</span>
1340
- <ui-nav-icon name="expand_more" [size]="18" />
1341
- </button>
1342
- }
1343
- @case ('group') {
1344
- @let group = asGroup(item);
1345
- <button
1346
- #trigger
1347
- type="button"
1348
- role="menuitem"
1349
- 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"
1350
- [class.text-primary]="isItemActive(group.id)"
1351
- [attr.aria-expanded]="openId() === group.id"
1352
- [attr.aria-haspopup]="'menu'"
1353
- (click)="toggleDropdown(trigger, item)"
1354
- (mouseenter)="openDropdown(trigger, item)">
1355
- @if (group.icon) {
1356
- <ui-nav-icon [name]="group.icon" [size]="18" />
1357
- }
1358
- <span>{{ group.title }}</span>
1359
- <ui-nav-icon name="expand_more" [size]="18" />
1360
- </button>
1361
- }
1362
- @default {
1363
- <span class="ui-nav-heading px-3 py-2 text-muted-foreground">
1364
- {{ item.title }}
1365
- </span>
1366
- }
1367
- }
1368
- </li>
1369
- }
1370
- </ul>
1371
- </div>
1372
-
1373
- <div data-topbar-slot="end" [class]="endSlotClasses()">
1374
- <ng-content select="[topbar-end]" />
1375
- </div>
1376
- </div>
1377
-
1378
- <!-- Dropdown template -->
1379
- <ng-template #dropdownTpl let-item>
1380
- <div role="menu" class="min-w-56 border border-brand bg-background/95 p-1" (keydown)="onPanelKeydown($event)">
1381
- @for (child of item.children; track child.id) {
1382
- <ui-nav-item [item]="child" />
1383
- }
1384
- </div>
1385
- </ng-template>
1386
- `, 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 });
1387
- }
1388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TopbarComponent, decorators: [{
1389
- type: Component,
1390
- args: [{
1391
- selector: 'topbar',
1392
- changeDetection: ChangeDetectionStrategy.OnPush,
1393
- imports: [RouterLink, RouterLinkActive, UiNavIconComponent, UiNavItemComponent],
1394
- host: {
1395
- role: 'navigation',
1396
- '[attr.aria-label]': 'ariaLabel()',
1397
- '[class]': 'hostClasses()',
1398
- '[attr.data-appearance]': 'appearance()',
1399
- },
1400
- template: `
1401
- <div class="flex h-full w-full items-center gap-3 px-1">
1402
- <div data-topbar-slot="start" class="flex shrink-0 items-center gap-2">
1403
- @if (showHamburger()) {
1404
- <button
1405
- type="button"
1406
- 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"
1407
- [attr.aria-label]="hamburgerLabel()"
1408
- [attr.aria-expanded]="nav.mobileOpen()"
1409
- (click)="nav.toggleMobile()">
1410
- <ui-nav-icon name="menu" [size]="18" />
1411
- </button>
1412
- }
1413
- <ng-content select="[topbar-start]" />
1414
- </div>
1415
-
1416
- <div data-topbar-slot="nav" class="flex min-w-0 flex-1 items-center justify-center">
1417
- <ul
1418
- class="flex min-w-0 flex-1 items-center justify-center gap-1"
1419
- role="menubar"
1420
- (keydown)="onMenubarKeydown($event)">
1421
- @for (item of resolvedItems(); track item.id) {
1422
- <li role="none" class="relative">
1423
- @switch (item.type) {
1424
- @case ('basic') {
1425
- @let basic = asBasic(item);
1426
- <a
1427
- role="menuitem"
1428
- 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"
1429
- [routerLink]="basic.link"
1430
- routerLinkActive
1431
- #rla="routerLinkActive"
1432
- [class.text-primary]="rla.isActive"
1433
- [attr.aria-current]="rla.isActive ? 'page' : null"
1434
- [target]="basic.target ?? undefined">
1435
- @if (basic.icon) {
1436
- <ui-nav-icon [name]="basic.icon" [size]="18" />
1437
- }
1438
- <span>{{ basic.title }}</span>
1439
- </a>
1440
- }
1441
- @case ('collapsable') {
1442
- @let col = asCollapsable(item);
1443
- <button
1444
- #trigger
1445
- type="button"
1446
- role="menuitem"
1447
- 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"
1448
- [class.text-primary]="isItemActive(col.id)"
1449
- [attr.aria-expanded]="openId() === col.id"
1450
- [attr.aria-haspopup]="'menu'"
1451
- (click)="toggleDropdown(trigger, item)"
1452
- (mouseenter)="openDropdown(trigger, item)">
1453
- @if (col.icon) {
1454
- <ui-nav-icon [name]="col.icon" [size]="18" />
1455
- }
1456
- <span>{{ col.title }}</span>
1457
- <ui-nav-icon name="expand_more" [size]="18" />
1458
- </button>
1459
- }
1460
- @case ('group') {
1461
- @let group = asGroup(item);
1462
- <button
1463
- #trigger
1464
- type="button"
1465
- role="menuitem"
1466
- 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"
1467
- [class.text-primary]="isItemActive(group.id)"
1468
- [attr.aria-expanded]="openId() === group.id"
1469
- [attr.aria-haspopup]="'menu'"
1470
- (click)="toggleDropdown(trigger, item)"
1471
- (mouseenter)="openDropdown(trigger, item)">
1472
- @if (group.icon) {
1473
- <ui-nav-icon [name]="group.icon" [size]="18" />
1474
- }
1475
- <span>{{ group.title }}</span>
1476
- <ui-nav-icon name="expand_more" [size]="18" />
1477
- </button>
1478
- }
1479
- @default {
1480
- <span class="ui-nav-heading px-3 py-2 text-muted-foreground">
1481
- {{ item.title }}
1482
- </span>
1483
- }
1484
- }
1485
- </li>
1486
- }
1487
- </ul>
1488
- </div>
1489
-
1490
- <div data-topbar-slot="end" [class]="endSlotClasses()">
1491
- <ng-content select="[topbar-end]" />
1492
- </div>
1493
- </div>
1494
-
1495
- <!-- Dropdown template -->
1496
- <ng-template #dropdownTpl let-item>
1497
- <div role="menu" class="min-w-56 border border-brand bg-background/95 p-1" (keydown)="onPanelKeydown($event)">
1498
- @for (child of item.children; track child.id) {
1499
- <ui-nav-item [item]="child" />
1500
- }
1501
- </div>
1502
- </ng-template>
1503
- `,
1504
- }]
1505
- }], 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 }] }] } });
1506
-
1507
- const DemoNavigationData = [
1508
- {
1509
- id: 'documentation',
1510
- title: 'Documentation',
1511
- subtitle: 'Guides and getting started resources',
1512
- type: 'group',
1513
- icon: 'menu_book',
1514
- children: [
1515
- {
1516
- id: 'documentation-introduction',
1517
- title: 'Introduction',
1518
- type: 'basic',
1519
- icon: 'menu_book',
1520
- link: '/docs/introduction',
1521
- },
1522
- {
1523
- id: 'documentation-installation',
1524
- title: 'Installation',
1525
- type: 'basic',
1526
- icon: 'download',
1527
- link: '/docs/installation',
1528
- },
1529
- {
1530
- id: 'documentation-getting-started',
1531
- title: 'Getting started',
1532
- type: 'basic',
1533
- icon: 'rocket_launch',
1534
- link: '/docs/getting-started',
1535
- },
1536
- {
1537
- id: 'documentation-upgrade-guide',
1538
- title: 'Upgrade Guide',
1539
- type: 'basic',
1540
- icon: 'arrow_circle_up',
1541
- link: '/docs/upgrade-guide',
1542
- },
1543
- {
1544
- id: 'documentation-changelog',
1545
- title: 'Changelog',
1546
- type: 'basic',
1547
- icon: 'history',
1548
- link: '/docs/changelog',
1549
- },
1550
- {
1551
- id: 'documentation-icon-lucide',
1552
- title: 'Lucide Icons',
1553
- type: 'basic',
1554
- icon: 'star',
1555
- link: '/lucide-icons',
1556
- badge: {
1557
- title: 'Demo',
1558
- classes: 'ml-2 px-2 py-0.5 rounded-full text-xs bg-blue-500 text-white',
1559
- },
1560
- },
1561
- ],
1562
- },
1563
- {
1564
- id: 'user-interface',
1565
- title: 'User Interface',
1566
- subtitle: 'Components and design elements',
1567
- type: 'group',
1568
- icon: 'dashboard',
1569
- children: [
1570
- {
1571
- id: 'user-interface-material-components',
1572
- title: 'Material Components',
1573
- type: 'collapsable',
1574
- icon: 'deployed_code',
1575
- children: [
1576
- {
1577
- id: 'user-interface-material-components-inputs-forms',
1578
- title: 'Inputs & Forms',
1579
- type: 'collapsable',
1580
- icon: 'input',
1581
- children: [
1582
- {
1583
- id: 'user-interface-material-components-inputs-forms-autocomplete',
1584
- title: 'Autocomplete',
1585
- type: 'basic',
1586
- icon: 'search',
1587
- link: '/ui/material/autocomplete',
1588
- },
1589
- {
1590
- id: 'user-interface-material-components-inputs-forms-checkbox',
1591
- title: 'Checkbox',
1592
- type: 'basic',
1593
- icon: 'check_box',
1594
- link: '/ui/material/checkbox',
1595
- },
1596
- {
1597
- id: 'user-interface-material-components-inputs-forms-datepicker',
1598
- title: 'Datepicker',
1599
- type: 'basic',
1600
- icon: 'calendar_today',
1601
- link: '/ui/material/datepicker',
1602
- },
1603
- {
1604
- id: 'user-interface-material-components-inputs-forms-form-field',
1605
- title: 'Form field',
1606
- type: 'basic',
1607
- icon: 'text_fields',
1608
- link: '/ui/material/form-field',
1609
- },
1610
- {
1611
- id: 'user-interface-material-components-inputs-forms-input',
1612
- title: 'Input',
1613
- type: 'basic',
1614
- icon: 'text_fields',
1615
- link: '/ui/material/input',
1616
- },
1617
- {
1618
- id: 'user-interface-material-components-inputs-forms-radio-button',
1619
- title: 'Radio button',
1620
- type: 'basic',
1621
- icon: 'radio_button_checked',
1622
- link: '/ui/material/radio',
1623
- },
1624
- {
1625
- id: 'user-interface-material-components-inputs-forms-select',
1626
- title: 'Select',
1627
- type: 'basic',
1628
- icon: 'expand_more',
1629
- link: '/ui/material/select',
1630
- },
1631
- {
1632
- id: 'user-interface-material-components-inputs-forms-slider',
1633
- title: 'Slider',
1634
- type: 'basic',
1635
- icon: 'tune',
1636
- link: '/ui/material/slider',
1637
- },
1638
- {
1639
- id: 'user-interface-material-components-inputs-forms-slide-toggle',
1640
- title: 'Slide toggle',
1641
- type: 'basic',
1642
- icon: 'toggle_on',
1643
- link: '/ui/material/slide-toggle',
1644
- },
1645
- ],
1646
- },
1647
- {
1648
- id: 'user-interface-material-components-buttons-actions',
1649
- title: 'Buttons & Actions',
1650
- type: 'collapsable',
1651
- icon: 'ads_click',
1652
- children: [
1653
- {
1654
- id: 'user-interface-material-components-buttons-actions-button',
1655
- title: 'Button',
1656
- type: 'basic',
1657
- icon: 'crop_square',
1658
- link: '/ui/material/button',
1659
- },
1660
- {
1661
- id: 'user-interface-material-components-buttons-actions-button-toggle',
1662
- title: 'Button toggle',
1663
- type: 'basic',
1664
- icon: 'view_column',
1665
- link: '/ui/material/button-toggle',
1666
- },
1667
- {
1668
- id: 'user-interface-material-components-buttons-actions-chips',
1669
- title: 'Chips',
1670
- type: 'basic',
1671
- icon: 'label',
1672
- link: '/ui/material/chips',
1673
- badge: {
1674
- title: 'New',
1675
- classes: 'ml-2 px-2 py-0.5 rounded-full text-xs bg-green-500 text-white',
1676
- },
1677
- },
1678
- {
1679
- id: 'user-interface-material-components-buttons-actions-menu',
1680
- title: 'Menu',
1681
- type: 'basic',
1682
- icon: 'menu',
1683
- link: '/ui/material/menu',
1684
- },
1685
- {
1686
- id: 'user-interface-material-components-buttons-actions-ripples',
1687
- title: 'Ripples',
1688
- type: 'basic',
1689
- icon: 'waves',
1690
- link: '/ui/material/ripples',
1691
- },
1692
- ],
1693
- },
1694
- {
1695
- id: 'user-interface-material-components-layout-containers',
1696
- title: 'Layout & Containers',
1697
- type: 'collapsable',
1698
- icon: 'dashboard',
1699
- children: [
1700
- {
1701
- id: 'user-interface-material-components-layout-containers-card',
1702
- title: 'Card',
1703
- type: 'basic',
1704
- icon: 'credit_card',
1705
- link: '/ui/material/card',
1706
- },
1707
- {
1708
- id: 'user-interface-material-components-layout-containers-divider',
1709
- title: 'Divider',
1710
- type: 'basic',
1711
- icon: 'remove',
1712
- link: '/ui/material/divider',
1713
- },
1714
- {
1715
- id: 'user-interface-material-components-layout-containers-expansion-panel',
1716
- title: 'Expansion Panel',
1717
- type: 'basic',
1718
- icon: 'expand_more',
1719
- link: '/ui/material/expansion',
1720
- },
1721
- {
1722
- id: 'user-interface-material-components-layout-containers-grid-list',
1723
- title: 'Grid list',
1724
- type: 'basic',
1725
- icon: 'grid_view',
1726
- link: '/ui/material/grid-list',
1727
- },
1728
- {
1729
- id: 'user-interface-material-components-layout-containers-list',
1730
- title: 'List',
1731
- type: 'basic',
1732
- icon: 'list',
1733
- link: '/ui/material/list',
1734
- },
1735
- {
1736
- id: 'user-interface-material-components-layout-containers-sidenav',
1737
- title: 'Sidenav',
1738
- type: 'basic',
1739
- icon: 'view_sidebar',
1740
- link: '/ui/material/sidenav',
1741
- },
1742
- {
1743
- id: 'user-interface-material-components-layout-containers-tabs',
1744
- title: 'Tabs',
1745
- type: 'basic',
1746
- icon: 'tab',
1747
- link: '/ui/material/tabs',
1748
- },
1749
- {
1750
- id: 'user-interface-material-components-layout-containers-toolbar',
1751
- title: 'Toolbar',
1752
- type: 'basic',
1753
- icon: 'build',
1754
- link: '/ui/material/toolbar',
1755
- },
1756
- ],
1757
- },
1758
- {
1759
- id: 'user-interface-material-components-data-display',
1760
- title: 'Data & Display',
1761
- type: 'collapsable',
1762
- icon: 'bar_chart',
1763
- children: [
1764
- {
1765
- id: 'user-interface-material-components-data-display-badge',
1766
- title: 'Badge',
1767
- type: 'basic',
1768
- icon: 'verified',
1769
- link: '/ui/material/badge',
1770
- },
1771
- {
1772
- id: 'user-interface-material-components-data-display-icon',
1773
- title: 'Icon',
1774
- type: 'basic',
1775
- icon: 'star',
1776
- link: '/ui/material/icon',
1777
- },
1778
- {
1779
- id: 'user-interface-material-components-data-display-paginator',
1780
- title: 'Paginator',
1781
- type: 'basic',
1782
- icon: 'first_page',
1783
- link: '/ui/material/paginator',
1784
- },
1785
- {
1786
- id: 'user-interface-material-components-data-display-progress-bar',
1787
- title: 'Progress bar',
1788
- type: 'basic',
1789
- icon: 'hourglass_empty',
1790
- link: '/ui/material/progress-bar',
1791
- },
1792
- {
1793
- id: 'user-interface-material-components-data-display-progress-spinner',
1794
- title: 'Progress spinner',
1795
- type: 'basic',
1796
- icon: 'progress_activity',
1797
- link: '/ui/material/progress-spinner',
1798
- },
1799
- {
1800
- id: 'user-interface-material-components-data-display-sort',
1801
- title: 'Sort header',
1802
- type: 'basic',
1803
- icon: 'swap_vert',
1804
- link: '/ui/material/sort',
1805
- },
1806
- {
1807
- id: 'user-interface-material-components-data-display-table',
1808
- title: 'Table',
1809
- type: 'basic',
1810
- icon: 'table_chart',
1811
- link: '/ui/material/table',
1812
- },
1813
- {
1814
- id: 'user-interface-material-components-data-display-tree',
1815
- title: 'Tree',
1816
- type: 'basic',
1817
- icon: 'hub',
1818
- link: '/ui/material/tree',
1819
- },
1820
- ],
1821
- },
1822
- {
1823
- id: 'user-interface-material-components-overlays-modals',
1824
- title: 'Overlays & Modals',
1825
- type: 'collapsable',
1826
- icon: 'layers',
1827
- children: [
1828
- {
1829
- id: 'user-interface-material-components-overlays-modals-bottom-sheet',
1830
- title: 'Bottom Sheet',
1831
- type: 'basic',
1832
- icon: 'south',
1833
- link: '/ui/material/bottom-sheet',
1834
- },
1835
- {
1836
- id: 'user-interface-material-components-overlays-modals-dialog',
1837
- title: 'Dialog',
1838
- type: 'basic',
1839
- icon: 'chat',
1840
- link: '/ui/material/dialog',
1841
- },
1842
- {
1843
- id: 'user-interface-material-components-overlays-modals-snack-bar',
1844
- title: 'Snack-bar',
1845
- type: 'basic',
1846
- icon: 'notifications',
1847
- link: '/ui/material/snack-bar',
1848
- },
1849
- {
1850
- id: 'user-interface-material-components-overlays-modals-tooltip',
1851
- title: 'Tooltip',
1852
- type: 'basic',
1853
- icon: 'help',
1854
- link: '/ui/material/tooltip',
1855
- },
1856
- ],
1857
- },
1858
- {
1859
- id: 'user-interface-material-components-navigation-stepper',
1860
- title: 'Navigation & Steps',
1861
- type: 'collapsable',
1862
- icon: 'account_tree',
1863
- children: [
1864
- {
1865
- id: 'user-interface-material-components-navigation-stepper-stepper',
1866
- title: 'Stepper',
1867
- type: 'basic',
1868
- icon: 'account_tree',
1869
- link: '/ui/material/stepper',
1870
- },
1871
- ],
1872
- },
1873
- ],
1874
- },
1875
- {
1876
- id: 'user-interface-angular-cdk',
1877
- title: 'Angular CDK',
1878
- type: 'collapsable',
1879
- icon: 'widgets',
1880
- children: [
1881
- {
1882
- id: 'user-interface-angular-cdk-accessibility-navigation',
1883
- title: 'Accessibility & Navigation',
1884
- type: 'collapsable',
1885
- icon: 'accessibility',
1886
- children: [
1887
- {
1888
- id: 'user-interface-angular-cdk-accessibility-navigation-a11y',
1889
- title: 'Accessibility',
1890
- type: 'basic',
1891
- icon: 'accessibility',
1892
- link: '/ui/cdk/a11y',
1893
- },
1894
- {
1895
- id: 'user-interface-angular-cdk-accessibility-navigation-focus-trap',
1896
- title: 'Focus Trap',
1897
- type: 'basic',
1898
- icon: 'center_focus_strong',
1899
- link: '/ui/cdk/focus-trap',
1900
- },
1901
- {
1902
- id: 'user-interface-angular-cdk-accessibility-navigation-live-announcer',
1903
- title: 'Live Announcer',
1904
- type: 'basic',
1905
- icon: 'campaign',
1906
- link: '/ui/cdk/live-announcer',
1907
- },
1908
- {
1909
- id: 'user-interface-angular-cdk-accessibility-navigation-listbox',
1910
- title: 'Listbox',
1911
- type: 'basic',
1912
- icon: 'list',
1913
- link: '/ui/cdk/listbox',
1914
- },
1915
- {
1916
- id: 'user-interface-angular-cdk-accessibility-navigation-menu-cdk',
1917
- title: 'Menu',
1918
- type: 'basic',
1919
- icon: 'menu',
1920
- link: '/ui/cdk/menu',
1921
- },
1922
- ],
1923
- },
1924
- {
1925
- id: 'user-interface-angular-cdk-layout-positioning',
1926
- title: 'Layout & Positioning',
1927
- type: 'collapsable',
1928
- icon: 'dashboard',
1929
- children: [
1930
- {
1931
- id: 'user-interface-angular-cdk-layout-positioning-layout',
1932
- title: 'Layout',
1933
- type: 'basic',
1934
- icon: 'dashboard',
1935
- link: '/ui/cdk/layout',
1936
- },
1937
- {
1938
- id: 'user-interface-angular-cdk-layout-positioning-overlay',
1939
- title: 'Overlay',
1940
- type: 'basic',
1941
- icon: 'layers',
1942
- link: '/ui/cdk/overlay',
1943
- },
1944
- {
1945
- id: 'user-interface-angular-cdk-layout-positioning-portal',
1946
- title: 'Portal',
1947
- type: 'basic',
1948
- icon: 'radio_button_checked',
1949
- link: '/ui/cdk/portal',
1950
- },
1951
- {
1952
- id: 'user-interface-angular-cdk-layout-positioning-scrolling',
1953
- title: 'Scrolling',
1954
- type: 'basic',
1955
- icon: 'unfold_more',
1956
- link: '/ui/cdk/scrolling',
1957
- },
1958
- {
1959
- id: 'user-interface-angular-cdk-layout-positioning-virtual-scrolling',
1960
- title: 'Virtual Scrolling',
1961
- type: 'basic',
1962
- icon: 'view_agenda',
1963
- link: '/ui/cdk/virtual-scrolling',
1964
- },
1965
- ],
1966
- },
1967
- {
1968
- id: 'user-interface-angular-cdk-interaction-behavior',
1969
- title: 'Interaction & Behavior',
1970
- type: 'collapsable',
1971
- icon: 'pan_tool',
1972
- children: [
1973
- {
1974
- id: 'user-interface-angular-cdk-interaction-behavior-drag-drop',
1975
- title: 'Drag and Drop',
1976
- type: 'basic',
1977
- icon: 'open_with',
1978
- link: '/ui/cdk/drag-drop',
1979
- },
1980
- {
1981
- id: 'user-interface-angular-cdk-interaction-behavior-observers',
1982
- title: 'Observers',
1983
- type: 'basic',
1984
- icon: 'visibility',
1985
- link: '/ui/cdk/observers',
1986
- },
1987
- {
1988
- id: 'user-interface-angular-cdk-interaction-behavior-platform',
1989
- title: 'Platform',
1990
- type: 'basic',
1991
- icon: 'devices',
1992
- link: '/ui/cdk/platform',
1993
- },
1994
- {
1995
- id: 'user-interface-angular-cdk-interaction-behavior-stepper-cdk',
1996
- title: 'Stepper',
1997
- type: 'basic',
1998
- icon: 'account_tree',
1999
- link: '/ui/cdk/stepper',
2000
- },
2001
- ],
2002
- },
2003
- {
2004
- id: 'user-interface-angular-cdk-forms-data',
2005
- title: 'Forms & Data',
2006
- type: 'collapsable',
2007
- icon: 'storage',
2008
- children: [
2009
- {
2010
- id: 'user-interface-angular-cdk-forms-data-accordion',
2011
- title: 'Accordion',
2012
- type: 'basic',
2013
- icon: 'expand_more',
2014
- link: '/ui/cdk/accordion',
2015
- },
2016
- {
2017
- id: 'user-interface-angular-cdk-forms-data-table-cdk',
2018
- title: 'Table',
2019
- type: 'basic',
2020
- icon: 'table_chart',
2021
- link: '/ui/cdk/table',
2022
- },
2023
- {
2024
- id: 'user-interface-angular-cdk-forms-data-tree-cdk',
2025
- title: 'Tree',
2026
- type: 'basic',
2027
- icon: 'hub',
2028
- link: '/ui/cdk/tree',
2029
- },
2030
- ],
2031
- },
2032
- {
2033
- id: 'user-interface-angular-cdk-utilities-helpers',
2034
- title: 'Utilities & Helpers',
2035
- type: 'collapsable',
2036
- icon: 'build',
2037
- children: [
2038
- {
2039
- id: 'user-interface-angular-cdk-utilities-helpers-bidi',
2040
- title: 'Bidirectionality',
2041
- type: 'basic',
2042
- icon: 'swap_horiz',
2043
- link: '/ui/cdk/bidi',
2044
- },
2045
- {
2046
- id: 'user-interface-angular-cdk-utilities-helpers-clipboard',
2047
- title: 'Clipboard',
2048
- type: 'basic',
2049
- icon: 'content_paste',
2050
- link: '/ui/cdk/clipboard',
2051
- },
2052
- {
2053
- id: 'user-interface-angular-cdk-utilities-helpers-coercion',
2054
- title: 'Coercion',
2055
- type: 'basic',
2056
- icon: 'shuffle',
2057
- link: '/ui/cdk/coercion',
2058
- },
2059
- {
2060
- id: 'user-interface-angular-cdk-utilities-helpers-collections',
2061
- title: 'Collections',
2062
- type: 'basic',
2063
- icon: 'folder',
2064
- link: '/ui/cdk/collections',
2065
- },
2066
- {
2067
- id: 'user-interface-angular-cdk-utilities-helpers-keycodes',
2068
- title: 'Keycodes',
2069
- type: 'basic',
2070
- icon: 'keyboard',
2071
- link: '/ui/cdk/keycodes',
2072
- },
2073
- ],
2074
- },
2075
- {
2076
- id: 'user-interface-angular-cdk-testing-tools',
2077
- title: 'Testing Tools',
2078
- type: 'collapsable',
2079
- icon: 'bug_report',
2080
- children: [
2081
- {
2082
- id: 'user-interface-angular-cdk-testing-tools-component-harnesses',
2083
- title: 'Component Harnesses',
2084
- type: 'basic',
2085
- icon: 'science',
2086
- link: '/ui/cdk/testing',
2087
- },
2088
- {
2089
- id: 'user-interface-angular-cdk-testing-tools-test-harnesses',
2090
- title: 'Test Harnesses',
2091
- type: 'basic',
2092
- icon: 'science',
2093
- link: '/ui/cdk/test-harnesses',
2094
- },
2095
- ],
2096
- },
2097
- {
2098
- id: 'user-interface-angular-cdk-advanced-feature',
2099
- title: 'Advanced feature',
2100
- type: 'collapsable',
2101
- icon: 'settings',
2102
- children: [
2103
- {
2104
- id: 'user-interface-angular-cdk-advanced-feature-dialog-cdk',
2105
- title: 'Dialog',
2106
- type: 'basic',
2107
- icon: 'chat',
2108
- link: '/ui/cdk/dialog',
2109
- },
2110
- {
2111
- id: 'user-interface-angular-cdk-advanced-feature-text-field',
2112
- title: 'Text Field',
2113
- type: 'basic',
2114
- icon: 'text_fields',
2115
- link: '/ui/cdk/text-field',
2116
- },
2117
- ],
2118
- },
2119
- ],
2120
- },
2121
- {
2122
- id: 'user-interface-tailwind',
2123
- title: 'Tailwind CSS',
2124
- type: 'collapsable',
2125
- icon: 'air',
2126
- children: [
2127
- {
2128
- id: 'user-interface-tailwind-css-heading',
2129
- title: 'Heading',
2130
- type: 'basic',
2131
- icon: 'text_fields',
2132
- link: '/ui/tailwind/heading',
2133
- },
2134
- {
2135
- id: 'user-interface-tailwind-data-display',
2136
- title: 'Data Display',
2137
- type: 'basic',
2138
- icon: 'bar_chart',
2139
- link: '/ui/tailwind/data-display',
2140
- },
2141
- {
2142
- id: 'user-interface-tailwind-list',
2143
- title: 'List',
2144
- type: 'basic',
2145
- icon: 'list',
2146
- link: '/ui/tailwind/list',
2147
- },
2148
- {
2149
- id: 'user-interface-tailwind-form',
2150
- title: 'Form',
2151
- type: 'basic',
2152
- icon: 'dynamic_form',
2153
- link: '/ui/tailwind/form',
2154
- },
2155
- {
2156
- id: 'user-interface-tailwind-feedback',
2157
- title: 'Feedback',
2158
- type: 'basic',
2159
- icon: 'report',
2160
- link: '/ui/tailwind/feedback',
2161
- },
2162
- ],
2163
- },
2164
- ],
2165
- },
2166
- {
2167
- id: 'feature',
2168
- title: 'Features',
2169
- subtitle: 'Advanced functionality and customization options',
2170
- type: 'group',
2171
- icon: 'settings',
2172
- children: [
2173
- {
2174
- id: 'feature-theme',
2175
- title: 'Themes',
2176
- type: 'collapsable',
2177
- icon: 'palette',
2178
- children: [
2179
- {
2180
- id: 'feature-theme-dark-mode',
2181
- title: 'Dark Mode',
2182
- type: 'basic',
2183
- icon: 'dark_mode',
2184
- link: '/feature/theme/dark-mode',
2185
- },
2186
- {
2187
- id: 'feature-theme-color',
2188
- title: 'Color Schemes',
2189
- type: 'basic',
2190
- icon: 'palette',
2191
- link: '/feature/theme/color-schemes',
2192
- badge: {
2193
- title: 'Beta',
2194
- classes: 'ml-2 px-2 py-0.5 rounded-full text-xs bg-yellow-500 text-white',
2195
- },
2196
- },
2197
- {
2198
- id: 'feature-layout',
2199
- title: 'Layout',
2200
- type: 'collapsable',
2201
- icon: 'dashboard',
2202
- children: [
2203
- {
2204
- id: 'feature-layout-apps',
2205
- title: 'Application',
2206
- type: 'collapsable',
2207
- icon: 'web',
2208
- children: [
2209
- {
2210
- id: 'feature-layout-apps-vertical',
2211
- title: 'Vertical',
2212
- type: 'basic',
2213
- icon: 'view_sidebar',
2214
- link: '/feature/layout/application/vertical',
2215
- },
2216
- {
2217
- id: 'feature-layout-apps-horizontal',
2218
- title: 'Horizontal',
2219
- type: 'basic',
2220
- icon: 'view_column',
2221
- link: '/feature/layout/application/horizontal',
2222
- },
2223
- ],
2224
- },
2225
- {
2226
- id: 'feature-layout-page',
2227
- title: 'Pages',
2228
- type: 'collapsable',
2229
- icon: 'description',
2230
- children: [
2231
- {
2232
- id: 'feature-layout-page-page',
2233
- title: 'Page',
2234
- type: 'basic',
2235
- icon: 'description',
2236
- link: '/feature/layout/page/page',
2237
- },
2238
- {
2239
- id: 'feature-layout-page-content',
2240
- title: 'Content',
2241
- type: 'basic',
2242
- icon: 'description',
2243
- link: '/feature/layout/page/content',
2244
- },
2245
- ],
2246
- },
2247
- ],
2248
- },
2249
- ],
2250
- },
2251
- {
2252
- id: 'feature-navigation',
2253
- title: 'Navigation',
2254
- type: 'collapsable',
2255
- icon: 'navigation',
2256
- children: [
2257
- {
2258
- id: 'feature-navigation-horizontal-navigation',
2259
- title: 'Horizontal ',
2260
- type: 'basic',
2261
- icon: 'view_column',
2262
- link: '/feature/navigation/horizontal',
2263
- },
2264
- {
2265
- id: 'feature-navigation-vertical-navigation',
2266
- title: 'Vertical ',
2267
- type: 'collapsable',
2268
- icon: 'view_agenda',
2269
- children: [
2270
- {
2271
- id: 'feature-navigation-vertical-navigation-default',
2272
- title: 'Default',
2273
- type: 'basic',
2274
- icon: 'view_agenda',
2275
- link: '/feature/navigation/vertical/default',
2276
- },
2277
- {
2278
- id: 'feature-navigation-vertical-navigation-thin',
2279
- title: 'Thin',
2280
- type: 'basic',
2281
- icon: 'view_agenda',
2282
- link: '/feature/navigation/vertical/thin',
2283
- },
2284
- {
2285
- id: 'feature-navigation-vertical-navigation-compact',
2286
- title: 'Compact',
2287
- type: 'basic',
2288
- icon: 'view_agenda',
2289
- link: '/feature/navigation/vertical/compact',
2290
- },
2291
- {
2292
- id: 'feature-navigation-vertical-navigation-dense',
2293
- title: 'Dense',
2294
- type: 'basic',
2295
- icon: 'view_agenda',
2296
- link: '/feature/navigation/vertical/dense',
2297
- },
2298
- ],
2299
- },
2300
- ],
2301
- },
2302
- ],
2303
- },
2304
- ];
2305
-
2306
- /*
2307
- * Public API Surface of @ojiepermana/angular/navigation
2308
- */
2309
- // Core
2310
- const NAVIGATION_VERSION = '0.0.1';
2311
-
2312
- /**
2313
- * Generated bundle index. Do not edit.
2314
- */
2315
-
2316
- export { DEFAULT_NAVIGATION_ID, DemoNavigationData, NAVIGATION_VERSION, NavigationService, SidebarComponent, TopbarComponent, UiNavItemComponent };
2317
- //# sourceMappingURL=ojiepermana-angular-navigation.mjs.map