diff --git a/docs/scripts/generateLlmTxt/__snapshots__/mdxToMarkdown.test.mjs.snap b/docs/scripts/generateLlmTxt/__snapshots__/mdxToMarkdown.test.mjs.snap index 8d05018b69b..32941ef06fc 100644 --- a/docs/scripts/generateLlmTxt/__snapshots__/mdxToMarkdown.test.mjs.snap +++ b/docs/scripts/generateLlmTxt/__snapshots__/mdxToMarkdown.test.mjs.snap @@ -20,46 +20,46 @@ import { Accordion } from '@base-ui/react/accordion'; export default function ExampleAccordion() { return ( - - + + - + What is Base UI? - + - -
+ +
Base UI is a library of high-quality unstyled React components for design systems and web apps.
- + - + How do I get started? - + - -
+ +
Head to the “Quick start” guide in the docs. If you’ve used unstyled libraries before, you’ll feel at home.
- + - + Can I use it for my project? - + - -
Of course! Base UI is free and open source.
+ +
Of course! Base UI is free and open source.
@@ -68,8 +68,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } @@ -85,15 +95,26 @@ This example shows how to implement the component using CSS Modules. .Accordion { box-sizing: border-box; display: flex; - width: 24rem; - max-width: calc(100vw - 8rem); + width: 20rem; + max-width: 100%; flex-direction: column; - justify-content: center; - color: var(--color-gray-900); + border: 1px solid oklch(14.5% 0 0deg); + color: oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border: 1px solid white; + color: white; + } } .Item { - border-bottom: 1px solid var(--color-gray-200); + & + & { + border-top: 1px solid oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border-top: 1px solid white; + } + } } .Header { @@ -102,46 +123,54 @@ This example shows how to implement the component using CSS Modules. .Trigger { box-sizing: border-box; - position: relative; display: flex; width: 100%; - gap: 1rem; - align-items: baseline; + align-items: center; justify-content: space-between; - padding-block: 0.5rem; - padding-inline: 0.75rem 0.25rem; - color: var(--color-gray-900); + gap: 1rem; + padding: 0.5rem 0.75rem; + margin: 0; + border: none; + border-radius: 0; + background-color: transparent; + color: oklch(14.5% 0 0deg); font-family: inherit; + font-size: 0.875rem; font-weight: 400; - font-size: 1rem; - line-height: 1.5rem; - background: var(--color-gray-50); - border: none; - outline: none; + line-height: 1.25rem; text-align: left; + user-select: none; + + @media (prefers-color-scheme: dark) { + color: white; + } @media (hover: hover) { - &:hover { - background-color: var(--color-gray-100); + &:hover:not([data-disabled]) { + background-color: oklch(97% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } } &:focus-visible { - outline: 2px solid var(--color-blue); + position: relative; + outline: 2px solid oklch(14.5% 0 0deg); z-index: 1; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } } } -.TriggerIcon { - box-sizing: border-box; - flex-shrink: 0; - width: 0.75rem; - height: 0.75rem; - margin-right: 0.5rem; - transition: transform 150ms ease-out; +.Icon { + transition: transform 100ms ease-out; [data-panel-open] > & { - transform: rotate(45deg) scale(1.1); + transform: rotate(45deg); } } @@ -149,9 +178,8 @@ This example shows how to implement the component using CSS Modules. box-sizing: border-box; height: var(--accordion-panel-height); overflow: hidden; - color: var(--color-gray-600); - font-size: 1rem; - line-height: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; transition: height 150ms ease-out; &[data-starting-style], @@ -161,7 +189,7 @@ This example shows how to implement the component using CSS Modules. } .Content { - padding: 0.75rem; + padding: 0.5rem 0.75rem; } \`\`\` @@ -179,7 +207,7 @@ export default function ExampleAccordion() { What is Base UI? - + @@ -194,7 +222,7 @@ export default function ExampleAccordion() { How do I get started? - + @@ -209,7 +237,7 @@ export default function ExampleAccordion() { Can I use it for my project? - + @@ -222,8 +250,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } @@ -268,47 +306,47 @@ export default function ExampleAccordion() { return ( - + - + What is Base UI? - + - -
+ +
Base UI is a library of high-quality unstyled React components for design systems and web apps.
- + - + How do I get started? - + - -
+ +
Head to the “Quick start” guide in the docs. If you’ve used unstyled libraries before, you’ll feel at home.
- + - + Can I use it for my project? - + - -
Of course! Base UI is free and open source.
+ +
Of course! Base UI is free and open source.
@@ -317,8 +355,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } @@ -334,15 +382,26 @@ This example shows how to implement the component using CSS Modules. .Accordion { box-sizing: border-box; display: flex; - width: 24rem; - max-width: calc(100vw - 8rem); + width: 20rem; + max-width: 100%; flex-direction: column; - justify-content: center; - color: var(--color-gray-900); + border: 1px solid oklch(14.5% 0 0deg); + color: oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border: 1px solid white; + color: white; + } } .Item { - border-bottom: 1px solid var(--color-gray-200); + & + & { + border-top: 1px solid oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border-top: 1px solid white; + } + } } .Header { @@ -351,46 +410,54 @@ This example shows how to implement the component using CSS Modules. .Trigger { box-sizing: border-box; - position: relative; display: flex; width: 100%; - gap: 1rem; - align-items: baseline; + align-items: center; justify-content: space-between; - padding-block: 0.5rem; - padding-inline: 0.75rem 0.25rem; - color: var(--color-gray-900); + gap: 1rem; + padding: 0.5rem 0.75rem; + margin: 0; + border: none; + border-radius: 0; + background-color: transparent; + color: oklch(14.5% 0 0deg); font-family: inherit; + font-size: 0.875rem; font-weight: 400; - font-size: 1rem; - line-height: 1.5rem; - background: var(--color-gray-50); - border: none; - outline: none; + line-height: 1.25rem; text-align: left; + user-select: none; + + @media (prefers-color-scheme: dark) { + color: white; + } @media (hover: hover) { - &:hover { - background-color: var(--color-gray-100); + &:hover:not([data-disabled]) { + background-color: oklch(97% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } } &:focus-visible { - outline: 2px solid var(--color-blue); + position: relative; + outline: 2px solid oklch(14.5% 0 0deg); z-index: 1; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } } } -.TriggerIcon { - box-sizing: border-box; - flex-shrink: 0; - width: 0.75rem; - height: 0.75rem; - margin-right: 0.5rem; - transition: transform 150ms ease-out; +.Icon { + transition: transform 100ms ease-out; [data-panel-open] > & { - transform: rotate(45deg) scale(1.1); + transform: rotate(45deg); } } @@ -398,9 +465,8 @@ This example shows how to implement the component using CSS Modules. box-sizing: border-box; height: var(--accordion-panel-height); overflow: hidden; - color: var(--color-gray-600); - font-size: 1rem; - line-height: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; transition: height 150ms ease-out; &[data-starting-style], @@ -410,7 +476,7 @@ This example shows how to implement the component using CSS Modules. } .Content { - padding: 0.75rem; + padding: 0.5rem 0.75rem; } \`\`\` @@ -428,7 +494,7 @@ export default function ExampleAccordion() { What is Base UI? - + @@ -443,7 +509,7 @@ export default function ExampleAccordion() { How do I get started? - + @@ -458,7 +524,7 @@ export default function ExampleAccordion() { Can I use it for my project? - + @@ -471,8 +537,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } @@ -856,10 +932,10 @@ export default function ExampleDirectionProvider() {
- - - - + + + + @@ -882,31 +958,50 @@ This example shows how to implement the component using CSS Modules. align-items: center; width: 14rem; padding-block: 0.75rem; + touch-action: none; + user-select: none; } .Track { width: 100%; - background-color: var(--color-gray-200); - box-shadow: inset 0 0 0 1px var(--color-gray-200); height: 0.25rem; - border-radius: 0.25rem; - position: relative; + background-color: oklch(92.2% 0 0deg); + user-select: none; + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } .Indicator { - border-radius: 0.25rem; - background-color: var(--color-gray-700); + background-color: oklch(14.5% 0 0deg); + user-select: none; + + @media (prefers-color-scheme: dark) { + background-color: white; + } } .Thumb { + box-sizing: border-box; width: 1rem; height: 1rem; - border-radius: 100%; + border: 1px solid oklch(14.5% 0 0deg); background-color: white; - outline: 1px solid var(--color-gray-300); + user-select: none; + + @media (prefers-color-scheme: dark) { + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + } &:has(:focus-visible) { - outline: 2px solid var(--color-blue); + outline: 2px solid oklch(14.5% 0 0deg); + outline-offset: 2px; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } } } diff --git a/docs/src/app/(docs)/react/components/accordion/demos/_index.module.css b/docs/src/app/(docs)/react/components/accordion/demos/_index.module.css index 002f68bc865..67b041c2e8b 100644 --- a/docs/src/app/(docs)/react/components/accordion/demos/_index.module.css +++ b/docs/src/app/(docs)/react/components/accordion/demos/_index.module.css @@ -1,15 +1,26 @@ .Accordion { box-sizing: border-box; display: flex; - width: 24rem; - max-width: calc(100vw - 8rem); + width: 20rem; + max-width: 100%; flex-direction: column; - justify-content: center; - color: var(--color-gray-900); + border: 1px solid oklch(14.5% 0 0deg); + color: oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border: 1px solid white; + color: white; + } } .Item { - border-bottom: 1px solid var(--color-gray-200); + & + & { + border-top: 1px solid oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + border-top: 1px solid white; + } + } } .Header { @@ -18,46 +29,54 @@ .Trigger { box-sizing: border-box; - position: relative; display: flex; width: 100%; - gap: 1rem; - align-items: baseline; + align-items: center; justify-content: space-between; - padding-block: 0.5rem; - padding-inline: 0.75rem 0.25rem; - color: var(--color-gray-900); + gap: 1rem; + padding: 0.5rem 0.75rem; + margin: 0; + border: none; + border-radius: 0; + background-color: transparent; + color: oklch(14.5% 0 0deg); font-family: inherit; + font-size: 0.875rem; font-weight: 400; - font-size: 1rem; - line-height: 1.5rem; - background: var(--color-gray-50); - border: none; - outline: none; + line-height: 1.25rem; text-align: left; + user-select: none; + + @media (prefers-color-scheme: dark) { + color: white; + } @media (hover: hover) { - &:hover { - background-color: var(--color-gray-100); + &:hover:not([data-disabled]) { + background-color: oklch(97% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } } &:focus-visible { - outline: 2px solid var(--color-blue); + position: relative; + outline: 2px solid oklch(14.5% 0 0deg); z-index: 1; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } } } -.TriggerIcon { - box-sizing: border-box; - flex-shrink: 0; - width: 0.75rem; - height: 0.75rem; - margin-right: 0.5rem; - transition: transform 150ms ease-out; +.Icon { + transition: transform 100ms ease-out; [data-panel-open] > & { - transform: rotate(45deg) scale(1.1); + transform: rotate(45deg); } } @@ -65,9 +84,8 @@ box-sizing: border-box; height: var(--accordion-panel-height); overflow: hidden; - color: var(--color-gray-600); - font-size: 1rem; - line-height: 1.5rem; + font-size: 0.875rem; + line-height: 1.25rem; transition: height 150ms ease-out; &[data-starting-style], @@ -77,5 +95,5 @@ } .Content { - padding: 0.75rem; + padding: 0.5rem 0.75rem; } diff --git a/docs/src/app/(docs)/react/components/accordion/demos/hero/css-modules/index.tsx b/docs/src/app/(docs)/react/components/accordion/demos/hero/css-modules/index.tsx index d60c7c3e6c2..0e395d9e9fd 100644 --- a/docs/src/app/(docs)/react/components/accordion/demos/hero/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/accordion/demos/hero/css-modules/index.tsx @@ -9,7 +9,7 @@ export default function ExampleAccordion() { What is Base UI? - + @@ -24,7 +24,7 @@ export default function ExampleAccordion() { How do I get started? - + @@ -39,7 +39,7 @@ export default function ExampleAccordion() { Can I use it for my project? - + @@ -52,8 +52,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } diff --git a/docs/src/app/(docs)/react/components/accordion/demos/hero/tailwind/index.tsx b/docs/src/app/(docs)/react/components/accordion/demos/hero/tailwind/index.tsx index df4ac5bf32e..88c590f5cce 100644 --- a/docs/src/app/(docs)/react/components/accordion/demos/hero/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/accordion/demos/hero/tailwind/index.tsx @@ -3,46 +3,46 @@ import { Accordion } from '@base-ui/react/accordion'; export default function ExampleAccordion() { return ( - - + + - + What is Base UI? - + - -
+ +
Base UI is a library of high-quality unstyled React components for design systems and web apps.
- + - + How do I get started? - + - -
+ +
Head to the “Quick start” guide in the docs. If you’ve used unstyled libraries before, you’ll feel at home.
- + - + Can I use it for my project? - + - -
Of course! Base UI is free and open source.
+ +
Of course! Base UI is free and open source.
@@ -51,8 +51,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } diff --git a/docs/src/app/(docs)/react/components/accordion/demos/multiple/css-modules/index.tsx b/docs/src/app/(docs)/react/components/accordion/demos/multiple/css-modules/index.tsx index 0ab74c0a935..e279fd7f9bb 100644 --- a/docs/src/app/(docs)/react/components/accordion/demos/multiple/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/accordion/demos/multiple/css-modules/index.tsx @@ -9,7 +9,7 @@ export default function ExampleAccordion() { What is Base UI? - + @@ -24,7 +24,7 @@ export default function ExampleAccordion() { How do I get started? - + @@ -39,7 +39,7 @@ export default function ExampleAccordion() { Can I use it for my project? - + @@ -52,8 +52,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } diff --git a/docs/src/app/(docs)/react/components/accordion/demos/multiple/tailwind/index.tsx b/docs/src/app/(docs)/react/components/accordion/demos/multiple/tailwind/index.tsx index 922d0761478..0c2dc4752dc 100644 --- a/docs/src/app/(docs)/react/components/accordion/demos/multiple/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/accordion/demos/multiple/tailwind/index.tsx @@ -5,47 +5,47 @@ export default function ExampleAccordion() { return ( - + - + What is Base UI? - + - -
+ +
Base UI is a library of high-quality unstyled React components for design systems and web apps.
- + - + How do I get started? - + - -
+ +
Head to the “Quick start” guide in the docs. If you’ve used unstyled libraries before, you’ll feel at home.
- + - + Can I use it for my project? - + - -
Of course! Base UI is free and open source.
+ +
Of course! Base UI is free and open source.
@@ -54,8 +54,18 @@ export default function ExampleAccordion() { function PlusIcon(props: React.ComponentProps<'svg'>) { return ( - - + + ); } diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/_index.module.css b/docs/src/app/(docs)/react/components/alert-dialog/demos/_index.module.css index 5a951b645d6..aba3d3fe19d 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/_index.module.css +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/_index.module.css @@ -3,38 +3,70 @@ display: flex; align-items: center; justify-content: center; - height: 2.5rem; - padding: 0 0.875rem; + gap: 0.5rem; + height: 2rem; + padding: 0 0.75rem; margin: 0; - outline: 0; - border: 1px solid var(--color-gray-200); - border-radius: 0.375rem; - background-color: var(--color-gray-50); + border: 1px solid oklch(14.5% 0 0deg); + background-color: white; font-family: inherit; - font-size: 1rem; + font-size: 0.875rem; font-weight: 400; - line-height: 1.5rem; - color: var(--color-gray-900); + line-height: 1; + white-space: nowrap; + color: oklch(14.5% 0 0deg); user-select: none; + @media (prefers-color-scheme: dark) { + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + color: white; + } + @media (hover: hover) { - &:hover { - background-color: var(--color-gray-100); + &:hover:not([data-disabled]) { + background-color: oklch(97% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } } - &:active { - background-color: var(--color-gray-100); + &:active:not([data-disabled]) { + background-color: oklch(92.2% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(37.1% 0 0deg); + } } &:focus-visible { - outline: 2px solid var(--color-blue); + outline: 2px solid oklch(14.5% 0 0deg); outline-offset: -1px; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } + } + + &[data-disabled] { + color: oklch(55.6% 0 0deg); + border-color: oklch(55.6% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + border-color: oklch(70.8% 0 0deg); + } } } .DangerButton { - color: var(--color-red); + color: oklch(50.5% 0.213 27.518deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.4% 0.191 22.216deg); + } } .Backdrop { @@ -43,7 +75,7 @@ inset: 0; background-color: black; opacity: 0.2; - transition: opacity 150ms cubic-bezier(0.45, 1.005, 0, 1.005); + transition: opacity 150ms; /* iOS 26+: Ensure the backdrop covers the entire visible viewport. */ @supports (-webkit-touch-callout: none) { @@ -51,7 +83,7 @@ } @media (prefers-color-scheme: dark) { - opacity: 0.7; + opacity: 0.5; } &[data-starting-style], @@ -62,6 +94,9 @@ .Popup { box-sizing: border-box; + display: flex; + flex-direction: column; + gap: 1rem; position: fixed; top: 50%; left: 50%; @@ -69,44 +104,57 @@ width: 24rem; max-width: calc(100vw - 3rem); margin-top: -2rem; - padding: 1.5rem; - border-radius: 0.5rem; - outline: 1px solid var(--color-gray-200); - background-color: var(--color-gray-50); - color: var(--color-gray-900); - transition: all 150ms; + padding: 1rem; + border: 1px solid oklch(14.5% 0 0deg); + background-color: white; + color: oklch(14.5% 0 0deg); + box-shadow: 0.25rem 0.25rem 0 rgb(0 0 0 / 12%); + transition: + transform 100ms ease-out, + opacity 100ms ease-out; @media (prefers-color-scheme: dark) { - outline: 1px solid var(--color-gray-300); + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + color: white; + box-shadow: none; } &[data-starting-style], &[data-ending-style] { opacity: 0; - transform: translate(-50%, -50%) scale(0.9); + transform: translate(-50%, -50%) scale(0.98); } } +.Intro { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + .Title { - margin-top: -0.375rem; - margin-bottom: 0.25rem; - font-size: 1.125rem; - line-height: 1.75rem; - letter-spacing: -0.0025em; + margin: 0; + font-size: 1rem; + line-height: 1.5rem; font-weight: 700; } .Description { - margin: 0 0 1.5rem; - font-size: 1rem; - line-height: 1.5rem; - color: var(--color-gray-600); + margin: 0; + font-size: 0.875rem; + line-height: 1.25rem; + color: oklch(43.9% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + } } .Actions { display: flex; justify-content: end; - gap: 1rem; + gap: 0.75rem; } .Container { diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/css-modules/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/css-modules/index.tsx index ceac1654348..c2bfde509a3 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/css-modules/index.tsx @@ -68,12 +68,14 @@ export default function AlertDialogDetachedTriggersControlledDemo() { - - {payload?.message ?? 'Are you sure?'} - - - This action cannot be undone. - +
+ + {payload?.message ?? 'Are you sure?'} + + + This action cannot be undone. + +
Cancel diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/tailwind/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/tailwind/index.tsx index 7cfd9aa66d7..fa0210be608 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-controlled/tailwind/index.tsx @@ -6,6 +6,11 @@ type AlertPayload = { message: string }; const demoAlertDialog = AlertDialog.createHandle(); +const buttonClasses = + 'flex h-8 items-center justify-center gap-2 border border-neutral-950 dark:border-white bg-white dark:bg-neutral-950 px-3 text-sm leading-none whitespace-nowrap font-normal text-neutral-950 dark:text-white select-none hover:not-data-disabled:bg-neutral-100 dark:hover:not-data-disabled:bg-neutral-800 active:not-data-disabled:bg-neutral-200 dark:active:not-data-disabled:bg-neutral-700 focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-neutral-950 dark:focus-visible:outline-white data-disabled:border-neutral-500 data-disabled:text-neutral-500 disabled:border-neutral-500 disabled:text-neutral-500 dark:data-disabled:border-neutral-400 dark:data-disabled:text-neutral-400'; + +const dangerButtonClasses = `${buttonClasses} text-red-700 dark:text-red-400`; + export default function AlertDialogDetachedTriggersControlledDemo() { const [open, setOpen] = React.useState(false); const [triggerId, setTriggerId] = React.useState(null); @@ -19,7 +24,7 @@ export default function AlertDialogDetachedTriggersControlledDemo() {
{ setTriggerId('alert-trigger-2'); setOpen(true); @@ -65,21 +70,19 @@ export default function AlertDialogDetachedTriggersControlledDemo() { > {({ payload }) => ( - - - - {payload?.message ?? 'Are you sure?'} - - - This action cannot be undone. - -
- - Cancel - - - Confirm - + + +
+ + {payload?.message ?? 'Are you sure?'} + + + This action cannot be undone. + +
+
+ Cancel + Confirm
diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/css-modules/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/css-modules/index.tsx index e837da6ccc6..6ef4bc0c13d 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/css-modules/index.tsx @@ -19,10 +19,12 @@ export default function AlertDialogDetachedTriggersSimpleDemo() { - Discard draft? - - This action cannot be undone. - +
+ Discard draft? + + This action cannot be undone. + +
Cancel diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/tailwind/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/tailwind/index.tsx index 896f6e464de..b863dcec53b 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/detached-triggers-simple/tailwind/index.tsx @@ -4,33 +4,31 @@ import { AlertDialog } from '@base-ui/react/alert-dialog'; const demoAlertDialog = AlertDialog.createHandle(); +const buttonClasses = + 'flex h-8 items-center justify-center gap-2 border border-neutral-950 dark:border-white bg-white dark:bg-neutral-950 px-3 text-sm leading-none whitespace-nowrap font-normal text-neutral-950 dark:text-white select-none hover:not-data-disabled:bg-neutral-100 dark:hover:not-data-disabled:bg-neutral-800 active:not-data-disabled:bg-neutral-200 dark:active:not-data-disabled:bg-neutral-700 focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-neutral-950 dark:focus-visible:outline-white data-disabled:border-neutral-500 data-disabled:text-neutral-500 disabled:border-neutral-500 disabled:text-neutral-500 dark:data-disabled:border-neutral-400 dark:data-disabled:text-neutral-400'; + +const dangerButtonClasses = `${buttonClasses} text-red-700 dark:text-red-400`; + export default function AlertDialogDetachedTriggersSimpleDemo() { return ( - + Discard draft - - - - Discard draft? - - - This action cannot be undone. - -
- - Cancel - - - Discard - + + +
+ Discard draft? + + This action cannot be undone. + +
+
+ Cancel + Discard
diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.module.css b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.module.css index 0ced260ed99..de23a0e4799 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.module.css +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.module.css @@ -3,37 +3,69 @@ display: flex; align-items: center; justify-content: center; - height: 2.5rem; - padding: 0 0.875rem; + gap: 0.5rem; + height: 2rem; + padding: 0 0.75rem; margin: 0; - outline: 0; - border: 1px solid var(--color-gray-200); - border-radius: 0.375rem; - background-color: var(--color-gray-50); + border: 1px solid oklch(14.5% 0 0deg); + background-color: white; font-family: inherit; - font-size: 1rem; + font-size: 0.875rem; font-weight: 400; - line-height: 1.5rem; - color: var(--color-gray-900); + line-height: 1; + white-space: nowrap; + color: oklch(14.5% 0 0deg); user-select: none; + @media (prefers-color-scheme: dark) { + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + color: white; + } + &[data-color='red'] { - color: var(--color-red); + color: oklch(50.5% 0.213 27.518deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.4% 0.191 22.216deg); + } } @media (hover: hover) { - &:hover { - background-color: var(--color-gray-100); + &:hover:not([data-disabled]) { + background-color: oklch(97% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(26.9% 0 0deg); + } } } - &:active { - background-color: var(--color-gray-100); + &:active:not([data-disabled]) { + background-color: oklch(92.2% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: oklch(37.1% 0 0deg); + } } &:focus-visible { - outline: 2px solid var(--color-blue); + outline: 2px solid oklch(14.5% 0 0deg); outline-offset: -1px; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } + } + + &[data-disabled] { + color: oklch(55.6% 0 0deg); + border-color: oklch(55.6% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + border-color: oklch(70.8% 0 0deg); + } } } @@ -51,7 +83,7 @@ } @media (prefers-color-scheme: dark) { - opacity: 0.7; + opacity: 0.5; } &[data-starting-style], @@ -62,6 +94,9 @@ .Popup { box-sizing: border-box; + display: flex; + flex-direction: column; + gap: 1rem; position: fixed; top: 50%; left: 50%; @@ -69,42 +104,55 @@ width: 24rem; max-width: calc(100vw - 3rem); margin-top: -2rem; - padding: 1.5rem; - border-radius: 0.5rem; - outline: 1px solid var(--color-gray-300); - background-color: var(--color-gray-50); - color: var(--color-gray-900); - transition: all 150ms; + padding: 1rem; + border: 1px solid oklch(14.5% 0 0deg); + background-color: white; + color: oklch(14.5% 0 0deg); + box-shadow: 0.25rem 0.25rem 0 rgb(0 0 0 / 12%); + transition: + transform 100ms ease-out, + opacity 100ms ease-out; @media (prefers-color-scheme: dark) { - outline: 1px solid var(--color-gray-300); + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + color: white; + box-shadow: none; } &[data-starting-style], &[data-ending-style] { opacity: 0; - transform: translate(-50%, -50%) scale(0.9); + transform: translate(-50%, -50%) scale(0.98); } } +.Intro { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + .Title { - margin-top: -0.375rem; - margin-bottom: 0.25rem; - font-size: 1.125rem; - line-height: 1.75rem; - letter-spacing: -0.0025em; + margin: 0; + font-size: 1rem; + line-height: 1.5rem; font-weight: 700; } .Description { - margin: 0 0 1.5rem; - font-size: 1rem; - line-height: 1.5rem; - color: var(--color-gray-600); + margin: 0; + font-size: 0.875rem; + line-height: 1.25rem; + color: oklch(43.9% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + } } .Actions { display: flex; justify-content: end; - gap: 1rem; + gap: 0.75rem; } diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.tsx index b592b68271b..676e8bed888 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/css-modules/index.tsx @@ -10,10 +10,12 @@ export default function ExampleAlertDialog() { - Discard draft? - - You can't undo this action. - +
+ Discard draft? + + You can't undo this action. + +
Cancel diff --git a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/tailwind/index.tsx b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/tailwind/index.tsx index ef4b2c7e53f..cbb9dc6808d 100644 --- a/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/alert-dialog/demos/hero/tailwind/index.tsx @@ -1,27 +1,26 @@ import { AlertDialog } from '@base-ui/react/alert-dialog'; +const buttonClasses = + 'flex h-8 items-center justify-center gap-2 border border-neutral-950 dark:border-white bg-white dark:bg-neutral-950 px-3 text-sm leading-none whitespace-nowrap font-normal text-neutral-950 dark:text-white select-none hover:not-data-disabled:bg-neutral-100 dark:hover:not-data-disabled:bg-neutral-800 active:not-data-disabled:bg-neutral-200 dark:active:not-data-disabled:bg-neutral-700 focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-neutral-950 dark:focus-visible:outline-white data-disabled:border-neutral-500 data-disabled:text-neutral-500 disabled:border-neutral-500 disabled:text-neutral-500 dark:data-disabled:border-neutral-400 dark:data-disabled:text-neutral-400'; + +const dangerButtonClasses = `${buttonClasses} text-red-700 dark:text-red-400`; + export default function ExampleAlertDialog() { return ( - - Discard draft - + Discard draft - - - - Discard draft? - - - You can’t undo this action. - -
- - Cancel - - - Discard - + + +
+ Discard draft? + + You can’t undo this action. + +
+
+ Cancel + Discard
diff --git a/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.module.css b/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.module.css index ae8d7f09077..7d375c44f8a 100644 --- a/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.module.css +++ b/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.module.css @@ -1,25 +1,45 @@ .Input { box-sizing: border-box; - padding-left: 0.875rem; + padding: 0 0.5rem; margin: 0; - border: 1px solid var(--color-gray-200); + border-radius: 0; + border: 1px solid oklch(14.5% 0 0deg); width: 16rem; - height: 2.5rem; - border-radius: 0.375rem; + height: 2rem; font-family: inherit; - font-size: 1rem; + font-size: 0.875rem; + line-height: 1.25rem; font-weight: 400; - background-color: canvas; - color: var(--color-gray-900); + background-color: white; + color: oklch(14.5% 0 0deg); outline: none; - &:focus { - border-color: var(--color-blue); - outline: 1px solid var(--color-blue); + @media (any-pointer: coarse) { + font-size: 1rem; + line-height: 1.5rem; } - @media (min-width: 500px) { - width: 20rem; + @media (prefers-color-scheme: dark) { + border: 1px solid white; + background-color: oklch(14.5% 0 0deg); + color: white; + } + + &::placeholder { + color: oklch(55.6% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + } + } + + &:focus { + outline: 2px solid oklch(14.5% 0 0deg); + outline-offset: -1px; + + @media (prefers-color-scheme: dark) { + outline-color: white; + } } } @@ -30,7 +50,11 @@ font-size: 0.875rem; line-height: 1.25rem; font-weight: 700; - color: var(--color-gray-900); + color: oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: white; + } } .Positioner { @@ -39,46 +63,50 @@ .Popup { box-sizing: border-box; - padding-block: 0.5rem; - border-radius: 0.375rem; - background-color: canvas; - color: var(--color-gray-900); + background-color: white; + color: oklch(14.5% 0 0deg); width: var(--anchor-width); - max-height: min(var(--available-height), 23rem); max-width: var(--available-width); - overflow-y: auto; - scroll-padding-block: 0.5rem; - overscroll-behavior: contain; - - @media (prefers-color-scheme: light) { - outline: 1px solid var(--color-gray-200); - box-shadow: - 0 10px 15px -3px var(--color-gray-200), - 0 4px 6px -4px var(--color-gray-200); - } + border: 1px solid oklch(14.5% 0 0deg); + box-shadow: 0.25rem 0.25rem 0 rgb(0 0 0 / 12%); @media (prefers-color-scheme: dark) { - outline: 1px solid var(--color-gray-300); - outline-offset: -1px; + background-color: oklch(14.5% 0 0deg); + color: white; + border: 1px solid white; + box-shadow: none; } } +.Viewport { + box-sizing: border-box; + max-height: min(var(--available-height), 22.5rem); + padding-block: 0.25rem; + overflow-y: auto; + overscroll-behavior: contain; + scroll-padding-block: 0.25rem; +} + .Item { box-sizing: border-box; outline: 0; cursor: default; user-select: none; padding-block: 0.5rem; - padding-left: 1rem; - padding-right: 2rem; + padding-left: 0.5rem; + padding-right: 0.5rem; display: flex; - font-size: 1rem; + font-size: 0.875rem; line-height: 1rem; &[data-highlighted] { z-index: 0; position: relative; - color: var(--color-gray-50); + color: white; + + @media (prefers-color-scheme: dark) { + color: oklch(14.5% 0 0deg); + } } &[data-highlighted]::before { @@ -86,9 +114,12 @@ z-index: -1; position: absolute; inset-block: 0; - inset-inline: 0.5rem; - border-radius: 0.25rem; - background-color: var(--color-gray-900); + inset-inline: 0; + background-color: oklch(14.5% 0 0deg); + + @media (prefers-color-scheme: dark) { + background-color: white; + } } } @@ -107,7 +138,19 @@ .MovieYear { font-size: 0.875rem; line-height: 1rem; - opacity: 0.8; + color: oklch(55.6% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + } + + .Item[data-highlighted] & { + color: oklch(87% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(55.6% 0 0deg); + } + } } .Status { @@ -115,27 +158,27 @@ align-items: center; gap: 0.5rem; padding-block: 0.25rem; - padding-left: 1rem; + padding-left: 0.5rem; padding-right: 2rem; font-size: 0.875rem; - text-align: center; - color: var(--color-gray-600); + color: oklch(55.6% 0 0deg); + + @media (prefers-color-scheme: dark) { + color: oklch(70.8% 0 0deg); + } } .Spinner { box-sizing: border-box; - width: 1rem; - height: 1rem; - border: 2px solid var(--color-gray-200); - border-top: 2px solid var(--color-gray-600); + width: 0.75rem; + height: 0.75rem; border-radius: 50%; - animation: spin 1s linear infinite; + border: 1px solid currentColor; + border-right-color: transparent; + animation: autocompleteSpinner 0.75s linear infinite; } -@keyframes spin { - 0% { - transform: rotate(0deg); - } +@keyframes autocompleteSpinner { 100% { transform: rotate(360deg); } diff --git a/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.tsx b/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.tsx index 0ddfec204d1..4211e585e13 100644 --- a/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.tsx +++ b/docs/src/app/(docs)/react/components/autocomplete/demos/async/css-modules/index.tsx @@ -18,7 +18,7 @@ export default function ExampleAsyncAutocomplete() { if (isPending) { return ( -
+ Searching… ); @@ -83,19 +83,21 @@ export default function ExampleAsyncAutocomplete() { diff --git a/docs/src/app/(docs)/react/components/autocomplete/demos/async/tailwind/index.tsx b/docs/src/app/(docs)/react/components/autocomplete/demos/async/tailwind/index.tsx index 435c339c9ad..21f2cc9625d 100644 --- a/docs/src/app/(docs)/react/components/autocomplete/demos/async/tailwind/index.tsx +++ b/docs/src/app/(docs)/react/components/autocomplete/demos/async/tailwind/index.tsx @@ -17,8 +17,8 @@ export default function ExampleAsyncAutocomplete() { if (isPending) { return ( -
Searching… @@ -77,41 +77,45 @@ export default function ExampleAsyncAutocomplete() { itemToStringValue={(item) => item.title} filter={null} > -