diff --git a/assets/media/icons/custom/Apptainer_icon_clr_rgb.svg b/assets/media/icons/custom/Apptainer_icon_clr_rgb.svg new file mode 100644 index 0000000..1dd08c4 --- /dev/null +++ b/assets/media/icons/custom/Apptainer_icon_clr_rgb.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/assets/media/icons/custom/Caiman_logo_2.svg b/assets/media/icons/custom/Caiman_logo_2.svg new file mode 100644 index 0000000..88e7f6e --- /dev/null +++ b/assets/media/icons/custom/Caiman_logo_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/Zeromq.svg b/assets/media/icons/custom/Zeromq.svg new file mode 100644 index 0000000..e547c7c --- /dev/null +++ b/assets/media/icons/custom/Zeromq.svg @@ -0,0 +1 @@ +Zeromq SVG Icon \ No newline at end of file diff --git a/assets/media/icons/custom/ava_logo.svg b/assets/media/icons/custom/ava_logo.svg new file mode 100644 index 0000000..895e521 --- /dev/null +++ b/assets/media/icons/custom/ava_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/bash.svg b/assets/media/icons/custom/bash.svg new file mode 100644 index 0000000..e2f9c52 --- /dev/null +++ b/assets/media/icons/custom/bash.svg @@ -0,0 +1 @@ + diff --git a/assets/media/icons/custom/dlc-logo.svg b/assets/media/icons/custom/dlc-logo.svg new file mode 100644 index 0000000..3195f3b --- /dev/null +++ b/assets/media/icons/custom/dlc-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/fieldtrip-favicon-32x32.svg b/assets/media/icons/custom/fieldtrip-favicon-32x32.svg new file mode 100644 index 0000000..fc1efe7 --- /dev/null +++ b/assets/media/icons/custom/fieldtrip-favicon-32x32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/jax.svg b/assets/media/icons/custom/jax.svg new file mode 100644 index 0000000..ab4aea5 --- /dev/null +++ b/assets/media/icons/custom/jax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/librosa_logo_text.svg b/assets/media/icons/custom/librosa_logo_text.svg new file mode 100644 index 0000000..8f82ac9 --- /dev/null +++ b/assets/media/icons/custom/librosa_logo_text.svg @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/media/icons/custom/pandas.svg b/assets/media/icons/custom/pandas.svg new file mode 100644 index 0000000..bbcb415 --- /dev/null +++ b/assets/media/icons/custom/pandas.svg @@ -0,0 +1 @@ + diff --git a/assets/media/icons/custom/scipy-logo.svg b/assets/media/icons/custom/scipy-logo.svg new file mode 100644 index 0000000..78df03c --- /dev/null +++ b/assets/media/icons/custom/scipy-logo.svg @@ -0,0 +1,137 @@ + + + + + + + + + diff --git a/assets/media/icons/custom/sleap-logo.svg b/assets/media/icons/custom/sleap-logo.svg new file mode 100644 index 0000000..55a8acc --- /dev/null +++ b/assets/media/icons/custom/sleap-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/media/icons/custom/statsmodels-favicon-base.svg b/assets/media/icons/custom/statsmodels-favicon-base.svg new file mode 100644 index 0000000..b511913 --- /dev/null +++ b/assets/media/icons/custom/statsmodels-favicon-base.svg @@ -0,0 +1,59 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/assets/media/icons/custom/vocalpy-secondary.svg b/assets/media/icons/custom/vocalpy-secondary.svg new file mode 100644 index 0000000..5cae769 --- /dev/null +++ b/assets/media/icons/custom/vocalpy-secondary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/_default/menus.yaml b/config/_default/menus.yaml index 4040517..75cca2a 100644 --- a/config/_default/menus.yaml +++ b/config/_default/menus.yaml @@ -1,27 +1,28 @@ # Navigation Links -# To link a homepage widget, specify the URL as a hash `#` followed by the filename of the - # desired widget in your `content/home/` folder. - # The weight parameter defines the order that the links will appear in. +# The weight parameter defines the order that the links will appear in (lower = further left). main: - - name: Bio + - name: Home url: / weight: 10 + - name: About + url: /about/ + weight: 20 + - name: Publications + url: /papers + weight: 30 - name: Presentations - url: /#presentations - weight: 11 - - name: Talks - url: /#talks - weight: 12 - - name: News - url: /#news - weight: 13 + url: /presentations + weight: 40 + - name: Skills + url: /skills + weight: 50 - name: Experience url: experience/ - weight: 20 + weight: 60 - name: Projects url: projects/ - weight: 30 + weight: 70 - name: Teaching url: teaching/ - weight: 40 + weight: 80 diff --git a/content/skills/_index.md b/content/skills/_index.md new file mode 100644 index 0000000..5be665e --- /dev/null +++ b/content/skills/_index.md @@ -0,0 +1,119 @@ +--- +title: "" +summary: "" +type: landing + +design: + spacing: "4rem" + +sections: + - block: tech-stack-columns + content: + columns: + - title: Tech Stack + subtitle: What I use to develop + categories: + - name: Languages + items: + - name: Python + icon: devicon/python + - name: MATLAB + icon: devicon/matlab + - name: LabVIEW + icon: devicon/labview + - name: Bash/Shell + icon: custom/bash + - name: R + icon: devicon/r + - name: Machine & Deep Learning + items: + - name: PyTorch + icon: devicon/pytorch + - name: TensorFlow + icon: devicon/tensorflow + - name: JAX + icon: custom/jax + - name: Infrastructure + items: + - name: Git + icon: devicon/git + - name: ØMQ + icon: custom/Zeromq + - name: Apptainer (Singularity) + icon: custom/Apptainer_icon_clr_rgb + - name: Docker + icon: devicon/docker + - name: Linux + icon: devicon/linux + - name: Scientific Computing + items: + - name: NumPy + icon: devicon/numpy + - name: pandas + icon: custom/pandas + - name: scipy + icon: custom/scipy-logo + - name: matplotlib + icon: devicon/matplotlib + - name: Jupyter + icon: devicon/jupyter + - name: OpenCV + icon: devicon/opencv + - name: scikit-learn + icon: devicon/scikitlearn + - name: statsmodels + icon: custom/statsmodels-favicon-base + - name: pytest + icon: devicon/pytest + - title: Experimental Stack + subtitle: What I use to discover + categories: + - name: Behavioral Analysis + items: + - name: DeepLabCut + icon: custom/dlc-logo + - name: SLEAP + icon: custom/sleap-logo + - name: MotionMapper + icon: custom/MMM_logo + - name: Neural Analysis & Simulation + items: + - name: CaImAn + icon: custom/Caiman_logo_2 + - name: NEURON + icon: custom/neuron + - name: FieldTrip + icon: custom/fieldtrip-favicon-32x32 + - name: Inscopix + icon: custom/inscopix_1 + - name: Vocal Analysis + items: + - name: AVA + icon: custom/ava_logo + - name: vocalpy + icon: custom/vocalpy-secondary + - name: librosa + icon: custom/librosa_logo_text + - name: Experimentation + items: + - name: Behavioral Assays + - name: Neural Recording + - name: in vivo LFP and single units + - name: in vitro patch-clamp + - name: Neural Manipulation + items: + - name: Infusions + icon: + - name: Optogenetics + icon: + - name: Histology + items: + - name: Perfusion + - name: Dissection + - name: Slicing + - name: Staining + - name: Imaging + design: + show_levels: false + animations: true +--- diff --git a/layouts/partials/hbx/blocks/tech-stack-columns/block.html b/layouts/partials/hbx/blocks/tech-stack-columns/block.html new file mode 100644 index 0000000..e3bd8f2 --- /dev/null +++ b/layouts/partials/hbx/blocks/tech-stack-columns/block.html @@ -0,0 +1,173 @@ +{{/* Hugo Blox: Tech Stack Columns */}} +{{/* Two tech-stack sections rendered side by side */}} + +{{/* Initialise */}} +{{ $page := .wcPage }} +{{ $block := .wcBlock }} +{{ $content := $block.content }} +{{ if not (reflect.IsMap $content) }}{{ $content = dict }}{{ end }} +{{ $design := $block.design }} +{{ if not (reflect.IsMap $design) }}{{ $design = dict }}{{ end }} + +{{/* Enable animations */}} +{{ $animations := partial "functions/coerce_bool" (dict "value" (index $design "animations") "default" true) }} +{{ if $animations }} + {{ $page.Store.Set "has_animations" true }} + {{ $page.Store.Set "has_alpine" true }} +{{ end }} + +{{ $show_levels := partial "functions/coerce_bool" (dict "value" (index $design "show_levels") "default" false) }} + +{{/* Parse columns */}} +{{ $columns_raw := index $content "columns" }} +{{ $columns := slice }} +{{ if reflect.IsSlice $columns_raw }} + {{ $columns = $columns_raw }} +{{ end }} + +
+ {{/* Two-column grid: stacks on mobile, side by side on md+ */}} +
+ + {{ range $columns }} + {{ if reflect.IsMap . }} + + {{/* Parse column title and subtitle */}} + {{ $col_title := "" }} + {{ with index . "title" }}{{ $col_title = strings.TrimSpace (printf "%v" .) }}{{ end }} + {{ $col_subtitle := "" }} + {{ with index . "subtitle" }}{{ $col_subtitle = strings.TrimSpace (printf "%v" .) }}{{ end }} + + {{/* Parse categories */}} + {{ $categories_raw := index . "categories" }} + {{ $categories_iter := slice }} + {{ if reflect.IsSlice $categories_raw }} + {{ $categories_iter = $categories_raw }} + {{ else if and $categories_raw (reflect.IsMap $categories_raw) }} + {{ $categories_iter = slice $categories_raw }} + {{ end }} + + {{ $categories := slice }} + {{ range $categories_iter }} + {{ if reflect.IsMap . }} + {{ $cat_name := "" }} + {{ with index . "name" }}{{ $cat_name = strings.TrimSpace (printf "%v" .) }}{{ end }} + {{ $items_raw := index . "items" }} + {{ $items_iter := slice }} + {{ if reflect.IsSlice $items_raw }} + {{ $items_iter = $items_raw }} + {{ else if and $items_raw (reflect.IsMap $items_raw) }} + {{ $items_iter = slice $items_raw }} + {{ end }} + {{ $items := slice }} + {{ range $items_iter }} + {{ if reflect.IsMap . }} + {{ $item_name := "" }} + {{ $item_icon := "" }} + {{ $item_level := "" }} + {{ with index . "name" }}{{ $item_name = strings.TrimSpace (printf "%v" .) }}{{ end }} + {{ with index . "icon" }}{{ $item_icon = strings.TrimSpace (printf "%v" .) }}{{ end }} + {{ with index . "level" }}{{ $item_level = lower (strings.TrimSpace (printf "%v" .)) }}{{ end }} + {{ if $item_name }} + {{ $items = $items | append (dict "name" $item_name "icon" $item_icon "level" $item_level) }} + {{ end }} + {{ end }} + {{ end }} + {{ if gt (len $items) 0 }} + {{ $categories = $categories | append (dict "name" $cat_name "items" $items) }} + {{ end }} + {{ end }} + {{ end }} + +
+ {{/* Column header */}} +
+ {{ with $col_title }} +

