@tekkare/romulus 0.1.109 → 0.1.111

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.108",
7
+ "version": "0.1.110",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -41,9 +41,10 @@ const props = withDefaults(defineProps<{
41
41
  * d'une carte se presente comme l'export global de la page.
42
42
  *
43
43
  * Une fonction est preferable des qu'une liste monte la meme carte vingt
44
- * fois : elle n'est appelee qu'a l'export.
44
+ * fois : elle n'est appelee qu'a l'export. Elle peut etre asynchrone, le
45
+ * menu affichant « Preparation... » le temps de la requete.
45
46
  */
46
- payload?: Partial<RmExportPayload> | (() => Partial<RmExportPayload> | null | undefined)
47
+ payload?: Partial<RmExportPayload> | (() => Partial<RmExportPayload> | null | undefined | Promise<Partial<RmExportPayload> | null | undefined>)
47
48
  /**
48
49
  * Force les items visuels. Non renseigne : ils suivent la presence d'un
49
50
  * graphe dans la carte, ce qui est le bon defaut dans les deux sens.
@@ -38,8 +38,8 @@
38
38
  tombent pas les unes sous les autres et la colonne ne se compare plus.
39
39
 
40
40
  Les variantes de la reference sont des drapeaux : `compact`, `sticky-header`,
41
- `selectable`, `expandable`, plus `groupBy` pour les sections et `heat` par
42
- colonne pour la carte de chaleur.
41
+ `selectable`, `expandable`, `flat`, plus `groupBy` pour les sections et `heat`
42
+ par colonne pour la carte de chaleur.
43
43
  -->
44
44
  <script setup lang="ts">
45
45
  import { computed, ref } from 'vue'
@@ -82,6 +82,13 @@ export interface RmTableProps {
82
82
  /** Rythme dense : 12px de texte, 6/12 de gouttiere. Pour les longues tables. */
83
83
  compact?: boolean
84
84
  stickyHeader?: boolean
85
+ /**
86
+ * Sans cadre : ni fond, ni bordure, ni rayon. A poser des que la table vit
87
+ * deja dans une carte, sinon les deux bordures se doublent et les coins
88
+ * arrondis dessinent une seconde carte a l'interieur de la premiere.
89
+ * `RmTableCard` le fait de lui-meme ; une carte maison doit le demander.
90
+ */
91
+ flat?: boolean
85
92
  maxHeight?: string
86
93
  loading?: boolean
87
94
  emptyText?: string
@@ -112,6 +119,7 @@ const props = withDefaults(defineProps<RmTableProps>(), {
112
119
  hoverable: true,
113
120
  compact: false,
114
121
  stickyHeader: true,
122
+ flat: false,
115
123
  maxHeight: '500px',
116
124
  loading: false,
117
125
  emptyText: 'Aucune donnée',
@@ -285,7 +293,7 @@ function heatClass(col: RmTableColumn, row: Record<string, any>) {
285
293
  </script>
286
294
 
287
295
  <template>
288
- <div class="rm-table-wrapper">
296
+ <div class="rm-table-wrapper" :class="{ 'rm-table-wrapper--flat': flat }">
289
297
  <!-- La barre d'actions groupees ne sort qu'a partir d'une ligne retenue :
290
298
  posee en permanence, elle occuperait une bande vide en haut de table. -->
291
299
  <div v-if="selectable && selected.length > 0" class="rm-table__bulk">
@@ -479,5 +487,5 @@ function heatClass(col: RmTableColumn, row: Record<string, any>) {
479
487
  </template>
480
488
 
481
489
  <style scoped>
482
- .rm-table-wrapper{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);flex:1;overflow:hidden}.rm-table__scroll{overflow:auto}.rm-table{border-collapse:collapse;font-size:var(--font-13,13px);width:100%}.rm-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.rm-table caption{caption-side:top;color:var(--text-primary);font-size:var(--font-13,13px);font-weight:700;padding:0 0 var(--space-8,var(--space-8));text-align:left}.rm-table__th{background:var(--bg-surface-2);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-12) 14px;text-align:left;text-transform:uppercase;white-space:nowrap}.rm-table--sticky .rm-table__th{border-bottom:none;box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:2}.rm-table__th--center{text-align:center}.rm-table__th--num,.rm-table__th--right{text-align:right}.rm-table__th--check,.rm-table__th--expand{padding-right:0;width:36px}.rm-table__sort{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;gap:var(--space-6,var(--space-6));letter-spacing:inherit;padding:0;text-transform:inherit}.rm-table__sort:hover{color:var(--text-primary)}.rm-table__sort:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-muted);content:"";display:inline-block;height:0;opacity:.5;vertical-align:middle;width:0}.rm-table__th[aria-sort=ascending] .rm-table__sort:after{border-bottom:5px solid var(--color-primary);border-top:none;opacity:1}.rm-table__th[aria-sort=descending] .rm-table__sort:after{border-top:5px solid var(--color-primary);opacity:1}.rm-table a:focus-visible,.rm-table button:focus-visible{border-radius:var(--radius-sm,4px);outline:2px solid var(--color-primary);outline-offset:2px}.rm-table__td{border-bottom:1px solid var(--border-soft);color:var(--text-primary);padding:var(--space-12) 14px;text-align:left;vertical-align:top}th.rm-table__td{background:transparent;font-weight:700;letter-spacing:0;text-transform:none}.rm-table__td--center{text-align:center}.rm-table__td--right{text-align:right}.rm-table__td--num{font-variant-numeric:tabular-nums;text-align:right}.rm-table__td--check,.rm-table__td--expand{color:var(--text-muted);padding-right:0;width:36px}.rm-table__row--striped>.rm-table__td{background:var(--bg-surface-2)}.rm-table--hoverable .rm-table__row:hover>.rm-table__td,.rm-table__row--selected>.rm-table__td{background:var(--bg-hover)}.rm-table__row--expandable{cursor:pointer}.rm-table__caret{display:inline-flex;transition:transform .16s var(--ease-out,ease)}.rm-table__caret.is-open{color:var(--color-primary);transform:rotate(90deg)}.rm-table__group>th{background:var(--bg-hover);color:var(--color-primary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-8,var(--space-8)) var(--space-12,var(--space-12));text-align:left;text-transform:uppercase}.rm-table__detail>td{background:var(--bg-surface-2);border-bottom:1px solid var(--border-soft);padding:0}.rm-table__detail-body{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:1.6;padding:var(--space-12,var(--space-12)) var(--space-20,var(--space-20))}.rm-table__td--heat-1{background:#fee5e5!important;color:#911616}.rm-table__td--heat-2{background:#ffe7d2!important;color:#8a4309}.rm-table__td--heat-3{background:#fff6cc!important;color:#6b5400}.rm-table__td--heat-4{background:#d8f3dc!important;color:#1b5e25}.rm-table__td--heat-5{background:#b7e4c7!important;color:#0e4b19}body.night .rm-table__td--heat-1{background:#3f1414!important;color:#ffb4b4}body.night .rm-table__td--heat-2{background:#3d2410!important;color:#ffc58a}body.night .rm-table__td--heat-3{background:#3a3210!important;color:#ffe07a}body.night .rm-table__td--heat-4{background:#18351f!important;color:#8ae0a4}body.night .rm-table__td--heat-5{background:#0f4019!important;color:#b4f0c2}.rm-table--compact .rm-table__td,.rm-table--compact .rm-table__th{font-size:var(--font-12,12px);padding:var(--space-6,var(--space-6)) var(--space-12,var(--space-12))}.rm-table--compact .rm-table__th{font-size:var(--font-10,10px)}.rm-table__bulk{align-items:center;background:var(--bg-hover);border-bottom:1px solid var(--color-violet-pale);display:flex;font-size:var(--font-12,12px);justify-content:space-between;padding:var(--space-8,var(--space-8)) var(--space-16,var(--space-16))}.rm-table__bulk-count b{color:var(--color-primary)}.rm-table__bulk-actions{display:flex;gap:var(--space-4,var(--space-4))}.rm-table__pager{align-items:center;background:var(--bg-surface);border-top:1px solid var(--border-default);display:flex;font-size:var(--font-12,12px);gap:var(--space-12,var(--space-12));justify-content:space-between;padding:var(--space-8,var(--space-8)) var(--space-12,var(--space-12))}.rm-table__pager-count{color:var(--text-secondary);font-variant-numeric:tabular-nums}.rm-table__pager-controls{align-items:center;display:flex;gap:var(--space-4,var(--space-4))}.rm-table__pager-page{background:none;border:1px solid transparent;border-radius:var(--radius-sm,6px);color:var(--text-secondary);cursor:pointer;font:inherit;font-variant-numeric:tabular-nums;height:28px;min-width:28px;padding:0 var(--space-6)}.rm-table__pager-page:hover{background:var(--bg-hover);color:var(--color-secondary)}.rm-table__pager-page.is-current{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.rm-table__pager-gap{color:var(--text-muted);padding:0 var(--space-2)}.rm-table__empty{color:var(--text-muted);padding:var(--space-32) var(--space-16);text-align:center}.rm-table__skeleton{height:14px;width:80%}
490
+ .rm-table-wrapper{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);flex:1;overflow:hidden}.rm-table-wrapper--flat{background:transparent;border:none;border-radius:0}.rm-table__scroll{overflow:auto}.rm-table{border-collapse:collapse;font-size:var(--font-13,13px);width:100%}.rm-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.rm-table caption{caption-side:top;color:var(--text-primary);font-size:var(--font-13,13px);font-weight:700;padding:0 0 var(--space-8,var(--space-8));text-align:left}.rm-table__th{background:var(--bg-surface-2);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-12) 14px;text-align:left;text-transform:uppercase;white-space:nowrap}.rm-table--sticky .rm-table__th{border-bottom:none;box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:2}.rm-table__th--center{text-align:center}.rm-table__th--num,.rm-table__th--right{text-align:right}.rm-table__th--check,.rm-table__th--expand{padding-right:0;width:36px}.rm-table__sort{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;gap:var(--space-6,var(--space-6));letter-spacing:inherit;padding:0;text-transform:inherit}.rm-table__sort:hover{color:var(--text-primary)}.rm-table__sort:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-muted);content:"";display:inline-block;height:0;opacity:.5;vertical-align:middle;width:0}.rm-table__th[aria-sort=ascending] .rm-table__sort:after{border-bottom:5px solid var(--color-primary);border-top:none;opacity:1}.rm-table__th[aria-sort=descending] .rm-table__sort:after{border-top:5px solid var(--color-primary);opacity:1}.rm-table a:focus-visible,.rm-table button:focus-visible{border-radius:var(--radius-sm,4px);outline:2px solid var(--color-primary);outline-offset:2px}.rm-table__td{border-bottom:1px solid var(--border-soft);color:var(--text-primary);padding:var(--space-12) 14px;text-align:left;vertical-align:top}th.rm-table__td{background:transparent;font-weight:700;letter-spacing:0;text-transform:none}.rm-table__td--center{text-align:center}.rm-table__td--right{text-align:right}.rm-table__td--num{font-variant-numeric:tabular-nums;text-align:right}.rm-table__td--check,.rm-table__td--expand{color:var(--text-muted);padding-right:0;width:36px}.rm-table__row--striped>.rm-table__td{background:var(--bg-surface-2)}.rm-table--hoverable .rm-table__row:hover>.rm-table__td,.rm-table__row--selected>.rm-table__td{background:var(--bg-hover)}.rm-table__row--expandable{cursor:pointer}.rm-table__caret{display:inline-flex;transition:transform .16s var(--ease-out,ease)}.rm-table__caret.is-open{color:var(--color-primary);transform:rotate(90deg)}.rm-table__group>th{background:var(--bg-hover);color:var(--color-primary);font-size:var(--font-11,11px);font-weight:700;letter-spacing:.08em;padding:var(--space-8,var(--space-8)) var(--space-12,var(--space-12));text-align:left;text-transform:uppercase}.rm-table__detail>td{background:var(--bg-surface-2);border-bottom:1px solid var(--border-soft);padding:0}.rm-table__detail-body{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:1.6;padding:var(--space-12,var(--space-12)) var(--space-20,var(--space-20))}.rm-table__td--heat-1{background:#fee5e5!important;color:#911616}.rm-table__td--heat-2{background:#ffe7d2!important;color:#8a4309}.rm-table__td--heat-3{background:#fff6cc!important;color:#6b5400}.rm-table__td--heat-4{background:#d8f3dc!important;color:#1b5e25}.rm-table__td--heat-5{background:#b7e4c7!important;color:#0e4b19}body.night .rm-table__td--heat-1{background:#3f1414!important;color:#ffb4b4}body.night .rm-table__td--heat-2{background:#3d2410!important;color:#ffc58a}body.night .rm-table__td--heat-3{background:#3a3210!important;color:#ffe07a}body.night .rm-table__td--heat-4{background:#18351f!important;color:#8ae0a4}body.night .rm-table__td--heat-5{background:#0f4019!important;color:#b4f0c2}.rm-table--compact .rm-table__td,.rm-table--compact .rm-table__th{font-size:var(--font-12,12px);padding:var(--space-6,var(--space-6)) var(--space-12,var(--space-12))}.rm-table--compact .rm-table__th{font-size:var(--font-10,10px)}.rm-table__bulk{align-items:center;background:var(--bg-hover);border-bottom:1px solid var(--color-violet-pale);display:flex;font-size:var(--font-12,12px);justify-content:space-between;padding:var(--space-8,var(--space-8)) var(--space-16,var(--space-16))}.rm-table__bulk-count b{color:var(--color-primary)}.rm-table__bulk-actions{display:flex;gap:var(--space-4,var(--space-4))}.rm-table__pager{align-items:center;background:var(--bg-surface);border-top:1px solid var(--border-default);display:flex;font-size:var(--font-12,12px);gap:var(--space-12,var(--space-12));justify-content:space-between;padding:var(--space-8,var(--space-8)) var(--space-12,var(--space-12))}.rm-table__pager-count{color:var(--text-secondary);font-variant-numeric:tabular-nums}.rm-table__pager-controls{align-items:center;display:flex;gap:var(--space-4,var(--space-4))}.rm-table__pager-page{background:none;border:1px solid transparent;border-radius:var(--radius-sm,6px);color:var(--text-secondary);cursor:pointer;font:inherit;font-variant-numeric:tabular-nums;height:28px;min-width:28px;padding:0 var(--space-6)}.rm-table__pager-page:hover{background:var(--bg-hover);color:var(--color-secondary)}.rm-table__pager-page.is-current{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.rm-table__pager-gap{color:var(--text-muted);padding:0 var(--space-2)}.rm-table__empty{color:var(--text-muted);padding:var(--space-32) var(--space-16);text-align:center}.rm-table__skeleton{height:14px;width:80%}
483
491
  </style>
@@ -31,9 +31,11 @@ export interface RmCardActionContext {
31
31
  *
32
32
  * Une fonction est preferable des qu'une liste monte la meme carte vingt
33
33
  * fois : elle n'est appelee qu'a l'export, alors qu'un objet lie en prop est
34
- * recalcule a chaque rendu de chaque carte.
34
+ * recalcule a chaque rendu de chaque carte. Elle peut etre asynchrone : la
35
+ * donnee complete d'une carte demande parfois une requete, que seul
36
+ * l'export justifie de lancer.
35
37
  */
36
- payload?: RmCardPayload | (() => RmCardPayload | null | undefined);
38
+ payload?: RmCardPayload | (() => RmCardPayload | null | undefined | Promise<RmCardPayload | null | undefined>);
37
39
  }
38
40
  export declare function useRmCardActions(): {
39
41
  runCardAction: (action: RmCardAction, context: RmCardActionContext) => Promise<import("./useRmExport").RmExportResult>;
@@ -41,7 +41,7 @@ export function useRmCardActions() {
41
41
  const { run } = useRmExport();
42
42
  async function runCardAction(action, context) {
43
43
  const { card, lang = "fr" } = context;
44
- const provided = (typeof context.payload === "function" ? context.payload() : context.payload) ?? {};
44
+ const provided = await (typeof context.payload === "function" ? context.payload() : context.payload) ?? {};
45
45
  const title = context.name || provided.title || rmCardTitle(card) || "Export";
46
46
  const format = action === "link" ? "link" : action;
47
47
  const sheets = action === "png" || action === "svg" ? [] : provided.sheets?.length ? provided.sheets : await rmCardSheets(card, title, lang);
@@ -1,4 +1,4 @@
1
- const CARD_SELECTOR = ".chart-card, .rm-table-card, .rm-rcard";
1
+ const CARD_SELECTOR = ".chart-card, .rm-table-card, .rm-rcard, .rm-card";
2
2
  const CHART_SELECTOR = ".rm-chart .echart";
3
3
  const WORDS = {
4
4
  fr: { label: "Libell\xE9", value: "Valeur", series: "S\xE9rie", table: "Tableau", field: "Champ", chart: "Graphique", title: "Intitul\xE9", subtitle: "Compl\xE9ment", source: "Provenance" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.109",
3
+ "version": "0.1.111",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",