Master Frontend Guide
Live screenshot from the SOQ beauty demo (aiacademy.aiee.dev).
SOQ International Academy TMS “ UI/UX designer handover ” AI coding agent ready — Updated 2026-09-14
Code root:
Source/ — Market: SGD — Singapore PEISource Markdown (repo):
Documentation/MASTER_FRONTEND_DOCUMENTATION.mdUAT acceptance pack: UAT Test
On this page
- How to use this guide
- Product overview
- Three frontend surfaces
- Roles & vocabulary
- Design system
- Component patterns
- Screen map
- Redesign priority
- User journeys
- Feature gates & stubs
- Assets & build
- AI coding rules
- Figma structure
- Open questions
How to use this document
- Read Product + Surfaces + Roles first — do not invent a fourth surface without product approval.
- Use Design system + Components — prefer tokens over one-off hex colours.
- Use Screen map + Journeys — match business logic before changing IA.
- Use AI coding rules when generating Blade/Sass/JS — wrong paths break Mix builds.
- Always check business logic in Technical Master before redesigning purchase, payout, quiz, attendance, or org seats.
Sibling documents
| Doc | Why |
|---|---|
Documentation/SOQ_Business_Plan.md | Product portfolio, commercial modes, UX principles |
Documentation/Technical/MASTER_TECHNICAL_DOCUMENTATION.md | Flows, gates, permissions |
Documentation/Technical/SOQ_TMS_Permission_Catalogue.pdf | What each role can see/do |
| This Operator HTML guide | Field-level “what to click” pages (Create a Course, Quizzes, Colors — ) |
Documentation/SOQ_Demo_Tooltips_System.md | In-app tip overlays |
Documentation/SOQ_Module_Architecture.md | Core feature architecture / entitlement visibility |
Demo tip logins
Toggle SOQ_DEMO_TIPS=true for in-app tips, and DEMO_ONE_CLICK_LOGIN=true for 1-click buttons on /login plus the header Demo dropdown. Full credentials: Demo Accounts — Beauty Demo Pack.
| Role | Password | Path | |
|---|---|---|---|
| Admin | admin@soq.edu.sg | Demo@1234 | /admin |
| Student | student@soq.edu.sg | Demo@1234 | /panel |
| Instructor | trainer@soq.edu.sg | Demo@1234 | /panel |
| Organization | org@soq.edu.sg | Demo@1234 | /panel |
| Hardware partner | demo.hw.*@soq-hw.sg | Demo@1234 | /panel |
0. Product in one page
SOQ International Academy is a Singapore PEI delivering AI & Business, Beauty & Wellness, Retail & Soft Skills, and workshops — campus + online.
Platform promise: Discover ? Learn ? Credential ? Career
| Mode | UI meaning |
|---|---|
| A. Academy | SOQ sells SOQ programmes — brand-first catalogue, PEI trust |
| B. Marketplace | Instructors & orgs publish — seller dashboards, packages, commissions, payouts |
Nine product areas
| # | Product | Frontend surfaces |
|---|---|---|
| 1 | Course & Learning Cloud | Web catalogue, learning page, Panel create wizard |
| 2 | Assessment & Credentials | Quizzes, assignments, certificates, validation |
| 3 | Live Classroom & Meetings | Agora / Zoom / Jitsi / BBB, meeting booking |
| 4 | Commerce & Finance | Cart, checkout, wallet, offline pay, sales, payouts |
| 5 | Organization & Multi-tenant | Manage instructors/students, org classes, seats |
| 6 | Growth & Engagement | Discounts, bundles, noticeboards, support, landing builder |
| 7 | Talent & Market | Jobs, events, instructor finder, become-instructor |
| 8 | Admin, Security & Ops | Admin RBAC, settings, reports |
| 9 | Help & Adoption | Shipped: public Support Widget FAB + KB; in-panel help tips via SOQ_DEMO_TIPS |
UX principles (locked)
- Role-based dashboards — never show Admin chrome to students; never put Admin users in Panel
- No unnecessary friction — clear wizards; show package limits early
- Mobile-ready — responsive
design_1; Mobile API is separate - Brand / PEI trust — public site must feel like SOQ Academy
- Self-serve help — Support Widget shipped; extend KB / tips as needed
- Security visible when needed — explain payout approval, offline pending, device limits
1. Three frontend surfaces (critical)
The product is not one app. It is three UIs sharing one Laravel backend.
| Surface | Who | Layout shell | Never |
|---|---|---|---|
| Web | Guests + logged-in | design_1/web/layouts/app.blade.php | Hardcode Admin URLs |
Panel /panel | Student / teacher / org | design_1/panel/layouts/panel.blade.php | Let is_admin in |
| Admin | Admin + staff | admin/layouts/app.blade.php | Assume same CSS as Panel |
Admin URL prefix is configurable — use getAdminPanelUrl(), never hardcode /admin/....
Tech stack
| Layer | Choice |
|---|---|
| Templates | Laravel Blade (no React/Vue/Livewire on main UI) |
| CSS | Bootstrap 4.6.2 custom Sass fork (design_1) |
| Admin look | Stisla-style |
| JS | jQuery + feature .min.js bundles |
| Build | Laravel Mix 6 ? public/assets/... |
| Icons | Iconsax; Admin also Font Awesome |
| Theming | DB Theme injects CSS variables |
Implication: Redesigns should stay Blade-compatible unless product approves an SPA rewrite. Prefer evolving design_1 + Admin module-by-module.
2–3. Vocabulary & role matrix
| UI / Figma term | Code |
|---|---|
| Class / Course | webinars — /panel/courses |
| Student | Role user (id 1) |
| Instructor | Role teacher (id 4) |
| Organization | Role organization (id 3) |
| Admin / Staff | Role admin or is_admin=1 |
| Panel | /panel — not Admin |
| Role | Web | Panel | Admin |
|---|---|---|---|
| Guest | Yes | No | No |
| Student | Yes | Student menus | No |
| Instructor | Yes | Teaching menus | No |
| Organization | Yes | People + org classes | No |
| Admin / staff | Limited | Blocked | Yes |
Panel sidebar logic: Source/app/Mixins/Panel/SidebarItems.php — filtered by permissions and feature settings. Do not design a static mega-nav that ignores permissions.
Also see: User Roles, Become Instructor, Organization Users.
4–5. Design system
New and redesigned UI uses the SOQ Edu navy + gold Tailwind system: docs/engineering/product/brand-guide.md, tokens in resources/views/design_1/web/home/soq-home-tailwind.input.css, compiled to public/assets/design_1/css/soq-edu-home.css (npm run build:soq-home). Reference screens: public home and the /panel dashboards. A redesign changes visuals only and keeps every partial, data point, link, form field, JS hook and permission condition of the old view.
The table below is the legacy blue + lime palette (soq-theme.css), still used by screens not yet redesigned. Do not use it for new UI.
| Token | Hex | Use |
|---|---|---|
| Primary blue | #0033CC | CTAs, links, active nav (--soq-blue / --primary) |
| Primary hover | #002699 | Button / link hover (--soq-blue-dark) |
| Accent lime | #CCFF00 | Highlight CTAs (--soq-yellow / --accent) — foreground #111 only |
| Accent hover | #B8E600 | Lime hover |
| Secondary | #0A1F5C | Headings / deep navy (--secondary) |
| Text | #121F3E | Body text (--soq-text) |
| Muted | #5A6A85 | Hints / secondary copy |
| Border | #D8E0EC | Cards / dividers |
| Section BG | #EEF3FF | Soft public sections (--section-bg) |
| Panel canvas | #F3F6FB | User panel background (soq-user-panel) |
Rule: Prefer CSS variables from soq-theme.css / theme helpers. Lime / .bg-accent uses foreground #111 (never white). Blue fills use white text. Ignore leftover --soq-pink / purple stock. New UI icons: inline Lucide-style SVG (legacy screens: Iconsax linear).
Operator pages: Colors, Fonts, Personalization, Custom CSS & JS.
6. Component & interaction grammar
~70% of Panel/Admin screens follow the same pattern — reuse it unless replacing system-wide.
Panel list page
- Extend panel layout
- Optional top stats (
card-statistic) - White rounded container (
bg-white rounded-24) - Filters (Select2 + DateRangePicker)
- Table (
panel-table) + row partial - AJAX pagination (
get_view_data.js) - Empty state (
no-result)
Feedback: toast showToast “ destructive confirm SweetAlert2 ” demo tips Tippy — status badges bg-success-30 text-success.
7. Screen map (key paths)
~1,500 Blade views under Source/resources/views/.
| Area | Path |
|---|---|
| Auth | design_1/web/auth/theme_1/ |
| Become instructor | design_1/web/become_instructor/ |
| Panel dashboards | design_1/panel/dashboard/ |
| Course catalogue / show | design_1/web/courses/ |
| Learning page | design_1/web/courses/learning_page/ (~52 blades) |
| Create course wizard | design_1/panel/webinars/create/steps/ |
| Cart / checkout | design_1/web/cart/ |
| Quizzes / certificates / attendance | design_1/panel/quizzes/, certificates/, webinars/attendances/ |
| Admin | admin/ (~522 blades) |
Related: Create a Course, Quizzes & Certificates, Live Classes, Certificate Validation.
8. Redesign priority
| Priority | Surface |
|---|---|
| P0 | Web marketing + catalogue + course show; Learning page; Auth + become instructor |
| P1 | Panel dashboards; Create course wizard; Cart/checkout |
| P2 | Quizzes / certificates; Attendance; Financial / payout |
| P3 | Admin lists; Jobs / events / CMS |
| Done | Support Widget (Product 9) — see Support Widget |
9. User journeys
Full diagrams (master + each role): User Flows & Role Diagrams.
Student
Browse ? Course page ? Cart ? Pay ? Learning page ? Quiz ? Certificate ? (Jobs/support)
Instructor
Become instructor ? Package ? Admin accept ? Create course (8 steps) ? Live ? Sales ? Payout
Create course steps: 1 Basic “ 2 Extra ” 3 Pricing “ 4 Content ” 5 Prerequisites “ 6 FAQ ” 7 Quiz & certificate — 8 Message to reviewer
Organization
Org package ? Add instructors/students ? Org classes ? Financial (show seat limits early)
Admin
Users/roles ? Review classes ? Sales & offline ? Payouts ? Settings/theme
Attendance
Panel ? Courses ? Attendances ? Session ? present / late / absent
Live join
Learning page ? join ? BBB | Agora | Zoom | Jitsi (entitlement required)
10. Feature gates & stubs
| # | Layer | Symptom |
|---|---|---|
| 1 | RBAC | Menu hidden / 403 |
| 2 | Settings / Features JSON | Feature absent on Panel/Web |
| 3 | Admin stub blades | “Feature not activated” |
| 4 | Feature toggle off | Module / theme / mobile hidden until enabled in Admin Features |
Do not redesign blindly: Admin Enrollment depends on features + permissions. Jobs/Events/Attendance depend on settings + permissions.
11. Assets & build
| Edit | Path |
|---|---|
| Panel/Web Sass | Source/resources/sass/design_1/ |
| Admin Sass | Source/resources/sass/admin/ |
| Panel/Web JS | Source/resources/js/design_1/ |
| Blade views | Source/resources/views/design_1/, admin/ |
| Compiled CSS/JS | public/assets/design_1/, public/assets/admin/ |
AJAX lists: resources/js/design_1/parts/get_view_data.js — CSRF: app_includes/ajax_setup.js
12–14. Copy rules & AI coding rules
Copy
- Say “Class/Course” to learners “ not ”Webinar — (code-only term)
- SGD formatting; Singapore English
- Explain pending offline payment & payout approval
Always
- Check business logic before changing a flow
- Preserve three surfaces + role matrix
- Gate UI with
@can/ feature settings - Use theme CSS variables
- Reuse list/filter/table/toast/SweetAlert patterns
- Keep domain routes unless backend changes in same PR
- Add demo tips for new primary actions
- Compile assets with Mix after Sass/JS edits
Never
- Put Admin users into Panel IA
- Hardcode Admin URL prefix
- Assume stub Admin features are live
- Introduce React/Vue for one screen without API + architecture decision
- Ship learner-facing “webinar” wording
Definition of done
- Role visibility correct — Desktop + mobile checked
- Empty / loading / error / pending states
- Permissions & feature-off considered — Strings via
trans() - Theme variables used — AJAX list pattern intact if list page
15. Suggested Figma structure
SOQ TMS Design/ 00 Foundation/ tokens, type, icons, components 01 Web/ marketing, catalogue, course, cart, auth, learning 02 Panel Student/ 03 Panel Instructor/ 04 Panel Organization/ 05 Admin/ 06 Flows/ purchase, create course, payout, quiz, attendance 07 Specs/ redlines + notes for AI agents
Annotate each frame: Role “ Surface ” Permission “ Feature flag ” Empty state — Blade path
17. Open questions (confirm before big redesign)
- Full SOQ brand redesign of public site, or theme-token restyle of
design_1? - Should Admin stay Stisla-like, or unify with Panel visual language?
- Is Product 9 (in-app help) in Lyn's first milestone?
- Which modules are Mode A only vs marketplace Mode B for launch?
- Which Admin stubs (e.g. Enrollment) must be unblocked vs hidden?