@nu-appdev/northwestern-starlight-theme 1.1.1 → 1.3.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 (45) hide show
  1. package/CHANGELOG.md +73 -2
  2. package/index.ts +84 -5
  3. package/mermaid.ts +196 -80
  4. package/package.json +19 -4
  5. package/src/components/Expandable.astro +19 -0
  6. package/src/components/Glossary.astro +11 -0
  7. package/src/components/Hero.astro +0 -2
  8. package/src/components/Kbd.astro +147 -0
  9. package/src/components/Property.astro +64 -0
  10. package/src/components/PropertyGroup.astro +13 -0
  11. package/src/components/PropertyTable.astro +54 -0
  12. package/src/components/Term.astro +29 -0
  13. package/src/components/Tooltip.astro +138 -0
  14. package/src/components/glossary-store.ts +12 -0
  15. package/src/components/index.ts +8 -0
  16. package/src/rehype-table-scroll.ts +35 -0
  17. package/src/scripts/mermaid/focus.ts +100 -0
  18. package/src/scripts/mermaid/fullscreen.ts +120 -0
  19. package/src/scripts/mermaid/index.ts +2 -0
  20. package/src/scripts/mermaid/overlay.ts +132 -0
  21. package/src/scripts/mermaid/pan-zoom.ts +285 -0
  22. package/src/scripts/mermaid/render.ts +143 -0
  23. package/src/scripts/mermaid/toolbar.ts +137 -0
  24. package/src/scripts/mermaid/ui.ts +265 -0
  25. package/src/styles/a11y.css +69 -0
  26. package/src/styles/components/blockquotes.css +37 -0
  27. package/src/styles/components/code.css +8 -5
  28. package/src/styles/components/footnotes.css +76 -0
  29. package/src/styles/components/kbd.css +69 -0
  30. package/src/styles/components/mermaid.css +4 -4
  31. package/src/styles/components/property-table.css +569 -0
  32. package/src/styles/components/steps.css +0 -3
  33. package/src/styles/components/tables.css +60 -0
  34. package/src/styles/components/tabs.css +0 -3
  35. package/src/styles/components/tooltip.css +145 -0
  36. package/src/styles/content.css +9 -94
  37. package/src/styles/layers.css +0 -7
  38. package/src/styles/mermaid-toolbar.css +91 -14
  39. package/src/styles/navigation.css +72 -16
  40. package/src/styles/openapi.css +0 -3
  41. package/src/styles/theme.css +0 -4
  42. package/src/styles/typography.css +4 -0
  43. package/src/styles/variables.css +0 -3
  44. package/src/virtual.d.ts +11 -0
  45. package/src/scripts/mermaid-toolbar.ts +0 -589
