@tekkare/romulus 0.1.95 → 0.1.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.json +1 -1
- package/dist/runtime/assets/styles/tokens.css +1 -1
- package/dist/runtime/components/A11yPanel.vue +5 -2
- package/dist/runtime/components/TermsGate.vue +307 -0
- package/dist/runtime/composables/useTheme.d.ts +1 -1
- package/dist/runtime/composables/useTheme.js +2 -1
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--sidebar-w:220px;--sidebar-collapsed-w:56px;--rsidebar-w:280px;--rsidebar-collapsed-w:76px;--topbar-h:56px;--topbar-merged-h:0px;--tabs-h:46px;--analysis-header-h:124px;--sourcebar-h:38px;--filterbar-h:56px;--color-primary:#2100ad;--color-primary-hover:#1a0088;--color-secondary:#6b3fff;--color-accent-soft:#b485ff;--color-violet-pale:#d6ccff;--color-healthcare:#4164ee;--color-discovery:#07816f;--color-pharma:#f7520e;--color-databank:#e04380;--color-healthcare-active:#3451d4;--color-discovery-active:#066b5c;--color-pharma-active:#d9470c;--color-databank-active:#c73a6f;--color-pharma-soft:#ff7942;--healthcare-rgb:65,100,238;--discovery-rgb:7,129,111;--pharma-rgb:247,82,14;--databank-rgb:224,67,128;--surface-rgb:255,255,255;--shadow-rgb:30,41,59;--color-accent-teal:#00d4a8;--color-notification:#e59;--color-text-inverse:#fff;--color-success:#16a34a;--color-success-bg:#dcfce7;--color-warning:#d97706;--color-warning-bg:#fef3c7;--color-danger:#dc2626;--color-danger-bg:#fee2e2;--color-info:#4164ee;--color-info-bg:#dbeafe;--bg-app:#eef1f5;--bg-surface:#fff;--bg-surface-2:#fbfbfd;--bg-surface-3:#f5f5f9;--bg-hover:#eef1fe;--border-default:#dbdef0;--border-soft:#f0f1f7;--text-primary:#1e293b;--text-secondary:#525670;--text-muted:#878ca6;--brand-rgb:33,0,173;--chart-cat-1:#2100ad;--chart-cat-2:#00a38e;--chart-cat-3:#e67e22;--chart-cat-4:#d63384;--chart-cat-5:#4164ee;--chart-cat-6:#16a34a;--space-2:2px;--space-4:4px;--space-6:6px;--space-8:8px;--space-10:10px;--space-12:12px;--space-16:16px;--space-20:20px;--space-24:24px;--space-32:32px;--space-40:40px;--space-48:48px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:10px;--radius-2xl:12px;--radius-pill:999px;--font-10:10px;--font-11:11px;--font-12:12px;--font-13:13px;--font-14:14px;--font-16:16px;--font-18:18px;--font-22:22px;--font-24:24px;--font-32:32px;--weight-normal:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--font-serif:"Caudex",Georgia,serif;--font-sans:"Figtree",system-ui,sans-serif;--font-mono:"SF Mono",Menlo,monospace;--shadow-xs:0 1px 2px rgba(30,41,59,.04);--shadow-sm:0 2px 6px rgba(30,41,59,.06),0 1px 2px rgba(30,41,59,.03);--shadow-md:0 4px 12px rgba(30,41,59,.06),0 1px 3px rgba(30,41,59,.04);--shadow-lg:0 8px 24px rgba(30,41,59,.12);--shadow-focus:0 0 0 3px rgba(107,63,255,.14);--duration-instant:100ms;--duration-fast:150ms;--duration-base:240ms;--duration-slow:400ms;--duration-slowest:600ms;--ease-out:cubic-bezier(.2,0,0,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--ease-spring:cubic-bezier(.5,1.6,.4,1);--z-base:1;--z-sticky:20;--z-header:30;--z-drawer:40;--z-modal:50;--z-toast:60;--z-help:70}body.night{--color-primary:#9b7cff;--color-secondary:#b485ff;--color-accent-soft:#d6ccff;--color-healthcare:#7aa0ff;--color-discovery:#2ecc71;--color-pharma:#ff8c00;--color-databank:#f472b6;--color-healthcare-active:#4164ee;--color-discovery-active:#07816f;--color-pharma-active:#f7520e;--color-databank-active:#e04380;--healthcare-rgb:122,160,255;--discovery-rgb:46,204,113;--pharma-rgb:255,140,0;--databank-rgb:244,114,182;--surface-rgb:26,26,36;--shadow-rgb:0,0,0;--bg-app:#0e0e14;--bg-surface:#1a1a24;--bg-surface-2:#232330;--bg-surface-3:#2a2a38;--bg-hover:#2d2a42;--border-default:#45455c;--border-soft:#32323f;--text-primary:#f5f6fa;--text-secondary:#cfd3e5;--text-muted:#8a90a8;--brand-rgb:155,124,255;--color-success:#6fe8c5;--color-success-bg:rgba(0,212,168,.18);--color-warning:#fbbf24;--color-warning-bg:rgba(245,158,11,.18);--color-danger:#fca5a5;--color-danger-bg:rgba(239,68,68,.18);--color-info:#7aa0ff;--color-info-bg:rgba(65,100,238,.18);--chart-cat-1:#9b7cff;--chart-cat-2:#6fe8c5;--chart-cat-3:#fbbf24;--chart-cat-4:#f472b6;--chart-cat-5:#7b9ef5;--chart-cat-6:#bef264;background:var(--bg-app);color:var(--text-primary);color-scheme:dark}body.text-large{--font-10:11px;--font-11:12px;--font-12:13px;--font-13:15px;--font-14:16px;--font-16:18px;--font-18:20px;--font-22:25px;--font-24:27px;--font-32:36px}body.text-xl{--font-10:12px;--font-11:13px;--font-12:15px;--font-13:16px;--font-14:18px;--font-16:20px;--font-18:22px;--font-22:28px;--font-24:30px;--font-32:40px}body.density-compact{--space-4:3px;--space-6:4px;--space-8:6px;--space-10:8px;--space-12:9px;--space-16:12px;--space-20:15px;--space-24:18px;--space-32:24px;--space-40:30px;--space-48:36px}body.high-contrast:not(.night){--text-primary:#000;--text-secondary:#1a1a24;--text-muted:#2f2f40;--border-default:#000;--border-soft:#525670;--bg-app:#fff;--bg-surface:#fff;--bg-surface-2:#fff;--bg-surface-3:#f0f1f7;--bg-hover:#ffe56b;--color-primary:#1100a0;--color-primary-hover:#0a0070;--color-secondary:#5028d8;--color-success:#006b2c;--color-warning:#8c4500;--color-danger:#a60000;--color-info:#0040c8}body.night.high-contrast{--text-primary:#fff;--text-secondary:#f5f6fa;--text-muted:#cfd3e5;--border-default:#fff;--border-soft:#b8bcd0;--bg-app:#000;--bg-surface:#000;--bg-surface-2:#000;--bg-surface-3:#000;--bg-hover:#ffe56b;--color-primary:#d6ccff;--color-primary-hover:#fff;--color-secondary:#e5daff;--color-accent-soft:#fff;--color-success:#6fe8c5;--color-warning:#fbbf24;--color-danger:#fca5a5;--color-info:#7aa0ff;--brand-rgb:214,204,255}body.reduce-motion *,body.reduce-motion :after,body.reduce-motion :before{animation:none!important;scroll-behavior:auto!important;transition:none!important}body.cvd-deutera .pane,body.cvd-deutera .rm-cvd-target,body.cvd-deutera .rm-shell,body.cvd-deutera .rsidebar,body.cvd-deutera .sidebar,body.cvd-deutera>.rm-action-bar__overlay,body.cvd-deutera>.rm-drawer,body.cvd-deutera>.rm-drawer-overlay,body.cvd-deutera>.rm-modal-overlay{filter:url(#a11y-deutera)}body.cvd-protan .pane,body.cvd-protan .rm-cvd-target,body.cvd-protan .rm-shell,body.cvd-protan .rsidebar,body.cvd-protan .sidebar,body.cvd-protan>.rm-action-bar__overlay,body.cvd-protan>.rm-drawer,body.cvd-protan>.rm-drawer-overlay,body.cvd-protan>.rm-modal-overlay{filter:url(#a11y-protan)}body.cvd-tritan .pane,body.cvd-tritan .rm-cvd-target,body.cvd-tritan .rm-shell,body.cvd-tritan .rsidebar,body.cvd-tritan .sidebar,body.cvd-tritan>.rm-action-bar__overlay,body.cvd-tritan>.rm-drawer,body.cvd-tritan>.rm-drawer-overlay,body.cvd-tritan>.rm-modal-overlay{filter:url(#a11y-tritan)}body.cvd-mono .pane,body.cvd-mono .rm-cvd-target,body.cvd-mono .rm-shell,body.cvd-mono .rsidebar,body.cvd-mono .sidebar,body.cvd-mono>.rm-action-bar__overlay,body.cvd-mono>.rm-drawer,body.cvd-mono>.rm-drawer-overlay,body.cvd-mono>.rm-modal-overlay{filter:url(#a11y-mono)}:root{--r-color-primary-50:#f0f4ff;--r-color-primary-100:#dce5fd;--r-color-primary-200:#b9cbfb;--r-color-primary-300:#96b0f9;--r-color-primary-400:#7395f5;--r-color-primary-500:#5a7ef2;--r-color-primary-600:var(--color-healthcare);--r-color-primary-700:#3451d4;--r-color-primary-800:#283fb0;--r-color-primary-900:#1c2d8a;--r-color-gray-50:#f9fafb;--r-color-gray-100:#f3f4f6;--r-color-gray-200:#e5e7eb;--r-color-gray-300:#d1d5db;--r-color-gray-400:#9ca3af;--r-color-gray-500:#6b7280;--r-color-gray-600:#4b5563;--r-color-gray-700:#374151;--r-color-gray-800:#1f2937;--r-color-gray-900:#111827;--r-color-gray-950:#030712;--r-color-success-500:var(--color-success);--r-color-success-600:#16a34a;--r-color-warning-500:#f59e0b;--r-color-warning-600:var(--color-warning);--r-color-danger-500:#ef4444;--r-color-danger-600:var(--color-danger);--r-color-white:#fff;--r-color-black:#000;--r-font-family:var(--font-sans);--r-font-mono:var(--font-mono);--r-text-xs:0.75rem;--r-text-sm:0.875rem;--r-text-base:1rem;--r-text-lg:1.125rem;--r-text-xl:1.25rem;--r-text-2xl:1.5rem;--r-text-3xl:1.875rem;--r-text-4xl:2.25rem;--r-font-weight-normal:var(--weight-normal);--r-font-weight-medium:var(--weight-medium);--r-font-weight-semibold:var(--weight-semibold);--r-font-weight-bold:var(--weight-bold);--r-leading-tight:1.25;--r-leading-normal:1.5;--r-leading-relaxed:1.75;--r-space-0:0;--r-space-1:var(--space-4);--r-space-2:var(--space-8);--r-space-3:var(--space-12);--r-space-4:var(--space-16);--r-space-5:var(--space-20);--r-space-6:var(--space-24);--r-space-8:var(--space-32);--r-space-10:var(--space-40);--r-space-12:var(--space-48);--r-radius-none:0;--r-radius-sm:var(--radius-sm);--r-radius-md:var(--radius-md);--r-radius-lg:var(--radius-lg);--r-radius-xl:0.75rem;--r-radius-2xl:1rem;--r-radius-full:var(--radius-pill);--r-shadow-xs:0 1px 2px 0 rgba(0,0,0,.05);--r-shadow-sm:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--r-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--r-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--r-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--r-transition-fast:var(--duration-fast) var(--ease-in-out);--r-transition-base:200ms var(--ease-in-out);--r-transition-slow:var(--duration-slow) var(--ease-in-out)}
|
|
1
|
+
:root{--sidebar-w:220px;--sidebar-collapsed-w:56px;--rsidebar-w:280px;--rsidebar-collapsed-w:76px;--topbar-h:56px;--topbar-merged-h:0px;--tabs-h:46px;--analysis-header-h:124px;--sourcebar-h:38px;--filterbar-h:56px;--color-primary:#2100ad;--color-primary-hover:#1a0088;--color-secondary:#6b3fff;--color-accent-soft:#b485ff;--color-violet-pale:#d6ccff;--color-healthcare:#4164ee;--color-discovery:#07816f;--color-pharma:#f7520e;--color-databank:#e04380;--color-healthcare-active:#3451d4;--color-discovery-active:#066b5c;--color-pharma-active:#d9470c;--color-databank-active:#c73a6f;--color-pharma-soft:#ff7942;--healthcare-rgb:65,100,238;--discovery-rgb:7,129,111;--pharma-rgb:247,82,14;--databank-rgb:224,67,128;--surface-rgb:255,255,255;--shadow-rgb:30,41,59;--color-accent-teal:#00d4a8;--color-notification:#e59;--color-text-inverse:#fff;--color-success:#16a34a;--color-success-bg:#dcfce7;--color-warning:#d97706;--color-warning-bg:#fef3c7;--color-danger:#dc2626;--color-danger-bg:#fee2e2;--color-info:#4164ee;--color-info-bg:#dbeafe;--bg-app:#eef1f5;--bg-surface:#fff;--bg-surface-2:#fbfbfd;--bg-surface-3:#f5f5f9;--bg-hover:#eef1fe;--border-default:#dbdef0;--border-soft:#f0f1f7;--text-primary:#1e293b;--text-secondary:#525670;--text-muted:#878ca6;--brand-rgb:33,0,173;--chart-cat-1:#2100ad;--chart-cat-2:#00a38e;--chart-cat-3:#e67e22;--chart-cat-4:#d63384;--chart-cat-5:#4164ee;--chart-cat-6:#16a34a;--space-2:2px;--space-4:4px;--space-6:6px;--space-8:8px;--space-10:10px;--space-12:12px;--space-16:16px;--space-20:20px;--space-24:24px;--space-32:32px;--space-40:40px;--space-48:48px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:10px;--radius-2xl:12px;--radius-pill:999px;--font-10:10px;--font-11:11px;--font-12:12px;--font-13:13px;--font-14:14px;--font-16:16px;--font-18:18px;--font-22:22px;--font-24:24px;--font-32:32px;--weight-normal:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--font-serif:"Caudex",Georgia,serif;--font-sans:"Figtree",system-ui,sans-serif;--font-mono:"SF Mono",Menlo,monospace;--shadow-xs:0 1px 2px rgba(30,41,59,.04);--shadow-sm:0 2px 6px rgba(30,41,59,.06),0 1px 2px rgba(30,41,59,.03);--shadow-md:0 4px 12px rgba(30,41,59,.06),0 1px 3px rgba(30,41,59,.04);--shadow-lg:0 8px 24px rgba(30,41,59,.12);--shadow-focus:0 0 0 3px rgba(107,63,255,.14);--duration-instant:100ms;--duration-fast:150ms;--duration-base:240ms;--duration-slow:400ms;--duration-slowest:600ms;--ease-out:cubic-bezier(.2,0,0,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--ease-spring:cubic-bezier(.5,1.6,.4,1);--z-base:1;--z-sticky:20;--z-header:30;--z-drawer:40;--z-modal:50;--z-toast:60;--z-help:70}body.night{--color-primary:#9b7cff;--color-secondary:#b485ff;--color-accent-soft:#d6ccff;--color-healthcare:#7aa0ff;--color-discovery:#2ecc71;--color-pharma:#ff8c00;--color-databank:#f472b6;--color-healthcare-active:#4164ee;--color-discovery-active:#07816f;--color-pharma-active:#f7520e;--color-databank-active:#e04380;--healthcare-rgb:122,160,255;--discovery-rgb:46,204,113;--pharma-rgb:255,140,0;--databank-rgb:244,114,182;--surface-rgb:26,26,36;--shadow-rgb:0,0,0;--bg-app:#0e0e14;--bg-surface:#1a1a24;--bg-surface-2:#232330;--bg-surface-3:#2a2a38;--bg-hover:#2d2a42;--border-default:#45455c;--border-soft:#32323f;--text-primary:#f5f6fa;--text-secondary:#cfd3e5;--text-muted:#8a90a8;--brand-rgb:155,124,255;--color-success:#6fe8c5;--color-success-bg:rgba(0,212,168,.18);--color-warning:#fbbf24;--color-warning-bg:rgba(245,158,11,.18);--color-danger:#fca5a5;--color-danger-bg:rgba(239,68,68,.18);--color-info:#7aa0ff;--color-info-bg:rgba(65,100,238,.18);--chart-cat-1:#9b7cff;--chart-cat-2:#6fe8c5;--chart-cat-3:#fbbf24;--chart-cat-4:#f472b6;--chart-cat-5:#7b9ef5;--chart-cat-6:#bef264;background:var(--bg-app);color:var(--text-primary);color-scheme:dark}body.text-small{--font-10:9px;--font-11:10px;--font-12:11px;--font-13:12px;--font-14:13px;--font-16:15px;--font-18:17px;--font-22:20px;--font-24:22px;--font-32:29px}body.text-large{--font-10:11px;--font-11:12px;--font-12:13px;--font-13:15px;--font-14:16px;--font-16:18px;--font-18:20px;--font-22:25px;--font-24:27px;--font-32:36px}body.text-xl{--font-10:12px;--font-11:13px;--font-12:15px;--font-13:16px;--font-14:18px;--font-16:20px;--font-18:22px;--font-22:28px;--font-24:30px;--font-32:40px}body.density-compact{--space-4:3px;--space-6:4px;--space-8:6px;--space-10:8px;--space-12:9px;--space-16:12px;--space-20:15px;--space-24:18px;--space-32:24px;--space-40:30px;--space-48:36px}body.high-contrast:not(.night){--text-primary:#000;--text-secondary:#1a1a24;--text-muted:#2f2f40;--border-default:#000;--border-soft:#525670;--bg-app:#fff;--bg-surface:#fff;--bg-surface-2:#fff;--bg-surface-3:#f0f1f7;--bg-hover:#ffe56b;--color-primary:#1100a0;--color-primary-hover:#0a0070;--color-secondary:#5028d8;--color-success:#006b2c;--color-warning:#8c4500;--color-danger:#a60000;--color-info:#0040c8}body.night.high-contrast{--text-primary:#fff;--text-secondary:#f5f6fa;--text-muted:#cfd3e5;--border-default:#fff;--border-soft:#b8bcd0;--bg-app:#000;--bg-surface:#000;--bg-surface-2:#000;--bg-surface-3:#000;--bg-hover:#ffe56b;--color-primary:#d6ccff;--color-primary-hover:#fff;--color-secondary:#e5daff;--color-accent-soft:#fff;--color-success:#6fe8c5;--color-warning:#fbbf24;--color-danger:#fca5a5;--color-info:#7aa0ff;--brand-rgb:214,204,255}body.reduce-motion *,body.reduce-motion :after,body.reduce-motion :before{animation:none!important;scroll-behavior:auto!important;transition:none!important}body.cvd-deutera .pane,body.cvd-deutera .rm-cvd-target,body.cvd-deutera .rm-shell,body.cvd-deutera .rsidebar,body.cvd-deutera .sidebar,body.cvd-deutera>.rm-action-bar__overlay,body.cvd-deutera>.rm-drawer,body.cvd-deutera>.rm-drawer-overlay,body.cvd-deutera>.rm-modal-overlay{filter:url(#a11y-deutera)}body.cvd-protan .pane,body.cvd-protan .rm-cvd-target,body.cvd-protan .rm-shell,body.cvd-protan .rsidebar,body.cvd-protan .sidebar,body.cvd-protan>.rm-action-bar__overlay,body.cvd-protan>.rm-drawer,body.cvd-protan>.rm-drawer-overlay,body.cvd-protan>.rm-modal-overlay{filter:url(#a11y-protan)}body.cvd-tritan .pane,body.cvd-tritan .rm-cvd-target,body.cvd-tritan .rm-shell,body.cvd-tritan .rsidebar,body.cvd-tritan .sidebar,body.cvd-tritan>.rm-action-bar__overlay,body.cvd-tritan>.rm-drawer,body.cvd-tritan>.rm-drawer-overlay,body.cvd-tritan>.rm-modal-overlay{filter:url(#a11y-tritan)}body.cvd-mono .pane,body.cvd-mono .rm-cvd-target,body.cvd-mono .rm-shell,body.cvd-mono .rsidebar,body.cvd-mono .sidebar,body.cvd-mono>.rm-action-bar__overlay,body.cvd-mono>.rm-drawer,body.cvd-mono>.rm-drawer-overlay,body.cvd-mono>.rm-modal-overlay{filter:url(#a11y-mono)}:root{--r-color-primary-50:#f0f4ff;--r-color-primary-100:#dce5fd;--r-color-primary-200:#b9cbfb;--r-color-primary-300:#96b0f9;--r-color-primary-400:#7395f5;--r-color-primary-500:#5a7ef2;--r-color-primary-600:var(--color-healthcare);--r-color-primary-700:#3451d4;--r-color-primary-800:#283fb0;--r-color-primary-900:#1c2d8a;--r-color-gray-50:#f9fafb;--r-color-gray-100:#f3f4f6;--r-color-gray-200:#e5e7eb;--r-color-gray-300:#d1d5db;--r-color-gray-400:#9ca3af;--r-color-gray-500:#6b7280;--r-color-gray-600:#4b5563;--r-color-gray-700:#374151;--r-color-gray-800:#1f2937;--r-color-gray-900:#111827;--r-color-gray-950:#030712;--r-color-success-500:var(--color-success);--r-color-success-600:#16a34a;--r-color-warning-500:#f59e0b;--r-color-warning-600:var(--color-warning);--r-color-danger-500:#ef4444;--r-color-danger-600:var(--color-danger);--r-color-white:#fff;--r-color-black:#000;--r-font-family:var(--font-sans);--r-font-mono:var(--font-mono);--r-text-xs:0.75rem;--r-text-sm:0.875rem;--r-text-base:1rem;--r-text-lg:1.125rem;--r-text-xl:1.25rem;--r-text-2xl:1.5rem;--r-text-3xl:1.875rem;--r-text-4xl:2.25rem;--r-font-weight-normal:var(--weight-normal);--r-font-weight-medium:var(--weight-medium);--r-font-weight-semibold:var(--weight-semibold);--r-font-weight-bold:var(--weight-bold);--r-leading-tight:1.25;--r-leading-normal:1.5;--r-leading-relaxed:1.75;--r-space-0:0;--r-space-1:var(--space-4);--r-space-2:var(--space-8);--r-space-3:var(--space-12);--r-space-4:var(--space-16);--r-space-5:var(--space-20);--r-space-6:var(--space-24);--r-space-8:var(--space-32);--r-space-10:var(--space-40);--r-space-12:var(--space-48);--r-radius-none:0;--r-radius-sm:var(--radius-sm);--r-radius-md:var(--radius-md);--r-radius-lg:var(--radius-lg);--r-radius-xl:0.75rem;--r-radius-2xl:1rem;--r-radius-full:var(--radius-pill);--r-shadow-xs:0 1px 2px 0 rgba(0,0,0,.05);--r-shadow-sm:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--r-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--r-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--r-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--r-transition-fast:var(--duration-fast) var(--ease-in-out);--r-transition-base:200ms var(--ease-in-out);--r-transition-slow:var(--duration-slow) var(--ease-in-out)}
|
|
@@ -60,7 +60,8 @@ const WORDS = {
|
|
|
60
60
|
fr: {
|
|
61
61
|
intro: "Adaptez l'affichage à votre besoin. Les changements s'appliquent en temps réel à tout le dashboard et sont mémorisés pour vos prochaines sessions.",
|
|
62
62
|
text: 'Taille du texte',
|
|
63
|
-
textDesc: '
|
|
63
|
+
textDesc: 'Règle la taille des titres, des valeurs KPI, des libellés et des tables.',
|
|
64
|
+
textSmall: 'Petit',
|
|
64
65
|
textNormal: 'Standard',
|
|
65
66
|
textLarge: 'Large',
|
|
66
67
|
textXl: 'Très large',
|
|
@@ -86,7 +87,8 @@ const WORDS = {
|
|
|
86
87
|
en: {
|
|
87
88
|
intro: 'Adjust the display to suit you. Changes apply across the dashboard right away and are remembered for your next sessions.',
|
|
88
89
|
text: 'Text size',
|
|
89
|
-
textDesc: '
|
|
90
|
+
textDesc: 'Sets the size of titles, KPI values, labels and tables.',
|
|
91
|
+
textSmall: 'Small',
|
|
90
92
|
textNormal: 'Standard',
|
|
91
93
|
textLarge: 'Large',
|
|
92
94
|
textXl: 'Extra large',
|
|
@@ -116,6 +118,7 @@ const T = computed(() => WORDS[props.lang] ?? WORDS.fr)
|
|
|
116
118
|
/* Les quatre simulations gardent leur nom court, le meme en francais et en
|
|
117
119
|
anglais : ce sont les noms des deficiences, pas des libelles a traduire. */
|
|
118
120
|
const textOptions = computed(() => [
|
|
121
|
+
{ value: 'small', label: T.value.textSmall },
|
|
119
122
|
{ value: 'normal', label: T.value.textNormal },
|
|
120
123
|
{ value: 'large', label: T.value.textLarge },
|
|
121
124
|
{ value: 'xl', label: T.value.textXl },
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
RmTermsGate - conditions d'utilisation a accepter avant d'entrer.
|
|
3
|
+
|
|
4
|
+
Surface bloquante posee une fois dans l'application. Elle parait a la
|
|
5
|
+
premiere connexion, puis a chaque nouvelle version publiee, et ne se ferme
|
|
6
|
+
que par l'acceptation ou le refus. Le refus n'est pas une fermeture : il
|
|
7
|
+
emet `declined`, a l'application de deconnecter.
|
|
8
|
+
|
|
9
|
+
Elle ne sait ni s'authentifier ni appeler un serveur : l'application fournit
|
|
10
|
+
son propre client par `api`, ce qui laisse le composant hors de toute
|
|
11
|
+
plomberie d'authentification et permet de le monter dans n'importe quel
|
|
12
|
+
portail.
|
|
13
|
+
|
|
14
|
+
Les pages `/auth` sont sautees expres : l'accueil de premiere connexion y
|
|
15
|
+
vit deja, et deux ecrans bloquants se superposeraient.
|
|
16
|
+
|
|
17
|
+
ORIGINE AURIGA
|
|
18
|
+
--------------
|
|
19
|
+
Remplace `<arg-terms-gate>` (`argTermsGate.vue`). Les props et les
|
|
20
|
+
evenements gardent leur nom, `lang` est nouveau :
|
|
21
|
+
|
|
22
|
+
| Auriga | Romulus | Note |
|
|
23
|
+
|------------|------------|--------------------------------------------|
|
|
24
|
+
| `api` | `api` | meme contrat : `get()` et `accept(id)` |
|
|
25
|
+
| `enabled` | `enabled` | inchange |
|
|
26
|
+
| - | `lang` | Auriga n'ecrivait qu'en anglais |
|
|
27
|
+
| `@accepted`| `@accepted`| meme charge `{ version }` |
|
|
28
|
+
| `@declined`| `@declined`| inchange |
|
|
29
|
+
|
|
30
|
+
Repris a l'occasion : les couleurs viennent des tokens et non des variables
|
|
31
|
+
Auriga (`--primary`, `--darkest`, `--white`), `--z-modal` remplace le `1000`
|
|
32
|
+
en dur, la carte est un vrai `role="dialog"` avec piege a focus, et le
|
|
33
|
+
bouton de refus n'est plus un `<button>` nu sans etat visible.
|
|
34
|
+
-->
|
|
35
|
+
<script setup lang="ts">
|
|
36
|
+
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
|
37
|
+
import { useRoute } from '#app'
|
|
38
|
+
import { useRmDialog } from '../composables/useRmDialog'
|
|
39
|
+
|
|
40
|
+
/** Une version publiee des conditions, telle que l'API la rend. */
|
|
41
|
+
export interface RmTermsVersion {
|
|
42
|
+
id: string
|
|
43
|
+
version: string
|
|
44
|
+
title: string | null
|
|
45
|
+
url: string
|
|
46
|
+
summary: string | null
|
|
47
|
+
publishedAt: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Ce que l'application doit savoir faire pour alimenter la porte. */
|
|
51
|
+
export interface RmTermsApi {
|
|
52
|
+
get: () => Promise<{
|
|
53
|
+
current: RmTermsVersion | null
|
|
54
|
+
accepted: boolean
|
|
55
|
+
previouslyAccepted?: boolean
|
|
56
|
+
}>
|
|
57
|
+
accept: (termsVersionId: string) => Promise<unknown>
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const props = withDefaults(
|
|
61
|
+
defineProps<{
|
|
62
|
+
/** Client de l'application. Voir `RmTermsApi`. */
|
|
63
|
+
api: RmTermsApi
|
|
64
|
+
/** Ne consulter l'API qu'une fois le lecteur authentifie. */
|
|
65
|
+
enabled?: boolean
|
|
66
|
+
lang?: 'fr' | 'en'
|
|
67
|
+
}>(),
|
|
68
|
+
{ enabled: true, lang: 'fr' },
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
const emit = defineEmits<{
|
|
72
|
+
accepted: [payload: { version: string }]
|
|
73
|
+
declined: []
|
|
74
|
+
}>()
|
|
75
|
+
|
|
76
|
+
const WORDS = {
|
|
77
|
+
fr: {
|
|
78
|
+
eyebrow: 'Conditions d’utilisation',
|
|
79
|
+
eyebrowUpdated: 'Conditions d’utilisation mises à jour',
|
|
80
|
+
title: 'Avant de continuer',
|
|
81
|
+
titleUpdated: 'Merci de relire les nouvelles conditions',
|
|
82
|
+
intro: 'Merci de lire et d’accepter nos conditions d’utilisation pour commencer à utiliser la plateforme.',
|
|
83
|
+
introUpdated: 'Nos conditions d’utilisation ont changé. Merci de lire et d’accepter la nouvelle version pour continuer à utiliser la plateforme.',
|
|
84
|
+
fallbackTitle: 'Conditions d’utilisation',
|
|
85
|
+
version: 'Version',
|
|
86
|
+
read: 'Lire le document complet',
|
|
87
|
+
check: 'J’ai lu et j’accepte les conditions d’utilisation.',
|
|
88
|
+
accept: 'Accepter et continuer',
|
|
89
|
+
saving: 'Enregistrement…',
|
|
90
|
+
decline: 'Refuser et se déconnecter',
|
|
91
|
+
stale: 'Une version plus récente vient d’être publiée. Rechargement…',
|
|
92
|
+
failed: 'Impossible d’enregistrer votre acceptation. Merci de réessayer.',
|
|
93
|
+
},
|
|
94
|
+
en: {
|
|
95
|
+
eyebrow: 'Terms of use',
|
|
96
|
+
eyebrowUpdated: 'Terms of use updated',
|
|
97
|
+
title: 'Before you continue',
|
|
98
|
+
titleUpdated: 'Please review the new terms',
|
|
99
|
+
intro: 'Please read and accept our terms of use to start using the platform.',
|
|
100
|
+
introUpdated: 'Our terms of use have changed. Please read and accept the new version to keep using the platform.',
|
|
101
|
+
fallbackTitle: 'Terms of use',
|
|
102
|
+
version: 'Version',
|
|
103
|
+
read: 'Read the full document',
|
|
104
|
+
check: 'I have read and I accept the terms of use.',
|
|
105
|
+
accept: 'Accept and continue',
|
|
106
|
+
saving: 'Saving…',
|
|
107
|
+
decline: 'Decline and sign out',
|
|
108
|
+
stale: 'A newer version was just published. Reloading…',
|
|
109
|
+
failed: 'Could not record your acceptance. Please try again.',
|
|
110
|
+
},
|
|
111
|
+
} as const
|
|
112
|
+
|
|
113
|
+
const t = computed(() => WORDS[props.lang] ?? WORDS.fr)
|
|
114
|
+
|
|
115
|
+
/** Par onglet : une fois accepte, ne pas rappeler l'API a chaque navigation. */
|
|
116
|
+
const CACHE_KEY = 'terms_accepted'
|
|
117
|
+
|
|
118
|
+
/** Les pages d'authentification ont leurs propres ecrans bloquants. */
|
|
119
|
+
const IGNORED_PREFIX = '/auth'
|
|
120
|
+
|
|
121
|
+
const route = useRoute()
|
|
122
|
+
const open = ref(false)
|
|
123
|
+
const terms = ref<RmTermsVersion | null>(null)
|
|
124
|
+
const updated = ref(false)
|
|
125
|
+
const checked = ref(false)
|
|
126
|
+
const saving = ref(false)
|
|
127
|
+
const error = ref('')
|
|
128
|
+
const surface = ref<HTMLElement | null>(null)
|
|
129
|
+
|
|
130
|
+
// Le piege a focus et le retour du focus a la fermeture viennent de la, mais
|
|
131
|
+
// pas `Escape` : une porte qui se ferme sur une touche ne bloque rien.
|
|
132
|
+
useRmDialog({ open, surface, close: () => {} })
|
|
133
|
+
|
|
134
|
+
const publishedLabel = computed(() => {
|
|
135
|
+
if (!terms.value?.publishedAt) return ''
|
|
136
|
+
const date = new Date(terms.value.publishedAt)
|
|
137
|
+
return Number.isNaN(date.getTime())
|
|
138
|
+
? ''
|
|
139
|
+
: date.toLocaleDateString(props.lang === 'fr' ? 'fr-FR' : 'en-GB')
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
function cache(value: boolean) {
|
|
143
|
+
try {
|
|
144
|
+
if (value) sessionStorage.setItem(CACHE_KEY, '1')
|
|
145
|
+
else sessionStorage.removeItem(CACHE_KEY)
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// navigation privee ou stockage coupe : on redemandera au prochain passage
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function cached() {
|
|
153
|
+
try {
|
|
154
|
+
return !!sessionStorage.getItem(CACHE_KEY)
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async function check() {
|
|
162
|
+
if (!import.meta.client || !props.enabled || open.value || cached()) return
|
|
163
|
+
if (route.path.startsWith(IGNORED_PREFIX)) return
|
|
164
|
+
try {
|
|
165
|
+
const status = await props.api.get()
|
|
166
|
+
if (status?.accepted) {
|
|
167
|
+
cache(true)
|
|
168
|
+
return
|
|
169
|
+
}
|
|
170
|
+
// Rien de publie : personne n'est arrete.
|
|
171
|
+
if (!status?.current) return
|
|
172
|
+
terms.value = status.current
|
|
173
|
+
updated.value = !!status.previouslyAccepted
|
|
174
|
+
open.value = true
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Au mieux : une panne passagere de l'API ne doit pas enfermer le lecteur
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function accept() {
|
|
182
|
+
if (!terms.value || !checked.value) return
|
|
183
|
+
error.value = ''
|
|
184
|
+
saving.value = true
|
|
185
|
+
try {
|
|
186
|
+
await props.api.accept(terms.value.id)
|
|
187
|
+
cache(true)
|
|
188
|
+
open.value = false
|
|
189
|
+
emit('accepted', { version: terms.value.version })
|
|
190
|
+
}
|
|
191
|
+
catch (e: any) {
|
|
192
|
+
const code = e?.statusCode || e?.response?.status
|
|
193
|
+
if (code === 409) {
|
|
194
|
+
// Une version plus recente est arrivee pendant que la porte etait ouverte
|
|
195
|
+
error.value = t.value.stale
|
|
196
|
+
setTimeout(() => window.location.reload(), 1200)
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
error.value = e?.data?.message || t.value.failed
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
saving.value = false
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function decline() {
|
|
208
|
+
cache(false)
|
|
209
|
+
emit('declined')
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Rien ne doit defiler derriere une surface qui bloque l'application.
|
|
213
|
+
let previousOverflow = ''
|
|
214
|
+
watch(open, (value) => {
|
|
215
|
+
if (!import.meta.client) return
|
|
216
|
+
if (value) {
|
|
217
|
+
previousOverflow = document.body.style.overflow
|
|
218
|
+
document.body.style.overflow = 'hidden'
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
document.body.style.overflow = previousOverflow
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
watch(() => props.enabled, check)
|
|
226
|
+
watch(() => route.path, check)
|
|
227
|
+
onMounted(check)
|
|
228
|
+
onBeforeUnmount(() => {
|
|
229
|
+
if (import.meta.client && open.value) document.body.style.overflow = previousOverflow
|
|
230
|
+
})
|
|
231
|
+
</script>
|
|
232
|
+
|
|
233
|
+
<template>
|
|
234
|
+
<Teleport to="body">
|
|
235
|
+
<div v-if="open" class="rm-terms-gate">
|
|
236
|
+
<div
|
|
237
|
+
ref="surface"
|
|
238
|
+
class="rm-terms-gate__card"
|
|
239
|
+
role="dialog"
|
|
240
|
+
aria-modal="true"
|
|
241
|
+
aria-labelledby="rm-terms-gate-title"
|
|
242
|
+
>
|
|
243
|
+
<span class="rm-terms-gate__eyebrow">
|
|
244
|
+
{{ updated ? t.eyebrowUpdated : t.eyebrow }}
|
|
245
|
+
</span>
|
|
246
|
+
|
|
247
|
+
<h2 id="rm-terms-gate-title" class="rm-terms-gate__title">
|
|
248
|
+
{{ updated ? t.titleUpdated : t.title }}
|
|
249
|
+
</h2>
|
|
250
|
+
|
|
251
|
+
<p class="rm-terms-gate__intro">
|
|
252
|
+
{{ updated ? t.introUpdated : t.intro }}
|
|
253
|
+
</p>
|
|
254
|
+
|
|
255
|
+
<div class="rm-terms-gate__doc">
|
|
256
|
+
<div class="rm-terms-gate__doc-head">
|
|
257
|
+
<strong>{{ terms?.title || t.fallbackTitle }}</strong>
|
|
258
|
+
<span class="rm-terms-gate__version">
|
|
259
|
+
{{ t.version }} {{ terms?.version
|
|
260
|
+
}}<template v-if="publishedLabel">, {{ publishedLabel }}</template>
|
|
261
|
+
</span>
|
|
262
|
+
</div>
|
|
263
|
+
<p v-if="terms?.summary" class="rm-terms-gate__summary">{{ terms.summary }}</p>
|
|
264
|
+
<a
|
|
265
|
+
v-if="terms?.url"
|
|
266
|
+
:href="terms.url"
|
|
267
|
+
target="_blank"
|
|
268
|
+
rel="noopener"
|
|
269
|
+
class="rm-terms-gate__link"
|
|
270
|
+
>
|
|
271
|
+
{{ t.read }}
|
|
272
|
+
<RmIcon name="ArrowSquareOut" :size="14" color="var(--color-primary)" />
|
|
273
|
+
</a>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<label class="rm-terms-gate__check">
|
|
277
|
+
<input v-model="checked" type="checkbox" :disabled="saving">
|
|
278
|
+
<span>{{ t.check }}</span>
|
|
279
|
+
</label>
|
|
280
|
+
|
|
281
|
+
<!-- `alert` et non `status` : l'echec arrete l'action en cours, il doit
|
|
282
|
+
couper ce que le lecteur d'ecran est en train de dire. -->
|
|
283
|
+
<p v-if="error" class="rm-terms-gate__error" role="alert">{{ error }}</p>
|
|
284
|
+
|
|
285
|
+
<RmButton
|
|
286
|
+
variant="primary"
|
|
287
|
+
block
|
|
288
|
+
:disabled="!checked || saving"
|
|
289
|
+
:loading="saving"
|
|
290
|
+
@click="accept"
|
|
291
|
+
>
|
|
292
|
+
{{ saving ? t.saving : t.accept }}
|
|
293
|
+
</RmButton>
|
|
294
|
+
|
|
295
|
+
<div class="rm-terms-gate__decline">
|
|
296
|
+
<RmButton variant="text" block :disabled="saving" @click="decline">
|
|
297
|
+
{{ t.decline }}
|
|
298
|
+
</RmButton>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
</Teleport>
|
|
303
|
+
</template>
|
|
304
|
+
|
|
305
|
+
<style scoped>
|
|
306
|
+
.rm-terms-gate{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.6);display:flex;inset:0;justify-content:center;padding:var(--space-24);position:fixed;z-index:var(--z-modal)}.rm-terms-gate__card{background:var(--bg-surface);border-radius:var(--radius-2xl);box-shadow:var(--shadow-lg);font-family:var(--font-sans);max-height:calc(100vh - 48px);max-width:480px;overflow-y:auto;padding:var(--space-24);width:100%}.rm-terms-gate__eyebrow{color:var(--color-primary);display:inline-block;font-size:var(--font-13);font-weight:600;margin-bottom:var(--space-8)}.rm-terms-gate__title{color:var(--text-primary);font-size:var(--font-18);font-weight:700;margin:0 0 var(--space-8)}.rm-terms-gate__intro{color:var(--text-secondary);font-size:var(--font-14);line-height:1.6;margin:0 0 var(--space-20)}.rm-terms-gate__doc{border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:var(--space-8);margin-bottom:var(--space-16);padding:var(--space-16)}.rm-terms-gate__doc-head{color:var(--text-primary);display:flex;flex-direction:column;font-size:var(--font-14);gap:var(--space-2)}.rm-terms-gate__version{color:var(--text-muted);font-size:var(--font-12);font-weight:400}.rm-terms-gate__summary{color:var(--text-secondary);font-size:var(--font-14);line-height:1.6;margin:0;white-space:pre-line}.rm-terms-gate__link{align-items:center;color:var(--color-primary);display:inline-flex;font-size:var(--font-14);font-weight:600;gap:var(--space-6);text-decoration:none}.rm-terms-gate__link:hover{text-decoration:underline}.rm-terms-gate__check{align-items:flex-start;color:var(--text-primary);cursor:pointer;display:flex;font-size:var(--font-14);gap:var(--space-8);line-height:1.5;margin-bottom:var(--space-16)}.rm-terms-gate__check input{accent-color:var(--color-primary);cursor:pointer;flex-shrink:0;height:18px;margin:2px 0 0;width:18px}.rm-terms-gate__decline{margin-top:var(--space-8)}.rm-terms-gate__error{color:var(--color-danger);font-size:var(--font-13);margin:0 0 var(--space-12)}
|
|
307
|
+
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type RmCvdMode = 'none' | 'deutera' | 'protan' | 'tritan' | 'mono';
|
|
2
2
|
export type RmChartPalette = 'default' | 'cvdSafe';
|
|
3
|
-
export type RmTextScale = 'normal' | 'large' | 'xl';
|
|
3
|
+
export type RmTextScale = 'small' | 'normal' | 'large' | 'xl';
|
|
4
4
|
/**
|
|
5
5
|
* Pose sur `body` les classes enregistrees au dernier passage.
|
|
6
6
|
*
|
|
@@ -7,6 +7,7 @@ const CVD_CLASSES = {
|
|
|
7
7
|
mono: "cvd-mono"
|
|
8
8
|
};
|
|
9
9
|
const TEXT_CLASSES = {
|
|
10
|
+
small: "text-small",
|
|
10
11
|
large: "text-large",
|
|
11
12
|
xl: "text-xl"
|
|
12
13
|
};
|
|
@@ -128,7 +129,7 @@ export function useRomulusTheme() {
|
|
|
128
129
|
compact.value = list.contains("density-compact");
|
|
129
130
|
const found = Object.entries(CVD_CLASSES).find(([, c]) => list.contains(c));
|
|
130
131
|
cvd.value = found ? found[0] : "none";
|
|
131
|
-
textScale.value = list.contains("text-xl") ? "xl" : list.contains("text-large") ? "large" : "normal";
|
|
132
|
+
textScale.value = list.contains("text-xl") ? "xl" : list.contains("text-large") ? "large" : list.contains("text-small") ? "small" : "normal";
|
|
132
133
|
chartPalette.value = list.contains(PALETTE_CLASS) ? "cvdSafe" : "default";
|
|
133
134
|
chartDecal.value = list.contains(DECAL_CLASS);
|
|
134
135
|
});
|