diff --git a/frontend/src/components/modals/GroupRectModal.module.css b/frontend/src/components/modals/GroupRectModal.module.css new file mode 100644 index 0000000..65194c0 --- /dev/null +++ b/frontend/src/components/modals/GroupRectModal.module.css @@ -0,0 +1,41 @@ +/* Slider container: strip native chrome so custom track/thumb align cleanly */ +.slider-thumb { + -webkit-appearance: none; + appearance: none; + background: transparent; + height: 13px; /* match thumb height so vertical centering is the input's box center */ +} +.slider-thumb:focus { + outline: none; +} + +/* Track */ +.slider-accent::-webkit-slider-runnable-track { + height: 4px; + background: #00d4ff; + border-radius: 2px; +} +.slider-accent::-moz-range-track { + height: 4px; + background: #00d4ff; + border-radius: 2px; +} + +/* Thumb — must offset on webkit so it centers on the 4px track */ +.slider-thumb::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 13px; + height: 13px; + border-radius: 50%; + background: #00d4ff; + border: 2px solid #21262d; + margin-top: -4.5px; /* (13 - 4) / 2 */ +} +.slider-thumb::-moz-range-thumb { + width: 13px; + height: 13px; + border-radius: 50%; + background: #00d4ff; + border: 2px solid #21262d; +} diff --git a/frontend/src/components/modals/GroupRectModal.tsx b/frontend/src/components/modals/GroupRectModal.tsx index 209b57b..051a936 100644 --- a/frontend/src/components/modals/GroupRectModal.tsx +++ b/frontend/src/components/modals/GroupRectModal.tsx @@ -7,6 +7,7 @@ import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import type { TextPosition } from '@/types' import { hexToRgba, rgbaToHex8 } from '@/utils/colorUtils' +import styles from './GroupRectModal.module.css' export type BorderStyle = 'solid' | 'dashed' | 'dotted' | 'double' | 'none' @@ -88,6 +89,8 @@ const TEXT_POSITIONS: { value: TextPosition; label: string }[] = [ { value: 'bottom-right', label: '↘' }, ] +const getFontLabel = (value: string) => FONTS.find((f) => f.value === value)?.label ?? value + interface GroupRectModalProps { open: boolean onClose: () => void @@ -138,8 +141,10 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit
set('z_order', v !== null ? Number(v) : 1)}> - + diff --git a/frontend/src/components/modals/__tests__/GroupRectModal.test.tsx b/frontend/src/components/modals/__tests__/GroupRectModal.test.tsx index 4190bca..6e5506c 100644 --- a/frontend/src/components/modals/__tests__/GroupRectModal.test.tsx +++ b/frontend/src/components/modals/__tests__/GroupRectModal.test.tsx @@ -37,6 +37,16 @@ describe('GroupRectModal', () => { expect(submitted.z_order).toBe(1) }) + it('exposes aria-labels on grid buttons and select triggers', () => { + render() + expect(screen.getByLabelText('Font selector')).toBeDefined() + expect(screen.getByLabelText('Z-order selector')).toBeDefined() + expect(screen.getByLabelText('Text position ↘')).toBeDefined() + expect(screen.getByLabelText('Label position Inside')).toBeDefined() + expect(screen.getByLabelText('Border style Solid')).toBeDefined() + expect(screen.getByLabelText('Border width 1px')).toBeDefined() + }) + it('calls onClose when Cancel is clicked', () => { const onClose = vi.fn() render() @@ -308,3 +318,24 @@ describe('GroupRectModal', () => { expect(screen.getByText(/Background 5%/)).toBeInTheDocument() }) }) + +describe('GroupRectModal font label rendering', () => { + it('renders the human font label in the Select trigger (default inter)', () => { + render() + const trigger = screen.getByLabelText('Font selector') + expect(trigger.textContent).toContain('Inter (sans-serif)') + }) + + it('falls back to raw value when font is unknown', () => { + render( + + ) + const trigger = screen.getByLabelText('Font selector') + expect(trigger.textContent).toContain('comic-sans-9000') + }) +})