@hearthsound/design 0.0.0-stage → 0.1.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.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -2
  3. package/THIRD-PARTY.md +46 -0
  4. package/css/base.css +245 -0
  5. package/css/components/admin.css +257 -0
  6. package/css/components/banner.css +140 -0
  7. package/css/components/button.css +309 -0
  8. package/css/components/card.css +339 -0
  9. package/css/components/check.css +202 -0
  10. package/css/components/dialog.css +85 -0
  11. package/css/components/field.css +298 -0
  12. package/css/components/list.css +260 -0
  13. package/css/components/menu.css +335 -0
  14. package/css/components/page-header.css +230 -0
  15. package/css/components/pill.css +101 -0
  16. package/css/components/player.css +524 -0
  17. package/css/components/progress.css +173 -0
  18. package/css/components/section.css +86 -0
  19. package/css/components/segmented.css +64 -0
  20. package/css/components/shell.css +281 -0
  21. package/css/components/sidebar.css +170 -0
  22. package/css/components/slider.css +92 -0
  23. package/css/components/status-page.css +48 -0
  24. package/css/components/stepper.css +130 -0
  25. package/css/components/toast.css +88 -0
  26. package/css/components/tooltip.css +29 -0
  27. package/css/components/track.css +336 -0
  28. package/css/components/upload.css +70 -0
  29. package/css/index.css +35 -0
  30. package/css/tokens.css +375 -0
  31. package/dist/icons.d.ts +56 -0
  32. package/dist/icons.js +56 -0
  33. package/dist/icons.svg +55 -0
  34. package/fonts/OFL-BricolageGrotesque.txt +93 -0
  35. package/fonts/OFL-Geist.txt +92 -0
  36. package/fonts/bricolage-var.woff2 +0 -0
  37. package/fonts/geist-mono.woff2 +0 -0
  38. package/fonts/geist-var.woff2 +0 -0
  39. package/icons/LICENSE +10 -0
  40. package/icons/adwaita-account.svg +1 -0
  41. package/icons/adwaita-acquire.svg +1 -0
  42. package/icons/adwaita-add.svg +1 -0
  43. package/icons/adwaita-album.svg +1 -0
  44. package/icons/adwaita-artist.svg +1 -0
  45. package/icons/adwaita-back.svg +1 -0
  46. package/icons/adwaita-check.svg +1 -0
  47. package/icons/adwaita-close.svg +1 -0
  48. package/icons/adwaita-collapse.svg +1 -0
  49. package/icons/adwaita-dark-mode.svg +1 -0
  50. package/icons/adwaita-delete.svg +1 -0
  51. package/icons/adwaita-drag.svg +1 -0
  52. package/icons/adwaita-edit.svg +1 -0
  53. package/icons/adwaita-error.svg +1 -0
  54. package/icons/adwaita-expand.svg +1 -0
  55. package/icons/adwaita-folder.svg +1 -0
  56. package/icons/adwaita-forward.svg +1 -0
  57. package/icons/adwaita-home.svg +1 -0
  58. package/icons/adwaita-layers.svg +1 -0
  59. package/icons/adwaita-like.svg +1 -0
  60. package/icons/adwaita-lock.svg +1 -0
  61. package/icons/adwaita-menu.svg +1 -0
  62. package/icons/adwaita-more.svg +1 -0
  63. package/icons/adwaita-mute.svg +1 -0
  64. package/icons/adwaita-next.svg +1 -0
  65. package/icons/adwaita-pause.svg +1 -0
  66. package/icons/adwaita-play.svg +1 -0
  67. package/icons/adwaita-playlist.svg +1 -0
  68. package/icons/adwaita-plugin.svg +1 -0
  69. package/icons/adwaita-previous.svg +1 -0
  70. package/icons/adwaita-queue.svg +1 -0
  71. package/icons/adwaita-rating-outline.svg +1 -0
  72. package/icons/adwaita-rating.svg +1 -0
  73. package/icons/adwaita-refresh.svg +1 -0
  74. package/icons/adwaita-remote.svg +1 -0
  75. package/icons/adwaita-remove.svg +1 -0
  76. package/icons/adwaita-repeat.svg +1 -0
  77. package/icons/adwaita-reveal.svg +1 -0
  78. package/icons/adwaita-search.svg +1 -0
  79. package/icons/adwaita-settings.svg +1 -0
  80. package/icons/adwaita-shuffle.svg +1 -0
  81. package/icons/adwaita-sign-out.svg +1 -0
  82. package/icons/adwaita-song.svg +1 -0
  83. package/icons/adwaita-sort.svg +1 -0
  84. package/icons/adwaita-storage.svg +1 -0
  85. package/icons/adwaita-users.svg +1 -0
  86. package/icons/adwaita-volume.svg +1 -0
  87. package/icons/adwaita-warning.svg +1 -0
  88. package/icons/custom-dislike-outline.svg +1 -0
  89. package/icons/custom-dislike.svg +1 -0
  90. package/icons/custom-like-outline.svg +1 -0
  91. package/icons/custom-unknown.svg +1 -0
  92. package/icons/custom-upload.svg +1 -0
  93. package/identity/icons/app-icon-dark-16.png +0 -0
  94. package/identity/icons/app-icon-dark-180.png +0 -0
  95. package/identity/icons/app-icon-dark-192.png +0 -0
  96. package/identity/icons/app-icon-dark-32.png +0 -0
  97. package/identity/icons/app-icon-dark-512.png +0 -0
  98. package/identity/icons/app-icon-dark.svg +1 -0
  99. package/identity/icons/app-icon-light-16.png +0 -0
  100. package/identity/icons/app-icon-light-180.png +0 -0
  101. package/identity/icons/app-icon-light-192.png +0 -0
  102. package/identity/icons/app-icon-light-32.png +0 -0
  103. package/identity/icons/app-icon-light-512.png +0 -0
  104. package/identity/icons/app-icon-light.svg +1 -0
  105. package/identity/icons/favicon.svg +1 -0
  106. package/identity/mark/mark-dark.svg +1 -0
  107. package/identity/mark/mark-light.svg +1 -0
  108. package/identity/mark/mark-symbolic.svg +1 -0
  109. package/package.json +35 -4
