Skip to content

feat(rebranding): wiki modernization and new landing page - #19

Open
wajrock wants to merge 1 commit into
TabularisDB:mainfrom
wajrock:feat/rebranding
Open

feat(rebranding): wiki modernization and new landing page#19
wajrock wants to merge 1 commit into
TabularisDB:mainfrom
wajrock:feat/rebranding

Conversation

@wajrock

Copy link
Copy Markdown

Site redesign: architecture, CSS Modules, and component rebuild

Summary

Full front-end architecture overhaul: folder structure, migration from a monolithic global stylesheet to scoped CSS Modules, and a rebuild of the main components (header, hero, wiki, sponsors). No editorial content changes — structure, styling, and interactivity only.

Architecture

  • src/app/ now holds routing only (page.tsx, layout.tsx); all components moved to src/components/
  • New organization: layout/ (structural, site-wide), ui/ (generic primitives), common/ (shared across domains), pages/[name]/ (page-specific)
  • lib/ reorganized by domain (blog/, wiki, download/, seo/, og/); cross-cutting files stay at root

Styles

  • Removed the 13k+ line monolithic globals.css in favor of per-component CSS Modules
  • New minimal globals.scss (reset + base only) and a dedicated global prose.scss for rendered Markdown content
  • Fonts migrated to next/font/google (Urbanist, Outfit, JetBrains Mono) — self-hosted, no runtime dependency on Google Fonts

Home / Hero

  • HomeHero rebuilt: ReleasePill, DownloadButton (OS detection, responsive), HeroTrustRow (downloads + "As featured on" logos)
  • HeroVideoPreview simplified to hover-to-play, no more fullscreen modal
  • New SponsorsMarquee component (continuous scroll, respects prefers-reduced-motion)

Wiki

  • Added a real route layout.tsx so the sidebar persists across navigations — fixes a scroll-reset bug
  • Fixed a memory leak in WikiContent (image click listeners never cleaned up)
  • Improved code block styling, automatic table wrapping for mobile scroll

Performance

  • highlight.js reduced to highlight.js/lib/common instead of the full bundle
  • Removed import * as si from "simple-icons" in favor of individual SVG imports

@vercel

vercelBot commented Sep 4, 2026

Copy link
Copy Markdown

@wajrock is attempting to deploy a commit to the Tabularis Team on Vercel.

A member of the Team first needs to authorize it.

@@ -0,0 +1 @@
export const APP_VERSION = "0.21.0";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING]: The consumed APP_VERSION is frozen at the committed snapshot and never refreshed on deploy.

Consumers now import APP_VERSION from src/lib/download/version.ts (src/lib/seo/index.ts:1 feeds site-wide JSON-LD softwareVersion, and src/lib/markdown/index.ts:7 replaces {{APP_VERSION}}), but scripts/fetch-app-data.mjs:12 still regenerates the now-orphaned src/lib/version.ts on every Vercel build. The two already diverge (0.21.0 here vs 0.22.0 in src/lib/version.ts), so softwareVersion and any {{APP_VERSION}} in Markdown will stay pinned to 0.21.0 regardless of redeploys. Re-exporting the refreshed file keeps the existing committed-snapshot-for-local-dev pattern intact.

Suggested change
exportconstAPP_VERSION="0.21.0";
export{APP_VERSION}from'@/lib/version';

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@@ -0,0 +1,82 @@
// Generated by scripts/fetch-app-data.mjs. Do not edit by hand.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[SUGGESTION]: Same deploy-sync regression for the nightly data, currently latent.

src/lib/download/downloadConfig.ts:2 imports NIGHTLY_RELEASE from this file (frozen at 0.20.1), while scripts/fetch-app-data.mjs:189 overwrites the orphaned src/lib/nightly.ts with the latest (0.22.1) each deploy. No surviving route renders it in this PR (the /download page was removed), so there is no live impact yet — but once a download UI returns it will resolve to stale/404 nightly assets. Re-export from the refreshed file (or point fetch-app-data.mjs at the new path).


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment threadsrc/lib/blog/posts.ts
export function getLatestReleaseTitle(): string {
const posts = getAllPosts();
const latestRealease = posts.filter((post) => post.tags.includes('release'))[0];
return latestRealease.title.split(': ')[1];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING]:getLatestReleaseTitle() throws at build time if no post is tagged release.

