8000 AdminKit 4.0.0 by paullaros · Pull Request #154 · adminkit/adminkit · GitHub
[go: up one dir, main page]

Skip to content

AdminKit 4.0.0 - #154

Merged
paullaros merged 84 commits into
mainfrom
release/4.0
Oct 28, 2026
Merged

paullaros merged 84 commits into
mainfrom
release/4.0

Conversation

@paullaros
Copy link
Copy Markdown
Contributor

AdminKit 4.0.0. Full list in CHANGELOG.md.

Changes

  • 20 pages. New: 404, 500, alerts, modals, Bootstrap tables, pricing, invoice
  • Redesigned invoice (print-ready), pricing, profile and upgrade pages
  • Fixes: Inter no longer falls back to Arial, Popper menus stay in place, sticky works in page content
  • Lucide replaces Feather; searchable icons-lucide page, icons-feather redirects
  • Dark mode: Bootstrap 5.3 color modes, one css/app.css, Light/Dark/Auto toggle
  • WCAG 2.2 AA: 0 serious/critical axe issues in light and dark
  • Motion: scroll reveal, count-up, skeletons; respects prefers-reduced-motion
  • Mobile sidebar is an offcanvas sheet
  • Chart.js 4, SimpleBar 6, Vanilla Calendar Pro (replaces flatpickr)
  • Google Maps without API key; demo data dated 2026
  • npm: exports map (@adminkit/core, /css, /head) with TypeScript types; SSR-safe import
  • Optional js/head.js sets the color mode before first paint
  • Works with Turbo, Astro view transitions and SPA frameworks (auto-init on added markup)

