@redseed/redseed-ui-tailwindcss 7.55.0 → 7.57.0

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.
@@ -1,5 +1,46 @@
1
+ /*
2
+ * A row: optional icon, the text column, optional close. `items-start` so the
3
+ * icon and the close button align with the first line rather than centring
4
+ * against a tall body.
5
+ */
1
6
  .rsui-message-box {
2
- @apply border rounded-lg overflow-hidden p-4 flex flex-col gap-y-3;
7
+ @apply border rounded-lg overflow-hidden p-4 flex items-start gap-x-3;
8
+ }
9
+
10
+ /*
11
+ * The text column. Carries the vertical rhythm the box itself used to own, so a
12
+ * box with no icon and no actions lays out exactly as it did before.
13
+ */
14
+ .rsui-message-box__main {
15
+ @apply flex-1 flex flex-col gap-y-3;
16
+ }
17
+
18
+ /*
19
+ * Narrow and with an icon: the icon and the close button take a row of their own
20
+ * and the text runs full width beneath them, rather than indenting past a column
21
+ * that costs more than it gives at this width.
22
+ *
23
+ * Ordering is what makes it work — the DOM runs icon, text, close, so without it
24
+ * the full-width text column would wrap between the two and strand the close
25
+ * button on a third row. Scoped to `--with-icon` because a box with no icon has
26
+ * no column to escape: its close button already sits beside the title, and a
27
+ * lone X on its own row would be a wasted line.
28
+ *
29
+ * The box itself sets only `gap-x`, which buys nothing once these become two
30
+ * flex lines — so the row gap is set here, matching the text column's own
31
+ * rhythm. Inert at `sm:flex-nowrap`, where there is only ever one line.
32
+ */
33
+ .rsui-message-box--with-icon {
34
+ @apply flex-wrap gap-y-3 sm:flex-nowrap;
35
+ }
36
+
37
+ .rsui-message-box--with-icon .rsui-message-box__close {
38
+ @apply order-2 ms-auto sm:order-3 sm:ms-0;
39
+ }
40
+
41
+ /* `sm:basis-0` rather than `basis-auto`, to restore exactly what `flex-1` sets. */
42
+ .rsui-message-box--with-icon .rsui-message-box__main {
43
+ @apply order-3 basis-full sm:order-2 sm:basis-0;
3
44
  }
4
45
 
5
46
  .rsui-message-box--default {
@@ -22,18 +63,91 @@
22
63
  @apply bg-background-error border-border-error text-text-primary;
23
64
  }
24
65
 
66
+ /* AI. Same surface language ButtonAI and .rsui-card--ai already use — the warm
67
+ gradient with the Warm Mauve border — so an AI message reads as the same
68
+ family as an AI action. The title carries text-ai for identity; the body stays
69
+ text-primary, because a whole paragraph in Warm Mauve is harder to read and
70
+ the border plus gradient already say "AI". */
71
+ .rsui-message-box--ai {
72
+ @apply bg-linear-to-tr from-background-ai-from to-background-ai-to;
73
+ @apply border-border-ai text-text-primary;
74
+ }
75
+
76
+ .rsui-message-box--ai .rsui-message-box__title {
77
+ @apply text-text-ai;
78
+ }
79
+
25
80
  .rsui-message-box__head {
26
- @apply flex justify-between items-center gap-x-2;
81
+ @apply flex items-center gap-x-2;
27
82
  }
28
83
 
