@nu-appdev/northwestern-starlight-theme 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.
@@ -0,0 +1,163 @@
1
+ /* ==========================================================================
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
+ ========================================================================== */
7
+
8
+ @layer northwestern {
9
+ .nu-mermaid-toolbar {
10
+ position: absolute;
11
+ top: 0.5rem;
12
+ right: 0.5rem;
13
+ z-index: 2;
14
+ display: flex;
15
+ gap: 0.25rem;
16
+ align-items: center;
17
+ opacity: 0;
18
+ transition: opacity var(--nu-transition-fast);
19
+ }
20
+
21
+ .mermaid:hover .nu-mermaid-toolbar,
22
+ .mermaid:focus-within .nu-mermaid-toolbar {
23
+ opacity: 1;
24
+ }
25
+
26
+ .nu-mermaid-btn {
27
+ box-sizing: border-box;
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ width: 2rem;
32
+ height: 2rem;
33
+ padding: 0;
34
+ margin: 0 !important;
35
+ font: inherit;
36
+ line-height: 1;
37
+ color: var(--nu-color-text-muted);
38
+ cursor: pointer;
39
+ background: var(--nu-card-bg);
40
+ border: 1px solid var(--nu-border-color);
41
+ transition:
42
+ color var(--nu-transition-fast),
43
+ background var(--nu-transition-fast);
44
+ }
45
+
46
+ .nu-mermaid-btn svg {
47
+ display: block;
48
+ flex-shrink: 0;
49
+ width: 14px;
50
+ height: 14px;
51
+ pointer-events: none;
52
+ }
53
+
54
+ .nu-mermaid-btn:hover {
55
+ color: var(--nu-color-text);
56
+ background: #ebedf0;
57
+ }
58
+
59
+ :root:not([data-theme="light"]) .nu-mermaid-btn:hover {
60
+ background: #3a3a3a;
61
+ }
62
+
63
+ .nu-mermaid-btn.nu-mermaid-success {
64
+ color: var(--nu-color-success) !important;
65
+ background: #e6f5ee !important;
66
+ border-color: var(--nu-color-success) !important;
67
+ }
68
+
69
+ :root:not([data-theme="light"]) .nu-mermaid-btn.nu-mermaid-success {
70
+ background: #0d3d2a !important;
71
+ }
72
+
73
+ .nu-mermaid-overlay-controls .nu-mermaid-btn.nu-mermaid-success {
74
+ color: #fff !important;
75
+ background: var(--nu-color-success) !important;
76
+ }
77
+
78
+ .nu-mermaid-overlay {
79
+ position: fixed;
80
+ inset: 0;
81
+ z-index: 9999;
82
+ display: flex;
83
+ flex-direction: column;
84
+ background: #f3f5f7;
85
+ transition: opacity 150ms ease;
86
+ }
87
+
88
+ :root:not([data-theme="light"]) .nu-mermaid-overlay {
89
+ background: #1c1c1f;
90
+ }
91
+
92
+ .nu-mermaid-overlay-controls {
93
+ display: flex;
94
+ gap: 0.25rem;
95
+ align-items: center;
96
+ height: var(--sl-nav-height);
97
+ padding: 0 1.5rem;
98
+ background: var(--nu-topbar-bg);
99
+ }
100
+
101
+ .nu-mermaid-overlay-controls .nu-mermaid-btn {
102
+ width: 1.75rem;
103
+ height: 1.75rem;
104
+ color: var(--nu-color-text-muted);
105
+ background: var(--nu-card-bg);
106
+ border: 1px solid var(--nu-border-color);
107
+ }
108
+
109
+ .nu-mermaid-overlay-controls .nu-mermaid-btn:hover {
110
+ color: var(--nu-color-text);
111
+ background: #ebedf0;
112
+ }
113
+
114
+ :root:not([data-theme="light"]) .nu-mermaid-overlay-controls .nu-mermaid-btn:hover {
115
+ background: #3a3a3a;
116
+ }
117
+
118
+ .nu-mermaid-separator {
119
+ width: 1px;
120
+ height: 1.25rem;
121
+ margin: 0 0.375rem !important;
122
+ background: rgb(255 255 255 / 30%);
123
+ }
124
+
125
+ .nu-mermaid-spacer {
126
+ flex: 1;
127
+ }
128
+
129
+ .nu-mermaid-overlay-controls .nu-mermaid-close {
130
+ color: #fff;
131
+ background: var(--nu-color-danger);
132
+ border-color: var(--nu-color-danger);
133
+ }
134
+
135
+ .nu-mermaid-overlay-controls .nu-mermaid-close:hover {
136
+ background: var(--nu-dark-orange);
137
+ border-color: var(--nu-dark-orange);
138
+ }
139
+
140
+ .nu-mermaid-viewport {
141
+ display: flex;
142
+ flex: 1;
143
+ align-items: center;
144
+ justify-content: center;
145
+ overflow: hidden;
146
+ cursor: grab;
147
+ }
148
+
149
+ .nu-mermaid-viewport:active {
150
+ cursor: grabbing;
151
+ }
152
+
153
+ .nu-mermaid-viewport svg {
154
+ transition: transform 0.1s ease;
155
+ }
156
+
157
+ .nu-mermaid-fullscreen {
158
+ display: inline-block;
159
+ padding: 0 !important;
160
+ background: transparent !important;
161
+ border: none !important;
162
+ }
163
+ }
@@ -0,0 +1,201 @@
1
+ /* ==========================================================================
2
+ Navigation — Header, Sidebar, Breadcrumbs
3
+
4
+ Encapsulates top navigation, sidebar navigation, search trigger alignment,
5
+ and active/hover states tied to Starlight navigation UI.
6
+ ========================================================================== */
7
+
8
+ @layer northwestern {
9
+ .site-title,
10
+ .header a,
11
+ .social-icons a,
12
+ starlight-theme-select,
13
+ starlight-theme-select label,
14
+ starlight-theme-select select,
15
+ starlight-theme-select svg,
16
+ northwestern-theme-toggle,
17
+ northwestern-theme-toggle button,
18
+ northwestern-theme-toggle svg,
19
+ starlight-menu-button,
20
+ starlight-menu-button button {
21
+ color: var(--nu-topbar-text) !important;
22
+ fill: var(--nu-topbar-text) !important;
23
+ }
24
+
25
+ starlight-menu-button button,
26
+ northwestern-theme-toggle button,
27
+ .header northwestern-theme-toggle button {
28
+ background: rgb(255 255 255 / 15%) !important;
29
+ border: 1px solid rgb(255 255 255 / 25%) !important;
30
+ border-color: rgb(255 255 255 / 25%) !important;
31
+ box-shadow: none !important;
32
+ }
33
+
34
+ starlight-menu-button button:hover,
35
+ northwestern-theme-toggle button:hover,
36
+ .header northwestern-theme-toggle button:hover {
37
+ background: rgb(255 255 255 / 25%) !important;
38
+ }
39
+
40
+ @media (width < 50rem) {
41
+ site-search button {
42
+ color: var(--nu-topbar-text) !important;
43
+ }
44
+
45
+ site-search button svg {
46
+ fill: var(--nu-topbar-text) !important;
47
+ }
48
+
49
+ :root[data-theme="light"] button[data-close-modal] {
50
+ color: var(--nu-black-80) !important;
51
+ }
52
+ }
53
+
54
+ site-search button[data-open-modal] {
55
+ align-items: center;
56
+ padding-top: 0 !important;
57
+ padding-bottom: 0 !important;
58
+ line-height: 1 !important;
59
+ }
60
+
61
+ site-search button[data-open-modal] > svg {
62
+ flex-shrink: 0;
63
+ align-self: center;
64
+ }
65
+
66
+ @media (width >= 50rem) {
67
+ site-search button[data-open-modal] > span {
68
+ position: relative;
69
+ top: 1px;
70
+ }
71
+
72
+ site-search button[data-open-modal] > kbd {
73
+ padding-top: 0.25rem;
74
+ padding-bottom: 0.25rem;
75
+ }
76
+ }
77
+
78
+ mobile-starlight-toc .display-current {
79
+ color: var(--nu-topbar-text) !important;
80
+ }
81
+
82
+ mobile-starlight-toc .toggle {
83
+ border-color: var(--nu-border-color) !important;
84
+ transition:
85
+ border-color var(--nu-transition-fast),
86
+ background-color var(--nu-transition-fast);
87
+ }
88
+
89
+ mobile-starlight-toc .toggle:hover {
90
+ border-color: var(--nu-black-50) !important;
91
+ }
92
+
93
+ :root:not([data-theme="light"]) mobile-starlight-toc .toggle:hover {
94
+ border-color: var(--nu-black-20) !important;
95
+ }
96
+
97
+ /* Starlight owns these borders; force them onto the shared theme token. */
98
+ .header,
99
+ .sidebar-pane {
100
+ border-color: var(--nu-border-color) !important;
101
+ }
102
+
103
+ nav.sidebar a:hover {
104
+ background-color: var(--nu-purple-surface) !important;
105
+ }
106
+
107
+ nav.sidebar a[aria-current="page"] {
108
+ padding-left: 0.8rem;
109
+ font-weight: 700;
110
+ color: var(--nu-color-link) !important;
111
+ background-color: var(--nu-purple-surface) !important;
112
+ border-left: 3px solid var(--nu-color-link);
113
+ }
114
+
115
+ nav.sidebar a[aria-current="true"] {
116
+ font-weight: 600;
117
+ border-left: 3px solid var(--nu-color-link);
118
+ }
119
+
120
+ :root:not([data-theme="light"]) nav.sidebar a:hover {
121
+ background-color: var(--nu-hover-bg) !important;
122
+ }
123
+
124
+ :root:not([data-theme="light"]) nav.sidebar a[aria-current="page"] {
125
+ color: var(--nu-purple-30) !important;
126
+ background-color: var(--nu-purple-tint-strong) !important;
127
+ border-left-color: var(--nu-purple-30);
128
+ }
129
+
130
+ .right-sidebar-panel a {
131
+ border-left: 3px solid transparent;
132
+ transition:
133
+ border-color var(--nu-transition-fast),
134
+ padding-left var(--nu-transition-fast),
135
+ font-weight var(--nu-transition-fast);
136
+ }
137
+
138
+ .right-sidebar-panel a[aria-current="true"]::after {
139
+ display: none !important;
140
+ }
141
+
142
+ .right-sidebar-panel a[aria-current="true"] {
143
+ padding-left: 0.8rem;
144
+ font-weight: 600;
145
+ border-left-color: var(--sl-color-accent);
146
+ }
147
+
148
+ mobile-starlight-toc .dropdown a {
149
+ border-left: 3px solid transparent;
150
+ transition:
151
+ border-color var(--nu-transition-fast),
152
+ padding-left var(--nu-transition-fast),
153
+ background-color var(--nu-transition-fast);
154
+ }
155
+
156
+ mobile-starlight-toc .dropdown a[aria-current="true"]::after {
157
+ display: none !important;
158
+ }
159
+
160
+ mobile-starlight-toc .dropdown a[aria-current="true"] {
161
+ padding-left: 0.8rem;
162
+ font-weight: 600;
163
+ color: var(--nu-color-link) !important;
164
+ background-color: var(--nu-purple-surface) !important;
165
+ border-left-color: var(--nu-color-link);
166
+ }
167
+
168
+ :root:not([data-theme="light"]) mobile-starlight-toc .dropdown a[aria-current="true"] {
169
+ color: var(--nu-purple-30) !important;
170
+ background-color: var(--nu-purple-tint-strong) !important;
171
+ border-left-color: var(--nu-purple-30);
172
+ }
173
+
174
+ starlight-changelogs-versions-list {
175
+ display: none;
176
+ }
177
+
178
+ .not-content:has(starlight-changelogs-versions-list):not(:has(.links)) + h2 {
179
+ margin-top: 0;
180
+ }
181
+
182
+ .not-content:has(starlight-changelogs-versions-list) .links {
183
+ margin-block-start: 0 !important;
184
+ }
185
+
186
+ .sidebar-content a[href^="/changelog/version/"] span {
187
+ font-family: var(--sl-font-system-mono);
188
+ font-size: var(--sl-text-xs);
189
+ letter-spacing: -0.02em;
190
+ }
191
+
192
+ .sidebar-content a[href="/changelog/"] span {
193
+ font-size: var(--sl-text-xs);
194
+ letter-spacing: 0.05em;
195
+ opacity: 0.7;
196
+ }
197
+
198
+ .sidebar-content a[href="/changelog/"]:hover span {
199
+ opacity: 1;
200
+ }
201
+ }
@@ -0,0 +1,119 @@
1
+ /* ==========================================================================
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
+ ========================================================================== */
7
+
8
+ /* stylelint-disable selector-class-pattern */
9
+
10
+ @layer northwestern {
11
+ .sl-badge.sl-openapi-method-get {
12
+ color: #fff !important;
13
+ background-color: hsl(204deg 90% 40%) !important;
14
+ border-color: hsl(204deg 90% 60%) !important;
15
+ }
16
+
17
+ .sl-badge.sl-openapi-method-post {
18
+ color: #fff !important;
19
+ background-color: hsl(104deg 90% 21%) !important;
20
+ border-color: hsl(104deg 90% 46%) !important;
21
+ }
22
+
23
+ .sl-badge.sl-openapi-method-put,
24
+ .sl-badge.sl-openapi-method-patch {
25
+ color: #fff !important;
26
+ background-color: hsl(34deg 90% 40%) !important;
27
+ border-color: hsl(34deg 90% 60%) !important;
28
+ }
29
+
30
+ .sl-badge.sl-openapi-method-delete {
31
+ color: #fff !important;
32
+ background-color: hsl(339deg 90% 35%) !important;
33
+ border-color: hsl(339deg 90% 60%) !important;
34
+ }
35
+
36
+ .sl-markdown-content .method-path {
37
+ gap: 0.75rem;
38
+ align-items: center;
39
+ padding: 0.75rem 1rem;
40
+ font-family: var(--sl-font-system-mono, monospace);
41
+ background: var(--nu-card-bg);
42
+ border: 1px solid var(--nu-border-color);
43
+ }
44
+
45
+ .sl-markdown-content .method-path .method {
46
+ padding: 0.25rem 0.625rem;
47
+ font-family: var(--sl-font-system-mono, monospace);
48
+ font-size: 0.75rem;
49
+ font-weight: 700;
50
+ text-transform: uppercase;
51
+ letter-spacing: 0.04em;
52
+ }
53
+
54
+ .sl-markdown-content .method-path .path {
55
+ font-size: 0.875rem;
56
+ font-weight: 500;
57
+ }
58
+
59
+ .sl-markdown-content .panel {
60
+ background: var(--nu-card-bg);
61
+ border: 1px solid var(--nu-border-color);
62
+ }
63
+
64
+ .sl-markdown-content .key.not-content {
65
+ padding: 0.75rem 1rem;
66
+ border-bottom: 1px solid var(--nu-border-color);
67
+ }
68
+
69
+ .sl-markdown-content .key.not-content:last-child {
70
+ border-bottom: none;
71
+ }
72
+
73
+ .sl-markdown-content .key .name {
74
+ font-family: var(--sl-font-system-mono, monospace);
75
+ font-weight: 600;
76
+ }
77
+
78
+ .sl-markdown-content .type {
79
+ font-family: var(--sl-font-system-mono, monospace);
80
+ font-size: 0.8125rem;
81
+ font-weight: 600;
82
+ color: var(--nu-purple-100);
83
+ }
84
+
85
+ :root:not([data-theme="light"]) .sl-markdown-content .type {
86
+ color: var(--nu-purple-40);
87
+ }
88
+
89
+ .sl-markdown-content .required {
90
+ font-family: var(--sl-font-system-mono, monospace);
91
+ font-size: 0.6875rem;
92
+ font-weight: 600;
93
+ text-transform: uppercase;
94
+ letter-spacing: 0.04em;
95
+ }
96
+
97
+ .sl-markdown-content .panel select {
98
+ padding: 0.375rem 0.75rem;
99
+ font-family: var(--sl-font-system-mono, monospace);
100
+ font-size: 0.8125rem;
101
+ color: var(--nu-color-text);
102
+ background: var(--nu-card-bg);
103
+ border: 1px solid var(--nu-border-color);
104
+ }
105
+
106
+ .sl-markdown-content .panel details summary {
107
+ font-family: var(--sl-font-system-mono, monospace);
108
+ font-size: 0.8125rem;
109
+ cursor: pointer;
110
+ }
111
+
112
+ .sl-markdown-content .panel details summary:hover {
113
+ color: var(--nu-purple-100);
114
+ }
115
+
116
+ :root:not([data-theme="light"]) .sl-markdown-content .panel details summary:hover {
117
+ color: var(--nu-purple-40);
118
+ }
119
+ }
@@ -0,0 +1,114 @@
1
+ /* ==========================================================================
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
+ ========================================================================== */
7
+
8
+ /* Unlayered — paints immediately to prevent white flash on load */
9
+ html {
10
+ scrollbar-gutter: stable;
11
+ background-color: #18181b;
12
+ }
13
+
14
+ html[data-theme="light"] {
15
+ background-color: #f8fafc;
16
+ }
17
+
18
+ @layer northwestern {
19
+ :root,
20
+ ::backdrop {
21
+ --sl-color-accent-low: rgb(78 42 132 / 20%);
22
+ --sl-color-accent: var(--nu-purple-40);
23
+ --sl-color-accent-high: var(--nu-purple-30);
24
+
25
+ --sl-color-black: var(--nu-body-bg);
26
+ --sl-color-bg: var(--nu-body-bg);
27
+ --sl-color-bg-nav: var(--nu-topbar-bg);
28
+ --sl-color-bg-sidebar: var(--nu-sidebar-bg);
29
+ --sl-color-bg-inline-code: rgb(255 255 255 / 10%);
30
+
31
+ --sl-color-white: var(--nu-color-text);
32
+ --sl-color-text: var(--nu-color-text-muted);
33
+ --sl-color-text-accent: var(--nu-purple-30);
34
+
35
+ --sl-color-gray-1: #e5e5e5;
36
+ --sl-color-gray-2: #a1a1aa;
37
+ --sl-color-gray-3: #9a9aa3;
38
+ --sl-color-gray-4: #52525b;
39
+ --sl-color-gray-5: #404040;
40
+ --sl-color-gray-6: #292929;
41
+ --sl-color-gray-7: #333;
42
+
43
+ --sl-color-hairline-light: var(--nu-border-color);
44
+ --sl-color-hairline: var(--nu-border-color);
45
+ --sl-color-hairline-shade: #18181b;
46
+
47
+ --sl-color-green-low: rgb(0 134 86 / 20%);
48
+ --sl-color-green: var(--nu-green);
49
+ --sl-color-green-high: #6ee7b7;
50
+ --sl-color-orange-low: rgb(255 197 32 / 20%);
51
+ --sl-color-orange: var(--nu-gold);
52
+ --sl-color-orange-high: #fde68a;
53
+ --sl-color-red-low: rgb(239 85 63 / 20%);
54
+ --sl-color-red: var(--nu-orange);
55
+ --sl-color-red-high: #fca5a5;
56
+ --sl-color-blue-low: rgb(80 145 205 / 20%);
57
+ --sl-color-blue: var(--nu-blue);
58
+ --sl-color-blue-high: #93c5fd;
59
+ --sl-color-purple-low: rgb(78 42 132 / 20%);
60
+ --sl-color-purple: var(--nu-purple-60);
61
+ --sl-color-purple-high: var(--nu-purple-30);
62
+ }
63
+
64
+ :root[data-theme="light"],
65
+ [data-theme="light"] ::backdrop {
66
+ --sl-color-accent-low: rgb(78 42 132 / 10%);
67
+ --sl-color-accent: var(--nu-purple-100);
68
+ --sl-color-accent-high: var(--nu-purple-120);
69
+
70
+ --sl-color-black: var(--nu-body-bg);
71
+ --sl-color-bg: var(--nu-body-bg);
72
+ --sl-color-bg-nav: var(--nu-topbar-bg);
73
+ --sl-color-bg-sidebar: var(--nu-sidebar-bg);
74
+ --sl-color-bg-inline-code: #eef0f3;
75
+
76
+ --sl-color-white: var(--nu-color-text);
77
+ --sl-color-text: var(--nu-color-text);
78
+ --sl-color-text-accent: var(--nu-purple-100);
79
+
80
+ --sl-color-gray-1: var(--nu-black-80);
81
+ --sl-color-gray-2: var(--nu-black-50);
82
+ --sl-color-gray-3: #6b7280;
83
+ --sl-color-gray-4: #d1d5db;
84
+ --sl-color-gray-5: #d1d5db;
85
+ --sl-color-gray-6: #ebedf0;
86
+ --sl-color-gray-7: #fff;
87
+
88
+ --sl-color-hairline-light: var(--nu-border-color);
89
+ --sl-color-hairline: var(--nu-border-color);
90
+ --sl-color-hairline-shade: #e5e7eb;
91
+
92
+ --sl-color-green-high: #065f46;
93
+ --sl-color-green: var(--nu-dark-green);
94
+ --sl-color-green-low: rgb(0 134 86 / 10%);
95
+ --sl-color-orange-high: #92400e;
96
+ --sl-color-orange: var(--nu-dark-gold);
97
+ --sl-color-orange-low: rgb(255 197 32 / 12%);
98
+ --sl-color-red-high: #991b1b;
99
+ --sl-color-red: var(--nu-dark-orange);
100
+ --sl-color-red-low: rgb(239 85 63 / 10%);
101
+ --sl-color-blue-high: #1e40af;
102
+ --sl-color-blue: var(--nu-blue);
103
+ --sl-color-blue-low: rgb(80 145 205 / 10%);
104
+ --sl-color-purple-high: var(--nu-purple-130);
105
+ --sl-color-purple: var(--nu-purple-100);
106
+ --sl-color-purple-low: var(--nu-purple-surface);
107
+ }
108
+
109
+ *,
110
+ *::before,
111
+ *::after {
112
+ border-radius: 0 !important;
113
+ }
114
+ }