@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 +1 -1
- package/dist/runtime/assets/styles/shell.css +1 -1
- package/dist/runtime/components/SidebarLeft.vue +110 -2
- package/layer/app/components/OipShell.vue +10 -3
- package/layer/app/oip-science/composables/useEuct.ts +1 -1
- package/layer/app/oip-science/composables/useOipElastic.ts +5 -2
- package/layer/app/oip-science/composables/usePubmed.ts +2 -2
- package/layer/app/oip-science/indexConfig.json +32 -26
- package/layer/app/types/oip.ts +2 -0
- package/layer/app/utils/oipResources.ts +1 -1
- package/layer/server/api/oip/es.post.ts +9 -2
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -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,
|
|
@@ -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
|
-
|
|
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:
|
|
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:
|
|
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": "
|
|
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": {
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": [
|
|
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": "
|
|
592
|
+
"index": "4587721d-538a-458d-9eb1-fc24911f366d",
|
|
591
593
|
"nameList": "/patents&ListName=patentList",
|
|
592
594
|
"keyName": "patentList",
|
|
593
595
|
"cluster": "pubmed",
|
|
594
|
-
"fields": [
|
|
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": "
|
|
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": "
|
|
684
|
+
"index": "fb956659-f5be-4340-8b1b-07304db96ca7",
|
|
679
685
|
"cluster": "pubmed"
|
|
680
686
|
},
|
|
681
687
|
"hcpNct": {
|
|
682
|
-
"index": "
|
|
688
|
+
"index": "35f34ca6-2450-4dcf-a659-fb33140147ad",
|
|
683
689
|
"cluster": "pubmed"
|
|
684
690
|
},
|
|
685
691
|
"hcpEuct": {
|
|
686
|
-
"index": "
|
|
692
|
+
"index": "c246a516-84c7-4deb-9c0c-5afedf08ffdd",
|
|
687
693
|
"cluster": "pubmed"
|
|
688
694
|
},
|
|
689
695
|
"hcoNct": {
|
|
690
|
-
"index": "
|
|
696
|
+
"index": "bb5bf512-a1c8-4805-b91a-00ae3b9caf64",
|
|
691
697
|
"cluster": "pubmed"
|
|
692
698
|
},
|
|
693
699
|
"hcoEuct": {
|
|
694
|
-
"index": "
|
|
700
|
+
"index": "4efefe73-8421-48b5-8bf8-835cb1ad7e5e",
|
|
695
701
|
"cluster": "pubmed"
|
|
696
702
|
},
|
|
697
703
|
"rpps": {
|
|
698
|
-
"index": "
|
|
704
|
+
"index": "f9bcdd65-ec2a-47ad-b56d-7a59f2aa7898",
|
|
699
705
|
"cluster": "pubmed"
|
|
700
706
|
},
|
|
701
707
|
"hcps": {
|
|
702
|
-
"index": "
|
|
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": "
|
|
727
|
+
"index": "da722bdc-3441-4358-9ab1-61c6afef3b0e",
|
|
722
728
|
"nameList": "/appel-a-projet/&ListName=phrcList",
|
|
723
729
|
"keyName": "phrcList",
|
|
724
730
|
"cluster": "pubmed",
|
package/layer/app/types/oip.ts
CHANGED
|
@@ -187,7 +187,7 @@ export const OIP_RESOURCE_SPECS: OipResourceSpec[] = [
|
|
|
187
187
|
type: "PubMed",
|
|
188
188
|
kind: {
|
|
189
189
|
type: "PubMed",
|
|
190
|
-
index:
|
|
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
|
-
|
|
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
|
|
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
|
}
|