@sentropic/design-system-vue 0.37.0 → 0.38.1

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.
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Internal priority-label placement for the DS PriorityMatrix component.
3
+ *
4
+ * STRUCTURAL TWIN of packages/dataviz-core/src/priorityMatrix.ts: same
5
+ * algorithm, same types, same behaviour. Duplicated (not imported) on purpose:
6
+ * the DS layer must not depend on @sentropic/dataviz-core, so this copy is
7
+ * kept in sync by hand. A shared golden-vector test pins all five copies to
8
+ * identical placements. Not exported from the package barrel (internal
9
+ * component use only).
10
+ */
11
+ /**
12
+ * Quadrant of a datum given thresholds (defaults 50/50).
13
+ * x = complexity (low left), y = value (high top).
14
+ */
15
+ export function priorityQuadrant(x, y, xThreshold = 50, yThreshold = 50) {
16
+ if (x < xThreshold && y >= yThreshold)
17
+ return 'quick-wins';
18
+ if (x >= xThreshold && y >= yThreshold)
19
+ return 'major-projects';
20
+ if (x < xThreshold && y < yThreshold)
21
+ return 'wait';
22
+ return 'drop';
23
+ }
24
+ /**
25
+ * Rough box estimate from a label string when the caller has no measurement.
26
+ * Single line up to 12 chars, two lines beyond; capped at 120px wide.
27
+ *
28
+ * This is a glyph-count MODEL, not a measurement: it assumes narrow latin
29
+ * glyphs at 11px. Wide latin runs overflow the box (Inter 11px measured in
30
+ * Chromium, review figures: "MMMMMMMMMM" by 17.7px, "WWWWWWWWWWWW" by 26.7px;
31
+ * same-direction check with DejaVu Sans 11px advances: 12.9px and 34.5px) and
32
+ * CJK text overflows further ("データ可視化の基盤" by 24.0px in Inter 11px).
33
+ * The non-overlap behaviour only holds for narrow latin; there is currently
34
+ * no prop to pass caller-measured boxes through the DS components.
35
+ */
36
+ export function estimatePriorityLabelBox(label) {
37
+ const chars = [...label].length;
38
+ if (chars === 0)
39
+ return { w: 12, h: 20 };
40
+ const lines = chars > 12 ? 2 : 1;
41
+ const longest = lines === 2 ? Math.ceil(chars / 2) : chars;
42
+ return { w: Math.min(120, 12 + 7 * longest), h: lines === 2 ? 34 : 20 };
43
+ }
44
+ const CANDIDATE_GAP = 8;
45
+ function mulberry32(seed) {
46
+ let a = seed >>> 0;
47
+ return () => {
48
+ a |= 0;
49
+ a = (a + 0x6d2b79f5) | 0;
50
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
51
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
52
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
53
+ };
54
+ }
55
+ function overlapArea(ax, ay, aw, ah, bx, by, bw, bh) {
56
+ const dx = Math.min(ax + aw, bx + bw) - Math.max(ax, bx);
57
+ const dy = Math.min(ay + ah, by + bh) - Math.max(ay, by);
58
+ return dx > 0 && dy > 0 ? dx * dy : 0;
59
+ }
60
+ function pointInBox(px, py, x, y, w, h, pad = 4) {
61
+ return px > x - pad && px < x + w + pad && py > y - pad && py < y + h + pad;
62
+ }
63
+ function clampInto(x, y, w, h, f) {
64
+ const minX = f.marginLeft;
65
+ const minY = f.marginTop;
66
+ const maxX = f.marginLeft + f.plotWidth - w;
67
+ const maxY = f.marginTop + f.plotHeight - h;
68
+ // Box wider/taller than the plot: pin to the origin instead of inverting.
69
+ if (maxX < minX)
70
+ return { x: minX, y: Math.min(Math.max(y, minY), Math.max(minY, f.marginTop + f.plotHeight - h)) };
71
+ if (maxY < minY)
72
+ return { x: Math.min(Math.max(x, minX), maxX), y: minY };
73
+ return { x: Math.min(Math.max(x, minX), maxX), y: Math.min(Math.max(y, minY), maxY) };
74
+ }
75
+ /**
76
+ * Place one label per point. Never throws on degenerate input: non-finite
77
+ * coordinates fall back to the plot origin, empty arrays yield [].
78
+ *
79
+ * Cost model: label/label overlap area, point-cover (a label box covering ANY
80
+ * anchor — including its own — costs 300 in seeding, 800 in annealing, so
81
+ * opaque label boxes avoid hiding points), obstacle overlap, anchor distance,
82
+ * and out-of-frame penalties, refined by fixed-schedule simulated annealing.
83
+ *
84
+ * Complexity is O(n^2) per energy evaluation with max(1500, n*120) iterations,
85
+ * i.e. O(n^3) overall (the 1500 floor only dominates below 13 points, since n*120 passes 1500 at n=13). Measured
86
+ * (Node 22, desktop class, seeded random sets with long 2-line labels):
87
+ * n=13 in 3.2ms, n=30 in 13.7ms, n=50 in 36.8ms, n=80 in 137.8ms, n=100 in
88
+ * 258.9ms. Overlap counts are set-dependent (0/1/15/83/176 on that
89
+ * adversarial set). Recommended cap: around 50 points; beyond that both
90
+ * latency and overlaps degrade.
91
+ *
92
+ * Frame floor: with the shipped DS configuration (splitLabel boxes, threshold
93
+ * and name obstacles) the 13-point reference set is clean at 640x400, shows
94
+ * 1 overlap at 480x300 and 400x250, 9 overlaps at 320x200, 35 at 200x140, and
95
+ * 78 overlaps plus 12 out-of-plot boxes at 120x90. Do not render below
96
+ * roughly 480x300.
97
+ */
98
+ export function placePriorityLabels(points, boxes, frame, opts = {}) {
99
+ const xT = opts.xThreshold ?? 50;
100
+ const yT = opts.yThreshold ?? 50;
101
+ const seed = opts.seed ?? 42;
102
+ const obstacles = (opts.obstacles ?? []).filter((o) => Number.isFinite(o.x) && Number.isFinite(o.y) && o.w > 0 && o.h > 0);
103
+ const n = points.length;
104
+ if (n === 0)
105
+ return [];
106
+ const anchors = points.map((p) => ({
107
+ ax: Number.isFinite(p.x)
108
+ ? frame.marginLeft + (Math.min(Math.max(p.x, 0), 100) / 100) * frame.plotWidth
109
+ : frame.marginLeft,
110
+ ay: Number.isFinite(p.y)
111
+ ? frame.marginTop + (1 - Math.min(Math.max(p.y, 0), 100) / 100) * frame.plotHeight
112
+ : frame.marginTop,
113
+ }));
114
+ const sizes = points.map((_, i) => {
115
+ const b = boxes[i];
116
+ const w = b && Number.isFinite(b.w) && b.w > 0 ? b.w : 12;
117
+ const h = b && Number.isFinite(b.h) && b.h > 0 ? b.h : 20;
118
+ return { w, h };
119
+ });
120
+ const offsets = [
121
+ [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1],
122
+ ];
123
+ const costAt = (idx, x, y, pos) => {
124
+ let c = 0;
125
+ const { w, h } = sizes[idx];
126
+ const left = frame.marginLeft;
127
+ const top = frame.marginTop;
128
+ const right = left + frame.plotWidth;
129
+ const bottom = top + frame.plotHeight;
130
+ c += (Math.max(left - x, 0) + Math.max(x + w - right, 0) + Math.max(top - y, 0) + Math.max(y + h - bottom, 0)) * 400;
131
+ for (let j = 0; j < n; j++) {
132
+ if (j === idx || pos[j] === undefined)
133
+ continue;
134
+ c += overlapArea(x, y, w, h, pos[j].x, pos[j].y, sizes[j].w, sizes[j].h) * 2;
135
+ }
136
+ for (let j = 0; j < n; j++) {
137
+ if (pointInBox(anchors[j].ax, anchors[j].ay, x, y, w, h))
138
+ c += 300;
139
+ }
140
+ // Obstacles (threshold bands, quadrant names) cost 4x a label/label overlap
141
+ // per px2. That is a nudge, not a veto: crossing a 6px band with a 68x20
142
+ // box costs 960 here against 2720 for fully overlapping another label,
143
+ // about a third, so a band is still crossed when nothing else fits.
144
+ for (const o of obstacles) {
145
+ c += overlapArea(x, y, w, h, o.x, o.y, o.w, o.h) * 8;
146
+ }
147
+ c += Math.hypot(x + w / 2 - anchors[idx].ax, y + h / 2 - anchors[idx].ay) * 0.5;
148
+ return c;
149
+ };
150
+ // Greedy seeding in stable y-then-x order.
151
+ const order = points.map((_, i) => i).sort((a, b) => anchors[a].ay - anchors[b].ay || anchors[a].ax - anchors[b].ax);
152
+ const pos = new Array(n);
153
+ for (const idx of order) {
154
+ let bestX = anchors[idx].ax;
155
+ let bestY = anchors[idx].ay;
156
+ let bestC = Infinity;
157
+ for (const [dx, dy] of offsets) {
158
+ const cx = anchors[idx].ax + dx * (sizes[idx].w / 2 + CANDIDATE_GAP) - sizes[idx].w / 2;
159
+ const cy = anchors[idx].ay + dy * (sizes[idx].h / 2 + CANDIDATE_GAP) - sizes[idx].h / 2;
160
+ const cc = costAt(idx, cx, cy, pos);
161
+ if (cc < bestC) {
162
+ bestC = cc;
163
+ bestX = cx;
164
+ bestY = cy;
165
+ }
166
+ }
167
+ const cl = clampInto(bestX, bestY, sizes[idx].w, sizes[idx].h, frame);
168
+ pos[idx] = cl;
169
+ }
170
+ // Simulated-annealing refinement (fixed seed ⇒ deterministic).
171
+ const rnd = mulberry32(seed);
172
+ const energy = () => {
173
+ let e = 0;
174
+ for (let i = 0; i < n; i++) {
175
+ const { w, h } = sizes[i];
176
+ e += Math.hypot(pos[i].x + w / 2 - anchors[i].ax, pos[i].y + h / 2 - anchors[i].ay) * 0.6;
177
+ if (pos[i].x < frame.marginLeft ||
178
+ pos[i].y < frame.marginTop ||
179
+ pos[i].x + w > frame.marginLeft + frame.plotWidth ||
180
+ pos[i].y + h > frame.marginTop + frame.plotHeight) {
181
+ e += 5000;
182
+ }
183
+ for (let j = 0; j < n; j++) {
184
+ if (pointInBox(anchors[j].ax, anchors[j].ay, pos[i].x, pos[i].y, w, h))
185
+ e += 800;
186
+ }
187
+ for (const o of obstacles) {
188
+ e += overlapArea(pos[i].x, pos[i].y, w, h, o.x, o.y, o.w, o.h) * 12;
189
+ }
190
+ for (let j = i + 1; j < n; j++) {
191
+ e += overlapArea(pos[i].x, pos[i].y, w, h, pos[j].x, pos[j].y, sizes[j].w, sizes[j].h) * 3;
192
+ }
193
+ }
194
+ return e;
195
+ };
196
+ let e = energy();
197
+ let temp = 800;
198
+ const iters = Math.max(1500, n * 120);
199
+ const cool = Math.pow(1 / 800, 1 / iters);
200
+ for (let k = 0; k < iters; k++) {
201
+ const i = Math.floor(rnd() * n);
202
+ const ox = pos[i].x;
203
+ const oy = pos[i].y;
204
+ const step = 6 + temp / 40;
205
+ const cl = clampInto(pos[i].x + (rnd() * 2 - 1) * step, pos[i].y + (rnd() * 2 - 1) * step, sizes[i].w, sizes[i].h, frame);
206
+ pos[i] = cl;
207
+ const ne = energy();
208
+ if (ne < e || rnd() < Math.exp((e - ne) / Math.max(temp, 1e-9))) {
209
+ e = ne;
210
+ }
211
+ else {
212
+ pos[i] = { x: ox, y: oy };
213
+ }
214
+ temp *= cool;
215
+ }
216
+ return points.map((p, i) => {
217
+ const { w, h } = sizes[i];
218
+ const bx = pos[i].x;
219
+ const by = pos[i].y;
220
+ // Leader from the closest point of the box to the anchor (edge-clamped;
221
+ // zero-length when the anchor lies inside the box) to the anchor.
222
+ const cx = Math.min(Math.max(anchors[i].ax, bx), bx + w);
223
+ const cy = Math.min(Math.max(anchors[i].ay, by), by + h);
224
+ return {
225
+ index: i,
226
+ x: bx,
227
+ y: by,
228
+ w,
229
+ h,
230
+ anchorX: anchors[i].ax,
231
+ anchorY: anchors[i].ay,
232
+ leaderX1: cx,
233
+ leaderY1: cy,
234
+ leaderX2: anchors[i].ax,
235
+ leaderY2: anchors[i].ay,
236
+ quadrant: priorityQuadrant(p.x, p.y, xT, yT),
237
+ };
238
+ });
239
+ }
240
+ //# sourceMappingURL=priorityLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorityLabels.js","sourceRoot":"","sources":["../src/priorityLabels.ts"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -1573,7 +1573,9 @@
1573
1573
 
