List components #31

Merged
stne3960 merged 68 commits from list_item into main 2025-12-18 12:41:13 +01:00
4 changed files with 14 additions and 21 deletions
Showing only changes of commit 9c8c3bda86 - Show all commits

View File

@ -30,10 +30,10 @@ const widthClasses: Record<ComboboxSize, string> = {
const dropdownWrapperClasses = 'absolute top-full left-0 z-50 w-full mt-(--spacing-sm)'; const dropdownWrapperClasses = 'absolute top-full left-0 z-50 w-full mt-(--spacing-sm)';
function SearchIcon({ style }: { style?: React.CSSProperties }) { function SearchIcon({ className }: { className?: string }) {
return ( return (
<svg <svg
style={style} className={className}
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
@ -208,10 +208,10 @@ export default function Combobox({
: customWidth : customWidth
? 'relative' ? 'relative'
: `relative ${widthClasses[size]}`; : `relative ${widthClasses[size]}`;
const containerStyle = customWidth ? { width: customWidth } : undefined; const widthStyle = customWidth ? { width: customWidth } : undefined;
return ( return (
<div ref={containerRef} className={containerClasses} style={containerStyle}> <div ref={containerRef} className={containerClasses} style={widthStyle}>
<TextInput <TextInput
value={displayValue} value={displayValue}
onChange={handleInputChange} onChange={handleInputChange}

View File

@ -1,4 +1,4 @@
import type { HTMLAttributes, CSSProperties } from 'react'; import type { HTMLAttributes } from 'react';
export interface ListCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> { export interface ListCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
title: string; title: string;
@ -14,15 +14,12 @@ const baseClasses = [
'focus-visible:border-primary focus-visible:border-[length:var(--border-width-sm)] focus-visible:outline focus-visible:outline-sky-100 focus-visible:outline-[length:var(--border-width-lg)]', 'focus-visible:border-primary focus-visible:border-[length:var(--border-width-sm)] focus-visible:outline focus-visible:outline-sky-100 focus-visible:outline-[length:var(--border-width-lg)]',
].join(' '); ].join(' ');
const iconStyles: CSSProperties = { const removeIconClasses = 'w-(--font-size-body-md) h-(--font-size-body-md)';
width: 'var(--font-size-body-md)',
height: 'var(--font-size-body-md)',
};
function RemoveIcon({ style }: { style?: CSSProperties }) { function RemoveIcon() {
return ( return (
<svg <svg
style={style} className={removeIconClasses}
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
@ -58,7 +55,7 @@ export default function ListCard({ title, subtitle = '', onRemove, className = '
onClick={onRemove} onClick={onRemove}
className="shrink-0 ml-(--spacing-sm) text-base-ink-placeholder group-hover:text-base-ink-max group-focus-visible:text-base-ink-max focus-visible:outline-none cursor-pointer" className="shrink-0 ml-(--spacing-sm) text-base-ink-placeholder group-hover:text-base-ink-max group-focus-visible:text-base-ink-max focus-visible:outline-none cursor-pointer"
> >
<RemoveIcon style={iconStyles} /> <RemoveIcon />
</button> </button>
)} )}
</div> </div>

View File

@ -1,4 +1,4 @@
import type { HTMLAttributes, CSSProperties } from 'react'; import type { HTMLAttributes } from 'react';
export interface ListItemProps extends HTMLAttributes<HTMLDivElement> { export interface ListItemProps extends HTMLAttributes<HTMLDivElement> {
title: string; title: string;
@ -7,22 +7,18 @@ export interface ListItemProps extends HTMLAttributes<HTMLDivElement> {
focused?: boolean; focused?: boolean;
} }
const iconStyles: CSSProperties = { const checkmarkIconClasses = 'w-(--font-size-body-md) h-(--font-size-body-md) ml-(--spacing-sm)';
width: 'var(--font-size-body-md)',
height: 'var(--font-size-body-md)',
marginLeft: 'var(--spacing-sm)',
};
function CheckmarkIcon() { function CheckmarkIcon() {
return ( return (
<svg <svg
className={checkmarkIconClasses}
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
strokeWidth="2" strokeWidth="2"
strokeLinecap="round" strokeLinecap="round"
strokeLinejoin="round" strokeLinejoin="round"
style={iconStyles}
> >
<polyline points="20 6 9 17 4 12" /> <polyline points="20 6 9 17 4 12" />
</svg> </svg>

View File

@ -44,10 +44,10 @@ export default function ParticipantPicker({
: customWidth : customWidth
? 'flex flex-col gap-(--spacing-sm)' ? 'flex flex-col gap-(--spacing-sm)'
: `flex flex-col gap-(--spacing-sm) ${widthClasses[size]}`; : `flex flex-col gap-(--spacing-sm) ${widthClasses[size]}`;
const containerStyle = customWidth ? { width: customWidth } : undefined; const widthStyle = customWidth ? { width: customWidth } : undefined;
return ( return (
<div className={containerClasses} style={containerStyle}> <div className={containerClasses} style={widthStyle}>
<Combobox <Combobox
options={options} options={options}
value={value} value={value}