tangled
alpha
login
or
join now
vt3e.cat
/
www
2
fork
atom
this repo has no descr,ription
vt3e.cat
2
fork
atom
overview
issues
pulls
pipelines
fix: fix content escaping viewport
vt3e.cat
2 months ago
f2077dd7
82c2239b
verified
This commit was signed with the committer's
known signature
.
vt3e.cat
SSH Key Fingerprint:
SHA256:MaVgF6bXxDdD131G4rXizPh+sttp3IVsdPrj48HV0X0=
+7
-325
4 changed files
expand all
collapse all
unified
split
index.html
pkgs
web
index.html
src
App.vue
components
Card
CardLayout.vue
-319
index.html
reviewed
···
1
1
-
<!doctype html>
2
2
-
<html lang="en">
3
3
-
<head>
4
4
-
<meta charset="UTF-8" />
5
5
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
-
<title>Cosy Bento Portfolio</title>
7
7
-
<style>
8
8
-
/* --- 1. THE COSY VARIABLES --- */
9
9
-
:root {
10
10
-
--bg-color: #fdfcf8; /* Warm paper white */
11
11
-
--text-main: #4a4a4a; /* Soft charcoal */
12
12
-
--text-light: #8c8c8c; /* Muted grey */
13
13
-
14
14
-
/* Card Colors - Soft Pastels */
15
15
-
--card-base: #f4f1ea; /* Latte */
16
16
-
--card-highlight: #e8e4d9; /* Darker Latte for hover */
17
17
-
--accent-green: #dce5de; /* Sage */
18
18
-
--accent-blue: #dee2e5; /* Dusty Blue */
19
19
-
--accent-rose: #e5dedc; /* Dusty Rose */
20
20
-
21
21
-
--font-serif: "Georgia", serif;
22
22
-
--font-sans: system-ui, -apple-system, sans-serif;
23
23
-
24
24
-
--radius: 24px;
25
25
-
--spacing: 20px;
26
26
-
}
27
27
-
28
28
-
/* --- 2. GLOBAL STYLES --- */
29
29
-
* {
30
30
-
box-sizing: border-box;
31
31
-
margin: 0;
32
32
-
padding: 0;
33
33
-
}
34
34
-
35
35
-
body {
36
36
-
background-color: var(--bg-color);
37
37
-
color: var(--text-main);
38
38
-
font-family: var(--font-sans);
39
39
-
display: flex;
40
40
-
justify-content: center;
41
41
-
align-items: center;
42
42
-
min-height: 100vh;
43
43
-
padding: var(--spacing);
44
44
-
}
45
45
-
46
46
-
/* --- 3. THE BENTO GRID --- */
47
47
-
.bento-grid {
48
48
-
display: grid;
49
49
-
grid-template-columns: repeat(3, 1fr); /* 3 Columns */
50
50
-
grid-template-rows: repeat(2, 300px); /* 2 Rows */
51
51
-
gap: var(--spacing);
52
52
-
max-width: 1000px;
53
53
-
width: 100%;
54
54
-
}
55
55
-
56
56
-
/* CARD STYLING */
57
57
-
.card {
58
58
-
background-color: var(--card-base);
59
59
-
border-radius: var(--radius);
60
60
-
padding: 40px;
61
61
-
position: relative;
62
62
-
cursor: pointer;
63
63
-
transition:
64
64
-
transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1),
65
65
-
box-shadow 0.3s ease;
66
66
-
display: flex;
67
67
-
flex-direction: column;
68
68
-
justify-content: space-between;
69
69
-
overflow: hidden;
70
70
-
border: 1px solid rgba(0, 0, 0, 0.02);
71
71
-
}
72
72
-
73
73
-
.card:hover {
74
74
-
transform: scale(1.02);
75
75
-
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
76
76
-
background-color: var(--card-highlight);
77
77
-
}
78
78
-
79
79
-
.card h2 {
80
80
-
font-family: var(--font-serif);
81
81
-
font-size: 1.8rem;
82
82
-
margin-bottom: 10px;
83
83
-
font-weight: normal;
84
84
-
}
85
85
-
86
86
-
.card p {
87
87
-
line-height: 1.6;
88
88
-
color: var(--text-main);
89
89
-
}
90
90
-
91
91
-
.icon {
92
92
-
font-size: 2rem;
93
93
-
margin-bottom: 20px;
94
94
-
display: block;
95
95
-
}
96
96
-
97
97
-
/* --- 4. GRID PLACEMENTS (The Layout Logic) --- */
98
98
-
99
99
-
/* HOME / ABOUT: Large square (2x2) */
100
100
-
.area-home {
101
101
-
grid-column: span 2;
102
102
-
grid-row: span 1;
103
103
-
background-color: #fff; /* Stand out slightly */
104
104
-
}
105
105
-
106
106
-
/* PROJECTS: Tall vertical */
107
107
-
.area-projects {
108
108
-
grid-column: span 1;
109
109
-
grid-row: span 2;
110
110
-
background-color: var(--accent-green);
111
111
-
}
112
112
-
113
113
-
/* USES: Small box */
114
114
-
.area-uses {
115
115
-
grid-column: span 1;
116
116
-
grid-row: span 1;
117
117
-
background-color: var(--accent-blue);
118
118
-
}
119
119
-
120
120
-
/* GALLERY: Small box */
121
121
-
.area-gallery {
122
122
-
grid-column: span 1;
123
123
-
grid-row: span 1;
124
124
-
background-color: var(--accent-rose);
125
125
-
}
126
126
-
127
127
-
/* DECORATIVE TAGS */
128
128
-
.tag {
129
129
-
position: absolute;
130
130
-
top: 20px;
131
131
-
right: 20px;
132
132
-
font-size: 0.8rem;
133
133
-
text-transform: uppercase;
134
134
-
letter-spacing: 1px;
135
135
-
opacity: 0.5;
136
136
-
}
137
137
-
138
138
-
/* --- 5. MODAL (The Overlay) --- */
139
139
-
.modal-overlay {
140
140
-
position: fixed;
141
141
-
top: 0;
142
142
-
left: 0;
143
143
-
right: 0;
144
144
-
bottom: 0;
145
145
-
background: rgba(255, 255, 255, 0.8);
146
146
-
backdrop-filter: blur(5px);
147
147
-
opacity: 0;
148
148
-
pointer-events: none;
149
149
-
transition: opacity 0.3s ease;
150
150
-
z-index: 100;
151
151
-
display: flex;
152
152
-
justify-content: center;
153
153
-
align-items: center;
154
154
-
}
155
155
-
156
156
-
.modal-overlay.active {
157
157
-
opacity: 1;
158
158
-
pointer-events: all;
159
159
-
}
160
160
-
161
161
-
.modal-content {
162
162
-
background: #fff;
163
163
-
width: 90%;
164
164
-
max-width: 600px;
165
165
-
padding: 40px;
166
166
-
border-radius: var(--radius);
167
167
-
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);
168
168
-
transform: translateY(20px);
169
169
-
transition: transform 0.3s ease;
170
170
-
max-height: 80vh;
171
171
-
overflow-y: auto;
172
172
-
}
173
173
-
174
174
-
.modal-overlay.active .modal-content {
175
175
-
transform: translateY(0);
176
176
-
}
177
177
-
178
178
-
.close-btn {
179
179
-
float: right;
180
180
-
cursor: pointer;
181
181
-
font-size: 1.5rem;
182
182
-
background: none;
183
183
-
border: none;
184
184
-
color: var(--text-light);
185
185
-
}
186
186
-
187
187
-
/* --- 6. MOBILE RESPONSIVENESS --- */
188
188
-
@media (max-width: 768px) {
189
189
-
.bento-grid {
190
190
-
grid-template-columns: 1fr; /* Stack everything */
191
191
-
grid-template-rows: auto;
192
192
-
}
193
193
-
.area-home,
194
194
-
.area-projects,
195
195
-
.area-uses,
196
196
-
.area-gallery {
197
197
-
grid-column: span 1;
198
198
-
grid-row: span 1;
199
199
-
min-height: 250px;
200
200
-
}
201
201
-
}
202
202
-
</style>
203
203
-
</head>
204
204
-
<body>
205
205
-
<!-- THE BENTO GRID -->
206
206
-
<div class="bento-grid">
207
207
-
<!-- 1. HOME (About Me) -->
208
208
-
<div class="card area-home" onclick="openModal('about')">
209
209
-
<span class="tag">01 · Welcome</span>
210
210
-
<div>
211
211
-
<span class="icon">👋</span>
212
212
-
<h2>Hello, I'm [Name].</h2>
213
213
-
<p>
214
214
-
I build websites and explore digital creativity. <br />
215
215
-
This is my personal corner of the internet.
216
216
-
</p>
217
217
-
</div>
218
218
-
<div
219
219
-
style="
220
220
-
margin-top: 20px;
221
221
-
font-size: 0.9rem;
222
222
-
color: var(--text-light);
223
223
-
"
224
224
-
>
225
225
-
→ Click card to read full bio
226
226
-
</div>
227
227
-
</div>
228
228
-
229
229
-
<!-- 2. PROJECTS (Featured Work) -->
230
230
-
<div class="card area-projects" onclick="openModal('projects')">
231
231
-
<span class="tag">02 · Works</span>
232
232
-
<div>
233
233
-
<span class="icon">🔨</span>
234
234
-
<h2>Projects</h2>
235
235
-
<p>
236
236
-
A collection of things I've built, broken, and fixed
237
237
-
again.
238
238
-
</p>
239
239
-
<ul
240
240
-
style="
241
241
-
margin-top: 20px;
242
242
-
padding-left: 20px;
243
243
-
opacity: 0.7;
244
244
-
"
245
245
-
>
246
246
-
<li>Personal Site v1</li>
247
247
-
<li>Weather App</li>
248
248
-
<li>Obsidian Plugins</li>
249
249
-
</ul>
250
250
-
</div>
251
251
-
</div>
252
252
-
253
253
-
<!-- 3. USES (Tech Specs) -->
254
254
-
<div class="card area-uses" onclick="openModal('uses')">
255
255
-
<span class="tag">03 · Setup</span>
256
256
-
<div>
257
257
-
<span class="icon">💻</span>
258
258
-
<h2>/Uses</h2>
259
259
-
<p>Software, hardware, and server specs.</p>
260
260
-
</div>
261
261
-
</div>
262
262
-
263
263
-
<!-- 4. GALLERY (Photos/Art) -->
264
264
-
<div class="card area-gallery" onclick="openModal('gallery')">
265
265
-
<span class="tag">04 · Visuals</span>
266
266
-
<div>
267
267
-
<span class="icon">📷</span>
268
268
-
<h2>Gallery</h2>
269
269
-
<p>Snapshots from my life.</p>
270
270
-
</div>
271
271
-
</div>
272
272
-
</div>
273
273
-
274
274
-
<!-- MODAL POPUP -->
275
275
-
<div
276
276
-
class="modal-overlay"
277
277
-
id="modalOverlay"
278
278
-
onclick="closeModal(event)"
279
279
-
>
280
280
-
<div class="modal-content">
281
281
-
<button class="close-btn" onclick="forceClose()">×</button>
282
282
-
<div id="modalBody">
283
283
-
<!-- Content injected via JS -->
284
284
-
</div>
285
285
-
</div>
286
286
-
</div>
287
287
-
288
288
-
<script>
289
289
-
// Data for the modals to simulate pages
290
290
-
const contentData = {
291
291
-
about: `<h1>About Me</h1><p>Here you can write your longer bio. Talk about your background, what you are currently learning, and what you do for fun.</p><br><p>This layout keeps the home page clean while allowing deep dives here.</p>`,
292
292
-
293
293
-
projects: `<h1>Projects</h1><p><strong>1. This Website</strong><br>Built with vanilla HTML/CSS using a Bento Grid layout.</p><br><p><strong>2. Project Alpha</strong><br>A cool react app that does X, Y, and Z.</p>`,
294
294
-
295
295
-
uses: `<h1>/Uses</h1><h3>Hardware</h3><ul><li>MacBook Pro M2</li><li>Keychron K2 Keyboard</li><li>Logitech MX Master 3</li></ul><br><h3>Software</h3><ul><li>VS Code (Catppuccin Theme)</li><li>Arc Browser</li><li>Figma</li></ul>`,
296
296
-
297
297
-
gallery: `<h1>Gallery</h1><div style="background:#eee; height: 200px; border-radius: 12px; display:flex; align-items:center; justify-content:center; color:#999;">[ Image Placeholder ]</div><br><div style="display:grid; grid-template-columns:1fr 1fr; gap:10px;"><div style="background:#eee; height:100px; border-radius:8px;"></div><div style="background:#eee; height:100px; border-radius:8px;"></div></div>`,
298
298
-
};
299
299
-
300
300
-
const modalOverlay = document.getElementById("modalOverlay");
301
301
-
const modalBody = document.getElementById("modalBody");
302
302
-
303
303
-
function openModal(type) {
304
304
-
modalBody.innerHTML = contentData[type];
305
305
-
modalOverlay.classList.add("active");
306
306
-
}
307
307
-
308
308
-
function closeModal(e) {
309
309
-
if (e.target === modalOverlay) {
310
310
-
modalOverlay.classList.remove("active");
311
311
-
}
312
312
-
}
313
313
-
314
314
-
function forceClose() {
315
315
-
modalOverlay.classList.remove("active");
316
316
-
}
317
317
-
</script>
318
318
-
</body>
319
319
-
</html>
+2
-1
pkgs/web/index.html
reviewed
···
3
3
<head>
4
4
<meta charset="UTF-8" />
5
5
<link rel="icon" href="/favicon.ico" />
6
6
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
7
7
<title>vt3e</title>
8
8
+
</head>
8
9
<body>
9
10
<div id="app"></div>
10
11
<script type="module" src="/src/main.ts"></script>
+2
-3
pkgs/web/src/App.vue
reviewed
···
66
66
67
67
.app-viewport {
68
68
width: 100%;
69
69
-
min-height: 100vh;
70
70
-
height: 100vh;
69
69
+
height: 100dvh;
71
70
position: relative;
72
71
display: flex;
73
72
justify-content: center;
···
84
83
position: absolute;
85
84
top: 0;
86
85
left: 0;
87
87
-
overflow-y: auto;
86
86
+
overflow-y: hidden;
88
87
overflow-x: hidden;
89
88
padding: 1rem;
90
89
display: flex;
+3
-2
pkgs/web/src/components/Card/CardLayout.vue
reviewed
···
135
135
136
136
.view-container {
137
137
width: 100%;
138
138
+
min-height: 0;
138
139
height: 100dvh;
139
140
140
141
&:active:has(.card-sheet:not(:hover)) .card-sheet {
···
150
151
width: 100%;
151
152
max-width: 900px;
152
153
153
153
-
max-height: calc(100dvh - 2rem);
154
154
display: flex;
155
155
flex-direction: column;
156
156
gap: 0.25rem;
157
157
outline: none;
158
158
+
height: 100dvh;
159
159
+
min-height: 0;
158
160
159
161
border-radius: var(--radius);
160
162
background-color: color-mix(in srgb, hsla(var(--page-accent) / 1) 100%, white);
···
289
291
290
292
@media (max-width: 600px) {
291
293
.card-sheet {
292
292
-
min-height: 100vh;
293
294
border: none;
294
295
--radius: 1.5rem;
295
296
}