From e66e04dd8fbd160d6d124394e38c34a60de2b464 Mon Sep 17 00:00:00 2001 From: Mayank <9084735+mayank99@users.noreply.github.com> Date: Mon, 12 Feb 2024 19:09:59 -0500 Subject: [PATCH 01/14] expose `Skeleton` publicly --- .changeset/empty-laws-chew.md | 5 ++ .../src/core/Typography/Skeleton.test.tsx | 14 +++++ .../src/core/Typography/Skeleton.tsx | 62 +++++++++++++++++++ .../src/core/Typography/Text.tsx | 2 + packages/itwinui-react/src/index.ts | 2 + 5 files changed, 85 insertions(+) create mode 100644 .changeset/empty-laws-chew.md create mode 100644 packages/itwinui-react/src/core/Typography/Skeleton.test.tsx create mode 100644 packages/itwinui-react/src/core/Typography/Skeleton.tsx diff --git a/.changeset/empty-laws-chew.md b/.changeset/empty-laws-chew.md new file mode 100644 index 00000000000..b51c30b08ea --- /dev/null +++ b/.changeset/empty-laws-chew.md @@ -0,0 +1,5 @@ +--- +'@itwin/itwinui-react': minor +--- + +Added a new `Skeleton` component. diff --git a/packages/itwinui-react/src/core/Typography/Skeleton.test.tsx b/packages/itwinui-react/src/core/Typography/Skeleton.test.tsx new file mode 100644 index 00000000000..443a3be93e4 --- /dev/null +++ b/packages/itwinui-react/src/core/Typography/Skeleton.test.tsx @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ +import * as React from 'react'; +import { render } from '@testing-library/react'; + +import { Skeleton } from './Skeleton.js'; + +it('should work', () => { + const { container } = render(); + const skeleton = container.querySelector('div') as HTMLElement; + expect(skeleton).toHaveClass('iui-skeleton'); +}); diff --git a/packages/itwinui-react/src/core/Typography/Skeleton.tsx b/packages/itwinui-react/src/core/Typography/Skeleton.tsx new file mode 100644 index 00000000000..237d3a47b3f --- /dev/null +++ b/packages/itwinui-react/src/core/Typography/Skeleton.tsx @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ +import * as React from 'react'; +import cx from 'classnames'; +import { Box, ShadowRoot } from '../utils/index.js'; +import type { PolymorphicForwardRefComponent } from '../utils/index.js'; +import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden.js'; + +// ---------------------------------------------------------------------------- + +const SkeletonContext = React.createContext(undefined); + +// ---------------------------------------------------------------------------- + +const SkeletonComponent = React.forwardRef((props, forwardedRef) => { + const isGrouped = React.useContext(SkeletonContext); + + return ( + + +
+ +
+ +
+ + {props.children} + {!isGrouped && ( + Loading + )} +
+ ); +}) as PolymorphicForwardRefComponent<'div'>; + +// ---------------------------------------------------------------------------- + +const SkeletonGroup = ({ children }: { children: React.ReactNode }) => { + return ( + + {children} + Loading + + ); +}; +SkeletonGroup.displayName = 'Skeleton.Group'; + +// ---------------------------------------------------------------------------- + +/** + * A placeholder displayed while the content is loading. + */ +export const Skeleton = Object.assign(SkeletonComponent, { + Group: SkeletonGroup, +}); +Skeleton.displayName = 'Skeleton'; diff --git a/packages/itwinui-react/src/core/Typography/Text.tsx b/packages/itwinui-react/src/core/Typography/Text.tsx index b9afea697af..c6fa78d2f55 100644 --- a/packages/itwinui-react/src/core/Typography/Text.tsx +++ b/packages/itwinui-react/src/core/Typography/Text.tsx @@ -29,6 +29,8 @@ type TextProps = { /** * Use it if you are still loading the content. * @default false + * + * @deprecated Use the `Skeleton` component instead */ isSkeleton?: boolean; }; diff --git a/packages/itwinui-react/src/index.ts b/packages/itwinui-react/src/index.ts index c69cdc3bc16..33d7a862583 100644 --- a/packages/itwinui-react/src/index.ts +++ b/packages/itwinui-react/src/index.ts @@ -213,3 +213,5 @@ export { Flex } from './core/Flex/Flex.js'; export { Popover } from './core/Popover/Popover.js'; export { Divider } from './core/Divider/Divider.js'; + +export { Skeleton } from './core/Typography/Skeleton.js'; From 97ec76bea13ca1d8f0da3a44584bda0fa1d0627d Mon Sep 17 00:00:00 2001 From: Mayank <9084735+mayank99@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:50:26 -0500 Subject: [PATCH 02/14] remove SkeletonGroup --- .../src/core/Typography/Skeleton.tsx | 37 +++---------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/packages/itwinui-react/src/core/Typography/Skeleton.tsx b/packages/itwinui-react/src/core/Typography/Skeleton.tsx index 237d3a47b3f..82ae4dac518 100644 --- a/packages/itwinui-react/src/core/Typography/Skeleton.tsx +++ b/packages/itwinui-react/src/core/Typography/Skeleton.tsx @@ -10,13 +10,10 @@ import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden.js'; // ---------------------------------------------------------------------------- -const SkeletonContext = React.createContext(undefined); - -// ---------------------------------------------------------------------------- - -const SkeletonComponent = React.forwardRef((props, forwardedRef) => { - const isGrouped = React.useContext(SkeletonContext); - +/** + * A placeholder to be displayed while the content is loading. + */ +export const SkeletonComponent = React.forwardRef((props, forwardedRef) => { return ( { {props.children} - {!isGrouped && ( - Loading - )} + Loading ); }) as PolymorphicForwardRefComponent<'div'>; - -// ---------------------------------------------------------------------------- - -const SkeletonGroup = ({ children }: { children: React.ReactNode }) => { - return ( - - {children} - Loading - - ); -}; -SkeletonGroup.displayName = 'Skeleton.Group'; - -// ---------------------------------------------------------------------------- - -/** - * A placeholder displayed while the content is loading. - */ -export const Skeleton = Object.assign(SkeletonComponent, { - Group: SkeletonGroup, -}); -Skeleton.displayName = 'Skeleton'; From 655aaf38be0763b468ecc2a41308c184c60aa4eb Mon Sep 17 00:00:00 2001 From: Mayank <9084735+mayank99@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:34:55 -0500 Subject: [PATCH 03/14] add `css` prop to `ShadowRoot` --- .../src/core/utils/components/ShadowRoot.tsx | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/itwinui-react/src/core/utils/components/ShadowRoot.tsx b/packages/itwinui-react/src/core/utils/components/ShadowRoot.tsx index f4ac9e76e81..8d6e07ebb88 100644 --- a/packages/itwinui-react/src/core/utils/components/ShadowRoot.tsx +++ b/packages/itwinui-react/src/core/utils/components/ShadowRoot.tsx @@ -8,6 +8,8 @@ import * as ReactDOM from 'react-dom'; const isBrowser = typeof document !== 'undefined'; const supportsDSD = isBrowser && 'shadowRootMode' in HTMLTemplateElement.prototype; +const supportsAdoptedStylesheets = + isBrowser && 'adoptedStyleSheets' in Document.prototype; /** * Wrapper around `