@tekkare/romulus 0.1.49 → 0.1.51
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/ExportPanel.vue +95 -25
- 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/ViewPill.vue +198 -0
- package/dist/runtime/utils/export.d.ts +17 -1
- 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>
|
|
@@ -84,7 +84,15 @@ const props = withDefaults(
|
|
|
84
84
|
},
|
|
85
85
|
)
|
|
86
86
|
|
|
87
|
-
const emit = defineEmits<{
|
|
87
|
+
const emit = defineEmits<{
|
|
88
|
+
export: [config: RmExportConfig]
|
|
89
|
+
/** Relancer un export conserve, par son identifiant cote app. */
|
|
90
|
+
rerun: [id: string]
|
|
91
|
+
/** Ouvrir l'ecran d'origine d'un export tire d'ailleurs. */
|
|
92
|
+
open: [id: string]
|
|
93
|
+
/** Retirer un export de la liste. */
|
|
94
|
+
forget: [id: string]
|
|
95
|
+
}>()
|
|
88
96
|
|
|
89
97
|
const LABELS = {
|
|
90
98
|
fr: {
|
|
@@ -138,6 +146,10 @@ const LABELS = {
|
|
|
138
146
|
recentTitle: 'Exports récents',
|
|
139
147
|
recentEmpty: 'Aucun export lancé depuis ce navigateur.',
|
|
140
148
|
recentHint: 'Historique local à ce navigateur : les exports ne sont pas conservés sur nos serveurs.',
|
|
149
|
+
savedHint: 'Un export conservé garde ses filtres, pas son fichier : le rejouer repose ces filtres et régénère le document avec la donnée du jour.',
|
|
150
|
+
rerun: 'Rejouer',
|
|
151
|
+
openPage: 'Ouvrir l\'écran',
|
|
152
|
+
forget: 'Supprimer',
|
|
141
153
|
permalinkHint: 'Le lien reprend la vue courante, filtres compris. Rien à configurer.',
|
|
142
154
|
nothing: 'Aucun contenu disponible pour ce format sur cette page.',
|
|
143
155
|
},
|
|
@@ -192,6 +204,10 @@ const LABELS = {
|
|
|
192
204
|
recentTitle: 'Recent exports',
|
|
193
205
|
recentEmpty: 'No export run from this browser yet.',
|
|
194
206
|
recentHint: 'History is local to this browser: exports are not kept on our servers.',
|
|
207
|
+
savedHint: 'A kept export stores its filters, not its file: running it again re-applies those filters and rebuilds the document from today\'s data.',
|
|
208
|
+
rerun: 'Run again',
|
|
209
|
+
openPage: 'Open screen',
|
|
210
|
+
forget: 'Delete',
|
|
195
211
|
permalinkHint: 'The link points at the current view, filters included. Nothing to configure.',
|
|
196
212
|
nothing: 'No content available for this format on this page.',
|
|
197
213
|
},
|
|
@@ -238,6 +254,12 @@ watch(
|
|
|
238
254
|
)
|
|
239
255
|
|
|
240
256
|
const step = ref(1)
|
|
257
|
+
/**
|
|
258
|
+
* Onglet affiche. « Mes exports » n'est pas une etape du wizard : c'est la
|
|
259
|
+
* liste de ce qui a deja ete tire, et elle vit a cote plutot qu'en dessous
|
|
260
|
+
* pour ne pas allonger un panneau deja long de quatre etapes.
|
|
261
|
+
*/
|
|
262
|
+
const tab = ref<'export' | 'mine'>('export')
|
|
241
263
|
const mode = ref<'entry' | 'wizard'>(props.templates.length ? 'entry' : 'wizard')
|
|
242
264
|
const templateKey = ref<string | null>(null)
|
|
243
265
|
|
|
@@ -360,24 +382,89 @@ const recentDate = (at: string | Date) =>
|
|
|
360
382
|
<template>
|
|
361
383
|
<div class="rm-export">
|
|
362
384
|
<div class="rm-export__tabs" role="tablist">
|
|
363
|
-
<button
|
|
385
|
+
<button
|
|
386
|
+
class="rm-export__tab"
|
|
387
|
+
:class="{ 'rm-export__tab--active': tab === 'export' }"
|
|
388
|
+
type="button"
|
|
389
|
+
role="tab"
|
|
390
|
+
@click="tab = 'export'"
|
|
391
|
+
>
|
|
364
392
|
<RmIcon name="PlusCircle" :size="16" /> {{ t.tabExport }}
|
|
365
393
|
</button>
|
|
366
394
|
<button
|
|
367
395
|
class="rm-export__tab"
|
|
396
|
+
:class="{ 'rm-export__tab--active': tab === 'mine' }"
|
|
368
397
|
type="button"
|
|
369
398
|
role="tab"
|
|
370
|
-
|
|
371
|
-
:title="t.schedulingSoon"
|
|
399
|
+
@click="tab = 'mine'"
|
|
372
400
|
>
|
|
373
401
|
<RmIcon name="ClockClockwise" :size="16" /> {{ t.tabMine }}
|
|
402
|
+
<span v-if="recent.length" class="rm-export__tab-count">{{ recent.length }}</span>
|
|
374
403
|
</button>
|
|
375
404
|
</div>
|
|
376
405
|
|
|
377
|
-
<p class="rm-export__lead">{{ t.lead }}</p>
|
|
406
|
+
<p v-if="tab === 'export'" class="rm-export__lead">{{ t.lead }}</p>
|
|
378
407
|
|
|
379
408
|
<!-- Entree : modeles pre-remplis, ou le wizard a la main -->
|
|
380
|
-
<div v-if="
|
|
409
|
+
<div v-if="tab === 'mine'" class="rm-export__history">
|
|
410
|
+
<p class="rm-export__eyebrow">
|
|
411
|
+
<RmIcon name="DownloadSimple" :size="14" /> {{ t.recentTitle }}
|
|
412
|
+
</p>
|
|
413
|
+
<p v-if="!recent.length" class="rm-export__hint">{{ t.recentEmpty }}</p>
|
|
414
|
+
<div
|
|
415
|
+
v-for="(item, index) in recent"
|
|
416
|
+
:key="item.id ?? `${item.name}-${index}`"
|
|
417
|
+
class="rm-export__history-row"
|
|
418
|
+
>
|
|
419
|
+
<RmIcon name="File" :size="16" />
|
|
420
|
+
<span class="rm-export__history-body">
|
|
421
|
+
<span class="rm-export__history-name">{{ item.name }}</span>
|
|
422
|
+
<span class="rm-export__history-meta">
|
|
423
|
+
<template v-if="item.pageLabel">{{ item.pageLabel }} · </template>
|
|
424
|
+
<template v-if="item.rows">{{ item.rows.toLocaleString(lang === 'en' ? 'en-US' : 'fr-FR') }} {{ t.rows }} · </template>
|
|
425
|
+
<template v-if="item.size">{{ item.size }} · </template>
|
|
426
|
+
{{ recentDate(item.at) }}
|
|
427
|
+
</span>
|
|
428
|
+
</span>
|
|
429
|
+
<!-- Un export conserve se rejoue ; venu d'un autre ecran, il s'y ouvre,
|
|
430
|
+
parce que ses filtres ne veulent rien dire sur celui-ci. -->
|
|
431
|
+
<template v-if="item.id">
|
|
432
|
+
<RmButton
|
|
433
|
+
v-if="item.runnable !== false"
|
|
434
|
+
variant="secondary"
|
|
435
|
+
size="sm"
|
|
436
|
+
prefix-icon="ArrowClockwise"
|
|
437
|
+
:disabled="busy"
|
|
438
|
+
:title="t.rerun"
|
|
439
|
+
@click="emit('rerun', item.id)"
|
|
440
|
+
>
|
|
441
|
+
{{ t.rerun }}
|
|
442
|
+
</RmButton>
|
|
443
|
+
<RmButton
|
|
444
|
+
v-else
|
|
445
|
+
variant="secondary"
|
|
446
|
+
size="sm"
|
|
447
|
+
prefix-icon="ArrowSquareOut"
|
|
448
|
+
:title="t.openPage"
|
|
449
|
+
@click="emit('open', item.id)"
|
|
450
|
+
>
|
|
451
|
+
{{ t.openPage }}
|
|
452
|
+
</RmButton>
|
|
453
|
+
<RmButton
|
|
454
|
+
variant="ghost"
|
|
455
|
+
size="sm"
|
|
456
|
+
prefix-icon="Trash"
|
|
457
|
+
:title="t.forget"
|
|
458
|
+
@click="emit('forget', item.id)"
|
|
459
|
+
/>
|
|
460
|
+
</template>
|
|
461
|
+
</div>
|
|
462
|
+
<p v-if="recent.length" class="rm-export__hint">
|
|
463
|
+
{{ recent.some(item => item.id) ? t.savedHint : t.recentHint }}
|
|
464
|
+
</p>
|
|
465
|
+
</div>
|
|
466
|
+
|
|
467
|
+
<div v-else-if="mode === 'entry'" class="rm-export__entry">
|
|
381
468
|
<p class="rm-export__eyebrow">{{ t.entryTitle }}</p>
|
|
382
469
|
<div class="rm-export__templates">
|
|
383
470
|
<button
|
|
@@ -409,7 +496,7 @@ const recentDate = (at: string | Date) =>
|
|
|
409
496
|
</div>
|
|
410
497
|
|
|
411
498
|
<!-- Wizard -->
|
|
412
|
-
<div v-else class="rm-export__wizard">
|
|
499
|
+
<div v-else-if="tab === 'export'" class="rm-export__wizard">
|
|
413
500
|
<div v-if="templates.length" class="rm-export__wizard-head">
|
|
414
501
|
<button class="rm-export__back" type="button" @click="mode = 'entry'">
|
|
415
502
|
<RmIcon name="ArrowLeft" :size="14" /> {{ t.backToEntry }}
|
|
@@ -722,26 +809,9 @@ const recentDate = (at: string | Date) =>
|
|
|
722
809
|
</div>
|
|
723
810
|
</div>
|
|
724
811
|
|
|
725
|
-
<!-- Exports recents -->
|
|
726
|
-
<div class="rm-export__history">
|
|
727
|
-
<p class="rm-export__eyebrow">
|
|
728
|
-
<RmIcon name="DownloadSimple" :size="14" /> {{ t.recentTitle }}
|
|
729
|
-
</p>
|
|
730
|
-
<p v-if="!recent.length" class="rm-export__hint">{{ t.recentEmpty }}</p>
|
|
731
|
-
<div v-for="(item, index) in recent" :key="`${item.name}-${index}`" class="rm-export__history-row">
|
|
732
|
-
<RmIcon name="File" :size="16" />
|
|
733
|
-
<span class="rm-export__history-name">{{ item.name }}</span>
|
|
734
|
-
<span class="rm-export__history-meta">
|
|
735
|
-
<template v-if="item.rows">{{ item.rows.toLocaleString(lang === 'en' ? 'en-US' : 'fr-FR') }} {{ t.rows }} · </template>
|
|
736
|
-
<template v-if="item.size">{{ item.size }} · </template>
|
|
737
|
-
{{ recentDate(item.at) }}
|
|
738
|
-
</span>
|
|
739
|
-
</div>
|
|
740
|
-
<p v-if="recent.length" class="rm-export__hint">{{ t.recentHint }}</p>
|
|
741
|
-
</div>
|
|
742
812
|
</div>
|
|
743
813
|
</template>
|
|
744
814
|
|
|
745
815
|
<style scoped>
|
|
746
|
-
.rm-export{display:flex;flex-direction:column}.rm-export__tabs{border-bottom:1px solid var(--border-default);display:flex;margin-bottom:var(--space-16)}.rm-export__tab{align-items:center;background:none;border:none;border-bottom:3px solid transparent;color:var(--text-muted);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-14);font-weight:600;gap:var(--space-6);padding:var(--space-12) var(--space-16)}.rm-export__tab--active{border-bottom-color:var(--color-primary);color:var(--color-secondary)}.rm-export__tab:disabled{cursor:not-allowed;opacity:.5}.rm-export__desc,.rm-export__lead{color:var(--text-secondary);font-size:12.5px;line-height:1.55;margin:0 0 var(--space-16)}.rm-export__eyebrow{align-items:center;color:var(--text-muted);display:flex;font-size:10.5px;font-weight:700;gap:var(--space-6);letter-spacing:.1em;margin:0 0 var(--space-8);text-transform:uppercase}.rm-export__hint{color:var(--text-muted);display:block;font-size:11.5px;line-height:1.45;margin:var(--space-8) 0 0}.rm-export__notice{color:var(--color-success)}.rm-export__error,.rm-export__notice{font-size:12px;margin:var(--space-8) 0 0}.rm-export__error{color:var(--color-danger)}.rm-export__templates{display:grid;gap:var(--space-8)}.rm-export__template{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);cursor:pointer;display:flex;font-family:inherit;gap:var(--space-12);padding:var(--space-12) var(--space-16);text-align:left;transition:border-color var(--duration-fast),background var(--duration-fast),transform var(--duration-fast)}.rm-export__template:hover{background:var(--bg-hover);border-color:var(--color-secondary);transform:translateY(-1px)}.rm-export__template--custom{background:transparent;border-style:dashed}.rm-export__template-body{display:flex;flex-direction:column;min-width:0}.rm-export__template-name{color:var(--text-primary);font-size:13.5px;font-weight:700;line-height:1.2}.rm-export__template-meta{color:var(--text-muted);font-size:11px;line-height:1.35;margin-top:3px}.rm-export__wizard{background:var(--bg-surface-2);border:1px solid var(--border-default);border-radius:var(--radius-2xl);padding:var(--space-16) var(--space-20)}.rm-export__wizard-head{align-items:center;border-bottom:1px solid var(--border-soft);display:flex;gap:var(--space-12);margin-bottom:var(--space-16);padding-bottom:var(--space-12)}.rm-export__back{align-items:center;background:none;border:none;color:var(--color-secondary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:12px;font-weight:600;gap:var(--space-4);padding:0}.rm-export__back:hover{text-decoration:underline;text-underline-offset:3px}.rm-export__stepper{align-items:center;display:flex;gap:var(--space-4);margin-bottom:var(--space-20)}.rm-export__step{background:none;border:none;border-radius:var(--radius-pill);cursor:pointer;font-family:inherit;gap:var(--space-6);padding:var(--space-4) var(--space-8)}.rm-export__step,.rm-export__step-num{align-items:center;display:inline-flex}.rm-export__step-num{background:var(--bg-surface-3);border:1.5px solid var(--border-default);border-radius:50%;color:var(--text-muted);font-size:12px;font-weight:700;height:22px;justify-content:center;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast);width:22px}.rm-export__step-label{color:var(--text-muted);font-size:12px;font-weight:600}.rm-export__step:hover .rm-export__step-label{color:var(--text-primary)}.rm-export__step--active .rm-export__step-num{background:var(--color-primary);border-color:var(--color-primary);box-shadow:var(--shadow-focus);color:#fff}.rm-export__step--active .rm-export__step-label{color:var(--color-secondary)}.rm-export__step--done .rm-export__step-num{background:var(--color-secondary);border-color:var(--color-secondary);color:#fff}.rm-export__step--done .rm-export__step-label{color:var(--text-secondary)}.rm-export__step-divider{background:var(--border-default);border-radius:var(--radius-pill);flex:1;height:1.5px}.rm-export__panel{animation:rm-export-in var(--duration-base) var(--ease-out)}@keyframes rm-export-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.rm-export__formats{display:grid;gap:var(--space-8)}.rm-export__format{align-items:flex-start;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-xl);cursor:pointer;display:flex;gap:var(--space-12);padding:var(--space-12) var(--space-16);transition:border-color var(--duration-fast),background var(--duration-fast),transform var(--duration-fast)}.rm-export__format:hover{border-color:var(--color-secondary);transform:translateY(-1px)}.rm-export__format--active{background:var(--bg-hover);border-color:var(--color-primary);box-shadow:var(--shadow-focus)}.rm-export__format--active .rm-export__format-name{color:var(--color-primary)}.rm-export__format--off{cursor:not-allowed;opacity:.55}.rm-export__format--off:hover{border-color:var(--border-default);transform:none}.rm-export__format input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:50%;cursor:inherit;flex-shrink:0;height:18px;margin:1px 0 0;position:relative;width:18px}.rm-export__format input[type=radio]:checked{border-color:var(--color-primary)}.rm-export__format input[type=radio]:checked:after{background:var(--color-primary);border-radius:50%;content:"";inset:3px;position:absolute}.rm-export__format-text{display:flex;flex-direction:column;min-width:0}.rm-export__format-name{color:var(--text-primary);font-size:14px;font-weight:700;line-height:1.2}.rm-export__format-desc{color:var(--text-muted);font-size:11.5px;line-height:1.45;margin-top:3px}.rm-export__format-meta{border-top:1px solid var(--border-soft);color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;margin-top:var(--space-8);padding-top:var(--space-8);text-transform:uppercase}.rm-export__row{margin-bottom:var(--space-20)}.rm-export__row:last-child{margin-bottom:0}.rm-export__label{color:var(--text-secondary);display:block;font-size:11px;font-weight:700;letter-spacing:.06em;margin-bottom:var(--space-8);text-transform:uppercase}.rm-export__sub{margin-top:var(--space-12)}.rm-export__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-primary);font-family:inherit;font-size:13px;padding:var(--space-8) var(--space-12);width:100%}.rm-export__input:focus{border-color:var(--color-primary);box-shadow:var(--shadow-focus);outline:none}.rm-export__checks{display:grid;gap:var(--space-6)}.rm-export__check{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;font-size:12.5px;gap:var(--space-8)}.rm-export__check--off{cursor:not-allowed;opacity:.5}.rm-export__check input[type=checkbox]{accent-color:var(--color-primary);cursor:inherit;height:15px;width:15px}.rm-export__chips{display:flex;flex-wrap:wrap;gap:var(--space-6)}.rm-export__chip{align-items:center;border:1px solid var(--border-default);border-radius:var(--radius-pill);cursor:pointer;display:inline-flex;font-family:inherit;font-size:11.5px;font-weight:600;gap:var(--space-4);padding:3px var(--space-8)}.rm-export__chip--on{background:var(--bg-hover);border-color:var(--color-primary);color:var(--color-primary)}.rm-export__chip--off{background:var(--bg-surface);color:var(--text-muted)}.rm-export__chip--off:hover{border-color:var(--color-secondary);color:var(--color-secondary)}.rm-export__recap{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);margin-top:var(--space-16);padding:var(--space-16)}.rm-export__recap-row{align-items:flex-start;border-bottom:1px solid var(--border-soft);color:var(--color-secondary);display:flex;gap:var(--space-12);padding:var(--space-8) 0}.rm-export__recap-row:last-child{border-bottom:none}.rm-export__recap-row>div{flex:1;min-width:0}.rm-export__recap-k{color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.08em;margin-bottom:2px;text-transform:uppercase}.rm-export__recap-v{color:var(--text-primary);font-size:13px;font-weight:600;word-break:break-word}.rm-export__footer{align-items:center;border-top:1px solid var(--border-default);display:flex;gap:var(--space-8);margin-top:var(--space-20);padding-top:var(--space-16)}.rm-export__progress{color:var(--text-muted);flex:1;font-size:12px;text-align:center}.rm-export__progress b{color:var(--text-primary)}.rm-export__history{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);
|
|
816
|
+
.rm-export{display:flex;flex-direction:column}.rm-export__tabs{border-bottom:1px solid var(--border-default);display:flex;margin-bottom:var(--space-16)}.rm-export__tab{align-items:center;background:none;border:none;border-bottom:3px solid transparent;color:var(--text-muted);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-14);font-weight:600;gap:var(--space-6);padding:var(--space-12) var(--space-16)}.rm-export__tab--active{border-bottom-color:var(--color-primary);color:var(--color-secondary)}.rm-export__tab:disabled{cursor:not-allowed;opacity:.5}.rm-export__desc,.rm-export__lead{color:var(--text-secondary);font-size:12.5px;line-height:1.55;margin:0 0 var(--space-16)}.rm-export__eyebrow{align-items:center;color:var(--text-muted);display:flex;font-size:10.5px;font-weight:700;gap:var(--space-6);letter-spacing:.1em;margin:0 0 var(--space-8);text-transform:uppercase}.rm-export__hint{color:var(--text-muted);display:block;font-size:11.5px;line-height:1.45;margin:var(--space-8) 0 0}.rm-export__notice{color:var(--color-success)}.rm-export__error,.rm-export__notice{font-size:12px;margin:var(--space-8) 0 0}.rm-export__error{color:var(--color-danger)}.rm-export__templates{display:grid;gap:var(--space-8)}.rm-export__template{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);cursor:pointer;display:flex;font-family:inherit;gap:var(--space-12);padding:var(--space-12) var(--space-16);text-align:left;transition:border-color var(--duration-fast),background var(--duration-fast),transform var(--duration-fast)}.rm-export__template:hover{background:var(--bg-hover);border-color:var(--color-secondary);transform:translateY(-1px)}.rm-export__template--custom{background:transparent;border-style:dashed}.rm-export__template-body{display:flex;flex-direction:column;min-width:0}.rm-export__template-name{color:var(--text-primary);font-size:13.5px;font-weight:700;line-height:1.2}.rm-export__template-meta{color:var(--text-muted);font-size:11px;line-height:1.35;margin-top:3px}.rm-export__wizard{background:var(--bg-surface-2);border:1px solid var(--border-default);border-radius:var(--radius-2xl);padding:var(--space-16) var(--space-20)}.rm-export__wizard-head{align-items:center;border-bottom:1px solid var(--border-soft);display:flex;gap:var(--space-12);margin-bottom:var(--space-16);padding-bottom:var(--space-12)}.rm-export__back{align-items:center;background:none;border:none;color:var(--color-secondary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:12px;font-weight:600;gap:var(--space-4);padding:0}.rm-export__back:hover{text-decoration:underline;text-underline-offset:3px}.rm-export__stepper{align-items:center;display:flex;gap:var(--space-4);margin-bottom:var(--space-20)}.rm-export__step{background:none;border:none;border-radius:var(--radius-pill);cursor:pointer;font-family:inherit;gap:var(--space-6);padding:var(--space-4) var(--space-8)}.rm-export__step,.rm-export__step-num{align-items:center;display:inline-flex}.rm-export__step-num{background:var(--bg-surface-3);border:1.5px solid var(--border-default);border-radius:50%;color:var(--text-muted);font-size:12px;font-weight:700;height:22px;justify-content:center;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast);width:22px}.rm-export__step-label{color:var(--text-muted);font-size:12px;font-weight:600}.rm-export__step:hover .rm-export__step-label{color:var(--text-primary)}.rm-export__step--active .rm-export__step-num{background:var(--color-primary);border-color:var(--color-primary);box-shadow:var(--shadow-focus);color:#fff}.rm-export__step--active .rm-export__step-label{color:var(--color-secondary)}.rm-export__step--done .rm-export__step-num{background:var(--color-secondary);border-color:var(--color-secondary);color:#fff}.rm-export__step--done .rm-export__step-label{color:var(--text-secondary)}.rm-export__step-divider{background:var(--border-default);border-radius:var(--radius-pill);flex:1;height:1.5px}.rm-export__panel{animation:rm-export-in var(--duration-base) var(--ease-out)}@keyframes rm-export-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.rm-export__formats{display:grid;gap:var(--space-8)}.rm-export__format{align-items:flex-start;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-xl);cursor:pointer;display:flex;gap:var(--space-12);padding:var(--space-12) var(--space-16);transition:border-color var(--duration-fast),background var(--duration-fast),transform var(--duration-fast)}.rm-export__format:hover{border-color:var(--color-secondary);transform:translateY(-1px)}.rm-export__format--active{background:var(--bg-hover);border-color:var(--color-primary);box-shadow:var(--shadow-focus)}.rm-export__format--active .rm-export__format-name{color:var(--color-primary)}.rm-export__format--off{cursor:not-allowed;opacity:.55}.rm-export__format--off:hover{border-color:var(--border-default);transform:none}.rm-export__format input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:50%;cursor:inherit;flex-shrink:0;height:18px;margin:1px 0 0;position:relative;width:18px}.rm-export__format input[type=radio]:checked{border-color:var(--color-primary)}.rm-export__format input[type=radio]:checked:after{background:var(--color-primary);border-radius:50%;content:"";inset:3px;position:absolute}.rm-export__format-text{display:flex;flex-direction:column;min-width:0}.rm-export__format-name{color:var(--text-primary);font-size:14px;font-weight:700;line-height:1.2}.rm-export__format-desc{color:var(--text-muted);font-size:11.5px;line-height:1.45;margin-top:3px}.rm-export__format-meta{border-top:1px solid var(--border-soft);color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;margin-top:var(--space-8);padding-top:var(--space-8);text-transform:uppercase}.rm-export__row{margin-bottom:var(--space-20)}.rm-export__row:last-child{margin-bottom:0}.rm-export__label{color:var(--text-secondary);display:block;font-size:11px;font-weight:700;letter-spacing:.06em;margin-bottom:var(--space-8);text-transform:uppercase}.rm-export__sub{margin-top:var(--space-12)}.rm-export__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-primary);font-family:inherit;font-size:13px;padding:var(--space-8) var(--space-12);width:100%}.rm-export__input:focus{border-color:var(--color-primary);box-shadow:var(--shadow-focus);outline:none}.rm-export__checks{display:grid;gap:var(--space-6)}.rm-export__check{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;font-size:12.5px;gap:var(--space-8)}.rm-export__check--off{cursor:not-allowed;opacity:.5}.rm-export__check input[type=checkbox]{accent-color:var(--color-primary);cursor:inherit;height:15px;width:15px}.rm-export__chips{display:flex;flex-wrap:wrap;gap:var(--space-6)}.rm-export__chip{align-items:center;border:1px solid var(--border-default);border-radius:var(--radius-pill);cursor:pointer;display:inline-flex;font-family:inherit;font-size:11.5px;font-weight:600;gap:var(--space-4);padding:3px var(--space-8)}.rm-export__chip--on{background:var(--bg-hover);border-color:var(--color-primary);color:var(--color-primary)}.rm-export__chip--off{background:var(--bg-surface);color:var(--text-muted)}.rm-export__chip--off:hover{border-color:var(--color-secondary);color:var(--color-secondary)}.rm-export__recap{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);margin-top:var(--space-16);padding:var(--space-16)}.rm-export__recap-row{align-items:flex-start;border-bottom:1px solid var(--border-soft);color:var(--color-secondary);display:flex;gap:var(--space-12);padding:var(--space-8) 0}.rm-export__recap-row:last-child{border-bottom:none}.rm-export__recap-row>div{flex:1;min-width:0}.rm-export__recap-k{color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.08em;margin-bottom:2px;text-transform:uppercase}.rm-export__recap-v{color:var(--text-primary);font-size:13px;font-weight:600;word-break:break-word}.rm-export__footer{align-items:center;border-top:1px solid var(--border-default);display:flex;gap:var(--space-8);margin-top:var(--space-20);padding-top:var(--space-16)}.rm-export__progress{color:var(--text-muted);flex:1;font-size:12px;text-align:center}.rm-export__progress b{color:var(--text-primary)}.rm-export__history{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);padding:var(--space-16)}.rm-export__history-row{align-items:center;color:var(--color-primary);display:flex;gap:var(--space-8);padding:var(--space-6) 0}.rm-export__history-body{display:flex;flex:1;flex-direction:column;min-width:0}.rm-export__history-name{color:var(--text-primary);font-size:12.5px;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-export__history-meta{color:var(--text-muted);font-size:11px}.rm-export__tab-count{background:var(--bg-surface-3);border-radius:var(--radius-pill);color:var(--text-secondary);font-size:10.5px;padding:1px var(--space-6)}
|
|
747
817
|
</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>
|
|
@@ -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>
|
|
@@ -155,14 +155,30 @@ export interface RmExportTemplate {
|
|
|
155
155
|
color?: string;
|
|
156
156
|
config: Partial<RmExportConfig>;
|
|
157
157
|
}
|
|
158
|
-
/**
|
|
158
|
+
/**
|
|
159
|
+
* Ligne de l'onglet « Mes exports ».
|
|
160
|
+
*
|
|
161
|
+
* Une entree sans `id` est un simple historique : elle se lit, rien de plus.
|
|
162
|
+
* Une entree avec `id` est conservee par l'app, donc rejouable — le panneau
|
|
163
|
+
* emet alors `rerun` / `forget`, et c'est l'app qui sait quoi en faire.
|
|
164
|
+
*/
|
|
159
165
|
export interface RmExportRecent {
|
|
166
|
+
/** Identifiant cote app. Absent : l'entree n'est qu'un historique. */
|
|
167
|
+
id?: string;
|
|
160
168
|
name: string;
|
|
161
169
|
format: string;
|
|
162
170
|
rows?: number;
|
|
163
171
|
size?: string;
|
|
164
172
|
/** Date de l'export, ISO ou Date. */
|
|
165
173
|
at: string | Date;
|
|
174
|
+
/**
|
|
175
|
+
* Ecran d'origine, nomme pour les entrees venues d'ailleurs. Le panneau ne
|
|
176
|
+
* connait qu'une page a la fois : un export tire d'un autre ecran ne peut
|
|
177
|
+
* pas se rejouer ici, il s'y ouvre.
|
|
178
|
+
*/
|
|
179
|
+
pageLabel?: string;
|
|
180
|
+
/** Faux : l'entree vient d'un autre ecran, elle s'ouvre au lieu de partir. */
|
|
181
|
+
runnable?: boolean;
|
|
166
182
|
}
|
|
167
183
|
/**
|
|
168
184
|
* Ce que les generateurs consomment. La page fournit le contenu, le wizard
|