Rammanokar commited on
Commit
fea0c80
·
verified ·
1 Parent(s): 7c1241e

convert this to react diagram.

Browse files

```mermaid
graph
Internet[Internet]

subgraph "Production VPC - 15.0.0.0/16"
IGW_Prod[Internet Gateway<br/>igw-09cf4bcb7239a6547]
LB_Prod[Internal Load Balancer<br/>ieq-prod-lb]

subgraph "us-east-1a"
PubSub1[Public Subnet<br/>15.0.0.0/20]
EC2Prod1[BE Prod<br/>3.220.214.17<br/>t2.small]
EC2Prod2[BE Admin Prod<br/>3.227.125.175<br/>t2.small]
EC2ML_Prod[ML Prod<br/>98.83.117.30<br/>t2.medium]
end

subgraph "us-east-1b"
PubSub2[Public Subnet<br/>15.0.16.0/20]
end

Internet --> IGW_Prod
IGW_Prod --> PubSub1
IGW_Prod --> PubSub2
PubSub1 --> EC2Prod1
PubSub1 --> EC2Prod2
PubSub1 --> EC2ML_Prod
LB_Prod --> EC2Prod1
end
```
```mermaid
graph TB


Internet[Internet]

subgraph "Default VPC - 172.31.0.0/16 (Dev & PreProd)"
IGW_Default[Internet Gateway<br/>igw-08f0068d5deb99f34]

subgraph "Development Environment"
DevBE[BE Dev<br/>23.22.6.48<br/>t2.small]
DevAdmin[BE Admin Dev<br/>34.225.40.84<br/>t2.micro]
DevML[ML Dev<br/>54.225.50.5<br/>t2.medium]
DevAV[AV Processing<br/>54.224.121.98<br/>t2.small]
end

subgraph "PreProduction Environment"
PreBE[BE PreProd<br/>44.214.177.246<br/>t2.small]
PreAdmin[BE Admin PreProd<br/>34.193.219.91<br/>t2.small]
PreML[ML PreProd<br/>18.234.27.117<br/>c5.2xlarge]
PreMCP[MCP PreProd<br/>44.204.54.3<br/>t2.medium]
end

LB_Dev[ALB: ieq-be-dev<br/>ieq-be-admin-dev-lb]
LB_MCP[Internal ALB<br/>ieq-mcp-stage-lb]

Internet --> IGW_Default
IGW_Default --> DevBE
IGW_Default --> DevAdmin
IGW_Default --> DevML
IGW_Default --> DevAV
IGW_Default --> PreBE
IGW_Default --> PreAdmin
IGW_Default --> PreML
IGW_Default --> PreMCP

LB_Dev --> DevBE
LB_Dev --> DevAdmin
LB_MCP --> PreMCP
end


```

Files changed (4) hide show
  1. README.md +8 -5
  2. index.html +20 -19
  3. script.js +277 -0
  4. style.css +268 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Aws Vpc Diagram React
