Skip to content

Commit a916f50

Browse files
committed
changes
1 parent dab5bce commit a916f50

14 files changed

Lines changed: 465 additions & 70 deletions

font.css

Lines changed: 253 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,256 @@
1-
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap");
1+
/* cyrillic-ext */
2+
@font-face {
3+
font-family: 'Inter';
4+
font-style: normal;
5+
font-weight: 400;
6+
font-display: swap;
7+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');
8+
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
9+
}
10+
/* cyrillic */
11+
@font-face {
12+
font-family: 'Inter';
13+
font-style: normal;
14+
font-weight: 400;
15+
font-display: swap;
16+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');
17+
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
18+
}
19+
/* greek-ext */
20+
@font-face {
21+
font-family: 'Inter';
22+
font-style: normal;
23+
font-weight: 400;
24+
font-display: swap;
25+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');
26+
unicode-range: U+1F00-1FFF;
27+
}
28+
/* greek */
29+
@font-face {
30+
font-family: 'Inter';
31+
font-style: normal;
32+
font-weight: 400;
33+
font-display: swap;
34+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');
35+
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
36+
}
37+
/* vietnamese */
38+
@font-face {
39+
font-family: 'Inter';
40+
font-style: normal;
41+
font-weight: 400;
42+
font-display: swap;
43+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');
44+
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
45+
}
46+
/* latin-ext */
47+
@font-face {
48+
font-family: 'Inter';
49+
font-style: normal;
50+
font-weight: 400;
51+
font-display: swap;
52+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
53+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
54+
}
55+
/* latin */
56+
@font-face {
57+
font-family: 'Inter';
58+
font-style: normal;
59+
font-weight: 400;
60+
font-display: swap;
61+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');
62+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
63+
}
64+
/* cyrillic-ext */
65+
@font-face {
66+
font-family: 'Inter';
67+
font-style: normal;
68+
font-weight: 500;
69+
font-display: swap;
70+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');
71+
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
72+
}
73+
/* cyrillic */
74+
@font-face {
75+
font-family: 'Inter';
76+
font-style: normal;
77+
font-weight: 500;
78+
font-display: swap;
79+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');
80+
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
81+
}
82+
/* greek-ext */
83+
@font-face {
84+
font-family: 'Inter';
85+
font-style: normal;
86+
font-weight: 500;
87+
font-display: swap;
88+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');
89+
unicode-range: U+1F00-1FFF;
90+
}
91+
/* greek */
92+
@font-face {
93+
font-family: 'Inter';
94+
font-style: normal;
95+
font-weight: 500;
96+
font-display: swap;
97+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');
98+
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
99+
}
100+
/* vietnamese */
101+
@font-face {
102+
font-family: 'Inter';
103+
font-style: normal;
104+
font-weight: 500;
105+
font-display: swap;
106+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');
107+
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
108+
}
109+
/* latin-ext */
110+
@font-face {
111+
font-family: 'Inter';
112+
font-style: normal;
113+
font-weight: 500;
114+
font-display: swap;
115+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
116+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
117+
}
118+
/* latin */
119+
@font-face {
120+
font-family: 'Inter';
121+
font-style: normal;
122+
font-weight: 500;
123+
font-display: swap;
124+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');
125+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
126+
}
127+
/* cyrillic-ext */
128+
@font-face {
129+
font-family: 'Inter';
130+
font-style: normal;
131+
font-weight: 600;
132+
font-display: swap;
133+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');
134+
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
135+
}
136+
/* cyrillic */
137+
@font-face {
138+
font-family: 'Inter';
139+
font-style: normal;
140+
font-weight: 600;
141+
font-display: swap;
142+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');
143+
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
144+
}
145+
/* greek-ext */
146+
@font-face {
147+
font-family: 'Inter';
148+
font-style: normal;
149+
font-weight: 600;
150+
font-display: swap;
151+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');
152+
unicode-range: U+1F00-1FFF;
153+
}
154+
/* greek */
155+
@font-face {
156+
font-family: 'Inter';
157+
font-style: normal;
158+
font-weight: 600;
159+
font-display: swap;
160+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');
161+
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
162+
}
163+
/* vietnamese */
164+
@font-face {
165+
font-family: 'Inter';
166+
font-style: normal;
167+
font-weight: 600;
168+
font-display: swap;
169+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');
170+
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
171+
}
172+
/* latin-ext */
173+
@font-face {
174+
font-family: 'Inter';
175+
font-style: normal;
176+
font-weight: 600;
177+
font-display: swap;
178+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
179+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
180+
}
181+
/* latin */
182+
@font-face {
183+
font-family: 'Inter';
184+
font-style: normal;
185+
font-weight: 600;
186+
font-display: swap;
187+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');
188+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
189+
}
190+
/* cyrillic-ext */
191+
@font-face {
192+
font-family: 'Inter';
193+
font-style: normal;
194+
font-weight: 700;
195+
font-display: swap;
196+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');
197+
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
198+
}
199+
/* cyrillic */
200+
@font-face {
201+
font-family: 'Inter';
202+
font-style: normal;
203+
font-weight: 700;
204+
font-display: swap;
205+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');
206+
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
207+
}
208+
/* greek-ext */
209+
@font-face {
210+
font-family: 'Inter';
211+
font-style: normal;
212+
font-weight: 700;
213+
font-display: swap;
214+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');
215+
unicode-range: U+1F00-1FFF;
216+
}
217+
/* greek */
218+
@font-face {
219+
font-family: 'Inter';
220+
font-style: normal;
221+
font-weight: 700;
222+
font-display: swap;
223+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');
224+
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
225+
}
226+
/* vietnamese */
227+
@font-face {
228+
font-family: 'Inter';
229+
font-style: normal;
230+
font-weight: 700;
231+
font-display: swap;
232+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');
233+
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
234+
}
235+
/* latin-ext */
236+
@font-face {
237+
font-family: 'Inter';
238+
font-style: normal;
239+
font-weight: 700;
240+
font-display: swap;
241+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');
242+
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
243+
}
244+
/* latin */
245+
@font-face {
246+
font-family: 'Inter';
247+
font-style: normal;
248+
font-weight: 700;
249+
font-display: swap;
250+
src: url(fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');
251+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
252+
}
253+
2254

3255
body {
4256
font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
18.3 KB
Binary file not shown.
47.1 KB
Binary file not shown.
18.6 KB
Binary file not shown.
83.1 KB
Binary file not shown.
25.4 KB
Binary file not shown.
11 KB
Binary file not shown.
10 KB
Binary file not shown.

generator.py

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,17 @@ def render_about(paragraphs: list[str]) -> str:
7676

7777

7878
def render_experience_item(item: dict[str, Any]) -> str:
79-
return render_template("partials/experience_item.html", {"item": item})
79+
title_html = f'<h3 class="text-base font-medium text-zinc-900 dark:text-zinc-100'
80+
81+
if item.get("link"):
82+
title_html += ' cursor-pointer hover:text-blue-600 dark:hover:text-blue-400 transition-colors"'
83+
title_html += f' onclick="window.location.href=\'{item["link"]}\'">{item["title"]}</h3>'
84+
title_html += f'<button class="experience-copy-link hidden group-hover:block text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 transition-colors" data-link="{item["link"]}" title="Copy link"><ion-icon name="link" class="text-sm"></ion-icon></button>'
85+
else:
86+
title_html += '">' + item["title"] + '</h3>'
87+
88+
context_item = {**item, "title_html": title_html}
89+
return render_template("partials/experience_item.html", {"item": context_item})
8090

8191

8292
def render_skill_item(skill: dict[str, Any], project_ids: dict[str, str]) -> str:
@@ -163,9 +173,10 @@ def render_project_card(project: dict[str, Any]) -> str:
163173

164174
details_button_html = ""
165175
if project.get("details") or project.get("features"):
176+
margin_class = "ml-3" if project.get("link") else ""
166177
details_button_html = (
167178
f'<button class="project-details-btn text-sm text-zinc-500 hover:text-zinc-900 '
168-
f'dark:hover:text-zinc-100 transition-colors mt-3" data-modal-id="{modal_id}">'
179+
f'dark:hover:text-zinc-100 transition-colors mt-3 {margin_class}" data-modal-id="{modal_id}">'
169180
"More Info →</button>"
170181
)
171182

@@ -198,6 +209,20 @@ def render_project_modal(project: dict[str, Any]) -> str:
198209
f'{project["details"]}</p>'
199210
)
200211

212+
gallery_html = ""
213+
project_gallery = project.get("gallery", [])
214+
if project_gallery:
215+
gallery_items = "".join(
216+
f'<img src="{image}" alt="Gallery image" loading="lazy" decoding="async" '
217+
f'class="w-full h-64 object-cover rounded-lg cursor-pointer hover:opacity-90 transition-opacity gallery-image" '
218+
f'data-modal-id="{modal_id}">'
219+
for image in project_gallery
220+
)
221+
gallery_html = (
222+
'<div class="mt-4"><h4 class="font-semibold text-zinc-900 dark:text-zinc-100 mb-2">Gallery</h4>'
223+
f'<div class="grid grid-cols-1 sm:grid-cols-2 gap-2">{gallery_items}</div></div>'
224+
)
225+
201226
features_html = ""
202227
project_features = project.get("features", [])
203228
if project_features:
@@ -224,6 +249,7 @@ def render_project_modal(project: dict[str, Any]) -> str:
224249
"modal_id": modal_id,
225250
"title": project_title,
226251
"details_html": details_html,
252+
"gallery_html": gallery_html,
227253
"features_html": features_html,
228254
"link_button_html": link_button_html,
229255
}
@@ -232,11 +258,7 @@ def render_project_modal(project: dict[str, Any]) -> str:
232258

233259

234260
def render_filter_buttons(filters: list[dict[str, str]]) -> str:
235-
active_classes = (
236-
"px-3 py-1 text-sm rounded-full bg-zinc-900 text-white dark:bg-zinc-100 "
237-
"dark:text-zinc-900 filter-btn active hover:bg-zinc-800 dark:hover:bg-zinc-200"
238-
)
239-
inactive_classes = (
261+
button_classes = (
240262
"px-3 py-1 text-sm rounded-full bg-zinc-200 text-zinc-700 dark:bg-zinc-800 "
241263
"dark:text-zinc-300 hover:bg-zinc-300 dark:hover:bg-zinc-700 filter-btn transition-colors"
242264
)
@@ -248,7 +270,7 @@ def render_filter_buttons(filters: list[dict[str, str]]) -> str:
248270
"key": filter_item["key"],
249271
"label": filter_item["label"],
250272
"aria_pressed": "true" if index == 0 else "false",
251-
"button_classes": active_classes if index == 0 else inactive_classes,
273+
"button_classes": button_classes,
252274
}
253275
}
254276
buttons.append(render_template("partials/project_filter_button.html", context))

0 commit comments

Comments
 (0)