@tekkare/romulus 0.1.155 → 0.1.157

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.154",
7
+ "version": "0.1.156",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -6,7 +6,7 @@
6
6
  <script setup lang="ts">
7
7
  import { computed } from 'vue'
8
8
  import { useChartTheme } from '../composables/useChartTheme'
9
- import { rmBarHorizontalOption, rmBarVerticalOption, type RmSeriesInput, RM_CHART_HEIGHTS } from '../utils/chart'
9
+ import { rmBarHorizontalOption, rmBarVerticalOption, type RmBarLabelFormatter, type RmSeriesInput, RM_CHART_HEIGHTS } from '../utils/chart'
10
10
 
11
11
  const props = withDefaults(defineProps<{
12
12
  /** Categories de l'axe : annees, libelles d'indicateur. */
@@ -15,8 +15,12 @@ const props = withDefaults(defineProps<{
15
15
  horizontal?: boolean
16
16
  height?: keyof typeof RM_CHART_HEIGHTS | number
17
17
  description?: string
18
- /** Formatage de la valeur en bout de barre (horizontal uniquement). */
19
- labelFormatter?: (value: number) => string
18
+ /**
19
+ * Etiquette de chaque barre : en bout de barre a l'horizontale, au-dessus a
20
+ * la verticale. Sans elle, la valeur se lit sur l'axe et dans l'infobulle,
21
+ * ce qui suffit des que les barres sont nombreuses.
22
+ */
23
+ labelFormatter?: RmBarLabelFormatter
20
24
  }>(), {
21
25
  horizontal: false,
22
26
  height: 'standard',
@@ -36,7 +40,14 @@ const option = computed(() =>
36
40
  decal.value,
37
41
  props.labelFormatter,
38
42
  )
39
- : rmBarVerticalOption(props.categories, props.series, theme.value, palette.value.cat, decal.value),
43
+ : rmBarVerticalOption(
44
+ props.categories,
45
+ props.series,
46
+ theme.value,
47
+ palette.value.cat,
48
+ decal.value,
49
+ props.labelFormatter,
50
+ ),
40
51
  )
41
52
  </script>
42
53
 
@@ -54,6 +54,13 @@ export interface RmNote {
54
54
  updated?: string
55
55
  /** Icone Phosphor. Par defaut celle de la categorie. */
56
56
  icon?: string
57
+ /**
58
+ * Etiquette libre, posee apres la categorie. Elle dit d'ou la note vient
59
+ * plutot que ce qu'elle raconte : l'appelant s'en sert pour un public
60
+ * particulier (une equipe qui relit ses rattachements), pas pour le lecteur.
61
+ * A ne pas confondre avec `badge`, qui signe le panneau entier.
62
+ */
63
+ tag?: string
57
64
  /** Teinte de la pastille. Par defaut celle de la categorie. */
58
65
  tone?: RmNoteTone
59
66
  sections: RmNoteSection[]
@@ -294,6 +301,9 @@ function onLink(to: string) {
294
301
  <span class="rm-notes__tag" :class="`rm-notes__tag--${noteTone(note)}`">
295
302
  {{ categoryLabel(note) }}
296
303
  </span>
304
+ <span v-if="note.tag" class="rm-notes__tag rm-notes__tag--muted">
305
+ {{ note.tag }}
306
+ </span>
297
307
  <span v-if="updatedLabel(note)" class="rm-notes__cell">
298
308
  <RmIcon name="Clock" :size="13" />
299
309
  {{ T.updated }} {{ updatedLabel(note) }}
@@ -376,5 +386,5 @@ function onLink(to: string) {
376
386
  </template>
377
387
 
378
388
  <style scoped>
379
- .rm-notes{align-self:stretch;flex-direction:column;font-family:var(--font-sans)}.rm-notes,.rm-notes__head{display:flex;gap:var(--space-12)}.rm-notes__head{align-items:center;justify-content:space-between}.rm-notes__title{color:var(--text-primary);font-family:var(--font-serif);font-size:var(--font-22);font-weight:var(--weight-bold);margin:0}.rm-notes__badge{align-items:center;background:var(--bg-hover);border-radius:var(--radius-pill);color:var(--color-secondary);display:inline-flex;font-size:var(--font-10);font-weight:var(--weight-bold);gap:var(--space-4);letter-spacing:.06em;padding:var(--space-4) var(--space-10);text-transform:uppercase}.rm-notes__desc{color:var(--text-secondary);font-size:var(--font-13);line-height:1.5;margin:0}.rm-notes__search{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-muted);display:flex;gap:var(--space-8);padding:var(--space-8) var(--space-12)}.rm-notes__search:focus-within{border-color:var(--color-secondary);box-shadow:0 0 0 3px rgba(var(--brand-rgb),.1)}.rm-notes__search input{background:none;border:none;color:var(--text-primary);flex:1;font-family:inherit;font-size:var(--font-13);min-width:0;outline:none}.rm-notes__search input::-moz-placeholder{color:var(--text-muted)}.rm-notes__search input::placeholder{color:var(--text-muted)}.rm-notes__chips{display:flex;flex-wrap:wrap;gap:var(--space-6)}.rm-notes__chip{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-secondary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-12);gap:var(--space-4);padding:5px var(--space-10)}.rm-notes__chip:hover{background:var(--bg-surface-3)}.rm-notes__chip--on{background:var(--bg-hover);border-color:var(--color-violet-pale);color:var(--color-primary);font-weight:var(--weight-semibold)}.rm-notes__chip-count{font-variant-numeric:tabular-nums;opacity:.8}.rm-notes__list,.rm-notes__note{display:flex;flex-direction:column;gap:var(--space-8)}.rm-notes__note{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);padding:var(--space-16);transition:border-color var(--duration-fast) var(--ease-out)}.rm-notes__note:hover{border-color:var(--color-violet-pale)}.rm-notes__note--open{border-color:var(--color-secondary)}.rm-notes__note-head,.rm-notes__note-id{align-items:flex-start;display:flex;gap:var(--space-12)}.rm-notes__note-id{background:none;border:none;cursor:pointer;flex:1;font-family:inherit;min-width:0;padding:0;text-align:left}.rm-notes__note-icon{align-items:center;border-radius:var(--radius-lg);display:flex;flex-shrink:0;height:36px;justify-content:center;width:36px}.rm-notes__note-icon--primary{background:var(--bg-hover);color:var(--color-secondary)}.rm-notes__note-icon--info{background:var(--color-info-bg);color:var(--color-info)}.rm-notes__note-icon--warning{background:var(--color-warning-bg);color:var(--color-warning)}.rm-notes__note-icon--success{background:var(--color-success-bg);color:var(--color-success)}.rm-notes__note-icon--neutral{background:var(--bg-surface-2);color:var(--text-secondary)}.rm-notes__note-text{display:flex;flex-direction:column;gap:var(--space-6);min-width:0}.rm-notes__note-title{color:var(--text-primary);font-family:var(--font-serif);font-size:var(--font-16);font-weight:var(--weight-bold)}.rm-notes__note-meta{align-items:center;color:var(--text-muted);display:flex;flex-wrap:wrap;font-size:var(--font-11);gap:var(--space-8)}.rm-notes__cell{align-items:center;display:inline-flex;gap:var(--space-4)}.rm-notes__tag{border-radius:var(--radius-pill);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.04em;padding:var(--space-2) var(--space-6);text-transform:uppercase}.rm-notes__tag--primary{background:var(--bg-hover);color:var(--color-secondary)}.rm-notes__tag--info{background:var(--color-info-bg);color:var(--color-info)}.rm-notes__tag--warning{background:var(--color-warning-bg);color:var(--color-warning)}.rm-notes__tag--success{background:var(--color-success-bg);color:var(--color-success)}.rm-notes__tag--neutral{background:var(--bg-surface-2);color:var(--text-secondary)}.rm-notes__caret{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:28px;justify-content:center;width:28px}.rm-notes__caret:hover{background:var(--bg-surface-3)}.rm-notes__summary{color:var(--text-secondary);font-size:var(--font-13);line-height:1.6;margin:0}.rm-notes__body{border-top:1px solid var(--border-soft);display:flex;flex-direction:column;gap:var(--space-16);padding-top:var(--space-12)}.rm-notes__section{display:flex;flex-direction:column;gap:var(--space-8)}.rm-notes__eyebrow{color:var(--text-muted);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.08em;margin:0;text-transform:uppercase}.rm-notes__p,.rm-notes__ul{color:var(--text-secondary);font-size:var(--font-13);line-height:1.65;margin:0}.rm-notes__ul{padding-left:var(--space-20)}.rm-notes__ul--terms{list-style:none;padding-left:0}.rm-notes__p b,.rm-notes__ul b{color:var(--text-primary)}.rm-notes__example{background:var(--bg-surface-3);border-left:3px solid var(--color-primary);border-radius:var(--radius-sm);color:var(--text-secondary);font-family:var(--font-mono);font-size:var(--font-12);margin:0;padding:var(--space-8) var(--space-12)}.rm-notes__link{align-items:center;color:var(--color-primary);cursor:pointer;display:inline-flex;font-size:var(--font-13);font-weight:var(--weight-semibold);gap:var(--space-4);text-decoration:underline;text-underline-offset:3px}
389
+ .rm-notes{align-self:stretch;flex-direction:column;font-family:var(--font-sans)}.rm-notes,.rm-notes__head{display:flex;gap:var(--space-12)}.rm-notes__head{align-items:center;justify-content:space-between}.rm-notes__title{color:var(--text-primary);font-family:var(--font-serif);font-size:var(--font-22);font-weight:var(--weight-bold);margin:0}.rm-notes__badge{align-items:center;background:var(--bg-hover);border-radius:var(--radius-pill);color:var(--color-secondary);display:inline-flex;font-size:var(--font-10);font-weight:var(--weight-bold);gap:var(--space-4);letter-spacing:.06em;padding:var(--space-4) var(--space-10);text-transform:uppercase}.rm-notes__desc{color:var(--text-secondary);font-size:var(--font-13);line-height:1.5;margin:0}.rm-notes__search{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-muted);display:flex;gap:var(--space-8);padding:var(--space-8) var(--space-12)}.rm-notes__search:focus-within{border-color:var(--color-secondary);box-shadow:0 0 0 3px rgba(var(--brand-rgb),.1)}.rm-notes__search input{background:none;border:none;color:var(--text-primary);flex:1;font-family:inherit;font-size:var(--font-13);min-width:0;outline:none}.rm-notes__search input::-moz-placeholder{color:var(--text-muted)}.rm-notes__search input::placeholder{color:var(--text-muted)}.rm-notes__chips{display:flex;flex-wrap:wrap;gap:var(--space-6)}.rm-notes__chip{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-secondary);cursor:pointer;display:inline-flex;font-family:inherit;font-size:var(--font-12);gap:var(--space-4);padding:5px var(--space-10)}.rm-notes__chip:hover{background:var(--bg-surface-3)}.rm-notes__chip--on{background:var(--bg-hover);border-color:var(--color-violet-pale);color:var(--color-primary);font-weight:var(--weight-semibold)}.rm-notes__chip-count{font-variant-numeric:tabular-nums;opacity:.8}.rm-notes__list,.rm-notes__note{display:flex;flex-direction:column;gap:var(--space-8)}.rm-notes__note{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl);padding:var(--space-16);transition:border-color var(--duration-fast) var(--ease-out)}.rm-notes__note:hover{border-color:var(--color-violet-pale)}.rm-notes__note--open{border-color:var(--color-secondary)}.rm-notes__note-head,.rm-notes__note-id{align-items:flex-start;display:flex;gap:var(--space-12)}.rm-notes__note-id{background:none;border:none;cursor:pointer;flex:1;font-family:inherit;min-width:0;padding:0;text-align:left}.rm-notes__note-icon{align-items:center;border-radius:var(--radius-lg);display:flex;flex-shrink:0;height:36px;justify-content:center;width:36px}.rm-notes__note-icon--primary{background:var(--bg-hover);color:var(--color-secondary)}.rm-notes__note-icon--info{background:var(--color-info-bg);color:var(--color-info)}.rm-notes__note-icon--warning{background:var(--color-warning-bg);color:var(--color-warning)}.rm-notes__note-icon--success{background:var(--color-success-bg);color:var(--color-success)}.rm-notes__note-icon--neutral{background:var(--bg-surface-2);color:var(--text-secondary)}.rm-notes__note-text{display:flex;flex-direction:column;gap:var(--space-6);min-width:0}.rm-notes__note-title{color:var(--text-primary);font-family:var(--font-serif);font-size:var(--font-16);font-weight:var(--weight-bold)}.rm-notes__note-meta{align-items:center;color:var(--text-muted);display:flex;flex-wrap:wrap;font-size:var(--font-11);gap:var(--space-8)}.rm-notes__cell{align-items:center;display:inline-flex;gap:var(--space-4)}.rm-notes__tag{border-radius:var(--radius-pill);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.04em;padding:var(--space-2) var(--space-6);text-transform:uppercase}.rm-notes__tag--muted{background:var(--bg-surface-2);color:var(--text-secondary)}.rm-notes__tag--primary{background:var(--bg-hover);color:var(--color-secondary)}.rm-notes__tag--info{background:var(--color-info-bg);color:var(--color-info)}.rm-notes__tag--warning{background:var(--color-warning-bg);color:var(--color-warning)}.rm-notes__tag--success{background:var(--color-success-bg);color:var(--color-success)}.rm-notes__tag--neutral{background:var(--bg-surface-2);color:var(--text-secondary)}.rm-notes__caret{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:28px;justify-content:center;width:28px}.rm-notes__caret:hover{background:var(--bg-surface-3)}.rm-notes__summary{color:var(--text-secondary);font-size:var(--font-13);line-height:1.6;margin:0}.rm-notes__body{border-top:1px solid var(--border-soft);display:flex;flex-direction:column;gap:var(--space-16);padding-top:var(--space-12)}.rm-notes__section{display:flex;flex-direction:column;gap:var(--space-8)}.rm-notes__eyebrow{color:var(--text-muted);font-size:var(--font-10);font-weight:var(--weight-bold);letter-spacing:.08em;margin:0;text-transform:uppercase}.rm-notes__p,.rm-notes__ul{color:var(--text-secondary);font-size:var(--font-13);line-height:1.65;margin:0}.rm-notes__ul{padding-left:var(--space-20)}.rm-notes__ul--terms{list-style:none;padding-left:0}.rm-notes__p b,.rm-notes__ul b{color:var(--text-primary)}.rm-notes__example{background:var(--bg-surface-3);border-left:3px solid var(--color-primary);border-radius:var(--radius-sm);color:var(--text-secondary);font-family:var(--font-mono);font-size:var(--font-12);margin:0;padding:var(--space-8) var(--space-12)}.rm-notes__link{align-items:center;color:var(--color-primary);cursor:pointer;display:inline-flex;font-size:var(--font-13);font-weight:var(--weight-semibold);gap:var(--space-4);text-decoration:underline;text-underline-offset:3px}
380
390
  </style>
