@ojiepermana/angular 22.1.11 → 22.1.13
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 +374 -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,815 @@
|
|
|
1
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, computed, Component, booleanAttribute } from '@angular/core';
|
|
3
|
+
import { cn } from '@ojiepermana/angular/component/utils/core';
|
|
4
|
+
import { ShellService } from '@ojiepermana/angular/theme/shell/services';
|
|
5
|
+
export { SHELL_WINDOW_BRIDGE, ShellService, WEB_SHELL_WINDOW_BRIDGE, createTauriShellWindowBridge, isTauriRuntime, provideShellWindowBridge, provideTauriShellWindowBridge } from '@ojiepermana/angular/theme/shell/services';
|
|
6
|
+
import { SHELL_DEFAULT_DEVICE, SHELL_DEFAULT_COLOR, SHELL_DEFAULT_FRAME, resolveShellDeviceForMode, resolveShellFrameForMode } from '@ojiepermana/angular/theme/shell/types';
|
|
7
|
+
export { SHELL_COLORS, SHELL_COLOR_STORAGE_KEY, SHELL_DEFAULT_COLOR, SHELL_DEFAULT_DEVICE, SHELL_DEFAULT_FRAME, SHELL_DEFAULT_MODE, SHELL_DEFAULT_PLATFORM, SHELL_DEFAULT_WINDOW_STATE, SHELL_DEVICES, SHELL_DEVICE_STORAGE_KEY, SHELL_FRAMES, SHELL_FRAME_STORAGE_KEY, SHELL_MODES, SHELL_MODE_DEVICES, SHELL_MODE_STORAGE_KEY, SHELL_PLATFORMS, SHELL_WINDOW_STATES, defaultShellDeviceForMode, isShellColor, isShellDevice, isShellDeviceForMode, isShellFrame, isShellMode, isShellPlatform, isShellWindowState, normalizeShellColor, normalizeShellDevice, normalizeShellFrame, normalizeShellMode, resolveShellDeviceForMode, resolveShellFrameForMode, shellDevicesForMode } from '@ojiepermana/angular/theme/shell/types';
|
|
8
|
+
import { NavigationContainerComponent, NavigationFlyoutComponent, NavigationHeaderComponent, NavigationFooterComponent } from '@ojiepermana/angular/navigation';
|
|
9
|
+
import { NAVIGATION_ADAPTER } from '@ojiepermana/angular/navigation/core';
|
|
10
|
+
import { LayoutService } from '@ojiepermana/angular/theme/layout/services';
|
|
11
|
+
import { LayoutIdentityService, LAYOUT_DESKTOP_NAVIGATION_DATA_ID, LayoutBrand, LayoutUser } from '@ojiepermana/angular/theme/layout/wrapper';
|
|
2
12
|
|
|
3
|
-
|
|
13
|
+
let shellNavigationFlyoutInstanceId = 0;
|
|
14
|
+
/**
|
|
15
|
+
* Internal desktop-titlebar launcher. `LayoutWrapperDefault` publishes the
|
|
16
|
+
* navigation data only while its desktop nav is active, so this component stays
|
|
17
|
+
* absent for desktop windows that still render a navbar, flyout, or side rail.
|
|
18
|
+
*/
|
|
19
|
+
class ShellNavigationFlyoutComponent {
|
|
20
|
+
navigation = inject(NAVIGATION_ADAPTER);
|
|
21
|
+
layout = inject(LayoutService, { optional: true });
|
|
22
|
+
identity = inject(LayoutIdentityService, { optional: true });
|
|
23
|
+
enabled = input(true, /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "enabled" }] : /* istanbul ignore next */ []));
|
|
25
|
+
icon = input('apps', /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
27
|
+
label = input('Open navigation', /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
29
|
+
navigationId = `__shell-navigation-${(shellNavigationFlyoutInstanceId += 1)}`;
|
|
30
|
+
navigationSource = this.navigation.data(LAYOUT_DESKTOP_NAVIGATION_DATA_ID);
|
|
31
|
+
navigationData = computed(() => this.navigationSource(), /* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "navigationData" }] : /* istanbul ignore next */ []));
|
|
33
|
+
showsFlyout = computed(() => this.enabled() && this.navigationData().length > 0, /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "showsFlyout" }] : /* istanbul ignore next */ []));
|
|
35
|
+
appearance = computed(() => this.layout?.appearance() ?? 'flat', /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
37
|
+
brand = computed(() => this.identity?.brand() ?? null, /* @ts-ignore */
|
|
38
|
+
...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
|
|
39
|
+
user = computed(() => this.identity?.user() ?? null, /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
|
|
41
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellNavigationFlyoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: ShellNavigationFlyoutComponent, isStandalone: true, selector: "ShellNavigationFlyout", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-shell-navigation-flyout": "showsFlyout() ? \"\" : null" }, styleAttribute: "--nav-flyout-floating-width: 100vw; --nav-flyout-floating-max-width: 100vw; --nav-flyout-floating-radius: 0 0 var(--shell-frame-radius) var(--shell-frame-radius);", classAttribute: "contents" }, ngImport: i0, template: `
|
|
43
|
+
@if (showsFlyout()) {
|
|
44
|
+
<Navigation
|
|
45
|
+
[id]="navigationId"
|
|
46
|
+
[data]="navigationData()"
|
|
47
|
+
ariaLabel="Application navigation"
|
|
48
|
+
class="h-full w-auto shrink-0"
|
|
49
|
+
>
|
|
50
|
+
<NavigationFlyout
|
|
51
|
+
[icon]="icon()"
|
|
52
|
+
icon-only
|
|
53
|
+
trigger-variant="plain"
|
|
54
|
+
trigger-floating
|
|
55
|
+
panel-viewport
|
|
56
|
+
trigger-class="relative z-20 flex h-full w-max items-center"
|
|
57
|
+
trigger-button-class="!bg-transparent !text-[hsl(var(--shell-bar-foreground))]"
|
|
58
|
+
[nav-type-style]="appearance()"
|
|
59
|
+
[label]="label()"
|
|
60
|
+
>
|
|
61
|
+
@if (brand(); as identity) {
|
|
62
|
+
<NavigationHeader>
|
|
63
|
+
<LayoutBrand [brand]="identity" />
|
|
64
|
+
</NavigationHeader>
|
|
65
|
+
}
|
|
66
|
+
@if (user(); as identity) {
|
|
67
|
+
<NavigationFooter class="px-3">
|
|
68
|
+
<LayoutUser [user]="identity" />
|
|
69
|
+
</NavigationFooter>
|
|
70
|
+
}
|
|
71
|
+
</NavigationFlyout>
|
|
72
|
+
</Navigation>
|
|
73
|
+
}
|
|
74
|
+
`, isInline: true, dependencies: [{ kind: "component", type: NavigationContainerComponent, selector: "Navigation", inputs: ["id", "data-id", "data", "ariaLabel", "compact", "collapse-tree", "class", "itemClass", "nav-group-class", "activeIds", "activeUrl", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavigationFlyoutComponent, selector: "NavigationFlyout", inputs: ["label", "icon", "icon-only", "icon-position", "trigger-variant", "trigger-floating", "panel-viewport", "trigger-class", "trigger-button-class", "nav-position", "nav-type-style", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: NavigationFooterComponent, selector: "NavigationFooter", inputs: ["class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }, { kind: "component", type: LayoutUser, selector: "LayoutUser", inputs: ["user", "detailed", "logoutLabel", "logoutIcon"], outputs: ["logout"] }] });
|
|
75
|
+
}
|
|
76
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellNavigationFlyoutComponent, decorators: [{
|
|
77
|
+
type: Component,
|
|
78
|
+
args: [{
|
|
79
|
+
selector: 'ShellNavigationFlyout',
|
|
80
|
+
imports: [
|
|
81
|
+
NavigationContainerComponent,
|
|
82
|
+
NavigationFlyoutComponent,
|
|
83
|
+
NavigationHeaderComponent,
|
|
84
|
+
NavigationFooterComponent,
|
|
85
|
+
LayoutBrand,
|
|
86
|
+
LayoutUser,
|
|
87
|
+
],
|
|
88
|
+
host: {
|
|
89
|
+
class: 'contents',
|
|
90
|
+
style: '--nav-flyout-floating-width: 100vw; --nav-flyout-floating-max-width: 100vw; --nav-flyout-floating-radius: 0 0 var(--shell-frame-radius) var(--shell-frame-radius);',
|
|
91
|
+
'[attr.data-shell-navigation-flyout]': 'showsFlyout() ? "" : null',
|
|
92
|
+
},
|
|
93
|
+
template: `
|
|
94
|
+
@if (showsFlyout()) {
|
|
95
|
+
<Navigation
|
|
96
|
+
[id]="navigationId"
|
|
97
|
+
[data]="navigationData()"
|
|
98
|
+
ariaLabel="Application navigation"
|
|
99
|
+
class="h-full w-auto shrink-0"
|
|
100
|
+
>
|
|
101
|
+
<NavigationFlyout
|
|
102
|
+
[icon]="icon()"
|
|
103
|
+
icon-only
|
|
104
|
+
trigger-variant="plain"
|
|
105
|
+
trigger-floating
|
|
106
|
+
panel-viewport
|
|
107
|
+
trigger-class="relative z-20 flex h-full w-max items-center"
|
|
108
|
+
trigger-button-class="!bg-transparent !text-[hsl(var(--shell-bar-foreground))]"
|
|
109
|
+
[nav-type-style]="appearance()"
|
|
110
|
+
[label]="label()"
|
|
111
|
+
>
|
|
112
|
+
@if (brand(); as identity) {
|
|
113
|
+
<NavigationHeader>
|
|
114
|
+
<LayoutBrand [brand]="identity" />
|
|
115
|
+
</NavigationHeader>
|
|
116
|
+
}
|
|
117
|
+
@if (user(); as identity) {
|
|
118
|
+
<NavigationFooter class="px-3">
|
|
119
|
+
<LayoutUser [user]="identity" />
|
|
120
|
+
</NavigationFooter>
|
|
121
|
+
}
|
|
122
|
+
</NavigationFlyout>
|
|
123
|
+
</Navigation>
|
|
124
|
+
}
|
|
125
|
+
`,
|
|
126
|
+
}]
|
|
127
|
+
}], propDecorators: { enabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "enabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The titlebar of a `<Shell>` — the app's own window chrome, and its bridge to
|
|
131
|
+
* the desktop runtime.
|
|
132
|
+
*
|
|
133
|
+
* **Internal to the library.** It is not exported from
|
|
134
|
+
* `@ojiepermana/angular/theme/shell`: `<Shell>` decides when a titlebar exists
|
|
135
|
+
* (only `mode='desktop'` has window chrome to draw) and renders this itself,
|
|
136
|
+
* forwarding the `[shellBarStart]` / `[shellBarTitle]` / `[shellBarEnd]` slots.
|
|
137
|
+
* Consumers configure it through `<Shell>`, never directly.
|
|
138
|
+
*
|
|
139
|
+
* Window dragging is declarative, so no JavaScript runs on pointer-down: the host
|
|
140
|
+
* carries `data-tauri-drag-region` for Tauri. Electron uses Shell's frame-wide
|
|
141
|
+
* drag layer below this bar; interactive chrome opts out with `shell-no-drag`,
|
|
142
|
+
* which the slot wrappers and buttons apply for you.
|
|
143
|
+
*
|
|
144
|
+
* Window buttons follow the `device`, not the runtime: macOS keeps painting its
|
|
145
|
+
* own traffic lights over a decoration-less window, so the bar draws none of its
|
|
146
|
+
* own and reserves a leading inset for them instead. Whether those buttons *do*
|
|
147
|
+
* anything is the bridge's business — the shape of the chrome is the device's.
|
|
148
|
+
*/
|
|
149
|
+
class ShellBarComponent {
|
|
150
|
+
shell = inject(ShellService);
|
|
151
|
+
device = input(SHELL_DEFAULT_DEVICE, /* @ts-ignore */
|
|
152
|
+
...(ngDevMode ? [{ debugName: "device" }] : /* istanbul ignore next */ []));
|
|
153
|
+
color = input(SHELL_DEFAULT_COLOR, /* @ts-ignore */
|
|
154
|
+
...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
155
|
+
frame = input(SHELL_DEFAULT_FRAME, /* @ts-ignore */
|
|
156
|
+
...(ngDevMode ? [{ debugName: "frame" }] : /* istanbul ignore next */ []));
|
|
157
|
+
/**
|
|
158
|
+
* `true` when the runtime still draws its own window buttons, so the app must
|
|
159
|
+
* not: macOS reserves the leading run for the OS traffic lights and Windows /
|
|
160
|
+
* Linux draw nothing. Default `false` — a decoration-less window.
|
|
161
|
+
*/
|
|
162
|
+
nativeWindowControls = input(false, { ...(ngDevMode ? { debugName: "nativeWindowControls" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
163
|
+
drag = input(true, { ...(ngDevMode ? { debugName: "drag" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
164
|
+
landmark = input(true, { ...(ngDevMode ? { debugName: "landmark" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
165
|
+
ariaLabel = input('Application title bar', /* @ts-ignore */
|
|
166
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
167
|
+
minimizeLabel = input('Minimize window', /* @ts-ignore */
|
|
168
|
+
...(ngDevMode ? [{ debugName: "minimizeLabel" }] : /* istanbul ignore next */ []));
|
|
169
|
+
maximizeLabel = input('Maximize window', /* @ts-ignore */
|
|
170
|
+
...(ngDevMode ? [{ debugName: "maximizeLabel" }] : /* istanbul ignore next */ []));
|
|
171
|
+
restoreLabel = input('Restore window', /* @ts-ignore */
|
|
172
|
+
...(ngDevMode ? [{ debugName: "restoreLabel" }] : /* istanbul ignore next */ []));
|
|
173
|
+
closeLabel = input('Close window', /* @ts-ignore */
|
|
174
|
+
...(ngDevMode ? [{ debugName: "closeLabel" }] : /* istanbul ignore next */ []));
|
|
175
|
+
/** Show the automatic desktop navigation flyout when a desktop layout publishes data. */
|
|
176
|
+
navigationFlyout = input(true, /* @ts-ignore */
|
|
177
|
+
...(ngDevMode ? [{ debugName: "navigationFlyout" }] : /* istanbul ignore next */ []));
|
|
178
|
+
navigationFlyoutIcon = input('apps', /* @ts-ignore */
|
|
179
|
+
...(ngDevMode ? [{ debugName: "navigationFlyoutIcon" }] : /* istanbul ignore next */ []));
|
|
180
|
+
navigationFlyoutLabel = input('Open navigation', /* @ts-ignore */
|
|
181
|
+
...(ngDevMode ? [{ debugName: "navigationFlyoutLabel" }] : /* istanbul ignore next */ []));
|
|
182
|
+
class = input('', /* @ts-ignore */
|
|
183
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
184
|
+
maximizeToggleLabel = computed(() => this.shell.isMaximized() ? this.restoreLabel() : this.maximizeLabel(), /* @ts-ignore */
|
|
185
|
+
...(ngDevMode ? [{ debugName: "maximizeToggleLabel" }] : /* istanbul ignore next */ []));
|
|
186
|
+
isMacOs = computed(() => this.device() === 'macos', /* @ts-ignore */
|
|
187
|
+
...(ngDevMode ? [{ debugName: "isMacOs" }] : /* istanbul ignore next */ []));
|
|
188
|
+
/**
|
|
189
|
+
* macOS traffic lights, which the app draws itself — the default, because a
|
|
190
|
+
* `decorations: false` window has no other way to be closed.
|
|
191
|
+
*/
|
|
192
|
+
showsTrafficLights = computed(() => this.isMacOs() && !this.nativeWindowControls(), /* @ts-ignore */
|
|
193
|
+
...(ngDevMode ? [{ debugName: "showsTrafficLights" }] : /* istanbul ignore next */ []));
|
|
194
|
+
/** Windows/Linux buttons, on the trailing edge. */
|
|
195
|
+
showsWindowControls = computed(() => !this.isMacOs() && !this.nativeWindowControls(), /* @ts-ignore */
|
|
196
|
+
...(ngDevMode ? [{ debugName: "showsWindowControls" }] : /* istanbul ignore next */ []));
|
|
197
|
+
/**
|
|
198
|
+
* Only reserve an empty leading run when the OS is painting its own lights into
|
|
199
|
+
* it — Tauri's macOS `titleBarStyle: 'Overlay'`. Drawing ours there instead
|
|
200
|
+
* occupies the space for real, so no padding is needed.
|
|
201
|
+
*/
|
|
202
|
+
reservesTrafficLights = computed(() => this.isMacOs() && this.nativeWindowControls(), /* @ts-ignore */
|
|
203
|
+
...(ngDevMode ? [{ debugName: "reservesTrafficLights" }] : /* istanbul ignore next */ []));
|
|
204
|
+
classes = computed(() => cn(
|
|
205
|
+
// 1fr auto 1fr keeps the title optically centred in the window no matter
|
|
206
|
+
// how much chrome either flank carries.
|
|
207
|
+
'relative z-20 grid h-(--shell-bar-height) min-h-(--shell-bar-height) shrink-0', 'grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-(--shell-bar-gap)',
|
|
208
|
+
// Surface tokens, not raw colors: `color='sync'` maps them onto the design
|
|
209
|
+
// system, `color='default'` onto the device's native chrome (base/tokens.css).
|
|
210
|
+
'bg-[hsl(var(--shell-bar-background))] px-(--shell-bar-inline)', 'text-[hsl(var(--shell-bar-foreground))]',
|
|
211
|
+
// `classic` stacks a bordered bar on the app. `modern` shares its background
|
|
212
|
+
// with the surround, so a divider would draw a seam through what is meant to
|
|
213
|
+
// read as one continuous frame.
|
|
214
|
+
this.frame() === 'classic' && 'border-b border-[hsl(var(--shell-bar-border))]',
|
|
215
|
+
// Physically top-left on macOS regardless of text direction, so this is
|
|
216
|
+
// deliberately `pl-`, not the logical `ps-`.
|
|
217
|
+
this.reservesTrafficLights() && 'pl-(--shell-traffic-light-inset)', this.class()), /* @ts-ignore */
|
|
218
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
219
|
+
startSlotClasses = computed(() => cn('shell-no-drag flex min-w-0 items-center gap-(--shell-bar-gap)'), /* @ts-ignore */
|
|
220
|
+
...(ngDevMode ? [{ debugName: "startSlotClasses" }] : /* istanbul ignore next */ []));
|
|
221
|
+
endSlotClasses = computed(() => cn('shell-no-drag flex min-w-0 items-center justify-end gap-(--shell-bar-gap)'), /* @ts-ignore */
|
|
222
|
+
...(ngDevMode ? [{ debugName: "endSlotClasses" }] : /* istanbul ignore next */ []));
|
|
223
|
+
titleClasses = computed(() => cn('min-w-0 truncate text-center text-xs font-medium',
|
|
224
|
+
// An unfocused window recedes — the OS convention for background windows.
|
|
225
|
+
this.shell.focused() ? 'opacity-100' : 'opacity-60'), /* @ts-ignore */
|
|
226
|
+
...(ngDevMode ? [{ debugName: "titleClasses" }] : /* istanbul ignore next */ []));
|
|
227
|
+
controlClasses = computed(() => cn('shell-no-drag inline-grid size-(--shell-control-size) shrink-0 place-items-center rounded-sm', 'opacity-70 transition-[background-color,opacity] hover:opacity-100', 'hover:bg-[hsl(var(--shell-bar-foreground)/0.12)]', 'focus-visible:outline-none focus-visible:ring-2', 'focus-visible:ring-[hsl(var(--shell-bar-foreground))]', 'focus-visible:ring-offset-1 focus-visible:ring-offset-[hsl(var(--shell-bar-background))]'), /* @ts-ignore */
|
|
228
|
+
...(ngDevMode ? [{ debugName: "controlClasses" }] : /* istanbul ignore next */ []));
|
|
229
|
+
/**
|
|
230
|
+
* One macOS traffic light. The fills are that platform's own constants rather
|
|
231
|
+
* than theme tokens — a traffic light that recolored with the accent would stop
|
|
232
|
+
* reading as a traffic light. The hairline ring keeps them defined against a
|
|
233
|
+
* light titlebar and survives forced-colors mode, and each carries an
|
|
234
|
+
* `aria-label`, so the colour is never the only way to tell them apart.
|
|
235
|
+
*/
|
|
236
|
+
trafficLightClasses(control) {
|
|
237
|
+
return cn('shell-no-drag group inline-grid size-(--shell-traffic-light-size) shrink-0', 'cursor-pointer place-items-center rounded-full', 'ring-1 ring-black/15 transition-colors', 'focus-visible:outline-none focus-visible:ring-2', 'focus-visible:ring-[hsl(var(--shell-bar-foreground))]', 'focus-visible:ring-offset-1 focus-visible:ring-offset-[hsl(var(--shell-bar-background))]',
|
|
238
|
+
// Each light darkens to its own pressed shade on hover — the same per-light
|
|
239
|
+
// colour shift macOS uses, so the feedback reads as "this specific control"
|
|
240
|
+
// rather than a generic highlight. Paired with the glyph appearing below, the
|
|
241
|
+
// hover state never relies on colour alone.
|
|
242
|
+
control === 'close' && 'bg-[#ff5f57] hover:bg-[#e0443e]', control === 'minimize' && 'bg-[#febc2e] hover:bg-[#dea123]', control === 'zoom' && 'bg-[#28c840] hover:bg-[#1aad2b]');
|
|
243
|
+
}
|
|
244
|
+
/** macOS reveals the glyph inside each light only on hover — and on focus, for keyboards. */
|
|
245
|
+
trafficGlyphClasses() {
|
|
246
|
+
return cn('size-(--shell-traffic-light-size) opacity-0 transition-opacity', 'group-hover:opacity-70 group-focus-visible:opacity-70', 'stroke-black/70 [stroke-linecap:round] [stroke-width:1.5] [fill:none]');
|
|
247
|
+
}
|
|
248
|
+
closeControlClasses = computed(() => cn(this.controlClasses(), 'hover:bg-destructive hover:text-destructive-foreground'), /* @ts-ignore */
|
|
249
|
+
...(ngDevMode ? [{ debugName: "closeControlClasses" }] : /* istanbul ignore next */ []));
|
|
250
|
+
minimize() {
|
|
251
|
+
void this.shell.minimize();
|
|
252
|
+
}
|
|
253
|
+
toggleMaximize() {
|
|
254
|
+
void this.shell.toggleMaximize();
|
|
255
|
+
}
|
|
256
|
+
close() {
|
|
257
|
+
void this.shell.close();
|
|
258
|
+
}
|
|
259
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
260
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: ShellBarComponent, isStandalone: true, selector: "ShellBar", inputs: { device: { classPropertyName: "device", publicName: "device", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, frame: { classPropertyName: "frame", publicName: "frame", isSignal: true, isRequired: false, transformFunction: null }, nativeWindowControls: { classPropertyName: "nativeWindowControls", publicName: "nativeWindowControls", isSignal: true, isRequired: false, transformFunction: null }, drag: { classPropertyName: "drag", publicName: "drag", isSignal: true, isRequired: false, transformFunction: null }, landmark: { classPropertyName: "landmark", publicName: "landmark", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, minimizeLabel: { classPropertyName: "minimizeLabel", publicName: "minimizeLabel", isSignal: true, isRequired: false, transformFunction: null }, maximizeLabel: { classPropertyName: "maximizeLabel", publicName: "maximizeLabel", isSignal: true, isRequired: false, transformFunction: null }, restoreLabel: { classPropertyName: "restoreLabel", publicName: "restoreLabel", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyout: { classPropertyName: "navigationFlyout", publicName: "navigationFlyout", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyoutIcon: { classPropertyName: "navigationFlyoutIcon", publicName: "navigationFlyoutIcon", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyoutLabel: { classPropertyName: "navigationFlyoutLabel", publicName: "navigationFlyoutLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-shell-bar": "" }, properties: { "class": "classes()", "attr.data-shell-device": "device()", "attr.data-shell-color": "color()", "attr.data-shell-frame": "frame()", "attr.data-tauri-drag-region": "drag() ? \"\" : null", "attr.data-shell-window": "shell.windowState()", "attr.data-shell-focused": "shell.focused()", "attr.role": "landmark() ? \"banner\" : null", "attr.aria-label": "landmark() ? ariaLabel() || null : null" } }, ngImport: i0, template: `
|
|
261
|
+
<div data-shell-bar-start [class]="startSlotClasses()">
|
|
262
|
+
@if (!isMacOs()) {
|
|
263
|
+
<ShellNavigationFlyout
|
|
264
|
+
[enabled]="navigationFlyout()"
|
|
265
|
+
[icon]="navigationFlyoutIcon()"
|
|
266
|
+
[label]="navigationFlyoutLabel()"
|
|
267
|
+
/>
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@if (showsTrafficLights()) {
|
|
271
|
+
<div data-shell-traffic-lights class="flex shrink-0 items-center gap-2 pl-2 pr-1">
|
|
272
|
+
<button
|
|
273
|
+
type="button"
|
|
274
|
+
data-shell-control="close"
|
|
275
|
+
[class]="trafficLightClasses('close')"
|
|
276
|
+
[attr.aria-label]="closeLabel()"
|
|
277
|
+
[title]="closeLabel()"
|
|
278
|
+
(click)="close()"
|
|
279
|
+
>
|
|
280
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
281
|
+
<path d="M4 4l4 4M8 4l-4 4" />
|
|
282
|
+
</svg>
|
|
283
|
+
</button>
|
|
284
|
+
<button
|
|
285
|
+
type="button"
|
|
286
|
+
data-shell-control="minimize"
|
|
287
|
+
[class]="trafficLightClasses('minimize')"
|
|
288
|
+
[attr.aria-label]="minimizeLabel()"
|
|
289
|
+
[title]="minimizeLabel()"
|
|
290
|
+
(click)="minimize()"
|
|
291
|
+
>
|
|
292
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
293
|
+
<path d="M3.5 6h5" />
|
|
294
|
+
</svg>
|
|
295
|
+
</button>
|
|
296
|
+
<button
|
|
297
|
+
type="button"
|
|
298
|
+
data-shell-control="zoom"
|
|
299
|
+
[class]="trafficLightClasses('zoom')"
|
|
300
|
+
[attr.aria-label]="maximizeToggleLabel()"
|
|
301
|
+
[attr.aria-pressed]="shell.isMaximized()"
|
|
302
|
+
[title]="maximizeToggleLabel()"
|
|
303
|
+
(click)="toggleMaximize()"
|
|
304
|
+
>
|
|
305
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
306
|
+
<path d="M6 3.5v5M3.5 6h5" />
|
|
307
|
+
</svg>
|
|
308
|
+
</button>
|
|
309
|
+
</div>
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
<ng-content select="[shellBarStart]" />
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
<div data-shell-bar-title [class]="titleClasses()">
|
|
316
|
+
<ng-content select="[shellBarTitle]" />
|
|
317
|
+
</div>
|
|
318
|
+
|
|
319
|
+
<div data-shell-bar-end [class]="endSlotClasses()">
|
|
320
|
+
<ng-content select="[shellBarEnd]" />
|
|
321
|
+
|
|
322
|
+
@if (isMacOs()) {
|
|
323
|
+
<ShellNavigationFlyout
|
|
324
|
+
[enabled]="navigationFlyout()"
|
|
325
|
+
[icon]="navigationFlyoutIcon()"
|
|
326
|
+
[label]="navigationFlyoutLabel()"
|
|
327
|
+
/>
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
@if (showsWindowControls()) {
|
|
331
|
+
<button
|
|
332
|
+
type="button"
|
|
333
|
+
data-shell-control="minimize"
|
|
334
|
+
[class]="controlClasses()"
|
|
335
|
+
[attr.aria-label]="minimizeLabel()"
|
|
336
|
+
[title]="minimizeLabel()"
|
|
337
|
+
(click)="minimize()"
|
|
338
|
+
>
|
|
339
|
+
<svg
|
|
340
|
+
aria-hidden="true"
|
|
341
|
+
focusable="false"
|
|
342
|
+
viewBox="0 0 16 16"
|
|
343
|
+
class="size-4"
|
|
344
|
+
fill="none"
|
|
345
|
+
stroke="currentColor"
|
|
346
|
+
stroke-width="1.25"
|
|
347
|
+
stroke-linecap="round"
|
|
348
|
+
>
|
|
349
|
+
<path d="M3.5 8h9" />
|
|
350
|
+
</svg>
|
|
351
|
+
</button>
|
|
352
|
+
|
|
353
|
+
<button
|
|
354
|
+
type="button"
|
|
355
|
+
data-shell-control="maximize"
|
|
356
|
+
[class]="controlClasses()"
|
|
357
|
+
[attr.aria-label]="maximizeToggleLabel()"
|
|
358
|
+
[attr.aria-pressed]="shell.isMaximized()"
|
|
359
|
+
[title]="maximizeToggleLabel()"
|
|
360
|
+
(click)="toggleMaximize()"
|
|
361
|
+
>
|
|
362
|
+
@if (shell.isMaximized()) {
|
|
363
|
+
<svg
|
|
364
|
+
aria-hidden="true"
|
|
365
|
+
focusable="false"
|
|
366
|
+
viewBox="0 0 16 16"
|
|
367
|
+
class="size-4"
|
|
368
|
+
fill="none"
|
|
369
|
+
stroke="currentColor"
|
|
370
|
+
stroke-width="1.25"
|
|
371
|
+
stroke-linejoin="round"
|
|
372
|
+
>
|
|
373
|
+
<path d="M5.25 5.25V3.75h7v7h-1.5" />
|
|
374
|
+
<rect x="3.75" y="5.25" width="7" height="7" rx="0.75" />
|
|
375
|
+
</svg>
|
|
376
|
+
} @else {
|
|
377
|
+
<svg
|
|
378
|
+
aria-hidden="true"
|
|
379
|
+
focusable="false"
|
|
380
|
+
viewBox="0 0 16 16"
|
|
381
|
+
class="size-4"
|
|
382
|
+
fill="none"
|
|
383
|
+
stroke="currentColor"
|
|
384
|
+
stroke-width="1.25"
|
|
385
|
+
stroke-linejoin="round"
|
|
386
|
+
>
|
|
387
|
+
<rect x="3.75" y="3.75" width="8.5" height="8.5" rx="0.75" />
|
|
388
|
+
</svg>
|
|
389
|
+
}
|
|
390
|
+
</button>
|
|
391
|
+
|
|
392
|
+
<button
|
|
393
|
+
type="button"
|
|
394
|
+
data-shell-control="close"
|
|
395
|
+
[class]="closeControlClasses()"
|
|
396
|
+
[attr.aria-label]="closeLabel()"
|
|
397
|
+
[title]="closeLabel()"
|
|
398
|
+
(click)="close()"
|
|
399
|
+
>
|
|
400
|
+
<svg
|
|
401
|
+
aria-hidden="true"
|
|
402
|
+
focusable="false"
|
|
403
|
+
viewBox="0 0 16 16"
|
|
404
|
+
class="size-4"
|
|
405
|
+
fill="none"
|
|
406
|
+
stroke="currentColor"
|
|
407
|
+
stroke-width="1.25"
|
|
408
|
+
stroke-linecap="round"
|
|
409
|
+
>
|
|
410
|
+
<path d="M4.25 4.25l7.5 7.5M11.75 4.25l-7.5 7.5" />
|
|
411
|
+
</svg>
|
|
412
|
+
</button>
|
|
413
|
+
}
|
|
414
|
+
</div>
|
|
415
|
+
`, isInline: true, dependencies: [{ kind: "component", type: ShellNavigationFlyoutComponent, selector: "ShellNavigationFlyout", inputs: ["enabled", "icon", "label"] }] });
|
|
416
|
+
}
|
|
417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellBarComponent, decorators: [{
|
|
418
|
+
type: Component,
|
|
419
|
+
args: [{
|
|
420
|
+
selector: 'ShellBar',
|
|
421
|
+
imports: [ShellNavigationFlyoutComponent],
|
|
422
|
+
host: {
|
|
423
|
+
'[class]': 'classes()',
|
|
424
|
+
'data-shell-bar': '',
|
|
425
|
+
'[attr.data-shell-device]': 'device()',
|
|
426
|
+
'[attr.data-shell-color]': 'color()',
|
|
427
|
+
'[attr.data-shell-frame]': 'frame()',
|
|
428
|
+
'[attr.data-tauri-drag-region]': 'drag() ? "" : null',
|
|
429
|
+
'[attr.data-shell-window]': 'shell.windowState()',
|
|
430
|
+
'[attr.data-shell-focused]': 'shell.focused()',
|
|
431
|
+
'[attr.role]': 'landmark() ? "banner" : null',
|
|
432
|
+
'[attr.aria-label]': 'landmark() ? ariaLabel() || null : null',
|
|
433
|
+
},
|
|
434
|
+
template: `
|
|
435
|
+
<div data-shell-bar-start [class]="startSlotClasses()">
|
|
436
|
+
@if (!isMacOs()) {
|
|
437
|
+
<ShellNavigationFlyout
|
|
438
|
+
[enabled]="navigationFlyout()"
|
|
439
|
+
[icon]="navigationFlyoutIcon()"
|
|
440
|
+
[label]="navigationFlyoutLabel()"
|
|
441
|
+
/>
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
@if (showsTrafficLights()) {
|
|
445
|
+
<div data-shell-traffic-lights class="flex shrink-0 items-center gap-2 pl-2 pr-1">
|
|
446
|
+
<button
|
|
447
|
+
type="button"
|
|
448
|
+
data-shell-control="close"
|
|
449
|
+
[class]="trafficLightClasses('close')"
|
|
450
|
+
[attr.aria-label]="closeLabel()"
|
|
451
|
+
[title]="closeLabel()"
|
|
452
|
+
(click)="close()"
|
|
453
|
+
>
|
|
454
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
455
|
+
<path d="M4 4l4 4M8 4l-4 4" />
|
|
456
|
+
</svg>
|
|
457
|
+
</button>
|
|
458
|
+
<button
|
|
459
|
+
type="button"
|
|
460
|
+
data-shell-control="minimize"
|
|
461
|
+
[class]="trafficLightClasses('minimize')"
|
|
462
|
+
[attr.aria-label]="minimizeLabel()"
|
|
463
|
+
[title]="minimizeLabel()"
|
|
464
|
+
(click)="minimize()"
|
|
465
|
+
>
|
|
466
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
467
|
+
<path d="M3.5 6h5" />
|
|
468
|
+
</svg>
|
|
469
|
+
</button>
|
|
470
|
+
<button
|
|
471
|
+
type="button"
|
|
472
|
+
data-shell-control="zoom"
|
|
473
|
+
[class]="trafficLightClasses('zoom')"
|
|
474
|
+
[attr.aria-label]="maximizeToggleLabel()"
|
|
475
|
+
[attr.aria-pressed]="shell.isMaximized()"
|
|
476
|
+
[title]="maximizeToggleLabel()"
|
|
477
|
+
(click)="toggleMaximize()"
|
|
478
|
+
>
|
|
479
|
+
<svg [class]="trafficGlyphClasses()" viewBox="0 0 12 12" aria-hidden="true">
|
|
480
|
+
<path d="M6 3.5v5M3.5 6h5" />
|
|
481
|
+
</svg>
|
|
482
|
+
</button>
|
|
483
|
+
</div>
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
<ng-content select="[shellBarStart]" />
|
|
487
|
+
</div>
|
|
488
|
+
|
|
489
|
+
<div data-shell-bar-title [class]="titleClasses()">
|
|
490
|
+
<ng-content select="[shellBarTitle]" />
|
|
491
|
+
</div>
|
|
492
|
+
|
|
493
|
+
<div data-shell-bar-end [class]="endSlotClasses()">
|
|
494
|
+
<ng-content select="[shellBarEnd]" />
|
|
495
|
+
|
|
496
|
+
@if (isMacOs()) {
|
|
497
|
+
<ShellNavigationFlyout
|
|
498
|
+
[enabled]="navigationFlyout()"
|
|
499
|
+
[icon]="navigationFlyoutIcon()"
|
|
500
|
+
[label]="navigationFlyoutLabel()"
|
|
501
|
+
/>
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
@if (showsWindowControls()) {
|
|
505
|
+
<button
|
|
506
|
+
type="button"
|
|
507
|
+
data-shell-control="minimize"
|
|
508
|
+
[class]="controlClasses()"
|
|
509
|
+
[attr.aria-label]="minimizeLabel()"
|
|
510
|
+
[title]="minimizeLabel()"
|
|
511
|
+
(click)="minimize()"
|
|
512
|
+
>
|
|
513
|
+
<svg
|
|
514
|
+
aria-hidden="true"
|
|
515
|
+
focusable="false"
|
|
516
|
+
viewBox="0 0 16 16"
|
|
517
|
+
class="size-4"
|
|
518
|
+
fill="none"
|
|
519
|
+
stroke="currentColor"
|
|
520
|
+
stroke-width="1.25"
|
|
521
|
+
stroke-linecap="round"
|
|
522
|
+
>
|
|
523
|
+
<path d="M3.5 8h9" />
|
|
524
|
+
</svg>
|
|
525
|
+
</button>
|
|
526
|
+
|
|
527
|
+
<button
|
|
528
|
+
type="button"
|
|
529
|
+
data-shell-control="maximize"
|
|
530
|
+
[class]="controlClasses()"
|
|
531
|
+
[attr.aria-label]="maximizeToggleLabel()"
|
|
532
|
+
[attr.aria-pressed]="shell.isMaximized()"
|
|
533
|
+
[title]="maximizeToggleLabel()"
|
|
534
|
+
(click)="toggleMaximize()"
|
|
535
|
+
>
|
|
536
|
+
@if (shell.isMaximized()) {
|
|
537
|
+
<svg
|
|
538
|
+
aria-hidden="true"
|
|
539
|
+
focusable="false"
|
|
540
|
+
viewBox="0 0 16 16"
|
|
541
|
+
class="size-4"
|
|
542
|
+
fill="none"
|
|
543
|
+
stroke="currentColor"
|
|
544
|
+
stroke-width="1.25"
|
|
545
|
+
stroke-linejoin="round"
|
|
546
|
+
>
|
|
547
|
+
<path d="M5.25 5.25V3.75h7v7h-1.5" />
|
|
548
|
+
<rect x="3.75" y="5.25" width="7" height="7" rx="0.75" />
|
|
549
|
+
</svg>
|
|
550
|
+
} @else {
|
|
551
|
+
<svg
|
|
552
|
+
aria-hidden="true"
|
|
553
|
+
focusable="false"
|
|
554
|
+
viewBox="0 0 16 16"
|
|
555
|
+
class="size-4"
|
|
556
|
+
fill="none"
|
|
557
|
+
stroke="currentColor"
|
|
558
|
+
stroke-width="1.25"
|
|
559
|
+
stroke-linejoin="round"
|
|
560
|
+
>
|
|
561
|
+
<rect x="3.75" y="3.75" width="8.5" height="8.5" rx="0.75" />
|
|
562
|
+
</svg>
|
|
563
|
+
}
|
|
564
|
+
</button>
|
|
565
|
+
|
|
566
|
+
<button
|
|
567
|
+
type="button"
|
|
568
|
+
data-shell-control="close"
|
|
569
|
+
[class]="closeControlClasses()"
|
|
570
|
+
[attr.aria-label]="closeLabel()"
|
|
571
|
+
[title]="closeLabel()"
|
|
572
|
+
(click)="close()"
|
|
573
|
+
>
|
|
574
|
+
<svg
|
|
575
|
+
aria-hidden="true"
|
|
576
|
+
focusable="false"
|
|
577
|
+
viewBox="0 0 16 16"
|
|
578
|
+
class="size-4"
|
|
579
|
+
fill="none"
|
|
580
|
+
stroke="currentColor"
|
|
581
|
+
stroke-width="1.25"
|
|
582
|
+
stroke-linecap="round"
|
|
583
|
+
>
|
|
584
|
+
<path d="M4.25 4.25l7.5 7.5M11.75 4.25l-7.5 7.5" />
|
|
585
|
+
</svg>
|
|
586
|
+
</button>
|
|
587
|
+
}
|
|
588
|
+
</div>
|
|
589
|
+
`,
|
|
590
|
+
}]
|
|
591
|
+
}], propDecorators: { device: [{ type: i0.Input, args: [{ isSignal: true, alias: "device", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], frame: [{ type: i0.Input, args: [{ isSignal: true, alias: "frame", required: false }] }], nativeWindowControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "nativeWindowControls", required: false }] }], drag: [{ type: i0.Input, args: [{ isSignal: true, alias: "drag", required: false }] }], landmark: [{ type: i0.Input, args: [{ isSignal: true, alias: "landmark", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], minimizeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimizeLabel", required: false }] }], maximizeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximizeLabel", required: false }] }], restoreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreLabel", required: false }] }], closeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeLabel", required: false }] }], navigationFlyout: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyout", required: false }] }], navigationFlyoutIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyoutIcon", required: false }] }], navigationFlyoutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyoutLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Root of an application shell: the element that owns the whole surface, whether
|
|
595
|
+
* that is a browser tab, an OS window, a tablet, or a phone.
|
|
596
|
+
*
|
|
597
|
+
* A `<Shell>` holds the app directly — normally a `<Layout>` — plus, on
|
|
598
|
+
* `mode='desktop'`, a titlebar it renders itself:
|
|
599
|
+
*
|
|
600
|
+
* ```html
|
|
601
|
+
* <Shell mode="desktop" device="macos">
|
|
602
|
+
* <span shellBarTitle>Acme Studio</span>
|
|
603
|
+
*
|
|
604
|
+
* <Layout>
|
|
605
|
+
* <LayoutVertical>…</LayoutVertical>
|
|
606
|
+
* </Layout>
|
|
607
|
+
* </Shell>
|
|
608
|
+
* ```
|
|
609
|
+
*
|
|
610
|
+
* ## Fallback chain
|
|
611
|
+
*
|
|
612
|
+
* Every axis is optional, and each falls back rather than demanding a value:
|
|
613
|
+
*
|
|
614
|
+
* - `mode` — this input, else the stored `shell-mode`, else `desktop` when a
|
|
615
|
+
* desktop runtime is registered, else `web`.
|
|
616
|
+
* - `device` — this input, else the stored `shell-device`, else whatever the
|
|
617
|
+
* window bridge reports, else the mode's default device.
|
|
618
|
+
* - `color` — this input, else the stored `shell-color`, else `sync`.
|
|
619
|
+
* - `frame` — this input, else the stored `shell-frame`, else `classic`; only
|
|
620
|
+
* `desktop` can be `modern`.
|
|
621
|
+
*
|
|
622
|
+
* `mode` and `device` are always resolved as a coherent pair: a device that
|
|
623
|
+
* belongs to another form factor (`mode='desktop' device='ipad'`) is corrected to
|
|
624
|
+
* the mode's default, so `data-shell-device` never describes something the mode
|
|
625
|
+
* cannot be.
|
|
626
|
+
*
|
|
627
|
+
* Inputs are host declarations, not user preferences, so setting them never
|
|
628
|
+
* writes to storage — use `ShellService.setMode()` / `setDevice()` for a choice
|
|
629
|
+
* that should persist.
|
|
630
|
+
*/
|
|
631
|
+
class ShellComponent {
|
|
632
|
+
shell = inject(ShellService);
|
|
633
|
+
/** Delivery target. `null` follows the stored/derived mode — see the class note. */
|
|
634
|
+
mode = input(null, /* @ts-ignore */
|
|
635
|
+
...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
636
|
+
/** Host OS. `null` follows the stored/reported device, corrected to fit `mode`. */
|
|
637
|
+
device = input(null, /* @ts-ignore */
|
|
638
|
+
...(ngDevMode ? [{ debugName: "device" }] : /* istanbul ignore next */ []));
|
|
639
|
+
/**
|
|
640
|
+
* Where the shell's own chrome takes its colors from. `sync` keeps the titlebar
|
|
641
|
+
* inside the design system; `default` paints the native look of the active
|
|
642
|
+
* device.
|
|
643
|
+
*/
|
|
644
|
+
color = input(null, /* @ts-ignore */
|
|
645
|
+
...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
646
|
+
/**
|
|
647
|
+
* How the app sits in its window. `classic` keeps it flush to the window edge
|
|
648
|
+
* under a bordered titlebar; `modern` insets it as a panel and fuses the titlebar
|
|
649
|
+
* with the surround into one continuous frame. Only meaningful on
|
|
650
|
+
* `mode='desktop'` — anything else resolves to `classic`.
|
|
651
|
+
*/
|
|
652
|
+
frame = input(null, /* @ts-ignore */
|
|
653
|
+
...(ngDevMode ? [{ debugName: "frame" }] : /* istanbul ignore next */ []));
|
|
654
|
+
/**
|
|
655
|
+
* `true` when the runtime still draws its own window buttons, so the shell must
|
|
656
|
+
* not draw them: on macOS the titlebar reserves the leading run for the OS
|
|
657
|
+
* traffic lights (Tauri's `titleBarStyle: 'Overlay'`), and Windows / Linux draw
|
|
658
|
+
* nothing. Leave `false` for a `decorations: false` window, where the app owns
|
|
659
|
+
* the buttons — otherwise there would be no way to close it.
|
|
660
|
+
*/
|
|
661
|
+
nativeWindowControls = input(false, { ...(ngDevMode ? { debugName: "nativeWindowControls" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
662
|
+
/** Mark the exposed desktop frame and titlebar as drag surfaces below interactive content. */
|
|
663
|
+
drag = input(true, { ...(ngDevMode ? { debugName: "drag" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
664
|
+
/** Expose the titlebar as the `banner` landmark. Turn off for a nested preview. */
|
|
665
|
+
landmark = input(true, { ...(ngDevMode ? { debugName: "landmark" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
666
|
+
barAriaLabel = input('Application title bar', /* @ts-ignore */
|
|
667
|
+
...(ngDevMode ? [{ debugName: "barAriaLabel" }] : /* istanbul ignore next */ []));
|
|
668
|
+
minimizeLabel = input('Minimize window', /* @ts-ignore */
|
|
669
|
+
...(ngDevMode ? [{ debugName: "minimizeLabel" }] : /* istanbul ignore next */ []));
|
|
670
|
+
maximizeLabel = input('Maximize window', /* @ts-ignore */
|
|
671
|
+
...(ngDevMode ? [{ debugName: "maximizeLabel" }] : /* istanbul ignore next */ []));
|
|
672
|
+
restoreLabel = input('Restore window', /* @ts-ignore */
|
|
673
|
+
...(ngDevMode ? [{ debugName: "restoreLabel" }] : /* istanbul ignore next */ []));
|
|
674
|
+
closeLabel = input('Close window', /* @ts-ignore */
|
|
675
|
+
...(ngDevMode ? [{ debugName: "closeLabel" }] : /* istanbul ignore next */ []));
|
|
676
|
+
/**
|
|
677
|
+
* Automatically surface the desktop layout's primary navigation as an icon
|
|
678
|
+
* flyout in the titlebar. macOS places it at the trailing edge; Windows and
|
|
679
|
+
* Linux place it at the leading edge.
|
|
680
|
+
*/
|
|
681
|
+
navigationFlyout = input(true, { ...(ngDevMode ? { debugName: "navigationFlyout" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
682
|
+
navigationFlyoutIcon = input('apps', /* @ts-ignore */
|
|
683
|
+
...(ngDevMode ? [{ debugName: "navigationFlyoutIcon" }] : /* istanbul ignore next */ []));
|
|
684
|
+
navigationFlyoutLabel = input('Open navigation', /* @ts-ignore */
|
|
685
|
+
...(ngDevMode ? [{ debugName: "navigationFlyoutLabel" }] : /* istanbul ignore next */ []));
|
|
686
|
+
class = input('', /* @ts-ignore */
|
|
687
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
688
|
+
resolvedMode = computed(() => this.mode() ?? this.shell.mode(), /* @ts-ignore */
|
|
689
|
+
...(ngDevMode ? [{ debugName: "resolvedMode" }] : /* istanbul ignore next */ []));
|
|
690
|
+
resolvedDevice = computed(() => resolveShellDeviceForMode(this.resolvedMode(), this.device() ?? this.shell.device()), /* @ts-ignore */
|
|
691
|
+
...(ngDevMode ? [{ debugName: "resolvedDevice" }] : /* istanbul ignore next */ []));
|
|
692
|
+
resolvedColor = computed(() => this.color() ?? this.shell.color(), /* @ts-ignore */
|
|
693
|
+
...(ngDevMode ? [{ debugName: "resolvedColor" }] : /* istanbul ignore next */ []));
|
|
694
|
+
resolvedFrame = computed(() => resolveShellFrameForMode(this.resolvedMode(), this.frame() ?? this.shell.frame()), /* @ts-ignore */
|
|
695
|
+
...(ngDevMode ? [{ debugName: "resolvedFrame" }] : /* istanbul ignore next */ []));
|
|
696
|
+
/** Only a desktop window has chrome of its own to draw. */
|
|
697
|
+
showsBar = computed(() => this.resolvedMode() === 'desktop', /* @ts-ignore */
|
|
698
|
+
...(ngDevMode ? [{ debugName: "showsBar" }] : /* istanbul ignore next */ []));
|
|
699
|
+
hostClasses = computed(() => cn(
|
|
700
|
+
// h-dvh, not h-full: the shell is the whole surface. `isolate` keeps the
|
|
701
|
+
// titlebar's stacking context out of the app's, so a bar menu can never be
|
|
702
|
+
// painted over by content below it.
|
|
703
|
+
'relative isolate flex h-dvh w-full min-w-0 flex-col overflow-hidden text-foreground', this.showsBar() && this.drag() && 'shell-drag-region',
|
|
704
|
+
// A synchronized shell promotes the selected Theme color to the whole shell
|
|
705
|
+
// background. `modern` also shares the titlebar token with its inset surround,
|
|
706
|
+
// including when `color='default'` maps that token to native device chrome.
|
|
707
|
+
this.resolvedColor() === 'sync' || this.resolvedFrame() === 'modern'
|
|
708
|
+
? 'bg-[hsl(var(--shell-bar-background))]'
|
|
709
|
+
: 'bg-layout-canvas', this.class()), /* @ts-ignore */
|
|
710
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
711
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
712
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: ShellComponent, isStandalone: true, selector: "Shell", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, device: { classPropertyName: "device", publicName: "device", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, frame: { classPropertyName: "frame", publicName: "frame", isSignal: true, isRequired: false, transformFunction: null }, nativeWindowControls: { classPropertyName: "nativeWindowControls", publicName: "nativeWindowControls", isSignal: true, isRequired: false, transformFunction: null }, drag: { classPropertyName: "drag", publicName: "drag", isSignal: true, isRequired: false, transformFunction: null }, landmark: { classPropertyName: "landmark", publicName: "landmark", isSignal: true, isRequired: false, transformFunction: null }, barAriaLabel: { classPropertyName: "barAriaLabel", publicName: "barAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, minimizeLabel: { classPropertyName: "minimizeLabel", publicName: "minimizeLabel", isSignal: true, isRequired: false, transformFunction: null }, maximizeLabel: { classPropertyName: "maximizeLabel", publicName: "maximizeLabel", isSignal: true, isRequired: false, transformFunction: null }, restoreLabel: { classPropertyName: "restoreLabel", publicName: "restoreLabel", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyout: { classPropertyName: "navigationFlyout", publicName: "navigationFlyout", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyoutIcon: { classPropertyName: "navigationFlyoutIcon", publicName: "navigationFlyoutIcon", isSignal: true, isRequired: false, transformFunction: null }, navigationFlyoutLabel: { classPropertyName: "navigationFlyoutLabel", publicName: "navigationFlyoutLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-shell-root": "" }, properties: { "class": "hostClasses()", "attr.data-shell-mode": "resolvedMode()", "attr.data-shell-device": "resolvedDevice()", "attr.data-shell-color": "resolvedColor()", "attr.data-shell-frame": "resolvedFrame()", "attr.data-shell-platform": "shell.platform", "attr.data-shell-window": "shell.windowState()" } }, ngImport: i0, template: `
|
|
713
|
+
@if (showsBar() && drag()) {
|
|
714
|
+
<div
|
|
715
|
+
aria-hidden="true"
|
|
716
|
+
data-shell-frame-drag-region
|
|
717
|
+
data-tauri-drag-region
|
|
718
|
+
class="pointer-events-auto absolute inset-0 z-0"
|
|
719
|
+
></div>
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
@if (showsBar()) {
|
|
723
|
+
<ShellBar
|
|
724
|
+
[device]="resolvedDevice()"
|
|
725
|
+
[color]="resolvedColor()"
|
|
726
|
+
[frame]="resolvedFrame()"
|
|
727
|
+
[nativeWindowControls]="nativeWindowControls()"
|
|
728
|
+
[drag]="drag()"
|
|
729
|
+
[landmark]="landmark()"
|
|
730
|
+
[ariaLabel]="barAriaLabel()"
|
|
731
|
+
[minimizeLabel]="minimizeLabel()"
|
|
732
|
+
[maximizeLabel]="maximizeLabel()"
|
|
733
|
+
[restoreLabel]="restoreLabel()"
|
|
734
|
+
[closeLabel]="closeLabel()"
|
|
735
|
+
[navigationFlyout]="navigationFlyout()"
|
|
736
|
+
[navigationFlyoutIcon]="navigationFlyoutIcon()"
|
|
737
|
+
[navigationFlyoutLabel]="navigationFlyoutLabel()"
|
|
738
|
+
>
|
|
739
|
+
<ng-content select="[shellBarStart]" ngProjectAs="[shellBarStart]" />
|
|
740
|
+
<ng-content select="[shellBarTitle]" ngProjectAs="[shellBarTitle]" />
|
|
741
|
+
<ng-content select="[shellBarEnd]" ngProjectAs="[shellBarEnd]" />
|
|
742
|
+
</ShellBar>
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
<ng-content />
|
|
746
|
+
`, isInline: true, dependencies: [{ kind: "component", type: ShellBarComponent, selector: "ShellBar", inputs: ["device", "color", "frame", "nativeWindowControls", "drag", "landmark", "ariaLabel", "minimizeLabel", "maximizeLabel", "restoreLabel", "closeLabel", "navigationFlyout", "navigationFlyoutIcon", "navigationFlyoutLabel", "class"] }] });
|
|
747
|
+
}
|
|
748
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: ShellComponent, decorators: [{
|
|
749
|
+
type: Component,
|
|
750
|
+
args: [{
|
|
751
|
+
selector: 'Shell',
|
|
752
|
+
imports: [ShellBarComponent],
|
|
753
|
+
host: {
|
|
754
|
+
'[class]': 'hostClasses()',
|
|
755
|
+
'data-shell-root': '',
|
|
756
|
+
'[attr.data-shell-mode]': 'resolvedMode()',
|
|
757
|
+
'[attr.data-shell-device]': 'resolvedDevice()',
|
|
758
|
+
'[attr.data-shell-color]': 'resolvedColor()',
|
|
759
|
+
'[attr.data-shell-frame]': 'resolvedFrame()',
|
|
760
|
+
'[attr.data-shell-platform]': 'shell.platform',
|
|
761
|
+
'[attr.data-shell-window]': 'shell.windowState()',
|
|
762
|
+
},
|
|
763
|
+
template: `
|
|
764
|
+
@if (showsBar() && drag()) {
|
|
765
|
+
<div
|
|
766
|
+
aria-hidden="true"
|
|
767
|
+
data-shell-frame-drag-region
|
|
768
|
+
data-tauri-drag-region
|
|
769
|
+
class="pointer-events-auto absolute inset-0 z-0"
|
|
770
|
+
></div>
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
@if (showsBar()) {
|
|
774
|
+
<ShellBar
|
|
775
|
+
[device]="resolvedDevice()"
|
|
776
|
+
[color]="resolvedColor()"
|
|
777
|
+
[frame]="resolvedFrame()"
|
|
778
|
+
[nativeWindowControls]="nativeWindowControls()"
|
|
779
|
+
[drag]="drag()"
|
|
780
|
+
[landmark]="landmark()"
|
|
781
|
+
[ariaLabel]="barAriaLabel()"
|
|
782
|
+
[minimizeLabel]="minimizeLabel()"
|
|
783
|
+
[maximizeLabel]="maximizeLabel()"
|
|
784
|
+
[restoreLabel]="restoreLabel()"
|
|
785
|
+
[closeLabel]="closeLabel()"
|
|
786
|
+
[navigationFlyout]="navigationFlyout()"
|
|
787
|
+
[navigationFlyoutIcon]="navigationFlyoutIcon()"
|
|
788
|
+
[navigationFlyoutLabel]="navigationFlyoutLabel()"
|
|
789
|
+
>
|
|
790
|
+
<ng-content select="[shellBarStart]" ngProjectAs="[shellBarStart]" />
|
|
791
|
+
<ng-content select="[shellBarTitle]" ngProjectAs="[shellBarTitle]" />
|
|
792
|
+
<ng-content select="[shellBarEnd]" ngProjectAs="[shellBarEnd]" />
|
|
793
|
+
</ShellBar>
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
<ng-content />
|
|
797
|
+
`,
|
|
798
|
+
}]
|
|
799
|
+
}], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], device: [{ type: i0.Input, args: [{ isSignal: true, alias: "device", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], frame: [{ type: i0.Input, args: [{ isSignal: true, alias: "frame", required: false }] }], nativeWindowControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "nativeWindowControls", required: false }] }], drag: [{ type: i0.Input, args: [{ isSignal: true, alias: "drag", required: false }] }], landmark: [{ type: i0.Input, args: [{ isSignal: true, alias: "landmark", required: false }] }], barAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "barAriaLabel", required: false }] }], minimizeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimizeLabel", required: false }] }], maximizeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maximizeLabel", required: false }] }], restoreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreLabel", required: false }] }], closeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeLabel", required: false }] }], navigationFlyout: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyout", required: false }] }], navigationFlyoutIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyoutIcon", required: false }] }], navigationFlyoutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigationFlyoutLabel", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
800
|
+
|
|
801
|
+
/*
|
|
802
|
+
* Public API of @ojiepermana/angular/theme/shell
|
|
803
|
+
*
|
|
804
|
+
* The application shell root: <Shell> owns the whole surface and holds the app
|
|
805
|
+
* (normally a <Layout>) directly. On mode='desktop' it also renders its own
|
|
806
|
+
* titlebar — <ShellBar> is deliberately NOT exported, because when a titlebar
|
|
807
|
+
* exists is <Shell>'s decision, not the consumer's. Configure it through <Shell>
|
|
808
|
+
* and its [shellBarStart] / [shellBarTitle] / [shellBarEnd] slots.
|
|
809
|
+
*/
|
|
4
810
|
|
|
5
811
|
/**
|
|
6
812
|
* Generated bundle index. Do not edit.
|
|
7
|
-
*/
|
|
813
|
+
*/
|
|
814
|
+
|
|
815
|
+
export { ShellComponent };
|