29
84
  .rsui-message-box__content {
30
- @apply flex justify-between items-start gap-x-2;
85
+ @apply flex items-start gap-x-2;
86
+ }
87
+
88
+ /*
89
+ * `items-start` so the icon aligns with the first line of the message rather
90
+ * than centring against a multi-line body. `shrink-0` keeps it from being
91
+ * squeezed by long text.
92
+ */
93
+ .rsui-message-box__icon {
94
+ @apply shrink-0 flex items-center h-6;
95
+ }
96
+
97
+ /*
98
+ * Actions sit under the message, indented to the body rather than the icon, so
99
+ * they read as belonging to the text.
100
+ *
101
+ * Neutral, not variant-coloured: a coloured action on a coloured tint is a
102
+ * contrast problem, and the action is a way out of the message rather than a
103
+ * restatement of its severity. The dismiss is quieter than whatever the consumer
104
+ * puts beside it, which is the only hierarchy this row needs.
105
+ */
106
+ .rsui-message-box__actions {
107
+ @apply flex flex-wrap items-center gap-x-4 gap-y-2 pt-1;
108
+ }
109
+
110
+ .rsui-message-box__dismiss,
111
+ .rsui-message-box__action {
112
+ @apply bg-transparent border-0 p-0 cursor-pointer;
113
+ @apply text-sm font-semibold transition-colors;
114
+ @apply hover:underline underline-offset-4 decoration-2;
115
+ @apply outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-primary rounded-sm;
116
+ }
117
+
118
+ /*
119
+ * Two tiers, and the only hierarchy this row needs: dismiss is the quieter of
120
+ * the pair, whatever the consumer puts beside it is the one they want pressed.
121
+ */
122
+ .rsui-message-box__dismiss {
123
+ @apply text-text-secondary hover:text-text-primary;
124
+ }
125
+
126
+ .rsui-message-box__action {
127
+ @apply text-text-primary;
31
128
  }
32
129
 
130
+ /*
131
+ * `-my-2` so the 40px hit target centres on the first 24px line rather than
132
+ * hanging 8px below it. Under `items-start` the button's own box starts at the
133
+ * padding edge, which put its glyph at y=36 against a title centred at y=28 —
134
+ * and, with an icon shown, two icons in the same row not lining up. The negative
135
+ * margin keeps the target size while claiming only 24px of layout height.
136
+ */
33
137
  .rsui-message-box__close {
34
- @apply size-10;
138
+ @apply size-10 shrink-0 -my-2;
35
139
  }
36
140
 
141
+ /*
142
+ * The glyph colour is set on the Icon itself (`secondary`), not here — the
143
+ * variant rules target the SVG child directly, so a colour on this button would
144
+ * lose to them.
145
+ *
146
+ * It was `disabled` before, which painted a working control in the disabled text
147
+ * colour — Grey-400, 2.41:1 on white — so it looked permanently greyed out and
148
+ * fell under the 3:1 WCAG 1.4.11 asks of a control. Grey-700 reads as quiet
149
+ * without reading as dead.
150
+ */
37
151
  .rsui-message-box__close-icon {
38
152
  @apply size-10 cursor-pointer rounded-lg flex items-center justify-center hover:bg-border-secondary transition duration-200;
39
153
  /* Reset native <button> chrome so it matches the prior inline affordance ... */
@@ -2,16 +2,23 @@
2
2
  @apply flex flex-col gap-y-1;
3
3
  }
4
4
 
5
+ /* gap-x rather than space-x: space-* works by adding margins to children, which is the
6
+ legacy pattern, double-counts against any gap and breaks once the row wraps. Every other
7
+ component in the library spaces with gap. */
5
8
  .rsui-meta-info__top {
6
- @apply flex space-x-1 items-center;
9
+ @apply flex gap-x-1 items-center;
7
10
  }
8
11
 
9
12
  .rsui-meta-info__label-icon {
10
13
  @apply flex items-center justify-center;
11
14
  }
12
15
 
16
+ /* The label is the descriptor, so it recedes: medium weight in the tertiary tone. It used to
17
+ be semibold near-black while the value was regular grey, which inverted the hierarchy — the
18
+ eye landed on "Age" instead of on the number. Grey-600 on white measures 7.26:1, so it stays
19
+ comfortably readable at 12px. */
13
20
  .rsui-meta-info__label {
14
- @apply font-semibold text-xs text-text-primary;
21
+ @apply font-medium text-xs text-text-tertiary;
15
22
  }
16
23
 
17
24
  .rsui-meta-info__help {
@@ -22,9 +29,10 @@
22
29
  @apply focus-visible:ring-offset-2 focus-visible:ring-2 focus-visible:ring-border-primary;
23
30
  }
24
31
 
32
+ /* The value carries the information, so it takes the emphasis the label gave up. */
25
33
  .rsui-meta-info__value {
26
34
  @apply flex items-center gap-x-space-xs;
27
- @apply text-xs text-text-secondary;
35
+ @apply text-xs font-semibold text-text-primary;
28
36
  }
29
37
 
