@nu-appdev/northwestern-starlight-theme 1.2.0 → 1.3.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 (45) hide show
  1. package/CHANGELOG.md +63 -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 +183 -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 +4 -160
  37. package/src/styles/layers.css +0 -7
  38. package/src/styles/mermaid-toolbar.css +62 -13
  39. package/src/styles/navigation.css +66 -17
  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 -659
@@ -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,8 +1,9 @@
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 {
@@ -21,80 +22,6 @@
21
22
  border-bottom-style: solid;
22
23
  }
23
24
 
24
- /* Footnote references — superscript markers with brackets */
25
- .sl-markdown-content a[data-footnote-ref] {
26
- font-weight: 600;
27
- line-height: 1;
28
- vertical-align: super;
29
- color: var(--sl-color-accent);
30
- text-decoration: none;
31
- }
32
-
33
- .sl-markdown-content a[data-footnote-ref]::before {
34
- content: "[";
35
- }
36
-
37
- .sl-markdown-content a[data-footnote-ref]::after {
38
- content: "]";
39
- }
40
-
41
- .sl-markdown-content a[data-footnote-ref]:hover {
42
- text-decoration: underline;
43
- }
44
-
45
- /* Footnotes section */
46
- .sl-markdown-content section[data-footnotes] {
47
- padding-top: 1.5rem;
48
- margin-top: 2.5rem;
49
- font-size: 0.875rem;
50
- color: var(--nu-color-text-muted);
51
- border-top: 1px solid var(--nu-border-color);
52
- }
53
-
54
- /* Hide the default <hr> that remark-gfm inserts before footnotes */
55
- .sl-markdown-content section[data-footnotes] > :first-child:is(hr) {
56
- display: none;
57
- }
58
-
59
- /* Collapse the heading wrapper around the sr-only "Footnotes" label */
60
- .sl-markdown-content section[data-footnotes] > .sl-heading-wrapper {
61
- position: absolute;
62
- width: 1px;
63
- height: 1px;
64
- padding: 0;
65
- margin: -1px;
66
- overflow: hidden;
67
- white-space: nowrap;
68
- border: 0;
69
- clip-path: inset(50%);
70
- }
71
-
72
- .sl-markdown-content section[data-footnotes] ol {
73
- padding-left: 1.5rem;
74
- }
75
-
76
- .sl-markdown-content section[data-footnotes] li {
77
- padding-left: 0.25rem;
78
- }
79
-
80
- .sl-markdown-content section[data-footnotes] li + li {
81
- margin-top: 0.5rem;
82
- }
83
-
84
- .sl-markdown-content section[data-footnotes] a[data-footnote-backref] {
85
- margin-left: 0.25em;
86
- font-family: "Segoe UI Symbol", "Noto Sans Symbols 2", sans-serif;
87
- font-size: 1em;
88
- font-weight: 700;
89
- color: var(--sl-color-accent);
90
- text-decoration: none;
91
- font-variant-emoji: text;
92
- }
93
-
94
- .sl-markdown-content section[data-footnotes] a[data-footnote-backref]:hover {
95
- border-bottom: 1px solid var(--sl-color-accent);
96
- }
97
-
98
25
  .sl-markdown-content ul:not(:where(.not-content *)) {
99
26
  padding-left: 1.25rem;
100
27
  list-style: none;
@@ -136,38 +63,6 @@
136
63
  border: 0;
137
64
  }
138
65
 
139
- .sl-markdown-content blockquote:not(:where(.not-content *)) {
140
- padding: 1rem 1.5rem;
141
- margin: 2rem 0;
142
- color: var(--nu-color-text);
143
- background: rgb(228 224 238 / 42%);
144
- border-inline-start: 10px solid var(--nu-purple-100);
145
- }
146
-
147
- .sl-markdown-content blockquote:not(:where(.not-content *)) p:last-child {
148
- margin-bottom: 0;
149
- }
150
-
151
- .sl-markdown-content blockquote:not(:where(.not-content *)) cite,
152
- .sl-markdown-content blockquote:not(:where(.not-content *)) footer {
153
- display: block;
154
- margin-top: 0.75rem;
155
- font-size: var(--sl-text-sm);
156
- font-style: normal;
157
- font-weight: 700;
158
- color: var(--nu-color-link);
159
- }
160
-
161
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) {
162
- background: rgb(48 16 78 / 35%);
163
- border-inline-start-color: var(--nu-purple-40);
164
- }
165
-
166
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) cite,
167
- :root:not([data-theme="light"]) .sl-markdown-content blockquote:not(:where(.not-content *)) footer {
168
- color: var(--nu-purple-30);
169
- }
170
-
171
66
  .sl-markdown-content figure:not(:where(.not-content *)) {
172
67
  margin: 2rem 0;
173
68
  }
@@ -340,57 +235,6 @@
340
235
  background-color: rgb(239 85 63 / 8%) !important;
341
236
  }
342
237
 
