Commit 90a6adb8 authored by Alejandro Celaya's avatar Alejandro Celaya Committed by Alejandro Celaya

Add rounded corners to all components

parent 1269a436
...@@ -19,7 +19,7 @@ function NumberIcon({ badgeCount }: { badgeCount: number }) { ...@@ -19,7 +19,7 @@ function NumberIcon({ badgeCount }: { badgeCount: number }) {
return ( return (
<span <span
className={classnames( className={classnames(
'rounded-[4px] px-1 py-0.5', 'rounded px-1 py-0.5',
// The background color is inherited from the current text color in // The background color is inherited from the current text color in
// the containing button and will vary depending on hover state. // the containing button and will vary depending on hover state.
'bg-current', 'bg-current',
...@@ -238,8 +238,8 @@ export default function AdderToolbar({ ...@@ -238,8 +238,8 @@ export default function AdderToolbar({
// default border values from Tailwind and have to be explicit about all // default border values from Tailwind and have to be explicit about all
// border attributes. // border attributes.
'border border-solid border-grey-3', 'border border-solid border-grey-3',
'absolute select-none bg-white rounded-[4px] shadow-adder-toolbar', 'absolute select-none bg-white rounded shadow-adder-toolbar',
// Start at a very low opacity as we're going to fade in in the animation // Start at a very low opacity as we're going to fade-in in the animation
'opacity-5', 'opacity-5',
{ {
'animate-adder-pop-up': arrowDirection === 'up' && isVisible, 'animate-adder-pop-up': arrowDirection === 'up' && isVisible,
......
...@@ -37,7 +37,7 @@ function ClusterStyleControl({ ...@@ -37,7 +37,7 @@ function ClusterStyleControl({
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-center gap-x-2 text-annotator-base"> <div className="flex items-center gap-x-2 text-annotator-base">
<div <div
className="grow text-color-text px-2 py-1 rounded-[4px]" className="grow text-color-text px-2 py-1 rounded"
style={{ style={{
backgroundColor: highlightStyles[appliedStyleName].color, backgroundColor: highlightStyles[appliedStyleName].color,
}} }}
...@@ -130,9 +130,10 @@ export default function ClusterToolbar({ ...@@ -130,9 +130,10 @@ export default function ClusterToolbar({
} }
return ( return (
<Card> <Card classes="overflow-hidden">
<div className="flex flex-col text-annotator-base text-color-text"> <div className="flex flex-col text-annotator-base text-color-text">
<Button <Button
classes="rounded-none"
data-testid="control-toggle-button" data-testid="control-toggle-button"
onClick={() => setOpen(!isOpen)} onClick={() => setOpen(!isOpen)}
title={isOpen ? 'Hide highlight settings' : 'Show highlight settings'} title={isOpen ? 'Hide highlight settings' : 'Show highlight settings'}
......
...@@ -31,7 +31,7 @@ function ToolbarButton({ icon: Icon, ...buttonProps }: ToolbarButtonProps) { ...@@ -31,7 +31,7 @@ function ToolbarButton({ icon: Icon, ...buttonProps }: ToolbarButtonProps) {
return ( return (
<Button <Button
classes={classnames( classes={classnames(
'justify-center rounded-[4px]', 'justify-center rounded',
'w-[30px] h-[30px]', 'w-[30px] h-[30px]',
'shadow border bg-white text-grey-6 hover:text-grey-9', 'shadow border bg-white text-grey-6 hover:text-grey-9',
)} )}
...@@ -162,7 +162,7 @@ export default function Toolbar({ ...@@ -162,7 +162,7 @@ export default function Toolbar({
classes={classnames( classes={classnames(
'transition-colors focus-visible-ring ring-inset', 'transition-colors focus-visible-ring ring-inset',
// Height and width to align with the sidebar's top bar // Height and width to align with the sidebar's top bar
'h-[40px] w-[33px] pl-[6px]', 'h-[40px] w-[33px] pl-[6px] rounded-bl',
'bg-white text-grey-5 hover:text-grey-9', 'bg-white text-grey-5 hover:text-grey-9',
// Turn on left and bottom borders to continue the // Turn on left and bottom borders to continue the
// border of the sidebar's top bar // border of the sidebar's top bar
......
...@@ -93,7 +93,7 @@ function AnnotationPublishControl({ ...@@ -93,7 +93,7 @@ function AnnotationPublishControl({
<div <div
className={classnames( className={classnames(
// Round the right side of this menu-open button only // Round the right side of this menu-open button only
'flex flex-row rounded-r-sm bg-grey-7 hover:bg-grey-8', 'flex flex-row rounded-r bg-grey-7 hover:bg-grey-8',
)} )}
style={buttonStyle} style={buttonStyle}
> >
......
...@@ -144,7 +144,7 @@ function AnnotationShareControl({ ...@@ -144,7 +144,7 @@ function AnnotationShareControl({
<div <div
// Position this Card above its IconButton. Account for larger // Position this Card above its IconButton. Account for larger
// IconButtons in touch interfaces // IconButtons in touch interfaces
className="absolute bottom-8 right-1 touch:bottom-touch-minimum" className="absolute bottom-8 right-0 touch:bottom-touch-minimum"
> >
<Card <Card
classes={classnames( classes={classnames(
...@@ -195,7 +195,7 @@ function AnnotationShareControl({ ...@@ -195,7 +195,7 @@ function AnnotationShareControl({
{showShareLinks && <ShareLinks shareURI={shareUri} />} {showShareLinks && <ShareLinks shareURI={shareUri} />}
<MenuArrow <MenuArrow
direction="down" direction="down"
classes="bottom-[-8px] right-1 touch:right-[9px]" classes="bottom-[-8px] right-2 touch:right-[9px]"
/> />
</Card> </Card>
</div> </div>
......
...@@ -107,11 +107,11 @@ export default function AutocompleteList<Item>({ ...@@ -107,11 +107,11 @@ export default function AutocompleteList<Item>({
)} )}
data-testid="autocomplete-list-container" data-testid="autocomplete-list-container"
> >
<Card width="auto"> <Card width="auto" classes="overflow-hidden">
<ul tabIndex={-1} aria-label="Suggestions" role="listbox" {...props}> <ul tabIndex={-1} aria-label="Suggestions" role="listbox" {...props}>
{items} {items}
</ul> </ul>
<MenuArrow direction="up" classes="top-[-8px] left-[3px]" /> <MenuArrow direction="up" classes="top-[-8px] left-2" />
</Card> </Card>
</div> </div>
</div> </div>
......
...@@ -225,7 +225,7 @@ function Toolbar({ isPreviewing, onCommand, onTogglePreview }: ToolbarProps) { ...@@ -225,7 +225,7 @@ function Toolbar({ isPreviewing, onCommand, onTogglePreview }: ToolbarProps) {
className={classnames( className={classnames(
// Allow buttons to wrap to second line if necessary. // Allow buttons to wrap to second line if necessary.
'flex flex-wrap w-full items-center', 'flex flex-wrap w-full items-center',
'p-1 border-x border-t rounded-t-[4px] bg-white', 'p-1 border-x border-t rounded-t bg-white',
// For touch interfaces, allow height to scale to larger button targets. // For touch interfaces, allow height to scale to larger button targets.
// Don't wrap buttons but instead scroll horizontally. Add bottom // Don't wrap buttons but instead scroll horizontally. Add bottom
// padding to provide some space for scrollbar. // padding to provide some space for scrollbar.
......
...@@ -232,7 +232,7 @@ export default function Menu({ ...@@ -232,7 +232,7 @@ export default function Menu({
direction="up" direction="up"
classes={classnames( classes={classnames(
// Position menu-arrow caret near bottom right of menu label/toggle control // Position menu-arrow caret near bottom right of menu label/toggle control
'right-0 top-[calc(100%-3px)] w-[15px]', 'right-1 top-[calc(100%-3px)] w-[15px]',
arrowClass, arrowClass,
)} )}
/> />
...@@ -240,11 +240,13 @@ export default function Menu({ ...@@ -240,11 +240,13 @@ export default function Menu({
className={classnames( className={classnames(
'focus-visible-ring', 'focus-visible-ring',
// Position menu content near bottom of menu label/toggle control // Position menu content near bottom of menu label/toggle control
'absolute top-[calc(100%+5px)] z-1 border shadow', 'absolute top-[calc(100%+5px)] z-1',
'bg-white text-md', 'border shadow rounded-lg overflow-hidden bg-white text-md',
{ {
'left-0': align === 'left', 'left-0': align === 'left',
'right-0': align === 'right', // Adding negative right distance so that the menu arrow does
// not overlap with the top-right corner when it's rounded
'-right-1': align === 'right',
}, },
contentClass, contentClass,
)} )}
......
...@@ -239,7 +239,7 @@ export default function MenuItem({ ...@@ -239,7 +239,7 @@ export default function MenuItem({
const wrapperClasses = classnames( const wrapperClasses = classnames(
'focus-visible-ring ring-inset', 'focus-visible-ring ring-inset',
'w-full min-w-[150px] flex items-center select-none', 'w-full min-w-[150px] flex items-center select-none',
'border-b', 'border-b rounded-none cursor-pointer',
// Set this container as a "group" so that children may style based on its // Set this container as a "group" so that children may style based on its
// layout state. // layout state.
// See https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-parent-state // See https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-parent-state
...@@ -263,7 +263,7 @@ export default function MenuItem({ ...@@ -263,7 +263,7 @@ export default function MenuItem({
'border-b-grey-3': isExpanded, 'border-b-grey-3': isExpanded,
'border-b-transparent': !isExpanded, 'border-b-transparent': !isExpanded,
'text-color-text-light': isDisabled, 'text-color-text-light': isDisabled,
'text-color-text': !isDisabled, 'text-color-text hover:text-color-text': !isDisabled,
}, },
); );
......
...@@ -19,7 +19,7 @@ function NavigationButton({ ...buttonProps }: NavigationButtonProps) { ...@@ -19,7 +19,7 @@ function NavigationButton({ ...buttonProps }: NavigationButtonProps) {
<Button <Button
classes={classnames( classes={classnames(
'px-3.5 py-2.5 gap-x-1', 'px-3.5 py-2.5 gap-x-1',
'font-semibold', 'font-semibold rounded',
// These colors are the same as the "dark" variant of IconButton // These colors are the same as the "dark" variant of IconButton
'text-grey-7 bg-grey-2 enabled:hover:text-grey-9 enabled:hover:bg-grey-3', 'text-grey-7 bg-grey-2 enabled:hover:text-grey-9 enabled:hover:bg-grey-3',
'disabled:text-grey-5 aria-pressed:bg-grey-3 aria-expanded:bg-grey-3', 'disabled:text-grey-5 aria-pressed:bg-grey-3 aria-expanded:bg-grey-3',
......
...@@ -39,7 +39,7 @@ function ToastBadge({ ...@@ -39,7 +39,7 @@ function ToastBadge({
return ( return (
<div <div
className={classnames( className={classnames(
'flex items-center gap-x-1 py-1 px-2 rounded-[4px]', 'flex items-center gap-x-1 py-1 px-2 rounded',
'bg-green-success/10 animate-pulse-fade-out', 'bg-green-success/10 animate-pulse-fade-out',
classes, classes,
)} )}
...@@ -97,13 +97,13 @@ export default function ProfileView() { ...@@ -97,13 +97,13 @@ export default function ProfileView() {
// Render save-success message after each successful save, but do not render // Render save-success message after each successful save, but do not render
// it when a "request is in flight". This removal and re-adding across a // it when a "request is in flight". This removal and re-adding across a
// sequence of saves ensures that the browser sees the message as newly- added // sequence of saves ensures that the browser sees the message as newly-added
// to the accessiblity DOM and screen readers should announce it at the // to the accessibility DOM and screen readers should announce it at the
// appropriate times. // appropriate times.
const withSaveMessage = saveCount > 0 && !loading; const withSaveMessage = saveCount > 0 && !loading;
return ( return (
<Card data-testid="profile-container"> <Card data-testid="profile-container" classes="overflow-hidden">
<div <div
className={classnames( className={classnames(
// Ensure there is enough height to clear both the heading text and the // Ensure there is enough height to clear both the heading text and the
......
import { Card, Tab } from '@hypothesis/frontend-shared'; import { Card, Tab } from '@hypothesis/frontend-shared';
import classnames from 'classnames';
import { useState } from 'preact/hooks'; import { useState } from 'preact/hooks';
import { useSidebarStore } from '../../store'; import { useSidebarStore } from '../../store';
...@@ -34,10 +35,12 @@ export default function ShareDialog({ ...@@ -34,10 +35,12 @@ export default function ShareDialog({
const panelTitle = `Share Annotations in ${groupName}`; const panelTitle = `Share Annotations in ${groupName}`;
const tabbedDialog = exportTab || importTab; const tabbedDialog = exportTab || importTab;
const [selectedTab, setSelectedTab] = useState<'share' | 'export' | 'import'>(
// Determine initial selected tab, based on the first tab that will be displayed // Determine initial selected tab, based on the first tab that will be displayed
shareTab ? 'share' : exportTab ? 'export' : 'import', const initialTab = shareTab ? 'share' : exportTab ? 'export' : 'import';
const [selectedTab, setSelectedTab] = useState<'share' | 'export' | 'import'>(
initialTab,
); );
const isFirstTabSelected = tabbedDialog && selectedTab === initialTab;
return ( return (
<SidebarPanel <SidebarPanel
...@@ -85,7 +88,7 @@ export default function ShareDialog({ ...@@ -85,7 +88,7 @@ export default function ShareDialog({
</Tab> </Tab>
)} )}
</TabHeader> </TabHeader>
<Card> <Card classes={classnames({ 'rounded-tl-none': isFirstTabSelected })}>
<TabPanel <TabPanel
id="share-panel" id="share-panel"
active={selectedTab === 'share'} active={selectedTab === 'share'}
......
...@@ -69,6 +69,7 @@ export default function SidebarPanel({ ...@@ -69,6 +69,7 @@ export default function SidebarPanel({
onClose={closePanel} onClose={closePanel}
transitionComponent={Slider} transitionComponent={Slider}
variant={variant} variant={variant}
scrollable={false}
> >
{children} {children}
</Dialog> </Dialog>
......
...@@ -33,7 +33,7 @@ export default function SortMenu() { ...@@ -33,7 +33,7 @@ export default function SortMenu() {
); );
return ( return (
<div className="SortMenu"> <div data-component="SortMenu">
<Menu <Menu
label={menuLabel} label={menuLabel}
title={`Sort by ${sortKey}`} title={`Sort by ${sortKey}`}
......
...@@ -217,7 +217,7 @@ describe('Menu', () => { ...@@ -217,7 +217,7 @@ describe('Menu', () => {
assert.isTrue(wrapper.find(contentSelector).hasClass('left-0')); assert.isTrue(wrapper.find(contentSelector).hasClass('left-0'));
wrapper.setProps({ align: 'right' }); wrapper.setProps({ align: 'right' });
assert.isTrue(wrapper.find(contentSelector).hasClass('right-0')); assert.isTrue(wrapper.find(contentSelector).hasClass('-right-1'));
}); });
it('applies custom content class', () => { it('applies custom content class', () => {
......
...@@ -9,4 +9,14 @@ export default { ...@@ -9,4 +9,14 @@ export default {
// This module references `sidebar-frame` and related classes // This module references `sidebar-frame` and related classes
'./src/annotator/sidebar.{js,ts,tsx}', './src/annotator/sidebar.{js,ts,tsx}',
], ],
theme: {
extend: {
borderRadius: {
// Equivalent to tailwind defaults, but overriding values from frontend-shared preset
// Once the preset stops defining borderRadius, we can remove this
DEFAULT: '0.25rem',
lg: '0.5rem',
},
}
}
}; };
...@@ -24,10 +24,6 @@ export default { ...@@ -24,10 +24,6 @@ export default {
'pulse-fade-out': 'pulse-fade-out 5s ease-in-out forwards', 'pulse-fade-out': 'pulse-fade-out 5s ease-in-out forwards',
'slide-in-from-right': 'slide-in-from-right 0.3s forwards ease-in-out', 'slide-in-from-right': 'slide-in-from-right 0.3s forwards ease-in-out',
}, },
borderRadius: {
// Equivalent to tailwind default `rounded-sm` size
DEFAULT: '0.125rem',
},
boxShadow: { boxShadow: {
'adder-toolbar': '0px 2px 10px 0px rgba(0, 0, 0, 0.25)', 'adder-toolbar': '0px 2px 10px 0px rgba(0, 0, 0, 0.25)',
focus: `0 0 0 2px ${focusBlue}`, focus: `0 0 0 2px ${focusBlue}`,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment