starlight-theme-celestia 0.2.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 (68) hide show
  1. package/lib/aside.css +13 -0
  2. package/lib/badge.css +23 -0
  3. package/lib/card.css +42 -0
  4. package/lib/fonts.css +4 -0
  5. package/lib/layer.css +31 -0
  6. package/lib/markdown.css +71 -0
  7. package/lib/shiki.css +79 -0
  8. package/lib/styles.css +6 -0
  9. package/lib/tailwind.build.css +2 -0
  10. package/lib/tailwind.css +29 -0
  11. package/lib/tailwind.gen.css +1197 -0
  12. package/lib/theme.css +94 -0
  13. package/package.json +56 -0
  14. package/src/astro.d.ts +6 -0
  15. package/src/components/Code.astro +12 -0
  16. package/src/components/CodeCopy.astro +39 -0
  17. package/src/components/CodeFile.astro +64 -0
  18. package/src/components/CodePackageManagers.astro +55 -0
  19. package/src/components/CodeTabItem.astro +13 -0
  20. package/src/components/CodeTabs.astro +67 -0
  21. package/src/components/Head.astro +7 -0
  22. package/src/components/Header.astro +91 -0
  23. package/src/components/Hero.astro +169 -0
  24. package/src/components/LanguageSelect.astro +5 -0
  25. package/src/components/LinkButton.astro +47 -0
  26. package/src/components/LinkButtonIcon.astro +22 -0
  27. package/src/components/LinkCard.astro +32 -0
  28. package/src/components/MarkdownContent.astro +22 -0
  29. package/src/components/MobileMenuFooter.astro +11 -0
  30. package/src/components/MobileMenuToggle.astro +23 -0
  31. package/src/components/MobileTableOfContents.astro +26 -0
  32. package/src/components/PageFrame.astro +50 -0
  33. package/src/components/Pagination.astro +34 -0
  34. package/src/components/PaginationLink.astro +30 -0
  35. package/src/components/Search.astro +645 -0
  36. package/src/components/SiteTitle.astro +47 -0
  37. package/src/components/SiteTitleVersioned.astro +62 -0
  38. package/src/components/SocialIcons.astro +31 -0
  39. package/src/components/ThemeProvider.astro +102 -0
  40. package/src/components/ThemeSelect.astro +188 -0
  41. package/src/components/TwoColumnContent.astro +44 -0
  42. package/src/components/VersionSelect.astro +261 -0
  43. package/src/components/get-i18n-text.ts +39 -0
  44. package/src/components/index.ts +7 -0
  45. package/src/components/mobile-menu-toggle.ts +49 -0
  46. package/src/components/rehype-code-tabs.ts +52 -0
  47. package/src/constants.ts +7 -0
  48. package/src/content.config.ts +16 -0
  49. package/src/content.d.ts +22 -0
  50. package/src/icons/lucide-arrow-left.svg +1 -0
  51. package/src/icons/lucide-arrow-right.svg +1 -0
  52. package/src/icons/lucide-check.svg +1 -0
  53. package/src/icons/lucide-chevron-left.svg +1 -0
  54. package/src/icons/lucide-chevron-right.svg +1 -0
  55. package/src/icons/lucide-clipboard.svg +1 -0
  56. package/src/icons/lucide-menu.svg +1 -0
  57. package/src/icons/lucide-search.svg +1 -0
  58. package/src/icons/lucide-x.svg +1 -0
  59. package/src/icons/tabler-moon-filled.svg +1 -0
  60. package/src/icons/tabler-sun-high-filled.svg +1 -0
  61. package/src/index.ts +112 -0
  62. package/src/shiki-config.ts +49 -0
  63. package/src/shiki-meta-title.ts +6 -0
  64. package/src/shiki-transformer-container.ts +85 -0
  65. package/src/types.d.ts +2 -0
  66. package/src/user-options.ts +37 -0
  67. package/src/virtual-internal.d.ts +44 -0
  68. package/src/virtual-user-config.ts +44 -0
