@tekkare/romulus 0.1.239 → 0.1.241

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.238",
7
+ "version": "0.1.240",
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;--rm-text-c-gray:#6b7280;--rm-text-c-red:#b91c1c;--rm-text-c-orange:#c2410c;--rm-text-c-amber:#a16207;--rm-text-c-green:#15803d;--rm-text-c-teal:#0f766e;--rm-text-c-blue:#1d4ed8;--rm-text-c-violet:#6d28d9;--rm-text-c-pink:#be185d;--rm-text-bg-gray:hsla(220,9%,46%,.16);--rm-text-bg-red:rgba(239,68,68,.18);--rm-text-bg-orange:rgba(249,115,22,.2);--rm-text-bg-amber:rgba(250,204,21,.32);--rm-text-bg-green:rgba(34,197,94,.2);--rm-text-bg-teal:rgba(20,184,166,.2);--rm-text-bg-blue:rgba(59,130,246,.18);--rm-text-bg-violet:rgba(139,92,246,.18);--rm-text-bg-pink:rgba(236,72,153,.18);--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;--rm-text-c-gray:#9ca3af;--rm-text-c-red:#fca5a5;--rm-text-c-orange:#fdba74;--rm-text-c-amber:#fde047;--rm-text-c-green:#86efac;--rm-text-c-teal:#5eead4;--rm-text-c-blue:#93c5fd;--rm-text-c-violet:#c4b5fd;--rm-text-c-pink:#f9a8d4;--rm-text-bg-gray:rgba(156,163,175,.22);--rm-text-bg-red:hsla(0,91%,71%,.24);--rm-text-bg-orange:rgba(251,146,60,.24);--rm-text-bg-amber:rgba(250,204,21,.24);--rm-text-bg-green:rgba(74,222,128,.22);--rm-text-bg-teal:rgba(45,212,191,.22);--rm-text-bg-blue:rgba(96,165,250,.24);--rm-text-bg-violet:rgba(167,139,250,.26);--rm-text-bg-pink:rgba(244,114,182,.24);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)}
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;--rm-text-c-gray:#6b7280;--rm-text-c-red:#b91c1c;--rm-text-c-orange:#c2410c;--rm-text-c-amber:#a16207;--rm-text-c-green:#15803d;--rm-text-c-teal:#0f766e;--rm-text-c-blue:#1d4ed8;--rm-text-c-violet:#6d28d9;--rm-text-c-pink:#be185d;--rm-text-bg-gray:hsla(220,9%,46%,.16);--rm-text-bg-red:rgba(239,68,68,.18);--rm-text-bg-orange:rgba(249,115,22,.2);--rm-text-bg-amber:rgba(250,204,21,.32);--rm-text-bg-green:rgba(34,197,94,.2);--rm-text-bg-teal:rgba(20,184,166,.2);--rm-text-bg-blue:rgba(59,130,246,.18);--rm-text-bg-violet:rgba(139,92,246,.18);--rm-text-bg-pink:rgba(236,72,153,.18);--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;--rm-text-c-gray:#9ca3af;--rm-text-c-red:#fca5a5;--rm-text-c-orange:#fdba74;--rm-text-c-amber:#fde047;--rm-text-c-green:#86efac;--rm-text-c-teal:#5eead4;--rm-text-c-blue:#93c5fd;--rm-text-c-violet:#c4b5fd;--rm-text-c-pink:#f9a8d4;--rm-text-bg-gray:rgba(156,163,175,.22);--rm-text-bg-red:rgba(248,113,113,.24);--rm-text-bg-orange:rgba(251,146,60,.24);--rm-text-bg-amber:rgba(250,204,21,.24);--rm-text-bg-green:rgba(74,222,128,.22);--rm-text-bg-teal:rgba(45,212,191,.22);--rm-text-bg-blue:rgba(96,165,250,.24);--rm-text-bg-violet:rgba(167,139,250,.26);--rm-text-bg-pink:rgba(244,114,182,.24);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)}
@@ -125,11 +125,11 @@ const t = computed(() => WORDS[props.lang])
125
125
  */
126
126
  const ISO_DATE = /^\d{4}-\d{2}-\d{2}/
127
127
 