@@ -0,0 +1,145 @@
1
+ /* ==========================================================================
2
+ Tooltip — Inline hover/focus definitions
3
+ ========================================================================== */
4
+
5
+ /* stylelint-disable selector-class-pattern */
6
+
7
+ @layer northwestern {
8
+ .nu-tooltip {
9
+ position: relative;
10
+ display: inline;
11
+ cursor: help;
12
+ }
13
+
14
+ .nu-tooltip__trigger {
15
+ position: relative;
16
+ }
17
+
18
+ .nu-tooltip--underline .nu-tooltip__trigger {
19
+ text-decoration: underline;
20
+ text-decoration-thickness: 1px;
21
+ text-decoration-style: dotted;
22
+ text-decoration-color: var(--nu-color-text-muted);
23
+ text-underline-offset: 3px;
24
+ transition: text-decoration-color var(--nu-transition-fast);
25
+ }
26
+
27
+ .nu-tooltip--underline:hover .nu-tooltip__trigger,
28
+ .nu-tooltip--underline:focus-within .nu-tooltip__trigger {
29
+ text-decoration-color: var(--sl-color-text-accent);
30
+ }
31
+
32
+ .nu-tooltip__content {
33
+ position: fixed;
34
+ z-index: 1000;
35
+ box-sizing: border-box;
36
+ width: max-content;
37
+ max-width: 280px;
38
+ padding: 0.375rem 0.625rem;
39
+ margin: 0;
40
+ font-family: var(--nu-font-body);
41
+ font-size: var(--sl-text-xs);
42
+ font-weight: 400;
43
+ line-height: 1.5;
44
+ color: var(--nu-color-text);
45
+ text-align: left;
46
+ background-color: var(--nu-card-bg);
47
+ border: 1px solid var(--nu-border-color);
48
+ box-shadow: 0 2px 8px rgb(0 0 0 / 8%);
49
+ opacity: 0;
50
+ transition: opacity var(--nu-transition-fast);
51
+ }
52
+
53
+ :root:not([data-theme="light"]) .nu-tooltip__content {
54
+ box-shadow: 0 2px 8px rgb(0 0 0 / 25%);
55
+ }
56
+
57
+ /* Rich content slot styling */
58
+ .nu-tooltip__content p,
59
+ .nu-tooltip__content > :first-child {
60
+ margin-top: 0;
61
+ }
62
+
63
+ .nu-tooltip__content p,
64
+ .nu-tooltip__content > :last-child {
65
+ margin-bottom: 0;
66
+ }
67
+
68
+ .nu-tooltip__trigger p {
69
+ display: inline;
70
+ margin: 0;
71
+ }
72
+
73
+ .nu-tooltip__content strong {
74
+ font-weight: 600;
75
+ color: inherit;
76
+ }
77
+
78
+ .nu-tooltip__content code {
79
+ padding: 0.1rem 0.25rem;
80
+ font-family: var(--sl-font-system-mono);
81
+ font-size: 0.9em;
82
+ background-color: rgb(0 0 0 / 6%);
83
+ }
84
+
85
+ :root:not([data-theme="light"]) .nu-tooltip__content code {
86
+ background-color: rgb(255 255 255 / 8%);
87
+ }
88
+
89
+ .nu-tooltip__content[popover] {
90
+ inset: unset;
91
+ overflow: visible;
92
+ }
93
+
94
+ .nu-tooltip__content:popover-open {
95
+ opacity: 1;
96
+ }
97
+
98
+ .nu-tooltip__content::backdrop {
99
+ display: none;
100
+ }
101
+
102
+ .nu-tooltip__arrow {
103
+ position: absolute;
104
+ left: 50%;
105
+ width: 8px;
106
+ height: 8px;
107
+ background-color: var(--nu-card-bg);
108
+ border-color: var(--nu-border-color);
109
+ border-style: solid;
110
+ transform: translateX(-50%) rotate(45deg);
111
+ }
112
+
113
+ .nu-tooltip--top .nu-tooltip__arrow {
114
+ bottom: -5px;
115
+ border-top: none;
116
+ border-right-width: 1px;
117
+ border-bottom-width: 1px;
118
+ border-left: none;
119
+ }
120
+
121
+ .nu-tooltip--bottom .nu-tooltip__arrow {
122
+ top: -5px;
123
+ border-top-width: 1px;
124
+ border-right: none;
125
+ border-bottom: none;
126
+ border-left-width: 1px;
127
+ }
128
+
129
+ .nu-tooltip--custom .nu-tooltip__content {
130
+ color: var(--nu-tip-text);
131
+ background-color: var(--nu-tip-bg);
132
+ border-color: var(--nu-tip-border);
133
+ box-shadow: none;
134
+ }
135
+
136
+ .nu-tooltip--custom .nu-tooltip__arrow {
137
+ background-color: var(--nu-tip-arrow);
138
+ border-color: var(--nu-tip-border);
139
+ }
140
+
141
+ .nu-tooltip__trigger:focus-visible {
142
+ outline: 2px solid var(--nu-focus-ring);
143
+ outline-offset: 2px;
144
+ }
145
+ }
@@ -1,12 +1,13 @@
1
1
  /* ==========================================================================
2
- Content — Markdown Prose, Badges, Tables, Buttons
2
+ Content — Links, Lists, Figures, Horizontal Rules, Badges, Asides, Buttons
3
3
 
4
- Encapsulates rendered markdown content, prose-adjacent Starlight components,
5
- and content-area UI such as badges, asides, tables, and link buttons.
4
+ Core markdown prose styling. Component-scoped styles (tables, blockquotes,
5
+ footnotes, cards, code, tabs, steps) live in their own files under
6
+ src/styles/components/.
6
7
  ========================================================================== */