This new function runs at build time on the home route (ReleasePill.tsx:9), and posts.filter(... 'release')[0] is undefined when no release-tagged post exists, so latestRealease.title throws a TypeError and fails next build; titles lacking : also yield undefined. Content includes a release post today, but this is a new build-time code path with no guard.

Suggested change
returnlatestRealease.title.split(': ')[1];
returnlatestRealease?.title.split(': ')[1]??'';

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

<div className={clsx(styles.divider, 'divider')}></div>
<span className={styles.stars}>
<StarIcon />
<div>{formatStars(stars!)}</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING]: The star count renders the literal string null in the prerendered static-export HTML.

useRepoStars() starts at null and only resolves in useEffect, so during App-Router static prerender stars is null. formatStars(count: number) (src/lib/github/index.ts:9) then does String(null) -> null, and the stars! assertion hides the state. The shipped HTML contains <div>null</div> until the client fetch settles (and permanently for no-JS visitors).

Suggested change
<div>{formatStars(stars!)}</div>
<div>{stars!=null ? formatStars(stars) : '—'}</div>

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

(result: SearchResult) => {
closeModal();
if (result.type === 'plugin' && result.url) {
window.open(result.url, '_blank');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[SUGGESTION]:window.open for plugin results omits noopener and skips URL-scheme validation.

For plugin results, result.url is a community-authored registry string (plugin.registry_url ?? plugin.homepage, per scripts/generate-search-index.mjs) passed straight to window.open(... '_blank'). The other external links here (MegaMenu/MobileMenu <a>) set rel='noopener noreferrer'; this is the only unguarded sink. Adding noopener,noreferrer closes the reverse-tabnabbing gap, and an https?: scheme check would harden against a javascript:/phishing value.

Suggested change
window.open(result.url,'_blank');
window.open(result.url,'_blank','noopener,noreferrer');

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment threadnext.config.ts
images: {
unoptimized: true,
},
allowedDevOrigins: ['192.168.1.17', '192.168.1.10'],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[SUGGESTION]: A dev-only allowedDevOrigins entry hardcodes a contributor's private LAN IPs.

This is a next dev-only option with no effect on output: 'export' static builds, but it bakes 192.168.1.17 / 192.168.1.10 into config shared across contributors — the same 192.168.1.17 surfaces in the accidentally-committed build.log. Consider removing it and using local env config for per-developer origins.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment threadbuild.log
@@ -0,0 +1,87 @@
▲ Next.js 16.2.4 (Turbopack)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING]: An accidental Next.js dev-server log was committed and is not gitignored.

git ls-files tracks it and .gitignore has no matching rule. Its content is a next dev console log that even leaks the developer's LAN IP (192.168.1.17); it should be deleted and added to .gitignore.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@@ -0,0 +1,13197 @@
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&family=Urbanist:ital,wght@0,100..900;1,100..900&display=swap');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING]: The old 13,197-line globals.css was re-committed as src/app/globals copy.css (note the space in the name).

The intended replacement is the new src/app/globals.scss (this copy is leftover from deleting globals.css). It is tracked, not gitignored, bloats the repo by ~13k lines, and the accidental space in the filename marks it as a mistake. Delete it.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

}