30
38
  .rsui-meta-info--md .rsui-meta-info__label {
@@ -37,4 +37,73 @@
37
37
  selection ring (WCAG 1.4.1); the brand number is colour reinforcement only. */
38
38
  .rsui-metric-card--active .rsui-metric-card__number {
39
39
  @apply text-text-brand;
40
- }
40
+ }
41
+
42
+ /* ---------------------------------------------------------------------------
43
+ Tonal variants
44
+
45
+ Same vocabulary and same mechanism as .rsui-page-header — green / teal /
46
+ light, with surface, ink, muted ink and rule moving together as a named set,
47
+ carried on --rsui-metric-card-* custom properties. Plain properties rather
48
+ than new @theme keys, for the reasons in #285.
49
+
50
+ The tile is a step LIGHTER than the band it sits on (Journey Green 700 on an
51
+ 800 band), so it reads as a raised panel. Each tone names an explicit surface
52
+ rather than a translucent white, so a toned tile still works standing alone
53
+ where there is no band beneath it to show through.
54
+
55
+ metric_card.css imports after card.css, so these single-class rules out-rank
56
+ .rsui-card's own surface at equal specificity. Combining a tone with one of
57
+ Card's semantic variants (brand, success, …) is not supported — pick one.
58
+ --------------------------------------------------------------------------- */
59
+ .rsui-metric-card--toned {
60
+ background: var(--rsui-metric-card-surface, var(--color-background-secondary));
61
+ border-color: var(--rsui-metric-card-rule, var(--color-border-primary));
62
+ }
63
+
64
+ .rsui-metric-card--tone-green {
65
+ --rsui-metric-card-surface: var(--Colors-Journey-Green-700);
66
+ --rsui-metric-card-ink: var(--Colors-Base-white);
67
+ /* 200, not the 300 PageHeader uses. The tile surface is a step lighter than the
68
+ header band it sits on, and 300 on 700 measures 4.46:1 — a hair under AA. */
69
+ --rsui-metric-card-ink-muted: var(--Colors-Journey-Green-200);
70
+ --rsui-metric-card-rule: rgba(255, 255, 255, 0.18);
71
+ }
72
+
73
+ .rsui-metric-card--tone-teal {
74
+ --rsui-metric-card-surface: var(--Colors-Deep-Teal-600);
75
+ --rsui-metric-card-ink: var(--Colors-Base-white);
76
+ --rsui-metric-card-ink-muted: var(--Colors-Deep-Teal-300);
77
+ --rsui-metric-card-rule: rgba(255, 255, 255, 0.18);
78
+ }
79
+
80
+ /* The white-label case: same layout, inverted ink. */
81
+ .rsui-metric-card--tone-light {
82
+ --rsui-metric-card-surface: var(--Colors-Modern-Bone-200);
83
+ --rsui-metric-card-ink: var(--Colors-Grey-900);
84
+ --rsui-metric-card-ink-muted: var(--Colors-Grey-600);
85
+ --rsui-metric-card-rule: var(--Colors-Grey-300);
86
+ }
87
+
88
+ /* Tone-agnostic: only the variable values differ, so the light tone resolves
89
+ these same selectors to dark ink. */
90
+ .rsui-metric-card--toned .rsui-metric-card__number {
91
+ color: var(--rsui-metric-card-ink);
92
+ }
93
+
94
+ .rsui-metric-card--toned .rsui-metric-card__label {
95
+ color: var(--rsui-metric-card-ink-muted);
96
+ }
97
+
98
+ .rsui-metric-card--toned .rsui-metric-card__icon {
99
+ color: var(--rsui-metric-card-ink-muted);
100
+ }
101
+
102
+ /* The active state's brand-coloured number is colour reinforcement only — the
103
+ Card action layer carries the actual selection ring (WCAG 1.4.1). On a tonal
104
+ surface that reinforcement has to go: text-brand is Brand-500 (#136c52),
105
+ which against the green tile's #0e5942 is about 1.3:1 and simply invisible.
106
+ The ring still does the work. */
107
+ .rsui-metric-card--toned.rsui-metric-card--active .rsui-metric-card__number {
108
+ color: var(--rsui-metric-card-ink);
109
+ }
@@ -77,3 +77,79 @@
77
77
  @apply flex flex-col gap-1 lg:flex-row lg:items-center lg:gap-4;
78
78
  }
79
79
 
