Maulana SodiqinandClaude Opus 4.6 63dfb7299f feat(backoffice): redesign backoffice UI dengan shadcn/ui
Menyeluruh merancang ulang apps/backoffice memakai pola shadcn/ui sambil
mempertahankan seluruh palette warna existing (primary/neutral/success/
info/warning/danger) dan typography Bai Jamjuree.

UI library (libs/ui):
- Atoms existing (Button, Input, Label, Textarea, Card, Dialog, Drawer,
  Form, Select, Toggle) dirombak ke pola shadcn, API dipertahankan agar
  sibling apps (gacha, dimentorin, hackathon, qrcampaign) tidak break
- Select atom beralih dari native ke Radix Select + NativeSelect fallback
- 18 atom baru: Badge, Avatar, Separator, Skeleton, Tabs, Tooltip,
  DropdownMenu, Popover, AlertDialog, Checkbox, RadioGroup, Switch,
  ScrollArea, Sheet, Sidebar, Breadcrumb, Table, + use-mobile hook
- DataTable, Filter, BackofficeWrapper, Pagination, Modal (alias Dialog)
  direstyle dengan token baru
- CSS variable layer shadcn ditambahkan (--color-primary, --color-sidebar-*,
  dll) dipetakan ke palette existing; tw-animate-css di-import untuk
  transisi

Backoffice shell:
- Sidebar bersarang SidebarProvider + SidebarInset, built-in mobile Sheet,
  user DropdownMenu (Avatar + logout), ikon lucide-react

Pages redesign (19 list/dashboard/settings):
- accounts, cms-events, cms-testimonials, dashboard, dashboard-dimentorin
  (dengan recharts di Card), feedback-review-dimentorin, gacha-roll,
  hackathon-dashboard, hackathon-submissions, hackathon-teams,
  hackathon-users, permissions, prizes, roadmap-dimentorin, roles,
  session-dimentorin, settings-dimentorin (Tabs), transactions,
  users-dimentorin (Tabs mentor/mentee)
- Pola unified: BackofficeWrapper > Card (CardHeader toolbar + CardContent
  DataTable) + AlertDialog untuk delete confirm
- Form accounts_/$id diredesign; form pages lain tetap pakai
  ControlledInputField yang sekarang berbasis shadcn Input

Dependencies:
- +20 radix-ui primitives, lucide-react, cmdk, input-otp
- Select native patched di dimentorin (profile-sidebar, schedule step)
  untuk tetap kompatibel via NativeSelect alias

Verifikasi:
- nx build backoffice: sukses (2.33s, 4801 modules)
- nx build dimentorin/gacha/hackathon/qrcampaign: semua sukses (zero
  regresi dari rewrite libs/ui)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:01:47 +07:00
2026-03-31 14:20:40 +07:00
2025-03-13 00:50:45 +07:00
2025-03-13 00:50:45 +07:00
2025-03-13 00:50:45 +07:00
2025-03-13 00:50:45 +07:00

IMPHNEN Frontend Service

IMPHNEN

Monorepo for all frontend services of IMPHNEN (Ingin Menjadi Programmer Handal Namun Enggan Ngoding) — Indonesia's largest programmer community.

Apps

App Framework URL
Landing Next.js 16 imphnen.dev
Backoffice Vite + React backoffice.imphnen.dev
Hackathon Vite + React hackathon.imphnen.dev
Dimentorin Vite + React dimentorin.imphnen.dev
Gacha Vite + React gacha.imphnen.dev
QR Campaign Vite + React qr.imphnen.dev
Infra Vite + React infra.imphnen.dev

Shared Libraries

Lib Purpose
utils Pure utilities — cn(), For, Show, useQueryState, useModalLogin
service Business logic — API clients, auth hooks, storage, constants
ui UI components — atoms, molecules, organisms (atomic design)

Getting Started

Prerequisites

  • Node.js 22
  • Nix (optional, for reproducible builds)

Setup

git clone https://github.com/IMPHNEN/imphnen-frontend-service.git
cd imphnen-frontend-service
npm install

Or with Nix:

nix develop  # enters dev shell with node 22, bun, git, jq

Environment Variables

Copy .env.example to .env in the app directory:

cp apps/<app>/.env.example apps/<app>/.env

Development

nx dev <app>        # e.g. nx dev landing, nx dev backoffice

Build

nx build <app>            # build single app
nx run-many -t build --all # build everything
nx affected -t build       # build only what changed

Nix Build

nix build .#<app>    # e.g. nix build .#landing, .#dimentorin

All Nix config lives in flake.nix. When package-lock.json changes, update npmDepsHash using lib.fakeHash.

Testing

nx test <project>    # unit tests (vitest)
nx e2e <app>-e2e     # e2e tests (playwright)
nx lint <project>    # eslint

Storybook

nx storybook ui      # run storybook for ui lib
nx build-storybook ui # build static storybook

CI/CD

GitHub Actions pipeline (.github/workflows/nix-build.yml):

  1. detect — uses nx affected to find changed apps
  2. build — matrix strategy builds only affected apps with Nix, pushes to Cachix
  3. deploy — updates flake.lock in imphnen-infrastructure and deploys to the server using clan

Tech Stack

  • Monorepo: Nx 22.6
  • Frontend: React 19, TypeScript
  • Styling: Tailwind CSS v4, CVA
  • State: Zustand, TanStack React Query
  • Forms: react-hook-form + zod
  • Build: Nix flakes, Cachix
  • CI: GitHub Actions

Contributing

  1. Fork and clone the repository
  2. Create a branch: git checkout -b feat/feature-name
  3. Make changes, commit, and push
  4. Open a pull request to the develop branch

Issues and feedback welcome via GitHub Issues.

S
Description
Fork of IMPHNEN/imphnen-frontend-service (mirror)
Readme
46 MiB
Languages
TypeScript 98.2%
CSS 1.3%
JavaScript 0.3%
Dockerfile 0.1%