@sentropic/design-system-svelte 0.10.0 → 0.10.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.
@@ -57,10 +57,17 @@
57
57
  box-shadow var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
58
58
  }
59
59
 
60
+ /* Padding is 4-value (top right bottom left): the trailing side reads
61
+ `paddingInlineEnd` so a theme can make the button asymmetric (Carbon's
62
+ label-left primary button has a large right gutter) without a per-component
63
+ escape. `paddingInlineEnd` falls back to `paddingInline` → symmetric for the
64
+ base / DSFR (unchanged). */
60
65
  .st-button--sm {
61
66
  min-height: var(--st-component-button-anatomy-density-sm-controlHeight, 2rem);
62
67
  min-width: var(--st-component-button-anatomy-density-sm-minWidth, 2rem);
63
68
  padding: var(--st-component-button-anatomy-density-sm-paddingBlock, 0)
69
+ var(--st-component-button-anatomy-density-sm-paddingInlineEnd, var(--st-component-button-anatomy-density-sm-paddingInline, 0.75rem))
70
+ var(--st-component-button-anatomy-density-sm-paddingBlock, 0)
64
71
  var(--st-component-button-anatomy-density-sm-paddingInline, 0.75rem);
65
72
  font-size: var(--st-component-button-anatomy-density-sm-fontSize, 0.875rem);
66
73
  }
@@ -69,6 +76,8 @@
69
76
  min-height: var(--st-component-button-anatomy-density-md-controlHeight, 2.5rem);
70
77
  min-width: var(--st-component-button-anatomy-density-md-minWidth, 2.5rem);
71
78
  padding: var(--st-component-button-anatomy-density-md-paddingBlock, 0)
79
+ var(--st-component-button-anatomy-density-md-paddingInlineEnd, var(--st-component-button-anatomy-density-md-paddingInline, 1rem))
80
+ var(--st-component-button-anatomy-density-md-paddingBlock, 0)
72
81
  var(--st-component-button-anatomy-density-md-paddingInline, 1rem);
73
82
  font-size: var(--st-component-button-anatomy-density-md-fontSize, var(--st-component-button-anatomy-typography-size, 0.9375rem));
74
83
  }
@@ -77,6 +86,8 @@
77
86
  min-height: var(--st-component-button-anatomy-density-lg-controlHeight, 3rem);
78
87
  min-width: var(--st-component-button-anatomy-density-lg-minWidth, 3rem);
79
88
  padding: var(--st-component-button-anatomy-density-lg-paddingBlock, 0)
89
+ var(--st-component-button-anatomy-density-lg-paddingInlineEnd, var(--st-component-button-anatomy-density-lg-paddingInline, 1.25rem))
90
+ var(--st-component-button-anatomy-density-lg-paddingBlock, 0)
80
91
  var(--st-component-button-anatomy-density-lg-paddingInline, 1.25rem);
81
92
  font-size: var(--st-component-button-anatomy-density-lg-fontSize, 1rem);
82
93
  }
package/dist/Card.svelte CHANGED
@@ -27,6 +27,13 @@
27
27
  border-radius: var(--st-component-card-anatomy-shape-radius, 0.5rem);
28
28
  box-shadow: var(--st-component-card-shadow, 0 1px 2px rgb(15 23 42 / 0.08));
29
29
  color: var(--st-semantic-text-primary);
30
+ /* Card body typography (anatomy, F5). The base card carried no explicit
31
+ type — so the fallbacks reproduce that exact render (inherit / normal /
32
+ normal). DSFR pins line-height 24px (1.5); Carbon pins its real tile body
33
+ metrics (14px / 14px / 0.16px). Base Sent Tech unchanged. */
34
+ font-size: var(--st-component-card-anatomy-typography-size, inherit);
35
+ line-height: var(--st-component-card-anatomy-typography-lineHeight, normal);
36
+ letter-spacing: var(--st-component-card-anatomy-typography-letterSpacing, normal);
30
37
  padding: var(--st-spacing-4, 1rem);
31
38
  }
32
39
 
@@ -14,7 +14,6 @@
14
14
 
15
15
  <label class={classes()}>
16
16
  <input {...rest} class="st-choice__input" type="checkbox" aria-invalid={invalid ? "true" : undefined} />
17
- <span class="st-choice__box" aria-hidden="true"></span>
18
17
  <span class="st-choice__content">
19
18
  <span class="st-choice__label">{label}</span>