80
+
81
+ /* ---------------------------------------------------------------------------
82
+ Tonal variants
83
+
84
+ White-labelling is why these are named sets rather than a background prop.
85
+ Pass a colour alone and a client who picks a light one gets white text on
86
+ white; background, ink, muted ink and rule have to move together, the way
87
+ Card handles its variants.
88
+
89
+ Plain custom properties rather than new @theme keys, for two reasons: the
90
+ four values must travel as a set, and a new theme key does not reliably
91
+ generate a utility — the trap in #285 that made every focus ring invisible.
92
+ Same pattern .rsui-stage-dial already uses for its accent.
93
+
94
+ A toned header carries its own padding, because the band has to read as a
95
+ band. Place it outside the page's content gutter so it bleeds to the edges;
96
+ an untoned header is unchanged and still inherits the layout's padding.
97
+ --------------------------------------------------------------------------- */
98
+ .rsui-page-header--toned {
99
+ /* Fallbacks keep an unrecognised tone legible rather than transparent. */
100
+ background: var(--rsui-page-header-bg, var(--color-background-secondary));
101
+
102
+ @apply py-space-lg px-space-xl;
103
+ }
104
+
105
+ .rsui-page-header--tone-green {
106
+ --rsui-page-header-bg: var(--Colors-Journey-Green-800);
107
+ --rsui-page-header-ink: var(--Colors-Base-white);
108
+ --rsui-page-header-ink-muted: var(--Colors-Journey-Green-300);
109
+ --rsui-page-header-rule: rgba(255, 255, 255, 0.18);
110
+ }
111
+
112
+ .rsui-page-header--tone-teal {
113
+ --rsui-page-header-bg: var(--Colors-Deep-Teal-700);
114
+ --rsui-page-header-ink: var(--Colors-Base-white);
115
+ --rsui-page-header-ink-muted: var(--Colors-Deep-Teal-300);
116
+ --rsui-page-header-rule: rgba(255, 255, 255, 0.18);
117
+ }
118
+
119
+ /* The white-label case. Same layout, inverted ink — a client's own background
120
+ may be light, so the component cannot assume light-on-dark. */
121
+ .rsui-page-header--tone-light {
122
+ --rsui-page-header-bg: var(--Colors-Base-white);
123
+ --rsui-page-header-ink: var(--Colors-Grey-900);
124
+ --rsui-page-header-ink-muted: var(--Colors-Grey-600);
125
+ --rsui-page-header-rule: var(--Colors-Grey-300);
126
+ }
127
+
128
+ /* Ink application is tone-agnostic: only the variable values differ, so the
129
+ light tone resolves these to dark ink through the same rules. */
130
+ .rsui-page-header--toned .rsui-page-header__title h1 {
131
+ color: var(--rsui-page-header-ink);
132
+ }
133
+
134
+ .rsui-page-header--toned .rsui-page-header__subtitle {
135
+ color: var(--rsui-page-header-ink-muted);
136
+ }
137
+
138
+ .rsui-page-header--toned .rsui-page-header__meta {
139
+ border-top: 1px solid var(--rsui-page-header-rule);
140
+
141
+ @apply mt-space-md pt-space-md;
142
+ }
143
+
144
+ /* MetaInfo sets its own dark label and value tokens, which disappear on a dark
145
+ band. Reaching into another component's classes is not ideal, but an
146
+ invisible meta row is worse, and what a slot looks like on this component's
147
+ own tonal surface is this stylesheet's business. */
148
+ .rsui-page-header--toned .rsui-meta-info__label {
149
+ color: var(--rsui-page-header-ink);
150
+ }
151
+
152
+ .rsui-page-header--toned .rsui-meta-info__value,
153
+ .rsui-page-header--toned .rsui-meta-info__help {
154
+ color: var(--rsui-page-header-ink-muted);
155
+ }
@@ -1,25 +1,50 @@
1
1
  .rsui-radio-card {
2
2
  @apply relative cursor-pointer transition-all;
3
- @apply rounded-xl shadow-xs outline-hidden select-none;
4
- @apply flex flex-col gap-3 p-3 max-w-80 w-80;
3
+ /* No resting shadow: this was the only card in the family that sat lifted while the
4
+ other seven are flat. Padding matches the family's 24/32 rhythm rather than the 12/12
5
+ it used to carry alone. ring-offset-2 matches the focus geometry every other card
6
+ uses — this ring previously hugged the border with no offset. */
7
+ @apply rounded-xl outline-hidden select-none;
8
+ @apply flex flex-col gap-3 py-space-lg px-space-xl max-w-80 w-80;
5
9
  @apply bg-background-primary border border-border-primary;
6
- @apply focus-visible:ring-2 focus-visible:ring-border-primary;
10
+ @apply focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-primary;
11
+ }
12
+
13
+ /* Hover state layer, matching .rsui-card--hoverable. ::before because ::after already
14
+ carries the disabled scrim below. */
15
+ .rsui-radio-card::before {
16
+ content: '';
17
+ @apply absolute inset-0 rounded-xl pointer-events-none;
18
+ @apply bg-background-primary-contrast opacity-0 transition-opacity duration-200;
19
+ }
20
+
21
+ .rsui-radio-card:hover::before {
22
+ @apply opacity-5;
23
+ }
24
+
25
+ .rsui-radio-card--disabled:hover::before {
26
+ @apply opacity-0;
7
27
  }
