@ojiepermana/angular 21.3.0 → 21.3.3

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 (441) 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 +18 -15
  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/sdk.config.example.json +4 -2
  206. package/layout/component/package.json +4 -0
  207. package/layout/empty/package.json +4 -0
  208. package/layout/horizontal/package.json +4 -0
  209. package/layout/provider/package.json +4 -0
  210. package/layout/services/package.json +4 -0
  211. package/layout/shell/package.json +4 -0
  212. package/layout/token/directive/package.json +4 -0
  213. package/layout/token/package.json +4 -0
  214. package/layout/vertical/package.json +4 -0
  215. package/navigation/demo-data/package.json +4 -0
  216. package/navigation/icon/package.json +4 -0
  217. package/navigation/item/package.json +4 -0
  218. package/navigation/service/package.json +4 -0
  219. package/navigation/sidebar/package.json +4 -0
  220. package/navigation/topbar/package.json +4 -0
  221. package/navigation/types/package.json +4 -0
  222. package/package.json +196 -128
  223. package/theme/README.md +67 -0
  224. package/theme/provider/package.json +4 -0
  225. package/theme/services/package.json +4 -0
  226. package/theme/styles/index.css +12 -7
  227. package/theme/token/package.json +4 -0
  228. package/types/{ojiepermana-angular-ui-component-chart.d.ts → ojiepermana-angular-component-chart.d.ts} +15 -15
  229. package/types/ojiepermana-angular-generator-api.d.ts +2 -1
  230. package/types/ojiepermana-angular-layout-empty.d.ts +22 -0
  231. package/types/ojiepermana-angular-layout-horizontal.d.ts +36 -0
  232. package/types/ojiepermana-angular-layout-provider.d.ts +6 -0
  233. package/types/ojiepermana-angular-layout-services.d.ts +25 -0
  234. package/types/ojiepermana-angular-layout-shell.d.ts +8 -0
  235. package/types/ojiepermana-angular-layout-token-directive.d.ts +13 -0
  236. package/types/ojiepermana-angular-layout-token.d.ts +36 -0
  237. package/types/ojiepermana-angular-layout-vertical.d.ts +38 -0
  238. package/types/ojiepermana-angular-layout.d.ts +26 -25
  239. package/types/ojiepermana-angular-navigation-demo-data.d.ts +5 -0
  240. package/types/ojiepermana-angular-navigation-item.d.ts +54 -0
  241. package/types/ojiepermana-angular-navigation-service.d.ts +77 -0
  242. package/types/ojiepermana-angular-navigation-sidebar.d.ts +75 -0
  243. package/types/ojiepermana-angular-navigation-topbar.d.ts +54 -0
  244. package/types/ojiepermana-angular-navigation-types.d.ts +129 -0
  245. package/types/ojiepermana-angular-theme-provider.d.ts +11 -0
  246. package/types/ojiepermana-angular-theme-services.d.ts +55 -0
  247. package/types/ojiepermana-angular-theme-token.d.ts +57 -0
  248. package/types/ojiepermana-angular-theme.d.ts +11 -66
  249. package/fesm2022/ojiepermana-angular-layout-theme.mjs.map +0 -1
  250. package/fesm2022/ojiepermana-angular-navigation.mjs +0 -2317
  251. package/fesm2022/ojiepermana-angular-navigation.mjs.map +0 -1
  252. package/fesm2022/ojiepermana-angular-ui-component-accordion.mjs.map +0 -1
  253. package/fesm2022/ojiepermana-angular-ui-component-alert-dialog.mjs.map +0 -1
  254. package/fesm2022/ojiepermana-angular-ui-component-alert.mjs.map +0 -1
  255. package/fesm2022/ojiepermana-angular-ui-component-aspect-ratio.mjs.map +0 -1
  256. package/fesm2022/ojiepermana-angular-ui-component-avatar.mjs.map +0 -1
  257. package/fesm2022/ojiepermana-angular-ui-component-badge.mjs.map +0 -1
  258. package/fesm2022/ojiepermana-angular-ui-component-breadcrumb.mjs.map +0 -1
  259. package/fesm2022/ojiepermana-angular-ui-component-button-group.mjs.map +0 -1
  260. package/fesm2022/ojiepermana-angular-ui-component-button.mjs.map +0 -1
  261. package/fesm2022/ojiepermana-angular-ui-component-calendar.mjs.map +0 -1
  262. package/fesm2022/ojiepermana-angular-ui-component-card.mjs.map +0 -1
  263. package/fesm2022/ojiepermana-angular-ui-component-carousel.mjs.map +0 -1
  264. package/fesm2022/ojiepermana-angular-ui-component-chart-area.mjs.map +0 -1
  265. package/fesm2022/ojiepermana-angular-ui-component-chart-bar.mjs.map +0 -1
  266. package/fesm2022/ojiepermana-angular-ui-component-chart-line.mjs.map +0 -1
  267. package/fesm2022/ojiepermana-angular-ui-component-chart-pie.mjs.map +0 -1
  268. package/fesm2022/ojiepermana-angular-ui-component-chart-radar.mjs.map +0 -1
  269. package/fesm2022/ojiepermana-angular-ui-component-chart-radial.mjs.map +0 -1
  270. package/fesm2022/ojiepermana-angular-ui-component-chart-scatter.mjs.map +0 -1
  271. package/fesm2022/ojiepermana-angular-ui-component-chart.mjs.map +0 -1
  272. package/fesm2022/ojiepermana-angular-ui-component-checkbox.mjs.map +0 -1
  273. package/fesm2022/ojiepermana-angular-ui-component-collapsible.mjs.map +0 -1
  274. package/fesm2022/ojiepermana-angular-ui-component-combobox.mjs.map +0 -1
  275. package/fesm2022/ojiepermana-angular-ui-component-command.mjs.map +0 -1
  276. package/fesm2022/ojiepermana-angular-ui-component-context-menu.mjs.map +0 -1
  277. package/fesm2022/ojiepermana-angular-ui-component-date-picker.mjs.map +0 -1
  278. package/fesm2022/ojiepermana-angular-ui-component-dialog.mjs.map +0 -1
  279. package/fesm2022/ojiepermana-angular-ui-component-drawer.mjs.map +0 -1
  280. package/fesm2022/ojiepermana-angular-ui-component-dropdown-menu.mjs.map +0 -1
  281. package/fesm2022/ojiepermana-angular-ui-component-form.mjs.map +0 -1
  282. package/fesm2022/ojiepermana-angular-ui-component-input-group.mjs.map +0 -1
  283. package/fesm2022/ojiepermana-angular-ui-component-input.mjs.map +0 -1
  284. package/fesm2022/ojiepermana-angular-ui-component-item.mjs.map +0 -1
  285. package/fesm2022/ojiepermana-angular-ui-component-label.mjs.map +0 -1
  286. package/fesm2022/ojiepermana-angular-ui-component-pagination.mjs.map +0 -1
  287. package/fesm2022/ojiepermana-angular-ui-component-popover.mjs.map +0 -1
  288. package/fesm2022/ojiepermana-angular-ui-component-progress.mjs.map +0 -1
  289. package/fesm2022/ojiepermana-angular-ui-component-radio.mjs.map +0 -1
  290. package/fesm2022/ojiepermana-angular-ui-component-scroll-area.mjs.map +0 -1
  291. package/fesm2022/ojiepermana-angular-ui-component-select.mjs.map +0 -1
  292. package/fesm2022/ojiepermana-angular-ui-component-separator.mjs.map +0 -1
  293. package/fesm2022/ojiepermana-angular-ui-component-sheet.mjs.map +0 -1
  294. package/fesm2022/ojiepermana-angular-ui-component-skeleton.mjs.map +0 -1
  295. package/fesm2022/ojiepermana-angular-ui-component-slider.mjs.map +0 -1
  296. package/fesm2022/ojiepermana-angular-ui-component-switch.mjs.map +0 -1
  297. package/fesm2022/ojiepermana-angular-ui-component-table.mjs.map +0 -1
  298. package/fesm2022/ojiepermana-angular-ui-component-tabs.mjs.map +0 -1
  299. package/fesm2022/ojiepermana-angular-ui-component-textarea.mjs.map +0 -1
  300. package/fesm2022/ojiepermana-angular-ui-component-toast.mjs.map +0 -1
  301. package/fesm2022/ojiepermana-angular-ui-component-tooltip.mjs.map +0 -1
  302. package/fesm2022/ojiepermana-angular-ui-component-utils.mjs.map +0 -1
  303. package/layout/theme/package.json +0 -4
  304. package/navigation/package.json +0 -4
  305. package/navigation-icon/package.json +0 -4
  306. package/types/ojiepermana-angular-navigation.d.ts +0 -375
  307. package/ui/component/accordion/package.json +0 -4
  308. package/ui/component/alert/package.json +0 -4
  309. package/ui/component/alert-dialog/package.json +0 -4
  310. package/ui/component/aspect-ratio/package.json +0 -4
  311. package/ui/component/avatar/package.json +0 -4
  312. package/ui/component/badge/package.json +0 -4
  313. package/ui/component/breadcrumb/package.json +0 -4
  314. package/ui/component/button/package.json +0 -4
  315. package/ui/component/button-group/package.json +0 -4
  316. package/ui/component/calendar/package.json +0 -4
  317. package/ui/component/card/package.json +0 -4
  318. package/ui/component/carousel/package.json +0 -4
  319. package/ui/component/chart/area/package.json +0 -4
  320. package/ui/component/chart/bar/package.json +0 -4
  321. package/ui/component/chart/line/package.json +0 -4
  322. package/ui/component/chart/package.json +0 -4
  323. package/ui/component/chart/pie/package.json +0 -4
  324. package/ui/component/chart/radar/package.json +0 -4
  325. package/ui/component/chart/radial/package.json +0 -4
  326. package/ui/component/chart/scatter/package.json +0 -4
  327. package/ui/component/checkbox/package.json +0 -4
  328. package/ui/component/collapsible/package.json +0 -4
  329. package/ui/component/combobox/package.json +0 -4
  330. package/ui/component/command/package.json +0 -4
  331. package/ui/component/context-menu/package.json +0 -4
  332. package/ui/component/date-picker/package.json +0 -4
  333. package/ui/component/dialog/package.json +0 -4
  334. package/ui/component/drawer/package.json +0 -4
  335. package/ui/component/dropdown-menu/package.json +0 -4
  336. package/ui/component/form/package.json +0 -4
  337. package/ui/component/input/package.json +0 -4
  338. package/ui/component/input-group/package.json +0 -4
  339. package/ui/component/item/package.json +0 -4
  340. package/ui/component/label/package.json +0 -4
  341. package/ui/component/pagination/package.json +0 -4
  342. package/ui/component/popover/package.json +0 -4
  343. package/ui/component/progress/package.json +0 -4
  344. package/ui/component/radio/package.json +0 -4
  345. package/ui/component/scroll-area/package.json +0 -4
  346. package/ui/component/select/package.json +0 -4
  347. package/ui/component/separator/package.json +0 -4
  348. package/ui/component/sheet/package.json +0 -4
  349. package/ui/component/skeleton/package.json +0 -4
  350. package/ui/component/slider/package.json +0 -4
  351. package/ui/component/switch/package.json +0 -4
  352. package/ui/component/table/package.json +0 -4
  353. package/ui/component/tabs/package.json +0 -4
  354. package/ui/component/textarea/package.json +0 -4
  355. package/ui/component/toast/package.json +0 -4
  356. package/ui/component/tooltip/package.json +0 -4
  357. package/ui/component/utils/package.json +0 -4
  358. /package/{ui/component → component}/chart/README.md +0 -0
  359. /package/theme/styles/{themes/library/_components.css → foundation/components.css} +0 -0
  360. /package/theme/styles/{themes/library/_layers.css → foundation/layers.css} +0 -0
  361. /package/theme/styles/{themes/library/_tokens.css → foundation/tokens.css} +0 -0
  362. /package/theme/styles/{themes/library/_material-overrides.css → integrations/material.css} +0 -0
  363. /package/theme/styles/{themes → integrations}/tailwind.css +0 -0
  364. /package/theme/styles/{themes/library → variants}/color/amber.css +0 -0
  365. /package/theme/styles/{themes/library → variants}/color/base.css +0 -0
  366. /package/theme/styles/{themes/library → variants}/color/blue.css +0 -0
  367. /package/theme/styles/{themes/library → variants}/color/cyan.css +0 -0
  368. /package/theme/styles/{themes/library → variants}/color/emerald.css +0 -0
  369. /package/theme/styles/{themes/library → variants}/color/fuchsia.css +0 -0
  370. /package/theme/styles/{themes/library → variants}/color/green.css +0 -0
  371. /package/theme/styles/{themes/library → variants}/color/index.css +0 -0
  372. /package/theme/styles/{themes/library → variants}/color/indigo.css +0 -0
  373. /package/theme/styles/{themes/library → variants}/color/lime.css +0 -0
  374. /package/theme/styles/{themes/library → variants}/color/orange.css +0 -0
  375. /package/theme/styles/{themes/library → variants}/color/pink.css +0 -0
  376. /package/theme/styles/{themes/library → variants}/color/purple.css +0 -0
  377. /package/theme/styles/{themes/library → variants}/color/red.css +0 -0
  378. /package/theme/styles/{themes/library → variants}/color/rose.css +0 -0
  379. /package/theme/styles/{themes/library → variants}/color/sky.css +0 -0
  380. /package/theme/styles/{themes/library → variants}/color/teal.css +0 -0
  381. /package/theme/styles/{themes/library → variants}/color/violet.css +0 -0
  382. /package/theme/styles/{themes/library → variants}/color/yellow.css +0 -0
  383. /package/theme/styles/{themes → variants}/mode/dark.css +0 -0
  384. /package/theme/styles/{themes → variants}/mode/index.css +0 -0
  385. /package/theme/styles/{themes → variants}/mode/light.css +0 -0
  386. /package/theme/styles/{themes/library → variants}/style/brutal.css +0 -0
  387. /package/theme/styles/{themes/library → variants}/style/default.css +0 -0
  388. /package/theme/styles/{themes/library → variants}/style/index.css +0 -0
  389. /package/theme/styles/{themes/library → variants}/style/sharp.css +0 -0
  390. /package/theme/styles/{themes/library → variants}/style/soft.css +0 -0
  391. /package/types/{ojiepermana-angular-ui-component-accordion.d.ts → ojiepermana-angular-component-accordion.d.ts} +0 -0
  392. /package/types/{ojiepermana-angular-ui-component-alert-dialog.d.ts → ojiepermana-angular-component-alert-dialog.d.ts} +0 -0
  393. /package/types/{ojiepermana-angular-ui-component-alert.d.ts → ojiepermana-angular-component-alert.d.ts} +0 -0
  394. /package/types/{ojiepermana-angular-ui-component-aspect-ratio.d.ts → ojiepermana-angular-component-aspect-ratio.d.ts} +0 -0
  395. /package/types/{ojiepermana-angular-ui-component-avatar.d.ts → ojiepermana-angular-component-avatar.d.ts} +0 -0
  396. /package/types/{ojiepermana-angular-ui-component-badge.d.ts → ojiepermana-angular-component-badge.d.ts} +0 -0
  397. /package/types/{ojiepermana-angular-ui-component-breadcrumb.d.ts → ojiepermana-angular-component-breadcrumb.d.ts} +0 -0
  398. /package/types/{ojiepermana-angular-ui-component-button-group.d.ts → ojiepermana-angular-component-button-group.d.ts} +0 -0
  399. /package/types/{ojiepermana-angular-ui-component-button.d.ts → ojiepermana-angular-component-button.d.ts} +0 -0
  400. /package/types/{ojiepermana-angular-ui-component-calendar.d.ts → ojiepermana-angular-component-calendar.d.ts} +0 -0
  401. /package/types/{ojiepermana-angular-ui-component-card.d.ts → ojiepermana-angular-component-card.d.ts} +0 -0
  402. /package/types/{ojiepermana-angular-ui-component-carousel.d.ts → ojiepermana-angular-component-carousel.d.ts} +0 -0
  403. /package/types/{ojiepermana-angular-ui-component-chart-area.d.ts → ojiepermana-angular-component-chart-area.d.ts} +0 -0
  404. /package/types/{ojiepermana-angular-ui-component-chart-bar.d.ts → ojiepermana-angular-component-chart-bar.d.ts} +0 -0
  405. /package/types/{ojiepermana-angular-ui-component-chart-line.d.ts → ojiepermana-angular-component-chart-line.d.ts} +0 -0
  406. /package/types/{ojiepermana-angular-ui-component-chart-pie.d.ts → ojiepermana-angular-component-chart-pie.d.ts} +0 -0
  407. /package/types/{ojiepermana-angular-ui-component-chart-radar.d.ts → ojiepermana-angular-component-chart-radar.d.ts} +0 -0
  408. /package/types/{ojiepermana-angular-ui-component-chart-radial.d.ts → ojiepermana-angular-component-chart-radial.d.ts} +0 -0
  409. /package/types/{ojiepermana-angular-ui-component-chart-scatter.d.ts → ojiepermana-angular-component-chart-scatter.d.ts} +0 -0
  410. /package/types/{ojiepermana-angular-ui-component-checkbox.d.ts → ojiepermana-angular-component-checkbox.d.ts} +0 -0
  411. /package/types/{ojiepermana-angular-ui-component-collapsible.d.ts → ojiepermana-angular-component-collapsible.d.ts} +0 -0
  412. /package/types/{ojiepermana-angular-ui-component-combobox.d.ts → ojiepermana-angular-component-combobox.d.ts} +0 -0
  413. /package/types/{ojiepermana-angular-ui-component-command.d.ts → ojiepermana-angular-component-command.d.ts} +0 -0
  414. /package/types/{ojiepermana-angular-ui-component-context-menu.d.ts → ojiepermana-angular-component-context-menu.d.ts} +0 -0
  415. /package/types/{ojiepermana-angular-ui-component-date-picker.d.ts → ojiepermana-angular-component-date-picker.d.ts} +0 -0
  416. /package/types/{ojiepermana-angular-ui-component-dialog.d.ts → ojiepermana-angular-component-dialog.d.ts} +0 -0
  417. /package/types/{ojiepermana-angular-ui-component-drawer.d.ts → ojiepermana-angular-component-drawer.d.ts} +0 -0
  418. /package/types/{ojiepermana-angular-ui-component-dropdown-menu.d.ts → ojiepermana-angular-component-dropdown-menu.d.ts} +0 -0
  419. /package/types/{ojiepermana-angular-ui-component-form.d.ts → ojiepermana-angular-component-form.d.ts} +0 -0
  420. /package/types/{ojiepermana-angular-ui-component-input-group.d.ts → ojiepermana-angular-component-input-group.d.ts} +0 -0
  421. /package/types/{ojiepermana-angular-ui-component-input.d.ts → ojiepermana-angular-component-input.d.ts} +0 -0
  422. /package/types/{ojiepermana-angular-ui-component-item.d.ts → ojiepermana-angular-component-item.d.ts} +0 -0
  423. /package/types/{ojiepermana-angular-ui-component-label.d.ts → ojiepermana-angular-component-label.d.ts} +0 -0
  424. /package/types/{ojiepermana-angular-ui-component-pagination.d.ts → ojiepermana-angular-component-pagination.d.ts} +0 -0
  425. /package/types/{ojiepermana-angular-ui-component-popover.d.ts → ojiepermana-angular-component-popover.d.ts} +0 -0
  426. /package/types/{ojiepermana-angular-ui-component-progress.d.ts → ojiepermana-angular-component-progress.d.ts} +0 -0
  427. /package/types/{ojiepermana-angular-ui-component-radio.d.ts → ojiepermana-angular-component-radio.d.ts} +0 -0
  428. /package/types/{ojiepermana-angular-ui-component-scroll-area.d.ts → ojiepermana-angular-component-scroll-area.d.ts} +0 -0
  429. /package/types/{ojiepermana-angular-ui-component-select.d.ts → ojiepermana-angular-component-select.d.ts} +0 -0
  430. /package/types/{ojiepermana-angular-ui-component-separator.d.ts → ojiepermana-angular-component-separator.d.ts} +0 -0
  431. /package/types/{ojiepermana-angular-ui-component-sheet.d.ts → ojiepermana-angular-component-sheet.d.ts} +0 -0
  432. /package/types/{ojiepermana-angular-ui-component-skeleton.d.ts → ojiepermana-angular-component-skeleton.d.ts} +0 -0
  433. /package/types/{ojiepermana-angular-ui-component-slider.d.ts → ojiepermana-angular-component-slider.d.ts} +0 -0
  434. /package/types/{ojiepermana-angular-ui-component-switch.d.ts → ojiepermana-angular-component-switch.d.ts} +0 -0
  435. /package/types/{ojiepermana-angular-ui-component-table.d.ts → ojiepermana-angular-component-table.d.ts} +0 -0
  436. /package/types/{ojiepermana-angular-ui-component-tabs.d.ts → ojiepermana-angular-component-tabs.d.ts} +0 -0
  437. /package/types/{ojiepermana-angular-ui-component-textarea.d.ts → ojiepermana-angular-component-textarea.d.ts} +0 -0
  438. /package/types/{ojiepermana-angular-ui-component-toast.d.ts → ojiepermana-angular-component-toast.d.ts} +0 -0
  439. /package/types/{ojiepermana-angular-ui-component-tooltip.d.ts → ojiepermana-angular-component-tooltip.d.ts} +0 -0
  440. /package/types/{ojiepermana-angular-ui-component-utils.d.ts → ojiepermana-angular-component-utils.d.ts} +0 -0
  441. /package/types/{ojiepermana-angular-layout-theme.d.ts → ojiepermana-angular-layout-component.d.ts} +0 -0
