Commit Graph
28 Commits
Author SHA1 Message Date
tiennm99 8bdcc2369a docs: README + CHANGELOG + journal + plan for v0.3
- README: add layout/ogImage/ogImageUrl rows; new "Layout variants" + "i18n" sections; correct stale "< 4 KB CSS" claim to "< 3 KB gzipped CSS".
- CHANGELOG: v0.3.0 entry; fresh Unreleased placeholder.
- Journal: post-mortem covering layout variants, i18n gotchas (defaultContentLanguage), and the OG auto-gen scope cut.
- Plan dir: phase files + status reflecting the scope-reduced Phase 2.
2026-05-03 12:19:51 +07:00
tiennm99 19f6b85316 feat: ogImageUrl param + smarter twitter:card upgrade
- params.ogImageUrl: explicit 1200×630 social-preview image; auto-upgrades twitter:card to summary_large_image.
- params.ogImage = false: suppresses all og:image / twitter:image tags.
- Avatar still serves as the og:image fallback when neither override is set (twitter:card stays summary, since avatars are square).
- Auto-generation deferred to v0.4 — vendoring a TTF + 4 base PNGs (~150 KB) conflicted with the theme's minimalist binary footprint.
2026-05-03 12:19:39 +07:00
tiennm99 7809c0b4c8 feat: i18n string externalization with en + vi bundles
- Move every theme-rendered string (nav aria-label, theme-toggle labels, default footer template) to i18n/{lang}.toml.
- Ship en (default) + vi bundles. Adding a language is a single-file change.
- Hugo selects bundle via defaultContentLanguage (not languageCode); documented in README.
- All i18n calls have | default fallbacks so missing keys never break rendering.
2026-05-03 12:19:26 +07:00
tiennm99 949d73c141 feat: layout variants — params.layout = stack/grid/inline
- Validate against allowlist in bio-card.html, warnf + fall back to stack on unknown values.
- Variant CSS scoped under .bio__links--{variant} to avoid v0.2-style specificity collisions.
- Inline variant visually-hides .link__title via clip-path; titles stay in DOM for screen readers.
- Grid collapses to 1-col under 480px.
- New /variants/ gallery page renders all three side by side.
- exampleSite switches to layout = "grid" so the live demo shows the new feature.
2026-05-03 12:19:16 +07:00
tiennm99 eff11d99d8 chore(images): regenerate screenshots showing sakura palette + initials avatar 2026-05-03 11:16:59 +07:00
tiennm99 7487aa2c36 fix: theme-toggle CSS specificity + demo uses initials fallback
- .theme-toggle svg { display: block } was beating per-class hide rules
  due to higher specificity. Scope the per-class rules under
  .theme-toggle .theme-toggle__sun/moon so they win.
- Remove avatar from exampleSite so the initials fallback renders, which
  inherits the active palette's accent color (sakura -> pink). The static
  avatar.svg was hardcoded vermilion and looked off in non-bonsai
  palettes.
2026-05-03 11:16:02 +07:00
tiennm99 921390c351 docs: README + CHANGELOG for v0.2.0 + sakura demo
- README: add new params (colorTheme, themeToggle button details, schema,
  jobTitle/location/email, avatarInitials/Bg) to config table; new
  'Color themes' section with live gallery link
- CHANGELOG: 0.2.0 entry under Added/Changed; placeholder for v0.3
- exampleSite/hugo.toml: colorTheme = sakura for distinctive screenshot
  + jobTitle to populate Person.jobTitle in JSON-LD
2026-05-03 11:13:19 +07:00
tiennm99 7468f3afba feat: v0.2 polish & SEO
Bundle of four small additions for the v0.2 release. All strictly
additive — no breaking changes; v0.1 sites upgrade without edits.

Phase 1 — Color theme presets
- Refactor static/css/bonsai.css: palette vars now scoped per
  [data-bonsai-theme]; layout vars (radius/gap/pad/fonts) stay in :root
- Four palettes: bonsai (default, vermilion+washi), sakura (cherry
  blossom), sumi (monochrome ink), koi (orange+cream). Light + dark
  variants each, both prefers-color-scheme and manual data-theme override
