diff --git a/src/app-layout/visual-refresh-toolbar/skeleton/__tests__/skeleton-parts.test.tsx b/src/app-layout/visual-refresh-toolbar/skeleton/__tests__/skeleton-parts.test.tsx new file mode 100644 index 0000000000..0a11742c74 --- /dev/null +++ b/src/app-layout/visual-refresh-toolbar/skeleton/__tests__/skeleton-parts.test.tsx @@ -0,0 +1,33 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import React from 'react'; +import { render } from '@testing-library/react'; + +import { + NotificationsSkeleton, + ToolbarSkeleton, +} from '../../../../../lib/components/app-layout/visual-refresh-toolbar/skeleton/skeleton-parts'; + +describe('ToolbarSkeleton', () => { + test('renders with discoveredBreadcrumbs', () => { + const { container } = render( + + ); + expect(container).toBeTruthy(); + }); +}); + +describe('NotificationsSkeleton', () => { + test('renders', () => { + const { container } = render({null}); + expect(container).toBeTruthy(); + }); +}); diff --git a/src/app-layout/visual-refresh-toolbar/skeleton/index.tsx b/src/app-layout/visual-refresh-toolbar/skeleton/index.tsx index 7df2e99b24..787d7a0138 100644 --- a/src/app-layout/visual-refresh-toolbar/skeleton/index.tsx +++ b/src/app-layout/visual-refresh-toolbar/skeleton/index.tsx @@ -58,12 +58,14 @@ export const SkeletonLayout = ({ contentElAttributes, } = skeletonSlotsAttributes; + const isWidgetLoaded = !!appLayoutState.widgetizedState; + return (
} - data-awsui-app-layout-widget-loaded={false} + data-awsui-app-layout-widget-loaded={isWidgetLoaded} {...wrapperElAttributes} className={wrapperElAttributes?.className ?? clsx(styles.root, testutilStyles.root)} style={ diff --git a/src/app-layout/visual-refresh-toolbar/skeleton/skeleton-parts.tsx b/src/app-layout/visual-refresh-toolbar/skeleton/skeleton-parts.tsx index 503bb16466..ba44180e09 100644 --- a/src/app-layout/visual-refresh-toolbar/skeleton/skeleton-parts.tsx +++ b/src/app-layout/visual-refresh-toolbar/skeleton/skeleton-parts.tsx @@ -5,7 +5,8 @@ import React from 'react'; import { AppLayoutNotificationsImplementationProps } from '../notifications'; import { AppLayoutToolbarImplementationProps } from '../toolbar'; import { SkeletonPartProps } from './interfaces'; -import { BreadcrumbsSlot, NotificationsSlot, ToolbarSlot } from './slots'; +import { NotificationsSlot } from './slots'; +import { ToolbarSkeletonStructure } from './toolbar-container'; import styles from './styles.css.js'; @@ -17,11 +18,7 @@ export const BeforeMainSlotSkeleton = React.forwardRef { return ( <> - {!!toolbarProps && ( - - - - )} + {!!toolbarProps && } {toolbarProps?.navigationOpen &&
} ); @@ -34,15 +31,14 @@ export const BeforeMainSlotSkeleton = React.forwardRef( ({ appLayoutInternals }: AppLayoutToolbarImplementationProps, ref) => ( - - - + ) ); export const NotificationsSkeleton = React.forwardRef( - (props: AppLayoutNotificationsImplementationProps, ref) => + (_props: AppLayoutNotificationsImplementationProps, ref) => ); diff --git a/src/app-layout/visual-refresh-toolbar/skeleton/slots.tsx b/src/app-layout/visual-refresh-toolbar/skeleton/slots.tsx index 6c77569b59..1e6e0960d0 100644 --- a/src/app-layout/visual-refresh-toolbar/skeleton/slots.tsx +++ b/src/app-layout/visual-refresh-toolbar/skeleton/slots.tsx @@ -16,7 +16,14 @@ interface ToolbarSlotProps { } export const ToolbarSlot = React.forwardRef(({ className, style, children }, ref) => ( -
} className={clsx(styles['toolbar-container'], className)} style={style}> +
} + className={clsx(styles['toolbar-container'], className)} + style={{ + insetBlockStart: style?.insetBlockStart ?? 0, + ...style, + }} + > {children}
)); @@ -41,10 +48,13 @@ interface BreadcrumbsSlotProps { } export function BreadcrumbsSlot({ ownBreadcrumbs, discoveredBreadcrumbs }: BreadcrumbsSlotProps) { + const isSSR = typeof window === 'undefined'; + const contextValue = React.useMemo(() => ({ isInToolbar: true }), []); + return ( - +
{ownBreadcrumbs}
- {discoveredBreadcrumbs && ( + {discoveredBreadcrumbs && !isSSR && (
+ {children} +
+ ); +} + +interface ToolbarBreadcrumbsWrapperProps { + children: React.ReactNode; + includeTestUtils?: boolean; +} + +export function ToolbarBreadcrumbsWrapper({ children, includeTestUtils = false }: ToolbarBreadcrumbsWrapperProps) { + return ( +
+ {children} +
+ ); +} + +export function ToolbarDrawersWrapper() { + return
; +} + +interface ToolbarBreadcrumbsSectionProps { + ownBreadcrumbs: React.ReactNode; + discoveredBreadcrumbs?: BreadcrumbGroupProps | null; + includeTestUtils?: boolean; +} + +export function ToolbarBreadcrumbsSection({ + ownBreadcrumbs, + discoveredBreadcrumbs, + includeTestUtils = false, +}: ToolbarBreadcrumbsSectionProps) { + return ( + + + + ); +} + +interface ToolbarSkeletonStructureProps { + ownBreadcrumbs: React.ReactNode; + discoveredBreadcrumbs?: BreadcrumbGroupProps | null; +} + +export const ToolbarSkeletonStructure = React.forwardRef( + ({ ownBreadcrumbs, discoveredBreadcrumbs }, ref) => ( + + + + + + + ) +); diff --git a/src/app-layout/visual-refresh-toolbar/state/use-skeleton-slots-attributes.ts b/src/app-layout/visual-refresh-toolbar/state/use-skeleton-slots-attributes.ts index 4268a9ffab..72f4304017 100644 --- a/src/app-layout/visual-refresh-toolbar/state/use-skeleton-slots-attributes.ts +++ b/src/app-layout/visual-refresh-toolbar/state/use-skeleton-slots-attributes.ts @@ -50,7 +50,6 @@ export const useSkeletonSlotsAttributes = ( [customCssProps.navigationWidth]: `${navigationWidth}px`, [customCssProps.toolsWidth]: `${activeDrawerSize}px`, }, - 'data-awsui-app-layout-widget-loaded': true, }; const mainElAttributes = { diff --git a/src/app-layout/visual-refresh-toolbar/toolbar/index.tsx b/src/app-layout/visual-refresh-toolbar/toolbar/index.tsx index d90c9d5f39..ba2b669911 100644 --- a/src/app-layout/visual-refresh-toolbar/toolbar/index.tsx +++ b/src/app-layout/visual-refresh-toolbar/toolbar/index.tsx @@ -6,11 +6,14 @@ import clsx from 'clsx'; import { useResizeObserver } from '@cloudscape-design/component-toolkit/internal'; +import { createWidgetizedComponent } from '../../../internal/widgets'; import { AppLayoutProps } from '../../interfaces'; import { OnChangeParams } from '../../utils/use-drawers'; import { Focusable, FocusControlMultipleStates } from '../../utils/use-focus-control'; import { AppLayoutInternals } from '../interfaces'; -import { BreadcrumbsSlot, ToolbarSlot } from '../skeleton/slots'; +import { ToolbarSkeleton } from '../skeleton/skeleton-parts'; +import { ToolbarSlot } from '../skeleton/slots'; +import { ToolbarBreadcrumbsSection, ToolbarContainer } from '../skeleton/toolbar-container'; import { DrawerTriggers, SplitPanelToggleProps } from './drawer-triggers'; import TriggerButton from './trigger-button'; @@ -188,7 +191,7 @@ export function AppLayoutToolbarImplementation({
)} -
+ {hasNavigation && (
+ ); } + +export const AppLayoutToolbar = createWidgetizedComponent(AppLayoutToolbarImplementation, ToolbarSkeleton);