128
- /** Nom des fichiers exportes : le titre et son perimetre, phrase ou etiquettes. */
129
- const exportName = computed(() => {
130
- const scope = props.context || props.tags?.map(tag => (typeof tag === 'string' ? tag : tag.label)).join(', ')
131
- return scope ? `${props.title} (${scope})` : props.title
132
- })
128
+ /**
129
+ * Nom des exports : le titre et sa phrase de contexte. Les etiquettes n'y
130
+ * entrent pas, les exports les redessinent sous le titre (cf. `rmCardTags`).
131
+ */
132
+ const exportName = computed(() => (props.context ? `${props.title} (${props.context})` : props.title))
133
133
 
134
134
  const verifiedText = computed(() => {
135
135
  if (typeof props.verified === 'string' && !ISO_DATE.test(props.verified)) return props.verified
@@ -80,7 +80,7 @@ watch(() => props.tags, measure, { deep: true })
80
80
  </script>
81
81
 
82
82
  <template>
83
- <div class="rm-tag-row">
83
+ <div class="rm-tag-row" :data-rm-tags="JSON.stringify(items)">
84
84
  <div ref="rowRef" class="rm-tag-row__items">
85
85
  <RmTag v-for="tag in shown" :key="tag.label" data-rm-tag :variant="tag.variant">{{ tag.label }}</RmTag>
86
86
  </div>
@@ -1,4 +1,4 @@
1
- import { rmCardCharts, rmCardSheets, rmCardTitle } from "../utils/cardData.js";
1
+ import { rmCardCharts, rmCardSheets, rmCardTags, rmCardTitle } from "../utils/cardData.js";
2
2
  import { useRmExport } from "./useRmExport.js";
3
3
  import { rmExportDefaults } from "./useRmExportDefaults.js";
4
4
  const FILE_NAME_MAX = 60;
@@ -51,7 +51,7 @@ export function useRmCardActions() {
51
51
  return run(configOf(format, fileNameOf(title)), {
52
52
  ...defaults,
53
53
  title,
54
- charts: rmCardCharts(card).map((el) => ({ title, el })),
54
+ charts: rmCardCharts(card).map((el) => ({ title, el, tags: rmCardTags(card) })),
55
55
  // Le lien de la carte, sinon celui du cadre : le permalien de la page
56
56
  // porte la vue et les filtres, la ou l'URL courante ne dit rien de ce
57
57
  // qui est affiche.
@@ -1,4 +1,4 @@
1
- import { RM_EXPORT_EXTENSIONS } from "../utils/export.js";
1
+ import { RM_EXPORT_EXTENSIONS, rmExportTagColor } from "../utils/export.js";
2
2
  const BRAND_TITLE = "OIP Healthcare";
3
3
  const BRAND_LINE = "By Tekkare \u{1F49C}";
4
4
  const COVER_SHEET = "Tekkare";
@@ -92,7 +92,28 @@ function titleGap(title) {
92
92
  return title ? 22 : 0;
93
93
  }
94
94
  function drawableCharts(payload) {
95
- return (payload.charts ?? []).map((chart) => ({ title: chart.title, svg: svgOf(chart.el) })).filter((chart) => !!chart.svg);
95
+ return (payload.charts ?? []).map((chart) => ({ title: chart.title, tags: chart.tags, svg: svgOf(chart.el) })).filter((chart) => !!chart.svg);
96
+ }
97
+ const TAG_FONT = "500 12px Figtree, Helvetica, sans-serif";
98
+ const TAG_HEIGHT = 22;
99
+ const TAG_SPACE = 6;
100
+ function layoutTags(tags, width) {
101
+ if (!tags?.length) return { placed: [], height: 0 };
102
+ const measure = document.createElement("canvas").getContext("2d");
103
+ measure.font = TAG_FONT;
104
+ let x = 0;
105
+ let row = 0;
106
+ const placed = tags.map((tag) => {
107
+ const w = Math.ceil(measure.measureText(tag.label).width) + 16;
108
+ if (x > 0 && x + w > width) {
109
+ x = 0;
110
+ row++;
111
+ }
112
+ const at = { tag, x, row, w };
113
+ x += w + TAG_SPACE;
114
+ return at;
115
+ });
116
+ return { placed, height: (row + 1) * (TAG_HEIGHT + TAG_SPACE) + 4 };
96
117
  }
97
118
  function svgOf(el) {
98
119
  return el instanceof SVGSVGElement ? el : el.querySelector("svg");
@@ -344,9 +365,12 @@ export function useRmExport() {
344
365
  const pad = 24;
345
366
  const sources = sourcesOf(config, payload);
346
367
  const head = config.options.includes("logo") ? sources.length ? 88 : 72 : 0;
347
- const parts = drawn.map((chart) => ({ ...serialize(chart.svg), title: chart.title }));
368
+ const parts = drawn.map((chart) => {
369
+ const part = serialize(chart.svg);
370
+ return { ...part, title: chart.title, tags: layoutTags(chart.tags, part.width) };
371
+ });
348
372
  const width = Math.max(...parts.map((part) => part.width)) + pad * 2;
349
- const height = parts.reduce((total, part) => total + part.height + pad + titleGap(part.title), pad) + head;
373
+ const height = parts.reduce((total, part) => total + part.height + pad + titleGap(part.title) + part.tags.height, pad) + head;
350
374
  const canvas = document.createElement("canvas");
351
375
  canvas.width = width * scale;
352
376
  canvas.height = height * scale;
@@ -373,6 +397,18 @@ export function useRmExport() {
373
397
  context.fillText(part.title, pad, y + 12);
374
398
  y += titleGap(part.title);
375
399
  }
400
+ context.font = TAG_FONT;
401
+ for (const { tag, x, row, w } of part.tags.placed) {
402
+ const { fill, text } = rmExportTagColor(tag.variant);
403
+ const top = y + row * (TAG_HEIGHT + TAG_SPACE);
404
+ context.fillStyle = `rgb(${fill.join(",")})`;
405
+ context.beginPath();
406
+ context.roundRect(pad + x, top, w, TAG_HEIGHT, 4);
407
+ context.fill();
408
+ context.fillStyle = text;
409
+ context.fillText(tag.label, pad + x + 8, top + 15);
410
+ }
411
+ y += part.tags.height;
376
412
  const raw = await raster(part.markup, part.width, part.height, scale);
377
413
  context.drawImage(raw, pad, y, part.width, part.height);
378
414
  y += part.height + pad;
@@ -389,16 +425,25 @@ export function useRmExport() {
389
425
  const pad = 24;
390
426
  const sources = sourcesOf(config, payload);
391
427
  const head = config.options.includes("logo") ? sources.length ? 88 : 72 : 0;
392
- const parts = drawn.map((chart) => ({ ...serialize(chart.svg), title: chart.title }));
428
+ const parts = drawn.map((chart) => {
429
+ const part = serialize(chart.svg);
430
+ return { ...part, title: chart.title, tags: layoutTags(chart.tags, part.width) };
431
+ });
393
432
  const width = Math.max(...parts.map((part) => part.width)) + pad * 2;
394
- const height = parts.reduce((total, part) => total + part.height + pad + titleGap(part.title), pad) + head;
433
+ const height = parts.reduce((total, part) => total + part.height + pad + titleGap(part.title) + part.tags.height, pad) + head;
395
434
  let y = head + pad;
396
435
  const nested = parts.map((part) => {
397
436
  const label = part.title ? `<text x="${pad}" y="${y + 12}" font-family="Figtree, Helvetica, sans-serif" font-size="14" font-weight="bold" fill="#1A1A2E">${escapeXml(part.title)}</text>` : "";
398
437
  y += titleGap(part.title);
438
+ const tags = part.tags.placed.map(({ tag, x, row, w }) => {
439
+ const { fill, text } = rmExportTagColor(tag.variant);
440
+ const top = y + row * (TAG_HEIGHT + TAG_SPACE);
441
+ return `<rect x="${pad + x}" y="${top}" width="${w}" height="${TAG_HEIGHT}" rx="4" fill="rgb(${fill.join(",")})"/><text x="${pad + x + 8}" y="${top + 15}" font-family="Figtree, Helvetica, sans-serif" font-size="12" font-weight="500" fill="${text}">${escapeXml(tag.label)}</text>`;
442
+ }).join("");
443
+ y += part.tags.height;
399
444
  const markup2 = part.markup.replace(/^<svg /, `<svg x="${pad}" y="${y}" `);
400
445
  y += part.height + pad;
401
- return label + markup2;
446
+ return label + tags + markup2;
402
447
  }).join("\n");
403
448
  const header = head ? `<text x="${pad}" y="32" font-family="Figtree, Helvetica, sans-serif" font-size="20" font-weight="bold" fill="#1A1A2E">${BRAND_TITLE}</text><text x="${pad}" y="52" font-family="Figtree, Helvetica, sans-serif" font-size="12" fill="#6C6C8A">${escapeXml(`${payload.title} \xB7 ${BRAND_LINE} \xB7 ${longDate(lang)}`)}</text>` + (sources.length ? `<text x="${pad}" y="68" font-family="Figtree, Helvetica, sans-serif" font-size="12" fill="#6C6C8A">${escapeXml(`Source${sources.length > 1 ? "s" : ""} : ${sources.map((source) => sourceLabel(source, lang)).join(" \xB7 ")}`)}</text>` : "") : "";
404
449
  const markup = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><rect width="${width}" height="${height}" fill="#FFFFFF"/>${header}${nested}</svg>`;
@@ -566,7 +611,23 @@ export function useRmExport() {
566
611
  drawWidth = part.width / part.height * drawHeight;
567
612
  }
568
613
  const titleHeight = chart.title ? 7 : 0;
569
- const cardHeight = titleHeight + drawHeight + 8;
614
+ doc.setFont("helvetica", "normal");
615
+ doc.setFontSize(8);
616
+ let tagX = 0;
617
+ let tagRow = 0;
618
+ const tagsPlaced = (chart.tags ?? []).map((tag) => {
619
+ const label = printable(tag.label);
620
+ const w = doc.getTextWidth(label) + 3.2;
621
+ if (tagX > 0 && tagX + w > inner - 10) {
622
+ tagX = 0;
623
+ tagRow++;
624
+ }
625
+ const at = { tag, label, x: tagX, row: tagRow, w };
626
+ tagX += w + 1.5;
627
+ return at;
628
+ });
629
+ const tagsHeight = tagsPlaced.length ? (tagRow + 1) * 6.5 + 1 : 0;
630
+ const cardHeight = titleHeight + tagsHeight + drawHeight + 8;
570
631
  if (y + cardHeight > bottom) {
571
632
  doc.addPage();
572
633
  y = margin;
@@ -583,6 +644,19 @@ export function useRmExport() {
583
644
  doc.text(printable(chart.title), margin + 5, chartY + 2);
584
645
  chartY += titleHeight;
585
646
  }
647
+ if (tagsPlaced.length) {
648
+ doc.setFont("helvetica", "normal");
649
+ doc.setFontSize(8);
650
+ for (const { tag, label, x, row, w } of tagsPlaced) {
651
+ const { fill, text } = rmExportTagColor(tag.variant);
652
+ const top = chartY - 1 + row * 6.5;
653
+ doc.setFillColor(...fill);
654
+ doc.roundedRect(margin + 5 + x, top, w, 5, 1, 1, "F");
655
+ doc.setTextColor(text);
656
+ doc.text(label, margin + 5 + x + 1.6, top + 3.5);
657
+ }
658
+ chartY += tagsHeight;
659
+ }
586
660
  doc.addImage(
587
661
  canvas.toDataURL("image/png"),
588
662
  "PNG",
@@ -21,7 +21,7 @@
21
21
  * - un graphe dessine dans une cellule (courbe de tendance d'une ligne) est
22
22
  * une decoration du tableau : il ne fait pas un export a lui seul.
23
23
  */
24
- import type { RmExportSheet } from './export.js';
24
+ import type { RmExportSheet, RmExportTag } from './export.js';
25
25
  /** La carte qui contient un noeud, quel que soit le composant qui la rend. */
26
26
  export declare function rmCardOf(el: Element | null): HTMLElement | null;
27
27
  /**
@@ -30,6 +30,12 @@ export declare function rmCardOf(el: Element | null): HTMLElement | null;
30
30
  * pareil ne se distinguent plus dans un dossier de telechargement.
31
31
  */
32
32
  export declare function rmCardTitle(card: Element): string;
33
+ /**
34
+ * Etiquettes de perimetre de la carte (RmTagRow sous son titre), toutes, y
35
+ * compris celles que la rangee replie en « +N » faute de place : la rangee
36
+ * les porte en entier dans `data-rm-tags`.
37
+ */
38
+ export declare function rmCardTags(card: Element): RmExportTag[];
33
39
  /** Les graphes exportables d'une carte, vides tant que la donnee n'est pas rendue. */
34
40
  export declare function rmCardCharts(card: Element): HTMLElement[];
35
41
  /**
@@ -16,6 +16,15 @@ export function rmCardTitle(card) {
16
16
  const context = cellText(card.querySelector(".chart-card-context"));
17
17
  return context ? `${title} (${context})` : title;
18
18
  }
19
+ export function rmCardTags(card) {
20
+ const row = card.querySelector(".chart-card-head [data-rm-tags], .rm-table-card__header [data-rm-tags]");
21
+ try {
22
+ const tags = JSON.parse(row?.getAttribute("data-rm-tags") ?? "[]");
23
+ return Array.isArray(tags) ? tags : [];
24
+ } catch {
25
+ return [];
26
+ }
27
+ }
19
28
  export function rmCardCharts(card) {
20
29
  return [...card.querySelectorAll(CHART_SELECTOR)].filter(
21
30
  (holder) => holder.querySelector("svg") && !holder.closest("table")
@@ -263,6 +263,7 @@ export interface RmExportPayload {
263
263
  charts?: {
264
264
  title?: string;
265
265
  el: Element;
266
+ tags?: RmExportTag[];
266
267
  }[];
267
268
  /**
268
269
  * Cartes de l'ecran, a capturer telles quelles pour le rapport mis en page.
@@ -329,3 +330,18 @@ export declare function rmExportDuration(kb: number, rows: number): string;
329
330
  * dossier de telechargements.
330
331
  */
331
332
  export declare function rmExportFileName(...parts: (string | undefined | null)[]): string;
333
+ /**
334
+ * Etiquette de perimetre d'un graphe (element, mesure, periode, lieu), posee
335
+ * sous son titre a l'ecran par RmTagRow. Les exports la redessinent en
336
+ * pastille de la meme couleur : ecrite en texte a la suite du titre, elle
337
+ * donnait un intitule de deux lignes ou plus rien ne se distinguait.
338
+ */
339
+ export interface RmExportTag {
340
+ label: string;
341
+ /** Variante de RmTag ; `gray` a defaut. */
342
+ variant?: string;
343
+ }
344
+ export declare function rmExportTagColor(variant?: string): {
345
+ fill: [number, number, number];
346
+ text: string;
347
+ };
@@ -101,3 +101,25 @@ export function rmExportFileName(...parts) {
101
101
  const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
102
102
  return `${slug || "export"}-${today}`;
103
103
  }
104
+ const RM_EXPORT_TAG_COLORS = {
105
+ gray: { fill: [244, 244, 247], text: "#1A1A2E" },
106
+ rose: { fill: [254, 236, 239], text: "#9f1239" },
107
+ pink: { fill: [253, 237, 245], text: "#9d174d" },
108
+ fushia: { fill: [251, 236, 253], text: "#86198f" },
109
+ purple: { fill: [246, 238, 254], text: "#6b21a8" },
110
+ violet: { fill: [243, 239, 254], text: "#5b21b6" },
111
+ indigo: { fill: [239, 240, 254], text: "#3730a3" },
112
+ blue: { fill: [235, 242, 254], text: "#1e40af" },
113
+ sky: { fill: [231, 246, 253], text: "#075985" },
114
+ cyan: { fill: [230, 248, 251], text: "#155e75" },
115
+ teal: { fill: [232, 248, 246], text: "#115e59" },
116
+ emerald: { fill: [231, 248, 242], text: "#065f46" },
117
+ green: { fill: [233, 249, 239], text: "#166534" },
118
+ lime: { fill: [243, 250, 232], text: "#3f6212" },
119
+ yellow: { fill: [253, 247, 230], text: "#854d0e" },
120
+ amber: { fill: [254, 245, 231], text: "#92400e" },
121
+ orange: { fill: [254, 241, 232], text: "#9a3412" }
122
+ };
123
+ export function rmExportTagColor(variant) {
124
+ return RM_EXPORT_TAG_COLORS[variant ?? "gray"] ?? RM_EXPORT_TAG_COLORS.gray;
125
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.239",
3
+ "version": "0.1.241",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",