@takuhon/ui 0.10.0 → 0.12.0

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/dist/index.js CHANGED
@@ -1,26 +1,8 @@
1
1
  // src/components/TakuhonProfile.tsx
2
2
  import "./tokens-TEMWJS5E.css";
3
3
 
4
- // src/lib/date-formatter.ts
5
- var YEAR_MONTH = /^(\d{4})-(0[1-9]|1[0-2])$/;
6
- function formatYearMonth(value, locale) {
7
- const match = YEAR_MONTH.exec(value);
8
- if (!match) return value;
9
- const year = Number(match[1]);
10
- const month = Number(match[2]);
11
- const date = /* @__PURE__ */ new Date(0);
12
- date.setUTCFullYear(year, month - 1, 1);
13
- const options = {
14
- year: "numeric",
15
- month: "short",
16
- timeZone: "UTC"
17
- };
18
- try {
19
- return new Intl.DateTimeFormat(locale || "en", options).format(date);
20
- } catch {
21
- return new Intl.DateTimeFormat("en", options).format(date);
22
- }
23
- }
4
+ // src/components/ActivitySection.tsx
5
+ import { renderActivitySvg } from "@takuhon/core";
24
6
 
25
7
  // src/lib/ui-labels.ts
26
8
  var EN = {
@@ -39,6 +21,7 @@ var EN = {
39
21
  "patentStatus.issued": "Issued",
40
22
  "patentStatus.expired": "Expired",
41
23
  "patentStatus.abandoned": "Abandoned",
24
+ "section.activity": "Activity",
42
25
  "section.career": "Career",
43
26
  "section.education": "Education",
44
27
  "section.certifications": "Certifications",
@@ -81,6 +64,7 @@ var JA = {
81
64
  "patentStatus.issued": "\u767B\u9332\u6E08",
82
65
  "patentStatus.expired": "\u5931\u52B9",
83
66
  "patentStatus.abandoned": "\u653E\u68C4",
67
+ "section.activity": "\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3",
84
68
  "section.career": "\u8077\u6B74",
85
69
  "section.education": "\u5B66\u6B74",
86
70
  "section.certifications": "\u8CC7\u683C\u30FB\u8A8D\u5B9A",
@@ -116,9 +100,46 @@ function getUILabel(key, locale) {
116
100
  return DICTIONARIES[locale]?.[key] ?? DICTIONARIES[base]?.[key] ?? EN[key];
117
101
  }
118
102
 
103
+ // src/components/ActivitySection.tsx
104
+ import styles from "./ActivitySection.module-SQFQYFCW.module.css";
105
+ import { jsx, jsxs } from "react/jsx-runtime";
106
+ function ActivitySection({
107
+ snapshot,
108
+ locale = "en"
109
+ }) {
110
+ if (!snapshot) return null;
111
+ const svg = renderActivitySvg(snapshot);
112
+ if (svg === "") return null;
113
+ return /* @__PURE__ */ jsxs("section", { className: styles.section, "aria-labelledby": "takuhon-activity-heading", children: [
114
+ /* @__PURE__ */ jsx("h2", { id: "takuhon-activity-heading", className: styles.heading, children: getUILabel("section.activity", locale) }),
115
+ /* @__PURE__ */ jsx("div", { className: styles.card, dangerouslySetInnerHTML: { __html: svg } })
116
+ ] });
117
+ }
118
+
119
+ // src/lib/date-formatter.ts
120
+ var YEAR_MONTH = /^(\d{4})-(0[1-9]|1[0-2])$/;
121
+ function formatYearMonth(value, locale) {
122
+ const match = YEAR_MONTH.exec(value);
123
+ if (!match) return value;
124
+ const year = Number(match[1]);
125
+ const month = Number(match[2]);
126
+ const date = /* @__PURE__ */ new Date(0);
127
+ date.setUTCFullYear(year, month - 1, 1);
128
+ const options = {
129
+ year: "numeric",
130
+ month: "short",
131
+ timeZone: "UTC"
132
+ };
133
+ try {
134
+ return new Intl.DateTimeFormat(locale || "en", options).format(date);
135
+ } catch {
136
+ return new Intl.DateTimeFormat("en", options).format(date);
137
+ }
138
+ }
139
+
119
140
  // src/components/CareerTimeline.tsx
120
- import styles from "./CareerTimeline.module-BGFX3LGA.module.css";
121
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
141
+ import styles2 from "./CareerTimeline.module-BGFX3LGA.module.css";
142
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
122
143
  function sortCareers(careers) {
123
144
  return [...careers].sort((a, b) => {
124
145
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -136,15 +157,15 @@ function CareerTimeline({
136
157
  }) {
137
158
  if (careers.length === 0) return null;
138
159
  const ordered = sortCareers(careers);
139
- return /* @__PURE__ */ jsxs("section", { className: styles.section, "aria-labelledby": "takuhon-career-heading", children: [
140
- /* @__PURE__ */ jsx("h2", { id: "takuhon-career-heading", className: styles.heading, children: getUILabel("section.career", locale) }),
141
- /* @__PURE__ */ jsx("ol", { className: styles.list, children: ordered.map((career) => /* @__PURE__ */ jsxs("li", { className: styles.item, children: [
142
- /* @__PURE__ */ jsx("div", { className: styles.timelineMarker, "aria-hidden": "true" }),
143
- /* @__PURE__ */ jsxs("div", { className: styles.content, children: [
144
- /* @__PURE__ */ jsx("p", { className: styles.role, children: career.url ? /* @__PURE__ */ jsxs(
160
+ return /* @__PURE__ */ jsxs2("section", { className: styles2.section, "aria-labelledby": "takuhon-career-heading", children: [
161
+ /* @__PURE__ */ jsx2("h2", { id: "takuhon-career-heading", className: styles2.heading, children: getUILabel("section.career", locale) }),
162
+ /* @__PURE__ */ jsx2("ol", { className: styles2.list, children: ordered.map((career) => /* @__PURE__ */ jsxs2("li", { className: styles2.item, children: [
163
+ /* @__PURE__ */ jsx2("div", { className: styles2.timelineMarker, "aria-hidden": "true" }),
164
+ /* @__PURE__ */ jsxs2("div", { className: styles2.content, children: [
165
+ /* @__PURE__ */ jsx2("p", { className: styles2.role, children: career.url ? /* @__PURE__ */ jsxs2(
145
166
  "a",
146
167
  {
147
- className: styles.organizationLink,
168
+ className: styles2.organizationLink,
148
169
  href: career.url,
149
170
  target: "_blank",
150
171
  rel: "noopener noreferrer",
@@ -154,26 +175,26 @@ function CareerTimeline({
154
175
  career.organization
155
176
  ]
156
177
  }
157
- ) : /* @__PURE__ */ jsxs(Fragment, { children: [
178
+ ) : /* @__PURE__ */ jsxs2(Fragment, { children: [
158
179
  career.role,
159
180
  " \xB7 ",
160
181
  career.organization
161
182
  ] }) }),
162
- /* @__PURE__ */ jsxs("p", { className: styles.range, children: [
163
- /* @__PURE__ */ jsx("time", { dateTime: career.startDate, children: formatYearMonth(career.startDate, locale) }),
183
+ /* @__PURE__ */ jsxs2("p", { className: styles2.range, children: [
184
+ /* @__PURE__ */ jsx2("time", { dateTime: career.startDate, children: formatYearMonth(career.startDate, locale) }),
164
185
  " \u2013 ",
165
- isOngoing(career) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx("time", { dateTime: career.endDate, children: formatYearMonth(career.endDate, locale) })
186
+ isOngoing(career) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx2("time", { dateTime: career.endDate, children: formatYearMonth(career.endDate, locale) })
166
187
  ] }),
167
- career.location?.display ? /* @__PURE__ */ jsx("p", { className: styles.location, children: career.location.display }) : null,
168
- career.description ? /* @__PURE__ */ jsx("p", { className: styles.description, children: career.description }) : null
188
+ career.location?.display ? /* @__PURE__ */ jsx2("p", { className: styles2.location, children: career.location.display }) : null,
189
+ career.description ? /* @__PURE__ */ jsx2("p", { className: styles2.description, children: career.description }) : null
169
190
  ] })
170
191
  ] }, career.id)) })
171
192
  ] });
172
193
  }
173
194
 
174
195
  // src/components/Certifications.tsx
175
- import styles2 from "./Certifications.module-2NMKPWLM.module.css";
176
- import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
196
+ import styles3 from "./Certifications.module-2NMKPWLM.module.css";
197
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
177
198
  function sortCerts(certs) {
178
199
  return [...certs].sort((a, b) => {
179
200
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -188,29 +209,29 @@ function Certifications({
188
209
  }) {
189
210
  if (certifications.length === 0) return null;
190
211
  const ordered = sortCerts(certifications);
191
- return /* @__PURE__ */ jsxs2("section", { className: styles2.section, "aria-labelledby": "takuhon-certifications-heading", children: [
192
- /* @__PURE__ */ jsx2("h2", { id: "takuhon-certifications-heading", className: styles2.heading, children: getUILabel("section.certifications", locale) }),
193
- /* @__PURE__ */ jsx2("ul", { className: styles2.list, children: ordered.map((cert) => /* @__PURE__ */ jsxs2("li", { className: styles2.item, children: [
194
- /* @__PURE__ */ jsx2("p", { className: styles2.title, children: cert.url ? /* @__PURE__ */ jsx2(
212
+ return /* @__PURE__ */ jsxs3("section", { className: styles3.section, "aria-labelledby": "takuhon-certifications-heading", children: [
213
+ /* @__PURE__ */ jsx3("h2", { id: "takuhon-certifications-heading", className: styles3.heading, children: getUILabel("section.certifications", locale) }),
214
+ /* @__PURE__ */ jsx3("ul", { className: styles3.list, children: ordered.map((cert) => /* @__PURE__ */ jsxs3("li", { className: styles3.item, children: [
215
+ /* @__PURE__ */ jsx3("p", { className: styles3.title, children: cert.url ? /* @__PURE__ */ jsx3(
195
216
  "a",
196
217
  {
197
- className: styles2.link,
218
+ className: styles3.link,
198
219
  href: cert.url,
199
220
  target: "_blank",
200
221
  rel: "noopener noreferrer",
201
222
  children: cert.title
202
223
  }
203
224
  ) : cert.title }),
204
- /* @__PURE__ */ jsx2("p", { className: styles2.issuer, children: cert.issuingOrganization }),
205
- /* @__PURE__ */ jsxs2("p", { className: styles2.range, children: [
206
- /* @__PURE__ */ jsx2("time", { dateTime: cert.issueDate, children: formatYearMonth(cert.issueDate, locale) }),
207
- cert.expirationDate === null ? /* @__PURE__ */ jsxs2("span", { className: styles2.tag, children: [
225
+ /* @__PURE__ */ jsx3("p", { className: styles3.issuer, children: cert.issuingOrganization }),
226
+ /* @__PURE__ */ jsxs3("p", { className: styles3.range, children: [
227
+ /* @__PURE__ */ jsx3("time", { dateTime: cert.issueDate, children: formatYearMonth(cert.issueDate, locale) }),
228
+ cert.expirationDate === null ? /* @__PURE__ */ jsxs3("span", { className: styles3.tag, children: [
208
229
  " ",
209
230
  "\xB7 ",
210
231
  getUILabel("certification.noExpiration", locale)
211
- ] }) : cert.expirationDate !== void 0 ? /* @__PURE__ */ jsxs2(Fragment2, { children: [
232
+ ] }) : cert.expirationDate !== void 0 ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
212
233
  " \u2013 ",
213
- /* @__PURE__ */ jsx2("time", { dateTime: cert.expirationDate, children: formatYearMonth(cert.expirationDate, locale) })
234
+ /* @__PURE__ */ jsx3("time", { dateTime: cert.expirationDate, children: formatYearMonth(cert.expirationDate, locale) })
214
235
  ] }) : null
215
236
  ] })
216
237
  ] }, cert.id)) })
@@ -218,22 +239,22 @@ function Certifications({
218
239
  }
219
240
 
220
241
  // src/components/ContactInfo.tsx
221
- import styles3 from "./ContactInfo.module-7SO24KHC.module.css";
222
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
242
+ import styles4 from "./ContactInfo.module-7SO24KHC.module.css";
243
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
223
244
  function ContactInfo({
224
245
  contact,
225
246
  locale = "en"
226
247
  }) {
227
248
  const showEmail = contact.showEmail === true && contact.email !== void 0;
228
249
  if (!showEmail && contact.formUrl === void 0) return null;
229
- return /* @__PURE__ */ jsxs3("section", { className: styles3.section, "aria-labelledby": "takuhon-contact-heading", children: [
230
- /* @__PURE__ */ jsx3("h2", { id: "takuhon-contact-heading", className: styles3.heading, children: getUILabel("section.contact", locale) }),
231
- /* @__PURE__ */ jsxs3("ul", { className: styles3.list, children: [
232
- showEmail && contact.email !== void 0 ? /* @__PURE__ */ jsx3("li", { className: styles3.item, children: /* @__PURE__ */ jsx3("a", { className: styles3.link, href: `mailto:${contact.email}`, children: contact.email }) }) : null,
233
- contact.formUrl !== void 0 ? /* @__PURE__ */ jsx3("li", { className: styles3.item, children: /* @__PURE__ */ jsx3(
250
+ return /* @__PURE__ */ jsxs4("section", { className: styles4.section, "aria-labelledby": "takuhon-contact-heading", children: [
251
+ /* @__PURE__ */ jsx4("h2", { id: "takuhon-contact-heading", className: styles4.heading, children: getUILabel("section.contact", locale) }),
252
+ /* @__PURE__ */ jsxs4("ul", { className: styles4.list, children: [
253
+ showEmail && contact.email !== void 0 ? /* @__PURE__ */ jsx4("li", { className: styles4.item, children: /* @__PURE__ */ jsx4("a", { className: styles4.link, href: `mailto:${contact.email}`, children: contact.email }) }) : null,
254
+ contact.formUrl !== void 0 ? /* @__PURE__ */ jsx4("li", { className: styles4.item, children: /* @__PURE__ */ jsx4(
234
255
  "a",
235
256
  {
236
- className: styles3.link,
257
+ className: styles4.link,
237
258
  href: contact.formUrl,
238
259
  target: "_blank",
239
260
  rel: "noopener noreferrer",
@@ -245,8 +266,8 @@ function ContactInfo({
245
266
  }
246
267
 
247
268
  // src/components/Courses.tsx
248
- import styles4 from "./Courses.module-EVDSFNGW.module.css";
249
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
269
+ import styles5 from "./Courses.module-EVDSFNGW.module.css";
270
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
250
271
  function sortCourses(entries) {
251
272
  return [...entries].sort((a, b) => {
252
273
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -258,30 +279,30 @@ function sortCourses(entries) {
258
279
  function Courses({ courses, locale = "en" }) {
259
280
  if (courses.length === 0) return null;
260
281
  const ordered = sortCourses(courses);
261
- return /* @__PURE__ */ jsxs4("section", { className: styles4.section, "aria-labelledby": "takuhon-courses-heading", children: [
262
- /* @__PURE__ */ jsx4("h2", { id: "takuhon-courses-heading", className: styles4.heading, children: getUILabel("section.courses", locale) }),
263
- /* @__PURE__ */ jsx4("ul", { className: styles4.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs4("li", { className: styles4.item, children: [
264
- /* @__PURE__ */ jsx4("p", { className: styles4.title, children: entry.certificateUrl ? /* @__PURE__ */ jsx4(
282
+ return /* @__PURE__ */ jsxs5("section", { className: styles5.section, "aria-labelledby": "takuhon-courses-heading", children: [
283
+ /* @__PURE__ */ jsx5("h2", { id: "takuhon-courses-heading", className: styles5.heading, children: getUILabel("section.courses", locale) }),
284
+ /* @__PURE__ */ jsx5("ul", { className: styles5.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs5("li", { className: styles5.item, children: [
285
+ /* @__PURE__ */ jsx5("p", { className: styles5.title, children: entry.certificateUrl ? /* @__PURE__ */ jsx5(
265
286
  "a",
266
287
  {
267
- className: styles4.link,
288
+ className: styles5.link,
268
289
  href: entry.certificateUrl,
269
290
  target: "_blank",
270
291
  rel: "noopener noreferrer",
271
292
  children: entry.title
272
293
  }
273
294
  ) : entry.title }),
274
- entry.provider ? /* @__PURE__ */ jsx4("p", { className: styles4.provider, children: entry.provider }) : null,
275
- entry.courseNumber ? /* @__PURE__ */ jsx4("p", { className: styles4.courseNumber, children: entry.courseNumber }) : null,
276
- entry.completionDate ? /* @__PURE__ */ jsx4("p", { className: styles4.date, children: /* @__PURE__ */ jsx4("time", { dateTime: entry.completionDate, children: formatYearMonth(entry.completionDate, locale) }) }) : null,
277
- entry.description ? /* @__PURE__ */ jsx4("p", { className: styles4.description, children: entry.description }) : null
295
+ entry.provider ? /* @__PURE__ */ jsx5("p", { className: styles5.provider, children: entry.provider }) : null,
296
+ entry.courseNumber ? /* @__PURE__ */ jsx5("p", { className: styles5.courseNumber, children: entry.courseNumber }) : null,
297
+ entry.completionDate ? /* @__PURE__ */ jsx5("p", { className: styles5.date, children: /* @__PURE__ */ jsx5("time", { dateTime: entry.completionDate, children: formatYearMonth(entry.completionDate, locale) }) }) : null,
298
+ entry.description ? /* @__PURE__ */ jsx5("p", { className: styles5.description, children: entry.description }) : null
278
299
  ] }, entry.id)) })
279
300
  ] });
280
301
  }
281
302
 
282
303
  // src/components/EducationTimeline.tsx
283
- import styles5 from "./EducationTimeline.module-7YQTH6QU.module.css";
284
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
304
+ import styles6 from "./EducationTimeline.module-7YQTH6QU.module.css";
305
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
285
306
  function sortEducation(entries) {
286
307
  return [...entries].sort((a, b) => {
287
308
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -305,31 +326,31 @@ function EducationTimeline({
305
326
  }) {
306
327
  if (education.length === 0) return null;
307
328
  const ordered = sortEducation(education);
308
- return /* @__PURE__ */ jsxs5("section", { className: styles5.section, "aria-labelledby": "takuhon-education-heading", children: [
309
- /* @__PURE__ */ jsx5("h2", { id: "takuhon-education-heading", className: styles5.heading, children: getUILabel("section.education", locale) }),
310
- /* @__PURE__ */ jsx5("ol", { className: styles5.list, children: ordered.map((entry) => {
329
+ return /* @__PURE__ */ jsxs6("section", { className: styles6.section, "aria-labelledby": "takuhon-education-heading", children: [
330
+ /* @__PURE__ */ jsx6("h2", { id: "takuhon-education-heading", className: styles6.heading, children: getUILabel("section.education", locale) }),
331
+ /* @__PURE__ */ jsx6("ol", { className: styles6.list, children: ordered.map((entry) => {
311
332
  const study = composeStudyLine(entry);
312
- return /* @__PURE__ */ jsxs5("li", { className: styles5.item, children: [
313
- /* @__PURE__ */ jsx5("div", { className: styles5.timelineMarker, "aria-hidden": "true" }),
314
- /* @__PURE__ */ jsxs5("div", { className: styles5.content, children: [
315
- /* @__PURE__ */ jsx5("p", { className: styles5.institution, children: entry.url ? /* @__PURE__ */ jsx5(
333
+ return /* @__PURE__ */ jsxs6("li", { className: styles6.item, children: [
334
+ /* @__PURE__ */ jsx6("div", { className: styles6.timelineMarker, "aria-hidden": "true" }),
335
+ /* @__PURE__ */ jsxs6("div", { className: styles6.content, children: [
336
+ /* @__PURE__ */ jsx6("p", { className: styles6.institution, children: entry.url ? /* @__PURE__ */ jsx6(
316
337
  "a",
317
338
  {
318
- className: styles5.link,
339
+ className: styles6.link,
319
340
  href: entry.url,
320
341
  target: "_blank",
321
342
  rel: "noopener noreferrer",
322
343
  children: entry.institution
323
344
  }
324
345
  ) : entry.institution }),
325
- study ? /* @__PURE__ */ jsx5("p", { className: styles5.study, children: study }) : null,
326
- /* @__PURE__ */ jsxs5("p", { className: styles5.range, children: [
327
- /* @__PURE__ */ jsx5("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
346
+ study ? /* @__PURE__ */ jsx6("p", { className: styles6.study, children: study }) : null,
347
+ /* @__PURE__ */ jsxs6("p", { className: styles6.range, children: [
348
+ /* @__PURE__ */ jsx6("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
328
349
  " \u2013 ",
329
- isOngoing2(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx5("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
350
+ isOngoing2(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx6("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
330
351
  ] }),
331
- entry.grade ? /* @__PURE__ */ jsx5("p", { className: styles5.grade, children: entry.grade }) : null,
332
- entry.description ? /* @__PURE__ */ jsx5("p", { className: styles5.description, children: entry.description }) : null
352
+ entry.grade ? /* @__PURE__ */ jsx6("p", { className: styles6.grade, children: entry.grade }) : null,
353
+ entry.description ? /* @__PURE__ */ jsx6("p", { className: styles6.description, children: entry.description }) : null
333
354
  ] })
334
355
  ] }, entry.id);
335
356
  }) })
@@ -337,16 +358,16 @@ function EducationTimeline({
337
358
  }
338
359
 
339
360
  // src/components/Footer.tsx
340
- import styles6 from "./Footer.module-HLC5GXVI.module.css";
341
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
361
+ import styles7 from "./Footer.module-HLC5GXVI.module.css";
362
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
342
363
  function Footer() {
343
- return /* @__PURE__ */ jsx6("footer", { className: styles6.footer, children: /* @__PURE__ */ jsxs6("p", { className: styles6.line, children: [
364
+ return /* @__PURE__ */ jsx7("footer", { className: styles7.footer, children: /* @__PURE__ */ jsxs7("p", { className: styles7.line, children: [
344
365
  "Powered by",
345
366
  " ",
346
- /* @__PURE__ */ jsx6(
367
+ /* @__PURE__ */ jsx7(
347
368
  "a",
348
369
  {
349
- className: styles6.link,
370
+ className: styles7.link,
350
371
  href: "https://github.com/takuhon-dev/takuhon",
351
372
  target: "_blank",
352
373
  rel: "noopener noreferrer",
@@ -357,8 +378,8 @@ function Footer() {
357
378
  }
358
379
 
359
380
  // src/components/HonorsList.tsx
360
- import styles7 from "./HonorsList.module-AQN3CT7O.module.css";
361
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
381
+ import styles8 from "./HonorsList.module-AQN3CT7O.module.css";
382
+ import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
362
383
  function sortHonors(honors) {
363
384
  return [...honors].sort((a, b) => {
364
385
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -370,32 +391,32 @@ function sortHonors(honors) {
370
391
  function HonorsList({ honors, locale = "en" }) {
371
392
  if (honors.length === 0) return null;
372
393
  const ordered = sortHonors(honors);
373
- return /* @__PURE__ */ jsxs7("section", { className: styles7.section, "aria-labelledby": "takuhon-honors-heading", children: [
374
- /* @__PURE__ */ jsx7("h2", { id: "takuhon-honors-heading", className: styles7.heading, children: getUILabel("section.honors", locale) }),
375
- /* @__PURE__ */ jsx7("ul", { className: styles7.list, children: ordered.map((honor) => /* @__PURE__ */ jsxs7("li", { className: styles7.item, children: [
376
- /* @__PURE__ */ jsx7("p", { className: styles7.title, children: honor.url ? /* @__PURE__ */ jsx7(
394
+ return /* @__PURE__ */ jsxs8("section", { className: styles8.section, "aria-labelledby": "takuhon-honors-heading", children: [
395
+ /* @__PURE__ */ jsx8("h2", { id: "takuhon-honors-heading", className: styles8.heading, children: getUILabel("section.honors", locale) }),
396
+ /* @__PURE__ */ jsx8("ul", { className: styles8.list, children: ordered.map((honor) => /* @__PURE__ */ jsxs8("li", { className: styles8.item, children: [
397
+ /* @__PURE__ */ jsx8("p", { className: styles8.title, children: honor.url ? /* @__PURE__ */ jsx8(
377
398
  "a",
378
399
  {
379
- className: styles7.link,
400
+ className: styles8.link,
380
401
  href: honor.url,
381
402
  target: "_blank",
382
403
  rel: "noopener noreferrer",
383
404
  children: honor.title
384
405
  }
385
406
  ) : honor.title }),
386
- /* @__PURE__ */ jsxs7("p", { className: styles7.meta, children: [
407
+ /* @__PURE__ */ jsxs8("p", { className: styles8.meta, children: [
387
408
  honor.issuer,
388
409
  " \xB7 ",
389
- /* @__PURE__ */ jsx7("time", { dateTime: honor.date, children: formatYearMonth(honor.date, locale) })
410
+ /* @__PURE__ */ jsx8("time", { dateTime: honor.date, children: formatYearMonth(honor.date, locale) })
390
411
  ] }),
391
- honor.description ? /* @__PURE__ */ jsx7("p", { className: styles7.description, children: honor.description }) : null
412
+ honor.description ? /* @__PURE__ */ jsx8("p", { className: styles8.description, children: honor.description }) : null
392
413
  ] }, honor.id)) })
393
414
  ] });
394
415
  }
395
416
 
396
417
  // src/components/Languages.tsx
397
- import styles8 from "./Languages.module-X6RQNFRY.module.css";
398
- import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
418
+ import styles9 from "./Languages.module-X6RQNFRY.module.css";
419
+ import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
399
420
  function sortLanguages(languages) {
400
421
  return [...languages].sort((a, b) => {
401
422
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -406,18 +427,18 @@ function sortLanguages(languages) {
406
427
  function Languages({ languages, locale = "en" }) {
407
428
  if (languages.length === 0) return null;
408
429
  const ordered = sortLanguages(languages);
409
- return /* @__PURE__ */ jsxs8("section", { className: styles8.section, "aria-labelledby": "takuhon-languages-heading", children: [
410
- /* @__PURE__ */ jsx8("h2", { id: "takuhon-languages-heading", className: styles8.heading, children: getUILabel("section.languages", locale) }),
411
- /* @__PURE__ */ jsx8("ul", { className: styles8.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs8("li", { className: styles8.item, children: [
412
- /* @__PURE__ */ jsx8("span", { className: styles8.name, lang: entry.language, children: entry.displayName ?? entry.language }),
413
- /* @__PURE__ */ jsx8("span", { className: styles8.proficiency, children: getUILabel(`proficiency.${entry.proficiency}`, locale) })
430
+ return /* @__PURE__ */ jsxs9("section", { className: styles9.section, "aria-labelledby": "takuhon-languages-heading", children: [
431
+ /* @__PURE__ */ jsx9("h2", { id: "takuhon-languages-heading", className: styles9.heading, children: getUILabel("section.languages", locale) }),
432
+ /* @__PURE__ */ jsx9("ul", { className: styles9.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs9("li", { className: styles9.item, children: [
433
+ /* @__PURE__ */ jsx9("span", { className: styles9.name, lang: entry.language, children: entry.displayName ?? entry.language }),
434
+ /* @__PURE__ */ jsx9("span", { className: styles9.proficiency, children: getUILabel(`proficiency.${entry.proficiency}`, locale) })
414
435
  ] }, entry.id)) })
415
436
  ] });
416
437
  }
417
438
 
418
439
  // src/components/LinksList.tsx
419
- import styles9 from "./LinksList.module-QPSFPOF3.module.css";
420
- import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
440
+ import styles10 from "./LinksList.module-QPSFPOF3.module.css";
441
+ import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
421
442
  function sortLinks(links) {
422
443
  return [...links].sort((a, b) => {
423
444
  const aFeatured = a.featured ? 1 : 0;
@@ -436,25 +457,25 @@ function formatLinkLabel(link) {
436
457
  function LinksList({ links, locale = "en" }) {
437
458
  if (links.length === 0) return null;
438
459
  const ordered = sortLinks(links);
439
- return /* @__PURE__ */ jsx9("nav", { "aria-label": getUILabel("a11y.profileLinks", locale), className: styles9.nav, children: /* @__PURE__ */ jsx9("ul", { className: styles9.list, children: ordered.map((link) => /* @__PURE__ */ jsx9("li", { className: styles9.item, children: /* @__PURE__ */ jsxs9(
460
+ return /* @__PURE__ */ jsx10("nav", { "aria-label": getUILabel("a11y.profileLinks", locale), className: styles10.nav, children: /* @__PURE__ */ jsx10("ul", { className: styles10.list, children: ordered.map((link) => /* @__PURE__ */ jsx10("li", { className: styles10.item, children: /* @__PURE__ */ jsxs10(
440
461
  "a",
441
462
  {
442
- className: styles9.link,
463
+ className: styles10.link,
443
464
  href: link.url,
444
465
  target: "_blank",
445
466
  rel: "noopener noreferrer",
446
467
  "data-featured": link.featured ? "true" : void 0,
447
468
  children: [
448
- link.iconUrl ? /* @__PURE__ */ jsx9("img", { className: styles9.icon, src: link.iconUrl, alt: "" }) : null,
449
- /* @__PURE__ */ jsx9("span", { className: styles9.label, children: formatLinkLabel(link) })
469
+ link.iconUrl ? /* @__PURE__ */ jsx10("img", { className: styles10.icon, src: link.iconUrl, alt: "" }) : null,
470
+ /* @__PURE__ */ jsx10("span", { className: styles10.label, children: formatLinkLabel(link) })
450
471
  ]
451
472
  }
452
473
  ) }, link.id)) }) });
453
474
  }
454
475
 
455
476
  // src/components/Memberships.tsx
456
- import styles10 from "./Memberships.module-SMJBJFA2.module.css";
457
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
477
+ import styles11 from "./Memberships.module-SMJBJFA2.module.css";
478
+ import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
458
479
  function sortMemberships(entries) {
459
480
  return [...entries].sort((a, b) => {
460
481
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -472,36 +493,36 @@ function Memberships({
472
493
  }) {
473
494
  if (memberships.length === 0) return null;
474
495
  const ordered = sortMemberships(memberships);
475
- return /* @__PURE__ */ jsxs10("section", { className: styles10.section, "aria-labelledby": "takuhon-memberships-heading", children: [
476
- /* @__PURE__ */ jsx10("h2", { id: "takuhon-memberships-heading", className: styles10.heading, children: getUILabel("section.memberships", locale) }),
477
- /* @__PURE__ */ jsx10("ol", { className: styles10.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs10("li", { className: styles10.item, children: [
478
- /* @__PURE__ */ jsx10("div", { className: styles10.timelineMarker, "aria-hidden": "true" }),
479
- /* @__PURE__ */ jsxs10("div", { className: styles10.content, children: [
480
- /* @__PURE__ */ jsx10("p", { className: styles10.organization, children: entry.url ? /* @__PURE__ */ jsx10(
496
+ return /* @__PURE__ */ jsxs11("section", { className: styles11.section, "aria-labelledby": "takuhon-memberships-heading", children: [
497
+ /* @__PURE__ */ jsx11("h2", { id: "takuhon-memberships-heading", className: styles11.heading, children: getUILabel("section.memberships", locale) }),
498
+ /* @__PURE__ */ jsx11("ol", { className: styles11.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs11("li", { className: styles11.item, children: [
499
+ /* @__PURE__ */ jsx11("div", { className: styles11.timelineMarker, "aria-hidden": "true" }),
500
+ /* @__PURE__ */ jsxs11("div", { className: styles11.content, children: [
501
+ /* @__PURE__ */ jsx11("p", { className: styles11.organization, children: entry.url ? /* @__PURE__ */ jsx11(
481
502
  "a",
482
503
  {
483
- className: styles10.link,
504
+ className: styles11.link,
484
505
  href: entry.url,
485
506
  target: "_blank",
486
507
  rel: "noopener noreferrer",
487
508
  children: entry.organization
488
509
  }
489
510
  ) : entry.organization }),
490
- entry.role ? /* @__PURE__ */ jsx10("p", { className: styles10.role, children: entry.role }) : null,
491
- /* @__PURE__ */ jsxs10("p", { className: styles10.range, children: [
492
- /* @__PURE__ */ jsx10("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
511
+ entry.role ? /* @__PURE__ */ jsx11("p", { className: styles11.role, children: entry.role }) : null,
512
+ /* @__PURE__ */ jsxs11("p", { className: styles11.range, children: [
513
+ /* @__PURE__ */ jsx11("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
493
514
  " \u2013 ",
494
- isOngoing3(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx10("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
515
+ isOngoing3(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx11("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
495
516
  ] }),
496
- entry.description ? /* @__PURE__ */ jsx10("p", { className: styles10.description, children: entry.description }) : null
517
+ entry.description ? /* @__PURE__ */ jsx11("p", { className: styles11.description, children: entry.description }) : null
497
518
  ] })
498
519
  ] }, entry.id)) })
499
520
  ] });
500
521
  }
501
522
 
502
523
  // src/components/Patents.tsx
503
- import styles11 from "./Patents.module-L3GWPB3V.module.css";
504
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
524
+ import styles12 from "./Patents.module-L3GWPB3V.module.css";
525
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
505
526
  function sortPatents(entries) {
506
527
  return [...entries].sort((a, b) => {
507
528
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -515,54 +536,54 @@ function sortPatents(entries) {
515
536
  function Patents({ patents, locale = "en" }) {
516
537
  if (patents.length === 0) return null;
517
538
  const ordered = sortPatents(patents);
518
- return /* @__PURE__ */ jsxs11("section", { className: styles11.section, "aria-labelledby": "takuhon-patents-heading", children: [
519
- /* @__PURE__ */ jsx11("h2", { id: "takuhon-patents-heading", className: styles11.heading, children: getUILabel("section.patents", locale) }),
520
- /* @__PURE__ */ jsx11("ul", { className: styles11.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs11("li", { className: styles11.item, children: [
521
- /* @__PURE__ */ jsxs11("p", { className: styles11.title, children: [
522
- entry.url ? /* @__PURE__ */ jsx11(
539
+ return /* @__PURE__ */ jsxs12("section", { className: styles12.section, "aria-labelledby": "takuhon-patents-heading", children: [
540
+ /* @__PURE__ */ jsx12("h2", { id: "takuhon-patents-heading", className: styles12.heading, children: getUILabel("section.patents", locale) }),
541
+ /* @__PURE__ */ jsx12("ul", { className: styles12.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs12("li", { className: styles12.item, children: [
542
+ /* @__PURE__ */ jsxs12("p", { className: styles12.title, children: [
543
+ entry.url ? /* @__PURE__ */ jsx12(
523
544
  "a",
524
545
  {
525
- className: styles11.link,
546
+ className: styles12.link,
526
547
  href: entry.url,
527
548
  target: "_blank",
528
549
  rel: "noopener noreferrer",
529
550
  children: entry.title
530
551
  }
531
552
  ) : entry.title,
532
- /* @__PURE__ */ jsxs11("span", { className: styles11.statusBadge, "data-status": entry.status, children: [
533
- /* @__PURE__ */ jsx11("span", { className: styles11.srOnly, children: getUILabel("a11y.statusPrefix", locale) }),
553
+ /* @__PURE__ */ jsxs12("span", { className: styles12.statusBadge, "data-status": entry.status, children: [
554
+ /* @__PURE__ */ jsx12("span", { className: styles12.srOnly, children: getUILabel("a11y.statusPrefix", locale) }),
534
555
  getUILabel(`patentStatus.${entry.status}`, locale)
535
556
  ] })
536
557
  ] }),
537
- /* @__PURE__ */ jsx11("p", { className: styles11.patentNumber, children: entry.patentNumber }),
538
- entry.office ? /* @__PURE__ */ jsx11("p", { className: styles11.office, children: entry.office }) : null,
539
- entry.filingDate !== void 0 || entry.grantDate !== void 0 ? /* @__PURE__ */ jsxs11("p", { className: styles11.dates, children: [
540
- entry.filingDate ? /* @__PURE__ */ jsxs11(Fragment3, { children: [
558
+ /* @__PURE__ */ jsx12("p", { className: styles12.patentNumber, children: entry.patentNumber }),
559
+ entry.office ? /* @__PURE__ */ jsx12("p", { className: styles12.office, children: entry.office }) : null,
560
+ entry.filingDate !== void 0 || entry.grantDate !== void 0 ? /* @__PURE__ */ jsxs12("p", { className: styles12.dates, children: [
561
+ entry.filingDate ? /* @__PURE__ */ jsxs12(Fragment3, { children: [
541
562
  `${getUILabel("patent.filed", locale)} `,
542
- /* @__PURE__ */ jsx11("time", { dateTime: entry.filingDate, children: formatYearMonth(entry.filingDate, locale) })
563
+ /* @__PURE__ */ jsx12("time", { dateTime: entry.filingDate, children: formatYearMonth(entry.filingDate, locale) })
543
564
  ] }) : null,
544
565
  entry.filingDate && entry.grantDate ? " \xB7 " : null,
545
- entry.grantDate ? /* @__PURE__ */ jsxs11(Fragment3, { children: [
566
+ entry.grantDate ? /* @__PURE__ */ jsxs12(Fragment3, { children: [
546
567
  `${getUILabel("patent.granted", locale)} `,
547
- /* @__PURE__ */ jsx11("time", { dateTime: entry.grantDate, children: formatYearMonth(entry.grantDate, locale) })
568
+ /* @__PURE__ */ jsx12("time", { dateTime: entry.grantDate, children: formatYearMonth(entry.grantDate, locale) })
548
569
  ] }) : null
549
570
  ] }) : null,
550
- entry.coInventors && entry.coInventors.length > 0 ? /* @__PURE__ */ jsx11("p", { className: styles11.coInventors, children: `${getUILabel("patent.coInventorsPrefix", locale)}${entry.coInventors.join(", ")}` }) : null,
551
- entry.description ? /* @__PURE__ */ jsx11("p", { className: styles11.description, children: entry.description }) : null
571
+ entry.coInventors && entry.coInventors.length > 0 ? /* @__PURE__ */ jsx12("p", { className: styles12.coInventors, children: `${getUILabel("patent.coInventorsPrefix", locale)}${entry.coInventors.join(", ")}` }) : null,
572
+ entry.description ? /* @__PURE__ */ jsx12("p", { className: styles12.description, children: entry.description }) : null
552
573
  ] }, entry.id)) })
553
574
  ] });
554
575
  }
555
576
 
556
577
  // src/components/ProfileHeader.tsx
557
- import styles12 from "./ProfileHeader.module-EK27UTZL.module.css";
558
- import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
578
+ import styles13 from "./ProfileHeader.module-EK27UTZL.module.css";
579
+ import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
559
580
  function ProfileHeader({ profile }) {
560
581
  const locationLabel = profile.location?.display ?? profile.location?.locality;
561
- return /* @__PURE__ */ jsxs12("header", { className: styles12.header, children: [
562
- profile.avatar ? /* @__PURE__ */ jsx12(
582
+ return /* @__PURE__ */ jsxs13("header", { className: styles13.header, children: [
583
+ profile.avatar ? /* @__PURE__ */ jsx13(
563
584
  "img",
564
585
  {
565
- className: styles12.avatar,
586
+ className: styles13.avatar,
566
587
  src: profile.avatar.url,
567
588
  alt: profile.avatar.alt ?? "",
568
589
  width: 128,
@@ -571,16 +592,16 @@ function ProfileHeader({ profile }) {
571
592
  decoding: "async"
572
593
  }
573
594
  ) : null,
574
- /* @__PURE__ */ jsx12("h1", { className: styles12.displayName, children: profile.displayName }),
575
- profile.tagline ? /* @__PURE__ */ jsx12("p", { className: styles12.tagline, children: profile.tagline }) : null,
576
- locationLabel ? /* @__PURE__ */ jsx12("p", { className: styles12.location, children: locationLabel }) : null,
577
- profile.bio ? /* @__PURE__ */ jsx12("p", { className: styles12.bio, children: profile.bio }) : null
595
+ /* @__PURE__ */ jsx13("h1", { className: styles13.displayName, children: profile.displayName }),
596
+ profile.tagline ? /* @__PURE__ */ jsx13("p", { className: styles13.tagline, children: profile.tagline }) : null,
597
+ locationLabel ? /* @__PURE__ */ jsx13("p", { className: styles13.location, children: locationLabel }) : null,
598
+ profile.bio ? /* @__PURE__ */ jsx13("p", { className: styles13.bio, children: profile.bio }) : null
578
599
  ] });
579
600
  }
580
601
 
581
602
  // src/components/ProjectsList.tsx
582
- import styles13 from "./ProjectsList.module-JKGGZRKO.module.css";
583
- import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
603
+ import styles14 from "./ProjectsList.module-JKGGZRKO.module.css";
604
+ import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
584
605
  function sortProjects(projects) {
585
606
  return [...projects].sort((a, b) => {
586
607
  const aHighlighted = a.highlighted ? 1 : 0;
@@ -597,31 +618,31 @@ function ProjectsList({
597
618
  }) {
598
619
  if (projects.length === 0) return null;
599
620
  const ordered = sortProjects(projects);
600
- return /* @__PURE__ */ jsxs13("section", { className: styles13.section, "aria-labelledby": "takuhon-projects-heading", children: [
601
- /* @__PURE__ */ jsx13("h2", { id: "takuhon-projects-heading", className: styles13.heading, children: getUILabel("section.projects", locale) }),
602
- /* @__PURE__ */ jsx13("ul", { className: styles13.list, children: ordered.map((project) => /* @__PURE__ */ jsxs13(
621
+ return /* @__PURE__ */ jsxs14("section", { className: styles14.section, "aria-labelledby": "takuhon-projects-heading", children: [
622
+ /* @__PURE__ */ jsx14("h2", { id: "takuhon-projects-heading", className: styles14.heading, children: getUILabel("section.projects", locale) }),
623
+ /* @__PURE__ */ jsx14("ul", { className: styles14.list, children: ordered.map((project) => /* @__PURE__ */ jsxs14(
603
624
  "li",
604
625
  {
605
- className: styles13.item,
626
+ className: styles14.item,
606
627
  "data-highlighted": project.highlighted ? "true" : void 0,
607
628
  children: [
608
- /* @__PURE__ */ jsx13("p", { className: styles13.title, children: project.url ? /* @__PURE__ */ jsx13(
629
+ /* @__PURE__ */ jsx14("p", { className: styles14.title, children: project.url ? /* @__PURE__ */ jsx14(
609
630
  "a",
610
631
  {
611
- className: styles13.titleLink,
632
+ className: styles14.titleLink,
612
633
  href: project.url,
613
634
  target: "_blank",
614
635
  rel: "noopener noreferrer",
615
636
  children: project.title
616
637
  }
617
638
  ) : project.title }),
618
- project.startDate !== void 0 ? /* @__PURE__ */ jsxs13("p", { className: styles13.range, children: [
619
- /* @__PURE__ */ jsx13("time", { dateTime: project.startDate, children: formatYearMonth(project.startDate, locale) }),
639
+ project.startDate !== void 0 ? /* @__PURE__ */ jsxs14("p", { className: styles14.range, children: [
640
+ /* @__PURE__ */ jsx14("time", { dateTime: project.startDate, children: formatYearMonth(project.startDate, locale) }),
620
641
  " \u2013 ",
621
- project.endDate ? /* @__PURE__ */ jsx13("time", { dateTime: project.endDate, children: formatYearMonth(project.endDate, locale) }) : getUILabel("timeline.present", locale)
642
+ project.endDate ? /* @__PURE__ */ jsx14("time", { dateTime: project.endDate, children: formatYearMonth(project.endDate, locale) }) : getUILabel("timeline.present", locale)
622
643
  ] }) : null,
623
- project.description ? /* @__PURE__ */ jsx13("p", { className: styles13.description, children: project.description }) : null,
624
- project.tags && project.tags.length > 0 ? /* @__PURE__ */ jsx13("ul", { className: styles13.tags, "aria-label": getUILabel("a11y.tags", locale), children: project.tags.map((tag) => /* @__PURE__ */ jsx13("li", { className: styles13.tag, children: tag }, tag)) }) : null
644
+ project.description ? /* @__PURE__ */ jsx14("p", { className: styles14.description, children: project.description }) : null,
645
+ project.tags && project.tags.length > 0 ? /* @__PURE__ */ jsx14("ul", { className: styles14.tags, "aria-label": getUILabel("a11y.tags", locale), children: project.tags.map((tag) => /* @__PURE__ */ jsx14("li", { className: styles14.tag, children: tag }, tag)) }) : null
625
646
  ]
626
647
  },
627
648
  project.id
@@ -630,8 +651,8 @@ function ProjectsList({
630
651
  }
631
652
 
632
653
  // src/components/Publications.tsx
633
- import styles14 from "./Publications.module-INRTHJMO.module.css";
634
- import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
654
+ import styles15 from "./Publications.module-INRTHJMO.module.css";
655
+ import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
635
656
  function sortPublications(entries) {
636
657
  return [...entries].sort((a, b) => {
637
658
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -649,28 +670,28 @@ function Publications({
649
670
  }) {
650
671
  if (publications.length === 0) return null;
651
672
  const ordered = sortPublications(publications);
652
- return /* @__PURE__ */ jsxs14("section", { className: styles14.section, "aria-labelledby": "takuhon-publications-heading", children: [
653
- /* @__PURE__ */ jsx14("h2", { id: "takuhon-publications-heading", className: styles14.heading, children: getUILabel("section.publications", locale) }),
654
- /* @__PURE__ */ jsx14("ul", { className: styles14.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs14("li", { className: styles14.item, children: [
655
- /* @__PURE__ */ jsx14("p", { className: styles14.title, children: entry.url ? /* @__PURE__ */ jsx14(
673
+ return /* @__PURE__ */ jsxs15("section", { className: styles15.section, "aria-labelledby": "takuhon-publications-heading", children: [
674
+ /* @__PURE__ */ jsx15("h2", { id: "takuhon-publications-heading", className: styles15.heading, children: getUILabel("section.publications", locale) }),
675
+ /* @__PURE__ */ jsx15("ul", { className: styles15.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs15("li", { className: styles15.item, children: [
676
+ /* @__PURE__ */ jsx15("p", { className: styles15.title, children: entry.url ? /* @__PURE__ */ jsx15(
656
677
  "a",
657
678
  {
658
- className: styles14.link,
679
+ className: styles15.link,
659
680
  href: entry.url,
660
681
  target: "_blank",
661
682
  rel: "noopener noreferrer",
662
683
  children: entry.title
663
684
  }
664
685
  ) : entry.title }),
665
- entry.publisher ? /* @__PURE__ */ jsx14("p", { className: styles14.publisher, children: entry.publisher }) : null,
666
- /* @__PURE__ */ jsx14("p", { className: styles14.date, children: /* @__PURE__ */ jsx14("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) }) }),
667
- entry.coAuthors && entry.coAuthors.length > 0 ? /* @__PURE__ */ jsx14("p", { className: styles14.coAuthors, children: `${getUILabel("publication.coAuthorsPrefix", locale)}${entry.coAuthors.join(", ")}` }) : null,
686
+ entry.publisher ? /* @__PURE__ */ jsx15("p", { className: styles15.publisher, children: entry.publisher }) : null,
687
+ /* @__PURE__ */ jsx15("p", { className: styles15.date, children: /* @__PURE__ */ jsx15("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) }) }),
688
+ entry.coAuthors && entry.coAuthors.length > 0 ? /* @__PURE__ */ jsx15("p", { className: styles15.coAuthors, children: `${getUILabel("publication.coAuthorsPrefix", locale)}${entry.coAuthors.join(", ")}` }) : null,
668
689
  entry.doi ? (() => {
669
690
  const bare = normalizeDoi(entry.doi);
670
- return /* @__PURE__ */ jsx14("p", { className: styles14.doi, children: /* @__PURE__ */ jsx14(
691
+ return /* @__PURE__ */ jsx15("p", { className: styles15.doi, children: /* @__PURE__ */ jsx15(
671
692
  "a",
672
693
  {
673
- className: styles14.link,
694
+ className: styles15.link,
674
695
  href: `https://doi.org/${bare}`,
675
696
  target: "_blank",
676
697
  rel: "noopener noreferrer",
@@ -678,14 +699,14 @@ function Publications({
678
699
  }
679
700
  ) });
680
701
  })() : null,
681
- entry.description ? /* @__PURE__ */ jsx14("p", { className: styles14.description, children: entry.description }) : null
702
+ entry.description ? /* @__PURE__ */ jsx15("p", { className: styles15.description, children: entry.description }) : null
682
703
  ] }, entry.id)) })
683
704
  ] });
684
705
  }
685
706
 
686
707
  // src/components/Recommendations.tsx
687
- import styles15 from "./Recommendations.module-HQSBHXLM.module.css";
688
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
708
+ import styles16 from "./Recommendations.module-HQSBHXLM.module.css";
709
+ import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
689
710
  function sortRecommendations(entries) {
690
711
  return [...entries].sort((a, b) => {
691
712
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -700,32 +721,32 @@ function Recommendations({
700
721
  }) {
701
722
  if (recommendations.length === 0) return null;
702
723
  const ordered = sortRecommendations(recommendations);
703
- return /* @__PURE__ */ jsxs15("section", { className: styles15.section, "aria-labelledby": "takuhon-recommendations-heading", children: [
704
- /* @__PURE__ */ jsx15("h2", { id: "takuhon-recommendations-heading", className: styles15.heading, children: getUILabel("section.recommendations", locale) }),
705
- /* @__PURE__ */ jsx15("ul", { className: styles15.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs15("li", { className: styles15.item, children: [
706
- /* @__PURE__ */ jsx15("blockquote", { className: styles15.body, children: /* @__PURE__ */ jsx15("p", { className: styles15.quote, children: entry.body }) }),
707
- /* @__PURE__ */ jsxs15("p", { className: styles15.attribution, children: [
708
- /* @__PURE__ */ jsx15("span", { className: styles15.author, children: entry.author.url ? /* @__PURE__ */ jsx15(
724
+ return /* @__PURE__ */ jsxs16("section", { className: styles16.section, "aria-labelledby": "takuhon-recommendations-heading", children: [
725
+ /* @__PURE__ */ jsx16("h2", { id: "takuhon-recommendations-heading", className: styles16.heading, children: getUILabel("section.recommendations", locale) }),
726
+ /* @__PURE__ */ jsx16("ul", { className: styles16.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs16("li", { className: styles16.item, children: [
727
+ /* @__PURE__ */ jsx16("blockquote", { className: styles16.body, children: /* @__PURE__ */ jsx16("p", { className: styles16.quote, children: entry.body }) }),
728
+ /* @__PURE__ */ jsxs16("p", { className: styles16.attribution, children: [
729
+ /* @__PURE__ */ jsx16("span", { className: styles16.author, children: entry.author.url ? /* @__PURE__ */ jsx16(
709
730
  "a",
710
731
  {
711
- className: styles15.link,
732
+ className: styles16.link,
712
733
  href: entry.author.url,
713
734
  target: "_blank",
714
735
  rel: "noopener noreferrer",
715
736
  children: entry.author.name
716
737
  }
717
738
  ) : entry.author.name }),
718
- entry.author.headline ? /* @__PURE__ */ jsx15("span", { className: styles15.headline, children: entry.author.headline }) : null
739
+ entry.author.headline ? /* @__PURE__ */ jsx16("span", { className: styles16.headline, children: entry.author.headline }) : null
719
740
  ] }),
720
- entry.relationship ? /* @__PURE__ */ jsx15("p", { className: styles15.meta, children: entry.relationship }) : null,
721
- entry.date ? /* @__PURE__ */ jsx15("p", { className: styles15.meta, children: /* @__PURE__ */ jsx15("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) }) }) : null
741
+ entry.relationship ? /* @__PURE__ */ jsx16("p", { className: styles16.meta, children: entry.relationship }) : null,
742
+ entry.date ? /* @__PURE__ */ jsx16("p", { className: styles16.meta, children: /* @__PURE__ */ jsx16("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) }) }) : null
722
743
  ] }, entry.id)) })
723
744
  ] });
724
745
  }
725
746
 
726
747
  // src/components/SkillsList.tsx
727
- import styles16 from "./SkillsList.module-XIAWE55H.module.css";
728
- import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
748
+ import styles17 from "./SkillsList.module-XIAWE55H.module.css";
749
+ import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
729
750
  var UNCATEGORIZED = "other";
730
751
  function groupSkills(skills) {
731
752
  const sorted = [...skills].sort((a, b) => {
@@ -748,18 +769,18 @@ function groupSkills(skills) {
748
769
  function SkillsList({ skills, locale = "en" }) {
749
770
  if (skills.length === 0) return null;
750
771
  const groups = groupSkills(skills);
751
- return /* @__PURE__ */ jsxs16("section", { className: styles16.section, "aria-labelledby": "takuhon-skills-heading", children: [
752
- /* @__PURE__ */ jsx16("h2", { id: "takuhon-skills-heading", className: styles16.heading, children: getUILabel("section.skills", locale) }),
753
- /* @__PURE__ */ jsx16("div", { className: styles16.groups, children: groups.map((group) => {
772
+ return /* @__PURE__ */ jsxs17("section", { className: styles17.section, "aria-labelledby": "takuhon-skills-heading", children: [
773
+ /* @__PURE__ */ jsx17("h2", { id: "takuhon-skills-heading", className: styles17.heading, children: getUILabel("section.skills", locale) }),
774
+ /* @__PURE__ */ jsx17("div", { className: styles17.groups, children: groups.map((group) => {
754
775
  const categoryLabel = group.category === UNCATEGORIZED ? getUILabel("skills.uncategorized", locale) : group.category;
755
- return /* @__PURE__ */ jsxs16("div", { className: styles16.group, children: [
756
- /* @__PURE__ */ jsx16("h3", { className: styles16.category, children: categoryLabel }),
757
- /* @__PURE__ */ jsx16(
776
+ return /* @__PURE__ */ jsxs17("div", { className: styles17.group, children: [
777
+ /* @__PURE__ */ jsx17("h3", { className: styles17.category, children: categoryLabel }),
778
+ /* @__PURE__ */ jsx17(
758
779
  "ul",
759
780
  {
760
- className: styles16.list,
781
+ className: styles17.list,
761
782
  "aria-label": `${categoryLabel} ${getUILabel("a11y.skillsSuffix", locale)}`,
762
- children: group.skills.map((skill) => /* @__PURE__ */ jsx16("li", { className: styles16.item, children: skill.label }, skill.id))
783
+ children: group.skills.map((skill) => /* @__PURE__ */ jsx17("li", { className: styles17.item, children: skill.label }, skill.id))
763
784
  }
764
785
  )
765
786
  ] }, group.category);
@@ -768,11 +789,11 @@ function SkillsList({ skills, locale = "en" }) {
768
789
  }
769
790
 
770
791
  // src/components/TakuhonProfile.tsx
771
- import styles19 from "./TakuhonProfile.module-QUEORIHA.module.css";
792
+ import styles20 from "./TakuhonProfile.module-QUEORIHA.module.css";
772
793
 
773
794
  // src/components/TestScores.tsx
774
- import styles17 from "./TestScores.module-PG7VGFS6.module.css";
775
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
795
+ import styles18 from "./TestScores.module-PG7VGFS6.module.css";
796
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
776
797
  function sortTestScores(entries) {
777
798
  return [...entries].sort((a, b) => {
778
799
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -787,32 +808,32 @@ function TestScores({
787
808
  }) {
788
809
  if (testScores.length === 0) return null;
789
810
  const ordered = sortTestScores(testScores);
790
- return /* @__PURE__ */ jsxs17("section", { className: styles17.section, "aria-labelledby": "takuhon-test-scores-heading", children: [
791
- /* @__PURE__ */ jsx17("h2", { id: "takuhon-test-scores-heading", className: styles17.heading, children: getUILabel("section.testScores", locale) }),
792
- /* @__PURE__ */ jsx17("ul", { className: styles17.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs17("li", { className: styles17.item, children: [
793
- /* @__PURE__ */ jsx17("p", { className: styles17.title, children: entry.url ? /* @__PURE__ */ jsx17(
811
+ return /* @__PURE__ */ jsxs18("section", { className: styles18.section, "aria-labelledby": "takuhon-test-scores-heading", children: [
812
+ /* @__PURE__ */ jsx18("h2", { id: "takuhon-test-scores-heading", className: styles18.heading, children: getUILabel("section.testScores", locale) }),
813
+ /* @__PURE__ */ jsx18("ul", { className: styles18.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs18("li", { className: styles18.item, children: [
814
+ /* @__PURE__ */ jsx18("p", { className: styles18.title, children: entry.url ? /* @__PURE__ */ jsx18(
794
815
  "a",
795
816
  {
796
- className: styles17.link,
817
+ className: styles18.link,
797
818
  href: entry.url,
798
819
  target: "_blank",
799
820
  rel: "noopener noreferrer",
800
821
  children: entry.title
801
822
  }
802
823
  ) : entry.title }),
803
- /* @__PURE__ */ jsxs17("p", { className: styles17.meta, children: [
804
- /* @__PURE__ */ jsx17("span", { className: styles17.score, children: entry.score }),
824
+ /* @__PURE__ */ jsxs18("p", { className: styles18.meta, children: [
825
+ /* @__PURE__ */ jsx18("span", { className: styles18.score, children: entry.score }),
805
826
  " \xB7 ",
806
- /* @__PURE__ */ jsx17("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) })
827
+ /* @__PURE__ */ jsx18("time", { dateTime: entry.date, children: formatYearMonth(entry.date, locale) })
807
828
  ] }),
808
- entry.description ? /* @__PURE__ */ jsx17("p", { className: styles17.description, children: entry.description }) : null
829
+ entry.description ? /* @__PURE__ */ jsx18("p", { className: styles18.description, children: entry.description }) : null
809
830
  ] }, entry.id)) })
810
831
  ] });
811
832
  }
812
833
 
813
834
  // src/components/Volunteering.tsx
814
- import styles18 from "./Volunteering.module-TDRC6QVK.module.css";
815
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
835
+ import styles19 from "./Volunteering.module-TDRC6QVK.module.css";
836
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
816
837
  function sortVolunteering(entries) {
817
838
  return [...entries].sort((a, b) => {
818
839
  const aOrder = a.order ?? Number.POSITIVE_INFINITY;
@@ -830,69 +851,71 @@ function Volunteering({
830
851
  }) {
831
852
  if (volunteering.length === 0) return null;
832
853
  const ordered = sortVolunteering(volunteering);
833
- return /* @__PURE__ */ jsxs18("section", { className: styles18.section, "aria-labelledby": "takuhon-volunteering-heading", children: [
834
- /* @__PURE__ */ jsx18("h2", { id: "takuhon-volunteering-heading", className: styles18.heading, children: getUILabel("section.volunteering", locale) }),
835
- /* @__PURE__ */ jsx18("ol", { className: styles18.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs18("li", { className: styles18.item, children: [
836
- /* @__PURE__ */ jsx18("div", { className: styles18.timelineMarker, "aria-hidden": "true" }),
837
- /* @__PURE__ */ jsxs18("div", { className: styles18.content, children: [
838
- /* @__PURE__ */ jsx18("p", { className: styles18.organization, children: entry.url ? /* @__PURE__ */ jsx18(
854
+ return /* @__PURE__ */ jsxs19("section", { className: styles19.section, "aria-labelledby": "takuhon-volunteering-heading", children: [
855
+ /* @__PURE__ */ jsx19("h2", { id: "takuhon-volunteering-heading", className: styles19.heading, children: getUILabel("section.volunteering", locale) }),
856
+ /* @__PURE__ */ jsx19("ol", { className: styles19.list, children: ordered.map((entry) => /* @__PURE__ */ jsxs19("li", { className: styles19.item, children: [
857
+ /* @__PURE__ */ jsx19("div", { className: styles19.timelineMarker, "aria-hidden": "true" }),
858
+ /* @__PURE__ */ jsxs19("div", { className: styles19.content, children: [
859
+ /* @__PURE__ */ jsx19("p", { className: styles19.organization, children: entry.url ? /* @__PURE__ */ jsx19(
839
860
  "a",
840
861
  {
841
- className: styles18.link,
862
+ className: styles19.link,
842
863
  href: entry.url,
843
864
  target: "_blank",
844
865
  rel: "noopener noreferrer",
845
866
  children: entry.organization
846
867
  }
847
868
  ) : entry.organization }),
848
- /* @__PURE__ */ jsxs18("p", { className: styles18.role, children: [
869
+ /* @__PURE__ */ jsxs19("p", { className: styles19.role, children: [
849
870
  entry.role,
850
- entry.cause ? /* @__PURE__ */ jsxs18("span", { className: styles18.cause, children: [
851
- /* @__PURE__ */ jsx18("span", { className: styles18.srOnly, children: getUILabel("a11y.causePrefix", locale) }),
871
+ entry.cause ? /* @__PURE__ */ jsxs19("span", { className: styles19.cause, children: [
872
+ /* @__PURE__ */ jsx19("span", { className: styles19.srOnly, children: getUILabel("a11y.causePrefix", locale) }),
852
873
  entry.cause
853
874
  ] }) : null
854
875
  ] }),
855
- /* @__PURE__ */ jsxs18("p", { className: styles18.range, children: [
856
- /* @__PURE__ */ jsx18("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
876
+ /* @__PURE__ */ jsxs19("p", { className: styles19.range, children: [
877
+ /* @__PURE__ */ jsx19("time", { dateTime: entry.startDate, children: formatYearMonth(entry.startDate, locale) }),
857
878
  " \u2013 ",
858
- isOngoing4(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx18("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
879
+ isOngoing4(entry) ? getUILabel("timeline.present", locale) : /* @__PURE__ */ jsx19("time", { dateTime: entry.endDate, children: formatYearMonth(entry.endDate, locale) })
859
880
  ] }),
860
- entry.description ? /* @__PURE__ */ jsx18("p", { className: styles18.description, children: entry.description }) : null
881
+ entry.description ? /* @__PURE__ */ jsx19("p", { className: styles19.description, children: entry.description }) : null
861
882
  ] })
862
883
  ] }, entry.id)) })
863
884
  ] });
864
885
  }
865
886
 
866
887
  // src/components/TakuhonProfile.tsx
867
- import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
868
- function TakuhonProfile({ data }) {
888
+ import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
889
+ function TakuhonProfile({ data, activitySnapshot }) {
869
890
  const showFooter = data.settings.showPoweredBy !== false;
870
891
  const locale = data.resolvedLocale;
871
- return /* @__PURE__ */ jsxs19("article", { className: styles19.root, children: [
872
- /* @__PURE__ */ jsx19(ProfileHeader, { profile: data.profile }),
873
- /* @__PURE__ */ jsx19(LinksList, { links: data.links, locale }),
874
- /* @__PURE__ */ jsx19(EducationTimeline, { education: data.education, locale }),
875
- /* @__PURE__ */ jsx19(Courses, { courses: data.courses, locale }),
876
- /* @__PURE__ */ jsx19(CareerTimeline, { careers: data.careers, locale }),
877
- /* @__PURE__ */ jsx19(Memberships, { memberships: data.memberships, locale }),
878
- /* @__PURE__ */ jsx19(Certifications, { certifications: data.certifications, locale }),
879
- /* @__PURE__ */ jsx19(Patents, { patents: data.patents, locale }),
880
- /* @__PURE__ */ jsx19(ProjectsList, { projects: data.projects, locale }),
881
- /* @__PURE__ */ jsx19(Publications, { publications: data.publications, locale }),
882
- /* @__PURE__ */ jsx19(HonorsList, { honors: data.honors, locale }),
883
- /* @__PURE__ */ jsx19(Recommendations, { recommendations: data.recommendations, locale }),
884
- /* @__PURE__ */ jsx19(Volunteering, { volunteering: data.volunteering, locale }),
885
- /* @__PURE__ */ jsx19(SkillsList, { skills: data.skills, locale }),
886
- /* @__PURE__ */ jsx19(Languages, { languages: data.languages, locale }),
887
- /* @__PURE__ */ jsx19(TestScores, { testScores: data.testScores, locale }),
888
- /* @__PURE__ */ jsx19(ContactInfo, { contact: data.contact, locale }),
889
- showFooter ? /* @__PURE__ */ jsx19(Footer, {}) : null
892
+ const activity = data.settings.activity?.enabled === true ? activitySnapshot : void 0;
893
+ return /* @__PURE__ */ jsxs20("article", { className: styles20.root, children: [
894
+ /* @__PURE__ */ jsx20(ProfileHeader, { profile: data.profile }),
895
+ /* @__PURE__ */ jsx20(LinksList, { links: data.links, locale }),
896
+ /* @__PURE__ */ jsx20(EducationTimeline, { education: data.education, locale }),
897
+ /* @__PURE__ */ jsx20(Courses, { courses: data.courses, locale }),
898
+ /* @__PURE__ */ jsx20(CareerTimeline, { careers: data.careers, locale }),
899
+ /* @__PURE__ */ jsx20(Memberships, { memberships: data.memberships, locale }),
900
+ /* @__PURE__ */ jsx20(Certifications, { certifications: data.certifications, locale }),
901
+ /* @__PURE__ */ jsx20(Patents, { patents: data.patents, locale }),
902
+ /* @__PURE__ */ jsx20(ProjectsList, { projects: data.projects, locale }),
903
+ /* @__PURE__ */ jsx20(Publications, { publications: data.publications, locale }),
904
+ /* @__PURE__ */ jsx20(HonorsList, { honors: data.honors, locale }),
905
+ /* @__PURE__ */ jsx20(Recommendations, { recommendations: data.recommendations, locale }),
906
+ /* @__PURE__ */ jsx20(Volunteering, { volunteering: data.volunteering, locale }),
907
+ /* @__PURE__ */ jsx20(SkillsList, { skills: data.skills, locale }),
908
+ /* @__PURE__ */ jsx20(ActivitySection, { snapshot: activity, locale }),
909
+ /* @__PURE__ */ jsx20(Languages, { languages: data.languages, locale }),
910
+ /* @__PURE__ */ jsx20(TestScores, { testScores: data.testScores, locale }),
911
+ /* @__PURE__ */ jsx20(ContactInfo, { contact: data.contact, locale }),
912
+ showFooter ? /* @__PURE__ */ jsx20(Footer, {}) : null
890
913
  ] });
891
914
  }
892
915
 
893
916
  // src/components/LocaleSwitcher.tsx
894
- import styles20 from "./LocaleSwitcher.module-QVLPVGLG.module.css";
895
- import { jsx as jsx20 } from "react/jsx-runtime";
917
+ import styles21 from "./LocaleSwitcher.module-QVLPVGLG.module.css";
918
+ import { jsx as jsx21 } from "react/jsx-runtime";
896
919
  function LocaleSwitcher({
897
920
  availableLocales,
898
921
  currentLocale,
@@ -902,16 +925,16 @@ function LocaleSwitcher({
902
925
  }) {
903
926
  const label = ariaLabel ?? getUILabel("a11y.selectLanguage", currentLocale);
904
927
  const format = formatLocale ?? ((locale) => locale);
905
- return /* @__PURE__ */ jsx20("div", { className: styles20.wrapper, children: /* @__PURE__ */ jsx20(
928
+ return /* @__PURE__ */ jsx21("div", { className: styles21.wrapper, children: /* @__PURE__ */ jsx21(
906
929
  "select",
907
930
  {
908
- className: styles20.select,
931
+ className: styles21.select,
909
932
  "aria-label": label,
910
933
  value: currentLocale,
911
934
  onChange: (event) => {
912
935
  onSelect(event.target.value);
913
936
  },
914
- children: availableLocales.map((locale) => /* @__PURE__ */ jsx20("option", { value: locale, children: format(locale) }, locale))
937
+ children: availableLocales.map((locale) => /* @__PURE__ */ jsx21("option", { value: locale, children: format(locale) }, locale))
915
938
  }
916
939
  ) });
917
940
  }
@@ -919,7 +942,7 @@ function LocaleSwitcher({
919
942
  // src/components/TakuhonHead.tsx
920
943
  import { generateJsonLd } from "@takuhon/core";
921
944
  import { useEffect } from "react";
922
- import { Fragment as Fragment4, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
945
+ import { Fragment as Fragment4, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
923
946
  function primarySubtag(tag) {
924
947
  const dash = tag.indexOf("-");
925
948
  return (dash === -1 ? tag : tag.slice(0, dash)).toLowerCase();
@@ -1004,23 +1027,24 @@ function TakuhonHead({ data, siteUrl, pageUrl }) {
1004
1027
  script.remove();
1005
1028
  };
1006
1029
  }, [jsonLdPayload]);
1007
- return /* @__PURE__ */ jsxs20(Fragment4, { children: [
1008
- /* @__PURE__ */ jsx21("title", { children: profile.displayName }),
1009
- description ? /* @__PURE__ */ jsx21("meta", { name: "description", content: description }) : null,
1010
- canonical ? /* @__PURE__ */ jsx21("link", { rel: "canonical", href: canonical }) : null,
1011
- /* @__PURE__ */ jsx21("meta", { property: "og:title", content: profile.displayName }),
1012
- ogDescription ? /* @__PURE__ */ jsx21("meta", { property: "og:description", content: ogDescription }) : null,
1013
- canonical ? /* @__PURE__ */ jsx21("meta", { property: "og:url", content: canonical }) : null,
1014
- ogImage ? /* @__PURE__ */ jsx21("meta", { property: "og:image", content: ogImage }) : null,
1015
- /* @__PURE__ */ jsx21("meta", { property: "og:type", content: "profile" }),
1016
- /* @__PURE__ */ jsx21("meta", { property: "og:locale", content: resolvedLocale }),
1017
- ogAlternates.map((loc) => /* @__PURE__ */ jsx21("meta", { property: "og:locale:alternate", content: loc }, loc)),
1018
- /* @__PURE__ */ jsx21("meta", { name: "twitter:card", content: twitterCard }),
1019
- alternates.map(({ locale, href }) => /* @__PURE__ */ jsx21("link", { rel: "alternate", hrefLang: locale, href }, locale)),
1020
- xDefaultHref ? /* @__PURE__ */ jsx21("link", { rel: "alternate", hrefLang: "x-default", href: xDefaultHref }) : null
1030
+ return /* @__PURE__ */ jsxs21(Fragment4, { children: [
1031
+ /* @__PURE__ */ jsx22("title", { children: profile.displayName }),
1032
+ description ? /* @__PURE__ */ jsx22("meta", { name: "description", content: description }) : null,
1033
+ canonical ? /* @__PURE__ */ jsx22("link", { rel: "canonical", href: canonical }) : null,
1034
+ /* @__PURE__ */ jsx22("meta", { property: "og:title", content: profile.displayName }),
1035
+ ogDescription ? /* @__PURE__ */ jsx22("meta", { property: "og:description", content: ogDescription }) : null,
1036
+ canonical ? /* @__PURE__ */ jsx22("meta", { property: "og:url", content: canonical }) : null,
1037
+ ogImage ? /* @__PURE__ */ jsx22("meta", { property: "og:image", content: ogImage }) : null,
1038
+ /* @__PURE__ */ jsx22("meta", { property: "og:type", content: "profile" }),
1039
+ /* @__PURE__ */ jsx22("meta", { property: "og:locale", content: resolvedLocale }),
1040
+ ogAlternates.map((loc) => /* @__PURE__ */ jsx22("meta", { property: "og:locale:alternate", content: loc }, loc)),
1041
+ /* @__PURE__ */ jsx22("meta", { name: "twitter:card", content: twitterCard }),
1042
+ alternates.map(({ locale, href }) => /* @__PURE__ */ jsx22("link", { rel: "alternate", hrefLang: locale, href }, locale)),
1043
+ xDefaultHref ? /* @__PURE__ */ jsx22("link", { rel: "alternate", hrefLang: "x-default", href: xDefaultHref }) : null
1021
1044
  ] });
1022
1045
  }
1023
1046
  export {
1047
+ ActivitySection,
1024
1048
  CareerTimeline,
1025
1049
  Certifications,
1026
1050
  ContactInfo,