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.
Files changed (43) hide show
  1. package/askCopilot.js +51 -0
  2. package/index.js +10 -3
  3. package/my-new-project/.env +1 -1
  4. package/my-new-project/.vscode/settings.json +1 -1
  5. package/my-new-project/my-app/.env +1 -0
  6. package/my-new-project/my-app/README.md +73 -0
  7. package/my-new-project/my-app/eslint.config.js +23 -0
  8. package/my-new-project/my-app/index.html +13 -0
  9. package/my-new-project/my-app/package-lock.json +3212 -0
  10. package/my-new-project/my-app/package.json +30 -0
  11. package/my-new-project/my-app/public/vite.svg +1 -0
  12. package/my-new-project/my-app/src/App.css +42 -0
  13. package/my-new-project/my-app/src/App.tsx +28 -0
  14. package/my-new-project/my-app/src/FigmaSidebarComponent.css +99 -0
  15. package/my-new-project/my-app/src/FigmaSidebarComponent.tsx +111 -0
  16. package/my-new-project/my-app/src/React19AllFeaturesDemo.jsx +111 -0
  17. package/my-new-project/my-app/src/RenderRightSidebar.css +32 -0
  18. package/my-new-project/my-app/src/RenderRightSidebar.tsx +73 -0
  19. package/my-new-project/my-app/src/assets/react.svg +1 -0
  20. package/my-new-project/my-app/src/components/AccordionSection.tsx +33 -0
  21. package/my-new-project/my-app/src/components/ChevronIcon.tsx +24 -0
  22. package/my-new-project/my-app/src/components/EnvironmentScenePanel.tsx +57 -0
  23. package/my-new-project/my-app/src/components/LightingPanel.tsx +57 -0
  24. package/my-new-project/my-app/src/components/RenderScalePanel.tsx +34 -0
  25. package/my-new-project/my-app/src/components/ResolutionPanel.tsx +27 -0
  26. package/my-new-project/my-app/src/components/SaturationPanel.tsx +27 -0
  27. package/my-new-project/my-app/src/components/SidebarButton.tsx +27 -0
  28. package/my-new-project/my-app/src/components/SidebarPreview.tsx +77 -0
  29. package/my-new-project/my-app/src/index.css +68 -0
  30. package/my-new-project/my-app/src/main.tsx +10 -0
  31. package/my-new-project/my-app/src/styles/AccordionSection.css +70 -0
  32. package/my-new-project/my-app/src/styles/EnvironmentScenePanel.css +104 -0
  33. package/my-new-project/my-app/src/styles/LightingPanel.css +111 -0
  34. package/my-new-project/my-app/src/styles/RenderScalePanel.css +67 -0
  35. package/my-new-project/my-app/src/styles/ResolutionPanel.css +60 -0
  36. package/my-new-project/my-app/src/styles/SaturationPanel.css +56 -0
  37. package/my-new-project/my-app/src/styles/SidebarButton.css +81 -0
  38. package/my-new-project/my-app/src/styles/SidebarPreview.css +92 -0
  39. package/my-new-project/my-app/tsconfig.app.json +28 -0
  40. package/my-new-project/my-app/tsconfig.json +7 -0
  41. package/my-new-project/my-app/tsconfig.node.json +26 -0
  42. package/my-new-project/my-app/vite.config.ts +7 -0
  43. 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,10 @@
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.tsx'
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
@@ -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
+ }