Uh oh!
There was an error while loading. Please reload this page.
feat(rebranding): wiki modernization and new landing page - #19
Conversation
@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"; | |||
There was a problem hiding this comment.
[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.
| 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. | |||
There was a problem hiding this comment.
[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.
| export function getLatestReleaseTitle(): string { | ||
| const posts = getAllPosts(); | ||
| const latestRealease = posts.filter((post) => post.tags.includes('release'))[0]; | ||
| return latestRealease.title.split(': ')[1]; |
There was a problem hiding this comment.
[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.
| 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> |
There was a problem hiding this comment.
[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).
| <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'); |
There was a problem hiding this comment.
[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.
| 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.
| images: { | ||
| unoptimized: true, | ||
| }, | ||
| allowedDevOrigins: ['192.168.1.17', '192.168.1.10'], |
There was a problem hiding this comment.
[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.
| @@ -0,0 +1,87 @@ | |||
| ▲ Next.js 16.2.4 (Turbopack) | |||
There was a problem hiding this comment.
[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'); | |||
There was a problem hiding this comment.
[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>)}> |
There was a problem hiding this comment.
[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.
| <buttonclassName={classes}{...(restasButtonHTMLAttributes<HTMLButtonElement>)}> | |
| <buttontype="button"className={classes}{...(restasButtonHTMLAttributes<HTMLButtonElement>)}> |
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review SummaryStatus: 11 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICALNone. WARNING
SUGGESTION
Files Reviewed (focus set across 244 changed files)
Fix these issues in Kilo Cloud Reviewed by glm-5.2 · Input: 87.1K · Output: 57.9K · Cached: 811.2K |
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 tosrc/components/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 rootStyles
globals.cssin favor of per-component CSS Modulesglobals.scss(reset + base only) and a dedicated globalprose.scssfor rendered Markdown contentnext/font/google(Urbanist, Outfit, JetBrains Mono) — self-hosted, no runtime dependency on Google FontsHome / Hero
HomeHerorebuilt:ReleasePill,DownloadButton(OS detection, responsive),HeroTrustRow(downloads + "As featured on" logos)HeroVideoPreviewsimplified to hover-to-play, no more fullscreen modalSponsorsMarqueecomponent (continuous scroll, respectsprefers-reduced-motion)Wiki
layout.tsxso the sidebar persists across navigations — fixes a scroll-reset bugWikiContent(image click listeners never cleaned up)Performance
highlight.jsreduced tohighlight.js/lib/commoninstead of the full bundleimport * as si from "simple-icons"in favor of individual SVG imports