starlight-theme-nova 0.9.5 → 0.11.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 (37) hide show
  1. package/lib/styles.css +1 -2
  2. package/lib/tailwind.css +121 -0
  3. package/lib/tailwind.gen.css +1313 -0
  4. package/package.json +14 -18
  5. package/src/components/CodeCopy.astro +7 -5
  6. package/src/components/CodeTabs.astro +4 -19
  7. package/src/components/Header.astro +19 -7
  8. package/src/components/LinkButton.astro +15 -7
  9. package/src/components/LinkButtonIcon.astro +11 -9
  10. package/src/components/LinkCard.astro +17 -3
  11. package/src/components/MobileMenuFooter.astro +1 -1
  12. package/src/components/MobileMenuToggle.astro +12 -2
  13. package/src/components/MobileTableOfContents.astro +1 -1
  14. package/src/components/PageFrame.astro +18 -21
  15. package/src/components/Pagination.astro +5 -2
  16. package/src/components/PaginationLink.astro +17 -8
  17. package/src/components/Search.astro +3 -2
  18. package/src/components/SiteTitle.astro +5 -1
  19. package/src/components/SocialIcons.astro +5 -1
  20. package/src/components/ThemeProvider.astro +1 -1
  21. package/src/components/ThemeSelect.astro +9 -5
  22. package/src/constants.ts +2 -0
  23. package/src/icons/lucide-arrow-left.svg +1 -0
  24. package/src/icons/lucide-arrow-right.svg +1 -0
  25. package/src/icons/lucide-check.svg +1 -0
  26. package/src/icons/lucide-chevron-left.svg +1 -0
  27. package/src/icons/lucide-chevron-right.svg +1 -0
  28. package/src/icons/lucide-clipboard.svg +1 -0
  29. package/src/icons/lucide-menu.svg +1 -0
  30. package/src/icons/lucide-search.svg +1 -0
  31. package/src/icons/lucide-x.svg +1 -0
  32. package/src/icons/tabler-moon-filled.svg +1 -0
  33. package/src/icons/tabler-sun-high-filled.svg +1 -0
  34. package/src/index.ts +43 -2
  35. package/src/shiki-transformer-container.ts +6 -3
  36. package/src/user-options.ts +16 -0
  37. package/lib/styles.gen.css +0 -211
package/src/index.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import type {
2
+ StarlightConfig,
2
3
  StarlightPlugin,
3
4
  StarlightUserConfig,
4
5
  } from '@astrojs/starlight/types'
6
+ import type { AstroConfig } from 'astro'
5
7
  import remarkCustomHeaderId from 'remark-custom-header-id'
6
8
 
7
9
  import { createShikiConfig } from './shiki-config'
@@ -25,7 +27,7 @@ const components = {
25
27
  'starlight-theme-nova/components/MobileTableOfContents.astro',
26
28
  MobileMenuFooter: 'starlight-theme-nova/components/MobileMenuFooter.astro',
27
29
  LanguageSelect: 'starlight-theme-nova/components/LanguageSelect.astro',
28
- } as const
30
+ } as const satisfies Partial<StarlightConfig['components']>
29
31
 
30
32
  export type { ThemeNovaOptions }
31
33
 
