Chitra Design System
The Official Brand Design System of subhankarrout.in
A unified design framework that brings together design, storytelling, creativity, and technology through a shared visual language. Every token, component, and pattern — the single source of truth for all of Subhankar Rout's creative work.
In Sanskrit, Chitra means "image", "picture", or "a wonderful work" — one of the oldest words in the Indian vocabulary for visual creation. It encompasses everything drawn, painted, imagined, or seen.
Chitra is history — from the cave painting to the canvas, from the canvas to the film reel, and from film to the pixel. The word didn't change; the medium evolved. Subhankar lives at that same frontier: a Product Designer who makes still frames feel alive, an Author who puts images into words, and a Filmmaker who turns images into motion.
This design system carries that same spirit — not just a style guide, but the visual language that carries every idea from thought to experience. Every token, component, and pattern is guided by one journey:
The visual mark of the Chitra Design System — used only on this page, not on any other page of subhankarrout.in.
Two variants used across all 11 pages — header, footer, and offcanvas menu. Class: .tp-logo.
nav items
Portfolio
logo-blue.png · height 36–40px · .tp-logo
social icons
logo-white.png · height 36–40px · .black-bg footer
nav items
Portfolio
logo-white.png · transparent header · swaps to blue on scroll
logo-white.png · .tpoffcanvas top-left · always white on dark panel:root in styles.css.--transition
0.35s cubic-bezier(0.16, 1, 0.3, 1) — Default. Smooth spring feel. Used on cards, hover states.
--transition-fast
0.2s ease-out — Quick micro-interactions. Links, icon hovers.
--transition-btn
0.3s cubic-bezier(0.785, 0.135, 0.15, 0.86) — Snappy button fill animation (tp-btn split fill).
Mobile menu
0.25s — .tpoffcanvas slide-in. Intentionally fast to avoid UX lag.
13-step scale on 4px grid · Float Variables · Bound to padding, gap, itemSpacing
| Name | Type | Color Stops | Usage | |
|---|---|---|---|---|
| Gradient/Hero Dark | LINEAR | #181530 → #0D0D12 | index.html · books.html hero bg | |
| Gradient/Hero Cinematic | LINEAR | #1a0508 → #0f0305 → #000012 | s4cinesphere.html hero bg | |
| Gradient/Cinematic Red Glow | RADIAL | rgba(230,57,70,.28) → transparent | s4cinesphere.html radial overlay | |
| Gradient/PR Dot Grid | RADIAL | rgba(89,86,233,.05) → transparent | pr.html hero bg subtle violet overlay | |
| Gradient/Stats Number | LINEAR | #5956E9 → #FFDC60 → #22c55e | pr.html stat numbers · background-clip:text | |
| Gradient/Avatar Violet | LINEAR | #5956E9 → #423EF3 | Testimonial + review card avatars | |
| Gradient/Ambient Violet | RADIAL | rgba(89,86,233,.35) → transparent | index.html hero blobs · testimonials glow | |
| Gradient/Ambient Yellow | RADIAL | rgba(255,220,96,.18) → transparent | index.html hero bottom-left blob | |
| Gradient/Kicker Shimmer | LINEAR | transparent → rgba(255,255,255,.4) → transparent | .pr-hero__kicker::after pseudo-element | |
| Gradient/Marquee Edge Fade | LINEAR | transparent → black 8% → black 92% → transparent | All 3 marquee wrappers · CSS mask-image |
<em> inside headlines always takes color: var(--accent-violet). Exception on dark sections: color: var(--accent-yellow). Never italic for body copy — only headlines.
.tp-btn
.book-ghost-btn
.tp-btn as the secondary action — its height breakpoints (70px desktop → 60px @ 991px → 56px @ 767px) are kept in lockstep with .tp-btn's so the pair never mismatches on mobile. (Preview forced to mobile height above to show the fix.).hm-btn-yellow
.hm-btn-primary
.hm-btn-ghost
.hm-btn-outline
.btn-primary-hero + .btn-ghost-hero
.hm-btn-yellow + .bk-form override
.pr-hero__kicker / .hm-hero__kicker — 12px uppercase, violet bg + border, pulsing dot. Hero kicker on light pages..pr-hero__kicker--yellow — Same shape, amber text, yellow tint bg. Used for achievement / book context badges..pr-section-label — 12px uppercase violet text with a 20px violet rule on the left. Appears above every section title on pr.html and portfolio.html..hm-label — Violet text, yellow left-rule (not violet). Unique to index.html section openers. Slightly warmer feel than .pr-section-label..pr-hero__tag — White card, pill shape, colored dot, shadow. Float on portrait image in pr.html hero. 3 variants: violet, green, Figma-icon. Each animates independently (floatA / floatB / floatC)..pr-filter-tab — Pill-shaped isotope filter. Active state: solid violet fill, white text. Used in portfolio.html to filter project cards by category..pr-hero__links — 4-column grid below the pr.html hero. White bg, shared border, each link has brand icon color. Hover: violet text + very faint violet bg tint. On mobile: collapses to 2×2 grid..hm-skill-chip — Pill border, icon + label. Used in the skills marquee strip (currently commented out). Two rows — row 1 scrolls left, row 2 scrolls right.
.bk-hero__single-cover — 320px wide, border-radius 12px, default rotate(-3deg). Hover: straightens + lifts 8px. Only on books.html hero..lang-switch — Reusable pill-group component. Selecting a pill swaps cover image, title, subtitle, price, delivery note, and CTA label/href anywhere in the nearest [data-lang-scope] ancestor via data-lang-field="..." attributes. One shared script (assets/js/lang-switch.js) drives every instance on the page — no per-page JS to write. Add .lang-switch--compact for dense card grids. Fixes a past bug where swapping editions permanently killed the cover's hover-lift animation (was set as an inline style; now toggled as a CSS class instead).
.tp-footer-widget__input — Dark bg, white-tinted border, plane icon submit. Posts to Google Forms. Used in footer "Get Update" column on all pages..hm-name::after — Grows from 0→100% via hm-lineGrow (1.2s, 1s delay). Height 3px, yellow, border-radius 2px. Lives in styles.css.
bootstrap.bundle.min.js. Key grid classes used: col-xl-3 col-lg-4 col-md-6 pattern for footer · container-fluid for header · container for content sections. Custom grid overrides live in styles.css for hero sections (CSS Grid, not Bootstrap).
Skip Link
<a class="skip-link" href="#hm-main"> — Visually hidden until focused. Appears at top-left with violet bg on Tab key. On all pages.
Focus Styles
All interactive elements (a, button, input, [tabindex]) get outline: 2px solid var(--accent-violet); outline-offset: 3px on :focus-visible. Defined globally in styles.css §03.
ARIA Labels
All nav elements have aria-label. Images have descriptive alt. Decorative elements use aria-hidden="true". Offcanvas: role="dialog" aria-modal="true". Hamburger: aria-expanded toggled by JS.
Image Loading
Hero LCP image: loading="eager" fetchpriority="high" + <link rel="preload">. All below-fold images: loading="lazy". Width + height attributes on logo images to prevent CLS.
Performance (Lighthouse)
Non-critical CSS deferred via media="print" onload="this.media='all'" + noscript fallback. All JS (except jQuery + Bootstrap) uses defer in dependency order: plugins first, then main.js, then script.js. Clarity + Chatbase at bottom. DNS prefetch for third-party domains.
| Page | File | Hero Theme | Primary CTA | Secondary CTA |
|---|---|---|---|---|
| Home | index.html |
Dark gradient | .hm-btn-yellow |
.hm-btn-ghost |
| Portfolio | portfolio.html |
Light white | .btn-primary-hero |
.btn-ghost-hero |
| About | about.html |
Light white | .ab-btn-primary |
.ab-btn-ghost |
| Books | books.html |
Dark gradient | .tp-btn (Browse All Books) |
.book-ghost-btn (Meet the Author) |
| Articles New · unlinked | articles.html |
Dark gradient | .tp-btn (Read on Medium) |
.book-ghost-btn (Browse Articles) |
| The Uncharted Romance | the_uncharted_romance.html |
Dark book hero | .tp-btn (Buy) |
.hm-btn-yellow (Review form) |
| One Year, Many Lessons | one_year_many_lessons.html |
Dark book hero | .tp-btn (Buy) |
.hm-btn-yellow (Review form) |
| The Goodbye I Never Thought to Say New · pre-release | the_good_bye_i_never_thought_to_say.html |
Dark book hero | .tp-btn / .tp-btn-yellow (Notify Me at Launch) |
.book-ghost-btn (Explore His Other Books) |
| Press Release | pr.html |
Light / grid bg | .btn-primary-hero |
.btn-ghost-hero |
| S4 Cinesphere | s4cinesphere.html |
Dark cinematic | .dx-btn-primary (red) |
.dx-btn-ghost |
| Privacy Policy | privacy-policy.html |
Dark hero strip | — | — |
.pr-card — wrapper (white bg, 18px radius, hover lift).pr-card__fig — image container (aspect-ratio 4/3).pr-card__img — cover image (scale on hover).pr-card__overlay — dark overlay with action icons (opacity 0→1 on hover).pr-card__act — glassmorphism action button (36×36, blur backdrop).pr-card__badge — top-left pill badge.pr-badge--pr / .pr-badge--awd / .pr-badge--video — badge color variants.pr-card__body — text content padding.pr-card__title — 15px/700, hover→violet.pr-card__meta — 12px, icon+text, tertiary colorFilter:
.pr-filter, .pr-filter.active — pill tabs, active=violet fill
.pr-ai-card — dark glass card (dark bg, rgba border, hover lifts + border glows violet)Icon wrapper: 44×44px, 12px radius,
rgba(89,86,233,.15) bg6 icon variants: wand-magic-sparkles, brain, robot, microchip, code, film
.pr-ai-tag — tiny pill badge, violet tint, used for tool category labelsGrid: 3-col on desktop, collapses to 1-col mobile
.pr-story-card — dark glass card (rgba bg + border). Hover: border turns violet. Tags: category pill (violet, yellow, or teal tint). Pagination: .pr-chronicles-dots — custom elongated active dot. Carousel: Swiper (slidesPerView: 1.15 mobile → 2 at 576px → 3 at 992px → 4 at 1200px). Active slide: border glows. 6 slides total: Short Film · Novel · Non-Fiction · Figma MCP Training at Capgemini (delivering_Figma mcp_training_capgemni.jpg) · SAP Impulse India '25 Event Coordinator & Volunteer (sap_impluse_2025.jpg). Images in assets/img/pr/details/. No external link on image — body tag only.
.ab-highlight-card — white card, 16px radius, icon + title + body. Hover: soft violet shadow + lift 3px. Icon box: 40×40, rounded, tinted bg matching icon color..ab-meta-item — label (uppercase/tertiary) + value + sub-label. Used for location, availability, etc.
.pr-step — 4-col dark grid. Step number: large, faded violet. Active step: brighter border. Used in index.html "Process" section.
.bk-hero__single-cover (book.css) — 320px wide, rotate(-3deg), hover straightens + lifts 8px.Genre chips: pill badge above title. Price row: yellow Kindle price, white Paperback price.
Buy bar: 2→4 col responsive grid of retailer buttons. Review form below:
.bk-form with .hm-btn-yellow (hover overridden to blue in book.css).
fas fa-star (filled, yellow #FFDC60) + far fa-star (empty, #E8ECF2). Reviewer avatar: 32px circle gradient. Quote in italic. Platform label in tertiary grey. Submit form below reviews uses .bk-form with name/email/review textarea + .hm-btn-yellow (hover turns blue in book.css).
.hm-yt-card — white card, 16px radius, thumbnail (16/9 aspect-ratio) + red play button + title + meta. Hover: lifts + shadow. Used in index.html "S4 Cinesphere" section and s4cinesphere.html.
.rj-card — dark glass card, year in large faded violet, badge pill, title, description..rj-card-year / .rj-card-badge — year display + colored milestone badge.Desktop: horizontal sticky scroll (CSS overflow-x scroll pinned). Mobile:
.rj-mobile-timeline — vertical stacked cards.
.pr-skill-group — white card with icon + group title + chip tags. .pr-skill-tag — pill chip (light grey bg, border, dark text). Used in index.html "Skills" section grid.
.pr-client-chip — semi-transparent pill (dark bg), brand name in muted white, subtle border. Track: .pr-marquee-track with animation: prClientScroll 24s linear infinite. Mask fades edges. Pauses on hover. Used in index.html below hero.
.pr-featured wrapper — light grey bg (#f7f8fc), overflow:hidden. .pr-marquee — edge-faded mask. .pr-marquee__track — animates prScroll 24s linear infinite. .pr-marquee__item — 16px/700, grey text, right divider border, icon + label. Hover: text turns violet. Used in pr.html "Featured In" section.
.pr-testi-marquee — overflow:hidden flex row, CSS mask fades both edges (mask-image: linear-gradient transparent → black 8% → 92% → transparent).Tracks:
.pr-testi-track + .pr-testi-track--clone — two identical flex rows, both run animation: pr-testi-scroll 32s linear infinite. Clone is aria-hidden. Together they create a seamless infinite loop.Pause:
.pr-testi-marquee:hover .pr-testi-track { animation-play-state: paused }Card:
.pr-testi-card — 360px fixed width, rgba(255,255,255,.04) bg, rgba(255,255,255,.08) border, --radius-lg. Hover: border-color → rgba(89,86,233,.45) only. No translateY lift — cards are in motion so vertical lift feels jarring.Avatar:
.pr-testi-card__avatar — 42px circle, violet gradient, letter initial.Source badge:
.pr-testi-card__source — 11.5px muted. Icon: fab fa-linkedin (LinkedIn) or fal fa-envelope (Email). Color: rgba(255,255,255,.22). Icon color: rgba(89,86,233,.5).Reduced motion: Animation disabled; tracks become
overflow-x: auto scrollable. Mask removed.
.pr-stats — dark bg (#0D0D12), top border. .pr-stats__grid — 4-col grid, dividers between cols. .pr-stat__num — 54px/800, gradient text-clip (violet → yellow → teal). .pr-stat__lbl — 12px/600, uppercase, muted. Animated via CounterUp.js on scroll.
.ab-stat-item — white bg, yellow number (#FFDC60), grey label. 4-col grid, divider borders. Animated via CounterUp.js on scroll.