Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
e1d53af
feat(site): add CI workflow, local dev script, SEO plugins, and Ruby pin
vishalgattani May 16, 2026
19aca30
feat(build): add build/ folder with BUILD_INSTRUCTIONS.md and serve.sh
vishalgattani May 16, 2026
d79d77d
chore(ruby): bump Ruby 3.1.0 → 3.3.11 (EOL fix)
vishalgattani May 16, 2026
eeaae37
feat(build): add build/setup.sh idempotent macOS setup script
vishalgattani May 16, 2026
90c43d2
fix(build): init rbenv in scripts to avoid system Ruby 2.6 being pick…
vishalgattani May 16, 2026
4c894ef
fix(config): exclude build/ from Jekyll processing
vishalgattani May 16, 2026
70590f5
feat(trips): add Trips collection with Leaflet.js maps
vishalgattani May 16, 2026
54990ab
fix(trips): OSRM road routing, Leaflet card maps, fixed 400px map hei…
vishalgattani May 16, 2026
a370a9a
feat(trips): rich marker types + shared trip-map.js
vishalgattani May 16, 2026
4c5a171
docs(trips): add how-to blog post + fix demo trip convention
vishalgattani May 16, 2026
82d2501
fix(trips): load trip-map.js on listing page so card maps render
vishalgattani May 16, 2026
a8e4e1d
chore: add jekyll-feed for RSS at /feed.xml
vishalgattani May 16, 2026
2556cff
fix: add missing usernames to social media URLs
vishalgattani May 16, 2026
d5e362b
feat: add count badges to tags page and tag cloud index
vishalgattani May 16, 2026
674970b
feat: add section quick-links to landing page
vishalgattani May 16, 2026
3c150e3
fix: exclude vendor/ from Jekyll build to fix CI date parse error
vishalgattani May 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CI

on:
push:
branches-ignore:
- master
pull_request:

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true

- name: Build site
run: bundle exec jekyll build --config _config.yml
env:
BUNDLE_PATH: vendor/bundle

- name: Check HTML
run: |
bundle exec htmlproofer ./_site \
--disable-external \
--ignore-urls "/localhost/" \
--allow-hash-href
continue-on-error: true
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.3.11
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
source "https://rubygems.org"

gem "github-pages", group: :jekyll_plugins
gem "jekyll-seo-tag"
gem "jekyll-sitemap"
gem "jekyll-feed"
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
13 changes: 13 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ open_new_tab : true # Opens external URLs in
### Plugins ###
plugins:
- jemoji
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-feed


### Navbar Settings ###
Expand Down Expand Up @@ -61,6 +64,9 @@ collections:
research:
output: true
permalink: /research/:name
trips:
output: true
permalink: /trips/:name
elements: # For Documentation Only
output: true # For Documentation Only

Expand Down Expand Up @@ -99,6 +105,11 @@ defaults:
type: "research"
values:
layout: "page"
- scope:
path: ""
type: "trips"
values:
layout: "trip"
- scope: # For Documentation Only
path: "" # For Documentation Only
type: "elements" # For Documentation Only
Expand All @@ -117,3 +128,5 @@ exclude:
- CONTRIBUTING.md
- LICENSE
- "*.log"
- build/
- vendor/
8 changes: 4 additions & 4 deletions _data/social-media.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ email:
# color : 3b5998

github:
url : https://www.github.com/
url : https://www.github.com/vishalgattani
icon : fab fa-github
color : 333333

gitlab:
url : https://gitlab.com/
url : https://gitlab.com/vishalgattani
icon : fab fa-gitlab
color : fca326

instagram:
url : https://www.instagram.com/
url : https://www.instagram.com/vishalgattani
icon : fab fa-instagram
color : 405de6

linkedin:
url : https://www.linkedin.com/in/
url : https://www.linkedin.com/in/vishalgattani
icon : fab fa-linkedin-in
color : 007bb5

Expand Down
48 changes: 36 additions & 12 deletions _includes/blog/tags.html
Original file line number Diff line number Diff line change
@@ -1,17 +1,41 @@
<!-- Collect tags from all posts -->
{%- assign tags = blank -%}
<!-- Collect tags with counts -->
{%- assign all_tags = "" | split: "" -%}
{%- for post in site.posts -%}
{%- assign post_tags = post.tags | join:'|' | append:'|' -%}
{%- if post_tags != '|' -%}
{%- assign tags = tags | append:post_tags -%}
{%- endif -%}
{%- for tag in post.tags -%}
{%- assign all_tags = all_tags | push: tag -%}
{%- endfor -%}
{%- endfor -%}
{%- assign tags = tags | split:'|' | uniq | sort -%}
{%- assign unique_tags = all_tags | uniq | sort -%}

<!-- Tag cloud with counts -->
<div class="mb-4">
{%- for tag in unique_tags -%}
{%- assign count = 0 -%}
{%- for t in all_tags -%}
{%- if t == tag -%}{%- assign count = count | plus: 1 -%}{%- endif -%}
{%- endfor -%}
<a href="#{{ tag | slugify }}" class="text-decoration-none">
<span class="badge badge-pill text-primary border border-primary m-1" style="font-size:0.85rem;">
{{ tag }} <span class="badge badge-primary ml-1">{{ count }}</span>
</span>
</a>
{%- endfor -%}
</div>

<hr class="bg-light">

