@ojiepermana/angular 22.1.10 → 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,335 @@
|
|
|
1
|
-
|
|
1
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, PLATFORM_ID, signal, computed, Service, DestroyRef } from '@angular/core';
|
|
4
|
+
import { globalLocalStorage } from '@ojiepermana/angular/component/utils/core';
|
|
5
|
+
import { LAYOUT_LOCKED_WIDTH, LAYOUT_SURFACE_STORAGE_KEY, isUiLayoutSurface, LAYOUT_TYPE_STORAGE_KEY, isUiLayoutType, LAYOUT_WIDTH_STORAGE_KEY, isUiLayoutWidth, LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_TYPE, LAYOUT_DEFAULT_APPEARANCE, LAYOUT_DEFAULT_WIDTH, isUiLayoutAppearance } from '@ojiepermana/angular/theme/layout/types';
|
|
6
|
+
import { ShellService } from '@ojiepermana/angular/theme/shell/services';
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError, NavigationSkipped } from '@angular/router';
|
|
9
|
+
import { HttpContextToken } from '@angular/common/http';
|
|
10
|
+
import { finalize } from 'rxjs';
|
|
2
11
|
|
|
3
|
-
|
|
12
|
+
class LayoutService {
|
|
13
|
+
platformId = inject(PLATFORM_ID);
|
|
14
|
+
storage = globalLocalStorage(isPlatformBrowser(this.platformId));
|
|
15
|
+
shell = inject(ShellService);
|
|
16
|
+
surfaceState = signal(this.getStoredSurface(), /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "surfaceState" }] : /* istanbul ignore next */ []));
|
|
18
|
+
typeState = signal(this.getStoredType(), /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "typeState" }] : /* istanbul ignore next */ []));
|
|
20
|
+
appearanceState = signal(this.getStoredAppearance(), /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "appearanceState" }] : /* istanbul ignore next */ []));
|
|
22
|
+
widthState = signal(this.getStoredWidth(), /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "widthState" }] : /* istanbul ignore next */ []));
|
|
24
|
+
surface = this.surfaceState.asReadonly();
|
|
25
|
+
type = this.typeState.asReadonly();
|
|
26
|
+
appearance = this.appearanceState.asReadonly();
|
|
27
|
+
/**
|
|
28
|
+
* `true` on every shell mode but `web`. An app that owns its whole surface has
|
|
29
|
+
* no page to be inset within, so the width axis is not the user's to choose
|
|
30
|
+
* there — see {@link LAYOUT_LOCKED_WIDTH}.
|
|
31
|
+
*/
|
|
32
|
+
widthLocked = computed(() => this.shell.mode() !== 'web', /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "widthLocked" }] : /* istanbul ignore next */ []));
|
|
34
|
+
/**
|
|
35
|
+
* The width in effect. While `widthLocked()`, this reports the locked width and
|
|
36
|
+
* `widthState` keeps the user's own choice aside, so returning to `web` restores
|
|
37
|
+
* it instead of silently flattening it to `full`.
|
|
38
|
+
*/
|
|
39
|
+
width = computed(() => this.widthLocked() ? LAYOUT_LOCKED_WIDTH : this.widthState(), /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
41
|
+
/** The stored preference, ignoring the lock. */
|
|
42
|
+
preferredWidth = this.widthState.asReadonly();
|
|
43
|
+
/**
|
|
44
|
+
* Seed several axes at once. See {@link registerSurface} for what "register"
|
|
45
|
+
* means here — an omitted axis is left exactly as it was.
|
|
46
|
+
*/
|
|
47
|
+
registerDefaults(defaults) {
|
|
48
|
+
if (defaults.surface !== undefined) {
|
|
49
|
+
this.registerSurface(defaults.surface);
|
|
50
|
+
}
|
|
51
|
+
if (defaults.appearance !== undefined) {
|
|
52
|
+
this.registerAppearance(defaults.appearance);
|
|
53
|
+
}
|
|
54
|
+
if (defaults.type !== undefined) {
|
|
55
|
+
this.registerType(defaults.type);
|
|
56
|
+
}
|
|
57
|
+
if (defaults.width !== undefined) {
|
|
58
|
+
this.registerWidth(defaults.width);
|
|
59
|
+
}
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Seed the axis with a default, unless the user already stored a choice of
|
|
64
|
+
* their own — that one always wins.
|
|
65
|
+
*
|
|
66
|
+
* Registering deliberately does NOT persist. Storage is the record of what the
|
|
67
|
+
* USER picked, and writing a seeded default into it would make the two
|
|
68
|
+
* indistinguishable: a bare `<Layout>` would record a library default nobody
|
|
69
|
+
* asked for, and neither the library nor the consumer could ever change their
|
|
70
|
+
* own default again for anyone who had merely rendered the component once.
|
|
71
|
+
* Only {@link setSurface} and its siblings — the settings UI — write.
|
|
72
|
+
*/
|
|
73
|
+
registerSurface(surface) {
|
|
74
|
+
const storedSurface = this.storage.read(LAYOUT_SURFACE_STORAGE_KEY);
|
|
75
|
+
const resolved = isUiLayoutSurface(storedSurface) ? storedSurface : surface;
|
|
76
|
+
this.setSurface(resolved, { persist: false });
|
|
77
|
+
}
|
|
78
|
+
/** Seeds the axis without persisting — see {@link registerSurface}. */
|
|
79
|
+
registerType(type) {
|
|
80
|
+
const storedType = this.storage.read(LAYOUT_TYPE_STORAGE_KEY);
|
|
81
|
+
const resolved = isUiLayoutType(storedType) ? storedType : type;
|
|
82
|
+
this.setType(resolved, { persist: false });
|
|
83
|
+
}
|
|
84
|
+
/** Seeds the axis without persisting — see {@link registerSurface}. */
|
|
85
|
+
registerAppearance(appearance) {
|
|
86
|
+
this.setAppearance(this.getStoredAppearanceOrDefault(appearance), { persist: false });
|
|
87
|
+
}
|
|
88
|
+
/** Seeds the axis without persisting — see {@link registerSurface}. */
|
|
89
|
+
registerWidth(width) {
|
|
90
|
+
const storedWidth = this.storage.read(LAYOUT_WIDTH_STORAGE_KEY);
|
|
91
|
+
const resolved = isUiLayoutWidth(storedWidth) ? storedWidth : width;
|
|
92
|
+
this.setWidth(resolved, { persist: false });
|
|
93
|
+
}
|
|
94
|
+
setSurface(surface, options = {}) {
|
|
95
|
+
this.surfaceState.set(surface);
|
|
96
|
+
if (options.persist === false) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.storage.write(LAYOUT_SURFACE_STORAGE_KEY, surface);
|
|
100
|
+
}
|
|
101
|
+
setType(type, options = {}) {
|
|
102
|
+
this.typeState.set(type);
|
|
103
|
+
if (options.persist === false) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.storage.write(LAYOUT_TYPE_STORAGE_KEY, type);
|
|
107
|
+
}
|
|
108
|
+
setAppearance(appearance, options = {}) {
|
|
109
|
+
this.appearanceState.set(appearance);
|
|
110
|
+
if (options.persist === false) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.storage.write(LAYOUT_APPEARANCE_STORAGE_KEY, appearance);
|
|
114
|
+
}
|
|
115
|
+
setWidth(width, options = {}) {
|
|
116
|
+
this.widthState.set(width);
|
|
117
|
+
if (options.persist === false) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.storage.write(LAYOUT_WIDTH_STORAGE_KEY, width);
|
|
121
|
+
}
|
|
122
|
+
getStoredSurface() {
|
|
123
|
+
const value = this.storage.read(LAYOUT_SURFACE_STORAGE_KEY);
|
|
124
|
+
return isUiLayoutSurface(value) ? value : LAYOUT_DEFAULT_SURFACE;
|
|
125
|
+
}
|
|
126
|
+
getStoredType() {
|
|
127
|
+
const value = this.storage.read(LAYOUT_TYPE_STORAGE_KEY);
|
|
128
|
+
return isUiLayoutType(value) ? value : LAYOUT_DEFAULT_TYPE;
|
|
129
|
+
}
|
|
130
|
+
getStoredAppearance() {
|
|
131
|
+
const value = this.readStoredAppearance();
|
|
132
|
+
return value ?? LAYOUT_DEFAULT_APPEARANCE;
|
|
133
|
+
}
|
|
134
|
+
getStoredWidth() {
|
|
135
|
+
const value = this.storage.read(LAYOUT_WIDTH_STORAGE_KEY);
|
|
136
|
+
return isUiLayoutWidth(value) ? value : LAYOUT_DEFAULT_WIDTH;
|
|
137
|
+
}
|
|
138
|
+
readStoredAppearance() {
|
|
139
|
+
const appearance = this.storage.read(LAYOUT_APPEARANCE_STORAGE_KEY);
|
|
140
|
+
return isUiLayoutAppearance(appearance) ? appearance : null;
|
|
141
|
+
}
|
|
142
|
+
getStoredAppearanceOrDefault(fallback) {
|
|
143
|
+
return this.readStoredAppearance() ?? fallback;
|
|
144
|
+
}
|
|
145
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Service });
|
|
146
|
+
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.4", ngImport: i0, type: LayoutService });
|
|
147
|
+
}
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LayoutService, decorators: [{
|
|
149
|
+
type: Service
|
|
150
|
+
}] });
|
|
151
|
+
|
|
152
|
+
/** Progress the bar starts at, so the line is visibly moving the moment it appears. */
|
|
153
|
+
const LAYOUT_LOADING_INITIAL_PROGRESS = 8;
|
|
154
|
+
/** Batas atas progres trickle; sisanya menunggu seluruh pekerjaan selesai. */
|
|
155
|
+
const LAYOUT_LOADING_TRICKLE_CEILING = 90;
|
|
156
|
+
/** How often the trickle raises progress while work is still outstanding. */
|
|
157
|
+
const LAYOUT_LOADING_TRICKLE_INTERVAL_MS = 250;
|
|
158
|
+
/** Delay after progress reaches 100% before the bar is hidden, so the finish reads. */
|
|
159
|
+
const LAYOUT_LOADING_HIDE_DELAY_MS = 200;
|
|
160
|
+
/**
|
|
161
|
+
* Global loading tracker behind the progress line at the top of the viewport.
|
|
162
|
+
*
|
|
163
|
+
* It turns on by itself when the router starts a navigation and while an HTTP
|
|
164
|
+
* request runs through `layoutLoadingInterceptor`. Any other source — a manual
|
|
165
|
+
* data load, say — can join in through the ref-counted `start()`/`done()` pair.
|
|
166
|
+
*/
|
|
167
|
+
class LayoutLoadingService {
|
|
168
|
+
platformId = inject(PLATFORM_ID);
|
|
169
|
+
router = inject(Router, { optional: true });
|
|
170
|
+
pendingCount = signal(0, /* @ts-ignore */
|
|
171
|
+
...(ngDevMode ? [{ debugName: "pendingCount" }] : /* istanbul ignore next */ []));
|
|
172
|
+
activeState = signal(false, /* @ts-ignore */
|
|
173
|
+
...(ngDevMode ? [{ debugName: "activeState" }] : /* istanbul ignore next */ []));
|
|
174
|
+
progressState = signal(0, /* @ts-ignore */
|
|
175
|
+
...(ngDevMode ? [{ debugName: "progressState" }] : /* istanbul ignore next */ []));
|
|
176
|
+
/** The bar is on screen, including the short finish to 100%. */
|
|
177
|
+
active = this.activeState.asReadonly();
|
|
178
|
+
/** Progres garis 0–100. */
|
|
179
|
+
progress = this.progressState.asReadonly();
|
|
180
|
+
/** Work (a navigation, a request, a data load) is still outstanding. */
|
|
181
|
+
pending = computed(() => this.pendingCount() > 0, /* @ts-ignore */
|
|
182
|
+
...(ngDevMode ? [{ debugName: "pending" }] : /* istanbul ignore next */ []));
|
|
183
|
+
hostRegistry = signal([], /* @ts-ignore */
|
|
184
|
+
...(ngDevMode ? [{ debugName: "hostRegistry" }] : /* istanbul ignore next */ []));
|
|
185
|
+
/**
|
|
186
|
+
* The earliest registered `LayoutLoading` host, which is the one that draws the
|
|
187
|
+
* bar. Every other instance — the one inside `Layout` when the app root also
|
|
188
|
+
* mounts `LayoutLoading` — goes inert, so the line is never drawn twice.
|
|
189
|
+
*/
|
|
190
|
+
primaryHostId = computed(() => this.hostRegistry()[0] ?? null, /* @ts-ignore */
|
|
191
|
+
...(ngDevMode ? [{ debugName: "primaryHostId" }] : /* istanbul ignore next */ []));
|
|
192
|
+
trickleTimer = null;
|
|
193
|
+
hideTimer = null;
|
|
194
|
+
navigationPending = false;
|
|
195
|
+
nextHostId = 0;
|
|
196
|
+
constructor() {
|
|
197
|
+
this.observeRouterNavigation();
|
|
198
|
+
inject(DestroyRef).onDestroy(() => {
|
|
199
|
+
this.stopTrickle();
|
|
200
|
+
this.cancelScheduledHide();
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** Mark one unit of work started; the bar appears with the first one. */
|
|
204
|
+
start() {
|
|
205
|
+
this.pendingCount.update((count) => count + 1);
|
|
206
|
+
if (this.pendingCount() === 1) {
|
|
207
|
+
this.show();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Mark one unit of work finished; the bar completes when the count returns to zero. */
|
|
211
|
+
done() {
|
|
212
|
+
if (this.pendingCount() === 0) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.pendingCount.update((count) => count - 1);
|
|
216
|
+
if (this.pendingCount() === 0) {
|
|
217
|
+
this.finish();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** Register one `LayoutLoading` host; returns the id used to unregister it. */
|
|
221
|
+
registerHost() {
|
|
222
|
+
const hostId = this.nextHostId++;
|
|
223
|
+
this.hostRegistry.update((hosts) => [...hosts, hostId]);
|
|
224
|
+
return hostId;
|
|
225
|
+
}
|
|
226
|
+
/** Release a host; the next registered one becomes primary on its own. */
|
|
227
|
+
unregisterHost(hostId) {
|
|
228
|
+
this.hostRegistry.update((hosts) => hosts.filter((registered) => registered !== hostId));
|
|
229
|
+
}
|
|
230
|
+
/** Force the progress value (0–100) while the bar is active, e.g. for a large upload. */
|
|
231
|
+
setProgress(value) {
|
|
232
|
+
if (!this.activeState()) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
this.progressState.set(Math.min(100, Math.max(0, value)));
|
|
236
|
+
}
|
|
237
|
+
observeRouterNavigation() {
|
|
238
|
+
if (!this.router) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
this.router.events.pipe(takeUntilDestroyed()).subscribe((event) => {
|
|
242
|
+
if (event instanceof NavigationStart) {
|
|
243
|
+
if (!this.navigationPending) {
|
|
244
|
+
this.navigationPending = true;
|
|
245
|
+
this.start();
|
|
246
|
+
}
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const navigationSettled = event instanceof NavigationEnd ||
|
|
250
|
+
event instanceof NavigationCancel ||
|
|
251
|
+
event instanceof NavigationError ||
|
|
252
|
+
event instanceof NavigationSkipped;
|
|
253
|
+
if (navigationSettled && this.navigationPending) {
|
|
254
|
+
this.navigationPending = false;
|
|
255
|
+
this.done();
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
show() {
|
|
260
|
+
this.cancelScheduledHide();
|
|
261
|
+
this.activeState.set(true);
|
|
262
|
+
this.progressState.set(LAYOUT_LOADING_INITIAL_PROGRESS);
|
|
263
|
+
this.startTrickle();
|
|
264
|
+
}
|
|
265
|
+
finish() {
|
|
266
|
+
this.stopTrickle();
|
|
267
|
+
this.progressState.set(100);
|
|
268
|
+
if (!this.isBrowser()) {
|
|
269
|
+
this.hide();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
this.hideTimer = setTimeout(() => {
|
|
273
|
+
this.hideTimer = null;
|
|
274
|
+
this.hide();
|
|
275
|
+
}, LAYOUT_LOADING_HIDE_DELAY_MS);
|
|
276
|
+
}
|
|
277
|
+
hide() {
|
|
278
|
+
this.activeState.set(false);
|
|
279
|
+
this.progressState.set(0);
|
|
280
|
+
}
|
|
281
|
+
startTrickle() {
|
|
282
|
+
if (!this.isBrowser() || this.trickleTimer !== null) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
this.trickleTimer = setInterval(() => {
|
|
286
|
+
const current = this.progressState();
|
|
287
|
+
const next = current + (LAYOUT_LOADING_TRICKLE_CEILING - current) * 0.15;
|
|
288
|
+
this.progressState.set(Math.min(LAYOUT_LOADING_TRICKLE_CEILING, next));
|
|
289
|
+
}, LAYOUT_LOADING_TRICKLE_INTERVAL_MS);
|
|
290
|
+
}
|
|
291
|
+
stopTrickle() {
|
|
292
|
+
if (this.trickleTimer !== null) {
|
|
293
|
+
clearInterval(this.trickleTimer);
|
|
294
|
+
this.trickleTimer = null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
cancelScheduledHide() {
|
|
298
|
+
if (this.hideTimer !== null) {
|
|
299
|
+
clearTimeout(this.hideTimer);
|
|
300
|
+
this.hideTimer = null;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
isBrowser() {
|
|
304
|
+
return isPlatformBrowser(this.platformId);
|
|
305
|
+
}
|
|
306
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LayoutLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Service });
|
|
307
|
+
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.4", ngImport: i0, type: LayoutLoadingService });
|
|
308
|
+
}
|
|
309
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LayoutLoadingService, decorators: [{
|
|
310
|
+
type: Service
|
|
311
|
+
}], ctorParameters: () => [] });
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Set `true` on a request's `HttpContext` to keep it out of the progress line —
|
|
315
|
+
* a poll or a heartbeat that must not raise a loading indicator.
|
|
316
|
+
*/
|
|
317
|
+
const LAYOUT_LOADING_SKIP = new HttpContextToken(() => false);
|
|
318
|
+
/**
|
|
319
|
+
* Interceptor that lights the `LayoutLoading` progress line while an HTTP
|
|
320
|
+
* request is in flight. Register it through `withInterceptors([...])`.
|
|
321
|
+
*/
|
|
322
|
+
const layoutLoadingInterceptor = (request, next) => {
|
|
323
|
+
if (request.context.get(LAYOUT_LOADING_SKIP)) {
|
|
324
|
+
return next(request);
|
|
325
|
+
}
|
|
326
|
+
const loading = inject(LayoutLoadingService);
|
|
327
|
+
loading.start();
|
|
328
|
+
return next(request).pipe(finalize(() => loading.done()));
|
|
329
|
+
};
|
|
4
330
|
|
|
5
331
|
/**
|
|
6
332
|
* Generated bundle index. Do not edit.
|
|
7
|
-
*/
|
|
333
|
+
*/
|
|
334
|
+
|
|
335
|
+
export { LAYOUT_LOADING_HIDE_DELAY_MS, LAYOUT_LOADING_INITIAL_PROGRESS, LAYOUT_LOADING_SKIP, LAYOUT_LOADING_TRICKLE_CEILING, LAYOUT_LOADING_TRICKLE_INTERVAL_MS, LayoutLoadingService, LayoutService, layoutLoadingInterceptor };
|
|
@@ -1,7 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
const LAYOUT_TYPES = ['vertical', 'horizontal', 'empty', 'fluid'];
|
|
2
|
+
const LAYOUT_SURFACES = [
|
|
3
|
+
'flat',
|
|
4
|
+
'grid',
|
|
5
|
+
'grid-line',
|
|
6
|
+
'honeycomb',
|
|
7
|
+
'matrix',
|
|
8
|
+
'circuit',
|
|
9
|
+
'line-vertical',
|
|
10
|
+
'line-horizontal',
|
|
11
|
+
];
|
|
12
|
+
const LAYOUT_APPEARANCES = ['flat', 'border-rail'];
|
|
13
|
+
const LAYOUT_WIDTHS = ['full', 'wide', 'container', 'fluid'];
|
|
14
|
+
const LAYOUT_DEFAULT_SURFACE = 'flat';
|
|
15
|
+
const LAYOUT_DEFAULT_TYPE = 'vertical';
|
|
16
|
+
const LAYOUT_DEFAULT_APPEARANCE = 'flat';
|
|
17
|
+
const LAYOUT_DEFAULT_WIDTH = 'full';
|
|
18
|
+
/**
|
|
19
|
+
* The width forced whenever the shell mode is not `web`.
|
|
20
|
+
*
|
|
21
|
+
* Only a browser page can be narrower than the surface it sits on. On desktop,
|
|
22
|
+
* tablet, and mobile the app *is* the surface, so a wide/container/fluid frame
|
|
23
|
+
* would leave dead canvas inside the window — `LayoutService` locks the axis here
|
|
24
|
+
* and keeps the user's own choice aside for when they return to `web`.
|
|
25
|
+
*/
|
|
26
|
+
const LAYOUT_LOCKED_WIDTH = 'full';
|
|
27
|
+
const LAYOUT_SURFACE_STORAGE_KEY = 'layout-surface';
|
|
28
|
+
const LAYOUT_APPEARANCE_STORAGE_KEY = 'layout-appearance';
|
|
29
|
+
const LAYOUT_TYPE_STORAGE_KEY = 'layout-type';
|
|
30
|
+
const LAYOUT_WIDTH_STORAGE_KEY = 'layout-width';
|
|
31
|
+
function isUiLayoutSurface(value) {
|
|
32
|
+
return value !== null && LAYOUT_SURFACES.includes(value);
|
|
33
|
+
}
|
|
34
|
+
function isUiLayoutType(value) {
|
|
35
|
+
return value !== null && LAYOUT_TYPES.includes(value);
|
|
36
|
+
}
|
|
37
|
+
function isUiLayoutAppearance(value) {
|
|
38
|
+
return value !== null && LAYOUT_APPEARANCES.includes(value);
|
|
39
|
+
}
|
|
40
|
+
function isUiLayoutWidth(value) {
|
|
41
|
+
return value !== null && LAYOUT_WIDTHS.includes(value);
|
|
42
|
+
}
|
|
4
43
|
|
|
5
44
|
/**
|
|
6
45
|
* Generated bundle index. Do not edit.
|
|
7
|
-
*/
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
export { LAYOUT_APPEARANCES, LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_DEFAULT_APPEARANCE, LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_TYPE, LAYOUT_DEFAULT_WIDTH, LAYOUT_LOCKED_WIDTH, LAYOUT_SURFACES, LAYOUT_SURFACE_STORAGE_KEY, LAYOUT_TYPES, LAYOUT_TYPE_STORAGE_KEY, LAYOUT_WIDTHS, LAYOUT_WIDTH_STORAGE_KEY, isUiLayoutAppearance, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
|