@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.
- package/README.md +76 -12
- package/component/accordion/package.json +4 -0
- package/component/alert/package.json +4 -0
- package/component/alert-dialog/package.json +4 -0
- package/component/aspect-ratio/package.json +4 -0
- package/component/avatar/package.json +4 -0
- package/component/badge/package.json +4 -0
- package/component/breadcrumb/package.json +4 -0
- package/component/button/package.json +4 -0
- package/component/button-group/package.json +4 -0
- package/component/calendar/package.json +4 -0
- package/component/card/package.json +4 -0
- package/component/carousel/package.json +4 -0
- package/component/chart/area/package.json +4 -0
- package/component/chart/bar/package.json +4 -0
- package/component/chart/line/package.json +4 -0
- package/component/chart/package.json +4 -0
- package/component/chart/pie/package.json +4 -0
- package/component/chart/radar/package.json +4 -0
- package/component/chart/radial/package.json +4 -0
- package/component/chart/scatter/package.json +4 -0
- package/component/checkbox/package.json +4 -0
- package/component/collapsible/package.json +4 -0
- package/component/combobox/package.json +4 -0
- package/component/command/package.json +4 -0
- package/component/context-menu/package.json +4 -0
- package/component/date-picker/package.json +4 -0
- package/component/dialog/package.json +4 -0
- package/component/drawer/package.json +4 -0
- package/component/dropdown-menu/package.json +4 -0
- package/component/form/package.json +4 -0
- package/component/input/package.json +4 -0
- package/component/input-group/package.json +4 -0
- package/component/item/package.json +4 -0
- package/component/label/package.json +4 -0
- package/component/pagination/package.json +4 -0
- package/component/popover/package.json +4 -0
- package/component/progress/package.json +4 -0
- package/component/radio/package.json +4 -0
- package/component/scroll-area/package.json +4 -0
- package/component/select/package.json +4 -0
- package/component/separator/package.json +4 -0
- package/component/sheet/package.json +4 -0
- package/component/skeleton/package.json +4 -0
- package/component/slider/package.json +4 -0
- package/component/switch/package.json +4 -0
- package/component/table/package.json +4 -0
- package/component/tabs/package.json +4 -0
- package/component/textarea/package.json +4 -0
- package/component/toast/package.json +4 -0
- package/component/tooltip/package.json +4 -0
- package/component/utils/package.json +4 -0
- package/fesm2022/{ojiepermana-angular-ui-component-accordion.mjs → ojiepermana-angular-component-accordion.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-accordion.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-alert-dialog.mjs → ojiepermana-angular-component-alert-dialog.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-alert.mjs → ojiepermana-angular-component-alert.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-alert.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-aspect-ratio.mjs → ojiepermana-angular-component-aspect-ratio.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-avatar.mjs → ojiepermana-angular-component-avatar.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-avatar.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-badge.mjs → ojiepermana-angular-component-badge.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-badge.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-breadcrumb.mjs → ojiepermana-angular-component-breadcrumb.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-button-group.mjs → ojiepermana-angular-component-button-group.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-button-group.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-button.mjs → ojiepermana-angular-component-button.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-button.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-calendar.mjs → ojiepermana-angular-component-calendar.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-calendar.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-card.mjs → ojiepermana-angular-component-card.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-card.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-carousel.mjs → ojiepermana-angular-component-carousel.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-carousel.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-area.mjs → ojiepermana-angular-component-chart-area.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-area.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-bar.mjs → ojiepermana-angular-component-chart-bar.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-bar.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-line.mjs → ojiepermana-angular-component-chart-line.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-line.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-pie.mjs → ojiepermana-angular-component-chart-pie.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-pie.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-radar.mjs → ojiepermana-angular-component-chart-radar.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-radar.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-radial.mjs → ojiepermana-angular-component-chart-radial.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-radial.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart-scatter.mjs → ojiepermana-angular-component-chart-scatter.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart-scatter.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-chart.mjs → ojiepermana-angular-component-chart.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-chart.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-checkbox.mjs → ojiepermana-angular-component-checkbox.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-checkbox.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-collapsible.mjs → ojiepermana-angular-component-collapsible.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-collapsible.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-combobox.mjs → ojiepermana-angular-component-combobox.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-combobox.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-command.mjs → ojiepermana-angular-component-command.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-command.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-context-menu.mjs → ojiepermana-angular-component-context-menu.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-context-menu.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-date-picker.mjs → ojiepermana-angular-component-date-picker.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-date-picker.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-dialog.mjs → ojiepermana-angular-component-dialog.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-dialog.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-drawer.mjs → ojiepermana-angular-component-drawer.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-drawer.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-dropdown-menu.mjs → ojiepermana-angular-component-dropdown-menu.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-form.mjs → ojiepermana-angular-component-form.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-form.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-input-group.mjs → ojiepermana-angular-component-input-group.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-input-group.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-input.mjs → ojiepermana-angular-component-input.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-input.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-item.mjs → ojiepermana-angular-component-item.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-item.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-label.mjs → ojiepermana-angular-component-label.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-label.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-pagination.mjs → ojiepermana-angular-component-pagination.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-pagination.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-popover.mjs → ojiepermana-angular-component-popover.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-popover.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-progress.mjs → ojiepermana-angular-component-progress.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-progress.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-radio.mjs → ojiepermana-angular-component-radio.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-radio.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-scroll-area.mjs → ojiepermana-angular-component-scroll-area.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-scroll-area.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-select.mjs → ojiepermana-angular-component-select.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-select.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-separator.mjs → ojiepermana-angular-component-separator.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-separator.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-sheet.mjs → ojiepermana-angular-component-sheet.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-sheet.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-skeleton.mjs → ojiepermana-angular-component-skeleton.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-skeleton.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-slider.mjs → ojiepermana-angular-component-slider.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-slider.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-switch.mjs → ojiepermana-angular-component-switch.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-switch.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-table.mjs → ojiepermana-angular-component-table.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-table.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-tabs.mjs → ojiepermana-angular-component-tabs.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-tabs.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-textarea.mjs → ojiepermana-angular-component-textarea.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-textarea.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-toast.mjs → ojiepermana-angular-component-toast.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-toast.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-tooltip.mjs → ojiepermana-angular-component-tooltip.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-tooltip.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-ui-component-utils.mjs → ojiepermana-angular-component-utils.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-component-utils.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-generator-api.mjs +2 -1
- package/fesm2022/ojiepermana-angular-generator-api.mjs.map +1 -1
- package/fesm2022/{ojiepermana-angular-layout-theme.mjs → ojiepermana-angular-layout-component.mjs} +1 -1
- package/fesm2022/ojiepermana-angular-layout-component.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-empty.mjs +49 -0
- package/fesm2022/ojiepermana-angular-layout-empty.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-horizontal.mjs +119 -0
- package/fesm2022/ojiepermana-angular-layout-horizontal.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-provider.mjs +21 -0
- package/fesm2022/ojiepermana-angular-layout-provider.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-services.mjs +114 -0
- package/fesm2022/ojiepermana-angular-layout-services.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-shell.mjs +48 -0
- package/fesm2022/ojiepermana-angular-layout-shell.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-token-directive.mjs +27 -0
- package/fesm2022/ojiepermana-angular-layout-token-directive.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-token.mjs +33 -0
- package/fesm2022/ojiepermana-angular-layout-token.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout-vertical.mjs +113 -0
- package/fesm2022/ojiepermana-angular-layout-vertical.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout.mjs +140 -137
- package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs +334 -0
- package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-icon.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-item.mjs +548 -0
- package/fesm2022/ojiepermana-angular-navigation-item.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-service.mjs +204 -0
- package/fesm2022/ojiepermana-angular-navigation-service.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs +373 -0
- package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-topbar.mjs +433 -0
- package/fesm2022/ojiepermana-angular-navigation-topbar.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-navigation-types.mjs +4 -0
- package/fesm2022/ojiepermana-angular-navigation-types.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-provider.mjs +35 -0
- package/fesm2022/ojiepermana-angular-theme-provider.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-services.mjs +286 -0
- package/fesm2022/ojiepermana-angular-theme-services.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-token.mjs +56 -0
- package/fesm2022/ojiepermana-angular-theme-token.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme.mjs +31 -56
- package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular.mjs +3 -4
- package/fesm2022/ojiepermana-angular.mjs.map +1 -1
- package/generator/api/README.md +18 -15
- package/generator/api/bin/schematics/init/index.js +4 -2
- package/generator/api/bin/src/config/schema.js +2 -1
- package/generator/api/bin/src/emit/navigation.js +1 -1
- package/generator/api/bin/src/layout/per-domain.js +7 -3
- package/generator/api/sdk.config.example.json +4 -2
- package/layout/component/package.json +4 -0
- package/layout/empty/package.json +4 -0
- package/layout/horizontal/package.json +4 -0
- package/layout/provider/package.json +4 -0
- package/layout/services/package.json +4 -0
- package/layout/shell/package.json +4 -0
- package/layout/token/directive/package.json +4 -0
- package/layout/token/package.json +4 -0
- package/layout/vertical/package.json +4 -0
- package/navigation/demo-data/package.json +4 -0
- package/navigation/icon/package.json +4 -0
- package/navigation/item/package.json +4 -0
- package/navigation/service/package.json +4 -0
- package/navigation/sidebar/package.json +4 -0
- package/navigation/topbar/package.json +4 -0
- package/navigation/types/package.json +4 -0
- package/package.json +196 -128
- package/theme/README.md +67 -0
- package/theme/provider/package.json +4 -0
- package/theme/services/package.json +4 -0
- package/theme/styles/index.css +12 -7
- package/theme/token/package.json +4 -0
- package/types/{ojiepermana-angular-ui-component-chart.d.ts → ojiepermana-angular-component-chart.d.ts} +15 -15
- package/types/ojiepermana-angular-generator-api.d.ts +2 -1
- package/types/ojiepermana-angular-layout-empty.d.ts +22 -0
- package/types/ojiepermana-angular-layout-horizontal.d.ts +36 -0
- package/types/ojiepermana-angular-layout-provider.d.ts +6 -0
- package/types/ojiepermana-angular-layout-services.d.ts +25 -0
- package/types/ojiepermana-angular-layout-shell.d.ts +8 -0
- package/types/ojiepermana-angular-layout-token-directive.d.ts +13 -0
- package/types/ojiepermana-angular-layout-token.d.ts +36 -0
- package/types/ojiepermana-angular-layout-vertical.d.ts +38 -0
- package/types/ojiepermana-angular-layout.d.ts +26 -25
- package/types/ojiepermana-angular-navigation-demo-data.d.ts +5 -0
- package/types/ojiepermana-angular-navigation-item.d.ts +54 -0
- package/types/ojiepermana-angular-navigation-service.d.ts +77 -0
- package/types/ojiepermana-angular-navigation-sidebar.d.ts +75 -0
- package/types/ojiepermana-angular-navigation-topbar.d.ts +54 -0
- package/types/ojiepermana-angular-navigation-types.d.ts +129 -0
- package/types/ojiepermana-angular-theme-provider.d.ts +11 -0
- package/types/ojiepermana-angular-theme-services.d.ts +55 -0
- package/types/ojiepermana-angular-theme-token.d.ts +57 -0
- package/types/ojiepermana-angular-theme.d.ts +11 -66
- package/fesm2022/ojiepermana-angular-layout-theme.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-navigation.mjs +0 -2317
- package/fesm2022/ojiepermana-angular-navigation.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-accordion.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-alert-dialog.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-alert.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-aspect-ratio.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-avatar.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-badge.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-breadcrumb.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-button-group.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-button.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-calendar.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-card.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-carousel.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-area.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-bar.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-line.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-pie.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-radar.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-radial.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart-scatter.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-chart.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-checkbox.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-collapsible.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-combobox.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-command.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-context-menu.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-date-picker.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-dialog.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-drawer.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-dropdown-menu.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-form.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-input-group.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-input.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-item.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-label.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-pagination.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-popover.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-progress.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-radio.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-scroll-area.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-select.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-separator.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-sheet.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-skeleton.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-slider.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-switch.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-table.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-tabs.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-textarea.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-toast.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-tooltip.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-ui-component-utils.mjs.map +0 -1
- package/layout/theme/package.json +0 -4
- package/navigation/package.json +0 -4
- package/navigation-icon/package.json +0 -4
- package/types/ojiepermana-angular-navigation.d.ts +0 -375
- package/ui/component/accordion/package.json +0 -4
- package/ui/component/alert/package.json +0 -4
- package/ui/component/alert-dialog/package.json +0 -4
- package/ui/component/aspect-ratio/package.json +0 -4
- package/ui/component/avatar/package.json +0 -4
- package/ui/component/badge/package.json +0 -4
- package/ui/component/breadcrumb/package.json +0 -4
- package/ui/component/button/package.json +0 -4
- package/ui/component/button-group/package.json +0 -4
- package/ui/component/calendar/package.json +0 -4
- package/ui/component/card/package.json +0 -4
- package/ui/component/carousel/package.json +0 -4
- package/ui/component/chart/area/package.json +0 -4
- package/ui/component/chart/bar/package.json +0 -4
- package/ui/component/chart/line/package.json +0 -4
- package/ui/component/chart/package.json +0 -4
- package/ui/component/chart/pie/package.json +0 -4
- package/ui/component/chart/radar/package.json +0 -4
- package/ui/component/chart/radial/package.json +0 -4
- package/ui/component/chart/scatter/package.json +0 -4
- package/ui/component/checkbox/package.json +0 -4
- package/ui/component/collapsible/package.json +0 -4
- package/ui/component/combobox/package.json +0 -4
- package/ui/component/command/package.json +0 -4
- package/ui/component/context-menu/package.json +0 -4
- package/ui/component/date-picker/package.json +0 -4
- package/ui/component/dialog/package.json +0 -4
- package/ui/component/drawer/package.json +0 -4
- package/ui/component/dropdown-menu/package.json +0 -4
- package/ui/component/form/package.json +0 -4
- package/ui/component/input/package.json +0 -4
- package/ui/component/input-group/package.json +0 -4
- package/ui/component/item/package.json +0 -4
- package/ui/component/label/package.json +0 -4
- package/ui/component/pagination/package.json +0 -4
- package/ui/component/popover/package.json +0 -4
- package/ui/component/progress/package.json +0 -4
- package/ui/component/radio/package.json +0 -4
- package/ui/component/scroll-area/package.json +0 -4
- package/ui/component/select/package.json +0 -4
- package/ui/component/separator/package.json +0 -4
- package/ui/component/sheet/package.json +0 -4
- package/ui/component/skeleton/package.json +0 -4
- package/ui/component/slider/package.json +0 -4
- package/ui/component/switch/package.json +0 -4
- package/ui/component/table/package.json +0 -4
- package/ui/component/tabs/package.json +0 -4
- package/ui/component/textarea/package.json +0 -4
- package/ui/component/toast/package.json +0 -4
- package/ui/component/tooltip/package.json +0 -4
- package/ui/component/utils/package.json +0 -4
- /package/{ui/component → component}/chart/README.md +0 -0
- /package/theme/styles/{themes/library/_components.css → foundation/components.css} +0 -0
- /package/theme/styles/{themes/library/_layers.css → foundation/layers.css} +0 -0
- /package/theme/styles/{themes/library/_tokens.css → foundation/tokens.css} +0 -0
- /package/theme/styles/{themes/library/_material-overrides.css → integrations/material.css} +0 -0
- /package/theme/styles/{themes → integrations}/tailwind.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/amber.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/base.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/blue.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/cyan.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/emerald.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/fuchsia.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/green.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/index.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/indigo.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/lime.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/orange.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/pink.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/purple.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/red.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/rose.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/sky.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/teal.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/violet.css +0 -0
- /package/theme/styles/{themes/library → variants}/color/yellow.css +0 -0
- /package/theme/styles/{themes → variants}/mode/dark.css +0 -0
- /package/theme/styles/{themes → variants}/mode/index.css +0 -0
- /package/theme/styles/{themes → variants}/mode/light.css +0 -0
- /package/theme/styles/{themes/library → variants}/style/brutal.css +0 -0
- /package/theme/styles/{themes/library → variants}/style/default.css +0 -0
- /package/theme/styles/{themes/library → variants}/style/index.css +0 -0
- /package/theme/styles/{themes/library → variants}/style/sharp.css +0 -0
- /package/theme/styles/{themes/library → variants}/style/soft.css +0 -0
- /package/types/{ojiepermana-angular-ui-component-accordion.d.ts → ojiepermana-angular-component-accordion.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-alert-dialog.d.ts → ojiepermana-angular-component-alert-dialog.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-alert.d.ts → ojiepermana-angular-component-alert.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-aspect-ratio.d.ts → ojiepermana-angular-component-aspect-ratio.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-avatar.d.ts → ojiepermana-angular-component-avatar.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-badge.d.ts → ojiepermana-angular-component-badge.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-breadcrumb.d.ts → ojiepermana-angular-component-breadcrumb.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-button-group.d.ts → ojiepermana-angular-component-button-group.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-button.d.ts → ojiepermana-angular-component-button.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-calendar.d.ts → ojiepermana-angular-component-calendar.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-card.d.ts → ojiepermana-angular-component-card.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-carousel.d.ts → ojiepermana-angular-component-carousel.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-area.d.ts → ojiepermana-angular-component-chart-area.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-bar.d.ts → ojiepermana-angular-component-chart-bar.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-line.d.ts → ojiepermana-angular-component-chart-line.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-pie.d.ts → ojiepermana-angular-component-chart-pie.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-radar.d.ts → ojiepermana-angular-component-chart-radar.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-radial.d.ts → ojiepermana-angular-component-chart-radial.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-chart-scatter.d.ts → ojiepermana-angular-component-chart-scatter.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-checkbox.d.ts → ojiepermana-angular-component-checkbox.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-collapsible.d.ts → ojiepermana-angular-component-collapsible.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-combobox.d.ts → ojiepermana-angular-component-combobox.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-command.d.ts → ojiepermana-angular-component-command.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-context-menu.d.ts → ojiepermana-angular-component-context-menu.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-date-picker.d.ts → ojiepermana-angular-component-date-picker.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-dialog.d.ts → ojiepermana-angular-component-dialog.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-drawer.d.ts → ojiepermana-angular-component-drawer.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-dropdown-menu.d.ts → ojiepermana-angular-component-dropdown-menu.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-form.d.ts → ojiepermana-angular-component-form.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-input-group.d.ts → ojiepermana-angular-component-input-group.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-input.d.ts → ojiepermana-angular-component-input.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-item.d.ts → ojiepermana-angular-component-item.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-label.d.ts → ojiepermana-angular-component-label.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-pagination.d.ts → ojiepermana-angular-component-pagination.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-popover.d.ts → ojiepermana-angular-component-popover.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-progress.d.ts → ojiepermana-angular-component-progress.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-radio.d.ts → ojiepermana-angular-component-radio.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-scroll-area.d.ts → ojiepermana-angular-component-scroll-area.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-select.d.ts → ojiepermana-angular-component-select.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-separator.d.ts → ojiepermana-angular-component-separator.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-sheet.d.ts → ojiepermana-angular-component-sheet.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-skeleton.d.ts → ojiepermana-angular-component-skeleton.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-slider.d.ts → ojiepermana-angular-component-slider.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-switch.d.ts → ojiepermana-angular-component-switch.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-table.d.ts → ojiepermana-angular-component-table.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-tabs.d.ts → ojiepermana-angular-component-tabs.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-textarea.d.ts → ojiepermana-angular-component-textarea.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-toast.d.ts → ojiepermana-angular-component-toast.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-tooltip.d.ts → ojiepermana-angular-component-tooltip.d.ts} +0 -0
- /package/types/{ojiepermana-angular-ui-component-utils.d.ts → ojiepermana-angular-component-utils.d.ts} +0 -0
- /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
|