@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
@@ -0,0 +1,222 @@
1
+ <script lang="ts" module>
2
+ export interface ObjectPageBreadcrumbItem {
3
+ label: string;
4
+ href?: string;
5
+ }
6
+
7
+ export interface ObjectPageKpi {
8
+ label: string;
9
+ value: string;
10
+ unit?: string;
11
+ }
12
+
13
+ export interface ObjectPageField {
14
+ key: string;
15
+ value: string;
16
+ }
17
+
18
+ export interface ObjectPageColumn {
19
+ key: string;
20
+ label: string;
21
+ sortable?: boolean;
22
+ align?: "start" | "center" | "end";
23
+ width?: string;
24
+ }
25
+
26
+ export interface ObjectPageRow {
27
+ id: string;
28
+ [key: string]: unknown;
29
+ }
30
+
31
+ export type ObjectPageProps = {
32
+ breadcrumb?: ObjectPageBreadcrumbItem[];
33
+ entityTitle: string;
34
+ entityStatus?: { label: string; tone: "neutral" | "info" | "success" | "warning" | "error" };
35
+ primaryAction?: string;
36
+ secondaryAction?: string;
37
+ kpis?: ObjectPageKpi[];
38
+ fieldsTitle?: string;
39
+ fields?: ObjectPageField[];
40
+ relatedTitle?: string;
41
+ relatedColumns?: ObjectPageColumn[];
42
+ relatedRows?: ObjectPageRow[];
43
+ onprimaryaction?: () => void;
44
+ onsecondaryaction?: () => void;
45
+ };
46
+ </script>
47
+
48
+ <script lang="ts">
49
+ import Badge from "./Badge.svelte";
50
+ import Button from "./Button.svelte";
51
+ import DataTable from "./DataTable.svelte";
52
+ import Breadcrumb from "./Breadcrumb.svelte";
53
+
54
+ let {
55
+ breadcrumb = [],
56
+ entityTitle,
57
+ entityStatus,
58
+ primaryAction,
59
+ secondaryAction,
60
+ kpis = [],
61
+ fieldsTitle,
62
+ fields = [],
63
+ relatedTitle,
64
+ relatedColumns = [],
65
+ relatedRows = [],
66
+ onprimaryaction,
67
+ onsecondaryaction,
68
+ }: ObjectPageProps = $props();
69
+ </script>
70
+
71
+ <div class="st-op">
72
+ {#if breadcrumb.length > 0}
73
+ <Breadcrumb items={breadcrumb} />
74
+ {/if}
75
+
76
+ <div class="st-op__header">
77
+ <div class="st-op__titleRow">
78
+ <h1 class="st-op__title">{entityTitle}</h1>
79
+ {#if entityStatus}
80
+ <Badge tone={entityStatus.tone}>{entityStatus.label}</Badge>
81
+ {/if}
82
+ </div>
83
+ <div class="st-op__actions">
84
+ {#if secondaryAction}
85
+ <Button variant="secondary" onclick={onsecondaryaction}>{secondaryAction}</Button>
86
+ {/if}
87
+ {#if primaryAction}
88
+ <Button variant="primary" onclick={onprimaryaction}>{primaryAction}</Button>
89
+ {/if}
90
+ </div>
91
+ </div>
92
+
93
+ {#if kpis.length > 0}
94
+ <div class="st-op__kpi-row">
95
+ {#each kpis as kpi}
96
+ <div class="st-op__kpi">
97
+ <span class="st-op__kpiLabel">{kpi.label}</span>
98
+ <span class="st-op__kpiValue">{kpi.value}{#if kpi.unit}<span class="st-op__kpiUnit"> {kpi.unit}</span>{/if}</span>
99
+ </div>
100
+ {/each}
101
+ </div>
102
+ {/if}
103
+
104
+ {#if fields.length > 0}
105
+ <div class="st-op__fields">
106
+ {#if fieldsTitle}
107
+ <h2 class="st-op__sectionTitle">{fieldsTitle}</h2>
108
+ {/if}
109
+ <dl class="st-op__dl">
110
+ {#each fields as field}
111
+ <div class="st-op__dlRow">
112
+ <dt class="st-op__dt">{field.key}</dt>
113
+ <dd class="st-op__dd">{field.value}</dd>
114
+ </div>
115
+ {/each}
116
+ </dl>
117
+ </div>
118
+ {/if}
119
+
120
+ {#if relatedColumns.length > 0}
121
+ <div class="st-op__related">
122
+ {#if relatedTitle}
123
+ <h2 class="st-op__sectionTitle">{relatedTitle}</h2>
124
+ {/if}
125
+ <DataTable columns={relatedColumns} rows={relatedRows} />
126
+ </div>
127
+ {/if}
128
+ </div>
129
+
130
+ <style>
131
+ .st-op {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: var(--st-spacing-6, 1.5rem);
135
+ padding: var(--st-spacing-6, 1.5rem);
136
+ background: var(--st-semantic-surface-default);
137
+ color: var(--st-semantic-text-primary);
138
+ min-block-size: 100%;
139
+ }
140
+ .st-op__header {
141
+ display: flex;
142
+ align-items: flex-start;
143
+ justify-content: space-between;
144
+ gap: var(--st-spacing-4, 1rem);
145
+ flex-wrap: wrap;
146
+ }
147
+ .st-op__titleRow {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: var(--st-spacing-3, 0.75rem);
151
+ flex-wrap: wrap;
152
+ }
153
+ .st-op__title {
154
+ font-size: 1.75rem;
155
+ font-weight: 700;
156
+ margin: 0;
157
+ }
158
+ .st-op__actions {
159
+ display: flex;
160
+ gap: var(--st-spacing-2, 0.5rem);
161
+ flex-shrink: 0;
162
+ }
163
+ .st-op__kpi-row {
164
+ display: flex;
165
+ gap: var(--st-spacing-4, 1rem);
166
+ flex-wrap: wrap;
167
+ }
168
+ .st-op__kpi {
169
+ display: flex;
170
+ flex-direction: column;
171
+ gap: var(--st-spacing-1, 0.25rem);
172
+ padding: var(--st-spacing-4, 1rem);
173
+ background: var(--st-semantic-surface-raised);
174
+ border: 1px solid var(--st-semantic-border-subtle);
175
+ border-radius: var(--st-radius-md, 0.5rem);
176
+ min-inline-size: 10rem;
177
+ }
178
+ .st-op__kpiLabel {
179
+ font-size: 0.75rem;
180
+ color: var(--st-semantic-text-secondary);
181
+ }
182
+ .st-op__kpiValue {
183
+ font-size: 1.5rem;
184
+ font-weight: 700;
185
+ }
186
+ .st-op__kpiUnit {
187
+ font-size: 0.875rem;
188
+ font-weight: 400;
189
+ color: var(--st-semantic-text-secondary);
190
+ }
191
+ .st-op__sectionTitle {
192
+ font-size: 1rem;
193
+ font-weight: 650;
194
+ margin: 0 0 var(--st-spacing-3, 0.75rem);
195
+ }
196
+ .st-op__dl {
197
+ margin: 0;
198
+ display: grid;
199
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
200
+ gap: var(--st-spacing-3, 0.75rem) var(--st-spacing-6, 1.5rem);
201
+ }
202
+ .st-op__dlRow {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 0.2rem;
206
+ }
207
+ .st-op__dt {
208
+ font-size: 0.75rem;
209
+ color: var(--st-semantic-text-secondary);
210
+ font-weight: 500;
211
+ }
212
+ .st-op__dd {
213
+ margin: 0;
214
+ font-size: 0.875rem;
215
+ color: var(--st-semantic-text-primary);
216
+ }
217
+ .st-op__fields,
218
+ .st-op__related {
219
+ display: flex;
220
+ flex-direction: column;
221
+ }
222
+ </style>
@@ -0,0 +1,46 @@
1
+ export interface ObjectPageBreadcrumbItem {
2
+ label: string;
3
+ href?: string;
4
+ }
5
+ export interface ObjectPageKpi {
6
+ label: string;
7
+ value: string;
8
+ unit?: string;
9
+ }
10
+ export interface ObjectPageField {
11
+ key: string;
12
+ value: string;
13
+ }
14
+ export interface ObjectPageColumn {
15
+ key: string;
16
+ label: string;
17
+ sortable?: boolean;
18
+ align?: "start" | "center" | "end";
19
+ width?: string;
20
+ }
21
+ export interface ObjectPageRow {
22
+ id: string;
23
+ [key: string]: unknown;
24
+ }
25
+ export type ObjectPageProps = {
26
+ breadcrumb?: ObjectPageBreadcrumbItem[];
27
+ entityTitle: string;
28
+ entityStatus?: {
29
+ label: string;
30
+ tone: "neutral" | "info" | "success" | "warning" | "error";
31
+ };
32
+ primaryAction?: string;
33
+ secondaryAction?: string;
34
+ kpis?: ObjectPageKpi[];
35
+ fieldsTitle?: string;
36
+ fields?: ObjectPageField[];
37
+ relatedTitle?: string;
38
+ relatedColumns?: ObjectPageColumn[];
39
+ relatedRows?: ObjectPageRow[];
40
+ onprimaryaction?: () => void;
41
+ onsecondaryaction?: () => void;
42
+ };
43
+ declare const ObjectPage: import("svelte").Component<ObjectPageProps, {}, "">;
44
+ type ObjectPage = ReturnType<typeof ObjectPage>;
45
+ export default ObjectPage;
46
+ //# sourceMappingURL=ObjectPage.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectPage.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ObjectPage.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE,CAAC;IAC7F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACpC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAgGJ,QAAA,MAAM,UAAU,qDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -41,8 +41,8 @@
41
41
  }
42
42
  </script>
43
43
 
44
- <ol {...rest} class={classes()}>
45
- {#each items as raw, index (index)}
44
+ {#snippet renderItems(list: OrderedListInput[])}
45
+ {#each list as raw, index (index)}
46
46
  {@const item = normalize(raw)}
47
47
  <li class="st-orderedList__item">
48
48
  {#if isSnippet(item.content)}
@@ -52,20 +52,15 @@
52
52
  {/if}
53
53
  {#if item.children && item.children.length > 0}
54
54
  <ol class="st-orderedList st-orderedList--nested">
55
- {#each item.children as childRaw, childIndex (childIndex)}
56
- {@const child = normalize(childRaw)}
57
- <li class="st-orderedList__item">
58
- {#if isSnippet(child.content)}
59
- {@render child.content()}
60
- {:else}
61
- {child.content}
62
- {/if}
63
- </li>
64
- {/each}
55
+ {@render renderItems(item.children)}
65
56
  </ol>
66
57
  {/if}
67
58
  </li>
68
59
  {/each}
60
+ {/snippet}
61
+
62
+ <ol {...rest} class={classes()}>
63
+ {@render renderItems(items)}
69
64
  </ol>
70
65
 
71
66
  <style>
@@ -1 +1 @@
1
- {"version":3,"file":"OrderedList.svelte.d.ts","sourceRoot":"","sources":["../src/lib/OrderedList.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,eAAe,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,GAAG;IACxE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA4DJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"OrderedList.svelte.d.ts","sourceRoot":"","sources":["../src/lib/OrderedList.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,eAAe,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,GAAG;IACxE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAuDJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -6,6 +6,7 @@
6
6
  page: number;
7
7
  pageCount: number;
8
8
  siblings?: number;
9
+ locale?: string;
9
10
  label?: string;
10
11
  previousLabel?: string;
11
12
  nextLabel?: string;
@@ -17,14 +18,19 @@
17
18
  page = $bindable(1),
18
19
  pageCount,
19
20
  siblings = 1,
21
+ locale = "fr-FR",
20
22
  label = "Pagination",
21
- previousLabel = "Previous page",
22
- nextLabel = "Next page",
23
+ previousLabel,
24
+ nextLabel,
23
25
  class: className,
24
26
  onPageChange,
25
27
  ...rest
26
28
  }: PaginationNavProps = $props();
27
29
 
30
+ const isFr = $derived(locale.toLowerCase().startsWith("fr"));
31
+ const resolvedPreviousLabel = $derived(previousLabel ?? (isFr ? "Page précédente" : "Previous page"));
32
+ const resolvedNextLabel = $derived(nextLabel ?? (isFr ? "Page suivante" : "Next page"));
33
+
28
34
  type Slot = number | "ellipsis-start" | "ellipsis-end";
29
35
 
30
36
  const classes = () => ["st-paginationNav", className].filter(Boolean).join(" ");
@@ -86,7 +92,7 @@
86
92
  <button
87
93
  type="button"
88
94
  class="st-paginationNav__nav"
89
- aria-label={previousLabel}
95
+ aria-label={resolvedPreviousLabel}
90
96
  disabled={page <= 1 || pageCount <= 0}
91
97
  onclick={() => go(page - 1)}
92
98
  >
@@ -117,7 +123,7 @@
117
123
  <button
118
124
  type="button"
119
125
  class="st-paginationNav__nav"
120
- aria-label={nextLabel}
126
+ aria-label={resolvedNextLabel}
121
127
  disabled={page >= pageCount || pageCount <= 0}
122
128
  onclick={() => go(page + 1)}
123
129
  >
@@ -3,6 +3,7 @@ type PaginationNavProps = Omit<HTMLAttributes<HTMLElement>, "class"> & {
3
3
  page: number;
4
4
  pageCount: number;
5
5
  siblings?: number;
6
+ locale?: string;
6
7
  label?: string;
7
8
  previousLabel?: string;
8
9
  nextLabel?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"PaginationNav.svelte.d.ts","sourceRoot":"","sources":["../src/lib/PaginationNav.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIpD,KAAK,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AA0GJ,QAAA,MAAM,aAAa,4DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"PaginationNav.svelte.d.ts","sourceRoot":"","sources":["../src/lib/PaginationNav.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIpD,KAAK,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AA+GJ,QAAA,MAAM,aAAa,4DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -30,12 +30,8 @@
30
30
  /** Prix de clôture : pilote la formation des colonnes. */
31
31
  close: number;
32
32
  };
33
- </script>
34
-
35
- <script lang="ts">
36
- import ChartDataList from "./ChartDataList.svelte";
37
33
 
38
- type PointAndFigureChartProps = {
34
+ export type PointAndFigureChartProps = {
39
35
  data: PointAndFigureChartDatum[];
40
36
  boxSize?: number;
41
37
  reversal?: number;
@@ -45,6 +41,10 @@
45
41
  size?: number;
46
42
  class?: string;
47
43
  };
44
+ </script>
45
+
46
+ <script lang="ts">
47
+ import ChartDataList from "./ChartDataList.svelte";
48
48
 
49
49
  let {
50
50
  data = [],
@@ -126,16 +126,23 @@
126
126
  // Indice de case (entier) d'un prix : quantifié sur la grille de `box`.
127
127
  const boxIndex = (price: number) => Math.floor((price - baseMin) / box + 1e-9);
128
128
 
129
+ const firstBoxIndex = boxIndex(closes[0]);
129
130
  let mark: PointAndFigureChartMark | null = null;
130
- let low = 0;
131
- let high = 0;
131
+ let low = firstBoxIndex;
132
+ let high = firstBoxIndex;
132
133
 
133
- for (let i = 0; i < closes.length; i++) {
134
+ for (let i = 1; i < closes.length; i++) {
134
135
  const idx = boxIndex(closes[i]);
135
136
  if (mark === null) {
136
- mark = "x";
137
- low = idx;
138
- high = idx;
137
+ if (idx >= firstBoxIndex + 1) {
138
+ mark = "x";
139
+ low = firstBoxIndex;
140
+ high = idx;
141
+ } else if (idx <= firstBoxIndex - 1) {
142
+ mark = "o";
143
+ low = idx;
144
+ high = firstBoxIndex;
145
+ }
139
146
  continue;
140
147
  }
141
148
  if (mark === "x") {
@@ -28,7 +28,7 @@ export type PointAndFigureChartDatum = {
28
28
  /** Prix de clôture : pilote la formation des colonnes. */
29
29
  close: number;
30
30
  };
31
- type PointAndFigureChartProps = {
31
+ export type PointAndFigureChartProps = {
32
32
  data: PointAndFigureChartDatum[];
33
33
  boxSize?: number;
34
34
  reversal?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"PointAndFigureChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/PointAndFigureChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,uBAAuB,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,MAAM,wBAAwB,GAAG;IACrC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6QJ,QAAA,MAAM,mBAAmB,8DAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"PointAndFigureChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/PointAndFigureChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,uBAAuB,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,MAAM,wBAAwB,GAAG;IACrC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAuRJ,QAAA,MAAM,mBAAmB,8DAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -30,12 +30,8 @@
30
30
  /** Prix de clôture : pilote la formation des briques. */
31
31
  close: number;
32
32
  };
33
- </script>
34
-
35
- <script lang="ts">
36
- import ChartDataList from "./ChartDataList.svelte";
37
33
 
38
- type RenkoChartProps = {
34
+ export type RenkoChartProps = {
39
35
  data: RenkoChartDatum[];
40
36
  boxSize?: number;
41
37
  label?: string;
@@ -44,6 +40,10 @@
44
40
  size?: number;
45
41
  class?: string;
46
42
  };
43
+ </script>
44
+
45
+ <script lang="ts">
46
+ import ChartDataList from "./ChartDataList.svelte";
47
47
 
48
48
  let {
49
49
  data = [],
@@ -107,31 +107,58 @@
107
107
 
108
108
  // Construit les briques Renko. Chaque brique couvre [bottom, top] (hauteur
109
109
  // boxSize) ; on en émet une à chaque franchissement de `box`. L'inversion
110
- // exige 2×box (la première brique d'un nouveau sens repart d'un cran décalé).
110
+ // exige 2×box : la première brique du nouveau sens repart un cran au-delà de
111
+ // la dernière brique du sens précédent.
111
112
  const bricks = $derived.by(() => {
112
113
  const box = effectiveBox;
113
114
  const out: { bottom: number; top: number; direction: RenkoChartDirection }[] = [];
114
115
  if (validData.length === 0 || box <= 0) return out;
115
116
 
116
- // Niveau de référence : la base de la dernière brique posée.
117
+ // Niveau de référence : extrémité de la dernière brique posée.
117
118
  let base = validData[0].close;
118
119
  let direction: RenkoChartDirection | null = null;
119
120
 
120
121
  for (let i = 1; i < validData.length; i++) {
121
122
  const price = validData[i].close;
122
- // Briques haussières tant que le prix monte d'au moins un `box`.
123
- while (price >= base + box) {
124
- out.push({ bottom: base, top: base + box, direction: "up" });
125
- base += box;
126
- direction = "up";
123
+
124
+ if (direction !== "down") {
125
+ // Briques haussières tant que le prix monte d'au moins un `box`.
126
+ while (price >= base + box) {
127
+ out.push({ bottom: base, top: base + box, direction: "up" });
128
+ base += box;
129
+ direction = "up";
130
+ }
131
+ }
132
+
133
+ if (direction === "up") {
134
+ // Inversion haussière -> baissière : il faut franchir 2×box.
135
+ if (price <= base - 2 * box) {
136
+ base -= box;
137
+ do {
138
+ out.push({ bottom: base - box, top: base, direction: "down" });
139
+ base -= box;
140
+ direction = "down";
141
+ } while (price <= base - box);
142
+ }
143
+ continue;
127
144
  }
145
+
128
146
  // Briques baissières tant que le prix descend d'au moins un `box`.
129
147
  while (price <= base - box) {
130
148
  out.push({ bottom: base - box, top: base, direction: "down" });
131
149
  base -= box;
132
150
  direction = "down";
133
151
  }
134
- void direction;
152
+
153
+ if (direction === "down" && price >= base + 2 * box) {
154
+ // Inversion baissière -> haussière : il faut franchir 2×box.
155
+ base += box;
156
+ do {
157
+ out.push({ bottom: base, top: base + box, direction: "up" });
158
+ base += box;
159
+ direction = "up";
160
+ } while (price >= base + box);
161
+ }
135
162
  }
136
163
  return out;
137
164
  });
@@ -28,7 +28,7 @@ export type RenkoChartDatum = {
28
28
  /** Prix de clôture : pilote la formation des briques. */
29
29
  close: number;
30
30
  };
31
- type RenkoChartProps = {
31
+ export type RenkoChartProps = {
32
32
  data: RenkoChartDatum[];
33
33
  boxSize?: number;
34
34
  label?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"RenkoChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/RenkoChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAkNJ,QAAA,MAAM,UAAU,qDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"RenkoChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/RenkoChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAgPJ,QAAA,MAAM,UAAU,qDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -33,12 +33,8 @@
33
33
  /** Direction en DEGRÉS (0° = +X, sens trigonométrique). */
34
34
  direction: number;
35
35
  };
36
- </script>
37
-
38
- <script lang="ts">
39
- import ChartDataList from "./ChartDataList.svelte";
40
36
 
41
- type VectorFieldChartProps = {
37
+ export type VectorFieldChartProps = {
42
38
  data: VectorFieldChartDatum[];
43
39
  label?: string;
44
40
  width?: number;
@@ -46,6 +42,10 @@
46
42
  size?: number;
47
43
  class?: string;
48
44
  };
45
+ </script>
46
+
47
+ <script lang="ts">
48
+ import ChartDataList from "./ChartDataList.svelte";
49
49
 
50
50
  let {
51
51
  data = [],
@@ -29,7 +29,7 @@ export type VectorFieldChartDatum = {
29
29
  /** Direction en DEGRÉS (0° = +X, sens trigonométrique). */
30
30
  direction: number;
31
31
  };
32
- type VectorFieldChartProps = {
32
+ export type VectorFieldChartProps = {
33
33
  data: VectorFieldChartDatum[];
34
34
  label?: string;
35
35
  width?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"VectorFieldChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/VectorFieldChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAiMJ,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"VectorFieldChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/VectorFieldChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAoMJ,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -35,12 +35,8 @@
35
35
  /** Direction (d'où vient le vent) en DEGRÉS (0° = Nord). */
36
36
  direction: number;
37
37
  };
38
- </script>
39
-
40
- <script lang="ts">
41
- import ChartDataList from "./ChartDataList.svelte";
42
38
 
43
- type WindBarbChartProps = {
39
+ export type WindBarbChartProps = {
44
40
  data: WindBarbChartDatum[];
45
41
  label?: string;
46
42
  width?: number;
@@ -48,6 +44,10 @@
48
44
  size?: number;
49
45
  class?: string;
50
46
  };
47
+ </script>
48
+
49
+ <script lang="ts">
50
+ import ChartDataList from "./ChartDataList.svelte";
51
51
 
52
52
  let {
53
53
  data = [],
@@ -31,7 +31,7 @@ export type WindBarbChartDatum = {
31
31
  /** Direction (d'où vient le vent) en DEGRÉS (0° = Nord). */
32
32
  direction: number;
33
33
  };
34
- type WindBarbChartProps = {
34
+ export type WindBarbChartProps = {
35
35
  data: WindBarbChartDatum[];
36
36
  label?: string;
37
37
  width?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"WindBarbChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/WindBarbChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,iBAAiB,GACzB,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA0NJ,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"WindBarbChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/WindBarbChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,iBAAiB,GACzB,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6NJ,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}