Skip to content

Commit

Permalink
feat: add measurement color preview (#399)
Browse files Browse the repository at this point in the history
Closes: #388
  • Loading branch information
targos authored Nov 21, 2022
1 parent 4195952 commit 14c5942
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 36 deletions.
17 changes: 17 additions & 0 deletions src/app/panels/measurements/MeasurementColorPreview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ColorConfig } from '../../../app-data/index';
import { ColorPreview } from '../../../components/index';

interface MeasurementColorPreviewProps {
color: ColorConfig;
}

export default function MeasurementColorPreview(
props: MeasurementColorPreviewProps,
) {
const { color } = props;
return (
<div style={{ width: '1em', height: '1em' }}>
<ColorPreview color={color} />{' '}
</div>
);
}
8 changes: 7 additions & 1 deletion src/app/panels/measurements/MeasurementsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
Tabs,
} from '../../../components/index';

import MeasurementColorPreview from './MeasurementColorPreview';
import MeasurementVisibilityToggle from './MeasurementVisibilityToggle';

export function MeasurementsPanel() {
Expand All @@ -37,11 +38,16 @@ export function MeasurementsPanel() {
</Table.Header>
{data.measurements[kind].entries.map((measurement: MeasurementBase) => (
<Table.Row key={measurement.id}>
<ValueRenderers.Component>
<ValueRenderers.Component
style={{ display: 'flex', flexDirection: 'row', gap: '0.5em' }}
>
<MeasurementVisibilityToggle
id={measurement.id}
isVisible={view.measurements[measurement.id].visible}
/>
<MeasurementColorPreview
color={view.measurements[measurement.id].color}
/>
</ValueRenderers.Component>
<ValueRenderers.Title
style={{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useRef } from 'react';
import { useModifiedPopper } from '../../hooks/useModifiedPopper';
import { useOnClickOutside } from '../../hooks/useOnClickOutside';
import { useOnOff } from '../../hooks/useOnOff';
import FixedColorPreview from '../preview/FixedColorPreview';
import { ColorPicker, ColorPickerProps } from '../react-color/ColorPicker';
import * as colorHelper from '../react-color/helpers/color';

Expand Down Expand Up @@ -49,10 +50,9 @@ export function ColorPickerDropdown(props: ColorPickerDopdpownProps) {
css={colorPickerDropdownCss.root}
onClick={toggleMenu}
>
<div
css={colorPickerDropdownCss.preview}
style={{ backgroundColor: hex }}
/>
<div css={colorPickerDropdownCss.preview}>
<FixedColorPreview color={hex} />
</div>
</div>
{isOpened && (
<div ref={setPopperElement} {...popperProps}>
Expand Down
26 changes: 0 additions & 26 deletions src/components/color-picker/gradient-select/GradientPreview.tsx

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import * as scaleChromatic from 'd3-scale-chromatic';
import { Fragment } from 'react';
import { FaChevronDown } from 'react-icons/fa';

import GradientPreview from './GradientPreview';
import FixedGradientPreview from '../preview/FixedGradientPreview';

const scales = {
export const scales = {
turbo: scaleChromatic.interpolateTurbo,
viridis: scaleChromatic.interpolateViridis,
inferno: scaleChromatic.interpolateInferno,
Expand Down Expand Up @@ -69,7 +69,7 @@ export function GradientSelect(props: GradientSelectProps) {
<Listbox value={value} onChange={onChange}>
<GradientSelectListbox>
<Listbox.Button as={GradientSelectButton}>
<GradientPreview scale={scales[value]} />
<FixedGradientPreview gradient={value} />
<GradientSelectChevron />
</Listbox.Button>
<Listbox.Options as={GradientSelectOptions}>
Expand All @@ -79,7 +79,7 @@ export function GradientSelect(props: GradientSelectProps) {
<GradientSelectOption active={active}>
{option}
<div style={{ height: 15 }}>
<GradientPreview scale={scales[option]} />
<FixedGradientPreview gradient={option} />
</div>
</GradientSelectOption>
)}
Expand Down
1 change: 1 addition & 0 deletions src/components/color-picker/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './color-picker-dropdown/ColorPickerDropdown';
export * from './gradient-select/GradientSelect';
export * from './preview/ColorPreview';
export * from './react-color/ColorPicker';
23 changes: 23 additions & 0 deletions src/components/color-picker/preview/ColorPreview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ColorConfig } from '../../../app-data/index';
import { assertUnreachable } from '../../utils/assert';

import FixedColorPreview from './FixedColorPreview';
import FixedGradientPreview from './FixedGradientPreview';

export interface ColorPreviewProps {
color: ColorConfig;
}

export function ColorPreview(props: ColorPreviewProps) {
const { color } = props;
switch (color.kind) {
case 'fixed': {
return <FixedColorPreview color={color.color} />;
}
case 'fixedGradient': {
return <FixedGradientPreview gradient={color.gradient} />;
}
default:
assertUnreachable(color);
}
}
10 changes: 10 additions & 0 deletions src/components/color-picker/preview/FixedColorPreview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
interface FixedColorPreviewProps {
color: string;
}

export default function FixedColorPreview(props: FixedColorPreviewProps) {
const { color } = props;
return (
<div style={{ width: '100%', height: '100%', backgroundColor: color }} />
);
}
31 changes: 31 additions & 0 deletions src/components/color-picker/preview/FixedGradientPreview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { useMemo } from 'react';

import { GradientScaleName, scales } from '../gradient-select/GradientSelect';

interface FixedGradientPreviewProps {
gradient: GradientScaleName;
}

export default function FixedGradientPreview(props: FixedGradientPreviewProps) {
const { gradient } = props;
const scale = scales[gradient];

const gradientCss = useMemo(() => {
const stops: string[] = [];
for (let i = 0; i <= 100; i++) {
stops.push(scale(i / 100));
}
return `linear-gradient(to right, ${stops.join(', ')})`;
}, [scale]);

return (
<div
style={{
width: '100%',
height: '100%',
borderRadius: '0.125rem',
background: gradientCss,
}}
/>
);
}
2 changes: 1 addition & 1 deletion stories/components/color-picker-dropdown.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useState } from 'react';
import { ColorPickerDropdown } from '../../src/components/index';

export default {
title: 'Components / Color Pickers Dropdown',
title: 'Components / Color Pickers',
};

export function ColorPickerDropdownStory() {
Expand Down

0 comments on commit 14c5942

Please sign in to comment.