@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 CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16.0"
6
6
  },
7
- "version": "0.1.94",
7
+ "version": "0.1.96",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -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: 'Agrandit les titres, les valeurs KPI, les libellés et les tables.',
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: 'Enlarges titles, KPI values, labels and tables.',
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.95",
3
+ "version": "0.1.97",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",