update pattern card action.
This commit is contained in:
		| @@ -24,4 +24,28 @@ | ||||
|     align-items: stretch; | ||||
|     gap: calc(var(--spacing) * 2); | ||||
|   } | ||||
|   .pattern_card { | ||||
|     padding: calc(var(--spacing) * 3) calc(var(--spacing) * 2); | ||||
|     border-radius: calc(var(--border-radius) * 2); | ||||
|     color: var(--color-on-surface); | ||||
|     background-color: var(--color-surface); | ||||
|     display: flex; | ||||
|     flex-direction: row; | ||||
|     align-items: center; | ||||
|     gap: calc(var(--spacing) * 2); | ||||
|     box-shadow: var(--elevation-0); | ||||
|     .name { | ||||
|       flex: 1; | ||||
|     } | ||||
|     &.selected { | ||||
|       background-color: color-mix(in oklch, var(--color-on-surface) 18%, transparent); | ||||
|     } | ||||
|     &:hover { | ||||
|       background-color: color-mix(in oklch, var(--color-on-surface) 8%, transparent); | ||||
|       box-shadow: var(--elevation-2-ambient), var(--elevation-2-umbra); | ||||
|     } | ||||
|     &:active { | ||||
|       background-color: color-mix(in oklch, var(--color-on-surface) 18%, transparent); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,36 @@ | ||||
| import { Icon } from '@iconify/react/dist/iconify.js'; | ||||
| import cx from 'clsx'; | ||||
| import { useAtomValue } from 'jotai'; | ||||
| import { FC, useState } from 'react'; | ||||
| import { useAtom, useAtomValue } from 'jotai'; | ||||
| import { FC, useCallback, useMemo, useState } from 'react'; | ||||
| import { useDebounce } from 'react-use'; | ||||
| import { ScrollArea } from '../../components/ScrollArea'; | ||||
| import { PatternsAtom } from '../../context/Patterns'; | ||||
| import { CurrentPatternAtom, Pattern, PatternsAtom, totalDuration } from '../../context/Patterns'; | ||||
| import styles from './Patterns.module.css'; | ||||
|  | ||||
| const PatternCard: FC<{ pattern: Pattern }> = ({ pattern }) => { | ||||
|   const [currentPattern, setCurrentPattern] = useAtom(CurrentPatternAtom); | ||||
|   const duration = useMemo(() => { | ||||
|     return totalDuration(pattern) / 1000; | ||||
|   }, [pattern]); | ||||
|   const selected = useMemo(() => currentPattern?.id === pattern.id, [currentPattern, pattern]); | ||||
|   const handleSingleClick = useCallback(() => { | ||||
|     if (currentPattern?.id === pattern.id) { | ||||
|       setCurrentPattern(null); | ||||
|     } else { | ||||
|       setCurrentPattern(pattern); | ||||
|     } | ||||
|   }, [pattern, currentPattern]); | ||||
|  | ||||
|   return ( | ||||
|     <div | ||||
|       className={cx(styles.pattern_card, selected && styles.selected)} | ||||
|       onClick={handleSingleClick}> | ||||
|       <h6 className={styles.name}>{pattern.name}</h6> | ||||
|       <span>{duration.toFixed(2)} s</span> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|  | ||||
| const Patterns: FC = () => { | ||||
|   const [rawKeyword, setRawKeyword] = useState<string>(''); | ||||
|   const [keyword, setKeyword] = useState<string | null>(null); | ||||
| @@ -44,6 +68,9 @@ const Patterns: FC = () => { | ||||
|       <ScrollArea enableY> | ||||
|         <div className={styles.pattern_list}> | ||||
|           {patterns.length === 0 && <div className="empty_prompt">No pattern found.</div>} | ||||
|           {patterns.map((p) => ( | ||||
|             <PatternCard key={p.id} pattern={p} /> | ||||
|           ))} | ||||
|         </div> | ||||
|       </ScrollArea> | ||||
|     </div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user