Skip to content

Commit 5aa0b0d

Browse files
committed
feat: options change
1 parent 8edad63 commit 5aa0b0d

21 files changed

+2539
-326
lines changed

example/index.html

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,19 @@
33
<head>
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<title>Cesium Wind Layer Example</title>
7-
<style>
8-
html, body, #cesiumContainer {
9-
width: 100%;
10-
height: 100%;
11-
margin: 0;
12-
padding: 0;
13-
overflow: hidden;
14-
}
15-
#sceneModePicker {
16-
position: absolute;
17-
top: 10px;
18-
right: 20px;
19-
width: 30px;
20-
height: 30px;
21-
}
22-
</style>
6+
<title>Cesium Wind Layer Demo</title>
237
</head>
8+
<style>
9+
html, body, #root {
10+
width: 100%;
11+
height: 100%;
12+
margin: 0;
13+
padding: 0;
14+
overflow: hidden;
15+
}
16+
</style>
2417
<body>
25-
<div id="cesiumContainer"></div>
26-
<script type="module" src="/src/main.ts"></script>
27-
<div id="sceneModePicker"></div>
18+
<div id="root"></div>
19+
<script type="module" src="/src/main.tsx"></script>
2820
</body>
29-
</html>
21+
</html>

example/package.json

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
{
22
"name": "example",
33
"private": true,
4-
"version": "0.0.3",
4+
"version": "0.0.0",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",
8-
"build": "pnpm run build:deps && vite build",
9-
"build:deps": "turbo run build --filter=cesium-wind-layer",
10-
"preview": "vite preview",
11-
"lint": "eslint src --ext .ts,.tsx",
12-
"lint:fix": "eslint src --ext .ts,.tsx --fix"
8+
"build": "vite build",
9+
"preview": "vite preview"
1310
},
1411
"dependencies": {
12+
"@ant-design/icons": "^5.5.1",
13+
"antd": "^5.21.5",
1514
"cesium": "^1.122.0",
16-
"cesium-wind-layer": "workspace:*"
15+
"cesium-wind-layer": "workspace:*",
16+
"d3-scale-chromatic": "^3.1.0",
17+
"react": "^18.3.1",
18+
"react-dom": "^18.3.1",
19+
"styled-components": "^6.1.13"
1720
},
1821
"devDependencies": {
19-
"typescript": "^5.5.3",
20-
"vite": "^4.5.3",
21-
"vite-plugin-cesium": "^1.2.22"
22+
"@types/d3-scale-chromatic": "^3.0.3",
23+
"@types/react": "^18.3.12",
24+
"@types/react-dom": "^18.3.1",
25+
"@types/styled-components": "^5.1.34",
26+
"@vitejs/plugin-react": "^4.3.3",
27+
"typescript": "^5.6.3",
28+
"vite": "^5.4.10",
29+
"vite-plugin-cesium": "^1.2.23"
2230
}
23-
}
31+
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import React, { useState } from 'react';
2+
import { Select } from 'antd';
3+
import {
4+
interpolateRainbow,
5+
interpolateViridis,
6+
interpolateCool,
7+
interpolateWarm,
8+
interpolateInferno,
9+
interpolateMagma,
10+
interpolatePlasma,
11+
interpolateBlues,
12+
interpolateGreens,
13+
interpolateOranges,
14+
interpolateReds,
15+
interpolatePurples,
16+
} from 'd3-scale-chromatic';
17+
import styled from 'styled-components';
18+
19+
const ColorPreview = styled.div`
20+
display: flex;
21+
height: 10px; // Reduced height from 20px to 10px
22+
width: 100%;
23+
`;
24+
25+
const ColorSegment = styled.div<{ color: string }>`
26+
flex: 1;
27+
background-color: ${(props) => props.color};
28+
`;
29+
30+
interface ColorTableInputProps {
31+
value?: string[];
32+
onChange?: (value: string[]) => void;
33+
}
34+
35+
const generateColorTable = (
36+
interpolator: (t: number) => string,
37+
reverse: boolean = false,
38+
): string[] => {
39+
const segments = 20;
40+
const colors = Array.from({ length: segments }).map((_, i) => {
41+
return interpolator(i / (segments - 1));
42+
});
43+
if (reverse) {
44+
return colors.reverse();
45+
}
46+
return colors;
47+
};
48+
49+
export const colorSchemes = [
50+
{ label: 'Rainbow', value: 'rainbow', interpolator: interpolateRainbow, reverse: true },
51+
{ label: 'Viridis', value: 'viridis', interpolator: interpolateViridis },
52+
{ label: 'Cool', value: 'cool', interpolator: interpolateCool },
53+
{ label: 'Warm', value: 'warm', interpolator: interpolateWarm },
54+
{ label: 'Inferno', value: 'inferno', interpolator: interpolateInferno },
55+
{ label: 'Magma', value: 'magma', interpolator: interpolateMagma },
56+
{ label: 'Plasma', value: 'plasma', interpolator: interpolatePlasma },
57+
{ label: 'Blues', value: 'blues', interpolator: interpolateBlues },
58+
{ label: 'Greens', value: 'greens', interpolator: interpolateGreens },
59+
{ label: 'Oranges', value: 'oranges', interpolator: interpolateOranges },
60+
{ label: 'Reds', value: 'reds', interpolator: interpolateReds },
61+
{ label: 'Purples', value: 'purples', interpolator: interpolatePurples },
62+
].map((item) => ({
63+
...item,
64+
colors: generateColorTable(item.interpolator, item.reverse),
65+
}));
66+
67+
const ColorTableInput: React.FC<ColorTableInputProps> = ({
68+
value = [],
69+
onChange,
70+
}) => {
71+
const [selectedScheme, setSelectedScheme] = useState(() => {
72+
// Find matching color scheme
73+
const matchingScheme = colorSchemes.find(
74+
(scheme) => JSON.stringify(scheme.colors) === JSON.stringify(value),
75+
);
76+
return matchingScheme ? matchingScheme.value : 'rainbow';
77+
});
78+
79+
const handleChange = (newValue: string) => {
80+
setSelectedScheme(newValue);
81+
const scheme = colorSchemes.find((s) => s.value === newValue);
82+
if (scheme) {
83+
onChange?.(scheme.colors);
84+
}
85+
};
86+
87+
const renderColorPreview = (scheme: (typeof colorSchemes)[0]) => {
88+
const segments = 20;
89+
return (
90+
<ColorPreview>
91+
{Array.from({ length: segments }).map((_, i) => (
92+
<ColorSegment
93+
key={i}
94+
color={scheme.interpolator(i / (segments - 1))}
95+
/>
96+
))}
97+
</ColorPreview>
98+
);
99+
};
100+
101+
return (
102+
<Select
103+
style={{ width: '100%' }}
104+
value={selectedScheme}
105+
onChange={handleChange}
106+
labelRender={(selectedValue) => {
107+
const scheme = colorSchemes.find(
108+
(s) => s.value === selectedValue.value,
109+
);
110+
return scheme ? renderColorPreview(scheme) : null;
111+
}}
112+
options={colorSchemes.map((scheme) => ({
113+
value: scheme.value,
114+
label: (
115+
<div>
116+
<div>{scheme.label}</div>
117+
{renderColorPreview(scheme)}
118+
</div>
119+
),
120+
}))}
121+
/>
122+
);
123+
};
124+
125+
export default ColorTableInput;

0 commit comments

Comments
 (0)