@@ -35,13 +37,29 @@ export default function starlightThemeNova(
35
37
  return {
36
38
  name: 'starlight-theme-nova',
37
39
  hooks: {
38
- setup({ config, updateConfig, addIntegration, astroConfig }) {
40
+ setup: async ({ config, updateConfig, addIntegration, astroConfig }) => {
41
+ let useTailwind: boolean
42
+
43
+ if (options.stylingSystem === 'css') {
44
+ useTailwind = false
45
+ } else if (options.stylingSystem === 'tailwind') {
46
+ useTailwind = true
47
+ } else {
48
+ const hasTailwindcss = await checkHasTailwindcss(
49
+ astroConfig.vite?.plugins,
50
+ )
51
+ useTailwind = hasTailwindcss
52
+ }
53
+
39
54
  const newConfig = {
40
55
  customCss: [
41
56
  ...(config.customCss || []),
42
57
  // Including nova styles *after* any user CSS, so that @layer nova
43
58
  // can have a higher precedence.
44
59
  'starlight-theme-nova/styles.css',
60
+ useTailwind
61
+ ? 'starlight-theme-nova/tailwind.css'
62
+ : 'starlight-theme-nova/tailwind.gen.css',
45
63
  ],
46
64
  components: {
47
65
  // Including any user components *after* our own.
@@ -78,3 +96,26 @@ export default function starlightThemeNova(
78
96
  },
79
97
  }
80
98
  }
99
+
100
+ type ViteUserConfig = AstroConfig['vite']
101
+ type VitePlugin = NonNullable<ViteUserConfig['plugins']>[number]
102
+
103
+ async function checkHasTailwindcss(
104
+ plugin: VitePlugin | Promise<VitePlugin>,
105
+ ): Promise<boolean> {
106
+ const awaited = await plugin
107
+
108
+ if (!awaited) {
109
+ return false
110
+ }
111
+ if (Array.isArray(awaited)) {
112
+ for (const p of awaited) {
113
+ if (await checkHasTailwindcss(p)) {
114
+ return true
115
+ }
116
+ }
117
+ return false
118
+ }
119
+ let name = awaited.name || ''
120
+ return name.includes('tailwind')
121
+ }
@@ -35,7 +35,8 @@ export function transformerContainer(): ShikiTransformer {
35
35
  type: 'element',
36
36
  tagName: 'div',
37
37
  properties: {
38
- class: 'nova-code-title',
38
+ class:
39
+ 'hidden border-b border-solid border-b-(--sl-color-gray-5) bg-(--sl-color-bg) px-4 py-2 font-mono text-sm text-(--sl-color-gray-3) [div[data-nova-code-container][data-nova-code-title]_&]:block',
39
40
  },
40
41
  children: [
41
42
  {
@@ -53,7 +54,8 @@ export function transformerContainer(): ShikiTransformer {
53
54
  properties: {
54
55
  [CODE_PROPERTY_CONTAINER]: '',
55
56
  [CODE_PROPERTY_TITLE]: title || undefined,
56
- class: 'nova-code-container not-content',
57
+ class:
58
+ 'not-content relative overflow-hidden [&_pre]:relative [&_nova-code-copy-button]:opacity-0 [&:hover_nova-code-copy-button]:opacity-100 border border-solid border-(--sl-color-gray-5) rounded-md',
57
59
  },
58
60
  children: [
59
61
  ...children,
@@ -65,7 +67,8 @@ export function transformerContainer(): ShikiTransformer {
65
67
  'data-code': this.source,
66
68
  title: 'Copy code',
67
69
  'aria-label': 'Copy code',
68
- class: 'nova-code-copy-button',
70
+ class:
71
+ 'absolute top-2 right-2 m-0 size-6 rounded border border-solid border-(--sl-color-gray-5) bg-gray-100/30 p-1 text-black backdrop-blur-sm transition hover:bg-gray-200/50 active:scale-90 dark:bg-gray-600/30 dark:text-white hover:dark:bg-gray-500/50',
69
72
  },
70
73
  children: [],
71
74
  },
@@ -13,6 +13,22 @@ export interface NavItem {
13
13
 
14
14
  export interface ThemeNovaOptions {
15
15
  nav?: NavItem[]
16
+
17
+ /**
18
+ * `starlight-theme-nova` supports two styling systems: pure CSS and Tailwind
19
+ * CSS.
20
+ *
21
+ * By default, `starlight-theme-nova` will detect if Tailwind CSS is passed to
22
+ * the Astro config, and use Tailwind CSS if it is. You can also force the
23
+ * theme to use a specific styling system by setting the `stylingSystem`
24
+ * option to `css` or `tailwind`.
25
+ *
26
+ * Check https://docs.astro.build/en/guides/styling/#tailwind for how to add
27
+ * Tailwind CSS to your Astro project.
28
+ *
29
+ * @default "detect"
30
+ */
31
+ stylingSystem?: 'css' | 'tailwind' | 'detect'
16
32
  }
17
33
 
18
34
  /**
@@ -1,211 +0,0 @@
1
- /* layer: preflights */
2
- *,::before,::after{--nova-rotate:0;--nova-rotate-x:0;--nova-rotate-y:0;--nova-rotate-z:0;--nova-scale-x:1;--nova-scale-y:1;--nova-scale-z:1;--nova-skew-x:0;--nova-skew-y:0;--nova-translate-x:0;--nova-translate-y:0;--nova-translate-z:0;--nova-pan-x: ;--nova-pan-y: ;--nova-pinch-zoom: ;--nova-scroll-snap-strictness:proximity;--nova-ordinal: ;--nova-slashed-zero: ;--nova-numeric-figure: ;--nova-numeric-spacing: ;--nova-numeric-fraction: ;--nova-border-spacing-x:0;--nova-border-spacing-y:0;--nova-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--nova-ring-shadow:0 0 rgb(0 0 0 / 0);--nova-shadow-inset: ;--nova-shadow:0 0 rgb(0 0 0 / 0);--nova-ring-inset: ;--nova-ring-offset-width:0px;--nova-ring-offset-color:#fff;--nova-ring-width:0px;--nova-ring-color:rgb(147 197 253 / 0.5);--nova-blur: ;--nova-brightness: ;--nova-contrast: ;--nova-drop-shadow: ;--nova-grayscale: ;--nova-hue-rotate: ;--nova-invert: ;--nova-saturate: ;--nova-sepia: ;--nova-backdrop-blur: ;--nova-backdrop-brightness: ;--nova-backdrop-contrast: ;--nova-backdrop-grayscale: ;--nova-backdrop-hue-rotate: ;--nova-backdrop-invert: ;--nova-backdrop-opacity: ;--nova-backdrop-saturate: ;--nova-backdrop-sepia: ;}::backdrop{--nova-rotate:0;--nova-rotate-x:0;--nova-rotate-y:0;--nova-rotate-z:0;--nova-scale-x:1;--nova-scale-y:1;--nova-scale-z:1;--nova-skew-x:0;--nova-skew-y:0;--nova-translate-x:0;--nova-translate-y:0;--nova-translate-z:0;--nova-pan-x: ;--nova-pan-y: ;--nova-pinch-zoom: ;--nova-scroll-snap-strictness:proximity;--nova-ordinal: ;--nova-slashed-zero: ;--nova-numeric-figure: ;--nova-numeric-spacing: ;--nova-numeric-fraction: ;--nova-border-spacing-x:0;--nova-border-spacing-y:0;--nova-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--nova-ring-shadow:0 0 rgb(0 0 0 / 0);--nova-shadow-inset: ;--nova-shadow:0 0 rgb(0 0 0 / 0);--nova-ring-inset: ;--nova-ring-offset-width:0px;--nova-ring-offset-color:#fff;--nova-ring-width:0px;--nova-ring-color:rgb(147 197 253 / 0.5);--nova-blur: ;--nova-brightness: ;--nova-contrast: ;--nova-drop-shadow: ;--nova-grayscale: ;--nova-hue-rotate: ;--nova-invert: ;--nova-saturate: ;--nova-sepia: ;--nova-backdrop-blur: ;--nova-backdrop-brightness: ;--nova-backdrop-contrast: ;--nova-backdrop-grayscale: ;--nova-backdrop-hue-rotate: ;--nova-backdrop-invert: ;--nova-backdrop-opacity: ;--nova-backdrop-saturate: ;--nova-backdrop-sepia: ;}
3
-
4
- :root,
5
- ::backdrop {
6
- --sl-content-width: 50rem;
7
-
8
- --sl-text-h1: var(--sl-text-3xl);
9
- --sl-text-h2: var(--sl-text-2xl);
10
- --sl-text-h3: var(--sl-text-xl);
11
- --sl-text-h4: var(--sl-text-lg);
12
- --sl-text-h5: var(--sl-text-base);
13
- --sl-text-h6: var(--sl-text-sm);
14
- }
15
-
16
- /* Dark mode Starlight theme variables. */
17
- :root {
18
- --sl-color-white: white;
19
- --sl-color-gray-1: #e5e7eb;
20
- --sl-color-gray-2: #d1d5db;
21
- --sl-color-gray-3: #9ca3af;
22
- --sl-color-gray-4: #4b5563;
23
- --sl-color-gray-5: #374151;
24
- --sl-color-gray-6: #1f2937;
25
- --sl-color-black: #030712;
26
-
27
- --sl-color-accent-low: #030712;
28
- --sl-color-accent: #4b5563;
29
- --sl-color-accent-high: #f3f4f6;
30
-
31
- --sl-color-bg-inline-code: #1f2937;
32
- --sl-color-border-inline-code: #374151;
33
- --sl-color-bg-nav: color-mix(in srgb, #030712 50%, transparent);
34
-
35
- --sl-color-orange-low: #451a03;
36
- --sl-color-orange: #78350f;
37
- --sl-color-orange-high: #fde68a;
38
-
39
- --sl-color-green-low: #052e16;
40
- --sl-color-green: #14532d;
41
- --sl-color-green-high: #bbf7d0;
42
-
43
- --sl-color-blue-low: #172554;
44
- --sl-color-blue: #1e3a8a;
45
- --sl-color-blue-high: #bfdbfe;
46
-
47
- --sl-color-purple-low: #3b0764;
48
- --sl-color-purple: #581c87;
49
- --sl-color-purple-high: #e9d5ff;
50
-
51
- --sl-color-red-low: #450a0a;
52
- --sl-color-red: #7f1d1d;
53
- --sl-color-red-high: #fecaca;
54
-
55
- --nano-color-highlight: var(--sl-color-gray-5);
56
- }
57
-
58
- /* Light mode Starlight theme variables */
59
- :root[data-theme='light'] {
60
- --sl-color-white: #111827;
61
- --sl-color-gray-1: #1f2937;
62
- --sl-color-gray-2: #374151;
63
- --sl-color-gray-3: #6b7280;
64
- --sl-color-gray-4: #9ca3af;
65
- --sl-color-gray-5: #d1d5db;
66
- --sl-color-gray-6: #e5e7eb;
67
- --sl-color-gray-7: #f3f4f6;
68
- --sl-color-black: white;
69
-
70
- --sl-color-accent-low: #e5e7eb;
71
- --sl-color-accent: #1f2937;
72
- --sl-color-accent-high: #111827;
73
-
74
- --sl-color-bg-inline-code: #f3f4f6;
75
- --sl-color-border-inline-code: #d1d5db;
76
- --sl-color-bg-nav: color-mix(in srgb, #fff 80%, transparent);
77
-
78
- --sl-color-orange-low: #fef3c7;
79
- --sl-color-orange: #fbbf24;
80
- --sl-color-orange-high: #92400e;
81
-
82
- --sl-color-green-low: #dcfce7;
83
- --sl-color-green: #4ade80;
84
- --sl-color-green-high: #166534;
85
-
86
- --sl-color-blue-low: #dbeafe;
87
- --sl-color-blue: #60a5fa;
88
- --sl-color-blue-high: #1e40af;
89
-
90
- --sl-color-purple-low: #f3e8ff;
91
- --sl-color-purple: #c084fc;
92
- --sl-color-purple-high: #6b21a8;
93
-
94
- --sl-color-red-low: #fee2e2;
95
- --sl-color-red: #f87171;
96
- --sl-color-red-high: #991b1b;
97
-
98
- --nano-color-highlight: var(--sl-color-gray-6);
99
- }
100
-
101
- /* layer: shortcuts */
102
- .nova-code-copy-button-icon-check{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M20 6L9 17l-5-5'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;display:block;width:100%;height:100%;}
103
- .nova-code-copy-button-icon-clipboard{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;display:block;width:100%;height:100%;}
104
- .nova-link-button-icon-left{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m12 19l-7-7l7-7m7 7H5'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;width:1.25rem;height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
105
- .nova-link-button-icon-right{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 12h14m-7-7l7 7l-7 7'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;width:1.25rem;height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
106
- .nova-link-card-icon{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 12h14m-7-7l7 7l-7 7'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;margin-left:0.5rem;width:1.25rem;height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
107
- .nova-mobile-menu-toggle-icon{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 5h16M4 12h16M4 19h16'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;transition-property:transform;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
108
- body[data-mobile-menu-expanded] .nova-mobile-menu-toggle-icon{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M18 6L6 18M6 6l12 12'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;--nova-rotate-x:0;--nova-rotate-y:0;--nova-rotate-z:0;--nova-rotate:90deg;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
109
- .nova-pagination-link-icon-left{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m15 18l-6-6l6-6'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;}
110
- .nova-pagination-link-icon-right{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m9 18l6-6l-6-6'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;}
111
- .nova-search-button-icon{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m21 21l-4.34-4.34'/%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;}
112
- .nova-theme-select-icon-dark{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 1.992a10 10 0 1 0 9.236 13.838c.341-.82-.476-1.644-1.298-1.31a6.5 6.5 0 0 1-6.864-10.787l.077-.08c.551-.63.113-1.653-.758-1.653h-.266l-.068-.006z'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;}
113
- .nova-theme-select-icon-light{--nova-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 19a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1m-4.95-2.05a1 1 0 0 1 0 1.414l-1.414 1.414a1 1 0 1 1-1.414-1.414l1.414-1.414a1 1 0 0 1 1.414 0m11.314 0l1.414 1.414a1 1 0 0 1-1.414 1.414l-1.414-1.414a1 1 0 0 1 1.414-1.414m-5.049-9.836a5 5 0 1 1-2.532 9.674a5 5 0 0 1 2.532-9.674M4 11a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2zm18 0a1 1 0 0 1 0 2h-2a1 1 0 0 1 0-2zM5.636 4.222L7.05 5.636A1 1 0 0 1 5.636 7.05L4.222 5.636a1 1 0 0 1 1.414-1.414m14.142 0a1 1 0 0 1 0 1.414L18.364 7.05a1 1 0 0 1-1.414-1.414l1.414-1.414a1 1 0 0 1 1.414 0M12 1a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0V2a1 1 0 0 1 1-1'/%3E%3C/svg%3E");-webkit-mask:var(--nova-icon) no-repeat;mask:var(--nova-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1em;height:1em;}
114
- .nova-page-frame-sidebar-pane{visibility:visible;visibility:hidden;border-width:0px;border-color:var(--sl-color-hairline);border-style:solid;}
115
- .nova-code-container{position:relative;overflow:hidden;border-width:1px;border-color:var(--sl-color-gray-5);border-radius:0.375rem;border-style:solid;}
116
- .nova-code-container pre{position:relative;}
117
- .nova-code-copy-button{position:absolute;right:0.5rem;top:0.5rem;margin:0;width:1.5rem;height:1.5rem;border-width:1px;border-color:var(--sl-color-gray-5);border-radius:0.25rem;border-style:solid;background-color:rgb(243 244 246 / 0.3) /* #f3f4f6 */;padding:0.25rem;--nova-text-opacity:1;color:rgb(0 0 0 / var(--nova-text-opacity)) /* #000 */;--nova-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
118
- .nova-link-card{position:relative;display:flex;flex-direction:column;gap:0.5rem;border-width:1px;border-color:var(--sl-color-gray-5);border-radius:0.75rem;border-style:solid;--nova-bg-opacity:1;background-color:rgb(255 255 255 / var(--nova-bg-opacity)) /* #fff */;padding-left:1.25rem;padding-right:1.25rem;padding-top:1rem;padding-bottom:1rem;--nova-text-opacity:1;color:rgb(55 65 81 / var(--nova-text-opacity)) /* #374151 */;--nova-shadow:var(--nova-shadow-inset) 0 1px 2px 0 var(--nova-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
119
- .nova-page-frame-header{position:fixed;inset:0;z-index:var(--sl-z-index-navbar);box-sizing:border-box;width:100%;height:var(--sl-nav-height);border-width:0px;border-bottom-width:1px;border-color:var(--sl-color-hairline);border-style:solid;background-color:var(--sl-color-bg-nav) /* var(--sl-color-bg-nav) */;padding-top:var(--sl-nav-pad-y);padding-bottom:var(--sl-nav-pad-y);padding-left:var(--sl-nav-pad-x);padding-right:var(--sl-nav-pad-x);--nova-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);}
120
- .nova-link-card-link::before{position:absolute;inset:0;content:'';}
121
- .nova-header-nav-link{margin:-0.375rem;border-radius:0.375rem;padding:0.375rem;color:var(--sl-color-gray-3) /* var(--sl-color-gray-3) */;text-decoration:none;}
122
- .nova-header-title{margin:-0.75rem;min-width:0;display:flex;overflow:clip;padding:0.75rem;}
123
- .nova-nav-link,
124
- .nova-site-title a{margin:-0.375rem;border-radius:0.375rem;padding:0.375rem;}
125
- .nova-pagination-link{margin:0;display:flex;align-items:center;justify-content:flex-end;gap:0.5rem;border-radius:0.75rem;padding:0.5rem;color:var(--sl-color-gray-2) /* var(--sl-color-gray-2) */;font-weight:500;text-decoration:none;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
126
- .nova-link-button{margin-inline-end:0.5rem;margin-top:0.5rem;margin-bottom:0.5rem;display:inline-flex;align-items:center;justify-content:space-between;gap:0.5rem;border-width:1px;border-color:transparent;border-radius:0.75rem;border-style:solid;padding-left:1.5rem;padding-right:1.5rem;padding-top:0.75rem;padding-bottom:0.75rem;font-weight:500;text-decoration:none;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
127
- .nova-header{box-sizing:border-box;height:100%;display:flex;align-items:center;gap:0.5rem;}
128
- div[data-nova-code-container][data-nova-code-title] .nova-code-title{display:block;}
129
- .nova-pagination-link-icon{display:block;min-width:1.25rem;min-height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
130
- .nova-code-title{display:none;border-bottom-width:1px;border-bottom-color:var(--sl-color-gray-5);border-bottom-style:solid;background-color:var(--sl-color-bg) /* var(--sl-color-bg) */;padding-left:1rem;padding-right:1rem;padding-top:0.5rem;padding-bottom:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--sl-color-gray-3) /* var(--sl-color-gray-3) */;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;}
131
- .nova-header-actions-lg{display:none;align-items:center;gap:0.5rem;}
132
- .nova-icon-button{width:2rem;height:2rem;display:flex;border-radius:0.375rem;padding:0.5rem;color:var(--sl-color-text) /* var(--sl-color-text) */;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
133
- .nova-theme-select{width:2rem;height:2rem;overflow:visible;}
134
- .nova-page-frame{min-height:100vh;display:flex;flex-direction:column;}
135
- .nova-pagination{min-width:100%;display:flex;flex-direction:row;align-items:stretch;justify-content:space-between;gap:0.5rem;padding-left:0.25rem;padding-right:0.25rem;padding-top:0;padding-bottom:1.5rem;}
136
- .nova-search-button-large{width:100%;max-width:22rem;height:2.25rem;display:flex;border-width:1px;border-color:var(--sl-color-gray-5);border-radius:0.375rem;border-style:solid;padding:0.5rem;color:var(--sl-color-text) /* var(--sl-color-text) */;transition-property:color;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
137
- .nova-header-actions-sm{display:flex;align-items:center;gap:0.5rem;}
138
- .nova-header-nav{display:flex;flex:1 1 0%;flex-direction:row;gap:1rem;overflow-x:auto;padding-top:0.75rem;padding-bottom:0.75rem;padding-left:1rem;padding-right:1rem;font-size:0.875rem;line-height:1.25rem;font-weight:500;}
139
- .nova-header-search{display:flex;}
140
- .nova-mobile-menu-footer{display:flex;align-items:center;justify-content:flex-end;gap:0.5rem;padding-top:1rem;padding-bottom:1rem;}
141
- .nova-link-card-link{display:inline-flex;align-items:center;justify-content:space-between;font-size:1.125rem;line-height:1.75rem;--nova-text-opacity:1;color:rgb(55 65 81 / var(--nova-text-opacity)) /* #374151 */;font-weight:600;text-decoration:none;}
142
- .nova-pagination-divider{flex:1 1 0%;}
143
- .nova-pagination-link[rel="next"]{flex-direction:row;}
144
- .nova-pagination-link[rel="prev"]{flex-direction:row-reverse;}
145
- .nova-link-button:hover .nova-link-button-icon-left,
146
- .nova-pagination-link:hover .nova-pagination-link-icon-left{--nova-translate-x:-0.25rem;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
147
- .nova-link-button:hover .nova-link-button-icon-right,
148
- .nova-link-card:hover .nova-link-card-icon,
149
- .nova-pagination-link:hover .nova-pagination-link-icon-right{--nova-translate-x:0.25rem;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
150
- .nova-code-copy-button:active{--nova-scale-x:0.9;--nova-scale-y:0.9;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
151
- .nova-icon-button:active{--nova-scale-x:0.9;--nova-scale-y:0.9;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
152
- .nova-link-button:active{--nova-scale-x:0.97;--nova-scale-y:0.97;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
153
- .nova-link-card:active{--nova-scale-x:0.99;--nova-scale-y:0.99;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
154
- .sl-markdown-content .nova-code-container pre.astro-code{border-width:0px;border-color:transparent;border-radius:0;}
155
- .nova-link-button-secondary{border-color:var(--sl-color-gray-5);--nova-bg-opacity:1;background-color:rgb(255 255 255 / var(--nova-bg-opacity)) /* #fff */;--nova-text-opacity:1;color:rgb(55 65 81 / var(--nova-text-opacity)) /* #374151 */;--nova-shadow:var(--nova-shadow-inset) 0 1px 2px 0 var(--nova-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);}
156
- .nova-mobile-table-of-contents summary{border-bottom-color:var(--sl-color-hairline);}
157
- .dark .nova-code-copy-button{background-color:rgb(75 85 99 / 0.3) /* #4b5563 */;--nova-text-opacity:1;color:rgb(255 255 255 / var(--nova-text-opacity)) /* #fff */;}
158
- .dark .nova-link-button-primary{--nova-bg-opacity:1;background-color:rgb(243 244 246 / var(--nova-bg-opacity)) /* #f3f4f6 */;--nova-text-opacity:1;color:rgb(17 24 39 / var(--nova-text-opacity)) /* #111827 */;}
159
- .nova-link-button-primary{--nova-bg-opacity:1;background-color:rgb(0 0 0 / var(--nova-bg-opacity)) /* #000 */;--nova-text-opacity:1;color:rgb(255 255 255 / var(--nova-text-opacity)) /* #fff */;--nova-shadow:var(--nova-shadow-inset) 0 1px 2px 0 var(--nova-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);}
160
- .dark .nova-link-button-secondary,
161
- .dark .nova-link-card{--nova-bg-opacity:1;background-color:rgb(31 41 55 / var(--nova-bg-opacity)) /* #1f2937 */;--nova-text-opacity:1;color:rgb(229 231 235 / var(--nova-text-opacity)) /* #e5e7eb */;}
162
- .dark .nova-code-copy-button:hover{background-color:rgb(107 114 128 / 0.5) /* #6b7280 */;}
163
- .nova-code-copy-button:hover{background-color:rgb(229 231 235 / 0.5) /* #e5e7eb */;}
164
- .nova-icon-button:hover{background-color:rgb(156 163 175 / 0.3) /* #9ca3af */;}
165
- .dark .nova-link-button-primary:hover{--nova-bg-opacity:1;background-color:rgb(209 213 219 / var(--nova-bg-opacity)) /* #d1d5db */;}
166
- .nova-link-button-primary:hover{--nova-bg-opacity:1;background-color:rgb(31 41 55 / var(--nova-bg-opacity)) /* #1f2937 */;--nova-shadow:var(--nova-shadow-inset) 0 4px 6px -1px var(--nova-shadow-color, rgb(0 0 0 / 0.1)),var(--nova-shadow-inset) 0 2px 4px -2px var(--nova-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);}
167
- .dark .nova-link-button-secondary:hover{--nova-bg-opacity:1;background-color:rgb(55 65 81 / var(--nova-bg-opacity)) /* #374151 */;}
168
- .nova-link-button-secondary:hover{--nova-bg-opacity:1;background-color:rgb(249 250 251 / var(--nova-bg-opacity)) /* #f9fafb */;--nova-shadow:var(--nova-shadow-inset) 0 4px 6px -1px var(--nova-shadow-color, rgb(0 0 0 / 0.1)),var(--nova-shadow-inset) 0 2px 4px -2px var(--nova-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);}
169
- .dark .nova-link-card:hover{--nova-bg-opacity:1;background-color:rgb(55 65 81 / var(--nova-bg-opacity)) /* #374151 */;}
170
- .nova-link-card:hover{--nova-bg-opacity:1;background-color:rgb(249 250 251 / var(--nova-bg-opacity)) /* #f9fafb */;--nova-shadow:var(--nova-shadow-inset) 0 4px 6px -1px var(--nova-shadow-color, rgb(0 0 0 / 0.1)),var(--nova-shadow-inset) 0 2px 4px -2px var(--nova-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--nova-ring-offset-shadow), var(--nova-ring-shadow), var(--nova-shadow);}
171
- .nova-search-button-large:hover{background-color:rgb(156 163 175 / 0.1) /* #9ca3af */;}
172
- .nova-site-title *{font-size:1.125rem;line-height:1.75rem;color:var(--sl-color-text) /* var(--sl-color-text) */;font-weight:600;}
173
- .dark .nova-link-button-minimal,
174
- .dark .nova-link-card-link{--nova-text-opacity:1;color:rgb(229 231 235 / var(--nova-text-opacity)) /* #e5e7eb */;}
175
- .nova-link-button-minimal{--nova-text-opacity:1;color:rgb(55 65 81 / var(--nova-text-opacity)) /* #374151 */;}
176
- .nova-header-nav-link:hover{color:var(--sl-color-white) /* var(--sl-color-white) */;}
177
- .nova-pagination-link:hover{color:var(--sl-color-white) /* var(--sl-color-white) */;}
178
- .nova-code-container .nova-code-copy-button{opacity:0;}
179
- .nova-code-container:hover .nova-code-copy-button{opacity:1;}
180
- .nova-header-nav-link:focus-visible{outline-offset:0px;}
181
- .nova-icon-button:focus-visible{outline-offset:1px;}
182
- .nova-nav-link:focus-visible{outline-offset:0px;}
183
- .nova-site-title:focus-visible a{outline-offset:0px;}
184
- .nova-mobile-table-of-contents nav{--nova-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);backdrop-filter:var(--nova-backdrop-blur) var(--nova-backdrop-brightness) var(--nova-backdrop-contrast) var(--nova-backdrop-grayscale) var(--nova-backdrop-hue-rotate) var(--nova-backdrop-invert) var(--nova-backdrop-opacity) var(--nova-backdrop-saturate) var(--nova-backdrop-sepia);}
185
- @media print{
186
- .nova-header-actions-lg,
187
- .nova-header-actions-sm,
188
- .nova-header-search,
189
- .nova-mobile-menu-footer{display:none;}
190
- }
191
- @media (max-width: calc(50rem - 0.1px)){
192
- body[data-mobile-menu-expanded] .nova-page-frame-sidebar-pane{visibility:visible;}
193
- .nova-header-nav *{display:none;}
194
- .nova-search-button{width:2rem;height:2rem;display:flex;border-radius:0.375rem;padding:0.5rem;color:var(--sl-color-text) /* var(--sl-color-text) */;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
195
- .nova-page-frame-sidebar-pane{width:100%;}
196
- .nova-search-button:active{--nova-scale-x:0.9;--nova-scale-y:0.9;transform:translateX(var(--nova-translate-x)) translateY(var(--nova-translate-y)) translateZ(var(--nova-translate-z)) rotate(var(--nova-rotate)) rotateX(var(--nova-rotate-x)) rotateY(var(--nova-rotate-y)) rotateZ(var(--nova-rotate-z)) skewX(var(--nova-skew-x)) skewY(var(--nova-skew-y)) scaleX(var(--nova-scale-x)) scaleY(var(--nova-scale-y)) scaleZ(var(--nova-scale-z));}
197
- .nova-search-button:hover{background-color:rgb(156 163 175 / 0.3) /* #9ca3af */;}
198
- .nova-search-button:focus-visible{outline-offset:1px;}
199
- }
200
- @media (min-width: 50rem){
201
- .nova-page-frame-sidebar-pane{visibility:visible;width:var(--sl-sidebar-width);border-right-width:1px;}
202
- .nova-header-actions-sm{display:none;}
203
- .nova-header-search{max-width:15rem;flex:1 1 0%;}
204
- .nova-search-button{width:100%;max-width:22rem;height:2.25rem;display:flex;border-width:1px;border-color:var(--sl-color-gray-5);border-radius:0.375rem;border-style:solid;padding:0.5rem;color:var(--sl-color-text) /* var(--sl-color-text) */;transition-property:color;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
205
- .nova-header-actions-lg{display:flex;}
206
- .nova-search-button:hover{background-color:rgb(156 163 175 / 0.1) /* #9ca3af */;}
207
- .nova-pagination-link{font-size:1.125rem;line-height:1.75rem;}
208
- }
209
- @media (min-width: 90rem){
210
- .nova-header-nav{gap:1.5rem;padding-left:1.5rem;}
211
- }