8
28
 
9
29
  .rsui-radio-card--flexible {
10
30
  @apply max-w-full w-full;
11
31
  }
12
32
 
33
+ /* Selection is the family's brand ring — the same ring-2 / ring-offset-2 / brand-500 that
34
+ Card's action layer and CardGroup use. This used to be a 10% translucent scrim, a third
35
+ distinct idiom for "selected" in one component family. The ring is a shape boundary
36
+ (present vs absent) rather than colour alone, which is the WCAG 1.4.1 property Card's own
37
+ comment calls out, and it holds its brand colour through focus. */
13
38
  .rsui-radio-card--selected {
14
- @apply focus-visible:ring-0 border-border-primary;
15
-
16
- @apply after:content-[''] after:absolute after:inset-0 after:rounded-md after:opacity-10 after:bg-background-primary-contrast;
39
+ @apply ring-2 ring-offset-2 ring-brand-500 border-border-primary;
40
+ @apply focus-visible:ring-brand-500;
17
41
  }
18
42
 
19
43
  .rsui-radio-card--disabled {
20
44
  @apply focus-visible:ring-0 border-border-disabled cursor-default;
21
45
 
22
- @apply after:content-[''] after:absolute after:inset-0 after:rounded-md after:opacity-60 after:bg-background-disabled;
46
+ /* Same corner correction as --selected above, and more visible here at 60% opacity. */
47
+ @apply after:content-[''] after:absolute after:inset-0 after:rounded-xl after:opacity-60 after:bg-background-disabled;
23
48
  }
24
49
 
25
50
  .rsui-radio-card__title-row {
@@ -17,3 +17,71 @@
17
17
  @apply flex-1;
18
18
  }
19
19
 