20
19
  {#if helperText}<span class="st-choice__help">{helperText}</span>{/if}
@@ -25,23 +24,43 @@
25
24
  .st-choice {
26
25
  align-items: start;
27
26
  color: var(--st-component-field-labelText, var(--st-semantic-text-primary));
27
+ cursor: var(--st-cursor-interactive, pointer);
28
28
  display: inline-grid;
29
29
  gap: 0.625rem;
30
30
  grid-template-columns: auto 1fr;
31
31
  }
32
32
 
33
33
  .st-choice__input {
34
- /* Thématise la coche native (couleur checked) sans markup custom — additif,
35
- a11y native préservée. Le visuel custom (forme/focus par stratégie) reste
36
- un item dédié (cf. backlog). */
34
+ /* Natif stylé : couleur de coche thémée + taille + focus par stratégie
35
+ d'anatomie + états. Aucun widget custom, a11y native préservée. */
37
36
  accent-color: var(--st-component-selection-checkedBackground, var(--st-semantic-action-primary));
37
+ cursor: inherit;
38
38
  height: 1rem;
39
39
  margin: 0.125rem 0 0;
40
40
  width: 1rem;
41
41
  }
42
42
 
43
- .st-choice__box {
44
- display: none;
43
+ /* Focus = stratégie d'anatomie partagée (outline DSFR / inset Carbon / ring base). */
44
+ .st-choice__input:focus-visible {
45
+ outline: var(--st-component-control-anatomy-focus-outline, none);
46
+ outline-offset: var(--st-component-control-anatomy-focus-offset, 0);
47
+ box-shadow: var(--st-component-control-anatomy-focus-boxShadow,
48
+ 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive)));
49
+ }
50
+
51
+ .st-choice__input[aria-invalid="true"] {
52
+ accent-color: var(--st-component-control-invalidBorder, var(--st-semantic-feedback-error));
53
+ outline-color: var(--st-component-control-invalidBorder, var(--st-semantic-feedback-error));
54
+ }
55
+
56
+ .st-choice__input:disabled {
57
+ cursor: var(--st-cursor-disabled, not-allowed);
58
+ opacity: 0.55;
59
+ }
60
+
61
+ .st-choice:has(.st-choice__input:disabled) {
62
+ color: var(--st-component-control-disabledText, var(--st-semantic-text-muted));
63
+ cursor: var(--st-cursor-disabled, not-allowed);
45
64
  }
46
65
 
47
66
  .st-choice__content {
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Checkbox.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsBJ,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Checkbox.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Checkbox.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqBJ,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
package/dist/Input.svelte CHANGED
@@ -90,12 +90,24 @@
90
90
  border-right: var(--st-component-control-anatomy-field-borderRight, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
91
91
  border-bottom: var(--st-component-control-anatomy-field-borderBottom, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
92
92
  border-left: var(--st-component-control-anatomy-field-borderLeft, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
93
- border-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
93
+ /* Per-corner radius (anatomy v1.3.0): the TOP corners read the field's
94
+ `radiusTop` (DSFR « Champ de saisie » = 4px top, square bottom); the
95
+ BOTTOM corners keep `shape.radius`. Fallback = shape.radius on all four
96
+ corners → the base Sent Tech field stays a uniform rounded box. */
97
+ border-top-left-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
98
+ border-top-right-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
99
+ border-bottom-right-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
100
+ border-bottom-left-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
101
+ /* Bottom rule as a box-shadow inset (anatomy v1.3.0, real DSFR/Carbon
102
+ technique) instead of a border-bottom — keeps the box height honest.
103
+ Fallback = none → the base boxed field draws its rule via the 4 borders. */
104
+ box-shadow: var(--st-component-control-anatomy-field-underline, none);
94
105
  color: var(--st-component-control-text, var(--st-semantic-text-primary));
95
106
  font-family: var(--st-component-control-anatomy-typography-family, inherit);
96
107
  font-size: var(--st-component-control-anatomy-typography-size, inherit);
97
108
  font-weight: var(--st-component-control-anatomy-typography-weight, 400);
98
109
  line-height: var(--st-component-control-anatomy-typography-lineHeight, 1.5);
110
+ letter-spacing: var(--st-component-control-anatomy-typography-letterSpacing, normal);
99
111
  min-width: 0;
100
112
  /* Inputs use the SM inline padding (denser than buttons) — base = 0.75rem. */
101
113
  padding: var(--st-component-control-anatomy-density-md-paddingBlock, 0)
@@ -128,13 +140,17 @@
128
140
  }
129
141
 
130
142
  /* Focus = shared mixin. Base/DSFR use outline; Carbon uses inset box-shadow.
131
- The border-color change is the field's own affordance and stays. */
143
+ The border-color change is the field's own affordance and stays. The field
144
+ focus box-shadow (anatomy v1.3.0) is COMPOSED so the resting underline is
145
+ not dropped: DSFR (outline) keeps the underline, Carbon stacks ring +
146
+ underline. Fallback = the plain focus ring (base boxed field). */
132
147
  .st-control:focus-visible {
133
148
  border-color: var(--st-component-control-focusRing, var(--st-semantic-border-interactive));
134
149
  outline: var(--st-component-control-anatomy-focus-outline, none);
135
150
  outline-offset: var(--st-component-control-anatomy-focus-offset, 0);
136
- box-shadow: var(--st-component-control-anatomy-focus-boxShadow,
137
- 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive)));
151
+ box-shadow: var(--st-component-control-anatomy-field-focusShadow,
152
+ var(--st-component-control-anatomy-focus-boxShadow,
153
+ 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive))));
138
154
  }
