@tekkare/romulus 0.1.193 → 0.1.195
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
|
@@ -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}.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__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__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}.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__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--active,.rm-panel__tab:hover{color:var(--color-primary)}.rm-panel__tab--active{background:color-mix(in srgb,var(--color-primary) 6%,transparent);border-bottom-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}}
|
|
@@ -53,8 +53,6 @@ const emit = defineEmits<{
|
|
|
53
53
|
const FR = {
|
|
54
54
|
view: 'Vue',
|
|
55
55
|
brands: 'Marques',
|
|
56
|
-
trigger: 'Déclencheur',
|
|
57
|
-
watched: 'Champs suivis',
|
|
58
56
|
channel: 'Canaux',
|
|
59
57
|
cadence: 'Cadence',
|
|
60
58
|
tracked: 'éléments suivis',
|
|
@@ -67,9 +65,6 @@ const FR = {
|
|
|
67
65
|
journal: "Voir ce que l'alerte a rapporté",
|
|
68
66
|
journalClose: 'Replier le journal',
|
|
69
67
|
noEvents: 'Rien de signalé depuis la création.',
|
|
70
|
-
appeared: 'Nouvel élément',
|
|
71
|
-
changed: 'Changement de valeur',
|
|
72
|
-
disappeared: 'Sortie du périmètre',
|
|
73
68
|
in_app: 'Dans l’app',
|
|
74
69
|
email: 'Email',
|
|
75
70
|
daily: 'Une fois par jour au plus',
|
|
@@ -117,8 +112,6 @@ const FR = {
|
|
|
117
112
|
const EN = {
|
|
118
113
|
view: 'View',
|
|
119
114
|
brands: 'Brands',
|
|
120
|
-
trigger: 'Trigger',
|
|
121
|
-
watched: 'Watched fields',
|
|
122
115
|
channel: 'Channels',
|
|
123
116
|
cadence: 'Cadence',
|
|
124
117
|
tracked: 'items tracked',
|
|
@@ -131,9 +124,6 @@ const EN = {
|
|
|
131
124
|
journal: 'See what this alert reported',
|
|
132
125
|
journalClose: 'Collapse the journal',
|
|
133
126
|
noEvents: 'Nothing reported since it was created.',
|
|
134
|
-
appeared: 'New item',
|
|
135
|
-
changed: 'Value change',
|
|
136
|
-
disappeared: 'Left the scope',
|
|
137
127
|
in_app: 'In app',
|
|
138
128
|
email: 'Email',
|
|
139
129
|
daily: 'At most once a day',
|
|
@@ -218,10 +208,6 @@ const notice = computed(() => {
|
|
|
218
208
|
}
|
|
219
209
|
})
|
|
220
210
|
|
|
221
|
-
const triggerLabels = computed(() =>
|
|
222
|
-
props.alert.triggers.map((trigger) => T.value[trigger]),
|
|
223
|
-
)
|
|
224
|
-
|
|
225
211
|
const channelLabels = computed(() =>
|
|
226
212
|
props.alert.channels.map((channel) => (T.value as any)[channel] ?? channel),
|
|
227
213
|
)
|
|
@@ -336,14 +322,6 @@ function pick(item: RmAlertMenuItem) {
|
|
|
336
322
|
</div>
|
|
337
323
|
|
|
338
324
|
<dl class="rm-alert__spec">
|
|
339
|
-
<div class="rm-alert__row">
|
|
340
|
-
<dt>{{ T.trigger }}</dt>
|
|
341
|
-
<dd>{{ triggerLabels.join(', ') }}</dd>
|
|
342
|
-
</div>
|
|
343
|
-
<div v-if="alert.watchedLabels?.length" class="rm-alert__row">
|
|
344
|
-
<dt>{{ T.watched }}</dt>
|
|
345
|
-
<dd>{{ alert.watchedLabels.join(', ') }}</dd>
|
|
346
|
-
</div>
|
|
347
325
|
<div class="rm-alert__row">
|
|
348
326
|
<dt>{{ T.channel }}</dt>
|
|
349
327
|
<dd>
|
|
@@ -5,20 +5,19 @@
|
|
|
5
5
|
vue surveillee et le catalogue de champs de sa page, il lui rend un
|
|
6
6
|
descripteur.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
Deux choix de conception que l'ecran ne montre pas :
|
|
9
|
+
|
|
10
|
+
- aucune alerte ne choisit ni champs ni declencheurs, vue comme produit :
|
|
11
|
+
tout est suivi (les trois declencheurs, le document entier). Les trois
|
|
12
|
+
sortent du meme passage de diff, donc restreindre n'economisait rien, et
|
|
13
|
+
cocher « seulement l'apparition » faisait manquer un dereboursement. Le
|
|
14
|
+
tri se fait a la lecture (l'agent du digest ecarte le bruit), pas a la
|
|
15
|
+
creation ;
|
|
16
16
|
- la cadence appartient au mail. La pastille de l'app encaisse au fil de
|
|
17
|
-
l'eau, elle n'a pas de digest
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
ferait manquer un dereboursement.
|
|
17
|
+
l'eau, elle n'a pas de digest.
|
|
18
|
+
|
|
19
|
+
La prop `fields` reste acceptee pour ne pas casser les appelants, elle
|
|
20
|
+
n'est plus lue.
|
|
22
21
|
-->
|
|
23
22
|
<script setup lang="ts">
|
|
24
23
|
import { computed, ref, watch } from 'vue'
|
|
@@ -46,7 +45,7 @@ const props = withDefaults(
|
|
|
46
45
|
* l'entree « ecran actuel » au selecteur.
|
|
47
46
|
*/
|
|
48
47
|
canSaveScreen?: boolean
|
|
49
|
-
/**
|
|
48
|
+
/** Obsolete : toute alerte suit le document entier. Ignoree. */
|
|
50
49
|
fields?: RmAlertField[]
|
|
51
50
|
/**
|
|
52
51
|
* Marques proposees au choix, pour une alerte de produit. Elles arrivent
|
|
@@ -127,7 +126,7 @@ const FR = {
|
|
|
127
126
|
brandsHint: 'Cherchez par marque, molécule, classe ATC ou laboratoire. L’alerte couvre tout le hub pour chaque marque retenue.',
|
|
128
127
|
brandsRequired: 'Choisissez au moins une marque.',
|
|
129
128
|
brandsTooMany: 'Une alerte suit {max} marques au maximum.',
|
|
130
|
-
productFields: 'Rien à choisir :
|
|
129
|
+
productFields: 'Rien à choisir : l’alerte signale tout changement sur ces marques (nouvel élément, changement de valeur, sortie du périmètre).',
|
|
131
130
|
screenOption: 'Écran actuel (une vue sera créée)',
|
|
132
131
|
viewSelect: 'Vue à surveiller',
|
|
133
132
|
viewApplied: 'La vue choisie est appliquée à l’écran : c’est lui qui fournit la requête surveillée.',
|
|
@@ -135,21 +134,7 @@ const FR = {
|
|
|
135
134
|
name: 'Nom de l’alerte',
|
|
136
135
|
view: 'Vue surveillée',
|
|
137
136
|
viewHint: 'L’alerte se déclenche sur le périmètre de cette vue, tel qu’il est à l’écran.',
|
|
138
|
-
|
|
139
|
-
triggersHint: 'Les trois sortent de la même comparaison, en cocher plusieurs ne coûte rien.',
|
|
140
|
-
appeared: 'Nouvel élément',
|
|
141
|
-
appearedHint: 'Un résultat entre dans la vue',
|
|
142
|
-
changed: 'Changement de valeur',
|
|
143
|
-
changedHint: 'Un champ suivi bouge sur un élément déjà présent',
|
|
144
|
-
disappeared: 'Sortie du périmètre',
|
|
145
|
-
disappearedHint: 'Un élément quitte la vue (retrait, déremboursement)',
|
|
146
|
-
fields: 'Champs suivis',
|
|
147
|
-
fieldsHint: 'Un seul message par élément, quel que soit le nombre de champs cochés.',
|
|
148
|
-
fieldsRequired: 'Cochez au moins un champ pour surveiller les changements.',
|
|
149
|
-
noFields: 'Cette page ne propose aucun champ surveillable pour le moment.',
|
|
150
|
-
anyField: 'N’importe quel changement',
|
|
151
|
-
anyFieldHint:
|
|
152
|
-
'Tout le document est comparé. Plus large, mais plus bavard : une correction de libellé compte autant qu’un mouvement de prix.',
|
|
137
|
+
viewFields: 'Rien à choisir : l’alerte signale tout changement dans la vue (nouvel élément, changement de valeur, sortie du périmètre).',
|
|
153
138
|
channels: 'Canaux',
|
|
154
139
|
inApp: 'Dans l’app (pastille sur la tuile Alertes)',
|
|
155
140
|
email: 'Email',
|
|
@@ -162,7 +147,7 @@ const FR = {
|
|
|
162
147
|
'Un plafond, pas un rythme : rien ne part quand rien n’a bougé, et la détection suit celle des données.',
|
|
163
148
|
submit: 'Créer l’alerte',
|
|
164
149
|
save: 'Enregistrer',
|
|
165
|
-
reseed: '
|
|
150
|
+
reseed: 'Cette alerte suit désormais tout changement. L’enregistrer la fait repartir d’une nouvelle référence : vous ne serez prévenu que de ce qui bouge ensuite.',
|
|
166
151
|
cancel: 'Annuler',
|
|
167
152
|
baseline:
|
|
168
153
|
'L’alerte commence par relever l’état actuel, sans rien signaler. Restez quelques instants sur la page : elle passe à « Active » dans le panneau une fois ce relevé fait, et vous préviendra ensuite de ce qui bouge.',
|
|
@@ -180,7 +165,7 @@ const EN = {
|
|
|
180
165
|
brandsHint: 'Search by brand, molecule, ATC class or company. The alert covers the whole hub for each brand kept.',
|
|
181
166
|
brandsRequired: 'Pick at least one brand.',
|
|
182
167
|
brandsTooMany: 'An alert watches at most {max} brands.',
|
|
183
|
-
productFields: 'Nothing to choose:
|
|
168
|
+
productFields: 'Nothing to choose: the alert reports any change on these brands (new item, value change, left the scope).',
|
|
184
169
|
screenOption: 'Current screen (a view will be created)',
|
|
185
170
|
viewSelect: 'View to watch',
|
|
186
171
|
viewApplied: 'The chosen view is applied to the screen: the screen is what provides the watched query.',
|
|
@@ -188,21 +173,7 @@ const EN = {
|
|
|
188
173
|
name: 'Alert name',
|
|
189
174
|
view: 'Watched view',
|
|
190
175
|
viewHint: 'The alert fires on this view’s scope, as it stands on screen.',
|
|
191
|
-
|
|
192
|
-
triggersHint: 'All three come from the same comparison; ticking several costs nothing.',
|
|
193
|
-
appeared: 'New item',
|
|
194
|
-
appearedHint: 'A result enters the view',
|
|
195
|
-
changed: 'Value change',
|
|
196
|
-
changedHint: 'A watched field moves on an item already there',
|
|
197
|
-
disappeared: 'Left the scope',
|
|
198
|
-
disappearedHint: 'An item leaves the view (withdrawal, delisting)',
|
|
199
|
-
fields: 'Watched fields',
|
|
200
|
-
fieldsHint: 'One message per item, however many fields are ticked.',
|
|
201
|
-
fieldsRequired: 'Tick at least one field to watch for changes.',
|
|
202
|
-
noFields: 'This page offers no watchable field yet.',
|
|
203
|
-
anyField: 'Any change',
|
|
204
|
-
anyFieldHint:
|
|
205
|
-
'The whole document is compared. Wider, but noisier: a label fix counts as much as a price move.',
|
|
176
|
+
viewFields: 'Nothing to choose: the alert reports any change in the view (new item, value change, left the scope).',
|
|
206
177
|
channels: 'Channels',
|
|
207
178
|
inApp: 'In app (badge on the Alerts tile)',
|
|
208
179
|
email: 'Email',
|
|
@@ -215,7 +186,7 @@ const EN = {
|
|
|
215
186
|
'A cap, not a rhythm: nothing goes out when nothing moved, and detection follows the data.',
|
|
216
187
|
submit: 'Create the alert',
|
|
217
188
|
save: 'Save',
|
|
218
|
-
reseed: '
|
|
189
|
+
reseed: 'This alert now watches every change. Saving it restarts from a new baseline: you are only told about what moves afterwards.',
|
|
219
190
|
cancel: 'Cancel',
|
|
220
191
|
baseline:
|
|
221
192
|
'The alert starts by recording the current state, without reporting anything. Stay on the page a moment: it turns “Active” in the panel once that record is taken, and will then tell you what moves.',
|
|
@@ -260,29 +231,22 @@ watch(brandSearch, (value) => emit('search-brands', value))
|
|
|
260
231
|
const watchesProduct = computed(() => kind.value === 'product')
|
|
261
232
|
|
|
262
233
|
const title = ref(props.initial?.title ?? props.viewTitle)
|
|
263
|
-
/**
|
|
264
|
-
* Une alerte de produit suit tout, declencheurs compris : le choix ne se pose
|
|
265
|
-
* pas plus que celui des champs, et cocher que « nouvel element » laisserait
|
|
266
|
-
* croire qu'un changement de prix sur une marque deja suivie ne compte pas.
|
|
267
|
-
*/
|
|
234
|
+
/** Toute alerte suit tout : les trois declencheurs, le document entier. */
|
|
268
235
|
const ALL_TRIGGERS: RmAlertTrigger[] = ['appeared', 'changed', 'disappeared']
|
|
269
|
-
const triggers = ref<RmAlertTrigger[]>(
|
|
270
|
-
props.initial?.triggers ??
|
|
271
|
-
(kind.value === 'product' ? ALL_TRIGGERS : ['appeared']),
|
|
272
|
-
)
|
|
273
|
-
watch(kind, (value) => {
|
|
274
|
-
if (value === 'product') triggers.value = ALL_TRIGGERS
|
|
275
|
-
})
|
|
276
|
-
const watchedFields = ref<string[]>(
|
|
277
|
-
(props.initial?.watchedFields ?? []).filter((field) => field !== RM_ALERT_ANY_FIELD),
|
|
278
|
-
)
|
|
279
|
-
/** Surveiller le document entier plutot qu'une liste de champs. */
|
|
280
|
-
const anyField = ref(!!props.initial?.watchedFields?.includes(RM_ALERT_ANY_FIELD))
|
|
281
236
|
const emailOn = ref(!!props.initial?.channels?.includes('email'))
|
|
282
237
|
const cadence = ref<RmAlertCadence>(props.initial?.cadence ?? 'weekly')
|
|
283
238
|
|
|
284
|
-
/**
|
|
285
|
-
|
|
239
|
+
/**
|
|
240
|
+
* Alerte creee du temps ou l'on choisissait champs et declencheurs.
|
|
241
|
+
* L'enregistrer l'elargit a « tout », donc la fait repartir d'une nouvelle
|
|
242
|
+
* reference cote API : le hachage ne couvre plus les memes valeurs.
|
|
243
|
+
*/
|
|
244
|
+
const widens =
|
|
245
|
+
props.mode === 'edit' &&
|
|
246
|
+
(JSON.stringify([...(props.initial?.triggers ?? [])].sort()) !==
|
|
247
|
+
JSON.stringify([...ALL_TRIGGERS].sort()) ||
|
|
248
|
+
JSON.stringify(props.initial?.watchedFields ?? []) !==
|
|
249
|
+
JSON.stringify([RM_ALERT_ANY_FIELD]))
|
|
286
250
|
|
|
287
251
|
/** Titre libre des que l'utilisateur y touche : on ne l'ecrase plus. */
|
|
288
252
|
const titleTouched = ref(props.mode === 'edit')
|
|
@@ -295,9 +259,6 @@ const titleTouched = ref(props.mode === 'edit')
|
|
|
295
259
|
const baseline = {
|
|
296
260
|
kind: kind.value,
|
|
297
261
|
brands: JSON.stringify([...brands.value].sort()),
|
|
298
|
-
triggers: JSON.stringify([...triggers.value].sort()),
|
|
299
|
-
watchedFields: JSON.stringify([...watchedFields.value].sort()),
|
|
300
|
-
anyField: anyField.value,
|
|
301
262
|
emailOn: emailOn.value,
|
|
302
263
|
cadence: cadence.value,
|
|
303
264
|
selectedViewId: selectedViewId.value,
|
|
@@ -308,9 +269,6 @@ const dirty = computed(
|
|
|
308
269
|
titleTouched.value ||
|
|
309
270
|
kind.value !== baseline.kind ||
|
|
310
271
|
JSON.stringify([...brands.value].sort()) !== baseline.brands ||
|
|
311
|
-
JSON.stringify([...triggers.value].sort()) !== baseline.triggers ||
|
|
312
|
-
JSON.stringify([...watchedFields.value].sort()) !== baseline.watchedFields ||
|
|
313
|
-
anyField.value !== baseline.anyField ||
|
|
314
272
|
emailOn.value !== baseline.emailOn ||
|
|
315
273
|
cadence.value !== baseline.cadence ||
|
|
316
274
|
selectedViewId.value !== baseline.selectedViewId,
|
|
@@ -348,36 +306,6 @@ watch(selectedViewId, (id) => {
|
|
|
348
306
|
if (id) emit('select-view', id)
|
|
349
307
|
})
|
|
350
308
|
|
|
351
|
-
/**
|
|
352
|
-
* Deux bascules plutot qu'une generique : dans le template, un `ref` est
|
|
353
|
-
* deballe, donc lui passer la reference elle-meme ne marche pas.
|
|
354
|
-
*/
|
|
355
|
-
function toggleTrigger(key: RmAlertTrigger) {
|
|
356
|
-
triggers.value = triggers.value.includes(key)
|
|
357
|
-
? triggers.value.filter((entry) => entry !== key)
|
|
358
|
-
: [...triggers.value, key]
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
function toggleField(value: string) {
|
|
362
|
-
watchedFields.value = watchedFields.value.includes(value)
|
|
363
|
-
? watchedFields.value.filter((entry) => entry !== value)
|
|
364
|
-
: [...watchedFields.value, value]
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
const watchesChanges = computed(() => triggers.value.includes('changed'))
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Surveiller un changement sans dire de quel champ n'a pas de sens : le
|
|
371
|
-
* moteur comparerait un hachage vide et ne trouverait jamais rien.
|
|
372
|
-
*/
|
|
373
|
-
const missingFields = computed(
|
|
374
|
-
() =>
|
|
375
|
-
watchesChanges.value &&
|
|
376
|
-
!anyField.value &&
|
|
377
|
-
watchedFields.value.length === 0 &&
|
|
378
|
-
props.fields.length > 0,
|
|
379
|
-
)
|
|
380
|
-
|
|
381
309
|
/** Options de cadence, dans l'ordre du plus espace au plus frequent. */
|
|
382
310
|
const cadenceOptions = computed(() => [
|
|
383
311
|
{ value: 'monthly' as const, label: T.value.monthly },
|
|
@@ -399,29 +327,9 @@ const brandsInvalid = computed(
|
|
|
399
327
|
)
|
|
400
328
|
|
|
401
329
|
const valid = computed(
|
|
402
|
-
() =>
|
|
403
|
-
title.value.trim().length > 0 &&
|
|
404
|
-
triggers.value.length > 0 &&
|
|
405
|
-
!brandsInvalid.value &&
|
|
406
|
-
// Une alerte de produit suit tout : la question des champs ne se pose pas.
|
|
407
|
-
(watchesProduct.value || !missingFields.value),
|
|
330
|
+
() => title.value.trim().length > 0 && !brandsInvalid.value,
|
|
408
331
|
)
|
|
409
332
|
|
|
410
|
-
/**
|
|
411
|
-
* Les champs suivis ont bouge depuis l'ouverture.
|
|
412
|
-
*
|
|
413
|
-
* C'est le seul changement qui fait repartir l'alerte d'une nouvelle
|
|
414
|
-
* reference cote API : le hachage ne couvre plus les memes valeurs.
|
|
415
|
-
*/
|
|
416
|
-
const fieldsChanged = computed(() => {
|
|
417
|
-
const next = anyField.value
|
|
418
|
-
? [RM_ALERT_ANY_FIELD]
|
|
419
|
-
: watchesChanges.value
|
|
420
|
-
? watchedFields.value
|
|
421
|
-
: []
|
|
422
|
-
return JSON.stringify([...next].sort()) !== initialFields
|
|
423
|
-
})
|
|
424
|
-
|
|
425
333
|
function submit() {
|
|
426
334
|
if (!valid.value) return
|
|
427
335
|
emit('submit', {
|
|
@@ -429,18 +337,8 @@ function submit() {
|
|
|
429
337
|
kind: kind.value,
|
|
430
338
|
brands: watchesProduct.value ? brands.value : [],
|
|
431
339
|
viewId: watchesProduct.value ? null : selectedViewId.value,
|
|
432
|
-
triggers:
|
|
433
|
-
|
|
434
|
-
// sans lui ferait porter a l'alerte une promesse qu'elle ne tient pas.
|
|
435
|
-
// Une alerte de produit traverse sept index : une liste de champs nommes
|
|
436
|
-
// n'y voudrait rien dire, ils different d'un index a l'autre.
|
|
437
|
-
watchedFields: watchesProduct.value
|
|
438
|
-
? [RM_ALERT_ANY_FIELD]
|
|
439
|
-
: watchesChanges.value
|
|
440
|
-
? anyField.value
|
|
441
|
-
? [RM_ALERT_ANY_FIELD]
|
|
442
|
-
: watchedFields.value
|
|
443
|
-
: [],
|
|
340
|
+
triggers: ALL_TRIGGERS,
|
|
341
|
+
watchedFields: [RM_ALERT_ANY_FIELD],
|
|
444
342
|
channels: emailOn.value ? ['in_app', 'email'] : ['in_app'],
|
|
445
343
|
cadence: cadence.value,
|
|
446
344
|
// Le partage viendra plus tard : le schema le porte deja, l'ecran non.
|
|
@@ -553,45 +451,10 @@ function submit() {
|
|
|
553
451
|
{{ watchesProduct ? `${T.brands} : ${brands.join(', ')}` : `${T.view} : ${viewTitle}` }}
|
|
554
452
|
</p>
|
|
555
453
|
|
|
556
|
-
<
|
|
557
|
-
|
|
558
|
-
<p class="rm-alert-form__hint">{{ T.triggersHint }}</p>
|
|
559
|
-
<RmCheckbox
|
|
560
|
-
v-for="entry in [
|
|
561
|
-
{ key: 'appeared', label: T.appeared, hint: T.appearedHint },
|
|
562
|
-
{ key: 'changed', label: T.changed, hint: T.changedHint },
|
|
563
|
-
{ key: 'disappeared', label: T.disappeared, hint: T.disappearedHint },
|
|
564
|
-
]"
|
|
565
|
-
:key="entry.key"
|
|
566
|
-
:model-value="triggers.includes(entry.key as any)"
|
|
567
|
-
:label="entry.label"
|
|
568
|
-
:description="entry.hint"
|
|
569
|
-
@update:model-value="toggleTrigger(entry.key as RmAlertTrigger)"
|
|
570
|
-
/>
|
|
571
|
-
</fieldset>
|
|
572
|
-
|
|
573
|
-
<p v-if="watchesProduct" class="rm-alert-form__hint">
|
|
574
|
-
{{ T.productFields }}
|
|
454
|
+
<p class="rm-alert-form__hint" data-field="triggers">
|
|
455
|
+
{{ watchesProduct ? T.productFields : T.viewFields }}
|
|
575
456
|
</p>
|
|
576
457
|
|
|
577
|
-
<fieldset v-if="watchesChanges && !watchesProduct" class="rm-alert-form__group" data-field="fields">
|
|
578
|
-
<legend class="rm-alert-form__label">{{ T.fields }}</legend>
|
|
579
|
-
<p class="rm-alert-form__hint">{{ anyField ? T.anyFieldHint : T.fieldsHint }}</p>
|
|
580
|
-
<template v-if="fields.length">
|
|
581
|
-
<RmCheckbox v-model="anyField" :label="T.anyField" />
|
|
582
|
-
<RmCheckbox
|
|
583
|
-
v-for="field in fields"
|
|
584
|
-
:key="field.value"
|
|
585
|
-
:model-value="anyField || watchedFields.includes(field.value)"
|
|
586
|
-
:label="field.label"
|
|
587
|
-
:disabled="anyField"
|
|
588
|
-
@update:model-value="toggleField(field.value)"
|
|
589
|
-
/>
|
|
590
|
-
<p v-if="missingFields" class="rm-alert-form__error">{{ T.fieldsRequired }}</p>
|
|
591
|
-
</template>
|
|
592
|
-
<p v-else class="rm-alert-form__hint">{{ T.noFields }}</p>
|
|
593
|
-
</fieldset>
|
|
594
|
-
|
|
595
458
|
<fieldset class="rm-alert-form__group" data-field="channels">
|
|
596
459
|
<legend class="rm-alert-form__label">{{ T.channels }}</legend>
|
|
597
460
|
<RmCheckbox :model-value="true" :label="T.inApp" disabled />
|
|
@@ -617,7 +480,7 @@ function submit() {
|
|
|
617
480
|
</fieldset>
|
|
618
481
|
|
|
619
482
|
<p
|
|
620
|
-
v-if="!editing ||
|
|
483
|
+
v-if="!editing || widens"
|
|
621
484
|
class="rm-alert-form__baseline"
|
|
622
485
|
>
|
|
623
486
|
<RmIcon name="Info" :size="14" />
|
|
@@ -15,11 +15,22 @@
|
|
|
15
15
|
Un voile flou et grise couvre le reste du cadre pendant l'ouverture, barre
|
|
16
16
|
laterale comprise : le panneau est ce qu'on lit, pas ce qu'on lisait. Un
|
|
17
17
|
clic sur le voile referme le panneau, comme un tiroir.
|
|
18
|
+
|
|
19
|
+
Un panneau qui regroupe deux lectures (documents et tutoriels) pose ses
|
|
20
|
+
onglets juste sous le titre, avec le dessin de ceux de `RmPageHeader` :
|
|
21
|
+
hors du corps qui defile, ils restent visibles, et le lecteur les reconnait
|
|
22
|
+
pour les avoir vus sur les pages.
|
|
18
23
|
-->
|
|
19
24
|
<script setup lang="ts">
|
|
25
|
+
import type { RmHeaderTab } from './AppHeader.vue'
|
|
26
|
+
|
|
20
27
|
withDefaults(defineProps<{
|
|
21
28
|
open?: boolean
|
|
22
29
|
title?: string
|
|
30
|
+
/** Onglets sous le titre. La page tient l'onglet actif (`active`). */
|
|
31
|
+
tabs?: RmHeaderTab[]
|
|
32
|
+
/** Nom du groupe d'onglets pour les lecteurs d'ecran. */
|
|
33
|
+
tabsLabel?: string
|
|
23
34
|
/**
|
|
24
35
|
* Largeur de la colonne. Toute valeur CSS.
|
|
25
36
|
*
|
|
@@ -34,9 +45,11 @@ withDefaults(defineProps<{
|
|
|
34
45
|
title: undefined,
|
|
35
46
|
width: '640px',
|
|
36
47
|
closeLabel: 'Fermer le panneau',
|
|
48
|
+
tabs: () => [],
|
|
49
|
+
tabsLabel: undefined,
|
|
37
50
|
})
|
|
38
51
|
|
|
39
|
-
const emit = defineEmits<{ close: [] }>()
|
|
52
|
+
const emit = defineEmits<{ close: []; tab: [key: string] }>()
|
|
40
53
|
</script>
|
|
41
54
|
|
|
42
55
|
<template>
|
|
@@ -67,6 +80,25 @@ const emit = defineEmits<{ close: [] }>()
|
|
|
67
80
|
</button>
|
|
68
81
|
</div>
|
|
69
82
|
|
|
83
|
+
<div v-if="tabs.length" class="rm-panel__tabs" role="tablist" :aria-label="tabsLabel">
|
|
84
|
+
<button
|
|
85
|
+
v-for="tab in tabs"
|
|
86
|
+
:key="tab.key"
|
|
87
|
+
class="rm-panel__tab"
|
|
88
|
+
:class="{ 'rm-panel__tab--active': tab.active }"
|
|
89
|
+
type="button"
|
|
90
|
+
role="tab"
|
|
91
|
+
:aria-selected="tab.active ? 'true' : 'false'"
|
|
92
|
+
:title="tab.hint || undefined"
|
|
93
|
+
@click="emit('tab', tab.key)"
|
|
94
|
+
>
|
|
95
|
+
{{ tab.label }}
|
|
96
|
+
<span v-if="tab.count !== undefined && tab.count !== null" class="rm-panel__tab-count">
|
|
97
|
+
{{ tab.count }}
|
|
98
|
+
</span>
|
|
99
|
+
</button>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
70
102
|
<div class="rm-panel__body">
|
|
71
103
|
<slot />
|
|
72
104
|
</div>
|