@sentropic/design-system-svelte 0.34.50 → 0.34.52

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.
Files changed (85) hide show
  1. package/README.md +62 -0
  2. package/dist/AnomalySwimLaneChart.svelte +10 -1
  3. package/dist/AnomalySwimLaneChart.svelte.d.ts +2 -0
  4. package/dist/AnomalySwimLaneChart.svelte.d.ts.map +1 -1
  5. package/dist/CalendarHeatmapChart.svelte +11 -1
  6. package/dist/CalendarHeatmapChart.svelte.d.ts +2 -0
  7. package/dist/CalendarHeatmapChart.svelte.d.ts.map +1 -1
  8. package/dist/Combobox.svelte +5 -1
  9. package/dist/Combobox.svelte.d.ts.map +1 -1
  10. package/dist/ContourChart.svelte +76 -13
  11. package/dist/ContourChart.svelte.d.ts +3 -1
  12. package/dist/ContourChart.svelte.d.ts.map +1 -1
  13. package/dist/CopyButton.svelte +9 -3
  14. package/dist/CopyButton.svelte.d.ts +1 -0
  15. package/dist/CopyButton.svelte.d.ts.map +1 -1
  16. package/dist/Dashboard.svelte +155 -0
  17. package/dist/Dashboard.svelte.d.ts +21 -0
  18. package/dist/Dashboard.svelte.d.ts.map +1 -0
  19. package/dist/DashboardGrid.svelte +237 -0
  20. package/dist/DashboardGrid.svelte.d.ts +24 -0
  21. package/dist/DashboardGrid.svelte.d.ts.map +1 -0
  22. package/dist/DataTable.svelte +3 -1
  23. package/dist/DataTable.svelte.d.ts +1 -0
  24. package/dist/DataTable.svelte.d.ts.map +1 -1
  25. package/dist/DatePicker.svelte +33 -28
  26. package/dist/DatePicker.svelte.d.ts.map +1 -1
  27. package/dist/Density2DChart.svelte +10 -1
  28. package/dist/Density2DChart.svelte.d.ts +2 -0
  29. package/dist/Density2DChart.svelte.d.ts.map +1 -1
  30. package/dist/Dropdown.svelte +40 -11
  31. package/dist/Dropdown.svelte.d.ts +1 -0
  32. package/dist/Dropdown.svelte.d.ts.map +1 -1
  33. package/dist/EventFeedPanel.svelte +3 -3
  34. package/dist/EventFeedPanel.svelte.d.ts +1 -1
  35. package/dist/EventFeedPanel.svelte.d.ts.map +1 -1
  36. package/dist/FileUploader.svelte +7 -3
  37. package/dist/Footer.svelte +75 -11
  38. package/dist/Footer.svelte.d.ts +16 -6
  39. package/dist/Footer.svelte.d.ts.map +1 -1
  40. package/dist/ForceGraph.svelte +9 -3
  41. package/dist/ForceGraph.svelte.d.ts +4 -0
  42. package/dist/ForceGraph.svelte.d.ts.map +1 -1
  43. package/dist/HeatmapChart.svelte +39 -3
  44. package/dist/HeatmapChart.svelte.d.ts +4 -1
  45. package/dist/HeatmapChart.svelte.d.ts.map +1 -1
  46. package/dist/KanbanBoard.svelte +144 -0
  47. package/dist/KanbanBoard.svelte.d.ts +23 -0
  48. package/dist/KanbanBoard.svelte.d.ts.map +1 -0
  49. package/dist/ListReportPage.svelte +184 -0
  50. package/dist/ListReportPage.svelte.d.ts +46 -0
  51. package/dist/ListReportPage.svelte.d.ts.map +1 -0
  52. package/dist/MasterDetail.svelte +267 -0
  53. package/dist/MasterDetail.svelte.d.ts +35 -0
  54. package/dist/MasterDetail.svelte.d.ts.map +1 -0
  55. package/dist/MultiSelect.svelte +20 -11
  56. package/dist/MultiSelect.svelte.d.ts +1 -0
  57. package/dist/MultiSelect.svelte.d.ts.map +1 -1
  58. package/dist/NavItem.svelte +6 -6
  59. package/dist/ObjectPage.svelte +222 -0
  60. package/dist/ObjectPage.svelte.d.ts +46 -0
  61. package/dist/ObjectPage.svelte.d.ts.map +1 -0
  62. package/dist/OrderedList.svelte +7 -12
  63. package/dist/OrderedList.svelte.d.ts.map +1 -1
  64. package/dist/PaginationNav.svelte +10 -4
  65. package/dist/PaginationNav.svelte.d.ts +1 -0
  66. package/dist/PaginationNav.svelte.d.ts.map +1 -1
  67. package/dist/PointAndFigureChart.svelte +18 -11
  68. package/dist/PointAndFigureChart.svelte.d.ts +1 -1
  69. package/dist/PointAndFigureChart.svelte.d.ts.map +1 -1
  70. package/dist/RenkoChart.svelte +40 -13
  71. package/dist/RenkoChart.svelte.d.ts +1 -1
  72. package/dist/RenkoChart.svelte.d.ts.map +1 -1
  73. package/dist/VectorFieldChart.svelte +5 -5
  74. package/dist/VectorFieldChart.svelte.d.ts +1 -1
  75. package/dist/VectorFieldChart.svelte.d.ts.map +1 -1
  76. package/dist/WindBarbChart.svelte +5 -5
  77. package/dist/WindBarbChart.svelte.d.ts +1 -1
  78. package/dist/WindBarbChart.svelte.d.ts.map +1 -1
  79. package/dist/Wizard.svelte +125 -0
  80. package/dist/Wizard.svelte.d.ts +25 -0
  81. package/dist/Wizard.svelte.d.ts.map +1 -0
  82. package/dist/index.d.ts +24 -10
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +7 -0
  85. package/package.json +1 -1
