@collectivetrait/lineaui 0.0.0-stage → 1.0.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.
Files changed (130) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +21 -0
  3. package/README.md +113 -2
  4. package/config.json +3 -0
  5. package/dist/blocks.css +5042 -0
  6. package/dist/blocks.css.map +1 -0
  7. package/dist/bundle.js +873 -0
  8. package/dist/core.css +1641 -0
  9. package/dist/core.css.map +1 -0
  10. package/dist/icons-manifest.json +1 -0
  11. package/dist/icons.css +158 -0
  12. package/dist/styles.css +10546 -0
  13. package/dist/styles.css.map +1 -0
  14. package/dist/theme-init.js +8 -0
  15. package/dist/utilities.css +3865 -0
  16. package/dist/utilities.css.map +1 -0
  17. package/humans.txt +8 -0
  18. package/js/config.js +3 -0
  19. package/js/index.js +45 -0
  20. package/js/modules/copy.js +64 -0
  21. package/js/modules/dialog.js +55 -0
  22. package/js/modules/dismiss.js +43 -0
  23. package/js/modules/dropdown.js +108 -0
  24. package/js/modules/gallery.js +84 -0
  25. package/js/modules/highlight.js +89 -0
  26. package/js/modules/navigation.js +104 -0
  27. package/js/modules/quantity.js +63 -0
  28. package/js/modules/rhythm.js +21 -0
  29. package/js/modules/table.js +109 -0
  30. package/js/modules/tabs.js +112 -0
  31. package/js/modules/toast.js +97 -0
  32. package/js/modules/tooltip.js +106 -0
  33. package/js/theme-init.js +8 -0
  34. package/package.json +71 -4
  35. package/scss/_blocks-only.scss +4 -0
  36. package/scss/_core.scss +7 -0
  37. package/scss/_index.scss +12 -0
  38. package/scss/_layers.scss +2 -0
  39. package/scss/_utilities-only.scss +4 -0
  40. package/scss/base/_code.scss +50 -0
  41. package/scss/base/_forms.scss +110 -0
  42. package/scss/base/_index.scss +7 -0
  43. package/scss/base/_interactive.scss +25 -0
  44. package/scss/base/_media.scss +28 -0
  45. package/scss/base/_reset.scss +53 -0
  46. package/scss/base/_tables.scss +49 -0
  47. package/scss/base/_typography.scss +232 -0
  48. package/scss/blocks/_accordion.scss +88 -0
  49. package/scss/blocks/_alert.scss +101 -0
  50. package/scss/blocks/_avatar.scss +104 -0
  51. package/scss/blocks/_badge.scss +72 -0
  52. package/scss/blocks/_breadcrumb.scss +65 -0
  53. package/scss/blocks/_button-group.scss +73 -0
  54. package/scss/blocks/_button.scss +212 -0
  55. package/scss/blocks/_card.scss +146 -0
  56. package/scss/blocks/_choice.scss +163 -0
  57. package/scss/blocks/_code.scss +157 -0
  58. package/scss/blocks/_data-list.scss +92 -0
  59. package/scss/blocks/_divider.scss +54 -0
  60. package/scss/blocks/_drawer.scss +160 -0
  61. package/scss/blocks/_dropdown.scss +167 -0
  62. package/scss/blocks/_empty-state.scss +61 -0
  63. package/scss/blocks/_field.scss +146 -0
  64. package/scss/blocks/_form.scss +87 -0
  65. package/scss/blocks/_gallery.scss +120 -0
  66. package/scss/blocks/_index.scss +49 -0
  67. package/scss/blocks/_input-group.scss +95 -0
  68. package/scss/blocks/_line-item.scss +105 -0
  69. package/scss/blocks/_list.scss +117 -0
  70. package/scss/blocks/_media.scss +105 -0
  71. package/scss/blocks/_menu.scss +191 -0
  72. package/scss/blocks/_meta.scss +59 -0
  73. package/scss/blocks/_modal.scss +156 -0
  74. package/scss/blocks/_navbar.scss +227 -0
  75. package/scss/blocks/_order-summary.scss +92 -0
  76. package/scss/blocks/_page-header.scss +88 -0
  77. package/scss/blocks/_pagination.scss +110 -0
  78. package/scss/blocks/_price.scss +88 -0
  79. package/scss/blocks/_product-card.scss +138 -0
  80. package/scss/blocks/_progress.scss +68 -0
  81. package/scss/blocks/_prose.scss +165 -0
  82. package/scss/blocks/_quantity.scss +73 -0
  83. package/scss/blocks/_quote.scss +71 -0
  84. package/scss/blocks/_rating.scss +50 -0
  85. package/scss/blocks/_site-footer.scss +135 -0
  86. package/scss/blocks/_skeleton.scss +63 -0
  87. package/scss/blocks/_spinner.scss +44 -0
  88. package/scss/blocks/_stat.scss +111 -0
  89. package/scss/blocks/_steps.scss +147 -0
  90. package/scss/blocks/_swatch.scss +117 -0
  91. package/scss/blocks/_table.scss +242 -0
  92. package/scss/blocks/_tabs.scss +168 -0
  93. package/scss/blocks/_tag.scss +72 -0
  94. package/scss/blocks/_timeline.scss +84 -0
  95. package/scss/blocks/_toast.scss +146 -0
  96. package/scss/blocks/_toolbar.scss +67 -0
  97. package/scss/blocks/_tooltip.scss +63 -0
  98. package/scss/helpers/_index.scss +2 -0
  99. package/scss/helpers/_rhythm.scss +64 -0
  100. package/scss/helpers/_typography.scss +4 -0
  101. package/scss/layout/_cluster.scss +43 -0
  102. package/scss/layout/_container.scss +26 -0
  103. package/scss/layout/_grid.scss +90 -0
  104. package/scss/layout/_index.scss +5 -0
  105. package/scss/layout/_section.scss +78 -0
  106. package/scss/layout/_shell.scss +87 -0
  107. package/scss/settings/_blocks.scss +3 -0
  108. package/scss/settings/_breakpoints.scss +7 -0
  109. package/scss/settings/_fonts.scss +5 -0
  110. package/scss/settings/_index.scss +7 -0
  111. package/scss/settings/_layout.scss +5 -0
  112. package/scss/settings/_prefix.scss +1 -0
  113. package/scss/settings/_rhythm.scss +6 -0
  114. package/scss/settings/_utilities.scss +2 -0
  115. package/scss/tokens/_borders.scss +16 -0
  116. package/scss/tokens/_elevation.scss +37 -0
  117. package/scss/tokens/_index.scss +8 -0
  118. package/scss/tokens/_layout.scss +17 -0
  119. package/scss/tokens/_motion.scss +17 -0
  120. package/scss/tokens/_palette.scss +50 -0
  121. package/scss/tokens/_roles.scss +90 -0
  122. package/scss/tokens/_space.scss +9 -0
  123. package/scss/tokens/_type.scss +57 -0
  124. package/scss/tools/_bem.scss +22 -0
  125. package/scss/tools/_index.scss +4 -0
  126. package/scss/tools/_rhythm.scss +26 -0
  127. package/scss/tools/_role-engine.scss +16 -0
  128. package/scss/tools/_utility-generator.scss +74 -0
  129. package/scss/utilities/_index.scss +8 -0
  130. package/scss/utilities/_map.scss +321 -0
