@tekkare/romulus 0.1.255 → 0.1.257

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.254",
7
+ "version": "0.1.256",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -1 +1 @@
1
- :root{--rm-shell-bg:#f9f9fa;--rm-shell-surface:#fff;--rm-shell-border:#dbdef0;--rm-shell-subtle:#f5f5f9;--rm-shell-text:#1e293b;--rm-shell-text-dark:#475569;--rm-shell-text-muted:#878ca6;--rm-shell-accent:#2017ad;--rm-shell-inset:8px;--rm-shell-radius:12px;--rm-bar-h:56px;--rm-nav-w:240px;--rm-nav-collapsed-w:64px;--rm-rail-w:56px;--rm-rail-wide-w:240px;--rm-dots-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAcUlEQVR42u3TwQmAMAxAUdfQfUoSZ3OBTNMFHEqLVBEtCB6M8B8EevwktOsAAACAl0SkNzNXtaw6zut7SikNYeJq2Hksh4gs27rG7ZH+eWA7bttigMC78x4TIdBbceX8fJKnkSL1s5RY8zBxAAAA+LUF0ula10BxVDoAAAAASUVORK5CYII=");--rm-dots-size:12px;--rm-dots-opacity:0.1}body.night{--rm-shell-bg:var(--bg-app);--rm-shell-surface:var(--bg-surface,#1a1a24);--rm-shell-border:var(--border-default);--rm-shell-subtle:var(--bg-subtle,#22222e);--rm-shell-text:var(--text-primary);--rm-shell-text-dark:var(--text-secondary);--rm-shell-text-muted:var(--text-muted);--rm-shell-accent:var(--color-primary);--rm-dots-opacity:0.06}.rm-shell{background:var(--rm-shell-bg);color:var(--rm-shell-text);font-family:var(--font-sans,"Figtree",sans-serif);inset:0;overflow:hidden;position:fixed}.rm-shell__dots{background-image:var(--rm-dots-image);background-repeat:repeat;background-size:var(--rm-dots-size) var(--rm-dots-size);inset:0;opacity:var(--rm-dots-opacity);pointer-events:none;position:absolute}.rm-shell__frame{border:1px solid var(--rm-shell-border);border-radius:var(--rm-shell-radius);display:flex;inset:var(--rm-shell-inset);overflow:hidden;position:absolute}.rm-shell__body{display:flex;flex:1;flex-direction:column;min-width:0}.rm-shell__main{flex:1;min-width:0;overflow-y:auto;scrollbar-gutter:stable}.rm-sb{background:var(--rm-shell-surface);display:flex;flex-direction:column;flex-shrink:0;height:100%}.rm-sb--left{border-right:1px solid var(--rm-shell-border);position:relative;transition:width .2s;width:var(--rm-nav-w);z-index:200}.rm-sb--left.rm-sb--collapsed{width:var(--rm-nav-collapsed-w)}.rm-sb--right{border-left:1px solid var(--rm-shell-border);transition:width .2s;width:var(--rm-rail-w)}.rm-sb--right.rm-sb--wide{border-right:1px solid var(--rm-shell-border);width:var(--rm-rail-wide-w)}.rm-rail__head{align-items:center;border-bottom:1px solid var(--rm-shell-border);color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;font-size:15px;font-weight:600;height:var(--rm-bar-h);padding:0 var(--space-16);white-space:nowrap}.rm-sb--wide .rm-rail__item{align-items:center;border-radius:8px;flex-direction:row;gap:var(--space-10);justify-content:flex-start;margin:1px 8px;padding:9px var(--space-12);width:auto}.rm-sb--wide .rm-rail__item:first-of-type{margin-top:8px}.rm-sb--wide .rm-rail__caption{color:var(--rm-shell-text-dark);flex:1;font-size:var(--font-13);font-weight:500;line-height:18px;text-align:left}.rm-sb--wide .rm-rail__tile{color:var(--rm-shell-text-muted);display:contents}.rm-sb--wide .rm-rail__badge,.rm-sb--wide .rm-rail__dot{order:1;position:static}.rm-sb--wide .rm-rail__chev{order:2}.rm-sb--wide .rm-rail__dot{border:none;height:8px;width:8px}.rm-sb--wide .rm-rail__item:hover{background:var(--rm-shell-subtle)}.rm-sb--wide .rm-rail__item.rm-rail__item--active .rm-rail__dot{border-color:color-mix(in srgb,var(--rm-shell-accent) 8%,var(--rm-shell-surface))}.rm-sb--wide .rm-rail__avatar{font-size:var(--font-10);height:22px;width:22px}.rm-sb--wide .rm-rail__item--active{background:color-mix(in srgb,var(--rm-shell-accent) 8%,transparent)}.rm-sb--wide .rm-rail__item--active .rm-rail__caption,.rm-sb--wide .rm-rail__item--active .rm-rail__chev,.rm-sb--wide .rm-rail__item.rm-rail__item--active .rm-rail__tile{background:none;color:var(--rm-shell-accent)}.rm-sb--wide .rm-rail__item--active .rm-rail__caption{font-weight:600}.rm-rail__chev{font-size:var(--font-14);opacity:0}.rm-sb--wide .rm-rail__item--active .rm-rail__chev{opacity:1}.rm-sb--wide .rm-rail__item--active .rm-rail__badge{background:var(--rm-shell-accent);color:#fff}.rm-sb--wide .rm-rail__bottom{align-items:stretch;gap:var(--space-6);padding:0 var(--space-8) var(--space-12)}.rm-sb--wide .rm-lang{display:block}.rm-sb--wide .rm-lang__current{border-radius:8px;height:32px;justify-content:flex-start;padding:0 var(--space-10);width:100%}.rm-lang__name{color:var(--rm-shell-text-dark);font-size:var(--font-13)}.rm-sb__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-sb--collapsed .rm-sb__header{justify-content:center;padding:0}.rm-sb__logo{align-items:center;color:var(--rm-shell-text);display:flex;flex:1;font-size:20px;font-weight:700;gap:var(--space-8);line-height:1.4;min-width:0;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-sb__toggle{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);cursor:pointer;display:block;flex-shrink:0;height:20px;margin:0;padding:0;transition:color .15s;width:20px}.rm-sb__toggle:hover{color:var(--rm-shell-text)}.rm-sb__toggle svg{display:block;height:100%;width:100%}.rm-sb__nav{display:flex;flex:1;flex-direction:column;gap:var(--space-16);overflow-y:auto;padding:var(--space-16)}.rm-sb--collapsed .rm-sb__nav{padding-left:var(--space-8);padding-right:var(--space-8)}.rm-sb__group{flex-direction:column}.rm-sb__group,.rm-sb__label{display:flex;gap:var(--space-4)}.rm-sb__label{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);font-family:inherit;font-size:var(--font-10);font-weight:500;letter-spacing:.025em;line-height:1.6;margin:0;padding:0 var(--space-2);text-align:left;text-transform:uppercase;width:100%}button.rm-sb__label{cursor:pointer}button.rm-sb__label:hover{color:var(--rm-shell-text)}.rm-sb__label-text{flex:1;min-width:0}.rm-sb__chev{display:block;flex-shrink:0;height:12px;transition:transform .2s;width:12px}.rm-sb__label[aria-expanded=true] .rm-sb__chev{transform:rotate(90deg)}.rm-sb__rule{background:var(--rm-shell-border);height:1px;margin:4px}.rm-mi{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-shadow:none;color:var(--rm-shell-text);cursor:pointer;display:flex;font-family:inherit;gap:var(--space-8);height:26px;margin:0;padding:var(--space-2);text-align:left;text-decoration:none;transition:background-color .15s;width:100%}.rm-mi:hover{background:color-mix(in srgb,var(--rm-shell-subtle) 50%,transparent)}.rm-mi.rm-mi--active{background:var(--rm-shell-subtle)}.rm-mi.rm-mi--current{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent)}.rm-mi.rm-mi--current .rm-mi__icon{background:var(--rm-shell-accent);color:#fff}.rm-mi.rm-mi--current .rm-mi__icon svg{stroke:#fff}.rm-mi__icon{align-items:center;background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;height:22px;justify-content:center;line-height:1;width:22px}.rm-mi__icon svg{display:block;height:14px;width:14px}.rm-mi__icon i{font-size:var(--font-14);line-height:1}.rm-mi__label{color:var(--rm-shell-text);flex:1;font-size:var(--font-14);line-height:1.625;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-mi__badge{background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-muted);flex-shrink:0;font-size:9px;font-weight:700;letter-spacing:.025em;padding:var(--space-2) var(--space-4);text-transform:uppercase}.rm-sb--collapsed .rm-mi{justify-content:center}.rm-sb--collapsed .rm-mi>:not(.rm-mi__icon),.rm-sb--collapsed .rm-sb__sub{display:none}.rm-sb__tip{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:6px;box-shadow:0 4px 12px rgba(30,41,59,.1);color:var(--rm-shell-text);font-size:var(--font-12);line-height:1.3;padding:5px 9px;pointer-events:none;position:fixed;transform:translateY(-50%);white-space:nowrap;z-index:60}.rm-sb__sub{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) 0 var(--space-2) 28px}.rm-sb__sub-item{border-radius:4px;color:var(--rm-shell-text);display:block;font-size:var(--font-14);line-height:1.625;overflow:hidden;padding:var(--space-2) var(--space-4);text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-sb__sub-item:hover{background:color-mix(in srgb,var(--rm-shell-subtle) 50%,transparent)}.rm-rail__item{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;cursor:pointer;display:flex;flex-direction:column;font-family:inherit;gap:var(--space-4);margin:0;padding:var(--space-12) 0 var(--space-8);text-decoration:none;width:100%}.rm-rail__avatar{align-items:center;border:2px solid var(--rm-shell-surface);border-radius:9999px;color:#fff;display:flex;font-size:var(--font-14);height:32px;justify-content:center;transition:opacity .15s;width:32px}.rm-rail__item:hover .rm-rail__avatar{opacity:.8}.rm-rail__tile{align-items:center;background:var(--rm-shell-subtle);border-radius:8px;color:var(--rm-shell-text-dark);display:flex;font-size:var(--font-16);height:32px;justify-content:center;transition:background-color .15s,color .15s;width:32px}.rm-rail__item:hover .rm-rail__tile{background:var(--rm-shell-border)}.rm-rail__item.rm-rail__item--active .rm-rail__tile{background:var(--rm-shell-accent);color:#fff}.rm-rail__item.rm-rail__item--disabled{cursor:default}.rm-rail__item.rm-rail__item--disabled .rm-rail__caption,.rm-rail__item.rm-rail__item--disabled i{opacity:.4}.rm-rail__item.rm-rail__item--disabled:hover .rm-rail__tile{background:var(--rm-shell-subtle)}.rm-rail__tile{position:relative}.rm-rail__badge{background:var(--rm-shell-accent);border-radius:9999px;color:#fff;font-size:var(--font-10);font-weight:700;height:16px;line-height:16px;min-width:16px;padding:0 var(--space-4);position:absolute;right:-4px;text-align:center;top:-4px}.rm-rail__item--active .rm-rail__badge{background:#fff;color:var(--rm-shell-accent)}.rm-rail__dot{animation:rm-rail-dot-pulse 2s ease-out infinite;background:var(--color-success,#16a34a);border:2px solid var(--rm-shell-surface);border-radius:9999px;height:10px;position:absolute;right:-2px;top:-2px;width:10px}@keyframes rm-rail-dot-pulse{0%{box-shadow:0 0 0 0 rgba(22,163,74,.55)}70%{box-shadow:0 0 0 6px rgba(22,163,74,0)}to{box-shadow:0 0 0 0 rgba(22,163,74,0)}}@media (prefers-reduced-motion:reduce){.rm-rail__dot{animation:none}}.rm-rail__item--active .rm-rail__dot{border-color:var(--rm-shell-accent)}.rm-rail__caption{color:var(--rm-shell-text-muted);font-size:var(--font-10);line-height:1;max-width:100%;overflow:hidden;padding:0 var(--space-2);text-overflow:ellipsis;transition:color .15s;white-space:nowrap}.rm-rail__item--active .rm-rail__caption,.rm-rail__item:hover .rm-rail__caption{color:var(--rm-shell-text)}.rm-rail__bottom{align-items:center;display:flex;flex-direction:column;gap:var(--space-10);margin-top:auto;padding-bottom:var(--space-16)}.rm-dns{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--bg-app,#f5f5f9);border:1px solid var(--rm-shell-border);border-radius:9999px;box-shadow:inset 0 1px 2px rgba(30,41,59,.06);box-sizing:border-box;cursor:pointer;display:flex;flex:0 0 auto;flex-direction:column;height:64px;margin:0;padding:var(--space-2);position:relative;width:32px}.rm-dns__thumb{background:#fff;border-radius:9999px;box-shadow:0 1px 3px rgba(30,41,59,.15);height:calc(50% - 2px);left:2px;position:absolute;top:2px;transition:top .24s cubic-bezier(.2,0,0,1);width:calc(100% - 4px);z-index:1}.rm-dns__half{align-items:center;border-radius:9999px;display:flex;flex:1;font-size:var(--font-14);justify-content:center;line-height:1;position:relative;transition:color .2s ease;z-index:2}.rm-dns__half[data-dns=day]{color:#f59e0b}.rm-dns__half[data-dns=night]{color:var(--text-muted,#8a90a8)}.rm-dns:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}body.night .rm-dns{background:#14141c;border-color:#2f2f40;box-shadow:inset 0 1px 2px rgba(0,0,0,.4)}body.night .rm-dns__thumb{background:var(--color-accent-soft);box-shadow:0 1px 4px rgba(180,133,255,.5);top:50%}body.night .rm-dns__half[data-dns=day]{color:#525670}body.night .rm-dns__half[data-dns=night]{color:var(--bg-surface)}.rm-dns--wide{flex-direction:row;height:32px;width:100%}.rm-dns--wide .rm-dns__thumb{height:calc(100% - 4px);left:2px;top:2px;transition:left .24s cubic-bezier(.2,0,0,1);width:calc(50% - 2px)}body.night .rm-dns--wide .rm-dns__thumb{left:50%;top:2px}.rm-dns--wide .rm-dns__half{font-size:var(--font-12);gap:var(--space-6)}.rm-dns__text{font-weight:600}@media (prefers-reduced-motion:reduce){.rm-dns__thumb{transition:none}}.rm-lang__current span,.rm-lang__item-flag{font-family:Twemoji Country Flags,Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif}.rm-lang{display:flex;flex:0 0 auto;position:relative}.rm-lang__current{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:9999px;box-sizing:border-box;cursor:pointer;display:flex;font-size:17px;gap:var(--space-8);height:32px;justify-content:center;line-height:1;margin:0;padding:0;transition:border-color .15s,background-color .15s;width:32px}.rm-lang__current:hover{background:var(--rm-shell-subtle)}.rm-lang__current:hover,.rm-lang__current[aria-expanded=true]{border-color:var(--rm-shell-accent)}.rm-lang__current:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}.rm-lang__menu{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:8px;bottom:0;box-shadow:0 8px 24px rgba(var(--shadow-rgb,30,41,59),.12);min-width:160px;padding:var(--space-4);position:absolute;right:calc(100% + 8px);z-index:300}.rm-lang__item{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-sizing:border-box;color:var(--rm-shell-text);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-14);gap:var(--space-8);line-height:1.5;margin:0;padding:var(--space-4) var(--space-6);text-align:left;white-space:nowrap;width:100%}.rm-lang__item:hover{background:var(--rm-shell-subtle)}.rm-lang__item--active{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent);font-weight:600}.rm-lang__item-flag{flex-shrink:0;font-size:17px;line-height:1}.rm-lang-enter-active,.rm-lang-leave-active{transition:opacity .14s ease,transform .14s ease}.rm-lang-enter-from,.rm-lang-leave-to{opacity:0;transform:translateX(4px)}@media (prefers-reduced-motion:reduce){.rm-lang-enter-active,.rm-lang-leave-active{transition:none}}.rm-hd{background:var(--rm-shell-surface);border-bottom:1px solid var(--rm-shell-border);display:flex;flex-direction:column;flex-shrink:0}.rm-hd__row{gap:var(--space-16);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-hd__crumbs,.rm-hd__row{align-items:center;display:flex}.rm-hd__crumbs{flex:1;font-size:var(--font-14);gap:var(--space-4);min-width:0}.rm-hd__crumb{align-items:center;color:var(--rm-shell-text-muted);display:inline-flex;gap:var(--space-6);text-decoration:none;transition:color .15s;white-space:nowrap}a.rm-hd__crumb:hover{color:var(--rm-shell-text)}.rm-hd__sep{color:var(--rm-shell-text-muted)}.rm-hd__picker{display:inline-flex;min-width:0;position:relative}.rm-hd__crumb--picker{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-shadow:none;cursor:pointer;font:inherit;font-size:var(--font-14);margin:0;padding:var(--space-2) var(--space-4);transition:background-color .15s,color .15s}.rm-hd__crumb--picker:hover{background:var(--rm-shell-subtle)}.rm-hd__caret{display:block;flex-shrink:0;height:12px;opacity:.7;transition:transform .15s;width:12px}.rm-hd__caret--open{transform:rotate(180deg)}.rm-hd__menu{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:8px;box-shadow:0 8px 24px rgba(30,41,59,.12);left:0;max-height:60vh;max-width:320px;min-width:200px;overflow-y:auto;padding:var(--space-4);position:absolute;top:calc(100% + 4px);z-index:300}.rm-hd__menu-item{align-items:center;border-radius:4px;color:var(--rm-shell-text);display:flex;font-size:var(--font-14);gap:var(--space-8);line-height:1.5;overflow:hidden;padding:var(--space-4) var(--space-6);text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-hd__menu-item:hover{background:var(--rm-shell-subtle)}.rm-hd__menu-group{color:var(--rm-shell-text-muted);display:block;font-size:var(--font-10);font-weight:500;letter-spacing:.025em;line-height:1.6;padding:var(--space-8) var(--space-6) var(--space-2);text-transform:uppercase}.rm-hd__menu-group:first-child{padding-top:var(--space-2)}.rm-hd__menu-item--active{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent);font-weight:600}.rm-hd__menu-icon{align-items:center;background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;height:22px;justify-content:center;line-height:1;width:22px}.rm-hd__menu-icon i{font-size:var(--font-14);line-height:1}.rm-hd__menu-item--active .rm-hd__menu-icon{background:var(--rm-shell-accent);color:#fff}.rm-hd__crumb--last{color:var(--rm-shell-text);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-hd__search{align-items:center;background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:9999px;display:flex;flex-shrink:0;gap:var(--space-4);padding:var(--space-4) var(--space-12);width:300px}.rm-hd__search input{background:transparent;border:none;color:var(--rm-shell-text);flex:1;font-family:inherit;font-size:var(--font-14);line-height:20px;min-width:0;outline:none;padding:0}.rm-hd__search input::-moz-placeholder{color:var(--rm-shell-text-muted)}.rm-hd__search input::placeholder{color:var(--rm-shell-text-muted)}.rm-hd__search i,.rm-hd__search svg{color:var(--rm-shell-text-muted);display:block;flex-shrink:0;font-size:var(--font-14);height:14px;line-height:20px;width:14px}.rm-hd__tabs{display:flex;gap:var(--space-16);padding:0 var(--space-16)}.rm-hd__tab{align-items:flex-start;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-bottom:2px solid transparent;border-radius:0;box-shadow:none;color:var(--rm-shell-text-dark);cursor:pointer;display:flex;flex-direction:column;font-family:inherit;font-size:var(--font-14);font-weight:700;line-height:1.6;margin:0;padding:var(--space-4) var(--space-4) var(--space-8);white-space:nowrap}.rm-hd__tab-label{align-items:center;display:inline-flex;gap:var(--space-6)}.rm-hd__tab-count{background:color-mix(in srgb,currentColor 12%,transparent);border-radius:var(--radius-pill);font-size:var(--font-12);font-weight:600;line-height:1.5;padding:0 var(--space-6)}.rm-hd__tab--active{border-bottom-color:var(--rm-shell-accent);color:var(--rm-shell-text)}@media (max-width:767px){.rm-sb--left{inset:0 auto 0 0;position:absolute;transform:translateX(-100%);transition:transform .2s;z-index:40}.rm-sb--left.rm-sb--open{transform:translateX(0)}.rm-sb--right{display:none}.rm-hd__search{flex:1;width:auto}}.rm-panel{background:var(--rm-shell-surface);border-left:1px solid var(--rm-shell-border);bottom:0;box-shadow:-8px 0 24px rgba(30,41,59,.08);display:flex;flex-direction:column;position:absolute;right:0;top:0;width:min(var(--rm-panel-w,640px),calc(100vw - 160px));z-index:401}.rm-panel__veil{backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);background:var(--rm-panel-veil,rgba(100,116,139,.12));cursor:default;inset:0;position:absolute;z-index:400}.rm-panel-veil-enter-active,.rm-panel-veil-leave-active{transition:opacity .22s ease}.rm-panel-veil-enter-from,.rm-panel-veil-leave-to{opacity:0}@media (prefers-reduced-motion:reduce){.rm-panel-veil-enter-active,.rm-panel-veil-leave-active{transition:none}}.rm-sb--right{position:relative;z-index:402}.rm-panel-enter-active,.rm-panel-leave-active,.rm-sb--right{transition:transform .22s cubic-bezier(.4,0,.2,1)}.rm-panel-enter-from,.rm-panel-leave-to{transform:translateX(100%)}@media (prefers-reduced-motion:reduce){.rm-panel-enter-active,.rm-panel-leave-active,.rm-sb--right{transition:none}}.rm-panel__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-panel__title{color:var(--rm-shell-text);flex:1;font-size:var(--font-14);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-panel__close{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);cursor:pointer;display:block;flex-shrink:0;height:20px;margin:0;padding:0;transition:color .15s;width:20px}.rm-panel__close:hover{color:var(--rm-shell-text)}.rm-panel__close svg{display:block;height:100%;width:100%}.rm-panel__header:has(+.rm-panel__tabs){border-bottom:none}.rm-panel__tabs{border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);overflow-x:auto;padding:0 var(--space-16)}.rm-panel__tab{background:none;border:none;border-bottom:3px solid transparent;border-radius:8px 8px 0 0;color:var(--text-muted);cursor:pointer;font-family:inherit;font-size:var(--font-14);font-weight:500;line-height:1.6;margin-bottom:-1px;padding:var(--space-8) var(--space-16) var(--space-10);transition:background-color .3s,color .15s;white-space:nowrap}.rm-panel__tab:hover{color:var(--color-primary)}.rm-panel__tab.rm-panel__tab--disabled,.rm-panel__tab.rm-panel__tab--disabled:hover{color:var(--text-muted);cursor:default;opacity:.45}.rm-panel__tab--active{background:color-mix(in srgb,var(--color-primary) 6%,transparent);border-bottom-color:var(--color-primary);color:var(--color-primary);font-weight:600}.rm-panel__tab-count{background:color-mix(in srgb,currentColor 12%,transparent);border-radius:var(--radius-pill);display:inline-block;font-size:var(--font-12);font-weight:600;line-height:1.5;margin-left:var(--space-6);padding:0 var(--space-6)}.rm-panel__body{flex:1;min-height:0;overflow-y:auto;padding:var(--space-16)}@media (max-width:767px){.rm-panel{border-left:none;left:0;width:auto}}
1
+ :root{--rm-shell-bg:#f9f9fa;--rm-shell-surface:#fff;--rm-shell-border:#dbdef0;--rm-shell-subtle:#f5f5f9;--rm-shell-text:#1e293b;--rm-shell-text-dark:#475569;--rm-shell-text-muted:#878ca6;--rm-shell-accent:#2017ad;--rm-shell-inset:8px;--rm-shell-radius:12px;--rm-bar-h:56px;--rm-nav-w:240px;--rm-nav-collapsed-w:64px;--rm-rail-w:56px;--rm-rail-wide-w:240px;--rm-dots-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAcUlEQVR42u3TwQmAMAxAUdfQfUoSZ3OBTNMFHEqLVBEtCB6M8B8EevwktOsAAACAl0SkNzNXtaw6zut7SikNYeJq2Hksh4gs27rG7ZH+eWA7bttigMC78x4TIdBbceX8fJKnkSL1s5RY8zBxAAAA+LUF0ula10BxVDoAAAAASUVORK5CYII=");--rm-dots-size:12px;--rm-dots-opacity:0.1}body.night{--rm-shell-bg:var(--bg-app);--rm-shell-surface:var(--bg-surface,#1a1a24);--rm-shell-border:var(--border-default);--rm-shell-subtle:var(--bg-subtle,#22222e);--rm-shell-text:var(--text-primary);--rm-shell-text-dark:var(--text-secondary);--rm-shell-text-muted:var(--text-muted);--rm-shell-accent:var(--color-primary);--rm-dots-opacity:0.06}.rm-shell{background:var(--rm-shell-bg);color:var(--rm-shell-text);font-family:var(--font-sans,"Figtree",sans-serif);inset:0;overflow:hidden;position:fixed}.rm-shell__dots{background-image:var(--rm-dots-image);background-repeat:repeat;background-size:var(--rm-dots-size) var(--rm-dots-size);inset:0;opacity:var(--rm-dots-opacity);pointer-events:none;position:absolute}.rm-shell__frame{border:1px solid var(--rm-shell-border);border-radius:var(--rm-shell-radius);display:flex;inset:var(--rm-shell-inset);overflow:hidden;position:absolute}.rm-shell__body{display:flex;flex:1;flex-direction:column;min-width:0}.rm-shell__main{flex:1;min-width:0;overflow-y:auto;scrollbar-gutter:stable}.rm-sb{background:var(--rm-shell-surface);display:flex;flex-direction:column;flex-shrink:0;height:100%}.rm-sb--left{border-right:1px solid var(--rm-shell-border);position:relative;transition:width .2s;width:var(--rm-nav-w);z-index:200}.rm-sb--left.rm-sb--collapsed{width:var(--rm-nav-collapsed-w)}.rm-sb--right{border-left:1px solid var(--rm-shell-border);transition:width .2s;width:var(--rm-rail-w)}.rm-sb--right.rm-sb--wide{border-right:1px solid var(--rm-shell-border);width:var(--rm-rail-wide-w)}.rm-rail__head{align-items:center;border-bottom:1px solid var(--rm-shell-border);color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;font-size:15px;font-weight:600;height:var(--rm-bar-h);padding:0 var(--space-16);white-space:nowrap}.rm-sb--wide .rm-rail__item{align-items:center;border-radius:8px;flex-direction:row;gap:var(--space-10);justify-content:flex-start;margin:1px 8px;padding:9px var(--space-12);width:auto}.rm-sb--wide .rm-rail__item:first-of-type{margin-top:8px}.rm-sb--wide .rm-rail__caption{color:var(--rm-shell-text-dark);flex:1;font-size:var(--font-13);font-weight:500;line-height:18px;text-align:left}.rm-sb--wide .rm-rail__tile{color:var(--rm-shell-text-muted);display:contents}.rm-sb--wide .rm-rail__badge,.rm-sb--wide .rm-rail__dot{order:1;position:static}.rm-sb--wide .rm-rail__chev{order:2}.rm-sb--wide .rm-rail__dot{border:none;height:8px;width:8px}.rm-sb--wide .rm-rail__item:hover{background:var(--rm-shell-subtle)}.rm-sb--wide .rm-rail__item.rm-rail__item--active .rm-rail__dot{border-color:color-mix(in srgb,var(--rm-shell-accent) 8%,var(--rm-shell-surface))}.rm-sb--wide .rm-rail__avatar{font-size:var(--font-10);height:22px;width:22px}.rm-sb--wide .rm-rail__item--active{background:color-mix(in srgb,var(--rm-shell-accent) 8%,transparent)}.rm-sb--wide .rm-rail__item--active .rm-rail__caption,.rm-sb--wide .rm-rail__item--active .rm-rail__chev,.rm-sb--wide .rm-rail__item.rm-rail__item--active .rm-rail__tile{background:none;color:var(--rm-shell-accent)}.rm-sb--wide .rm-rail__item--active .rm-rail__caption{font-weight:600}.rm-rail__chev{font-size:var(--font-14);opacity:0}.rm-sb--wide .rm-rail__item--active .rm-rail__chev{opacity:1}.rm-sb--wide .rm-rail__item--active .rm-rail__badge{background:var(--rm-shell-accent);color:#fff}.rm-sb--wide .rm-rail__bottom{align-items:stretch;gap:var(--space-6);padding:0 var(--space-8) var(--space-12)}.rm-sb--wide .rm-lang{display:block}.rm-sb--wide .rm-lang__current{border-radius:8px;height:32px;justify-content:flex-start;padding:0 var(--space-10);width:100%}.rm-lang__name{color:var(--rm-shell-text-dark);font-size:var(--font-13)}.rm-sb__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-sb--collapsed .rm-sb__header{justify-content:center;padding:0}.rm-sb__logo{align-items:center;color:var(--rm-shell-text);display:flex;flex:1;font-size:20px;font-weight:700;gap:var(--space-8);line-height:1.4;min-width:0;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-sb__toggle{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);cursor:pointer;display:block;flex-shrink:0;height:20px;margin:0;padding:0;transition:color .15s;width:20px}.rm-sb__toggle:hover{color:var(--rm-shell-text)}.rm-sb__toggle svg{display:block;height:100%;width:100%}.rm-sb__nav{display:flex;flex:1;flex-direction:column;gap:var(--space-16);overflow-y:auto;padding:var(--space-16)}.rm-sb--collapsed .rm-sb__nav{padding-left:var(--space-8);padding-right:var(--space-8)}.rm-sb__group{flex-direction:column}.rm-sb__group,.rm-sb__label{display:flex;gap:var(--space-4)}.rm-sb__label{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);font-family:inherit;font-size:var(--font-10);font-weight:500;letter-spacing:.025em;line-height:1.6;margin:0;padding:0 var(--space-2);text-align:left;text-transform:uppercase;width:100%}button.rm-sb__label{cursor:pointer}button.rm-sb__label:hover{color:var(--rm-shell-text)}.rm-sb__label-text{flex:1;min-width:0}.rm-sb__chev{display:block;flex-shrink:0;height:12px;transition:transform .2s;width:12px}.rm-sb__label[aria-expanded=true] .rm-sb__chev{transform:rotate(90deg)}.rm-sb__rule{background:var(--rm-shell-border);height:1px;margin:4px}.rm-mi{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-shadow:none;color:var(--rm-shell-text);cursor:pointer;display:flex;font-family:inherit;gap:var(--space-8);height:26px;margin:0;padding:var(--space-2);text-align:left;text-decoration:none;transition:background-color .15s;width:100%}.rm-mi:hover{background:color-mix(in srgb,var(--rm-shell-subtle) 50%,transparent)}.rm-mi.rm-mi--active{background:var(--rm-shell-subtle)}.rm-mi.rm-mi--current{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent)}.rm-mi.rm-mi--current .rm-mi__icon{background:var(--rm-shell-accent);color:#fff}.rm-mi.rm-mi--current .rm-mi__icon svg{stroke:#fff}.rm-mi__icon{align-items:center;background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;height:22px;justify-content:center;line-height:1;width:22px}.rm-mi__icon svg{display:block;height:14px;width:14px}.rm-mi__icon i{font-size:var(--font-14);line-height:1}.rm-mi__label{color:var(--rm-shell-text);flex:1;font-size:var(--font-14);line-height:1.625;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-mi__badge{background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-muted);flex-shrink:0;font-size:9px;font-weight:700;letter-spacing:.025em;padding:var(--space-2) var(--space-4);text-transform:uppercase}.rm-mi-parent{display:flex;flex-direction:column;gap:var(--space-4)}.rm-mi-row{align-items:center;display:flex;gap:var(--space-2)}.rm-mi-row>.rm-mi{flex:1;min-width:0}.rm-mi__toggle{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;color:var(--rm-shell-text-muted);cursor:pointer;display:flex;flex-shrink:0;height:22px;justify-content:center;padding:0;width:22px}.rm-mi__toggle:hover{background:color-mix(in srgb,var(--rm-shell-subtle) 50%,transparent);color:var(--rm-shell-text)}.rm-mi__toggle[aria-expanded=true] .rm-sb__chev{transform:rotate(90deg)}.rm-mi.rm-mi--within .rm-mi__label{font-weight:600}.rm-sb__children{border-left:1px solid var(--rm-shell-border);display:flex;flex-direction:column;gap:var(--space-4);margin-left:13px;padding-left:var(--space-8)}.rm-sb--collapsed .rm-mi{justify-content:center}.rm-sb--collapsed .rm-mi>:not(.rm-mi__icon),.rm-sb--collapsed .rm-sb__sub{display:none}.rm-sb__tip{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:6px;box-shadow:0 4px 12px rgba(30,41,59,.1);color:var(--rm-shell-text);font-size:var(--font-12);line-height:1.3;padding:5px 9px;pointer-events:none;position:fixed;transform:translateY(-50%);white-space:nowrap;z-index:60}.rm-sb__sub{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) 0 var(--space-2) 28px}.rm-sb__sub-item{border-radius:4px;color:var(--rm-shell-text);display:block;font-size:var(--font-14);line-height:1.625;overflow:hidden;padding:var(--space-2) var(--space-4);text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-sb__sub-item:hover{background:color-mix(in srgb,var(--rm-shell-subtle) 50%,transparent)}.rm-rail__item{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;cursor:pointer;display:flex;flex-direction:column;font-family:inherit;gap:var(--space-4);margin:0;padding:var(--space-12) 0 var(--space-8);text-decoration:none;width:100%}.rm-rail__avatar{align-items:center;border:2px solid var(--rm-shell-surface);border-radius:9999px;color:#fff;display:flex;font-size:var(--font-14);height:32px;justify-content:center;transition:opacity .15s;width:32px}.rm-rail__item:hover .rm-rail__avatar{opacity:.8}.rm-rail__tile{align-items:center;background:var(--rm-shell-subtle);border-radius:8px;color:var(--rm-shell-text-dark);display:flex;font-size:var(--font-16);height:32px;justify-content:center;transition:background-color .15s,color .15s;width:32px}.rm-rail__item:hover .rm-rail__tile{background:var(--rm-shell-border)}.rm-rail__item.rm-rail__item--active .rm-rail__tile{background:var(--rm-shell-accent);color:#fff}.rm-rail__item.rm-rail__item--disabled{cursor:default}.rm-rail__item.rm-rail__item--disabled .rm-rail__caption,.rm-rail__item.rm-rail__item--disabled i{opacity:.4}.rm-rail__item.rm-rail__item--disabled:hover .rm-rail__tile{background:var(--rm-shell-subtle)}.rm-rail__tile{position:relative}.rm-rail__badge{background:var(--rm-shell-accent);border-radius:9999px;color:#fff;font-size:var(--font-10);font-weight:700;height:16px;line-height:16px;min-width:16px;padding:0 var(--space-4);position:absolute;right:-4px;text-align:center;top:-4px}.rm-rail__item--active .rm-rail__badge{background:#fff;color:var(--rm-shell-accent)}.rm-rail__dot{animation:rm-rail-dot-pulse 2s ease-out infinite;background:var(--color-success,#16a34a);border:2px solid var(--rm-shell-surface);border-radius:9999px;height:10px;position:absolute;right:-2px;top:-2px;width:10px}@keyframes rm-rail-dot-pulse{0%{box-shadow:0 0 0 0 rgba(22,163,74,.55)}70%{box-shadow:0 0 0 6px rgba(22,163,74,0)}to{box-shadow:0 0 0 0 rgba(22,163,74,0)}}@media (prefers-reduced-motion:reduce){.rm-rail__dot{animation:none}}.rm-rail__item--active .rm-rail__dot{border-color:var(--rm-shell-accent)}.rm-rail__caption{color:var(--rm-shell-text-muted);font-size:var(--font-10);line-height:1;max-width:100%;overflow:hidden;padding:0 var(--space-2);text-overflow:ellipsis;transition:color .15s;white-space:nowrap}.rm-rail__item--active .rm-rail__caption,.rm-rail__item:hover .rm-rail__caption{color:var(--rm-shell-text)}.rm-rail__bottom{align-items:center;display:flex;flex-direction:column;gap:var(--space-10);margin-top:auto;padding-bottom:var(--space-16)}.rm-dns{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--bg-app,#f5f5f9);border:1px solid var(--rm-shell-border);border-radius:9999px;box-shadow:inset 0 1px 2px rgba(30,41,59,.06);box-sizing:border-box;cursor:pointer;display:flex;flex:0 0 auto;flex-direction:column;height:64px;margin:0;padding:var(--space-2);position:relative;width:32px}.rm-dns__thumb{background:#fff;border-radius:9999px;box-shadow:0 1px 3px rgba(30,41,59,.15);height:calc(50% - 2px);left:2px;position:absolute;top:2px;transition:top .24s cubic-bezier(.2,0,0,1);width:calc(100% - 4px);z-index:1}.rm-dns__half{align-items:center;border-radius:9999px;display:flex;flex:1;font-size:var(--font-14);justify-content:center;line-height:1;position:relative;transition:color .2s ease;z-index:2}.rm-dns__half[data-dns=day]{color:#f59e0b}.rm-dns__half[data-dns=night]{color:var(--text-muted,#8a90a8)}.rm-dns:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}body.night .rm-dns{background:#14141c;border-color:#2f2f40;box-shadow:inset 0 1px 2px rgba(0,0,0,.4)}body.night .rm-dns__thumb{background:var(--color-accent-soft);box-shadow:0 1px 4px rgba(180,133,255,.5);top:50%}body.night .rm-dns__half[data-dns=day]{color:#525670}body.night .rm-dns__half[data-dns=night]{color:var(--bg-surface)}.rm-dns--wide{flex-direction:row;height:32px;width:100%}.rm-dns--wide .rm-dns__thumb{height:calc(100% - 4px);left:2px;top:2px;transition:left .24s cubic-bezier(.2,0,0,1);width:calc(50% - 2px)}body.night .rm-dns--wide .rm-dns__thumb{left:50%;top:2px}.rm-dns--wide .rm-dns__half{font-size:var(--font-12);gap:var(--space-6)}.rm-dns__text{font-weight:600}@media (prefers-reduced-motion:reduce){.rm-dns__thumb{transition:none}}.rm-lang__current span,.rm-lang__item-flag{font-family:Twemoji Country Flags,Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji,sans-serif}.rm-lang{display:flex;flex:0 0 auto;position:relative}.rm-lang__current{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:9999px;box-sizing:border-box;cursor:pointer;display:flex;font-size:17px;gap:var(--space-8);height:32px;justify-content:center;line-height:1;margin:0;padding:0;transition:border-color .15s,background-color .15s;width:32px}.rm-lang__current:hover{background:var(--rm-shell-subtle)}.rm-lang__current:hover,.rm-lang__current[aria-expanded=true]{border-color:var(--rm-shell-accent)}.rm-lang__current:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}.rm-lang__menu{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:8px;bottom:0;box-shadow:0 8px 24px rgba(var(--shadow-rgb,30,41,59),.12);min-width:160px;padding:var(--space-4);position:absolute;right:calc(100% + 8px);z-index:300}.rm-lang__item{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-sizing:border-box;color:var(--rm-shell-text);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-14);gap:var(--space-8);line-height:1.5;margin:0;padding:var(--space-4) var(--space-6);text-align:left;white-space:nowrap;width:100%}.rm-lang__item:hover{background:var(--rm-shell-subtle)}.rm-lang__item--active{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent);font-weight:600}.rm-lang__item-flag{flex-shrink:0;font-size:17px;line-height:1}.rm-lang-enter-active,.rm-lang-leave-active{transition:opacity .14s ease,transform .14s ease}.rm-lang-enter-from,.rm-lang-leave-to{opacity:0;transform:translateX(4px)}@media (prefers-reduced-motion:reduce){.rm-lang-enter-active,.rm-lang-leave-active{transition:none}}.rm-hd{background:var(--rm-shell-surface);border-bottom:1px solid var(--rm-shell-border);display:flex;flex-direction:column;flex-shrink:0}.rm-hd__row{gap:var(--space-16);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-hd__crumbs,.rm-hd__row{align-items:center;display:flex}.rm-hd__crumbs{flex:1;font-size:var(--font-14);gap:var(--space-4);min-width:0}.rm-hd__crumb{align-items:center;color:var(--rm-shell-text-muted);display:inline-flex;gap:var(--space-6);text-decoration:none;transition:color .15s;white-space:nowrap}a.rm-hd__crumb:hover{color:var(--rm-shell-text)}.rm-hd__sep{color:var(--rm-shell-text-muted)}.rm-hd__picker{display:inline-flex;min-width:0;position:relative}.rm-hd__crumb--picker{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:4px;box-shadow:none;cursor:pointer;font:inherit;font-size:var(--font-14);margin:0;padding:var(--space-2) var(--space-4);transition:background-color .15s,color .15s}.rm-hd__crumb--picker:hover{background:var(--rm-shell-subtle)}.rm-hd__caret{display:block;flex-shrink:0;height:12px;opacity:.7;transition:transform .15s;width:12px}.rm-hd__caret--open{transform:rotate(180deg)}.rm-hd__menu{background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:8px;box-shadow:0 8px 24px rgba(30,41,59,.12);left:0;max-height:60vh;max-width:320px;min-width:200px;overflow-y:auto;padding:var(--space-4);position:absolute;top:calc(100% + 4px);z-index:300}.rm-hd__menu-item{align-items:center;border-radius:4px;color:var(--rm-shell-text);display:flex;font-size:var(--font-14);gap:var(--space-8);line-height:1.5;overflow:hidden;padding:var(--space-4) var(--space-6);text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rm-hd__menu-item:hover{background:var(--rm-shell-subtle)}.rm-hd__menu-group{color:var(--rm-shell-text-muted);display:block;font-size:var(--font-10);font-weight:500;letter-spacing:.025em;line-height:1.6;padding:var(--space-8) var(--space-6) var(--space-2);text-transform:uppercase}.rm-hd__menu-group:first-child{padding-top:var(--space-2)}.rm-hd__menu-item--active{background:color-mix(in srgb,var(--rm-shell-accent) 5%,transparent);font-weight:600}.rm-hd__menu-icon{align-items:center;background:var(--rm-shell-subtle);border-radius:4px;color:var(--rm-shell-text-dark);display:flex;flex-shrink:0;height:22px;justify-content:center;line-height:1;width:22px}.rm-hd__menu-icon i{font-size:var(--font-14);line-height:1}.rm-hd__menu-item--active .rm-hd__menu-icon{background:var(--rm-shell-accent);color:#fff}.rm-hd__crumb--last{color:var(--rm-shell-text);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-hd__search{align-items:center;background:var(--rm-shell-surface);border:1px solid var(--rm-shell-border);border-radius:9999px;display:flex;flex-shrink:0;gap:var(--space-4);padding:var(--space-4) var(--space-12);width:300px}.rm-hd__search input{background:transparent;border:none;color:var(--rm-shell-text);flex:1;font-family:inherit;font-size:var(--font-14);line-height:20px;min-width:0;outline:none;padding:0}.rm-hd__search input::-moz-placeholder{color:var(--rm-shell-text-muted)}.rm-hd__search input::placeholder{color:var(--rm-shell-text-muted)}.rm-hd__search i,.rm-hd__search svg{color:var(--rm-shell-text-muted);display:block;flex-shrink:0;font-size:var(--font-14);height:14px;line-height:20px;width:14px}.rm-hd__tabs{display:flex;gap:var(--space-16);padding:0 var(--space-16)}.rm-hd__tab{align-items:flex-start;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-bottom:2px solid transparent;border-radius:0;box-shadow:none;color:var(--rm-shell-text-dark);cursor:pointer;display:flex;flex-direction:column;font-family:inherit;font-size:var(--font-14);font-weight:700;line-height:1.6;margin:0;padding:var(--space-4) var(--space-4) var(--space-8);white-space:nowrap}.rm-hd__tab-label{align-items:center;display:inline-flex;gap:var(--space-6)}.rm-hd__tab-count{background:color-mix(in srgb,currentColor 12%,transparent);border-radius:var(--radius-pill);font-size:var(--font-12);font-weight:600;line-height:1.5;padding:0 var(--space-6)}.rm-hd__tab--active{border-bottom-color:var(--rm-shell-accent);color:var(--rm-shell-text)}@media (max-width:767px){.rm-sb--left{inset:0 auto 0 0;position:absolute;transform:translateX(-100%);transition:transform .2s;z-index:40}.rm-sb--left.rm-sb--open{transform:translateX(0)}.rm-sb--right{display:none}.rm-hd__search{flex:1;width:auto}}.rm-panel{background:var(--rm-shell-surface);border-left:1px solid var(--rm-shell-border);bottom:0;box-shadow:-8px 0 24px rgba(30,41,59,.08);display:flex;flex-direction:column;position:absolute;right:0;top:0;width:min(var(--rm-panel-w,640px),calc(100vw - 160px));z-index:401}.rm-panel__veil{backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);background:var(--rm-panel-veil,rgba(100,116,139,.12));cursor:default;inset:0;position:absolute;z-index:400}.rm-panel-veil-enter-active,.rm-panel-veil-leave-active{transition:opacity .22s ease}.rm-panel-veil-enter-from,.rm-panel-veil-leave-to{opacity:0}@media (prefers-reduced-motion:reduce){.rm-panel-veil-enter-active,.rm-panel-veil-leave-active{transition:none}}.rm-sb--right{position:relative;z-index:402}.rm-panel-enter-active,.rm-panel-leave-active,.rm-sb--right{transition:transform .22s cubic-bezier(.4,0,.2,1)}.rm-panel-enter-from,.rm-panel-leave-to{transform:translateX(100%)}@media (prefers-reduced-motion:reduce){.rm-panel-enter-active,.rm-panel-leave-active,.rm-sb--right{transition:none}}.rm-panel__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);height:var(--rm-bar-h);padding:0 var(--space-16)}.rm-panel__title{color:var(--rm-shell-text);flex:1;font-size:var(--font-14);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-panel__close{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:0;box-shadow:none;color:var(--rm-shell-text-muted);cursor:pointer;display:block;flex-shrink:0;height:20px;margin:0;padding:0;transition:color .15s;width:20px}.rm-panel__close:hover{color:var(--rm-shell-text)}.rm-panel__close svg{display:block;height:100%;width:100%}.rm-panel__header:has(+.rm-panel__tabs){border-bottom:none}.rm-panel__tabs{border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:var(--space-8);overflow-x:auto;padding:0 var(--space-16)}.rm-panel__tab{background:none;border:none;border-bottom:3px solid transparent;border-radius:8px 8px 0 0;color:var(--text-muted);cursor:pointer;font-family:inherit;font-size:var(--font-14);font-weight:500;line-height:1.6;margin-bottom:-1px;padding:var(--space-8) var(--space-16) var(--space-10);transition:background-color .3s,color .15s;white-space:nowrap}.rm-panel__tab:hover{color:var(--color-primary)}.rm-panel__tab.rm-panel__tab--disabled,.rm-panel__tab.rm-panel__tab--disabled:hover{color:var(--text-muted);cursor:default;opacity:.45}.rm-panel__tab--active{background:color-mix(in srgb,var(--color-primary) 6%,transparent);border-bottom-color:var(--color-primary);color:var(--color-primary);font-weight:600}.rm-panel__tab-count{background:color-mix(in srgb,currentColor 12%,transparent);border-radius:var(--radius-pill);display:inline-block;font-size:var(--font-12);font-weight:600;line-height:1.5;margin-left:var(--space-6);padding:0 var(--space-6)}.rm-panel__body{flex:1;min-height:0;overflow-y:auto;padding:var(--space-16)}@media (max-width:767px){.rm-panel{border-left:none;left:0;width:auto}}
@@ -14,6 +14,16 @@
14
14
  navigation devient un long defilement. Le style du libelle, lui, ne change
15
15
  pas. Un groupe sans `label` reste toujours ouvert, comme le premier groupe
16
16
  d'oip7.
17
+
18
+ Sous-pages : une entree peut porter `children`, sur un seul niveau. Une app
19
+ qui ouvre plusieurs objets du meme genre (une profession de l'annuaire HCP
20
+ et ses pages Recherche, Liste, Qualifications) mettait les pages de l'objet
21
+ ouvert dans un groupe a part, en haut, loin de l'entree cliquee : on ne
22
+ voyait plus a quoi elles se rapportaient. Elles se deplient desormais sous
23
+ leur entree, d'elles-memes quand la page courante en fait partie, et un
24
+ chevron les plie ou les deplie sans changer de page. Barre repliee, seules
25
+ les entrees de premier niveau restent : la sous-page courante allume
26
+ l'icone de son parent.
17
27
  -->
18
28
  <script setup lang="ts">
19
29
  import { computed, ref, watch } from 'vue'
@@ -30,6 +40,11 @@ export interface RmNavItem {
30
40
  badge?: string
31
41
  /** Force l'etat actif quand le chemin ne suffit pas a le deduire. */
32
42
  active?: boolean
43
+ /**
44
+ * Sous-pages, sur un seul niveau : elles se deplient sous l'entree. Cf.
45
+ * « Sous-pages » dans l'en-tete.
46
+ */
47
+ children?: RmNavItem[]
33
48
  }
34
49
 
35
50
  export interface RmNavSection {
@@ -102,14 +117,17 @@ const trim = (path: string) => (path.split('?')[0] || '').replace(/\/+$/, '') ||
102
117
  * prefixe, pour qu'une sous-page (« /prices/jo ») ouvre la section de son
103
118
  * entree.
104
119
  */
120
+ /** Les entrees d'une section et leurs sous-pages, a plat. */
121
+ const flat = (items: RmNavItem[]) => items.flatMap(i => [i, ...(i.children ?? [])])
122
+
105
123
  const sectionOf = (path?: string) => {
106
- const byActive = collapsibles.value.find(s => s.items.some(i => i.active))
124
+ const byActive = collapsibles.value.find(s => flat(s.items).some(i => i.active))
107
125
  if (byActive) return byActive.key
108
126
 
109
127
  const here = path ? trim(path) : null
110
128
  if (here) {
111
129
  const byPath = collapsibles.value.find(s =>
112
- s.items.some((i) => {
130
+ flat(s.items).some((i) => {
113
131
  if (!i.to) return false
114
132
  const to = trim(i.to)
115
133
  return here === to || here.startsWith(`${to}/`)
@@ -171,6 +189,36 @@ const isOpen = (s: RmNavSection) =>
171
189
  !isCollapsible(s) || props.collapsed || openSections.value.has(s.key)
172
190
  const isActive = (item: RmNavItem) => item.active ?? (!!item.to && item.to === props.activePath)
173
191
 
192
+ /** Une sous-page de l'entree est la page courante. */
193
+ const childActive = (item: RmNavItem) => !!item.children?.some(isActive)
194
+ /**
195
+ * Le fond actif de l'entree parente. Depliee, il passe a la sous-page : la
196
+ * premiere sous-page reprend souvent le lien du parent (« Medecins » et
197
+ * « Recherche » menent au meme ecran), et deux lignes surlignees ne disaient
198
+ * plus ou l'on est. Repliee, la barre ne montre plus les sous-pages : le
199
+ * parent porte alors l'etat de sa sous-page.
200
+ */
201
+ const parentActive = (item: RmNavItem) =>
202
+ props.collapsed ? isActive(item) || childActive(item) : isActive(item) && !childActive(item)
203
+
204
+ const itemKey = (item: RmNavItem) => item.to ?? item.href ?? item.label
205
+
206
+ /**
207
+ * Entrees aux sous-pages deployees. Celle de la page courante s'ouvre a
208
+ * l'arrivee, comme sa section ; le chevron plie et deplie les autres sans
209
+ * changer de page.
210
+ */
211
+ const openItems = ref<Set<string>>(new Set())
212
+ watch(() => props.sections.flatMap(s => s.items).filter(i => isActive(i) || childActive(i)).map(itemKey), (keys) => {
213
+ for (const key of keys) openItems.value.add(key)
214
+ }, { immediate: true })
215
+
216
+ function toggleItem(item: RmNavItem) {
217
+ const key = itemKey(item)
218
+ if (openItems.value.has(key)) openItems.value.delete(key)
219
+ else openItems.value.add(key)
220
+ }
221
+
174
222
  /**
175
223
  * Infobulle du rail replie.
176
224
  *
@@ -286,6 +334,66 @@ watch(() => props.collapsed, hideTip)
286
334
  <path d="M9 3L3 9M9 3H5M9 3V7" />
287
335
  </svg>
288
336
  </a>
337
+ <!-- Entree a sous-pages : le lien, son chevron, puis les sous-pages. -->
338
+ <div v-else-if="item.children?.length" class="rm-mi-parent">
339
+ <div class="rm-mi-row">
340
+ <NuxtLink
341
+ :to="item.to"
342
+ class="rm-mi"
343
+ :class="{ 'rm-mi--active': parentActive(item), 'rm-mi--within': !collapsed && childActive(item) }"
344
+ :title="collapsed ? undefined : item.label"
345
+ :aria-current="isActive(item) && !childActive(item) ? 'page' : undefined"
346
+ @click="item.to ? emit('navigate', item.to) : undefined"
347
+ @mouseenter="showTip($event, item)"
348
+ @mouseleave="hideTip"
349
+ @focus="showTip($event, item)"
350
+ @blur="hideTip"
351
+ >
352
+ <span class="rm-mi__icon"><i v-if="item.icon" :class="`ph ph-${item.icon}`" /></span>
353
+ <span class="rm-mi__label">{{ item.label }}</span>
354
+ <span v-if="item.badge" class="rm-mi__badge">{{ item.badge }}</span>
355
+ </NuxtLink>
356
+ <button
357
+ v-if="!collapsed"
358
+ class="rm-mi__toggle"
359
+ type="button"
360
+ :aria-expanded="openItems.has(itemKey(item))"
361
+ :aria-label="`${openItems.has(itemKey(item)) ? 'Masquer' : 'Afficher'} les pages de ${item.label}`"
362
+ @click="toggleItem(item)"
363
+ >
364
+ <svg class="rm-sb__chev" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5">
365
+ <path d="M4 2.5L7.5 6L4 9.5" />
366
+ </svg>
367
+ </button>
368
+ </div>
369
+ <div v-if="!collapsed && openItems.has(itemKey(item))" class="rm-sb__children" role="group" :aria-label="item.label">
370
+ <template v-for="child in item.children" :key="itemKey(child)">
371
+ <a
372
+ v-if="child.href"
373
+ :href="child.href"
374
+ target="_blank"
375
+ rel="noopener noreferrer"
376
+ class="rm-mi"
377
+ >
378
+ <span class="rm-mi__icon"><i v-if="child.icon" :class="`ph ph-${child.icon}`" /></span>
379
+ <span class="rm-mi__label">{{ child.label }}</span>
380
+ <span v-if="child.badge" class="rm-mi__badge">{{ child.badge }}</span>
381
+ </a>
382
+ <NuxtLink
383
+ v-else
384
+ :to="child.to"
385
+ class="rm-mi"
386
+ :class="{ 'rm-mi--active': isActive(child) }"
387
+ :aria-current="isActive(child) ? 'page' : undefined"
388
+ @click="child.to ? emit('navigate', child.to) : undefined"
389
+ >
390
+ <span class="rm-mi__icon"><i v-if="child.icon" :class="`ph ph-${child.icon}`" /></span>
391
+ <span class="rm-mi__label">{{ child.label }}</span>
392
+ <span v-if="child.badge" class="rm-mi__badge">{{ child.badge }}</span>
393
+ </NuxtLink>
394
+ </template>
395
+ </div>
396
+ </div>
289
397
  <NuxtLink
290
398
  v-else
291
399
  :to="item.to"
@@ -16,6 +16,7 @@
16
16
  import type { Component } from "vue";
17
17
  import type {
18
18
  OipExternalCrumb,
19
+ OipNavItem,
19
20
  OipNavSection,
20
21
  OipRailTile,
21
22
  } from "../types/oip";
@@ -132,10 +133,13 @@ const currentPath = computed(() => normalize(route.path));
132
133
  * Entree active : la plus longue dont le chemin prefixe celui de la page.
133
134
  * Un prefixe simple ferait briller "Prix" en meme temps que "Prix > JO".
134
135
  */
136
+ /** Les entrees d'une section et leurs sous-pages (`children`), a plat. */
137
+ const flatItems = (items: OipNavItem[]): OipNavItem[] => items.flatMap((item) => [item, ...(item.children ?? [])]);
138
+
135
139
  const activeTo = computed(() => {
136
140
  let best = "";
137
141
  for (const section of props.sections) {
138
- for (const item of section.items) {
142
+ for (const item of flatItems(section.items)) {
139
143
  if (!item.to) continue;
140
144
  const to = normalize(item.to);
141
145
  const hit = currentPath.value === to || currentPath.value.startsWith(to + "/");
@@ -152,13 +156,16 @@ const navSections = computed<OipNavSection[]>(() =>
152
156
  items: section.items.map((item) => ({
153
157
  ...item,
154
158
  active: !!item.to && normalize(item.to) === activeTo.value,
159
+ ...(item.children
160
+ ? { children: item.children.map((child) => ({ ...child, active: !!child.to && normalize(child.to) === activeTo.value })) }
161
+ : {}),
155
162
  })),
156
163
  })),
157
164
  );
158
165
 
159
166
  const activeItem = computed(() => {
160
167
  for (const section of props.sections) {
161
- for (const item of section.items) {
168
+ for (const item of flatItems(section.items)) {
162
169
  if (item.to && normalize(item.to) === activeTo.value) return item;
163
170
  }
164
171
  }
@@ -236,7 +243,7 @@ const partMenu = computed(() =>
236
243
  /** Le dernier maillon ouvre toutes les pages de la partie, sections confondues. */
237
244
  const pageMenu = computed(() =>
238
245
  props.sections.flatMap((section) =>
239
- section.items
246
+ flatItems(section.items)
240
247
  .filter((item) => item.to)
241
248
  .map((item) => ({
242
249
  label: item.label,
@@ -137,7 +137,7 @@ export default function useEuct() {
137
137
  };
138
138
 
139
139
  queryCustomElastic({
140
- index: 'ope_block374_clinical_trials_euct',
140
+ index: indexConfig.euct.index,
141
141
  customQuery: customQuery ? customQuery : query,
142
142
  })
143
143
  .then((res) => {
@@ -5,6 +5,7 @@
5
5
  // de recherche) n'a pas de sens ici : les resultats reviennent a l'appelant.
6
6
 
7
7
  import { instrumentSearchClause, searchMatchOf } from "./useOipSearchExplain";
8
+ import indexConfig from "../indexConfig.json";
8
9
 
9
10
  export default function useOipElastic() {
10
11
  const config = useRuntimeConfig();
@@ -459,8 +460,10 @@ export default function useOipElastic() {
459
460
  };
460
461
 
461
462
  // FETCH. FAS chose the aggregation shape from the current route (/pubmed,
462
- // /euct); a layer view has no route of its own, the index says the same.
463
- const currentPath = index.includes('pubmed') ? '/pubmed' : index.includes('euct') ? '/euct' : '';
463
+ // /euct); a layer view has no route of its own, the index says the same
464
+ // (indexes are Directus ids, resolved by the proxy).
465
+ const refs = String(index).split(',');
466
+ const currentPath = refs.includes(indexConfig.pubmed.index) ? '/pubmed' : refs.includes(indexConfig.euct.index) ? '/euct' : '';
464
467
  const res: any = await esFetch(cluster, index, query);
465
468
 
466
469
  if (!isDisposed && res) {
@@ -182,7 +182,7 @@ export default function usePubmed() {
182
182
  const lastUpdatedData = async () => {
183
183
  let lastUpdate = null;
184
184
  await queryCustomElastic({
185
- index: 'oip-discovery-pubmed',
185
+ index: indexConfig.pubmed.index,
186
186
  customQuery: {
187
187
  from: 0,
188
188
 
@@ -241,7 +241,7 @@ export default function usePubmed() {
241
241
  };
242
242
 
243
243
  queryCustomElastic({
244
- index: 'oip-discovery-pubmed',
244
+ index: indexConfig.pubmed.index,
245
245
  cluster: 'pubmed',
246
246
  customQuery: customQuery ? customQuery : query,
247
247
  })
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "globalCT": {
3
- "index": "oip_datamart_clinicaltrials_prod",
3
+ "index": "9ec0c673-7da4-4ead-8359-2d23b7b1318a",
4
4
  "nameList": "/ctgov/&ListName=globalCTList",
5
5
  "keyName": "globalCTList",
6
6
  "cluster": "pubmed",
@@ -68,7 +68,6 @@
68
68
  "Keywords": "keywords.keyword_name"
69
69
  }
70
70
  },
71
-
72
71
  "Arm and Intervention": {
73
72
  "type": "field",
74
73
  "values": {
@@ -78,7 +77,9 @@
78
77
  },
79
78
  "Genes": {
80
79
  "type": "field",
81
- "values": { "Genes": "genomics.symbol" }
80
+ "values": {
81
+ "Genes": "genomics.symbol"
82
+ }
82
83
  },
83
84
  "Rare Diseases": {
84
85
  "type": "nested_field",
@@ -90,7 +91,7 @@
90
91
  }
91
92
  },
92
93
  "globalCTInvestigators": {
93
- "index": "oip_datamart_clinical_trials_investigators_kol",
94
+ "index": "de97c889-a844-430d-ad39-b42812787f21",
94
95
  "nameList": "/ctgov/investigators&ListName=globalCTInvestigatorList",
95
96
  "keyName": "globalCTInvestigatorList",
96
97
  "cluster": "pubmed",
@@ -115,7 +116,7 @@
115
116
  ]
116
117
  },
117
118
  "globalCTCenters": {
118
- "index": "oip_datamart_clinical_trials_centers_kcl",
119
+ "index": "b1e521b1-8722-406b-88e5-1c49d9cb7fa8",
119
120
  "nameList": "/ctgov/centers&ListName=globalCTCenterList",
120
121
  "keyName": "globalCTCenterList",
121
122
  "cluster": "pubmed",
@@ -142,7 +143,7 @@
142
143
  ]
143
144
  },
144
145
  "euct": {
145
- "index": "ope_block374_clinical_trials_euct",
146
+ "index": "c332f362-2311-4025-b5de-327f81913f7d",
146
147
  "nameList": "/euct/&ListName=euCTList",
147
148
  "keyName": "euCTList",
148
149
  "cluster": "pubmed",
@@ -234,7 +235,7 @@
234
235
  }
235
236
  },
236
237
  "euctInvestigators": {
237
- "index": "ope_block374_clinical_trials_eu_investigators",
238
+ "index": "fb8896df-8798-4bab-8219-2462d948a7a0",
238
239
  "nameList": "/euct/investigators&ListName=euroCTInvestigatorList",
239
240
  "keyName": "euroCTInvestigatorList",
240
241
  "cluster": "pubmed",
@@ -247,7 +248,6 @@
247
248
  "records.therapeutic_area",
248
249
  "records.diseases.icd10.combined_label",
249
250
  "records.diseases.section.label"
250
-
251
251
  ],
252
252
  "nestedFields": [],
253
253
  "SuggFields": [
@@ -262,7 +262,7 @@
262
262
  ]
263
263
  },
264
264
  "euctCenters": {
265
- "index": "ope_block374_clinical_trials_eu_kcl",
265
+ "index": "7f2e9e35-4bbd-4cbd-afb3-bab35999e17f",
266
266
  "nameList": "/euct/centers&ListName=euroCTCenterList",
267
267
  "keyName": "euroCTCenterList",
268
268
  "cluster": "pubmed",
@@ -295,7 +295,7 @@
295
295
  ]
296
296
  },
297
297
  "gene": {
298
- "index": "ope_block410_genomics",
298
+ "index": "78743dbc-1c7d-4f34-8222-026a78d4e8b1",
299
299
  "nameList": "/omics/genes&ListName=omicsList",
300
300
  "keyName": "omicsList",
301
301
  "cluster": "pubmed",
@@ -366,7 +366,7 @@
366
366
  }
367
367
  },
368
368
  "molecule": {
369
- "index": "oip-discovery-molecules",
369
+ "index": "64716d7e-eb95-492b-b91d-56c68f4f8911",
370
370
  "nameList": "/omics/molecules&ListName=moleculesList",
371
371
  "keyName": "moleculesList",
372
372
  "cluster": "pubmed",
@@ -414,7 +414,7 @@
414
414
  }
415
415
  },
416
416
  "pubmed": {
417
- "index": "oip-discovery-pubmed",
417
+ "index": "cf7919cf-3980-4cf1-b192-f4e3b7d52a19",
418
418
  "nameList": "/pubmed&ListName=pubMedList",
419
419
  "keyName": "pubMedList",
420
420
  "cluster": "pubmed",
@@ -533,7 +533,7 @@
533
533
  }
534
534
  },
535
535
  "disease": {
536
- "index": "oip-discovery-diseases",
536
+ "index": "40a95d53-f41b-4370-8745-0217684fb5b4",
537
537
  "nameList": "/omics/diseases&ListName=diseasesList",
538
538
  "keyName": "diseasesList",
539
539
  "cluster": "pubmed",
@@ -545,7 +545,9 @@
545
545
  "search_text",
546
546
  "concat_disease_name_icd10_code"
547
547
  ],
548
- "nestedFields": ["icd10.code"],
548
+ "nestedFields": [
549
+ "icd10.code"
550
+ ],
549
551
  "SuggFields": [
550
552
  "symbol",
551
553
  "synonym",
@@ -587,11 +589,16 @@
587
589
  }
588
590
  },
589
591
  "patent": {
590
- "index": "ope__patent__tekkare",
592
+ "index": "4587721d-538a-458d-9eb1-fc24911f366d",
591
593
  "nameList": "/patents&ListName=patentList",
592
594
  "keyName": "patentList",
593
595
  "cluster": "pubmed",
594
- "fields": ["title", "abstract", "publication_id", "family_id"],
596
+ "fields": [
597
+ "title",
598
+ "abstract",
599
+ "publication_id",
600
+ "family_id"
601
+ ],
595
602
  "nestedFields": [
596
603
  "rare_diseases.concat_disease_name_orpha_code",
597
604
  "rare_diseases.disease_synonyms",
@@ -623,7 +630,6 @@
623
630
  "Abstract": "abstract"
624
631
  }
625
632
  },
626
-
627
633
  "Classification": {
628
634
  "type": "nested_field",
629
635
  "values": {
@@ -654,7 +660,7 @@
654
660
  }
655
661
  },
656
662
  "establishments": {
657
- "index": "ope_block374__fr__clinical_trials__hco_directory",
663
+ "index": "919a60df-3447-4404-901b-2d293cfc00e1",
658
664
  "nameList": "/establishments/&ListName=establishmentList",
659
665
  "keyName": "establishmentList",
660
666
  "cluster": "pubmed",
@@ -675,31 +681,31 @@
675
681
  ]
676
682
  },
677
683
  "hcpPubmed": {
678
- "index": "ope_block374__fr__clinical_trials__hcp__pubmed",
684
+ "index": "fb956659-f5be-4340-8b1b-07304db96ca7",
679
685
  "cluster": "pubmed"
680
686
  },
681
687
  "hcpNct": {
682
- "index": "ope_block374__fr__clinical_trials__hcp__nct",
688
+ "index": "35f34ca6-2450-4dcf-a659-fb33140147ad",
683
689
  "cluster": "pubmed"
684
690
  },
685
691
  "hcpEuct": {
686
- "index": "ope_block374__fr__clinical_trials__hcp__euct",
692
+ "index": "c246a516-84c7-4deb-9c0c-5afedf08ffdd",
687
693
  "cluster": "pubmed"
688
694
  },
689
695
  "hcoNct": {
690
- "index": "ope_block374__fr__clinical_trials__hco__nct",
696
+ "index": "bb5bf512-a1c8-4805-b91a-00ae3b9caf64",
691
697
  "cluster": "pubmed"
692
698
  },
693
699
  "hcoEuct": {
694
- "index": "ope_block374__fr__clinical_trials__hco__euct",
700
+ "index": "4efefe73-8421-48b5-8bf8-835cb1ad7e5e",
695
701
  "cluster": "pubmed"
696
702
  },
697
703
  "rpps": {
698
- "index": "ope_block402_fr__hcp_physician__directory__rpps",
704
+ "index": "f9bcdd65-ec2a-47ad-b56d-7a59f2aa7898",
699
705
  "cluster": "pubmed"
700
706
  },
701
707
  "hcps": {
702
- "index": "ope_block374__fr__clinical_trials__hcp_directory",
708
+ "index": "c8ad547a-6f97-4002-9853-5256308b6cff",
703
709
  "nameList": "/hcps/&ListName=hcpList",
704
710
  "keyName": "hcpList",
705
711
  "cluster": "pubmed",
@@ -718,7 +724,7 @@
718
724
  ]
719
725
  },
720
726
  "phrc": {
721
- "index": "ope_block402_fr__drugs__phrc__datagouv",
727
+ "index": "da722bdc-3441-4358-9ab1-61c6afef3b0e",
722
728
  "nameList": "/appel-a-projet/&ListName=phrcList",
723
729
  "keyName": "phrcList",
724
730
  "cluster": "pubmed",
@@ -8,6 +8,8 @@ export type OipNavItem = {
8
8
  href?: string;
9
9
  badge?: string;
10
10
  active?: boolean;
11
+ /** Sous-pages, sur un seul niveau : RmSidebarLeft les deplie sous l'entree. */
12
+ children?: OipNavItem[];
11
13
  };
12
14
 
13
15
  export type OipNavSection = {
@@ -187,7 +187,7 @@ export const OIP_RESOURCE_SPECS: OipResourceSpec[] = [
187
187
  type: "PubMed",
188
188
  kind: {
189
189
  type: "PubMed",
190
- index: "oip-discovery-pubmed",
190
+ index: scienceIndexConfig.pubmed.index,
191
191
  label: { fr: "Publications", en: "Publications" },
192
192
  section: { fr: "PubMed", en: "PubMed" },
193
193
  icon: "Books",
@@ -85,10 +85,17 @@ export default defineEventHandler(async (event) => {
85
85
  if (groups.size > 1) throw createError({ status: 400, message: "Indexes require different credentials" });
86
86
  authKey = [...groups][0]!;
87
87
  } else {
88
+ // Les fiches designent leurs index par id Directus ; un nom (canonique ou
89
+ // physique) est admis s'il designe un index de la liste.
88
90
  const allowed = oipResourceIndexes(cluster as OipEsCluster);
89
- if (refs.some((ref) => !allowed.includes(ref))) throw createError({ status: 403, message: "Index not allowed" });
91
+ const ids = await Promise.all(
92
+ refs.map(async (ref) => (allowed.includes(ref) ? ref : (await findOipEsIndex(ref).catch(() => undefined))?.id)),
93
+ );
94
+ if (ids.some((id) => !id || !allowed.includes(id))) throw createError({ status: 403, message: "Index not allowed" });
90
95
  if (cluster === "science") {
91
- const groups = new Set(refs.map((ref) => (ref === OIP_PATIENT_INDEXES.VACCINE_PATIENTS ? "authVaccines" : "auth")));
96
+ const vaccines = (ref: string, index: number) =>
97
+ ref === OIP_PATIENT_INDEXES.VACCINE_PATIENTS || ids[index] === OIP_PATIENT_INDEXES.VACCINE_PATIENTS;
98
+ const groups = new Set(refs.map((ref, index) => (vaccines(ref, index) ? "authVaccines" : "auth")));
92
99
  if (groups.size > 1) throw createError({ status: 400, message: "Indexes require different credentials" });
93
100
  authKey = [...groups][0]!;
94
101
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.255",
3
+ "version": "0.1.257",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",