调整harmonies预览的动画。
This commit is contained in:
		
							
								
								
									
										51
									
								
								src/page-components/harmonies/HarmonyPreview.module.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/page-components/harmonies/HarmonyPreview.module.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
@layer pages {
 | 
			
		||||
  .preview {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 0 var(--spacing-m);
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    h5 {
 | 
			
		||||
      font-size: var(--font-size-m);
 | 
			
		||||
    }
 | 
			
		||||
    .color_blocks {
 | 
			
		||||
      display: flex;
 | 
			
		||||
      flex-direction: row;
 | 
			
		||||
      justify-content: flex-start;
 | 
			
		||||
      align-items: stretch;
 | 
			
		||||
      flex-wrap: nowrap;
 | 
			
		||||
      gap: var(--spacing-s);
 | 
			
		||||
      .color_block {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
        align-items: stretch;
 | 
			
		||||
        gap: var(--spacing-s);
 | 
			
		||||
        flex-grow: 0;
 | 
			
		||||
        flex-shrink: 1;
 | 
			
		||||
        font-size: var(--font-size-m);
 | 
			
		||||
        transition: flex-grow 300ms, width 300ms;
 | 
			
		||||
        > * {
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
        }
 | 
			
		||||
        .color_square {
 | 
			
		||||
          border-radius: var(--border-radius-xxs);
 | 
			
		||||
          height: 17em;
 | 
			
		||||
        }
 | 
			
		||||
        &.zero_width {
 | 
			
		||||
          width: 0;
 | 
			
		||||
        }
 | 
			
		||||
        .color_ratio {
 | 
			
		||||
          height: 1.5em;
 | 
			
		||||
          padding-inline: var(--spacing-s);
 | 
			
		||||
          font-size: var(--font-size-s);
 | 
			
		||||
        }
 | 
			
		||||
        .color_code {
 | 
			
		||||
          height: 1.5em;
 | 
			
		||||
          padding-inline: var(--spacing-s);
 | 
			
		||||
          font-size: var(--font-size-s);
 | 
			
		||||
          text-transform: uppercase;
 | 
			
		||||
          text-align: right;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								src/page-components/harmonies/HarmonyPreview.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/page-components/harmonies/HarmonyPreview.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
import cx from 'clsx';
 | 
			
		||||
import { constant, flatten, isEqual, take, times } from 'lodash-es';
 | 
			
		||||
import { useMemo } from 'react';
 | 
			
		||||
import { HarmonyColor } from '../../models';
 | 
			
		||||
import styles from './HarmonyPreview.module.css';
 | 
			
		||||
 | 
			
		||||
type HarmonyPreviewProps = {
 | 
			
		||||
  colors?: HarmonyColor[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export function HarmonyPreview({ colors = [] }: HarmonyPreviewProps) {
 | 
			
		||||
  const extendedColors = useMemo(() => {
 | 
			
		||||
    const sortedColors = colors.sort((a, b) => -(a.ratio - b.ratio));
 | 
			
		||||
    if (sortedColors.length >= 4) {
 | 
			
		||||
      return take(sortedColors, 4);
 | 
			
		||||
    }
 | 
			
		||||
    return flatten([
 | 
			
		||||
      ...sortedColors,
 | 
			
		||||
      times(4 - sortedColors.length, constant({ color: '', ratio: 0 })),
 | 
			
		||||
    ]);
 | 
			
		||||
  }, [colors]);
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className={styles.preview}>
 | 
			
		||||
      <h5>Harmony Preview</h5>
 | 
			
		||||
      <div className={styles.color_blocks}>
 | 
			
		||||
        {extendedColors.map(({ color, ratio }, index) => (
 | 
			
		||||
          <div
 | 
			
		||||
            key={index}
 | 
			
		||||
            className={cx(styles.color_block, isEqual(ratio, 0) && styles.zero_width)}
 | 
			
		||||
            style={{ flexGrow: ratio }}>
 | 
			
		||||
            <div className={styles.color_ratio}>{ratio > 0 && `Ratio: ${ratio}`}</div>
 | 
			
		||||
            <div className={styles.color_square} style={{ backgroundColor: `#${color}` }}></div>
 | 
			
		||||
            <div className={styles.color_code}>{ratio > 0 && `#${color}`}</div>
 | 
			
		||||
          </div>
 | 
			
		||||
        ))}
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user