@tekkare/romulus 0.1.81 → 0.1.82
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/module.mjs +5 -0
- package/dist/runtime/assets/styles/shell.css +1 -1
- package/dist/runtime/components/ActionBar.vue +1 -1
- package/dist/runtime/components/AiChat.vue +1 -1
- package/dist/runtime/components/Card.vue +1 -1
- package/dist/runtime/components/Drawer.vue +1 -1
- package/dist/runtime/components/FilterDropdown.vue +1 -1
- package/dist/runtime/components/Input.vue +1 -1
- package/dist/runtime/components/Modal.vue +1 -1
- package/dist/runtime/components/Pill.vue +1 -1
- package/dist/runtime/components/ProductCard.vue +2 -2
- package/dist/runtime/components/SavedViewCard.vue +57 -3
- package/dist/runtime/components/SidebarRight.vue +18 -5
- package/dist/runtime/components/SourceCard.vue +335 -0
- package/dist/runtime/components/Table.vue +1 -1
- package/dist/runtime/components/Tabs.vue +1 -1
- package/dist/runtime/components/Tag.vue +1 -1
- package/dist/runtime/components/ThemeToggle.vue +45 -0
- package/dist/runtime/components/ToolbarFilter.vue +1 -1
- package/dist/runtime/composables/useTheme.d.ts +5 -0
- package/dist/runtime/composables/useTheme.js +19 -0
- package/dist/runtime/plugins/theme.client.d.ts +2 -0
- package/dist/runtime/plugins/theme.client.js +5 -0
- package/package.json +1 -1
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -26,6 +26,7 @@ const module = defineNuxtModule({
|
|
|
26
26
|
if (options.utilities)
|
|
27
27
|
nuxt.options.css.push(resolve(runtimeDir, "assets/styles/utilities.css"));
|
|
28
28
|
addPlugin(resolve(runtimeDir, "plugins/a11yFilters.client"));
|
|
29
|
+
addPlugin(resolve(runtimeDir, "plugins/theme.client"));
|
|
29
30
|
await addComponentsDir({
|
|
30
31
|
path: resolve(runtimeDir, "components"),
|
|
31
32
|
prefix: options.prefix
|
|
@@ -45,6 +46,10 @@ const module = defineNuxtModule({
|
|
|
45
46
|
if (!nuxt.options.app.head.link.some((l) => l.href === phosphorHref)) {
|
|
46
47
|
nuxt.options.app.head.link.push({ rel: "stylesheet", href: phosphorHref });
|
|
47
48
|
}
|
|
49
|
+
const phosphorFillHref = "https://unpkg.com/@phosphor-icons/web@2.1.1/src/fill/style.css";
|
|
50
|
+
if (!nuxt.options.app.head.link.some((l) => l.href === phosphorFillHref)) {
|
|
51
|
+
nuxt.options.app.head.link.push({ rel: "stylesheet", href: phosphorFillHref });
|
|
52
|
+
}
|
|
48
53
|
}
|
|
49
54
|
});
|
|
50
55
|
|
|
@@ -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-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);width:var(--rm-rail-w)}.rm-sb__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:8px;height:var(--rm-bar-h);padding:0 16px}.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:8px;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:16px;overflow-y:auto;padding:16px}.rm-sb--collapsed .rm-sb__nav{padding-left:8px;padding-right:8px}.rm-sb__group{display:flex;flex-direction:column;gap:4px}.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);display:flex;font-family:inherit;font-size:10px;font-weight:500;gap:4px;letter-spacing:.025em;line-height:1.6;margin:0;padding:0 2px;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:8px;height:26px;margin:0;padding:2px;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:14px;line-height:1}.rm-mi__label{color:var(--rm-shell-text);flex:1;font-size:14px;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:2px 4px;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:12px;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:2px;padding:2px 0 2px 28px}.rm-sb__sub-item{border-radius:4px;color:var(--rm-shell-text);display:block;font-size:14px;line-height:1.625;overflow:hidden;padding:2px 4px;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:4px;margin:0;padding:12px 0 8px;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:14px;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:16px;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:10px;font-weight:700;height:16px;line-height:16px;min-width:16px;padding:0 4px;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:10px;line-height:1;max-width:100%;overflow:hidden;padding:0 2px;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{display:flex;justify-content:center;margin-top:auto;padding-bottom:16px}.rm-lang{background:var(--rm-shell-subtle);border:1px solid var(--rm-shell-accent);border-radius:9999px;display:grid;gap:2px;grid-template-rows:1fr 1fr;padding:3px;position:relative}.rm-lang__thumb{background:var(--rm-shell-surface);border-radius:9999px;box-shadow:0 1px 4px rgba(30,41,59,.16);height:32px;left:3px;position:absolute;top:3px;transition:transform .26s cubic-bezier(.34,1.56,.64,1);width:32px}.rm-lang--second .rm-lang__thumb{transform:translateY(34px)}.rm-lang__option{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:9999px;box-shadow:none;cursor:pointer;display:flex;filter:grayscale(1);font-size:17px;height:32px;justify-content:center;line-height:1;margin:0;opacity:.5;padding:0;position:relative;transition:filter .18s ease,opacity .18s ease,transform .18s ease;width:32px}.rm-lang__option:hover{filter:grayscale(0);opacity:.85}.rm-lang__option.rm-lang__option--active{filter:grayscale(0);opacity:1}.rm-lang__option:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}@media (prefers-reduced-motion:reduce){.rm-lang__option,.rm-lang__thumb{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:16px;height:var(--rm-bar-h);padding:0 16px}.rm-hd__crumbs,.rm-hd__row{align-items:center;display:flex}.rm-hd__crumbs{flex:1;font-size:14px;gap:4px;min-width:0}.rm-hd__crumb{align-items:center;color:var(--rm-shell-text-muted);display:inline-flex;gap:6px;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:14px;margin:0;padding:2px 4px;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:4px;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:14px;gap:8px;line-height:1.5;overflow:hidden;padding:4px 6px;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:10px;font-weight:500;letter-spacing:.025em;line-height:1.6;padding:8px 6px 2px;text-transform:uppercase}.rm-hd__menu-group:first-child{padding-top:2px}.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:14px;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:4px;padding:4px 12px;width:300px}.rm-hd__search input{background:transparent;border:none;color:var(--rm-shell-text);flex:1;font-family:inherit;font-size:14px;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:14px;height:14px;line-height:20px;width:14px}.rm-hd__tabs{display:flex;gap:16px;padding:0 16px}.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:14px;font-weight:700;line-height:1.6;margin:0;padding:4px 4px 8px;white-space:nowrap}.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:var(--rm-panel-w,360px);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:8px;height:var(--rm-bar-h);padding:0 16px}.rm-panel__title{color:var(--rm-shell-text);flex:1;font-size:14px;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:16px}@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-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);width:var(--rm-rail-w)}.rm-sb__header{align-items:center;border-bottom:1px solid var(--rm-shell-border);display:flex;flex-shrink:0;gap:8px;height:var(--rm-bar-h);padding:0 16px}.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:8px;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:16px;overflow-y:auto;padding:16px}.rm-sb--collapsed .rm-sb__nav{padding-left:8px;padding-right:8px}.rm-sb__group{display:flex;flex-direction:column;gap:4px}.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);display:flex;font-family:inherit;font-size:10px;font-weight:500;gap:4px;letter-spacing:.025em;line-height:1.6;margin:0;padding:0 2px;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:8px;height:26px;margin:0;padding:2px;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:14px;line-height:1}.rm-mi__label{color:var(--rm-shell-text);flex:1;font-size:14px;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:2px 4px;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:12px;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:2px;padding:2px 0 2px 28px}.rm-sb__sub-item{border-radius:4px;color:var(--rm-shell-text);display:block;font-size:14px;line-height:1.625;overflow:hidden;padding:2px 4px;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:4px;margin:0;padding:12px 0 8px;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:14px;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:16px;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:10px;font-weight:700;height:16px;line-height:16px;min-width:16px;padding:0 4px;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:10px;line-height:1;max-width:100%;overflow:hidden;padding:0 2px;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:10px;margin-top:auto;padding-bottom:16px}.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;height:24px;margin:0;padding:2px;position:relative;width:48px}.rm-dns__thumb{background:#fff;border-radius:9999px;box-shadow:0 1px 3px rgba(30,41,59,.15);height:calc(100% - 4px);left:2px;position:absolute;top:2px;transition:left .24s cubic-bezier(.2,0,0,1);width:calc(50% - 2px);z-index:1}.rm-dns__half{align-items:center;border-radius:9999px;display:flex;flex:1;font-size:12px;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);left:50%}body.night .rm-dns__half[data-dns=day]{color:#525670}body.night .rm-dns__half[data-dns=night]{color:var(--bg-surface)}@media (prefers-reduced-motion:reduce){.rm-dns__thumb{transition:none}}.rm-lang{background:var(--rm-shell-subtle);border:1px solid var(--rm-shell-accent);border-radius:9999px;display:grid;gap:2px;grid-template-rows:1fr 1fr;padding:3px;position:relative}.rm-lang__thumb{background:var(--rm-shell-surface);border-radius:9999px;box-shadow:0 1px 4px rgba(30,41,59,.16);height:32px;left:3px;position:absolute;top:3px;transition:transform .26s cubic-bezier(.34,1.56,.64,1);width:32px}.rm-lang--second .rm-lang__thumb{transform:translateY(34px)}.rm-lang__option{align-items:center;-moz-appearance:none;appearance:none;-webkit-appearance:none;background:none;border:none;border-radius:9999px;box-shadow:none;cursor:pointer;display:flex;filter:grayscale(1);font-size:17px;height:32px;justify-content:center;line-height:1;margin:0;opacity:.5;padding:0;position:relative;transition:filter .18s ease,opacity .18s ease,transform .18s ease;width:32px}.rm-lang__option:hover{filter:grayscale(0);opacity:.85}.rm-lang__option.rm-lang__option--active{filter:grayscale(0);opacity:1}.rm-lang__option:focus-visible{outline:2px solid var(--rm-shell-accent);outline-offset:2px}@media (prefers-reduced-motion:reduce){.rm-lang__option,.rm-lang__thumb{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:16px;height:var(--rm-bar-h);padding:0 16px}.rm-hd__crumbs,.rm-hd__row{align-items:center;display:flex}.rm-hd__crumbs{flex:1;font-size:14px;gap:4px;min-width:0}.rm-hd__crumb{align-items:center;color:var(--rm-shell-text-muted);display:inline-flex;gap:6px;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:14px;margin:0;padding:2px 4px;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:4px;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:14px;gap:8px;line-height:1.5;overflow:hidden;padding:4px 6px;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:10px;font-weight:500;letter-spacing:.025em;line-height:1.6;padding:8px 6px 2px;text-transform:uppercase}.rm-hd__menu-group:first-child{padding-top:2px}.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:14px;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:4px;padding:4px 12px;width:300px}.rm-hd__search input{background:transparent;border:none;color:var(--rm-shell-text);flex:1;font-family:inherit;font-size:14px;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:14px;height:14px;line-height:20px;width:14px}.rm-hd__tabs{display:flex;gap:16px;padding:0 16px}.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:14px;font-weight:700;line-height:1.6;margin:0;padding:4px 4px 8px;white-space:nowrap}.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:var(--rm-panel-w,360px);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:8px;height:var(--rm-bar-h);padding:0 16px}.rm-panel__title{color:var(--rm-shell-text);flex:1;font-size:14px;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:16px}@media (max-width:767px){.rm-panel{border-left:none;left:0;width:auto}}
|
|
@@ -92,5 +92,5 @@ function closeDrawer() {
|
|
|
92
92
|
</template>
|
|
93
93
|
|
|
94
94
|
<style scoped>
|
|
95
|
-
.rm-action-bar{bottom:0;display:flex;position:fixed;right:0;top:0;transition:width .3s cubic-bezier(.4,0,.2,1);z-index:61}.rm-action-bar__panel{background-color:var(--
|
|
95
|
+
.rm-action-bar{bottom:0;display:flex;position:fixed;right:0;top:0;transition:width .3s cubic-bezier(.4,0,.2,1);z-index:61}.rm-action-bar__panel{background-color:var(--bg-surface);border-left:1px solid var(--border-default);display:flex;flex-direction:column;flex-shrink:0;height:100%}.rm-action-bar__header{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:64px;padding:0 16px}.rm-action-bar__tabs{border-bottom:1px solid var(--border-default);padding:8px 16px 12px}.rm-action-bar__content{display:flex;flex:1;flex-direction:column;overflow-y:auto}.rm-action-bar__footer{border-top:1px solid var(--border-default);padding:16px}.rm-action-bar__overlay{backdrop-filter:blur(2px);background-color:rgba(0,0,0,.2);inset:0;position:fixed;z-index:60}.rm-action-bar-overlay-enter-active,.rm-action-bar-overlay-leave-active{transition:opacity .25s ease}.rm-action-bar-overlay-enter-from,.rm-action-bar-overlay-leave-to{opacity:0}.rm-action-bar__drawer{background-color:var(--bg-surface);border-left:1px solid var(--border-default);display:flex;flex:1;flex-direction:column;min-width:0;overflow:hidden}.rm-action-bar__drawer-header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;min-height:64px;padding:0 24px}.rm-action-bar__drawer-close{align-items:center;background:none;border:none;border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:32px}.rm-action-bar__drawer-close:hover{background-color:var(--bg-surface-3);color:var(--text-secondary)}.rm-action-bar__drawer-body{flex:1;overflow-y:auto;padding:24px}.rm-action-bar__drawer-footer{border-top:1px solid var(--border-default);padding:16px 24px}.rm-action-bar-drawer-enter-active,.rm-action-bar-drawer-leave-active{transition:opacity .25s ease}.rm-action-bar-drawer-enter-from,.rm-action-bar-drawer-leave-to{opacity:0}
|
|
96
96
|
</style>
|
|
@@ -251,5 +251,5 @@ defineExpose({ open, close, toggle, scrollToBottom })
|
|
|
251
251
|
</template>
|
|
252
252
|
|
|
253
253
|
<style scoped>
|
|
254
|
-
.rm-ai-chat-trigger{align-items:center;background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border:none;border-radius:var(--r-radius-full);bottom:24px;box-shadow:var(--r-shadow-lg);color:var(--r-color-white);cursor:pointer;display:flex;height:52px;justify-content:center;position:fixed;right:24px;transition:all var(--r-transition-base);width:52px;z-index:89}.rm-ai-chat-trigger:hover{box-shadow:var(--r-shadow-xl);transform:scale(1.08)}.rm-ai-chat-trigger--open{opacity:.7;transform:scale(.9)}.rm-ai-chat-header{align-items:center;display:flex;gap:10px}.rm-ai-chat-header__icon{font-size:22px}.rm-ai-chat-header__robot{color:var(--r-color-primary-500)}.rm-ai-chat-header__title{color:var(--r-color-gray-900);font-size:var(--r-text-lg);font-weight:var(--r-font-weight-semibold);margin:0}.rm-ai-chat-header__clear{align-items:center;background:none;border:none;border-radius:var(--r-radius-md);color:var(--r-color-gray-400);cursor:pointer;display:flex;height:32px;justify-content:center;margin-right:8px;transition:all var(--r-transition-fast);width:32px}.rm-ai-chat-header__clear:hover{background-color:var(--r-color-gray-100);color:var(--r-color-gray-600)}.rm-ai-chat-body{display:flex;flex-direction:column;height:100%;margin:-24px}.rm-ai-chat-messages{background-color:var(--r-color-gray-50);display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:20px}.rm-ai-chat-welcome{display:flex;flex-direction:column;gap:20px}.rm-ai-chat-bubble--welcome{background:linear-gradient(135deg,#f0f9ff,#e0f2fe)!important;border:1px solid #bae6fd}.rm-ai-chat-suggestions{align-items:center;display:flex;flex-direction:column;gap:8px}.rm-ai-chat-suggestions__hint{color:var(--r-color-gray-400);font-size:var(--r-text-xs);font-weight:var(--r-font-weight-medium);margin:0}.rm-ai-chat-suggestion{align-items:center;background:var(--r-color-white);border:1px solid var(--r-color-gray-200);border-radius:var(--r-radius-lg);color:var(--r-color-gray-600);cursor:pointer;display:flex;font-size:var(--r-text-sm);gap:8px;padding:10px 14px;text-align:left;transition:all var(--r-transition-fast);width:100%}.rm-ai-chat-suggestion:hover{background:var(--r-color-gray-50);border-color:var(--r-color-primary-400);color:var(--r-color-primary-600);transform:translateX(4px)}.rm-ai-chat-suggestion__icon{flex-shrink:0}.rm-ai-chat-message{animation:rm-ai-chat-fade-in .2s ease;display:flex;gap:10px}.rm-ai-chat-message--user{flex-direction:row-reverse}@keyframes rm-ai-chat-fade-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.rm-ai-chat-avatar{align-items:center;border-radius:var(--r-radius-full);display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.rm-ai-chat-avatar--assistant{background:var(--r-color-primary-50);color:var(--r-color-primary-500)}.rm-ai-chat-avatar--user{background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);color:var(--r-color-white)}.rm-ai-chat-bubble{border-radius:16px;font-size:var(--r-text-sm);line-height:var(--r-leading-relaxed);max-width:80%;padding:10px 14px}.rm-ai-chat-bubble--user{background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border-bottom-right-radius:4px;color:var(--r-color-white)}.rm-ai-chat-bubble--assistant{background:var(--r-color-white);border-bottom-left-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.06);color:var(--r-color-gray-700)}.rm-ai-chat-bubble :deep(ol),.rm-ai-chat-bubble :deep(ul){margin:6px 0;padding-left:20px}.rm-ai-chat-bubble :deep(li){margin:3px 0}.rm-ai-chat-bubble :deep(ol){list-style-type:decimal}.rm-ai-chat-bubble :deep(ul){list-style-type:disc}.rm-ai-chat-bubble :deep(strong){font-weight:var(--r-font-weight-semibold)}.rm-ai-chat-loading{align-items:center;display:flex;gap:8px;padding:2px 0}.rm-ai-chat-loading__pulse{animation:rm-ai-chat-pulse 2.5s ease-in-out infinite;background:rgba(99,102,241,.08);border-radius:var(--r-radius-full);height:28px;position:absolute;width:28px}.rm-ai-chat-loading__icon{animation:rm-ai-chat-spin 1.2s linear infinite;color:var(--r-color-primary-500);z-index:1}.rm-ai-chat-loading__text{color:var(--r-color-gray-500);font-size:var(--r-text-sm);font-weight:var(--r-font-weight-medium)}@keyframes rm-ai-chat-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes rm-ai-chat-pulse{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:0;transform:scale(1.3)}}.rm-ai-chat-input{margin:0}.rm-ai-chat-input__wrapper{align-items:center;background:var(--r-color-gray-100);border-radius:var(--r-radius-lg);display:flex;gap:8px;padding:4px 4px 4px 16px}.rm-ai-chat-input__wrapper input{background:none;border:none;color:var(--r-color-gray-800);flex:1;font-family:inherit;font-size:var(--r-text-sm);outline:none;padding:10px 0}.rm-ai-chat-input__wrapper input::-moz-placeholder{color:var(--r-color-gray-400)}.rm-ai-chat-input__wrapper input::placeholder{color:var(--r-color-gray-400)}.rm-ai-chat-input__send{align-items:center;background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border:none;border-radius:var(--r-radius-md);color:var(--r-color-white);cursor:pointer;display:flex;flex-shrink:0;height:38px;justify-content:center;transition:all var(--r-transition-fast);width:38px}.rm-ai-chat-input__send:hover:not(:disabled){transform:scale(1.05)}.rm-ai-chat-input__send:disabled{cursor:not-allowed;opacity:.5}
|
|
254
|
+
.rm-ai-chat-trigger{align-items:center;background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border:none;border-radius:var(--r-radius-full);bottom:24px;box-shadow:var(--r-shadow-lg);color:var(--r-color-white);cursor:pointer;display:flex;height:52px;justify-content:center;position:fixed;right:24px;transition:all var(--r-transition-base);width:52px;z-index:89}.rm-ai-chat-trigger:hover{box-shadow:var(--r-shadow-xl);transform:scale(1.08)}.rm-ai-chat-trigger--open{opacity:.7;transform:scale(.9)}.rm-ai-chat-header{align-items:center;display:flex;gap:10px}.rm-ai-chat-header__icon{font-size:22px}.rm-ai-chat-header__robot{color:var(--r-color-primary-500)}.rm-ai-chat-header__title{color:var(--r-color-gray-900);font-size:var(--r-text-lg);font-weight:var(--r-font-weight-semibold);margin:0}.rm-ai-chat-header__clear{align-items:center;background:none;border:none;border-radius:var(--r-radius-md);color:var(--r-color-gray-400);cursor:pointer;display:flex;height:32px;justify-content:center;margin-right:8px;transition:all var(--r-transition-fast);width:32px}.rm-ai-chat-header__clear:hover{background-color:var(--r-color-gray-100);color:var(--r-color-gray-600)}.rm-ai-chat-body{display:flex;flex-direction:column;height:100%;margin:-24px}.rm-ai-chat-messages{background-color:var(--r-color-gray-50);display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:20px}.rm-ai-chat-welcome{display:flex;flex-direction:column;gap:20px}.rm-ai-chat-bubble--welcome{background:linear-gradient(135deg,#f0f9ff,#e0f2fe)!important;border:1px solid #bae6fd}body.night .rm-ai-chat-bubble--welcome{background:linear-gradient(135deg,#16233a,#1b2e4a)!important;border-color:#274364}.rm-ai-chat-suggestions{align-items:center;display:flex;flex-direction:column;gap:8px}.rm-ai-chat-suggestions__hint{color:var(--r-color-gray-400);font-size:var(--r-text-xs);font-weight:var(--r-font-weight-medium);margin:0}.rm-ai-chat-suggestion{align-items:center;background:var(--r-color-white);border:1px solid var(--r-color-gray-200);border-radius:var(--r-radius-lg);color:var(--r-color-gray-600);cursor:pointer;display:flex;font-size:var(--r-text-sm);gap:8px;padding:10px 14px;text-align:left;transition:all var(--r-transition-fast);width:100%}.rm-ai-chat-suggestion:hover{background:var(--r-color-gray-50);border-color:var(--r-color-primary-400);color:var(--r-color-primary-600);transform:translateX(4px)}.rm-ai-chat-suggestion__icon{flex-shrink:0}.rm-ai-chat-message{animation:rm-ai-chat-fade-in .2s ease;display:flex;gap:10px}.rm-ai-chat-message--user{flex-direction:row-reverse}@keyframes rm-ai-chat-fade-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.rm-ai-chat-avatar{align-items:center;border-radius:var(--r-radius-full);display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.rm-ai-chat-avatar--assistant{background:var(--r-color-primary-50);color:var(--r-color-primary-500)}.rm-ai-chat-avatar--user{background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);color:var(--r-color-white)}.rm-ai-chat-bubble{border-radius:16px;font-size:var(--r-text-sm);line-height:var(--r-leading-relaxed);max-width:80%;padding:10px 14px}.rm-ai-chat-bubble--user{background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border-bottom-right-radius:4px;color:var(--r-color-white)}.rm-ai-chat-bubble--assistant{background:var(--r-color-white);border-bottom-left-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.06);color:var(--r-color-gray-700)}.rm-ai-chat-bubble :deep(ol),.rm-ai-chat-bubble :deep(ul){margin:6px 0;padding-left:20px}.rm-ai-chat-bubble :deep(li){margin:3px 0}.rm-ai-chat-bubble :deep(ol){list-style-type:decimal}.rm-ai-chat-bubble :deep(ul){list-style-type:disc}.rm-ai-chat-bubble :deep(strong){font-weight:var(--r-font-weight-semibold)}.rm-ai-chat-loading{align-items:center;display:flex;gap:8px;padding:2px 0}.rm-ai-chat-loading__pulse{animation:rm-ai-chat-pulse 2.5s ease-in-out infinite;background:rgba(99,102,241,.08);border-radius:var(--r-radius-full);height:28px;position:absolute;width:28px}.rm-ai-chat-loading__icon{animation:rm-ai-chat-spin 1.2s linear infinite;color:var(--r-color-primary-500);z-index:1}.rm-ai-chat-loading__text{color:var(--r-color-gray-500);font-size:var(--r-text-sm);font-weight:var(--r-font-weight-medium)}@keyframes rm-ai-chat-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes rm-ai-chat-pulse{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:0;transform:scale(1.3)}}.rm-ai-chat-input{margin:0}.rm-ai-chat-input__wrapper{align-items:center;background:var(--r-color-gray-100);border-radius:var(--r-radius-lg);display:flex;gap:8px;padding:4px 4px 4px 16px}.rm-ai-chat-input__wrapper input{background:none;border:none;color:var(--r-color-gray-800);flex:1;font-family:inherit;font-size:var(--r-text-sm);outline:none;padding:10px 0}.rm-ai-chat-input__wrapper input::-moz-placeholder{color:var(--r-color-gray-400)}.rm-ai-chat-input__wrapper input::placeholder{color:var(--r-color-gray-400)}.rm-ai-chat-input__send{align-items:center;background:linear-gradient(135deg,var(--r-color-primary-500) 0,var(--r-color-primary-600) 100%);border:none;border-radius:var(--r-radius-md);color:var(--r-color-white);cursor:pointer;display:flex;flex-shrink:0;height:38px;justify-content:center;transition:all var(--r-transition-fast);width:38px}.rm-ai-chat-input__send:hover:not(:disabled){transform:scale(1.05)}.rm-ai-chat-input__send:disabled{cursor:not-allowed;opacity:.5}
|
|
255
255
|
</style>
|
|
@@ -43,5 +43,5 @@ withDefaults(defineProps<RCardProps>(), {
|
|
|
43
43
|
</template>
|
|
44
44
|
|
|
45
45
|
<style scoped>
|
|
46
|
-
.r-card{background-color:var(--
|
|
46
|
+
.r-card{background-color:var(--bg-surface);border-radius:var(--radius-xl);overflow:hidden;transition:all var(--duration-base) var(--ease-in-out)}.r-card--bordered{border:1px solid var(--border-default)}.r-card--shadow-none{box-shadow:none}.r-card--shadow-sm{box-shadow:var(--shadow-sm)}.r-card--shadow-md{box-shadow:var(--shadow-md)}.r-card--hoverable:hover,.r-card--shadow-lg{box-shadow:var(--shadow-lg)}.r-card--hoverable:hover{transform:translateY(-2px)}.r-card--padding-none .r-card__body{padding:0}.r-card--padding-sm .r-card__body{padding:var(--space-12)}.r-card--padding-md .r-card__body{padding:var(--space-20)}.r-card--padding-lg .r-card__body{padding:var(--space-32)}.r-card__header{border-bottom:1px solid var(--border-default);font-weight:var(--weight-semibold)}.r-card__footer,.r-card__header{padding:var(--space-16) var(--space-20)}.r-card__footer{background-color:var(--bg-surface-2);border-top:1px solid var(--border-default)}
|
|
47
47
|
</style>
|
|
@@ -103,5 +103,5 @@ const drawerWidth = computed(() => sizeMap[props.size] || props.size)
|
|
|
103
103
|
</template>
|
|
104
104
|
|
|
105
105
|
<style scoped>
|
|
106
|
-
.rm-drawer-overlay{backdrop-filter:blur(2px);background-color:rgba(0,0,0,.2);inset:0;position:fixed;z-index:90}.rm-drawer{background-color:var(--
|
|
106
|
+
.rm-drawer-overlay{backdrop-filter:blur(2px);background-color:rgba(0,0,0,.2);inset:0;position:fixed;z-index:90}.rm-drawer{background-color:var(--bg-surface);bottom:0;box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-width:100%;position:fixed;top:0;z-index:91}.rm-drawer--right{border-left:1px solid var(--border-default)}.rm-drawer--left{border-right:1px solid var(--border-default)}.rm-drawer__header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;min-height:64px;padding:16px 24px}.rm-drawer__close{align-items:center;background:none;border:none;border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:32px}.rm-drawer__close:hover{background-color:var(--bg-surface-3);color:var(--text-secondary)}.rm-drawer__body{flex:1;overflow-y:auto;padding:24px}.rm-drawer__footer{border-top:1px solid var(--border-default);padding:16px 24px}.rm-drawer-overlay-enter-active,.rm-drawer-overlay-leave-active{transition:opacity .25s ease}.rm-drawer-overlay-leave-active,.rm-drawer-overlay-leave-to,.rm-drawer-slide-left-leave-active,.rm-drawer-slide-left-leave-to,.rm-drawer-slide-right-leave-active,.rm-drawer-slide-right-leave-to{pointer-events:none}.rm-drawer-overlay-enter-from,.rm-drawer-overlay-leave-to{opacity:0}.rm-drawer-slide-right-enter-active,.rm-drawer-slide-right-leave-active{transition:transform .3s cubic-bezier(.4,0,.2,1)}.rm-drawer-slide-right-enter-from,.rm-drawer-slide-right-leave-to{transform:translateX(100%)}.rm-drawer-slide-left-enter-active,.rm-drawer-slide-left-leave-active{transition:transform .3s cubic-bezier(.4,0,.2,1)}.rm-drawer-slide-left-enter-from,.rm-drawer-slide-left-leave-to{transform:translateX(-100%)}
|
|
107
107
|
</style>
|
|
@@ -241,5 +241,5 @@ onUnmounted(() => {
|
|
|
241
241
|
</template>
|
|
242
242
|
|
|
243
243
|
<style scoped>
|
|
244
|
-
.filter-chip-wrapper{position:relative}.filter-chip{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:6px;box-sizing:border-box;color:var(--text-secondary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);font-weight:var(--weight-medium);gap:8px;height:32px;padding:8px;transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap;width:193px}.filter-chip:hover{border-color:var(--border-default)}.filter-chip__icon{color:var(--color-healthcare);flex-shrink:0}.filter-chip--active{border-color:var(--color-healthcare);box-shadow:0 0 8px 0 rgba(var(--healthcare-rgb),.1)}.filter-chip__label{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.filter-chip__badge{align-items:center;background-color:var(--color-healthcare);border-radius:100px;color:var(--color-text-inverse);display:inline-flex;flex-shrink:0;font-size:11px;font-weight:600;height:18px;justify-content:center;line-height:1;min-width:18px;padding:0 5px}.filter-chip__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-chip__caret--open{transform:rotate(180deg)}.filter-chip__dropdown{background-color:var(--
|
|
244
|
+
.filter-chip-wrapper{position:relative}.filter-chip{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:6px;box-sizing:border-box;color:var(--text-secondary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);font-weight:var(--weight-medium);gap:8px;height:32px;padding:8px;transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap;width:193px}.filter-chip:hover{border-color:var(--border-default)}.filter-chip__icon{color:var(--color-healthcare);flex-shrink:0}.filter-chip--active{border-color:var(--color-healthcare);box-shadow:0 0 8px 0 rgba(var(--healthcare-rgb),.1)}.filter-chip__label{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.filter-chip__badge{align-items:center;background-color:var(--color-healthcare);border-radius:100px;color:var(--color-text-inverse);display:inline-flex;flex-shrink:0;font-size:11px;font-weight:600;height:18px;justify-content:center;line-height:1;min-width:18px;padding:0 5px}.filter-chip__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-chip__caret--open{transform:rotate(180deg)}.filter-chip__dropdown{background-color:var(--bg-surface);border:1px solid var(--border-default);border-radius:6px;box-shadow:0 4px 12px rgba(var(--shadow-rgb),.08),0 2px 4px rgba(var(--shadow-rgb),.04);left:0;max-height:300px;max-width:420px;min-width:380px;overflow-y:auto;padding:4px;position:absolute;top:calc(100% + 4px);width:-moz-max-content;width:max-content;z-index:50}.filter-chip__search{align-items:center;background-color:var(--bg-surface);border-bottom:1px solid var(--border-soft);color:var(--text-muted);display:flex;gap:6px;margin:-4px -4px 4px;padding:8px;position:sticky;top:-4px;z-index:1}.filter-chip__search input{background:none;border:none;color:var(--text-primary);flex:1;font-family:var(--font-sans);font-size:var(--font-14);min-width:0;outline:none}.filter-chip__search input::-webkit-search-cancel-button{cursor:pointer}.filter-chip__no-match{font-size:var(--font-14);margin:0;padding:10px 8px}.filter-chip__no-match,.filter-chip__section{color:var(--text-muted);font-family:var(--font-sans)}.filter-chip__section{border-top:1px solid var(--border-default);font-size:var(--font-12);font-weight:var(--weight-bold);letter-spacing:.04em;margin:8px 0 2px;padding:8px 8px 0;text-transform:uppercase}.filter-chip__section:first-child{border-top:none;margin-top:0;padding-top:0}.filter-chip__option{align-items:center;background:none;border:none;border-radius:4px;color:var(--text-secondary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);gap:8px;padding:6px 8px;text-align:left;transition:background-color var(--duration-fast) var(--ease-in-out);width:100%}.filter-chip__option:hover{background-color:var(--bg-surface-2)}.filter-chip__option--selected{color:var(--text-primary);font-weight:var(--weight-medium)}.filter-chip__checkbox{align-items:center;border:1.5px solid var(--border-default);border-radius:3px;display:flex;flex-shrink:0;height:16px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:16px}.filter-chip__checkbox--checked{background-color:var(--color-healthcare);border-color:var(--color-healthcare);color:var(--color-text-inverse)}.filter-chip__radio{align-items:center;border:1.5px solid var(--border-default);border-radius:100%;display:flex;flex-shrink:0;height:16px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:16px}.filter-chip__radio--checked{border-color:var(--color-healthcare)}.filter-chip__radio--checked:after{background-color:var(--color-healthcare);border-radius:100%;content:"";height:8px;width:8px}.filter-chip__select-all{align-items:center;background:none;border:none;border-radius:4px;color:var(--color-healthcare);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);font-weight:500;gap:8px;padding:6px 8px;text-align:left;width:100%}.filter-chip__select-all:hover{background-color:rgba(var(--healthcare-rgb),.04)}.filter-chip__options-group{border-left:1px solid var(--border-default);margin-left:14px;padding-left:6px}.dropdown-enter-active,.dropdown-leave-active{transition:opacity var(--duration-fast) var(--ease-in-out),transform var(--duration-fast) var(--ease-in-out)}.dropdown-enter-from,.dropdown-leave-to{opacity:0;transform:translateY(-4px)}
|
|
245
245
|
</style>
|
|
@@ -48,5 +48,5 @@ defineEmits<{
|
|
|
48
48
|
</template>
|
|
49
49
|
|
|
50
50
|
<style scoped>
|
|
51
|
-
.r-input-wrapper{display:flex;flex-direction:column;gap:var(--space-4)}.r-input-label{color:var(--text-secondary);font-size:var(--font-14);font-weight:var(--weight-medium)}.r-input-required{color:var(--color-danger);margin-left:2px}.r-input{background-color:var(--
|
|
51
|
+
.r-input-wrapper{display:flex;flex-direction:column;gap:var(--space-4)}.r-input-label{color:var(--text-secondary);font-size:var(--font-14);font-weight:var(--weight-medium)}.r-input-required{color:var(--color-danger);margin-left:2px}.r-input{background-color:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-sizing:border-box;color:var(--text-primary);font-size:var(--font-14);height:2.5rem;line-height:1.5;padding:var(--space-8) var(--space-12);transition:all var(--duration-fast) var(--ease-in-out);width:100%}.r-input::-moz-placeholder{color:var(--text-muted)}.r-input::placeholder{color:var(--text-muted)}.r-input:hover:not(:disabled){border-color:var(--text-muted)}.r-input:focus{border-color:var(--color-healthcare);box-shadow:0 0 0 3px var(--bg-hover);outline:none}.r-input:disabled{background-color:var(--bg-surface-2);cursor:not-allowed;opacity:.5}.r-input--error,.r-input--error:focus{border-color:var(--color-danger)}.r-input--error:focus{box-shadow:0 0 0 3px rgba(239,68,68,.15)}.r-input-error{color:var(--color-danger);font-size:var(--font-12);margin-top:var(--space-4)}
|
|
52
52
|
</style>
|
|
@@ -101,5 +101,5 @@ const modalStyle = computed(() => {
|
|
|
101
101
|
</template>
|
|
102
102
|
|
|
103
103
|
<style scoped>
|
|
104
|
-
.rm-modal-overlay{align-items:center;backdrop-filter:blur(2px);background:rgba(0,0,0,.4);display:flex;inset:0;justify-content:center;position:fixed;z-index:100}.rm-modal{background
|
|
104
|
+
.rm-modal-overlay{align-items:center;backdrop-filter:blur(2px);background:rgba(0,0,0,.4);display:flex;inset:0;justify-content:center;position:fixed;z-index:100}.rm-modal{background:var(--bg-surface);border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.15);display:flex;flex-direction:column;max-height:90vh;max-width:95vw}.rm-modal__header{align-items:flex-start;display:flex;gap:16px;justify-content:space-between;padding:20px 24px 0}.rm-modal__header-content{flex:1;min-width:0}.rm-modal__close{align-items:center;background:none;border:none;border-radius:var(--r-radius-md);color:var(--text-muted);cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;transition:all var(--r-transition-fast);width:32px}.rm-modal__close:hover{background:var(--bg-surface-3);color:var(--text-primary)}.rm-modal__tabs{padding:0}.rm-modal__body{flex:1;overflow-y:auto;padding:24px}.rm-modal__footer{border-top:1px solid var(--border-soft);padding:16px 24px}.rm-modal-enter-active,.rm-modal-leave-active{transition:opacity .2s ease}.rm-modal-enter-active .rm-modal,.rm-modal-leave-active .rm-modal{transition:transform .2s ease}.rm-modal-enter-from,.rm-modal-leave-to{opacity:0}.rm-modal-enter-from .rm-modal,.rm-modal-leave-to .rm-modal{transform:scale(.95)}.rm-modal-leave-active,.rm-modal-leave-to{pointer-events:none}
|
|
105
105
|
</style>
|
|
@@ -33,5 +33,5 @@ defineEmits<{
|
|
|
33
33
|
</template>
|
|
34
34
|
|
|
35
35
|
<style scoped>
|
|
36
|
-
.toolbar-pill{align-items:center;background-color:var(--
|
|
36
|
+
.toolbar-pill{align-items:center;background-color:var(--bg-surface);border:1px solid var(--border-default);border-radius:38px;color:var(--text-secondary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-14);font-weight:var(--weight-medium);gap:4px;padding:4px 12px;transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap}.toolbar-pill:hover{box-shadow:0 1px 2px 0 rgba(var(--shadow-rgb),.1)}.toolbar-pill--active{background-color:var(--color-healthcare);border-color:var(--color-healthcare);color:var(--color-text-inverse)}.toolbar-pill--active:hover{background-color:var(--color-healthcare-active);border-color:var(--color-healthcare-active);box-shadow:none}.toolbar-pill--primary{background-color:var(--color-healthcare);border-color:var(--color-healthcare);color:var(--color-text-inverse)}.toolbar-pill--primary:hover{background-color:var(--color-healthcare-active);border-color:var(--color-healthcare-active);box-shadow:none}.toolbar-pill--secondary{background-color:var(--bg-surface-3);border-color:transparent;color:var(--text-primary)}.toolbar-pill--secondary:hover{background-color:var(--border-default);border-color:transparent}.toolbar-pill--pharma{background-color:var(--color-pharma);border-color:var(--color-pharma);color:var(--color-text-inverse)}.toolbar-pill--pharma:hover{background-color:var(--color-pharma-active);border-color:var(--color-pharma-active)}.toolbar-pill--discovery{background-color:var(--color-discovery);border-color:var(--color-discovery);color:var(--color-text-inverse)}.toolbar-pill--discovery:hover{background-color:var(--color-discovery-active);border-color:var(--color-discovery-active)}.toolbar-pill--databank{background-color:var(--color-databank);border-color:var(--color-databank);color:var(--color-text-inverse)}.toolbar-pill--databank:hover{background-color:var(--color-databank-active);border-color:var(--color-databank-active)}
|
|
37
37
|
</style>
|
|
@@ -47,7 +47,7 @@ withDefaults(defineProps<{
|
|
|
47
47
|
class="rm-product-card"
|
|
48
48
|
:class="[`rm-product-card--${accent}`, { 'rm-product-card--padded': !overlay }]"
|
|
49
49
|
:style="background
|
|
50
|
-
? { backgroundImage: `linear-gradient(90deg, rgba(
|
|
50
|
+
? { backgroundImage: `linear-gradient(90deg, rgba(var(--surface-rgb), .9) 41%, rgba(var(--surface-rgb), 0) 100%), url('${background}')` }
|
|
51
51
|
: undefined"
|
|
52
52
|
>
|
|
53
53
|
<div class="rm-product-card__inner" :class="{ 'rm-product-card__inner--overlay': overlay }">
|
|
@@ -67,5 +67,5 @@ withDefaults(defineProps<{
|
|
|
67
67
|
</template>
|
|
68
68
|
|
|
69
69
|
<style scoped>
|
|
70
|
-
.rm-product-card{align-self:stretch;background-color:var(--bg-surface);background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:var(--radius-xl,12px);box-shadow:0 6px 8px 0 rgba(var(--shadow-rgb,30 41 59),.1);display:flex;flex-direction:column;position:relative}.rm-product-card--padded{padding:40px}.rm-product-card--healthcare{border:1px solid rgba(var(--healthcare-rgb),.1)}.rm-product-card--discovery{border:1px solid rgba(var(--discovery-rgb),.1)}.rm-product-card--databank{border:1px solid rgba(var(--databank-rgb),.1)}.rm-product-card--pharma{border:1px solid rgba(var(--pharma-rgb),.1)}.rm-product-card__inner{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:24px}.rm-product-card__inner--overlay{backdrop-filter:blur(5px);background:
|
|
70
|
+
.rm-product-card{align-self:stretch;background-color:var(--bg-surface);background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:var(--radius-xl,12px);box-shadow:0 6px 8px 0 rgba(var(--shadow-rgb,30 41 59),.1);display:flex;flex-direction:column;position:relative}.rm-product-card--padded{padding:40px}.rm-product-card--healthcare{border:1px solid rgba(var(--healthcare-rgb),.1)}.rm-product-card--discovery{border:1px solid rgba(var(--discovery-rgb),.1)}.rm-product-card--databank{border:1px solid rgba(var(--databank-rgb),.1)}.rm-product-card--pharma{border:1px solid rgba(var(--pharma-rgb),.1)}.rm-product-card__inner{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:24px}.rm-product-card__inner--overlay{backdrop-filter:blur(5px);background:rgba(var(--surface-rgb),.7);border-radius:var(--radius-md,8px);gap:16px;margin:24px;padding:24px;width:calc(100% - 48px)}.rm-product-card__title{font-size:26px;font-weight:900;line-height:normal}.rm-product-card--healthcare .rm-product-card__title{color:var(--color-primary)}.rm-product-card--discovery .rm-product-card__title{color:var(--color-discovery)}.rm-product-card--databank .rm-product-card__title{color:var(--color-databank)}.rm-product-card--pharma .rm-product-card__title{color:var(--color-pharma)}.rm-product-card__text{color:var(--text-primary);max-width:550px}.rm-product-card__actions{align-items:center;display:flex;gap:16px}
|
|
71
71
|
</style>
|
|
@@ -14,9 +14,14 @@
|
|
|
14
14
|
La suppression demande confirmation dans la carte, sur une barre posee en
|
|
15
15
|
bas. Une `confirm()` du navigateur sort du cadre de l'app et ne dit pas
|
|
16
16
|
quelle vue est visee ; la barre, elle, nomme la vue et reste a cote d'elle.
|
|
17
|
+
|
|
18
|
+
Une valeur de critere peut etre une liste de cinquante molecules : elle
|
|
19
|
+
s'arrete a trois lignes, et le survol donne la liste entiere. La bulle ne
|
|
20
|
+
sort que sur les valeurs reellement coupees, mesurees dans le DOM : la
|
|
21
|
+
poser partout ferait recouvrir un texte deja lisible.
|
|
17
22
|
-->
|
|
18
23
|
<script setup lang="ts">
|
|
19
|
-
import { computed, nextTick, ref } from 'vue'
|
|
24
|
+
import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
|
20
25
|
|
|
21
26
|
export interface RmSavedViewPill {
|
|
22
27
|
/** Cle du critere (« Aire », « SMR »). */
|
|
@@ -150,6 +155,44 @@ function commitRename() {
|
|
|
150
155
|
if (next && next !== props.view.title) emit('rename', props.view.id, next)
|
|
151
156
|
}
|
|
152
157
|
|
|
158
|
+
// ------------------------------------------- valeurs de criteres tronquees
|
|
159
|
+
|
|
160
|
+
const root = ref<HTMLElement | null>(null)
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Valeurs coupees par le `line-clamp`, par cle de pastille.
|
|
164
|
+
*
|
|
165
|
+
* Mesure dans le DOM plutot que sur la longueur du texte : trois lignes
|
|
166
|
+
* dependent de la largeur reelle de la carte, qui va du panneau etroit a la
|
|
167
|
+
* page large. On relit donc a chaque changement de contenu et de largeur.
|
|
168
|
+
*/
|
|
169
|
+
const clipped = ref<Record<string, boolean>>({})
|
|
170
|
+
|
|
171
|
+
function measure() {
|
|
172
|
+
const next: Record<string, boolean> = {}
|
|
173
|
+
root.value?.querySelectorAll<HTMLElement>('[data-pill]').forEach((el) => {
|
|
174
|
+
const key = el.dataset.pill
|
|
175
|
+
if (key) next[key] = el.scrollHeight - el.clientHeight > 1
|
|
176
|
+
})
|
|
177
|
+
clipped.value = next
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
let observer: ResizeObserver | null = null
|
|
181
|
+
|
|
182
|
+
onMounted(() => {
|
|
183
|
+
nextTick(measure)
|
|
184
|
+
if (typeof ResizeObserver === 'undefined' || !root.value) return
|
|
185
|
+
observer = new ResizeObserver(() => measure())
|
|
186
|
+
observer.observe(root.value)
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
onBeforeUnmount(() => {
|
|
190
|
+
observer?.disconnect()
|
|
191
|
+
observer = null
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
watch(() => props.view.config, () => nextTick(measure), { deep: true })
|
|
195
|
+
|
|
153
196
|
/** Le clic sur la carte active la vue ; la vue active, elle, est inerte. */
|
|
154
197
|
function onCardClick() {
|
|
155
198
|
if (props.view.active || renaming.value || pending.value) return
|
|
@@ -159,6 +202,7 @@ function onCardClick() {
|
|
|
159
202
|
|
|
160
203
|
<template>
|
|
161
204
|
<div
|
|
205
|
+
ref="root"
|
|
162
206
|
class="rm-view"
|
|
163
207
|
:class="{ 'rm-view--active': view.active, 'rm-view--default': view.isDefault }"
|
|
164
208
|
@click="onCardClick"
|
|
@@ -258,7 +302,17 @@ function onCardClick() {
|
|
|
258
302
|
<template v-if="row.pills?.length">
|
|
259
303
|
<span v-for="(pill, pillIndex) in row.pills" :key="pillIndex" class="rm-view__pill">
|
|
260
304
|
<span class="rm-view__pill-k">{{ pill.k }}</span>
|
|
261
|
-
<
|
|
305
|
+
<RmTooltip
|
|
306
|
+
class="rm-view__pill-tip"
|
|
307
|
+
dir="top"
|
|
308
|
+
full
|
|
309
|
+
:disabled="!clipped[`${index}-${pillIndex}`]"
|
|
310
|
+
>
|
|
311
|
+
<span class="rm-view__pill-v" :data-pill="`${index}-${pillIndex}`">
|
|
312
|
+
{{ pill.v }}
|
|
313
|
+
</span>
|
|
314
|
+
<template #content>{{ pill.v }}</template>
|
|
315
|
+
</RmTooltip>
|
|
262
316
|
</span>
|
|
263
317
|
</template>
|
|
264
318
|
<template v-else>{{ row.value }}</template>
|
|
@@ -291,5 +345,5 @@ function onCardClick() {
|
|
|
291
345
|
</template>
|
|
292
346
|
|
|
293
347
|
<style scoped>
|
|
294
|
-
.rm-view{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);color:var(--text-primary);cursor:pointer;font-family:var(--font-sans);padding:14px 18px;transition:border-color var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast) var(--ease-out),background var(--duration-fast) var(--ease-out)}.rm-view:not(.rm-view--active):hover{background:var(--bg-hover);border-color:var(--color-accent-soft)}.rm-view--active{border-color:var(--color-secondary);box-shadow:0 0 0 3px rgba(var(--brand-rgb),.08);cursor:default}.rm-view__strip{background:var(--bg-hover);border-bottom:1px solid var(--border-soft);border-radius:7px 7px 0 0;color:var(--color-secondary);font-size:var(--font-11);font-weight:var(--weight-bold);gap:var(--space-8);letter-spacing:.06em;margin:-14px -18px var(--space-12);padding:var(--space-8) var(--space-16);text-transform:uppercase}.rm-view__head,.rm-view__strip{align-items:center;display:flex}.rm-view__head{gap:10px}.rm-view__star{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;display:inline-flex;flex:0 0 auto;height:28px;justify-content:center;padding:0;width:28px}.rm-view__star:hover{background:var(--bg-hover)}.rm-view__star--on,.rm-view__star:hover{color:var(--color-warning)}.rm-view__title,.rm-view__title-edit{flex:1;font-size:var(--font-16);font-weight:var(--weight-bold);min-width:0}.rm-view__title-edit{background:var(--bg-surface);border:1px solid var(--color-secondary);border-radius:var(--radius-md);color:var(--text-primary);font-family:inherit;outline:none;padding:2px var(--space-8)}.rm-view__title-edit:focus{box-shadow:0 0 0 3px rgba(var(--brand-rgb),.12)}.rm-view__actions{align-items:center;display:flex;gap:var(--space-8)}.rm-view__badge{align-items:center;background:var(--color-success-bg);border-radius:var(--radius-pill);color:var(--color-success);display:inline-flex;font-size:var(--font-10);font-weight:var(--weight-bold);gap:var(--space-4);letter-spacing:.06em;padding:3px var(--space-8);text-transform:uppercase}.rm-view__menu-wrap{position:relative}.rm-view__more{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;display:inline-flex;height:28px;justify-content:center;padding:0;width:28px}.rm-view__more:hover{background:var(--bg-hover);color:var(--text-primary)}.rm-view__menu-shade{inset:0;position:fixed;z-index:60}.rm-view__menu{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;min-width:200px;padding:var(--space-4);position:absolute;right:0;top:calc(100% + 6px);z-index:61}.rm-view__menu-item{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-13);gap:var(--space-8);padding:var(--space-8) var(--space-12);text-align:left;width:100%}.rm-view__menu-item:hover{background:var(--bg-hover);color:var(--color-secondary)}.rm-view__menu-item--danger{color:var(--color-danger)}.rm-view__menu-item--danger:hover{background:var(--color-danger-bg);color:var(--color-danger)}.rm-view__desc{color:var(--text-secondary);font-size:var(--font-13);margin:var(--space-8) 0 var(--space-12)}.rm-view__config{background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-6);margin:10px 0 var(--space-12);padding:10px 14px}.rm-view__row{align-items:flex-start;display:flex;flex-wrap:wrap;font-size:var(--font-12);gap:14px}.rm-view__row-key{color:var(--text-muted);display:inline-flex;flex-shrink:0;font-size:var(--font-10);font-weight:var(--weight-semibold);letter-spacing:.04em;min-width:96px;padding-top:4px;text-transform:uppercase}.rm-view__row-key,.rm-view__row-val{align-items:center;gap:var(--space-6)}.rm-view__row-val{color:var(--text-primary);display:flex;flex:1 1 200px;flex-wrap:wrap;padding:2px 0}.rm-view__pill{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;font-size:var(--font-12);gap:var(--space-4);padding:5px 10px}.rm-view__pill-k{color:var(--color-primary);font-weight:var(--weight-semibold)}.rm-view__pill-v{color:var(--text-primary);font-weight:var(--weight-medium)}.rm-view__foot{border-top:1px solid var(--border-soft);color:var(--text-muted);display:flex;flex-wrap:wrap;font-size:var(--font-11);gap:var(--space-16);padding-top:10px}.rm-view__foot span{align-items:center;display:inline-flex;gap:var(--space-4)}.rm-view__confirm{align-items:center;background:var(--color-danger-bg);border:1px solid var(--color-danger);border-radius:var(--radius-md);color:var(--color-danger);display:flex;flex-wrap:wrap;font-size:var(--font-13);gap:var(--space-12);margin-top:var(--space-12);padding:var(--space-8) var(--space-12)}.rm-view__confirm>span{align-items:center;display:inline-flex;flex:1 1 220px;gap:var(--space-8)}.rm-view__confirm-actions{display:flex;flex-shrink:0;gap:var(--space-8)}
|
|
348
|
+
.rm-view{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);color:var(--text-primary);cursor:pointer;font-family:var(--font-sans);padding:14px 18px;transition:border-color var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast) var(--ease-out),background var(--duration-fast) var(--ease-out)}.rm-view:not(.rm-view--active):hover{background:var(--bg-hover);border-color:var(--color-accent-soft)}.rm-view--active{border-color:var(--color-secondary);box-shadow:0 0 0 3px rgba(var(--brand-rgb),.08);cursor:default}.rm-view__strip{background:var(--bg-hover);border-bottom:1px solid var(--border-soft);border-radius:7px 7px 0 0;color:var(--color-secondary);font-size:var(--font-11);font-weight:var(--weight-bold);gap:var(--space-8);letter-spacing:.06em;margin:-14px -18px var(--space-12);padding:var(--space-8) var(--space-16);text-transform:uppercase}.rm-view__head,.rm-view__strip{align-items:center;display:flex}.rm-view__head{gap:10px}.rm-view__star{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;display:inline-flex;flex:0 0 auto;height:28px;justify-content:center;padding:0;width:28px}.rm-view__star:hover{background:var(--bg-hover)}.rm-view__star--on,.rm-view__star:hover{color:var(--color-warning)}.rm-view__title,.rm-view__title-edit{flex:1;font-size:var(--font-16);font-weight:var(--weight-bold);min-width:0}.rm-view__title-edit{background:var(--bg-surface);border:1px solid var(--color-secondary);border-radius:var(--radius-md);color:var(--text-primary);font-family:inherit;outline:none;padding:2px var(--space-8)}.rm-view__title-edit:focus{box-shadow:0 0 0 3px rgba(var(--brand-rgb),.12)}.rm-view__actions{align-items:center;display:flex;gap:var(--space-8)}.rm-view__badge{align-items:center;background:var(--color-success-bg);border-radius:var(--radius-pill);color:var(--color-success);display:inline-flex;font-size:var(--font-10);font-weight:var(--weight-bold);gap:var(--space-4);letter-spacing:.06em;padding:3px var(--space-8);text-transform:uppercase}.rm-view__menu-wrap{position:relative}.rm-view__more{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;display:inline-flex;height:28px;justify-content:center;padding:0;width:28px}.rm-view__more:hover{background:var(--bg-hover);color:var(--text-primary)}.rm-view__menu-shade{inset:0;position:fixed;z-index:60}.rm-view__menu{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;min-width:200px;padding:var(--space-4);position:absolute;right:0;top:calc(100% + 6px);z-index:61}.rm-view__menu-item{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-13);gap:var(--space-8);padding:var(--space-8) var(--space-12);text-align:left;width:100%}.rm-view__menu-item:hover{background:var(--bg-hover);color:var(--color-secondary)}.rm-view__menu-item--danger{color:var(--color-danger)}.rm-view__menu-item--danger:hover{background:var(--color-danger-bg);color:var(--color-danger)}.rm-view__desc{color:var(--text-secondary);font-size:var(--font-13);margin:var(--space-8) 0 var(--space-12)}.rm-view__config{background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-6);margin:10px 0 var(--space-12);padding:10px 14px}.rm-view__row{align-items:flex-start;display:flex;flex-wrap:wrap;font-size:var(--font-12);gap:14px}.rm-view__row-key{color:var(--text-muted);display:inline-flex;flex-shrink:0;font-size:var(--font-10);font-weight:var(--weight-semibold);letter-spacing:.04em;min-width:96px;padding-top:4px;text-transform:uppercase}.rm-view__row-key,.rm-view__row-val{align-items:center;gap:var(--space-6)}.rm-view__row-val{color:var(--text-primary);display:flex;flex:1 1 200px;flex-wrap:wrap;padding:2px 0}.rm-view__pill{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;font-size:var(--font-12);gap:var(--space-4);padding:5px 10px}.rm-view__pill-k{color:var(--color-primary);font-weight:var(--weight-semibold)}.rm-view__pill-tip{min-width:0}.rm-view__pill-tip :deep(.rm-tooltip__bubble){max-width:320px}.rm-view__pill-v{display:-webkit-box;-webkit-box-orient:vertical;color:var(--text-primary);font-weight:var(--weight-medium);-webkit-line-clamp:3;overflow:hidden}.rm-view__foot{border-top:1px solid var(--border-soft);color:var(--text-muted);display:flex;flex-wrap:wrap;font-size:var(--font-11);gap:var(--space-16);padding-top:10px}.rm-view__foot span{align-items:center;display:inline-flex;gap:var(--space-4)}.rm-view__confirm{align-items:center;background:var(--color-danger-bg);border:1px solid var(--color-danger);border-radius:var(--radius-md);color:var(--color-danger);display:flex;flex-wrap:wrap;font-size:var(--font-13);gap:var(--space-12);margin-top:var(--space-12);padding:var(--space-8) var(--space-12)}.rm-view__confirm>span{align-items:center;display:inline-flex;flex:1 1 220px;gap:var(--space-8)}.rm-view__confirm-actions{display:flex;flex-shrink:0;gap:var(--space-8)}
|
|
295
349
|
</style>
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
RmSidebarRight - le rail droit du portail OIP 7.
|
|
3
3
|
|
|
4
4
|
Provenance : oip7/app/components/SidebarRight.vue. Rail de 56px : le bloc
|
|
5
|
-
utilisateur en haut,
|
|
6
|
-
reprise a l'identique, y compris la course du pouce
|
|
7
|
-
d'amortissement.
|
|
5
|
+
utilisateur en haut, les bascules de theme et de langue collees en bas. La
|
|
6
|
+
bascule de langue est reprise a l'identique, y compris la course du pouce
|
|
7
|
+
(34px) et sa courbe d'amortissement.
|
|
8
|
+
|
|
9
|
+
La bascule jour/nuit (`RmThemeToggle`) est posee au-dessus : le design
|
|
10
|
+
system la met au bas de ce rail, et c'est le seul endroit du cadre visible
|
|
11
|
+
depuis toutes les pages.
|
|
8
12
|
|
|
9
13
|
Les tuiles d'action sont un ajout : le rail du portail n'en a pas, mais une
|
|
10
14
|
app metier a besoin d'appeler ses panneaux (sources, export, acces) et ce
|
|
@@ -55,6 +59,12 @@ const props = withDefaults(defineProps<{
|
|
|
55
59
|
active?: string | null
|
|
56
60
|
locales?: RmRailLocale[]
|
|
57
61
|
locale?: string
|
|
62
|
+
/**
|
|
63
|
+
* Bascule jour / nuit au bas du rail. Presente par defaut : le mode nuit
|
|
64
|
+
* est un reglage du design system, pas une option d'app, et le bas du rail
|
|
65
|
+
* est l'endroit ou le design system la pose.
|
|
66
|
+
*/
|
|
67
|
+
themeToggle?: boolean
|
|
58
68
|
/**
|
|
59
69
|
* Decalage vers la gauche, en longueur CSS. Le panneau du rail
|
|
60
70
|
* (`RmRailPanel`) s'ouvre contre le bord droit du cadre : la barre se pousse
|
|
@@ -69,6 +79,7 @@ const props = withDefaults(defineProps<{
|
|
|
69
79
|
active: null,
|
|
70
80
|
locales: () => [],
|
|
71
81
|
locale: undefined,
|
|
82
|
+
themeToggle: true,
|
|
72
83
|
offset: '0px',
|
|
73
84
|
})
|
|
74
85
|
|
|
@@ -129,8 +140,10 @@ const second = computed(() =>
|
|
|
129
140
|
|
|
130
141
|
<slot />
|
|
131
142
|
|
|
132
|
-
<div v-if="locales.length > 1" class="rm-rail__bottom">
|
|
133
|
-
<
|
|
143
|
+
<div v-if="themeToggle || locales.length > 1" class="rm-rail__bottom">
|
|
144
|
+
<RmThemeToggle v-if="themeToggle" />
|
|
145
|
+
|
|
146
|
+
<div v-if="locales.length > 1" class="rm-lang" :class="{ 'rm-lang--second': second }" role="group" aria-label="Langue">
|
|
134
147
|
<span class="rm-lang__thumb" aria-hidden="true" />
|
|
135
148
|
<button
|
|
136
149
|
v-for="option in locales"
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
RmSourceCard - la fiche d'une source de donnees, repliee ou depliee.
|
|
3
|
+
|
|
4
|
+
Remplace `arg-source-collapse` d'Auriga sur le dessin revu de septembre 2026 :
|
|
5
|
+
le pays passe du tag au drapeau en pastille, le secteur (Public / Prive) monte
|
|
6
|
+
dans l'en-tete a cote du pays au lieu d'attendre l'ouverture, et la date de
|
|
7
|
+
derniere mise a jour et la frequence sortent du corps de texte pour aller dans
|
|
8
|
+
un encart toujours visible. Ce sont les deux questions posees a une source :
|
|
9
|
+
d'ou vient-elle, et de quand date-t-elle. Les faire attendre un clic etait le
|
|
10
|
+
defaut du dessin precedent.
|
|
11
|
+
|
|
12
|
+
Tous les champs viennent de Directus (collections DataSource / DataProvider) :
|
|
13
|
+
`flag` de provider.geo_zones.country_iso, `sector` de provider.status,
|
|
14
|
+
`frequency` de update_frequency (la valeur brute : le composant porte les
|
|
15
|
+
libelles), `lastUpdate` de latest_download_date, `tags` de tags_terms.
|
|
16
|
+
|
|
17
|
+
Le composant ne va pas chercher ses donnees lui-meme : la resolution des uuids
|
|
18
|
+
passe par le proxy serveur de l'app, pour que l'URL et le jeton Directus ne
|
|
19
|
+
partent jamais dans le navigateur.
|
|
20
|
+
-->
|
|
21
|
+
<script setup lang="ts">
|
|
22
|
+
import { computed, ref, useId, onUnmounted } from 'vue'
|
|
23
|
+
|
|
24
|
+
const props = withDefaults(defineProps<{
|
|
25
|
+
/** Intitule de la fiche, generalement « {fournisseur} - {source} ». */
|
|
26
|
+
title: string
|
|
27
|
+
/** Libelle du pays affiche sous le titre. */
|
|
28
|
+
country?: string
|
|
29
|
+
/** Code ISO 3166-1 alpha-2 du drapeau (Directus : geo_zones.country_iso). */
|
|
30
|
+
flag?: string
|
|
31
|
+
/** Secteur du fournisseur (Directus : provider.status). */
|
|
32
|
+
sector?: 'public' | 'private' | 'internal use only' | string | null
|
|
33
|
+
/** Resume court. Absent, le debut de `aboutSource` sert d'accroche. */
|
|
34
|
+
summary?: string
|
|
35
|
+
/** « A propos du fournisseur », HTML Directus. */
|
|
36
|
+
aboutProvider?: string
|
|
37
|
+
/** « A propos de la source », HTML Directus. */
|
|
38
|
+
aboutSource?: string
|
|
39
|
+
/** Lien vers la source. Seul le domaine est affiche. */
|
|
40
|
+
link?: string
|
|
41
|
+
/** Date ISO de derniere mise a jour (Directus : latest_download_date). */
|
|
42
|
+
lastUpdate?: string | null
|
|
43
|
+
/** Valeur brute de frequence Directus (`weekly`, `annually`...). */
|
|
44
|
+
frequency?: string | null
|
|
45
|
+
/** Mots-cles (Directus : tags_terms). */
|
|
46
|
+
tags?: string[] | null
|
|
47
|
+
lang?: 'fr' | 'en'
|
|
48
|
+
/**
|
|
49
|
+
* Cadre en couleur d'accent : la source principale d'un ecran. La mise en
|
|
50
|
+
* avant se joue sur le cadre, jamais sur le contenu, pour que la fiche reste
|
|
51
|
+
* comparable aux autres.
|
|
52
|
+
*/
|
|
53
|
+
highlight?: boolean
|
|
54
|
+
/** Bouton de copie du titre. */
|
|
55
|
+
copyable?: boolean
|
|
56
|
+
}>(), {
|
|
57
|
+
country: undefined,
|
|
58
|
+
flag: undefined,
|
|
59
|
+
sector: undefined,
|
|
60
|
+
summary: undefined,
|
|
61
|
+
aboutProvider: undefined,
|
|
62
|
+
aboutSource: undefined,
|
|
63
|
+
link: undefined,
|
|
64
|
+
lastUpdate: undefined,
|
|
65
|
+
frequency: undefined,
|
|
66
|
+
tags: undefined,
|
|
67
|
+
lang: 'fr',
|
|
68
|
+
highlight: false,
|
|
69
|
+
copyable: true,
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
const emit = defineEmits<{ copy: [title: string] }>()
|
|
73
|
+
|
|
74
|
+
/** Etat deplie, liable en `v-model` quand le panneau veut le piloter. */
|
|
75
|
+
const open = defineModel<boolean>({ default: false })
|
|
76
|
+
|
|
77
|
+
const bodyId = `rm-source-${useId()}`
|
|
78
|
+
|
|
79
|
+
const WORDS = {
|
|
80
|
+
fr: {
|
|
81
|
+
lastUpdate: 'Dernière maj',
|
|
82
|
+
frequency: 'Fréquence',
|
|
83
|
+
aboutProvider: 'À propos du fournisseur',
|
|
84
|
+
aboutSource: 'À propos de la source',
|
|
85
|
+
expand: 'Déplier la source',
|
|
86
|
+
collapse: 'Replier la source',
|
|
87
|
+
copy: 'Copier le titre',
|
|
88
|
+
copied: 'Titre copié',
|
|
89
|
+
sectors: {
|
|
90
|
+
'public': 'Public',
|
|
91
|
+
'private': 'Privé',
|
|
92
|
+
'internal use only': 'Usage interne',
|
|
93
|
+
} as Record<string, string>,
|
|
94
|
+
frequencies: {
|
|
95
|
+
daily: 'Quotidienne',
|
|
96
|
+
weekly: 'Hebdomadaire',
|
|
97
|
+
monthly: 'Mensuelle',
|
|
98
|
+
bimonthly: 'Bimestrielle',
|
|
99
|
+
quarterly: 'Trimestrielle',
|
|
100
|
+
biannually: 'Semestrielle',
|
|
101
|
+
annually: 'Annuelle',
|
|
102
|
+
irregular: 'Irrégulière',
|
|
103
|
+
} as Record<string, string>,
|
|
104
|
+
},
|
|
105
|
+
en: {
|
|
106
|
+
lastUpdate: 'Last update',
|
|
107
|
+
frequency: 'Frequency',
|
|
108
|
+
aboutProvider: 'About the provider',
|
|
109
|
+
aboutSource: 'About the source',
|
|
110
|
+
expand: 'Expand source',
|
|
111
|
+
collapse: 'Collapse source',
|
|
112
|
+
copy: 'Copy title',
|
|
113
|
+
copied: 'Title copied',
|
|
114
|
+
sectors: {
|
|
115
|
+
'public': 'Public',
|
|
116
|
+
'private': 'Private',
|
|
117
|
+
'internal use only': 'Internal use only',
|
|
118
|
+
} as Record<string, string>,
|
|
119
|
+
frequencies: {
|
|
120
|
+
daily: 'Daily',
|
|
121
|
+
weekly: 'Weekly',
|
|
122
|
+
monthly: 'Monthly',
|
|
123
|
+
bimonthly: 'Bi-monthly',
|
|
124
|
+
quarterly: 'Quarterly',
|
|
125
|
+
biannually: 'Biannually',
|
|
126
|
+
annually: 'Annually',
|
|
127
|
+
irregular: 'Irregular',
|
|
128
|
+
} as Record<string, string>,
|
|
129
|
+
},
|
|
130
|
+
} as const
|
|
131
|
+
|
|
132
|
+
const t = computed(() => WORDS[props.lang] ?? WORDS.fr)
|
|
133
|
+
|
|
134
|
+
const sectorLabel = computed(() => {
|
|
135
|
+
const raw = (props.sector || '').trim().toLowerCase()
|
|
136
|
+
if (!raw || raw === 'draft' || raw === 'archived') return ''
|
|
137
|
+
return t.value.sectors[raw] || props.sector || ''
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
const sectorVariant = computed<'active' | 'info' | 'grey'>(() => {
|
|
141
|
+
const raw = (props.sector || '').trim().toLowerCase()
|
|
142
|
+
if (raw === 'public') return 'active'
|
|
143
|
+
if (raw === 'private') return 'info'
|
|
144
|
+
return 'grey'
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
const lastUpdateLabel = computed(() => {
|
|
148
|
+
const time = props.lastUpdate ? new Date(props.lastUpdate).getTime() : NaN
|
|
149
|
+
// Une date nulle ou a l'epoque Unix sortait « 1 janvier 1970 » : le tiret dit
|
|
150
|
+
// « pas de date » sans mentir sur une.
|
|
151
|
+
if (!Number.isFinite(time) || time <= 0) return '-'
|
|
152
|
+
return new Date(time).toLocaleDateString(props.lang === 'fr' ? 'fr-FR' : 'en-GB', {
|
|
153
|
+
day: 'numeric',
|
|
154
|
+
month: 'long',
|
|
155
|
+
year: 'numeric',
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const frequencyLabel = computed(() => {
|
|
160
|
+
const raw = (props.frequency || '').trim().toLowerCase()
|
|
161
|
+
if (!raw) return '-'
|
|
162
|
+
return t.value.frequencies[raw] || props.frequency || '-'
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
/** Domaine seul : l'URL Directus complete deborde de la fiche. */
|
|
166
|
+
const linkLabel = computed(() => {
|
|
167
|
+
if (!props.link) return ''
|
|
168
|
+
try {
|
|
169
|
+
return new URL(props.link).hostname.replace(/^www\./, '')
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return props.link
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
const cleanTags = computed(() => (props.tags || []).filter(Boolean))
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Accroche de la fiche repliee. Directus ne porte pas de resume court : faute
|
|
180
|
+
* de `summary`, le debut de « A propos de la source » en tient lieu, coupe en
|
|
181
|
+
* hauteur. Deplie, la fiche montre le texte entier dans sa section.
|
|
182
|
+
*/
|
|
183
|
+
const teaserHtml = computed(() => (props.summary ? '' : props.aboutSource || ''))
|
|
184
|
+
|
|
185
|
+
const copied = ref(false)
|
|
186
|
+
let copyTimer: ReturnType<typeof setTimeout> | undefined
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Le presse-papiers moderne demande un contexte sur, et refuse dans un iframe
|
|
190
|
+
* sans permission : la selection cachee reste le seul chemin qui marche partout.
|
|
191
|
+
* En cas d'echec des deux, pas de coche : elle mentirait.
|
|
192
|
+
*/
|
|
193
|
+
async function writeToClipboard(text: string) {
|
|
194
|
+
try {
|
|
195
|
+
await navigator.clipboard.writeText(text)
|
|
196
|
+
return true
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
try {
|
|
200
|
+
const field = document.createElement('textarea')
|
|
201
|
+
field.value = text
|
|
202
|
+
field.setAttribute('readonly', '')
|
|
203
|
+
field.style.position = 'fixed'
|
|
204
|
+
field.style.opacity = '0'
|
|
205
|
+
document.body.appendChild(field)
|
|
206
|
+
field.select()
|
|
207
|
+
const done = document.execCommand('copy')
|
|
208
|
+
document.body.removeChild(field)
|
|
209
|
+
return done
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return false
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async function copyTitle() {
|
|
218
|
+
if (!(await writeToClipboard(props.title))) return
|
|
219
|
+
copied.value = true
|
|
220
|
+
clearTimeout(copyTimer)
|
|
221
|
+
copyTimer = setTimeout(() => (copied.value = false), 2000)
|
|
222
|
+
emit('copy', props.title)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
onUnmounted(() => clearTimeout(copyTimer))
|
|
226
|
+
</script>
|
|
227
|
+
|
|
228
|
+
<template>
|
|
229
|
+
<article
|
|
230
|
+
class="rm-src"
|
|
231
|
+
:class="{ 'rm-src--highlight': highlight }"
|
|
232
|
+
>
|
|
233
|
+
<header class="rm-src__head">
|
|
234
|
+
<button
|
|
235
|
+
type="button"
|
|
236
|
+
class="rm-src__id"
|
|
237
|
+
:aria-expanded="open"
|
|
238
|
+
:aria-controls="bodyId"
|
|
239
|
+
@click="open = !open"
|
|
240
|
+
>
|
|
241
|
+
<span class="rm-src__icon">
|
|
242
|
+
<RmFlag v-if="flag" :code="flag" :height="16" :title="country" />
|
|
243
|
+
<RmIcon v-else name="Globe" :size="20" />
|
|
244
|
+
</span>
|
|
245
|
+
<span class="rm-src__id-text">
|
|
246
|
+
<span class="rm-src__name">{{ title }}</span>
|
|
247
|
+
<span v-if="country || sectorLabel" class="rm-src__meta">
|
|
248
|
+
<span v-if="country" class="rm-src__country">{{ country }}</span>
|
|
249
|
+
<RmBadge v-if="sectorLabel" :variant="sectorVariant">{{ sectorLabel }}</RmBadge>
|
|
250
|
+
</span>
|
|
251
|
+
</span>
|
|
252
|
+
</button>
|
|
253
|
+
|
|
254
|
+
<div class="rm-src__actions">
|
|
255
|
+
<button
|
|
256
|
+
v-if="copyable"
|
|
257
|
+
type="button"
|
|
258
|
+
class="rm-src__btn"
|
|
259
|
+
:class="{ 'rm-src__btn--copied': copied }"
|
|
260
|
+
:aria-label="copied ? t.copied : t.copy"
|
|
261
|
+
:title="copied ? t.copied : t.copy"
|
|
262
|
+
@click="copyTitle"
|
|
263
|
+
>
|
|
264
|
+
<RmIcon
|
|
265
|
+
:name="copied ? 'Check' : 'Copy'"
|
|
266
|
+
:size="14"
|
|
267
|
+
:weight="copied ? 'bold' : 'regular'"
|
|
268
|
+
/>
|
|
269
|
+
</button>
|
|
270
|
+
<button
|
|
271
|
+
type="button"
|
|
272
|
+
class="rm-src__btn"
|
|
273
|
+
:aria-expanded="open"
|
|
274
|
+
:aria-controls="bodyId"
|
|
275
|
+
:aria-label="open ? t.collapse : t.expand"
|
|
276
|
+
@click="open = !open"
|
|
277
|
+
>
|
|
278
|
+
<RmIcon :name="open ? 'CaretUp' : 'CaretDown'" :size="14" />
|
|
279
|
+
</button>
|
|
280
|
+
</div>
|
|
281
|
+
</header>
|
|
282
|
+
|
|
283
|
+
<p v-if="summary" class="rm-src__desc">{{ summary }}</p>
|
|
284
|
+
<!-- eslint-disable-next-line vue/no-v-html -- HTML redactionnel Directus -->
|
|
285
|
+
<div
|
|
286
|
+
v-else-if="teaserHtml && !open"
|
|
287
|
+
class="rm-src__rich rm-src__rich--clip"
|
|
288
|
+
v-html="teaserHtml"
|
|
289
|
+
/>
|
|
290
|
+
|
|
291
|
+
<div v-if="open" :id="bodyId" class="rm-src__detail">
|
|
292
|
+
<template v-if="aboutProvider">
|
|
293
|
+
<p class="rm-src__eyebrow">{{ t.aboutProvider }}</p>
|
|
294
|
+
<!-- eslint-disable-next-line vue/no-v-html -->
|
|
295
|
+
<div class="rm-src__rich" v-html="aboutProvider" />
|
|
296
|
+
</template>
|
|
297
|
+
|
|
298
|
+
<template v-if="aboutSource">
|
|
299
|
+
<p class="rm-src__eyebrow">{{ t.aboutSource }}</p>
|
|
300
|
+
<!-- eslint-disable-next-line vue/no-v-html -->
|
|
301
|
+
<div class="rm-src__rich" v-html="aboutSource" />
|
|
302
|
+
</template>
|
|
303
|
+
|
|
304
|
+
<a v-if="link" class="rm-src__link" :href="link" target="_blank" rel="noopener">
|
|
305
|
+
<RmIcon name="ArrowUpRight" :size="14" />
|
|
306
|
+
<span>{{ linkLabel }}</span>
|
|
307
|
+
</a>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
310
|
+
<div class="rm-src__foot">
|
|
311
|
+
<p class="rm-src__cell">
|
|
312
|
+
<RmIcon name="Clock" :size="16" />
|
|
313
|
+
<span class="rm-src__cell-text">
|
|
314
|
+
<span class="rm-src__key">{{ t.lastUpdate }}</span>
|
|
315
|
+
<span class="rm-src__value">{{ lastUpdateLabel }}</span>
|
|
316
|
+
</span>
|
|
317
|
+
</p>
|
|
318
|
+
<p class="rm-src__cell">
|
|
319
|
+
<RmIcon name="ArrowsClockwise" :size="16" />
|
|
320
|
+
<span class="rm-src__cell-text">
|
|
321
|
+
<span class="rm-src__key">{{ t.frequency }}</span>
|
|
322
|
+
<span class="rm-src__value">{{ frequencyLabel }}</span>
|
|
323
|
+
</span>
|
|
324
|
+
</p>
|
|
325
|
+
</div>
|
|
326
|
+
|
|
327
|
+
<div v-if="cleanTags.length" class="rm-src__tags">
|
|
328
|
+
<span v-for="tag in cleanTags" :key="tag" class="rm-src__tag">{{ tag }}</span>
|
|
329
|
+
</div>
|
|
330
|
+
</article>
|
|
331
|
+
</template>
|
|
332
|
+
|
|
333
|
+
<style scoped>
|
|
334
|
+
.rm-src{align-self:stretch;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);display:flex;flex-direction:column;font-family:var(--font-sans);gap:var(--space-12);padding:var(--space-16);transition:border-color var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.rm-src:hover{border-color:var(--color-secondary);box-shadow:var(--shadow-md);transform:translateY(-1px)}.rm-src--highlight{background:color-mix(in srgb,var(--color-primary) 4%,var(--bg-surface));border-color:var(--color-primary)}.rm-src__head,.rm-src__id{align-items:flex-start;display:flex;gap:var(--space-12)}.rm-src__id{background:none;border:none;cursor:pointer;flex:1;font-family:inherit;min-width:0;padding:0;text-align:left}.rm-src__icon{align-items:center;background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:50%;color:var(--text-muted);display:flex;flex-shrink:0;height:40px;justify-content:center;line-height:1;width:40px}.rm-src__id-text{display:flex;flex-direction:column;gap:4px;min-width:0}.rm-src__name{color:var(--text-primary);font-family:var(--font-serif);font-size:var(--font-16);font-weight:var(--weight-bold);line-height:1.25}.rm-src__meta{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-8)}.rm-src__country{color:var(--text-secondary);font-size:var(--font-12)}.rm-src__actions{align-items:center;display:flex;flex-shrink:0;gap:var(--space-4)}.rm-src__btn{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:inline-flex;height:28px;justify-content:center;padding:0;transition:background var(--duration-fast) var(--ease-out),border-color var(--duration-fast) var(--ease-out),color var(--duration-fast) var(--ease-out);width:28px}.rm-src__btn:hover{background:var(--bg-hover);border-color:var(--color-violet-pale);color:var(--color-secondary)}.rm-src__btn--copied,.rm-src__btn.rm-src__btn--copied:hover{background:var(--color-success-bg);border-color:var(--color-success);color:var(--color-success)}.rm-src__desc,.rm-src__rich{color:var(--text-secondary);font-size:var(--font-13);line-height:1.55;margin:0}.rm-src__rich--clip{max-height:40px;overflow:hidden}.rm-src__detail{border-top:1px solid var(--border-soft);margin-top:var(--space-4);padding:var(--space-16) 0 var(--space-4)}.rm-src__eyebrow{color:var(--text-muted);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.1em;margin:0 0 var(--space-8);text-transform:uppercase}.rm-src__eyebrow:not(:first-child){margin-top:var(--space-20)}.rm-src__detail .rm-src__rich{line-height:1.65}.rm-src__rich :deep(p){margin:0 0 var(--space-12)}.rm-src__rich :deep(p:last-child){margin-bottom:0}.rm-src__rich :deep(ul){margin:0;padding-left:var(--space-20)}.rm-src__rich :deep(li){margin-bottom:var(--space-4)}.rm-src__rich :deep(b),.rm-src__rich :deep(strong){color:var(--text-primary);font-weight:var(--weight-semibold)}.rm-src__link{align-items:center;color:var(--color-primary);display:inline-flex;font-size:var(--font-12);font-weight:var(--weight-medium);gap:var(--space-6);margin-top:var(--space-12);text-decoration:underline;text-underline-offset:3px}.rm-src__link:hover{color:var(--color-primary-hover);text-decoration-thickness:2px}.rm-src__foot{background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:var(--radius-lg);display:flex;flex-wrap:wrap;gap:var(--space-8) var(--space-24);padding:var(--space-12) var(--space-16)}.rm-src__cell{align-items:center;color:var(--color-secondary);display:flex;gap:var(--space-8);margin:0}.rm-src__cell-text{display:flex;flex-direction:column;gap:2px}.rm-src__key{color:var(--text-muted);font-size:var(--font-10);letter-spacing:.04em;text-transform:uppercase}.rm-src__key,.rm-src__value{font-weight:var(--weight-semibold)}.rm-src__value{color:var(--text-primary);font-size:var(--font-12);font-variant-numeric:tabular-nums}.rm-src__tags{display:flex;flex-wrap:wrap;gap:var(--space-6)}.rm-src__tag{border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-secondary);font-size:var(--font-11);font-weight:var(--weight-medium);padding:3px var(--space-8)}
|
|
335
|
+
</style>
|
|
@@ -462,5 +462,5 @@ function heatClass(col: RmTableColumn, row: Record<string, any>) {
|
|
|
462
462
|
</template>
|
|
463
463
|
|
|
464
464
|
<style scoped>
|
|
465
|
-
.rm-table-wrapper{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);flex:1;overflow:hidden}.rm-table__scroll{overflow:auto}.rm-table{border-collapse:collapse;font-size:var(--font-13,13px);width:100%}.rm-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.rm-table caption{caption-side:top;color:var(--text-primary);font-size:var(--font-13,13px);font-weight:700;padding:0 0 var(--space-8,8px);text-align:left}.rm-table__th{background:var(--bg-surface-2);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:12px 14px;text-align:left;text-transform:uppercase;white-space:nowrap}.rm-table--sticky .rm-table__th{border-bottom:none;box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:2}.rm-table__th--center{text-align:center}.rm-table__th--num,.rm-table__th--right{text-align:right}.rm-table__th--check,.rm-table__th--expand{padding-right:0;width:36px}.rm-table__sort{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;gap:var(--space-6,6px);letter-spacing:inherit;padding:0;text-transform:inherit}.rm-table__sort:hover{color:var(--text-primary)}.rm-table__sort:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-muted);content:"";display:inline-block;height:0;opacity:.5;vertical-align:middle;width:0}.rm-table__th[aria-sort=ascending] .rm-table__sort:after{border-bottom:5px solid var(--color-primary);border-top:none;opacity:1}.rm-table__th[aria-sort=descending] .rm-table__sort:after{border-top:5px solid var(--color-primary);opacity:1}.rm-table a:focus-visible,.rm-table button:focus-visible{border-radius:var(--radius-sm,4px);outline:2px solid var(--color-primary);outline-offset:2px}.rm-table__td{border-bottom:1px solid var(--border-soft);color:var(--text-primary);padding:12px 14px;text-align:left;vertical-align:top}th.rm-table__td{background:transparent;font-weight:700;letter-spacing:0;text-transform:none}.rm-table__td--center{text-align:center}.rm-table__td--right{text-align:right}.rm-table__td--num{font-variant-numeric:tabular-nums;text-align:right}.rm-table__td--check,.rm-table__td--expand{color:var(--text-muted);padding-right:0;width:36px}.rm-table__row--striped>.rm-table__td{background:var(--bg-surface-2)}.rm-table--hoverable .rm-table__row:hover>.rm-table__td,.rm-table__row--selected>.rm-table__td{background:var(--bg-hover)}.rm-table__row--expandable{cursor:pointer}.rm-table__caret{display:inline-flex;transition:transform .16s var(--ease-out,ease)}.rm-table__caret.is-open{color:var(--color-primary);transform:rotate(90deg)}.rm-table__group>th{background:var(--bg-hover);color:var(--color-primary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-8,8px) var(--space-12,12px);text-align:left;text-transform:uppercase}.rm-table__detail>td{background:var(--bg-surface-2);border-bottom:1px solid var(--border-soft);padding:0}.rm-table__detail-body{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:1.6;padding:var(--space-12,12px) var(--space-20,20px)}.rm-table__td--heat-1{background:#fee5e5!important;color:#911616}.rm-table__td--heat-2{background:#ffe7d2!important;color:#8a4309}.rm-table__td--heat-3{background:#fff6cc!important;color:#6b5400}.rm-table__td--heat-4{background:#d8f3dc!important;color:#1b5e25}.rm-table__td--heat-5{background:#b7e4c7!important;color:#0e4b19}
|
|
465
|
+
.rm-table-wrapper{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);flex:1;overflow:hidden}.rm-table__scroll{overflow:auto}.rm-table{border-collapse:collapse;font-size:var(--font-13,13px);width:100%}.rm-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.rm-table caption{caption-side:top;color:var(--text-primary);font-size:var(--font-13,13px);font-weight:700;padding:0 0 var(--space-8,8px);text-align:left}.rm-table__th{background:var(--bg-surface-2);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:12px 14px;text-align:left;text-transform:uppercase;white-space:nowrap}.rm-table--sticky .rm-table__th{border-bottom:none;box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:2}.rm-table__th--center{text-align:center}.rm-table__th--num,.rm-table__th--right{text-align:right}.rm-table__th--check,.rm-table__th--expand{padding-right:0;width:36px}.rm-table__sort{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;gap:var(--space-6,6px);letter-spacing:inherit;padding:0;text-transform:inherit}.rm-table__sort:hover{color:var(--text-primary)}.rm-table__sort:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-muted);content:"";display:inline-block;height:0;opacity:.5;vertical-align:middle;width:0}.rm-table__th[aria-sort=ascending] .rm-table__sort:after{border-bottom:5px solid var(--color-primary);border-top:none;opacity:1}.rm-table__th[aria-sort=descending] .rm-table__sort:after{border-top:5px solid var(--color-primary);opacity:1}.rm-table a:focus-visible,.rm-table button:focus-visible{border-radius:var(--radius-sm,4px);outline:2px solid var(--color-primary);outline-offset:2px}.rm-table__td{border-bottom:1px solid var(--border-soft);color:var(--text-primary);padding:12px 14px;text-align:left;vertical-align:top}th.rm-table__td{background:transparent;font-weight:700;letter-spacing:0;text-transform:none}.rm-table__td--center{text-align:center}.rm-table__td--right{text-align:right}.rm-table__td--num{font-variant-numeric:tabular-nums;text-align:right}.rm-table__td--check,.rm-table__td--expand{color:var(--text-muted);padding-right:0;width:36px}.rm-table__row--striped>.rm-table__td{background:var(--bg-surface-2)}.rm-table--hoverable .rm-table__row:hover>.rm-table__td,.rm-table__row--selected>.rm-table__td{background:var(--bg-hover)}.rm-table__row--expandable{cursor:pointer}.rm-table__caret{display:inline-flex;transition:transform .16s var(--ease-out,ease)}.rm-table__caret.is-open{color:var(--color-primary);transform:rotate(90deg)}.rm-table__group>th{background:var(--bg-hover);color:var(--color-primary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-8,8px) var(--space-12,12px);text-align:left;text-transform:uppercase}.rm-table__detail>td{background:var(--bg-surface-2);border-bottom:1px solid var(--border-soft);padding:0}.rm-table__detail-body{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:1.6;padding:var(--space-12,12px) var(--space-20,20px)}.rm-table__td--heat-1{background:#fee5e5!important;color:#911616}.rm-table__td--heat-2{background:#ffe7d2!important;color:#8a4309}.rm-table__td--heat-3{background:#fff6cc!important;color:#6b5400}.rm-table__td--heat-4{background:#d8f3dc!important;color:#1b5e25}.rm-table__td--heat-5{background:#b7e4c7!important;color:#0e4b19}body.night .rm-table__td--heat-1{background:#3f1414!important;color:#ffb4b4}body.night .rm-table__td--heat-2{background:#3d2410!important;color:#ffc58a}body.night .rm-table__td--heat-3{background:#3a3210!important;color:#ffe07a}body.night .rm-table__td--heat-4{background:#18351f!important;color:#8ae0a4}body.night .rm-table__td--heat-5{background:#0f4019!important;color:#b4f0c2}.rm-table--compact .rm-table__td,.rm-table--compact .rm-table__th{font-size:var(--font-12,12px);padding:var(--space-6,6px) var(--space-12,12px)}.rm-table--compact .rm-table__th{font-size:var(--font-10,10px)}.rm-table__bulk{align-items:center;background:var(--bg-hover);border-bottom:1px solid var(--color-violet-pale);display:flex;font-size:var(--font-12,12px);justify-content:space-between;padding:var(--space-8,8px) var(--space-16,16px)}.rm-table__bulk-count b{color:var(--color-primary)}.rm-table__bulk-actions{display:flex;gap:var(--space-4,4px)}.rm-table__pager{align-items:center;background:var(--bg-surface);border-top:1px solid var(--border-default);display:flex;font-size:var(--font-12,12px);gap:var(--space-12,12px);justify-content:space-between;padding:var(--space-8,8px) var(--space-12,12px)}.rm-table__pager-count{color:var(--text-secondary);font-variant-numeric:tabular-nums}.rm-table__pager-controls{align-items:center;display:flex;gap:var(--space-4,4px)}.rm-table__pager-page{background:none;border:1px solid transparent;border-radius:var(--radius-sm,6px);color:var(--text-secondary);cursor:pointer;font:inherit;font-variant-numeric:tabular-nums;height:28px;min-width:28px;padding:0 6px}.rm-table__pager-page:hover{background:var(--bg-hover);color:var(--color-secondary)}.rm-table__pager-page.is-current{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.rm-table__pager-gap{color:var(--text-muted);padding:0 2px}.rm-table__empty{color:var(--text-muted);padding:32px 16px;text-align:center}.rm-table__skeleton{height:14px;width:80%}
|
|
466
466
|
</style>
|
|
@@ -102,5 +102,5 @@ watch(() => props.modelValue, (val) => updateIndicator(val))
|
|
|
102
102
|
</template>
|
|
103
103
|
|
|
104
104
|
<style scoped>
|
|
105
|
-
.rm-tabs{background-color:var(--
|
|
105
|
+
.rm-tabs{background-color:var(--bg-surface);border-bottom:1px solid var(--border-default)}.rm-tabs__list{display:flex;padding:8px 20px 0;position:relative}.rm-tabs__tab{background:none;border:none;border-radius:4px 4px 0 0;color:var(--text-secondary);cursor:pointer;font-family:var(--font-sans);font-size:14px;font-weight:400;padding:12px 16px;position:relative;transition:color var(--duration-fast) var(--ease-in-out),background var(--duration-fast) var(--ease-in-out);white-space:nowrap}.rm-tabs__tab:hover{background:var(--tab-active-bg);color:var(--text-secondary)}.rm-tabs__tab--active{font-weight:500}.rm-tabs__indicator{border-radius:2px 2px 0 0;bottom:0;height:2px;left:0;position:absolute;transition:transform .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1)}
|
|
106
106
|
</style>
|
|
@@ -56,5 +56,5 @@ const emit = defineEmits<{ close: [] }>()
|
|
|
56
56
|
</template>
|
|
57
57
|
|
|
58
58
|
<style scoped>
|
|
59
|
-
.rm-tag{align-items:center;background:var(--bg-surface-3);border-radius:var(--radius-sm);color:var(--text-secondary);display:inline-flex;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);gap:8px;line-height:normal;max-width:100%;padding:4px 8px;width:-moz-fit-content;width:fit-content}.rm-tag__close{background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;padding:0}.rm-tag--transparent{background:transparent;border:1px solid var(--border-default)}.rm-tag--gray{background:rgba(143,145,172,.1);color:var(--text-primary)}.rm-tag--rose{background:rgba(244,63,94,.1);color:#9f1239}.rm-tag--pink{background:rgba(236,72,153,.1);color:#9d174d}.rm-tag--fushia{background:rgba(217,70,239,.1);color:#86198f}.rm-tag--purple{background:rgba(168,85,247,.1);color:#6b21a8}.rm-tag--violet{background:rgba(139,92,246,.1);color:#5b21b6}.rm-tag--indigo{background:rgba(99,102,241,.1);color:#3730a3}.rm-tag--blue{background:rgba(59,130,246,.1);color:#1e40af}.rm-tag--sky{background:rgba(14,165,233,.1);color:#075985}.rm-tag--cyan{background:rgba(6,182,212,.1);color:#155e75}.rm-tag--teal{background:rgba(20,184,166,.1);color:#115e59}.rm-tag--emerald{background:rgba(16,185,129,.1);color:#065f46}.rm-tag--green{background:rgba(34,197,94,.1);color:#166534}.rm-tag--lime{background:rgba(132,204,22,.1);color:#3f6212}.rm-tag--yellow{background:rgba(234,179,8,.1);color:#854d0e}.rm-tag--amber{background:rgba(245,158,11,.1);color:#92400e}.rm-tag--orange{background:rgba(249,115,22,.1);color:#9a3412}
|
|
59
|
+
.rm-tag{align-items:center;background:var(--bg-surface-3);border-radius:var(--radius-sm);color:var(--text-secondary);display:inline-flex;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);gap:8px;line-height:normal;max-width:100%;padding:4px 8px;width:-moz-fit-content;width:fit-content}.rm-tag__close{background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;padding:0}.rm-tag--transparent{background:transparent;border:1px solid var(--border-default)}.rm-tag--gray{background:rgba(143,145,172,.1);color:var(--text-primary)}.rm-tag--rose{background:rgba(244,63,94,.1);color:#9f1239}.rm-tag--pink{background:rgba(236,72,153,.1);color:#9d174d}.rm-tag--fushia{background:rgba(217,70,239,.1);color:#86198f}.rm-tag--purple{background:rgba(168,85,247,.1);color:#6b21a8}.rm-tag--violet{background:rgba(139,92,246,.1);color:#5b21b6}.rm-tag--indigo{background:rgba(99,102,241,.1);color:#3730a3}.rm-tag--blue{background:rgba(59,130,246,.1);color:#1e40af}.rm-tag--sky{background:rgba(14,165,233,.1);color:#075985}.rm-tag--cyan{background:rgba(6,182,212,.1);color:#155e75}.rm-tag--teal{background:rgba(20,184,166,.1);color:#115e59}.rm-tag--emerald{background:rgba(16,185,129,.1);color:#065f46}.rm-tag--green{background:rgba(34,197,94,.1);color:#166534}.rm-tag--lime{background:rgba(132,204,22,.1);color:#3f6212}.rm-tag--yellow{background:rgba(234,179,8,.1);color:#854d0e}.rm-tag--amber{background:rgba(245,158,11,.1);color:#92400e}.rm-tag--orange{background:rgba(249,115,22,.1);color:#9a3412}body.night .rm-tag--rose{color:#fda4af}body.night .rm-tag--pink{color:#f9a8d4}body.night .rm-tag--fushia{color:#f0abfc}body.night .rm-tag--purple{color:#d8b4fe}body.night .rm-tag--violet{color:#c4b5fd}body.night .rm-tag--indigo{color:#a5b4fc}body.night .rm-tag--blue{color:#93c5fd}body.night .rm-tag--sky{color:#7dd3fc}body.night .rm-tag--cyan{color:#67e8f9}body.night .rm-tag--teal{color:#5eead4}body.night .rm-tag--emerald{color:#6ee7b7}body.night .rm-tag--green{color:#86efac}body.night .rm-tag--lime{color:#bef264}body.night .rm-tag--yellow{color:#fde047}body.night .rm-tag--amber{color:#fcd34d}body.night .rm-tag--orange{color:#fdba74}
|
|
60
60
|
</style>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
RmThemeToggle - bascule jour / nuit.
|
|
3
|
+
|
|
4
|
+
Provenance : `.day-night-switcher` du design system (skill
|
|
5
|
+
tekkare-dashboard-design, `assets/oip.css`). Pastille de rapport 2:1, pouce
|
|
6
|
+
glissant, soleil ambre a gauche, lune a droite.
|
|
7
|
+
|
|
8
|
+
Un seul bouton, pas deux : la pastille entiere est la cible, comme dans le
|
|
9
|
+
design system. Deux boutons donneraient deux cibles de 24px, sous le seuil
|
|
10
|
+
de taille de cible, et n'ajouteraient rien — un mode a deux etats se decrit
|
|
11
|
+
par un `switch`.
|
|
12
|
+
|
|
13
|
+
L'etat visuel ne vient pas d'une classe posee ici mais de `body.night` seul
|
|
14
|
+
(cf. shell.css). C'est ce qui garantit qu'une bascule declenchee ailleurs -
|
|
15
|
+
un panneau d'accessibilite, une preference restauree au demarrage - est
|
|
16
|
+
reprise par la pastille sans etat a synchroniser.
|
|
17
|
+
-->
|
|
18
|
+
<script setup lang="ts">
|
|
19
|
+
import { useRomulusTheme } from '../composables/useTheme'
|
|
20
|
+
|
|
21
|
+
withDefaults(defineProps<{
|
|
22
|
+
/** Infobulle et nom accessible de la bascule. */
|
|
23
|
+
label?: string
|
|
24
|
+
}>(), {
|
|
25
|
+
label: 'Basculer mode jour / nuit',
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const { night, setNight } = useRomulusTheme()
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<template>
|
|
32
|
+
<button
|
|
33
|
+
class="rm-dns"
|
|
34
|
+
type="button"
|
|
35
|
+
role="switch"
|
|
36
|
+
:aria-checked="night"
|
|
37
|
+
:aria-label="label"
|
|
38
|
+
:title="label"
|
|
39
|
+
@click="setNight(!night)"
|
|
40
|
+
>
|
|
41
|
+
<span class="rm-dns__thumb" aria-hidden="true" />
|
|
42
|
+
<span class="rm-dns__half" data-dns="day" aria-hidden="true"><i class="ph-fill ph-sun" /></span>
|
|
43
|
+
<span class="rm-dns__half" data-dns="night" aria-hidden="true"><i class="ph-fill ph-moon" /></span>
|
|
44
|
+
</button>
|
|
45
|
+
</template>
|
|
@@ -131,5 +131,5 @@ onUnmounted(() => document.removeEventListener('click', onClickOutside))
|
|
|
131
131
|
</template>
|
|
132
132
|
|
|
133
133
|
<style scoped>
|
|
134
|
-
.toolbar-filter{position:relative}.toolbar-filter__caret{opacity:.6;transition:transform var(--duration-fast) var(--ease-in-out)}.toolbar-filter__caret--open{transform:rotate(180deg)}.toolbar-filter__dropdown{background-color:var(--
|
|
134
|
+
.toolbar-filter{position:relative}.toolbar-filter__caret{opacity:.6;transition:transform var(--duration-fast) var(--ease-in-out)}.toolbar-filter__caret--open{transform:rotate(180deg)}.toolbar-filter__dropdown{background-color:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:0 4px 12px rgba(var(--shadow-rgb),.08),0 2px 4px rgba(var(--shadow-rgb),.04);left:0;max-height:260px;min-width:200px;overflow-y:auto;padding:var(--space-4);position:absolute;top:calc(100% + var(--space-8));z-index:50}.toolbar-filter__option{align-items:center;background:none;border:none;border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-14);gap:var(--space-8);padding:var(--space-8) var(--space-12);text-align:left;transition:background-color var(--duration-fast) var(--ease-in-out);width:100%}.toolbar-filter__option:hover{background-color:var(--bg-surface-2)}.toolbar-filter__option--selected{color:var(--text-primary);font-weight:var(--weight-medium)}.toolbar-filter__checkbox{align-items:center;border:1.5px solid var(--border-default);border-radius:var(--radius-sm);display:flex;flex-shrink:0;height:16px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:16px}.toolbar-filter__checkbox--checked{background-color:var(--color-healthcare);border-color:var(--color-healthcare);color:var(--color-text-inverse)}.toolbar-filter__radio{align-items:center;border:1.5px solid var(--border-default);border-radius:var(--radius-pill);display:flex;flex-shrink:0;height:16px;justify-content:center;transition:all var(--duration-fast) var(--ease-in-out);width:16px}.toolbar-filter__radio--checked{border-color:var(--color-healthcare)}.toolbar-filter__radio--checked:after{background-color:var(--color-healthcare);border-radius:var(--radius-pill);content:"";height:8px;width:8px}.dropdown-enter-active,.dropdown-leave-active{transition:opacity var(--duration-fast) var(--ease-in-out),transform var(--duration-fast) var(--ease-in-out)}.dropdown-enter-from,.dropdown-leave-to{opacity:0;transform:translateY(-4px)}
|
|
135
135
|
</style>
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
export type RmCvdMode = 'none' | 'deutera' | 'protan' | 'tritan' | 'mono';
|
|
2
2
|
export type RmChartPalette = 'default' | 'cvdSafe';
|
|
3
3
|
export type RmTextScale = 'normal' | 'large' | 'xl';
|
|
4
|
+
/**
|
|
5
|
+
* Mode nuit enregistre au dernier passage. Lu par le plugin de demarrage, qui
|
|
6
|
+
* pose la classe avant le premier rendu.
|
|
7
|
+
*/
|
|
8
|
+
export declare function rmSavedNight(): boolean;
|
|
4
9
|
export declare function useRomulusTheme(): {
|
|
5
10
|
night: Readonly<import("vue").Ref<boolean, boolean>>;
|
|
6
11
|
highContrast: Readonly<import("vue").Ref<boolean, boolean>>;
|
|
@@ -10,6 +10,23 @@ const TEXT_CLASSES = {
|
|
|
10
10
|
large: "text-large",
|
|
11
11
|
xl: "text-xl"
|
|
12
12
|
};
|
|
13
|
+
const STORE_KEY = "oip-a11y-prefs";
|
|
14
|
+
function readPrefs() {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(localStorage.getItem(STORE_KEY) || "{}") || {};
|
|
17
|
+
} catch {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function writePref(key, value) {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem(STORE_KEY, JSON.stringify({ ...readPrefs(), [key]: value }));
|
|
24
|
+
} catch {
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function rmSavedNight() {
|
|
28
|
+
return readPrefs().night === true;
|
|
29
|
+
}
|
|
13
30
|
const PALETTE_CLASS = "pal-cvd-safe";
|
|
14
31
|
const DECAL_CLASS = "chart-decal";
|
|
15
32
|
export function useRomulusTheme() {
|
|
@@ -25,6 +42,7 @@ export function useRomulusTheme() {
|
|
|
25
42
|
const setNight = (value) => apply(() => {
|
|
26
43
|
night.value = value;
|
|
27
44
|
document.body.classList.toggle("night", value);
|
|
45
|
+
writePref("night", value);
|
|
28
46
|
});
|
|
29
47
|
const setHighContrast = (value) => apply(() => {
|
|
30
48
|
highContrast.value = value;
|
|
@@ -68,6 +86,7 @@ export function useRomulusTheme() {
|
|
|
68
86
|
textScale.value = "normal";
|
|
69
87
|
chartPalette.value = "default";
|
|
70
88
|
chartDecal.value = false;
|
|
89
|
+
writePref("night", false);
|
|
71
90
|
body.classList.remove(
|
|
72
91
|
"night",
|
|
73
92
|
"high-contrast",
|