diff --git a/.changeset/olive-rules-press.md b/.changeset/olive-rules-press.md new file mode 100644 index 0000000000..fd0d3a6078 --- /dev/null +++ b/.changeset/olive-rules-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING** Restructure Backstage UI component styling to use CSS Modules instead of pure CSS. We don't expect this to be an issue in practice but it is important to call out that all styles are now loaded through CSS modules with generated class names. We are still providing fixed class names for all components to allow anyone to style their Backstage instance. diff --git a/packages/ui/css/styles.css b/packages/ui/css/styles.css index 24c1573adc..43c15d811c 100644 --- a/packages/ui/css/styles.css +++ b/packages/ui/css/styles.css @@ -241,1611 +241,7 @@ } } -@layer components { - .bui-AvatarRoot { - vertical-align: middle; - user-select: none; - color: var(--bui-fg-primary); - background-color: var(--bui-bg-surface-2); - border-radius: 100%; - justify-content: center; - align-items: center; - width: 2rem; - height: 2rem; - font-size: 1rem; - font-weight: 500; - line-height: 1; - display: inline-flex; - overflow: hidden; - } - - .bui-AvatarRoot[data-size="small"] { - width: 1.5rem; - height: 1.5rem; - } - - .bui-AvatarRoot[data-size="medium"] { - width: 2rem; - height: 2rem; - } - - .bui-AvatarRoot[data-size="large"] { - width: 3rem; - height: 3rem; - } - - .bui-AvatarImage { - object-fit: cover; - width: 100%; - height: 100%; - } - - .bui-AvatarFallback { - width: 100%; - height: 100%; - font-size: var(--bui-font-size-3); - font-weight: var(--bui-font-weight-regular); - box-shadow: inset 0 0 0 1px var(--bui-border); - border-radius: var(--bui-radius-full); - justify-content: center; - align-items: center; - display: flex; - } - - .bui-Box { - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-primary); - } - - .bui-Button { - user-select: none; - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-bold); - cursor: pointer; - border-radius: var(--bui-radius-2); - justify-content: center; - align-items: center; - gap: var(--bui-space-1_5); - border: none; - flex-shrink: 0; - padding: 0; - display: inline-flex; - - &[data-disabled="true"] { - cursor: not-allowed; - } - } - - .bui-Button[data-variant="primary"] { - background-color: var(--bui-bg-solid); - color: var(--bui-fg-solid); - - &:hover { - background-color: var(--bui-bg-solid-hover); - transition: background-color .15s; - } - - &:active { - background-color: var(--bui-bg-solid-pressed); - } - - &:focus-visible { - outline: 2px solid var(--bui-ring); - outline-offset: 2px; - } - - &[data-disabled="true"] { - background-color: var(--bui-bg-solid-disabled); - color: var(--bui-fg-solid-disabled); - } - } - - .bui-Button[data-variant="secondary"] { - background-color: var(--bui-bg-surface-1); - box-shadow: inset 0 0 0 1px var(--bui-border); - color: var(--bui-fg-primary); - - &:hover { - box-shadow: inset 0 0 0 1px var(--bui-border-hover); - transition: box-shadow .15s; - } - - &:active { - box-shadow: inset 0 0 0 1px var(--bui-border-pressed); - } - - &:focus-visible { - box-shadow: inset 0 0 0 2px var(--bui-ring); - outline: none; - transition: none; - } - - &[data-disabled="true"] { - box-shadow: inset 0 0 0 1px var(--bui-border-disabled); - color: var(--bui-fg-disabled); - } - } - - .bui-Button[data-variant="tertiary"] { - color: var(--bui-fg-primary); - background-color: #0000; - - &:hover { - background-color: var(--bui-bg-surface-1); - transition: background-color .2s; - } - - &:active { - background-color: var(--bui-bg-surface-2); - } - - &:focus-visible { - box-shadow: inset 0 0 0 2px var(--bui-ring); - outline: none; - transition: none; - } - - &[data-disabled="true"] { - color: var(--bui-fg-disabled); - background-color: #0000; - } - } - - .bui-Button[data-size="medium"] { - font-size: var(--bui-font-size-4); - padding: 0 var(--bui-space-3); - height: 2.5rem; - } - - .bui-Button[data-size="small"] { - font-size: var(--bui-font-size-3); - padding: 0 var(--bui-space-2); - height: 2rem; - } - - .bui-Button[data-size="small"] svg { - width: 1rem; - height: 1rem; - } - - .bui-Button[data-size="medium"] svg { - width: 1.25rem; - height: 1.25rem; - } - - .bui-ButtonIcon { - justify-content: center; - align-items: center; - } - - .bui-ButtonIcon[data-size="small"] { - width: 2rem; - padding: 0; - } - - .bui-ButtonIcon[data-size="medium"] { - width: 2.5rem; - padding: 0; - } - - .bui-Card { - gap: var(--bui-space-3); - background-color: var(--bui-bg-surface-1); - border-radius: var(--bui-radius-3); - padding-block: var(--bui-space-3); - color: var(--bui-fg-primary); - border: 1px solid var(--bui-border); - flex-direction: column; - width: 100%; - min-height: 0; - display: flex; - overflow: hidden; - } - - .bui-CardBody { - flex: 1; - min-height: 0; - overflow: auto; - } - - .bui-CardHeader, .bui-CardFooter { - padding-inline: var(--bui-space-3); - } - - .bui-CheckboxRoot { - width: 1rem; - height: 1rem; - box-shadow: inset 0 0 0 1px var(--bui-border); - cursor: pointer; - background-color: var(--bui-bg-surface-1); - border: none; - border-radius: 2px; - flex-shrink: 0; - justify-content: center; - align-items: center; - padding: 0; - transition: background-color .2s ease-in-out; - display: flex; - } - - .bui-CheckboxRoot:focus-visible { - outline: 2px solid var(--bui-ring); - outline-offset: 2px; - transition: none; - } - - .bui-CheckboxRoot[data-checked] { - background-color: var(--bui-bg-solid); - box-shadow: none; - color: var(--bui-fg-solid); - } - - .bui-CheckboxLabel { - align-items: center; - gap: var(--bui-space-2); - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-primary); - user-select: none; - flex-direction: row; - display: flex; - - &:hover { - & .bui-CheckboxRoot:not([data-checked]) { - box-shadow: inset 0 0 0 1px var(--bui-border-hover); - } - } - } - - .bui-CheckboxIndicator { - color: var(--bui-fg-solid); - justify-content: center; - align-items: center; - display: flex; - } - - .bui-CollapsiblePanel { - height: var(--collapsible-panel-height); - transition: all .15s ease-out; - display: flex; - overflow: hidden; - - &[data-starting-style], &[data-ending-style] { - height: 0; - } - } - - .bui-Container { - max-width: 120rem; - padding-inline: var(--bui-space-4); - margin-inline: auto; - transition: padding .2s ease-in-out; - } - - @media (width >= 640px) { - .bui-Container { - padding-inline: var(--bui-space-5); - } - } - - .bui-FieldError { - color: var(--bui-fg-danger); - font-size: var(--bui-font-size-2); - font-weight: var(--bui-font-weight-regular); - margin-top: var(--bui-space-2); - display: inline-block; - } - - .bui-FieldLabelWrapper { - margin-bottom: var(--bui-space-3); - gap: var(--bui-space-1); - flex-direction: column; - display: flex; - } - - .bui-FieldLabel { - color: var(--bui-fg-primary); - cursor: pointer; - font-weight: var(--bui-font-weight-regular); - font-size: var(--bui-font-size-2); - margin-right: auto; - } - - .bui-FieldSecondaryLabel { - color: var(--bui-fg-secondary); - font-weight: var(--bui-font-weight-regular); - margin-left: var(--bui-space-1); - } - - .bui-FieldDescription { - font-weight: var(--bui-font-weight-regular); - font-size: var(--bui-font-size-2); - color: var(--bui-fg-secondary); - margin: 0; - } - - .bui-Flex { - min-width: 0; - display: flex; - } - - .bui-Grid { - display: grid; - } - - .bui-HeaderToolbar { - margin-bottom: var(--bui-space-6); - - &:before { - content: ""; - background-color: var(--bui-bg); - z-index: 0; - height: 16px; - position: absolute; - top: 0; - left: 0; - right: 0; - } - - &[data-has-tabs="true"] { - margin-bottom: 0; - } - } - - .bui-HeaderToolbarWrapper { - z-index: 1; - background-color: var(--bui-bg-surface-1); - padding-inline: var(--bui-space-5); - border-bottom: 1px solid var(--bui-border); - color: var(--bui-fg-primary); - flex-direction: row; - justify-content: space-between; - align-items: center; - height: 52px; - display: flex; - position: relative; - } - - .bui-HeaderToolbarContent { - align-items: center; - gap: var(--bui-space-2); - flex-direction: row; - display: flex; - } - - .bui-HeaderToolbarName { - align-items: center; - gap: var(--bui-space-2); - font-size: var(--bui-font-size-3); - font-weight: var(--bui-font-weight-regular); - flex-direction: row; - flex-shrink: 0; - display: flex; - } - - .bui-HeaderToolbarIcon { - width: 16px; - height: 16px; - color: var(--bui-fg-primary); - - & svg { - width: 100%; - height: 100%; - } - } - - .bui-HeaderToolbarControls { - right: var(--bui-space-5); - align-items: center; - gap: var(--bui-space-2); - flex-direction: row; - display: flex; - position: absolute; - top: 50%; - transform: translateY(-50%); - } - - .bui-HeaderTabsWrapper { - margin-bottom: var(--bui-space-4); - padding-inline: var(--bui-space-3); - border-bottom: 1px solid var(--bui-border); - background-color: var(--bui-bg-surface-1); - } - - .bui-HeaderPage { - gap: var(--bui-space-1); - margin-top: var(--bui-space-6); - margin-bottom: var(--bui-space-6); - flex-direction: column; - display: flex; - } - - .bui-HeaderPageContent { - flex-direction: row; - justify-content: space-between; - display: flex; - } - - .bui-HeaderPageTabsWrapper { - margin-left: -8px; - } - - .bui-HeaderPageControls, .bui-HeaderPageBreadcrumbs { - align-items: center; - gap: var(--bui-space-2); - flex-direction: row; - display: flex; - } - - .bui-Icon { - width: 1rem; - height: 1rem; - } - - .bui-Link { - font-family: var(--bui-font-regular); - cursor: pointer; - margin: 0; - padding: 0; - text-decoration-line: none; - display: inline-block; - - &:hover { - text-underline-offset: calc(.025em + 2px); - text-decoration-line: underline; - text-decoration-style: solid; - text-decoration-thickness: min(2px, max(1px, .05em)); - text-decoration-color: color-mix(in srgb, currentColor 30%, transparent); - } - } - - .bui-Popover { - background-color: var(--bui-bg-surface-1); - border: 1px solid var(--bui-border); - border-radius: var(--bui-radius-3); - padding-block: var(--bui-space-1); - margin-right: 12px; - overflow: scroll; - box-shadow: 0 4px 12px #0000001a; - } - - .bui-RadioGroup { - color: var(--bui-fg-primary); - flex-direction: column; - display: flex; - } - - .bui-RadioGroup[data-orientation="horizontal"] .bui-RadioGroupContent { - gap: var(--bui-space-4); - flex-direction: row; - } - - .bui-RadioGroupContent { - gap: var(--bui-space-2); - flex-direction: column; - display: flex; - } - - .bui-Radio { - align-items: center; - gap: var(--bui-space-2); - font-size: var(--bui-font-size-2); - color: var(--bui-fg-primary); - forced-color-adjust: none; - display: flex; - position: relative; - - &:before { - content: ""; - box-sizing: border-box; - border: .125rem solid var(--bui-border); - background: var(--bui-gray-1); - border-radius: var(--bui-radius-full); - width: 1rem; - height: 1rem; - transition: all .2s; - display: block; - } - - &[data-pressed]:before { - border-color: var(--bui-border); - } - - &[data-selected] { - &:before { - border-color: var(--bui-bg-solid); - border-width: .25rem; - } - - &[data-pressed]:before { - border-color: var(--bui-bg-solid); - } - } - - &[data-focus-visible]:before { - outline: 2px solid var(--bui-ring); - outline-offset: 2px; - } - - &[data-disabled] { - cursor: not-allowed; - color: var(--bui-fg-disabled); - - &:before { - border-color: var(--bui-border-disabled); - background: var(--bui-bg-disabled); - } - - &[data-selected]:before { - border-color: var(--bui-border-disabled); - } - } - - &[data-invalid]:before, &[data-invalid][data-selected]:before { - border-color: var(--bui-border-danger); - } - - &[data-disabled][data-invalid] { - color: var(--bui-fg-disabled); - - &:before { - border-color: var(--bui-border-disabled); - background: var(--bui-bg-disabled); - } - - &[data-selected]:before { - border-color: var(--bui-border-disabled); - } - } - } - - .bui-Table { - caption-side: bottom; - border-collapse: collapse; - width: 100%; - } - - .bui-TableHeader { - border-bottom: 1px solid var(--bui-border); - transition: color .2s ease-in-out; - } - - .bui-TableHead { - text-align: left; - padding: var(--bui-space-3); - font-size: var(--bui-font-size-3); - color: var(--bui-fg-primary); - - &:hover { - & .bui-TableHeadSortButton { - opacity: 1; - } - } - } - - .bui-TableHeadContent { - align-items: center; - gap: var(--bui-space-1); - flex-direction: row; - display: flex; - } - - .bui-TableHeadSortButton { - cursor: pointer; - user-select: none; - align-items: center; - gap: var(--bui-space-1); - opacity: 0; - color: var(--bui-fg-secondary); - transition: opacity .1s ease-in-out; - display: inline-flex; - - & svg { - transition: transform .1s ease-in-out; - } - - &[data-sort-order="asc"] svg { - opacity: 1; - transform: rotate(0); - } - - &[data-sort-order="desc"] svg { - opacity: 1; - transform: rotate(180deg); - } - } - - .bui-TableBody { - color: var(--bui-fg-primary); - } - - .bui-TableRow { - border-bottom: 1px solid var(--bui-border); - transition: color .2s ease-in-out; - - &[data-react-aria-pressable="true"] { - cursor: pointer; - } - } - - .bui-TableBody .bui-TableRow:hover { - background-color: var(--bui-gray-2); - } - - .bui-TableCell { - padding: var(--bui-space-3); - font-size: var(--bui-font-size-3); - padding: var(--bui-space-3); - font-size: var(--bui-font-size-3); - } - - .bui-TableCellContentWrapper { - align-items: center; - gap: var(--bui-space-2); - flex-direction: row; - display: inline-flex; - } - - .bui-TableCellIcon, .bui-TableCellIcon svg { - color: var(--bui-fg-primary); - align-items: center; - display: inline-flex; - } - - .bui-TableCellContent { - gap: var(--bui-space-0_5); - flex-direction: column; - display: flex; - } - - .bui-TableCellProfile { - gap: var(--bui-space-2); - flex-direction: row; - align-items: center; - display: flex; - } - - .bui-TableCellProfileAvatar { - vertical-align: middle; - user-select: none; - color: var(--bui-fg-primary); - background-color: var(--bui-bg-surface-2); - border-radius: 100%; - justify-content: center; - align-items: center; - width: 1.25rem; - height: 1.25rem; - font-size: 1rem; - font-weight: 500; - line-height: 1; - display: inline-flex; - overflow: hidden; - } - - .bui-TableCellProfileAvatarImage { - object-fit: cover; - width: 100%; - height: 100%; - } - - .bui-TableCellProfileAvatarFallback { - width: 100%; - height: 100%; - font-size: var(--bui-font-size-2); - font-weight: var(--bui-font-weight-regular); - box-shadow: inset 0 0 0 1px var(--bui-border); - border-radius: var(--bui-radius-full); - justify-content: center; - align-items: center; - display: flex; - } - - .bui-DataTablePagination { - padding-top: var(--bui-space-5); - justify-content: space-between; - align-items: center; - display: flex; - } - - .bui-DataTablePagination--left { - justify-content: space-between; - align-items: center; - display: flex; - } - - .bui-DataTablePagination--right { - justify-content: space-between; - align-items: center; - gap: var(--bui-space-2); - display: flex; - } - - .bui-DataTablePagination--select { - min-width: 10.5rem; - } - - .bui-Tabs { - --active-tab-left: 0px; - --active-tab-right: 0px; - --active-tab-top: 0px; - --active-tab-bottom: 0px; - --active-tab-width: 0px; - --active-tab-height: 0px; - --active-transition-duration: 0s; - --hovered-tab-left: 0px; - --hovered-tab-right: 0px; - --hovered-tab-top: 0px; - --hovered-tab-bottom: 0px; - --hovered-tab-width: 0px; - --hovered-tab-height: 0px; - --hovered-tab-opacity: 0; - --hovered-transition-duration: 0s; - } - - .bui-TabList { - flex-direction: row; - display: flex; - } - - .bui-TabListWrapper { - position: relative; - } - - .bui-Tab { - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-secondary); - cursor: pointer; - z-index: 2; - height: 36px; - padding-inline: var(--bui-space-2); - justify-content: center; - align-items: center; - display: flex; - position: relative; - - &[data-selected="true"] { - color: var(--bui-fg-primary); - } - } - - .bui-TabActive { - content: ""; - left: calc(var(--active-tab-left) + var(--bui-space-2)); - width: calc(var(--active-tab-width) - var(--bui-space-4)); - background-color: var(--bui-fg-primary); - height: 1px; - transition: left var(--active-transition-duration) ease-out, opacity .15s ease-out, width var(--active-transition-duration) ease-out; - opacity: 1; - border-radius: 4px; - position: absolute; - bottom: -1px; - } - - .bui-TabHovered { - content: ""; - left: var(--hovered-tab-left); - top: calc(var(--hovered-tab-top) + 4px); - width: var(--hovered-tab-width); - height: calc(var(--hovered-tab-height) - 8px); - background-color: var(--bui-gray-2); - opacity: var(--hovered-tab-opacity); - transition: left var(--hovered-transition-duration) ease-out, top var(--hovered-transition-duration) ease-out, width var(--hovered-transition-duration) ease-out, height var(--hovered-transition-duration) ease-out, opacity .15s ease-out; - border-radius: 4px; - position: absolute; - } - - .bui-TabPanel { - padding-inline: var(--bui-space-2); - padding-top: var(--bui-space-4); - } - - .bui-TagList { - gap: var(--bui-space-2); - flex-wrap: wrap; - display: flex; - } - - .bui-Tag { - color: var(--bui-fg-primary); - background-color: var(--bui-gray-2); - border-radius: var(--bui-radius-2); - font-weight: var(--bui-font-weight-regular); - justify-content: center; - align-items: center; - gap: var(--bui-space-1); - box-sizing: border-box; - transition-property: background-color, box-shadow, color; - transition-duration: .2s; - transition-timing-function: ease-in-out; - display: flex; - } - - .bui-Tag[data-size="small"] { - height: 26px; - padding: 0 var(--bui-space-2); - font-size: var(--bui-font-size-1); - } - - .bui-Tag[data-size="medium"] { - height: 32px; - padding: 0 var(--bui-space-2); - font-size: var(--bui-font-size-2); - } - - .bui-Tag[data-hovered] { - background-color: var(--bui-gray-3); - cursor: pointer; - } - - .bui-Tag[data-focus-visible] { - outline: 2px solid var(--bui-ring); - outline-offset: 1px; - } - - .bui-Tag[data-selected] { - box-shadow: inset 0 0 0 1px var(--bui-gray-8); - } - - .bui-Tag[data-disabled] { - color: var(--bui-fg-disabled); - cursor: not-allowed; - } - - .bui-TagRemoveButton { - cursor: pointer; - color: var(--bui-fg-primary); - background-color: #0000; - border: none; - width: 1rem; - height: 1rem; - margin: 0; - padding: 0; - } - - .bui-TagIcon { - justify-content: center; - align-items: center; - transition: color .2s ease-in-out; - display: flex; - - & svg { - width: 1rem; - height: 1rem; - } - } - - .bui-Text { - font-family: var(--bui-font-regular); - margin: 0; - padding: 0; - } - - .bui-Text[data-variant="title-large"] { - font-size: var(--bui-font-size-8); - line-height: 140%; - } - - .bui-Text[data-variant="title-medium"] { - font-size: var(--bui-font-size-7); - line-height: 140%; - } - - .bui-Text[data-variant="title-small"] { - font-size: var(--bui-font-size-6); - line-height: 140%; - } - - .bui-Text[data-variant="title-x-small"] { - font-size: var(--bui-font-size-5); - line-height: 140%; - } - - .bui-Text[data-variant="body-large"] { - font-size: var(--bui-font-size-4); - line-height: 140%; - } - - .bui-Text[data-variant="body-medium"] { - font-size: var(--bui-font-size-3); - line-height: 140%; - } - - .bui-Text[data-variant="body-small"] { - font-size: var(--bui-font-size-2); - line-height: 140%; - } - - .bui-Text[data-variant="body-x-small"] { - font-size: var(--bui-font-size-1); - line-height: 140%; - } - - .bui-Text[data-weight="regular"] { - font-weight: var(--bui-font-weight-regular); - } - - .bui-Text[data-weight="bold"] { - font-weight: var(--bui-font-weight-bold); - } - - .bui-Text[data-color="primary"] { - color: var(--bui-fg-primary); - } - - .bui-Text[data-color="secondary"] { - color: var(--bui-fg-secondary); - } - - .bui-Text[data-color="danger"] { - color: var(--bui-fg-danger); - } - - .bui-Text[data-color="warning"] { - color: var(--bui-fg-warning); - } - - .bui-Text[data-color="success"] { - color: var(--bui-fg-success); - } - - .bui-Text[data-truncate] { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - } - - .bui-Text[data-as="span"], .bui-Text[data-as="label"], .bui-Text[data-as="strong"], .bui-Text[data-as="em"], .bui-Text[data-as="small"] { - display: inline-block; - } - - .bui-TextField { - font-family: var(--bui-font-regular); - flex-direction: column; - flex-shrink: 0; - width: 100%; - display: flex; - } - - .bui-InputWrapper { - position: relative; - - &[data-size="small"] .bui-Input { - height: 2rem; - } - - &[data-size="medium"] .bui-Input { - height: 2.5rem; - } - - &[data-size="small"] .bui-Input[data-icon] { - padding-left: var(--bui-space-8); - } - - &[data-size="medium"] .bui-Input[data-icon] { - padding-left: var(--bui-space-9); - } - } - - .bui-InputIcon { - left: var(--bui-space-3); - margin-right: var(--bui-space-1); - color: var(--bui-fg-primary); - pointer-events: none; - flex-shrink: 0; - transition: left .2s ease-in-out; - position: absolute; - top: 50%; - transform: translateY(-50%); - - &[data-size="small"], &[data-size="small"] svg { - width: 1rem; - height: 1rem; - } - - &[data-size="medium"], &[data-size="medium"] svg { - width: 1.25rem; - height: 1.25rem; - } - } - - .bui-Input { - padding: 0 var(--bui-space-3); - border-radius: var(--bui-radius-2); - border: 1px solid var(--bui-border); - background-color: var(--bui-bg-surface-1); - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-primary); - width: 100%; - height: 100%; - cursor: inherit; - align-items: center; - transition: border-color .2s ease-in-out, outline-color .2s ease-in-out; - display: flex; - - &::-webkit-search-cancel-button, &::-webkit-search-decoration { - -webkit-appearance: none; - } - - &::placeholder { - color: var(--bui-fg-secondary); - } - - &[data-focused] { - outline-color: var(--bui-border-pressed); - outline-width: 0; - } - - &[data-hovered] { - border-color: var(--bui-border-hover); - } - - &[data-focused] { - border-color: var(--bui-border-pressed); - outline-width: 0; - } - - &[data-invalid] { - border-color: var(--bui-fg-danger); - } - - &[data-disabled] { - opacity: .5; - cursor: not-allowed; - border: 1px solid var(--bui-border-disabled); - } - } - - .bui-PasswordField { - font-family: var(--bui-font-regular); - --bui-passwordmanager-icon-width: var(--bui-space-1); - flex-direction: column; - flex-shrink: 0; - width: 100%; - display: flex; - } - - .bui-InputVisibility { - right: var(--bui-passwordmanager-icon-width); - cursor: pointer; - color: var(--bui-fg-primary); - background-color: #0000; - border: none; - justify-content: center; - align-items: center; - margin: 0; - padding: 0; - display: flex; - position: absolute; - top: 0; - bottom: 0; - - &[data-size="small"] { - width: 2rem; - height: 2rem; - } - - &[data-size="small"] svg { - width: 1rem; - height: 1rem; - } - - &[data-size="medium"] { - width: 2.5rem; - height: 2.5rem; - } - - &[data-size="medium"] svg { - width: 1.25rem; - height: 1.25rem; - } - } - - .bui-PasswordField .bui-InputWrapper[data-size="small"] .bui-Input { - padding-right: calc(2rem + var(--bui-passwordmanager-icon-width)); - } - - .bui-PasswordField .bui-InputWrapper[data-size="medium"] .bui-Input { - padding-right: calc(2.5rem + var(--bui-passwordmanager-icon-width)); - } - - .bui-SearchField { - flex: 1 0; - - &[data-empty] { - & .bui-InputClear { - display: none; - } - } - - &[data-startCollapsed="true"] { - flex: 0 auto; - padding: 0; - transition: flex-basis .3s ease-in-out; - - &[data-collapsed="true"] { - flex-basis: 200px; - } - - &[data-collapsed="false"] { - cursor: pointer; - - &[data-size="medium"] { - flex-basis: 2.5rem; - height: 2.5rem; - } - - &[data-size="small"] { - flex-basis: 2rem; - height: 2rem; - } - - &[data-size="medium"] .bui-Input { - &::placeholder { - opacity: 0; - } - } - - &[data-size="small"] .bui-Input { - &::placeholder { - opacity: 0; - } - } - - & .bui-InputWrapper { - & .bui-Input[data-icon] { - padding-right: 0; - } - } - } - } - } - - .bui-SearchField .bui-Input { - transition: padding .3s ease-in-out, border-color .2s ease-in-out, outline-color .2s ease-in-out; - - &[data-hovered] { - border-color: var(--bui-border-hover); - } - - &[data-focused] { - border-color: var(--bui-border-pressed); - outline-width: 0; - } - } - - .bui-SearchField .bui-InputWrapper { - & .bui-Input[data-icon] { - padding-right: var(--bui-space-6); - } - } - - .bui-SearchField .bui-InputIcon { - justify-content: center; - display: flex; - left: 0; - - &[data-size="small"] { - width: var(--bui-space-8); - } - - &[data-size="medium"] { - width: var(--bui-space-10); - } - } - - .bui-InputClear { - cursor: pointer; - color: var(--bui-fg-secondary); - background-color: #0000; - border: none; - justify-content: center; - align-items: center; - margin: 0; - padding: 0; - transition: color .2s ease-in-out; - display: flex; - position: absolute; - top: 0; - bottom: 0; - right: 0; - } - - .bui-InputClear:hover { - color: var(--bui-fg-primary); - } - - .bui-InputClear[data-size="small"] { - width: 2rem; - height: 2rem; - } - - .bui-InputClear[data-size="medium"] { - width: 2.5rem; - height: 2.5rem; - } - - .bui-InputClear svg { - width: 1rem; - height: 1rem; - } - - .bui-Skeleton { - animation: var(--bui-animate-pulse); - background-color: var(--bui-bg-surface-2); - border-radius: var(--bui-radius-2); - } - - .bui-Skeleton[data-rounded="true"] { - border-radius: var(--bui-radius-full); - } - - .bui-Tooltip { - background: var(--bui-bg-surface-1); - border: 1px solid var(--bui-gray-3); - forced-color-adjust: none; - padding: var(--bui-space-2) var(--bui-space-3); - max-width: 240px; - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - color: var(--bui-fg-primary); - border-radius: 4px; - outline: none; - transition: transform .2s, opacity .2s; - transform: translate3d(0, 0, 0); - box-shadow: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a; - - &[data-entering], &[data-exiting] { - transform: var(--origin); - opacity: 0; - } - - --tooltip-offset: var(--bui-space-3); - - &[data-placement="top"] { - margin-bottom: var(--tooltip-offset); - --origin: translateY(4px); - } - - &[data-placement="right"] { - margin-left: var(--tooltip-offset); - --origin: translateX(-4px); - } - - &[data-placement="bottom"] { - margin-top: var(--tooltip-offset); - --origin: translateY(-4px); - } - - &[data-placement="left"] { - margin-right: var(--tooltip-offset); - --origin: translateX(4px); - } - } - - .bui-TooltipArrow { - & svg { - display: block; - - & path:first-child { - fill: var(--bui-bg-surface-1); - } - - & path:nth-child(2) { - fill: var(--bui-gray-3); - } - - --tooltip-arrow-overlap: -2px; - } - - &[data-placement="top"] svg { - margin-top: var(--tooltip-arrow-overlap); - } - - &[data-placement="bottom"] svg { - margin-bottom: var(--tooltip-arrow-overlap); - transform: rotate(180deg); - } - - &[data-placement="right"] svg { - margin-right: var(--tooltip-arrow-overlap); - transform: rotate(90deg); - } - - &[data-placement="left"] svg { - margin-left: var(--tooltip-arrow-overlap); - transform: rotate(-90deg); - } - } - - [data-theme="dark"] { - & .bui-Tooltip { - background: var(--bui-bg-surface-2); - box-shadow: none; - border: 1px solid var(--bui-gray-4); - } - - & .bui-TooltipArrow { - & svg path:first-child { - fill: var(--bui-bg-surface-2); - } - - & svg path:nth-child(2) { - fill: var(--bui-gray-4); - } - } - } - - .bui-ScrollAreaRoot { - box-sizing: border-box; - width: 100%; - } - - .bui-ScrollAreaViewport { - overscroll-behavior: contain; - height: 100%; - } - - .bui-ScrollAreaContent { - padding-block: .75rem; - flex-direction: column; - gap: 1rem; - padding-left: 1rem; - padding-right: 1.5rem; - display: flex; - } - - .bui-ScrollAreaScrollbar { - background-color: var(--bui-scrollbar); - opacity: 0; - border-radius: .375rem; - justify-content: center; - width: .25rem; - margin: .5rem; - transition: opacity .15s .3s; - display: flex; - - &[data-hovering], &[data-scrolling] { - opacity: 1; - transition-duration: 75ms; - transition-delay: 0s; - } - - &:before { - content: ""; - width: 1.25rem; - height: 100%; - position: absolute; - } - } - - .bui-ScrollAreaThumb { - border-radius: inherit; - background-color: var(--bui-scrollbar-thumb); - width: 100%; - } - - .bui-Select[data-invalid] { - & .bui-SelectTrigger { - border-color: var(--bui-fg-danger); - } - } - - .bui-SelectTrigger { - box-sizing: border-box; - border-radius: var(--bui-radius-3); - border: 1px solid var(--bui-border); - background-color: var(--bui-bg-surface-1); - cursor: pointer; - justify-content: space-between; - align-items: center; - gap: var(--bui-space-2); - width: 100%; - display: flex; - - & svg { - color: var(--bui-fg-secondary); - flex-shrink: 0; - } - - &[data-size="small"] { - height: 2rem; - padding-inline: var(--bui-space-3); - } - - &[data-size="medium"] { - height: 3rem; - padding-inline: var(--bui-space-4); - } - - &[data-size="small"] svg { - width: 1rem; - height: 1rem; - } - - &[data-size="medium"] svg { - width: 1.25rem; - height: 1.25rem; - } - - &::placeholder { - color: var(--bui-fg-secondary); - } - - &:hover { - border-color: var(--bui-border-hover); - transition: border-color .2s ease-in-out, outline-color .2s ease-in-out; - } - - &:focus-visible { - border-color: var(--bui-border-pressed); - outline: 0; - } - - &[data-invalid] { - border-color: var(--bui-fg-danger); - } - - &[data-invalid]:hover, &[data-invalid]:focus-visible { - border-width: 2px; - } - - &[disabled] { - cursor: not-allowed; - border-color: var(--bui-border-disabled); - color: var(--bui-fg-disabled); - } - - &[disabled] .bui-SelectValue { - color: var(--bui-fg-disabled); - } - - &[data-popup-open] .bui-SelectIcon { - transform: rotate(180deg); - } - } - - .bui-SelectValue { - text-overflow: ellipsis; - white-space: nowrap; - width: 100%; - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-primary); - text-align: left; - overflow: hidden; - - & .bui-SelectItemIndicator { - display: none; - } - - &[disabled] { - color: var(--bui-fg-disabled); - } - } - - .bui-SelectItem { - width: var(--anchor-width); - padding-block: var(--bui-space-2); - padding-left: var(--bui-space-3); - padding-right: var(--bui-space-4); - color: var(--bui-fg-primary); - border-radius: var(--bui-radius-3); - cursor: pointer; - user-select: none; - font-size: var(--bui-font-size-3); - align-items: center; - gap: var(--bui-space-1); - outline: none; - grid-template-columns: 1rem 1fr; - grid-template-areas: "icon text"; - display: grid; - position: relative; - - &[data-focused] { - z-index: 0; - color: var(--bui-fg-primary); - position: relative; - } - - &[data-focused]:before { - content: ""; - z-index: -1; - background-color: var(--bui-bg-tint-hover); - border-radius: .25rem; - position: absolute; - inset-block: 0; - inset-inline: .25rem; - } - - &[data-disabled] { - cursor: not-allowed; - color: var(--bui-fg-disabled); - } - - &[data-selected] .bui-SelectItemIndicator { - opacity: 1; - } - } - - .bui-SelectItemIndicator { - opacity: 0; - grid-area: icon; - justify-content: center; - align-items: center; - transition: opacity .2s ease-in-out; - display: flex; - } - - .bui-SelectItemLabel { - flex: 1; - grid-area: text; - } - - .bui-Switch { - align-items: center; - gap: var(--bui-space-3); - font-size: var(--bui-font-size-3); - color: var(--bui-fg-primary); - cursor: pointer; - display: flex; - position: relative; - - &[data-pressed] .bui-SwitchIndicator { - &:before { - background: var(--bui-fg-solid); - } - } - - &[data-selected] { - & .bui-SwitchIndicator { - background: var(--bui-bg-solid); - - &:before { - background: var(--bui-fg-solid); - transform: translateX(100%); - } - } - - &[data-pressed] { - & .indicator { - background: var(--bui-gray-3); - } - } - } - - &[data-focus-visible] .bui-SwitchIndicator { - outline-offset: 2px; - outline: 2px solid; - } - } - - .bui-SwitchIndicator { - background: var(--bui-gray-3); - border: 2px; - border-radius: 1.143rem; - width: 2rem; - height: 1.143rem; - transition: all .2s; - - &:before { - content: ""; - background: var(--bui-fg-solid); - border-radius: 16px; - width: .857rem; - height: .857rem; - margin: .143rem; - transition: all .2s; - display: block; - } - } -} +@layer components; @layer utilities { .bui-p { @@ -10848,364 +9244,3 @@ } @layer legacy; - -.bui-DialogOverlay { - z-index: 1000; - background: #e8e8e8cc; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - display: flex; - position: fixed; - top: 0; - left: 0; -} - -[data-theme="dark"] .bui-Dialog { - background: #00000080; -} - -.bui-DialogOverlay[data-entering] { - animation: .2s ease-out forwards fade-in; -} - -.bui-DialogOverlay[data-exiting] { - animation: .15s ease-out forwards fade-out; -} - -.bui-Dialog { - background: var(--bui-bg-surface-1); - border: 1px solid var(--bui-border); - color: var(--bui-fg-primary); - width: min(var(--bui-dialog-min-width, 400px), calc(100vw - 3rem)); - max-width: calc(100vw - 3rem); - height: min(var(--bui-dialog-min-height, auto), calc(100vh - 3rem)); - border-radius: .5rem; - outline: none; - flex-direction: column; - max-height: calc(100vh - 3rem); - display: flex; - position: relative; -} - -.bui-DialogOverlay[data-entering] .bui-Dialog { - animation: .15s ease-out forwards dialog-enter; -} - -.bui-DialogOverlay[data-exiting] .bui-Dialog { - animation: .15s ease-out forwards dialog-exit; -} - -.bui-DialogHeader { - padding-inline: var(--bui-space-3); - padding-block: var(--bui-space-2); - border-bottom: 1px solid var(--bui-border); - justify-content: space-between; - align-items: center; - display: flex; -} - -.bui-DialogHeaderTitle { - font-size: var(--bui-font-size-3); - font-weight: var(--bui-font-weight-bold); - margin: 0; -} - -.bui-DialogFooter { - justify-content: end; - align-items: center; - gap: var(--bui-space-2); - padding-inline: var(--bui-space-3); - padding-block: var(--bui-space-3); - border-top: 1px solid var(--bui-border); - display: flex; -} - -.bui-DialogBody { - padding: var(--bui-space-3); - flex: 1; - overflow-y: auto; -} - -@keyframes fade-in { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes fade-out { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@keyframes dialog-enter { - from { - opacity: .5; - transform: scale(.8); - } - - to { - opacity: 1; - transform: scale(1); - } -} - -@keyframes dialog-exit { - from { - opacity: 1; - transform: scale(1); - } - - to { - opacity: 0; - transform: scale(.95); - } -} - -.bui-MenuPopover { - border: 1px solid var(--bui-border); - border-radius: var(--bui-radius-2); - background: var(--bui-bg-surface-1); - color: var(--bui-fg-primary); - outline: none; - flex-direction: column; - min-height: 0; - transition: transform .2s, opacity .2s; - display: flex; - overflow: hidden; - - &[data-entering], &[data-exiting] { - transform: var(--origin); - opacity: 0; - } - - &[data-placement="top"] { - --origin: translateY(8px); - } - - &[data-placement="bottom"] { - --origin: translateY(-8px); - } - - &[data-placement="right"] { - --origin: translateX(-8px); - } - - &[data-placement="left"] { - --origin: translateX(8px); - } -} - -.bui-MenuContent { - max-height: inherit; - box-sizing: border-box; - min-width: 150px; - padding-block: var(--bui-space-1); - outline: none; - overflow: auto; -} - -.bui-MenuPopover .bui-ScrollAreaRoot { - flex-direction: column; - flex: 1; - height: 100%; - min-height: 0; - display: flex; -} - -.bui-MenuPopover .bui-ScrollAreaScrollbar { - margin-inline: var(--bui-space-1_5); -} - -.bui-MenuItem { - padding-inline: var(--bui-space-1); - display: block; - - &[data-focused] .bui-MenuItemWrapper, &[data-open] .bui-MenuItemWrapper { - background: var(--bui-bg-surface-2); - color: var(--bui-fg-primary); - } - - &[data-color="danger"] .bui-MenuItemWrapper { - color: var(--bui-fg-danger); - } - - &[data-color="danger"][data-focused] .bui-MenuItemWrapper { - background: var(--bui-bg-danger); - color: var(--bui-fg-danger); - } - - &[data-has-submenu] { - & > .bui-MenuItemWrapper > .bui-MenuItemArrow { - display: block; - } - } -} - -.bui-MenuItemWrapper { - height: 2rem; - padding-inline: var(--bui-space-2); - border-radius: var(--bui-radius-2); - cursor: default; - color: var(--bui-fg-primary); - font-size: var(--bui-font-size-3); - justify-content: space-between; - align-items: center; - gap: var(--bui-space-6); - outline: none; - display: flex; -} - -.bui-MenuItemListBox { - padding-inline: var(--bui-space-1); - display: block; - - &:hover .bui-MenuItemWrapper { - background: var(--bui-bg-surface-2); - color: var(--bui-fg-primary); - } - - &[data-selected] .bui-MenuItemListBoxCheck { - & > svg { - opacity: 1; - color: var(--bui-fg-primary); - } - } -} - -.bui-MenuItemListBoxCheck { - justify-content: center; - align-items: center; - width: 1rem; - height: 1rem; - display: flex; - - & > svg { - opacity: 0; - width: 1rem; - height: 1rem; - } -} - -.bui-MenuItemContent { - align-items: center; - gap: var(--bui-space-2); - display: flex; - - & > svg { - width: 1rem; - height: 1rem; - } -} - -.bui-MenuItemArrow { - width: 1rem; - height: 1rem; - display: none; - - & > svg { - width: 1rem; - height: 1rem; - } -} - -.bui-MenuSection { - &:first-child .bui-MenuSectionHeader { - padding-top: 0; - } -} - -.bui-MenuSectionHeader { - height: 2rem; - padding-top: var(--bui-space-3); - padding-left: var(--bui-space-3); - color: var(--bui-fg-primary); - font-size: var(--bui-font-size-1); - letter-spacing: .05rem; - text-transform: uppercase; - align-items: center; - font-weight: bold; - display: flex; -} - -.bui-MenuSeparator { - background: var(--bui-border); - height: 1px; - margin-inline: var(--bui-space-1_5); - margin-block: var(--bui-space-1); -} - -.bui-MenuSearchField { - font-family: var(--bui-font-regular); - flex-shrink: 0; - width: 100%; - position: relative; - - &[data-empty] { - & .bui-MenuSearchFieldClear { - display: none; - } - } -} - -.bui-MenuSearchFieldInput { - padding: 0 var(--bui-space-3); - border: none; - border-bottom: 1px solid var(--bui-border); - background-color: var(--bui-bg-surface-1); - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); - color: var(--bui-fg-primary); - width: 100%; - height: 2rem; - cursor: inherit; - outline: none; - align-items: center; - display: flex; - - &::-webkit-search-cancel-button, &::-webkit-search-decoration { - -webkit-appearance: none; - } -} - -.bui-MenuSearchFieldClear { - right: var(--bui-space-2); - cursor: pointer; - color: var(--bui-fg-secondary); - background-color: #0000; - border: none; - justify-content: center; - align-items: center; - margin: 0; - padding: 0; - transition: color .2s ease-in-out; - display: flex; - position: absolute; - top: 0; - bottom: 0; - - & > svg { - width: 1rem; - height: 1rem; - } -} - -.bui-MenuEmptyState { - padding-inline: var(--bui-space-3); - padding-block: var(--bui-space-2); - color: var(--bui-fg-secondary); - font-size: var(--bui-font-size-3); - font-family: var(--bui-font-regular); - font-weight: var(--bui-font-weight-regular); -} diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 0f0ac5a8d8..738b35e047 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -481,6 +481,11 @@ export const componentDefinitions: { readonly footer: 'bui-DialogFooter'; }; }; + readonly FieldError: { + readonly classNames: { + readonly root: 'bui-FieldError'; + }; + }; readonly FieldLabel: { readonly classNames: { readonly root: 'bui-FieldLabelWrapper'; @@ -700,6 +705,14 @@ export const componentDefinitions: { readonly cellProfileLink: 'bui-TableCellProfileLink'; }; }; + readonly TablePagination: { + readonly classNames: { + readonly root: 'bui-TablePagination'; + readonly left: 'bui-TablePaginationLeft'; + readonly right: 'bui-TablePaginationRight'; + readonly select: 'bui-TablePaginationSelect'; + }; + }; readonly Tabs: { readonly classNames: { readonly tabs: 'bui-Tabs'; diff --git a/packages/ui/src/components/Avatar/Avatar.styles.css b/packages/ui/src/components/Avatar/Avatar.module.css similarity index 100% rename from packages/ui/src/components/Avatar/Avatar.styles.css rename to packages/ui/src/components/Avatar/Avatar.module.css diff --git a/packages/ui/src/components/Avatar/Avatar.tsx b/packages/ui/src/components/Avatar/Avatar.tsx index 4e899170de..de69ff24fa 100644 --- a/packages/ui/src/components/Avatar/Avatar.tsx +++ b/packages/ui/src/components/Avatar/Avatar.tsx @@ -19,6 +19,7 @@ import { Avatar as AvatarPrimitive } from '@base-ui-components/react/avatar'; import clsx from 'clsx'; import { AvatarProps } from './types'; import { useStyles } from '../../hooks/useStyles'; +import styles from './Avatar.module.css'; /** @public */ export const Avatar = forwardRef< @@ -33,12 +34,17 @@ export const Avatar = forwardRef< return ( - - + + {(name || '') .split(' ') .map(word => word[0]) diff --git a/packages/ui/src/components/Box/styles.css b/packages/ui/src/components/Box/Box.module.css similarity index 100% rename from packages/ui/src/components/Box/styles.css rename to packages/ui/src/components/Box/Box.module.css diff --git a/packages/ui/src/components/Box/Box.tsx b/packages/ui/src/components/Box/Box.tsx index 2bb4e3cd15..fdcee3d382 100644 --- a/packages/ui/src/components/Box/Box.tsx +++ b/packages/ui/src/components/Box/Box.tsx @@ -18,6 +18,7 @@ import { createElement, forwardRef } from 'react'; import { BoxProps } from './types'; import clsx from 'clsx'; import { useStyles } from '../../hooks/useStyles'; +import styles from './Box.module.css'; /** @public */ export const Box = forwardRef((props, ref) => { @@ -32,7 +33,12 @@ export const Box = forwardRef((props, ref) => { as, { ref, - className: clsx(classNames.root, utilityClasses, className), + className: clsx( + classNames.root, + styles[classNames.root], + utilityClasses, + className, + ), style, ...rest, }, diff --git a/packages/ui/src/components/Button/styles.css b/packages/ui/src/components/Button/Button.module.css similarity index 100% rename from packages/ui/src/components/Button/styles.css rename to packages/ui/src/components/Button/Button.module.css diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 610f29b9b0..d22a3036e6 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -19,6 +19,7 @@ import { forwardRef, Ref } from 'react'; import { Button as RAButton } from 'react-aria-components'; import type { ButtonProps } from './types'; import { useStyles } from '../../hooks/useStyles'; +import styles from './Button.module.css'; /** @public */ export const Button = forwardRef( @@ -33,7 +34,7 @@ export const Button = forwardRef( return ( ((props, ref) => { const { classNames } = useStyles('Card'); return ( -
+
); }); @@ -50,7 +55,15 @@ export const CardHeader = forwardRef( const { classNames } = useStyles('Card'); return ( -
+
); }, ); @@ -68,7 +81,7 @@ export const CardBody = forwardRef( return ( @@ -96,7 +109,15 @@ export const CardFooter = forwardRef( const { classNames } = useStyles('Card'); return ( -
+
); }, ); diff --git a/packages/ui/src/components/Checkbox/styles.css b/packages/ui/src/components/Checkbox/Checkbox.module.css similarity index 100% rename from packages/ui/src/components/Checkbox/styles.css rename to packages/ui/src/components/Checkbox/Checkbox.module.css diff --git a/packages/ui/src/components/Checkbox/Checkbox.tsx b/packages/ui/src/components/Checkbox/Checkbox.tsx index 51f1fad4de..a2e22fb9e8 100644 --- a/packages/ui/src/components/Checkbox/Checkbox.tsx +++ b/packages/ui/src/components/Checkbox/Checkbox.tsx @@ -20,6 +20,7 @@ import { Icon } from '../..'; import type { CheckboxProps } from './types'; import { useStyles } from '../../hooks/useStyles'; import clsx from 'clsx'; +import styles from './Checkbox.module.css'; /** @public */ export const Checkbox = forwardRef( @@ -41,7 +42,7 @@ export const Checkbox = forwardRef( const checkboxElement = ( ( value={value} style={style} > - + ); return label ? ( -