diff --git a/packages/frosted-ui/.storybook/stories/components/popover.stories.tsx b/packages/frosted-ui/.storybook/stories/components/popover.stories.tsx index 6e15f5f6..3180e346 100644 --- a/packages/frosted-ui/.storybook/stories/components/popover.stories.tsx +++ b/packages/frosted-ui/.storybook/stories/components/popover.stories.tsx @@ -9,8 +9,12 @@ import { Flex, Grid, Heading, + IconButton, Inset, Popover, + SegmentedControl, + Separator, + Switch, Text, TextArea, popoverContentPropDefs, @@ -34,6 +38,7 @@ type Story = StoryObj; export const Default: Story = { args: { size: popoverContentPropDefs.size.default, + variant: popoverContentPropDefs.variant.default, }, render: ({ children, ...args }) => ( @@ -68,10 +73,108 @@ export const Default: Story = { ), }; +export const Variant: Story = { + args: { + size: popoverContentPropDefs.size.default, + }, + render: ({ children, ...args }) => { + type Appearance = 'light' | 'dark'; + const [appearance, setAppearance] = React.useState('light'); + + return ( + + + + + + + + + + Theme + + + setAppearance(appearance as Appearance) + } + > + + + + Light + + + + Dark + + + + + + + + Auto switching + + + + + + + + + + + + + Theme + + + setAppearance(appearance as Appearance) + } + > + + + + Light + + + + Dark + + + + + + + + Auto switching + + + + + + ); + }, +}; + export const InsetContent: Story = { name: 'With inset content', args: { size: popoverContentPropDefs.size.default, + variant: popoverContentPropDefs.variant.default, }, render: ({ children, ...args }) => ( @@ -108,3 +211,133 @@ export const InsetContent: Story = { ), }; + +const LightModeIcon = () => ( + + + + + + + + + + + + + +); + +const DarkModeIcon = () => ( + + + + + + + + + + + + + + + + + + +); + +const AppearanceIcon = () => ( + + + + + + + + + + + + + + +); diff --git a/packages/frosted-ui/src/components/popover.css b/packages/frosted-ui/src/components/popover.css index bd256585..57407961 100644 --- a/packages/frosted-ui/src/components/popover.css +++ b/packages/frosted-ui/src/components/popover.css @@ -1,5 +1,4 @@ .fui-PopoverContent { - background-color: var(--color-panel-solid); box-shadow: var(--shadow-5); min-width: var(--radix-popover-trigger-width); outline: 0; @@ -9,6 +8,24 @@ padding: var(--popover-content-padding); transform-origin: var(--radix-popover-content-transform-origin); + + &:where(.fui-variant-translucent) { + background-color: var(--color-panel-translucent); + -webkit-backdrop-filter: var(--backdrop-filter-panel); + backdrop-filter: var(--backdrop-filter-panel); + outline: 0.5px solid var(--color-popover-outline); + } + &:where(.fui-variant-solid) { + background-color: var(--color-panel-solid); + } +} +/* prettier-ignore */ +:where(.frosted-ui) { + --color-popover-outline: transparent; +} +:is(.dark, .dark-theme), +:is(.dark, .dark-theme) :where(.frosted-ui:not(.light, .light-theme)) { + --color-popover-outline: black; } /*************************************************************************************************** diff --git a/packages/frosted-ui/src/components/popover.props.ts b/packages/frosted-ui/src/components/popover.props.ts index 7058759a..bda1cd7f 100644 --- a/packages/frosted-ui/src/components/popover.props.ts +++ b/packages/frosted-ui/src/components/popover.props.ts @@ -2,10 +2,14 @@ import type { PropDef } from '../helpers'; const contentSizes = ['1', '2', '3', '4'] as const; +const variants = ['solid', 'translucent'] as const; + const popoverContentPropDefs = { size: { type: 'enum', values: contentSizes, default: '2', responsive: true }, + variant: { type: 'enum', values: variants, default: 'translucent' }, } satisfies { size: PropDef<(typeof contentSizes)[number]>; + variant: PropDef<(typeof variants)[number]>; }; export { popoverContentPropDefs }; diff --git a/packages/frosted-ui/src/components/popover.tsx b/packages/frosted-ui/src/components/popover.tsx index cf379e89..56f00c0a 100644 --- a/packages/frosted-ui/src/components/popover.tsx +++ b/packages/frosted-ui/src/components/popover.tsx @@ -49,6 +49,7 @@ const PopoverContent = React.forwardRef< forceMount, container, size = popoverContentPropDefs.size.default, + variant = popoverContentPropDefs.variant.default, ...contentProps } = props; return ( @@ -63,6 +64,7 @@ const PopoverContent = React.forwardRef< className={classNames( 'fui-PopperContent', 'fui-PopoverContent', + `fui-variant-${variant}`, className, withBreakpoints(size, 'fui-r-size'), )}