3
- emoji: 👁
4
- colorFrom: blue
5
- colorTo: indigo
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: AWS VPC Diagram React
3
+ colorFrom: red
4
+ colorTo: purple
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
index.html CHANGED
@@ -1,19 +1,20 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AWS VPC Architecture Diagram</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
10
+ <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
11
+ <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
12
+ <script src="https://unpkg.com/feather-icons"></script>
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ <script type="text/babel" src="script.js"></script>
17
+ <script>feather.replace();</script>
18
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
19
+ </body>
20
+ </html>
script.js ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ x
2
+ const { useState, useEffect } = React;
3
+
4
+ const VPCDiagram = () => {
5
+ const [selectedComponent, setSelectedComponent] = useState(null);
6
+
7
+ const productionComponents = [
8
+ {
9
+ id: 'igw-prod',
10
+ type: 'Internet Gateway',
11
+ name: 'Internet Gateway',
12
+ details: 'igw-09cf4bcb7239a6547',
13
+ icon: 'globe'
14
+ },
15
+ {
16
+ id: 'lb-prod',
17
+ type: 'Load Balancer',
18
+ name: 'Internal Load Balancer',
19
+ details: 'ieq-prod-lb',
20
+ icon: 'layers'
21
+ },
22
+ {
23
+ id: 'ec2-prod-1',
24
+ type: 'EC2 Instance',
25
+ name: 'BE Prod',
26
+ details: '3.220.214.17 - t2.small',
27
+ icon: 'server'
28
+ },
29
+ {
30
+ id: 'ec2-prod-2',
31
+ type: 'EC2 Instance',
32
+ name: 'BE Admin Prod',
33
+ details: '3.227.125.175 - t2.small',
34
+ icon: 'server'
35
+ },
36
+ {
37
+ id: 'ec2-ml-prod',
38
+ type: 'EC2 Instance',
39
+ name: 'ML Prod',
40
+ details: '98.83.117.30 - t2.medium',
41
+ icon: 'cpu'
42
+ }
43
+ ];
44
+
45
+ const developmentComponents = [
46
+ {
47
+ id: 'dev-be',
48
+ type: 'EC2 Instance',
49
+ name: 'BE Dev',
50
+ details: '23.22.6.48 - t2.small',
51
+ icon: 'server'
52
+ },
53
+ {
54
+ id: 'dev-admin',
55
+ type: 'EC2 Instance',
56
+ name: 'BE Admin Dev',
57
+ details: '34.225.40.84 - t2.micro',
58
+ icon: 'server'
59
+ },
60
+ {
61
+ id: 'dev-ml',
62
+ type: 'EC2 Instance',
63
+ name: 'ML Dev',
64
+ details: '54.225.50.5 - t2.medium',
65
+ icon: 'cpu'
66
+ },
67
+ {
68
+ id: 'dev-av',
69
+ type: 'EC2 Instance',
70
+ name: 'AV Processing',
71
+ details: '54.224.121.98 - t2.small',
72
+ icon: 'shield'
73
+ },
74
+ {
75
+ id: 'lb-dev',
76
+ type: 'Load Balancer',
77
+ name: 'ALB Dev',
78
+ details: 'ieq-be-dev',
79
+ icon: 'layers'
80
+ }
81
+ ];
82
+
83
+ const preproductionComponents = [
84
+ {
85
+ id: 'pre-be',
86
+ type: 'EC2 Instance',
87
+ name: 'BE PreProd',
88
+ details: '44.214.177.246 - t2.small',
89
+ icon: 'server'
90
+ },
91
+ {
92
+ id: 'pre-admin',
93
+ type: 'EC2 Instance',
94
+ name: 'BE Admin PreProd',
95
+ details: '34.193.219.91 - t2.small',
96
+ icon: 'server'
97
+ },
98
+ {
99
+ id: 'pre-ml',
100
+ type: 'EC2 Instance',
101
+ name: 'ML PreProd',
102
+ details: '18.234.27.117 - c5.2xlarge',
103
+ icon: 'cpu'
104
+ },
105
+ {
106
+ id: 'pre-mcp',
107
+ type: 'EC2 Instance',
108
+ name: 'MCP PreProd',
109
+ details: '44.204.54.3 - t2.medium',
110
+ icon: 'zap'
111
+ },
112
+ {
113
+ id: 'lb-mcp',
114
+ type: 'Load Balancer',
115
+ name: 'Internal ALB',
116
+ details: 'ieq-mcp-stage-lb',
117
+ icon: 'layers'
118
+ }
119
+ ];
120
+
121
+ const ComponentCard = ({ component, onClick }) => {
122
+ const getComponentClass = (type) => {
123
+ switch (type) {
124
+ case 'Internet Gateway':
125
+ return 'internet-gateway';
126
+ case 'Load Balancer':
127
+ return 'load-balancer';
128
+ case 'EC2 Instance':
129
+ return 'ec2-instance';
130
+ default:
131
+ return '';
132
+ }
133
+ };
134
+
135
+ return (
136
+ <div
137
+ className={`component ${getComponentClass(component.type)}`}
138
+ onClick={() => onClick(component)}
139
+ >
140
+ <i data-feather={component.icon} className="component-icon"></i>
141
+ <div className="component-title">{component.name}</div>
142
+ <div className="component-details">{component.details}</div>
143
+ </div>
144
+ );
145
+ };
146
+
147
+ const ConnectionFlow = () => (
148
+ <div className="connections">
149
+ <h3>Connection Flow</h3>
150
+ <div className="connection-flow">
151
+ <div className="connection-item">
152
+ <i data-feather="globe"></i> Internet
153
+ </div>
154
+ <div className="arrow">→</div>
155
+ <div className="connection-item">
156
+ <i data-feather="shield"></i> Internet Gateway
157
+ </div>
158
+ <div className="arrow">→</div>
159
+ <div className="connection-item">
160
+ <i data-feather="layers"></i> Load Balancer
161
+ </div>
162
+ <div className="arrow">→</div>
163
+ <div className="connection-item">
164
+ <i data-feather="server"></i> EC2 Instances
165
+ </div>
166
+ </div>
167
+ </div>
168
+ );
169
+
170
+ const Stats = () => (
171
+ <div className="stats">
172
+ <h3>Infrastructure Overview</h3>
173
+ <div className="stats-grid">
174
+ <div className="stat-item">
175
+ <div className="stat-number">2</div>
176
+ <div className="stat-label">VPCs</div>
177
+ </div>
178
+ <div className="stat-item">
179
+ <div className="stat-number">13</div>
180
+ <div className="stat-label">EC2 Instances</div>
181
+ </div>
182
+ <div className="stat-item">
183
+ <div className="stat-number">4</div>
184
+ <div className="stat-label">Load Balancers</div>
185
+ </div>
186
+ <div className="stat-item">
187
+ <div className="stat-number">2</div>
188
+ <div className="stat-label">Internet Gateways</div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ );
193
+
194
+ useEffect(() => {
195
+ feather.replace();
196
+ }, []);
197
+
198
+ const handleComponentClick = (component) => {
199
+ setSelectedComponent(component);
200
+ };
201
+
202
+ return (
203
+ <div className="container">
204
+ <div className="header">
205
+ <h1>AWS VPC Architecture Diagram</h1>
206
+ <p>Interactive visualization of Production and Development VPC infrastructure</p>
207
+ </div>
208
+
209
+ <div className="diagram-container">
210
+ {/* Production VPC */}
211
+ <div className="vpc-section">
212
+ <div className="vpc-header">
213
+ <h2>Production VPC</h2>
214
+ <p>15.0.0.0/16</p>
215
+ </div>
216
+
217
+ <div className="environments-grid">
218
+ <div className="environment">
219
+ <h3>Production Environment</h3>
220
+ <div className="components-grid">
221
+ {productionComponents.map(component => (
222
+ <ComponentCard
223
+ key={component.id}
224
+ component={component}
225
+ onClick={handleComponentClick}
226
+ />
227
+ ))}
228
+ </div>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ {/* Development VPC */}
234
+ <div className="vpc-section">
235
+ <div className="vpc-header">
236
+ <h2>Default VPC</h2>
237
+ <p>172.31.0.0/16 (Dev & PreProd)</p>
238
+ </div>
239
+
240
+ <div className="environments-grid">
241
+ <div className="environment">
242
+ <h3>Development Environment</h3>
243
+ <div className="components-grid">
244
+ {developmentComponents.map(component => (
245
+ <ComponentCard
246
+ key={component.id}
247
+ component={component}
248
+ onClick={handleComponentClick}
249
+ />
250
+ ))}
251
+ </div>
252
+ </div>
253
+
254
+ <div className="environment">
255
+ <h3>PreProduction Environment</h3>
256
+ <div className="components-grid">
257
+ {preproductionComponents.map(component => (
258
+ <ComponentCard
259
+ key={component.id}
260
+ component={component}
261
+ onClick={handleComponentClick}
262
+ />
263
+ ))}
264
+ </div>
265
+ </div>
266
+ </div>
267
+ </div>
268
+
269
+ <ConnectionFlow />
270
+ <Stats />
271
+ </div>
272
+ </div>
273
+ );
274
+ };
275
+
276
+ const root = ReactDOM.createRoot(document.getElementById('root'));
277
+ root.render(<VPCDiagram />);
style.css CHANGED
@@ -1,28 +1,278 @@
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
  body {
8
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
9
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
10
+ min-height: 100vh;
11
+ padding: 20px;
12
+ }
13
+
14
+ .container {
15
+ max-width: 1400px;
16
+ margin: 0 auto;
17
+ background: white;
18
+ border-radius: 20px;
19
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
20
+ overflow: hidden;
21
+ }
22
+
23
+ .header {
24
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
25
+ color: white;
26
+ padding: 30px;
27
+ text-align: center;
28
+ }
29
+
30
+ .header h1 {
31
+ font-size: 2.5rem;
32
+ font-weight: 700;
33
+ margin-bottom: 10px;
34
+ }
35
+
36
+ .header p {
37
+ font-size: 1.1rem;
38
+ opacity: 0.9;
39
+ }
40
+
41
+ .diagram-container {
42
+ padding: 40px;
43
+ background: #f8fafc;
44
+ }
45
+
46
+ .vpc-section {
47
+ margin-bottom: 50px;
48
+ }
49
+
50
+ .vpc-header {
51
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
52
+ color: white;
53
+ padding: 20px;
54
+ border-radius: 12px;
55
+ margin-bottom: 25px;
56
+ text-align: center;
57
+ }
58
+
59
+ .vpc-header h2 {
60
+ font-size: 1.8rem;
61
+ font-weight: 600;
62
+ margin-bottom: 5px;
63
  }
