From 579e7265fcc980870d4149f7022c0466b97caf40 Mon Sep 17 00:00:00 2001 From: Vixalie Date: Tue, 11 Mar 2025 11:20:47 +0800 Subject: [PATCH] update pattern card action. --- .../pattern-library/Patterns.module.css | 24 ++++++++++++++ .../pattern-library/Patterns.tsx | 33 +++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/page-components/pattern-library/Patterns.module.css b/src/page-components/pattern-library/Patterns.module.css index fb9d34e..abb5571 100644 --- a/src/page-components/pattern-library/Patterns.module.css +++ b/src/page-components/pattern-library/Patterns.module.css @@ -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); + } + } } diff --git a/src/page-components/pattern-library/Patterns.tsx b/src/page-components/pattern-library/Patterns.tsx index 2309e18..3596a7d 100644 --- a/src/page-components/pattern-library/Patterns.tsx +++ b/src/page-components/pattern-library/Patterns.tsx @@ -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 ( +
+
{pattern.name}
+ {duration.toFixed(2)} s +
+ ); +}; + const Patterns: FC = () => { const [rawKeyword, setRawKeyword] = useState(''); const [keyword, setKeyword] = useState(null); @@ -44,6 +68,9 @@ const Patterns: FC = () => {
{patterns.length === 0 &&
No pattern found.
} + {patterns.map((p) => ( + + ))}