@@ -0,0 +1,204 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, DestroyRef, signal, computed, effect, Injectable } from '@angular/core';
4
+ import { Router, NavigationEnd } from '@angular/router';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { filter } from 'rxjs/operators';
7
+
8
+ /** Default registry key used when no id is specified. */
9
+ const DEFAULT_NAVIGATION_ID = 'main';
10
+ const SIDEBAR_COLLAPSE_STORAGE_KEY = 'sidebar-collapse';
11
+ const LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY = 'sidebar-appearance';
12
+ function parseSidebarCollapsed(value) {
13
+ if (value === 'true')
14
+ return true;
15
+ if (value === 'false')
16
+ return false;
17
+ return null;
18
+ }
19
+ /**
20
+ * Signal-based global state untuk navigation (sidebar/topbar).
21
+ *
22
+ * Items disimpan dalam registry ber-key. Key default adalah `'main'`.
23
+ * Komponen `sidebar` / `topbar` memilih registry via input `navigationId`.
24
+ */
25
+ class NavigationService {
26
+ doc = inject(DOCUMENT);
27
+ router = inject(Router);
28
+ destroyRef = inject(DestroyRef);
29
+ persistedSidebarCollapsed = this.readPersistedSidebarCollapsed();
30
+ /** Internal version counter — incremented on every registry mutation. */
31
+ _version = signal(0, ...(ngDevMode ? [{ debugName: "_version" }] : /* istanbul ignore next */ []));
32
+ /** Internal map of registered navigation trees. */
33
+ _registry = new Map();
34
+ _collapsed = signal(this.persistedSidebarCollapsed ?? false, ...(ngDevMode ? [{ debugName: "_collapsed" }] : /* istanbul ignore next */ []));
35
+ _hasStoredSidebarCollapse = signal(this.persistedSidebarCollapsed !== null, ...(ngDevMode ? [{ debugName: "_hasStoredSidebarCollapse" }] : /* istanbul ignore next */ []));
36
+ /**
37
+ * Backward-compatible accessor — returns items for the default (`'main'`) key.
38
+ * Prefer `getItems(id)` when working with named registries.
39
+ */
40
+ items = computed(() => this.getItems(DEFAULT_NAVIGATION_ID)(), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
41
+ /** Sidebar appearance preference (`default` or `thin`). */
42
+ sidebarAppearance = computed(() => (this._collapsed() ? 'thin' : 'default'), ...(ngDevMode ? [{ debugName: "sidebarAppearance" }] : /* istanbul ignore next */ []));
43
+ hasStoredSidebarCollapse = this._hasStoredSidebarCollapse.asReadonly();
44
+ /** Sidebar collapsed (default ↔ thin) toggle untuk desktop. */
45
+ collapsed = this._collapsed.asReadonly();
46
+ /** Sheet drawer terbuka di mobile. */
47
+ mobileOpen = signal(false, ...(ngDevMode ? [{ debugName: "mobileOpen" }] : /* istanbul ignore next */ []));
48
+ /** Set id grup / collapsable yang sedang terbuka. */
49
+ openGroups = signal(new Set(), ...(ngDevMode ? [{ debugName: "openGroups" }] : /* istanbul ignore next */ []));
50
+ /** URL aktif terakhir. Update otomatis dari Router `NavigationEnd`. */
51
+ activeUrl = signal(this.router.url, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
52
+ /** Trail id item yang sedang match dengan URL aktif (across ALL registries). */
53
+ activeTrail = computed(() => {
54
+ this._version(); // track changes
55
+ const url = this.activeUrl();
56
+ const trail = new Set();
57
+ const walk = (list, ancestors) => {
58
+ let matched = false;
59
+ for (const item of list) {
60
+ const id = item.id;
61
+ const link = 'link' in item ? item.link : undefined;
62
+ let selfMatch = false;
63
+ if (link) {
64
+ selfMatch = url === link || url.startsWith(link + '/') || url.startsWith(link + '?');
65
+ }
66
+ const children = 'children' in item ? (item.children ?? []) : [];
67
+ const nextAncestors = id ? [...ancestors, id] : ancestors;
68
+ const childMatch = children.length > 0 && walk(children, nextAncestors);
69
+ if (selfMatch || childMatch) {
70
+ if (id)
71
+ trail.add(id);
72
+ for (const a of ancestors)
73
+ trail.add(a);
74
+ matched = true;
75
+ }
76
+ }
77
+ return matched;
78
+ };
79
+ for (const items of this._registry.values()) {
80
+ walk(items, []);
81
+ }
82
+ return trail;
83
+ }, ...(ngDevMode ? [{ debugName: "activeTrail" }] : /* istanbul ignore next */ []));
84
+ constructor() {
85
+ effect(() => {
86
+ if (!this._hasStoredSidebarCollapse()) {
87
+ return;
88
+ }
89
+ this.persistSidebarCollapsed(this._collapsed());
90
+ });
91
+ this.router.events
92
+ .pipe(filter((e) => e instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
93
+ .subscribe((e) => this.activeUrl.set(e.urlAfterRedirects));
94
+ }
95
+ registerItems(idOrItems, maybeItems) {
96
+ const [id, items] = typeof idOrItems === 'string' ? [idOrItems, maybeItems] : [DEFAULT_NAVIGATION_ID, idOrItems];
97
+ this._registry.set(id, items);
98
+ this._version.update((v) => v + 1);
99
+ }
100
+ /** Remove a named registry entry. */
101
+ removeItems(id) {
102
+ this._registry.delete(id);
103
+ this._version.update((v) => v + 1);
104
+ }
105
+ /**
106
+ * Computed yang mengembalikan items untuk key tertentu.
107
+ * Reactive terhadap perubahan registry.
108
+ */
109
+ getItems(id) {
110
+ return computed(() => {
111
+ this._version(); // track changes
112
+ return this._registry.get(id) ?? [];
113
+ });
114
+ }
115
+ setSidebarAppearance(value) {
116
+ this.setCollapsed(value === 'thin');
117
+ }
118
+ toggleSidebarAppearance(currentAppearance = this.sidebarAppearance()) {
119
+ this.setCollapsed(currentAppearance !== 'thin');
120
+ }
121
+ /** Toggle sidebar collapsed (default ↔ thin). */
122
+ toggleCollapsed() {
123
+ this.setCollapsed(!this._collapsed());
124
+ }
125
+ setCollapsed(value) {
126
+ this._collapsed.set(value);
127
+ this._hasStoredSidebarCollapse.set(true);
128
+ }
129
+ openMobile() {
130
+ this.mobileOpen.set(true);
131
+ }
132
+ closeMobile() {
133
+ this.mobileOpen.set(false);
134
+ }
135
+ toggleMobile() {
136
+ this.mobileOpen.update((v) => !v);
137
+ }
138
+ isGroupOpen(id) {
139
+ return this.openGroups().has(id);
140
+ }
141
+ toggleGroup(id) {
142
+ const next = new Set(this.openGroups());
143
+ if (next.has(id))
144
+ next.delete(id);
145
+ else
146
+ next.add(id);
147
+ this.openGroups.set(next);
148
+ }
149
+ setGroupOpen(id, open) {
150
+ const next = new Set(this.openGroups());
151
+ if (open)
152
+ next.add(id);
153
+ else
154
+ next.delete(id);
155
+ this.openGroups.set(next);
156
+ }
157
+ /** Apakah id termasuk dalam active trail saat ini. */
158
+ isActive(id) {
159
+ return !!id && this.activeTrail().has(id);
160
+ }
161
+ readPersistedSidebarCollapsed() {
162
+ try {
163
+ const storage = this.doc.defaultView?.localStorage;
164
+ const collapsed = parseSidebarCollapsed(storage?.getItem(SIDEBAR_COLLAPSE_STORAGE_KEY));
165
+ if (collapsed !== null) {
166
+ return collapsed;
167
+ }
168
+ const legacyAppearance = storage?.getItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);
169
+ if (legacyAppearance === 'thin') {
170
+ return true;
171
+ }
172
+ if (legacyAppearance === 'default') {
173
+ return false;
174
+ }
175
+ return null;
176
+ }
177
+ catch {
178
+ return null;
179
+ }
180
+ }
181
+ persistSidebarCollapsed(value) {
182
+ try {
183
+ const storage = this.doc.defaultView?.localStorage;
184
+ storage?.setItem(SIDEBAR_COLLAPSE_STORAGE_KEY, String(value));
185
+ storage?.removeItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);
186
+ }
187
+ catch {
188
+ /* ignore */
189
+ }
190
+ }
191
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
192
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, providedIn: 'root' });
193
+ }
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NavigationService, decorators: [{
195
+ type: Injectable,
196
+ args: [{ providedIn: 'root' }]
197
+ }], ctorParameters: () => [] });
198
+
199
+ /**
200
+ * Generated bundle index. Do not edit.
201
+ */
202
+
203
+ export { DEFAULT_NAVIGATION_ID, NavigationService };
204
+ //# sourceMappingURL=ojiepermana-angular-navigation-service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ojiepermana-angular-navigation-service.mjs","sources":["../../../projects/angular/navigation/service/src/lib/navigation.service.ts","../../../projects/angular/navigation/service/ojiepermana-angular-navigation-service.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { filter } from 'rxjs/operators';\nimport { DestroyRef } from '@angular/core';\nimport type { NavigationItem, SidebarAppearance } from '@ojiepermana/angular/navigation/types';\n\n/** Default registry key used when no id is specified. */\nexport const DEFAULT_NAVIGATION_ID = 'main';\nconst SIDEBAR_COLLAPSE_STORAGE_KEY = 'sidebar-collapse';\nconst LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY = 'sidebar-appearance';\n\nfunction parseSidebarCollapsed(value: string | null | undefined): boolean | null {\n if (value === 'true') return true;\n if (value === 'false') return false;\n return null;\n}\n\n/**\n * Signal-based global state untuk navigation (sidebar/topbar).\n *\n * Items disimpan dalam registry ber-key. Key default adalah `'main'`.\n * Komponen `sidebar` / `topbar` memilih registry via input `navigationId`.\n */\n@Injectable({ providedIn: 'root' })\nexport class NavigationService {\n private readonly doc = inject(DOCUMENT);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n private readonly persistedSidebarCollapsed = this.readPersistedSidebarCollapsed();\n\n /** Internal version counter — incremented on every registry mutation. */\n private readonly _version = signal(0);\n\n /** Internal map of registered navigation trees. */\n private readonly _registry = new Map<string, NavigationItem[]>();\n private readonly _collapsed = signal(this.persistedSidebarCollapsed ?? false);\n private readonly _hasStoredSidebarCollapse = signal(this.persistedSidebarCollapsed !== null);\n\n /**\n * Backward-compatible accessor — returns items for the default (`'main'`) key.\n * Prefer `getItems(id)` when working with named registries.\n */\n readonly items = computed(() => this.getItems(DEFAULT_NAVIGATION_ID)());\n\n /** Sidebar appearance preference (`default` or `thin`). */\n readonly sidebarAppearance = computed<SidebarAppearance>(() => (this._collapsed() ? 'thin' : 'default'));\n readonly hasStoredSidebarCollapse = this._hasStoredSidebarCollapse.asReadonly();\n\n /** Sidebar collapsed (default ↔ thin) toggle untuk desktop. */\n readonly collapsed = this._collapsed.asReadonly();\n\n /** Sheet drawer terbuka di mobile. */\n readonly mobileOpen = signal<boolean>(false);\n\n /** Set id grup / collapsable yang sedang terbuka. */\n readonly openGroups = signal<ReadonlySet<string>>(new Set<string>());\n\n /** URL aktif terakhir. Update otomatis dari Router `NavigationEnd`. */\n readonly activeUrl = signal<string>(this.router.url);\n\n /** Trail id item yang sedang match dengan URL aktif (across ALL registries). */\n readonly activeTrail = computed<ReadonlySet<string>>(() => {\n this._version(); // track changes\n const url = this.activeUrl();\n const trail = new Set<string>();\n const walk = (list: readonly NavigationItem[], ancestors: string[]): boolean => {\n let matched = false;\n for (const item of list) {\n const id = item.id;\n const link = 'link' in item ? item.link : undefined;\n let selfMatch = false;\n if (link) {\n selfMatch = url === link || url.startsWith(link + '/') || url.startsWith(link + '?');\n }\n const children = 'children' in item ? (item.children ?? []) : [];\n const nextAncestors = id ? [...ancestors, id] : ancestors;\n const childMatch = children.length > 0 && walk(children, nextAncestors);\n if (selfMatch || childMatch) {\n if (id) trail.add(id);\n for (const a of ancestors) trail.add(a);\n matched = true;\n }\n }\n return matched;\n };\n for (const items of this._registry.values()) {\n walk(items, []);\n }\n return trail;\n });\n\n constructor() {\n effect(() => {\n if (!this._hasStoredSidebarCollapse()) {\n return;\n }\n\n this.persistSidebarCollapsed(this._collapsed());\n });\n\n this.router.events\n .pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((e) => this.activeUrl.set(e.urlAfterRedirects));\n }\n\n /**\n * Register items di registry.\n *\n * Overload:\n * - `registerItems(items)` → key `'main'`\n * - `registerItems(id, items)` → key spesifik\n */\n registerItems(items: NavigationItem[]): void;\n registerItems(id: string, items: NavigationItem[]): void;\n registerItems(idOrItems: string | NavigationItem[], maybeItems?: NavigationItem[]): void {\n const [id, items] = typeof idOrItems === 'string' ? [idOrItems, maybeItems!] : [DEFAULT_NAVIGATION_ID, idOrItems];\n this._registry.set(id, items);\n this._version.update((v) => v + 1);\n }\n\n /** Remove a named registry entry. */\n removeItems(id: string): void {\n this._registry.delete(id);\n this._version.update((v) => v + 1);\n }\n\n /**\n * Computed yang mengembalikan items untuk key tertentu.\n * Reactive terhadap perubahan registry.\n */\n getItems(id: string): () => readonly NavigationItem[] {\n return computed(() => {\n this._version(); // track changes\n return this._registry.get(id) ?? [];\n });\n }\n\n setSidebarAppearance(value: SidebarAppearance): void {\n this.setCollapsed(value === 'thin');\n }\n\n toggleSidebarAppearance(currentAppearance: SidebarAppearance = this.sidebarAppearance()): void {\n this.setCollapsed(currentAppearance !== 'thin');\n }\n\n /** Toggle sidebar collapsed (default ↔ thin). */\n toggleCollapsed(): void {\n this.setCollapsed(!this._collapsed());\n }\n\n setCollapsed(value: boolean): void {\n this._collapsed.set(value);\n this._hasStoredSidebarCollapse.set(true);\n }\n\n openMobile(): void {\n this.mobileOpen.set(true);\n }\n\n closeMobile(): void {\n this.mobileOpen.set(false);\n }\n\n toggleMobile(): void {\n this.mobileOpen.update((v) => !v);\n }\n\n isGroupOpen(id: string): boolean {\n return this.openGroups().has(id);\n }\n\n toggleGroup(id: string): void {\n const next = new Set(this.openGroups());\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this.openGroups.set(next);\n }\n\n setGroupOpen(id: string, open: boolean): void {\n const next = new Set(this.openGroups());\n if (open) next.add(id);\n else next.delete(id);\n this.openGroups.set(next);\n }\n\n /** Apakah id termasuk dalam active trail saat ini. */\n isActive(id: string | undefined): boolean {\n return !!id && this.activeTrail().has(id);\n }\n\n private readPersistedSidebarCollapsed(): boolean | null {\n try {\n const storage = this.doc.defaultView?.localStorage;\n const collapsed = parseSidebarCollapsed(storage?.getItem(SIDEBAR_COLLAPSE_STORAGE_KEY));\n if (collapsed !== null) {\n return collapsed;\n }\n\n const legacyAppearance = storage?.getItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);\n if (legacyAppearance === 'thin') {\n return true;\n }\n if (legacyAppearance === 'default') {\n return false;\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n private persistSidebarCollapsed(value: boolean): void {\n try {\n const storage = this.doc.defaultView?.localStorage;\n storage?.setItem(SIDEBAR_COLLAPSE_STORAGE_KEY, String(value));\n storage?.removeItem(LEGACY_SIDEBAR_APPEARANCE_STORAGE_KEY);\n } catch {\n /* ignore */\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,373 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ViewContainerRef, DestroyRef, input, computed, signal, viewChild, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
4
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { BreakpointObserver } from '@angular/cdk/layout';
6
+ import { Overlay } from '@angular/cdk/overlay';
7
+ import { TemplatePortal } from '@angular/cdk/portal';
8
+ import { FocusTrapFactory } from '@angular/cdk/a11y';
9
+ import { map, filter } from 'rxjs/operators';
10
+ import { UiNavIconComponent } from '@ojiepermana/angular/navigation/icon';
11
+ import { UiNavItemComponent } from '@ojiepermana/angular/navigation/item';
12
+ import { NavigationService, DEFAULT_NAVIGATION_ID } from '@ojiepermana/angular/navigation/service';
13
+ import { ScrollAreaComponent } from '@ojiepermana/angular/component/scroll-area';
14
+
15
+ /**
16
+ * Vertical navigation (sidebar) — shadcn-styled.
17
+ *
18
+ * Variants:
19
+ * - `default`: 17.5rem, label + icon
20
+ * - `thin`: 4rem icon-only; hover memunculkan overlay expand (tidak push konten)
21
+ *
22
+ * Mobile (`< md`): saat `autoMobile=true` (default), host desktop disembunyikan
23
+ * dan konten dirender lewat CDK Overlay drawer dengan focus trap. State buka
24
+ * dikontrol lewat `NavigationService.mobileOpen`.
25
+ */
26
+ class SidebarComponent {
27
+ nav = inject(NavigationService);
28
+ bp = inject(BreakpointObserver);
29
+ overlay = inject(Overlay);
30
+ vcr = inject(ViewContainerRef);
31
+ focusTrapFactory = inject(FocusTrapFactory);
32
+ doc = inject(DOCUMENT);
33
+ destroyRef = inject(DestroyRef);
34
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
35
+ /** Registry key di `NavigationService`. Default `'main'`. */
36
+ navigationId = input(DEFAULT_NAVIGATION_ID, ...(ngDevMode ? [{ debugName: "navigationId" }] : /* istanbul ignore next */ []));
37
+ appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
38
+ /** Desktop border can be owned by the sidebar or by the surrounding layout shell. */
39
+ borderSource = input('component', ...(ngDevMode ? [{ debugName: "borderSource" }] : /* istanbul ignore next */ []));
40
+ position = input('left', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
41
+ ariaLabel = input('Primary', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
42
+ header = input(true, ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
43
+ class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
44
+ /** Auto switch ke CDK overlay drawer saat viewport `< md`. */
45
+ autoMobile = input(true, ...(ngDevMode ? [{ debugName: "autoMobile" }] : /* istanbul ignore next */ []));
46
+ /** Auto-register `items` ke `NavigationService` agar `activeTrail` bekerja. */
47
+ autoRegister = input(true, ...(ngDevMode ? [{ debugName: "autoRegister" }] : /* istanbul ignore next */ []));
48
+ /** Resolved items: input jika disediakan, fallback ke registry NavigationService. */
49
+ resolvedItems = computed(() => {
50
+ const explicit = this.items();
51
+ return explicit.length > 0 ? explicit : this.nav.getItems(this.navigationId())();
52
+ }, ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
53
+ hovered = signal(false, ...(ngDevMode ? [{ debugName: "hovered" }] : /* istanbul ignore next */ []));
54
+ suppressHoverUntilLeave = signal(false, ...(ngDevMode ? [{ debugName: "suppressHoverUntilLeave" }] : /* istanbul ignore next */ []));
55
+ drawerTpl = viewChild.required('drawerTpl');
56
+ drawerRef = null;
57
+ focusTrap = null;
58
+ previouslyFocused = null;
59
+ /** True saat viewport `< md` (767.98px). */
60
+ isMobileMedia = toSignal(this.bp.observe('(max-width: 767.98px)').pipe(map((s) => s.matches)), {
61
+ initialValue: false,
62
+ });
63
+ isMobile = computed(() => this.autoMobile() && this.isMobileMedia(), ...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
64
+ resolvedCollapsed = computed(() => {
65
+ if (this.nav.hasStoredSidebarCollapse()) {
66
+ return this.nav.collapsed();
67
+ }
68
+ return this.appearance() === 'thin';
69
+ }, ...(ngDevMode ? [{ debugName: "resolvedCollapsed" }] : /* istanbul ignore next */ []));
70
+ resolvedAppearance = computed(() => {
71
+ return this.resolvedCollapsed() ? 'thin' : 'default';
72
+ }, ...(ngDevMode ? [{ debugName: "resolvedAppearance" }] : /* istanbul ignore next */ []));
73
+ hoverActive = computed(() => this.hovered() && !this.suppressHoverUntilLeave(), ...(ngDevMode ? [{ debugName: "hoverActive" }] : /* istanbul ignore next */ []));
74
+ isExpanded = computed(() => !this.resolvedCollapsed() || this.hoverActive(), ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
75
+ isCompact = computed(() => !this.isMobile() && this.resolvedCollapsed() && !this.hoverActive(), ...(ngDevMode ? [{ debugName: "isCompact" }] : /* istanbul ignore next */ []));
76
+ toggleButtonLabel = computed(() => this.resolvedCollapsed() ? 'Expand sidebar' : 'Collapse sidebar', ...(ngDevMode ? [{ debugName: "toggleButtonLabel" }] : /* istanbul ignore next */ []));
77
+ constructor() {
78
+ // Auto-register items ke service untuk active trail (hanya jika input non-kosong).
79
+ effect(() => {
80
+ const explicit = this.items();
81
+ if (this.autoRegister() && explicit.length > 0)
82
+ this.nav.registerItems(this.navigationId(), explicit);
83
+ });
84
+ // Kelola overlay drawer berdasarkan mobileOpen + isMobile.
85
+ effect(() => {
86
+ const open = this.nav.mobileOpen();
87
+ const mobile = this.isMobile();
88
+ if (mobile && open)
89
+ this.openDrawer();
90
+ else
91
+ this.closeDrawer();
92
+ });
93
+ this.destroyRef.onDestroy(() => this.closeDrawer());
94
+ }
95
+ hostClasses = computed(() => {
96
+ const base = ['relative flex shrink-0 text-foreground', 'transition-[width] duration-200 ease-out'];
97
+ if (this.resolvedCollapsed())
98
+ base.push('w-16');
99
+ else
100
+ base.push('[width:17.5rem]');
101
+ if (this.borderSource() === 'component') {
102
+ if (this.position() === 'right')
103
+ base.push('border-l', 'border-primary/30');
104
+ else
105
+ base.push('border-r', 'border-primary/30');
106
+ }
107
+ return [...base, this.class()].join(' ');
108
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
109
+ headerClasses = computed(() => {
110
+ const base = ['flex items-center gap-1 border-b border-primary/30'];
111
+ if (this.isCompact()) {
112
+ base.push('h-12', 'justify-center', 'px-2');
113
+ }
114
+ else {
115
+ base.push('h-12', 'pr-2');
116
+ }
117
+ return base.join(' ');
118
+ }, ...(ngDevMode ? [{ debugName: "headerClasses" }] : /* istanbul ignore next */ []));
119
+ headerSlotClasses = computed(() => {
120
+ const base = ['min-w-0'];
121
+ if (this.isCompact()) {
122
+ 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');
123
+ }
124
+ else {
125
+ base.push('flex min-w-0 flex-1 items-center');
126
+ }
127
+ return base.join(' ');
128
+ }, ...(ngDevMode ? [{ debugName: "headerSlotClasses" }] : /* istanbul ignore next */ []));
129
+ navClasses = computed(() => {
130
+ const base = ['min-h-full'];
131
+ if (this.isCompact()) {
132
+ base.push('px-2', '[&_.ui-nav-text]:mx-auto', '[&_.ui-nav-text]:w-10', '[&_.ui-nav-text]:justify-center', '[&_.ui-nav-text]:px-0');
133
+ }
134
+ return base.join(' ');
135
+ }, ...(ngDevMode ? [{ debugName: "navClasses" }] : /* istanbul ignore next */ []));
136
+ scrollViewportClasses = computed(() => 'overflow-y-auto overflow-x-hidden scrollbar-thin scrollbar-thumb-primary scrollbar-track-primary/10', ...(ngDevMode ? [{ debugName: "scrollViewportClasses" }] : /* istanbul ignore next */ []));
137
+ footerClasses = computed(() => {
138
+ const base = ['h-12 border-t border-primary/30'];
139
+ if (this.isCompact()) {
140
+ base.push('flex items-center justify-center px-2');
141
+ }
142
+ return base.join(' ');
143
+ }, ...(ngDevMode ? [{ debugName: "footerClasses" }] : /* istanbul ignore next */ []));
144
+ footerSlotClasses = computed(() => {
145
+ const base = ['h-full'];
146
+ if (this.isCompact()) {
147
+ 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');
148
+ }
149
+ else {
150
+ base.push('w-full');
151
+ }
152
+ return base.join(' ');
153
+ }, ...(ngDevMode ? [{ debugName: "footerSlotClasses" }] : /* istanbul ignore next */ []));
154
+ innerClasses = computed(() => {
155
+ const overlayActive = this.resolvedCollapsed() && this.hoverActive();
156
+ const base = ['flex h-full flex-col transition-[width] duration-200 ease-out'];
157
+ if (this.resolvedCollapsed()) {
158
+ base.push('bg-background');
159
+ }
160
+ if (overlayActive) {
161
+ 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');
162
+ }
163
+ else {
164
+ base.push('w-full');
165
+ }
166
+ return base.join(' ');
167
+ }, ...(ngDevMode ? [{ debugName: "innerClasses" }] : /* istanbul ignore next */ []));
168
+ onHoverEnter() {
169
+ if (!this.resolvedCollapsed() || this.isMobile() || this.suppressHoverUntilLeave())
170
+ return;
171
+ this.hovered.set(true);
172
+ }
173
+ onHoverLeave() {
174
+ this.suppressHoverUntilLeave.set(false);
175
+ if (this.resolvedCollapsed())
176
+ this.hovered.set(false);
177
+ }
178
+ toggleAppearance(event) {
179
+ event.stopPropagation();
180
+ const nextCollapsed = !this.resolvedCollapsed();
181
+ this.nav.setCollapsed(nextCollapsed);
182
+ this.hovered.set(false);
183
+ this.suppressHoverUntilLeave.set(nextCollapsed);
184
+ }
185
+ /** Touch fallback: tap pada strip thin (ketika belum expanded) untuk expand. */
186
+ onHostClick(event) {
187
+ if (!this.resolvedCollapsed() || this.isMobile())
188
+ return;
189
+ if (this.hovered())
190
+ return;
191
+ const target = event.target;
192
+ // Biarkan klik pada control interaktif terus propagate (tidak intercept).
193
+ if (target && target.closest('a,button,[role="menuitem"]'))
194
+ return;
195
+ this.hovered.set(true);
196
+ }
197
+ openDrawer() {
198
+ if (this.drawerRef)
199
+ return;
200
+ const side = this.position();
201
+ const pos = this.overlay.position().global().top('0');
202
+ if (side === 'right')
203
+ pos.right('0');
204
+ else
205
+ pos.left('0');
206
+ this.drawerRef = this.overlay.create({
207
+ positionStrategy: pos,
208
+ height: '100vh',
209
+ hasBackdrop: true,
210
+ backdropClass: 'cdk-overlay-dark-backdrop',
211
+ scrollStrategy: this.overlay.scrollStrategies.block(),
212
+ panelClass: ['sidebar-drawer'],
213
+ });
214
+ const portal = new TemplatePortal(this.drawerTpl(), this.vcr);
215
+ const viewRef = this.drawerRef.attach(portal);
216
+ viewRef.detectChanges();
217
+ const root = this.drawerRef.overlayElement;
218
+ this.focusTrap = this.focusTrapFactory.create(root);
219
+ this.previouslyFocused = this.doc.activeElement;
220
+ queueMicrotask(() => this.focusTrap?.focusInitialElementWhenReady());
221
+ this.drawerRef
222
+ .backdropClick()
223
+ .pipe(takeUntilDestroyed(this.destroyRef))
224
+ .subscribe(() => this.nav.closeMobile());
225
+ this.drawerRef
226
+ .keydownEvents()
227
+ .pipe(filter((e) => e.key === 'Escape'), takeUntilDestroyed(this.destroyRef))
228
+ .subscribe(() => this.nav.closeMobile());
229
+ }
230
+ closeDrawer() {
231
+ if (!this.drawerRef)
232
+ return;
233
+ this.focusTrap?.destroy();
234
+ this.focusTrap = null;
235
+ this.drawerRef.dispose();
236
+ this.drawerRef = null;
237
+ this.previouslyFocused?.focus?.();
238
+ this.previouslyFocused = null;
239
+ }
240
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
241
+ 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: `
242
+ <div [class]="innerClasses()">
243
+ <ng-container [ngTemplateOutlet]="body" />
244
+ </div>
245
+
246
+ <ng-template #body>
247
+ @if (header()) {
248
+ <div [class]="headerClasses()">
249
+ <div [class]="headerSlotClasses()">
250
+ <ng-content select="[sidebar-header]" />
251
+ </div>
252
+ @if (!isMobile() && !isCompact()) {
253
+ <button
254
+ type="button"
255
+ data-sidebar-toggle
256
+ 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"
257
+ [attr.aria-label]="toggleButtonLabel()"
258
+ [attr.title]="toggleButtonLabel()"
259
+ [attr.aria-pressed]="resolvedAppearance() === 'thin'"
260
+ (click)="toggleAppearance($event)">
261
+ <ui-nav-icon name="view_sidebar" [size]="18" class="text-current" />
262
+ </button>
263
+ }
264
+ </div>
265
+ }
266
+ <ui-scroll-area class="min-h-0 flex-1" [viewportClass]="scrollViewportClasses()">
267
+ <nav [class]="navClasses()">
268
+ @for (item of resolvedItems(); track item.id) {
269
+ <ui-nav-item [item]="item" [compact]="isCompact()" />
270
+ }
271
+ </nav>
272
+ </ui-scroll-area>
273
+ <div [class]="footerClasses()">
274
+ <div [class]="footerSlotClasses()">
275
+ <ng-content select="[sidebar-footer]" />
276
+ </div>
277
+ </div>
278
+ </ng-template>
279
+
280
+ <ng-template #drawerTpl>
281
+ <div
282
+ role="dialog"
283
+ aria-modal="true"
284
+ [attr.aria-label]="ariaLabel()"
285
+ class="flex h-full w-72 max-w-[85vw] flex-col border-primary/30 text-foreground shadow-xl"
286
+ [class.border-r]="position() === 'left'"
287
+ [class.border-l]="position() === 'right'"
288
+ [class.border-primary/30]="position() === 'left' || position() === 'right'">
289
+ <ng-container [ngTemplateOutlet]="body" />
290
+ </div>
291
+ </ng-template>
292
+ `, 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 });
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SidebarComponent, decorators: [{
295
+ type: Component,
296
+ args: [{
297
+ selector: 'sidebar',
298
+ changeDetection: ChangeDetectionStrategy.OnPush,
299
+ imports: [NgTemplateOutlet, ScrollAreaComponent, UiNavIconComponent, UiNavItemComponent],
300
+ host: {
301
+ role: 'navigation',
302
+ '[attr.aria-label]': 'ariaLabel()',
303
+ '[class]': 'hostClasses()',
304
+ '[attr.data-appearance]': 'resolvedAppearance()',
305
+ '[attr.data-position]': 'position()',
306
+ '[attr.data-expanded]': 'isExpanded()',
307
+ '[hidden]': 'isMobile()',
308
+ '(mouseenter)': 'onHoverEnter()',
309
+ '(mouseleave)': 'onHoverLeave()',
310
+ '(focusin)': 'onHoverEnter()',
311
+ '(click)': 'onHostClick($event)',
312
+ },
313
+ template: `
314
+ <div [class]="innerClasses()">
315
+ <ng-container [ngTemplateOutlet]="body" />
316
+ </div>
317
+
318
+ <ng-template #body>
319
+ @if (header()) {
320
+ <div [class]="headerClasses()">
321
+ <div [class]="headerSlotClasses()">
322
+ <ng-content select="[sidebar-header]" />
323
+ </div>
324
+ @if (!isMobile() && !isCompact()) {
325
+ <button
326
+ type="button"
327
+ data-sidebar-toggle
328
+ 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"
329
+ [attr.aria-label]="toggleButtonLabel()"
330
+ [attr.title]="toggleButtonLabel()"
331
+ [attr.aria-pressed]="resolvedAppearance() === 'thin'"
332
+ (click)="toggleAppearance($event)">
333
+ <ui-nav-icon name="view_sidebar" [size]="18" class="text-current" />
334
+ </button>
335
+ }
336
+ </div>
337
+ }
338
+ <ui-scroll-area class="min-h-0 flex-1" [viewportClass]="scrollViewportClasses()">
339
+ <nav [class]="navClasses()">
340
+ @for (item of resolvedItems(); track item.id) {
341
+ <ui-nav-item [item]="item" [compact]="isCompact()" />
342
+ }
343
+ </nav>
344
+ </ui-scroll-area>
345
+ <div [class]="footerClasses()">
346
+ <div [class]="footerSlotClasses()">
347
+ <ng-content select="[sidebar-footer]" />
348
+ </div>
349
+ </div>
350
+ </ng-template>
351
+
352
+ <ng-template #drawerTpl>
353
+ <div
354
+ role="dialog"
355
+ aria-modal="true"
356
+ [attr.aria-label]="ariaLabel()"
357
+ class="flex h-full w-72 max-w-[85vw] flex-col border-primary/30 text-foreground shadow-xl"
358
+ [class.border-r]="position() === 'left'"
359
+ [class.border-l]="position() === 'right'"
360
+ [class.border-primary/30]="position() === 'left' || position() === 'right'">
361
+ <ng-container [ngTemplateOutlet]="body" />
362
+ </div>
363
+ </ng-template>
364
+ `,
365
+ }]
366
+ }], 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 }] }] } });
367
+
368
+ /**
369
+ * Generated bundle index. Do not edit.
370
+ */
371
+
372
+ export { SidebarComponent };
373
+ //# sourceMappingURL=ojiepermana-angular-navigation-sidebar.mjs.map