343
- .sl-markdown-content table:not(:where(.not-content *)) {
344
- display: table;
345
- width: 100%;
346
- text-indent: 0;
347
- border-collapse: collapse;
348
- border-color: var(--nu-border-color);
349
- }
350
-
351
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th {
352
- padding: 0.5rem 1rem;
353
- font-family: var(--nu-font-heading);
354
- font-weight: 600;
355
- color: var(--nu-black-80);
356
- text-align: left;
357
- background-color: var(--nu-purple-surface);
358
- border: 1px solid var(--nu-border-color);
359
- }
360
-
361
- :root:not([data-theme="light"]) .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th {
362
- color: var(--nu-color-text);
363
- background-color: rgb(78 42 132 / 14%);
364
- }
365
-
366
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td {
367
- padding: 0.5rem 1rem;
368
- text-align: left;
369
- border: 1px solid var(--nu-border-color);
370
- }
371
-
372
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th[align="right"],
373
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td[align="right"] {
374
- text-align: right;
375
- }
376
-
377
- .sl-markdown-content table:not(:where(.not-content *)) > thead > tr > th[align="center"],
378
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr > td[align="center"] {
379
- text-align: center;
380
- }
381
-
382
- .sl-markdown-content table:not(:where(.not-content *)) > tbody > tr:nth-child(even) {
383
- background-color: #f3f4f6;
384
- }
385
-
386
- :root:not([data-theme="light"])
387
- .sl-markdown-content
388
- table:not(:where(.not-content *))
389
- > tbody
390
- > tr:nth-child(even) {
391
- background-color: #1e1e1e;
392
- }
393
-
394
238
  .sl-link-button {
395
239
  transition:
396
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;
@@ -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
  }
@@ -171,13 +168,27 @@
171
168
 
172
169
  .nu-mermaid-overlay-controls .nu-mermaid-close {
173
170
  color: #fff;
174
- background: rgb(255 255 255 / 20%);
175
- border-color: rgb(255 255 255 / 30%);
171
+ background: rgb(255 255 255 / 15%);
172
+ border-color: rgb(255 255 255 / 25%);
176
173
  }
177
174
 
178
175
  .nu-mermaid-overlay-controls .nu-mermaid-close:hover {
179
- background: rgb(255 255 255 / 35%);
180
- 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
+ }
181
192
  }
182
193
 
183
194
  .nu-mermaid-viewport {
@@ -188,6 +199,12 @@
188
199
  overflow: hidden;
189
200
  touch-action: none;
190
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);
191
208
  }
192
209
 
193
210
  .nu-mermaid-viewport:active {
@@ -216,7 +233,6 @@
216
233
  color: rgb(255 255 255 / 70%);
217
234
  pointer-events: none;
218
235
  background: rgb(0 0 0 / 35%);
219
- border-radius: 0.25rem;
220
236
 
221
237
  /* stylelint-disable-next-line property-no-vendor-prefix -- Safari requires prefix */
222
238
  -webkit-backdrop-filter: blur(6px);
@@ -227,4 +243,37 @@
227
243
  color: rgb(0 0 0 / 55%);
228
244
  background: rgb(255 255 255 / 50%);
229
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
+ }
230
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,18 +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
 
41
43
  starlight-menu-button button:focus-visible,
42
- northwestern-theme-toggle button:focus-visible,
43
44
  .header northwestern-theme-toggle button:focus-visible {
44
45
  outline: none !important;
45
46
  box-shadow: 0 0 0 2px rgb(255 255 255 / 60%) !important;
46
47
  }
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
+
48
90
  @media (width < 50rem) {
49
91
  site-search button {
50
92
  color: var(--nu-topbar-text) !important;
@@ -109,27 +151,29 @@
109
151
  border-color: var(--nu-black-20) !important;
110
152
  }
111
153
 
112
- /* Starlight owns these borders; force them onto the shared theme token. */
113
154
  .header,
114
155
  .sidebar-pane {
115
156
  border-color: var(--nu-border-color) !important;
116
157
  }
117
158
 
159
+ nav.sidebar a {
160
+ border-left: 3px solid transparent;
161
+ }
162
+
118
163
  nav.sidebar a:hover {
119
164
  background-color: var(--nu-purple-surface) !important;
120
165
  }
121
166
 
122
167
  nav.sidebar a[aria-current="page"] {
123
- padding-left: 0.8rem;
124
168
  font-weight: 700;
125
169
  color: var(--nu-color-link) !important;
126
170
  background-color: var(--nu-purple-surface) !important;
127
- border-left: 3px solid var(--nu-color-link);
171
+ border-left-color: var(--nu-color-link);
128
172
  }
129
173
 
130
174
  nav.sidebar a[aria-current="true"] {
131
175
  font-weight: 600;
132
- border-left: 3px solid var(--nu-color-link);
176
+ border-left-color: var(--nu-color-link);
133
177
  }
134
178
 
135
179
  :root:not([data-theme="light"]) nav.sidebar a:hover {
@@ -146,7 +190,6 @@
146
190
  border-left: 3px solid transparent;
147
191
  transition:
148
192
  border-color var(--nu-transition-fast),
149
- padding-left var(--nu-transition-fast),
150
193
  font-weight var(--nu-transition-fast);
151
194
  }
152
195
 
@@ -155,7 +198,6 @@
155
198
  }
156
199
 
157
200
  .right-sidebar-panel a[aria-current="true"] {
158
- padding-left: 0.8rem;
159
201
  font-weight: 600;
160
202
  border-left-color: var(--sl-color-accent);
161
203
  }
@@ -213,4 +255,11 @@
213
255
  .sidebar-content a[href="/changelog/"]:hover span {
214
256
  opacity: 1;
215
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
+ }
216
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 {};