7
8
 
8
9
  @layer northwestern {
9
- .sl-markdown-content a:not(.anchor-link, [role="tab"], .not-content) {
10
+ .sl-markdown-content a:not(.anchor-link, [role="tab"], .not-content, [data-footnote-ref], [data-footnote-backref]) {
10
11
  padding-bottom: 2px;
11
12
  font-weight: 700;
12
13
  color: var(--sl-color-accent);
@@ -15,7 +16,8 @@
15
16
  transition: all var(--nu-transition-default);
16
17
  }
17
18
 
18
- .sl-markdown-content a:not(.anchor-link, [role="tab"], .not-content):hover {
19
+ .sl-markdown-content
20
+ a:not(.anchor-link, [role="tab"], .not-content, [data-footnote-ref], [data-footnote-backref]):hover {
19
21
  text-decoration: none;
20
22
  border-bottom-style: solid;
21
23
  }
@@ -55,48 +57,12 @@
55
57
  }
56
58
 
57
59
  .sl-markdown-content hr:not(:where(.not-content *)) {
58
- height: 3px;
60
+ height: 1px;
59
61
  margin: 2.5rem 0;
60
- background: var(--nu-purple-10);
62
+ background: var(--nu-border-color);
61
63
  border: 0;
62
64
  }
63
65
 
64
- :root:not([data-theme="light"]) .sl-markdown-content hr:not(:where(.not-content *)) {
65
- background: var(--nu-purple-140);
66
- }
67
-
68
- .sl-markdown-content blockquote:not(:where(.not-content *)) {
69
- padding: 1rem 1.5rem;
70
- margin: 2rem 0;
71
- color: var(--nu-color-text);
72
- background: rgb(228 224 238 / 42%);
73
- border-inline-start: 10px solid var(--nu-purple-100);
74
- }
75
-
76
- .sl-markdown-content blockquote:not(:where(.not-content *)) p:last-child {
77
- margin-bottom: 0;
78
- }
79
-
80
- .sl-markdown-content blockquote:not(:where(.not-content *)) cite,
81
- .sl-markdown-content blockquote:not(:where(.not-content *)) footer {
82
- display: block;
83
- margin-top: 0.75rem;
84
- font-size: var(--sl-text-sm);
85
- font-style: normal;
86
- font-weight: 700;
87
- color: var(--nu-color-link);
88
- }
89
-
90
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) {
91
- background: rgb(48 16 78 / 35%);
92
- border-inline-start-color: var(--nu-purple-40);
93
- }
94
-
95
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) cite,
96
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) footer {
97
- color: var(--nu-purple-30);
98
- }
99
-
100
66
  .sl-markdown-content figure:not(:where(.not-content *)) {
101
67
  margin: 2rem 0;
102
68
  }
@@ -269,57 +235,6 @@
269
235
  background-color: rgb(239 85 63 / 8%) !important;
270
236
  }
271
237
 