@@ -0,0 +1,163 @@
1
+ @use 'sass:list';
2
+ @use '../settings' as s;
3
+ @use '../tools/bem' as b;
4
+
5
+ @if list.length(s.$blocks) == 0 or list.index(s.$blocks, 'choice') {
6
+ @layer blocks {
7
+ @include b.block('choice') {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 0.75rem;
11
+
12
+ @include b.element('option') {
13
+ display: flex;
14
+ gap: 0.75rem;
15
+ align-items: flex-start;
16
+ cursor: pointer;
17
+ }
18
+
19
+ @include b.element('input') {
20
+ appearance: none;
21
+ flex: none;
22
+ width: 1.25rem;
23
+ height: 1.25rem;
24
+ margin: 0.125rem 0 0;
25
+ border: var(--bd1) solid var(--border-control);
26
+ border-radius: var(--r-xs);
27
+ background: var(--surface);
28
+ display: grid;
29
+ place-items: center;
30
+ cursor: pointer;
31
+
32
+ &[type="radio"] {
33
+ border-radius: 50%;
34
+ }
35
+
36
+ &:checked {
37
+ background: var(--primary);
38
+ border-color: var(--primary);
39
+ }
40
+
41
+ &[type="checkbox"]:checked::after {
42
+ content: '';
43
+ width: 0.625rem;
44
+ height: 0.375rem;
45
+ border: 2px solid var(--on-primary);
46
+ border-top: 0;
47
+ border-right: 0;
48
+ transform: translateY(-1px) rotate(-45deg);
49
+ }
50
+
51
+ &[type="radio"]:checked::after {
52
+ content: '';
53
+ width: 0.5rem;
54
+ height: 0.5rem;
55
+ border-radius: 50%;
56
+ background: var(--on-primary);
57
+ }
58
+
59
+ &:focus-visible {
60
+ outline: 2px solid var(--focus);
61
+ outline-offset: 2px;
62
+ }
63
+
64
+ &[aria-invalid="true"] {
65
+ border-color: var(--danger);
66
+ }
67
+
68
+ &:disabled {
69
+ opacity: 0.5;
70
+ cursor: not-allowed;
71
+
72
+ ~ .#{s.$prefix}choice__label {
73
+ opacity: 0.5;
74
+ cursor: not-allowed;
75
+ }
76
+ }
77
+ }
78
+
79
+ @include b.element('body') {
80
+ flex: 1;
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: 0.25rem;
84
+ }
85
+
86
+ @include b.element('label') {
87
+ font: 500 1rem/1.5rem var(--f-ui);
88
+ }
89
+
90
+ @include b.element('description') {
91
+ font: 400 0.875rem/1.25rem var(--f-ui);
92
+ color: var(--c-muted);
93
+ }
94
+
95
+ @include b.element('hint') {
96
+ font: 400 0.875rem/1.25rem var(--f-ui);
97
+ color: var(--c-muted);
98
+ }
99
+
100
+ @include b.element('aside') {
101
+ font: 500 1rem/1.5rem var(--f-ui);
102
+ font-variant-numeric: tabular-nums;
103
+ }
104
+
105
+ @include b.modifier('card') {
106
+ gap: 1.5rem;
107
+
108
+ .#{s.$prefix}choice__option {
109
+ padding: 0.75rem;
110
+ border-radius: var(--r-xs);
111
+ background: var(--surface);
112
+ outline: var(--bd1) solid var(--border);
113
+ outline-offset: calc(-1 * var(--bd1));
114
+
115
+ &:has(:checked) {
116
+ background: var(--primary-subtle);
117
+ outline: var(--bd2) solid var(--primary-text);
118
+ outline-offset: calc(-1 * var(--bd2));
119
+ }
120
+ }
121
+ }
122
+
123
+ @include b.modifier('switch') {
124
+ gap: 1rem;
125
+
126
+ .#{s.$prefix}choice__input {
127
+ width: 2.5rem;
128
+ height: 1.5rem;
129
+ margin: 0;
130
+ border-radius: 999px;
131
+ display: block;
132
+ position: relative;
133
+
134
+ &::after {
135
+ content: '';
136
+ position: absolute;
137
+ top: 0.25rem;
138
+ left: 0.25rem;
139
+ width: 1rem;
140
+ height: 1rem;
141
+ border-radius: 50%;
142
+ background: var(--c-muted);
143
+ transition: transform 0.2s;
144
+ }
145
+
146
+ &:checked::after {
147
+ transform: translateX(1rem);
148
+ background: var(--on-primary);
149
+ border: 0;
150
+ width: 1rem;
151
+ height: 1rem;
152
+ }
153
+ }
154
+ }
155
+
156
+ @include b.modifier('inline') {
157
+ flex-direction: row;
158
+ flex-wrap: wrap;
159
+ gap: var(--s3);
160
+ }
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,157 @@
1
+ @use 'sass:list';
2
+ @use '../settings' as s;
3
+ @use '../tools/bem' as b;
4
+ @use '../tools/rhythm' as r;
5
+
6
+ @if list.length(s.$blocks) == 0 or list.index(s.$blocks, 'code') {
7
+ @layer blocks {
8
+ @include b.block('code') {
9
+ position: relative;
10
+ background: var(--surface-sunken);
11
+ border-radius: var(--radius);
12
+ overflow: hidden;
13
+
14
+ outline: var(--bd1) solid var(--border);
15
+ outline-offset: calc(-1 * var(--bd1));
16
+
17
+ @include b.element('header') {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 0.5rem;
21
+ padding: 0.5rem 1rem calc(0.5rem - var(--bd1));
22
+ background: color-mix(in srgb, var(--surface-sunken) 80%, var(--surface));
23
+ border-bottom: var(--bd1) solid var(--border);
24
+ font: 500 0.75rem/1rem var(--f-mono);
25
+ color: var(--c-muted);
26
+ letter-spacing: .02em;
27
+
28
+ > i {
29
+ font-size: 0.875rem;
30
+ flex: none;
31
+ color: var(--c-subtle);
32
+ }
33
+ }
34
+
35
+ @include b.element('lang') {
36
+ margin-left: auto;
37
+ font: 400 0.6875rem/1rem var(--f-mono);
38
+ color: var(--c-subtle);
39
+ text-transform: uppercase;
40
+ letter-spacing: .06em;
41
+ }
42
+
43
+ @include b.element('body') {
44
+ margin: 0;
45
+ padding: 0;
46
+ overflow-x: auto;
47
+ font: 400 0.8125rem/1.5rem var(--f-mono);
48
+ color: var(--text);
49
+ tab-size: 2;
50
+ counter-reset: line;
51
+
52
+ code {
53
+ display: block;
54
+ }
55
+ }
56
+
57
+ @include b.element('line') {
58
+ display: block;
59
+ padding: 0 1rem 0 3.5rem;
60
+ position: relative;
61
+ min-height: 1.5rem;
62
+
63
+ &::before {
64
+ content: counter(line);
65
+ counter-increment: line;
66
+ position: absolute;
67
+ left: 0;
68
+ width: 2.5rem;
69
+ text-align: right;
70
+ color: var(--c-disabled);
71
+ font-variant-numeric: tabular-nums;
72
+ user-select: none;
73
+ pointer-events: none;
74
+ }
75
+
76
+ @include b.modifier('highlight') {
77
+ background: color-mix(in srgb, var(--primary) 10%, transparent);
78
+ border-left: 3px solid var(--primary-text);
79
+ }
80
+ }
81
+
82
+ @include b.modifier('wrap') {
83
+ .#{s.$prefix}code__body {
84
+ white-space: pre-wrap;
85
+ word-break: break-word;
86
+ }
87
+ }
88
+
89
+ @include b.modifier('flush') {
90
+ border-radius: 0;
91
+ margin-bottom: 0;
92
+ }
93
+
94
+ // Highlight.js token mappings
95
+ & .hljs-keyword, & .hljs-selector-tag, & .hljs-built_in,
96
+ & .hljs-type, & .hljs-meta .hljs-keyword {
97
+ color: var(--syntax-keyword);
98
+ }
99
+
100
+ & .hljs-string, & .hljs-regexp, & .hljs-addition,
101
+ & .hljs-template-variable {
102
+ color: var(--syntax-string);
103
+ }
104
+
105
+ & .hljs-comment, & .hljs-doctag, & .hljs-quote {
106
+ color: var(--syntax-comment);
107
+ font-style: italic;
108
+ }
109
+
110
+ & .hljs-title, & .hljs-title\.function_, & .hljs-section {
111
+ color: var(--syntax-function);
112
+ }
113
+
114
+ & .hljs-number, & .hljs-literal, & .hljs-variable\.constant_,
115
+ & .hljs-symbol, & .hljs-link {
116
+ color: var(--syntax-constant);
117
+ }
118
+
119
+ & .hljs-operator, & .hljs-deletion {
120
+ color: var(--syntax-operator);
121
+ }
122
+
123
+ & .hljs-punctuation {
124
+ color: var(--syntax-punctuation);
125
+ }
126
+
127
+ & .hljs-tag, & .hljs-name {
128
+ color: var(--syntax-tag);
129
+ }
130
+
131
+ & .hljs-attr, & .hljs-attribute, & .hljs-property {
132
+ color: var(--syntax-attribute);
133
+ }
134
+
135
+ & .hljs-variable, & .hljs-params {
136
+ color: var(--text);
137
+ }
138
+
139
+ & .hljs-meta {
140
+ color: var(--c-muted);
141
+ }
142
+ }
143
+
144
+ // Syntax token custom properties
145
+ :root {
146
+ --syntax-keyword: var(--primary-text);
147
+ --syntax-string: var(--success-text);
148
+ --syntax-comment: var(--c-muted);
149
+ --syntax-function: var(--info-text);
150
+ --syntax-constant: var(--warning-text);
151
+ --syntax-operator: var(--c-muted);
152
+ --syntax-punctuation: var(--c-subtle);
153
+ --syntax-tag: var(--danger-text);
154
+ --syntax-attribute: var(--secondary-text);
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,92 @@
1
+ @use 'sass:list';
2
+ @use '../settings' as s;
3
+ @use '../tools/bem' as b;
4
+
5
+ @if list.length(s.$blocks) == 0 or list.index(s.$blocks, 'data-list') {
6
+ @layer blocks {
7
+ @include b.block('data-list') {
8
+ display: flex;
9
+ flex-direction: column;
10
+ font: var(--t-body-sm-s)/var(--t-body-sm-lh) var(--f-ui);
11
+
12
+ @include b.element('item') {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--s-h);
16
+ padding-block: var(--s2);
17
+ }
18
+
19
+ @include b.element('term') {
20
+ font-weight: 500;
21
+ color: var(--c-muted);
22
+ font-size: var(--t-meta-s);
23
+ line-height: var(--t-meta-lh);
24
+ }
25
+
26
+ @include b.element('value') {
27
+ color: var(--text);
28
+ }
29
+
30
+ @include b.element('action') {
31
+ color: var(--primary);
32
+ text-decoration: none;
33
+ font-weight: 500;
34
+ cursor: pointer;
35
+
36
+ &:hover {
37
+ text-decoration: underline;
38
+ }
39
+ }
40
+
41
+ @include b.modifier('horizontal') {
42
+ .#{s.$prefix}data-list__item {
43
+ flex-direction: row;
44
+ align-items: baseline;
45
+ justify-content: space-between;
46
+ gap: var(--s3);
47
+ }
48
+
49
+ .#{s.$prefix}data-list__term {
50
+ flex-shrink: 0;
51
+ min-width: 120px;
52
+ }
53
+
54
+ .#{s.$prefix}data-list__value {
55
+ text-align: end;
56
+ }
57
+ }
58
+
59
+ @include b.modifier('divided') {
60
+ .#{s.$prefix}data-list__item {
61
+ border-bottom: var(--bd1) solid var(--border);
62
+ padding-bottom: calc(var(--s2) - var(--bd1));
63
+
64
+ &:last-child {
65
+ border-bottom: 0;
66
+ padding-bottom: var(--s2);
67
+ }
68
+ }
69
+ }
70
+
71
+ @include b.modifier('striped') {
72
+ .#{s.$prefix}data-list__item:nth-child(even) {
73
+ background-color: var(--surface-sunken);
74
+ padding-inline: var(--s2);
75
+ border-radius: var(--r-sm);
76
+ }
77
+ }
78
+
79
+ @include b.modifier('compact') {
80
+ .#{s.$prefix}data-list__item {
81
+ padding-block: var(--s1);
82
+ }
83
+ }
84
+
85
+ @include b.modifier('cols-2') {
86
+ display: grid;
87
+ grid-template-columns: 1fr 1fr;
88
+ gap: 0 var(--s4);
89
+ }
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,54 @@
1
+ @use 'sass:list';
2
+ @use '../settings' as s;
3
+ @use '../tools/bem' as b;
4
+ @use '../tools/rhythm' as r;
5
+
6
+ @if list.length(s.$blocks) == 0 or list.index(s.$blocks, 'divider') {
7
+ @layer blocks {
8
+ @include b.block('divider') {
9
+ --_bw: var(--bd1);
10
+
11
+ display: block;
12
+ border: none;
13
+ height: 0;
14
+ margin: var(--s3) 0 calc(var(--s3) - var(--_bw));
15
+ border-top: var(--_bw) solid var(--border);
16
+
17
+ @include b.element('label') {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: var(--s2);
21
+ font: var(--t-meta-s)/var(--t-meta-lh) var(--f-ui);
22
+ color: var(--c-muted);
23
+ text-transform: uppercase;
24
+ letter-spacing: 0.06em;
25
+ font-weight: 500;
26
+
27
+ &::before,
28
+ &::after {
29
+ content: '';
30
+ flex: 1;
31
+ height: 0;
32
+ border-top: var(--_bw) solid var(--border);
33
+ }
34
+ }
35
+
36
+ @include b.modifier('vertical') {
37
+ display: inline-block;
38
+ width: 0;
39
+ height: 100%;
40
+ margin: 0 calc(var(--s3) - var(--_bw)) 0 var(--s3);
41
+ border-top: 0;
42
+ border-left: var(--_bw) solid var(--border);
43
+ }
44
+
45
+ @include b.modifier('strong') {
46
+ --_bw: var(--bd2);
47
+ }
48
+
49
+ @include b.modifier('space-md') { margin: r.lines(1) 0 calc(#{r.lines(1)} - var(--_bw)); }
50
+ @include b.modifier('space-lg') { margin: r.lines(2) 0 calc(#{r.lines(2)} - var(--_bw)); }
51
+ @include b.modifier('space-xl') { margin: r.lines(3) 0 calc(#{r.lines(3)} - var(--_bw)); }
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,160 @@
1
+ @use 'sass:list';
2
+ @use '../settings' as s;
3
+ @use '../tools/bem' as b;
4
+
5
+ @if list.length(s.$blocks) == 0 or list.index(s.$blocks, 'drawer') {
6
+ @layer blocks {
7
+ @include b.block('drawer') {
8
+ --_width: 400px;
9
+
10
+ position: fixed;
11
+ top: 0;
12
+ right: 0;
13
+ bottom: 0;
14
+ width: min(var(--_width), 100vw);
15
+ max-width: 100vw;
16
+ max-height: 100vh;
17
+ height: 100%;
18
+ margin: 0;
19
+ padding: 0;
20
+ background-color: var(--surface-raised);
21
+ color: var(--text);
22
+ border: none;
23
+ border-radius: var(--r-xs);
24
+ box-shadow: var(--sh4);
25
+ display: flex;
26
+ flex-direction: column;
27
+
28
+ transform: translateX(0);
29
+ opacity: 1;
30
+ transition: transform var(--dur-base) var(--e-exit),
31
+ opacity var(--dur-base) var(--e-exit),
32
+ overlay var(--dur-base) var(--e-exit) allow-discrete,
33
+ display var(--dur-base) var(--e-exit) allow-discrete;
34
+
35
+ @starting-style {
36
+ transform: translateX(100%);
37
+ opacity: 0;
38
+ }
39
+
40
+ &:not([open]) {
41
+ transform: translateX(100%);
42
+ opacity: 0;
43
+ }
44
+
45
+ &::backdrop {
46
+ background-color: var(--overlay);
47
+ opacity: 1;
48
+ transition: opacity var(--dur-base) var(--e-exit),
49
+ overlay var(--dur-base) var(--e-exit) allow-discrete,
50
+ display var(--dur-base) var(--e-exit) allow-discrete;
51
+
52
+ @starting-style {
53
+ opacity: 0;
54
+ }
55
+ }
56
+
57
+ &:not([open])::backdrop {
58
+ opacity: 0;
59
+ }
60
+
61
+ @include b.element('close') {
62
+ position: absolute;
63
+ top: var(--s2);
64
+ right: var(--s2);
65
+ z-index: 1;
66
+ display: inline-flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ width: 32px;
70
+ height: 32px;
71
+ padding: 0;
72
+ border: none;
73
+ background: none;
74
+ color: var(--c-muted);
75
+ cursor: pointer;
76
+ border-radius: var(--r-md);
77
+ flex-shrink: 0;
78
+
79
+ &:hover {
80
+ color: var(--text);
81
+ background-color: var(--surface-raised);
82
+ }
83
+
84
+ &:focus-visible {
85
+ outline: 2px solid var(--focus);
86
+ outline-offset: -2px;
87
+ }
88
+ }
89
+
90
+ @include b.element('header') {
91
+ display: flex;
92
+ align-items: center;
93
+ gap: var(--s2);
94
+ padding: var(--s4) calc(var(--s4) + 32px) calc(var(--s4) - var(--bd1)) var(--s4);
95
+ flex-shrink: 0;
96
+ border-bottom: var(--bd1) solid var(--border);
97
+ }
98
+
99
+ @include b.element('title') {
100
+ font: 600 var(--t-h4-s)/var(--t-h4-lh) var(--f-ui);
101
+ flex: 1;
102
+ min-width: 0;
103
+ margin: 0;
104
+ }
105
+
106
+ @include b.element('body') {
107
+ padding: 0 var(--s4);
108
+ flex: 1;
109
+ overflow-y: auto;
110
+ }
111
+
112
+ @include b.element('footer') {
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: flex-end;
116
+ gap: var(--s2);
117
+ padding: var(--s4);
118
+ padding-top: calc(var(--s4) - var(--bd1));
119
+ flex-shrink: 0;
120
+ border-top: var(--bd1) solid var(--border);
121
+ }
122
+
123
+ @include b.modifier('start') {
124
+ right: auto;
125
+ left: 0;
126
+
127
+ @starting-style {
128
+ transform: translateX(-100%);
129
+ }
130
+
131
+ &:not([open]) {
132
+ transform: translateX(-100%);
133
+ }
134
+ }
135
+
136
+ @include b.modifier('bottom') {
137
+ top: auto;
138
+ right: 0;
139
+ left: 0;
140
+ bottom: 0;
141
+ width: 100%;
142
+ height: auto;
143
+ max-height: 80vh;
144
+ border-radius: var(--r-xs) var(--r-xs) 0 0;
145
+
146
+ @starting-style {
147
+ transform: translateY(100%);
148
+ }
149
+
150
+ &:not([open]) {
151
+ transform: translateY(100%);
152
+ }
153
+ }
154
+
155
+ @include b.modifier('sm') { --_width: 320px; }
156
+ @include b.modifier('md') { --_width: 400px; }
157
+ @include b.modifier('lg') { --_width: 560px; }
158
+ }
159
+ }
160
+ }