diff --git a/biome.json b/biome.json index 92e72e01..c1fbf9e7 100644 --- a/biome.json +++ b/biome.json @@ -3,6 +3,7 @@ "files": { "includes": [ "**", + "!modules/**/*.html", "!**/node_modules", "!**/public", "!**/resources", diff --git a/modules/blox-tailwind/assets/css/blox/skills.css b/modules/blox-tailwind/assets/css/blox/skills.css index 1792fd3c..21542e5d 100644 --- a/modules/blox-tailwind/assets/css/blox/skills.css +++ b/modules/blox-tailwind/assets/css/blox/skills.css @@ -46,7 +46,7 @@ overflow: hidden; width: 100%; height: 10px; - border: 1px solid #a8e9e9; + border: 1px solid var(--color-primary-200, #cbd5f5); border-radius: 10px; } @@ -54,5 +54,5 @@ position: absolute; width: 60%; height: 10px; - background-color: #3cb5b5; + background-color: var(--color-primary-600, #2563eb); } diff --git a/modules/blox-tailwind/blox/resume-awards/README.md b/modules/blox-tailwind/blox/resume-awards/README.md index 1509f490..ebbddecd 100644 --- a/modules/blox-tailwind/blox/resume-awards/README.md +++ b/modules/blox-tailwind/blox/resume-awards/README.md @@ -7,7 +7,7 @@ Showcase your professional accomplishments, certifications, and awards with the ## ✨ Key Features - **Professional Cards**: Clean, shadowed card design for each award or certification -- **Icon Integration**: Brand icons for certifying organizations and institutions +- **Icon Integration**: Add per-award icons (e.g., trophy, badge) for instant visual cues - **Certificate Links**: Direct links to verify credentials with proper external link handling - **Date Formatting**: Customizable date display (month/year format by default) - **Markdown Support**: Rich text formatting for award titles and descriptions @@ -55,4 +55,3 @@ Showcase your professional accomplishments, certifications, and awards with the - **Brand Integration**: Certifying organization icons add visual interest and authenticity Perfect for professionals, academics, consultants, and anyone who wants to showcase their achievements in a format that builds confidence and demonstrates expertise. Your accomplishments deserve professional presentation. - diff --git a/modules/blox-tailwind/blox/resume-awards/block.html b/modules/blox-tailwind/blox/resume-awards/block.html index 72b24a19..541b4d9e 100644 --- a/modules/blox-tailwind/blox/resume-awards/block.html +++ b/modules/blox-tailwind/blox/resume-awards/block.html @@ -5,14 +5,9 @@ {{/* Initialise */}} {{ $page := .wcPage }} {{ $block := .wcBlock }} -{{ $author := $block.content.username | default "admin" }} - -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} -{{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your Skill block and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $awards := $person_page.Params.awards }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} +{{ $awards := $profile.awards }}
@@ -24,25 +19,29 @@
{{ if $awards }} -{{ range $idx, $key := sort $awards ".date_start" "desc" }} +{{ range $idx, $key := sort $awards ".date" "desc" }}
{{- $icon := .icon }} - {{ with $icon }} -
- {{ partial "functions/get_icon" (dict "name" $icon "attributes" "style=\"height: 100%;\"") }} -
- {{ end}} {{with .url}}{{end}} -
{{.title | markdownify | emojify}}
+
+ {{ with $icon }} + + {{ partial "functions/get_icon" (dict "name" . "attributes" "class='w-6 h-6'") }} + + {{ end }} + {{.title | markdownify | emojify}} +
{{with .url}}
{{end}}
- {{.awarder}} ∙ - {{ if .date}} + {{ .awarder }} ∙ + {{ if .date }} {{ (time .date) | time.Format ($block.design.date_format | default "January 2006") }} - {{else}} + {{ else if .date_start }} + {{ (time .date_start) | time.Format ($block.design.date_format | default "January 2006") }} + {{ else }} {{ i18n "present" | default "Present" }} - {{end}} + {{ end }}
{{with .summary}} diff --git a/modules/blox-tailwind/blox/resume-biography-3/README.md b/modules/blox-tailwind/blox/resume-biography-3/README.md index 4076c94a..bb436ed8 100644 --- a/modules/blox-tailwind/blox/resume-biography-3/README.md +++ b/modules/blox-tailwind/blox/resume-biography-3/README.md @@ -6,6 +6,11 @@ Present a complete professional picture with the Resume Biography 3 block - an e ## πŸ› οΈ Customization +- **Name sizing**: Adjust the profile heading size to accommodate long names using `design.name.size`: + - `compact`: space-friendly for long names + - `balanced` (default): matches the demo style + - `display`: extra-large for short names + - **Section heading overrides**: Customize any of the three main section headings using `content.headings`: - `about`: Biography section heading (default: "Professional Summary" from i18n `about_me`) - `education`: Education section heading (default: from i18n `education`) @@ -20,6 +25,9 @@ content: about: Research Profile education: Academic Background interests: Research Areas +design: + name: + size: compact ``` ## ✨ Key Features diff --git a/modules/blox-tailwind/blox/resume-biography-3/block.html b/modules/blox-tailwind/blox/resume-biography-3/block.html index b89e9e39..ea5ff1fc 100644 --- a/modules/blox-tailwind/blox/resume-biography-3/block.html +++ b/modules/blox-tailwind/blox/resume-biography-3/block.html @@ -6,20 +6,23 @@ {{ $page := .wcPage }} {{ $block := .wcBlock }} -{{ $author := $block.content.username | default "admin" }} - -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} - {{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your About widget and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $person := $person_page.Params }} -{{ $avatar := ($person_page.Resources.ByType "image").GetMatch "*avatar*" }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} +{{ $avatar := $profile.avatar }} {{/* Avatar customization parameters */}} {{ $avatar_size := $block.design.avatar.size | default "large" }} {{ $avatar_shape := $block.design.avatar.shape | default "circle" }} +{{/* Profile name typography */}} +{{ $name_size := $block.design.name.size | default "balanced" }} +{{ $name_class_map := dict + "compact" "text-3xl sm:text-4xl lg:text-5xl" + "balanced" "text-4xl sm:text-5xl lg:text-6xl" + "display" "text-5xl sm:text-6xl lg:text-7xl" +}} +{{ $name_class := index $name_class_map $name_size | default (index $name_class_map "balanced") }} + {{/* Size mappings optimized for 2025 standards: display_size -> [display_px, generation_px] */}} {{ $size_map := dict "small" (slice "150" "300") "medium" (slice "200" "400") "large" (slice "320" "640") "xl" (slice "400" "800") "xxl" (slice "500" "1000") }} {{ $size_config := index $size_map $avatar_size | default (index $size_map "large") }} @@ -68,40 +71,33 @@ {{/* Avatar */}} {{ if $avatar }} -
+
{{ $avatar_image := $avatar.Fill (printf "%sx%s Center" $generation_size $generation_size) }} {{$person_page.Title}} - {{with $person.status.icon}}{{.|emojify}}{{end}} + style="object-fit: cover;"> + {{with $profile.status.icon}}{{.|emojify}}{{end}}
{{ end }} {{/* Name and Role - Centered */}}
-

- {{- if $person.name_pronunciation -}} - - {{ $person_page.Title }} - {{ $person.name_pronunciation }} - - {{- else -}} - {{- $person_page.Title -}} - {{- end -}} +

+ {{ $profile.title }}

- {{- with $person.pronouns -}} + {{- with $profile.pronouns -}}

({{ . }})

{{- end -}} - {{ with $person.role }} + {{ with $profile.role }}

{{ . | markdownify | emojify }}

{{ end }} - {{ range $person.organizations }} + {{ range $profile.affiliations }}

{{ with .url }}{{ end }} {{ .name }} @@ -112,12 +108,7 @@ {{/* Social Icons */}}

- {{ range $person.profiles }} - {{ $pack := or .icon_pack "fas" }} - {{ $pack_prefix := $pack }} - {{ if in (slice "fab" "fas" "far" "fal") $pack }} - {{ $pack_prefix = "fa" }} - {{ end }} + {{ range $profile.links }} {{ $link := .url | default .link }} {{ $scheme := (urls.Parse $link).Scheme }} {{ $target := "" }} @@ -143,7 +134,8 @@
{{/* Bio Section */}} - {{ with ($block.content.text | emojify | $page.RenderString) | default $person_page.Content }} + {{ $bio_content := ($block.content.text | emojify | $page.RenderString) | default $profile.bio }} + {{ with $bio_content }}
@@ -174,7 +166,7 @@ {{ end }} {{/* Education Section */}} - {{ with $person.education }} + {{ with $profile.education }}
@@ -195,9 +187,12 @@ {{end}}
+ {{ $degree := .degree | default .area }} + {{ $year := .year | default (cond (and .start .end) (printf "%s - %s" .start .end) .start) }}

- {{ .area }}{{ with .year }}, {{ . }}{{ end }} + {{ $degree }}

+ {{ with $year }}

{{ . }}

{{ end }}

{{ .institution }}

@@ -208,7 +203,7 @@ {{ end }} {{/* Interests Section */}} - {{ with $person.interests }} + {{ with $profile.interests }}
@@ -232,4 +227,4 @@
-
\ No newline at end of file +
diff --git a/modules/blox-tailwind/blox/resume-biography-3/schema.json b/modules/blox-tailwind/blox/resume-biography-3/schema.json index 6fc52ac8..1d332a7c 100644 --- a/modules/blox-tailwind/blox/resume-biography-3/schema.json +++ b/modules/blox-tailwind/blox/resume-biography-3/schema.json @@ -106,6 +106,18 @@ "description": "Custom CSS styles for biography text" } } + }, + "name": { + "type": "object", + "description": "Profile name typography controls", + "properties": { + "size": { + "type": "string", + "enum": ["compact", "balanced", "display"], + "description": "Heading size for the profile name to suit different name lengths", + "default": "balanced" + } + } } } } diff --git a/modules/blox-tailwind/blox/resume-biography/block.html b/modules/blox-tailwind/blox/resume-biography/block.html index 65fccbe5..03fbceba 100644 --- a/modules/blox-tailwind/blox/resume-biography/block.html +++ b/modules/blox-tailwind/blox/resume-biography/block.html @@ -6,15 +6,9 @@ {{ $page := .wcPage }} {{ $block := .wcBlock }} -{{ $author := $block.content.username | default "admin" }} - -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} - {{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your About widget and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $person := $person_page.Params }} -{{ $avatar := ($person_page.Resources.ByType "image").GetMatch "*avatar*" }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} +{{ $avatar := $profile.avatar }} {{/* Avatar customization parameters */}} {{ $avatar_size := $block.design.avatar.size | default "medium" }} @@ -76,30 +70,23 @@
{{ $avatar_image := $avatar.Fill (printf "%sx%s Center" $generation_size $generation_size) }} - {{$person_page.Title}} - {{with $person.status.icon}}{{.|emojify}}{{end}} + {{with $profile.status.icon}}{{.|emojify}}{{end}}
{{ end }}
- {{- if $person.name_pronunciation -}} - - {{ $person_page.Title }} - {{ $person.name_pronunciation }} - - {{- else -}} - {{- $person_page.Title -}} - {{- end -}} + {{- $profile.title -}}
- {{- with $person.pronouns -}} + {{- with $profile.pronouns -}}
({{ . }})
{{- end -}} - {{ with $person.role }}

{{ . | markdownify | emojify }}

{{ end }} + {{ with $profile.role }}

{{ . | markdownify | emojify }}

{{ end }} - {{ range $person.organizations }} + {{ range $profile.affiliations }}
{{ end }} + {{ if $profile.links }}
    - {{ range $person.profiles }} - {{ $pack := or .icon_pack "fas" }} - {{ $pack_prefix := $pack }} - {{ if in (slice "fab" "fas" "far" "fal") $pack }} - {{ $pack_prefix = "fa" }} - {{ end }} + {{ range $profile.links }} {{ $link := .url | default .link }} {{ $scheme := (urls.Parse $link).Scheme }} {{ $target := "" }} @@ -131,8 +114,10 @@ {{ end }}
+ {{ end }} - {{ with ($block.content.text | emojify | $page.RenderString) | default $person_page.Content }} + {{ $bio_content := ($block.content.text | emojify | $page.RenderString) | default $profile.bio }} + {{ with $bio_content }}
{{ . }} diff --git a/modules/blox-tailwind/blox/resume-experience/block.html b/modules/blox-tailwind/blox/resume-experience/block.html index ee4fae6a..2767081f 100644 --- a/modules/blox-tailwind/blox/resume-experience/block.html +++ b/modules/blox-tailwind/blox/resume-experience/block.html @@ -7,13 +7,8 @@ {{ $block := .wcBlock }} {{ $text := $block.content.text | emojify | $page.RenderString }} -{{ $author := $block.content.username | default "admin" }} -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} -{{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your About widget and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $person := $person_page.Params }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} {{ $is_education_first := $block.design.is_education_first | default false }}
@@ -26,11 +21,12 @@
-{{ if $person.work }} +{{ $experience := or $profile.experience $profile.work }} +{{ if $experience }} {{ end }} -{{ if $person.education }} +{{ if $profile.education }}

