@carbon/styles 1.112.0 → 1.113.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.
@@ -0,0 +1,642 @@
1
+ //
2
+ // Copyright IBM Corp. 2020, 2025
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ @use 'sass:map';
9
+
10
+ @use '../../config' as *;
11
+ @use '../../theme' as *;
12
+ @use '../../spacing' as *;
13
+ @use '../../motion' as *;
14
+ @use '../../type';
15
+ @use '../../breakpoint' as *;
16
+ @use '../../utilities';
17
+ @use '../button/tokens' as *;
18
+ @use './side-panel-variables' as *;
19
+ @use './animations' as *;
20
+
21
+ // ---------------------------------------------------------------------------
22
+ // Private helper variables (file-scope so helpers can reference them)
23
+ // ---------------------------------------------------------------------------
24
+
25
+ $block-class: #{$prefix}--side-panel;
26
+ $action-set-block-class: #{$prefix}--action-set;
27
+ $resizer-class: #{$prefix}--resizer;
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Private helper mixins (must be declared outside the public mixin)
31
+ // ---------------------------------------------------------------------------
32
+
33
+ @mixin setPanelSize($size: map.get($side-panel-sizes, md)) {
34
+ inline-size: clamp(
35
+ 16rem,
36
+ var(--#{$prefix}-side-panel-modified-size, $size),
37
+ 100%
38
+ );
39
+ }
40
+
41
+ @mixin setDividerStyles() {
42
+ position: absolute;
43
+ background-color: $border-subtle-01;
44
+ block-size: 1px;
45
+ content: '';
46
+ inline-size: 100%;
47
+ inset-block-end: 0;
48
+ inset-inline-start: 0;
49
+ opacity: var(--#{$block-class}--scroll-animation-progress);
50
+ }
51
+
52
+ @mixin setCommonTitleStyles() {
53
+ padding-inline-end: var(--#{$block-class}--title-padding-right);
54
+ }
55
+
56
+ @mixin side-panel {
57
+ @property --panel-transform {
58
+ inherits: true;
59
+ initial-value: 320px;
60
+ syntax: '<length>';
61
+ }
62
+
63
+ .#{$block-class}--scrolls {
64
+ overflow: auto;
65
+ overflow-x: hidden;
66
+ @supports (overflow-inline: hidden) {
67
+ overflow-inline: hidden;
68
+ }
69
+ }
70
+
71
+ .#{$block-class} {
72
+ --panel-transform: 320px;
73
+ --#{$block-class}--title-stop: #{$spacing-05};
74
+ --#{$block-class}--scroll-animation-progress: 0;
75
+ --#{$block-class}--title-padding-right: #{$spacing-07};
76
+ --#{$block-class}--actions-height: #{$spacing-10};
77
+
78
+ position: fixed;
79
+ z-index: utilities.z('modal');
80
+ display: grid;
81
+ box-sizing: border-box;
82
+ background-color: $layer-01;
83
+ block-size: calc(100% - 3rem);
84
+ color: $text-primary;
85
+ /* if the title does not scroll then we have a child scrolling section. */
86
+ grid-template-rows: auto 1fr auto; /* titles content and actions */
87
+ inset-block-start: $spacing-09;
88
+ max-inline-size: 100%;
89
+ min-inline-size: map.get($side-panel-sizes, xs);
90
+
91
+ transform: translateX(0);
92
+ transition-behavior: allow-discrete;
93
+ transition-duration: $duration-moderate-01;
94
+ transition-property: display, opacity, transform;
95
+
96
+ &:not(.#{$block-class}--slide-in) {
97
+ &.#{$block-class}--resizable {
98
+ // Reserve a zero-width column for the resizer handle.
99
+ // Takes effect only when the Resizer child is present.
100
+ &:has(.#{$resizer-class}) {
101
+ grid-template-columns: 0 1fr;
102
+ @media (prefers-reduced-motion: no-preference) {
103
+ transition: all $duration-moderate-01 linear;
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ @starting-style {
110
+ opacity: 0;
111
+ transform: translateX(var(--panel-transform));
112
+ }
113
+
114
+ @include breakpoint(md) {
115
+ max-inline-size: 75vw;
116
+ }
117
+
118
+ @each $size, $size_value in $side-panel-sizes {
119
+ &.#{$block-class}--#{$size} {
120
+ @include setPanelSize($size_value);
121
+ }
122
+ }
123
+
124
+ &.#{$block-class}--open.#{$block-class}--right-placement {
125
+ animation: side-panel-entrance-right $duration-moderate-01
126
+ motion(entrance, productive) forwards;
127
+ }
128
+
129
+ // animation only set for older browsers that do not support `transition-behavior: allow-discrete;`
130
+ &.#{$block-class}--open.#{$block-class}--left-placement {
131
+ animation: side-panel-entrance-left $duration-moderate-01
132
+ motion(entrance, productive) forwards;
133
+ }
134
+
135
+ // animation only set for older browsers that do not support `transition-behavior: allow-discrete;`
136
+ &.#{$block-class}--closing.#{$block-class}--right-placement {
137
+ animation: side-panel-exit-right $duration-moderate-01
138
+ motion(exit, productive) forwards;
139
+ }
140
+
141
+ &.#{$block-class}--closing.#{$block-class}--left-placement {
142
+ animation: side-panel-exit-left $duration-moderate-01
143
+ motion(exit, productive) forwards;
144
+ }
145
+
146
+ @supports (transition-behavior: allow-discrete) {
147
+ &.#{$block-class}--closing {
148
+ opacity: 0;
149
+ transform: translateX(var(--panel-transform, 320px));
150
+ transition-duration: $duration-moderate-01;
151
+ }
152
+ &.#{$block-class}--closing.#{$block-class}--left-placement {
153
+ transform: translateX(calc(-1 * var(--panel-transform, 320px)));
154
+ }
155
+ }
156
+
157
+ @media (prefers-reduced-motion) {
158
+ /* styles to apply if a user's device settings are set to reduced motion */
159
+ &.#{$block-class}--open.#{$block-class}--right-placement,
160
+ &.#{$block-class}--open.#{$block-class}--left-placement {
161
+ animation: side-panel-entrance-reduced $duration-moderate-01
162
+ motion(exit, productive) forwards;
163
+ @starting-style {
164
+ opacity: 0;
165
+ transform: translateX(0);
166
+ }
167
+ }
168
+ &.#{$block-class}--closing.#{$block-class}--left-placement,
169
+ &.#{$block-class}--closing.#{$block-class}--right-placement {
170
+ animation: side-panel-exit-reduced $duration-moderate-01
171
+ motion(exit, productive) forwards;
172
+ @starting-style {
173
+ opacity: 1;
174
+ transform: translateX(0);
175
+ }
176
+ }
177
+ }
178
+
179
+ &.#{$block-class}--animated-title {
180
+ grid-template-rows: 1fr auto; /* titles and content (actions are external to this element) */
181
+ }
182
+
183
+ &.#{$block-class}--condensed-actions {
184
+ --#{$block-class}--actions-height: #{$spacing-09};
185
+ }
186
+
187
+ &:not(.#{$block-class}--has-overlay) {
188
+ box-shadow: 0 $spacing-01 $spacing-02 $overlay;
189
+ }
190
+
191
+ // Slide-in panels should use border not shadows since they don’t layer
192
+ &.#{$block-class}--slide-in,
193
+ &.#{$block-class}--slide-in:not(.#{$block-class}--has-overlay) {
194
+ box-shadow: none;
195
+ }
196
+
197
+ .#{$block-class}__actions-container {
198
+ inline-size: 100%;
199
+ }
200
+ &.#{$block-class}--right-placement {
201
+ border-inline-start: 1px solid $border-subtle-01;
202
+ inset-inline-end: 0;
203
+ }
204
+ &.#{$block-class}--left-placement {
205
+ .#{$resizer-class} {
206
+ grid-column: 2;
207
+ inset-inline-start: 0;
208
+
209
+ &::before {
210
+ inset-inline-start: 0;
211
+ }
212
+ }
213
+ &:not(.#{$block-class}--slide-in) {
214
+ &.#{$block-class}--resizable {
215
+ &:has(.#{$resizer-class}) {
216
+ grid-template-columns: 1fr 0;
217
+
218
+ @media (prefers-reduced-motion: no-preference) {
219
+ transition: all $duration-moderate-01 linear;
220
+ }
221
+ }
222
+ }
223
+ }
224
+
225
+ border-inline-end: 1px solid $border-subtle-01;
226
+ inset-inline-start: 0;
227
+ }
228
+ &.#{$block-class}.#{$block-class}--has-slug,
229
+ &.#{$block-class}.#{$block-class}--has-ai-label,
230
+ &.#{$block-class}.#{$block-class}--has-decorator {
231
+ border-color: transparent;
232
+ box-shadow:
233
+ inset 0 -80px 70px -65px $ai-inner-shadow,
234
+ 0 4px 10px 2px $ai-drop-shadow;
235
+ }
236
+
237
+ .#{$resizer-class}--vertical::before {
238
+ position: absolute;
239
+ z-index: -1;
240
+ background-color: transparent;
241
+ block-size: 100%;
242
+ content: '';
243
+ inline-size: $spacing-01;
244
+ inset-block-end: 0;
245
+ inset-inline-end: 0;
246
+ transition: background-color $duration-moderate-01
247
+ motion(standard, productive);
248
+ }
249
+
250
+ &:hover {
251
+ .#{$resizer-class}--vertical::before {
252
+ background-color: $button-secondary-hover;
253
+ }
254
+ }
255
+
256
+ .#{$resizer-class} {
257
+ background-color: transparent;
258
+ grid-row: span 4 / span 3;
259
+ inset-inline-start: -$spacing-02;
260
+
261
+ &--vertical::after {
262
+ position: absolute;
263
+ z-index: 10;
264
+ block-size: 100%;
265
+ content: '';
266
+ inline-size: $spacing-03;
267
+ inset-inline-start: -$spacing-01;
268
+ }
269
+
270
+ &:hover,
271
+ &:focus {
272
+ background-color: $border-interactive;
273
+ }
274
+ }
275
+
276
+ .#{$block-class}__header {
277
+ --#{$block-class}--title-padding-bottom: #{$spacing-05};
278
+
279
+ position: sticky;
280
+ z-index: 4;
281
+ padding: $spacing-05;
282
+ background-color: $layer-01;
283
+ inset-block-start: calc(
284
+ -1px * var(--#{$block-class}--scroll-animation-distance)
285
+ );
286
+ min-block-size: $spacing-08;
287
+ padding-block-end: 0;
288
+
289
+ &.#{$block-class}__header--has-title {
290
+ min-block-size: auto;
291
+ }
292
+
293
+ &:has(.#{$block-class}__subtitle-text),
294
+ &.#{$block-class}__header--has-subtitle {
295
+ --#{$block-class}--title-padding-bottom: #{$spacing-03};
296
+ }
297
+
298
+ &:has(.#{$block-class}__navigation-back-button),
299
+ &.#{$block-class}__header--has-navigation-back {
300
+ padding-block-start: $spacing-07;
301
+ }
302
+
303
+ &:has(.#{$block-class}__navigation-back-button.#{$prefix}--btn--md),
304
+ &.#{$block-class}__header--has-navigation-back.#{$prefix}--btn--md {
305
+ padding-block-start: $spacing-08;
306
+ }
307
+
308
+ &::before {
309
+ @include setDividerStyles();
310
+
311
+ z-index: 9;
312
+ }
313
+
314
+ &.#{$block-class}__header--no-title-animation {
315
+ position: relative;
316
+ inset-block-start: 0;
317
+ }
318
+
319
+ &.#{$block-class}__header--no-title-animation::before {
320
+ opacity: 1;
321
+ }
322
+
323
+ &.#{$block-class}__header--reduced-motion {
324
+ z-index: 5;
325
+ border-block-end: 1px solid $border-subtle-01;
326
+ margin-block-end: $spacing-05;
327
+ }
328
+
329
+ &.#{$block-class}__header--reduced-motion.#{$block-class}__header--no-title-animation {
330
+ border-block-end: 0;
331
+ margin-block-end: 0;
332
+ }
333
+
334
+ &.#{$block-class}__header--on-detail-step
335
+ .#{$block-class}__navigation-back-button.#{$prefix}--btn--md
336
+ ~ .#{$block-class}__collapsed-title-text {
337
+ inset-block-start: $spacing-06;
338
+ }
339
+
340
+ &.#{$block-class}__header--on-detail-step:not(
341
+ .#{$block-class}__header--has-title
342
+ ) {
343
+ padding: $spacing-05 $spacing-05 $spacing-03 $spacing-05;
344
+ block-size: calc(#{$spacing-08} + #{$spacing-02});
345
+ }
346
+
347
+ &:not(.#{$block-class}__header--has-title)::before {
348
+ background-color: transparent;
349
+ }
350
+ }
351
+
352
+ // Remove min‑block‑size when the header contains no child elements to prevent unnecessary blank space
353
+ .#{$block-class}__header:empty {
354
+ min-block-size: unset;
355
+ }
356
+
357
+ &.#{$block-class}:has(.#{$block-class}__action-toolbar),
358
+ &.#{$block-class}--has-action-toolbar,
359
+ &.#{$block-class}--has-slug,
360
+ &.#{$block-class}--has-ai-label,
361
+ &.#{$block-class}--has-decorator {
362
+ --#{$block-class}--title-padding-right: #{$spacing-10};
363
+ }
364
+
365
+ &.#{$block-class}:has(.#{$block-class}__action-toolbar),
366
+ &.#{$block-class}--has-action-toolbar {
367
+ &.#{$block-class}--has-slug,
368
+ &.#{$block-class}--has-ai-label,
369
+ &.#{$block-class}--has-decorator {
370
+ --#{$block-class}--title-padding-right: #{$spacing-11};
371
+ }
372
+ }
373
+
374
+ .#{$block-class}__animated-scroll-wrapper {
375
+ display: grid;
376
+ grid-template-rows: auto 1fr;
377
+ }
378
+
379
+ .#{$block-class}__title {
380
+ position: sticky;
381
+ z-index: 4;
382
+ background-color: $layer-01;
383
+
384
+ /* border-bottom used instead of padding which wrapped text shows through */
385
+ border-block-end: var(--#{$block-class}--title-padding-bottom) solid
386
+ transparent;
387
+ inset-block-start: var(--#{$block-class}--title-stop);
388
+ }
389
+
390
+ .#{$block-class}__title-text {
391
+ @include type.type-style('heading-03');
392
+ @include setCommonTitleStyles();
393
+
394
+ opacity: calc(1 - var(--#{$block-class}--scroll-animation-progress));
395
+ }
396
+
397
+ .#{$block-class}__title--no-label .#{$block-class}__title-text {
398
+ transform: translateY(
399
+ calc(
400
+ -1 * #{$spacing-05} *
401
+ var(--#{$block-class}--scroll-animation-progress)
402
+ )
403
+ );
404
+ }
405
+
406
+ .#{$block-class}__header--no-title-animation .#{$block-class}__title-text {
407
+ position: static;
408
+ }
409
+
410
+ .#{$block-class}__label-text {
411
+ @include type.type-style('label-01');
412
+
413
+ opacity: calc(1 - var(--#{$block-class}--scroll-animation-progress));
414
+ padding-inline-end: var(--#{$block-class}--title-padding-right);
415
+ }
416
+
417
+ .#{$block-class}__collapsed-title-text {
418
+ @include type.type-style('heading-compact-02');
419
+ @include setCommonTitleStyles();
420
+
421
+ position: absolute;
422
+ inset-block-start: 0;
423
+ opacity: var(--#{$block-class}--scroll-animation-progress);
424
+ }
425
+
426
+ .#{$block-class}__title--no-label .#{$block-class}__collapsed-title-text {
427
+ transform: translateY(
428
+ calc(
429
+ #{$spacing-05} * (1 - var(
430
+ --#{$block-class}--scroll-animation-progress
431
+ ))
432
+ )
433
+ );
434
+ }
435
+
436
+ .#{$block-class}__subtitle-text {
437
+ @include type.type-style('body-compact-01');
438
+
439
+ opacity: calc(1 - var(--#{$block-class}--scroll-animation-progress));
440
+ padding-block-end: $spacing-05;
441
+ padding-inline-end: var(--#{$block-class}--title-padding-right);
442
+ }
443
+
444
+ .#{$block-class}__header--no-title-animation
445
+ .#{$block-class}__subtitle-text {
446
+ z-index: 2;
447
+ background-color: $layer-01;
448
+ }
449
+
450
+ .#{$block-class}__title-text + .#{$block-class}__subtitle-text {
451
+ padding-block-start: $spacing-05;
452
+ }
453
+ .#{$block-class}__inner-content {
454
+ padding: 0 $spacing-05 $spacing-05;
455
+ }
456
+
457
+ .#{$block-class}__inner-content--no-animated-title {
458
+ padding-block-start: $spacing-05;
459
+ }
460
+
461
+ .#{$block-class}__header:has(.#{$block-class}__action-toolbar)
462
+ + .#{$block-class}__inner-content,
463
+ .#{$block-class}__header--has-action-toolbar
464
+ + .#{$block-class}__inner-content {
465
+ padding-block-start: $spacing-03;
466
+ }
467
+
468
+ &.#{$block-class}--has-slug .#{$block-class}--scrolls,
469
+ &.#{$block-class}--has-ai-label .#{$block-class}--scrolls,
470
+ &.#{$block-class}--has-decorator .#{$block-class}--scrolls {
471
+ @include utilities.ai-popover-gradient('default', 0, 'layer');
472
+
473
+ box-shadow:
474
+ inset 0 -80px 70px -65px $ai-inner-shadow,
475
+ 0 4px 10px 2px $ai-drop-shadow;
476
+ }
477
+
478
+ .#{$block-class}__action-toolbar {
479
+ position: sticky;
480
+ z-index: 4;
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: flex-start;
484
+ background-color: $layer-01;
485
+ }
486
+
487
+ .#{$block-class}__action-toolbar-leading-button {
488
+ margin-inline-end: $spacing-03;
489
+ }
490
+
491
+ .#{$prefix}--btn.#{$block-class}__navigation-back-button {
492
+ position: fixed;
493
+ z-index: 5;
494
+ inset-block-start: 0;
495
+ inset-inline-start: 0;
496
+ }
497
+ .#{$prefix}--btn.#{$block-class}__navigation-back-button,
498
+ .#{$prefix}--btn.#{$block-class}__close-button {
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ padding: 0;
503
+ background-color: unset;
504
+ block-size: $spacing-07;
505
+ color: $text-primary;
506
+ inline-size: $spacing-07;
507
+ min-block-size: 0;
508
+
509
+ &:hover {
510
+ background-color: $background-hover;
511
+ }
512
+ .#{$block-class}--btn__icon {
513
+ margin: 0;
514
+ }
515
+ }
516
+
517
+ .#{$prefix}--btn--md.#{$block-class}__navigation-back-button,
518
+ .#{$prefix}--btn--md.#{$block-class}__close-button {
519
+ block-size: $spacing-08;
520
+ inline-size: $spacing-08;
521
+ }
522
+
523
+ .#{$block-class}__slug-and-close,
524
+ .#{$block-class}__ai-label-and-close,
525
+ .#{$block-class}__decorator-and-close {
526
+ position: absolute;
527
+ z-index: 10; /* must be higher than title container border bottom */
528
+ display: flex;
529
+ block-size: $spacing-07;
530
+ inset-block-start: 0;
531
+ inset-inline-end: 0;
532
+
533
+ @media (prefers-reduced-motion) {
534
+ position: absolute;
535
+ }
536
+ }
537
+ .#{$block-class}__decorator-and-close .#{$prefix}--ai-label__button--xs {
538
+ margin: $spacing-02;
539
+ }
540
+
541
+ .#{$block-class}__actions-container {
542
+ // stick to bottom
543
+ position: sticky;
544
+ background-color: $layer-01;
545
+ border-block-start: 1px solid $border-subtle-01;
546
+ inset-block-end: 0;
547
+
548
+ &.#{$action-set-block-class}--2xl {
549
+ .#{$action-set-block-class}__action-button {
550
+ inline-size: 100%;
551
+ max-inline-size: 100%;
552
+ }
553
+
554
+ @include breakpoint(md) {
555
+ flex-direction: row;
556
+ .#{$action-set-block-class}__action-button {
557
+ inline-size: 25%;
558
+ }
559
+ }
560
+ }
561
+
562
+ .#{$action-set-block-class}__action-button.#{$action-set-block-class}__action-button {
563
+ // extra class needed to override default size
564
+ block-size: var(--#{$block-class}--actions-height);
565
+ }
566
+ }
567
+ &.#{$block-class}.#{$block-class}--xs
568
+ .#{$block-class}__actions-container.#{$action-set-block-class}--sm {
569
+ @include setPanelSize(map.get($side-panel-sizes, xs));
570
+ }
571
+ }
572
+
573
+ // form fields should receive correct background color
574
+ .#{$block-class} .#{$prefix}--text-input,
575
+ .#{$block-class} .#{$prefix}--text-area,
576
+ .#{$block-class} .#{$prefix}--search-input,
577
+ .#{$block-class} .#{$prefix}--select-input,
578
+ .#{$block-class} .#{$prefix}--multi-select,
579
+ .#{$block-class} .#{$prefix}--dropdown,
580
+ .#{$block-class} .#{$prefix}--dropdown-list,
581
+ .#{$block-class} .#{$prefix}--number input[type='number'],
582
+ .#{$block-class} .#{$prefix}--date-picker__input {
583
+ background-color: $field-02;
584
+ }
585
+
586
+ @keyframes side-panel-overlay-entrance {
587
+ 0% {
588
+ opacity: 0;
589
+ }
590
+
591
+ 100% {
592
+ opacity: 1;
593
+ }
594
+ }
595
+
596
+ @keyframes side-panel-overlay-exit {
597
+ 0% {
598
+ opacity: 1;
599
+ }
600
+
601
+ 100% {
602
+ opacity: 0;
603
+ }
604
+ }
605
+
606
+ .#{$block-class}__visually-hidden {
607
+ position: absolute;
608
+ overflow: hidden;
609
+ padding: 0;
610
+ border: 0;
611
+ margin: -1px;
612
+ block-size: 1px;
613
+ clip: rect(0, 0, 0, 0);
614
+ inline-size: 1px;
615
+ visibility: inherit;
616
+ white-space: nowrap;
617
+ }
618
+
619
+ .#{$block-class}__overlay {
620
+ position: fixed;
621
+ z-index: utilities.z('overlay');
622
+ animation: side-panel-overlay-entrance $duration-moderate-01
623
+ motion(entrance, productive) forwards;
624
+ background-color: $overlay;
625
+ block-size: 100%;
626
+ inline-size: 100%;
627
+ inset: 0;
628
+ }
629
+
630
+ .#{$block-class}__overlay--closing {
631
+ animation: side-panel-overlay-exit $duration-moderate-01
632
+ motion(exit, productive) forwards;
633
+ }
634
+
635
+ .#{$block-class}--has-slug + .#{$block-class}__overlay,
636
+ .#{$block-class}--has-ai-label + .#{$block-class}__overlay,
637
+ .#{$block-class}--has-decorator + .#{$block-class}__overlay {
638
+ background-color: $ai-overlay;
639
+ }
640
+
641
+ // end @mixin side-panel
642
+ }
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright IBM Corp. 2025
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ @forward 'truncated-text';
9
+ @use 'truncated-text';
10
+
11
+ @include truncated-text.truncated-text;
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright IBM Corp. 2025
3
+ //
4
+ // This source code is licensed under the Apache-2.0 license found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ //
7
+
8
+ //-----------------------------
9
+ // Truncated text
10
+ //-----------------------------
11
+
12
+ @use '../../config' as *;
13
+ @use '../../theme';
14
+
15
+ /// Truncated text styles
16
+ /// @access public
17
+ /// @group truncated-text
18
+ @mixin truncated-text {
19
+ .#{$prefix}--truncated-text {
20
+ &__text-content {
21
+ display: -webkit-box;
22
+ overflow: hidden;
23
+ -webkit-box-orient: vertical;
24
+ line-height: initial;
25
+ text-overflow: clip;
26
+ }
27
+
28
+ &__expand-toggle {
29
+ color: theme.$link-primary;
30
+ cursor: pointer;
31
+
32
+ &:focus-visible {
33
+ outline: 2px solid theme.$focus;
34
+ outline-offset: 2px;
35
+ }
36
+ }
37
+
38
+ &__tooltip-trigger {
39
+ display: inline;
40
+ padding: 0;
41
+ border: 0;
42
+ background: none;
43
+ color: inherit;
44
+ cursor: default;
45
+ font: inherit;
46
+ text-align: inherit;
47
+
48
+ &:focus-visible {
49
+ outline: 2px solid theme.$focus;
50
+ outline-offset: 2px;
51
+ }
52
+ }
53
+ }
54
+ }