@sentropic/design-system-svelte 0.34.0 → 0.34.21
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/AppChrome.svelte +660 -0
- package/dist/AppChrome.svelte.d.ts +74 -0
- package/dist/AppChrome.svelte.d.ts.map +1 -0
- package/dist/AppChrome.test.d.ts +2 -0
- package/dist/AppChrome.test.d.ts.map +1 -0
- package/dist/AppChrome.test.js +122 -0
- package/dist/AppHeader.svelte +159 -1
- package/dist/AppHeader.svelte.d.ts +18 -1
- package/dist/AppHeader.svelte.d.ts.map +1 -1
- package/dist/ArcDiagramChart.svelte +380 -0
- package/dist/ArcDiagramChart.svelte.d.ts +43 -0
- package/dist/ArcDiagramChart.svelte.d.ts.map +1 -0
- package/dist/AreaRangeChart.svelte +487 -0
- package/dist/AreaRangeChart.svelte.d.ts +38 -0
- package/dist/AreaRangeChart.svelte.d.ts.map +1 -0
- package/dist/AreaSplineRangeChart.svelte +478 -0
- package/dist/AreaSplineRangeChart.svelte.d.ts +37 -0
- package/dist/AreaSplineRangeChart.svelte.d.ts.map +1 -0
- package/dist/BellCurveChart.svelte +487 -0
- package/dist/BellCurveChart.svelte.d.ts +40 -0
- package/dist/BellCurveChart.svelte.d.ts.map +1 -0
- package/dist/Calendar.svelte +11 -0
- package/dist/ChatThread.svelte +32 -1
- package/dist/ChatThread.svelte.d.ts +14 -0
- package/dist/ChatThread.svelte.d.ts.map +1 -1
- package/dist/ColumnPyramidChart.svelte +332 -0
- package/dist/ColumnPyramidChart.svelte.d.ts +35 -0
- package/dist/ColumnPyramidChart.svelte.d.ts.map +1 -0
- package/dist/ColumnRangeChart.svelte +432 -0
- package/dist/ColumnRangeChart.svelte.d.ts +42 -0
- package/dist/ColumnRangeChart.svelte.d.ts.map +1 -0
- package/dist/Combobox.svelte +3 -0
- package/dist/ConfigItemCard.svelte +303 -0
- package/dist/ConfigItemCard.svelte.d.ts +37 -0
- package/dist/ConfigItemCard.svelte.d.ts.map +1 -0
- package/dist/ContentSwitcher.svelte +1 -1
- package/dist/DatePicker.svelte +3 -0
- package/dist/DependencyWheelChart.svelte +413 -0
- package/dist/DependencyWheelChart.svelte.d.ts +42 -0
- package/dist/DependencyWheelChart.svelte.d.ts.map +1 -0
- package/dist/DumbbellChart.svelte +403 -0
- package/dist/DumbbellChart.svelte.d.ts +44 -0
- package/dist/DumbbellChart.svelte.d.ts.map +1 -0
- package/dist/ErrorBarChart.svelte +428 -0
- package/dist/ErrorBarChart.svelte.d.ts +40 -0
- package/dist/ErrorBarChart.svelte.d.ts.map +1 -0
- package/dist/FieldCard.svelte +220 -0
- package/dist/FieldCard.svelte.d.ts +28 -0
- package/dist/FieldCard.svelte.d.ts.map +1 -0
- package/dist/GanttChart.svelte +410 -0
- package/dist/GanttChart.svelte.d.ts +39 -0
- package/dist/GanttChart.svelte.d.ts.map +1 -0
- package/dist/HLCChart.svelte +330 -0
- package/dist/HLCChart.svelte.d.ts +32 -0
- package/dist/HLCChart.svelte.d.ts.map +1 -0
- package/dist/HeikinAshiChart.svelte +365 -0
- package/dist/HeikinAshiChart.svelte.d.ts +37 -0
- package/dist/HeikinAshiChart.svelte.d.ts.map +1 -0
- package/dist/HollowCandlestickChart.svelte +357 -0
- package/dist/HollowCandlestickChart.svelte.d.ts +34 -0
- package/dist/HollowCandlestickChart.svelte.d.ts.map +1 -0
- package/dist/Input.svelte +3 -0
- package/dist/ItemChart.svelte +389 -0
- package/dist/ItemChart.svelte.d.ts +67 -0
- package/dist/ItemChart.svelte.d.ts.map +1 -0
- package/dist/LollipopChart.svelte +1 -1
- package/dist/MultiSelect.svelte +3 -0
- package/dist/NumberInput.svelte +3 -0
- package/dist/OHLCChart.svelte +343 -0
- package/dist/OHLCChart.svelte.d.ts +33 -0
- package/dist/OHLCChart.svelte.d.ts.map +1 -0
- package/dist/OrganizationChart.svelte +284 -0
- package/dist/OrganizationChart.svelte.d.ts +19 -0
- package/dist/OrganizationChart.svelte.d.ts.map +1 -0
- package/dist/PasswordInput.svelte +3 -0
- package/dist/PolygonChart.svelte +189 -0
- package/dist/PolygonChart.svelte.d.ts +17 -0
- package/dist/PolygonChart.svelte.d.ts.map +1 -0
- package/dist/ScoreCard.svelte +172 -0
- package/dist/ScoreCard.svelte.d.ts +27 -0
- package/dist/ScoreCard.svelte.d.ts.map +1 -0
- package/dist/Search.svelte +7 -5
- package/dist/Select.svelte +3 -0
- package/dist/StreamgraphChart.svelte +283 -0
- package/dist/StreamgraphChart.svelte.d.ts +23 -0
- package/dist/StreamgraphChart.svelte.d.ts.map +1 -0
- package/dist/StreamingMessage.svelte +44 -2
- package/dist/StreamingMessage.svelte.d.ts +18 -1
- package/dist/StreamingMessage.svelte.d.ts.map +1 -1
- package/dist/TileMapChart.svelte +314 -0
- package/dist/TileMapChart.svelte.d.ts +45 -0
- package/dist/TileMapChart.svelte.d.ts.map +1 -0
- package/dist/TimePicker.svelte +3 -0
- package/dist/TimelineChart.svelte +362 -0
- package/dist/TimelineChart.svelte.d.ts +22 -0
- package/dist/TimelineChart.svelte.d.ts.map +1 -0
- package/dist/TreegraphChart.svelte +281 -0
- package/dist/TreegraphChart.svelte.d.ts +19 -0
- package/dist/TreegraphChart.svelte.d.ts.map +1 -0
- package/dist/VariablePieChart.svelte +313 -0
- package/dist/VariablePieChart.svelte.d.ts +52 -0
- package/dist/VariablePieChart.svelte.d.ts.map +1 -0
- package/dist/VennChart.svelte +348 -0
- package/dist/VennChart.svelte.d.ts +72 -0
- package/dist/VennChart.svelte.d.ts.map +1 -0
- package/dist/WordCloudChart.svelte +279 -0
- package/dist/WordCloudChart.svelte.d.ts +18 -0
- package/dist/WordCloudChart.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -0
- package/package.json +5 -3
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
/**
|
|
3
|
+
* HeikinAshiChart - chandeliers Heikin-Ashi (finance lissée).
|
|
4
|
+
* Mêmes données OHLC que CandlestickChart, mais valeurs RECALCULÉES en Heikin-Ashi :
|
|
5
|
+
* haClose = (open + high + low + close) / 4
|
|
6
|
+
* haOpen = 1re bougie : (open + close) / 2 ; sinon (haOpen_prev + haClose_prev) / 2
|
|
7
|
+
* haHigh = max(high, haOpen, haClose)
|
|
8
|
+
* haLow = min(low, haOpen, haClose)
|
|
9
|
+
* Couleur hausse (haClose ≥ haOpen) / baisse via les mêmes tokens que Candlestick.
|
|
10
|
+
* API canonique (référence Svelte, React/Vue doivent s'aligner)
|
|
11
|
+
*
|
|
12
|
+
* Props obligatoires :
|
|
13
|
+
* data HeikinAshiChartDatum[] - tableau {label, open, high, low, close}
|
|
14
|
+
* label string
|
|
15
|
+
*
|
|
16
|
+
* Props optionnelles :
|
|
17
|
+
* width number (défaut 480)
|
|
18
|
+
* height number (défaut 240)
|
|
19
|
+
* class string
|
|
20
|
+
*/
|
|
21
|
+
export type HeikinAshiChartDatum = {
|
|
22
|
+
label: string;
|
|
23
|
+
open: number;
|
|
24
|
+
high: number;
|
|
25
|
+
low: number;
|
|
26
|
+
close: number;
|
|
27
|
+
};
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<script lang="ts">
|
|
31
|
+
import ChartDataList from "./ChartDataList.svelte";
|
|
32
|
+
|
|
33
|
+
type HeikinAshiChartProps = {
|
|
34
|
+
data: HeikinAshiChartDatum[];
|
|
35
|
+
label: string;
|
|
36
|
+
width?: number;
|
|
37
|
+
height?: number;
|
|
38
|
+
class?: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
let {
|
|
42
|
+
data = [],
|
|
43
|
+
label,
|
|
44
|
+
width = 480,
|
|
45
|
+
height = 240,
|
|
46
|
+
class: className
|
|
47
|
+
}: HeikinAshiChartProps = $props();
|
|
48
|
+
|
|
49
|
+
const MARGIN = { top: 12, right: 16, bottom: 32, left: 52 };
|
|
50
|
+
|
|
51
|
+
type HACandle = {
|
|
52
|
+
label: string;
|
|
53
|
+
haOpen: number;
|
|
54
|
+
haHigh: number;
|
|
55
|
+
haLow: number;
|
|
56
|
+
haClose: number;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function scaleLinear(v: number, d0: number, d1: number, r0: number, r1: number) {
|
|
60
|
+
if (d1 === d0) return r0;
|
|
61
|
+
return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function niceTicks(min: number, max: number, target = 5): number[] {
|
|
65
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
|
|
66
|
+
const base = Number.isFinite(max) ? max : 0;
|
|
67
|
+
return [base];
|
|
68
|
+
}
|
|
69
|
+
const range = max - min;
|
|
70
|
+
const rough = range / Math.max(target - 1, 1);
|
|
71
|
+
const pow = Math.pow(10, Math.floor(Math.log10(rough)));
|
|
72
|
+
const norm = rough / pow;
|
|
73
|
+
let step: number;
|
|
74
|
+
if (norm < 1.5) step = 1 * pow;
|
|
75
|
+
else if (norm < 3) step = 2 * pow;
|
|
76
|
+
else if (norm < 7) step = 5 * pow;
|
|
77
|
+
else step = 10 * pow;
|
|
78
|
+
const start = Math.floor(min / step) * step;
|
|
79
|
+
const end = Math.ceil(max / step) * step;
|
|
80
|
+
const ticks: number[] = [];
|
|
81
|
+
for (let v = start; v <= end + step / 2; v += step) {
|
|
82
|
+
ticks.push(Number(v.toFixed(10)));
|
|
83
|
+
}
|
|
84
|
+
return ticks;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function formatTick(v: number): string {
|
|
88
|
+
if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
|
|
89
|
+
if (Number.isInteger(v)) return String(v);
|
|
90
|
+
return v.toFixed(1);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function fmt(v: number): string {
|
|
94
|
+
return Number.isInteger(v) ? String(v) : v.toFixed(2);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Heikin-Ashi : récurrence sur haOpen
|
|
98
|
+
function computeHeikinAshi(rows: HeikinAshiChartDatum[]): HACandle[] {
|
|
99
|
+
const out: HACandle[] = [];
|
|
100
|
+
for (let i = 0; i < rows.length; i++) {
|
|
101
|
+
const d = rows[i];
|
|
102
|
+
const haClose = (d.open + d.high + d.low + d.close) / 4;
|
|
103
|
+
const haOpen =
|
|
104
|
+
i === 0
|
|
105
|
+
? (d.open + d.close) / 2
|
|
106
|
+
: (out[i - 1].haOpen + out[i - 1].haClose) / 2;
|
|
107
|
+
const haHigh = Math.max(d.high, haOpen, haClose);
|
|
108
|
+
const haLow = Math.min(d.low, haOpen, haClose);
|
|
109
|
+
out.push({ label: d.label, haOpen, haHigh, haLow, haClose });
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let hoveredIndex: number | null = $state(null);
|
|
115
|
+
|
|
116
|
+
const plotWidth = $derived(Math.max(width - MARGIN.left - MARGIN.right, 1));
|
|
117
|
+
const plotHeight = $derived(Math.max(height - MARGIN.top - MARGIN.bottom, 1));
|
|
118
|
+
|
|
119
|
+
// Filtrer les bougies invalides AVANT le calcul HA et le domaine
|
|
120
|
+
const validData = $derived(
|
|
121
|
+
data.filter((d) =>
|
|
122
|
+
Number.isFinite(d.open) &&
|
|
123
|
+
Number.isFinite(d.high) &&
|
|
124
|
+
Number.isFinite(d.low) &&
|
|
125
|
+
Number.isFinite(d.close)
|
|
126
|
+
)
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const haData = $derived(computeHeikinAshi(validData));
|
|
130
|
+
|
|
131
|
+
const domainBounds = $derived.by(() => {
|
|
132
|
+
const allVals: number[] = [];
|
|
133
|
+
for (const d of haData) {
|
|
134
|
+
// Domaine sur les valeurs HA (haOpen/haHigh/haLow/haClose)
|
|
135
|
+
allVals.push(d.haOpen, d.haHigh, d.haLow, d.haClose);
|
|
136
|
+
}
|
|
137
|
+
if (allVals.length === 0) return { rawMin: 0, rawMax: 1 };
|
|
138
|
+
const rawMin = Math.min(...allVals);
|
|
139
|
+
const rawMax = Math.max(...allVals);
|
|
140
|
+
// Domaine plat → fallback range 1 pour éviter division par 0
|
|
141
|
+
return { rawMin, rawMax: rawMax === rawMin ? rawMin + 1 : rawMax };
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const ticks = $derived(niceTicks(domainBounds.rawMin, domainBounds.rawMax, 5));
|
|
145
|
+
const domainMin = $derived(ticks[0]);
|
|
146
|
+
const domainMax = $derived(ticks[ticks.length - 1]);
|
|
147
|
+
|
|
148
|
+
const candles = $derived.by(() => {
|
|
149
|
+
if (haData.length === 0) return [];
|
|
150
|
+
const band = plotWidth / haData.length;
|
|
151
|
+
const bodyW = band * 0.55;
|
|
152
|
+
|
|
153
|
+
return haData.map((d, i) => {
|
|
154
|
+
const bullish = d.haClose >= d.haOpen;
|
|
155
|
+
const centerX = MARGIN.left + band * i + band / 2;
|
|
156
|
+
|
|
157
|
+
const bodyTop = MARGIN.top + scaleLinear(Math.max(d.haOpen, d.haClose), domainMin, domainMax, plotHeight, 0);
|
|
158
|
+
const bodyBot = MARGIN.top + scaleLinear(Math.min(d.haOpen, d.haClose), domainMin, domainMax, plotHeight, 0);
|
|
159
|
+
const highY = MARGIN.top + scaleLinear(d.haHigh, domainMin, domainMax, plotHeight, 0);
|
|
160
|
+
const lowY = MARGIN.top + scaleLinear(d.haLow, domainMin, domainMax, plotHeight, 0);
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
datum: d,
|
|
164
|
+
index: i,
|
|
165
|
+
bullish,
|
|
166
|
+
centerX,
|
|
167
|
+
bodyX: centerX - bodyW / 2,
|
|
168
|
+
bodyY: bodyTop,
|
|
169
|
+
bodyW,
|
|
170
|
+
bodyH: Math.max(bodyBot - bodyTop, 0.5),
|
|
171
|
+
wickHighY: highY,
|
|
172
|
+
wickLowY: lowY,
|
|
173
|
+
tooltipY: bodyTop
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
const dataValueItems = $derived(
|
|
179
|
+
haData.map((d) => `${d.label}: O ${fmt(d.haOpen)} H ${fmt(d.haHigh)} L ${fmt(d.haLow)} C ${fmt(d.haClose)}`)
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
function handlePointerMove(event: PointerEvent) {
|
|
183
|
+
const target = event.target;
|
|
184
|
+
if (!(target instanceof Element)) { hoveredIndex = null; return; }
|
|
185
|
+
const idx = Number(target.getAttribute("data-chart-index"));
|
|
186
|
+
hoveredIndex = Number.isInteger(idx) ? idx : null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const classes = () => ["st-heikinAshiChart", className].filter(Boolean).join(" ");
|
|
190
|
+
</script>
|
|
191
|
+
|
|
192
|
+
<div class={classes()}>
|
|
193
|
+
<div
|
|
194
|
+
class="st-heikinAshiChart__visual"
|
|
195
|
+
role="img"
|
|
196
|
+
aria-label={label}
|
|
197
|
+
onpointermove={handlePointerMove}
|
|
198
|
+
onpointerleave={() => (hoveredIndex = null)}
|
|
199
|
+
>
|
|
200
|
+
<svg
|
|
201
|
+
viewBox="0 0 {width} {height}"
|
|
202
|
+
preserveAspectRatio="xMidYMid meet"
|
|
203
|
+
width="100%"
|
|
204
|
+
height="100%"
|
|
205
|
+
focusable="false"
|
|
206
|
+
aria-hidden="true"
|
|
207
|
+
>
|
|
208
|
+
<!-- gridlines + tick labels -->
|
|
209
|
+
{#each ticks as tick (tick)}
|
|
210
|
+
{@const ty = MARGIN.top + scaleLinear(tick, domainMin, domainMax, plotHeight, 0)}
|
|
211
|
+
<line class="st-heikinAshiChart__grid" x1={MARGIN.left} x2={width - MARGIN.right} y1={ty} y2={ty} />
|
|
212
|
+
<text class="st-heikinAshiChart__tickLabel" x={MARGIN.left - 6} y={ty} text-anchor="end" dominant-baseline="middle">
|
|
213
|
+
{formatTick(tick)}
|
|
214
|
+
</text>
|
|
215
|
+
{/each}
|
|
216
|
+
|
|
217
|
+
<!-- axes -->
|
|
218
|
+
<line class="st-heikinAshiChart__axis" x1={MARGIN.left} x2={MARGIN.left} y1={MARGIN.top} y2={height - MARGIN.bottom} />
|
|
219
|
+
<line class="st-heikinAshiChart__axis" x1={MARGIN.left} x2={width - MARGIN.right} y1={height - MARGIN.bottom} y2={height - MARGIN.bottom} />
|
|
220
|
+
|
|
221
|
+
{#each candles as c, i (`${i}-${c.datum.label}`)}
|
|
222
|
+
<!-- wick -->
|
|
223
|
+
<line
|
|
224
|
+
class="st-heikinAshiChart__wick st-heikinAshiChart__wick--{c.bullish ? 'up' : 'down'}"
|
|
225
|
+
x1={c.centerX}
|
|
226
|
+
x2={c.centerX}
|
|
227
|
+
y1={c.wickHighY}
|
|
228
|
+
y2={c.wickLowY}
|
|
229
|
+
data-chart-index={i}
|
|
230
|
+
/>
|
|
231
|
+
<!-- body -->
|
|
232
|
+
<rect
|
|
233
|
+
class="st-heikinAshiChart__body st-heikinAshiChart__body--{c.bullish ? 'up' : 'down'}"
|
|
234
|
+
class:st-heikinAshiChart__body--dim={hoveredIndex !== null && hoveredIndex !== i}
|
|
235
|
+
x={c.bodyX}
|
|
236
|
+
y={c.bodyY}
|
|
237
|
+
width={c.bodyW}
|
|
238
|
+
height={c.bodyH}
|
|
239
|
+
rx="1"
|
|
240
|
+
data-chart-index={i}
|
|
241
|
+
/>
|
|
242
|
+
<!-- category label -->
|
|
243
|
+
<text
|
|
244
|
+
class="st-heikinAshiChart__categoryLabel"
|
|
245
|
+
x={c.centerX}
|
|
246
|
+
y={height - MARGIN.bottom + 16}
|
|
247
|
+
text-anchor="middle"
|
|
248
|
+
>
|
|
249
|
+
{c.datum.label}
|
|
250
|
+
</text>
|
|
251
|
+
{/each}
|
|
252
|
+
</svg>
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
<ChartDataList {label} items={dataValueItems} />
|
|
256
|
+
|
|
257
|
+
{#if hoveredIndex !== null && candles[hoveredIndex]}
|
|
258
|
+
{@const c = candles[hoveredIndex]}
|
|
259
|
+
<div
|
|
260
|
+
class="st-heikinAshiChart__tooltip"
|
|
261
|
+
role="presentation"
|
|
262
|
+
style="left: {(c.centerX / width) * 100}%; top: {(c.tooltipY / height) * 100}%"
|
|
263
|
+
>
|
|
264
|
+
<span class="st-heikinAshiChart__tooltipLabel">{c.datum.label}</span>
|
|
265
|
+
<span class="st-heikinAshiChart__tooltipValue">O {fmt(c.datum.haOpen)} H {fmt(c.datum.haHigh)} L {fmt(c.datum.haLow)} C {fmt(c.datum.haClose)}</span>
|
|
266
|
+
</div>
|
|
267
|
+
{/if}
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<style>
|
|
271
|
+
.st-heikinAshiChart {
|
|
272
|
+
color: var(--st-semantic-text-secondary);
|
|
273
|
+
display: block;
|
|
274
|
+
font-family: inherit;
|
|
275
|
+
position: relative;
|
|
276
|
+
width: 100%;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.st-heikinAshiChart svg {
|
|
280
|
+
display: block;
|
|
281
|
+
overflow: visible;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.st-heikinAshiChart__visual {
|
|
285
|
+
display: block;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.st-heikinAshiChart__axis {
|
|
289
|
+
stroke: var(--st-semantic-border-subtle);
|
|
290
|
+
stroke-width: 1;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.st-heikinAshiChart__grid {
|
|
294
|
+
stroke: var(--st-semantic-border-subtle);
|
|
295
|
+
stroke-dasharray: 2 3;
|
|
296
|
+
stroke-width: 1;
|
|
297
|
+
opacity: 0.7;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.st-heikinAshiChart__wick {
|
|
301
|
+
stroke-width: 1.5;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.st-heikinAshiChart__wick--up {
|
|
305
|
+
stroke: var(--st-semantic-feedback-success);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.st-heikinAshiChart__wick--down {
|
|
309
|
+
stroke: var(--st-semantic-feedback-error);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.st-heikinAshiChart__body {
|
|
313
|
+
cursor: pointer;
|
|
314
|
+
transition: opacity 120ms ease;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.st-heikinAshiChart__body--dim {
|
|
318
|
+
opacity: 0.4;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.st-heikinAshiChart__body--up {
|
|
322
|
+
fill: var(--st-semantic-feedback-success);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.st-heikinAshiChart__body--down {
|
|
326
|
+
fill: var(--st-semantic-feedback-error);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
@media (prefers-reduced-motion: reduce) {
|
|
330
|
+
.st-heikinAshiChart__body {
|
|
331
|
+
transition: none;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.st-heikinAshiChart__tickLabel,
|
|
336
|
+
.st-heikinAshiChart__categoryLabel {
|
|
337
|
+
fill: var(--st-semantic-text-secondary);
|
|
338
|
+
font-size: 0.6875rem;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.st-heikinAshiChart__tooltip {
|
|
342
|
+
background: var(--st-semantic-surface-inverse);
|
|
343
|
+
border-radius: var(--st-radius-sm, 0.25rem);
|
|
344
|
+
color: var(--st-semantic-text-inverse);
|
|
345
|
+
display: inline-flex;
|
|
346
|
+
flex-direction: column;
|
|
347
|
+
font-size: 0.75rem;
|
|
348
|
+
gap: 0.125rem;
|
|
349
|
+
line-height: 1.2;
|
|
350
|
+
padding: 0.375rem 0.5rem;
|
|
351
|
+
pointer-events: none;
|
|
352
|
+
position: absolute;
|
|
353
|
+
transform: translate(-50%, calc(-100% - 8px));
|
|
354
|
+
white-space: nowrap;
|
|
355
|
+
z-index: 1;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.st-heikinAshiChart__tooltipLabel {
|
|
359
|
+
font-weight: 600;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.st-heikinAshiChart__tooltipValue {
|
|
363
|
+
opacity: 0.85;
|
|
364
|
+
}
|
|
365
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeikinAshiChart - chandeliers Heikin-Ashi (finance lissée).
|
|
3
|
+
* Mêmes données OHLC que CandlestickChart, mais valeurs RECALCULÉES en Heikin-Ashi :
|
|
4
|
+
* haClose = (open + high + low + close) / 4
|
|
5
|
+
* haOpen = 1re bougie : (open + close) / 2 ; sinon (haOpen_prev + haClose_prev) / 2
|
|
6
|
+
* haHigh = max(high, haOpen, haClose)
|
|
7
|
+
* haLow = min(low, haOpen, haClose)
|
|
8
|
+
* Couleur hausse (haClose ≥ haOpen) / baisse via les mêmes tokens que Candlestick.
|
|
9
|
+
* API canonique (référence Svelte, React/Vue doivent s'aligner)
|
|
10
|
+
*
|
|
11
|
+
* Props obligatoires :
|
|
12
|
+
* data HeikinAshiChartDatum[] - tableau {label, open, high, low, close}
|
|
13
|
+
* label string
|
|
14
|
+
*
|
|
15
|
+
* Props optionnelles :
|
|
16
|
+
* width number (défaut 480)
|
|
17
|
+
* height number (défaut 240)
|
|
18
|
+
* class string
|
|
19
|
+
*/
|
|
20
|
+
export type HeikinAshiChartDatum = {
|
|
21
|
+
label: string;
|
|
22
|
+
open: number;
|
|
23
|
+
high: number;
|
|
24
|
+
low: number;
|
|
25
|
+
close: number;
|
|
26
|
+
};
|
|
27
|
+
type HeikinAshiChartProps = {
|
|
28
|
+
data: HeikinAshiChartDatum[];
|
|
29
|
+
label: string;
|
|
30
|
+
width?: number;
|
|
31
|
+
height?: number;
|
|
32
|
+
class?: string;
|
|
33
|
+
};
|
|
34
|
+
declare const HeikinAshiChart: import("svelte").Component<HeikinAshiChartProps, {}, "">;
|
|
35
|
+
type HeikinAshiChart = ReturnType<typeof HeikinAshiChart>;
|
|
36
|
+
export default HeikinAshiChart;
|
|
37
|
+
//# sourceMappingURL=HeikinAshiChart.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeikinAshiChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/HeikinAshiChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2MJ,QAAA,MAAM,eAAe,0DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|