Fist commit
This commit is contained in:
22
ui/README.md
Executable file
22
ui/README.md
Executable file
@@ -0,0 +1,22 @@
|
||||
# Dashboard TimbreESP
|
||||
|
||||
Frontend local, sin framework y sin recursos de red en tiempo de ejecución.
|
||||
|
||||
## Desarrollo
|
||||
|
||||
```powershell
|
||||
cd ui
|
||||
npm ci
|
||||
npm run build
|
||||
node --check app.js
|
||||
```
|
||||
|
||||
`npm run build` genera:
|
||||
|
||||
- `dist/index.html`
|
||||
- `dist/styles.min.css`
|
||||
- `dist/app.min.js`
|
||||
|
||||
El build de PlatformIO ejecuta `npm run build` automáticamente si Node.js y `ui/node_modules` están disponibles. Si no, incrusta los fuentes sin minificar como respaldo.
|
||||
|
||||
No se deben añadir recursos externos, frameworks, WebSockets ni información de credenciales al navegador.
|
||||
397
ui/index.html
Executable file
397
ui/index.html
Executable file
@@ -0,0 +1,397 @@
|
||||
<!doctype html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#123047">
|
||||
<meta name="color-scheme" content="light">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'">
|
||||
<title>TimbreESP · Control local</title>
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<script src="app.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#contenido">Saltar al contenido</a>
|
||||
|
||||
<div id="app" aria-busy="true">
|
||||
<section id="screen-bootstrap" class="auth-screen" aria-labelledby="bootstrap-title">
|
||||
<div class="auth-card auth-card--compact">
|
||||
<div class="brand brand--centered" aria-label="TimbreESP">
|
||||
<span class="brand-mark" aria-hidden="true">TE</span>
|
||||
<span>TimbreESP</span>
|
||||
</div>
|
||||
<div class="state-block" role="status" aria-live="polite">
|
||||
<span class="spinner" aria-hidden="true"></span>
|
||||
<div>
|
||||
<h1 id="bootstrap-title">Preparando el equipo</h1>
|
||||
<p id="bootstrap-message">Comprobando el estado de la configuración.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="bootstrap-error" class="notice notice--error" role="alert" hidden>
|
||||
<p id="bootstrap-error-message"></p>
|
||||
<button id="bootstrap-retry" class="button button--secondary" type="button">Reintentar</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="screen-claim" class="auth-screen" aria-labelledby="claim-title" hidden>
|
||||
<div class="auth-card">
|
||||
<div class="brand brand--centered" aria-label="TimbreESP">
|
||||
<span class="brand-mark" aria-hidden="true">TE</span>
|
||||
<span>TimbreESP</span>
|
||||
</div>
|
||||
<div class="auth-heading">
|
||||
<p class="eyebrow">Configuración inicial</p>
|
||||
<h1 id="claim-title" tabindex="-1">Protege el equipo</h1>
|
||||
<p>Usa el token de un solo uso y crea una contraseña para esta interfaz local.</p>
|
||||
</div>
|
||||
<form id="claim-form" class="form-stack" novalidate>
|
||||
<div class="form-field">
|
||||
<label for="claim-token">Token de configuración</label>
|
||||
<input id="claim-token" name="token" type="text" required minlength="16" autocomplete="off" autocapitalize="none" spellcheck="false" maxlength="128" placeholder="Introduce el token entregado por el equipo">
|
||||
<p class="field-help">El token se invalida después de Claim. No se conserva en este navegador.</p>
|
||||
</div>
|
||||
<div class="form-grid form-grid--two">
|
||||
<div class="form-field">
|
||||
<label for="claim-password">Nueva contraseña</label>
|
||||
<input id="claim-password" name="password" type="password" required minlength="12" maxlength="128" autocomplete="new-password">
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label for="claim-password-confirm">Repite la contraseña</label>
|
||||
<input id="claim-password-confirm" name="passwordConfirm" type="password" required minlength="12" maxlength="128" autocomplete="new-password">
|
||||
</div>
|
||||
</div>
|
||||
<p id="claim-error" class="form-error" role="alert" hidden></p>
|
||||
<button id="claim-submit" class="button button--primary button--wide" type="submit">Claim y continuar</button>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="screen-login" class="auth-screen" aria-labelledby="login-title" hidden>
|
||||
<div class="auth-card auth-card--compact">
|
||||
<div class="brand brand--centered" aria-label="TimbreESP">
|
||||
<span class="brand-mark" aria-hidden="true">TE</span>
|
||||
<span>TimbreESP</span>
|
||||
</div>
|
||||
<div class="auth-heading">
|
||||
<p class="eyebrow">Acceso local</p>
|
||||
<h1 id="login-title" tabindex="-1">Iniciar sesión</h1>
|
||||
<p id="login-intro">Introduce la contraseña configurada para controlar el timbre.</p>
|
||||
</div>
|
||||
<form id="login-form" class="form-stack" novalidate>
|
||||
<div class="form-field">
|
||||
<label for="login-password">Contraseña</label>
|
||||
<input id="login-password" name="password" type="password" required maxlength="128" autocomplete="current-password" autofocus>
|
||||
</div>
|
||||
<p id="login-error" class="form-error" role="alert" hidden></p>
|
||||
<button id="login-submit" class="button button--primary button--wide" type="submit">Entrar</button>
|
||||
</form>
|
||||
<p class="privacy-note">La sesión y el token de protección se mantienen únicamente en memoria.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div id="dashboard" hidden>
|
||||
<header class="topbar">
|
||||
<div class="topbar__inner">
|
||||
<div class="brand">
|
||||
<span class="brand-mark" aria-hidden="true">TE</span>
|
||||
<span>
|
||||
<strong>TimbreESP</strong>
|
||||
<small>Control local</small>
|
||||
</span>
|
||||
</div>
|
||||
<div class="topbar__actions">
|
||||
<span id="connection-badge" class="connection-badge connection-badge--loading" role="status" aria-live="polite">
|
||||
<span class="status-indicator" aria-hidden="true"></span>
|
||||
<span id="connection-text">Conectando</span>
|
||||
</span>
|
||||
<button id="logout-button" class="button button--quiet" type="button">Cerrar sesión</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="contenido" class="page-shell" tabindex="-1">
|
||||
<div class="page-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Panel operativo</p>
|
||||
<h1>Estado del equipo</h1>
|
||||
<p>Configuración, programación y comprobaciones del timbre principal.</p>
|
||||
</div>
|
||||
<button id="refresh-data" class="button button--secondary" type="button">Actualizar datos</button>
|
||||
</div>
|
||||
|
||||
<div id="csrf-warning" class="notice notice--warning" role="alert" hidden>
|
||||
La sesión está iniciada, pero el dispositivo no entregó un token de protección. Las acciones de configuración se bloquearán.
|
||||
</div>
|
||||
|
||||
<section class="overview-grid" aria-label="Resumen del equipo">
|
||||
<article class="card clock-card" aria-labelledby="clock-title">
|
||||
<div class="card-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Hora del dispositivo</p>
|
||||
<h2 id="clock-title">Reloj</h2>
|
||||
</div>
|
||||
<span id="clock-indicator" class="state-pill state-pill--muted">Sin datos</span>
|
||||
</div>
|
||||
<div class="clock-readout" aria-live="off">
|
||||
<time id="clock-value" datetime="">--:--:--</time>
|
||||
<p id="clock-date">Esperando estado…</p>
|
||||
</div>
|
||||
<p id="clock-status" class="status-message status-message--muted">Consultando la hora.</p>
|
||||
<div class="card-footer card-footer--actions">
|
||||
<button id="sync-time-button" class="button button--secondary" type="button">Usar la hora de este dispositivo</button>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="card" aria-labelledby="sequence-title">
|
||||
<div class="card-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Salida principal</p>
|
||||
<h2 id="sequence-title">Ciclo del timbre</h2>
|
||||
</div>
|
||||
<span id="sequence-indicator" class="state-pill state-pill--muted">Inactivo</span>
|
||||
</div>
|
||||
<dl class="detail-list">
|
||||
<div>
|
||||
<dt>Patrón</dt>
|
||||
<dd id="active-pattern-label">—</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Salida</dt>
|
||||
<dd>GPIO22</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<p id="state-message" class="status-message status-message--muted">Consultando el estado…</p>
|
||||
<div class="card-footer">
|
||||
<button id="stop-button" class="button button--danger" type="button" disabled>Detener secuencia</button>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="card" aria-labelledby="hardware-title">
|
||||
<div class="card-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Salidas</p>
|
||||
<h2 id="hardware-title">Hardware</h2>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="hardware-list">
|
||||
<li>
|
||||
<span class="hardware-icon hardware-icon--primary" aria-hidden="true">22</span>
|
||||
<span><strong>GPIO22</strong><small>Timbre principal</small></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="hardware-icon" aria-hidden="true">23</span>
|
||||
<span><strong>GPIO23</strong><small>Reservado; no se controla</small></span>
|
||||
</li>
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="card section-card" aria-labelledby="profiles-title">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Modos de operación</p>
|
||||
<h2 id="profiles-title">Perfiles</h2>
|
||||
<p>Selecciona el perfil activo y organiza distintos modos de horario.</p>
|
||||
</div>
|
||||
<button id="add-profile-button" class="button button--primary" type="button">Añadir perfil</button>
|
||||
</div>
|
||||
<div class="active-profile-panel">
|
||||
<form id="active-profile-form" class="active-profile-form">
|
||||
<div class="form-field">
|
||||
<label for="active-profile-select">Perfil activo</label>
|
||||
<select id="active-profile-select" required disabled>
|
||||
<option value="">Cargando perfiles…</option>
|
||||
</select>
|
||||
</div>
|
||||
<button id="active-profile-submit" class="button button--secondary" type="submit" disabled>Guardar perfil activo</button>
|
||||
</form>
|
||||
</div>
|
||||
<div id="profiles-content" class="resource-content" aria-live="polite" aria-busy="true"></div>
|
||||
</section>
|
||||
|
||||
<section class="card section-card" aria-labelledby="schedules-title">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Automatización</p>
|
||||
<h2 id="schedules-title">Horarios</h2>
|
||||
<p>El timbre principal puede tener como máximo 100 horarios entre todos los perfiles.</p>
|
||||
</div>
|
||||
<button id="add-schedule-button" class="button button--primary" type="button">Añadir horario</button>
|
||||
</div>
|
||||
<div class="schedule-toolbar">
|
||||
<div id="profile-tabs" class="segmented-control" role="tablist" aria-label="Filtrar horarios por perfil"></div>
|
||||
<span id="schedule-count" class="count-badge">0 / 100 horarios</span>
|
||||
</div>
|
||||
<div id="schedules-content" class="resource-content" aria-live="polite" aria-busy="true"></div>
|
||||
</section>
|
||||
|
||||
<section class="card section-card" aria-labelledby="patterns-title">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Secuencias electricas</p>
|
||||
<h2 id="patterns-title">Patrones</h2>
|
||||
<p>Cada patrón alterna seis fases: encendido, apagado, encendido, apagado, encendido y apagado.</p>
|
||||
</div>
|
||||
<button id="add-pattern-button" class="button button--primary" type="button">Añadir patrón</button>
|
||||
</div>
|
||||
<div class="hardware-note">
|
||||
<strong>Destino:</strong> GPIO22 (principal). GPIO23 está reservado y no se puede seleccionar.
|
||||
</div>
|
||||
<div id="patterns-content" class="resource-content" aria-live="polite" aria-busy="true"></div>
|
||||
</section>
|
||||
|
||||
<section class="card section-card" aria-labelledby="holidays-title">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<p class="eyebrow">Excepciones anuales</p>
|
||||
<h2 id="holidays-title">Feriados</h2>
|
||||
<p>Las fechas de silencio se repiten cada año, sin guardar un año concreto.</p>
|
||||
</div>
|
||||
</div>
|
||||
<form id="holiday-form" class="holiday-form" novalidate>
|
||||
<div class="form-field">
|
||||
<label for="holiday-month">Mes</label>
|
||||
<select id="holiday-month" name="month" required></select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label for="holiday-day">Día</label>
|
||||
<input id="holiday-day" name="day" type="number" min="1" max="31" step="1" value="1" required inputmode="numeric">
|
||||
</div>
|
||||
<button id="holiday-submit" class="button button--primary" type="submit">Añadir feriado</button>
|
||||
</form>
|
||||
<p id="holiday-error" class="form-error" role="alert" hidden></p>
|
||||
<div id="holidays-content" class="resource-content" aria-live="polite" aria-busy="true"></div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="page-footer">
|
||||
<p>Interfaz local de TimbreESP. No se carga ningún recurso desde Internet.</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<dialog id="profile-dialog" class="dialog" aria-labelledby="profile-dialog-title">
|
||||
<form id="profile-form" class="dialog__body" novalidate>
|
||||
<div class="dialog__header">
|
||||
<div>
|
||||
<p class="eyebrow">Perfil</p>
|
||||
<h2 id="profile-dialog-title">Añadir perfil</h2>
|
||||
</div>
|
||||
<button class="icon-button" type="button" data-close-dialog aria-label="Cerrar">×</button>
|
||||
</div>
|
||||
<input id="profile-id" name="id" type="hidden">
|
||||
<div class="form-field">
|
||||
<label for="profile-name">Nombre del perfil</label>
|
||||
<input id="profile-name" name="name" type="text" required maxlength="32" autocomplete="off" placeholder="Ej. horario de invierno">
|
||||
</div>
|
||||
<p id="profile-form-error" class="form-error" role="alert" hidden></p>
|
||||
<div class="dialog__actions">
|
||||
<button class="button button--quiet" type="button" data-close-dialog>Cancelar</button>
|
||||
<button id="profile-submit" class="button button--primary" type="submit">Guardar perfil</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="schedule-dialog" class="dialog dialog--wide" aria-labelledby="schedule-dialog-title">
|
||||
<form id="schedule-form" class="dialog__body" novalidate>
|
||||
<div class="dialog__header">
|
||||
<div>
|
||||
<p class="eyebrow">Programación</p>
|
||||
<h2 id="schedule-dialog-title">Añadir horario</h2>
|
||||
</div>
|
||||
<button class="icon-button" type="button" data-close-dialog aria-label="Cerrar">×</button>
|
||||
</div>
|
||||
<input id="schedule-id" name="id" type="hidden">
|
||||
<div class="form-grid form-grid--two">
|
||||
<div class="form-field">
|
||||
<label for="schedule-time">Hora</label>
|
||||
<input id="schedule-time" name="time" type="time" required>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label for="schedule-profile">Perfil</label>
|
||||
<select id="schedule-profile" name="profileId" required></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label for="schedule-pattern">Patrón del timbre</label>
|
||||
<select id="schedule-pattern" name="patternId" required></select>
|
||||
</div>
|
||||
<fieldset class="days-fieldset">
|
||||
<legend>Días de la semana</legend>
|
||||
<p class="field-help">Se envía como bitmask: domingo es el bit 0 y sábado el bit 6.</p>
|
||||
<div id="schedule-days" class="day-picker"></div>
|
||||
</fieldset>
|
||||
<p id="schedule-form-error" class="form-error" role="alert" hidden></p>
|
||||
<div class="dialog__actions">
|
||||
<button class="button button--quiet" type="button" data-close-dialog>Cancelar</button>
|
||||
<button id="schedule-submit" class="button button--primary" type="submit">Guardar horario</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="pattern-dialog" class="dialog dialog--wide" aria-labelledby="pattern-dialog-title">
|
||||
<form id="pattern-form" class="dialog__body" novalidate>
|
||||
<div class="dialog__header">
|
||||
<div>
|
||||
<p class="eyebrow">Ciclo eléctrico</p>
|
||||
<h2 id="pattern-dialog-title">Añadir patrón</h2>
|
||||
</div>
|
||||
<button class="icon-button" type="button" data-close-dialog aria-label="Cerrar">×</button>
|
||||
</div>
|
||||
<input id="pattern-id" name="id" type="hidden">
|
||||
<div class="form-grid form-grid--two">
|
||||
<div class="form-field">
|
||||
<label for="pattern-code">Código</label>
|
||||
<select id="pattern-code" name="legacyCode" required>
|
||||
<option value="A">A</option>
|
||||
<option value="B">B</option>
|
||||
<option value="C">C</option>
|
||||
</select>
|
||||
<p class="field-help">Código heredado que identifica el patrón.</p>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<span class="field-label">Destino</span>
|
||||
<div class="readonly-value">GPIO22 · principal</div>
|
||||
<p class="field-help">GPIO23 está reservado.</p>
|
||||
</div>
|
||||
</div>
|
||||
<fieldset class="phases-fieldset">
|
||||
<legend>Fases del ciclo</legend>
|
||||
<div class="phase-grid" id="pattern-phases"></div>
|
||||
</fieldset>
|
||||
<label class="checkbox-field checkbox-field--standalone" for="pattern-enabled">
|
||||
<input id="pattern-enabled" name="enabled" type="checkbox">
|
||||
<span>Patrón habilitado</span>
|
||||
</label>
|
||||
<p id="pattern-form-error" class="form-error" role="alert" hidden></p>
|
||||
<div class="dialog__actions">
|
||||
<button class="button button--quiet" type="button" data-close-dialog>Cancelar</button>
|
||||
<button id="pattern-submit" class="button button--primary" type="submit">Guardar patrón</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="confirm-dialog" class="dialog dialog--confirm" aria-labelledby="confirm-title" aria-describedby="confirm-message">
|
||||
<div class="dialog__body">
|
||||
<div class="dialog__header">
|
||||
<div>
|
||||
<p class="eyebrow">Confirmar acción</p>
|
||||
<h2 id="confirm-title">Confirmar</h2>
|
||||
</div>
|
||||
<button class="button button--quiet" type="button" data-close-dialog aria-label="Cerrar">Cerrar</button>
|
||||
</div>
|
||||
<p id="confirm-message" class="confirm-message"></p>
|
||||
<div class="dialog__actions">
|
||||
<button class="button button--secondary" type="button" data-close-dialog>Cancelar</button>
|
||||
<button id="confirm-action-button" class="button button--danger" type="button">Confirmar</button>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
<div id="toast-region" class="toast-region" aria-live="polite" aria-atomic="false"></div>
|
||||
<noscript>
|
||||
<div class="noscript-notice">Esta interfaz necesita JavaScript para comunicarse con TimbreESP.</div>
|
||||
</noscript>
|
||||
</body>
|
||||
</html>
|
||||
489
ui/package-lock.json
generated
Executable file
489
ui/package-lock.json
generated
Executable file
@@ -0,0 +1,489 @@
|
||||
{
|
||||
"name": "timbreesp-ui",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "timbreesp-ui",
|
||||
"version": "1.0.0",
|
||||
"devDependencies": {
|
||||
"clean-css-cli": "5.6.3",
|
||||
"terser": "5.44.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/gen-mapping": {
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0",
|
||||
"@jridgewell/trace-mapping": "^0.3.24"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/resolve-uri": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/source-map": {
|
||||
"version": "0.3.11",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
|
||||
"integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.25"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
|
||||
"integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.31",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
|
||||
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.1.0",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
|
||||
"integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/anymatch": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
|
||||
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"normalize-path": "^3.0.0",
|
||||
"picomatch": "^2.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/binary-extensions": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
||||
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.21",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz",
|
||||
"integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
|
||||
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"anymatch": "~3.1.2",
|
||||
"braces": "~3.0.2",
|
||||
"glob-parent": "~5.1.2",
|
||||
"is-binary-path": "~2.1.0",
|
||||
"is-glob": "~4.0.1",
|
||||
"normalize-path": "~3.0.0",
|
||||
"readdirp": "~3.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8.10.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/clean-css": {
|
||||
"version": "5.3.3",
|
||||
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
|
||||
"integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"source-map": "~0.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/clean-css-cli": {
|
||||
"version": "5.6.3",
|
||||
"resolved": "https://registry.npmjs.org/clean-css-cli/-/clean-css-cli-5.6.3.tgz",
|
||||
"integrity": "sha512-MUAta8pEqA/d2DKQwtZU5nm0Og8TCyAglOx3GlWwjhGdKBwY4kVF6E5M6LU/jmmuswv+HbYqG/dKKkq5p1dD0A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chokidar": "^3.5.2",
|
||||
"clean-css": "^5.3.3",
|
||||
"commander": "7.x",
|
||||
"glob": "^7.1.6"
|
||||
},
|
||||
"bin": {
|
||||
"cleancss": "bin/cleancss"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/commander": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
|
||||
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "7.2.3",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
|
||||
"deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.1.1",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/glob-parent": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
|
||||
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"is-glob": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
|
||||
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/is-binary-path": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"binary-extensions": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/is-extglob": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/is-glob": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-extglob": "^2.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/minimatch": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/normalize-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
|
||||
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
||||
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"picomatch": "^2.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-support": {
|
||||
"version": "0.5.21",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/terser": {
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz",
|
||||
"integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"@jridgewell/source-map": "^0.3.3",
|
||||
"acorn": "^8.15.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"bin": {
|
||||
"terser": "bin/terser"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/terser/node_modules/commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/to-regex-range": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-number": "^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
}
|
||||
}
|
||||
}
|
||||
13
ui/package.json
Executable file
13
ui/package.json
Executable file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "timbreesp-ui",
|
||||
"private": true,
|
||||
"version": "1.0.0",
|
||||
"description": "Dashboard local y sin dependencias de runtime para TimbreESP",
|
||||
"scripts": {
|
||||
"build": "node -e \"const fs=require('fs');fs.mkdirSync('dist',{recursive:true});fs.copyFileSync('index.html','dist/index.html')\" && cleancss -O2 -o dist/styles.min.css styles.css && terser app.js --compress --mangle --ecma 2020 -o dist/app.min.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"clean-css-cli": "5.6.3",
|
||||
"terser": "5.44.0"
|
||||
}
|
||||
}
|
||||
1595
ui/styles.css
Executable file
1595
ui/styles.css
Executable file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user