All notable changes to this project will be documented in this file.
Polish pass on top of rc.1: a real mobile responsive sweep, npm-package-ready distribution metadata with TypeScript declarations, a page generator script, an optional API-hydration data adapter, and quality-of-life fixes.
npm run new— page generator (scripts/new-page.mjs). One command stamps out aproduction/*.htmlfrom the standard skeleton and (with--nav-group) wires the entry into theNAVarray in src/v4/shell-render.js. Flags:--title,--pretitle,--breadcrumb,--nav-group,--icon,--dry-run. Runnpm run new -- --helpfor the full list.- TypeScript declarations — types/gentelella.d.ts typed-up the public JS surface (
mountShell,showModal,showToast,openMenu, chart/table init, theNAVschema,seedAdapter/httpAdapter). Wired up viatypesfield in package.json so VS Code IntelliSense resolves automatically — notsconfigrequired. - npm package metadata —
exports,files, andtypesfields added. The package is now consumable asimport { mountShell } from "gentelella". Subpath exports (gentelella/v4/*,gentelella/scss/*) for granular imports. - Markup helpers — src/v4/markup.js docs added to README and Playground.
statTile(),statusBadge(),customerCell(),activityItem(),visitorRow(),emptyState(),banner(),skeletonRows(),escapeHtml(). For JS-rendered content (orders rows, inbox threads, kanban cards) where boilerplate adds up. - Data adapter (src/v4/data-adapter.js) —
seedAdapter()for in-memory demo state;httpAdapter(url)for REST. Add?api=1to a page URL to hydrate from a real backend. - Inbox API mode — append
?api=1to inbox.html and the inbox loads its initial messages from/api/messagesinstead of the seed. Mutations stay client-side in the demo; extend the adapter to PATCH them back. - Playground — new sections for async/loading patterns (skeleton table, skeleton tiles, list lifecycle, submit spinner, banners) and
markup.jshelper examples with copy-pasteable HTML output.
- Vite config auto-discovers entries — replaces the hand-maintained 60-entry
rollupOptions.inputlist. Adding a new page is now just dropping a file into production/; Vite picks it up. vite.config.js. - Semantic
<h1>page titles — every page's<div class="page-title">is now<h1 class="page-title">. Improves landmark navigation for screen readers and SEO. ~60 pages updated. - DataTables search input gains an
aria-label="Search table"since DataTables 2 emits it nameless. src/v4/tables.js. - Table row checkboxes gain
aria-label="Select row"/"Select all rows". - SCSS spacing tokens — replaced ad-hoc
4px/12px/16pxgapvalues withvar(--space-1)/--space-3/--space-4across pagination, chip, calendar toolbar, and other components. Now responds to the theme generator.
- Mobile responsive pass. Every page renders at native pixel scale on iPhone SE / iPhone 13 / Pixel without the browser shrink-to-fit zooming the layout. Audited 22 pages × 3 viewports (320 / 375 / 390 px); 0 overflows on mainstream sizes.
- Topbar (src/scss/v4/_layout.scss) — at ≤768 px the breadcrumb, 240 px search box, notifications and messages buttons hide; theme toggle + avatar (now 32×32) remain. The shell no longer pushes layout viewport to ~540 px on phones.
- Grid
minmax(0, 1fr)bug. Four spots in the grid system (.col-1,.col-8-4/.col-4-8≤1100 px collapse,.col-4/.col-3/.col-2≤768 px collapse) used1frwithoutminmax(0, …). Wide intrinsic content (tables, code blocks, long unbreakable text) inside those columns pushed the column past viewport, triggering Chromium's shrink-to-fit on phones. All four now useminmax(0, 1fr). - Form wizard steps stack vertically below 600 px (src/scss/v4/_pages.scss) — connector lines and sub-labels suppressed.
- Invoice page — header and 2-col billed-to / pay-to grid stack below 768 px; padding reduces from 32 px to 16 px.
- Invoice line-row reflows to a 2-row layout (description above, qty / rate / amount below) below 600 px.
- Typography showcase type-rows stack below 600 px, with
overflow-wrap: anywhereso 56 px display words can break. - Settings layout stacking on mobile uses
minmax(0, 1fr)(src/scss/v4/_apps.scss). - Calendar grid scrolls horizontally with scroll-snap below 700 px instead of collapsing day cells.
- Chart-tab segmented controls get larger padding on coarse pointers (touch devices) for hit-target compliance (src/scss/v4/_widgets.scss).
- Connected-account rows on profile.html overflow ~42 px at exactly 320 px viewport (Galaxy Fold cover screen). Mainstream 360+ phones unaffected.
- Image assets in
public/images/aren't optimized — AVIF conversion is on the rc.3 docket. - ECharts vendor chunk is still ~360 KB gz; per-page chart-type tree-shaking deferred.
Release candidate. Massive expansion since beta.2 — 60 pages, 20 chart variants, full mail client, live theme generator, component playground, PWA, sidebar rail mode. The published latest tag still points at the v2.x line; v4 ships under the next distribution tag until 4.0.0 stable.
- Live theme generator (production/theme.html) — pick a primary color from 11 swatches or a hex input; tune corner radius, sidebar width, body font size; switch sidebar style (Dark / Black / Light / Brand); flip light/dark mode. Every chart, button, badge, card and link restyles in real time. Generated SCSS preview is copyable and downloadable as
_tokens-override.scss. - Component playground (production/playground.html) — every reusable component on a single scrolling page, side-by-side with its exact HTML and a "Copy" button. Sticky left rail with scrollspy nav, 13 sections covering buttons, status, alerts, cards, forms, tables, tabs, progress, stats, timeline, accordion, empty state.
- Command palette (⌘K / Ctrl+K) — fuzzy search across all 60 pages and inline actions (toggle theme, open profile, sign out, etc.). Built-in matcher with subsequence + word-boundary scoring. Topbar search input now opens the palette on focus.
- PWA — full
site.webmanifestwith shortcuts, service worker (network-first HTML, cache-first assets, offline fallback), apple-touch-icon, theme-color metas (light + dark). Installable on macOS / Windows / mobile. - Sidebar rail mode — desktop hamburger collapses sidebar from 252px → 64px showing icons only. Tooltip on hover via
data-rail-label. Submenu groups become click-to-flyout when collapsed. Persists in localStorage. Same hamburger toggles drawer on mobile.
production/theme.html— theme generatorproduction/playground.html— component playgroundproduction/offline.html— PWA offline fallbackproduction/chat.html— fully interactive 8-conversation chatproduction/kanban.html— HTML5 drag-drop kanban with edit modalsproduction/file_manager.html— tree + grid file browser with breadcrumbsproduction/notifications.html— filterable notifications pageproduction/settings.html— persisted settings with 8 sections
New chart factories (added to src/v4/charts.js; 20 total now)
stacked-area· multi-series stacked area with smooth fillshorizontal-bar· top categories rankedmixed-bar-line· bars + secondary-axis trend lineradar· 6-axis comparisongauge· single-KPI progress arcscatter· bubble plot with size encodingheatmap· week × hour activityfunnel· conversion stagescandlestick· OHLC market datapolar-bar· circular bar charttreemap· proportional cellssankey· flow diagramcalendar-heatmap· GitHub-contribution-style 12-month gridgantt· project timeline usingcustomseries
New form components (src/v4/form-controls.js)
- Date-range picker — two-month grid, 6 presets (Today / Last 7 days / Last 30 days / This month / Last month / This year), hover preview, Monday-first weeks. No library.
- Rich text editor — toolbar (bold / italic / underline / H2 / blockquote / lists / link / code / clear), keyboard shortcuts (⌘B/I/U/K), syncs to a hidden textarea for form submission.
- Multi-select with chips — autocomplete on type, ↑/↓/Enter keyboard nav, Backspace removes last chip, binds to a real
<select multiple>.
New SCSS primitives in _components.scss and _forms.scss
.accordion— native<details>styled with primary border on open.drawer/.drawer-backdrop— slide-in left/right side panel.timeline— color-coded event timeline with vertical guide rail.banner— info / warning / danger / success callouts with action buttons.popover-trigger— hover/focus rich-content popovers.empty-state— generic centered icon + title + text + actions block.card.is-refreshing— sweep animation on card refresh.input-affix— input with prefix/suffix segments.segmented— compact tab-like radio.switch— iOS-style toggle.color-grid— color swatch picker.tag-input— chip input with × removal.rating— star rating.search-suggest— autocomplete dropdown.password-strength— 4-segment meter.otp-grid— 6-box one-time-code input.file-input— compact file picker with filename echo.avatar-upload— circular avatar with hover overlay.stepper— number stepper with +/− buttons
- Inbox (src/v4/inbox.js) — full mail client: 5 folders + 4 labels, click-to-read pane, compose modal, reply / forward (prefilled), star, trash / restore / delete-forever, edit drafts, mark-all-read, per-folder search, J/K/R/S/#/C keyboard shortcuts.
- Settings (src/v4/settings.js) — every toggle persists to localStorage, profile form has dirty-state with Save/Cancel rollback, theme/density radios persist and apply, integration cards toggle Connect ↔ Disconnect, Revoke session opens confirm modal, Danger zone has real export download / transfer / delete-account flows, team Invite + Manage modals.
- Topbar dropdowns — clicking a notification or message row opens a real detail modal with kind icon, body, and action buttons (Dismiss / View all / Open in inbox / Send reply).
- User avatar menu — entries route to real pages (Profile / Settings / Theme generator / FAQ / Lock screen) or open modals (Keyboard shortcuts grid, Sign out confirm).
- Card 3-dot menu — Refresh adds shimmer + repaints chart; Move up / Move down reorder siblings; Hide card has 5-second clickable undo toast.
- Page-actions (src/v4/page-actions.js) — Print / Export / Refresh / Share / Compose /
New {anything}/ Invite buttons routed to real handlers across the whole template (window.print, download blob, navigator.share, modals). - Invoice — editable line items (description / sub / qty / rate), Add / Remove rows, editable discount + VAT %, live total recompute, Mark-as-paid flips status pill and advances payment timeline.
- DataTables —
data-selectableenables row selection (header checkbox = select all),data-export="filename"adds CSV export button.
- 7 nav groups with submenu support: General (Dashboards × 4, Forms × 6, Tables × 2, Charts × 3, + Calendar / Map), Apps (5), E-commerce (5 incl. Orders × 2), Projects (2), UI library (7 incl. Playground / Theme / Typography / Icons), Admin (5), Layouts (4)
- Accordion behavior — opening one group closes others; chosen state persists in
sessionStorageso navigation doesn't snap it shut - Visual redesign — vertical guide rail, colored connector tick on active sublink (primary teal), parent stays subtly highlighted when a child is current, smoother chevron rotation
- Every page reachable from the sidebar (was 22 of 43; now all 60)
- index2.html (Analytics) — 6 rows / 18 cards: KPI sparklines, live counter, stacked-area, conversion funnel, activity heatmap, top pages / countries / referrers, goals, top searches, cohort retention matrix
- index3.html (Sales) — 6 rows / 14 cards: pipeline KPIs, quarterly target gauge, mixed bar/line, pipeline by stage, lead-sources donut, quota attainment, activity radar, top reps, won-this-week, deals at risk, lost reasons
- index4.html (Operations) — 5 rows / 18 cards: maintenance banner, 4 KPIs, 6-bar resource usage, API endpoint stats, cache-hit gauge, service status, incident timeline, background jobs, deployment history, recent errors
- icons.html — 120+ icons in 14 categories (was 44 flat), live search filter, click to copy name, 48px icon size, 180px cells
- general_elements.html — added Banners / Accordion / Drawer / Popover / Timeline sections
- profile.html — added stats grid, achievements row (6 badges), connected accounts (GitHub / Google / Slack / X), recent activity timeline
- chartjs.html — 16 chart variant cards organized into themed rows
- echarts.html — full 16-chart gallery
- typography.html — 6 sections (display, heading scale, inline, block, code, terminal, numerals, truncation)
- form.html — 4 sections, 25+ field variants (advanced controls section showcasing date-range / multi-select / rich-text)
- widgets.html — 18 widget variants in 6 rows
- landing.html — eyebrow pill, stats band, expanded features (3 → 6), showcase section linking to 12 demos, stack section, 3 testimonials, 6-question FAQ accordion
- Playwright screenshot pipeline (scripts/screenshots.mjs) —
npm run screenshotsbootsvite previewand captures 22 pages × light + dark = 44 PNGs at 1440×900 @ 2x. Outputs todocs/screenshots/{light,dark}/plus amanifest.json. - Random-collision ports — dev defaults to 9173, preview to 9174 (was 3000/4173). Override via
PORT/PREVIEW_PORTenv. - CONTRIBUTING.md — add-a-page / add-a-chart / add-a-table flows, what we don't accept.
- Public API JSDoc —
mountShell,initCharts,initTables,showToast,openMenu,openPanel,showModal,initCommandPalette. IntelliSense in VS Code without TypeScript. - Print stylesheet —
@media printblock strips chrome (sidebar, topbar, footer, action bars), expands link URLs, page-break-inside avoid on rows. - Deploy-Pages CI — replaces the dead Jekyll workflow with a real Vite build + Pages deploy on push to master.
- Hamburger sidebar toggle is now always visible (no longer mobile-only). Click on desktop collapses to rail; click on mobile opens drawer.
- Service worker cache key bumped to
gentelella-v4-r2to invalidate old caches on the next visit. - Page count: 55 → 60 (added theme, playground, offline, plus several new app pages registered in vite.config).
- ECharts vendor chunk grew slightly (~360 KB gz) to include the 4 new chart constructors and Calendar / VisualMap / Polar components.
- Chart factories now repaint on a
themechangecustom event in addition todata-thememutations — used by the theme generator for live preview. - Global
:where(svg):not([width]):not([height])rule replaces the higher-specificity rule that was forcing inline SVGs to 1em even when classes set explicit sizes.
- File manager card grid was stretching to fill viewport height —
align-content: start+grid-auto-rows: max-contenton.fm-grid.view-grid. - Icons.html cells were rendering at ~12px because the global SVG-size rule out-specificity'd
.icon-cell svg. Fixed via:where()neutralization plus larger 48px / 180px cell sizing. - 25 page
data-pagekeys updated to match the new submenu structure so the right group auto-opens. - Deprecated demo toast pattern: removed the catch-all
.btntoast fallback in main-v4.js; buttons now route through page-actions.js to real handlers (modals, downloads, navigation) or do nothing rather than spamming.
| Metric | beta.1 | rc.1 |
|---|---|---|
| Pages | 39 | 60 |
| Chart variants | 4 | 20 |
| Interactive surfaces | dashboard widgets | dashboard, inbox, kanban, calendar, chat, file manager, settings, notifications, invoice, theme generator, playground, command palette |
| Form components | inputs, selects, textareas | + tag input, sliders, OTP, password strength, file upload, avatar upload, stepper, color picker, segmented, switch, date-range, rich-text, multi-select |
| Toast occurrences | "any unhandled .btn shows toast" | only on real confirmations |
| Build time | 4.81s | ~5s |
| Above-the-fold gz | ~17 KB | ~17 KB (entry stayed tiny) |
| node_modules | 138 MB | 178 MB (+ Playwright) |
- Image assets in
public/images/aren't optimized yet (~290 KB media.jpg, ~157 KB cropper.jpg). Lossy compression / AVIF conversion is on the rc.2 docket. - No formal accessibility audit. Skip-link, focus rings, ARIA labels and landmarks are wired, but no systematic screen-reader testing.
- ECharts vendor chunk is the dominant bundle weight (~360 KB gz). Per-page tree-shaking of chart-type constructors could shave ~30%.
- All forms post to
#and don't persist outsidelocalStorage. This is a UI template; bring your own backend.
Audit pass: bring docs and code up to par with the actual feature set. No breaking changes.
- Vite + GitHub Pages deploy workflow (.github/workflows/deploy-pages.yml) — replaces the dead Jekyll workflow.
.nvmrcpinning Node 20.- 6 page-scoped sections moved into
_pages.scss: fixed-footer, dropzone, wizard, media gallery, pricing, landing.
- Lint: 12 ESLint errors and 24 warnings cleared via
npm run lint:fix. profile.htmlhaddata-page="profile"(no matching nav key); now empty since profile is reached from the topbar avatar menu.landing.htmlhad anh1 → h3heading-order skip; features now use<h2>.- 6 inline
<style>blocks removed fromproduction/*.html— styles belong in SCSS per project conventions. - README and CHANGELOG no longer claim missing features (mobile drawer, dark-mode skin, skip link) that are actually implemented.
First release of the v4 redesign. Bootstrap 5 and jQuery are gone; the entire design system is custom SCSS. Major version bump from v2.x because there is no markup overlap with prior releases.
- Design system — 10 SCSS partials (
_tokens,_layout,_components,_forms,_widgets,_pages,_datatable,_auth,_apps,main) all consumable via CSS custom properties on:root. - Layout shell — sidebar + topbar + footer rendered both at build time (Vite plugin, no FOUC) and at runtime (
mountShell()fallback). Driven bybody[data-shell="admin"],data-page,data-breadcrumbattributes. Pure renderers insrc/v4/shell-render.js; runtime wiring insrc/v4/shell.js. - Mobile drawer — sidebar slides in below 768px with backdrop, ESC-to-close, viewport-resize-to-close.
- Light/dark theme toggle — pre-paint script reads
localStorage('theme')/prefers-color-schemeand setsdata-themeon<html>before body renders, so dark mode never flashes. - Cross-document view transitions — smooth cross-fade between same-origin pages on supporting browsers.
- Skip-to-content link — injected on every shell page for keyboard users.
- 55 pages spanning dashboards, auth, forms, tables, charts, app pages (chat, kanban, file manager, calendar, inbox, settings, notifications), e-commerce, admin, marketing, and UI library.
- Real ECharts (6 chart instances across 5 pages) — modular import (line/bar/pie + canvas renderer), lazy-loaded, colors driven by design tokens.
- Real DataTables — sortable, searchable, paginated, fully styled to match the v4 design system from scratch (no Bootstrap-bs5 styling dependency).
- Leaflet — lazy-imported on the map page only, with circle markers driven by per-city customer counts.
BASE_PATHenv var —BASE_PATH=/admin/ npm run buildfor subpath deployments.- Bundle analyzer —
npm run analyzefor the rollup-plugin-visualizer treemap.
- Vite multi-page input list cut from 42 entries to 39 —
theme-comparisonandindex-legacyremoved. manualChunkssimplified to 3 chunks (vendor-echarts,vendor-tables,vendor-maps) — was 11.optimizeDeps.includereduced to[echarts, datatables.net, leaflet]from[bootstrap, @popperjs/core, dayjs, @simonwep/pickr].
- Bootstrap 5 + Bootstrap Icons + Tempus Dominus + Choices.js + nouislider + FontAwesome + Pickr + Uppy + Chart.js + FullCalendar + Cropper + Quill + Inputmask + JSZip + Skycons + DOMPurify + dayjs — 30+ deps gone.
- Legacy SCSS —
_color-schemes,_variables,custom,index2,index4,landing,font-optimization,daterangepicker. - Legacy entry scripts —
main-minimal,main-core,main-calendar,main-form-basic,main-inbox,main-tables,main-upload,init,chart-initializer. - Legacy modules and utils —
src/modules/,src/lib/,src/js/,src/utils/,src/test/. - Vitest test harness and 4 legacy unit-test files.
- Jekyll-based
docs/site,README_CN.md, originalscreenshots/(those were screenshots of other Colorlib templates, not Gentelella).
| Metric | Before (v2.2.0) | After (v4.0.0-beta.1) |
|---|---|---|
| Production deps | 28 | 3 |
| Dev deps | 14 | 8 |
node_modules |
~600 MB | 138 MB |
Files in src/ |
30+ JS + 9 SCSS + tests | 13 |
| Above-the-fold deploy (gzipped) | ~107 KB (init.css alone) | ~17 KB total |
| Total deploy size | 6.2 MB | 3.0 MB |
| Build time | 7.42s | 4.81s |
- No formal accessibility audit. Skip-link, focus rings, ARIA labels and landmarks are wired, but no systematic screen-reader testing.
- All forms post to
#and don't persist. This is a UI template; bring your own backend. - ECharts vendor chunk is the dominant bundle weight (~350 KB gzipped). Future optimization: scope chart-type imports per page rather than blanket-loading line + bar + pie.