

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1# Liant Portfolio - AI Copilot Instructions23## Project Overview4A data-driven React 18 portfolio built with Vite, featuring dynamic theme switching and section-based content architecture. All portfolio content is configurable via a single `portfolio.jsx` file, making it maintainable and extensible without touching components.56## Architecture78### Data Flow9**Configuration → Containers → Components → Styling**1011- **Source of Truth:** [src/portfolio.jsx](src/portfolio.jsx) - Contains all portfolio content (skills, projects, education, experience, etc.)12- **Router/Layout:** [src/containers/Main.jsx](src/containers/Main.jsx) - Orchestrates rendering of all sections; controls splash screen visibility13- **Theme System:** [src/contexts/StyleContext.js](src/contexts/StyleContext.js) via [src/hooks/useLocalStorage.js](src/hooks/useLocalStorage.js) - Manages dark/light mode; persists to localStorage1415### Key File Structure16```17src/18├── portfolio.jsx # Configuration file - EDIT THIS to change content19├── contexts/StyleContext.js # Theme context provider20├── hooks/useLocalStorage.js # Persistence hook for theme21├── containers/ # Page sections (greeting, skills, projects, etc.)22├── components/ # Reusable UI components (Button, Cards, Header)23└── variables.scss # Design tokens (colors, spacing, typography)24```2526## Critical Development Patterns2728### 1. Configuration-Driven Development29**Never hardcode content.** All user-facing content comes from `portfolio.jsx`:30```jsx31const greeting = {32 username: "Your Name",33 title: "Hello",34 displayGreeting: true // Control visibility here35};36```37Containers consume this config and conditionally render based on `display` flags.3839### 2. Theme Context Usage40Access theme via `useContext(StyleContext)`:41```jsx42import { useContext } from "react";43import StyleContext from "../../contexts/StyleContext";4445const MyComponent = () => {46 const { isDark, changeTheme } = useContext(StyleContext);47 return <div className={isDark ? "dark-mode" : "light-mode"}>...</div>;48};49```50CSS class names (`dark-mode`/`light-mode`) on root div determine theming.5152### 3. Component & Container Naming Convention53- **Containers** (`/containers`): Full-width sections handling data mapping and layout (e.g., Skills, Projects)54- **Components** (`/components`): Reusable, self-contained UI elements (e.g., Button, Cards)55- **File Structure:** Folder per component with `ComponentName.jsx` + `ComponentName.scss`5657### 4. Styling System58Design tokens defined in [src/variables.scss](src/variables.scss) using CSS custom properties:59```scss60// Light mode variables61:root, .light-mode {62 --bg-body: #f4f4f4;63 --text-primary: #000000;64 --btn-primary-bg: #a1902e;65}6667// Dark mode variables68.dark-mode {69 --bg-body: #0a0a0a;70 --text-primary: #ffffff;71}72```73Import variables in any SCSS file: `@use "@/variables.scss" as *;` (alias configured in [vite.config.js](vite.config.js))7475### 5. Local Storage Persistence76Use custom hook for client-side state persistence:77```jsx78const [isDark, setIsDark] = useLocalStorage("isDark", defaultValue);79// Automatically syncs to localStorage80```81Used by Main.jsx to persist theme preference across sessions.8283## Build & Deployment8485### Development86```bash87npm install # Install dependencies88npm run start # Start Vite dev server (port 3000, auto-opens browser)89```9091### Production92```bash93npm run build # Builds to `build/` folder (vite build command)94npm run deploy # Deploys build/ to gh-pages branch95```96**Note:** Deployment uses separate `gh-pages` branch; main branch is development only.9798## Module System & Asset Imports99- **Type:** ES Modules (`"type": "module"` in package.json)100- **Path Alias:** Use `@/` for absolute imports to `src/` directory101```jsx102 import Button from "@/components/button/Button";103 import { useLocalStorage } from "@/hooks/useLocalStorage";104```105- **Asset Imports:** Images/Lottie animations imported directly:106```jsx107 import telkomLogo from "@/assets/images/telkomSchoolsLogo.png";108 import splashAnimation from "@/assets/lottie/splashAnimation";109```110111## External Dependencies Reference112- **React 18:** Modern API (createRoot, hooks)113- **Framer Motion:** Animation library used in components114- **Lottie React:** Plays JSON animation files from `assets/lottie/`115- **react-easy-emoji:** Emoji rendering with `emoji()` wrapper116- **FontAwesome:** Icon library for soft skills display117118## Adding New Portfolio Sections1191. Add configuration object to [src/portfolio.jsx](src/portfolio.jsx) with `display: true/false`1202. Create container in `src/containers/YourSection/`1213. Import and add to [src/containers/Main.jsx](src/containers/Main.jsx) render order1224. Container reads config via import and conditionally renders based on `display` flag1235. Add navigation link to [src/components/header/Header.jsx](src/components/header/Header.jsx) using shared config flags124125## Editor Shortcuts & Conventions126- **SCSS Variables:** Prefix with `$` (e.g., `$buttonColor`, `$brandGold`)127- **CSS Variables:** Use `--` prefix for theme-switchable properties128- **Component Props:** Destructure in function signature; support `className` for styling overrides129- **Accessibility:** Use semantic HTML; ensure header nav links match Section IDs for anchor linking130131## Performance Considerations132- Vite is configured to chunk vendor libraries separately (React, React-DOM, Framer Motion)133- Splash screen hidden after `splashScreen.duration` ms (default: 1000ms)134- SVG import support via `vite-plugin-svgr` for component-based SVG usage135
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| BryaanF/LiantPortfolio.clinerules/project-guidelines.md · 0 | Cline rules | buildstylearchgit+2 | 96/100 | 14 days ago | |
| BryaanF/LiantPortfolio.clinerules/ui-standards.md · 0 | Cline rules | testlint-formatstylearch+4 | 76/100 | 14 days ago |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| chihebnabil/lovable-boilerplate.github/instructions/global.instructions.md · 65 | Copilot instructions | buildlint-formatstylearch+4 | 100/100 | 14 days ago | |
| louislam/uptime-kuma.github/copilot-instructions.md · 90k | Copilot instructions | setupbuildtestlint-format+9 | 100/100 | 14 days ago | |
| HerringtonDarkholme/megarepo.github/copilot-instructions.md · 17 | Copilot instructions | setupbuildtestlint-format+7 | 100/100 | 14 days ago | |
| bagisto/bagisto.github/copilot-instructions.md · 28k | Copilot instructions | setupbuildteststyle+5 | 97/100 | 14 days ago | |
| JCodesMore/ai-website-cloner-template.github/copilot-instructions.md · 32k | Copilot instructions | buildlint-formatstylearch+3 | 97/100 | 7 days ago | |
| nerolis-lab/nerolis-lab.github/copilot-instructions.md · 32 | Copilot instructions | setupbuildtestlint-format+11 | 96/100 | 14 days ago | |
| darkmatter/nixmac.github/copilot-instructions.md · 25 | Copilot instructions | setupbuildtestlint-format+8 | 96/100 | 14 days ago | |
| thangaram611/second-brain.github/copilot-instructions.md · 0 | Copilot instructions | setupteststylearch+4 | 96/100 | 14 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/bryaanf-liantportfolio-github-copilot-instructions)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.