diff --git a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.html b/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.html deleted file mode 100644 index e4ff652a30..0000000000 --- a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.html +++ /dev/null @@ -1,33 +0,0 @@ - -
-
- - - -

Fit layout demo

-
-
- - -

- Elements in a page with a layout of "fit" can be absolutely - positioned inside it. This is especially powerful when combined - with content that uses - CSS flexbox. This example uses flexbox to display a header with a variable - height and content that fills the rest of the available viewport. -

-
-
-
-
-
-
Left
-
Top
-
Right
-
Bottom
-
Center
-
-
-
diff --git a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.scss b/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.scss deleted file mode 100644 index 572f3399ca..0000000000 --- a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.scss +++ /dev/null @@ -1,49 +0,0 @@ -.layout-fit-demo { - display: flex; - flex-direction: column; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - - &-header { - flex-grow: 0; - } - - &-content { - background-color: var(--sky-background-color-info-light); - flex-grow: 1; - position: relative; - } -} - -.anchored-item { - position: absolute; - padding: var(--sky-padding-even-md); - - &-left { - left: 0; - top: 50%; - } - - &-top { - top: 0; - left: 50%; - } - - &-right { - top: 50%; - right: 0; - } - - &-bottom { - bottom: 0; - left: 50%; - } - - &-center { - top: 50%; - left: 50%; - } -} diff --git a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.ts b/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.ts deleted file mode 100644 index 11ed33a35c..0000000000 --- a/apps/code-examples/src/app/code-examples/layout/page/layout-fit/demo.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SkyFluidGridModule, SkyPageModule } from '@skyux/layout'; - -@Component({ - selector: 'app-demo', - templateUrl: './demo.component.html', - styleUrls: ['./demo.component.scss'], - imports: [SkyFluidGridModule, SkyPageModule], -}) -export class DemoComponent {} diff --git a/apps/code-examples/src/app/code-examples/split-view/split-view/page-bound/demo.component.ts b/apps/code-examples/src/app/code-examples/split-view/split-view/page-bound/demo.component.ts index c1d0f18e31..ddd7baf6cc 100644 --- a/apps/code-examples/src/app/code-examples/split-view/split-view/page-bound/demo.component.ts +++ b/apps/code-examples/src/app/code-examples/split-view/split-view/page-bound/demo.component.ts @@ -8,13 +8,10 @@ import { import { SkySummaryActionBarModule } from '@skyux/action-bars'; import { SkyInputBoxModule } from '@skyux/forms'; import { SkyAlertModule } from '@skyux/indicators'; -import { - SkyDescriptionListModule, - SkyPageModule, - SkyPageSummaryModule, -} from '@skyux/layout'; +import { SkyDescriptionListModule, SkyPageSummaryModule } from '@skyux/layout'; import { SkyRepeaterModule } from '@skyux/lists'; import { SkyConfirmService, SkyConfirmType } from '@skyux/modals'; +import { SkyPageModule } from '@skyux/pages'; import { SkySplitViewMessage, SkySplitViewMessageType, diff --git a/apps/code-examples/src/app/features/layout.module.ts b/apps/code-examples/src/app/features/layout.module.ts index a6fa466c12..5ddc8679a9 100644 --- a/apps/code-examples/src/app/features/layout.module.ts +++ b/apps/code-examples/src/app/features/layout.module.ts @@ -121,13 +121,6 @@ const routes: Routes = [ '../code-examples/layout/inline-delete/repeater/demo.component' ).then((c) => c.DemoComponent), }, - { - path: 'page', - loadComponent: () => - import('../code-examples/layout/page/layout-fit/demo.component').then( - (c) => c.DemoComponent, - ), - }, { path: 'page-summary/basic', loadComponent: () => diff --git a/apps/e2e/layout-storybook-e2e/src/e2e/page.component.cy.ts b/apps/e2e/layout-storybook-e2e/src/e2e/page.component.cy.ts deleted file mode 100644 index cd0fc4e0e1..0000000000 --- a/apps/e2e/layout-storybook-e2e/src/e2e/page.component.cy.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { E2eVariations } from '@skyux-sdk/e2e-schematics'; - -describe('layout-storybook', () => { - E2eVariations.forEachTheme((theme) => { - describe(`in ${theme} theme`, () => { - beforeEach(() => - cy.visit( - `/iframe.html?globals=theme:${theme}&id=pagecomponent-page--page`, - ), - ); - - it('should constrain the contents of the page with layout fit to the available viewport', () => { - cy.get('.screenshot-area') - .should('exist') - .should('be.visible') - .screenshot(`pagecomponent-page--page-layout-fit-${theme}`); - cy.get('.screenshot-area').percySnapshot( - `pagecomponent-page--page-layout-fit-${theme}`, - { - widths: E2eVariations.DISPLAY_WIDTHS, - }, - ); - }); - }); - }); -}); diff --git a/apps/e2e/layout-storybook/src/app/app.module.ts b/apps/e2e/layout-storybook/src/app/app.module.ts index 7dbe78e852..b913bad8ce 100644 --- a/apps/e2e/layout-storybook/src/app/app.module.ts +++ b/apps/e2e/layout-storybook/src/app/app.module.ts @@ -10,10 +10,6 @@ const routes: Route[] = [ path: 'box', loadChildren: () => import('./box/box.module').then((m) => m.BoxModule), }, - { - path: 'page', - loadChildren: () => import('./page/page.module').then((m) => m.PageModule), - }, { path: 'fluid-grid', loadChildren: () => diff --git a/apps/e2e/layout-storybook/src/app/page/page.component.html b/apps/e2e/layout-storybook/src/app/page/page.component.html deleted file mode 100644 index 98eb6dacb2..0000000000 --- a/apps/e2e/layout-storybook/src/app/page/page.component.html +++ /dev/null @@ -1,12 +0,0 @@ -
- -
Left ({{ spaces.left }}px)
-
Top ({{ spaces.top }}px)
-
- Right ({{ spaces.right }}px) -
-
- Bottom ({{ spaces.bottom }}px) -
-
Center
-
diff --git a/apps/e2e/layout-storybook/src/app/page/page.component.scss b/apps/e2e/layout-storybook/src/app/page/page.component.scss deleted file mode 100644 index 9c7b47cd3f..0000000000 --- a/apps/e2e/layout-storybook/src/app/page/page.component.scss +++ /dev/null @@ -1,43 +0,0 @@ -:host { - display: block; -} - -.screenshot-area { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; -} - -.anchored-item { - background-color: green; - color: #fff; - position: absolute; - padding: var(--sky-padding-even-md); - - &-left { - left: 0; - top: 50%; - } - - &-top { - top: 0; - left: 50%; - } - - &-right { - top: 50%; - right: 0; - } - - &-bottom { - bottom: 0; - left: 50%; - } - - &-center { - top: 50%; - left: 50%; - } -} diff --git a/apps/e2e/layout-storybook/src/app/page/page.component.stories.ts b/apps/e2e/layout-storybook/src/app/page/page.component.stories.ts deleted file mode 100644 index 84ec1efd99..0000000000 --- a/apps/e2e/layout-storybook/src/app/page/page.component.stories.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { moduleMetadata } from '@storybook/angular'; -import type { Meta, StoryObj } from '@storybook/angular'; - -import { PageComponent } from './page.component'; -import { PageModule } from './page.module'; - -export default { - id: 'pagecomponent-page', - title: 'Components/Page', - component: PageComponent, - decorators: [ - moduleMetadata({ - imports: [PageModule], - }), - ], -} as Meta; -type Story = StoryObj; -export const Page: Story = {}; -Page.args = {}; diff --git a/apps/e2e/layout-storybook/src/app/page/page.component.ts b/apps/e2e/layout-storybook/src/app/page/page.component.ts deleted file mode 100644 index b253e32bc0..0000000000 --- a/apps/e2e/layout-storybook/src/app/page/page.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { - SkyAppViewportReservedPositionType, - SkyAppViewportService, -} from '@skyux/theme'; - -@Component({ - selector: 'app-page', - templateUrl: './page.component.html', - styleUrls: ['./page.component.scss'], - standalone: false, -}) -export class PageComponent implements OnInit, OnDestroy { - public spaces = { - left: 10, - top: 40, - right: 80, - bottom: 120, - } as { [key in SkyAppViewportReservedPositionType]: number }; - - #viewportSvc: SkyAppViewportService; - - constructor(viewportSvc: SkyAppViewportService) { - this.#viewportSvc = viewportSvc; - } - - public ngOnInit(): void { - for (const [position, size] of Object.entries(this.spaces)) { - this.#viewportSvc.reserveSpace({ - id: position, - position: position as SkyAppViewportReservedPositionType, - size, - }); - } - } - - public ngOnDestroy(): void { - for (const position of Object.keys(this.spaces)) { - this.#viewportSvc.unreserveSpace(position); - } - } -} diff --git a/apps/e2e/layout-storybook/src/app/page/page.module.ts b/apps/e2e/layout-storybook/src/app/page/page.module.ts deleted file mode 100644 index 3fa8dede52..0000000000 --- a/apps/e2e/layout-storybook/src/app/page/page.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { SkyPageModule } from '@skyux/layout'; - -import { PageComponent } from './page.component'; - -const routes: Routes = [{ path: '', component: PageComponent }]; -@NgModule({ - declarations: [PageComponent], - imports: [CommonModule, RouterModule.forChild(routes), SkyPageModule], - exports: [PageComponent], -}) -export class PageModule {} diff --git a/apps/e2e/tabs-storybook/src/app/vertical-tabs/vertical-tabs.module.ts b/apps/e2e/tabs-storybook/src/app/vertical-tabs/vertical-tabs.module.ts index ba84c2b2cc..d9474fea2d 100644 --- a/apps/e2e/tabs-storybook/src/app/vertical-tabs/vertical-tabs.module.ts +++ b/apps/e2e/tabs-storybook/src/app/vertical-tabs/vertical-tabs.module.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { SkyPageModule } from '@skyux/layout'; +import { SkyPageModule } from '@skyux/pages'; import { SkyVerticalTabsetModule } from '@skyux/tabs'; import { VerticalTabsComponent } from './vertical-tabs.component'; diff --git a/apps/playground/src/app/components/split-view/split-view/split-view.module.ts b/apps/playground/src/app/components/split-view/split-view/split-view.module.ts index fa64f6a597..ff6baa6868 100644 --- a/apps/playground/src/app/components/split-view/split-view/split-view.module.ts +++ b/apps/playground/src/app/components/split-view/split-view/split-view.module.ts @@ -2,12 +2,9 @@ import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { SkySummaryActionBarModule } from '@skyux/action-bars'; import { SkyInputBoxModule } from '@skyux/forms'; -import { - SkyDefinitionListModule, - SkyFluidGridModule, - SkyPageModule, -} from '@skyux/layout'; +import { SkyDefinitionListModule, SkyFluidGridModule } from '@skyux/layout'; import { SkyRepeaterModule } from '@skyux/lists'; +import { SkyPageModule } from '@skyux/pages'; import { SkySplitViewModule } from '@skyux/split-view'; import { DataManagerModule } from '../../../shared/data-manager/data-manager.module'; diff --git a/apps/playground/src/app/components/tabs/tabs/tabs.module.ts b/apps/playground/src/app/components/tabs/tabs/tabs.module.ts index c64f582326..1cbb0e2e96 100644 --- a/apps/playground/src/app/components/tabs/tabs/tabs.module.ts +++ b/apps/playground/src/app/components/tabs/tabs/tabs.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { SkyPageModule } from '@skyux/layout'; +import { SkyPageModule } from '@skyux/pages'; import { SkyTabsModule } from '@skyux/tabs'; import { TabsRoutingModule } from './tabs-routing.module'; diff --git a/libs/components/layout/src/index.ts b/libs/components/layout/src/index.ts index 3af544b03c..469de5efc3 100644 --- a/libs/components/layout/src/index.ts +++ b/libs/components/layout/src/index.ts @@ -29,9 +29,6 @@ export { SkyFormatModule } from './lib/modules/format/format.module'; export { SkyInlineDeleteType } from './lib/modules/inline-delete/inline-delete-type'; export { SkyInlineDeleteModule } from './lib/modules/inline-delete/inline-delete.module'; -export { SkyPageLayoutType } from './lib/modules/page/page-layout-type'; -export { SkyPageModule } from './lib/modules/page/page.module'; - export { SkyPageSummaryModule } from './lib/modules/page-summary/page-summary.module'; export { SkyTextExpandModule } from './lib/modules/text-expand/text-expand.module'; @@ -80,7 +77,6 @@ export { SkyPageSummaryStatusComponent as λ32 } from './lib/modules/page-summar export { SkyPageSummarySubtitleComponent as λ33 } from './lib/modules/page-summary/page-summary-subtitle.component'; export { SkyPageSummaryTitleComponent as λ34 } from './lib/modules/page-summary/page-summary-title.component'; export { SkyPageSummaryComponent as λ27 } from './lib/modules/page-summary/page-summary.component'; -export { SkyPageComponent as λ26 } from './lib/modules/page/page.component'; export { SkyTextExpandRepeaterComponent as λ36 } from './lib/modules/text-expand-repeater/text-expand-repeater.component'; export { SkyTextExpandComponent as λ35 } from './lib/modules/text-expand/text-expand.component'; export { SkyToolbarItemComponent as λ39 } from './lib/modules/toolbar/toolbar-item.component'; diff --git a/libs/components/layout/src/lib/modules/page/page-layout-type.ts b/libs/components/layout/src/lib/modules/page/page-layout-type.ts deleted file mode 100644 index 2d9fa48ba3..0000000000 --- a/libs/components/layout/src/lib/modules/page/page-layout-type.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @deprecated Use `SkyPageLayoutType` in `@skyux/pages` instead. - */ -export type SkyPageLayoutType = 'auto' | 'fit'; diff --git a/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.spec.ts b/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.spec.ts deleted file mode 100644 index 8e4aefde56..0000000000 --- a/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { expect } from '@skyux-sdk/testing'; - -import { SkyPageThemeAdapterService } from './page-theme-adapter.service'; - -describe('Page theme service', () => { - let pageThemeSvc!: SkyPageThemeAdapterService; - - function getHeadStyleCount(): number { - return document.head.querySelectorAll('style').length; - } - - beforeEach(() => { - pageThemeSvc = new SkyPageThemeAdapterService(document); - }); - - afterEach(() => { - pageThemeSvc.removeTheme(); - }); - - it('should not add the theme stylesheet twice', () => { - const styleCount = getHeadStyleCount(); - - pageThemeSvc.addTheme(); - pageThemeSvc.addTheme(); - - expect(getHeadStyleCount()).toBe(styleCount + 1); - }); - - it('should not remove the theme stylesheet twice', () => { - pageThemeSvc.addTheme(); - - const styleCount = getHeadStyleCount(); - - pageThemeSvc.removeTheme(); - pageThemeSvc.removeTheme(); - - expect(getHeadStyleCount()).toBe(styleCount - 1); - }); -}); diff --git a/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.ts b/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.ts deleted file mode 100644 index 0ae1083be7..0000000000 --- a/libs/components/layout/src/lib/modules/page/page-theme-adapter.service.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { DOCUMENT } from '@angular/common'; -import { Inject, Injectable } from '@angular/core'; - -/** - * @internal - */ -@Injectable() -export class SkyPageThemeAdapterService { - #styleEl: HTMLStyleElement | undefined; - - #document: Document; - - constructor(@Inject(DOCUMENT) document: Document) { - this.#document = document; - } - - /** - * We can't use ViewEncapsulation.None for this behavior because Angular does - * not remove `style` tags from the HEAD element after route changes. - * @see https://github.com/angular/angular/issues/16670 - */ - public addTheme(): void { - if (!this.#styleEl) { - this.#styleEl = this.#document.createElement('style'); - this.#styleEl.appendChild( - this.#document.createTextNode( - 'body:not(.sky-theme-modern) { background-color: #fff; }', - ), - ); - - this.#document.head.appendChild(this.#styleEl); - } - } - - public removeTheme(): void { - if (this.#styleEl) { - this.#styleEl.remove(); - this.#styleEl = undefined; - } - } -} diff --git a/libs/components/layout/src/lib/modules/page/page.component.html b/libs/components/layout/src/lib/modules/page/page.component.html deleted file mode 100644 index 8468f2b40f..0000000000 --- a/libs/components/layout/src/lib/modules/page/page.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/libs/components/layout/src/lib/modules/page/page.component.scss b/libs/components/layout/src/lib/modules/page/page.component.scss deleted file mode 100644 index e0f36b7365..0000000000 --- a/libs/components/layout/src/lib/modules/page/page.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.sky-layout-host-fit { - position: absolute; - left: var(--sky-viewport-left); - top: var(--sky-viewport-top); - right: var(--sky-viewport-right); - bottom: var(--sky-viewport-bottom); -} diff --git a/libs/components/layout/src/lib/modules/page/page.component.spec.ts b/libs/components/layout/src/lib/modules/page/page.component.spec.ts deleted file mode 100644 index 4af063cf03..0000000000 --- a/libs/components/layout/src/lib/modules/page/page.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { expect } from '@skyux-sdk/testing'; - -import { SkyPageLayoutType } from './page-layout-type'; -import { SkyPageComponent } from './page.component'; -import { SkyPageModule } from './page.module'; - -describe('Page component', () => { - const defaultBackgroundColor = 'rgb(0, 0, 0)'; - let styleEl: HTMLStyleElement; - - function validateBackgroundColor(expectedColor: string): void { - expect(getComputedStyle(document.body).backgroundColor).toBe(expectedColor); - } - - function validateLayout( - fixture: ComponentFixture, - layout: SkyPageLayoutType | undefined, - expectedCssClass: string, - ): void { - fixture.componentInstance.layout = layout; - fixture.detectChanges(); - - expect(fixture.nativeElement.querySelector('div')).toHaveCssClass( - expectedCssClass, - ); - } - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [SkyPageModule], - }); - - styleEl = document.createElement('style'); - - styleEl.appendChild( - document.createTextNode( - `body { background-color: ${defaultBackgroundColor}; }`, - ), - ); - - document.head.appendChild(styleEl); - }); - - afterEach(() => { - document.head.removeChild(styleEl); - }); - - it("should set the page's background color to white", () => { - const fixture = TestBed.createComponent(SkyPageComponent); - fixture.detectChanges(); - - validateBackgroundColor('rgb(255, 255, 255)'); - - fixture.destroy(); - - validateBackgroundColor(defaultBackgroundColor); - }); - - it('should add the expected CSS class for the layout input', () => { - const fixture = TestBed.createComponent(SkyPageComponent); - fixture.detectChanges(); - - validateLayout(fixture, 'auto', 'sky-layout-host-auto'); - validateLayout(fixture, 'fit', 'sky-layout-host-fit'); - validateLayout(fixture, undefined, 'sky-layout-host-auto'); - - fixture.destroy(); - }); -}); diff --git a/libs/components/layout/src/lib/modules/page/page.component.ts b/libs/components/layout/src/lib/modules/page/page.component.ts deleted file mode 100644 index ed8b715686..0000000000 --- a/libs/components/layout/src/lib/modules/page/page.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core'; -import { SkyLogService } from '@skyux/core'; - -import { SkyPageLayoutType } from './page-layout-type'; -import { SkyPageThemeAdapterService } from './page-theme-adapter.service'; - -/** - * Displays page contents using the specified layout. - * @deprecated Use the `sky-page` component in `@skyux/pages` instead. - */ -@Component({ - selector: 'sky-page', - templateUrl: './page.component.html', - styleUrls: ['./page.component.scss'], - providers: [SkyPageThemeAdapterService], - standalone: false, -}) -export class SkyPageComponent implements OnInit, OnDestroy { - /** - * The page layout. Use `auto` to allow the page contents - * to expand beyond the bottom of the browser window. Use `fit` - * to constrain the page contents to the available viewport. - */ - @Input() - public set layout(value: SkyPageLayoutType | undefined) { - this.#_layout = value || 'auto'; - } - - public get layout(): SkyPageLayoutType { - return this.#_layout; - } - - #themeAdapter: SkyPageThemeAdapterService; - - #_layout: SkyPageLayoutType = 'auto'; - - #logger = inject(SkyLogService); - - constructor(themeAdapter: SkyPageThemeAdapterService) { - this.#logger.deprecated('SkyPageComponent', { - deprecationMajorVersion: 8, - moreInfoUrl: 'https://developer.blackbaud.com/skyux/components/page', - replacementRecommendation: - 'Use the `sky-page` component in `@skyux/pages` instead.', - }); - - this.#themeAdapter = themeAdapter; - } - - public ngOnInit(): void { - this.#themeAdapter.addTheme(); - } - - public ngOnDestroy(): void { - this.#themeAdapter.removeTheme(); - } -} diff --git a/libs/components/layout/src/lib/modules/page/page.module.ts b/libs/components/layout/src/lib/modules/page/page.module.ts deleted file mode 100644 index babce1eda2..0000000000 --- a/libs/components/layout/src/lib/modules/page/page.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; - -import { SkyPageComponent } from './page.component'; - -/** - * @deprecated Use the SkyPageModule in `@skyux/pages` instead. - */ -@NgModule({ - declarations: [SkyPageComponent], - imports: [CommonModule], - exports: [SkyPageComponent], -}) -export class SkyPageModule {}