{{ i18n "education" }}

    - {{ range $idx, $key := $person.education }} + {{ range $idx, $key := $profile.education }}
  1. {{ if .icon }} @@ -81,27 +81,31 @@ {{end}} -

    {{.area}} +

    {{ .degree | default .area }}

    - {{.institution}} + {{ .institution }}
    {{.summary | $page.RenderString}}
    {{ with .button }} - {{.text}} + + {{ with .icon }} + {{ partial "functions/get_icon" (dict "name" . "attributes" "class='w-4 h-4'") }} + {{ end }} + {{ .text | default (i18n "learn_more" | default "Learn more") }} + {{ end }}
  2. diff --git a/modules/blox-tailwind/blox/resume-languages/block.html b/modules/blox-tailwind/blox/resume-languages/block.html index ebd0bebc..04789bef 100644 --- a/modules/blox-tailwind/blox/resume-languages/block.html +++ b/modules/blox-tailwind/blox/resume-languages/block.html @@ -5,14 +5,9 @@ {{/* Initialise */}} {{ $page := .wcPage }} {{ $block := .wcBlock }} -{{ $author := $block.content.username | default "admin" }} - -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} - {{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your Skill block and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $langs := $person_page.Params.languages }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} +{{ $langs := $profile.languages }}
    @@ -22,8 +17,24 @@ {{ with $block.content.text }}

    {{ . | markdownify | emojify }}

    {{ end }} -
    +
    {{ range $langs }} + {{ $percent := 100.0 }} + {{ $levelText := .level }} + {{ $label := .label }} + + {{ $levelStr := printf "%v" ($levelText | default "") }} + {{ $numericLevel := gt (len (findRE "^[0-9]+(?:\\.[0-9]+)?$" $levelStr)) 0 }} + + {{ if $numericLevel }} + {{ $percent = mul (float $levelStr) 20 }} + {{ else if .percent }} + {{ $percent = float .percent }} + {{ end }} + + {{ if gt $percent 100 }}{{ $percent = 100 }}{{ end }} + {{ if lt $percent 0 }}{{ $percent = 0 }}{{ end }} +
    @@ -31,11 +42,16 @@ class="text-gray-200 dark:text-gray-700" /> + style="stroke-dasharray: calc(2 * 22 / 7 * 120); stroke-dashoffset: calc((2 * 22 / 7 * 120) - ((2 * 22 / 7 * 120) * {{$percent}}/100))" /> - {{.percent}}% + {{ $percent }}%
    {{.name}} + {{ if $label }} + {{ $label }} + {{ else if and $levelText (not $numericLevel) }} + {{ . }} + {{ end }}
    {{ end }}
    diff --git a/modules/blox-tailwind/blox/resume-skills/README.md b/modules/blox-tailwind/blox/resume-skills/README.md index 993d953f..827a7ecc 100644 --- a/modules/blox-tailwind/blox/resume-skills/README.md +++ b/modules/blox-tailwind/blox/resume-skills/README.md @@ -11,7 +11,7 @@ Present your technical and professional competencies with the Resume Skills bloc - **Icon Integration**: Beautiful icons for each skill that enhance visual recognition - **Flexible Layout**: Side-by-side categories on larger screens, stacked on mobile - **Custom Colors**: Configurable progress bar colors to match your brand -- **Toggle Control**: Option to show or hide percentage indicators +- **Automatic Bars**: Bars appear when a skill has a level (1–5) - **Markdown Support**: Rich text formatting for skill names and descriptions ## 🎯 Perfect For @@ -64,4 +64,3 @@ Present your technical and professional competencies with the Resume Skills bloc Perfect for technical professionals, creative experts, and anyone who wants to present their skills in an organized, visually appealing format that helps employers quickly understand their capabilities and expertise levels. Turn your skill set into a competitive advantage with professional presentation that clearly communicates your value proposition. - diff --git a/modules/blox-tailwind/blox/resume-skills/block.html b/modules/blox-tailwind/blox/resume-skills/block.html index 4fe4bdfd..36243c4e 100644 --- a/modules/blox-tailwind/blox/resume-skills/block.html +++ b/modules/blox-tailwind/blox/resume-skills/block.html @@ -5,15 +5,9 @@ {{/* Initialise */}} {{ $page := .wcPage }} {{ $block := .wcBlock }} -{{ $author := $block.content.username | default "admin" }} - -{{ $person_page_path := (printf "/authors/%s" $author) }} -{{ $person_page := site.GetPage $person_page_path }} -{{ if not $person_page }} -{{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your Skill block and create an associated author page if one does not already exist. See https://docs.hugoblox.com/page-builder/#about " $person_page_path }} -{{end}} -{{ $skills := $person_page.Params.skills }} -{{ $show_show_skill_percentage := $block.design.show_skill_percentage | default true }} +{{ $author := $block.content.username | default "me" }} +{{ $profile := partial "functions/get_author_profile" $author }} +{{ $skills := $profile.skills | default (slice) }}
    @@ -35,12 +29,7 @@ {{ .name | markdownify | emojify }} {{ with .description }}

    {{ . | markdownify | emojify }}

    {{ end }}
    - {{ range .items }} - {{ $pack := or .icon_pack "fas" }} - {{ $pack_prefix := $pack }} - {{ if in (slice "fab" "fas" "far" "fal") $pack }} - {{ $pack_prefix = "fa" }} - {{ end }} + {{ range (.items | default (slice)) }}
    @@ -50,13 +39,26 @@ {{ end }} + {{ $label := .label | default .name }} - {{ .name | markdownify | emojify }} + {{ $label | markdownify | emojify }} {{ with .description }}

    {{ . | markdownify | emojify }}

    {{ end }}
    - {{ if .percent | and $show_show_skill_percentage }} + {{/* Numeric level (1-5) only. */}} + {{ $level := 0.0 }} + {{ if isset . "level" }} + {{ $raw := .level }} + {{ $type := printf "%T" $raw }} + {{ if or (eq $type "int") (eq $type "int64") (eq $type "int32") (eq $type "int16") (eq $type "int8") (eq $type "uint") (eq $type "uint64") (eq $type "uint32") (eq $type "uint16") (eq $type "uint8") (eq $type "float64") (eq $type "float32") }} + {{ $level = float $raw }} + {{ end }} + {{ end }} + {{ if gt $level 5 }}{{ $level = 5 }}{{ end }} + {{ if lt $level 0 }}{{ $level = 0 }}{{ end }} + {{ if gt $level 0 }} + {{ $levelPercent := mul $level 20 }}
    -
    +
    {{ end }}
    @@ -64,4 +66,3 @@
    {{ end }}
    - diff --git a/modules/blox-tailwind/blox/resume-skills/schema.json b/modules/blox-tailwind/blox/resume-skills/schema.json index 19271cf5..f3f59acb 100644 --- a/modules/blox-tailwind/blox/resume-skills/schema.json +++ b/modules/blox-tailwind/blox/resume-skills/schema.json @@ -39,13 +39,7 @@ }, { "type": "object", - "properties": { - "show_skill_percentage": { - "type": "boolean", - "description": "Display skill percentage bars", - "default": true - } - } + "properties": {} } ] } diff --git a/modules/blox-tailwind/blox/team-showcase/block.html b/modules/blox-tailwind/blox/team-showcase/block.html index 882cfe1b..954e5c08 100644 --- a/modules/blox-tailwind/blox/team-showcase/block.html +++ b/modules/blox-tailwind/blox/team-showcase/block.html @@ -37,119 +37,180 @@ {{ end }}
- {{/* Team Grid */}} -
- - {{ range $block.content.user_groups }} - {{ $group_name := . }} - {{ $query := where (where site.Pages "Section" "authors") ".Params.user_groups" "intersect" (slice .) }} - - {{/* Sort */}} - {{ $sort_by := $block.content.sort_by | default "Params.last_name" }} - {{ $sort_by = partial "functions/get_sort_by_parameter" $sort_by }} - {{ $sort_ascending := $block.content.sort_ascending | default true }} - {{ $sort_order := cond $sort_ascending "asc" "desc" }} - {{ $query = sort $query $sort_by $sort_order }} - - {{/* Group Header (if multiple groups) */}} - {{ if and $query (gt (len $block.content.user_groups) 1) }} -
+ {{/* Build profiles from data/authors */}} + {{ $allProfiles := slice }} + {{ range $slug, $_ := site.Data.authors }} + {{ $allProfiles = $allProfiles | append (partial "functions/get_author_profile" (dict "slug" $slug)) }} + {{ end }} + + {{ $groups := $block.content.user_groups }} + + {{ if $groups }} + {{ range $group := $groups }} + {{ $groupProfiles := slice }} + {{ range $allProfiles }} + {{ $u := .user_groups | default (slice) }} + {{ if gt (len (intersect $u (slice $group))) 0 }} + {{ $groupProfiles = $groupProfiles | append . }} + {{ end }} + {{ end }} + {{ $groupProfiles = sort $groupProfiles "title" }} + + {{ if and $groupProfiles (gt (len $groups) 1) }} +

- {{ $group_name | markdownify }} + {{ $group | markdownify }}

{{ end }} - - {{/* Team Members */}} - {{ range $person := $query }} - {{ $avatar := (.Resources.ByType "image").GetMatch "*avatar*" }} - {{ $link := "" }} - {{ with site.GetPage (printf "/authors/%s" (path.Base .File.Dir)) }} - {{ $link = .RelPermalink }} + +
+ {{ range $profile := $groupProfiles }} + {{ $avatar := $profile.avatar }} + {{ $link := printf "/authors/%s/" $profile.slug }} + +
+
+ + {{ if $avatar }} + + {{ $image := $avatar.Fill "400x400 Center webp" }} + {{ $profile.title }} +
+
+ {{ end }} + +
+

+ + {{ $profile.title }} + +

+ + {{ if $show_role }} +
+ {{ with $profile.role }}

{{ . }}

{{ end }} + {{ if and $show_organizations $profile.affiliations }} + {{ range first 1 $profile.affiliations }} +

{{ .name }}

+ {{ end }} + {{ end }} +
+ {{ end }} + + {{ with $profile.bio }} +

+ {{ . }} +

+ {{ end }} + + {{ if and $show_interests $profile.interests }} +
+
+ {{ range first 3 $profile.interests }} + + {{ . }} + + {{ end }} +
+
+ {{ end }} + + {{ if and $show_social $profile.links }} +
+ {{ range $profile.links }} + {{ $l := .url | default .link }} + {{ $scheme := (urls.Parse $l).Scheme }} + {{ $target := "" }} + {{ if not $scheme }} + {{ $l = (.url | default .link) | relLangURL }} + {{ if eq (path.Ext $l) ".pdf" }}{{ $target = "target=\"_blank\" rel=\"noopener\"" }}{{ end }} + {{ else if in (slice "http" "https") $scheme }} + {{ $target = "target=\"_blank\" rel=\"noopener\"" }} + {{ end }} + + + {{ partial "functions/get_icon" (dict "name" .icon "attributes" "class=\"w-5 h-5\"") }} + + {{ end }} +
+ {{ end }} +
+
+
{{ end }} - +
+ {{ end }} + {{ else }} + {{ $allProfiles = sort $allProfiles "title" }} +
+ {{ range $profile := $allProfiles }} + {{ $avatar := $profile.avatar }} + {{ $link := printf "/authors/%s/" $profile.slug }}
- - {{/* Avatar */}} {{ if $avatar }} {{ $image := $avatar.Fill "400x400 Center webp" }} {{ .Title }} - - {{/* Gradient Overlay */}}
{{ end }} - - {{/* Content */}}
- {{/* Name */}}

- {{ .Title }} + {{ $profile.title }}

- - {{/* Role & Organization */}} {{ if $show_role }}
- {{ with .Params.role }} -

{{ . }}

- {{ end }} - - {{ if and $show_organizations .Params.organizations }} - {{ range first 1 .Params.organizations }} + {{ with $profile.role }}

{{ . }}

{{ end }} + {{ if and $show_organizations $profile.affiliations }} + {{ range first 1 $profile.affiliations }}

{{ .name }}

{{ end }} {{ end }}
{{ end }} - - {{/* Bio */}} - {{ with .Params.bio }} -

- {{ . }} -

+ {{ with $profile.bio }} +

{{ . }}

