figma-mcp-cli 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/askCopilot.js +51 -0
- package/index.js +10 -3
- package/my-new-project/.env +1 -1
- package/my-new-project/.vscode/settings.json +1 -1
- package/my-new-project/my-app/.env +1 -0
- package/my-new-project/my-app/README.md +73 -0
- package/my-new-project/my-app/eslint.config.js +23 -0
- package/my-new-project/my-app/index.html +13 -0
- package/my-new-project/my-app/package-lock.json +3212 -0
- package/my-new-project/my-app/package.json +30 -0
- package/my-new-project/my-app/public/vite.svg +1 -0
- package/my-new-project/my-app/src/App.css +42 -0
- package/my-new-project/my-app/src/App.tsx +28 -0
- package/my-new-project/my-app/src/FigmaSidebarComponent.css +99 -0
- package/my-new-project/my-app/src/FigmaSidebarComponent.tsx +111 -0
- package/my-new-project/my-app/src/React19AllFeaturesDemo.jsx +111 -0
- package/my-new-project/my-app/src/RenderRightSidebar.css +32 -0
- package/my-new-project/my-app/src/RenderRightSidebar.tsx +73 -0
- package/my-new-project/my-app/src/assets/react.svg +1 -0
- package/my-new-project/my-app/src/components/AccordionSection.tsx +33 -0
- package/my-new-project/my-app/src/components/ChevronIcon.tsx +24 -0
- package/my-new-project/my-app/src/components/EnvironmentScenePanel.tsx +57 -0
- package/my-new-project/my-app/src/components/LightingPanel.tsx +57 -0
- package/my-new-project/my-app/src/components/RenderScalePanel.tsx +34 -0
- package/my-new-project/my-app/src/components/ResolutionPanel.tsx +27 -0
- package/my-new-project/my-app/src/components/SaturationPanel.tsx +27 -0
- package/my-new-project/my-app/src/components/SidebarButton.tsx +27 -0
- package/my-new-project/my-app/src/components/SidebarPreview.tsx +77 -0
- package/my-new-project/my-app/src/index.css +68 -0
- package/my-new-project/my-app/src/main.tsx +10 -0
- package/my-new-project/my-app/src/styles/AccordionSection.css +70 -0
- package/my-new-project/my-app/src/styles/EnvironmentScenePanel.css +104 -0
- package/my-new-project/my-app/src/styles/LightingPanel.css +111 -0
- package/my-new-project/my-app/src/styles/RenderScalePanel.css +67 -0
- package/my-new-project/my-app/src/styles/ResolutionPanel.css +60 -0
- package/my-new-project/my-app/src/styles/SaturationPanel.css +56 -0
- package/my-new-project/my-app/src/styles/SidebarButton.css +81 -0
- package/my-new-project/my-app/src/styles/SidebarPreview.css +92 -0
- package/my-new-project/my-app/tsconfig.app.json +28 -0
- package/my-new-project/my-app/tsconfig.json +7 -0
- package/my-new-project/my-app/tsconfig.node.json +26 -0
- package/my-new-project/my-app/vite.config.ts +7 -0
- package/package.json +2 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import "../styles/LightingPanel.css";
|
|
3
|
+
|
|
4
|
+
interface Light {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
image: string;
|
|
8
|
+
isSelected?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default function LightingPanel() {
|
|
12
|
+
const [lights, setLights] = useState<Light[]>([
|
|
13
|
+
{ id: "1", name: "Daytime", image: "☀️", isSelected: true },
|
|
14
|
+
{ id: "2", name: "Day Lights On", image: "💡", isSelected: false },
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
const toggleLight = (lightId: string) => {
|
|
18
|
+
setLights(
|
|
19
|
+
lights.map((light) =>
|
|
20
|
+
light.id === lightId
|
|
21
|
+
? { ...light, isSelected: !light.isSelected }
|
|
22
|
+
: light
|
|
23
|
+
)
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const addLight = () => {
|
|
28
|
+
const newLight: Light = {
|
|
29
|
+
id: Date.now().toString(),
|
|
30
|
+
name: `Light ${lights.length + 1}`,
|
|
31
|
+
image: "✨",
|
|
32
|
+
isSelected: false,
|
|
33
|
+
};
|
|
34
|
+
setLights([...lights, newLight]);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div className="lighting-panel">
|
|
39
|
+
<button className="add-light-btn" onClick={addLight}>
|
|
40
|
+
<span className="plus-icon">+</span>
|
|
41
|
+
Add light
|
|
42
|
+
</button>
|
|
43
|
+
<div className="lights-grid">
|
|
44
|
+
{lights.map((light) => (
|
|
45
|
+
<button
|
|
46
|
+
key={light.id}
|
|
47
|
+
className={`light-card ${light.isSelected ? "selected" : ""}`}
|
|
48
|
+
onClick={() => toggleLight(light.id)}
|
|
49
|
+
>
|
|
50
|
+
<div className="light-image">{light.image}</div>
|
|
51
|
+
<div className="light-name">{light.name}</div>
|
|
52
|
+
</button>
|
|
53
|
+
))}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import "../styles/RenderScalePanel.css";
|
|
3
|
+
|
|
4
|
+
export default function RenderScalePanel() {
|
|
5
|
+
const [selectedRatio, setSelectedRatio] = useState<string>("16:9");
|
|
6
|
+
|
|
7
|
+
const ratios = [
|
|
8
|
+
["16:9", "9:16", "4:3"],
|
|
9
|
+
["3:4", "1:1"],
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<div className="render-scale-panel">
|
|
14
|
+
<div className="panel-header">Render Scale</div>
|
|
15
|
+
<div className="render-scale-grid">
|
|
16
|
+
{ratios.map((row, rowIdx) => (
|
|
17
|
+
<div key={rowIdx} className="ratio-row">
|
|
18
|
+
{row.map((ratio) => (
|
|
19
|
+
<button
|
|
20
|
+
key={ratio}
|
|
21
|
+
className={`ratio-pill ${
|
|
22
|
+
selectedRatio === ratio ? "active" : ""
|
|
23
|
+
}`}
|
|
24
|
+
onClick={() => setSelectedRatio(ratio)}
|
|
25
|
+
>
|
|
26
|
+
{ratio}
|
|
27
|
+
</button>
|
|
28
|
+
))}
|
|
29
|
+
</div>
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import "../styles/ResolutionPanel.css";
|
|
3
|
+
|
|
4
|
+
export default function ResolutionPanel() {
|
|
5
|
+
const [selectedResolution, setSelectedResolution] = useState<string>("1K SD");
|
|
6
|
+
|
|
7
|
+
const resolutions = ["1K SD", "2K HD", "3K FHD", "4K UHD"];
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="resolution-panel">
|
|
11
|
+
<div className="panel-header">Resolution</div>
|
|
12
|
+
<div className="resolution-grid">
|
|
13
|
+
{resolutions.map((res) => (
|
|
14
|
+
<button
|
|
15
|
+
key={res}
|
|
16
|
+
className={`resolution-pill ${
|
|
17
|
+
selectedResolution === res ? "active" : ""
|
|
18
|
+
}`}
|
|
19
|
+
onClick={() => setSelectedResolution(res)}
|
|
20
|
+
>
|
|
21
|
+
{res}
|
|
22
|
+
</button>
|
|
23
|
+
))}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import "../styles/SaturationPanel.css";
|
|
3
|
+
|
|
4
|
+
export default function SaturationPanel() {
|
|
5
|
+
const [selectedSaturation, setSelectedSaturation] = useState<string>("Low");
|
|
6
|
+
|
|
7
|
+
const saturations = ["Low", "Medium", "High"];
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="saturation-panel">
|
|
11
|
+
<div className="panel-header">Saturation</div>
|
|
12
|
+
<div className="saturation-grid">
|
|
13
|
+
{saturations.map((sat) => (
|
|
14
|
+
<button
|
|
15
|
+
key={sat}
|
|
16
|
+
className={`saturation-pill ${
|
|
17
|
+
selectedSaturation === sat ? "active" : ""
|
|
18
|
+
}`}
|
|
19
|
+
onClick={() => setSelectedSaturation(sat)}
|
|
20
|
+
>
|
|
21
|
+
{sat}
|
|
22
|
+
</button>
|
|
23
|
+
))}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "../styles/SidebarButton.css";
|
|
3
|
+
|
|
4
|
+
interface SidebarButtonProps {
|
|
5
|
+
icon: React.ReactNode;
|
|
6
|
+
label: string;
|
|
7
|
+
isActive: boolean;
|
|
8
|
+
onClick: () => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default function SidebarButton({
|
|
12
|
+
icon,
|
|
13
|
+
label,
|
|
14
|
+
isActive,
|
|
15
|
+
onClick,
|
|
16
|
+
}: SidebarButtonProps) {
|
|
17
|
+
return (
|
|
18
|
+
<button
|
|
19
|
+
className={`sidebar-button ${isActive ? "active" : ""}`}
|
|
20
|
+
onClick={onClick}
|
|
21
|
+
title={label.replace("\n", " ")}
|
|
22
|
+
>
|
|
23
|
+
<div className="sidebar-button-icon">{icon}</div>
|
|
24
|
+
<div className="sidebar-button-label">{label}</div>
|
|
25
|
+
</button>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "../styles/SidebarPreview.css";
|
|
3
|
+
|
|
4
|
+
interface SidebarPreviewProps {
|
|
5
|
+
activeItem: string;
|
|
6
|
+
previewImage: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default function SidebarPreview({
|
|
10
|
+
activeItem,
|
|
11
|
+
previewImage,
|
|
12
|
+
}: SidebarPreviewProps) {
|
|
13
|
+
const getPreviewContent = () => {
|
|
14
|
+
switch (activeItem) {
|
|
15
|
+
case "draw-plan":
|
|
16
|
+
return {
|
|
17
|
+
title: "Draw Plan",
|
|
18
|
+
description:
|
|
19
|
+
"Create and edit floor plans with precision drawing tools.",
|
|
20
|
+
};
|
|
21
|
+
case "furniture-model":
|
|
22
|
+
return {
|
|
23
|
+
title: "Furniture Model",
|
|
24
|
+
description: "Browse and add furniture models to your design.",
|
|
25
|
+
};
|
|
26
|
+
case "generic-model":
|
|
27
|
+
return {
|
|
28
|
+
title: "Generic Model",
|
|
29
|
+
description: "Use generic 3D models for quick prototyping.",
|
|
30
|
+
};
|
|
31
|
+
case "idea":
|
|
32
|
+
return {
|
|
33
|
+
title: "Idea",
|
|
34
|
+
description: "Save and manage your design ideas and inspiration.",
|
|
35
|
+
};
|
|
36
|
+
case "sharing-idea":
|
|
37
|
+
return {
|
|
38
|
+
title: "Sharing Idea",
|
|
39
|
+
description: "Share your ideas and collaborate with team members.",
|
|
40
|
+
};
|
|
41
|
+
case "function-bubble":
|
|
42
|
+
return {
|
|
43
|
+
title: "Function Bubble",
|
|
44
|
+
description: "Interactive annotations and function callouts.",
|
|
45
|
+
};
|
|
46
|
+
case "upload":
|
|
47
|
+
return {
|
|
48
|
+
title: "Upload",
|
|
49
|
+
description: "Upload custom assets and models to your workspace.",
|
|
50
|
+
};
|
|
51
|
+
case "showroom":
|
|
52
|
+
return {
|
|
53
|
+
title: "Showroom",
|
|
54
|
+
description: "View and manage your design showroom.",
|
|
55
|
+
};
|
|
56
|
+
default:
|
|
57
|
+
return {
|
|
58
|
+
title: "Welcome",
|
|
59
|
+
description: "Select a tool to get started.",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const content = getPreviewContent();
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<div className="sidebar-preview">
|
|
68
|
+
<div className="preview-image-container">
|
|
69
|
+
<img src={previewImage} alt="Preview" className="preview-image" />
|
|
70
|
+
</div>
|
|
71
|
+
<div className="preview-content">
|
|
72
|
+
<h2 className="preview-title">{content.title}</h2>
|
|
73
|
+
<p className="preview-description">{content.description}</p>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
3
|
+
line-height: 1.5;
|
|
4
|
+
font-weight: 400;
|
|
5
|
+
|
|
6
|
+
color-scheme: light dark;
|
|
7
|
+
color: rgba(255, 255, 255, 0.87);
|
|
8
|
+
background-color: #242424;
|
|
9
|
+
|
|
10
|
+
font-synthesis: none;
|
|
11
|
+
text-rendering: optimizeLegibility;
|
|
12
|
+
-webkit-font-smoothing: antialiased;
|
|
13
|
+
-moz-osx-font-smoothing: grayscale;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
a {
|
|
17
|
+
font-weight: 500;
|
|
18
|
+
color: #646cff;
|
|
19
|
+
text-decoration: inherit;
|
|
20
|
+
}
|
|
21
|
+
a:hover {
|
|
22
|
+
color: #535bf2;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
body {
|
|
26
|
+
margin: 0;
|
|
27
|
+
display: flex;
|
|
28
|
+
place-items: center;
|
|
29
|
+
min-width: 320px;
|
|
30
|
+
min-height: 100vh;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
h1 {
|
|
34
|
+
font-size: 3.2em;
|
|
35
|
+
line-height: 1.1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
button {
|
|
39
|
+
border-radius: 8px;
|
|
40
|
+
border: 1px solid transparent;
|
|
41
|
+
padding: 0.6em 1.2em;
|
|
42
|
+
font-size: 1em;
|
|
43
|
+
font-weight: 500;
|
|
44
|
+
font-family: inherit;
|
|
45
|
+
background-color: #1a1a1a;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
transition: border-color 0.25s;
|
|
48
|
+
}
|
|
49
|
+
button:hover {
|
|
50
|
+
border-color: #646cff;
|
|
51
|
+
}
|
|
52
|
+
button:focus,
|
|
53
|
+
button:focus-visible {
|
|
54
|
+
outline: 4px auto -webkit-focus-ring-color;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@media (prefers-color-scheme: light) {
|
|
58
|
+
:root {
|
|
59
|
+
color: #213547;
|
|
60
|
+
background-color: #ffffff;
|
|
61
|
+
}
|
|
62
|
+
a:hover {
|
|
63
|
+
color: #747bff;
|
|
64
|
+
}
|
|
65
|
+
button {
|
|
66
|
+
background-color: #f9f9f9;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
.accordion-section {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
width: 100%;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.accordion-header {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: space-between;
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 48px;
|
|
13
|
+
padding: 8px 16px;
|
|
14
|
+
background: transparent;
|
|
15
|
+
border: none;
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
transition: background-color 0.2s ease;
|
|
18
|
+
font-family: inherit;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.accordion-header:hover {
|
|
22
|
+
background-color: #f5f5f5;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.accordion-title {
|
|
26
|
+
font-size: 14px;
|
|
27
|
+
font-weight: 700;
|
|
28
|
+
color: #111;
|
|
29
|
+
text-align: left;
|
|
30
|
+
flex: 1;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.chevron-icon {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: center;
|
|
37
|
+
width: 24px;
|
|
38
|
+
height: 24px;
|
|
39
|
+
transition: transform 0.3s ease;
|
|
40
|
+
flex-shrink: 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.accordion-content {
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-direction: column;
|
|
46
|
+
gap: 16px;
|
|
47
|
+
width: 100%;
|
|
48
|
+
animation: slideDown 0.3s ease;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@keyframes slideDown {
|
|
52
|
+
from {
|
|
53
|
+
opacity: 0;
|
|
54
|
+
transform: translateY(-10px);
|
|
55
|
+
}
|
|
56
|
+
to {
|
|
57
|
+
opacity: 1;
|
|
58
|
+
transform: translateY(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@media (max-width: 768px) {
|
|
63
|
+
.accordion-header {
|
|
64
|
+
padding: 8px 12px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.accordion-title {
|
|
68
|
+
font-size: 13px;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
.environment-scene-panel {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
width: 100%;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.scenes-grid {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
gap: 8px;
|
|
12
|
+
width: 100%;
|
|
13
|
+
margin-bottom: 4px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.scene-card {
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: 8px;
|
|
21
|
+
padding: 8px;
|
|
22
|
+
background: transparent;
|
|
23
|
+
border: 2px solid transparent;
|
|
24
|
+
border-radius: 4px;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
transition: all 0.2s ease;
|
|
27
|
+
flex: 0 0 calc(50% - 4px);
|
|
28
|
+
min-width: 96px;
|
|
29
|
+
font-family: inherit;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.scene-card:hover {
|
|
33
|
+
background: #f5f5f5;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.scene-card.selected {
|
|
37
|
+
border-color: #111;
|
|
38
|
+
background: #f5f5f5;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.scene-image {
|
|
42
|
+
width: 96px;
|
|
43
|
+
height: 78px;
|
|
44
|
+
border-radius: 4px;
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
font-size: 32px;
|
|
49
|
+
background: #f0f0f0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.scene-name {
|
|
53
|
+
font-size: 10px;
|
|
54
|
+
font-weight: 400;
|
|
55
|
+
color: #111;
|
|
56
|
+
text-align: center;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.scene-card.selected .scene-name {
|
|
60
|
+
font-weight: 700;
|
|
61
|
+
color: #111;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.upload-scene-btn {
|
|
65
|
+
display: flex;
|
|
66
|
+
align-items: center;
|
|
67
|
+
justify-content: center;
|
|
68
|
+
gap: 8px;
|
|
69
|
+
min-height: 32px;
|
|
70
|
+
padding: 4px 12px;
|
|
71
|
+
padding-left: 4px;
|
|
72
|
+
background: #f5f5f5;
|
|
73
|
+
border: none;
|
|
74
|
+
border-radius: 64px;
|
|
75
|
+
font-size: 12px;
|
|
76
|
+
font-weight: 400;
|
|
77
|
+
color: #111;
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
transition: all 0.2s ease;
|
|
80
|
+
font-family: inherit;
|
|
81
|
+
width: 100%;
|
|
82
|
+
margin-top: 4px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.upload-scene-btn:hover {
|
|
86
|
+
background: #ffffff;
|
|
87
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@media (max-width: 768px) {
|
|
91
|
+
.scene-image {
|
|
92
|
+
width: 80px;
|
|
93
|
+
height: 64px;
|
|
94
|
+
font-size: 24px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.scene-name {
|
|
98
|
+
font-size: 9px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.scene-card {
|
|
102
|
+
min-width: 80px;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
.lighting-panel {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 12px;
|
|
5
|
+
width: 100%;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.add-light-btn {
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
justify-content: center;
|
|
12
|
+
gap: 8px;
|
|
13
|
+
min-height: 32px;
|
|
14
|
+
padding: 4px 12px;
|
|
15
|
+
padding-left: 4px;
|
|
16
|
+
background: #f5f5f5;
|
|
17
|
+
border: none;
|
|
18
|
+
border-radius: 64px;
|
|
19
|
+
font-size: 12px;
|
|
20
|
+
font-weight: 400;
|
|
21
|
+
color: #111;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
transition: all 0.2s ease;
|
|
24
|
+
font-family: inherit;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.add-light-btn:hover {
|
|
28
|
+
background: #ffffff;
|
|
29
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.plus-icon {
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
width: 24px;
|
|
37
|
+
height: 24px;
|
|
38
|
+
font-size: 14px;
|
|
39
|
+
font-weight: 700;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.lights-grid {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-wrap: wrap;
|
|
45
|
+
gap: 8px;
|
|
46
|
+
width: 100%;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.light-card {
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: 8px;
|
|
54
|
+
padding: 8px;
|
|
55
|
+
background: transparent;
|
|
56
|
+
border: 2px solid transparent;
|
|
57
|
+
border-radius: 4px;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
transition: all 0.2s ease;
|
|
60
|
+
flex: 0 0 calc(50% - 4px);
|
|
61
|
+
min-width: 96px;
|
|
62
|
+
font-family: inherit;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.light-card:hover {
|
|
66
|
+
background: #f5f5f5;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.light-card.selected {
|
|
70
|
+
border-color: #111;
|
|
71
|
+
background: #f5f5f5;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.light-image {
|
|
75
|
+
width: 96px;
|
|
76
|
+
height: 78px;
|
|
77
|
+
border-radius: 4px;
|
|
78
|
+
display: flex;
|
|
79
|
+
align-items: center;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
font-size: 32px;
|
|
82
|
+
background: #f0f0f0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.light-name {
|
|
86
|
+
font-size: 10px;
|
|
87
|
+
font-weight: 700;
|
|
88
|
+
color: #111;
|
|
89
|
+
text-align: center;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.light-card.selected .light-name {
|
|
93
|
+
font-weight: 700;
|
|
94
|
+
color: #111;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@media (max-width: 768px) {
|
|
98
|
+
.light-image {
|
|
99
|
+
width: 80px;
|
|
100
|
+
height: 64px;
|
|
101
|
+
font-size: 24px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.light-name {
|
|
105
|
+
font-size: 9px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.light-card {
|
|
109
|
+
min-width: 80px;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
.render-scale-panel {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
width: 100%;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.render-scale-grid {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 10px;
|
|
12
|
+
width: 100%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.ratio-row {
|
|
16
|
+
display: flex;
|
|
17
|
+
gap: 10px;
|
|
18
|
+
width: 100%;
|
|
19
|
+
justify-content: flex-start;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.ratio-pill {
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
min-height: 32px;
|
|
27
|
+
padding: 4px 12px;
|
|
28
|
+
background: #f5f5f5;
|
|
29
|
+
border: 2px solid transparent;
|
|
30
|
+
border-radius: 64px;
|
|
31
|
+
font-size: 12px;
|
|
32
|
+
font-weight: 700;
|
|
33
|
+
color: #111;
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
transition: all 0.2s ease;
|
|
36
|
+
flex: 0 0 auto;
|
|
37
|
+
min-width: 62px;
|
|
38
|
+
font-family: inherit;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.ratio-pill:hover {
|
|
42
|
+
background: #ffffff;
|
|
43
|
+
border-color: #ddd;
|
|
44
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.ratio-pill.active {
|
|
48
|
+
background: #f5f5f5;
|
|
49
|
+
border-color: #111;
|
|
50
|
+
box-shadow: 0 0 0 2px rgba(17, 17, 17, 0.1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@media (max-width: 768px) {
|
|
54
|
+
.ratio-pill {
|
|
55
|
+
font-size: 11px;
|
|
56
|
+
padding: 3px 10px;
|
|
57
|
+
min-width: 56px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.ratio-row {
|
|
61
|
+
gap: 8px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.render-scale-grid {
|
|
65
|
+
gap: 8px;
|
|
66
|
+
}
|
|
67
|
+
}
|