@tekkare/romulus 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16.0"
6
6
  },
7
- "version": "0.1.17",
7
+ "version": "0.1.19",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -1 +1 @@
1
- :root{--rm-shell-bg:#f9f9fa;--rm-shell-surface:#fff;--rm-shell-border:#dbdef0;--rm-shell-subtle:#f5f5f9;--rm-shell-text:#1e293b;--rm-shell-text-dark:#475569;--rm-shell-text-muted:#878ca6;--rm-shell-accent:#2017ad;--rm-shell-inset:8px;--rm-shell-radius:12px;--rm-bar-h:56px;--rm-nav-w:240px;--rm-nav-collapsed-w:64px;--rm-rail-w:56px;--rm-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);transition:width .2s;width:var(--rm-nav-w)}.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{color:var(--rm-shell-text);flex:1;font-size:20px;font-weight:700;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__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__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{color:var(--rm-shell-text-muted);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__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:30}.rm-sb--right{position:relative;z-index:31}.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__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__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__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:200}.rm-sb--right{position:relative;z-index:201}.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}}
@@ -18,6 +18,11 @@ export interface RmCrumb {
18
18
  to?: string
19
19
  /** Lien externe : la plateforme vit sur un autre domaine. */
20
20
  href?: string
21
+ /**
22
+ * Code ISO 3166-1 alpha-2 : le maillon porte le drapeau du pays devant son
23
+ * libelle. En SVG, pas en emoji — cf. RmFlag.
24
+ */
25
+ flag?: string
21
26
  }
22
27
 
23
28
  export interface RmHeaderTab {
@@ -48,17 +53,17 @@ const emit = defineEmits<{ tab: [key: string] }>()
48
53
  v-if="crumb.href && i < crumbs.length - 1"
49
54
  class="rm-hd__crumb"
50
55
  :href="crumb.href"
51
- >{{ crumb.label }}</a>
56
+ ><RmFlag v-if="crumb.flag" :code="crumb.flag" :height="12" />{{ crumb.label }}</a>
52
57
  <NuxtLink
53
58
  v-else-if="crumb.to && i < crumbs.length - 1"
54
59
  class="rm-hd__crumb"
55
60
  :to="crumb.to"
56
- >{{ crumb.label }}</NuxtLink>
61
+ ><RmFlag v-if="crumb.flag" :code="crumb.flag" :height="12" />{{ crumb.label }}</NuxtLink>
57
62
  <span
58
63
  v-else
59
64
  class="rm-hd__crumb rm-hd__crumb--last"
60
65
  :aria-current="i === crumbs.length - 1 ? 'page' : undefined"
61
- >{{ crumb.label }}</span>
66
+ ><RmFlag v-if="crumb.flag" :code="crumb.flag" :height="12" />{{ crumb.label }}</span>
62
67
  </template>
63
68
  </nav>
64
69
 
@@ -0,0 +1,53 @@
1
+ <!--
2
+ RmFlag - un drapeau national en SVG, designe par son code ISO 3166-1 alpha-2.
3
+
4
+ A utiliser partout ou le chrome montre un pays. L'emoji ne suffit pas : sous
5
+ Windows, Segoe UI Emoji ne ligature pas les indicateurs regionaux et Chrome
6
+ affiche « FR » dans deux carres. Le detail est dans internal/flags.ts, qui
7
+ porte aussi la table.
8
+
9
+ Un code absent de la table retombe sur l'emoji : le chrome montre quelque
10
+ chose partout, et seul le systeme qui ne sait pas le rendre est degrade.
11
+ -->
12
+ <script setup lang="ts">
13
+ import { computed } from 'vue'
14
+ import { RM_FLAGS, rmFlagEmoji } from '../internal/flags'
15
+
16
+ const props = withDefaults(defineProps<{
17
+ /** Code ISO 3166-1 alpha-2, insensible a la casse ("fr", "GB"). */
18
+ code: string
19
+ /** Hauteur en pixels. La largeur suit le rapport 21/15 du dessin. */
20
+ height?: number
21
+ /** Nom lu par les lecteurs d'ecran. Absent : le drapeau est decoratif. */
22
+ title?: string
23
+ /** Coins arrondis. Un drapeau a angles vifs jure a cote d'une icone. */
24
+ rounded?: boolean
25
+ }>(), {
26
+ height: 14,
27
+ title: undefined,
28
+ rounded: true,
29
+ })
30
+
31
+ const key = computed(() => (props.code || '').toLowerCase())
32
+ const svg = computed(() => RM_FLAGS[key.value])
33
+ const width = computed(() => (props.height * 21) / 15)
34
+ </script>
35
+
36
+ <template>
37
+ <svg
38
+ v-if="svg"
39
+ class="rm-flag"
40
+ :class="{ 'rm-flag--rounded': rounded }"
41
+ :width="width"
42
+ :height="height"
43
+ viewBox="0 0 21 15"
44
+ :role="title ? 'img' : undefined"
45
+ :aria-hidden="title ? undefined : true"
46
+ v-html="(title ? `<title>${title}</title>` : '') + svg"
47
+ />
48
+ <span v-else class="rm-flag rm-flag--emoji" :title="title" aria-hidden="true">{{ rmFlagEmoji(key) }}</span>
49
+ </template>
50
+
51
+ <style scoped>
52
+ .rm-flag{display:inline-block;flex-shrink:0;vertical-align:-.15em}.rm-flag--rounded{border-radius:2px;box-shadow:inset 0 0 0 .5px rgba(30,41,59,.18)}
53
+ </style>
@@ -43,6 +43,11 @@ export interface RmNavSection {
43
43
  const props = withDefaults(defineProps<{
44
44
  /** Identite affichee dans l'en-tete. Un emoji au debut est dans l'esprit du portail. */
45
45
  title: string
46
+ /**
47
+ * Code ISO 3166-1 alpha-2 : l'en-tete porte le drapeau du pays devant le
48
+ * titre. A preferer a un emoji colle dans `title` — cf. RmFlag.
49
+ */
50
+ flag?: string
46
51
  /** Cible du titre. Absent : le titre n'est pas un lien. */
47
52
  titleTo?: string
48
53
  sections: RmNavSection[]
@@ -54,6 +59,7 @@ const props = withDefaults(defineProps<{
54
59
  collapseLabel?: string
55
60
  expandLabel?: string
56
61
  }>(), {
62
+ flag: undefined,
57
63
  titleTo: undefined,
58
64
  activePath: undefined,
59
65
  collapsed: false,
@@ -100,8 +106,12 @@ const isActive = (item: RmNavItem) => item.active ?? (!!item.to && item.to === p
100
106
  un element <nuxtlink> inerte dans le DOM — le titre et les entrees de
101
107
  menu ne repondaient plus au clic. Les deux branches sont ecrites en
102
108
  dur pour que le compilateur les resolve. -->
103
- <NuxtLink v-if="!collapsed && titleTo" :to="titleTo" class="rm-sb__logo">{{ title }}</NuxtLink>
104
- <span v-else-if="!collapsed" class="rm-sb__logo">{{ title }}</span>
109
+ <NuxtLink v-if="!collapsed && titleTo" :to="titleTo" class="rm-sb__logo">
110
+ <RmFlag v-if="flag" :code="flag" :height="16" />{{ title }}
111
+ </NuxtLink>
112
+ <span v-else-if="!collapsed" class="rm-sb__logo">
113
+ <RmFlag v-if="flag" :code="flag" :height="16" />{{ title }}
114
+ </span>
105
115
 
106
116
  <!-- Le pictogramme est celui d'oip7, repris trait pour trait : un cadre
107
117
  arrondi barre d'un trait vertical. -->
@@ -0,0 +1,3 @@
1
+ export declare const RM_FLAGS: Record<string, string>;
2
+ /** Drapeau emoji, replis quand le code n'est pas dans la table. */
3
+ export declare const rmFlagEmoji: (code: string) => string;
@@ -0,0 +1,76 @@
1
+ const UNION = `
2
+ <rect width="21" height="15" fill="#012169"/>
3
+ <path d="M0 0L21 15M21 0L0 15" stroke="#FFFFFF" stroke-width="3"/>
4
+ <path d="M0 0L21 15M21 0L0 15" stroke="#C8102E" stroke-width="1.6"/>
5
+ <path d="M10.5 0V15M0 7.5H21" stroke="#FFFFFF" stroke-width="5"/>
6
+ <path d="M10.5 0V15M0 7.5H21" stroke="#C8102E" stroke-width="3"/>`;
7
+ const nordic = (field, cross, inner) => `
8
+ <rect width="21" height="15" fill="${field}"/>
9
+ <path d="M7.5 0V15M0 7.5H21" stroke="${cross}" stroke-width="3.4"/>
10
+ ${inner ? `<path d="M7.5 0V15M0 7.5H21" stroke="${inner}" stroke-width="1.4"/>` : ""}`;
11
+ const vertical = (a, b, c) => `
12
+ <rect width="7" height="15" fill="${a}"/>
13
+ <rect x="7" width="7" height="15" fill="${b}"/>
14
+ <rect x="14" width="7" height="15" fill="${c}"/>`;
15
+ const horizontal = (a, b, c) => `
16
+ <rect width="21" height="5" fill="${a}"/>
17
+ <rect y="5" width="21" height="5" fill="${b}"/>
18
+ <rect y="10" width="21" height="5" fill="${c}"/>`;
19
+ const star = (cx, cy, r, fill = "#FFFFFF") => {
20
+ const points = Array.from({ length: 10 }, (_, i) => {
21
+ const radius = i % 2 ? r * 0.382 : r;
22
+ const angle = Math.PI / 5 * i - Math.PI / 2;
23
+ return `${(cx + radius * Math.cos(angle)).toFixed(2)},${(cy + radius * Math.sin(angle)).toFixed(2)}`;
24
+ });
25
+ return `<polygon points="${points.join(" ")}" fill="${fill}"/>`;
26
+ };
27
+ export const RM_FLAGS = {
28
+ fr: vertical("#002654", "#FFFFFF", "#ED2939"),
29
+ be: vertical("#000000", "#FDDA24", "#EF3340"),
30
+ ie: vertical("#169B62", "#FFFFFF", "#FF883E"),
31
+ it: vertical("#008C45", "#F4F5F0", "#CD212A"),
32
+ ro: vertical("#002B7F", "#FCD116", "#CE1126"),
33
+ de: horizontal("#000000", "#DD0000", "#FFCE00"),
34
+ nl: horizontal("#AE1C28", "#FFFFFF", "#21468B"),
35
+ lu: horizontal("#ED2939", "#FFFFFF", "#00A1DE"),
36
+ at: horizontal("#ED2939", "#FFFFFF", "#ED2939"),
37
+ // Bandes inegales : le jaune occupe la moitie de la hauteur.
38
+ es: `<rect width="21" height="15" fill="#AA151B"/><rect y="3.75" width="21" height="7.5" fill="#F1BF00"/>`,
39
+ pt: `<rect width="21" height="15" fill="#FF0000"/><rect width="8.4" height="15" fill="#006600"/><circle cx="8.4" cy="7.5" r="2.6" fill="#FFE800"/><circle cx="8.4" cy="7.5" r="1.7" fill="#FF0000"/>`,
40
+ pl: `<rect width="21" height="15" fill="#FFFFFF"/><rect y="7.5" width="21" height="7.5" fill="#DC143C"/>`,
41
+ cz: `<rect width="21" height="15" fill="#FFFFFF"/><rect y="7.5" width="21" height="7.5" fill="#D7141A"/><polygon points="0,0 10,7.5 0,15" fill="#11457E"/>`,
42
+ ch: `<rect width="21" height="15" fill="#FF0000"/><path d="M10.5 3.5V11.5M6.5 7.5H14.5" stroke="#FFFFFF" stroke-width="2.4"/>`,
43
+ dk: nordic("#C8102E", "#FFFFFF"),
44
+ se: nordic("#006AA7", "#FECC00"),
45
+ fi: nordic("#FFFFFF", "#003580"),
46
+ no: nordic("#BA0C2F", "#FFFFFF", "#00205B"),
47
+ is: nordic("#02529C", "#FFFFFF", "#DC1E35"),
48
+ gb: UNION,
49
+ uk: UNION,
50
+ us: `<rect width="21" height="15" fill="#B31942"/>
51
+ ${[1, 3, 5, 7, 9, 11].map((i) => `<rect y="${(i * 15 / 13).toFixed(2)}" width="21" height="${(15 / 13).toFixed(2)}" fill="#FFFFFF"/>`).join("")}
52
+ <rect width="8.4" height="${(7 * 15 / 13).toFixed(2)}" fill="#0A3161"/>
53
+ ${[0, 1, 2].flatMap((row) => [0, 1, 2].map((col) => `<circle cx="${2 + col * 2.2}" cy="${1.8 + row * 2.4}" r="0.5" fill="#FFFFFF"/>`)).join("")}`,
54
+ ca: `<rect width="21" height="15" fill="#FFFFFF"/><rect width="5.25" height="15" fill="#D80621"/><rect x="15.75" width="5.25" height="15" fill="#D80621"/>
55
+ <path d="M10.5 3.2 11.3 5.2 12.9 4.6 12.4 6.6 14 6.3 13.3 7.6 14.6 8.6 12.9 9.2 13.2 10.3 11.2 10 11.4 12.3 10.5 11.4 9.6 12.3 9.8 10 7.8 10.3 8.1 9.2 6.4 8.6 7.7 7.6 7 6.3 8.6 6.6 8.1 4.6 9.7 5.2Z" fill="#D80621"/>`,
56
+ jp: `<rect width="21" height="15" fill="#FFFFFF"/><circle cx="10.5" cy="7.5" r="4.2" fill="#BC002D"/>`,
57
+ // Taegeuk simplifie : deux demi-disques et les quatre trigrammes ramenes a
58
+ // des barres. A 21x15 les traits interrompus ne se distinguent plus.
59
+ kr: `<rect width="21" height="15" fill="#FFFFFF"/>
60
+ <path d="M7.2 7.5a3.3 3.3 0 0 1 6.6 0 1.65 1.65 0 0 0-3.3 0 1.65 1.65 0 0 1-3.3 0Z" fill="#CD2E3A"/>
61
+ <path d="M7.2 7.5a1.65 1.65 0 0 1 3.3 0 1.65 1.65 0 0 0 3.3 0 3.3 3.3 0 0 1-6.6 0Z" fill="#0047A0"/>
62
+ <g stroke="#000000" stroke-width="0.7"><path d="M2.6 3.1 4.8 4.6M2 4 4.2 5.5M4.2 10.4 2 11.9M4.8 11.3 2.6 12.8M16.2 4.6 18.4 3.1M16.8 5.5 19 4M16.2 10.4 18.4 11.9M16.8 11.3 19 12.8"/></g>`,
63
+ cn: `<rect width="21" height="15" fill="#EE1C25"/>${star(4.5, 4.2, 2.4, "#FFDE00")}${star(8.6, 1.9, 0.9, "#FFDE00")}${star(9.9, 3.7, 0.9, "#FFDE00")}${star(9.9, 5.9, 0.9, "#FFDE00")}${star(8.6, 7.6, 0.9, "#FFDE00")}`,
64
+ au: `<rect width="21" height="15" fill="#012169"/><g transform="scale(0.5)">${UNION}</g>
65
+ ${star(5.2, 11.4, 1.1)}${star(16.5, 3.4, 0.9)}${star(18.2, 7.4, 0.9)}${star(16.2, 11.2, 0.9)}${star(14.2, 8.6, 0.6)}`,
66
+ nz: `<rect width="21" height="15" fill="#012169"/><g transform="scale(0.5)">${UNION}</g>
67
+ ${star(17.4, 3.6, 0.9, "#C8102E")}${star(15.4, 7, 0.9, "#C8102E")}${star(18.6, 8.2, 0.9, "#C8102E")}${star(16.4, 11.4, 0.9, "#C8102E")}`,
68
+ br: `<rect width="21" height="15" fill="#009B3A"/><polygon points="10.5,1.8 19.4,7.5 10.5,13.2 1.6,7.5" fill="#FEDF00"/><circle cx="10.5" cy="7.5" r="3.1" fill="#002776"/><path d="M7.6 6.4a9 9 0 0 1 5.9 1.5" stroke="#FFFFFF" stroke-width="0.8" fill="none"/>`,
69
+ // Le cercle des douze etoiles, pose au disque : une etoile a cinq branches
70
+ // d'un pixel de rayon n'a plus de branches.
71
+ eu: `<rect width="21" height="15" fill="#003399"/>${Array.from({ length: 12 }, (_, i) => {
72
+ const angle = Math.PI / 6 * i - Math.PI / 2;
73
+ return `<circle cx="${(10.5 + 4.6 * Math.cos(angle)).toFixed(2)}" cy="${(7.5 + 4.6 * Math.sin(angle)).toFixed(2)}" r="0.7" fill="#FFCC00"/>`;
74
+ }).join("")}`
75
+ };
76
+ export const rmFlagEmoji = (code) => code.length === 2 ? String.fromCodePoint(...[...code.toUpperCase()].map((c) => 127462 + c.charCodeAt(0) - 65)) : "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",