{{ end }} - - {{/* Interests */}} - {{ if and $show_interests .Params.interests }} + {{ if and $show_interests $profile.interests }}
- {{ range first 3 .Params.interests }} - - {{ . }} - + {{ range first 3 $profile.interests }} + {{ . }} {{ end }}
{{ end }} - - {{/* Social Links */}} - {{ if $show_social }} + {{ if and $show_social $profile.links }}
- {{ range .Params.social }} - {{ $link := .url | default .link }} - {{ $scheme := (urls.Parse $link).Scheme }} + {{ range $profile.links }} + {{ $l := .url | default .link }} + {{ $scheme := (urls.Parse $l).Scheme }} {{ $target := "" }} {{ if not $scheme }} - {{ $link = (.url | default .link) | relLangURL }} - {{ if eq (path.Ext $link) ".pdf" }}{{ $target = "target=\"_blank\" rel=\"noopener\"" }}{{ end }} + {{ $l = (.url | default .link) | relLangURL }} + {{ if eq (path.Ext $l) ".pdf" }}{{ $target = "target=\"_blank\" rel=\"noopener\"" }}{{ end }} {{ else if in (slice "http" "https") $scheme }} {{ $target = "target=\"_blank\" rel=\"noopener\"" }} {{ end }} - - + {{ partial "functions/get_icon" (dict "name" .icon "attributes" "class=\"w-5 h-5\"") }} {{ end }} @@ -159,8 +220,8 @@
{{ end }} - {{ end }} -
+
+ {{ end }} {{/* Call to Action */}} {{ with $block.content.cta }} diff --git a/modules/blox-tailwind/layouts/_partials/functions/get_author_name.html b/modules/blox-tailwind/layouts/_partials/functions/get_author_name.html index ed4f9855..3ce82166 100644 --- a/modules/blox-tailwind/layouts/_partials/functions/get_author_name.html +++ b/modules/blox-tailwind/layouts/_partials/functions/get_author_name.html @@ -7,19 +7,18 @@ {{ $publisher := $branding.organization }} {{ $author := "" }} -{{ $author_username := "" }} +{{ $author_slug := "" }} -{{ if and (not $page.Params.authors) ($page.Scratch.Get "superuser_username") }} - {{ $author_username = $page.Scratch.Get "superuser_username" }} +{{ if and (not $page.Params.authors) ($page.Scratch.Get "superuser_slug") }} + {{ $author_slug = $page.Scratch.Get "superuser_slug" }} {{ else if $page.Params.authors }} {{ $author = index $page.Params.authors 0 }} - {{ $author_username = urlize $author }} + {{ $author_slug = urlize $author }} {{ end }} -{{ $taxonomy := "authors" }} -{{ $profile_page := site.GetPage (printf "/%s/%s" $taxonomy $author_username) }} -{{ with $profile_page }} - {{ $author = .Title }} +{{ $profile := partial "functions/get_author_profile" (dict "slug" $author_slug) }} +{{ if $profile.title }} + {{ $author = $profile.title }} {{ else }} {{ $author = $author | default $publisher }} {{ end }} diff --git a/modules/blox-tailwind/layouts/_partials/functions/get_author_profile.html b/modules/blox-tailwind/layouts/_partials/functions/get_author_profile.html new file mode 100644 index 00000000..328fcb9d --- /dev/null +++ b/modules/blox-tailwind/layouts/_partials/functions/get_author_profile.html @@ -0,0 +1,122 @@ +{{/* +Return a normalized HugoBlox author/person profile from data. + +Input (flexible): +- dict with "slug" key, or a raw string slug. + +Output (dict): +- slug: string +- title: string (display name, fallback to humanized slug) +- role: string (optional) +- bio: string (optional) +- status: map (optional) +- affiliations: array (optional) +- ids: map (optional) +- links: array (optional) +- is_owner: bool (optional) +- has_data: bool (true if found in data/authors) +- avatar: resource (optional) – matching assets/media/authors/.* +*/}} + +{{- $input := . -}} +{{- $slug := "" -}} + +{{- $inputType := printf "%T" $input -}} + +{{- if (reflect.IsMap $input) -}} + {{- $slug = index $input "slug" | default "" -}} +{{- else if eq $inputType "string" -}} + {{- $slug = $input -}} +{{- else -}} + {{- $slug = printf "%v" $input -}} +{{- end -}} + +{{- $slug = $slug | urlize -}} + +{{- $data := index site.Data.authors $slug -}} +{{- $hasData := $data -}} + +{{/* Structured name resolution */}} +{{- $name := $data.name -}} +{{- $display := "" -}} +{{- $given := "" -}} +{{- $family := "" -}} +{{- $middle := "" -}} +{{- $alternate := "" -}} +{{- $namePronunciation := "" -}} +{{- $namePronouns := "" -}} + +{{- if $name.display }}{{ $display = $name.display }}{{ end }} +{{- if $name.given }}{{ $given = $name.given }}{{ end }} +{{- if $name.family }}{{ $family = $name.family }}{{ end }} +{{- if $name.middle }}{{ $middle = $name.middle }}{{ end }} +{{- if $name.alternate }}{{ $alternate = $name.alternate }}{{ end }} +{{- if $name.pronunciation }}{{ $namePronunciation = $name.pronunciation }}{{ end }} +{{- if $name.pronouns }}{{ $namePronouns = $name.pronouns }}{{ end }} + +{{- $title := "" -}} +{{- if $display -}} + {{- $title = $display -}} +{{- else if $data.title -}} + {{- $title = $data.title -}} +{{- else -}} + {{- $title = $slug | humanize -}} +{{- end -}} + +{{- $role := $data.role -}} +{{- $bio := $data.bio -}} +{{- $status := $data.status -}} +{{- $affiliations := $data.affiliations -}} +{{- $ids := $data.ids -}} +{{- $links := $data.links -}} +{{- $isOwner := or ($data.is_owner) ($data.superuser) -}} +{{- $pronouns := $namePronouns | default $data.pronouns -}} +{{- $userGroups := $data.user_groups -}} +{{- $interests := $data.interests -}} +{{- $education := $data.education -}} +{{- $experience := or $data.experience $data.work -}} +{{- $skills := $data.skills -}} +{{- $languages := $data.languages -}} +{{- $awards := $data.awards -}} +{{- $postnominals := slice -}} +{{- if $data.postnominals -}} + {{- if (reflect.IsSlice $data.postnominals) -}} + {{- $postnominals = $data.postnominals -}} + {{- else -}} + {{- $postnominals = slice $data.postnominals -}} + {{- end -}} +{{- end -}} + +{{- /* Avatar resolution: look in assets/media/authors/.* */ -}} +{{- $avatar := resources.GetMatch (printf "media/authors/%s.*" $slug) -}} + +{{- $profile := dict + "slug" $slug + "title" $title + "name_display" $display + "name_given" $given + "name_family" $family + "name_middle" $middle + "name_alternate" $alternate + "name_pronunciation" $namePronunciation + "role" $role + "bio" $bio + "status" $status + "affiliations" $affiliations + "ids" $ids + "links" $links + "pronouns" $pronouns + "user_groups" $userGroups + "interests" $interests + "education" $education + "experience" $experience + "skills" $skills + "languages" $languages + "awards" $awards + "postnominals" $postnominals + "is_owner" $isOwner + "has_data" (not (eq $hasData nil)) + "avatar" $avatar +-}} + +{{- return $profile -}} diff --git a/modules/blox-tailwind/layouts/_partials/page_author.html b/modules/blox-tailwind/layouts/_partials/page_author.html index 74fa41c0..fd791313 100644 --- a/modules/blox-tailwind/layouts/_partials/page_author.html +++ b/modules/blox-tailwind/layouts/_partials/page_author.html @@ -3,16 +3,22 @@ {{/* Don't show author box on normal pages or if author box disabled. */}} {{ if ne .Type "page" | and (not (or (eq site.Params.profile false) (eq .Params.profile false))) }} -{{/* Display superuser if superuser exists and page authors are not explicitly specified. */}} -{{/* Otherwise, display first author if a profile for them exists. */}} +{{ $authors := .Params.authors }} -{{ if and (not .Params.authors) (.Scratch.Get "superuser_username") }} - {{ $author_page := site.GetPage (printf "/%s/%s" "authors" (.Scratch.Get "superuser_username")) }} - {{ partial "page_author_card" (dict "author_page" $author_page) }} -{{ else if .Params.authors }} - {{ $taxonomy := "authors" }} - {{ range $author_obj := (.GetTerms $taxonomy) }} - {{ partial "page_author_card" (dict "author_page" $author_obj.Page) }} +{{/* If authors not set, fallback to superuser/owner from Scratch */}} +{{ if (not $authors) }} + {{ $superuser := .Scratch.Get "superuser_slug" }} + {{ if $superuser }} + {{ $authors = (slice $superuser) }} + {{ end }} +{{ end }} + +{{ if $authors }} + {{ range $idx, $slug := $authors }} + {{ $profile := partial "functions/get_author_profile" $slug }} + {{ if $profile }} + {{ partial "page_author_card" (dict "profile" $profile "page" .) }} + {{ end }} {{ end }} {{ end }} diff --git a/modules/blox-tailwind/layouts/_partials/page_author_card.html b/modules/blox-tailwind/layouts/_partials/page_author_card.html index eee366cf..e36b6f43 100644 --- a/modules/blox-tailwind/layouts/_partials/page_author_card.html +++ b/modules/blox-tailwind/layouts/_partials/page_author_card.html @@ -1,21 +1,19 @@ +{{ $profile := .profile }} {{ $page := .page }} -{{ $author_page := .author_page }} {{ $site_type := site.Params.hugoblox.identity.type | humanize | default "Person" }} -{{- $has_profile := not (eq nil $author_page.Params.superuser) -}} +{{ $avatar_shape := site.Params.hugoblox.layout.avatar_shape | default "circle" }} -{{/* Check an author profile exists. */}} -{{ if $has_profile }} - {{/* If it's a personal site and primary page author is superuser, link to the homepage rather than their profile page. */}} - {{ $profile_url := $author_page.RelPermalink }} - {{ if and (eq $site_type "Person") (eq $author_page.Params.superuser true) }} +{{ if $profile }} + {{/* If it's a personal site and the profile is owner, link home */}} + {{ $profile_url := printf "/authors/%s/" $profile.slug }} + {{ if and (eq $site_type "Person") ($profile.is_owner) }} {{ $profile_url = site.BaseURL }} {{ end }} - {{ $avatar := ($author_page.Resources.ByType "image").GetMatch "*avatar*" }} - {{ $avatar_shape := site.Params.hugoblox.layout.avatar_shape | default "circle" }} + + {{ $avatar := $profile.avatar }}
{{ if $avatar }} - {{/* Use utility for high-res avatar processing (smart for Retina displays) */}} {{ $responsive := partial "functions/process_responsive_image.html" (dict "image" $avatar "mode" "fill" @@ -31,7 +29,7 @@ src="{{ $responsive.fallback.RelPermalink }}" width="96" height="96" - alt="{{$author_page.Title}}" + alt="{{$profile.title}}" loading="lazy" /> {{ end }} @@ -42,29 +40,27 @@
{{if $profile_url}}{{end}} - {{$author_page.Title}} + {{$profile.title}} {{if $profile_url}}{{end}} - {{- with $author_page.Params.pronouns -}} + {{- with $profile.pronouns -}} ({{ . }}) {{- end -}}
- {{ with $author_page.Params.role }} + {{ with $profile.role }}
{{. | markdownify | emojify}}
{{end}} - {{ with $author_page.Params.bio }} + {{ with $profile.bio }}
{{ . | markdownify | emojify }}
{{ end }}
- - {{ partial "social_links" $author_page }} - + {{ partial "social_links" (dict "Params" (dict "profiles" $profile.links)) }}
diff --git a/modules/blox-tailwind/layouts/_partials/page_metadata_authors.html b/modules/blox-tailwind/layouts/_partials/page_metadata_authors.html index 147c3e34..d563cb69 100644 --- a/modules/blox-tailwind/layouts/_partials/page_metadata_authors.html +++ b/modules/blox-tailwind/layouts/_partials/page_metadata_authors.html @@ -1,17 +1,18 @@ {{/* Display author list. */}} {{ if .Params.authors }} - {{ range $index, $value := (.GetTerms "authors") }} - {{- /* Highlight the author's name? */ -}} - {{- $highlight_name := .Page.Params.highlight_name | default false -}} + {{ range $index, $term := (.GetTerms "authors") }} + {{- $slug := $term.Data.Term | urlize -}} + {{- $profile := partial "functions/get_author_profile" (dict "slug" $slug) -}} + {{- $display := $profile.title | default $term.LinkTitle -}} + {{- $highlight_name := false -}} {{- if gt $index 0 }}, {{ end -}} - {{/* Effectively check the page's `build` option as `build` is not exposed in Hugo's Page object. */}} - {{- if .RelPermalink -}} - {{.LinkTitle}} + {{- if $term.RelPermalink -}} + {{ $display }} {{- else -}} - {{ .LinkTitle }} + {{ $display }} {{- end -}} {{- if isset $.Params "author_notes" -}} diff --git a/modules/blox-tailwind/layouts/_partials/site_head.html b/modules/blox-tailwind/layouts/_partials/site_head.html index 48827ed1..d8fcb60f 100644 --- a/modules/blox-tailwind/layouts/_partials/site_head.html +++ b/modules/blox-tailwind/layouts/_partials/site_head.html @@ -12,18 +12,30 @@ {{- end -}} - {{/* Attempt to load superuser. */}} - {{ $superuser_name := "" }} - {{ $superuser_username := "" }} - {{ $superuser_role := "" }} - {{ range first 1 (where (where site.Pages "Section" "authors") "Params.superuser" true) }} - {{ $superuser_name = .Title }} - {{ $superuser_username = path.Base .File.Dir }} - {{ $superuser_role = .Params.role }} - {{ end }} - {{ $scr.Set "superuser_username" $superuser_username }}{{/* Set superuser globally for page_author.html. */}} +{{/* Attempt to load superuser/person from data. */}} +{{ $superuser_name := "" }} +{{ $superuser_slug := "" }} +{{ $superuser_role := "" }} - {{ with $superuser_name }}{{ end }} +{{/* Prefer is_owner flag, fallback to slug 'me' */}} +{{ range $slug, $data := site.Data.authors }} + {{ if and (not $superuser_slug) ($data.is_owner) }} + {{ $superuser_slug = $slug }} + {{ end }} +{{ end }} +{{ if and (eq $superuser_slug "") (index site.Data.authors "me") }} + {{ $superuser_slug = "me" }} +{{ end }} + +{{ if $superuser_slug }} + {{ $profile := partial "functions/get_author_profile" (dict "slug" $superuser_slug) }} + {{ $superuser_name = $profile.title }} + {{ $superuser_role = $profile.role }} +{{ end }} + +{{ $scr.Set "superuser_slug" $superuser_slug }}{{/* Set superuser globally for author rendering. */}} + +{{ with $superuser_name }}{{ end }} {{/* Generate page description. */}} {{ $desc := "" }} @@ -114,15 +126,22 @@ {{/* Get page image for sharing. */}} {{ $sharing_image := resources.GetMatch (path.Join "media" "sharing.*") }} {{ $featured_image := (.Resources.ByType "image").GetMatch "*featured*" }} - {{ $avatar_image := (.Resources.ByType "image").GetMatch "avatar*" }} +{{ $avatar_image := (.Resources.ByType "image").GetMatch "avatar*" }} {{ $has_logo := fileExists "assets/media/logo.png" | or (fileExists "assets/media/logo.svg") }} {{ $og_image := "" }} {{ $twitter_card := "summary_large_image" }} - {{ if (and (eq .Kind "term") $avatar_image) }} - {{/* Match image processing in About widget to prevent generating more images than necessary. */}} - {{ $og_image = ($avatar_image.Fill "540x540 Center").Permalink }} +{{ if and (eq .Kind "term") (eq .Data.Singular "author") }} + {{/* Try data-driven avatar for author term pages */}} + {{ $termSlug := .Data.Term | urlize }} + {{ $profile := partial "functions/get_author_profile" (dict "slug" $termSlug) }} + {{ with $profile.avatar }} + {{ $og_image = (.Fill "540x540 Center").Permalink }} {{ $twitter_card = "summary" }} - {{ else if $featured_image }} + {{ end }} +{{ else if (and (eq .Kind "term") $avatar_image) }} + {{ $og_image = ($avatar_image.Fill "540x540 Center").Permalink }} + {{ $twitter_card = "summary" }} +{{ else if $featured_image }} {{ $og_image = $featured_image.Permalink }} {{ else if $sharing_image }} {{ $og_image = $sharing_image.Permalink }} diff --git a/modules/blox-tailwind/layouts/_partials/views/card.html b/modules/blox-tailwind/layouts/_partials/views/card.html index 5bcd8acb..c38c8347 100644 --- a/modules/blox-tailwind/layouts/_partials/views/card.html +++ b/modules/blox-tailwind/layouts/_partials/views/card.html @@ -145,29 +145,20 @@
{{ if $item.Params.authors }}
- {{ $authorTerm := index ($item.GetTerms "authors") 0 }} - {{ if $authorTerm }} - {{/* Author page exists - show avatar or default icon */}} -
- {{ $avatar := ($authorTerm.Resources.ByType "image").GetMatch "*avatar*" }} - {{ if $avatar }} - {{ $avatar_48 := $avatar.Process "Fill 48x48 Center webp" }} - avatar - {{ else }} - {{/* Default avatar icon when no image */}} -
- {{ partial "functions/get_icon" (dict "name" "hero/user" "attributes" "class=\"w-4 h-4 text-gray-500 dark:text-gray-400\"") }} -
- {{ end }} -
- {{ $authorTerm.Page.LinkTitle }} - {{ else }} - {{/* No author page - just show team icon and first author name */}} -
- {{ partial "functions/get_icon" (dict "name" "hero/user-group" "attributes" "class=\"w-4 h-4 text-primary-600 dark:text-primary-400\"") }} -
- {{ index $item.Params.authors 0 }} - {{ end }} + {{ $slug := index $item.Params.authors 0 | urlize }} + {{ $profile := partial "functions/get_author_profile" $slug }} + {{ $avatar := $profile.avatar }} +
+ {{ if $avatar }} + {{ $avatar_48 := $avatar.Process "Fill 48x48 Center webp" }} + avatar + {{ else }} +
+ {{ partial "functions/get_icon" (dict "name" "hero/user" "attributes" "class=\"w-4 h-4 text-gray-500 dark:text-gray-400\"") }} +
+ {{ end }} +
+ {{ $profile.title }}
β€’ {{ end }} diff --git a/modules/blox-tailwind/layouts/authors/term.html b/modules/blox-tailwind/layouts/authors/term.html new file mode 100644 index 00000000..8f290c0f --- /dev/null +++ b/modules/blox-tailwind/layouts/authors/term.html @@ -0,0 +1,98 @@ +{{ define "main" }} + +{{ $slug := .Data.Term | urlize }} +{{ $profile := partial "functions/get_author_profile" (dict "slug" $slug) }} +{{ $avatar := $profile.avatar }} +{{ $avatar_shape := site.Params.hugoblox.layout.avatar_shape | default "circle" }} + +
+
+
+ {{ if $avatar }} + {{ $responsive := partial "functions/process_responsive_image.html" (dict + "image" $avatar + "mode" "fill" + "aspect_ratio" "1:1" + "anchor" "Center" + "sizes" (slice 160 240 320 480) + ) }} + {{ $profile.title }} + {{ else }} +
+ {{ partial "functions/get_icon" (dict "name" "hero/user" "attributes" "class=\"h-12 w-12 text-gray-400\"") }} +
+ {{ end }} +
+ +
+
+

{{ $profile.title }}

+ {{ with $profile.status }} + {{ with .icon }} + + {{ end }} + {{ end }} +
+ + {{ with $profile.role }} +
{{ . | markdownify | emojify }}
+ {{ end }} + + {{ with $profile.affiliations }} +
+ {{ range $index, $org := . }} + {{ if gt $index 0 }} Β· {{ end }} + {{ if $org.url }}{{ $org.name }}{{ else }}{{ $org.name }}{{ end }} + {{ end }} +
+ {{ end }} + + {{ with $profile.bio }} +
+ {{ . | markdownify | emojify }} +
+ {{ end }} + + {{ if $profile.links }} +
+ {{ partial "social_links" (dict "Params" (dict "profiles" $profile.links)) }} +
+ {{ end }} +
+
+
+ +{{ $view := "card" }} +{{ $block := . }} +{{ $paginator := .Paginate .Pages.ByDate.Reverse }} +{{ $config := dict + "columns" 2 + "len" (len $paginator.Pages) + "fill_image" true + "show_date" true + "show_read_time" true + "show_read_more" true +}} + +
+ {{ partial "functions/render_view" (dict "fragment" "start" "page" $block "item" . "view" $view "config" $config) }} + + {{ range $index, $item := $paginator.Pages }} + {{ partial "functions/render_view" (dict "page" . "item" . "view" $view "index" $index "config" $config) }} + {{ end }} + + {{ partial "functions/render_view" (dict "fragment" "end" "page" $block "item" . "view" $view) }} + + {{ partial "components/paginator" . }} +
+ +{{ end }} diff --git a/modules/blox-tailwind/layouts/single.html b/modules/blox-tailwind/layouts/single.html index 27066788..af6ff9d0 100644 --- a/modules/blox-tailwind/layouts/single.html +++ b/modules/blox-tailwind/layouts/single.html @@ -78,30 +78,22 @@ {{ end }} - {{ $taxonomy := "authors" }} - {{ range $i, $author_obj := (.GetTerms $taxonomy) }} - {{ $author_page := $author_obj.Page }} - {{ $avatar := ($author_page.Resources.ByType "image").GetMatch "*avatar*" }} - {{- if and $i (not $avatar) }},{{ end -}} - {{ with $author_page.Params.website }} - - {{ end }} + {{ range $i, $slug := .Params.authors }} + {{ $profile := partial "functions/get_author_profile" $slug }} + {{ $avatar := $profile.avatar }} + {{ if and $i (not $avatar) }},{{ end }}
{{ with $avatar }} - {{/* Simple 2x retina image for small avatar */}} - {{ $avatar_32 := $avatar.Process "Fill 32x32 Center webp" }} + {{ $avatar_32 := .Process "Fill 32x32 Center webp" }} {{ $author_page.Title }} {{ end }} -
{{ $author_page.Title }}
+
{{ $profile.title }}
- {{ with $author_page.Params.website }} -
- {{ end }} {{/* Add author note tooltip if available */}} {{- if isset $.Params "author_notes" -}} {{- with (index $.Params.author_notes $i) -}} diff --git a/scripts/release_modules.py b/scripts/release_modules.py index 7ef408e4..0f5e978f 100644 --- a/scripts/release_modules.py +++ b/scripts/release_modules.py @@ -9,7 +9,7 @@ Features: - Updates special module metadata (blox-tailwind data/hugoblox.yaml version) - Updates dependent modules' go.mod "require" versions when a dependency is released - Tags changed modules with annotated tags and pushes tags - - Updates templates' go.mod to latest released module versions and bumps Hugo version in CI/Netlify config + - Updates templates' go.mod to latest released module versions and bumps Hugo version in template configs (hugoblox.yaml, Netlify, devcontainer) Usage examples: poetry run python scripts/release_modules.py --dry-run --log-level INFO @@ -113,6 +113,36 @@ def update_go_mod_require_pseudo_version(go_mod_text: str, dep_module_path: str, return re.sub(pattern_line, replacement_line, go_mod_text) +def update_devcontainer_hugo(starter_dir: Path, latest_hugo: Optional[str], updated_paths: List[Path]) -> None: + """Update devcontainer Hugo feature version if present.""" + if not latest_hugo: + return + devcontainer = starter_dir / ".devcontainer" / "devcontainer.json" + if not devcontainer.exists(): + return + try: + data = json.loads(devcontainer.read_text(encoding="utf-8")) + except Exception as exc: # pragma: no cover - defensive + logging.warning("starter %s: failed to parse devcontainer.json (%s)", starter_dir.name, exc) + return + + features = data.get("features", {}) + hugo_feature = features.get("ghcr.io/devcontainers/features/hugo:1") + if not isinstance(hugo_feature, dict): + return + + current = hugo_feature.get("version") + if current == latest_hugo: + return + + hugo_feature["version"] = latest_hugo + features["ghcr.io/devcontainers/features/hugo:1"] = hugo_feature + data["features"] = features + devcontainer.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") + updated_paths.append(devcontainer) + logging.info("starter %s: devcontainer Hugo version -> %s", starter_dir.name, latest_hugo) + + @dataclass class Module: name: str # e.g., blox-tailwind @@ -512,17 +542,8 @@ def update_starters(modules: Dict[str, Module], commit: bool, push: bool) -> Non updated_paths.append(netlify) logging.info("starter %s: netlify.toml HUGO_VERSION -> %s", starter_dir.name, latest_hugo) - # bump deploy.yml env WC_HUGO_VERSION - workflow = starter_dir / ".github" / "workflows" / "deploy.yml" - if latest_hugo and workflow.exists(): - with workflow.open("r", encoding="utf-8") as f: - wf = yaml.load(f) or {} - if "env" in wf and wf["env"].get("WC_HUGO_VERSION") != latest_hugo: - wf["env"]["WC_HUGO_VERSION"] = latest_hugo - with workflow.open("w", encoding="utf-8") as f: - yaml.dump(wf, f) - updated_paths.append(workflow) - logging.info("starter %s: deploy.yml WC_HUGO_VERSION -> %s", starter_dir.name, latest_hugo) + # bump devcontainer Hugo version (new location for Hugo pin) + update_devcontainer_hugo(starter_dir, latest_hugo, updated_paths) if updated_paths: stage_and_maybe_commit(updated_paths, "chore(templates): bump modules and Hugo", commit, push) @@ -591,17 +612,8 @@ def update_starters_to_commits(modules: Dict[str, Module], commit: bool, push: b updated_paths.append(netlify) logging.info("starter %s: netlify.toml HUGO_VERSION -> %s", starter_dir.name, latest_hugo) - # bump deploy.yml env WC_HUGO_VERSION (same as regular update_starters) - workflow = starter_dir / ".github" / "workflows" / "deploy.yml" - if latest_hugo and workflow.exists(): - with workflow.open("r", encoding="utf-8") as f: - wf = yaml.load(f) or {} - if "env" in wf and wf["env"].get("WC_HUGO_VERSION") != latest_hugo: - wf["env"]["WC_HUGO_VERSION"] = latest_hugo - with workflow.open("w", encoding="utf-8") as f: - yaml.dump(wf, f) - updated_paths.append(workflow) - logging.info("starter %s: deploy.yml WC_HUGO_VERSION -> %s", starter_dir.name, latest_hugo) + # bump devcontainer Hugo version (same as regular update_starters) + update_devcontainer_hugo(starter_dir, latest_hugo, updated_paths) if updated_paths: stage_and_maybe_commit(updated_paths, "chore(templates): update modules to latest commits", commit, push) diff --git a/scripts/update_template_hugo.py b/scripts/update_template_hugo.py new file mode 100644 index 00000000..7143cbee --- /dev/null +++ b/scripts/update_template_hugo.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +import argparse +import re +import json +import sys +from pathlib import Path + +def update_file_regex(path, pattern, replacement): + file_path = Path(path) + if not file_path.exists(): + print(f"Warning: {path} not found.") + return False + + content = file_path.read_text() + if re.search(pattern, content): + new_content = re.sub(pattern, replacement, content) + file_path.write_text(new_content) + print(f"Updated {path}") + return True + else: + print(f"Warning: Pattern not found in {path}") + return False + +def update_devcontainer(path, new_version): + file_path = Path(path) + if not file_path.exists(): + print(f"Warning: {path} not found.") + return False + + try: + content = json.loads(file_path.read_text()) + # Update Hugo feature version + features = content.get("features", {}) + hugo_feature = features.get("ghcr.io/devcontainers/features/hugo:1") + if hugo_feature: + hugo_feature["version"] = new_version + file_path.write_text(json.dumps(content, indent=2) + "\n") # standard json formatting + print(f"Updated {path}") + return True + else: + print(f"Warning: Hugo feature not found in {path}") + return False + except Exception as e: + print(f"Error updating {path}: {e}") + return False + +def main(): + parser = argparse.ArgumentParser(description="Update Hugo version in template files") + parser.add_argument("version", help="New Hugo version (e.g., 0.152.2)") + args = parser.parse_args() + + version = args.version + + # List of templates to update + templates = [ + "academic-cv", + "blog", + "documentation", + "landing-page", + "link-in-bio", + "resume" + ] + + for template in templates: + print(f"\nProcessing template: {template}") + template_dir = Path(f"templates/{template}") + + # 1. Update hugoblox.yaml + update_file_regex( + template_dir / "hugoblox.yaml", + r"hugo_version: .*", + f"hugo_version: '{version}'" + ) + + # 2. Update netlify.toml + update_file_regex( + template_dir / "netlify.toml", + r'HUGO_VERSION = ".*"', + f'HUGO_VERSION = "{version}"' + ) + + # 3. Update devcontainer.json + update_devcontainer( + template_dir / ".devcontainer/devcontainer.json", + version + ) + + print(f"\nSuccessfully updated all templates to Hugo v{version}") + print("Note: .github/workflows/deploy.yml is configured to read the version dynamically from hugoblox.yaml.") + +if __name__ == "__main__": + main() diff --git a/templates/academic-cv/content/authors/admin/avatar.png b/templates/academic-cv/assets/media/authors/me.png similarity index 100% rename from templates/academic-cv/content/authors/admin/avatar.png rename to templates/academic-cv/assets/media/authors/me.png diff --git a/templates/academic-cv/content/_index.md b/templates/academic-cv/content/_index.md index b0d60a6f..cf4c56ff 100644 --- a/templates/academic-cv/content/_index.md +++ b/templates/academic-cv/content/_index.md @@ -12,7 +12,7 @@ sections: - block: resume-biography-3 content: # Choose a user profile to display (a folder name within `content/authors/`) - username: admin + username: me text: '' # Show a call-to-action button under your biography? (optional) button: @@ -28,6 +28,10 @@ sections: gradient_mesh: enable: true + # Name heading sizing to accommodate long or short names + name: + size: balanced # Options: compact (long names), balanced (default), display (short names) + # Avatar customization avatar: size: medium # Options: small (150px), medium (200px, default), large (320px), xl (400px), xxl (500px) diff --git a/templates/academic-cv/content/authors/admin/_index.md b/templates/academic-cv/content/authors/admin/_index.md deleted file mode 100644 index 58a309e6..00000000 --- a/templates/academic-cv/content/authors/admin/_index.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -# Display name -title: Alex Johnson - -# Name pronunciation (optional) -name_pronunciation: '' - -# Full name (for SEO) -first_name: Alex -last_name: Johnson - -# Pronouns (optional) -pronouns: he/him - -# Status emoji -status: - icon: πŸš€ - -# Is this the primary user of the site? -superuser: true - -# Highlight the author in author lists? (true/false) -highlight_name: true - -# Role/position/tagline -role: Senior AI Research Scientist - -# Organizations/Affiliations to display in Biography blox -organizations: - - name: Meta AI - url: https://ai.meta.com/ - -# Social network links -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: - - icon: at-symbol - url: 'mailto:alex.johnson@meta.com' - label: E-mail Me - - icon: brands/x - url: https://x.com/AlexAIResearch - - icon: brands/github - url: https://github.com/alexjohnsonai - - icon: brands/linkedin - url: https://www.linkedin.com/in/alexjohnsonai/ - - icon: academicons/google-scholar - url: https://scholar.google.com/citations?user=alexjohnson - - icon: academicons/orcid - url: https://orcid.org/0000-0002-1825-0097 - -interests: - - Large Language Models - - Computer Vision - - Reinforcement Learning - - AI Ethics - -education: - - area: PhD Computer Science (AI Focus) - institution: Stanford University - icon: "" - date_start: 2015-09-01 - date_end: 2019-06-30 - summary: | - Thesis on _Scaling Laws for Neural Language Models_. Supervised by Prof. Andrew Ng. Published 5 papers in NeurIPS and ICML, with 2 best paper awards. - button: - text: 'Read Thesis' - url: 'https://example.com/thesis.pdf' - - area: MS Computer Science - institution: Carnegie Mellon University - icon: "" - date_start: 2013-09-01 - date_end: 2015-05-31 - summary: | - GPA: 4.0/4.0 - - Specialized in machine learning and robotics. - - area: BS Computer Science - institution: MIT - icon: "" - date_start: 2009-09-01 - date_end: 2013-05-31 - summary: | - GPA: 3.9/4.0 - - Minored in Mathematics. President of AI Club. - -work: - - position: Senior AI Research Scientist - company_name: Meta AI - company_url: 'https://ai.meta.com/' - icon: '' - date_start: 2020-01-01 - date_end: '' - summary: |2- - Leading research on multimodal AI systems. Contributed to Llama 2 and other open-source models. 50+ citations in 3 years. - - position: AI Research Intern - company_name: OpenAI - company_url: 'https://openai.com/' - icon: '' - date_start: 2019-06-01 - date_end: 2019-12-31 - summary: | - Worked on GPT-3 scaling. Co-authored paper on prompt engineering. - -# Skills -# Add your own SVG icons to `assets/media/icons/` -skills: - - name: Technical Skills - items: - - name: Python & PyTorch - description: '' - percent: 95 - icon: code-bracket - - name: Machine Learning - description: '' - percent: 100 - icon: chart-bar - - name: Cloud Computing (AWS/GCP) - description: '' - percent: 85 - icon: cloud - - name: Hobbies - color: '#eeac02' - color_border: '#f0bf23' - items: - - name: Hiking in the Rockies - description: '' - percent: 80 - icon: person-simple-walk - - name: Building Custom PCs - description: '' - percent: 90 - icon: cpu-chip - - name: Sci-Fi Reading - description: '' - percent: 70 - icon: book-open - -languages: - - name: English - percent: 100 - - name: Spanish - percent: 50 - -# Awards. -# Add/remove as many awards below as you like. -# Only `title`, `awarder`, and `date` are required. -# Begin multi-line `summary` with YAML's `|` or `|2-` multi-line prefix and indent 2 spaces below. -awards: - - title: Best Paper Award - url: https://neurips.cc/ - date: '2022-12-01' - awarder: NeurIPS - icon: hero/trophy - summary: | - Awarded for groundbreaking work on efficient training of large models. - - title: AI Innovation Grant - url: https://www.nsf.gov/ - date: '2021-06-15' - awarder: National Science Foundation - icon: hero/currency-dollar - summary: | - $500,000 grant for research in ethical AI development. - - title: Outstanding PhD Thesis - url: https://www.stanford.edu/ - date: '2019-06-30' - awarder: Stanford University - icon: hero/academic-cap - summary: | - Recognized for contributions to scaling laws in deep learning. ---- - -Alex Johnson is a Senior AI Research Scientist at Meta AI, where he leads groundbreaking work on large language models and multimodal systems. His research has been published in top conferences like NeurIPS and ICML, with over 10,000 citations. Alex is passionate about pushing the boundaries of AI while ensuring ethical development. Outside of work, he enjoys hiking in the Rockies, building custom PCs, and mentoring the next generation of AI talent. diff --git a/templates/academic-cv/content/blog/data-visualization/index.md b/templates/academic-cv/content/blog/data-visualization/index.md index 49ee71a1..e0bfad54 100644 --- a/templates/academic-cv/content/blog/data-visualization/index.md +++ b/templates/academic-cv/content/blog/data-visualization/index.md @@ -3,7 +3,7 @@ title: πŸ“ˆ Communicate your results effectively with the best data visualizatio summary: Use popular tools such as HuggingFace, Plotly, Mermaid, and data frames. date: 2023-10-25 authors: - - admin + - me tags: - Hugo - Hugo Blox diff --git a/templates/academic-cv/content/blog/get-started/index.md b/templates/academic-cv/content/blog/get-started/index.md index d4a55068..78ceac20 100644 --- a/templates/academic-cv/content/blog/get-started/index.md +++ b/templates/academic-cv/content/blog/get-started/index.md @@ -25,7 +25,7 @@ cover: name: "✨" authors: - - admin + - me - Ted tags: diff --git a/templates/academic-cv/content/blog/notebook-onboarding/index.md b/templates/academic-cv/content/blog/notebook-onboarding/index.md index 776da834..e4871da0 100644 --- a/templates/academic-cv/content/blog/notebook-onboarding/index.md +++ b/templates/academic-cv/content/blog/notebook-onboarding/index.md @@ -3,7 +3,7 @@ title: ⚑️ Turn Jupyter Notebooks into Blog Posts summary: Publish your data science and research directly from Jupyter Notebooks. No screenshots required. date: 2024-07-15 authors: - - admin + - me tags: - Hugo Blox - Jupyter diff --git a/templates/academic-cv/content/blog/project-management/index.md b/templates/academic-cv/content/blog/project-management/index.md index 9c4a8c01..b9db5576 100644 --- a/templates/academic-cv/content/blog/project-management/index.md +++ b/templates/academic-cv/content/blog/project-management/index.md @@ -3,7 +3,7 @@ title: βœ… Manage your projects summary: Easily manage your projects - create ideation mind maps, Gantt charts, todo lists, and more! date: 2023-10-23 authors: - - admin + - me tags: - Hugo Blox - Markdown diff --git a/templates/academic-cv/content/blog/second-brain/index.md b/templates/academic-cv/content/blog/second-brain/index.md index 00dec396..d71ff21c 100644 --- a/templates/academic-cv/content/blog/second-brain/index.md +++ b/templates/academic-cv/content/blog/second-brain/index.md @@ -3,7 +3,7 @@ title: 🧠 Sharpen your thinking with a second brain summary: Create a personal knowledge base and share your knowledge with your peers. date: 2023-10-26 authors: - - admin + - me tags: - Second Brain - Markdown diff --git a/templates/academic-cv/content/blog/teach-courses/index.md b/templates/academic-cv/content/blog/teach-courses/index.md index 89ff526a..590f66a8 100644 --- a/templates/academic-cv/content/blog/teach-courses/index.md +++ b/templates/academic-cv/content/blog/teach-courses/index.md @@ -4,7 +4,7 @@ summary: Embed videos, podcasts, code, LaTeX math, and even test students! date: 2023-10-24 math: true authors: - - admin + - me tags: - Hugo - Hugo Blox Builder diff --git a/templates/academic-cv/content/events/example/index.md b/templates/academic-cv/content/events/example/index.md index cbd77b76..ec335bd4 100644 --- a/templates/academic-cv/content/events/example/index.md +++ b/templates/academic-cv/content/events/example/index.md @@ -25,7 +25,7 @@ all_day: false publishDate: '2017-01-01T00:00:00Z' authors: - - admin + - me tags: [] diff --git a/templates/academic-cv/content/experience.md b/templates/academic-cv/content/experience.md index 9b6f6966..79434360 100644 --- a/templates/academic-cv/content/experience.md +++ b/templates/academic-cv/content/experience.md @@ -12,7 +12,7 @@ design: sections: - block: resume-experience content: - username: admin + username: me design: # Hugo date format date_format: 'January 2006' @@ -21,15 +21,13 @@ sections: - block: resume-skills content: title: Skills & Hobbies - username: admin - design: - show_skill_percentage: false + username: me - block: resume-awards content: title: Awards - username: admin + username: me - block: resume-languages content: title: Languages - username: admin + username: me --- diff --git a/templates/academic-cv/content/publications/conference-paper/index.md b/templates/academic-cv/content/publications/conference-paper/index.md index fc4efd3b..62c42a93 100644 --- a/templates/academic-cv/content/publications/conference-paper/index.md +++ b/templates/academic-cv/content/publications/conference-paper/index.md @@ -2,10 +2,10 @@ title: 'An example conference paper' # Authors -# If you created a profile for a user (e.g. the default `admin` user), write the username (folder name) here +# If you created a profile for a user (e.g. the default `me` user), write the username (folder name) here # and it will be replaced with their full name and linked to their profile. authors: - - admin + - me - Robert Ford # Author notes (optional) diff --git a/templates/academic-cv/content/publications/journal-article/index.md b/templates/academic-cv/content/publications/journal-article/index.md index 1e1984a3..899f0dfc 100644 --- a/templates/academic-cv/content/publications/journal-article/index.md +++ b/templates/academic-cv/content/publications/journal-article/index.md @@ -1,7 +1,7 @@ --- title: "An example journal article" authors: -- admin +- me - Robert Ford author_notes: - "Equal contribution" diff --git a/templates/academic-cv/content/publications/preprint/index.md b/templates/academic-cv/content/publications/preprint/index.md index 30b590f8..ffe6fad4 100644 --- a/templates/academic-cv/content/publications/preprint/index.md +++ b/templates/academic-cv/content/publications/preprint/index.md @@ -1,7 +1,7 @@ --- title: "An example preprint / working paper" authors: -- admin +- me date: "2019-04-07T00:00:00Z" # Schedule page publish date (NOT publication's date). diff --git a/templates/academic-cv/data/authors/me.yaml b/templates/academic-cv/data/authors/me.yaml new file mode 100644 index 00000000..563f2368 --- /dev/null +++ b/templates/academic-cv/data/authors/me.yaml @@ -0,0 +1,116 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: Dr. Alex Johnson + given: Alex + family: Johnson + alternate: '' # Example: ηŽ‹δΌŸ + pronunciation: '' # Example: WΓ‘ng WΔ›i + pronouns: he/him +postnominals: + - PhD + - MIEEE +status: + icon: "β˜•οΈ" +role: Senior AI Research Scientist +bio: | + Alex Johnson is a Senior AI Research Scientist at Meta AI. His research + has been published in top conferences like NeurIPS and ICML, with over + 10,000 citations. Alex is passionate about pushing the boundaries of AI + while ensuring ethical development. + +affiliations: + - name: Meta AI + url: https://ai.meta.com/ + +links: + - icon: at-symbol + url: mailto:alex.johnson@example.com + label: E-mail Me + - icon: brands/x + url: https://x.com/example + - icon: brands/github + url: https://github.com/example + - icon: brands/linkedin + url: https://www.linkedin.com/in/example/ + - icon: academicons/google-scholar + url: https://scholar.google.com/citations?user=example + - icon: academicons/orcid + url: https://orcid.org/0000-0002-1825-0097 + +interests: + - Large Language Models + - Computer Vision + - Reinforcement Learning + - AI Ethics + +education: + - degree: PhD Computer Science + institution: Stanford University + start: 2015-09-01 + end: 2019-06-30 + summary: | + Thesis on scaling laws for neural language models. Published 5 papers in NeurIPS and ICML. + button: + text: Download dissertation + url: /resume.pdf + icon: hero/arrow-down-tray + - degree: MS Computer Science + institution: Carnegie Mellon University + start: 2013-09-01 + end: 2015-05-31 + - degree: BS Computer Science + institution: MIT + start: 2009-09-01 + end: 2013-05-31 + +experience: + - role: Senior AI Research Scientist + org: Meta AI + start: 2020-01-01 + summary: | + Leading research on multimodal AI systems. Contributed to Llama 2 and other open-source models. + button: + text: View portfolio + url: / + icon: hero/arrow-down-tray + - role: AI Research Intern + org: OpenAI + start: 2019-06-01 + end: 2019-12-31 + summary: | + Worked on GPT-3 scaling. Co-authored paper on prompt engineering. + +skills: + - name: Technical Skills + items: + - label: Pytho + level: 5 + - label: Machine Learning + level: 5 + - label: Cloud Computing + level: 4 + - name: Research & Communication + items: + - label: Academic Writing + level: 5 + - label: Conference Presentations + level: 4 + - label: Grant Proposals + level: 4 + +languages: + - name: English + level: 5 + label: Native + - name: Spanish + level: 4 + label: Fluent + +awards: + - title: Best Paper Award + awarder: NeurIPS + date: "2022-12-01" + summary: Awarded for groundbreaking work on efficient training of large models. + icon: hero/trophy diff --git a/templates/blog/.devcontainer/devcontainer.json b/templates/blog/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ab001e26 --- /dev/null +++ b/templates/blog/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.152.2" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "postCreateCommand": "pnpm install --no-frozen-lockfile && hugo --logLevel debug && pnpm dlx pagefind --source 'public' --verbose", + "postAttachCommand": "(code --command workbench.view.extension.hugoblox-studio || true) && hugo server --disableFastRender -D --port 1313", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/templates/blog/.github/workflows/deploy.yml b/templates/blog/.github/workflows/deploy.yml index 2c079035..7221e659 100644 --- a/templates/blog/.github/workflows/deploy.yml +++ b/templates/blog/.github/workflows/deploy.yml @@ -1,7 +1,6 @@ name: Deploy website to GitHub Pages env: - WC_HUGO_VERSION: '0.152.2' NODE_VERSION: '20' on: @@ -42,6 +41,12 @@ jobs: if: hashFiles('package.json') != '' uses: pnpm/action-setup@v4 + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + - name: Install dependencies run: | # Install Tailwind CLI if package.json exists @@ -53,7 +58,7 @@ jobs: - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: - hugo-version: ${{ env.WC_HUGO_VERSION }} + hugo-version: ${{ env.HUGO_VERSION }} extended: true # Cache dependencies (Go modules, node_modules) - stable, rarely changes diff --git a/templates/blog/content/authors/admin/avatar.jpg b/templates/blog/assets/media/authors/me.jpg similarity index 100% rename from templates/blog/content/authors/admin/avatar.jpg rename to templates/blog/assets/media/authors/me.jpg diff --git a/templates/blog/content/_index.md b/templates/blog/content/_index.md index 73341a9c..e5afcc0d 100644 --- a/templates/blog/content/_index.md +++ b/templates/blog/content/_index.md @@ -5,8 +5,8 @@ type: landing sections: - block: resume-biography content: - # The user's folder name in content/authors/ - username: admin + # Author slug (data/authors/.yaml) + username: me design: spacing: padding: [0, 0, 0, 0] diff --git a/templates/blog/content/authors/admin/_index.md b/templates/blog/content/authors/admin/_index.md deleted file mode 100644 index 53b50634..00000000 --- a/templates/blog/content/authors/admin/_index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -# Display name -title: 吳ε₯ι›„ - -# Name pronunciation (optional) -name_pronunciation: Chien Shiung Wu - -# Full name (for SEO) -first_name: Shiung Wu -last_name: Chien - -# Pronouns (optional) -pronouns: she/her - -# Status emoji -status: - icon: β˜•οΈ - -# Is this the primary user of the site? -superuser: true - -# Role/position/tagline -role: Professor of Artificial Intelligence - -# Organizations/Affiliations to show in About widget -organizations: - - name: Stanford University - url: https://www.stanford.edu/ - -# Short bio (displayed in user profile at end of posts) -bio: My research interests include distributed robotics, mobile computing and programmable matter. - -# Social Networking -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: - - icon: at-symbol - url: 'mailto:your-email@example.com' - label: E-mail Me - - icon: brands/x - url: https://x.com/BuildLore - - icon: brands/instagram - url: https://www.instagram.com/ - - icon: brands/linkedin - url: https://www.linkedin.com/ - # Link to a PDF of your resume/CV - upload it to `static/uploads/resume.pdf` - - icon: academicons/cv - url: uploads/resume.pdf - label: Download my resume - - icon: rss - url: ./post/index.xml - label: Subscribe to my blog via RSS feed - -# Highlight the author in author lists? (true/false) -highlight_name: true - -# Author's website URL -website: "" ---- - -Chien Shiung Wu is a professor of artificial intelligence at the Stanford AI Lab. Her research interests include -distributed robotics, mobile computing and programmable matter. She leads the Robotic Neurobiology group, which develops -self-reconfiguring robots, systems of self-organizing robots, and mobile sensor networks. diff --git a/templates/blog/content/blog/data-visualization/index.md b/templates/blog/content/blog/data-visualization/index.md index 2a584e37..b3e5c7ed 100644 --- a/templates/blog/content/blog/data-visualization/index.md +++ b/templates/blog/content/blog/data-visualization/index.md @@ -3,7 +3,7 @@ title: πŸ“ˆ Communicate your results effectively with the best data visualizatio summary: Use popular tools such as Plotly, Mermaid, and data frames. date: 2023-10-25 authors: - - admin + - me tags: - Hugo - Hugo Blox diff --git a/templates/blog/content/blog/get-started/index.md b/templates/blog/content/blog/get-started/index.md index 81691072..8ba7221e 100644 --- a/templates/blog/content/blog/get-started/index.md +++ b/templates/blog/content/blog/get-started/index.md @@ -9,7 +9,7 @@ image: caption: 'Image credit: [**Unsplash**](https://unsplash.com)' authors: - - admin + - me - Ted tags: diff --git a/templates/blog/content/blog/project-management/index.md b/templates/blog/content/blog/project-management/index.md index 959b1af8..1cbc4ca7 100644 --- a/templates/blog/content/blog/project-management/index.md +++ b/templates/blog/content/blog/project-management/index.md @@ -3,7 +3,7 @@ title: βœ… Manage your projects summary: Easily manage your projects - create ideation mind maps, Gantt charts, todo lists, and more! date: 2023-10-23 authors: - - admin + - me tags: - Hugo Blox - Markdown diff --git a/templates/blog/content/blog/second-brain/index.md b/templates/blog/content/blog/second-brain/index.md index f174a9f6..553d5838 100644 --- a/templates/blog/content/blog/second-brain/index.md +++ b/templates/blog/content/blog/second-brain/index.md @@ -3,7 +3,7 @@ title: 🧠 Sharpen your thinking with a second brain summary: Create a personal knowledge base and share your knowledge with your peers. date: 2023-10-26 authors: - - admin + - me tags: - Second Brain - Markdown diff --git a/templates/blog/content/blog/teach-courses/index.md b/templates/blog/content/blog/teach-courses/index.md index 3350b8df..7a51479d 100644 --- a/templates/blog/content/blog/teach-courses/index.md +++ b/templates/blog/content/blog/teach-courses/index.md @@ -4,7 +4,7 @@ summary: Embed videos, podcasts, code, LaTeX math, and even test students! date: 2023-10-24 math: true authors: - - admin + - me tags: - Hugo - Hugo Blox Builder diff --git a/templates/blog/data/authors/me.yaml b/templates/blog/data/authors/me.yaml new file mode 100644 index 00000000..ad4eae32 --- /dev/null +++ b/templates/blog/data/authors/me.yaml @@ -0,0 +1,32 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: 吳ε₯ι›„ + given: Shiung Wu + family: Chien + pronunciation: Chien Shiung Wu + pronouns: she/her +status: + icon: "β˜•οΈ" +role: Professor of Artificial Intelligence +bio: My research interests include distributed robotics, mobile computing and programmable matter. +affiliations: + - name: Stanford University + url: https://www.stanford.edu/ +links: + - icon: at-symbol + url: mailto:your-email@example.com + label: E-mail Me + - icon: brands/x + url: https://x.com/BuildLore + - icon: brands/instagram + url: https://www.instagram.com/ + - icon: brands/linkedin + url: https://www.linkedin.com/ + - icon: academicons/cv + url: uploads/resume.pdf + label: Download my resume + - icon: rss + url: ./post/index.xml + label: Subscribe to my blog via RSS feed diff --git a/templates/documentation/.devcontainer/devcontainer.json b/templates/documentation/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ab001e26 --- /dev/null +++ b/templates/documentation/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.152.2" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "postCreateCommand": "pnpm install --no-frozen-lockfile && hugo --logLevel debug && pnpm dlx pagefind --source 'public' --verbose", + "postAttachCommand": "(code --command workbench.view.extension.hugoblox-studio || true) && hugo server --disableFastRender -D --port 1313", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/templates/documentation/.github/workflows/deploy.yml b/templates/documentation/.github/workflows/deploy.yml index 2c079035..7221e659 100644 --- a/templates/documentation/.github/workflows/deploy.yml +++ b/templates/documentation/.github/workflows/deploy.yml @@ -1,7 +1,6 @@ name: Deploy website to GitHub Pages env: - WC_HUGO_VERSION: '0.152.2' NODE_VERSION: '20' on: @@ -42,6 +41,12 @@ jobs: if: hashFiles('package.json') != '' uses: pnpm/action-setup@v4 + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + - name: Install dependencies run: | # Install Tailwind CLI if package.json exists @@ -53,7 +58,7 @@ jobs: - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: - hugo-version: ${{ env.WC_HUGO_VERSION }} + hugo-version: ${{ env.HUGO_VERSION }} extended: true # Cache dependencies (Go modules, node_modules) - stable, rarely changes diff --git a/templates/documentation/content/authors/admin/avatar.jpg b/templates/documentation/assets/media/authors/me.jpg similarity index 100% rename from templates/documentation/content/authors/admin/avatar.jpg rename to templates/documentation/assets/media/authors/me.jpg diff --git a/templates/documentation/content/authors/admin/_index.md b/templates/documentation/content/authors/admin/_index.md deleted file mode 100644 index 53b50634..00000000 --- a/templates/documentation/content/authors/admin/_index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -# Display name -title: 吳ε₯ι›„ - -# Name pronunciation (optional) -name_pronunciation: Chien Shiung Wu - -# Full name (for SEO) -first_name: Shiung Wu -last_name: Chien - -# Pronouns (optional) -pronouns: she/her - -# Status emoji -status: - icon: β˜•οΈ - -# Is this the primary user of the site? -superuser: true - -# Role/position/tagline -role: Professor of Artificial Intelligence - -# Organizations/Affiliations to show in About widget -organizations: - - name: Stanford University - url: https://www.stanford.edu/ - -# Short bio (displayed in user profile at end of posts) -bio: My research interests include distributed robotics, mobile computing and programmable matter. - -# Social Networking -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: - - icon: at-symbol - url: 'mailto:your-email@example.com' - label: E-mail Me - - icon: brands/x - url: https://x.com/BuildLore - - icon: brands/instagram - url: https://www.instagram.com/ - - icon: brands/linkedin - url: https://www.linkedin.com/ - # Link to a PDF of your resume/CV - upload it to `static/uploads/resume.pdf` - - icon: academicons/cv - url: uploads/resume.pdf - label: Download my resume - - icon: rss - url: ./post/index.xml - label: Subscribe to my blog via RSS feed - -# Highlight the author in author lists? (true/false) -highlight_name: true - -# Author's website URL -website: "" ---- - -Chien Shiung Wu is a professor of artificial intelligence at the Stanford AI Lab. Her research interests include -distributed robotics, mobile computing and programmable matter. She leads the Robotic Neurobiology group, which develops -self-reconfiguring robots, systems of self-organizing robots, and mobile sensor networks. diff --git a/templates/documentation/content/blog/v1.0.0/index.md b/templates/documentation/content/blog/v1.0.0/index.md index 694f26e3..69e3fc27 100644 --- a/templates/documentation/content/blog/v1.0.0/index.md +++ b/templates/documentation/content/blog/v1.0.0/index.md @@ -3,7 +3,7 @@ title: v1.0.0 Released! summary: Hugo v1.0.0 released. Download now and follow the guide to get started in 5 minutes! date: 2023-01-01 authors: - - admin + - me tags: - Hugo - Hugo Blox diff --git a/templates/documentation/content/blog/v2.0.0/index.md b/templates/documentation/content/blog/v2.0.0/index.md index 1c2d1a6c..aa4599be 100644 --- a/templates/documentation/content/blog/v2.0.0/index.md +++ b/templates/documentation/content/blog/v2.0.0/index.md @@ -3,7 +3,7 @@ title: v2.0.0 Released! summary: Hugo v2.0.0 released. Download now and follow the guide to get started in 5 minutes! date: 2024-01-19 authors: - - admin + - me tags: - Hugo - Hugo Blox diff --git a/templates/documentation/content/showcase/nvidia/index.md b/templates/documentation/content/showcase/nvidia/index.md index bfa17a22..b672d7eb 100644 --- a/templates/documentation/content/showcase/nvidia/index.md +++ b/templates/documentation/content/showcase/nvidia/index.md @@ -1,6 +1,8 @@ --- title: Nvidia summary: nvidia.com -external_link: https://research.nvidia.com/labs/toronto-ai/ +links: + - type: site + url: https://research.nvidia.com/labs/toronto-ai/ date: 2024-02-17 --- diff --git a/templates/documentation/data/authors/me.yaml b/templates/documentation/data/authors/me.yaml new file mode 100644 index 00000000..ad4eae32 --- /dev/null +++ b/templates/documentation/data/authors/me.yaml @@ -0,0 +1,32 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: 吳ε₯ι›„ + given: Shiung Wu + family: Chien + pronunciation: Chien Shiung Wu + pronouns: she/her +status: + icon: "β˜•οΈ" +role: Professor of Artificial Intelligence +bio: My research interests include distributed robotics, mobile computing and programmable matter. +affiliations: + - name: Stanford University + url: https://www.stanford.edu/ +links: + - icon: at-symbol + url: mailto:your-email@example.com + label: E-mail Me + - icon: brands/x + url: https://x.com/BuildLore + - icon: brands/instagram + url: https://www.instagram.com/ + - icon: brands/linkedin + url: https://www.linkedin.com/ + - icon: academicons/cv + url: uploads/resume.pdf + label: Download my resume + - icon: rss + url: ./post/index.xml + label: Subscribe to my blog via RSS feed diff --git a/templates/landing-page/.devcontainer/devcontainer.json b/templates/landing-page/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ab001e26 --- /dev/null +++ b/templates/landing-page/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.152.2" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "postCreateCommand": "pnpm install --no-frozen-lockfile && hugo --logLevel debug && pnpm dlx pagefind --source 'public' --verbose", + "postAttachCommand": "(code --command workbench.view.extension.hugoblox-studio || true) && hugo server --disableFastRender -D --port 1313", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/templates/landing-page/.github/workflows/deploy.yml b/templates/landing-page/.github/workflows/deploy.yml index 2c079035..7221e659 100644 --- a/templates/landing-page/.github/workflows/deploy.yml +++ b/templates/landing-page/.github/workflows/deploy.yml @@ -1,7 +1,6 @@ name: Deploy website to GitHub Pages env: - WC_HUGO_VERSION: '0.152.2' NODE_VERSION: '20' on: @@ -42,6 +41,12 @@ jobs: if: hashFiles('package.json') != '' uses: pnpm/action-setup@v4 + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + - name: Install dependencies run: | # Install Tailwind CLI if package.json exists @@ -53,7 +58,7 @@ jobs: - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: - hugo-version: ${{ env.WC_HUGO_VERSION }} + hugo-version: ${{ env.HUGO_VERSION }} extended: true # Cache dependencies (Go modules, node_modules) - stable, rarely changes diff --git a/templates/landing-page/content/authors/admin/avatar.jpg b/templates/landing-page/assets/media/authors/me.jpg similarity index 100% rename from templates/landing-page/content/authors/admin/avatar.jpg rename to templates/landing-page/assets/media/authors/me.jpg diff --git a/templates/landing-page/content/authors/admin/_index.md b/templates/landing-page/content/authors/admin/_index.md deleted file mode 100644 index 53b50634..00000000 --- a/templates/landing-page/content/authors/admin/_index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -# Display name -title: 吳ε₯ι›„ - -# Name pronunciation (optional) -name_pronunciation: Chien Shiung Wu - -# Full name (for SEO) -first_name: Shiung Wu -last_name: Chien - -# Pronouns (optional) -pronouns: she/her - -# Status emoji -status: - icon: β˜•οΈ - -# Is this the primary user of the site? -superuser: true - -# Role/position/tagline -role: Professor of Artificial Intelligence - -# Organizations/Affiliations to show in About widget -organizations: - - name: Stanford University - url: https://www.stanford.edu/ - -# Short bio (displayed in user profile at end of posts) -bio: My research interests include distributed robotics, mobile computing and programmable matter. - -# Social Networking -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: - - icon: at-symbol - url: 'mailto:your-email@example.com' - label: E-mail Me - - icon: brands/x - url: https://x.com/BuildLore - - icon: brands/instagram - url: https://www.instagram.com/ - - icon: brands/linkedin - url: https://www.linkedin.com/ - # Link to a PDF of your resume/CV - upload it to `static/uploads/resume.pdf` - - icon: academicons/cv - url: uploads/resume.pdf - label: Download my resume - - icon: rss - url: ./post/index.xml - label: Subscribe to my blog via RSS feed - -# Highlight the author in author lists? (true/false) -highlight_name: true - -# Author's website URL -website: "" ---- - -Chien Shiung Wu is a professor of artificial intelligence at the Stanford AI Lab. Her research interests include -distributed robotics, mobile computing and programmable matter. She leads the Robotic Neurobiology group, which develops -self-reconfiguring robots, systems of self-organizing robots, and mobile sensor networks. diff --git a/templates/landing-page/content/blog/data-visualization/index.md b/templates/landing-page/content/blog/data-visualization/index.md index 2a584e37..b3e5c7ed 100644 --- a/templates/landing-page/content/blog/data-visualization/index.md +++ b/templates/landing-page/content/blog/data-visualization/index.md @@ -3,7 +3,7 @@ title: πŸ“ˆ Communicate your results effectively with the best data visualizatio summary: Use popular tools such as Plotly, Mermaid, and data frames. date: 2023-10-25 authors: - - admin + - me tags: - Hugo - Hugo Blox diff --git a/templates/landing-page/content/blog/get-started/index.md b/templates/landing-page/content/blog/get-started/index.md index 81691072..8ba7221e 100644 --- a/templates/landing-page/content/blog/get-started/index.md +++ b/templates/landing-page/content/blog/get-started/index.md @@ -9,7 +9,7 @@ image: caption: 'Image credit: [**Unsplash**](https://unsplash.com)' authors: - - admin + - me - Ted tags: diff --git a/templates/landing-page/content/blog/project-management/index.md b/templates/landing-page/content/blog/project-management/index.md index 959b1af8..1cbc4ca7 100644 --- a/templates/landing-page/content/blog/project-management/index.md +++ b/templates/landing-page/content/blog/project-management/index.md @@ -3,7 +3,7 @@ title: βœ… Manage your projects summary: Easily manage your projects - create ideation mind maps, Gantt charts, todo lists, and more! date: 2023-10-23 authors: - - admin + - me tags: - Hugo Blox - Markdown diff --git a/templates/landing-page/content/blog/second-brain/index.md b/templates/landing-page/content/blog/second-brain/index.md index f174a9f6..553d5838 100644 --- a/templates/landing-page/content/blog/second-brain/index.md +++ b/templates/landing-page/content/blog/second-brain/index.md @@ -3,7 +3,7 @@ title: 🧠 Sharpen your thinking with a second brain summary: Create a personal knowledge base and share your knowledge with your peers. date: 2023-10-26 authors: - - admin + - me tags: - Second Brain - Markdown diff --git a/templates/landing-page/content/blog/teach-courses/index.md b/templates/landing-page/content/blog/teach-courses/index.md index d60232b6..cd3366b4 100644 --- a/templates/landing-page/content/blog/teach-courses/index.md +++ b/templates/landing-page/content/blog/teach-courses/index.md @@ -4,7 +4,7 @@ summary: Embed videos, podcasts, code, LaTeX math, and even test students! date: 2023-10-24 math: true authors: - - admin + - me tags: - Hugo - Hugo Blox Builder diff --git a/templates/landing-page/data/authors/me.yaml b/templates/landing-page/data/authors/me.yaml new file mode 100644 index 00000000..ad4eae32 --- /dev/null +++ b/templates/landing-page/data/authors/me.yaml @@ -0,0 +1,32 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: 吳ε₯ι›„ + given: Shiung Wu + family: Chien + pronunciation: Chien Shiung Wu + pronouns: she/her +status: + icon: "β˜•οΈ" +role: Professor of Artificial Intelligence +bio: My research interests include distributed robotics, mobile computing and programmable matter. +affiliations: + - name: Stanford University + url: https://www.stanford.edu/ +links: + - icon: at-symbol + url: mailto:your-email@example.com + label: E-mail Me + - icon: brands/x + url: https://x.com/BuildLore + - icon: brands/instagram + url: https://www.instagram.com/ + - icon: brands/linkedin + url: https://www.linkedin.com/ + - icon: academicons/cv + url: uploads/resume.pdf + label: Download my resume + - icon: rss + url: ./post/index.xml + label: Subscribe to my blog via RSS feed diff --git a/templates/link-in-bio/.devcontainer/devcontainer.json b/templates/link-in-bio/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ab001e26 --- /dev/null +++ b/templates/link-in-bio/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.152.2" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "postCreateCommand": "pnpm install --no-frozen-lockfile && hugo --logLevel debug && pnpm dlx pagefind --source 'public' --verbose", + "postAttachCommand": "(code --command workbench.view.extension.hugoblox-studio || true) && hugo server --disableFastRender -D --port 1313", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/templates/link-in-bio/.github/workflows/deploy.yml b/templates/link-in-bio/.github/workflows/deploy.yml index 2c079035..7221e659 100644 --- a/templates/link-in-bio/.github/workflows/deploy.yml +++ b/templates/link-in-bio/.github/workflows/deploy.yml @@ -1,7 +1,6 @@ name: Deploy website to GitHub Pages env: - WC_HUGO_VERSION: '0.152.2' NODE_VERSION: '20' on: @@ -42,6 +41,12 @@ jobs: if: hashFiles('package.json') != '' uses: pnpm/action-setup@v4 + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + - name: Install dependencies run: | # Install Tailwind CLI if package.json exists @@ -53,7 +58,7 @@ jobs: - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: - hugo-version: ${{ env.WC_HUGO_VERSION }} + hugo-version: ${{ env.HUGO_VERSION }} extended: true # Cache dependencies (Go modules, node_modules) - stable, rarely changes diff --git a/templates/link-in-bio/content/authors/admin/avatar.png b/templates/link-in-bio/assets/media/authors/me.png similarity index 100% rename from templates/link-in-bio/content/authors/admin/avatar.png rename to templates/link-in-bio/assets/media/authors/me.png diff --git a/templates/link-in-bio/content/_index.md b/templates/link-in-bio/content/_index.md index 596e9950..7e32c239 100644 --- a/templates/link-in-bio/content/_index.md +++ b/templates/link-in-bio/content/_index.md @@ -13,7 +13,7 @@ sections: - block: resume-biography content: # The user's folder name in content/authors/ - username: admin + username: me design: biography: style: 'text-align: justify; font-size: 0.8em;' diff --git a/templates/link-in-bio/content/authors/admin/_index.md b/templates/link-in-bio/content/authors/admin/_index.md deleted file mode 100644 index 7910d441..00000000 --- a/templates/link-in-bio/content/authors/admin/_index.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -# Display name -title: Alex Johnson - -# Name pronunciation (optional) -name_pronunciation: '' - -# Full name (for SEO) -first_name: Alex -last_name: Johnson - -# Pronouns (optional) -pronouns: he/him - -# Status emoji -status: - icon: πŸš€ - -# Is this the primary user of the site? -superuser: true - -# Highlight the author in author lists? (true/false) -highlight_name: true - -# Role/position/tagline -role: Senior AI Research Scientist - -# Organizations/Affiliations to display in Biography blox -organizations: - - name: Meta AI - url: https://ai.meta.com/ - -# Social network links -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: - - icon: at-symbol - url: 'mailto:alex.johnson@meta.com' - label: E-mail Me - - icon: brands/x - url: https://x.com/AlexAIResearch - - icon: brands/github - url: https://github.com/alexjohnsonai - - icon: brands/linkedin - url: https://www.linkedin.com/in/alexjohnsonai/ - - icon: academicons/google-scholar - url: https://scholar.google.com/citations?user=alexjohnson - - icon: academicons/orcid - url: https://orcid.org/0000-0002-1825-0097 - -interests: - - Large Language Models - - Computer Vision - - Reinforcement Learning - - AI Ethics - -education: - - area: PhD Computer Science (AI Focus) - institution: Stanford University - date_start: 2015-09-01 - date_end: 2019-06-30 - summary: | - Thesis on _Scaling Laws for Neural Language Models_. Supervised by Prof. Andrew Ng. Published 5 papers in NeurIPS and ICML, with 2 best paper awards. - button: - text: 'Read Thesis' - url: 'https://example.com/thesis.pdf' - - area: MS Computer Science - institution: Carnegie Mellon University - date_start: 2013-09-01 - date_end: 2015-05-31 - summary: | - GPA: 4.0/4.0 - - Specialized in machine learning and robotics. - - area: BS Computer Science - institution: MIT - date_start: 2009-09-01 - date_end: 2013-05-31 - summary: | - GPA: 3.9/4.0 - - Minored in Mathematics. President of AI Club. - -work: - - position: Senior AI Research Scientist - company_name: Meta AI - company_url: 'https://ai.meta.com/' - company_logo: '' - date_start: 2020-01-01 - date_end: '' - summary: |2- - Leading research on multimodal AI systems. Contributed to Llama 2 and other open-source models. 50+ citations in 3 years. - - position: AI Research Intern - company_name: OpenAI - company_url: 'https://openai.com/' - company_logo: '' - date_start: 2019-06-01 - date_end: 2019-12-31 - summary: | - Worked on GPT-3 scaling. Co-authored paper on prompt engineering. - -# Skills -# Add your own SVG icons to `assets/media/icons/` -skills: - - name: Technical Skills - items: - - name: Python & PyTorch - description: '' - percent: 95 - icon: code-bracket - - name: Machine Learning - description: '' - percent: 100 - icon: chart-bar - - name: Cloud Computing (AWS/GCP) - description: '' - percent: 85 - icon: cloud - - name: Hobbies - color: '#eeac02' - color_border: '#f0bf23' - items: - - name: Hiking in the Rockies - description: '' - percent: 80 - icon: person-simple-walk - - name: Building Custom PCs - description: '' - percent: 90 - icon: cpu-chip - - name: Sci-Fi Reading - description: '' - percent: 70 - icon: book-open - -languages: - - name: English - percent: 100 - - name: Spanish - percent: 50 - -# Awards. -# Add/remove as many awards below as you like. -# Only `title`, `awarder`, and `date` are required. -# Begin multi-line `summary` with YAML's `|` or `|2-` multi-line prefix and indent 2 spaces below. -awards: - - title: Best Paper Award - url: https://neurips.cc/ - date: '2022-12-01' - awarder: NeurIPS - icon: hero/trophy - summary: | - Awarded for groundbreaking work on efficient training of large models. - - title: AI Innovation Grant - url: https://www.nsf.gov/ - date: '2021-06-15' - awarder: National Science Foundation - icon: hero/currency-dollar - summary: | - $500,000 grant for research in ethical AI development. - - title: Outstanding PhD Thesis - url: https://www.stanford.edu/ - date: '2019-06-30' - awarder: Stanford University - icon: hero/academic-cap - summary: | - Recognized for contributions to scaling laws in deep learning. ---- - -Alex Johnson is a Senior AI Research Scientist at Meta AI, where he leads groundbreaking work on large language models and multimodal systems. His research has been published in top conferences like NeurIPS and ICML, with over 10,000 citations. Alex is passionate about pushing the boundaries of AI while ensuring ethical development. Outside of work, he enjoys hiking in the Rockies, building custom PCs, and mentoring the next generation of AI talent. diff --git a/templates/link-in-bio/data/authors/me.yaml b/templates/link-in-bio/data/authors/me.yaml new file mode 100644 index 00000000..8fe43dfe --- /dev/null +++ b/templates/link-in-bio/data/authors/me.yaml @@ -0,0 +1,125 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: Alex Johnson + given: Alex + family: Johnson + pronouns: he/him +status: + icon: "πŸš€" +role: Senior AI Research Scientist +bio: > + Alex Johnson is a Senior AI Research Scientist at Meta AI, where he leads groundbreaking work on large language models + and multimodal systems. His research has been published in top conferences like NeurIPS and ICML, with over 10,000 + citations. Alex is passionate about pushing the boundaries of AI while ensuring ethical development. Outside of work, + he enjoys hiking in the Rockies, building custom PCs, and mentoring the next generation of AI talent. +affiliations: + - name: Meta AI + url: https://ai.meta.com/ +links: + - icon: at-symbol + url: mailto:alex.johnson@meta.com + label: E-mail Me + - icon: brands/x + url: https://x.com/AlexAIResearch + - icon: brands/github + url: https://github.com/alexjohnsonai + - icon: brands/linkedin + url: https://www.linkedin.com/in/alexjohnsonai/ + - icon: academicons/google-scholar + url: https://scholar.google.com/citations?user=alexjohnson + - icon: academicons/orcid + url: https://orcid.org/0000-0002-1825-0097 +interests: + - Large Language Models + - Computer Vision + - Reinforcement Learning + - AI Ethics +education: + - degree: PhD Computer Science (AI Focus) + institution: Stanford University + start: 2015-09-01 + end: 2019-06-30 + summary: | + Thesis on _Scaling Laws for Neural Language Models_. Supervised by Prof. Andrew Ng. Published 5 papers in NeurIPS and ICML, with 2 best paper awards. + button: + text: 'Read Thesis' + url: 'https://example.com/thesis.pdf' + - degree: MS Computer Science + institution: Carnegie Mellon University + start: 2013-09-01 + end: 2015-05-31 + summary: | + GPA: 4.0/4.0 + + Specialized in machine learning and robotics. + - degree: BS Computer Science + institution: MIT + start: 2009-09-01 + end: 2013-05-31 + summary: | + GPA: 3.9/4.0 + + Minored in Mathematics. President of AI Club. +experience: + - role: Senior AI Research Scientist + org: Meta AI + start: 2020-01-01 + summary: | + Leading research on multimodal AI systems. Contributed to Llama 2 and other open-source models. 50+ citations in 3 years. + - role: AI Research Intern + org: OpenAI + start: 2019-06-01 + end: 2019-12-31 + summary: | + Worked on GPT-3 scaling. Co-authored paper on prompt engineering. +skills: + - name: Technical Skills + items: + - label: Python & PyTorch + level: 5 + icon: code-bracket + - label: Machine Learning + level: 5 + icon: chart-bar + - label: Cloud Computing (AWS/GCP) + level: 4 + icon: cloud + - name: Hobbies + color: '#eeac02' + color_border: '#f0bf23' + items: + - label: Hiking in the Rockies + level: 4 + icon: person-simple-walk + - label: Building Custom PCs + level: 5 + icon: cpu-chip + - label: Sci-Fi Reading + level: 4 + icon: book-open +languages: + - name: English + level: 5 + - name: Spanish + level: 3 +awards: + - title: Best Paper Award + url: https://neurips.cc/ + date: '2022-12-01' + awarder: NeurIPS + icon: hero/trophy + summary: Awarded for groundbreaking work on efficient training of large models. + - title: AI Innovation Grant + url: https://www.nsf.gov/ + date: '2021-06-15' + awarder: National Science Foundation + icon: hero/currency-dollar + summary: $500,000 grant for research in ethical AI development. + - title: Outstanding PhD Thesis + url: https://www.stanford.edu/ + date: '2019-06-30' + awarder: Stanford University + icon: hero/academic-cap + summary: Recognized for contributions to scaling laws in deep learning. diff --git a/templates/resume/.devcontainer/devcontainer.json b/templates/resume/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ab001e26 --- /dev/null +++ b/templates/resume/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.152.2" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "postCreateCommand": "pnpm install --no-frozen-lockfile && hugo --logLevel debug && pnpm dlx pagefind --source 'public' --verbose", + "postAttachCommand": "(code --command workbench.view.extension.hugoblox-studio || true) && hugo server --disableFastRender -D --port 1313", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/templates/resume/.github/workflows/deploy.yml b/templates/resume/.github/workflows/deploy.yml index 2c079035..7221e659 100644 --- a/templates/resume/.github/workflows/deploy.yml +++ b/templates/resume/.github/workflows/deploy.yml @@ -1,7 +1,6 @@ name: Deploy website to GitHub Pages env: - WC_HUGO_VERSION: '0.152.2' NODE_VERSION: '20' on: @@ -42,6 +41,12 @@ jobs: if: hashFiles('package.json') != '' uses: pnpm/action-setup@v4 + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + - name: Install dependencies run: | # Install Tailwind CLI if package.json exists @@ -53,7 +58,7 @@ jobs: - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: - hugo-version: ${{ env.WC_HUGO_VERSION }} + hugo-version: ${{ env.HUGO_VERSION }} extended: true # Cache dependencies (Go modules, node_modules) - stable, rarely changes diff --git a/templates/resume/content/authors/admin/avatar.jpg b/templates/resume/assets/media/authors/me.jpg similarity index 100% rename from templates/resume/content/authors/admin/avatar.jpg rename to templates/resume/assets/media/authors/me.jpg diff --git a/templates/resume/content/_index.md b/templates/resume/content/_index.md index db54956d..5c567195 100644 --- a/templates/resume/content/_index.md +++ b/templates/resume/content/_index.md @@ -13,7 +13,7 @@ design: sections: - block: biography content: - username: admin + username: me # Show a call-to-action button under your biography? (optional) button: text: Download RΓ©sumΓ© @@ -31,7 +31,7 @@ sections: shape: rounded # Options: circle (default), square, rounded - block: experience content: - username: admin + username: me design: # Hugo date format date_format: 'January 2006' @@ -40,13 +40,13 @@ sections: - block: skills content: title: Skills & Hobbies - username: admin + username: me - block: awards content: title: Awards - username: admin + username: me - block: languages content: title: Languages - username: admin + username: me --- diff --git a/templates/resume/content/authors/admin/_index.md b/templates/resume/data/authors/me.yaml similarity index 63% rename from templates/resume/content/authors/admin/_index.md rename to templates/resume/data/authors/me.yaml index d7481a5b..7b04467b 100644 --- a/templates/resume/content/authors/admin/_index.md +++ b/templates/resume/data/authors/me.yaml @@ -1,37 +1,24 @@ ---- -# Display name -title: 吳ε₯ι›„ - -# Name pronunciation (optional) -name_pronunciation: Chien Shiung Wu - -# Full name (for SEO) -first_name: Shiung Wu -last_name: Chien - -# Pronouns (optional) -pronouns: she/her - -# Status emoji +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: 吳ε₯ι›„ + given: Shiung Wu + family: Chien + pronunciation: Chien Shiung Wu + pronouns: she/her status: - icon: β˜•οΈ - -# Is this the primary user of the site? -superuser: true - -# Role/position/tagline + icon: "β˜•οΈ" role: Director of Cloud Infrastructure - -# Organizations/Affiliations to display in Biography blox -organizations: +bio: > + I am currently Director of Cloud Infrastructure at GenCoin where I am leading + teams on edge computing, deep sea data center architecture, and hivemind optimization. +affiliations: - name: GenCoin url: https://www.example.com/ - -# Social network links -# Need to use another icon? Simply download the SVG icon to your `assets/media/icons/` folder. -profiles: +links: - icon: at-symbol - url: 'mailto:your-email@example.com' + url: mailto:your-email@example.com label: E-mail Me - icon: brands/x url: https://x.com/BuildLore @@ -41,21 +28,20 @@ profiles: url: https://www.linkedin.com/ - icon: brands/instagram url: https://www.instagram.com/ - education: - - area: PhD Artificial Intelligence + - degree: PhD Artificial Intelligence institution: Stanford University - date_start: 2016-01-01 - date_end: 2020-12-31 + start: 2016-01-01 + end: 2020-12-31 summary: | Thesis on _Why LLMs are awesome_. Supervised by [Prof Joe Smith](https://example.com). Presented papers at 5 IEEE conferences with the contributions being published in 2 Springer journals. button: text: 'Read Thesis' url: 'https://example.com' - - area: MEng Artificial Intelligence + - degree: MEng Artificial Intelligence institution: Massachusetts Institute of Technology - date_start: 2016-01-01 - date_end: 2020-12-31 + start: 2016-01-01 + end: 2020-12-31 summary: | GPA: 3.8/4.0 @@ -63,10 +49,10 @@ education: - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - - area: BSc Artificial Intelligence + - degree: BSc Artificial Intelligence institution: Massachusetts Institute of Technology - date_start: 2016-01-01 - date_end: 2020-12-31 + start: 2016-01-01 + end: 2020-12-31 summary: | GPA: 3.4/4.0 @@ -74,76 +60,50 @@ education: - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit -work: - - position: Director of Cloud Infrastructure - company_name: GenCoin - company_url: '' - company_logo: '' - date_start: 2021-01-01 - date_end: '' - summary: |2- +experience: + - role: Director of Cloud Infrastructure + org: GenCoin + start: 2021-01-01 + summary: | Responsibilities include: - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - - position: Backend Software Engineer - company_name: X - company_url: '' - company_logo: '' - date_start: 2016-01-01 - date_end: 2020-12-31 + - role: Backend Software Engineer + org: X + start: 2016-01-01 + end: 2020-12-31 summary: | Responsibilities include: - Migrated infrastructure to a new data center - lorem ipsum dolor sit amet, consectetur adipiscing elit - lorem ipsum dolor sit amet, consectetur adipiscing elit - -# Skills -# Add your own SVG icons to `assets/media/icons/` skills: - name: Technical Skills items: - - name: Python - description: '' - percent: 80 - icon: devicon/python - - name: RStudio - description: '' - percent: 100 - icon: devicon/rstudio - - name: PyTorch - description: '' - percent: 40 - icon: devicon/pytorch + - label: Python + level: 4 + - label: RStudio + level: 5 + - label: PyTorch + level: 2 - name: Hobbies color: '#eeac02' color_border: '#f0bf23' items: - - name: Hiking - description: '' - percent: 60 - icon: person-simple-walk - - name: Cats - description: '' - percent: 100 - icon: cat - - name: Photography - description: '' - percent: 80 - icon: camera - + - label: Hiking + level: 3 + - label: Cats + level: 5 + - label: Photography + level: 4 languages: - name: English - percent: 100 + level: 5 - name: Chinese - percent: 75 + level: 4 - name: Portuguese - percent: 25 - -# Awards. -# Add/remove as many awards below as you like. -# Only `title`, `awarder`, and `date` are required. -# Begin multi-line `summary` with YAML's `|` or `|2-` multi-line prefix and indent 2 spaces below. + level: 1 awards: - title: Neural Networks and Deep Learning url: https://www.coursera.org/learn/neural-networks-deep-learning @@ -170,6 +130,3 @@ awards: icon: brands/datacamp summary: | Object-oriented programming (OOP) lets you specify relationships between functions and the objects that they can act on, helping you manage complexity in your code. This is an intermediate level course, providing an introduction to OOP, using the S3 and R6 systems. S3 is a great day-to-day R programming tool that simplifies some of the functions that you write. R6 is especially useful for industry-specific analyses, working with web APIs, and building GUIs. ---- - -I am currently Director of Cloud Infrastructure at GenCoin where I am leading teams on edge computing, deep sea data center architecture, and hivemind optimization.