@@ -0,0 +1,645 @@
1
+ ---
2
+ import project from 'virtual:starlight/project-context'
3
+ import SearchIcon from '../icons/lucide-search.svg'
4
+
5
+ const pagefindTranslations = {
6
+ placeholder: Astro.locals.t('search.label'),
7
+ ...Object.fromEntries(
8
+ Object.entries(Astro.locals.t.all())
9
+ .filter(([key]) => key.startsWith('pagefind.'))
10
+ .map(([key, value]) => [key.replace('pagefind.', ''), value]),
11
+ ),
12
+ }
13
+
14
+ const dataAttributes: DOMStringMap = {
15
+ 'data-translations': JSON.stringify(pagefindTranslations),
16
+ }
17
+ if (project.trailingSlash === 'never')
18
+ dataAttributes['data-strip-trailing-slash'] = ''
19
+ ---
20
+
21
+ <site-search class={Astro.props.class} {...dataAttributes}>
22
+ <button
23
+ class="flex size-8 rounded-md p-2 text-(--sl-color-text) transition hover:bg-gray-400/30 focus-visible:outline-offset-1 active:scale-90 md:h-9 md:w-full md:max-w-88 md:rounded-md md:border md:border-solid md:border-(--sl-color-gray-5) md:p-2 md:text-(--sl-color-text) md:transition-colors md:hover:bg-gray-400/10"
24
+ data-open-modal
25
+ disabled
26
+ aria-label={Astro.locals.t('search.label')}
27
+ aria-keyshortcuts="Control+K"
28
+ >
29
+ <SearchIcon class="size-4" />
30
+ <span class="sl-hidden md:sl-block" aria-hidden="true"
31
+ >{Astro.locals.t('search.label')}</span
32
+ >
33
+ <kbd class="sl-hidden md:sl-flex" style="display: none;">
34
+ <kbd>{Astro.locals.t('search.ctrlKey')}</kbd><kbd>K</kbd>
35
+ </kbd>
36
+ </button>
37
+
38
+ <dialog style="padding:0" aria-label={Astro.locals.t('search.label')}>
39
+ <div class="dialog-frame sl-flex">
40
+ {
41
+ /* TODO: Make the layout of this button flexible to accommodate different word lengths. Currently hard-coded for English: “Cancel” */
42
+ }
43
+ <button data-close-modal class="sl-flex md:sl-hidden">
44
+ {Astro.locals.t('search.cancelLabel')}
45
+ </button>
46
+ {
47
+ import.meta.env.DEV ? (
48
+ <div
49
+ style="margin: auto; text-align: center; white-space: pre-line;"
50
+ dir="ltr"
51
+ >
52
+ <p>{Astro.locals.t('search.devWarning')}</p>
53
+ </div>
54
+ ) : (
55
+ <div class="search-container">
56
+ <div id="starlight__search" />
57
+ </div>
58
+ )
59
+ }
60
+ </div>
61
+ </dialog>
62
+ </site-search>
63
+
64
+ {
65
+ /**
66
+ * This is intentionally inlined to avoid briefly showing an invalid shortcut.
67
+ * Purposely using the deprecated `navigator.platform` property to detect Apple devices, as the
68
+ * user agent is spoofed by some browsers when opening the devtools.
69
+ */
70
+ }
71
+ <script is:inline>
72
+ ;(() => {
73
+ const openBtn = document.querySelector('button[data-open-modal]')
74
+ const shortcut = openBtn?.querySelector('kbd')
75
+ if (!openBtn || !(shortcut instanceof HTMLElement)) return
76
+ const platformKey = shortcut.querySelector('kbd')
77
+ if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
78
+ platformKey.textContent = '⌘'
79
+ openBtn.setAttribute('aria-keyshortcuts', 'Meta+K')
80
+ }
81
+ shortcut.style.display = ''
82
+ })()
83
+ </script>
84
+
85
+ <script>
86
+ import { pagefindUserConfig } from 'virtual:starlight/pagefind-config'
87
+
88
+ class SiteSearch extends HTMLElement {
89
+ constructor() {
90
+ super()
91
+ const openBtn = this.querySelector<HTMLButtonElement>(
92
+ 'button[data-open-modal]',
93
+ )!
94
+ const closeBtn = this.querySelector<HTMLButtonElement>(
95
+ 'button[data-close-modal]',
96
+ )!
97
+ const dialog = this.querySelector('dialog')!
98
+ const dialogFrame = this.querySelector('.dialog-frame')!
99
+
100
+ /** Close the modal if a user clicks on a link or outside of the modal. */
101
+ const onClick = (event: MouseEvent) => {
102
+ const isLink = 'href' in (event.target || {})
103
+ if (
104
+ isLink ||
105
+ (document.body.contains(event.target as Node) &&
106
+ !dialogFrame.contains(event.target as Node))
107
+ ) {
108
+ closeModal()
109
+ }
110
+ }
111
+
112
+ const openModal = (event?: MouseEvent) => {
113
+ dialog.showModal()
114
+ document.body.toggleAttribute('data-search-modal-open', true)
115
+ this.querySelector('input')?.focus()
116
+ event?.stopPropagation()
117
+ window.addEventListener('click', onClick)
118
+ }
119
+
120
+ const closeModal = () => dialog.close()
121
+
122
+ openBtn.addEventListener('click', openModal)
123
+ openBtn.disabled = false
124
+ closeBtn.addEventListener('click', closeModal)
125
+
126
+ dialog.addEventListener('close', () => {
127
+ document.body.toggleAttribute('data-search-modal-open', false)
128
+ window.removeEventListener('click', onClick)
129
+ })
130
+
131
+ // Listen for `ctrl + k` and `cmd + k` keyboard shortcuts.
132
+ window.addEventListener('keydown', (e) => {
133
+ if ((e.metaKey === true || e.ctrlKey === true) && e.key === 'k') {
134
+ dialog.open ? closeModal() : openModal()
135
+ e.preventDefault()
136
+ }
137
+ })
138
+
139
+ let translations = {}
140
+ try {
141
+ translations = JSON.parse(this.dataset.translations || '{}')
142
+ } catch {}
143
+
144
+ const shouldStrip = this.dataset.stripTrailingSlash !== undefined
145
+ const stripTrailingSlash = (path: string) =>
146
+ path.replace(/(.)\/(#.*)?$/, '$1$2')
147
+ const formatURL = shouldStrip
148
+ ? stripTrailingSlash
149
+ : (path: string) => path
150
+
151
+ window.addEventListener('DOMContentLoaded', () => {
152
+ if (import.meta.env.DEV) return
153
+ const onIdle = window.requestIdleCallback || ((cb) => setTimeout(cb, 1))
154
+ onIdle(async () => {
155
+ // @ts-expect-error — Missing types for @pagefind/default-ui package.
156
+ const { PagefindUI } = await import('@pagefind/default-ui')
157
+ new PagefindUI({
158
+ ...pagefindUserConfig,
159
+ element: '#starlight__search',
160
+ baseUrl: import.meta.env.BASE_URL,
161
+ bundlePath:
162
+ import.meta.env.BASE_URL.replace(/\/$/, '') + '/pagefind/',
163
+ showImages: false,
164
+ translations,
165
+ showSubResults: true,
166
+ processResult: (result: {
167
+ url: string
168
+ sub_results: Array<{ url: string }>
169
+ }) => {
170
+ result.url = formatURL(result.url)
171
+ result.sub_results = result.sub_results.map((sub_result) => {
172
+ sub_result.url = formatURL(sub_result.url)
173
+ return sub_result
174
+ })
175
+ },
176
+ })
177
+ })
178
+ })
179
+ }
180
+ }
181
+ customElements.define('site-search', SiteSearch)
182
+ </script>
183
+
184
+ <style>
185
+ @layer starlight.core {
186
+ site-search {
187
+ display: contents;
188
+ }
189
+ button[data-open-modal] {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 0.5rem;
193
+ border: 0;
194
+ background-color: transparent;
195
+ color: var(--sl-color-gray-1);
196
+ cursor: pointer;
197
+ height: 2.5rem;
198
+ font-size: var(--sl-text-xl);
199
+ }
200
+
201
+ @media (min-width: 50rem) {
202
+ button[data-open-modal] {
203
+ padding-inline-start: 0.75rem;
204
+ padding-inline-end: 0.5rem;
205
+ background-color: var(--sl-color-black);
206
+ color: var(--sl-color-gray-2);
207
+ font-size: var(--sl-text-sm);
208
+ }
209
+
210
+ button[data-open-modal] > :last-child {
211
+ margin-inline-start: auto;
212
+ }
213
+ }
214
+
215
+ button > kbd {
216
+ border-radius: 0.25rem;
217
+ font-size: var(--sl-text-2xs);
218
+ gap: 0.25em;
219
+ padding-inline: 0.375rem;
220
+ background-color: var(--sl-color-gray-6);
221
+ }
222
+
223
+ kbd {
224
+ font-family: var(--__sl-font);
225
+ }
226
+
227
+ dialog {
228
+ margin: 0;
229
+ background-color: var(--sl-color-gray-6);
230
+ border: 1px solid var(--sl-color-gray-5);
231
+ width: 100%;
232
+ max-width: 100%;
233
+ height: 100%;
234
+ max-height: 100%;
235
+ box-shadow: var(--sl-shadow-lg);
236
+ }
237
+ dialog[open] {
238
+ display: flex;
239
+ }
240
+
241
+ dialog::backdrop {
242
+ background-color: var(--sl-color-backdrop-overlay);
243
+ -webkit-backdrop-filter: blur(0.25rem);
244
+ backdrop-filter: blur(0.25rem);
245
+ }
246
+
247
+ .dialog-frame {
248
+ position: relative;
249
+ overflow: auto;
250
+ flex-direction: column;
251
+ flex-grow: 1;
252
+ gap: 1rem;
253
+ padding: 1rem;
254
+ }
255
+
256
+ button[data-close-modal] {
257
+ position: absolute;
258
+ z-index: 1;
259
+ align-items: center;
260
+ align-self: flex-end;
261
+ height: calc(64px * var(--pagefind-ui-scale));
262
+ padding: 0.25rem;
263
+ border: 0;
264
+ background: transparent;
265
+ cursor: pointer;
266
+ color: var(--sl-color-text-accent);
267
+ }
268
+
269
+ #starlight__search {
270
+ --pagefind-ui-primary: var(--sl-color-text);
271
+ --pagefind-ui-text: var(--sl-color-gray-2);
272
+ --pagefind-ui-font: var(--__sl-font);
273
+ --pagefind-ui-background: var(--sl-color-black);
274
+ --pagefind-ui-border: var(--sl-color-gray-5);
275
+ --pagefind-ui-border-width: 1px;
276
+ --pagefind-ui-tag: var(--sl-color-gray-5);
277
+ --sl-search-cancel-space: 5rem;
278
+ }
279
+
280
+ :root[data-theme='light'] #starlight__search {
281
+ --pagefind-ui-tag: var(--sl-color-gray-6);
282
+ }
283
+
284
+ @media (min-width: 50rem) {
285
+ #starlight__search {
286
+ --sl-search-cancel-space: 0px;
287
+ }
288
+
289
+ dialog {
290
+ margin: 4rem auto auto;
291
+ border-radius: 0.5rem;
292
+ width: 90%;
293
+ max-width: 40rem;
294
+ height: max-content;
295
+ min-height: 15rem;
296
+ max-height: calc(100% - 8rem);
297
+ }
298
+
299
+ .dialog-frame {
300
+ padding: 1.5rem;
301
+ }
302
+ }
303
+ }
304
+ </style>
305
+
306
+ <style is:global>
307
+ @import url('@pagefind/default-ui/css/ui.css') layer(starlight.core);
308
+
309
+ @layer starlight.core {
310
+ [data-search-modal-open] {
311
+ overflow: hidden;
312
+ }
313
+
314
+ #starlight__search {
315
+ --sl-search-result-spacing: calc(1.25rem * var(--pagefind-ui-scale));
316
+ --sl-search-result-pad-inline-start: calc(
317
+ 3.75rem * var(--pagefind-ui-scale)
318
+ );
319
+ --sl-search-result-pad-inline-end: calc(
320
+ 1.25rem * var(--pagefind-ui-scale)
321
+ );
322
+ --sl-search-result-pad-block: calc(0.9375rem * var(--pagefind-ui-scale));
323
+ --sl-search-result-nested-pad-block: calc(
324
+ 0.625rem * var(--pagefind-ui-scale)
325
+ );
326
+ --sl-search-corners: calc(0.3125rem * var(--pagefind-ui-scale));
327
+ --sl-search-page-icon-size: calc(1.875rem * var(--pagefind-ui-scale));
328
+ --sl-search-page-icon-inline-start: calc(
329
+ (
330
+ var(--sl-search-result-pad-inline-start) -
331
+ var(--sl-search-page-icon-size)
332
+ ) /
333
+ 2
334
+ );
335
+ --sl-search-tree-diagram-size: calc(2.5rem * var(--pagefind-ui-scale));
336
+ --sl-search-tree-diagram-inline-start: calc(
337
+ (
338
+ var(--sl-search-result-pad-inline-start) -
339
+ var(--sl-search-tree-diagram-size)
340
+ ) /
341
+ 2
342
+ );
343
+ }
344
+
345
+ #starlight__search .pagefind-ui__form::before {
346
+ --pagefind-ui-text: var(--sl-color-gray-1);
347
+ opacity: 1;
348
+ }
349
+
350
+ #starlight__search .pagefind-ui__search-input {
351
+ color: var(--sl-color-white);
352
+ font-weight: 400;
353
+ width: calc(100% - var(--sl-search-cancel-space));
354
+ }
355
+
356
+ #starlight__search input:focus {
357
+ --pagefind-ui-border: var(--sl-color-accent);
358
+ }
359
+
360
+ #starlight__search .pagefind-ui__search-clear {
361
+ inset-inline-end: var(--sl-search-cancel-space);
362
+ width: calc(60px * var(--pagefind-ui-scale));
363
+ padding: 0;
364
+ background-color: transparent;
365
+ overflow: hidden;
366
+ }
367
+ #starlight__search .pagefind-ui__search-clear:focus {
368
+ outline: 1px solid var(--sl-color-accent);
369
+ }
370
+ #starlight__search .pagefind-ui__search-clear::before {
371
+ content: '';
372
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E")
373
+ center / 50% no-repeat;
374
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E")
375
+ center / 50% no-repeat;
376
+ background-color: var(--sl-color-text-accent);
377
+ display: block;
378
+ width: 100%;
379
+ height: 100%;
380
+ }
381
+
382
+ #starlight__search .pagefind-ui__results > * + * {
383
+ margin-top: var(--sl-search-result-spacing);
384
+ }
385
+ #starlight__search .pagefind-ui__result {
386
+ border: 0;
387
+ padding: 0;
388
+ }
389
+
390
+ #starlight__search .pagefind-ui__result-nested {
391
+ position: relative;
392
+ padding: var(--sl-search-result-nested-pad-block)
393
+ var(--sl-search-result-pad-inline-end);
394
+ padding-inline-start: var(--sl-search-result-pad-inline-start);
395
+ }
396
+
397
+ #starlight__search
398
+ .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)),
399
+ #starlight__search .pagefind-ui__result-nested {
400
+ position: relative;
401
+ background-color: var(--sl-color-black);
402
+ }
403
+
404
+ #starlight__search
405
+ .pagefind-ui__result-title:not(
406
+ :where(.pagefind-ui__result-nested *)
407
+ ):hover,
408
+ #starlight__search
409
+ .pagefind-ui__result-title:not(
410
+ :where(.pagefind-ui__result-nested *)
411
+ ):focus-within,
412
+ #starlight__search .pagefind-ui__result-nested:hover,
413
+ #starlight__search .pagefind-ui__result-nested:focus-within {
414
+ outline: 1px solid var(--sl-color-accent-high);
415
+ }
416
+
417
+ #starlight__search
418
+ .pagefind-ui__result-title:not(
419
+ :where(.pagefind-ui__result-nested *)
420
+ ):focus-within,
421
+ #starlight__search .pagefind-ui__result-nested:focus-within {
422
+ background-color: var(--sl-color-accent-low);
423
+ }
424
+
425
+ #starlight__search .pagefind-ui__result-thumb,
426
+ #starlight__search .pagefind-ui__result-inner {
427
+ margin-top: 0;
428
+ }
429
+
430
+ #starlight__search .pagefind-ui__result-inner > :first-child {
431
+ border-radius: var(--sl-search-corners) var(--sl-search-corners) 0 0;
432
+ }
433
+ #starlight__search .pagefind-ui__result-inner > :last-child {
434
+ border-radius: 0 0 var(--sl-search-corners) var(--sl-search-corners);
435
+ }
436
+
437
+ #starlight__search .pagefind-ui__result-inner > .pagefind-ui__result-title {
438
+ padding: var(--sl-search-result-pad-block)
439
+ var(--sl-search-result-pad-inline-end);
440
+ padding-inline-start: var(--sl-search-result-pad-inline-start);
441
+ }
442
+ #starlight__search
443
+ .pagefind-ui__result-inner
444
+ > .pagefind-ui__result-title::before {
445
+ content: '';
446
+ position: absolute;
447
+ inset-block: 0;
448
+ inset-inline-start: var(--sl-search-page-icon-inline-start);
449
+ width: var(--sl-search-page-icon-size);
450
+ background: var(--sl-color-gray-3);
451
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E")
452
+ center no-repeat;
453
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E")
454
+ center no-repeat;
455
+ }
456
+
457
+ #starlight__search .pagefind-ui__result-inner {
458
+ align-items: stretch;
459
+ gap: 1px;
460
+ }
461
+
462
+ #starlight__search .pagefind-ui__result-link {
463
+ position: unset;
464
+ --pagefind-ui-text: var(--sl-color-white);
465
+ font-weight: 600;
466
+ }
467
+
468
+ #starlight__search .pagefind-ui__result-link:hover {
469
+ text-decoration: none;
470
+ }
471
+
472
+ #starlight__search
473
+ .pagefind-ui__result-nested
474
+ .pagefind-ui__result-link::before {
475
+ content: unset;
476
+ }
477
+
478
+ #starlight__search .pagefind-ui__result-nested::before {
479
+ content: '';
480
+ position: absolute;
481
+ inset-block: 0;
482
+ inset-inline-start: var(--sl-search-tree-diagram-inline-start);
483
+ width: var(--sl-search-tree-diagram-size);
484
+ background: var(--sl-color-gray-4);
485
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E")
486
+ 0% 0% / 100% no-repeat;
487
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E")
488
+ 0% 0% / 100% no-repeat;
489
+ }
490
+ #starlight__search .pagefind-ui__result-nested:last-of-type::before {
491
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E");
492
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E");
493
+ }
494
+
495
+ /* Flip page and tree icons around the vertical axis when in an RTL layout. */
496
+ [dir='rtl'] .pagefind-ui__result-title::before,
497
+ [dir='rtl'] .pagefind-ui__result-nested::before {
498
+ transform: matrix(-1, 0, 0, 1, 0, 0);
499
+ }
500
+
501
+ #starlight__search .pagefind-ui__result-link::after {
502
+ content: '';
503
+ position: absolute;
504
+ inset: 0;
505
+ }
506
+
507
+ #starlight__search .pagefind-ui__result-excerpt {
508
+ font-size: calc(1rem * var(--pagefind-ui-scale));
509
+ overflow-wrap: anywhere;
510
+ }
511
+
512
+ #starlight__search mark {
513
+ color: var(--sl-color-gray-2);
514
+ background-color: transparent;
515
+ font-weight: 600;
516
+ }
517
+
518
+ #starlight__search .pagefind-ui__filter-value::before {
519
+ border-color: var(--sl-color-text-invert);
520
+ }
521
+
522
+ #starlight__search .pagefind-ui__result-tags {
523
+ background-color: var(--sl-color-black);
524
+ margin-top: 0;
525
+ padding: var(--sl-search-result-nested-pad-block)
526
+ var(--sl-search-result-pad-inline-end);
527
+ }
528
+ }
529
+ </style>
530
+
531
+ <style is:global>
532
+ @layer celestia {
533
+ site-search {
534
+ & dialog {
535
+ background-color: var(--sl-color-bg);
536
+ }
537
+
538
+ & input:focus-visible {
539
+ outline-style: solid;
540
+ outline-width: 1px;
541
+ outline-color: var(--sl-color-accent);
542
+ }
543
+ }
544
+
545
+ ::backdrop {
546
+ --sl-color-backdrop-overlay: hsl(0 0 0% / 0.9);
547
+ }
548
+
549
+ [data-theme='light'] ::backdrop {
550
+ --sl-color-backdrop-overlay: hsl(0 0 100% / 0.9);
551
+ }
552
+
553
+ @media (prefers-reduced-motion: no-preference) {
554
+ site-search {
555
+ & dialog,
556
+ & dialog::backdrop {
557
+ transition:
558
+ display 300ms allow-discrete,
559
+ overlay 300ms allow-discrete;
560
+ animation-timing-function: ease-out;
561
+ animation-fill-mode: forwards;
562
+ will-change: transform, opacity, backdrop-filter, background-color;
563
+ }
564
+
565
+ & dialog {
566
+ animation-name: celestia-search-dialog-zoom-out;
567
+ animation-duration: 150ms;
568
+ transform: translateZ(0);
569
+ }
570
+
571
+ & dialog[open] {
572
+ animation-duration: 75ms;
573
+ animation-name: celestia-search-dialog-zoom-in;
574
+ }
575
+
576
+ & dialog::backdrop {
577
+ -webkit-backdrop-filter: none;
578
+ backdrop-filter: none;
579
+
580
+ animation-duration: 150ms;
581
+ animation-name: celestia-search-backdrop-fade-out;
582
+ }
583
+
584
+ & dialog[open]::backdrop {
585
+ animation-duration: 75ms;
586
+ animation-name: celestia-search-backdrop-fade-in;
587
+ }
588
+ }
589
+ }
590
+
591
+ @keyframes celestia-search-backdrop-fade-in {
592
+ from {
593
+ background-color: transparent;
594
+ }
595
+ to {
596
+ background-color: var(--sl-color-backdrop-overlay);
597
+ }
598
+ }
599
+
600
+ @keyframes celestia-search-backdrop-fade-out {
601
+ from {
602
+ background-color: var(--sl-color-backdrop-overlay);
603
+ }
604
+ to {
605
+ background-color: transparent;
606
+ }
607
+ }
608
+
609
+ site-search {
610
+ --celestia-search-dialog-zoom-scale: 1;
611
+ --celestia-search-dialog-zoom-translate-y: 0;
612
+ }
613
+
614
+ @media (min-width: 72rem) {
615
+ site-search {
616
+ --celestia-search-dialog-zoom-scale: 0.95;
617
+ --celestia-search-dialog-zoom-translate-y: -1rem;
618
+ }
619
+ }
620
+
621
+ @keyframes celestia-search-dialog-zoom-in {
622
+ from {
623
+ opacity: 0;
624
+ transform: scale(var(--celestia-search-dialog-zoom-scale))
625
+ translateY(var(--celestia-search-dialog-zoom-translate-y));
626
+ }
627
+ to {
628
+ opacity: 1;
629
+ transform: scale(1) translateY(0);
630
+ }
631
+ }
632
+
633
+ @keyframes celestia-search-dialog-zoom-out {
634
+ from {
635
+ opacity: 1;
636
+ transform: scale(1) translateY(0);
637
+ }
638
+ to {
639
+ opacity: 0;
640
+ transform: scale(var(--celestia-search-dialog-zoom-scale))
641
+ translateY(var(--celestia-search-dialog-zoom-translate-y));
642
+ }
643
+ }
644
+ }
645
+ </style>
@@ -0,0 +1,47 @@
1
+ ---
2
+ import config from "virtual:starlight/user-config";
3
+
4
+ const { siteTitle, siteTitleHref } = Astro.locals.starlightRoute;
5
+
6
+ let logoSrc: string | undefined;
7
+ let logoAlt = "";
8
+ if (config.logo) {
9
+ logoAlt = config.logo.alt || "";
10
+ if ("src" in config.logo) {
11
+ const raw = typeof config.logo.src === "string" ? config.logo.src : "";
12
+ logoSrc = raw.replace(/^\.\/public/, "");
13
+ }
14
+ }
15
+ ---
16
+
17
+ <a href={siteTitleHref} class="site-title sl-flex">
18
+ {logoSrc && <img alt={logoAlt} src={logoSrc} class="celestia-logo" />}
19
+ <span class:list={{ "sr-only": config.logo?.replacesTitle }} translate="no">
20
+ {siteTitle}
21
+ </span>
22
+ </a>
23
+
24
+ <style>
25
+ .site-title {
26
+ align-items: center;
27
+ gap: var(--sl-nav-gap);
28
+ font-size: var(--sl-text-h4);
29
+ font-weight: 600;
30
+ color: var(--sl-color-text-accent);
31
+ text-decoration: none;
32
+ white-space: nowrap;
33
+ min-width: 0;
34
+ }
35
+
36
+ .celestia-logo {
37
+ height: calc(var(--sl-nav-height) - 2 * var(--sl-nav-pad-y));
38
+ width: auto;
39
+ max-width: 100%;
40
+ object-fit: contain;
41
+ object-position: 0 50%;
42
+ }
43
+
44
+ span {
45
+ overflow: hidden;
46
+ }
47
+ </style>