@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,189 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export type PolygonChartTone =
|
|
3
|
+
| "category1" | "category2" | "category3" | "category4"
|
|
4
|
+
| "category5" | "category6" | "category7" | "category8";
|
|
5
|
+
|
|
6
|
+
export type PolygonChartPoint = {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
};
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script lang="ts">
|
|
13
|
+
import ChartDataList from "./ChartDataList.svelte";
|
|
14
|
+
|
|
15
|
+
type PolygonChartProps = {
|
|
16
|
+
data: PolygonChartPoint[];
|
|
17
|
+
label: string;
|
|
18
|
+
tone?: PolygonChartTone;
|
|
19
|
+
width?: number;
|
|
20
|
+
height?: number;
|
|
21
|
+
class?: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
data,
|
|
26
|
+
label,
|
|
27
|
+
tone = "category1",
|
|
28
|
+
width = 480,
|
|
29
|
+
height = 360,
|
|
30
|
+
class: className
|
|
31
|
+
}: PolygonChartProps = $props();
|
|
32
|
+
|
|
33
|
+
const MARGIN = { top: 14, right: 18, bottom: 36, left: 48 };
|
|
34
|
+
|
|
35
|
+
function niceTicks(min: number, max: number, target = 5): number[] {
|
|
36
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
|
|
37
|
+
return [Number.isFinite(max) ? max : 0];
|
|
38
|
+
}
|
|
39
|
+
const range = max - min;
|
|
40
|
+
const rough = range / Math.max(target - 1, 1);
|
|
41
|
+
const pow = Math.pow(10, Math.floor(Math.log10(rough)));
|
|
42
|
+
const norm = rough / pow;
|
|
43
|
+
let step: number;
|
|
44
|
+
if (norm < 1.5) step = pow;
|
|
45
|
+
else if (norm < 3) step = 2 * pow;
|
|
46
|
+
else if (norm < 7) step = 5 * pow;
|
|
47
|
+
else step = 10 * pow;
|
|
48
|
+
const start = Math.floor(min / step) * step;
|
|
49
|
+
const end = Math.ceil(max / step) * step;
|
|
50
|
+
const ticks: number[] = [];
|
|
51
|
+
for (let v = start; v <= end + step / 2; v += step) ticks.push(Number(v.toFixed(10)));
|
|
52
|
+
return ticks;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function scaleLinear(v: number, d0: number, d1: number, r0: number, r1: number) {
|
|
56
|
+
if (d1 === d0) return r0;
|
|
57
|
+
return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function fmt(v: number): string {
|
|
61
|
+
if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
|
|
62
|
+
return Number.isInteger(v) ? String(v) : v.toFixed(1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let hoveredIndex: number | null = $state(null);
|
|
66
|
+
|
|
67
|
+
// Non-finite coordinates are dropped before anything else.
|
|
68
|
+
const validData = $derived(
|
|
69
|
+
(data ?? []).filter((d) => Number.isFinite(d.x) && Number.isFinite(d.y))
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const scales = $derived.by(() => {
|
|
73
|
+
const xs = validData.map((d) => d.x);
|
|
74
|
+
const ys = validData.map((d) => d.y);
|
|
75
|
+
const xTicks = niceTicks(Math.min(...xs), Math.max(...xs));
|
|
76
|
+
const yTicks = niceTicks(Math.min(...ys), Math.max(...ys));
|
|
77
|
+
const plotW = Math.max(width - MARGIN.left - MARGIN.right, 1);
|
|
78
|
+
const plotH = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
|
|
79
|
+
return {
|
|
80
|
+
xTicks, yTicks,
|
|
81
|
+
xMin: xTicks[0], xMax: xTicks[xTicks.length - 1],
|
|
82
|
+
yMin: yTicks[0], yMax: yTicks[yTicks.length - 1],
|
|
83
|
+
plotW, plotH
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const points = $derived.by(() => {
|
|
88
|
+
const { xMin, xMax, yMin, yMax, plotW, plotH } = scales;
|
|
89
|
+
return validData.map((d) => ({
|
|
90
|
+
cx: MARGIN.left + scaleLinear(d.x, xMin, xMax, 0, plotW),
|
|
91
|
+
cy: MARGIN.top + scaleLinear(d.y, yMin, yMax, plotH, 0),
|
|
92
|
+
datum: d
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const polygonPoints = $derived(points.map((p) => `${p.cx},${p.cy}`).join(" "));
|
|
97
|
+
|
|
98
|
+
const dataValueItems = $derived(validData.map((d) => `x ${d.x}, y ${d.y}`));
|
|
99
|
+
|
|
100
|
+
function handleVisualPointerMove(event: PointerEvent) {
|
|
101
|
+
const target = event.target;
|
|
102
|
+
if (!(target instanceof Element)) {
|
|
103
|
+
hoveredIndex = null;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const index = Number(target.getAttribute("data-chart-index"));
|
|
107
|
+
hoveredIndex = Number.isInteger(index) ? index : null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const classes = () => ["st-polygonChart", className].filter(Boolean).join(" ");
|
|
111
|
+
</script>
|
|
112
|
+
|
|
113
|
+
<div class={classes()}>
|
|
114
|
+
<div
|
|
115
|
+
class="st-polygonChart__visual"
|
|
116
|
+
role="img"
|
|
117
|
+
aria-label={label}
|
|
118
|
+
onpointermove={handleVisualPointerMove}
|
|
119
|
+
onpointerleave={() => (hoveredIndex = null)}
|
|
120
|
+
>
|
|
121
|
+
<svg viewBox="0 0 {width} {height}" preserveAspectRatio="xMidYMid meet" width="100%" height="100%" focusable="false" aria-hidden="true">
|
|
122
|
+
<!-- gridlines + ticks Y -->
|
|
123
|
+
{#each scales.yTicks as t (t)}
|
|
124
|
+
{@const y = MARGIN.top + scaleLinear(t, scales.yMin, scales.yMax, scales.plotH, 0)}
|
|
125
|
+
<line class="st-polygonChart__grid" x1={MARGIN.left} x2={width - MARGIN.right} y1={y} y2={y} />
|
|
126
|
+
<text class="st-polygonChart__tick" x={MARGIN.left - 6} y={y} text-anchor="end" dominant-baseline="middle">{fmt(t)}</text>
|
|
127
|
+
{/each}
|
|
128
|
+
<!-- ticks X -->
|
|
129
|
+
{#each scales.xTicks as t (t)}
|
|
130
|
+
{@const x = MARGIN.left + scaleLinear(t, scales.xMin, scales.xMax, 0, scales.plotW)}
|
|
131
|
+
<text class="st-polygonChart__tick" x={x} y={height - MARGIN.bottom + 16} text-anchor="middle">{fmt(t)}</text>
|
|
132
|
+
{/each}
|
|
133
|
+
|
|
134
|
+
<!-- axes -->
|
|
135
|
+
<line class="st-polygonChart__axis" x1={MARGIN.left} x2={MARGIN.left} y1={MARGIN.top} y2={height - MARGIN.bottom} />
|
|
136
|
+
<line class="st-polygonChart__axis" x1={MARGIN.left} x2={width - MARGIN.right} y1={height - MARGIN.bottom} y2={height - MARGIN.bottom} />
|
|
137
|
+
|
|
138
|
+
<!-- closed filled polygon connecting the points in order -->
|
|
139
|
+
{#if points.length >= 2}
|
|
140
|
+
<polygon class="st-polygonChart__polygon st-polygonChart__polygon--{tone}" points={polygonPoints} />
|
|
141
|
+
{/if}
|
|
142
|
+
|
|
143
|
+
<!-- vertex markers -->
|
|
144
|
+
{#each points as p, i (i)}
|
|
145
|
+
<circle
|
|
146
|
+
class="st-polygonChart__vertex st-polygonChart__vertex--{tone}"
|
|
147
|
+
cx={p.cx}
|
|
148
|
+
cy={p.cy}
|
|
149
|
+
r="3.5"
|
|
150
|
+
data-chart-index={i}
|
|
151
|
+
/>
|
|
152
|
+
{/each}
|
|
153
|
+
</svg>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<ChartDataList {label} items={dataValueItems} />
|
|
157
|
+
|
|
158
|
+
{#if hoveredIndex !== null && points[hoveredIndex]}
|
|
159
|
+
{@const p = points[hoveredIndex]}
|
|
160
|
+
<div class="st-polygonChart__tooltip" role="presentation" style="left: {(p.cx / width) * 100}%; top: {(p.cy / height) * 100}%">
|
|
161
|
+
<span class="st-polygonChart__tooltipValue">x {p.datum.x} · y {p.datum.y}</span>
|
|
162
|
+
</div>
|
|
163
|
+
{/if}
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<style>
|
|
167
|
+
.st-polygonChart { color: var(--st-semantic-text-secondary); display: block; font-family: inherit; position: relative; width: 100%; }
|
|
168
|
+
.st-polygonChart svg, .st-polygonChart__visual { display: block; overflow: visible; }
|
|
169
|
+
.st-polygonChart__grid { stroke: var(--st-semantic-border-subtle); stroke-dasharray: 2 3; stroke-width: 1; opacity: 0.7; }
|
|
170
|
+
.st-polygonChart__axis { stroke: var(--st-semantic-border-subtle); stroke-width: 1; }
|
|
171
|
+
.st-polygonChart__tick { fill: var(--st-semantic-text-secondary); font-size: 0.6875rem; }
|
|
172
|
+
.st-polygonChart__polygon { fill: currentColor; fill-opacity: 0.18; stroke: currentColor; stroke-width: 2; stroke-linejoin: round; }
|
|
173
|
+
.st-polygonChart__vertex { fill: currentColor; }
|
|
174
|
+
.st-polygonChart__polygon--category1, .st-polygonChart__vertex--category1 { color: var(--st-semantic-data-category1); }
|
|
175
|
+
.st-polygonChart__polygon--category2, .st-polygonChart__vertex--category2 { color: var(--st-semantic-data-category2); }
|
|
176
|
+
.st-polygonChart__polygon--category3, .st-polygonChart__vertex--category3 { color: var(--st-semantic-data-category3); }
|
|
177
|
+
.st-polygonChart__polygon--category4, .st-polygonChart__vertex--category4 { color: var(--st-semantic-data-category4); }
|
|
178
|
+
.st-polygonChart__polygon--category5, .st-polygonChart__vertex--category5 { color: var(--st-semantic-data-category5); }
|
|
179
|
+
.st-polygonChart__polygon--category6, .st-polygonChart__vertex--category6 { color: var(--st-semantic-data-category6); }
|
|
180
|
+
.st-polygonChart__polygon--category7, .st-polygonChart__vertex--category7 { color: var(--st-semantic-data-category7); }
|
|
181
|
+
.st-polygonChart__polygon--category8, .st-polygonChart__vertex--category8 { color: var(--st-semantic-data-category8); }
|
|
182
|
+
.st-polygonChart__tooltip {
|
|
183
|
+
background: var(--st-semantic-surface-inverse); border-radius: var(--st-radius-sm, 0.25rem);
|
|
184
|
+
color: var(--st-semantic-text-inverse); display: inline-flex; flex-direction: column;
|
|
185
|
+
font-size: 0.75rem; gap: 0.125rem; line-height: 1.2; padding: 0.375rem 0.5rem;
|
|
186
|
+
pointer-events: none; position: absolute; transform: translate(-50%, calc(-100% - 8px)); white-space: nowrap; z-index: 1;
|
|
187
|
+
}
|
|
188
|
+
.st-polygonChart__tooltipValue { opacity: 0.85; }
|
|
189
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type PolygonChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
2
|
+
export type PolygonChartPoint = {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
};
|
|
6
|
+
type PolygonChartProps = {
|
|
7
|
+
data: PolygonChartPoint[];
|
|
8
|
+
label: string;
|
|
9
|
+
tone?: PolygonChartTone;
|
|
10
|
+
width?: number;
|
|
11
|
+
height?: number;
|
|
12
|
+
class?: string;
|
|
13
|
+
};
|
|
14
|
+
declare const PolygonChart: import("svelte").Component<PolygonChartProps, {}, "">;
|
|
15
|
+
type PolygonChart = ReturnType<typeof PolygonChart>;
|
|
16
|
+
export default PolygonChart;
|
|
17
|
+
//# sourceMappingURL=PolygonChart.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolygonChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/PolygonChart.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,gBAAgB,GACxB,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAMF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6IJ,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
3
|
+
|
|
4
|
+
export type ScoreCardType = "value" | "complexity";
|
|
5
|
+
export type ScoreCardSize = "sm" | "md" | "lg";
|
|
6
|
+
|
|
7
|
+
export type ScoreCardProps = Omit<HTMLAttributes<HTMLElement>, "class"> & {
|
|
8
|
+
/** Titre de la métrique notée. */
|
|
9
|
+
title: string;
|
|
10
|
+
/** Score numérique affiché (formaté à une décimale). */
|
|
11
|
+
score: number;
|
|
12
|
+
/** Nombre de symboles pleins (0..max). */
|
|
13
|
+
stars: number;
|
|
14
|
+
/** Nombre total de symboles. */
|
|
15
|
+
max?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Nature de la note :
|
|
18
|
+
* - `value` (défaut) : étoiles, accent succès.
|
|
19
|
+
* - `complexity` : croix, accent avertissement.
|
|
20
|
+
*/
|
|
21
|
+
type?: ScoreCardType;
|
|
22
|
+
/** Libellé d'unité du score (défaut « points »). */
|
|
23
|
+
unit?: string;
|
|
24
|
+
size?: ScoreCardSize;
|
|
25
|
+
class?: string;
|
|
26
|
+
};
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<script lang="ts">
|
|
30
|
+
let {
|
|
31
|
+
title,
|
|
32
|
+
score,
|
|
33
|
+
stars,
|
|
34
|
+
max = 5,
|
|
35
|
+
type = "value",
|
|
36
|
+
unit = "points",
|
|
37
|
+
size = "md",
|
|
38
|
+
class: className,
|
|
39
|
+
...rest
|
|
40
|
+
}: ScoreCardProps = $props();
|
|
41
|
+
|
|
42
|
+
const filled = $derived(Math.max(0, Math.min(max, Math.round(stars))));
|
|
43
|
+
const symbols = $derived(
|
|
44
|
+
Array.from({ length: max }, (_, i) => i < filled)
|
|
45
|
+
);
|
|
46
|
+
const ariaLabel = $derived(
|
|
47
|
+
`${title}, ${score.toFixed(1)} ${unit}, ${filled} sur ${max}`
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const classes = $derived(
|
|
51
|
+
["st-scoreCard", `st-scoreCard--${size}`, `st-scoreCard--${type}`, className]
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
.join(" ")
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Étoile pleine (type=value) vs croix (type=complexity).
|
|
57
|
+
const starPath =
|
|
58
|
+
"m7 1.5 1.7 3.45 3.8.55-2.75 2.68.65 3.79L7 10.18 3.6 11.96l.65-3.79L1.5 5.5l3.8-.55L7 1.5Z";
|
|
59
|
+
const crossPath = "M3.5 3.5l7 7M10.5 3.5l-7 7";
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<article {...rest} class={classes} role="group" aria-label={ariaLabel}>
|
|
63
|
+
<h3 class="st-scoreCard__title">{title}</h3>
|
|
64
|
+
<div class="st-scoreCard__row">
|
|
65
|
+
<div class="st-scoreCard__symbols" aria-hidden="true">
|
|
66
|
+
{#each symbols as on, i (i)}
|
|
67
|
+
<svg
|
|
68
|
+
class="st-scoreCard__symbol {on ? 'st-scoreCard__symbol--on' : 'st-scoreCard__symbol--off'}"
|
|
69
|
+
width="20"
|
|
70
|
+
height="20"
|
|
71
|
+
viewBox="0 0 14 14"
|
|
72
|
+
focusable="false"
|
|
73
|
+
>
|
|
74
|
+
{#if type === "value"}
|
|
75
|
+
<path d={starPath} fill={on ? "currentColor" : "none"} stroke="currentColor" stroke-width="1" stroke-linejoin="round" />
|
|
76
|
+
{:else}
|
|
77
|
+
<path d={crossPath} fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" />
|
|
78
|
+
{/if}
|
|
79
|
+
</svg>
|
|
80
|
+
{/each}
|
|
81
|
+
</div>
|
|
82
|
+
<span class="st-scoreCard__score">
|
|
83
|
+
{score.toFixed(1)} {unit}
|
|
84
|
+
</span>
|
|
85
|
+
</div>
|
|
86
|
+
</article>
|
|
87
|
+
|
|
88
|
+
<style>
|
|
89
|
+
.st-scoreCard {
|
|
90
|
+
background: var(--st-component-card-background, var(--st-semantic-surface-raised));
|
|
91
|
+
border-width: var(--st-component-card-anatomy-shape-borderWidth, 1px);
|
|
92
|
+
border-style: var(--st-component-card-anatomy-shape-borderStyle, solid);
|
|
93
|
+
border-color: var(--st-component-card-border, var(--st-semantic-border-subtle));
|
|
94
|
+
border-radius: var(--st-component-card-anatomy-shape-radius, 0.5rem);
|
|
95
|
+
box-shadow: var(--st-component-card-shadow, 0 1px 2px rgb(15 23 42 / 0.08));
|
|
96
|
+
color: var(--st-semantic-text-primary);
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-direction: column;
|
|
99
|
+
gap: var(--st-spacing-2, 0.5rem);
|
|
100
|
+
padding: var(--st-spacing-4, 1rem);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.st-scoreCard--sm {
|
|
104
|
+
gap: var(--st-spacing-1, 0.25rem);
|
|
105
|
+
padding: var(--st-spacing-3, 0.75rem);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.st-scoreCard--lg {
|
|
109
|
+
gap: var(--st-spacing-3, 0.75rem);
|
|
110
|
+
padding: var(--st-spacing-6, 1.5rem);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.st-scoreCard__title {
|
|
114
|
+
color: var(--st-semantic-text-primary);
|
|
115
|
+
font-size: 0.9375rem;
|
|
116
|
+
font-weight: 600;
|
|
117
|
+
line-height: 1.3;
|
|
118
|
+
margin: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.st-scoreCard__row {
|
|
122
|
+
align-items: center;
|
|
123
|
+
display: flex;
|
|
124
|
+
flex-wrap: wrap;
|
|
125
|
+
gap: var(--st-spacing-3, 0.75rem);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.st-scoreCard__symbols {
|
|
129
|
+
display: inline-flex;
|
|
130
|
+
gap: 0.125rem;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.st-scoreCard__symbol {
|
|
134
|
+
display: block;
|
|
135
|
+
flex: 0 0 auto;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.st-scoreCard--sm .st-scoreCard__symbol {
|
|
139
|
+
height: 16px;
|
|
140
|
+
width: 16px;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.st-scoreCard--lg .st-scoreCard__symbol {
|
|
144
|
+
height: 24px;
|
|
145
|
+
width: 24px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.st-scoreCard__symbol--off {
|
|
149
|
+
color: var(--st-semantic-border-default);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.st-scoreCard--value .st-scoreCard__symbol--on {
|
|
153
|
+
color: var(--st-semantic-feedback-warning);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.st-scoreCard--complexity .st-scoreCard__symbol--on {
|
|
157
|
+
color: var(--st-semantic-text-secondary);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.st-scoreCard__score {
|
|
161
|
+
font-size: 1.0625rem;
|
|
162
|
+
font-weight: 700;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.st-scoreCard--value .st-scoreCard__score {
|
|
166
|
+
color: var(--st-semantic-feedback-success);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.st-scoreCard--complexity .st-scoreCard__score {
|
|
170
|
+
color: var(--st-semantic-feedback-warning);
|
|
171
|
+
}
|
|
172
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
2
|
+
export type ScoreCardType = "value" | "complexity";
|
|
3
|
+
export type ScoreCardSize = "sm" | "md" | "lg";
|
|
4
|
+
export type ScoreCardProps = Omit<HTMLAttributes<HTMLElement>, "class"> & {
|
|
5
|
+
/** Titre de la métrique notée. */
|
|
6
|
+
title: string;
|
|
7
|
+
/** Score numérique affiché (formaté à une décimale). */
|
|
8
|
+
score: number;
|
|
9
|
+
/** Nombre de symboles pleins (0..max). */
|
|
10
|
+
stars: number;
|
|
11
|
+
/** Nombre total de symboles. */
|
|
12
|
+
max?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Nature de la note :
|
|
15
|
+
* - `value` (défaut) : étoiles, accent succès.
|
|
16
|
+
* - `complexity` : croix, accent avertissement.
|
|
17
|
+
*/
|
|
18
|
+
type?: ScoreCardType;
|
|
19
|
+
/** Libellé d'unité du score (défaut « points »). */
|
|
20
|
+
unit?: string;
|
|
21
|
+
size?: ScoreCardSize;
|
|
22
|
+
class?: string;
|
|
23
|
+
};
|
|
24
|
+
declare const ScoreCard: import("svelte").Component<ScoreCardProps, {}, "">;
|
|
25
|
+
type ScoreCard = ReturnType<typeof ScoreCard>;
|
|
26
|
+
export default ScoreCard;
|
|
27
|
+
//# sourceMappingURL=ScoreCard.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScoreCard.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ScoreCard.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,CAAC;AACnD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IACxE,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6DJ,QAAA,MAAM,SAAS,oDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
package/dist/Search.svelte
CHANGED
|
@@ -143,14 +143,17 @@
|
|
|
143
143
|
|
|
144
144
|
.st-search--sm {
|
|
145
145
|
min-height: var(--st-component-control-smHeight, 2rem);
|
|
146
|
+
font-size: 0.8125rem;
|
|
146
147
|
}
|
|
147
148
|
|
|
148
149
|
.st-search--md {
|
|
149
150
|
min-height: var(--st-component-control-mdHeight, 2.5rem);
|
|
151
|
+
font-size: 0.875rem;
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
.st-search--lg {
|
|
153
155
|
min-height: var(--st-component-control-lgHeight, 3rem);
|
|
156
|
+
font-size: 1rem;
|
|
154
157
|
}
|
|
155
158
|
|
|
156
159
|
.st-search:hover:not(:has(input:disabled)) {
|
|
@@ -210,18 +213,17 @@
|
|
|
210
213
|
align-items: center;
|
|
211
214
|
background: transparent;
|
|
212
215
|
border: 0;
|
|
213
|
-
border-radius:
|
|
214
|
-
color:
|
|
216
|
+
border-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
|
|
217
|
+
color: var(--st-semantic-text-secondary);
|
|
215
218
|
cursor: pointer;
|
|
216
219
|
display: inline-flex;
|
|
217
220
|
flex: 0 0 auto;
|
|
218
221
|
font: inherit;
|
|
219
|
-
font-size: 1.125rem;
|
|
220
222
|
height: 1.5rem;
|
|
221
223
|
justify-content: center;
|
|
222
224
|
line-height: 1;
|
|
223
|
-
margin-inline-end: 0.
|
|
224
|
-
padding: 0;
|
|
225
|
+
margin-inline-end: 0.25rem;
|
|
226
|
+
padding: 0 0.25rem;
|
|
225
227
|
transition: background-color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
|
|
226
228
|
width: 1.5rem;
|
|
227
229
|
}
|
package/dist/Select.svelte
CHANGED
|
@@ -144,14 +144,17 @@
|
|
|
144
144
|
|
|
145
145
|
.st-select--sm {
|
|
146
146
|
min-height: var(--st-component-control-smHeight, 2rem);
|
|
147
|
+
font-size: 0.8125rem;
|
|
147
148
|
}
|
|
148
149
|
|
|
149
150
|
.st-select--md {
|
|
150
151
|
min-height: var(--st-component-control-mdHeight, 2.5rem);
|
|
152
|
+
font-size: 0.875rem;
|
|
151
153
|
}
|
|
152
154
|
|
|
153
155
|
.st-select--lg {
|
|
154
156
|
min-height: var(--st-component-control-lgHeight, 3rem);
|
|
157
|
+
font-size: 1rem;
|
|
155
158
|
}
|
|
156
159
|
|
|
157
160
|
.st-select:focus-visible {
|