@ojiepermana/angular 22.1.11 → 22.1.12
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 +32 -26
- package/chart/README.md +272 -0
- package/component/README.md +89 -0
- package/component/accordion/README.md +195 -0
- package/component/alert/README.md +184 -0
- package/component/alert-dialog/README.md +255 -0
- package/component/aspect-ratio/README.md +116 -0
- package/component/avatar/README.md +182 -0
- package/component/badge/README.md +143 -0
- package/component/breadcrumb/README.md +223 -0
- package/component/button/README.md +141 -0
- package/component/button-group/README.md +214 -0
- package/component/calendar/README.md +137 -0
- package/component/card/README.md +232 -0
- package/component/carousel/README.md +276 -0
- package/component/checkbox/README.md +153 -0
- package/component/collapsible/README.md +216 -0
- package/component/combobox/README.md +202 -0
- package/component/command/README.md +287 -0
- package/component/composer/README.md +241 -0
- package/component/context-menu/README.md +268 -0
- package/component/date-picker/README.md +202 -0
- package/component/dialog/README.md +276 -0
- package/component/drawer/README.md +147 -0
- package/component/dropdown-menu/README.md +336 -0
- package/component/editor/README.md +152 -0
- package/component/empty/README.md +193 -0
- package/component/form/README.md +216 -0
- package/component/hover-card/README.md +150 -0
- package/component/icon/README.md +25 -0
- package/component/input/README.md +160 -0
- package/component/input-group/README.md +245 -0
- package/component/input-otp/README.md +331 -0
- package/component/item/README.md +254 -0
- package/component/kanban/README.md +81 -0
- package/component/kbd/README.md +141 -0
- package/component/label/README.md +137 -0
- package/component/menubar/README.md +270 -0
- package/component/native-select/README.md +176 -0
- package/component/navigation-menu/README.md +165 -0
- package/component/pagination/README.md +151 -0
- package/component/pillbox/README.md +68 -0
- package/component/popover/README.md +54 -0
- package/component/progress/README.md +160 -0
- package/component/radio/README.md +212 -0
- package/component/resizable/README.md +178 -0
- package/component/scroll-area/README.md +150 -0
- package/component/select/README.md +228 -0
- package/component/separator/README.md +175 -0
- package/component/sheet/README.md +190 -0
- package/component/skeleton/README.md +158 -0
- package/component/slider/README.md +207 -0
- package/component/spinner/README.md +160 -0
- package/component/switch/README.md +170 -0
- package/component/table/README.md +292 -0
- package/component/tabs/README.md +220 -0
- package/component/textarea/README.md +169 -0
- package/component/timeline/README.md +94 -0
- package/component/toast/README.md +173 -0
- package/component/toggle/README.md +133 -0
- package/component/toggle-group/README.md +234 -0
- package/component/tooltip/README.md +230 -0
- package/fesm2022/ojiepermana-angular-chart-area.mjs +289 -3
- package/fesm2022/ojiepermana-angular-chart-bar.mjs +722 -3
- package/fesm2022/ojiepermana-angular-chart-core.mjs +1482 -3
- package/fesm2022/ojiepermana-angular-chart-line.mjs +294 -3
- package/fesm2022/ojiepermana-angular-chart-pie.mjs +291 -3
- package/fesm2022/ojiepermana-angular-chart-primitives.mjs +1301 -3
- package/fesm2022/ojiepermana-angular-chart-radar.mjs +421 -3
- package/fesm2022/ojiepermana-angular-chart-radial.mjs +295 -3
- package/fesm2022/ojiepermana-angular-chart-scatter.mjs +306 -3
- package/fesm2022/ojiepermana-angular-chart.mjs +12 -3
- package/fesm2022/ojiepermana-angular-component-accordion.mjs +267 -3
- package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +359 -3
- package/fesm2022/ojiepermana-angular-component-alert.mjs +101 -3
- package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +31 -3
- package/fesm2022/ojiepermana-angular-component-avatar.mjs +139 -3
- package/fesm2022/ojiepermana-angular-component-badge.mjs +57 -3
- package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +192 -3
- package/fesm2022/ojiepermana-angular-component-button-group.mjs +95 -3
- package/fesm2022/ojiepermana-angular-component-button.mjs +73 -3
- package/fesm2022/ojiepermana-angular-component-calendar.mjs +718 -3
- package/fesm2022/ojiepermana-angular-component-card.mjs +167 -3
- package/fesm2022/ojiepermana-angular-component-carousel.mjs +326 -3
- package/fesm2022/ojiepermana-angular-component-checkbox.mjs +190 -3
- package/fesm2022/ojiepermana-angular-component-collapsible.mjs +117 -3
- package/fesm2022/ojiepermana-angular-component-combobox.mjs +327 -3
- package/fesm2022/ojiepermana-angular-component-command.mjs +351 -3
- package/fesm2022/ojiepermana-angular-component-composer.mjs +359 -3
- package/fesm2022/ojiepermana-angular-component-context-menu.mjs +158 -3
- package/fesm2022/ojiepermana-angular-component-date-picker.mjs +482 -3
- package/fesm2022/ojiepermana-angular-component-dialog.mjs +400 -3
- package/fesm2022/ojiepermana-angular-component-drawer.mjs +1 -3
- package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +689 -3
- package/fesm2022/ojiepermana-angular-component-editor.mjs +511 -3
- package/fesm2022/ojiepermana-angular-component-empty.mjs +134 -3
- package/fesm2022/ojiepermana-angular-component-form.mjs +438 -3
- package/fesm2022/ojiepermana-angular-component-hover-card.mjs +273 -3
- package/fesm2022/ojiepermana-angular-component-icon.mjs +139 -3
- package/fesm2022/ojiepermana-angular-component-input-group.mjs +176 -3
- package/fesm2022/ojiepermana-angular-component-input-otp.mjs +550 -3
- package/fesm2022/ojiepermana-angular-component-input.mjs +52 -3
- package/fesm2022/ojiepermana-angular-component-item.mjs +264 -3
- package/fesm2022/ojiepermana-angular-component-kanban.mjs +310 -3
- package/fesm2022/ojiepermana-angular-component-kbd.mjs +48 -3
- package/fesm2022/ojiepermana-angular-component-label.mjs +27 -3
- package/fesm2022/ojiepermana-angular-component-menubar.mjs +327 -3
- package/fesm2022/ojiepermana-angular-component-native-select.mjs +62 -3
- package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +378 -3
- package/fesm2022/ojiepermana-angular-component-pagination.mjs +238 -3
- package/fesm2022/ojiepermana-angular-component-pillbox.mjs +999 -3
- package/fesm2022/ojiepermana-angular-component-popover.mjs +201 -3
- package/fesm2022/ojiepermana-angular-component-progress.mjs +57 -3
- package/fesm2022/ojiepermana-angular-component-radio.mjs +180 -3
- package/fesm2022/ojiepermana-angular-component-resizable.mjs +493 -3
- package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +51 -3
- package/fesm2022/ojiepermana-angular-component-segmented-control.mjs +227 -3
- package/fesm2022/ojiepermana-angular-component-select.mjs +609 -3
- package/fesm2022/ojiepermana-angular-component-separator.mjs +31 -3
- package/fesm2022/ojiepermana-angular-component-sheet.mjs +407 -3
- package/fesm2022/ojiepermana-angular-component-skeleton.mjs +25 -3
- package/fesm2022/ojiepermana-angular-component-slider.mjs +456 -3
- package/fesm2022/ojiepermana-angular-component-spinner.mjs +56 -3
- package/fesm2022/ojiepermana-angular-component-switch.mjs +145 -3
- package/fesm2022/ojiepermana-angular-component-table.mjs +155 -3
- package/fesm2022/ojiepermana-angular-component-tabs.mjs +315 -3
- package/fesm2022/ojiepermana-angular-component-textarea.mjs +46 -3
- package/fesm2022/ojiepermana-angular-component-timeline.mjs +237 -3
- package/fesm2022/ojiepermana-angular-component-toast.mjs +241 -3
- package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +290 -3
- package/fesm2022/ojiepermana-angular-component-toggle.mjs +76 -3
- package/fesm2022/ojiepermana-angular-component-tooltip.mjs +519 -3
- package/fesm2022/ojiepermana-angular-component-utils-core.mjs +310 -3
- package/fesm2022/ojiepermana-angular-component-utils-overlay.mjs +62 -3
- package/fesm2022/ojiepermana-angular-component-utils-scale.mjs +34 -3
- package/fesm2022/ojiepermana-angular-component-utils.mjs +3 -2
- package/fesm2022/ojiepermana-angular-component.mjs +4 -4
- package/fesm2022/ojiepermana-angular-navigation-core.mjs +21 -3
- package/fesm2022/ojiepermana-angular-navigation-icon.mjs +20 -3
- package/fesm2022/ojiepermana-angular-navigation-navigation-badge-count.component-CDBxQ8rk.mjs +91 -0
- package/fesm2022/ojiepermana-angular-navigation-navigation-dockbar-menu.component-DBQHdvGa.mjs +512 -0
- package/fesm2022/ojiepermana-angular-navigation-navigation-entry-grid.component-Cd-jh6tg.mjs +623 -0
- package/fesm2022/ojiepermana-angular-navigation-navigation-flyout-menu.component-BCGvhoYj.mjs +404 -0
- package/fesm2022/ojiepermana-angular-navigation-navigation-horizontal.component-Dk_03e-6.mjs +466 -0
- package/fesm2022/ojiepermana-angular-navigation-ojiepermana-angular-navigation-DNKU6viC.mjs +2642 -0
- package/fesm2022/ojiepermana-angular-navigation-service.mjs +725 -3
- package/fesm2022/ojiepermana-angular-navigation-types.mjs +65 -4
- package/fesm2022/ojiepermana-angular-navigation.mjs +4 -10
- package/fesm2022/ojiepermana-angular-sdk.mjs +204 -4
- package/fesm2022/ojiepermana-angular-theme-component-settings.mjs +1387 -3
- package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +331 -3
- package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +45 -4
- package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +1044 -3
- package/fesm2022/ojiepermana-angular-theme-layout.mjs +729 -3
- package/fesm2022/ojiepermana-angular-theme-page-core.mjs +381 -3
- package/fesm2022/ojiepermana-angular-theme-page-filter.mjs +267 -3
- package/fesm2022/ojiepermana-angular-theme-page-root.mjs +361 -3
- package/fesm2022/ojiepermana-angular-theme-page-side.mjs +198 -3
- package/fesm2022/ojiepermana-angular-theme-page-slots.mjs +110 -3
- package/fesm2022/ojiepermana-angular-theme-page.mjs +7 -2
- package/fesm2022/ojiepermana-angular-theme-shell-services.mjs +338 -3
- package/fesm2022/ojiepermana-angular-theme-shell-types.mjs +160 -4
- package/fesm2022/ojiepermana-angular-theme-shell.mjs +811 -3
- package/fesm2022/ojiepermana-angular-theme-styles.mjs +783 -3
- package/fesm2022/ojiepermana-angular-theme.mjs +4 -4
- package/fesm2022/ojiepermana-angular.mjs +6 -11
- package/navigation/README.md +374 -0
- package/package.json +81 -20
- package/sdk/README.md +212 -0
- package/sdk/schematics/collection.json +20 -0
- package/sdk/schematics/init/index.js +83 -0
- package/sdk/schematics/init/schema.json +19 -0
- package/sdk/schematics/ng-add/index.js +147 -0
- package/sdk/schematics/ng-add/schema.json +14 -0
- package/sdk/schematics/package.json +3 -0
- package/sdk/schematics/sdk/index.js +175 -0
- package/sdk/schematics/sdk/schema.json +19 -0
- package/sdk/sdk.config.example.json +24 -0
- package/sdk/src/config/loader.js +43 -0
- package/sdk/src/config/schema.js +59 -0
- package/sdk/src/emit/client.js +251 -0
- package/sdk/src/emit/metadata.js +310 -0
- package/sdk/src/emit/models.js +104 -0
- package/sdk/src/emit/navigation.js +56 -0
- package/sdk/src/emit/operations.js +118 -0
- package/sdk/src/emit/public-api.js +54 -0
- package/sdk/src/emit/services.js +110 -0
- package/sdk/src/engine.js +67 -0
- package/sdk/src/layout/per-domain.js +360 -0
- package/sdk/src/package.json +3 -0
- package/sdk/src/parser/bundle.js +25 -0
- package/sdk/src/parser/ir.js +429 -0
- package/sdk/src/parser/types.js +7 -0
- package/sdk/src/render/template.js +152 -0
- package/sdk/src/writer/index.js +286 -0
- package/theme/README.md +126 -0
- package/theme/component/settings/README.md +135 -0
- package/theme/layout/README.md +539 -0
- package/theme/page/README.md +453 -0
- package/theme/shell/README.md +340 -0
- package/theme/styles/README.md +178 -0
- package/theme/styles/css/base/components.css +553 -0
- package/theme/styles/css/base/index.css +14 -0
- package/theme/styles/css/base/package.css +9 -0
- package/theme/styles/css/base/prefers-dark.css +86 -0
- package/theme/styles/css/base/print.css +62 -0
- package/theme/styles/css/base/status.css +38 -0
- package/theme/styles/css/base/tailwind.css +165 -0
- package/theme/styles/css/base/theme.css +373 -0
- package/theme/styles/css/base/tokens.css +361 -0
- package/theme/styles/css/color/amber.css +72 -0
- package/theme/styles/css/color/blue.css +72 -0
- package/theme/styles/css/color/brand.css +38 -0
- package/theme/styles/css/color/cyan.css +72 -0
- package/theme/styles/css/color/emerald.css +72 -0
- package/theme/styles/css/color/fuchsia.css +72 -0
- package/theme/styles/css/color/green.css +72 -0
- package/theme/styles/css/color/index.css +19 -0
- package/theme/styles/css/color/indigo.css +72 -0
- package/theme/styles/css/color/lime.css +72 -0
- package/theme/styles/css/color/orange.css +72 -0
- package/theme/styles/css/color/pink.css +72 -0
- package/theme/styles/css/color/purple.css +72 -0
- package/theme/styles/css/color/red.css +72 -0
- package/theme/styles/css/color/rose.css +72 -0
- package/theme/styles/css/color/sky.css +72 -0
- package/theme/styles/css/color/teal.css +72 -0
- package/theme/styles/css/color/violet.css +72 -0
- package/theme/styles/css/color/yellow.css +72 -0
- package/theme/styles/css/index.css +18 -0
- package/theme/styles/css/neutral/gray.css +63 -0
- package/theme/styles/css/neutral/index.css +11 -0
- package/theme/styles/css/neutral/mauve.css +63 -0
- package/theme/styles/css/neutral/mist.css +63 -0
- package/theme/styles/css/neutral/neutral.css +63 -0
- package/theme/styles/css/neutral/olive.css +63 -0
- package/theme/styles/css/neutral/slate.css +63 -0
- package/theme/styles/css/neutral/stone.css +63 -0
- package/theme/styles/css/neutral/taupe.css +63 -0
- package/theme/styles/css/neutral/zinc.css +63 -0
- package/theme/styles/css/radius/index.css +30 -0
- package/theme/styles/css/space/index.css +20 -0
- package/types/ojiepermana-angular-chart-area.d.ts +76 -1
- package/types/ojiepermana-angular-chart-bar.d.ts +201 -1
- package/types/ojiepermana-angular-chart-core.d.ts +811 -1
- package/types/ojiepermana-angular-chart-line.d.ts +75 -1
- package/types/ojiepermana-angular-chart-pie.d.ts +131 -1
- package/types/ojiepermana-angular-chart-primitives.d.ts +291 -1
- package/types/ojiepermana-angular-chart-radar.d.ts +116 -1
- package/types/ojiepermana-angular-chart-radial.d.ts +116 -1
- package/types/ojiepermana-angular-chart-scatter.d.ts +125 -1
- package/types/ojiepermana-angular-chart.d.ts +2 -1
- package/types/ojiepermana-angular-component-accordion.d.ts +85 -1
- package/types/ojiepermana-angular-component-alert-dialog.d.ts +140 -1
- package/types/ojiepermana-angular-component-alert.d.ts +42 -1
- package/types/ojiepermana-angular-component-aspect-ratio.d.ts +12 -1
- package/types/ojiepermana-angular-component-avatar.d.ts +56 -1
- package/types/ojiepermana-angular-component-badge.d.ts +24 -1
- package/types/ojiepermana-angular-component-breadcrumb.d.ts +46 -1
- package/types/ojiepermana-angular-component-button-group.d.ts +26 -1
- package/types/ojiepermana-angular-component-button.d.ts +27 -1
- package/types/ojiepermana-angular-component-calendar.d.ts +111 -1
- package/types/ojiepermana-angular-component-card.d.ts +69 -1
- package/types/ojiepermana-angular-component-carousel.d.ts +86 -1
- package/types/ojiepermana-angular-component-checkbox.d.ts +42 -1
- package/types/ojiepermana-angular-component-collapsible.d.ts +42 -1
- package/types/ojiepermana-angular-component-combobox.d.ts +60 -1
- package/types/ojiepermana-angular-component-command.d.ts +130 -1
- package/types/ojiepermana-angular-component-composer.d.ts +90 -1
- package/types/ojiepermana-angular-component-context-menu.d.ts +54 -1
- package/types/ojiepermana-angular-component-date-picker.d.ts +109 -1
- package/types/ojiepermana-angular-component-dialog.d.ts +136 -1
- package/types/ojiepermana-angular-component-drawer.d.ts +1 -1
- package/types/ojiepermana-angular-component-dropdown-menu.d.ts +248 -1
- package/types/ojiepermana-angular-component-editor.d.ts +135 -1
- package/types/ojiepermana-angular-component-empty.d.ts +50 -1
- package/types/ojiepermana-angular-component-form.d.ts +159 -1
- package/types/ojiepermana-angular-component-hover-card.d.ts +75 -1
- package/types/ojiepermana-angular-component-icon.d.ts +89 -1
- package/types/ojiepermana-angular-component-input-group.d.ts +51 -1
- package/types/ojiepermana-angular-component-input-otp.d.ts +155 -1
- package/types/ojiepermana-angular-component-input.d.ts +21 -1
- package/types/ojiepermana-angular-component-item.d.ts +93 -1
- package/types/ojiepermana-angular-component-kanban.d.ts +70 -1
- package/types/ojiepermana-angular-component-kbd.d.ts +16 -1
- package/types/ojiepermana-angular-component-label.d.ts +11 -1
- package/types/ojiepermana-angular-component-menubar.d.ts +93 -1
- package/types/ojiepermana-angular-component-native-select.d.ts +26 -1
- package/types/ojiepermana-angular-component-navigation-menu.d.ts +104 -1
- package/types/ojiepermana-angular-component-pagination.d.ts +33 -1
- package/types/ojiepermana-angular-component-pillbox.d.ts +222 -1
- package/types/ojiepermana-angular-component-popover.d.ts +66 -1
- package/types/ojiepermana-angular-component-progress.d.ts +17 -1
- package/types/ojiepermana-angular-component-radio.d.ts +60 -1
- package/types/ojiepermana-angular-component-resizable.d.ts +117 -1
- package/types/ojiepermana-angular-component-scroll-area.d.ts +19 -1
- package/types/ojiepermana-angular-component-segmented-control.d.ts +58 -1
- package/types/ojiepermana-angular-component-select.d.ts +122 -1
- package/types/ojiepermana-angular-component-separator.d.ts +14 -1
- package/types/ojiepermana-angular-component-sheet.d.ts +130 -1
- package/types/ojiepermana-angular-component-skeleton.d.ts +10 -1
- package/types/ojiepermana-angular-component-slider.d.ts +83 -1
- package/types/ojiepermana-angular-component-spinner.d.ts +13 -1
- package/types/ojiepermana-angular-component-switch.d.ts +44 -1
- package/types/ojiepermana-angular-component-table.d.ts +57 -1
- package/types/ojiepermana-angular-component-tabs.d.ts +124 -1
- package/types/ojiepermana-angular-component-textarea.d.ts +17 -1
- package/types/ojiepermana-angular-component-timeline.d.ts +64 -1
- package/types/ojiepermana-angular-component-toast.d.ts +64 -1
- package/types/ojiepermana-angular-component-toggle-group.d.ts +90 -1
- package/types/ojiepermana-angular-component-toggle.d.ts +25 -1
- package/types/ojiepermana-angular-component-tooltip.d.ts +143 -1
- package/types/ojiepermana-angular-component-utils-core.d.ts +184 -1
- package/types/ojiepermana-angular-component-utils-overlay.d.ts +21 -1
- package/types/ojiepermana-angular-component-utils-scale.d.ts +19 -1
- package/types/ojiepermana-angular-component-utils.d.ts +2 -1
- package/types/ojiepermana-angular-component.d.ts +2 -1
- package/types/ojiepermana-angular-navigation-core.d.ts +59 -1
- package/types/ojiepermana-angular-navigation-icon.d.ts +12 -1
- package/types/ojiepermana-angular-navigation-service.d.ts +116 -1
- package/types/ojiepermana-angular-navigation-types.d.ts +144 -1
- package/types/ojiepermana-angular-navigation.d.ts +507 -1
- package/types/ojiepermana-angular-sdk.d.ts +89 -1
- package/types/ojiepermana-angular-theme-component-settings.d.ts +154 -1
- package/types/ojiepermana-angular-theme-layout-services.d.ts +147 -1
- package/types/ojiepermana-angular-theme-layout-types.d.ts +40 -1
- package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +299 -1
- package/types/ojiepermana-angular-theme-layout.d.ts +129 -1
- package/types/ojiepermana-angular-theme-page-core.d.ts +157 -1
- package/types/ojiepermana-angular-theme-page-filter.d.ts +77 -1
- package/types/ojiepermana-angular-theme-page-root.d.ts +88 -1
- package/types/ojiepermana-angular-theme-page-side.d.ts +50 -1
- package/types/ojiepermana-angular-theme-page-slots.d.ts +40 -1
- package/types/ojiepermana-angular-theme-page.d.ts +5 -1
- package/types/ojiepermana-angular-theme-shell-services.d.ts +193 -1
- package/types/ojiepermana-angular-theme-shell-types.d.ts +105 -1
- package/types/ojiepermana-angular-theme-shell.d.ts +100 -1
- package/types/ojiepermana-angular-theme-styles.d.ts +319 -1
- package/types/ojiepermana-angular-theme.d.ts +2 -1
- package/types/ojiepermana-angular.d.ts +5 -5
|
@@ -1,7 +1,385 @@
|
|
|
1
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, computed, Service, effect } from '@angular/core';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
const PAGE_VARIANTS = ['stacked', 'side'];
|
|
5
|
+
const PAGE_SIDE_POSITIONS = ['left', 'right'];
|
|
6
|
+
const PAGE_SIDE_MODES = ['sticky', 'drawer', 'overlay'];
|
|
7
|
+
const PAGE_SCROLL_VALUES = ['content', 'page'];
|
|
8
|
+
const PAGE_HEIGHT_VALUES = ['auto', 'fix'];
|
|
9
|
+
/** Visual appearance shared with the layout/navigation axes — unifies borders. */
|
|
10
|
+
const PAGE_APPEARANCES = ['flat', 'border-rail'];
|
|
11
|
+
/** `PageFilter` placement: `stacked` = a bar between header and content; `side` = a column beside content. */
|
|
12
|
+
const PAGE_FILTER_PLACEMENTS = ['stacked', 'side'];
|
|
13
|
+
const PAGE_DEFAULT_VARIANT = 'stacked';
|
|
14
|
+
const PAGE_DEFAULT_SIDE_POSITION = 'left';
|
|
15
|
+
const PAGE_DEFAULT_SIDE_MODE = 'sticky';
|
|
16
|
+
const PAGE_DEFAULT_SCROLL = 'content';
|
|
17
|
+
const PAGE_DEFAULT_HEIGHT = 'auto';
|
|
18
|
+
const PAGE_DEFAULT_APPEARANCE = 'flat';
|
|
19
|
+
const PAGE_DEFAULT_SIDE_WIDTH = '16rem';
|
|
20
|
+
/** Placement default `PageFilter`. */
|
|
21
|
+
const PAGE_DEFAULT_FILTER_PLACEMENT = 'stacked';
|
|
22
|
+
/** Default `PageFilter` mode under `placement="side"`; `stacked` always behaves as `sticky`. */
|
|
23
|
+
const PAGE_DEFAULT_FILTER_MODE = 'sticky';
|
|
24
|
+
/** Default position of the `PageFilter` column under `placement="side"`. */
|
|
25
|
+
const PAGE_DEFAULT_FILTER_POSITION = 'left';
|
|
26
|
+
/** Default width of the `PageFilter` column under `placement="side"` (sticky/drawer/overlay). */
|
|
27
|
+
const PAGE_DEFAULT_FILTER_WIDTH = '18rem';
|
|
28
|
+
function isUiPageVariant(value) {
|
|
29
|
+
return value !== null && PAGE_VARIANTS.includes(value);
|
|
30
|
+
}
|
|
31
|
+
function isUiPageSidePosition(value) {
|
|
32
|
+
return value !== null && PAGE_SIDE_POSITIONS.includes(value);
|
|
33
|
+
}
|
|
34
|
+
function isUiPageSideMode(value) {
|
|
35
|
+
return value !== null && PAGE_SIDE_MODES.includes(value);
|
|
36
|
+
}
|
|
37
|
+
function isUiPageScroll(value) {
|
|
38
|
+
return value !== null && PAGE_SCROLL_VALUES.includes(value);
|
|
39
|
+
}
|
|
40
|
+
function isUiPageHeight(value) {
|
|
41
|
+
return value !== null && PAGE_HEIGHT_VALUES.includes(value);
|
|
42
|
+
}
|
|
43
|
+
function isUiPageAppearance(value) {
|
|
44
|
+
return value !== null && PAGE_APPEARANCES.includes(value);
|
|
45
|
+
}
|
|
46
|
+
function isUiPageFilterPlacement(value) {
|
|
47
|
+
return value !== null && PAGE_FILTER_PLACEMENTS.includes(value);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
class PageStateService {
|
|
51
|
+
variantState = signal(PAGE_DEFAULT_VARIANT, /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "variantState" }] : /* istanbul ignore next */ []));
|
|
53
|
+
heightState = signal(PAGE_DEFAULT_HEIGHT, /* @ts-ignore */
|
|
54
|
+
...(ngDevMode ? [{ debugName: "heightState" }] : /* istanbul ignore next */ []));
|
|
55
|
+
scrollState = signal(PAGE_DEFAULT_SCROLL, /* @ts-ignore */
|
|
56
|
+
...(ngDevMode ? [{ debugName: "scrollState" }] : /* istanbul ignore next */ []));
|
|
57
|
+
appearanceState = signal(PAGE_DEFAULT_APPEARANCE, /* @ts-ignore */
|
|
58
|
+
...(ngDevMode ? [{ debugName: "appearanceState" }] : /* istanbul ignore next */ []));
|
|
59
|
+
positionState = signal(PAGE_DEFAULT_SIDE_POSITION, /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "positionState" }] : /* istanbul ignore next */ []));
|
|
61
|
+
sideModeState = signal(PAGE_DEFAULT_SIDE_MODE, /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "sideModeState" }] : /* istanbul ignore next */ []));
|
|
63
|
+
internalSideOpenState = signal(false, /* @ts-ignore */
|
|
64
|
+
...(ngDevMode ? [{ debugName: "internalSideOpenState" }] : /* istanbul ignore next */ []));
|
|
65
|
+
controlledSideOpenState = signal(null, /* @ts-ignore */
|
|
66
|
+
...(ngDevMode ? [{ debugName: "controlledSideOpenState" }] : /* istanbul ignore next */ []));
|
|
67
|
+
sideWidthState = signal(PAGE_DEFAULT_SIDE_WIDTH, /* @ts-ignore */
|
|
68
|
+
...(ngDevMode ? [{ debugName: "sideWidthState" }] : /* istanbul ignore next */ []));
|
|
69
|
+
sideIdState = signal(null, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "sideIdState" }] : /* istanbul ignore next */ []));
|
|
71
|
+
sideOpenRequestState = signal(null, /* @ts-ignore */
|
|
72
|
+
...(ngDevMode ? [{ debugName: "sideOpenRequestState" }] : /* istanbul ignore next */ []));
|
|
73
|
+
sideOpenRequestVersionState = signal(0, /* @ts-ignore */
|
|
74
|
+
...(ngDevMode ? [{ debugName: "sideOpenRequestVersionState" }] : /* istanbul ignore next */ []));
|
|
75
|
+
sideReturnFocus = null;
|
|
76
|
+
/** Aktif saat apps-launcher mengambang di atas `PageHeader`; header memesan ruang kanan agar isinya tidak tertimpa. */
|
|
77
|
+
appsLauncherReserveState = signal(false, /* @ts-ignore */
|
|
78
|
+
...(ngDevMode ? [{ debugName: "appsLauncherReserveState" }] : /* istanbul ignore next */ []));
|
|
79
|
+
// Filter state — paralel dengan side state agar `PageFilter` punya open/close sendiri yang independen.
|
|
80
|
+
filterPlacementState = signal(PAGE_DEFAULT_FILTER_PLACEMENT, /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "filterPlacementState" }] : /* istanbul ignore next */ []));
|
|
82
|
+
filterModeState = signal(PAGE_DEFAULT_FILTER_MODE, /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "filterModeState" }] : /* istanbul ignore next */ []));
|
|
84
|
+
filterPositionState = signal(PAGE_DEFAULT_FILTER_POSITION, /* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [{ debugName: "filterPositionState" }] : /* istanbul ignore next */ []));
|
|
86
|
+
filterWidthState = signal(PAGE_DEFAULT_FILTER_WIDTH, /* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [{ debugName: "filterWidthState" }] : /* istanbul ignore next */ []));
|
|
88
|
+
filterIdState = signal(null, /* @ts-ignore */
|
|
89
|
+
...(ngDevMode ? [{ debugName: "filterIdState" }] : /* istanbul ignore next */ []));
|
|
90
|
+
internalFilterOpenState = signal(false, /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "internalFilterOpenState" }] : /* istanbul ignore next */ []));
|
|
92
|
+
controlledFilterOpenState = signal(null, /* @ts-ignore */
|
|
93
|
+
...(ngDevMode ? [{ debugName: "controlledFilterOpenState" }] : /* istanbul ignore next */ []));
|
|
94
|
+
filterOpenRequestState = signal(null, /* @ts-ignore */
|
|
95
|
+
...(ngDevMode ? [{ debugName: "filterOpenRequestState" }] : /* istanbul ignore next */ []));
|
|
96
|
+
filterOpenRequestVersionState = signal(0, /* @ts-ignore */
|
|
97
|
+
...(ngDevMode ? [{ debugName: "filterOpenRequestVersionState" }] : /* istanbul ignore next */ []));
|
|
98
|
+
filterReturnFocus = null;
|
|
99
|
+
variant = this.variantState.asReadonly();
|
|
100
|
+
height = this.heightState.asReadonly();
|
|
101
|
+
scroll = this.scrollState.asReadonly();
|
|
102
|
+
appearance = this.appearanceState.asReadonly();
|
|
103
|
+
position = this.positionState.asReadonly();
|
|
104
|
+
sideMode = this.sideModeState.asReadonly();
|
|
105
|
+
sideWidth = this.sideWidthState.asReadonly();
|
|
106
|
+
sideId = this.sideIdState.asReadonly();
|
|
107
|
+
sideOpenRequest = this.sideOpenRequestState.asReadonly();
|
|
108
|
+
sideOpenRequestVersion = this.sideOpenRequestVersionState.asReadonly();
|
|
109
|
+
appsLauncherReserve = this.appsLauncherReserveState.asReadonly();
|
|
110
|
+
sideOpen = computed(() => this.controlledSideOpenState() ?? this.internalSideOpenState(), /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "sideOpen" }] : /* istanbul ignore next */ []));
|
|
112
|
+
isSideInteractive = computed(() => this.sideMode() === 'drawer' || this.sideMode() === 'overlay', /* @ts-ignore */
|
|
113
|
+
...(ngDevMode ? [{ debugName: "isSideInteractive" }] : /* istanbul ignore next */ []));
|
|
114
|
+
isSideVisible = computed(() => this.sideMode() === 'sticky' || this.sideOpen(), /* @ts-ignore */
|
|
115
|
+
...(ngDevMode ? [{ debugName: "isSideVisible" }] : /* istanbul ignore next */ []));
|
|
116
|
+
filterPlacement = this.filterPlacementState.asReadonly();
|
|
117
|
+
filterMode = this.filterModeState.asReadonly();
|
|
118
|
+
filterPosition = this.filterPositionState.asReadonly();
|
|
119
|
+
filterWidth = this.filterWidthState.asReadonly();
|
|
120
|
+
filterId = this.filterIdState.asReadonly();
|
|
121
|
+
filterOpenRequest = this.filterOpenRequestState.asReadonly();
|
|
122
|
+
filterOpenRequestVersion = this.filterOpenRequestVersionState.asReadonly();
|
|
123
|
+
filterOpen = computed(() => this.controlledFilterOpenState() ?? this.internalFilterOpenState(), /* @ts-ignore */
|
|
124
|
+
...(ngDevMode ? [{ debugName: "filterOpen" }] : /* istanbul ignore next */ []));
|
|
125
|
+
isFilterInteractive = computed(() => this.filterMode() === 'drawer' || this.filterMode() === 'overlay', /* @ts-ignore */
|
|
126
|
+
...(ngDevMode ? [{ debugName: "isFilterInteractive" }] : /* istanbul ignore next */ []));
|
|
127
|
+
isFilterVisible = computed(() => this.filterMode() === 'sticky' || this.filterOpen(), /* @ts-ignore */
|
|
128
|
+
...(ngDevMode ? [{ debugName: "isFilterVisible" }] : /* istanbul ignore next */ []));
|
|
129
|
+
registerRoot(config) {
|
|
130
|
+
this.variantState.set(config.variant);
|
|
131
|
+
this.heightState.set(config.height);
|
|
132
|
+
this.scrollState.set(config.scroll);
|
|
133
|
+
this.appearanceState.set(config.appearance);
|
|
134
|
+
this.positionState.set(config.position);
|
|
135
|
+
this.sideModeState.set(config.sideMode);
|
|
136
|
+
this.sideWidthState.set(config.sideWidth);
|
|
137
|
+
}
|
|
138
|
+
registerSide(config) {
|
|
139
|
+
this.sideModeState.set(config.mode);
|
|
140
|
+
this.positionState.set(config.position);
|
|
141
|
+
this.sideWidthState.set(config.width);
|
|
142
|
+
this.sideIdState.set(config.id);
|
|
143
|
+
}
|
|
144
|
+
setAppsLauncherReserve(reserve) {
|
|
145
|
+
this.appsLauncherReserveState.set(reserve);
|
|
146
|
+
}
|
|
147
|
+
setControlledSideOpen(open) {
|
|
148
|
+
this.controlledSideOpenState.set(open);
|
|
149
|
+
if (open !== null) {
|
|
150
|
+
this.internalSideOpenState.set(open);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setSideOpen(open) {
|
|
154
|
+
this.internalSideOpenState.set(open);
|
|
155
|
+
}
|
|
156
|
+
openSide() {
|
|
157
|
+
return this.requestSideOpenChange(true);
|
|
158
|
+
}
|
|
159
|
+
closeSide() {
|
|
160
|
+
return this.requestSideOpenChange(false);
|
|
161
|
+
}
|
|
162
|
+
toggleSide() {
|
|
163
|
+
return this.requestSideOpenChange(!this.sideOpen());
|
|
164
|
+
}
|
|
165
|
+
/** Stores the concrete trigger before opening so restoration is not browser-timing dependent. */
|
|
166
|
+
setSideReturnFocus(element) {
|
|
167
|
+
this.sideReturnFocus = element;
|
|
168
|
+
}
|
|
169
|
+
takeSideReturnFocus() {
|
|
170
|
+
const element = this.sideReturnFocus;
|
|
171
|
+
this.sideReturnFocus = null;
|
|
172
|
+
return element;
|
|
173
|
+
}
|
|
174
|
+
requestSideOpenChange(open) {
|
|
175
|
+
if (this.controlledSideOpenState() === null) {
|
|
176
|
+
this.internalSideOpenState.set(open);
|
|
177
|
+
}
|
|
178
|
+
this.sideOpenRequestState.set(open);
|
|
179
|
+
this.sideOpenRequestVersionState.update((version) => version + 1);
|
|
180
|
+
return open;
|
|
181
|
+
}
|
|
182
|
+
registerFilter(config) {
|
|
183
|
+
this.filterPlacementState.set(config.placement);
|
|
184
|
+
this.filterModeState.set(config.mode);
|
|
185
|
+
this.filterPositionState.set(config.position);
|
|
186
|
+
this.filterWidthState.set(config.width);
|
|
187
|
+
this.filterIdState.set(config.id);
|
|
188
|
+
}
|
|
189
|
+
setControlledFilterOpen(open) {
|
|
190
|
+
this.controlledFilterOpenState.set(open);
|
|
191
|
+
if (open !== null) {
|
|
192
|
+
this.internalFilterOpenState.set(open);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
setFilterOpen(open) {
|
|
196
|
+
this.internalFilterOpenState.set(open);
|
|
197
|
+
}
|
|
198
|
+
openFilter() {
|
|
199
|
+
return this.requestFilterOpenChange(true);
|
|
200
|
+
}
|
|
201
|
+
closeFilter() {
|
|
202
|
+
return this.requestFilterOpenChange(false);
|
|
203
|
+
}
|
|
204
|
+
toggleFilter() {
|
|
205
|
+
return this.requestFilterOpenChange(!this.filterOpen());
|
|
206
|
+
}
|
|
207
|
+
/** Mirrors side focus ownership for filter drawer/overlay triggers. */
|
|
208
|
+
setFilterReturnFocus(element) {
|
|
209
|
+
this.filterReturnFocus = element;
|
|
210
|
+
}
|
|
211
|
+
takeFilterReturnFocus() {
|
|
212
|
+
const element = this.filterReturnFocus;
|
|
213
|
+
this.filterReturnFocus = null;
|
|
214
|
+
return element;
|
|
215
|
+
}
|
|
216
|
+
requestFilterOpenChange(open) {
|
|
217
|
+
if (this.controlledFilterOpenState() === null) {
|
|
218
|
+
this.internalFilterOpenState.set(open);
|
|
219
|
+
}
|
|
220
|
+
this.filterOpenRequestState.set(open);
|
|
221
|
+
this.filterOpenRequestVersionState.update((version) => version + 1);
|
|
222
|
+
return open;
|
|
223
|
+
}
|
|
224
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageStateService, deps: [], target: i0.ɵɵFactoryTarget.Service });
|
|
225
|
+
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.4", ngImport: i0, type: PageStateService, autoProvided: false });
|
|
226
|
+
}
|
|
227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageStateService, decorators: [{
|
|
228
|
+
type: Service,
|
|
229
|
+
args: [{ autoProvided: false }]
|
|
230
|
+
}] });
|
|
231
|
+
|
|
232
|
+
const FOCUSABLE_SELECTOR = [
|
|
233
|
+
'a[href]',
|
|
234
|
+
'button:not([disabled])',
|
|
235
|
+
'input:not([disabled])',
|
|
236
|
+
'select:not([disabled])',
|
|
237
|
+
'textarea:not([disabled])',
|
|
238
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
239
|
+
].join(',');
|
|
240
|
+
const inertLocks = new WeakMap();
|
|
241
|
+
const scrollLocks = new WeakMap();
|
|
242
|
+
/**
|
|
243
|
+
* Accessibility management for the Page panels.
|
|
244
|
+
*
|
|
245
|
+
* A drawer only gets initial focus and focus restoration. An overlay is a modal dialog:
|
|
246
|
+
* focus is trapped, the background is made inert, and document scrolling is locked until
|
|
247
|
+
* the panel closes. Must be called from an injection context, because it uses `effect`.
|
|
248
|
+
*/
|
|
249
|
+
/** @internal */
|
|
250
|
+
function ɵsetupOverlayFocusManagement(config) {
|
|
251
|
+
effect((onCleanup) => {
|
|
252
|
+
if (!config.isInteractive() || !config.isOpen()) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const document = config.document;
|
|
256
|
+
const view = document?.defaultView;
|
|
257
|
+
if (!document || !view) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const returnFocus = config.takeReturnFocus?.() ?? document.activeElement;
|
|
261
|
+
const modal = config.isModal();
|
|
262
|
+
const inertSnapshots = modal ? makeBackgroundInert(config.host) : [];
|
|
263
|
+
if (modal) {
|
|
264
|
+
lockDocumentScroll(document);
|
|
265
|
+
}
|
|
266
|
+
const handleKeydown = (event) => {
|
|
267
|
+
if (!modal || event.key !== 'Tab') {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const focusable = getFocusableElements(config.host);
|
|
271
|
+
if (focusable.length === 0) {
|
|
272
|
+
event.preventDefault();
|
|
273
|
+
config.host.focus();
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const active = document.activeElement;
|
|
277
|
+
const first = focusable[0];
|
|
278
|
+
const last = focusable.at(-1);
|
|
279
|
+
const activeIndex = focusable.indexOf(active);
|
|
280
|
+
if (event.shiftKey && activeIndex <= 0) {
|
|
281
|
+
event.preventDefault();
|
|
282
|
+
last.focus();
|
|
283
|
+
}
|
|
284
|
+
else if (!event.shiftKey && (activeIndex === -1 || active === last)) {
|
|
285
|
+
event.preventDefault();
|
|
286
|
+
first.focus();
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
config.host.addEventListener('keydown', handleKeydown);
|
|
290
|
+
const animationFrame = view.requestAnimationFrame(() => {
|
|
291
|
+
const initial = config.host.querySelector('[data-page-initial-focus], [autofocus]') ??
|
|
292
|
+
getFocusableElements(config.host)[0] ??
|
|
293
|
+
config.host;
|
|
294
|
+
initial.focus();
|
|
295
|
+
});
|
|
296
|
+
onCleanup(() => {
|
|
297
|
+
view.cancelAnimationFrame(animationFrame);
|
|
298
|
+
config.host.removeEventListener('keydown', handleKeydown);
|
|
299
|
+
restoreBackground(inertSnapshots);
|
|
300
|
+
if (modal) {
|
|
301
|
+
unlockDocumentScroll(document);
|
|
302
|
+
}
|
|
303
|
+
if (returnFocus?.isConnected && typeof returnFocus.focus === 'function') {
|
|
304
|
+
view.requestAnimationFrame(() => returnFocus.focus());
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
function getFocusableElements(host) {
|
|
310
|
+
return Array.from(host.querySelectorAll(FOCUSABLE_SELECTOR)).filter((element) => !element.hidden && !element.inert && element.getAttribute('aria-hidden') !== 'true');
|
|
311
|
+
}
|
|
312
|
+
/** Make every sibling along the panel → Page host path inert, without killing backdrop dismiss. */
|
|
313
|
+
function makeBackgroundInert(host) {
|
|
314
|
+
const snapshots = [];
|
|
315
|
+
const pageRoot = host.closest('Page');
|
|
316
|
+
if (!pageRoot) {
|
|
317
|
+
return snapshots;
|
|
318
|
+
}
|
|
319
|
+
let branch = host;
|
|
320
|
+
let parent = branch.parentElement;
|
|
321
|
+
while (parent) {
|
|
322
|
+
for (const sibling of Array.from(parent.children)) {
|
|
323
|
+
if (sibling === branch ||
|
|
324
|
+
!(sibling instanceof HTMLElement) ||
|
|
325
|
+
sibling.hasAttribute('data-page-overlay-backdrop')) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
const lock = inertLocks.get(sibling);
|
|
329
|
+
if (lock) {
|
|
330
|
+
lock.count += 1;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
inertLocks.set(sibling, { count: 1, initial: sibling.inert === true });
|
|
334
|
+
}
|
|
335
|
+
snapshots.push({ element: sibling });
|
|
336
|
+
sibling.inert = true;
|
|
337
|
+
}
|
|
338
|
+
if (parent === pageRoot) {
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
branch = parent;
|
|
342
|
+
parent = parent.parentElement;
|
|
343
|
+
}
|
|
344
|
+
return snapshots;
|
|
345
|
+
}
|
|
346
|
+
function restoreBackground(snapshots) {
|
|
347
|
+
for (const snapshot of snapshots) {
|
|
348
|
+
const lock = inertLocks.get(snapshot.element);
|
|
349
|
+
if (!lock) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
lock.count -= 1;
|
|
353
|
+
if (lock.count === 0) {
|
|
354
|
+
snapshot.element.inert = lock.initial;
|
|
355
|
+
inertLocks.delete(snapshot.element);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function lockDocumentScroll(document) {
|
|
360
|
+
const lock = scrollLocks.get(document);
|
|
361
|
+
if (lock) {
|
|
362
|
+
lock.count += 1;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
scrollLocks.set(document, { count: 1, initialOverflow: document.body.style.overflow });
|
|
366
|
+
}
|
|
367
|
+
document.body.style.overflow = 'hidden';
|
|
368
|
+
}
|
|
369
|
+
function unlockDocumentScroll(document) {
|
|
370
|
+
const lock = scrollLocks.get(document);
|
|
371
|
+
if (!lock) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
lock.count -= 1;
|
|
375
|
+
if (lock.count === 0) {
|
|
376
|
+
document.body.style.overflow = lock.initialOverflow;
|
|
377
|
+
scrollLocks.delete(document);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
4
380
|
|
|
5
381
|
/**
|
|
6
382
|
* Generated bundle index. Do not edit.
|
|
7
|
-
*/
|
|
383
|
+
*/
|
|
384
|
+
|
|
385
|
+
export { PAGE_APPEARANCES, PAGE_DEFAULT_APPEARANCE, PAGE_DEFAULT_FILTER_MODE, PAGE_DEFAULT_FILTER_PLACEMENT, PAGE_DEFAULT_FILTER_POSITION, PAGE_DEFAULT_FILTER_WIDTH, PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_MODE, PAGE_DEFAULT_SIDE_POSITION, PAGE_DEFAULT_SIDE_WIDTH, PAGE_DEFAULT_VARIANT, PAGE_FILTER_PLACEMENTS, PAGE_HEIGHT_VALUES, PAGE_SCROLL_VALUES, PAGE_SIDE_MODES, PAGE_SIDE_POSITIONS, PAGE_VARIANTS, PageStateService, isUiPageAppearance, isUiPageFilterPlacement, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant, ɵsetupOverlayFocusManagement };
|
|
@@ -1,7 +1,271 @@
|
|
|
1
|
-
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, ElementRef, input, booleanAttribute, computed, effect, untracked, Component, output } from '@angular/core';
|
|
4
|
+
import { cn } from '@ojiepermana/angular/component/utils/core';
|
|
5
|
+
import { PageStateService, PAGE_DEFAULT_FILTER_PLACEMENT, PAGE_DEFAULT_FILTER_MODE, PAGE_DEFAULT_FILTER_WIDTH, PAGE_DEFAULT_SCROLL, ɵsetupOverlayFocusManagement as _setupOverlayFocusManagement } from '@ojiepermana/angular/theme/page/core';
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
let nextPageFilterId = 0;
|
|
8
|
+
/**
|
|
9
|
+
* `PageFilter` — the filter slot between `PageHeader` and `PageContent`
|
|
10
|
+
* (`placement="stacked"`) or beside `PageContent` (`placement="side"`). Stacked, the
|
|
11
|
+
* filter pushes content down and content takes the remaining height. Side, it pushes
|
|
12
|
+
* content across, in `sticky | drawer | overlay` mode, following the `PageSide` pattern.
|
|
13
|
+
*
|
|
14
|
+
* `placement="stacked"` always behaves as `sticky` — `drawer` and `overlay` apply to
|
|
15
|
+
* `side` only.
|
|
16
|
+
*/
|
|
17
|
+
class PageFilterComponent {
|
|
18
|
+
document = inject(DOCUMENT, { optional: true });
|
|
19
|
+
host = inject((ElementRef));
|
|
20
|
+
page = inject(PageStateService);
|
|
21
|
+
resolvedId = `page-filter-${++nextPageFilterId}`;
|
|
22
|
+
placement = input(PAGE_DEFAULT_FILTER_PLACEMENT, /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
|
|
24
|
+
mode = input(PAGE_DEFAULT_FILTER_MODE, /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
26
|
+
position = input(null, /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
|
|
28
|
+
width = input(null, /* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
30
|
+
closeOnEsc = input(true, /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "closeOnEsc" }] : /* istanbul ignore next */ []));
|
|
32
|
+
/**
|
|
33
|
+
* `placement="stacked"` only: let `PageFilterToggle` open and close the bar (closed by
|
|
34
|
+
* default). Closed, the bar is hidden and content reclaims its space. Ignored under
|
|
35
|
+
* `placement="side"` — use `mode="drawer"` or `mode="overlay"` for a dismissible side.
|
|
36
|
+
*/
|
|
37
|
+
collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
38
|
+
/** Accessible name for the panel in `drawer`/`overlay` mode (set as the dialog's `aria-label`). */
|
|
39
|
+
ariaLabel = input('Filters', /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
41
|
+
class = input('', /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
43
|
+
resolvedPlacement = computed(() => this.placement(), /* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [{ debugName: "resolvedPlacement" }] : /* istanbul ignore next */ []));
|
|
45
|
+
/** `stacked` adalah bar horizontal — tidak punya drawer/overlay, jadi mode efektifnya selalu `sticky`. */
|
|
46
|
+
effectiveMode = computed(() => this.resolvedPlacement() === 'stacked' ? 'sticky' : this.mode(), /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "effectiveMode" }] : /* istanbul ignore next */ []));
|
|
48
|
+
resolvedPosition = computed(() => this.position() ?? this.page.filterPosition(), /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "resolvedPosition" }] : /* istanbul ignore next */ []));
|
|
50
|
+
resolvedWidth = computed(() => this.width() ?? this.page.filterWidth() ?? PAGE_DEFAULT_FILTER_WIDTH, /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "resolvedWidth" }] : /* istanbul ignore next */ []));
|
|
52
|
+
resolvedScroll = computed(() => this.page.scroll() ?? PAGE_DEFAULT_SCROLL, /* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [{ debugName: "resolvedScroll" }] : /* istanbul ignore next */ []));
|
|
54
|
+
isStacked = computed(() => this.resolvedPlacement() === 'stacked', /* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [{ debugName: "isStacked" }] : /* istanbul ignore next */ []));
|
|
56
|
+
/** Bar stacked yang dapat ditutup dan sedang tertutup → disembunyikan dari layout. */
|
|
57
|
+
isCollapsedStacked = computed(() => this.isStacked() && this.collapsible() && !this.page.filterOpen(), /* @ts-ignore */
|
|
58
|
+
...(ngDevMode ? [{ debugName: "isCollapsedStacked" }] : /* istanbul ignore next */ []));
|
|
59
|
+
isSticky = computed(() => this.effectiveMode() === 'sticky', /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "isSticky" }] : /* istanbul ignore next */ []));
|
|
61
|
+
isDrawer = computed(() => this.effectiveMode() === 'drawer', /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "isDrawer" }] : /* istanbul ignore next */ []));
|
|
63
|
+
isOverlay = computed(() => this.effectiveMode() === 'overlay', /* @ts-ignore */
|
|
64
|
+
...(ngDevMode ? [{ debugName: "isOverlay" }] : /* istanbul ignore next */ []));
|
|
65
|
+
/** Mode mengambang (drawer/overlay) — bersifat dialog dan butuh manajemen fokus + `inert` saat tertutup. */
|
|
66
|
+
isInteractive = computed(() => this.isDrawer() || this.isOverlay(), /* @ts-ignore */
|
|
67
|
+
...(ngDevMode ? [{ debugName: "isInteractive" }] : /* istanbul ignore next */ []));
|
|
68
|
+
/** Drawer/overlay yang tertutup disembunyikan dari pohon aksesibilitas. */
|
|
69
|
+
ariaHidden = computed(() => !this.isSticky() && !this.page.filterOpen() ? 'true' : null, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "ariaHidden" }] : /* istanbul ignore next */ []));
|
|
71
|
+
/** Saat panel mengambang tertutup, `inert` mengeluarkan isinya dari tab order & pohon aksesibilitas (AXE). */
|
|
72
|
+
inertWhenClosed = computed(() => this.isInteractive() && !this.page.filterOpen() ? '' : null, /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "inertWhenClosed" }] : /* istanbul ignore next */ []));
|
|
74
|
+
dialogRole = computed(() => (this.isInteractive() ? 'dialog' : null), /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "dialogRole" }] : /* istanbul ignore next */ []));
|
|
76
|
+
ariaModal = computed(() => (this.isOverlay() ? 'true' : null), /* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "ariaModal" }] : /* istanbul ignore next */ []));
|
|
78
|
+
dialogLabel = computed(() => (this.isInteractive() ? this.ariaLabel() : null), /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "dialogLabel" }] : /* istanbul ignore next */ []));
|
|
80
|
+
dialogTabindex = computed(() => (this.isInteractive() ? '-1' : null), /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "dialogTabindex" }] : /* istanbul ignore next */ []));
|
|
82
|
+
classes = computed(() => {
|
|
83
|
+
const position = this.resolvedPosition();
|
|
84
|
+
const scroll = this.resolvedScroll();
|
|
85
|
+
const open = this.page.filterOpen();
|
|
86
|
+
// STACKED: bar selebar content yang mendorong content ke bawah (shrink-0 = tinggi mengikuti isi).
|
|
87
|
+
if (this.isStacked()) {
|
|
88
|
+
return cn('block shrink-0 border-b border-border bg-background',
|
|
89
|
+
// Saat seluruh page yang scroll, filter dipin ke atas area scroll agar tetap terjangkau.
|
|
90
|
+
scroll === 'page' && 'sticky top-0 z-10', this.class(),
|
|
91
|
+
// Collapsible & tertutup → `hidden` (menang atas `block`); content mengisi ruangnya kembali.
|
|
92
|
+
this.isCollapsedStacked() && 'hidden');
|
|
93
|
+
}
|
|
94
|
+
// SIDE: kolom di samping content.
|
|
95
|
+
return cn('block min-h-0 border-border bg-background', scroll === 'content' && 'h-full overflow-auto', scroll === 'page' && 'overflow-visible',
|
|
96
|
+
// sticky → mendorong content (push); urutan kolom di-handle oleh `order-last` saat di kanan.
|
|
97
|
+
this.isSticky() && 'shrink-0 w-[var(--page-filter-width)]', this.isSticky() && position === 'left' && 'border-r', this.isSticky() && position === 'right' && 'order-last border-l',
|
|
98
|
+
// drawer → meluncur dari tepi content region, mengambang di atas content.
|
|
99
|
+
this.isDrawer() &&
|
|
100
|
+
'absolute inset-y-0 z-20 w-[var(--page-filter-width)] border shadow-sm transition-transform duration-200 ease-out motion-reduce:transition-none', this.isDrawer() &&
|
|
101
|
+
position === 'left' &&
|
|
102
|
+
(open ? 'left-0 translate-x-0' : 'left-0 -translate-x-full'), this.isDrawer() &&
|
|
103
|
+
position === 'right' &&
|
|
104
|
+
(open ? 'right-0 translate-x-0' : 'right-0 translate-x-full'),
|
|
105
|
+
// overlay → seperti drawer, tapi di atas drawer (z lebih tinggi) dengan backdrop.
|
|
106
|
+
this.isOverlay() &&
|
|
107
|
+
'absolute inset-y-0 z-30 w-[var(--page-filter-width)] border shadow-md transition-transform duration-200 ease-out motion-reduce:transition-none', this.isOverlay() &&
|
|
108
|
+
position === 'left' &&
|
|
109
|
+
(open ? 'left-0 translate-x-0' : 'left-0 -translate-x-full'), this.isOverlay() &&
|
|
110
|
+
position === 'right' &&
|
|
111
|
+
(open ? 'right-0 translate-x-0' : 'right-0 translate-x-full'), this.class());
|
|
112
|
+
}, /* @ts-ignore */
|
|
113
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
114
|
+
constructor() {
|
|
115
|
+
_setupOverlayFocusManagement({
|
|
116
|
+
document: this.document,
|
|
117
|
+
host: this.host.nativeElement,
|
|
118
|
+
isOpen: this.page.filterOpen,
|
|
119
|
+
isInteractive: this.isInteractive,
|
|
120
|
+
isModal: this.isOverlay,
|
|
121
|
+
takeReturnFocus: () => this.page.takeFilterReturnFocus(),
|
|
122
|
+
});
|
|
123
|
+
effect(() => {
|
|
124
|
+
this.page.registerFilter({
|
|
125
|
+
placement: this.resolvedPlacement(),
|
|
126
|
+
mode: this.effectiveMode(),
|
|
127
|
+
position: this.resolvedPosition(),
|
|
128
|
+
width: this.resolvedWidth(),
|
|
129
|
+
id: this.resolvedId,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
effect((onCleanup) => {
|
|
133
|
+
if (!this.closeOnEsc() || this.isSticky()) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const defaultView = this.document?.defaultView;
|
|
137
|
+
if (!defaultView) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const handler = (event) => {
|
|
141
|
+
if (event.key !== 'Escape') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!untracked(() => this.page.filterOpen())) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
untracked(() => {
|
|
148
|
+
this.page.closeFilter();
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
defaultView.addEventListener('keydown', handler);
|
|
152
|
+
onCleanup(() => defaultView.removeEventListener('keydown', handler));
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
156
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: PageFilterComponent, isStandalone: true, selector: "PageFilter", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "resolvedId", "attr.data-page-slot": "\"filter\"", "attr.data-page-filter-placement": "resolvedPlacement()", "attr.data-page-filter-mode": "effectiveMode()", "attr.data-page-filter-open": "page.filterOpen()", "attr.data-page-position": "resolvedPosition()", "attr.aria-hidden": "ariaHidden()", "attr.inert": "inertWhenClosed()", "attr.role": "dialogRole()", "attr.aria-modal": "ariaModal()", "attr.aria-label": "dialogLabel()", "attr.tabindex": "dialogTabindex()", "style.--page-filter-width": "resolvedWidth()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
|
|
157
|
+
}
|
|
158
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageFilterComponent, decorators: [{
|
|
159
|
+
type: Component,
|
|
160
|
+
args: [{
|
|
161
|
+
selector: 'PageFilter',
|
|
162
|
+
host: {
|
|
163
|
+
'[class]': 'classes()',
|
|
164
|
+
'[attr.id]': 'resolvedId',
|
|
165
|
+
'[attr.data-page-slot]': '"filter"',
|
|
166
|
+
'[attr.data-page-filter-placement]': 'resolvedPlacement()',
|
|
167
|
+
'[attr.data-page-filter-mode]': 'effectiveMode()',
|
|
168
|
+
'[attr.data-page-filter-open]': 'page.filterOpen()',
|
|
169
|
+
'[attr.data-page-position]': 'resolvedPosition()',
|
|
170
|
+
'[attr.aria-hidden]': 'ariaHidden()',
|
|
171
|
+
'[attr.inert]': 'inertWhenClosed()',
|
|
172
|
+
'[attr.role]': 'dialogRole()',
|
|
173
|
+
'[attr.aria-modal]': 'ariaModal()',
|
|
174
|
+
'[attr.aria-label]': 'dialogLabel()',
|
|
175
|
+
'[attr.tabindex]': 'dialogTabindex()',
|
|
176
|
+
'[style.--page-filter-width]': 'resolvedWidth()',
|
|
177
|
+
},
|
|
178
|
+
template: `<ng-content />`,
|
|
179
|
+
}]
|
|
180
|
+
}], ctorParameters: () => [], propDecorators: { placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], closeOnEsc: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEsc", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* `PageFilterToggle` — the button that opens and closes a `PageFilter` in `drawer` or
|
|
184
|
+
* `overlay` mode. Projected content replaces the label or icon; the fallback is the
|
|
185
|
+
* built-in funnel icon.
|
|
186
|
+
*/
|
|
187
|
+
class PageFilterToggleComponent {
|
|
188
|
+
page = inject(PageStateService);
|
|
189
|
+
ariaLabel = input('Toggle page filter', /* @ts-ignore */
|
|
190
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
191
|
+
class = input('', /* @ts-ignore */
|
|
192
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
193
|
+
toggled = output();
|
|
194
|
+
hostClasses = computed(() => cn('inline-flex shrink-0', this.class()), /* @ts-ignore */
|
|
195
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
196
|
+
buttonClasses = computed(() => cn('inline-flex h-9 min-w-9 items-center justify-center rounded-base border border-border bg-background px-3 text-sm text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'), /* @ts-ignore */
|
|
197
|
+
...(ngDevMode ? [{ debugName: "buttonClasses" }] : /* istanbul ignore next */ []));
|
|
198
|
+
handleClick(event) {
|
|
199
|
+
if (!this.page.filterOpen() && event.currentTarget instanceof HTMLElement) {
|
|
200
|
+
this.page.setFilterReturnFocus(event.currentTarget);
|
|
201
|
+
}
|
|
202
|
+
this.toggled.emit(this.page.toggleFilter());
|
|
203
|
+
}
|
|
204
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageFilterToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
205
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: PageFilterToggleComponent, isStandalone: true, selector: "PageFilterToggle", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggled: "toggled" }, host: { attributes: { "data-page-control": "filter-toggle" }, properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
|
|
206
|
+
<button
|
|
207
|
+
type="button"
|
|
208
|
+
[class]="buttonClasses()"
|
|
209
|
+
[attr.aria-label]="ariaLabel()"
|
|
210
|
+
[attr.aria-controls]="page.filterId()"
|
|
211
|
+
[attr.aria-expanded]="page.filterOpen()"
|
|
212
|
+
(click)="handleClick($event)"
|
|
213
|
+
>
|
|
214
|
+
<ng-content>
|
|
215
|
+
<svg
|
|
216
|
+
aria-hidden="true"
|
|
217
|
+
viewBox="0 0 24 24"
|
|
218
|
+
class="h-4 w-4"
|
|
219
|
+
fill="none"
|
|
220
|
+
stroke="currentColor"
|
|
221
|
+
stroke-width="2"
|
|
222
|
+
stroke-linecap="round"
|
|
223
|
+
stroke-linejoin="round"
|
|
224
|
+
>
|
|
225
|
+
<path d="M3 5h18l-7 8v5l-4 2v-7z" />
|
|
226
|
+
</svg>
|
|
227
|
+
</ng-content>
|
|
228
|
+
</button>
|
|
229
|
+
`, isInline: true });
|
|
230
|
+
}
|
|
231
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: PageFilterToggleComponent, decorators: [{
|
|
232
|
+
type: Component,
|
|
233
|
+
args: [{
|
|
234
|
+
selector: 'PageFilterToggle',
|
|
235
|
+
host: {
|
|
236
|
+
'[class]': 'hostClasses()',
|
|
237
|
+
'data-page-control': 'filter-toggle',
|
|
238
|
+
},
|
|
239
|
+
template: `
|
|
240
|
+
<button
|
|
241
|
+
type="button"
|
|
242
|
+
[class]="buttonClasses()"
|
|
243
|
+
[attr.aria-label]="ariaLabel()"
|
|
244
|
+
[attr.aria-controls]="page.filterId()"
|
|
245
|
+
[attr.aria-expanded]="page.filterOpen()"
|
|
246
|
+
(click)="handleClick($event)"
|
|
247
|
+
>
|
|
248
|
+
<ng-content>
|
|
249
|
+
<svg
|
|
250
|
+
aria-hidden="true"
|
|
251
|
+
viewBox="0 0 24 24"
|
|
252
|
+
class="h-4 w-4"
|
|
253
|
+
fill="none"
|
|
254
|
+
stroke="currentColor"
|
|
255
|
+
stroke-width="2"
|
|
256
|
+
stroke-linecap="round"
|
|
257
|
+
stroke-linejoin="round"
|
|
258
|
+
>
|
|
259
|
+
<path d="M3 5h18l-7 8v5l-4 2v-7z" />
|
|
260
|
+
</svg>
|
|
261
|
+
</ng-content>
|
|
262
|
+
</button>
|
|
263
|
+
`,
|
|
264
|
+
}]
|
|
265
|
+
}], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], toggled: [{ type: i0.Output, args: ["toggled"] }] } });
|
|
4
266
|
|
|
5
267
|
/**
|
|
6
268
|
* Generated bundle index. Do not edit.
|
|
7
|
-
*/
|
|
269
|
+
*/
|
|
270
|
+
|
|
271
|
+
export { PageFilterComponent, PageFilterToggleComponent };
|