- New params.colorTheme (default 'bonsai'); applied via baseof
- Themes gallery at exampleSite /themes/ shows all 4 side-by-side

Phase 2 — schema.org Person markup
- New layouts/partials/schema-person.html emits JSON-LD ProfilePage
  containing a Person (built from name/bio/avatar/links + optional
  jobTitle/location/email)
- mailto: and tel: links excluded from sameAs
- Suppress with params.schema = false
- Wired into head.html

Phase 3 — Theme toggle UI button
- New layouts/partials/theme-toggle-button.html (sun/moon SVGs)
- Rendered in footer when params.themeToggle = true
- aria-pressed reflects current state; updated theme-toggle.js to
  sync on click and on first paint
- Sun shown in dark mode, moon in light (button shows target state)
- exampleSite enables the toggle by default for demo

Phase 4 — Avatar initials fallback
- New layouts/partials/avatar.html: img if params.avatar set,
  inline SVG circle with initials otherwise
- Initials auto-derived from params.name (first letter of up to 2
  words, uppercased); override with params.avatarInitials
- Background overrideable with params.avatarBg; defaults to accent
- bio-card.html simplified to delegate to the partial
2026-05-03 11:11:39 +07:00
tiennm99 ce08594810 docs(journal): v0.1 release retro 2026-05-03 11:11:19 +07:00
tiennm99 6997564aaa chore(images): regenerate screenshot.png + tn.png after avatar/URL fixes 2026-05-01 16:43:47 +07:00
tiennm99 50469b0747 fix(exampleSite): use Latin T glyph for avatar (font-portable)
Headless renderers and many systems lack Japanese fonts to render the
kanji glyph used previously. T is universally available and reads as
a Tien-Nguyen demo monogram.
2026-05-01 16:42:34 +07:00
tiennm99 30da421d7d fix(layouts): strip leading slash before relURL so subpath is honored
Hugo's relURL/absURL on a leading-slash path treats it as root-absolute
and skips the baseURL subpath. Strip the prefix first so user-supplied
paths like '/images/avatar.svg' resolve correctly under
https://*.github.io/<repo>/.
2026-05-01 16:41:16 +07:00
tiennm99 179d456eff fix(layouts): use absURL for asset paths so subpath deploys work
relURL leaves leading-slash paths untouched, breaking sites served
from a subpath like https://*.github.io/bonsai/. absURL prepends the
full baseURL (including subpath) and works in both root and subpath
deployments. Affects: avatar img, favicon link, css link, theme-toggle
script.
2026-05-01 16:39:26 +07:00
tiennm99 c163f13eaa feat(exampleSite): bonsai monogram SVG avatar + recapture screenshots
avatar.svg: vermilion circle with kanji 盆 (bon, from 盆栽) in
washi-paper text. exampleSite/hugo.toml updated to reference it.
images/screenshot.png and images/tn.png recaptured against the demo
now showing all 6 working brand+ui icons.
2026-05-01 16:37:26 +07:00
tiennm99 37ed198b2a fix(css): size brand icons to 20x20 (Simple Icons SVGs lack width/height)
Simple Icons ships SVGs with viewBox only — no explicit width/height —
so inline SVG rendered at 0x0 inside the link button flex container.
Add `.link__icon svg { width:20px; height:20px; fill:currentColor }` to
size all icons consistently. Lucide stroke-only icons opt out of the
fill via attribute selector.
2026-05-01 16:35:32 +07:00
tiennm99 a67bdc5790 docs: README polish + CONTRIBUTING + CHANGELOG
- README: add badges (build/license/Hugo), live-demo callouts, full
  configuration parameter table, expanded features list
- CONTRIBUTING.md: dev setup, icon-add workflow, PR/style guidelines
- CHANGELOG.md: Keep-a-Changelog format with v0.1.0 + v0.0.1 entries
- theme.toml: point demosite at live GitHub Pages URL
2026-05-01 14:20:37 +07:00
tiennm99 f2b6737960 ci: add build workflow, dependabot config, and Pages deploy
- build.yml: hugo extended 0.154.0, runs on PR + main push, uploads
  exampleSite artifact for inspection
- deploy.yml: deploys exampleSite to GitHub Pages on main push using
  actions/configure-pages + actions/deploy-pages (modern flow, no
  gh-pages branch)