return (
<button className={classes} {...(rest as ButtonHTMLAttributes<HTMLButtonElement>)}>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[SUGGESTION]: The rendered <button> has no type="button" default, so it defaults to type="submit".

This reusable primitive would submit any enclosing form on click the moment it is placed inside one. No current <Button> sits in a form, so it is latent, but setting type="button" before the spread still lets callers override via rest.type.

Suggested change
<buttonclassName={classes}{...(restasButtonHTMLAttributes<HTMLButtonElement>)}>
<buttontype="button"className={classes}{...(restasButtonHTMLAttributes<HTMLButtonElement>)}>

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-botBot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 11 Issues Found | Recommendation: Address before merge

Overview

SeverityCount
CRITICAL0
WARNING7
SUGGESTION4
Issue Details (click to expand)

CRITICAL

None.

WARNING

FileLineIssue
src/lib/download/version.ts1Deploy sync for APP_VERSION is broken: consumers read this frozen file (0.21.0), but scripts/fetch-app-data.mjs refreshes the now-orphaned src/lib/version.ts (0.22.0). Pins site-wide JSON-LD softwareVersion and every {{APP_VERSION}} in Markdown.
src/app/sitemap.tsdeletedSitemap removed; the static export no longer emits sitemap.xml although /, /wiki, and /wiki/[slug] routes remain. AGENTS.md requires keeping the sitemap in sync.
src/lib/blog/posts.ts299getLatestReleaseTitle() dereferences posts.filter(... 'release')[0].title with no guard; throws and fails next build if no post is tagged release. Runs at build time via the home ReleasePill.
src/components/ui/GithubButton/GithubButton.tsx21formatStars(stars!) renders the literal string null in the prerendered static-export HTML (useRepoStars is null until the client fetch).
build.log1Accidental next dev log committed and not gitignored; leaks a contributor LAN IP. Delete and gitignore.
src/app/globals copy.css1Old 13k-line globals.css re-committed as globals copy.css (space in the name); not gitignored. Delete and gitignore.
tsconfig.tsbuildinfo1Generated TypeScript incremental cache tracked and not gitignored; ~12k-line churn and merge conflicts. git rm and gitignore.

SUGGESTION

FileLineIssue
src/lib/download/nightly.ts1Same deploy-sync regression for NIGHTLY_RELEASE (frozen 0.20.1 vs refreshed 0.22.1); latent, no /download route renders it in this PR.
src/components/layout/SearchModal/SearchModal.tsx98window.open for plugin results omits noopener; no URL-scheme validation on registry-supplied URLs.
next.config.ts9allowedDevOrigins hardcodes a contributor private LAN IPs; next dev-only cruft in shared build config.
src/components/ui/Button/Button.tsx55Missing type on the <button>; defaults to submit, a latent form footgun for this reusable primitive.
Files Reviewed (focus set across 244 changed files)
  • src/lib/download/version.ts, src/lib/download/nightly.ts, src/lib/download/downloadConfig.ts - 2 issues (version WARNING + nightly SUGGESTION)
  • src/lib/blog/posts.ts - 1 issue
  • src/lib/markdown/index.ts, src/lib/seo/index.ts, src/lib/seo/seoPages.ts, src/lib/github/index.ts, src/lib/wiki.ts - reviewed, no issues
  • src/app/sitemap.ts - 1 issue (deleted, summary-only)
  • src/app/page.tsx, src/app/layout.tsx, src/app/font.ts, src/app/wiki/** - reviewed, no issues
  • scripts/fetch-app-data.mjs, scripts/generate-search-index.mjs - reviewed for per-deploy sync targets
  • src/components/layout/SiteHeader/** (DesktopNav, MegaMenu, MobileMenu, MobileNavGroup, NavGroup, HeaderActions) - reviewed, no issues
  • src/components/layout/SearchModal/SearchModal.tsx - 1 issue
  • src/components/pages/wiki/** - reviewed; the WikiContent image-listener memory-leak fix verified (addEventListener/removeEventListener match, cleanup on unmount)
  • src/components/pages/home/** (HomeHero, ReleasePill, HeroVideo, HeroTrust, ProductOverview/Diagram, SponsorsMarquee) - reviewed, no issues
  • src/hooks/useDownloads.ts, src/hooks/useRepoStars.ts - reviewed, no issues
  • src/components/ui/GithubButton/GithubButton.tsx - 1 issue
  • src/components/ui/Button/Button.tsx - 1 issue
  • src/components/ui/LightboxOverlay/**, src/components/ui/Icons/**, src/components/layout/** shell (Footer, Analytics, CookieConsent, JsonLd, Brand, GradientBackground) - reviewed, no issues
  • next.config.ts, postcss.config.mjs, package.json, tsconfig.json, vercel.json, src/app/globals.scss, src/styles/prose.scss - reviewed; output: 'export' and unoptimized images preserved
  • build.log, src/app/globals copy.css, tsconfig.tsbuildinfo - 3 committed artifacts to remove
  • plugins/registry.json - reviewed; local edits are harmless (overwritten by fetch-app-data on deploy)

Fix these issues in Kilo Cloud


Reviewed by glm-5.2 · Input: 87.1K · Output: 57.9K · Cached: 811.2K

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@wajrock