<!-- Posts grouped by tag -->
{% for tag in unique_tags %}
{%- assign count = 0 -%}
{%- for t in all_tags -%}
{%- if t == tag -%}{%- assign count = count | plus: 1 -%}{%- endif -%}
{%- endfor -%}

<!-- List tags & related posts -->
{% for tag in tags %}
<div class="py-3">
<h4 id="{{ tag | slugify }}">{{ tag }}</h4>
<h4 id="{{ tag | slugify }}">
{{ tag }}
<span class="badge badge-primary ml-1" style="font-size:0.75rem; vertical-align:middle;">{{ count }}</span>
</h4>
<ol>
{% for post in site.posts %}
{%- if post.tags contains tag -%}
Expand All @@ -21,11 +45,11 @@ <h4 id="{{ tag | slugify }}">{{ tag }}</h4>
{%- assign url = post.url | relative_url -%}
{%- endif -%}
<a href="{{ url }}"><li>{{ post.title }}</li></a>
<small class="text-muted"> - {{ post.date | date_to_long_string }}</small>
<small class="text-muted"> {{ post.date | date_to_long_string }}</small>
<br/>
{%- endif -%}
{% endfor %}
</ol>
</div>
<hr class="bg-light">
{% endfor %}
{% endfor %}
7 changes: 7 additions & 0 deletions _includes/landing.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,12 @@

<p class="text-muted wow animated slideInUp" data-wow-delay=".15s">{{ site.description }}</p>

<div class="wow animated slideInUp" data-wow-delay=".2s">
<a href="/projects/" class="btn btn-outline-primary btn-sm m-1">Projects</a>
<a href="/blog/" class="btn btn-outline-primary btn-sm m-1">Blog</a>
<a href="/trips/" class="btn btn-outline-primary btn-sm m-1">Trips</a>
<a href="/research/" class="btn btn-outline-primary btn-sm m-1">Research</a>
</div>

</div>
</div>
9 changes: 9 additions & 0 deletions _includes/trips/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="{{ '/assets/js/trip-map.js' | relative_url }}"></script>

<div class="card-columns m-3 mt-5">
{% for trip in site.trips reversed %}
{% include trips/trip-card.html %}
{% endfor %}
</div>
18 changes: 18 additions & 0 deletions _includes/trips/map-section.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{% comment %}
Usage in trip markdown:
{% include trips/map-section.html id="day2" stops=page.day2_stops type="road" %}

`id` — unique string, used as the HTML element ID (required)
`stops` — array from frontmatter (required)
`type` — road | flight | place (default: road)
{% endcomment %}

<div id="map-{{ include.id }}" style="border-radius: 8px; margin: 1.5rem 0;"></div>

<script>
TripMap.render(
'map-{{ include.id }}',
{{ include.stops | jsonify }},
{{ include.type | default: "road" | jsonify }}
);
</script>
37 changes: 37 additions & 0 deletions _includes/trips/trip-card.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{% assign card_id = trip.slug %}

<div class="wow animated fadeIn" data-wow-delay=".15s">
<a href="{{ trip.url | relative_url }}" class="project card text-themed">
<div id="card-map-{{ card_id }}" style="height: 160px; border-radius: 8px 8px 0 0; pointer-events: none;"></div>
<div class="card-body">
<h5 class="card-title">{{ trip.title }}</h5>
{% if trip.description %}
<p class="card-text">{{ trip.description }}</p>
{% endif %}
<p class="card-text">
{% if trip.trip_type == "road" %}
<span class="badge badge-success">🚗 Road Trip</span>
{% elsif trip.trip_type == "flight" %}
<span class="badge badge-primary">✈️ Flight</span>
{% else %}
<span class="badge badge-secondary">📍 Place</span>
{% endif %}
{% if trip.date %}
<span class="badge badge-light ml-1">{{ trip.date | date: "%b %Y" }}</span>
{% endif %}
{% for tag in trip.tags %}
<span class="badge badge-pill text-primary border border-primary ml-1">{{ tag }}</span>
{% endfor %}
</p>
</div>
</a>
</div>

<script>
TripMap.render(
'card-map-{{ card_id }}',
{{ trip.stops | jsonify }},
{{ trip.trip_type | jsonify }},
{ interactive: false, height: '160px' }
);
</script>
39 changes: 39 additions & 0 deletions _layouts/trip.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
layout: default
---

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="{{ '/assets/js/trip-map.js' | relative_url }}"></script>

<div class="col-lg-10 mx-auto mt-5">

<h1 class="mb-1">{{ page.title }}</h1>

<div class="mb-2">
{% if page.trip_type == "road" %}
<span class="badge badge-success">🚗 Road Trip</span>
{% elsif page.trip_type == "flight" %}
<span class="badge badge-primary">✈️ Flight</span>
{% else %}
<span class="badge badge-secondary">📍 Place</span>
{% endif %}
{% if page.date %}
<span class="text-muted ml-2" style="font-size:0.9rem;">{{ page.date | date: "%B %Y" }}</span>
{% endif %}
{% for tag in page.tags %}
<span class="badge badge-light ml-1">{{ tag }}</span>
{% endfor %}
</div>

<div id="trip-map" style="height: 400px; border-radius: 8px; margin-bottom: 2rem;"></div>

<div class="markdown-body">
{{ content }}
</div>

</div>

<script>
TripMap.render('trip-map', {{ page.stops | jsonify }}, {{ page.trip_type | jsonify }});
</script>
Loading
Loading