- dependabot.yml: weekly action version updates

One-time manual: enable Pages in repo settings (Source = GitHub Actions)
before deploy.yml will succeed.
2026-05-01 14:17:00 +07:00
tiennm99 3c61e89adb feat(icons): vendor Lucide UI + Simple Icons brand sets, data-driven partial
- Add scripts/sync-icons.sh to fetch 25 brand (Simple Icons v13) + 10 UI
  (Lucide v0.460) SVGs; idempotent, pinned versions, currentColor-normalised
- Vendor SVGs into assets/icons/{brand,ui}/
- Add data/icons.yaml manifest mapping public names → {family, slug}
- Rewrite layouts/partials/icon.html (13 lines) to data-driven resources.Get
  with generic external-link fallback for unknown names
- Add layouts/icons/single.html gallery page; exampleSite demo link
- Add NOTICE crediting Simple Icons (CC0 1.0) and Lucide (ISC)
- Update README with available-icons <details> section
- Add mastodon + bsky demo links to exampleSite/hugo.toml
2026-05-01 14:16:05 +07:00
tiennm99 abdb0ba3bd chore(exampleSite): disable taxonomy/RSS/sitemap (single-page bio) 2026-05-01 10:11:01 +07:00
tiennm99 a968b9dafc feat: initial Bonsai theme scaffold
Minimalist Hugo theme for link-in-bio pages, inspired by Linktree
and Japanese bonsai aesthetics.

- Single-page bio with avatar, tagline, bio, and links
- Data-driven via [params] in hugo.toml — no content files needed
- Light/dark mode via prefers-color-scheme + optional toggle
- Inline SVG icon set (github, globe, mail, twitter, linkedin, etc)
- Zero JS by default; opt-in theme toggle script
- exampleSite for local development
2026-05-01 10:04:59 +07:00
tiennm99 86cdde9cf4 chore: remove bonsai theme submodule
The theme's full history is merged into themes/bonsai/ next.
2026-10-03 12:28:08 +07:00
tiennm99 ef7c94de8e refactor: switch Hugo config from TOML to YAML 2026-05-13 17:10:05 +07:00
tiennm99 37dbf84c14 feat: rebuild site on Hugo + bonsai theme
Replace the custom Node.js builder with Hugo and the bonsai theme
(added as a submodule at themes/bonsai). Site content moves from
config.yaml into [params] in hugo.toml. CI switched to Hugo Extended
0.154.0 build; daily cron dropped (no API decoration to refresh).
Avatar imported from miti99 project.
2026-05-03 10:45:54 +07:00
tiennm99 191bf38d86 docs: drop obsolete Pages UI setup step from README
The deploy workflow now self-enables Pages via configure-pages@v5
with enablement: true, so the manual Settings -> Pages flip is no
longer required. Mention the workflow-permissions prerequisite
instead.
2026-04-30 22:10:54 +07:00
tiennm99 eb13e2445d fix(ci): enable Pages auto-enrollment in configure-pages
First-run failed because the repository had no Pages site yet and
configure-pages@v5 defaults to enablement: false. Setting it to true
lets the action create the Pages site on first deploy and removes the
manual Settings -> Pages UI step.
2026-04-30 22:08:03 +07:00
tiennm99 17cbbeacb2 docs: add xia recon report and port plan
Captures the analysis behind the linkyee-inspired implementation: source
anatomy, dependency matrix, decision matrix (stack, plugins, theme, icons,
deploy), and four phase files used to drive the build.
2026-04-30 22:05:12 +07:00
tiennm99 a90cb8126a feat: implement config-driven link page
Single-page link-in-bio site at config.yaml -> build.js -> _site/index.html.
Links flagged with `repo: owner/name` get live star count and last-commit
age decoration from the GitHub REST API at build time.

Stack: vanilla HTML/CSS output, Node 20 build script (sole dep: js-yaml).
Deploy: GitHub Actions Pages artifact, daily cron + push triggers.

Architecture inspired by linkyee (MIT); no source code copied. See NOTICE.
2026-04-30 22:05:05 +07:00
tiennm99 9fca485f14 docs: rename project to iammiti99 2026-04-29 21:37:57 +07:00