@tekkare/romulus 0.1.50 → 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 CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16.0"
6
6
  },
7
- "version": "0.1.49",
7
+ "version": "0.1.50",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -84,7 +84,15 @@ const props = withDefaults(
84
84
  },
85
85
  )
86
86
 
87
- const emit = defineEmits<{ export: [config: RmExportConfig] }>()
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 class="rm-export__tab rm-export__tab--active" type="button" role="tab">
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
- disabled
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="mode === 'entry'" class="rm-export__entry">
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);margin-top:var(--space-24);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-name{color:var(--text-primary);flex:1;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);flex-shrink:0;font-size:11px}
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>
@@ -155,14 +155,30 @@ export interface RmExportTemplate {
155
155
  color?: string;
156
156
  config: Partial<RmExportConfig>;
157
157
  }
158
- /** Ligne de l'historique « Exports recents ». */
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.50",
3
+ "version": "0.1.51",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",