@@ -32,7 +32,7 @@ export type EventFeedPanelEvent = {
32
32
  /** Message principal affiché. */
33
33
  message: string;
34
34
  };
35
- type EventFeedPanelProps = {
35
+ export type EventFeedPanelProps = {
36
36
  data: EventFeedPanelEvent[];
37
37
  label?: string;
38
38
  maxHeight?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"EventFeedPanel.svelte.d.ts","sourceRoot":"","sources":["../src/lib/EventFeedPanel.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA+EJ,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"EventFeedPanel.svelte.d.ts","sourceRoot":"","sources":["../src/lib/EventFeedPanel.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA8EJ,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -236,7 +236,7 @@
236
236
  {/if}
237
237
  </span>
238
238
  <span class="st-fileUploader__itemMeta">
239
- <span class="st-fileUploader__itemName">{item.file.name}</span>
239
+ <span class="st-fileUploader__itemName st-fileUploader__name">{item.file.name}</span>
240
240
  <span class="st-fileUploader__itemSize">{formatSize(item.file.size)}</span>
241
241
  {#if item.status === "error" && item.error}
242
242
  <span class="st-fileUploader__itemError">{item.error}</span>
@@ -274,7 +274,7 @@
274
274
  {/if}
275
275
  </span>
276
276
  <span class="st-fileUploader__itemMeta">
277
- <span class="st-fileUploader__itemName">{file.name}</span>
277
+ <span class="st-fileUploader__itemName st-fileUploader__name">{file.name}</span>
278
278
  <span class="st-fileUploader__itemSize">{formatSize(file.size)}</span>
279
279
  {#if itemError}
280
280
  <span class="st-fileUploader__itemError">{itemError}</span>
@@ -407,7 +407,10 @@
407
407
  }
408
408
 
409
409
  .st-fileUploader__trigger:hover:not(:disabled) {
410
- background: var(--st-component-control-hoverBackground, var(--st-semantic-surface-subtle));
410
+ background: var(
411
+ --st-component-button-anatomy-states-hover-bg,
412
+ color-mix(in srgb, var(--st-semantic-action-primary) 85%, black)
413
+ );
411
414
  }
412
415
 
413
416
  .st-fileUploader__trigger:focus-visible {
@@ -491,6 +494,7 @@
491
494
 
492
495
  .st-fileUploader__itemMeta {
493
496
  display: grid;
497
+ flex: 1 1 0;
494
498
  gap: 0.125rem;
495
499
  min-width: 0;
496
500
  }
@@ -2,18 +2,23 @@
2
2
  import type { Snippet } from "svelte";
3
3
  import type { HTMLAttributes } from "svelte/elements";
4
4
 
5
+ type LinkItem = { label: string; href: string };
6
+ type ColumnItem = { title?: string; links: LinkItem[] };
7
+
5
8
  type FooterProps = Omit<HTMLAttributes<HTMLElement>, "class"> & {
6
9
  /** Texte de copyright (bas de pied de page). */
7
10
  copyright?: string;
8
11
  /** aria-label de la région contentinfo. */
9
12
  label?: string;
10
13
  class?: string;
11
- /** Marque / logo (zone de tête, à gauche). */
12
- brand?: Snippet;
13
- /** Colonnes de liens (zone de tête). */
14
- columns?: Snippet;
15
- /** Liens légaux (barre du bas, à droite du copyright). */
16
- legal?: Snippet;
14
+ /** Marque / logo : Snippet OU chaîne de texte. */
15
+ brand?: Snippet | string;
16
+ /** Colonnes de liens : Snippet OU tableau de données. */
17
+ columns?: Snippet | ColumnItem[];
18
+ /** Liens légaux : Snippet OU tableau de données. */
19
+ legal?: Snippet | LinkItem[];
20
+ /** Alias data-driven pour les liens légaux (parité React). */
21
+ legalLinks?: LinkItem[];
17
22
  /** Contenu libre additionnel sous la barre du bas. */
18
23
  children?: Snippet;
19
24
  };
@@ -25,23 +30,50 @@
25
30
  brand,
26
31
  columns,
27
32
  legal,
33
+ legalLinks,
28
34
  children,
29
35
  ...rest
30
36
  }: FooterProps = $props();
31
37
 
38
+ const isSnippet = (v: unknown): v is Snippet => typeof v === "function";
39
+
40
+ // Résoudre la zone légale : prop `legal` OU prop `legalLinks`
41
+ const resolvedLegal = $derived(legal ?? legalLinks);
42
+
32
43
  const classes = () => ["st-footer", className].filter(Boolean).join(" ");
33
44
  const hasTop = () => Boolean(brand || columns);
34
- const hasBottom = () => Boolean(copyright || legal);
45
+ const hasBottom = () => Boolean(copyright || resolvedLegal);
35
46
  </script>
36
47
 
37
48
  <footer {...rest} class={classes()} aria-label={label}>
38
49
  {#if hasTop()}
39
50
  <div class="st-footer__top">
40
51
  {#if brand}
41
- <div class="st-footer__brand">{@render brand()}</div>
52
+ <div class="st-footer__brand">
53
+ {#if isSnippet(brand)}
54
+ {@render brand()}
55
+ {:else}
56
+ {brand}
57
+ {/if}
58
+ </div>
42
59
  {/if}
43
60
  {#if columns}
44
- <div class="st-footer__columns">{@render columns()}</div>
61
+ <div class="st-footer__columns">
62
+ {#if isSnippet(columns)}
63
+ {@render columns()}
64
+ {:else if Array.isArray(columns)}
65
+ {#each columns as col}
66
+ <nav>
67
+ {#if col.title}<h2 class="st-footer__col-title">{col.title}</h2>{/if}
68
+ <ul class="st-footer__col-links">
69
+ {#each col.links as link}
70
+ <li><a href={link.href}>{link.label}</a></li>
71
+ {/each}
72
+ </ul>
73
+ </nav>
74
+ {/each}
75
+ {/if}
76
+ </div>
45
77
  {/if}
46
78
  </div>
47
79
  {/if}
@@ -51,9 +83,15 @@
51
83
  {#if copyright}
52
84
  <span class="st-footer__copyright">{copyright}</span>
53
85
  {/if}
54
- {#if legal}
86
+ {#if resolvedLegal}
55
87
  <nav class="st-footer__legal" aria-label="Liens légaux">
56
- {@render legal()}
88
+ {#if isSnippet(resolvedLegal)}
89
+ {@render resolvedLegal()}
90
+ {:else if Array.isArray(resolvedLegal)}
91
+ {#each resolvedLegal as link}
92
+ <a href={link.href}>{link.label}</a>
93
+ {/each}
94
+ {/if}
57
95
  </nav>
58
96
  {/if}
59
97
  </div>
@@ -121,4 +159,30 @@
121
159
  gap: var(--st-spacing-4, 1rem);
122
160
  font-size: 0.8125rem;
123
161
  }
162
+
163
+ .st-footer__col-title {
164
+ font-size: 0.875rem;
165
+ font-weight: 600;
166
+ margin: 0 0 var(--st-spacing-2, 0.5rem);
167
+ color: var(--st-semantic-text-primary);
168
+ }
169
+
170
+ .st-footer__col-links {
171
+ display: flex;
172
+ flex-direction: column;
173
+ gap: var(--st-spacing-2, 0.5rem);
174
+ list-style: none;
175
+ margin: 0;
176
+ padding: 0;
177
+ }
178
+
179
+ .st-footer__col-links a {
180
+ color: inherit;
181
+ font-size: 0.875rem;
182
+ text-decoration: none;
183
+ }
184
+
185
+ .st-footer__col-links a:hover {
186
+ text-decoration: underline;
187
+ }
124
188
  </style>
@@ -1,17 +1,27 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { HTMLAttributes } from "svelte/elements";
3
+ type LinkItem = {
4
+ label: string;
5
+ href: string;
6
+ };
7
+ type ColumnItem = {
8
+ title?: string;
9
+ links: LinkItem[];
10
+ };
3
11
  type FooterProps = Omit<HTMLAttributes<HTMLElement>, "class"> & {
4
12
  /** Texte de copyright (bas de pied de page). */
5
13
  copyright?: string;
6
14
  /** aria-label de la région contentinfo. */
7
15
  label?: string;
8
16
  class?: string;
9
- /** Marque / logo (zone de tête, à gauche). */
10
- brand?: Snippet;
11
- /** Colonnes de liens (zone de tête). */
12
- columns?: Snippet;
13
- /** Liens légaux (barre du bas, à droite du copyright). */
14
- legal?: Snippet;
17
+ /** Marque / logo : Snippet OU chaîne de texte. */
18
+ brand?: Snippet | string;
19
+ /** Colonnes de liens : Snippet OU tableau de données. */
20
+ columns?: Snippet | ColumnItem[];
21
+ /** Liens légaux : Snippet OU tableau de données. */
22
+ legal?: Snippet | LinkItem[];
23
+ /** Alias data-driven pour les liens légaux (parité React). */
24
+ legalLinks?: LinkItem[];
15
25
  /** Contenu libre additionnel sous la barre du bas. */
16
26
  children?: Snippet;
17
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Footer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IAC9D,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAwDJ,QAAA,MAAM,MAAM,iDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Footer.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Footer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAChD,KAAK,UAAU,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAExD,KAAK,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IAC9D,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,CAAC;IACjC,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA2FJ,QAAA,MAAM,MAAM,iDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -273,6 +273,10 @@
273
273
  * `id`. Receives the same pair so the consumer can drop `from` from the data.
274
274
  */
275
275
  onMergeComplete?: (pair: { id: string; from: string; into: string }) => void;
276
+ /** Accessible label for the reset-view button (shown when zoomed/panned). */
277
+ resetViewLabel?: string;
278
+ /** Accessible label for the legend overlay. */
279
+ legendLabel?: string;
276
280
  class?: string;
277
281
  };
278
282
 
@@ -296,6 +300,8 @@
296
300
  onNodeHover,
297
301
  mergePair = null,
298
302
  onMergeComplete,
303
+ resetViewLabel = "Reset view",
304
+ legendLabel = "Graph legend",
299
305
  class: className
300
306
  }: ForceGraphProps = $props();
301
307
 
@@ -1051,7 +1057,7 @@
1051
1057
  >
1052
1058
  {#if p.shapePath}
1053
1059
  <path
1054
- class="st-forceGraph__dot"
1060
+ class="st-forceGraph__shape st-forceGraph__dot"
1055
1061
  d={p.shapePath}
1056
1062
  tabindex="0"
1057
1063
  role="button"
@@ -1134,7 +1140,7 @@
1134
1140
  <button
1135
1141
  class="st-forceGraph__resetBtn"
1136
1142
  type="button"
1137
- aria-label="Reset view"
1143
+ aria-label={resetViewLabel}
1138
1144
  onclick={resetView}
1139
1145
  >
1140
1146
 
@@ -1143,7 +1149,7 @@
1143
1149
 
1144
1150
  <!-- Legend overlay -->
1145
1151
  {#if legend && legend.length > 0}
1146
- <div class="st-forceGraph__legend" aria-label="Graph legend">
1152
+ <div class="st-forceGraph__legend" aria-label={legendLabel}>
1147
1153
  {#each legend as entry}
1148
1154
  {@const swatchPath = entry.shape !== undefined ? nodeShapePath(entry.shape, 7) : null}
1149
1155
  {@const swatchTone = entry.tone ?? "category1"}
@@ -170,6 +170,10 @@ type ForceGraphProps = {
170
170
  from: string;
171
171
  into: string;
172
172
  }) => void;
173
+ /** Accessible label for the reset-view button (shown when zoomed/panned). */
174
+ resetViewLabel?: string;
175
+ /** Accessible label for the legend overlay. */
176
+ legendLabel?: string;
173
177
  class?: string;
174
178
  };
175
179
  declare const ForceGraph: import("svelte").Component<ForceGraphProps, {}, "">;
@@ -1 +1 @@
1
- {"version":3,"file":"ForceGraph.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ForceGraph.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,cAAc,GACtB,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAC3B,KAAK,GAAG,QAAQ,GAChB,SAAS,GACT,MAAM,GACN,SAAS,GACT,KAAK,GAAG,QAAQ,GAChB,YAAY,GACZ,UAAU,CAAC;AAEf,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,cAAc,GAAG;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gEAAgE;IAChE,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,kDAAkD;IAClD,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,kBAAkB,GAAG,SAAS,EACpC,IAAI,CAAC,EAAE,OAAO,GACb,MAAM,GAAG,IAAI,CAUf;AA0BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsD9F;AAED,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,MAAM,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2xBJ,QAAA,MAAM,UAAU,qDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ForceGraph.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ForceGraph.svelte.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  <script lang="ts" module>
2
2
  /**
3
- * HeatmapChart - API canonique (référence Svelte, React/Vue doivent s'aligner)
3
+ * HeatmapChart - API canonique (référence Svelte, React/Vue/Angular doivent s'aligner)
4
4
  *
5
5
  * Props obligatoires :
6
6
  * data HeatmapChartDatum[] - tableau {x, y, value, tone?}
7
7
  * label string - aria-label du graphique
8
8
  *
9
9
  * Props optionnelles :
10
+ * scale "categorical" | "sequential" (défaut categorical)
10
11
  * legend boolean (défaut false) - affiche le gradient Low→High
11
12
  * width number (défaut 480) - largeur du viewBox en px
12
13
  * height number (défaut 300) - hauteur du viewBox en px
@@ -25,6 +26,8 @@
25
26
  | "category7"
26
27
  | "category8";
27
28
 
29
+ export type HeatmapChartScale = "categorical" | "sequential";
30
+
28
31
  export type HeatmapChartDatum = {
29
32
  x: string;
30
33
  y: string;
@@ -39,6 +42,7 @@
39
42
  type HeatmapChartProps = {
40
43
  data: HeatmapChartDatum[];
41
44
  label: string;
45
+ scale?: HeatmapChartScale;
42
46
  legend?: boolean;
43
47
  width?: number;
44
48
  height?: number;
@@ -48,6 +52,7 @@
48
52
  let {
49
53
  data,
50
54
  label,
55
+ scale = "categorical",
51
56
  legend = false,
52
57
  width = 480,
53
58
  height = 300,
@@ -78,6 +83,10 @@
78
83
  return out;
79
84
  }
80
85
 
86
+ function normalizedScale(value: HeatmapChartScale | undefined): HeatmapChartScale {
87
+ return value === "sequential" ? "sequential" : "categorical";
88
+ }
89
+
81
90
  function toneForValue(value: number, min: number, max: number): HeatmapChartTone {
82
91
  if (!Number.isFinite(value) || max <= min) return "category1";
83
92
  const index = Math.max(0, Math.min(TONES.length - 1, Math.floor(((value - min) / (max - min)) * TONES.length)));
@@ -86,6 +95,7 @@
86
95
 
87
96
  let hoveredIndex: number | null = $state(null);
88
97
 
98
+ const resolvedScale = $derived(normalizedScale(scale));
89
99
  const xLabels = $derived(uniqueInOrder(data.map((d) => d.x)));
90
100
  const yLabels = $derived(uniqueInOrder(data.map((d) => d.y)));
91
101
  const plotWidth = $derived(Math.max(width - MARGIN.left - MARGIN.right, 1));
@@ -104,7 +114,7 @@
104
114
  return {
105
115
  datum,
106
116
  index,
107
- tone: datum.tone ?? toneForValue(datum.value, min, max),
117
+ tone: resolvedScale === "sequential" ? toneForValue(datum.value, min, max) : datum.tone ?? toneForValue(datum.value, min, max),
108
118
  x: MARGIN.left + xIndex * cellWidth,
109
119
  y: MARGIN.top + yIndex * cellHeight,
110
120
  width: Math.max(cellWidth - 2, 1),
@@ -134,7 +144,7 @@
134
144
  hoveredIndex = Number.isInteger(index) ? index : null;
135
145
  }
136
146
 
137
- const classes = () => ["st-heatmapChart", className].filter(Boolean).join(" ");
147
+ const classes = () => ["st-heatmapChart", `st-heatmapChart--${resolvedScale}`, className].filter(Boolean).join(" ");
138
148
  </script>
139
149
 
140
150
  <div class={classes()}>
@@ -228,6 +238,15 @@
228
238
 
229
239
  <style>
230
240
  .st-heatmapChart {
241
+ --st-heatmapChart-ramp-base: var(--st-semantic-data-category1);
242
+ --st-heatmapChart-ramp-1: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 86%, var(--st-heatmapChart-ramp-base) 14%);
243
+ --st-heatmapChart-ramp-2: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 74%, var(--st-heatmapChart-ramp-base) 26%);
244
+ --st-heatmapChart-ramp-3: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 62%, var(--st-heatmapChart-ramp-base) 38%);
245
+ --st-heatmapChart-ramp-4: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 50%, var(--st-heatmapChart-ramp-base) 50%);
246
+ --st-heatmapChart-ramp-5: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 38%, var(--st-heatmapChart-ramp-base) 62%);
247
+ --st-heatmapChart-ramp-6: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 26%, var(--st-heatmapChart-ramp-base) 74%);
248
+ --st-heatmapChart-ramp-7: color-mix(in srgb, var(--st-semantic-surface-default, Canvas) 14%, var(--st-heatmapChart-ramp-base) 86%);
249
+ --st-heatmapChart-ramp-8: var(--st-heatmapChart-ramp-base);
231
250
  color: var(--st-semantic-text-secondary);
232
251
  display: block;
233
252
  font-family: inherit;
@@ -287,6 +306,23 @@
287
306
  .st-heatmapChart__cell--category8,
288
307
  .st-heatmapChart__legendSwatch--category8 { fill: var(--st-semantic-data-category8); background: var(--st-semantic-data-category8); }
289
308
 
309
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category1,
310
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category1 { fill: var(--st-heatmapChart-ramp-1); background: var(--st-heatmapChart-ramp-1); }
311
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category2,
312
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category2 { fill: var(--st-heatmapChart-ramp-2); background: var(--st-heatmapChart-ramp-2); }
313
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category3,
314
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category3 { fill: var(--st-heatmapChart-ramp-3); background: var(--st-heatmapChart-ramp-3); }
315
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category4,
316
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category4 { fill: var(--st-heatmapChart-ramp-4); background: var(--st-heatmapChart-ramp-4); }
317
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category5,
318
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category5 { fill: var(--st-heatmapChart-ramp-5); background: var(--st-heatmapChart-ramp-5); }
319
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category6,
320
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category6 { fill: var(--st-heatmapChart-ramp-6); background: var(--st-heatmapChart-ramp-6); }
321
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category7,
322
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category7 { fill: var(--st-heatmapChart-ramp-7); background: var(--st-heatmapChart-ramp-7); }
323
+ .st-heatmapChart--sequential .st-heatmapChart__cell--category8,
324
+ .st-heatmapChart--sequential .st-heatmapChart__legendSwatch--category8 { fill: var(--st-heatmapChart-ramp-8); background: var(--st-heatmapChart-ramp-8); }
325
+
290
326
  .st-heatmapChart__legend {
291
327
  align-items: center;
292
328
  display: flex;
@@ -1,11 +1,12 @@
1
1
  /**
2
- * HeatmapChart - API canonique (référence Svelte, React/Vue doivent s'aligner)
2
+ * HeatmapChart - API canonique (référence Svelte, React/Vue/Angular doivent s'aligner)
3
3
  *
4
4
  * Props obligatoires :
5
5
  * data HeatmapChartDatum[] - tableau {x, y, value, tone?}
6
6
  * label string - aria-label du graphique
7
7
  *
8
8
  * Props optionnelles :
9
+ * scale "categorical" | "sequential" (défaut categorical)
9
10
  * legend boolean (défaut false) - affiche le gradient Low→High
10
11
  * width number (défaut 480) - largeur du viewBox en px
11
12
  * height number (défaut 300) - hauteur du viewBox en px
@@ -15,6 +16,7 @@
15
16
  * Number.isFinite). Tableau vide ou tout-NaN → rendu vide sans crash.
16
17
  */
17
18
  export type HeatmapChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
19
+ export type HeatmapChartScale = "categorical" | "sequential";
18
20
  export type HeatmapChartDatum = {
19
21
  x: string;
20
22
  y: string;
@@ -24,6 +26,7 @@ export type HeatmapChartDatum = {
24
26
  type HeatmapChartProps = {
25
27
  data: HeatmapChartDatum[];
26
28
  label: string;
29
+ scale?: HeatmapChartScale;
27
30
  legend?: boolean;
28
31
  width?: number;
29
32
  height?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"HeatmapChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/HeatmapChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAMF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqJJ,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"HeatmapChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/HeatmapChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,YAAY,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAMF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2JJ,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,144 @@
1
+ <script lang="ts" module>
2
+ export type KanbanBoardTone = "neutral" | "info" | "success" | "warning" | "error";
3
+
4
+ export interface KanbanBoardCard {
5
+ id: string;
6
+ title: string;
7
+ subtitle?: string;
8
+ owner?: string;
9
+ badgeLabel?: string;
10
+ badgeTone?: KanbanBoardTone;
11
+ progress?: number;
12
+ }
13
+
14
+ export interface KanbanBoardColumn {
15
+ label: string;
16
+ badgeTone?: KanbanBoardTone;
17
+ cards: KanbanBoardCard[];
18
+ }
19
+
20
+ export type KanbanBoardProps = {
21
+ columns: KanbanBoardColumn[];
22
+ progressLabel?: string;
23
+ };
24
+ </script>
25
+
26
+ <script lang="ts">
27
+ import Badge from "./Badge.svelte";
28
+ import Card from "./Card.svelte";
29
+ import Avatar from "./Avatar.svelte";
30
+ import ProgressBar from "./ProgressBar.svelte";
31
+
32
+ let { columns, progressLabel }: KanbanBoardProps = $props();
33
+ </script>
34
+
35
+ <div class="st-kb">
36
+ {#each columns as col}
37
+ <div class="st-kb__column">
38
+ <div class="st-kb__head">
39
+ <span class="st-kb__colLabel">{col.label}</span>
40
+ <Badge tone={col.badgeTone ?? "neutral"}>{col.cards.length}</Badge>
41
+ </div>
42
+ <div class="st-kb__body">
43
+ {#each col.cards as card (card.id)}
44
+ <Card class="st-kb__card">
45
+ <div class="st-kb__cardInner">
46
+ <div class="st-kb__cardTop">
47
+ <span class="st-kb__cardTitle">{card.title}</span>
48
+ {#if card.badgeLabel}
49
+ <Badge tone={card.badgeTone ?? "neutral"}>{card.badgeLabel}</Badge>
50
+ {/if}
51
+ </div>
52
+ {#if card.subtitle}
53
+ <span class="st-kb__cardSubtitle">{card.subtitle}</span>
54
+ {/if}
55
+ {#if card.progress !== undefined}
56
+ <ProgressBar
57
+ value={card.progress}
58
+ max={100}
59
+ label={progressLabel ?? "Progression"}
60
+ showValue
61
+ size="sm"
62
+ />
63
+ {/if}
64
+ {#if card.owner}
65
+ <div class="st-kb__cardOwner">
66
+ <Avatar name={card.owner} size="sm" />
67
+ <span class="st-kb__ownerName">{card.owner}</span>
68
+ </div>
69
+ {/if}
70
+ </div>
71
+ </Card>
72
+ {/each}
73
+ </div>
74
+ </div>
75
+ {/each}
76
+ </div>
77
+
78
+ <style>
79
+ .st-kb {
80
+ display: flex;
81
+ gap: var(--st-spacing-4, 1rem);
82
+ padding: var(--st-spacing-6, 1.5rem);
83
+ overflow-x: auto;
84
+ align-items: flex-start;
85
+ background: var(--st-semantic-surface-default);
86
+ min-block-size: 100%;
87
+ }
88
+ .st-kb__column {
89
+ display: flex;
90
+ flex-direction: column;
91
+ gap: var(--st-spacing-3, 0.75rem);
92
+ min-inline-size: 18rem;
93
+ flex-shrink: 0;
94
+ }
95
+ .st-kb__head {
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: space-between;
99
+ padding: var(--st-spacing-2, 0.5rem) var(--st-spacing-3, 0.75rem);
100
+ background: var(--st-semantic-surface-raised);
101
+ border: 1px solid var(--st-semantic-border-subtle);
102
+ border-radius: var(--st-radius-md, 0.5rem);
103
+ }
104
+ .st-kb__colLabel {
105
+ font-weight: 650;
106
+ font-size: 0.875rem;
107
+ color: var(--st-semantic-text-primary);
108
+ }
109
+ .st-kb__body {
110
+ display: flex;
111
+ flex-direction: column;
112
+ gap: var(--st-spacing-2, 0.5rem);
113
+ }
114
+ .st-kb__cardInner {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--st-spacing-2, 0.5rem);
118
+ padding: var(--st-spacing-3, 0.75rem);
119
+ }
120
+ .st-kb__cardTop {
121
+ display: flex;
122
+ align-items: flex-start;
123
+ justify-content: space-between;
124
+ gap: var(--st-spacing-2, 0.5rem);
125
+ }
126
+ .st-kb__cardTitle {
127
+ font-weight: 600;
128
+ font-size: 0.875rem;
129
+ color: var(--st-semantic-text-primary);
130
+ }
131
+ .st-kb__cardSubtitle {
132
+ font-size: 0.75rem;
133
+ color: var(--st-semantic-text-secondary);
134
+ }
135
+ .st-kb__cardOwner {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: var(--st-spacing-2, 0.5rem);
139
+ }
140
+ .st-kb__ownerName {
141
+ font-size: 0.75rem;
142
+ color: var(--st-semantic-text-secondary);
143
+ }
144
+ </style>
@@ -0,0 +1,23 @@
1
+ export type KanbanBoardTone = "neutral" | "info" | "success" | "warning" | "error";
2
+ export interface KanbanBoardCard {
3
+ id: string;
4
+ title: string;
5
+ subtitle?: string;
6
+ owner?: string;
7
+ badgeLabel?: string;
8
+ badgeTone?: KanbanBoardTone;
9
+ progress?: number;
10
+ }
11
+ export interface KanbanBoardColumn {
12
+ label: string;
13
+ badgeTone?: KanbanBoardTone;
14
+ cards: KanbanBoardCard[];
15
+ }
16
+ export type KanbanBoardProps = {
17
+ columns: KanbanBoardColumn[];
18
+ progressLabel?: string;
19
+ };
20
+ declare const KanbanBoard: import("svelte").Component<KanbanBoardProps, {}, "">;
21
+ type KanbanBoard = ReturnType<typeof KanbanBoard>;
22
+ export default KanbanBoard;
23
+ //# sourceMappingURL=KanbanBoard.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.svelte.d.ts","sourceRoot":"","sources":["../src/lib/KanbanBoard.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA4DJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}