@@ -177,7 +177,13 @@ export interface RmSeriesInput {
177
177
  axis?: 0 | 1;
178
178
  }
179
179
  /** Bar chart vertical, une ou plusieurs series, empilable. */
180
- export declare function rmBarVerticalOption(categories: (string | number)[], series: RmSeriesInput[], theme: RmChartTheme, palette: string[], decal?: boolean): {
180
+ /**
181
+ * Etiquette d'une barre. L'index est donne parce que la valeur seule ne suffit
182
+ * pas toujours : une part se lit contre un total que l'appelant tient a cote
183
+ * (« 1 240 (18 %) »), et c'est l'index qui la retrouve.
184
+ */
185
+ export type RmBarLabelFormatter = (value: number, index: number) => string;
186
+ export declare function rmBarVerticalOption(categories: (string | number)[], series: RmSeriesInput[], theme: RmChartTheme, palette: string[], decal?: boolean, formatter?: RmBarLabelFormatter): {
181
187
  tooltip: {
182
188
  trigger: string;
183
189
  backgroundColor: string;
@@ -282,6 +288,17 @@ export declare function rmBarVerticalOption(categories: (string | number)[], ser
282
288
  color: string;
283
289
  borderRadius: number[];
284
290
  };
291
+ label: {
292
+ show: boolean;
293
+ position: string;
294
+ fontSize: number;
295
+ color: string;
296
+ fontFamily: string;
297
+ formatter: (p: {
298
+ value: number;
299
+ dataIndex: number;
300
+ }) => string;
301
+ } | undefined;
285
302
  }[];
286
303
  backgroundColor: string;
287
304
  animation: boolean;
@@ -296,7 +313,7 @@ export declare function rmBarVerticalOption(categories: (string | number)[], ser
296
313
  };
297
314
  };
298
315
  /** Bar chart horizontal, avec valeur affichee en bout de barre. */
299
- export declare function rmBarHorizontalOption(labels: string[], values: (number | null)[], theme: RmChartTheme, palette: string[], decal?: boolean, formatter?: (value: number) => string): {
316
+ export declare function rmBarHorizontalOption(labels: string[], values: (number | null)[], theme: RmChartTheme, palette: string[], decal?: boolean, formatter?: RmBarLabelFormatter): {
300
317
  grid: {
301
318
  left: number;
302
319
  right: number;
@@ -356,6 +373,7 @@ export declare function rmBarHorizontalOption(labels: string[], values: (number
356
373
  fontFamily: string;
357
374
  formatter: ((p: {
358
375
  value: number;
376
+ dataIndex: number;
359
377
  }) => string) | undefined;
360
378
  };
361
379
  }[];
@@ -140,7 +140,7 @@ const axisCommon = (theme) => ({
140
140
  axisLine: { lineStyle: { color: theme.axisLine } },
141
141
  splitLine: { lineStyle: { color: theme.splitLine } }
142
142
  });
143
- export function rmBarVerticalOption(categories, series, theme, palette, decal = false) {
143
+ export function rmBarVerticalOption(categories, series, theme, palette, decal = false, formatter) {
144
144
  return {
145
145
  ...rmBaseOption(theme, decal),
146
146
  tooltip: { ...rmBaseOption(theme, decal).tooltip, trigger: rmTooltipTrigger(series.length) },
@@ -155,7 +155,17 @@ export function rmBarVerticalOption(categories, series, theme, palette, decal =
155
155
  name: s.name,
156
156
  stack: s.stack,
157
157
  data: s.data,
158
- itemStyle: { color: s.color ?? rmSeriesColor(palette, i), borderRadius: [3, 3, 0, 0] }
158
+ itemStyle: { color: s.color ?? rmSeriesColor(palette, i), borderRadius: [3, 3, 0, 0] },
159
+ // L'etiquette ne se pose que si l'appelant la demande : sur une serie
160
+ // longue elle se chevaucherait, et l'axe dit deja la valeur.
161
+ label: formatter ? {
162
+ show: true,
163
+ position: "top",
164
+ fontSize: 11,
165
+ color: theme.mutedColor,
166
+ fontFamily: FONT,
167
+ formatter: (p) => formatter(p.value, p.dataIndex)
168
+ } : void 0
159
169
  }))
160
170
  };
161
171
  }
@@ -178,7 +188,7 @@ export function rmBarHorizontalOption(labels, values, theme, palette, decal = fa
178
188
  fontSize: 11,
179
189
  color: theme.mutedColor,
180
190
  fontFamily: FONT,
181
- formatter: formatter ? (p) => formatter(p.value) : void 0
191
+ formatter: formatter ? (p) => formatter(p.value, p.dataIndex) : void 0
182
192
  }
183
193
  }]
184
194
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.155",
3
+ "version": "0.1.157",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",