+ {{ . | emojify | $page.RenderString }} +

+ {{ end }} + {{ with $col_subtitle }} +

+ {{ . | emojify | $page.RenderString }} +

+ {{ end }} +
+ + {{/* Categories */}} +
+ {{ range $categories }} +
+ {{/* Category Title */}} + {{ with index . "name" }} +

+ + {{ . }} + +

+ {{ end }} + + {{/* Tech Items */}} +
+ {{ range $idx, $item := (index . "items") }} + {{ $level := index $item "level" | default "" }} + {{ $level_width := "0%" }} + {{ $level_color := "bg-gray-500" }} + {{ if eq $level "expert" }} + {{ $level_width = "100%" }} + {{ $level_color = "bg-emerald-500" }} + {{ else if eq $level "advanced" }} + {{ $level_width = "75%" }} + {{ $level_color = "bg-primary-500" }} + {{ else if eq $level "intermediate" }} + {{ $level_width = "50%" }} + {{ $level_color = "bg-amber-500" }} + {{ else if eq $level "beginner" }} + {{ $level_width = "25%" }} + {{ $level_color = "bg-gray-400" }} + {{ end }} + +
+
+ {{ with index $item "icon" }} + {{ $dark_icons := slice "express" "vercel" "github" "nextjs" }} + {{ $icon_name := . }} + {{ $needs_invert := false }} + {{ range $dark_icons }} + {{ if in $icon_name . }}{{ $needs_invert = true }}{{ end }} + {{ end }} +
+ {{ partial "functions/get_icon" (dict "name" . "attributes" "class=\"w-8 h-8\"") }} +
+ {{ end }} + + + {{ index $item "name" }} + + + {{ if and $show_levels $level }} +
+
+
+
+ {{ $level }} +
+ {{ end }} +
+ +
+
+ {{ end }} +
+
+ {{ end }} +
+
+ + {{ end }} + {{ end }} + +
+