@@ -0,0 +1,86 @@
1
+ /*
2
+ * @hearthsound/design - sections
3
+ *
4
+ * k33 C section header whose title is the link, and l13 B Home shelves.
5
+ * Values from shared/approved/components.css (.shead, .homebody, .hsec,
6
+ * .shelf) and spec/components.md.
7
+ */
8
+
9
+ .hs-section-header {
10
+ display: flex;
11
+ align-items: center;
12
+ gap: 10px;
13
+ min-height: 36px;
14
+ }
15
+
16
+ .hs-section-header__title {
17
+ margin: 0;
18
+ font: 750 19px/1.2 var(--hs-font-display);
19
+ letter-spacing: -0.02em;
20
+ }
21
+
22
+ .hs-section-header__link {
23
+ color: inherit;
24
+ text-decoration: none;
25
+ border-radius: 6px;
26
+ }
27
+
28
+ .hs-section-header__arrow {
29
+ width: 18px;
30
+ height: 18px;
31
+ vertical-align: -2px;
32
+ margin-left: 4px;
33
+ color: var(--hs-fg-muted);
34
+ }
35
+
36
+ /* Keyboard focus uses the approved tint; no hover treatment is drawn. */
37
+ .hs-section-header__link:focus-visible {
38
+ outline: none;
39
+ background: var(--hs-accent-tint);
40
+ }
41
+
42
+ /* ------------------------------------------------------------------ */
43
+ /* l13 B - Home shelves */
44
+ /* ------------------------------------------------------------------ */
45
+
46
+ .hs-home {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 26px;
50
+ padding: 4px 0 28px;
51
+ }
52
+
53
+ .hs-home-section .hs-section-header {
54
+ padding: 0 24px 8px 32px;
55
+ }
56
+
57
+ /* Desktop scroll buttons sit at the right of the header. */
58
+ .hs-home-section .hs-section-header > .hs-shelf__button:first-of-type {
59
+ margin-left: auto;
60
+ }
61
+
62
+ .hs-shelf {
63
+ display: grid;
64
+ grid-auto-flow: column;
65
+ grid-auto-columns: 180px;
66
+ gap: 28px;
67
+ overflow-x: auto;
68
+ padding: 0 32px 6px;
69
+ scrollbar-width: none;
70
+ }
71
+
72
+ @media (max-width: 720px) {
73
+ .hs-home-section .hs-section-header {
74
+ padding: 0 14px 6px;
75
+ }
76
+
77
+ .hs-shelf {
78
+ grid-auto-columns: 140px;
79
+ gap: 14px;
80
+ padding: 0 14px 4px;
81
+ }
82
+
83
+ .hs-shelf__button {
84
+ display: none;
85
+ }
86
+ }
@@ -0,0 +1,64 @@
1
+ /*
2
+ * k23 A - segmented control. Tabs have exactly two visual states, selected and
3
+ * unselected; hover and keyboard focus use the shared treatments and are never drawn as
4
+ * tab states. p20-r1: the now-playing switch is a text segmented control
5
+ * ("Lyrics" / "Queue").
6
+ *
7
+ * Markup: <div class="hs-segmented" role="tablist" aria-label="...">
8
+ * <button class="hs-segmented__tab hs-segmented__tab--selected" role="tab"
9
+ * aria-selected="true">Lyrics</button>...</div>.
10
+ */
11
+
12
+ .hs-segmented {
13
+ display: flex;
14
+ gap: 0;
15
+ margin: 0 14px 12px;
16
+ padding: 3px;
17
+ background: var(--hs-control-tone);
18
+ border-radius: var(--hs-radius-full);
19
+ width: max-content;
20
+ max-width: calc(100% - 28px);
21
+ overflow-x: auto;
22
+ }
23
+
24
+ /* Inside the now-playing panel: zero margin, so the track may take the full width. */
25
+ .hs-segmented--flush {
26
+ margin: 0;
27
+ max-width: 100%;
28
+ }
29
+
30
+ .hs-segmented__tab {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ flex: none;
34
+ height: 32px;
35
+ padding: 0 14px;
36
+ margin: 0;
37
+ border: 0;
38
+ border-radius: var(--hs-radius-full);
39
+ background: transparent;
40
+ font: 500 14px var(--hs-font-body);
41
+ color: var(--hs-fg);
42
+ white-space: nowrap;
43
+ cursor: default;
44
+ appearance: none;
45
+ }
46
+
47
+ .hs-segmented__tab--selected,
48
+ .hs-segmented__tab[aria-selected='true'] {
49
+ background: var(--hs-segment-selected-bg);
50
+ box-shadow: var(--hs-elevation-1);
51
+ font-weight: 600;
52
+ }
53
+
54
+ .hs-segmented__tab:hover:not(.hs-segmented__tab--selected):not([aria-selected='true']) {
55
+ background: color-mix(in srgb, var(--hs-fg) 10%, transparent);
56
+ }
57
+
58
+ .hs-segmented__tab:focus-visible {
59
+ outline: none;
60
+ background: var(--hs-accent-tint);
61
+ color: var(--hs-accent-text);
62
+ font-weight: 600;
63
+ box-shadow: var(--hs-focus-shadow);
64
+ }
@@ -0,0 +1,281 @@
1
+ /*
2
+ * l01-r1 - the app shell: one solid grid, never translucent (f11). Sidebar on the left,
3
+ * the content column on the right, the player bar docked under the content column only.
4
+ * Widths follow l07: 240 px above 1280 px, 200 px from 721 to 1280 px, and a phone
5
+ * drawer at 720 px and below. l08 caps the page at 1440 px and sets the card grids.
6
+ * l12/l12-r1 onboarding frames (plain and split), the i03 lockup sizes and the p27
7
+ * booting frame also live here.
8
+ */
9
+
10
+ .hs-shell {
11
+ display: grid;
12
+ grid-template-columns: 240px minmax(0, 1fr);
13
+ grid-template-rows: minmax(0, 1fr) auto;
14
+ grid-template-areas:
15
+ 'side main'
16
+ 'side player';
17
+ height: 100vh;
18
+ overflow: hidden;
19
+ background: var(--hs-view-bg);
20
+ color: var(--hs-fg);
21
+ }
22
+
23
+ .hs-shell__sidebar {
24
+ grid-area: side;
25
+ min-height: 0;
26
+ }
27
+
28
+ .hs-shell__main {
29
+ grid-area: main;
30
+ min-width: 0;
31
+ overflow: auto;
32
+ }
33
+
34
+ .hs-shell__player {
35
+ grid-area: player;
36
+ }
37
+
38
+ @media (max-width: 1280px) {
39
+ .hs-shell {
40
+ grid-template-columns: 200px minmax(0, 1fr);
41
+ }
42
+ }
43
+
44
+ /* ------------------------------------------------------------------ */
45
+ /* l01-r1 - phone: one column, no sidebar, mini player at the foot */
46
+ /* ------------------------------------------------------------------ */
47
+
48
+ @media (max-width: 720px) {
49
+ .hs-shell {
50
+ grid-template-columns: minmax(0, 1fr);
51
+ grid-template-rows: minmax(0, 1fr) auto;
52
+ grid-template-areas:
53
+ 'main'
54
+ 'player';
55
+ }
56
+
57
+ .hs-shell__sidebar {
58
+ display: none;
59
+ }
60
+ }
61
+
62
+ /* ------------------------------------------------------------------ */
63
+ /* l01-r1 - the 300 px drawer over the 40% scrim, level-3 shadow */
64
+ /* ------------------------------------------------------------------ */
65
+
66
+ .hs-drawer {
67
+ position: fixed;
68
+ inset: 0 auto 0 0;
69
+ z-index: 30;
70
+ display: flex;
71
+ flex-direction: column;
72
+ width: 300px;
73
+ overflow-y: auto;
74
+ background: var(--hs-sidebar-bg);
75
+ box-shadow: var(--hs-elevation-3);
76
+ }
77
+
78
+ .hs-drawer .hs-sidebar,
79
+ .hs-sidebar--drawer {
80
+ height: 100%;
81
+ }
82
+
83
+ /* layouts.md 11.4: drawer scrim 20, drawer 30. The base scrim is dialog.css. */
84
+ .hs-scrim--drawer {
85
+ z-index: 20;
86
+ }
87
+
88
+ /* ------------------------------------------------------------------ */
89
+ /* l08 - content cap and card grids */
90
+ /* ------------------------------------------------------------------ */
91
+
92
+ .hs-page {
93
+ width: 100%;
94
+ max-width: 1440px;
95
+ margin: 0 auto;
96
+ box-sizing: border-box;
97
+ }
98
+
99
+ .hs-card-grid {
100
+ display: grid;
101
+ grid-template-columns: repeat(auto-fill, minmax(156px, 1fr));
102
+ gap: 30px 28px;
103
+ }
104
+
105
+ @media (max-width: 720px) {
106
+ .hs-card-grid {
107
+ grid-template-columns: repeat(2, minmax(0, 1fr));
108
+ gap: 22px 18px;
109
+ }
110
+ }
111
+
112
+ /* ------------------------------------------------------------------ */
113
+ /* i03 - lockup and its sizes */
114
+ /* ------------------------------------------------------------------ */
115
+
116
+ .hs-lockup {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ gap: 8px;
120
+ color: var(--hs-fg);
121
+ font: 750 19px var(--hs-font-display);
122
+ letter-spacing: -0.025em;
123
+ }
124
+
125
+ .hs-lockup img,
126
+ .hs-lockup svg {
127
+ flex: none;
128
+ width: 26px;
129
+ height: 26px;
130
+ }
131
+
132
+ .hs-lockup--large {
133
+ gap: 14px;
134
+ font-size: 34px;
135
+ }
136
+
137
+ .hs-lockup--large img,
138
+ .hs-lockup--large svg {
139
+ width: 46px;
140
+ height: 46px;
141
+ }
142
+
143
+ /* ------------------------------------------------------------------ */
144
+ /* l12, l12-r1 - onboarding frames */
145
+ /* ------------------------------------------------------------------ */
146
+
147
+ .hs-onboarding {
148
+ display: flex;
149
+ flex-direction: column;
150
+ min-height: 100vh;
151
+ background: var(--hs-view-bg);
152
+ color: var(--hs-fg);
153
+ }
154
+
155
+ .hs-onboarding__top {
156
+ padding: 18px 24px;
157
+ }
158
+
159
+ .hs-onboarding__body {
160
+ flex: 1;
161
+ display: flex;
162
+ justify-content: center;
163
+ padding: 24px 24px 48px;
164
+ }
165
+
166
+ /* Split sign-in frame above 720 px: the brand panel is 40% wide, at least 320 px. */
167
+ .hs-onboarding--split {
168
+ display: grid;
169
+ grid-template-columns: minmax(320px, 40%) 1fr;
170
+ }
171
+
172
+ .hs-onboarding__brand {
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ background: var(--hs-sidebar-bg);
177
+ }
178
+
179
+ .hs-onboarding__main {
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ padding: 48px;
184
+ }
185
+
186
+ /* The sign-in column: 340 px, 18 px gaps, a full-width 44 px suggested button. */
187
+ .hs-signin {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 18px;
191
+ width: 100%;
192
+ max-width: 340px;
193
+ }
194
+
195
+ .hs-signin .hs-button--suggested {
196
+ width: 100%;
197
+ height: 44px;
198
+ justify-content: center;
199
+ }
200
+
201
+ /* Setup: 760 px column, 640 px form, Back and Continue at the ends. */
202
+ .hs-setup {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 22px;
206
+ width: 100%;
207
+ max-width: 760px;
208
+ }
209
+
210
+ .hs-setup .hs-form {
211
+ max-width: 640px;
212
+ }
213
+
214
+ .hs-setup__actions {
215
+ display: flex;
216
+ justify-content: space-between;
217
+ gap: 8px;
218
+ max-width: 640px;
219
+ }
220
+
221
+ /* p27: the booting frame is the plain frame with a 48 px spinner and no text. */
222
+ .hs-booting {
223
+ display: flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ }
227
+
228
+ /* ------------------------------------------------------------------ */
229
+ /* Phone (l12-r1 B) */
230
+ /* ------------------------------------------------------------------ */
231
+
232
+ @media (max-width: 720px) {
233
+ .hs-onboarding__top {
234
+ padding: 14px;
235
+ }
236
+
237
+ .hs-onboarding__body {
238
+ padding: 0 14px 24px;
239
+ }
240
+
241
+ .hs-onboarding__body > .hs-signin {
242
+ margin-top: 20vh;
243
+ }
244
+
245
+ .hs-onboarding--split {
246
+ grid-template-columns: minmax(0, 1fr);
247
+ grid-template-rows: auto 1fr;
248
+ }
249
+
250
+ .hs-onboarding--split .hs-onboarding__brand {
251
+ justify-content: flex-start;
252
+ padding: 14px;
253
+ }
254
+
255
+ /* The large lockup collapses to the small size on phones. */
256
+ .hs-onboarding--split .hs-lockup--large {
257
+ gap: 8px;
258
+ font-size: 19px;
259
+ }
260
+
261
+ .hs-onboarding--split .hs-lockup--large img,
262
+ .hs-onboarding--split .hs-lockup--large svg {
263
+ width: 26px;
264
+ height: 26px;
265
+ }
266
+
267
+ .hs-onboarding__main {
268
+ align-items: flex-start;
269
+ padding: 14px 14px 24px;
270
+ }
271
+
272
+ .hs-setup__actions {
273
+ flex-direction: column-reverse;
274
+ }
275
+
276
+ .hs-setup__actions .hs-button {
277
+ width: 100%;
278
+ height: 44px;
279
+ justify-content: center;
280
+ }
281
+ }
@@ -0,0 +1,170 @@
1
+ /*
2
+ * k24 B - sidebar rows and section headings (surface owned by the shell), plus the
3
+ * k26 C avatar and the account row. Hover is l02b A: a faint tone at half the
4
+ * current-page tone. Current is aria-current="page". The account menu itself is
5
+ * menu.css; the row keeps its pressed tone while that menu is open (p07b).
6
+ */
7
+
8
+ .hs-sidebar {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: 2px;
12
+ height: 100%;
13
+ padding: 8px;
14
+ box-sizing: border-box;
15
+ overflow-y: auto;
16
+ background: var(--hs-sidebar-bg);
17
+ color: var(--hs-fg);
18
+ }
19
+
20
+ /* l01-r1, i03: the lockup leads the sidebar; the search field sits 8 px below it. */
21
+ .hs-sidebar .hs-lockup {
22
+ min-height: 44px;
23
+ padding: 0 10px;
24
+ margin-bottom: 8px;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ .hs-sidebar .hs-search-field {
29
+ margin: 0 2px 8px;
30
+ }
31
+
32
+ /* Fills the space between the library rows and the foot (layouts.md 2.1). */
33
+ .hs-sidebar__spacer {
34
+ flex: 1;
35
+ min-height: 8px;
36
+ }
37
+
38
+ /* ------------------------------------------------------------------ */
39
+ /* k24 - headings and rows */
40
+ /* ------------------------------------------------------------------ */
41
+
42
+ .hs-nav__heading {
43
+ margin: 0;
44
+ padding: 14px 10px 6px;
45
+ font: 600 11px var(--hs-font-body);
46
+ letter-spacing: 0.08em;
47
+ text-transform: uppercase;
48
+ color: var(--hs-fg-muted);
49
+ }
50
+
51
+ .hs-nav-item {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: 10px;
55
+ width: 100%;
56
+ height: 36px;
57
+ padding: 0 10px;
58
+ box-sizing: border-box;
59
+ margin: 0;
60
+ border: 0;
61
+ border-radius: var(--hs-radius-row);
62
+ background: transparent;
63
+ color: var(--hs-fg);
64
+ font: 400 14px var(--hs-font-body);
65
+ text-align: left;
66
+ text-decoration: none;
67
+ cursor: default;
68
+ appearance: none;
69
+ transition: background var(--hs-duration-hover) var(--hs-ease);
70
+ }
71
+
72
+ .hs-nav-item .hs-icon {
73
+ --hs-icon-size: 16px;
74
+ color: var(--hs-fg-muted);
75
+ }
76
+
77
+ .hs-nav-item .hs-count-badge {
78
+ margin-left: auto;
79
+ }
80
+
81
+ /* l02b A: faint hover, never on the current page. */
82
+ .hs-nav-item:hover:not(.hs-nav-item--current):not([aria-current='page']) {
83
+ background: color-mix(in srgb, var(--hs-fg) 5%, transparent);
84
+ }
85
+
86
+ .hs-nav-item--current,
87
+ .hs-nav-item[aria-current='page'] {
88
+ background: var(--hs-control-tone);
89
+ font-weight: 600;
90
+ }
91
+
92
+ .hs-nav-item--current .hs-icon,
93
+ .hs-nav-item[aria-current='page'] .hs-icon {
94
+ color: var(--hs-fg);
95
+ }
96
+
97
+ .hs-nav-item:focus-visible {
98
+ outline: none;
99
+ background: var(--hs-accent-tint);
100
+ color: var(--hs-accent-text);
101
+ font-weight: 600;
102
+ box-shadow: var(--hs-focus-shadow);
103
+ }
104
+
105
+ /* ------------------------------------------------------------------ */
106
+ /* k26 - avatar and account row */
107
+ /* ------------------------------------------------------------------ */
108
+
109
+ .hs-avatar {
110
+ display: inline-flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ flex: none;
114
+ width: 32px;
115
+ height: 32px;
116
+ border-radius: 50%;
117
+ background: var(--hs-control-tone);
118
+ color: var(--hs-fg-muted);
119
+ }
120
+
121
+ .hs-avatar .hs-icon {
122
+ --hs-icon-size: 18px;
123
+ }
124
+
125
+ .hs-account {
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 10px;
129
+ width: 100%;
130
+ height: 48px;
131
+ padding: 0 10px;
132
+ box-sizing: border-box;
133
+ margin: 0;
134
+ border: 0;
135
+ border-radius: var(--hs-radius-row);
136
+ background: var(--hs-control-tone);
137
+ color: var(--hs-fg);
138
+ font: 500 14px var(--hs-font-body);
139
+ text-align: left;
140
+ cursor: default;
141
+ appearance: none;
142
+ transition: background var(--hs-duration-hover) var(--hs-ease);
143
+ }
144
+
145
+ .hs-account__name {
146
+ flex: 1;
147
+ min-width: 0;
148
+ overflow: hidden;
149
+ text-overflow: ellipsis;
150
+ white-space: nowrap;
151
+ }
152
+
153
+ /* p07b: the row keeps its pressed tone while the menu is open. */
154
+ .hs-account[aria-expanded='true'] {
155
+ background: color-mix(in srgb, var(--hs-fg) 15%, transparent);
156
+ }
157
+
158
+ .hs-account:focus-visible {
159
+ outline: none;
160
+ background: var(--hs-accent-tint);
161
+ color: var(--hs-accent-text);
162
+ box-shadow: var(--hs-focus-shadow);
163
+ }
164
+
165
+ @media (prefers-reduced-motion: reduce) {
166
+ .hs-nav-item,
167
+ .hs-account {
168
+ transition: none;
169
+ }
170
+ }
@@ -0,0 +1,92 @@
1
+ /*
2
+ * k08 C - seek and volume sliders: thick acid on grey, no thumb at rest.
3
+ *
4
+ * Markup: <div class="hs-slider" role="slider" tabindex="0" aria-label="Seek"
5
+ * aria-valuetext="..."><span class="hs-slider__track"></span>
6
+ * <span class="hs-slider__buffer" style="width:..."></span>
7
+ * <span class="hs-slider__elapsed" style="width:..."></span>
8
+ * <span class="hs-slider__thumb" style="left:..."></span></div>.
9
+ * The client writes the buffer, elapsed and thumb lengths; the package only draws them.
10
+ *
11
+ * ACCEPTED EXCEPTION (k08, foundations.md 12.1 item 2): the light elapsed fill measures
12
+ * 1.4:1 against the page; the 8 px track and the filled length carry the position.
13
+ */
14
+
15
+ .hs-slider {
16
+ position: relative;
17
+ flex: 1;
18
+ height: 24px;
19
+ min-width: 60px;
20
+ }
21
+
22
+ .hs-slider__track,
23
+ .hs-slider__buffer,
24
+ .hs-slider__elapsed {
25
+ position: absolute;
26
+ left: 0;
27
+ top: 50%;
28
+ height: 8px;
29
+ margin-top: -4px;
30
+ border-radius: var(--hs-radius-full);
31
+ transition:
32
+ height var(--hs-duration-hover) var(--hs-ease),
33
+ margin var(--hs-duration-hover) var(--hs-ease);
34
+ }
35
+
36
+ .hs-slider__track {
37
+ right: 0;
38
+ background: var(--hs-slider-track);
39
+ }
40
+
41
+ .hs-slider__buffer {
42
+ background: var(--hs-slider-buffer);
43
+ }
44
+
45
+ .hs-slider__elapsed {
46
+ background: var(--hs-accent-bg);
47
+ }
48
+
49
+ /* Hover and drag thicken track, buffer and elapsed to 12 px. */
50
+ .hs-slider:hover .hs-slider__track,
51
+ .hs-slider:hover .hs-slider__buffer,
52
+ .hs-slider:hover .hs-slider__elapsed,
53
+ .hs-slider:active .hs-slider__track,
54
+ .hs-slider:active .hs-slider__buffer,
55
+ .hs-slider:active .hs-slider__elapsed {
56
+ height: 12px;
57
+ margin-top: -6px;
58
+ }
59
+
60
+ /* No thumb except on keyboard focus. */
61
+ .hs-slider__thumb {
62
+ position: absolute;
63
+ top: 50%;
64
+ width: 20px;
65
+ height: 20px;
66
+ border-radius: 50%;
67
+ transform: translate(-50%, -50%);
68
+ background: var(--hs-accent-bg);
69
+ opacity: 0;
70
+ box-shadow: var(--hs-focus-shadow), 0 1px 3px rgb(0 0 0 / 18%);
71
+ transition: opacity var(--hs-duration-hover) var(--hs-ease);
72
+ }
73
+
74
+ .hs-slider:focus-visible {
75
+ outline: none;
76
+ }
77
+
78
+ .hs-slider:focus-visible .hs-slider__thumb {
79
+ opacity: 1;
80
+ }
81
+
82
+ /* o02 idle: the whole control is inert, no thumb. */
83
+ .hs-slider:disabled,
84
+ .hs-slider[aria-disabled='true'] {
85
+ opacity: 0.4;
86
+ pointer-events: none;
87
+ }
88
+
89
+ .hs-slider:disabled .hs-slider__thumb,
90
+ .hs-slider[aria-disabled='true'] .hs-slider__thumb {
91
+ opacity: 0;
92
+ }