64
 
65
+ .vpc-header p {
66
+ font-size: 1rem;
67
+ opacity: 0.9;
68
  }
69
 
70
+ .environments-grid {
71
+ display: grid;
72
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
73
+ gap: 30px;
74
+ margin-bottom: 30px;
75
  }
76
 
77
+ .environment {
78
+ background: white;
79
+ border-radius: 15px;
80
+ padding: 25px;
81
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
82
+ border: 2px solid #e2e8f0;
83
+ transition: all 0.3s ease;
84
  }
85
 
86
+ .environment:hover {
87
+ transform: translateY(-5px);
88
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
89
+ border-color: #667eea;
90
  }
91
+
92
+ .environment h3 {
93
+ color: #2d3748;
94
+ font-size: 1.4rem;
95
+ font-weight: 600;
96
+ margin-bottom: 20px;
97
+ text-align: center;
98
+ padding-bottom: 10px;
99
+ border-bottom: 2px solid #e2e8f0;
100
+ }
101
+
102
+ .components-grid {
103
+ display: grid;
104
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
105
+ gap: 15px;
106
+ }
107
+
108
+ .component {
109
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
110
+ color: white;
111
+ padding: 20px;
112
+ border-radius: 10px;
113
+ text-align: center;
114
+ transition: all 0.3s ease;
115
+ cursor: pointer;
116
+ position: relative;
117
+ overflow: hidden;
118
+ }
119
+
120
+ .component::before {
121
+ content: '';
122
+ position: absolute;
123
+ top: 0;
124
+ left: -100%;
125
+ width: 100%;
126
+ height: 100%;
127
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
128
+ transition: left 0.5s;
129
+ }
130
+
131
+ .component:hover::before {
132
+ left: 100%;
133
+ }
134
+
135
+ .component:hover {
136
+ transform: scale(1.05);
137
+ box-shadow: 0 10px 25px rgba(102, 126, 234, 0.4);
138
+ }
139
+
140
+ .component-icon {
141
+ font-size: 1.5rem;
142
+ margin-bottom: 10px;
143
+ display: block;
144
+ }
145
+
146
+ .component-title {
147
+ font-size: 1rem;
148
+ font-weight: 600;
149
+ margin-bottom: 5px;
150
+ }
151
+
152
+ .component-details {
153
+ font-size: 0.85rem;
154
+ opacity: 0.9;
155
+ line-height: 1.4;
156
+ }
157
+
158
+ .internet-gateway {
159
+ background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
160
+ }
161
+
162
+ .load-balancer {
163
+ background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
164
+ }
165
+
166
+ .subnet {
167
+ background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
168
+ }
169
+
170
+ .ec2-instance {
171
+ background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
172
+ }
173
+
174
+ .public-subnet {
175
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
176
+ }
177
+
178
+ .connections {
179
+ margin-top: 40px;
180
+ text-align: center;
181
+ }
182
+
183
+ .connection-flow {
184
+ display: flex;
185
+ justify-content: center;
186
+ align-items: center;
187
+ flex-wrap: wrap;
188
+ gap: 15px;
189
+ margin-top: 20px;
190
+ }
191
+
192
+ .connection-item {
193
+ background: white;
194
+ padding: 15px 20px;
195
+ border-radius: 25px;
196
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
197
+ border: 2px solid #e2e8f0;
198
+ font-weight: 500;
199
+ color: #2d3748;
200
+ transition: all 0.3s ease;
201
+ }
202
+
203
+ .connection-item:hover {
204
+ border-color: #667eea;
205
+ color: #667eea;
206
+ transform: translateY(-2px);
207
+ }
208
+
209
+ .arrow {
210
+ color: #667eea;
211
+ font-size: 1.2rem;
212
+ }
213
+
214
+ .stats {
215
+ background: white;
216
+ border-radius: 15px;
217
+ padding: 25px;
218
+ margin-top: 30px;
219
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
220
+ }
221
+
222
+ .stats h3 {
223
+ color: #2d3748;
224
+ font-size: 1.3rem;
225
+ font-weight: 600;
226
+ margin-bottom: 15px;
227
+ text-align: center;
228
+ }
229
+
230
+ .stats-grid {
231
+ display: grid;
232
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
233
+ gap: 15px;
234
+ }
235
+
236
+ .stat-item {
237
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
238
+ color: white;
239
+ padding: 20px;
240
+ border-radius: 10px;
241
+ text-align: center;
242
+ }
243
+
244
+ .stat-number {
245
+ font-size: 2rem;
246
+ font-weight: 700;
247
+ margin-bottom: 5px;
248
+ }
249
+
250
+ .stat-label {
251
+ font-size: 0.9rem;
252
+ opacity: 0.9;
253
+ }
254
+
255
+ @media (max-width: 768px) {
256
+ .header h1 {
257
+ font-size: 2rem;
258
+ }
259
+
260
+ .diagram-container {
261
+ padding: 20px;
262
+ }
263
+
264
+ .environments-grid {
265
+ grid-template-columns: 1fr;
266
+ gap: 20px;
267
+ }
268
+
269
+ .components-grid {
270
+ grid-template-columns: 1fr;
271
+ gap: 10px;
272
+ }
273
+
274
+ .connection-flow {
275
+ flex-direction: column;
276
+ gap: 10px;
277
+ }
278
+ }