librelad 8d86855098 fix(webui): category-icon fallback + flatten forms/ + manifest order
From the feng-shui audit (all adversarially verified):

- BUG (high): apps-grid.js category tiles used onerror fallback
  /core/icons/categories/default.svg, which doesn't exist (the dir has
  misc.svg as its generic icon, which data-loader.js already uses). Any
  category missing its named SVG showed a broken-image glyph. Repointed to
  /core/icons/categories/misc.svg.
- TIDY: core/forms was the lone depth-3 nesting — JS at forms/controls/js/
  while its CSS sat at forms/css/ and every other core subsystem uses
  <name>/js/. 'controls/' grouped nothing (just the 2 custom-* widgets), so
  flattened to core/forms/js/ (+ updated index.html). forms is now symmetric.
- CONSISTENCY: components/manifest.dev.json entries carried nav.order but not
  the top-level 'order' that each feature.json has; added it so the API-down
  fallback matches the live /api/features/list scan.

Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-31 00:39:08 +01:00

98 lines
2.3 KiB
JSON

{
"version": 1,
"note": "Phase-0 hand-committed manifest (to be replaced by the generated /data/webui/generated/features.json once the scan generator lands — see docs/frontend-modularization.md). 'module' is the feature's self-registering index.js; the kernel loads these from here so they no longer need <script> tags in index.html. 'handler' names the LibrePortalSPAClean method kept as the fallback during the strangler migration; 'navId' is the topbar element id for active-state highlighting.",
"features": [
{
"id": "dashboard",
"routes": [
"/",
"/dashboard"
],
"module": "/components/dashboard/index.js",
"handler": "handleDashboard",
"navId": "nav-dashboard",
"nav": {
"label": "Dashboard",
"order": 10
},
"order": 10
},
{
"id": "apps",
"routes": [
"/apps",
"/apps*",
"/app",
"/app*"
],
"module": "/components/apps/index.js",
"handler": "handleApps",
"navId": "nav-app-center",
"nav": {
"label": "App Center",
"order": 20
},
"order": 20
},
{
"id": "admin",
"routes": [
"/admin",
"/admin*"
],
"module": "/components/admin/index.js",
"handler": "handleAdmin",
"navId": "nav-config",
"nav": {
"label": "Admin",
"order": 40
},
"order": 40
},
{
"id": "tasks",
"routes": [
"/tasks",
"/tasks*"
],
"module": "/components/tasks/index.js",
"handler": "handleTasks",
"navId": "nav-tasks",
"nav": {
"label": "Tasks",
"order": 60
},
"order": 60
},
{
"id": "updater",
"routes": [
"/updater",
"/updater*"
],
"module": "/components/updater/index.js",
"navId": "nav-updater",
"nav": {
"label": "Updates",
"order": 30
},
"order": 30
},
{
"id": "backup",
"routes": [
"/backup",
"/backup*"
],
"module": "/components/backup/index.js",
"handler": "handleBackup",
"navId": "nav-backup",
"nav": {
"label": "Backups",
"order": 50
},
"order": 50
}
]
}