139
155
 
140
156
  .st-control[aria-invalid="true"] {
package/dist/Link.svelte CHANGED
@@ -58,6 +58,12 @@
58
58
  .st-link {
59
59
  color: var(--st-component-link-text, var(--st-semantic-text-link));
60
60
  cursor: var(--st-cursor-interactive, pointer);
61
+ /* Anatomy typography (additive): size/line-height/letter-spacing follow the
62
+ link role per theme. Base/DSFR use `inherit`/`normal` fallbacks → no visible
63
+ change; Carbon poses 14px / 18px / 0.16px to match the real .bx--link. */
64
+ font-size: var(--st-component-link-anatomy-typography-size, inherit);
65
+ line-height: var(--st-component-link-anatomy-typography-lineHeight, normal);
66
+ letter-spacing: var(--st-component-link-anatomy-typography-letterSpacing, normal);
61
67
  text-decoration: var(--st-component-link-anatomy-typography-textDecoration, underline);
62
68
  text-decoration-thickness: var(--st-component-link-anatomy-typography-decorationThickness, auto);
63
69
  text-underline-offset: var(--st-component-link-anatomy-typography-decorationOffset, 0.18em);
package/dist/Radio.svelte CHANGED
@@ -13,7 +13,7 @@
13
13
  </script>
14
14
 
15
15
  <label class={classes()}>
16
- <input {...rest} class="st-choice__input" type="radio" data-invalid={invalid ? "true" : undefined} />
16
+ <input {...rest} class="st-choice__input" type="radio" aria-invalid={invalid ? "true" : undefined} />
17
17
  <span class="st-choice__content">
18
18
  <span class="st-choice__label">{label}</span>
19
19
  {#if helperText}<span class="st-choice__help">{helperText}</span>{/if}
@@ -24,21 +24,45 @@
24
24
  .st-choice {
25
25
  align-items: start;
26
26
  color: var(--st-component-field-labelText, var(--st-semantic-text-primary));
27
+ cursor: var(--st-cursor-interactive, pointer);
27
28
  display: inline-grid;
28
29
  gap: 0.625rem;
29
30
  grid-template-columns: auto 1fr;
30
31
  }
31
32
 
32
33
  .st-choice__input {
33
- /* Thématise le radio natif (couleur checked) sans markup custom additif,
34
- a11y native préservée. Le visuel custom (forme/focus par stratégie) reste
35
- un item dédié (cf. backlog). */
34
+ /* Natif stylé : couleur de sélection thémée + taille + focus par stratégie
35
+ d'anatomie + états. Aucun widget custom, a11y native préservée. */
36
36
  accent-color: var(--st-component-selection-checkedBackground, var(--st-semantic-action-primary));
37
+ cursor: inherit;
37
38
  height: 1rem;
38
39
  margin: 0.125rem 0 0;
39
40
  width: 1rem;
40
41
  }
41
42
 
43
+ /* Focus = stratégie d'anatomie partagée (outline DSFR / inset Carbon / ring base). */
44
+ .st-choice__input:focus-visible {
45
+ outline: var(--st-component-control-anatomy-focus-outline, none);
46
+ outline-offset: var(--st-component-control-anatomy-focus-offset, 0);
47
+ box-shadow: var(--st-component-control-anatomy-focus-boxShadow,
48
+ 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive)));
49
+ }
50
+
51
+ .st-choice__input[aria-invalid="true"] {
52
+ accent-color: var(--st-component-control-invalidBorder, var(--st-semantic-feedback-error));
53
+ outline-color: var(--st-component-control-invalidBorder, var(--st-semantic-feedback-error));
54
+ }
55
+
56
+ .st-choice__input:disabled {
57
+ cursor: var(--st-cursor-disabled, not-allowed);
58
+ opacity: 0.55;
59
+ }
60
+
61
+ .st-choice:has(.st-choice__input:disabled) {
62
+ color: var(--st-component-control-disabledText, var(--st-semantic-text-muted));
63
+ cursor: var(--st-cursor-disabled, not-allowed);
64
+ }
65
+
42
66
  .st-choice__content {
43
67
  display: grid;
44
68
  gap: 0.25rem;
@@ -87,19 +87,52 @@
87
87
 
88
88
  /* Field box = resolved field anatomy (v1.2.0), same as Input. */
89
89
  .st-select {
90
- background: var(--st-component-control-anatomy-field-fillBg, var(--st-component-control-background, var(--st-semantic-surface-default)));
90
+ /* Native <select> rendering (anatomy v1.4.0, F5/F9). A native <select> with
91
+ `appearance: auto` has its `line-height` FORCED to `normal` by the browser
92
+ (the anatomy line-height below never lands); `appearance: none` lets it
93
+ take effect — the real DSFR/Carbon selects use `appearance: none` + a
94
+ drawn chevron, which is why they render 24px / 18px. Base = `auto` so the
95
+ Sent Tech select keeps its NATIVE arrow + render (unchanged). When a theme
96
+ opts into `none`, `selectChevron` redraws the arrow the UA dropped. */
97
+ appearance: var(--st-component-control-anatomy-field-selectAppearance, auto);
98
+ -webkit-appearance: var(--st-component-control-anatomy-field-selectAppearance, auto);
99
+ background:
100
+ var(--st-component-control-anatomy-field-selectChevron, none),
101
+ var(--st-component-control-anatomy-field-fillBg, var(--st-component-control-background, var(--st-semantic-surface-default)));
91
102
  border-top: var(--st-component-control-anatomy-field-borderTop, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
92
103
  border-right: var(--st-component-control-anatomy-field-borderRight, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
93
104
  border-bottom: var(--st-component-control-anatomy-field-borderBottom, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
94
105
  border-left: var(--st-component-control-anatomy-field-borderLeft, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
95
- border-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
106
+ /* Per-corner radius + box-shadow underline (anatomy v1.3.0) — same field
107
+ anatomy as Input. TOP corners = radiusTop (DSFR 4px), bottom = shape.radius;
108
+ bottom rule via inset box-shadow. Fallbacks reproduce the prior uniform
109
+ rounded box with no underline shadow → base Sent Tech unchanged. */
110
+ border-top-left-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
111
+ border-top-right-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
112
+ border-bottom-right-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
113
+ border-bottom-left-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
114
+ box-shadow: var(--st-component-control-anatomy-field-underline, none);
96
115
  color: var(--st-component-control-text, var(--st-semantic-text-primary));
97
116
  font-family: var(--st-component-control-anatomy-typography-family, inherit);
98
117
  font-size: var(--st-component-control-anatomy-typography-size, inherit);
99
118
  font-weight: var(--st-component-control-anatomy-typography-weight, 400);
119
+ /* Native <select> renders `line-height: normal` unless one is set explicitly;
120
+ pose the anatomy line-height so DSFR/Carbon select matches the field roles
121
+ (cluster 4). letter-spacing likewise (Carbon 0.16px). Additive — base keeps
122
+ its 1.5 fallback so the Sent Tech select is unchanged. */
100
123
  line-height: var(--st-component-control-anatomy-typography-lineHeight, 1.5);
124
+ letter-spacing: var(--st-component-control-anatomy-typography-letterSpacing, normal);
101
125
  min-width: 0;
102
- padding: 0 2rem 0 0.75rem;
126
+ /* Padding follows the field density (additive; fallbacks reproduce the prior
127
+ `0 2rem 0 0.75rem` literal so the base Sent Tech select is unchanged):
128
+ vertical = md paddingBlock (base 0 → DSFR 8px), left = sm paddingInline
129
+ (base 0.75rem → DSFR/Carbon 16px). The right side reserves the chevron
130
+ gutter via selectPaddingRight (F9: base 2rem → DSFR 40px / Carbon 48px). */
131
+ padding:
132
+ var(--st-component-control-anatomy-density-md-paddingBlock, 0)
133
+ var(--st-component-control-anatomy-field-selectPaddingRight, 2rem)
134
+ var(--st-component-control-anatomy-density-md-paddingBlock, 0)
135
+ var(--st-component-control-anatomy-density-sm-paddingInline, 0.75rem);
103
136
  width: 100%;
104
137
  }
105
138
 
@@ -119,8 +152,10 @@
119
152
  border-color: var(--st-component-control-focusRing, var(--st-semantic-border-interactive));
120
153
  outline: var(--st-component-control-anatomy-focus-outline, none);
121
154
  outline-offset: var(--st-component-control-anatomy-focus-offset, 0);
122
- box-shadow: var(--st-component-control-anatomy-focus-boxShadow,
123
- 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive)));
155
+ /* Composed field focus box-shadow (v1.3.0): keeps the resting underline. */
156
+ box-shadow: var(--st-component-control-anatomy-field-focusShadow,
157
+ var(--st-component-control-anatomy-focus-boxShadow,
158
+ 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive))));
124
159
  }
125
160
 
126
161
  .st-select[aria-invalid="true"] {
package/dist/Tabs.svelte CHANGED
@@ -63,7 +63,9 @@
63
63
 
64
64
  <style>
65
65
  .st-tabs {
66
- color: var(--st-component-tabs-activeText, var(--st-semantic-text-primary));
66
+ /* Wrapper/panel text = neutral primary (NOT the active-tab colour, which is
67
+ Bleu France in DSFR and must not bleed into the panel body). */
68
+ color: var(--st-semantic-text-primary);
67
69
  display: grid;
68
70
  gap: var(--st-spacing-4, 1rem);
69
71
  }
@@ -77,22 +79,35 @@
77
79
  .st-tabs__tab {
78
80
  background: transparent;
79
81
  border: 0;
80
- border-bottom-width: var(--st-component-tabs-anatomy-shape-borderWidth, 2px);
82
+ /* Indicator edge (F7/F8): base/Carbon carry it on the BOTTOM, DSFR on the
83
+ TOP. The resting tab keeps the same-width transparent stroke on each edge
84
+ so the baseline does not shift when a tab becomes active. */
85
+ border-top-width: var(--st-component-tabs-activeBorderTopWidth, 0);
86
+ border-bottom-width: var(--st-component-tabs-activeBorderBottomWidth, var(--st-component-tabs-anatomy-shape-borderWidth, 2px));
87
+ border-top-style: var(--st-component-tabs-anatomy-shape-borderStyle, solid);
81
88
  border-bottom-style: var(--st-component-tabs-anatomy-shape-borderStyle, solid);
89
+ border-top-color: transparent;
82
90
  border-bottom-color: transparent;
83
91
  color: var(--st-component-tabs-inactiveText, var(--st-semantic-text-secondary));
84
92
  cursor: var(--st-cursor-interactive, pointer);
85
93
  font-family: var(--st-component-tabs-anatomy-typography-family, inherit);
94
+ font-size: var(--st-component-tabs-tabFontSize, inherit);
86
95
  font-weight: var(--st-component-tabs-anatomy-typography-weight, 600);
87
- line-height: var(--st-component-tabs-anatomy-typography-lineHeight, 1.2);
96
+ line-height: var(--st-component-tabs-tabLineHeight, var(--st-component-tabs-anatomy-typography-lineHeight, 1.2));
88
97
  letter-spacing: var(--st-component-tabs-anatomy-typography-letterSpacing, 0);
89
98
  text-transform: var(--st-component-tabs-anatomy-typography-textTransform, none);
90
- padding: 0.75rem 0.25rem;
99
+ padding: var(--st-component-tabs-tabPaddingBlock, 0.75rem) var(--st-component-tabs-tabPaddingInline, 0.25rem);
91
100
  }
92
101
 
93
102
  .st-tabs__tab--active {
103
+ background: var(--st-component-tabs-activeBackground, transparent);
104
+ border-top-color: var(--st-component-tabs-indicator, var(--st-semantic-action-primary));
94
105
  border-bottom-color: var(--st-component-tabs-indicator, var(--st-semantic-action-primary));
95
- color: var(--st-component-tabs-anatomy-states-hover-text, var(--st-component-tabs-activeText, var(--st-semantic-text-primary)));
106
+ /* Indicator accent when the theme draws it as a box-shadow (DSFR top filet)
107
+ rather than a real border — keeps both border sides at `0 none`. */
108
+ box-shadow: var(--st-component-tabs-activeShadow, none);
109
+ font-weight: var(--st-component-tabs-activeWeight, var(--st-component-tabs-anatomy-typography-weight, 600));
110
+ color: var(--st-component-tabs-activeText, var(--st-semantic-text-primary));
96
111
  }
97
112
 
98
113
  /* a11y (non-negotiable): tabs previously had NO visible focus ring. The
@@ -87,12 +87,21 @@
87
87
  border-right: var(--st-component-control-anatomy-field-borderRight, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
88
88
  border-bottom: var(--st-component-control-anatomy-field-borderBottom, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
89
89
  border-left: var(--st-component-control-anatomy-field-borderLeft, var(--st-component-control-anatomy-shape-borderWidth, 1px) var(--st-component-control-anatomy-shape-borderStyle, solid) var(--st-component-control-border, var(--st-semantic-border-subtle)));
90
- border-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
90
+ /* Per-corner radius + box-shadow underline (anatomy v1.3.0) — same field
91
+ anatomy as Input: TOP corners = radiusTop (DSFR 4px), bottom = shape.radius;
92
+ bottom rule via inset box-shadow. Fallbacks reproduce the prior uniform
93
+ rounded box with no underline shadow → base Sent Tech unchanged. */
94
+ border-top-left-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
95
+ border-top-right-radius: var(--st-component-control-anatomy-field-radiusTop, var(--st-component-control-anatomy-shape-radius, 0.375rem));
96
+ border-bottom-right-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
97
+ border-bottom-left-radius: var(--st-component-control-anatomy-shape-radius, 0.375rem);
98
+ box-shadow: var(--st-component-control-anatomy-field-underline, none);
91
99
  color: var(--st-component-control-text, var(--st-semantic-text-primary));
92
100
  font-family: var(--st-component-control-anatomy-typography-family, inherit);
93
101
  font-size: var(--st-component-control-anatomy-typography-size, inherit);
94
102
  font-weight: var(--st-component-control-anatomy-typography-weight, 400);
95
103
  line-height: var(--st-component-control-anatomy-typography-lineHeight, 1.5);
104
+ letter-spacing: var(--st-component-control-anatomy-typography-letterSpacing, normal);
96
105
  min-height: 6rem;
97
106
  min-width: 0;
98
107
  padding: 0.625rem var(--st-component-control-anatomy-density-sm-paddingInline, 0.75rem);
@@ -115,8 +124,10 @@
115
124
  border-color: var(--st-component-control-focusRing, var(--st-semantic-border-interactive));
116
125
  outline: var(--st-component-control-anatomy-focus-outline, none);
117
126
  outline-offset: var(--st-component-control-anatomy-focus-offset, 0);
118
- box-shadow: var(--st-component-control-anatomy-focus-boxShadow,
119
- 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive)));
127
+ /* Composed field focus box-shadow (v1.3.0): keeps the resting underline. */
128
+ box-shadow: var(--st-component-control-anatomy-field-focusShadow,
129
+ var(--st-component-control-anatomy-focus-boxShadow,
130
+ 0 0 0 2px var(--st-component-control-focusRing, var(--st-semantic-border-interactive))));
120
131
  }
121
132
 
122
133
  .st-textarea[aria-invalid="true"] {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/design-system-svelte",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -27,7 +27,7 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "@lucide/svelte": "^0.562.0",
30
- "@sentropic/design-system-themes": "0.10.0"
30
+ "@sentropic/design-system-themes": "0.10.1"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "svelte": "^5.53.2"
@@ -38,8 +38,8 @@
38
38
  "test": "vitest run src"
39
39
  },
40
40
  "devDependencies": {
41
- "@sentropic/design-system-theme-carbon": "0.2.0",
42
- "@sentropic/design-system-theme-dsfr": "0.2.0",
41
+ "@sentropic/design-system-theme-carbon": "0.2.1",
42
+ "@sentropic/design-system-theme-dsfr": "0.2.1",
43
43
  "@sveltejs/package": "^2.5.0",
44
44
  "@sveltejs/vite-plugin-svelte": "^6.2.4",
45
45
  "@testing-library/svelte": "^5.2.8",