fix(theme): use outline-hidden which is equivalent to outline-none (#5486)

* fix: use `outline-hidden` which is equivalent to `outline-none` in v3

* chore: add changeset
This commit is contained in:
WK 2025-07-16 02:54:58 +08:00 committed by GitHub
parent 08446a7d06
commit 8ddc6e795e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
52 changed files with 65 additions and 61 deletions

View File

@ -0,0 +1,5 @@
---
"@heroui/theme": patch
---
use `outline-hidden` which is equivalent to `outline-none` in v3 (#5485)

View File

@ -467,7 +467,7 @@ export default function Page() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -459,7 +459,7 @@ export default function Page() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -63,7 +63,7 @@ const cmdk = tv({
"h-14",
"font-sans",
"text-lg",
"outline-solid outline-transparent",
"outline-hidden",
"rounded-none",
"bg-transparent",
"text-default-700",

View File

@ -196,7 +196,7 @@ function TreeItem<T>(props: TreeItemProps<T>) {
aria-expanded={dataAttr(hasChildNodes ? isExpanded : undefined)}
aria-selected={dataAttr(isSelected)}
className={clsx(
"flex flex-col outline-solid outline-transparent w-full tap-highlight-transparent",
"flex flex-col outline-hidden w-full tap-highlight-transparent",
hasChildNodes ? "mb-4" : "first:mt-4",
// focus ring
...dataFocusVisibleClasses,

View File

@ -33,7 +33,7 @@ export const FbRoadmapLink = ({className, innerClassName}: Props) => {
<div className={clsx("relative", innerClassName)}>
Roadmap
<Icon
className="absolute right-[-10px] top-0 outline-solid outline-transparent transition-transform group-data-[hover=true]:translate-y-0.5 [&>path]:stroke-[2.5px]"
className="absolute right-[-10px] top-0 outline-hidden transition-transform group-data-[hover=true]:translate-y-0.5 [&>path]:stroke-[2.5px]"
icon={arrowRightUpIcon}
width={10}
/>

View File

@ -80,7 +80,7 @@ export const HeroUIChatBanner = () => {
HeroUI Chat
<Icon
aria-hidden="true"
className="outline-solid outline-transparent transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
className="outline-hidden transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
icon={arrowRightIcon}
width={16}
/>

View File

@ -59,7 +59,7 @@ export const shopCartStyles = tv({
"text-sm",
"rounded-full",
// focus ring
"group-data-[focus-visible=true]:outline-solid outline-transparent",
"group-data-[focus-visible=true]:outline-hidden",
"group-data-[focus-visible=true]:ring-2",
"group-data-[focus-visible=true]:ring-focus",
"group-data-[focus-visible=true]:ring-offset-2",

View File

@ -67,7 +67,7 @@ export const Hero = () => {
color="primary"
endContent={
<ArrowRightIcon
className="group-data-[hover=true]:translate-x-0.5 outline-solid outline-transparent transition-transform"
className="group-data-[hover=true]:translate-x-0.5 outline-hidden transition-transform"
strokeWidth={2}
/>
}

View File

@ -66,7 +66,7 @@ export const InstallBanner = () => {
color="secondary"
endContent={
<ArrowRightIcon
className="group-data-[hover=true]:translate-x-0.5 outline-solid outline-transparent transition-transform"
className="group-data-[hover=true]:translate-x-0.5 outline-hidden transition-transform"
strokeWidth={2}
/>
}

View File

@ -275,7 +275,7 @@ export const APITable: React.FC<APITableProps> = ({data}) => {
{/* Mobile popover */}
<Components.Popover placement="top">
<Components.PopoverTrigger>
<button className="flex items-center gap-1 sm:hidden outline-solid outline-transparent">
<button className="flex items-center gap-1 sm:hidden outline-hidden">
<InfoCircle className="text-default-400" size={16} />
</button>
</Components.PopoverTrigger>

View File

@ -227,7 +227,7 @@ export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], sl
<NavbarItem className="flex h-full items-center">
<button
className={clsx(
"transition-opacity p-1 hover:opacity-80 rounded-full cursor-pointer outline-solid outline-transparent",
"transition-opacity p-1 hover:opacity-80 rounded-full cursor-pointer outline-hidden",
// focus ring
...dataFocusVisibleClasses,
)}

View File

@ -97,7 +97,7 @@ export const PhBanner = () => {
Get 30% off
<Icon
aria-hidden="true"
className="outline-solid outline-transparent transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
className="outline-hidden transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
icon={arrowRightIcon}
width={16}
/>

View File

@ -105,7 +105,7 @@ export const ProBanner = () => {
HeroUI Pro
<Icon
aria-hidden="true"
className="outline-solid outline-transparent transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
className="outline-hidden transition-transform group-hover:translate-x-0.5 [&>path]:stroke-[2px]"
icon={arrowRightIcon}
width={16}
/>

View File

@ -15,7 +15,7 @@ export const CustomCheckbox = (props) => {
},
isFocusVisible: {
true: {
base: "outline-solid outline-transparent ring-2 ring-focus ring-offset-2 ring-offset-background",
base: "outline-hidden ring-2 ring-focus ring-offset-2 ring-offset-background",
},
},
},

View File

@ -40,7 +40,7 @@ export default function App() {
},
isFocusVisible: {
true: {
base: "outline-solid outline-transparent ring-2 ring-focus ring-offset-2 ring-offset-background",
base: "outline-hidden ring-2 ring-focus ring-offset-2 ring-offset-background",
},
},
},

View File

@ -99,7 +99,7 @@ export default function App() {
className="cursor-default"
endContent={
<select
className="z-10 outline-solid outline-transparent w-16 py-0.5 rounded-md text-tiny group-data-[hover=true]:border-default-500 border-small border-default-300 dark:border-default-200 bg-transparent text-default-500"
className="z-10 outline-hidden w-16 py-0.5 rounded-md text-tiny group-data-[hover=true]:border-default-500 border-small border-default-300 dark:border-default-200 bg-transparent text-default-500"
id="theme"
name="theme"
>

View File

@ -71,7 +71,7 @@ export default function App() {
endContent={
<button
aria-label="toggle password visibility"
className="focus:outline-solid outline-transparent"
className="focus:outline-hidden"
type="button"
onClick={toggleVisibility}
>

View File

@ -110,7 +110,7 @@ export default function App() {
Currency
</label>
<select
className="outline-solid outline-transparent border-0 bg-transparent text-default-400 text-small"
className="outline-hidden border-0 bg-transparent text-default-400 text-small"
id="currency"
name="currency"
>

View File

@ -21,7 +21,7 @@ export default function App() {
</label>
<select
aria-label="Select currency"
className="outline-solid outline-transparent border-0 bg-transparent text-default-400 text-small"
className="outline-hidden border-0 bg-transparent text-default-400 text-small"
defaultValue="USD"
id="currency"
name="currency"

View File

@ -31,7 +31,7 @@ export default function App() {
>
<input
aria-label="Temperature value"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-solid outline-transparent transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-hidden transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
type="text"
value={inputValue}
onChange={(e) => {

View File

@ -34,7 +34,7 @@ export default function App() {
>
<input
aria-label="Temperature value"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-solid outline-transparent transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-hidden transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
type="text"
value={inputValue}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {

View File

@ -554,7 +554,7 @@ export default function App() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -566,7 +566,7 @@ export default function App() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -550,7 +550,7 @@ export default function App() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -563,7 +563,7 @@ export default function App() {
<label className="flex items-center text-default-400 text-small">
Rows per page:
<select
className="bg-transparent outline-solid outline-transparent text-default-400 text-small"
className="bg-transparent outline-hidden text-default-400 text-small"
onChange={onRowsPerPageChange}
>
<option value="5">5</option>

View File

@ -300,7 +300,7 @@ const StartAndEndContentTemplate = (args) => (
Currency
</label>
<select
className="outline-solid outline-transparent border-0 bg-transparent text-default-400 text-sm"
className="outline-hidden border-0 bg-transparent text-default-400 text-sm"
id="currency"
name="currency"
>

View File

@ -372,7 +372,7 @@ export const StartAndEndContent = {
Currency
</label>
<select
className="outline-solid outline-transparent border-0 bg-transparent text-default-400 text-sm"
className="outline-hidden border-0 bg-transparent text-default-400 text-sm"
id="currency"
name="currency"
>

View File

@ -165,7 +165,7 @@ const CustomValueTemplate = (args: SliderProps) => {
>
<input
aria-label="Temperature"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-solid outline-transparent transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
className="px-1 py-0.5 w-12 text-right text-small text-default-700 font-medium bg-default-100 outline-hidden transition-colors rounded-small border-medium border-transparent hover:border-primary focus:border-primary"
type="text"
value={inputValue}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {

View File

@ -19,7 +19,7 @@ const card = tv({
"relative",
"overflow-hidden",
"h-auto",
"outline-solid outline-transparent",
"outline-hidden",
"text-foreground",
"box-border",
"bg-content1",

View File

@ -59,7 +59,7 @@ const accordionItem = tv({
base: "",
heading: "",
trigger: [
"flex py-4 w-full h-full gap-3 outline-solid outline-transparent items-center tap-highlight-transparent",
"flex py-4 w-full h-full gap-3 outline-hidden items-center tap-highlight-transparent",
// focus ring
...dataFocusVisibleClasses,
],

View File

@ -17,8 +17,7 @@ const breadcrumbItem = tv({
"flex gap-1 items-center",
"cursor-pointer",
"whitespace-nowrap",
"line-clamp-1",
"outline-solid outline-transparent",
"outline-hidden",
"tap-highlight-transparent",
// focus ring
...dataFocusVisibleClasses,

View File

@ -29,7 +29,7 @@ const button = tv({
"justify-center",
"box-border",
"appearance-none",
"outline-solid outline-transparent",
"outline-hidden",
"select-none",
"whitespace-nowrap",
"min-w-max",

View File

@ -25,7 +25,7 @@ const card = tv({
"relative",
"overflow-hidden",
"h-auto",
"outline-solid outline-transparent",
"outline-hidden",
"text-foreground",
"box-border",
"bg-content1",

View File

@ -38,7 +38,7 @@ const chip = tv({
closeButton: [
"z-10",
"appearance-none",
"outline-solid outline-transparent",
"outline-hidden",
"select-none",
"transition-opacity",
"opacity-70",

View File

@ -29,7 +29,7 @@ const dateInput = tv({
], // this wraps the input and the start/end content
segment: [
"group first:-ml-0.5 [&:not(:first-child)]:-ml-1 px-0.5 my-auto box-content tabular-nums text-start",
"inline-block outline-solid outline-transparent focus:shadow-xs rounded-md",
"inline-block outline-hidden focus:shadow-xs rounded-md",
"text-foreground-500 data-[editable=true]:text-foreground",
"data-[editable=true]:data-[placeholder=true]:text-foreground-500",
// isInvalid=true

View File

@ -58,7 +58,7 @@ const dropdownItem = tv({
"h-full",
"box-border",
"rounded-small",
"outline-solid outline-transparent",
"outline-hidden",
"cursor-pointer",
"tap-highlight-transparent",
"data-[pressed=true]:opacity-70",

View File

@ -11,7 +11,7 @@ const inputOtp = tv({
"absolute",
"inset-0",
"border-none",
"outline-solid outline-transparent",
"outline-hidden",
"bg-transparent",
"text-transparent",
],

View File

@ -42,7 +42,7 @@ const input = tv({
"relative w-full inline-flex tap-highlight-transparent flex-row items-center shadow-xs px-3 gap-3",
innerWrapper: "inline-flex w-full items-center h-full box-border",
input: [
"w-full font-normal bg-transparent !outline-solid outline-transparent placeholder:text-foreground-500 focus-visible:outline-solid outline-transparent",
"w-full font-normal bg-transparent !outline-hidden placeholder:text-foreground-500 focus-visible:outline-hidden",
"data-[has-start-content=true]:ps-1.5",
"data-[has-end-content=true]:pe-1.5",
"data-[type=color]:rounded-none",
@ -58,7 +58,7 @@ const input = tv({
"start-auto",
"pointer-events-none",
"appearance-none",
"outline-solid outline-transparent",
"outline-hidden",
"select-none",
"opacity-0",
"cursor-pointer",

View File

@ -11,7 +11,7 @@ import {dataFocusVisibleClasses} from "../utils";
*/
const link = tv({
base: [
"relative inline-flex items-center outline-solid outline-transparent tap-highlight-transparent",
"relative inline-flex items-center outline-hidden tap-highlight-transparent",
// focus ring
...dataFocusVisibleClasses,
],

View File

@ -12,7 +12,7 @@ import {dataFocusVisibleClasses} from "../utils";
const menu = tv({
slots: {
base: "w-full relative flex flex-col gap-1 p-1 overflow-clip",
list: "w-full flex flex-col gap-0.5 outline-solid outline-transparent",
list: "w-full flex flex-col gap-0.5 outline-hidden",
emptyContent: [
"h-10",
"px-2",
@ -63,7 +63,7 @@ const menuItem = tv({
"box-border",
"rounded-small",
"subpixel-antialiased",
"outline-solid outline-transparent",
"outline-hidden",
"cursor-pointer",
"tap-highlight-transparent",
// focus ring

View File

@ -43,7 +43,7 @@ const modal = tv({
"w-full",
"box-border",
"bg-content1",
"outline-solid outline-transparent",
"outline-hidden",
"mx-1",
"my-1",
"sm:mx-6",
@ -56,7 +56,7 @@ const modal = tv({
closeButton: [
"absolute",
"appearance-none",
"outline-solid outline-transparent",
"outline-hidden",
"select-none",
"top-1",
"end-1",

View File

@ -77,7 +77,7 @@ const navbar = tv({
"justify-center",
"w-6",
"h-full",
"outline-solid outline-transparent",
"outline-hidden",
"rounded-small",
"tap-highlight-transparent",
// focus ring

View File

@ -42,7 +42,7 @@ const numberInput = tv({
"relative w-full inline-flex tap-highlight-transparent flex-row items-center shadow-sm px-3 gap-3",
innerWrapper: "inline-flex w-full items-center h-full box-border",
input: [
"w-full font-normal bg-transparent !outline-solid outline-transparent placeholder:text-foreground-500 focus-visible:outline-solid outline-transparent",
"w-full font-normal bg-transparent !outline-hidden placeholder:text-foreground-500 focus-visible:outline-hidden",
"data-[has-start-content=true]:ps-1.5",
"data-[has-end-content=true]:pe-1.5",
"autofill:bg-transparent bg-clip-text",
@ -55,7 +55,7 @@ const numberInput = tv({
"start-auto",
"pointer-events-none",
"appearance-none",
"outline-solid outline-transparent",
"outline-hidden",
"select-none",
"opacity-0",
"hover:!opacity-100",

View File

@ -344,7 +344,7 @@ const pagination = tv({
"flex-wrap",
"truncate",
"box-border",
"outline-solid outline-transparent",
"outline-hidden",
"items-center",
"justify-center",
"text-default-foreground",

View File

@ -81,7 +81,7 @@ const popover = tv({
"justify-center",
"box-border",
"subpixel-antialiased",
"outline-solid outline-transparent",
"outline-hidden",
"box-border",
],
trigger: ["z-10"],

View File

@ -22,7 +22,7 @@ const select = tv({
],
mainWrapper: "w-full flex flex-col",
trigger:
"relative px-3 gap-3 w-full inline-flex flex-row items-center shadow-xs outline-solid outline-transparent tap-highlight-transparent",
"relative px-3 gap-3 w-full inline-flex flex-row items-center shadow-xs outline-hidden tap-highlight-transparent",
innerWrapper:
"inline-flex h-fit w-[calc(100%_-theme(spacing.6))] min-h-4 items-center gap-1.5 box-border",
selectorIcon: "absolute end-3 w-4 h-4",

View File

@ -56,7 +56,7 @@ const table = tv({
table: "min-w-full h-auto",
thead: "[&>tr]:first:rounded-lg",
tbody: "after:block",
tr: ["group/tr", "outline-solid outline-transparent", ...dataFocusVisibleClasses],
tr: ["group/tr", "outline-hidden", ...dataFocusVisibleClasses],
th: [
"group/th",
"px-3",
@ -70,7 +70,7 @@ const table = tv({
"font-semibold",
"first:rounded-s-lg",
"last:rounded-e-lg",
"outline-solid outline-transparent",
"outline-hidden",
"data-[sortable=true]:cursor-pointer",
"data-[hover=true]:text-foreground-400",
...dataFocusVisibleClasses,
@ -83,7 +83,7 @@ const table = tv({
"whitespace-normal",
"text-small",
"font-normal",
"outline-solid outline-transparent",
"outline-hidden",
"[&>*]:z-1",
"[&>*]:relative",
...dataFocusVisibleClasses,

View File

@ -44,7 +44,7 @@ const tabs = tv({
"relative",
"justify-center",
"items-center",
"outline-solid outline-transparent",
"outline-hidden",
"cursor-pointer",
"transition-opacity",
"tap-highlight-transparent",
@ -67,7 +67,7 @@ const tabs = tv({
panel: [
"py-3",
"px-1",
"outline-solid outline-transparent",
"outline-hidden",
"data-[inert=true]:hidden",
// focus ring
...dataFocusVisibleClasses,

View File

@ -38,7 +38,7 @@ const toast = tv({
"relative",
"z-50",
"box-border",
"outline-solid outline-transparent",
"outline-hidden",
"p-3 sm:mx-1",
"my-1",
"w-full sm:w-[356px]",

View File

@ -18,7 +18,7 @@ import {dataFocusVisibleClasses} from "../utils";
const user = tv({
slots: {
base: [
"inline-flex items-center justify-center gap-2 rounded-small outline-solid outline-transparent",
"inline-flex items-center justify-center gap-2 rounded-small outline-hidden",
// focus ring
...dataFocusVisibleClasses,
],

View File

@ -18,7 +18,7 @@ export const focusVisibleClasses = [
];
export const dataFocusVisibleClasses = [
"outline-solid outline-transparent",
"outline-hidden",
"data-[focus-visible=true]:z-10",
"data-[focus-visible=true]:outline-2",
"data-[focus-visible=true]:outline-focus",
@ -26,7 +26,7 @@ export const dataFocusVisibleClasses = [
];
export const groupDataFocusVisibleClasses = [
"outline-solid outline-transparent",
"outline-hidden",
"group-data-[focus-visible=true]:z-10",
"group-data-[focus-visible=true]:ring-2",
"group-data-[focus-visible=true]:ring-focus",
@ -35,7 +35,7 @@ export const groupDataFocusVisibleClasses = [
];
export const ringClasses = [
"outline-solid outline-transparent",
"outline-hidden",
"ring-2",
"ring-focus",
"ring-offset-2",