diff --git a/public/css/aurora.css b/public/css/aurora.css index 7ca41891..8aa9c6b2 100644 --- a/public/css/aurora.css +++ b/public/css/aurora.css @@ -384,8 +384,11 @@ input[type=date]:focus, select:focus { .tabs.edit-route-tabs{border-bottom:0; gap:3px; background:var(--surface-3); border:1px solid var(--line); border-radius:10px; padding:3px} .tabs.edit-route-tabs .tab{padding:7px 12px; font-size:12.5px; border-radius:7px; border:0; margin:0} .tabs.edit-route-tabs .tab.active{background:var(--surface); color:var(--text); border:0} -.edit-route-panel{display:none} -.edit-route-panel.active{display:block; animation:fade .2s ease} +/* The shared route-edit JS toggles panels via inline style.display (showing the + active one with display:'' → falls back to the stylesheet). So the base must + NOT be display:none, or no panel ever shows. Inactive panels carry inline + display:none from the template; the fade runs each time one is revealed. */ +.edit-route-panel{animation:fade .2s ease} .toggle{width:42px;height:24px;border-radius:999px;background:var(--surface-3);border:1px solid var(--line-2);position:relative;cursor:pointer;transition:.2s; flex:0 0 auto} .toggle::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:var(--muted);transition:.2s} diff --git a/templates/aurora/layout.njk b/templates/aurora/layout.njk index e1c7fe11..ae9ba825 100644 --- a/templates/aurora/layout.njk +++ b/templates/aurora/layout.njk @@ -44,7 +44,14 @@ csrfToken: '{{ csrfToken }}', language: '{{ language }}', baseUrl: '{{ baseUrl }}', - features: { gateway_lan_discovery_multi_subnet: {{ ('true' if license.features.gateway_lan_discovery_multi_subnet else 'false') | safe }} }, + features: { + gateway_lan_discovery_multi_subnet: {{ ('true' if license.features.gateway_lan_discovery_multi_subnet else 'false') | safe }}, + gateway_tcp_routing: {{ ('true' if license.features.gateway_tcp_routing else 'false') | safe }}, + gateway_scan_egress: {{ ('true' if license.features.gateway_scan_egress else 'false') | safe }}, + l4_routes: {{ license.features.l4_routes | default(0) }}, + http_routes: {{ license.features.http_routes | default(0) }}, + browser_sessions: {{ ('true' if license.hasFeature('browser_sessions') else 'false') | safe }} + }, t: { 'peers.no_peers': {{ t('peers.no_peers') | dump | safe }}, 'peers.online': {{ t('peers.online') | dump | safe }}, @@ -152,6 +159,7 @@ 'gateway_pools.select_none': {{ t('gateway_pools.select_none') | dump | safe }}, 'rdp.host_hint.default': {{ t('rdp.host_hint.default') | dump | safe }}, 'rdp.host_hint.gateway': {{ t('rdp.host_hint.gateway') | dump | safe }}, + 'rdp.badge.browser': {{ t('rdp.badge.browser') | dump | safe }}, 'routes.domain': {{ t('routes.domain') | dump | safe }}, 'routes.l4_sni_label': {{ t('routes.l4_sni_label') | dump | safe }}, 'routes.l4_sni_required_hint': {{ t('routes.l4_sni_required_hint') | dump | safe }}, @@ -339,7 +347,40 @@ 'autoupdate.setup_note': {{ t('autoupdate.setup_note') | dump | safe }}, 'autoupdate.ago_seconds': {{ t('autoupdate.ago_seconds') | dump | safe }}, 'autoupdate.ago_minutes': {{ t('autoupdate.ago_minutes') | dump | safe }}, - 'routes.suggested.unavailable': {{ t('routes.suggested.unavailable') | dump | safe }} + 'routes.suggested.unavailable': {{ t('routes.suggested.unavailable') | dump | safe }}, + 'common.close': {{ t('common.close') | dump | safe }}, + 'common.loading': {{ t('common.loading') | dump | safe }}, + 'printer_preset.title': {{ t('printer_preset.title') | dump | safe }}, + 'printer_preset.gateway': {{ t('printer_preset.gateway') | dump | safe }}, + 'printer_preset.printer_ip': {{ t('printer_preset.printer_ip') | dump | safe }}, + 'printer_preset.name': {{ t('printer_preset.name') | dump | safe }}, + 'printer_preset.adopt': {{ t('printer_preset.adopt') | dump | safe }}, + 'printer_preset.adopt_unsupported': {{ t('printer_preset.adopt_unsupported') | dump | safe }}, + 'printer_preset.adopt_not_enabled': {{ t('printer_preset.adopt_not_enabled') | dump | safe }}, + 'printer_preset.adopt_scanning': {{ t('printer_preset.adopt_scanning') | dump | safe }}, + 'printer_preset.adopt_none': {{ t('printer_preset.adopt_none') | dump | safe }}, + 'printer_preset.adopt_failed': {{ t('printer_preset.adopt_failed') | dump | safe }}, + 'printer_preset.adopt_active_hint': {{ t('printer_preset.adopt_active_hint') | dump | safe }}, + 'printer_preset.adopt_enable': {{ t('printer_preset.adopt_enable') | dump | safe }}, + 'printer_preset.adopt_enable_failed': {{ t('printer_preset.adopt_enable_failed') | dump | safe }}, + 'printer_preset.port_9100': {{ t('printer_preset.port_9100') | dump | safe }}, + 'printer_preset.port_631': {{ t('printer_preset.port_631') | dump | safe }}, + 'printer_preset.ews': {{ t('printer_preset.ews') | dump | safe }}, + 'printer_preset.ews_domain': {{ t('printer_preset.ews_domain') | dump | safe }}, + 'printer_preset.scan': {{ t('printer_preset.scan') | dump | safe }}, + 'printer_preset.vip': {{ t('printer_preset.vip') | dump | safe }}, + 'printer_preset.target_existing': {{ t('printer_preset.target_existing') | dump | safe }}, + 'printer_preset.target_new': {{ t('printer_preset.target_new') | dump | safe }}, + 'printer_preset.nas_ip': {{ t('printer_preset.nas_ip') | dump | safe }}, + 'printer_preset.nas_gateway': {{ t('printer_preset.nas_gateway') | dump | safe }}, + 'printer_preset.create': {{ t('printer_preset.create') | dump | safe }}, + 'printer_preset.scan_locked': {{ t('printer_preset.scan_locked') | dump | safe }}, + 'printer_preset.ews_locked': {{ t('printer_preset.ews_locked') | dump | safe }}, + 'printer_preset.save_failed': {{ t('printer_preset.save_failed') | dump | safe }}, + 'printer_preset.step_print': {{ t('printer_preset.step_print') | dump | safe }}, + 'printer_preset.step_scan': {{ t('printer_preset.step_scan') | dump | safe }}, + 'printer_preset.step_review': {{ t('printer_preset.step_review') | dump | safe }}, + 'printer_preset.step_device': {{ t('printer_preset.step_device') | dump | safe }} } }; diff --git a/templates/aurora/pages/logs.njk b/templates/aurora/pages/logs.njk index 72f854a9..eef9e530 100644 --- a/templates/aurora/pages/logs.njk +++ b/templates/aurora/pages/logs.njk @@ -44,6 +44,7 @@
{{ t('common.loading') }}
+
{# ─── Access Log Panel ─── #} @@ -67,6 +68,7 @@
{{ t('common.loading') }}
+
{# ─── Connection History Panel ─── #} diff --git a/templates/aurora/pages/rdp-session.njk b/templates/aurora/pages/rdp-session.njk new file mode 100644 index 00000000..4b344490 --- /dev/null +++ b/templates/aurora/pages/rdp-session.njk @@ -0,0 +1,272 @@ + + + + + + + + + + {# No-FOUC theme-mode pre-paint (matches aurora/layout.njk; nonce for CSP) #} + + + + {{ t('rdp.session.title') }} — {{ appName }} + + + + + + + +
+ + {# ─── Remote display surface ──────────────────────────────────────────── #} +
+ + {# Reconnecting overlay (shown while player auto-retries) #} + + + {# Error / limit overlay (shown on terminal error state) #} + + +
{# /rdp-session-display #} + + {# ─── Slim toolbar ────────────────────────────────────────────────────── #} +
+ + {# Status pill #} + + + {{ t('rdp.session.status.connecting') }} + + + + + {# Fullscreen #} + + + {# Scale toggle (fit ↔ native) #} + + + {# Ctrl+Alt+Del — RDP protocol only #} + {% if route.protocol == 'rdp' %} + + {% endif %} + + {# Paste from clipboard #} + + {# Inline clipboard-unavailable indicator — shown by JS when clipboard permission is denied #} + + + {# Disconnect #} + + +
{# /rdp-session-toolbar #} + +
{# /rdp-session-page #} + +{# Script load order: guacamole → player-logic → player → JSON islands → init #} + + + + +{# JSON island 1: init config — no user free-text, only numeric id + enum protocol + CSRF + guac object #} + + +{# JSON island 2: i18n strings needed for JS state updates #} + + +{# Init script — reads from JSON islands only; no server values interpolated into JS strings #} + + + diff --git a/templates/aurora/pages/rdp.njk b/templates/aurora/pages/rdp.njk index d9bc392f..eefa4203 100644 --- a/templates/aurora/pages/rdp.njk +++ b/templates/aurora/pages/rdp.njk @@ -240,6 +240,14 @@