20
+ /*
21
+ * The view-all sits in its own region so it can centre, rather than joining the
22
+ * right-aligned action row.
23
+ *
24
+ * `order-first md:order-last` keeps it trailing at both breakpoints. The footer
25
+ * is `flex-col-reverse` below `md`, so the last DOM child paints at the top —
26
+ * appending the region put the view-all *above* the actions and the content on
27
+ * mobile, which is the opposite of what every comment about it claims. Ordering
28
+ * it first puts it back at the bottom there, and `md:order-last` restores it to
29
+ * the end of the desktop row.
30
+ */
31
+ .rsui-section-footer__view-all-region {
32
+ @apply flex items-center justify-center order-first md:order-last;
33
+ }
34
+
35
+ /*
36
+ * `flex-1` only when the view-all has the footer to itself, which is the case
37
+ * that wants centring. Applying it unconditionally made the region a second
38
+ * greedy sibling alongside `content-start`: the two split the row and squeezed
39
+ * the action buttons towards the middle instead of the right edge — measured at
40
+ * x=599 of 1265. With actions present the region stays content-sized and
41
+ * `justify-between` puts it at the end of the row where it belongs.
42
+ */
43
+ .rsui-section-footer__view-all-region--full {
44
+ @apply flex-1 w-full;
45
+ }
46
+
47
+ /*
48
+ * The trailing "view all" link. Matches the "See all" treatment already used in
49
+ * section headers: `font-semibold text-sm` on the tertiary-button colour, no
50
+ * underline, no arrow. That pairing is what makes it read as an action without
51
+ * competing with the section's own type.
52
+ *
53
+ * Deliberately not LinkSlot, which sits at `font-medium`, carries an always-on
54
+ * underline rule, and pins a font size per variant — all three wrong for this.
55
+ * No `text-*` here either: the size comes from whatever encloses the footer, so
56
+ * the link sits a step below the section's own type wherever it lands rather than
57
+ * locking to one scale. The semibold is what makes it read as an action.
58
+ *
59
+ * Colour comes from `--color-button-tertiary` rather than a literal brand value,
60
+ * so it tracks whatever tertiary actions are doing. It is overridden per section
61
+ * variant below rather than hardcoded, because a brand-coloured link is
62
+ * invisible on a brand-coloured surface.
63
+ *
64
+ * `w-fit` so the link stays the width of its own text. Its region centres it, and
65
+ * an underline that ran the width of the footer would read as a rule rather than
66
+ * as part of the link.
67
+ */
68
+ .rsui-section-footer__view-all {
69
+ @apply inline-flex w-fit items-center whitespace-nowrap;
70
+ @apply font-semibold no-underline cursor-pointer transition-colors;
71
+ @apply text-button-tertiary hover:text-button-tertiary-hover;
72
+ /* Underline on hover only: the resting state stays as clean as the header's
73
+ "See all", but the link still confirms itself as one under the pointer. */
74
+ @apply hover:underline underline-offset-4 decoration-2;
75
+ @apply focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-button-tertiary outline-hidden;
76
+ }
77
+
78
+ /*
79
+ * No dark-surface override here, deliberately. Every plain Section variant is a
80
+ * light tint, so the tertiary colour reads on all nine. The one dark surface in
81
+ * the package is the slider's `--featured` (brand-600), where a brand link would
82
+ * be brand on brand — but `SectionSlider` renders no footer and does not forward
83
+ * Section's `#footer` slot, so no consumer can put this link there. A rule for it
84
+ * would be unreachable, untested, and would imply a capability that does not
85
+ * exist. Add it alongside a footer slot on the slider, if that is ever wanted.
86
+ */
87
+
@@ -44,12 +44,24 @@
44
44
  @apply basis-full;
45
45
  }
46
46
 
47
+ /* Redundant now that the base badge carries no margin — kept as a guard so re-adding one
48
+ cannot break the stacked layout, where the badge starts a new line and must sit flush. */
47
49
  .rsui-section-header__title--stacked .rsui-section-header__badge {
48
50
  @apply ml-0;
49
51
  }
50
52
 
53
+ /* ACTION SIZE: section-header actions belong at `sm`, not the button default of `md`. A md
54
+ button is 42px against a 32px title box, so a cluster of them outweighs the heading they
55
+ belong to. This is guidance rather than something enforced here: constraining button height
56
+ from inside the header would silently override a size prop the consumer passed. The stories
57
+ demonstrate the `sm` pairing.
58
+
59
+ TITLE SIZE: text-3xl from lg up. At a flat text-2xl the title box was 32px while even an sm
60
+ button is 38px, so the heading never led its own actions. Responsive rather than flat, and
61
+ matching how PageHeader scales, because mobile stacks the actions anyway (see
62
+ __actions-mobile) and the imbalance only really shows on wide screens. */
51
63
  .rsui-section-header__title-text {
52
- @apply text-2xl font-bold line-clamp-2 md:line-clamp-1 text-text-primary;
64
+ @apply text-2xl lg:text-3xl font-bold line-clamp-2 md:line-clamp-1 text-text-primary;
53
65
  /* Reset heading UA margins so an <h1>-<h6> title matches the previous <div> */
54
66
  /* min-w-0 lets the title shrink and truncate first; the badge is shrink-0 so */
55
67
  /* it keeps its size. No flex-1 — a growing title pushes the See-all badge up */
@@ -62,8 +74,10 @@
62
74
  @apply line-clamp-none md:line-clamp-none;
63
75
  }
64
76
 
77
+ /* No ml-space-xs here: the parent is a flex row that already supplies gap-space-xs, so the
78
+ margin stacked on top of it and the badge sat 16px from its label instead of 8px. */
65
79
  .rsui-section-header__badge {
66
- @apply ml-space-xs flex items-center shrink-0;
80
+ @apply flex items-center shrink-0;
67
81
  }
68
82
 
69
83
  .rsui-section-header__subtitle {