1574
1574
  .st-contentSwitcher__option--selected {
1575
1575
  background: var(--st-semantic-surface-default);
1576
- box-shadow: var(--st-shadow-subtle);
1576
+ box-shadow:
1577
+ inset 0 0 0 1px var(--st-semantic-border-interactive),
1578
+ var(--st-shadow-subtle);
1577
1579
  color: var(--st-semantic-text-primary);
1578
1580
  }
1579
1581
 
@@ -3318,6 +3320,34 @@
3318
3320
 
3319
3321
  .st-highlight__body p { margin: 0; }
3320
3322
 
3323
+ /* Icon (.st-icon) — stroke width and colour come from the theme tokens
3324
+ (--st-component-icon-strokeWidth / --st-component-icon-color).
3325
+ - The selectors only match the DS defaults: stroke-width 2.25 set by no prop
3326
+ (an explicit strokeWidth prop is marked data-st-icon-stroke) and stroke
3327
+ currentColor. An explicit prop or colour keeps its presentation attribute.
3328
+ - The rules live in the cascade layer `st-icon`. A layered rule still beats
3329
+ the SVG presentation attributes, and ANY unlayered consumer rule beats it,
3330
+ whatever its specificity or position.
3331
+ - A consumer rule inside a layer (Tailwind v4 utilities, any @layer CSS) only
3332
+ wins if `st-icon` comes BEFORE that layer in the layer order, which is set
3333
+ by first appearance. Declare it first, before Tailwind:
3334
+ @layer st-icon;
3335
+ @import "tailwindcss";
3336
+ or load this stylesheet before any layered CSS. If `st-icon` is declared
3337
+ after the consumer's layers, the token rules beat the consumer's layered
3338
+ rules on the icon.
3339
+ - The var() fallbacks reproduce the former render when no theme is loaded.
3340
+ Same rules as the Svelte Icon component. */
3341
+ @layer st-icon {
3342
+ :where(.st-icon[stroke-width="2.25"]:not([data-st-icon-stroke])) {
3343
+ stroke-width: var(--st-component-icon-strokeWidth, 2.25);
3344
+ }
3345
+
3346
+ :where(.st-icon[stroke="currentColor"]) {
3347
+ stroke: var(--st-component-icon-color, currentColor);
3348
+ }
3349
+ }
3350
+
3321
3351
  .st-iconButton {
3322
3352
  align-items: center;
3323
3353
  background: transparent;
@@ -4047,7 +4077,14 @@
4047
4077
  max-height: calc(100vh - 2rem);
4048
4078
  overflow: auto;
4049
4079
  padding: 0;
4050
- position: absolute;
4080
+ /* The Popover API UA sheet gives [popover] `inset: 0; margin: auto`: without
4081
+ this reset the top-layer panel is re-centred between its top/left and the
4082
+ viewport edges instead of sitting on the trigger. Inline top/left win. */
4083
+ inset: auto;
4084
+ margin: 0;
4085
+ /* Viewport coordinates from getBoundingClientRect: fixed, never absolute
4086
+ (absolute + document coords broke inside any positioned ancestor). */
4087
+ position: fixed;
4051
4088
  z-index: var(--st-component-popover-zIndex, 80);
4052
4089
  }
