mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 08:09:18 +02:00
Add biome + rolldown + lightningcss build pipeline for JS/CSS bundling & minification
- package.json with biome, rolldown, lightningcss devDependencies
- biome.json: add CSS formatter support
- scripts/build-css.mjs: lightningcss resolves @import chain, bundles/minifies CSS
- scripts/build-js.mjs: rolldown per-entry JS bundling (no code splitting)
- scripts/build.mjs: orchestrator for both CSS + JS
- scripts/check-build.mjs: staleness checker for CI/deploy guard
- justfile: add build, build-css, build-js, build-install, build-check recipes
- justfile: deploy recipe now runs build before deploy-code
- head.php + form-page.php: use dist/base.min.css instead of style.css
- All controllers + FormBootstrap: reference dist/*.min.{css,js}
- admin footer: load admin.min.js for all admin pages
- repertoire: use public.min.js instead of individual app JS files
- Fix stray '}' syntax error in admin.css line 305
- .gitignore: add app/public/assets/dist/
This commit is contained in:
@@ -514,8 +514,8 @@ if ($isHtmx) {
|
||||
include APP_ROOT . '/templates/admin/index-table.php';
|
||||
}
|
||||
} else {
|
||||
$extraCssAdmin = ['/assets/css/filepond.min.css', '/assets/css/filepond-plugin-image-preview.min.css'];
|
||||
$extraJs = ['/assets/js/vendor/filepond.min.js', '/assets/js/vendor/filepond-plugin-file-validate-type.min.js', '/assets/js/vendor/filepond-plugin-file-validate-size.min.js', '/assets/js/vendor/filepond-plugin-image-preview.min.js', '/assets/js/vendor/filepond-plugin-image-exif-orientation.min.js', '/assets/js/app/file-upload-filepond.js'];
|
||||
$extraCssAdmin = [];
|
||||
$extraJs = ['/assets/js/vendor/filepond.min.js', '/assets/js/vendor/filepond-plugin-file-validate-type.min.js', '/assets/js/vendor/filepond-plugin-file-validate-size.min.js', '/assets/js/vendor/filepond-plugin-image-preview.min.js', '/assets/js/vendor/filepond-plugin-image-exif-orientation.min.js', '/assets/dist/admin.min.js'];
|
||||
require_once APP_ROOT . '/templates/head.php';
|
||||
include APP_ROOT . '/templates/header.php';
|
||||
if ($tab === 'trash') {
|
||||
|
||||
@@ -74,7 +74,7 @@ if (empty($_SESSION['csrf_token'])) {
|
||||
}
|
||||
|
||||
$isAdmin = true; $bodyClass = 'admin-body';
|
||||
$extraCssAdmin = ['/assets/css/system.css'];
|
||||
$extraCssAdmin = ['/assets/dist/system.min.css'];
|
||||
require_once APP_ROOT . '/templates/head.php';
|
||||
include APP_ROOT . '/templates/header.php';
|
||||
include APP_ROOT . '/templates/admin/parametres.php';
|
||||
|
||||
@@ -302,7 +302,6 @@
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Table ──────────────────────────────────────────────────────────────── */
|
||||
/* Base table/th/td styles live in components/tables.css */
|
||||
|
||||
28
app/public/assets/js/app/admin-entry.js
Normal file
28
app/public/assets/js/app/admin-entry.js
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Admin JS entry — all JS needed on admin pages.
|
||||
*
|
||||
* Import order matters for dependencies:
|
||||
* - htmx-global-setup must come first (HTMX event listeners)
|
||||
* - Vendor scripts (htmx, FilePond) are loaded separately via <script> tags
|
||||
*/
|
||||
|
||||
// Core utilities (no deps)
|
||||
import "./beforeunload-guard.js";
|
||||
import "./clipboard.js";
|
||||
import "./smtp-error-focus.js";
|
||||
|
||||
// HTMX-powered features (htmx is a global from vendor script)
|
||||
import "./htmx-global-setup.js";
|
||||
|
||||
// Admin features
|
||||
import "./admin-index-bulk.js";
|
||||
import "./admin-tags.js";
|
||||
import "./admin-contenus-langues.js";
|
||||
import "./admin-contenus-motscles.js";
|
||||
import "./admin-contacts-form.js";
|
||||
import "./admin-acces.js";
|
||||
import "./admin-acces-sharelink.js";
|
||||
import "./admin-file-access.js";
|
||||
import "./admin-toc.js";
|
||||
import "./admin-logs.js";
|
||||
import "./sidebar-links-editor.js";
|
||||
17
app/public/assets/js/app/form-entry.js
Normal file
17
app/public/assets/js/app/form-entry.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Form JS entry — form-specific JS for admin form pages (add/edit).
|
||||
*
|
||||
* Admin baseline JS (admin.min.js) is loaded separately via the admin footer.
|
||||
* This bundle only includes form-specific features.
|
||||
*
|
||||
* Vendor scripts (htmx, FilePond, OverType) are loaded separately via <script> tags.
|
||||
*/
|
||||
|
||||
// Form-specific features (admin.min.js provides htmx-global-setup, beforeunload-guard, etc.)
|
||||
import "./file-upload-filepond.js";
|
||||
import "./pill-search.js";
|
||||
import "./jury-autocomplete.js";
|
||||
import "./autosave-handler.js";
|
||||
import "./form-duration-toggle.js";
|
||||
import "./form-jury-fields.js";
|
||||
import "./form-language-asterisk.js";
|
||||
17
app/public/assets/js/app/partage-entry.js
Normal file
17
app/public/assets/js/app/partage-entry.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Partage (student share) JS entry — all JS needed on partage form pages.
|
||||
*
|
||||
* Vendor scripts (htmx, FilePond) are loaded separately via <script> tags.
|
||||
*/
|
||||
|
||||
// Core utilities
|
||||
import "./beforeunload-guard.js";
|
||||
|
||||
// Form-specific features
|
||||
import "./file-upload-filepond.js";
|
||||
import "./pill-search.js";
|
||||
import "./jury-autocomplete.js";
|
||||
import "./autosave-handler.js";
|
||||
import "./form-duration-toggle.js";
|
||||
import "./form-jury-fields.js";
|
||||
import "./form-language-asterisk.js";
|
||||
19
app/public/assets/js/app/public-entry.js
Normal file
19
app/public/assets/js/app/public-entry.js
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Public JS entry — all JS needed on public-facing pages.
|
||||
*
|
||||
* Import order matters.
|
||||
* Vendor scripts (htmx) are loaded separately via <script> tags.
|
||||
*/
|
||||
|
||||
// Core utilities
|
||||
import "./beforeunload-guard.js";
|
||||
import "./clipboard.js";
|
||||
|
||||
// HTMX-powered features
|
||||
import "./htmx-global-setup.js";
|
||||
|
||||
// Public page features
|
||||
import "./repertoire-accordion.js";
|
||||
import "./repertoire-student-popover.js";
|
||||
import "./access-request.js";
|
||||
import "./acces-password.js";
|
||||
@@ -55,7 +55,7 @@ class AboutController
|
||||
'sidebarLinks' => $sidebarLinks,
|
||||
'pageTitle' => 'À Propos – XAMXAM',
|
||||
'metaDescription' => "À propos de XAMXAM, le répertoire des mémoires de fin d'études de l'erg – École de Recherches Graphiques de Bruxelles.",
|
||||
'extraCss' => ['/assets/css/content-page.css'],
|
||||
'extraCss' => ['/assets/dist/content-page.min.css'],
|
||||
'bodyClass' => 'apropos-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class CharteController
|
||||
'pageTitle' => $pageTitle . ' – XAMXAM',
|
||||
'metaDescription' => "Charte d'utilisation de XAMXAM, le répertoire des TFE de l'erg.",
|
||||
'currentNav' => 'charte',
|
||||
'extraCss' => ['/assets/css/content-page.css'],
|
||||
'extraCss' => ['/assets/dist/content-page.min.css'],
|
||||
'bodyClass' => 'apropos-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ class HomeController
|
||||
|
||||
// Layout
|
||||
'currentNav' => '',
|
||||
'extraCss' => ['/assets/css/public.css'],
|
||||
'extraCss' => ['/assets/dist/public.min.css'],
|
||||
'bodyClass' => 'home-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class LicenceController
|
||||
'pageTitle' => $pageTitle . ' – XAMXAM',
|
||||
'metaDescription' => "Informations sur les licences d'utilisation des mémoires publiés sur XAMXAM, le répertoire des TFE de l'erg.",
|
||||
'currentNav' => 'licence',
|
||||
'extraCss' => ['/assets/css/content-page.css'],
|
||||
'extraCss' => ['/assets/dist/content-page.min.css'],
|
||||
'bodyClass' => 'apropos-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ class SearchController
|
||||
'site_name' => 'XAMXAM – ERG',
|
||||
],
|
||||
'currentNav' => 'repertoire',
|
||||
'extraCss' => ['/assets/css/repertoire.css'],
|
||||
'extraCss' => ['/assets/dist/repertoire.min.css'],
|
||||
'bodyClass' => 'search-body',
|
||||
];
|
||||
}
|
||||
@@ -205,7 +205,7 @@ class SearchController
|
||||
'site_name' => 'XAMXAM – ERG',
|
||||
],
|
||||
'currentNav' => 'repertoire',
|
||||
'extraCss' => ['/assets/css/repertoire.css'],
|
||||
'extraCss' => ['/assets/dist/repertoire.min.css'],
|
||||
'bodyClass' => 'search-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -146,8 +146,8 @@ class TfeController
|
||||
|
||||
// Layout
|
||||
'currentNav' => '',
|
||||
'extraCss' => ['/assets/css/tfe.css'],
|
||||
'extraJs' => ['/assets/js/app/access-request.js'],
|
||||
'extraCss' => ['/assets/dist/tfe.min.css'],
|
||||
'extraJs' => ['/assets/dist/public.min.js'],
|
||||
'bodyClass' => 'tfe-body',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -16,23 +16,15 @@ class FormBootstrap
|
||||
public static function adminAssetArrays(): array
|
||||
{
|
||||
return [
|
||||
'extraCss' => ['/assets/css/form-base.css'],
|
||||
'extraCssAdmin' => [
|
||||
'/assets/css/form-admin.css',
|
||||
'/assets/css/filepond.min.css',
|
||||
'/assets/css/filepond-plugin-image-preview.min.css',
|
||||
],
|
||||
'extraCss' => ['/assets/dist/form.min.css'],
|
||||
'extraCssAdmin' => [],
|
||||
'extraJs' => [
|
||||
'/assets/js/vendor/filepond.min.js',
|
||||
'/assets/js/vendor/filepond-plugin-file-validate-type.min.js',
|
||||
'/assets/js/vendor/filepond-plugin-file-validate-size.min.js',
|
||||
'/assets/js/vendor/filepond-plugin-image-preview.min.js',
|
||||
'/assets/js/vendor/filepond-plugin-image-exif-orientation.min.js',
|
||||
'/assets/js/app/file-upload-filepond.js',
|
||||
'/assets/js/app/beforeunload-guard.js',
|
||||
'/assets/js/app/pill-search.js',
|
||||
'/assets/js/app/jury-autocomplete.js',
|
||||
'/assets/js/app/autosave-handler.js',
|
||||
'/assets/dist/form.min.js',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -17,6 +17,6 @@
|
||||
<script><?= $extraJsInline ?></script>
|
||||
<?php endif; ?>
|
||||
<script src="/assets/js/vendor/htmx.min.js"></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/htmx-global-setup.js') ?>"></script>
|
||||
<script src="<?= App::assetV('/assets/dist/admin.min.js') ?>"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
// Admin: append suffix to title and prepend admin.css
|
||||
if (!empty($isAdmin)) {
|
||||
$pageTitle = isset($pageTitle) ? $pageTitle . ' – Admin' : 'Admin';
|
||||
$extraCss = array_merge(['/assets/css/admin.css'], $extraCssAdmin ?? [], $extraCss ?? []);
|
||||
$extraCss = array_merge(['/assets/dist/admin.min.css'], $extraCssAdmin ?? [], $extraCss ?? []);
|
||||
}
|
||||
?>
|
||||
<title><?= htmlspecialchars($pageTitle ?? 'XAMXAM') ?></title>
|
||||
@@ -70,7 +70,7 @@
|
||||
<?php if (!empty($isAdmin) || !empty($filepondBase)): ?>
|
||||
<meta name="filepond-base" content="<?= htmlspecialchars($filepondBase ?? '/admin/actions/filepond') ?>">
|
||||
<?php endif; ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/css/style.css') ?>">
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/dist/base.min.css') ?>">
|
||||
<?php foreach ($extraCss ?? [] as $css): ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV($css) ?>">
|
||||
<?php endforeach; ?>
|
||||
|
||||
@@ -37,11 +37,11 @@ $filepondBase = $filepondBase ?? null;
|
||||
<?php if ($filepondBase !== null): ?>
|
||||
<meta name="filepond-base" content="<?= htmlspecialchars($filepondBase) ?>">
|
||||
<?php endif; ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/css/style.css') ?>">
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/css/form-base.css') ?>">
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/dist/base.min.css') ?>">
|
||||
<?php if ($includeFilePond): ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/css/filepond.min.css') ?>">
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/css/filepond-plugin-image-preview.min.css') ?>">
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/dist/partage-form.min.css') ?>">
|
||||
<?php else: ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV('/assets/dist/form-base.min.css') ?>">
|
||||
<?php endif; ?>
|
||||
<?php foreach ($extraCss as $css): ?>
|
||||
<link rel="stylesheet" href="<?= App::assetV($css) ?>">
|
||||
@@ -52,14 +52,10 @@ $filepondBase = $filepondBase ?? null;
|
||||
<script src="<?= App::assetV('/assets/js/vendor/filepond-plugin-file-validate-size.min.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/vendor/filepond-plugin-image-preview.min.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/vendor/filepond-plugin-image-exif-orientation.min.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/file-upload-filepond.js') ?>" defer></script>
|
||||
<?php endif; ?>
|
||||
<script src="<?= App::assetV('/assets/js/app/beforeunload-guard.js') ?>" defer></script>
|
||||
<?php if ($includeFilePond): ?>
|
||||
<script src="<?= App::assetV('/assets/js/app/pill-search.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/jury-autocomplete.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/autosave-handler.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/js/vendor/htmx.min.js') ?>" defer></script>
|
||||
<script src="<?= App::assetV('/assets/dist/partage.min.js') ?>" defer></script>
|
||||
<?php else: ?>
|
||||
<script src="<?= App::assetV('/assets/dist/public.min.js') ?>" defer></script>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($extraJs as $js): ?>
|
||||
<script src="<?= App::assetV($js) ?>" defer></script>
|
||||
|
||||
@@ -7,5 +7,4 @@
|
||||
<div id="student-popover" class="student-popover" hidden aria-live="polite"></div>
|
||||
|
||||
<script src="/assets/js/vendor/htmx.min.js"></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/repertoire-student-popover.js') ?>"></script>
|
||||
<script src="<?= App::assetV('/assets/js/app/repertoire-accordion.js') ?>"></script>
|
||||
<script src="<?= App::assetV('/assets/dist/public.min.js') ?>"></script>
|
||||
|
||||
Reference in New Issue
Block a user