Developers

  • Vite 8 + Handlebars replaces webpack, Babel and Metalsmith; dist/ no longer committed
  • Widgets own their scripts ({{#push "scripts"}})
  • Counts generated in src/data/stats.json; lint fails when stale
  • Node 24, ESLint flat config, Prettier, commitlint, lefthook, CI, AGENTS.md

Breaking

  • data-feather → data-lucide, feather.replace() → lucide.createIcons()
  • Dark mode via data-bs-theme="dark" on <html>
  • Theme-aware charts: adminkit.chartjs()
  • Slightly darker theme colors (AA)

🤖 Generated with Claude Code

paullaros and others added 30 commits October 27, 2026 00:24
Require Node 24 via .nvmrc and package.json engines.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Enforce Conventional Commits on commit-msg and run eslint and prettier
on staged files in pre-commit. Hooks install through the prepare script.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Replace .eslintrc and babel-eslint with eslint.config.mjs (@eslint/js
recommended, browser and node globals). Add prettier, .editorconfig and
.gitattributes with LF line endings. Vendored jsvectormap map data in
src/js/modules/vector-maps is excluded from both tools.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
npm ci in CI and reproducible local installs need a committed lockfile.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Replace the committed key with a YOUR_GOOGLE_MAPS_API_KEY placeholder.
The old key must still be restricted or rotated in Google Cloud.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Move CONTRIBUTING.md to the repo root and rewrite it for the new setup,
convert CHANGELOG.md to Keep a Changelog 1.1.0 with an Unreleased
section, and add AGENTS.md with CLAUDE.md pointing at it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Metalsmith pages, layouts, partials, inline scripts, helpers and
data that used to live in the separate adminkit-builder repo move into
src/ so this repo builds its own pages. Pages are .html (Vite only
treats .html as entries) and keep their frontmatter, layouts receive the
page through {{> @partial-block }}, the bundle is loaded as an ES module,
images move to public/img and are referenced as /img/, and the Google
Maps key is the YOUR_GOOGLE_MAPS_API_KEY placeholder. Helpers are ES
modules.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Vite 8 builds every src/pages/*.html through vite-plugin-handlebars plus
a small in-repo plugin for frontmatter and layouts, formats the output
with js-beautify and emits js/app.js and css/app.css under the same
names as before. The Sass deprecations that are still silenced all come
from Bootstrap 5.3. Drops webpack, its loaders and plugins, Babel,
core-js and cross-env.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
dist/ is the build output and stays gitignored. Vercel runs npm run build
and deploys dist/.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Import chart.js/auto and move the global defaults to Chart.defaults.color
and Chart.defaults.font.family. Bars get rounded tops through
elements.bar.borderRadius, lines keep the 0.4 tension Chart.js 2 drew by
default. Every chart config moves to the v4 options shape: scales.x/y, grid
and border, plugins.legend and plugins.tooltip, cutout as a percentage. The
.chart containers set an explicit height because Chart.js 3+ derives the
canvas height from the container.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The API, class names and the template's overrides are unchanged; the
stylesheet is imported by its exported file name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dashboard keeps its inline month calendar with the selected day, 45px
tiles and today marker, now drawn by Vanilla Calendar Pro and coloured through
its --vc-* custom properties.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ESLint 10 passes with the existing flat config, so it comes along with
@eslint/js 10 and autoprefixer 10.6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The Chart.js module imports the theme module whose colours it reads while
  it evaluates, instead of relying on import order in app.js
- browserslist matches the browsers Vite 8 actually compiles for
  (baseline widely available: Chrome and Edge 111, Firefox 114, Safari and
  iOS 16.4); the README browser table says the same
- Fonts and images that go through the asset pipeline get a content hash so
  same-named files from different packages cannot overwrite each other;
  css/app.css keeps its name; .svg lands in img
- The build throws when a page name clashes with a bundle entry name
- The dev server reloads on added and removed layouts and partials too, and
  vite-plugin-handlebars' own reload is off so a change reloads once
- The beautifier comment says what js-beautify does with inline scripts
- release.yml scopes contents: write to the release job

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Markup uses data-lucide with Lucide's canonical names and js/app.js bundles
only the 26 icons the templates use. The icons page becomes icons-lucide and
lists every Lucide icon through a separate js/icons-all.js entry that shares
no chunk with js/app.js; icons-feather redirects to it on Vercel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Filter the 1,900+ icons by name and tag as you type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
npm run lint now fails when a template uses a Lucide icon that
src/js/modules/icons.js does not import, uses a deprecated alias, or when
icons.js imports an icon no template uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
css/app.css gets a dark mode with AdminKit PRO's dark palette:
Bootstrap's color modes with the dark values in 1-variables/_dark.scss,
data-bs-theme on <html> picks the mode. Components use custom properties
for colours that follow the mode (--bs-gray-*, which turn around in dark
mode, and --ak-surface-bg) and color-mode(dark) rules where a component
picks another colour.

An inline script in <head> sets data-bs-theme from the stored mode
(light, dark or auto) before the first paint; modules/color-mode.js changes
it afterwards and follows the system setting in auto mode. The page title
badge stays readable in both modes and the upgrade page no longer lists
dark mode as PRO only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
window.theme is built from the computed --bs-* and --ak-* properties of
the current color mode instead of a hardcoded object, keeping its keys
(white and black are inverted in dark mode), and adds id, name, body-bg,
body-color and border-color. It is rebuilt when data-bs-theme changes and
announced with an adminkit:themechange event on document.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pages create their charts and the world map through adminkit.chartjs()
and adminkit.vectorMap(), which take a function of window.theme and call
it again with the new colours on adminkit:themechange: Chart.js charts get
the new data, options and default colours, the map restyles its regions
and markers. The dashboard calendar follows data-bs-theme through Vanilla
Calendar Pro's themeAttrDetect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Light / Dark / Auto dropdown before the user menu, in the pattern of
getbootstrap.com: buttons with aria-pressed, the toggle's aria-label names
the current mode and its icon shows it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vite emits ES module chunks. Loaded with a classic <script src>, as the
npm package and the CDN are, their minified top-level declarations (e, t,
n, ...) became window globals and could overwrite variables of other
scripts. Wrap the self-contained bundles in a function scope at build
time; the build fails if one of them ever gains an import or export.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the deprecated .text-muted with .text-body-secondary and drop the
IE-only rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
paullaros and others added 24 commits October 27, 2026 23:10
Ported from AdminKit PRO with free plugins only. Pricing has monthly
and annual plans in Bootstrap tabs (annual prices billed yearly) and
written FAQ answers; the invoice is a receipt whose line items, discount
and total add up, with a Print button. Print styles leave out the
sidebar, navbar, footer and the upgrade badge.

Sidebar entries follow PRO: Invoice after Profile, Pricing with the
other pages before Blank. Free now has 20 pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The calendar kept Vanilla Calendar Pro's popup sizing: a 17rem minimum
width, 1fr day columns with 1.875rem minimums and a padded header,
wider than the quarter-width card from xxl up.

The inline calendar now drops those minimums, shares its width over
seven minmax(0, 1fr) columns and, in cards under 18rem (container
query), uses smaller arrows, title and rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PRO 4.0.0 counts the AI chat as a PRO feature; the comparison row reads No / Yes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Retake every AdminKit PRO screenshot from PRO 4.0.0 (new dashboard
names, the inline calendar that fits its card) and the README
dashboard shots. The CRM dashboard joins the gallery; the DataTables
shot no longer closes a notice PRO dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ys on phones

The auth layout's .container has 6px padding ($container-padding-x is
0.75rem) while its .row keeps the 12px gutter margins, so the row stuck
out 6px on each side. The row has no gutter now; the content keeps its
place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rewrite the Unreleased section in the style of the released entries:
one short imperative line per change a template user notices, without
internal tooling. AGENTS.md and CONTRIBUTING.md describe the style.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
{{#push "scripts"}}...{{/push}} adds the block's output to a named stack and
{{stack "scripts"}} prints it in push order. The stacks live on @root, the
context of one page render, so pages never see each other's stacks in the
dev server or the build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every inline script moves next to the markup it drives, in a
{{#push "scripts"}} block that the layouts print with {{stack "scripts"}}
after js/app.js:

- a widget's script into the widget's partial, now grouped in
  src/partials/charts/ and src/partials/dashboard/ (named by path,
  e.g. dashboard/line-chart)
- a page's script, and the icons page's bundle, at the end of the page

src/scripts, site-scripts.hbs and the scripts partial directory are gone;
check-icons names partials by their path.

The built pages keep their markup and scripts; on the dashboard the inline
scripts now follow document order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AGENTS.md gains a "Page scripts" section: page scripts at the end of the
page, widget scripts in the widget's partial, push and stack, and the
DOMContentLoaded rule. README points at the new places.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The PRO snapshot already carries PRO's final names and counts (stats:sync
leaves it unchanged). The PRO screenshots are retaken from the current PRO
release, so the analytics shots show the "Analytics" name, and the README
dashboard shots are retaken with them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The color mode and the reveal flag were two inline scripts in <head>. They are
now one small blocking classic script, built as its own Vite entry and wrapped
like js/app.js, so pages need no 'unsafe-inline' and the file is cached,
linted and minified. The build fails if js/head.js gains an import.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dded later

Icons, the sidebar toggle, SimpleBar, the color mode controls, reveal and
count-up were set up once on DOMContentLoaded, and createIcons replaced each
<i data-lucide> with an <svg>. Frameworks had to call createIcons after every
navigation, lost the custom scrollbar, rebuilt the sidebar toggle and crashed
when they removed an <i> that was gone.

mount(selector, setup) sets markup up on DOMContentLoaded (or at once when
app.js loads later) and through one MutationObserver on <body> when it is
added later; changing data-lucide renders the new icon. SimpleBar and the
sidebar sheet are disposed when their element is removed. Icons render as an
<svg> child of the <i>, which gets display: contents once it is filled, so
the layout is unchanged. lucide.createIcons() renders the same way and is no
longer needed. The sidebar toggle and link handlers listen on document.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Turbo Drive and Astro's view transitions replace <body>, which took the
MutationObserver's target with it: icons and SimpleBar stayed unset after
such a navigation. Observe <html> instead, so the new body is an added
element like any other.

A late import (a client-only plugin, an effect) also starts right away
when the navigation entry is missing, instead of waiting for a
DOMContentLoaded that has already fired.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Next.js, Nuxt, SvelteKit, Astro and Angular evaluate imports on the
server, where there is no window. The classic-script wrapper now returns
early there, so js/app.js, js/head.js and js/icons-all.js do nothing
instead of throwing. With no import or export the bundles parse as a
classic script, an ES module and a CommonJS module alike.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- exports: "@adminkit/core" (dist/js/app.js), "@adminkit/core/css",
  "@adminkit/core/head", and "./dist/*" so every 3.x deep import and
  CDN path keeps working; main, types, style and sideEffects
- dist/js/app.d.ts declares the side-effect import, the theme type and
  the globals js/app.js adds; dist/css/app.d.css.ts lets TypeScript 6
  (noUncheckedSideEffectImports) resolve the stylesheet import
- sideEffects lists every .css and .js file: a narrower list made the
  build tree-shake its own modules
- allowScripts lets npm 11.19 run lefthook's install script

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Turbo and Astro remove the old sidebar while a link click is still
closing its sheet. Disposing the Offcanvas then broke Bootstrap's
transition callback ("Cannot read properties of null"); the sheet now
finishes its transition before it is disposed.

Astro's view transitions give <html> the new page's attributes, which
dropped data-bs-theme. The color mode is set again when it disappears.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Load Inter with font-display: swap instead of optional, so pages no
longer stay in Arial when the font arrives late.

Clip .main instead of hiding its overflow. overflow: hidden made it a
scroll container, so position: sticky inside the page never stuck.

Slide dropdown menus in with translate instead of a held transform,
which overrode the transform Popper positions menus with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10BC8
Port the redesigned pages from AdminKit PRO: an invoice with status,
billing details, totals, payment details, an activity list and a send
dialog; three plans with a billing switch, a sticky comparison table
and an FAQ; a profile with stats, about and skills, team, projects and
activity.

Links to PRO-only pages are dropped: the Edit profile button, All
projects and the project and task links in the activity feed. The team
message buttons send an email instead of opening the chat page.

Port the light badges, .progress-sm and Bootstrap's progress component
the pages use. Printing keeps the page white and the invoice in light
colors in dark mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Open with a hero that says what PRO adds, with the counts from the
stats, a CRM screenshot and two calls to action: pricing and the PRO
live demo. The PRO screenshots follow in a three-column grid with
shorter captions, then the generated comparison with the PRO column
tinted, the license tiers in one line and a short FAQ.

Describe capabilities instead of naming plugins, so the copy stays
true when plugins change. The screenshot partial takes an image
class and sizes for the hero.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The list group uses PRO's surface background and padding, so the
ported profile team list and the navbar dropdown lists look the same in
both editions. The upgrade FAQ no longer states support months, which
live on the pricing page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Captured from the final PRO pages and the free dashboard.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel
vercel Bot commented Oct 28, 2026 •
Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
adminkit-demo-basic Ready Ready Preview Oct 28, 2026 9:39pm UTC

Request Review

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@paullaros
paullaros merged commit a55d9dd into main Oct 28, 2026
5 checks passed
@paullaros
paullaros deleted the release/4.0 branch October 28, 2026 21:51

This branch was successfully deployed

1 active deployment
Preview — 64a03cbe Deployed Oct 28, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0