272
- .sl-markdown-content table:not(:where(.not-content *)) {
273
- display: table;
274
- width: 100%;
275
- text-indent: 0;
276
- border-collapse: collapse;
277
- border-color: var(--nu-border-color);
278
- }
279
-
280
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th {
281
- padding: 0.5rem 1rem;
282
- font-family: var(--nu-font-heading);
283
- font-weight: 600;
284
- color: var(--nu-black-80);
285
- text-align: left;
286
- background-color: var(--nu-purple-surface);
287
- border: 1px solid var(--nu-border-color);
288
- }
289
-
290
- :root:not([data-theme="light"]) .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th {
291
- color: var(--nu-color-text);
292
- background-color: rgb(78 42 132 / 14%);
293
- }
294
-
295
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td {
296
- padding: 0.5rem 1rem;
297
- text-align: left;
298
- border: 1px solid var(--nu-border-color);
299
- }
300
-
301
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th[align="right"],
302
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td[align="right"] {
303
- text-align: right;
304
- }
305
-
306
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th[align="center"],
307
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td[align="center"] {
308
- text-align: center;
309
- }
310
-
311
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr:nth-child(even) {
312
- background-color: #f3f4f6;
313
- }
314
-
315
- :root:not([data-theme="light"])
316
- .sl-markdown-content
317
- table:not(:where(.not-content *))
318
- > tbody
319
- > tr:nth-child(even) {
320
- background-color: #1e1e1e;
321
- }
322
-
323
238
  .sl-link-button {
324
239
  transition:
325
240
  background-color var(--nu-transition-fast),
@@ -1,8 +1 @@
1
- /* ==========================================================================
2
- Layers — Theme Cascade Order
3
-
4
- Encapsulates the cascade layer ordering shared by Starlight and the
5
- Northwestern theme so later files can rely on a stable layer stack.
6
- ========================================================================== */
7
-
8
1
  @layer starlight, northwestern;
@@ -1,15 +1,12 @@
1
1
  /* ==========================================================================
2
2
  Mermaid Toolbar — Diagram Interaction Layer
3
-
4
- Encapsulates hover actions, fullscreen overlay controls, and the pan/zoom
5
- viewport used by the Mermaid diagram interaction layer.
6
3
  ========================================================================== */
7
4
 
8
5
  @layer northwestern {
9
6
  .nu-mermaid-toolbar {
10
7
  position: absolute;
11
- top: 0.5rem;
12
- right: 0.5rem;
8
+ top: 0;
9
+ right: 1rem;
13
10
  z-index: 2;
14
11
  display: flex;
15
12
  gap: 1px;
@@ -31,7 +28,6 @@
31
28
  opacity: 1;
32
29
  }
33
30
 
34
- /* Touch devices can't hover — keep toolbar visible */
35
31
  @media (hover: none) {
36
32
  .nu-mermaid-toolbar {
37
33
  opacity: 0.8;
@@ -75,8 +71,8 @@
75
71
  }
76
72
 
77
73
  .nu-mermaid-btn:focus-visible {
78
- outline: none;
79
- box-shadow: 0 0 0 0.25rem var(--nu-focus-shadow-color);
74
+ outline: 2px solid var(--sl-color-accent);
75
+ outline-offset: -2px;
80
76
  }
81
77
 
82
78
  .nu-mermaid-btn:hover {
@@ -110,6 +106,7 @@
110
106
  z-index: 9999;
111
107
  display: flex;
112
108
  flex-direction: column;
109
+ outline: none;
113
110
  background: #f3f5f7;
114
111
  transition: opacity 200ms ease;
115
112
  }
@@ -124,8 +121,8 @@
124
121
  flex-shrink: 0;
125
122
  gap: 0.25rem;
126
123
  align-items: center;
127
- height: var(--sl-nav-height);
128
- padding: 0 1.5rem;
124
+ min-height: var(--sl-nav-height);
125
+ padding: 0.5rem var(--sl-nav-pad-x, 1.5rem);
129
126
  background: var(--nu-topbar-bg);
130
127
  border-bottom: 1px solid var(--nu-border-color);
131
128
  }
@@ -144,6 +141,11 @@
144
141
  height: 16px;
145
142
  }
146
143
 
144
+ .nu-mermaid-overlay-controls .nu-mermaid-btn:focus-visible {
145
+ outline: none;
146
+ box-shadow: 0 0 0 2px rgb(255 255 255 / 60%);
147
+ }
148
+
147
149
  .nu-mermaid-overlay-controls .nu-mermaid-btn:hover {
148
150
  color: #fff;
149
151
  background: rgb(255 255 255 / 25%);
@@ -166,13 +168,27 @@
166
168
 
167
169
  .nu-mermaid-overlay-controls .nu-mermaid-close {
168
170
  color: #fff;
169
- background: rgb(255 255 255 / 20%);
170
- border-color: rgb(255 255 255 / 30%);
171
+ background: rgb(255 255 255 / 15%);
172
+ border-color: rgb(255 255 255 / 25%);
171
173
  }
172
174
 
173
175
  .nu-mermaid-overlay-controls .nu-mermaid-close:hover {
174
- background: rgb(255 255 255 / 35%);
175
- border-color: rgb(255 255 255 / 40%);
176
+ background: rgb(255 255 255 / 25%);
177
+ }
178
+
179
+ @media (width < 50rem) {
180
+ .nu-mermaid-overlay-controls [data-action="zoom-in"],
181
+ .nu-mermaid-overlay-controls [data-action="zoom-out"],
182
+ .nu-mermaid-overlay-controls [data-action="zoom-reset"],
183
+ .nu-mermaid-overlay-controls .nu-mermaid-separator {
184
+ display: none;
185
+ }
186
+
187
+ .nu-mermaid-overlay-controls .nu-mermaid-close {
188
+ width: var(--sl-menu-button-size, 2rem);
189
+ height: var(--sl-menu-button-size, 2rem);
190
+ padding: 0;
191
+ }
176
192
  }
177
193
 
178
194
  .nu-mermaid-viewport {
@@ -183,6 +199,12 @@
183
199
  overflow: hidden;
184
200
  touch-action: none;
185
201
  cursor: grab;
202
+ background-image: radial-gradient(circle, rgb(0 0 0 / 5%) 0.75px, transparent 0.75px);
203
+ background-size: 28px 28px;
204
+ }
205
+
206
+ :root:not([data-theme="light"]) .nu-mermaid-viewport {
207
+ background-image: radial-gradient(circle, rgb(255 255 255 / 5%) 0.75px, transparent 0.75px);
186
208
  }
187
209
 
188
210
  .nu-mermaid-viewport:active {
@@ -199,4 +221,59 @@
199
221
  background: transparent !important;
200
222
  border: none !important;
201
223
  }
224
+
225
+ .nu-mermaid-zoom-badge {
226
+ position: absolute;
227
+ right: 1rem;
228
+ bottom: 1rem;
229
+ padding: 0.2rem 0.5rem;
230
+ font-family: var(--nu-font-mono, ui-monospace, monospace);
231
+ font-size: 0.75rem;
232
+ line-height: 1;
233
+ color: rgb(255 255 255 / 70%);
234
+ pointer-events: none;
235
+ background: rgb(0 0 0 / 35%);
236
+
237
+ /* stylelint-disable-next-line property-no-vendor-prefix -- Safari requires prefix */
238
+ -webkit-backdrop-filter: blur(6px);
239
+ backdrop-filter: blur(6px);
240
+ }
241
+
242
+ :root[data-theme="light"] .nu-mermaid-zoom-badge {
243
+ color: rgb(0 0 0 / 55%);
244
+ background: rgb(255 255 255 / 50%);
245
+ }
246
+
247
+ .nu-mermaid-toast {
248
+ position: absolute;
249
+ right: 1rem;
250
+ bottom: 3rem;
251
+ z-index: 1;
252
+ padding: 0.5rem 0.875rem;
253
+ font-family: var(--nu-font-body, sans-serif);
254
+ font-size: 0.8125rem;
255
+ font-weight: 600;
256
+ color: #fff;
257
+ pointer-events: none;
258
+ background: color-mix(in srgb, var(--nu-color-success) 85%, #fff);
259
+ opacity: 0;
260
+ transform: translateY(4px);
261
+ transition:
262
+ opacity 200ms ease,
263
+ transform 200ms ease;
264
+ }
265
+
266
+ .nu-mermaid-toast-visible {
267
+ opacity: 1;
268
+ transform: translateY(0);
269
+ }
270
+
271
+ @media (width < 50rem) {
272
+ .nu-mermaid-toast {
273
+ right: 1rem;
274
+ bottom: 4rem;
275
+ left: 1rem;
276
+ text-align: center;
277
+ }
278
+ }
202
279
  }
@@ -9,22 +9,25 @@
9
9
  .site-title,
10
10
  .header > a,
11
11
  .header > nav a,
12
- .social-icons a,
13
- starlight-theme-select,
14
- starlight-theme-select label,
15
- starlight-theme-select select,
16
- starlight-theme-select svg,
17
- northwestern-theme-toggle,
18
- northwestern-theme-toggle button,
19
- northwestern-theme-toggle svg,
12
+ .header .social-icons a,
20
13
  starlight-menu-button,
21
14
  starlight-menu-button button {
22
15
  color: var(--nu-topbar-text) !important;
23
16
  fill: var(--nu-topbar-text) !important;
24
17
  }
25
18
 
19
+ .header northwestern-theme-toggle,
20
+ .header northwestern-theme-toggle button,
21
+ .header northwestern-theme-toggle svg,
22
+ .header starlight-theme-select,
23
+ .header starlight-theme-select label,
24
+ .header starlight-theme-select select,
25
+ .header starlight-theme-select svg {
26
+ color: var(--nu-topbar-text) !important;
27
+ fill: var(--nu-topbar-text) !important;
28
+ }
29
+
26
30
  starlight-menu-button button,
27
- northwestern-theme-toggle button,
28
31
  .header northwestern-theme-toggle button {
29
32
  background: rgb(255 255 255 / 15%) !important;
30
33
  border: 1px solid rgb(255 255 255 / 25%) !important;
@@ -33,11 +36,57 @@
33
36
  }
34
37
 
35
38
  starlight-menu-button button:hover,
36
- northwestern-theme-toggle button:hover,
37
39
  .header northwestern-theme-toggle button:hover {
38
40
  background: rgb(255 255 255 / 25%) !important;
39
41
  }
40
42
 
43
+ starlight-menu-button button:focus-visible,
44
+ .header northwestern-theme-toggle button:focus-visible {
45
+ outline: none !important;
46
+ box-shadow: 0 0 0 2px rgb(255 255 255 / 60%) !important;
47
+ }
48
+
49
+ @media (width < 50rem) {
50
+ .sidebar-pane .actions {
51
+ align-items: center;
52
+ }
53
+
54
+ .sidebar-pane northwestern-theme-toggle button {
55
+ width: 2.5rem;
56
+ height: 2.5rem;
57
+ color: var(--nu-color-text) !important;
58
+ background: var(--nu-hover-bg) !important;
59
+ border: 1px solid var(--nu-border-color) !important;
60
+ }
61
+
62
+ .sidebar-pane northwestern-theme-toggle svg {
63
+ fill: var(--nu-color-text) !important;
64
+ }
65
+
66
+ .sidebar-pane .social-icons {
67
+ align-items: center;
68
+ padding: 0 !important;
69
+ margin: 0 !important;
70
+ }
71
+
72
+ .sidebar-pane .social-icons a {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ width: 2.5rem;
77
+ height: 2.5rem;
78
+ padding: 0 !important;
79
+ margin: 0 !important;
80
+ color: var(--nu-color-text) !important;
81
+ background: var(--nu-hover-bg);
82
+ border: 1px solid var(--nu-border-color);
83
+ }
84
+
85
+ .sidebar-pane .social-icons svg {
86
+ fill: var(--nu-color-text) !important;
87
+ }
88
+ }
89
+
41
90
  @media (width < 50rem) {
42
91
  site-search button {
43
92
  color: var(--nu-topbar-text) !important;
@@ -102,27 +151,29 @@
102
151
  border-color: var(--nu-black-20) !important;
103
152
  }
104
153
 
105
- /* Starlight owns these borders; force them onto the shared theme token. */
106
154
  .header,
107
155
  .sidebar-pane {
108
156
  border-color: var(--nu-border-color) !important;
109
157
  }
110
158
 
159
+ nav.sidebar a {
160
+ border-left: 3px solid transparent;
161
+ }
162
+
111
163
  nav.sidebar a:hover {
112
164
  background-color: var(--nu-purple-surface) !important;
113
165
  }
114
166
 
115
167
  nav.sidebar a[aria-current="page"] {
116
- padding-left: 0.8rem;
117
168
  font-weight: 700;
118
169
  color: var(--nu-color-link) !important;
119
170
  background-color: var(--nu-purple-surface) !important;
120
- border-left: 3px solid var(--nu-color-link);
171
+ border-left-color: var(--nu-color-link);
121
172
  }
122
173
 
123
174
  nav.sidebar a[aria-current="true"] {
124
175
  font-weight: 600;
125
- border-left: 3px solid var(--nu-color-link);
176
+ border-left-color: var(--nu-color-link);
126
177
  }
127
178
 
128
179
  :root:not([data-theme="light"]) nav.sidebar a:hover {
@@ -139,7 +190,6 @@
139
190
  border-left: 3px solid transparent;
140
191
  transition:
141
192
  border-color var(--nu-transition-fast),
142
- padding-left var(--nu-transition-fast),
143
193
  font-weight var(--nu-transition-fast);
144
194
  }
145
195
 
@@ -148,7 +198,6 @@
148
198
  }
149
199
 
150
200
  .right-sidebar-panel a[aria-current="true"] {
151
- padding-left: 0.8rem;
152
201
  font-weight: 600;
153
202
  border-left-color: var(--sl-color-accent);
154
203
  }
@@ -206,4 +255,11 @@
206
255
  .sidebar-content a[href="/changelog/"]:hover span {
207
256
  opacity: 1;
208
257
  }
258
+
259
+ dialog button:focus-visible,
260
+ dialog input:focus-visible,
261
+ dialog a:focus-visible {
262
+ outline: 2px solid var(--nu-focus-ring) !important;
263
+ outline-offset: 2px;
264
+ }
209
265
  }
@@ -1,8 +1,5 @@
1
1
  /* ==========================================================================
2
2
  OpenAPI — Scoped overrides for starlight-openapi plugin
3
-
4
- Encapsulates method badges plus OpenAPI content panels, rows, fields,
5
- and controls rendered inside markdown content.
6
3
  ========================================================================== */
7
4
 
8
5
  /* stylelint-disable selector-class-pattern */
@@ -1,11 +1,7 @@
1
1
  /* ==========================================================================
2
2
  Theme — Starlight Variable Mapping
3
-
4
- Encapsulates the mapping from Northwestern design tokens onto Starlight's
5
- theme variables, plus global paint and border-radius overrides.
6
3
  ========================================================================== */
7
4
 
8
- /* Unlayered — paints immediately to prevent white flash on load */
9
5
  html {
10
6
  background-color: #18181b;
11
7
  }
@@ -165,6 +165,10 @@
165
165
  }
166
166
 
167
167
  .site-title {
168
+ overflow: hidden;
169
+ text-overflow: ellipsis;
168
170
  font-family: var(--nu-font-heading);
171
+ font-size: clamp(1rem, 3.5vw, 1.125rem);
172
+ white-space: nowrap;
169
173
  }
170
174
  }
@@ -1,8 +1,5 @@
1
1
  /* ==========================================================================
2
2
  Variables — Northwestern Design Tokens
3
-
4
- Encapsulates the shared design-token source of truth for color, typography,
5
- motion, surface, focus, and light/dark layout values.
6
3
  ========================================================================== */
7
4
 
8
5
  @layer northwestern {
package/src/virtual.d.ts CHANGED
@@ -1,3 +1,12 @@
1
+ declare global {
2
+ var __nuPropertySlugs:
3
+ | {
4
+ page: string;
5
+ counts: Map<string, number>;
6
+ }
7
+ | undefined;
8
+ }
9
+
1
10
  declare module "virtual:northwestern-theme/config" {
2
11
  const config: {
3
12
  homepage: {
@@ -8,3 +17,5 @@ declare module "virtual:northwestern-theme/config" {
8
17
  };
9
18
  export default config;
10
19
  }
20
+
21
+ export {};