4053
4090
 
@@ -4838,6 +4875,18 @@
4838
4875
  font-weight: var(--st-component-pagination-activeWeight, inherit);
4839
4876
  }
4840
4877
 
4878
+ .st-pagination button:hover:not(:disabled) {
4879
+ background: var(
4880
+ --st-component-control-hoverBackground,
4881
+ var(--st-component-pagination-hoverBackground, var(--st-semantic-surface-subtle))
4882
+ );
4883
+ }
4884
+
4885
+ .st-pagination button.st-pagination__page--active:hover:not(:disabled) {
4886
+ background: var(--st-component-pagination-activeBackground, var(--st-semantic-action-primary));
4887
+ color: var(--st-component-pagination-activeText, var(--st-semantic-action-primaryText));
4888
+ }
4889
+
4841
4890
  .st-pagination button:disabled {
4842
4891
  color: var(--st-component-pagination-disabledText, var(--st-semantic-text-muted));
4843
4892
  cursor: not-allowed;
@@ -8064,7 +8113,7 @@
8064
8113
 
8065
8114
  .st-radioGroup__legend {
8066
8115
  color: var(--st-component-field-labelText, var(--st-semantic-text-primary));
8067
- font-size: 0.9375rem;
8116
+ font-size: var(--st-component-selection-legendFontSize, 0.9375rem);
8068
8117
  font-weight: 650;
8069
8118
  line-height: 1.3;
8070
8119
  padding: 0;
@@ -8753,7 +8802,15 @@
8753
8802
  }
8754
8803
 
8755
8804
  .st-calendar__day--inRange {
8756
- background: var(--st-component-control-hoverBackground, var(--st-semantic-surface-subtle));
8805
+ background: var(
8806
+ --st-component-calendar-rangeBackground,
8807
+ color-mix(
8808
+ in srgb,
8809
+ var(--st-semantic-action-primary) 32%,
8810
+ var(--st-component-popover-background, var(--st-semantic-surface-raised))
8811
+ )
8812
+ );
8813
+ color: var(--st-component-popover-text, var(--st-semantic-text-primary));
8757
8814
  }
8758
8815
 
8759
8816
  .st-calendar__day--selected {
@@ -18143,6 +18200,17 @@
18143
18200
  min-width: 16rem;
18144
18201
  }
18145
18202
 
18203
+ .st-timeRangePicker__customExtra {
18204
+ display: flex;
18205
+ flex-direction: column;
18206
+ gap: var(--st-spacing-2, 0.5rem);
18207
+ }
18208
+
18209
+ /* Angular always renders the projection host; hide it when nothing is projected. */
18210
+ .st-timeRangePicker__customExtra:empty {
18211
+ display: none;
18212
+ }
18213
+
18146
18214
  .st-timeRangePicker__bounds {
18147
18215
  display: grid;
18148
18216
  gap: var(--st-spacing-3, 0.75rem);
@@ -18318,3 +18386,59 @@
18318
18386
  padding-block: 0;
18319
18387
  visibility: hidden;
18320
18388
  }
18389
+
18390
+ /* PriorityMatrix — 2x2 value/complexity matrix with placed labels. Token-only. */
18391
+ .st-priorityMatrix { color: var(--st-semantic-text-secondary); display: block; font-family: inherit; position: relative; width: 100%; }
18392
+ .st-priorityMatrix__visual { display: block; }
18393
+ .st-priorityMatrix svg { display: block; overflow: visible; }
18394
+ .st-priorityMatrix__title { fill: var(--st-semantic-text-primary); font-size: 0.875rem; font-weight: 700; }
18395
+ .st-priorityMatrix__quad--quick-wins { fill: color-mix(in srgb, var(--st-semantic-feedback-success) 12%, transparent); }
18396
+ .st-priorityMatrix__quad--major-projects { fill: color-mix(in srgb, var(--st-semantic-feedback-info) 12%, transparent); }
18397
+ .st-priorityMatrix__quad--wait { fill: color-mix(in srgb, var(--st-semantic-feedback-warning) 12%, transparent); }
18398
+ .st-priorityMatrix__quad--drop { fill: color-mix(in srgb, var(--st-semantic-border-subtle) 22%, transparent); }
18399
+ .st-priorityMatrix__threshold { stroke: var(--st-semantic-text-secondary); stroke-width: 1.5; stroke-dasharray: 5 4; }
18400
+ .st-priorityMatrix__quadName { fill: var(--st-semantic-text-secondary); font-size: 0.6875rem; font-weight: 600; }
18401
+ .st-priorityMatrix__grid { stroke: var(--st-semantic-border-subtle); stroke-dasharray: 2 3; stroke-width: 1; opacity: 0.7; }
18402
+ .st-priorityMatrix__axis { stroke: var(--st-semantic-border-subtle); stroke-width: 1; }
18403
+ .st-priorityMatrix__tick { fill: var(--st-semantic-text-secondary); font-size: 0.6875rem; }
18404
+ .st-priorityMatrix__axisLabel { fill: var(--st-semantic-text-secondary); font-size: 0.75rem; font-weight: 600; }
18405
+ .st-priorityMatrix__point--category1 { fill: var(--st-semantic-data-category1); }
18406
+ .st-priorityMatrix__point--category2 { fill: var(--st-semantic-data-category2); }
18407
+ .st-priorityMatrix__point--category3 { fill: var(--st-semantic-data-category3); }
18408
+ .st-priorityMatrix__point--category4 { fill: var(--st-semantic-data-category4); }
18409
+ .st-priorityMatrix__point--category5 { fill: var(--st-semantic-data-category5); }
18410
+ .st-priorityMatrix__point--category6 { fill: var(--st-semantic-data-category6); }
18411
+ .st-priorityMatrix__point--category7 { fill: var(--st-semantic-data-category7); }
18412
+ .st-priorityMatrix__point--category8 { fill: var(--st-semantic-data-category8); }
18413
+ .st-priorityMatrix__leader { stroke: var(--st-semantic-text-secondary); stroke-width: 1; opacity: 0.8; }
18414
+ .st-priorityMatrix__labelBox { fill: var(--st-semantic-surface-default); stroke: var(--st-semantic-border-subtle); stroke-width: 1; }
18415
+ .st-priorityMatrix__labelText { fill: var(--st-semantic-text-primary); font-size: 0.6875rem; }
18416
+
18417
+ /* --- Checkbox vertical centring (2026-11-09) ------------------------------ */
18418
+ /* The box and the trailing slot centre on the FIRST label line, whatever the
18419
+ theme's label font size and line height. The row carries the label
18420
+ typography so `1lh` is one label line; the 1rem box is offset by half the
18421
+ difference between that line and its own height. Top alignment is kept so a
18422
+ wrapped description stays under the label. The first margin declaration is
18423
+ the fallback for engines without the lh unit. Same rules as
18424
+ components-svelte/src/lib/Checkbox.svelte. */
18425
+ .st-choice--checkbox {
18426
+ font-size: var(--st-component-selection-choiceLabelFontSize, 0.9375rem);
18427
+ line-height: var(--st-component-selection-choiceLabelLineHeight, normal);
18428
+ }
18429
+
18430
+ .st-choice--checkbox .st-choice__input {
18431
+ font: inherit;
18432
+ margin: 0.125rem 0 0;
18433
+ margin: calc((1lh - 1rem) / 2) 0 0;
18434
+ }
18435
+
18436
+ /* One label line high, content centred: a count Badge sits on the same axis
18437
+ as the box and the label, even when it is taller than the line. */
18438
+ .st-choice--checkbox .st-choice__trailing {
18439
+ height: 1lh;
18440
+ }
18441
+
18442
+ .st-choice--checkbox .st-choice__help {
18443
+ line-height: normal;
18444
+ }
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@sentropic/design-system-vue",
3
- "version": "0.37.0",
3
+ "version": "0.38.1",
4
+ "license": "MIT",
4
5
  "description": "Vue 3 components for the Sentropic design system.",
5
6
  "type": "module",
6
7
  "publishConfig": {
@@ -32,7 +33,7 @@
32
33
  "test": "vitest run src"
33
34
  },
34
35
  "dependencies": {
35
- "@sentropic/design-system-themes": "0.11.0",
36
+ "@sentropic/design-system-themes": "0.12.0",
36
37
  "lucide-vue-next": "^0.562.0"
37
38
  },
38
39
  "peerDependencies": {
@@ -44,7 +45,7 @@
44
45
  "jsdom": "^27.2.0",
45
46
  "typescript": "^5.9.3",
46
47
  "vite": "^8.0.16",
47
- "vitest": "^4.1.6",
48
+ "vitest": "^4.1.11",
48
49
  "vue": "^3.5.17",
49
50
  "vue-tsc": "^2.2.12"
50
51
  }