@tekkare/romulus 0.1.48 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.json +1 -1
- package/dist/runtime/components/Drawer.vue +1 -1
- package/dist/runtime/components/FilterBar.vue +8 -1
- package/dist/runtime/components/FilterComplex.vue +1 -1
- package/dist/runtime/components/Input.vue +1 -1
- package/dist/runtime/components/LineChart.vue +3 -3
- package/dist/runtime/components/ViewPill.vue +198 -0
- package/dist/runtime/utils/chart.d.ts +1 -2
- package/dist/runtime/utils/chart.js +1 -2
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -76,5 +76,5 @@ const drawerWidth = computed(() => sizeMap[props.size] || props.size)
|
|
|
76
76
|
</template>
|
|
77
77
|
|
|
78
78
|
<style scoped>
|
|
79
|
-
.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(--color-text-inverse);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-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%)}
|
|
79
|
+
.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(--color-text-inverse);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%)}
|
|
80
80
|
</style>
|
|
@@ -144,6 +144,13 @@ onBeforeUnmount(() => {
|
|
|
144
144
|
:style="{ top: `${stickyTop}px`, '--rm-fbar-advanced-w': `${advancedWidth}px` }"
|
|
145
145
|
>
|
|
146
146
|
<div class="rm-fbar__row">
|
|
147
|
+
<!-- Emplacement de la pastille de vue, en tete de rangee : c'est le
|
|
148
|
+
perimetre sous lequel tout le reste se lit. Le cadre de l'app l'y
|
|
149
|
+
pose par un Teleport, la barre n'a pas a connaitre les vues. -->
|
|
150
|
+
<div id="rm_fbar_views" class="rm-fbar__views">
|
|
151
|
+
<slot name="Views" />
|
|
152
|
+
</div>
|
|
153
|
+
|
|
147
154
|
<div v-if="view" class="rm-fbar__view">
|
|
148
155
|
<RmViewSelect
|
|
149
156
|
:tabs="view.tabs"
|
|
@@ -244,5 +251,5 @@ onBeforeUnmount(() => {
|
|
|
244
251
|
</template>
|
|
245
252
|
|
|
246
253
|
<style scoped>
|
|
247
|
-
.rm-fbar{margin-inline:calc((min(var(--oip-content-max, 100%), 100%) - var(--oip-main-w, 100%))/2);position:sticky;width:var(--oip-main-w,100%);z-index:91;--rm-fbar-field-h:32px;backdrop-filter:blur(12px);background:rgba(245,245,249,.8);border-bottom:1px solid var(--border-default);display:flex;flex-direction:column;font-family:var(--font-sans)}.rm-fbar__row{align-items:flex-start;display:flex;gap:12px;padding-block:8px;padding-inline:max(32px,(100% - var(--oip-content-max,100%))/2 + 32px)}.rm-fbar--open .rm-fbar__row{border-bottom:1px solid var(--border-default)}.rm-fbar__toggle :deep(p),.rm-fbar__toggle :deep(span){font-size:inherit;font-weight:inherit;line-height:inherit;margin:0}.rm-fbar__toggle{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-primary);cursor:pointer;display:flex;flex:0 0 auto;font-family:inherit;font-size:var(--font-14);font-weight:var(--weight-medium);gap:6px;height:var(--rm-fbar-field-h);justify-content:center;padding:0 14px}.rm-fbar__toggle:hover{background:var(--bg-surface-3)}.rm-fbar__toggle.is-active,.rm-fbar__toggle.is-active:hover{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.rm-fbar__toggle.is-active .rm-fbar__badge{background:var(--color-text-inverse);color:var(--color-primary)}.rm-fbar__badge{align-items:center;background:var(--color-primary);border-radius:16px;color:var(--color-text-inverse);display:inline-flex;font-size:var(--font-11);font-weight:var(--weight-bold);justify-content:center;min-width:18px;padding:0 5px}.rm-fbar__view{align-items:center;display:flex;flex:0 0 auto}.rm-fbar__advanced{align-items:center;background:none;border:none;border-left:1px solid var(--border-default);color:var(--color-primary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-13);font-weight:var(--weight-medium);height:var(--rm-fbar-field-h);padding:0 0 0 12px;position:absolute;right:14px;text-decoration-line:underline;top:0;white-space:nowrap;z-index:2}.rm-fbar__advanced.is-active,.rm-fbar__advanced:hover{color:var(--color-primary-hover,var(--color-primary));text-decoration-thickness:2px}.rm-fbar__rail{align-items:center;display:flex;flex:0 1 auto;min-width:0}.rm-fbar__rail:empty{display:none}.rm-fbar__search{align-items:center;display:flex;flex:1 1 auto;gap:8px;min-width:0;position:relative}.rm-fbar__search:empty{display:none}.rm-fbar__search :deep(.filters_input_search){border-radius:var(--radius-pill);box-sizing:border-box;height:auto;min-height:var(--rm-fbar-field-h);padding-right:calc(var(--rm-fbar-advanced-w, 0px) + 12px);width:100%}.rm-fbar__search :deep(.research_tags:not(:has(*))){display:none}.rm-fbar__search :deep(.select_shortcut){box-sizing:border-box;font-size:var(--font-11);height:24px;padding-block:0}.rm-fbar__search :deep(.select_shortcut:hover){background:var(--bg-surface-3)!important;border-color:var(--border-default)!important;color:inherit!important}.rm-fbar__search :deep(.select_shortcut:hover svg){color:inherit!important}.rm-fbar__search :deep(.remove_search_section){border-left:none;border-radius:0 var(--radius-pill) var(--radius-pill) 0}.rm-fbar__search :deep(.remove_search_section:hover){background:transparent!important}.rm-fbar__search :deep(.remove_search_section:hover svg){color:var(--text-primary)!important}.rm-fbar__search :deep(.filters_input_search.no_bottom){border-bottom:1.5px solid var(--color-primary)!important;border-radius:var(--radius-pill)}.rm-fbar__search :deep(.search_suggestions){border:1px solid var(--border-default);border-radius:var(--radius-2xl);box-shadow:var(--shadow-lg);left:0;padding:6px;right:0;top:calc(100% + 6px);width:auto}.rm-fbar__search :deep(.sugg_container>*){border-radius:var(--radius-lg)}.rm-fbar__search :deep(.sugg_container>.selected){background:color-mix(in srgb,var(--color-primary) 6%,transparent)!important}.rm-fbar__panel{--rm-filter-col:224px;--rm-fbar-panel-field-h:40px;align-items:end;display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(0,var(--rm-filter-col)));justify-content:center;padding-block:16px 20px;padding-inline:56px}.rm-fbar__panel--wide{align-items:stretch;display:flex;flex-direction:column;gap:12px}.rm-fbar__filters{display:contents}.rm-fbar__filters :deep(.filter-chip),.rm-fbar__filters :deep(.filter-complex__trigger),.rm-fbar__filters :deep(.rm-number__box){border-radius:var(--radius-lg);height:var(--rm-fbar-panel-field-h);width:100%}.rm-fbar__panel-head{align-items:baseline;display:flex;gap:16px;grid-column:1/-1;width:100%}.rm-fbar__customize{grid-column:1/-1}.rm-fbar__panel :deep(.filters_row_break){grid-column:1/-1}.rm-fbar__panel-title{font-size:var(--font-18);font-weight:800;margin:0}.rm-fbar__action{background:none;border:none;cursor:pointer;font-family:inherit;font-size:var(--font-14);font-weight:var(--weight-medium);padding:0;text-decoration-line:underline}.rm-fbar__action--save{color:var(--color-primary)}.rm-fbar__action--clear{color:var(--text-secondary)}
|
|
254
|
+
.rm-fbar{margin-inline:calc((min(var(--oip-content-max, 100%), 100%) - var(--oip-main-w, 100%))/2);position:sticky;width:var(--oip-main-w,100%);z-index:91;--rm-fbar-field-h:32px;backdrop-filter:blur(12px);background:rgba(245,245,249,.8);border-bottom:1px solid var(--border-default);display:flex;flex-direction:column;font-family:var(--font-sans)}.rm-fbar__views{align-items:center;display:flex;flex:0 0 auto}.rm-fbar__views:empty{display:none}.rm-fbar__row{align-items:flex-start;display:flex;gap:12px;padding-block:8px;padding-inline:max(32px,(100% - var(--oip-content-max,100%))/2 + 32px)}.rm-fbar--open .rm-fbar__row{border-bottom:1px solid var(--border-default)}.rm-fbar__toggle :deep(p),.rm-fbar__toggle :deep(span){font-size:inherit;font-weight:inherit;line-height:inherit;margin:0}.rm-fbar__toggle{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-primary);cursor:pointer;display:flex;flex:0 0 auto;font-family:inherit;font-size:var(--font-14);font-weight:var(--weight-medium);gap:6px;height:var(--rm-fbar-field-h);justify-content:center;padding:0 14px}.rm-fbar__toggle:hover{background:var(--bg-surface-3)}.rm-fbar__toggle.is-active,.rm-fbar__toggle.is-active:hover{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.rm-fbar__toggle.is-active .rm-fbar__badge{background:var(--color-text-inverse);color:var(--color-primary)}.rm-fbar__badge{align-items:center;background:var(--color-primary);border-radius:16px;color:var(--color-text-inverse);display:inline-flex;font-size:var(--font-11);font-weight:var(--weight-bold);justify-content:center;min-width:18px;padding:0 5px}.rm-fbar__view{align-items:center;display:flex;flex:0 0 auto}.rm-fbar__advanced{align-items:center;background:none;border:none;border-left:1px solid var(--border-default);color:var(--color-primary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-13);font-weight:var(--weight-medium);height:var(--rm-fbar-field-h);padding:0 0 0 12px;position:absolute;right:14px;text-decoration-line:underline;top:0;white-space:nowrap;z-index:2}.rm-fbar__advanced.is-active,.rm-fbar__advanced:hover{color:var(--color-primary-hover,var(--color-primary));text-decoration-thickness:2px}.rm-fbar__rail{align-items:center;display:flex;flex:0 1 auto;min-width:0}.rm-fbar__rail:empty{display:none}.rm-fbar__search{align-items:center;display:flex;flex:1 1 auto;gap:8px;min-width:0;position:relative}.rm-fbar__search:empty{display:none}.rm-fbar__search :deep(.filters_input_search){border-radius:var(--radius-pill);box-sizing:border-box;height:auto;min-height:var(--rm-fbar-field-h);padding-right:calc(var(--rm-fbar-advanced-w, 0px) + 12px);width:100%}.rm-fbar__search :deep(.research_tags:not(:has(*))){display:none}.rm-fbar__search :deep(.select_shortcut){box-sizing:border-box;font-size:var(--font-11);height:24px;padding-block:0}.rm-fbar__search :deep(.select_shortcut:hover){background:var(--bg-surface-3)!important;border-color:var(--border-default)!important;color:inherit!important}.rm-fbar__search :deep(.select_shortcut:hover svg){color:inherit!important}.rm-fbar__search :deep(.remove_search_section){border-left:none;border-radius:0 var(--radius-pill) var(--radius-pill) 0}.rm-fbar__search :deep(.remove_search_section:hover){background:transparent!important}.rm-fbar__search :deep(.remove_search_section:hover svg){color:var(--text-primary)!important}.rm-fbar__search :deep(.filters_input_search.no_bottom){border-bottom:1.5px solid var(--color-primary)!important;border-radius:var(--radius-pill)}.rm-fbar__search :deep(.search_suggestions){border:1px solid var(--border-default);border-radius:var(--radius-2xl);box-shadow:var(--shadow-lg);left:0;padding:6px;right:0;top:calc(100% + 6px);width:auto}.rm-fbar__search :deep(.sugg_container>*){border-radius:var(--radius-lg)}.rm-fbar__search :deep(.sugg_container>.selected){background:color-mix(in srgb,var(--color-primary) 6%,transparent)!important}.rm-fbar__panel{--rm-filter-col:224px;--rm-fbar-panel-field-h:40px;align-items:end;display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(0,var(--rm-filter-col)));justify-content:center;padding-block:16px 20px;padding-inline:56px}.rm-fbar__panel--wide{align-items:stretch;display:flex;flex-direction:column;gap:12px}.rm-fbar__filters{display:contents}.rm-fbar__filters :deep(.filter-chip),.rm-fbar__filters :deep(.filter-complex__trigger),.rm-fbar__filters :deep(.rm-number__box){border-radius:var(--radius-lg);height:var(--rm-fbar-panel-field-h);width:100%}.rm-fbar__panel-head{align-items:baseline;display:flex;gap:16px;grid-column:1/-1;width:100%}.rm-fbar__customize{grid-column:1/-1}.rm-fbar__panel :deep(.filters_row_break){grid-column:1/-1}.rm-fbar__panel-title{font-size:var(--font-18);font-weight:800;margin:0}.rm-fbar__action{background:none;border:none;cursor:pointer;font-family:inherit;font-size:var(--font-14);font-weight:var(--weight-medium);padding:0;text-decoration-line:underline}.rm-fbar__action--save{color:var(--color-primary)}.rm-fbar__action--clear{color:var(--text-secondary)}
|
|
248
255
|
</style>
|
|
@@ -251,5 +251,5 @@ onUnmounted(() => document.removeEventListener('click', onClickOutside))
|
|
|
251
251
|
</template>
|
|
252
252
|
|
|
253
253
|
<style scoped>
|
|
254
|
-
.filter-complex{position:relative}.filter-complex__trigger{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-complex__trigger:hover{border-color:var(--border-default)}.filter-complex__icon{color:var(--color-healthcare);flex-shrink:0}.filter-complex__trigger--active{border-color:var(--color-healthcare);box-shadow:0 0 8px 0 rgba(var(--healthcare-rgb),.1)}.filter-complex__label{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.filter-complex__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-complex__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-complex__caret--open{transform:rotate(180deg)}.filter-complex__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:8px;box-shadow:0 4px 24px rgba(var(--shadow-rgb),.1),0 2px 8px rgba(var(--shadow-rgb),.05);display:flex;left:0;max-height:
|
|
254
|
+
.filter-complex{position:relative}.filter-complex__trigger{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-complex__trigger:hover{border-color:var(--border-default)}.filter-complex__icon{color:var(--color-healthcare);flex-shrink:0}.filter-complex__trigger--active{border-color:var(--color-healthcare);box-shadow:0 0 8px 0 rgba(var(--healthcare-rgb),.1)}.filter-complex__label{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.filter-complex__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-complex__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-complex__caret--open{transform:rotate(180deg)}.filter-complex__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:8px;box-shadow:0 4px 24px rgba(var(--shadow-rgb),.1),0 2px 8px rgba(var(--shadow-rgb),.05);display:flex;left:0;max-height:440px;max-width:calc(100vw - 32px);overflow:hidden;position:absolute;top:calc(100% + 4px);width:680px;z-index:50}.filter-complex__left{flex:1 1 60%;flex-direction:column}.filter-complex__left,.filter-complex__right{display:flex;gap:8px;overflow:hidden;padding:20px}.filter-complex__right{background-color:var(--bg-surface-2);border-left:1px solid var(--border-default);flex:1 1 40%;flex-direction:column}.filter-complex__right-header{align-items:center;display:flex;justify-content:space-between}.filter-complex__title{color:var(--text-secondary);font-size:var(--font-14);font-weight:var(--weight-semibold);margin:0}.filter-complex__search{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:6px;display:flex;gap:8px;padding:6px 8px}.filter-complex__search:focus-within{border-color:var(--color-healthcare)}.filter-complex__search-input{background:transparent;border:none;color:var(--text-secondary);flex:1;font-family:var(--font-sans);font-size:var(--font-14);outline:none}.filter-complex__search-input::-moz-placeholder{color:var(--text-muted)}.filter-complex__search-input::placeholder{color:var(--text-muted)}.filter-complex__search-clear{color:var(--text-muted);cursor:pointer;flex-shrink:0}.filter-complex__search-clear:hover{color:var(--text-secondary)}.filter-complex__action{background:none;border:none;cursor:pointer;font-family:var(--font-sans);font-size:var(--font-14);padding:0;text-align:left;text-decoration:underline}.filter-complex__action--add{color:var(--color-healthcare)}.filter-complex__action--add:hover{color:var(--color-healthcare-active)}.filter-complex__action--clear,.filter-complex__action--clear:hover{color:var(--color-danger)}.filter-complex__list{display:flex;flex:1;flex-direction:column;overflow-y:auto}.filter-complex__list::-webkit-scrollbar{width:4px}.filter-complex__list::-webkit-scrollbar-thumb{background:var(--border-default);border-radius:100px}.filter-complex__list::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.filter-complex__item{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)}.filter-complex__item:hover{background-color:var(--bg-surface-2)}.filter-complex__right .filter-complex__item:hover{background-color:var(--bg-surface-3)}.filter-complex__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter-complex__item-icon{flex-shrink:0;opacity:0;transition:opacity var(--duration-fast) var(--ease-in-out)}.filter-complex__item:hover .filter-complex__item-icon{opacity:1}.filter-complex__item-icon--add{color:var(--color-healthcare)}.filter-complex__item-icon--remove{color:var(--color-danger)}.filter-complex__empty{color:var(--text-muted);font-size:var(--font-14);font-style:italic;padding: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)}
|
|
255
255
|
</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(--color-text-inverse);border:1px solid var(--border-default);border-radius:var(--radius-lg);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)}
|
|
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(--color-text-inverse);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>
|
|
@@ -27,9 +27,9 @@ const props = withDefaults(defineProps<{
|
|
|
27
27
|
axisLabels?: [string, string]
|
|
28
28
|
/**
|
|
29
29
|
* Etiquette chaque point de sa valeur, en pastille de la couleur de la
|
|
30
|
-
* serie. Laisse libre, elle se pose
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* serie. Laisse libre, elle se pose jusqu'a cinq courbes et se retire
|
|
31
|
+
* au-dela, ou les pastilles se chevauchent. `true` ou `false` tranche a la
|
|
32
|
+
* place de la regle.
|
|
33
33
|
*/
|
|
34
34
|
valueLabels?: boolean
|
|
35
35
|
/**
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Pastille de vue de la barre de filtres.
|
|
3
|
+
|
|
4
|
+
Elle nomme la vue affichee, en permanence : on sait sur quoi on lit sans
|
|
5
|
+
ouvrir quoi que ce soit. Le menu qu'elle ouvre tient les trois choses qu'on
|
|
6
|
+
fait d'une vue, dans cet ordre : rattraper des modifications non
|
|
7
|
+
enregistrees, basculer sur une vue favorite, ouvrir le reste (toutes les
|
|
8
|
+
vues, enregistrer, et ce que la page ajoute).
|
|
9
|
+
|
|
10
|
+
Un point orange parait des que l'ecran ne correspond plus a la vue active :
|
|
11
|
+
c'est le seul etat que la pastille porte elle-meme, parce que c'est le seul
|
|
12
|
+
qui se perd si on ne le voit pas.
|
|
13
|
+
|
|
14
|
+
La pastille ne connait ni l'API ni le magasin de vues : elle recoit une
|
|
15
|
+
liste et emet ce que l'utilisateur demande.
|
|
16
|
+
-->
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
|
|
19
|
+
|
|
20
|
+
export interface RmViewPillItem {
|
|
21
|
+
id: string
|
|
22
|
+
title: string
|
|
23
|
+
/** La vue affichee. Une seule a la fois. */
|
|
24
|
+
active?: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface RmViewPillAction {
|
|
28
|
+
key: string
|
|
29
|
+
label: string
|
|
30
|
+
/** Icone Phosphor, sans le prefixe `Ph`. */
|
|
31
|
+
icon?: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const props = withDefaults(
|
|
35
|
+
defineProps<{
|
|
36
|
+
/** Nom de la vue affichee. Vide : aucune vue posee. */
|
|
37
|
+
viewName?: string | null
|
|
38
|
+
/** Vues proposees dans le menu, les favorites de la page. */
|
|
39
|
+
views?: RmViewPillItem[]
|
|
40
|
+
/** Titre de la section des vues du menu. */
|
|
41
|
+
viewsLabel?: string
|
|
42
|
+
/** L'ecran ne correspond plus a la vue active. */
|
|
43
|
+
dirty?: boolean
|
|
44
|
+
/**
|
|
45
|
+
* Actions de bas de menu. La page y met ce qu'elle sait faire d'une vue :
|
|
46
|
+
* les ouvrir toutes, en enregistrer une nouvelle, modifier son perimetre.
|
|
47
|
+
*/
|
|
48
|
+
actions?: RmViewPillAction[]
|
|
49
|
+
lang?: 'fr' | 'en'
|
|
50
|
+
}>(),
|
|
51
|
+
{
|
|
52
|
+
viewName: null,
|
|
53
|
+
views: () => [],
|
|
54
|
+
viewsLabel: undefined,
|
|
55
|
+
dirty: false,
|
|
56
|
+
actions: () => [],
|
|
57
|
+
lang: 'fr',
|
|
58
|
+
},
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
const emit = defineEmits<{
|
|
62
|
+
/** Une vue du menu est demandee. */
|
|
63
|
+
select: [id: string]
|
|
64
|
+
/** Enregistrer l'ecran dans la vue active. */
|
|
65
|
+
save: []
|
|
66
|
+
/** Une action de bas de menu. */
|
|
67
|
+
action: [key: string]
|
|
68
|
+
}>()
|
|
69
|
+
|
|
70
|
+
const WORDS = {
|
|
71
|
+
fr: {
|
|
72
|
+
key: 'Vue :',
|
|
73
|
+
none: 'Aucune vue',
|
|
74
|
+
favorites: 'Favoris',
|
|
75
|
+
actions: 'Actions',
|
|
76
|
+
unsaved: 'Modifications non enregistrées',
|
|
77
|
+
save: 'Sauvegarder',
|
|
78
|
+
aria: 'Vue affichée',
|
|
79
|
+
},
|
|
80
|
+
en: {
|
|
81
|
+
key: 'View:',
|
|
82
|
+
none: 'No view',
|
|
83
|
+
favorites: 'Favorites',
|
|
84
|
+
actions: 'Actions',
|
|
85
|
+
unsaved: 'Unsaved changes',
|
|
86
|
+
save: 'Save',
|
|
87
|
+
aria: 'Current view',
|
|
88
|
+
},
|
|
89
|
+
} as const
|
|
90
|
+
|
|
91
|
+
const t = computed(() => WORDS[props.lang])
|
|
92
|
+
const label = computed(() => props.viewName || t.value.none)
|
|
93
|
+
|
|
94
|
+
const open = ref(false)
|
|
95
|
+
const root = ref<HTMLElement | null>(null)
|
|
96
|
+
|
|
97
|
+
function choose(id: string) {
|
|
98
|
+
open.value = false
|
|
99
|
+
emit('select', id)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function run(key: string) {
|
|
103
|
+
open.value = false
|
|
104
|
+
emit('action', key)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function save() {
|
|
108
|
+
open.value = false
|
|
109
|
+
emit('save')
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function onDocumentClick(event: MouseEvent) {
|
|
113
|
+
if (!open.value) return
|
|
114
|
+
if (root.value && !root.value.contains(event.target as Node)) open.value = false
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function onKeydown(event: KeyboardEvent) {
|
|
118
|
+
if (event.key === 'Escape') open.value = false
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
onMounted(() => {
|
|
122
|
+
document.addEventListener('click', onDocumentClick)
|
|
123
|
+
document.addEventListener('keydown', onKeydown)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
onBeforeUnmount(() => {
|
|
127
|
+
document.removeEventListener('click', onDocumentClick)
|
|
128
|
+
document.removeEventListener('keydown', onKeydown)
|
|
129
|
+
})
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<template>
|
|
133
|
+
<div ref="root" class="rm-vpill">
|
|
134
|
+
<button
|
|
135
|
+
type="button"
|
|
136
|
+
class="rm-vpill__pill"
|
|
137
|
+
:class="{ 'is-open': open, 'has-unsaved': dirty }"
|
|
138
|
+
:aria-label="t.aria"
|
|
139
|
+
:aria-expanded="open"
|
|
140
|
+
@click="open = !open"
|
|
141
|
+
>
|
|
142
|
+
<RmIcon name="BookmarkSimple" weight="fill" :size="16" class="rm-vpill__icon" />
|
|
143
|
+
<span class="rm-vpill__key">{{ t.key }}</span>
|
|
144
|
+
<span class="rm-vpill__value">{{ label }}</span>
|
|
145
|
+
<span v-if="dirty" class="rm-vpill__dot" :title="t.unsaved" aria-hidden="true" />
|
|
146
|
+
<RmIcon class="rm-vpill__caret" name="CaretDown" :size="14" />
|
|
147
|
+
</button>
|
|
148
|
+
|
|
149
|
+
<div v-if="open" class="rm-vpill__menu" role="menu">
|
|
150
|
+
<!-- Rattraper d'abord : une vue qu'on a modifiee sans le savoir est ce
|
|
151
|
+
qu'on perd en changeant de vue. -->
|
|
152
|
+
<template v-if="dirty">
|
|
153
|
+
<div class="rm-vpill__unsaved">
|
|
154
|
+
<span class="rm-vpill__unsaved-dot" aria-hidden="true" />
|
|
155
|
+
<span class="rm-vpill__unsaved-label">{{ t.unsaved }}</span>
|
|
156
|
+
<button type="button" class="rm-vpill__unsaved-cta" @click="save">{{ t.save }}</button>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="rm-vpill__divider" />
|
|
159
|
+
</template>
|
|
160
|
+
|
|
161
|
+
<template v-if="views.length > 0">
|
|
162
|
+
<p class="rm-vpill__section">{{ viewsLabel || t.favorites }}</p>
|
|
163
|
+
<button
|
|
164
|
+
v-for="view in views"
|
|
165
|
+
:key="view.id"
|
|
166
|
+
type="button"
|
|
167
|
+
role="menuitem"
|
|
168
|
+
class="rm-vpill__item rm-vpill__item--view"
|
|
169
|
+
:class="{ 'is-active': view.active }"
|
|
170
|
+
@click="choose(view.id)"
|
|
171
|
+
>
|
|
172
|
+
<RmIcon class="rm-vpill__check" name="Check" :size="14" />
|
|
173
|
+
<span class="rm-vpill__name">{{ view.title }}</span>
|
|
174
|
+
</button>
|
|
175
|
+
<div v-if="actions.length > 0" class="rm-vpill__divider" />
|
|
176
|
+
</template>
|
|
177
|
+
|
|
178
|
+
<template v-if="actions.length > 0">
|
|
179
|
+
<p class="rm-vpill__section">{{ t.actions }}</p>
|
|
180
|
+
<button
|
|
181
|
+
v-for="action in actions"
|
|
182
|
+
:key="action.key"
|
|
183
|
+
type="button"
|
|
184
|
+
role="menuitem"
|
|
185
|
+
class="rm-vpill__item"
|
|
186
|
+
@click="run(action.key)"
|
|
187
|
+
>
|
|
188
|
+
<RmIcon v-if="action.icon" :name="action.icon" :size="14" />
|
|
189
|
+
<span class="rm-vpill__name">{{ action.label }}</span>
|
|
190
|
+
</button>
|
|
191
|
+
</template>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</template>
|
|
195
|
+
|
|
196
|
+
<style scoped>
|
|
197
|
+
.rm-vpill{position:relative}.rm-vpill,.rm-vpill__pill{align-items:center;display:flex}.rm-vpill__pill{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-primary);cursor:pointer;font-family:var(--font-sans);font-size:var(--font-14);font-weight:var(--weight-medium);gap:6px;height:var(--rm-fbar-field-h,32px);padding:0 14px;white-space:nowrap}.rm-vpill__pill:hover{background:var(--bg-surface-3)}.rm-vpill__pill.is-open{border-color:var(--color-primary);color:var(--color-primary)}.rm-vpill__icon{color:var(--color-secondary);flex-shrink:0}.rm-vpill__key{color:var(--text-muted);font-weight:var(--weight-normal)}.rm-vpill__value{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-vpill__pill.has-unsaved{border-color:var(--color-warning)}.rm-vpill__dot{animation:rm-vpill-pulse 2s ease-out infinite;background:var(--color-warning);border-radius:50%;flex-shrink:0;height:8px;width:8px}@keyframes rm-vpill-pulse{0%{box-shadow:0 0 0 0 rgba(217,119,6,.6)}70%{box-shadow:0 0 0 6px rgba(217,119,6,0)}to{box-shadow:0 0 0 0 rgba(217,119,6,0)}}@media (prefers-reduced-motion:reduce){.rm-vpill__dot,.rm-vpill__unsaved-dot:before{animation:none}}.rm-vpill__caret{color:var(--text-muted);flex-shrink:0}.rm-vpill__menu{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:8px;box-shadow:var(--shadow-lg);box-sizing:border-box;font-family:var(--font-sans);left:0;max-width:460px;min-width:320px;padding:6px;position:absolute;top:calc(100% + 6px);z-index:60}.rm-vpill__unsaved{align-items:center;background:var(--color-warning-bg);border-radius:var(--radius-md);color:var(--color-warning);display:flex;font-size:var(--font-12);gap:8px;padding:8px 12px}.rm-vpill__unsaved-dot{align-items:center;display:inline-flex;flex-shrink:0;height:14px;justify-content:center;width:14px}.rm-vpill__unsaved-dot:before{animation:rm-vpill-pulse 2s ease-out infinite;background:var(--color-warning);border-radius:50%;content:"";height:7px;width:7px}.rm-vpill__unsaved-label{flex:1;font-weight:var(--weight-semibold)}.rm-vpill__unsaved-cta{background:transparent;border:none;color:var(--color-warning);cursor:pointer;font-family:inherit;font-size:inherit;font-weight:var(--weight-bold);padding:0;text-decoration:underline;text-underline-offset:2px}.rm-vpill__unsaved-cta:hover{color:var(--text-primary)}.rm-vpill__divider{background:var(--border-soft);height:1px;margin:6px -6px}.rm-vpill__section{color:var(--text-muted);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.08em;margin:0;padding:8px 12px 4px 34px;text-align:left;text-transform:uppercase}.rm-vpill__item{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-13);gap:8px;padding:8px 12px;text-align:left;transition:background .1s,color .1s;width:100%}.rm-vpill__item:hover{background:var(--bg-hover);color:var(--text-primary)}.rm-vpill__item.is-active{background:var(--bg-hover);color:var(--color-secondary);font-weight:var(--weight-semibold)}.rm-vpill__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-vpill__item--view .rm-vpill__check{color:var(--color-secondary);flex-shrink:0;opacity:0;transition:opacity .1s}.rm-vpill__item--view.is-active .rm-vpill__check{opacity:1}
|
|
198
|
+
</style>
|
|
@@ -320,8 +320,7 @@ export declare function rmLineOption(categories: (string | number)[], series: Rm
|
|
|
320
320
|
axisLabels?: [string, string];
|
|
321
321
|
/**
|
|
322
322
|
* Etiquette la valeur de chaque point, en pastille de la couleur de sa
|
|
323
|
-
* serie. Non precise : automatique
|
|
324
|
-
* LABEL_MAX_SERIES et LABEL_MAX_POINTS).
|
|
323
|
+
* serie. Non precise : automatique jusqu'a LABEL_MAX_SERIES courbes.
|
|
325
324
|
*/
|
|
326
325
|
valueLabels?: boolean;
|
|
327
326
|
/**
|
|
@@ -173,8 +173,7 @@ export function rmLineOption(categories, series, theme, palette, options = {}) {
|
|
|
173
173
|
valueFormatter
|
|
174
174
|
} = options;
|
|
175
175
|
const LABEL_MAX_SERIES = 5;
|
|
176
|
-
const
|
|
177
|
-
const labelled = valueLabels ?? (series.length <= LABEL_MAX_SERIES && categories.length <= LABEL_MAX_POINTS);
|
|
176
|
+
const labelled = valueLabels ?? series.length <= LABEL_MAX_SERIES;
|
|
178
177
|
const AREA_MAX_SERIES = 5;
|
|
179
178
|
const filled = area ?? series.length <= AREA_MAX_SERIES;
|
|
180
179
|
const dual = series.some((s) => s.axis === 1);
|