starlight-theme-nova 0.1.0 → 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.
package/lib/aside.css ADDED
@@ -0,0 +1,17 @@
1
+ .starlight-aside {
2
+ border: 1px solid var(--sl-color-asides-border);
3
+ border-radius: 0.5rem;
4
+ }
5
+
6
+ .starlight-aside,
7
+ .starlight-aside a {
8
+ color: color-mix(
9
+ in srgb,
10
+ var(--sl-color-asides-text-accent) 50%,
11
+ var(--sl-color-white)
12
+ );
13
+ }
14
+
15
+ .starlight-aside a:is(:hover, :focus-visible) {
16
+ color: var(--sl-color-asides-text-accent);
17
+ }
package/lib/badge.css ADDED
@@ -0,0 +1,23 @@
1
+ .sl-badge {
2
+ --sl-badge-default-border: var(--sl-color-accent);
3
+ --sl-badge-default-bg: var(--sl-color-accent-low);
4
+ --sl-badge-default-text: var(--sl-color-accent-high);
5
+ --sl-badge-tip-text: var(--sl-color-purple-high);
6
+ --sl-badge-caution-text: var(--sl-color-orange-high);
7
+ --sl-badge-note-text: var(--sl-color-blue-high);
8
+ --sl-badge-success-text: var(--sl-color-green-high);
9
+ --sl-badge-danger-text: var(--sl-color-red-high);
10
+ }
11
+
12
+ [data-theme='light'] .sl-badge {
13
+ --sl-badge-tip-bg: var(--sl-color-purple-low);
14
+ --sl-badge-tip-text: var(--sl-color-purple-high);
15
+ --sl-badge-caution-bg: var(--sl-color-orange-low);
16
+ --sl-badge-caution-text: var(--sl-color-orange-high);
17
+ --sl-badge-note-bg: var(--sl-color-blue-low);
18
+ --sl-badge-note-text: var(--sl-color-blue-high);
19
+ --sl-badge-success-bg: var(--sl-color-green-low);
20
+ --sl-badge-success-text: var(--sl-color-green-high);
21
+ --sl-badge-danger-bg: var(--sl-color-red-low);
22
+ --sl-badge-danger-text: var(--sl-color-red-high);
23
+ }
package/lib/card.css ADDED
@@ -0,0 +1,42 @@
1
+ .sl-markdown-content .card-grid.stagger {
2
+ --stagger-height: 2.5rem;
3
+ }
4
+
5
+ .sl-markdown-content .card {
6
+ --sl-text-h1: var(--sl-text-4xl);
7
+ --sl-text-h2: var(--sl-text-3xl);
8
+ --sl-text-h3: var(--sl-text-2xl);
9
+ --sl-text-h4: var(--sl-text-xl);
10
+ --sl-text-h5: var(--sl-text-lg);
11
+
12
+ border-radius: 0.5rem;
13
+ padding: clamp(1rem, calc(0.125rem + 1.5vw), 2.5rem);
14
+ }
15
+
16
+ .sl-markdown-content .card .title .icon {
17
+ font-size: 1.875rem;
18
+ }
19
+
20
+ .sl-markdown-content .sl-link-card {
21
+ box-shadow: none;
22
+ }
23
+
24
+ .sl-markdown-content .sl-link-card:hover {
25
+ background: initial;
26
+ }
27
+
28
+ .sl-markdown-content .sl-link-card .title {
29
+ color: var(--sl-color-white);
30
+ }
31
+
32
+ .sl-markdown-content .sl-link-card .description {
33
+ color: var(--sl-color-gray-3);
34
+ }
35
+
36
+ .sl-markdown-content .sl-link-card:is(:hover, :focus-visible) .description {
37
+ color: var(--sl-color-gray-2);
38
+ }
39
+
40
+ .sl-markdown-content .sl-link-card .icon {
41
+ color: var(--sl-color-gray-2);
42
+ }
package/lib/shiki.css CHANGED
@@ -42,15 +42,23 @@
42
42
  }
43
43
 
44
44
  .line.highlighted {
45
- background-color: rgb(107 114 128 / 0.2) /* #6b7280 */;
45
+ background-color: var(--nano-color-highlight);
46
46
  }
47
47
 
48
48
  .line.diff.add {
49
- background-color: rgb(34 197 94 / 0.5) /* #22c55e */;
49
+ background-color: var(--sl-color-green-low);
50
50
  }
51
51
 
52
52
  .line.diff.remove {
53
- background-color: rgb(239 68 68 / 0.5) /* #ef4444 */;
53
+ background-color: var(--sl-color-red-low);
54
+ }
55
+
56
+ .highlighted-word {
57
+ border-radius: 0.25rem;
58
+ border-color: var(--sl-color-gray-5);
59
+ border-style: solid;
60
+ border-width: 1px;
61
+ padding: 0 0.125rem;
54
62
  }
55
63
  }
56
64
 
@@ -79,15 +87,3 @@ html[data-theme='dark'] .astro-code span {
79
87
  font-weight: var(--shiki-dark-font-weight);
80
88
  text-decoration: var(--shiki-dark-text-decoration);
81
89
  }
82
- /*
83
- .astro-code.twoslash .twoslash-popup-container {
84
- transform: translateY(1.8em);
85
- }
86
-
87
- .astro-code.twoslash .twoslash-query-presisted .twoslash-popup-container {
88
- transform: translateY(2.2em);
89
- }
90
-
91
- .astro-code.twoslash .twoslash-query-line .twoslash-popup-container {
92
- transform: translateY(1.3em);
93
- } */
package/lib/styles.css ADDED
@@ -0,0 +1,6 @@
1
+ @import './styles.gen.css';
2
+ @import './markdown.css';
3
+ @import './shiki.css';
4
+ @import './aside.css';
5
+ @import './badge.css';
6
+ @import './card.css';
@@ -23,6 +23,28 @@
23
23
  --sl-color-bg-inline-code: #1f2937;
24
24
  --sl-color-border-inline-code: #374151;
25
25
  --sl-color-bg-nav: color-mix(in srgb, #030712 50%, transparent);
26
+
27
+ --sl-color-orange-low: #451a03;
28
+ --sl-color-orange: #78350f;
29
+ --sl-color-orange-high: #fde68a;
30
+
31
+ --sl-color-green-low: #052e16;
32
+ --sl-color-green: #14532d;
33
+ --sl-color-green-high: #bbf7d0;
34
+
35
+ --sl-color-blue-low: #172554;
36
+ --sl-color-blue: #1e3a8a;
37
+ --sl-color-blue-high: #bfdbfe;
38
+
39
+ --sl-color-purple-low: #3b0764;
40
+ --sl-color-purple: #581c87;
41
+ --sl-color-purple-high: #e9d5ff;
42
+
43
+ --sl-color-red-low: #450a0a;
44
+ --sl-color-red: #7f1d1d;
45
+ --sl-color-red-high: #fecaca;
46
+
47
+ --nano-color-highlight: var(--sl-color-gray-5);
26
48
  }
27
49
 
28
50
  /* Light mode Starlight theme variables */
@@ -44,6 +66,28 @@
44
66
  --sl-color-bg-inline-code: #f3f4f6;
45
67
  --sl-color-border-inline-code: #d1d5db;
46
68
  --sl-color-bg-nav: color-mix(in srgb, #fff 80%, transparent);
69
+
70
+ --sl-color-orange-low: #fef3c7;
71
+ --sl-color-orange: #fbbf24;
72
+ --sl-color-orange-high: #92400e;
73
+
74
+ --sl-color-green-low: #dcfce7;
75
+ --sl-color-green: #4ade80;
76
+ --sl-color-green-high: #166534;
77
+
78
+ --sl-color-blue-low: #dbeafe;
79
+ --sl-color-blue: #60a5fa;
80
+ --sl-color-blue-high: #1e40af;
81
+
82
+ --sl-color-purple-low: #f3e8ff;
83
+ --sl-color-purple: #c084fc;
84
+ --sl-color-purple-high: #6b21a8;
85
+
86
+ --sl-color-red-low: #fee2e2;
87
+ --sl-color-red: #f87171;
88
+ --sl-color-red-high: #991b1b;
89
+
90
+ --nano-color-highlight: var(--sl-color-gray-6);
47
91
  }
48
92
 
49
93
  /* layer: shortcuts */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "starlight-theme-nova",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "description": "",
6
6
  "author": "ocavue <ocavue@gmail.com>",
7
7
  "license": "MIT",
@@ -34,16 +34,16 @@
34
34
  "shiki-twoslash-renderer": "0.0.2"
35
35
  },
36
36
  "devDependencies": {
37
- "@astrojs/starlight": "^0.32.3",
37
+ "@astrojs/starlight": "^0.32.5",
38
38
  "@iconify-json/bxl": "^1.2.2",
39
39
  "@iconify-json/logos": "^1.2.4",
40
- "@iconify-json/lucide": "^1.2.30",
40
+ "@iconify-json/lucide": "^1.2.34",
41
41
  "@iconify-json/tabler": "^1.2.17",
42
42
  "@ocavue/tsconfig": "^0.2.0",
43
43
  "@types/node": "^20.17.24",
44
44
  "@unocss/cli": "^66.0.0",
45
- "astro": "^5.5.3",
46
- "typescript": "^5.7.2",
45
+ "astro": "^5.5.6",
46
+ "typescript": "^5.8.2",
47
47
  "unocss": "^66.0.0",
48
48
  "unocss-preset-animations": "^1.1.1"
49
49
  },
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  import LanguageSelect from '@astrojs/starlight/components/LanguageSelect.astro'
3
- import Search from './Search.astro'
4
- import SiteTitle from './SiteTitle.astro'
5
- import SocialIcons from './SocialIcons.astro'
6
- import ThemeSelect from './ThemeSelect.astro'
3
+ import Search from 'virtual:starlight/components/Search'
4
+ import SiteTitle from 'virtual:starlight/components/SiteTitle'
5
+ import SocialIcons from 'virtual:starlight/components/SocialIcons'
6
+ import ThemeSelect from 'virtual:starlight/components/ThemeSelect'
7
7
 
8
8
  import options from 'virtual:starlight-theme-nova/user-config'
9
9
  const nav = options.nav ?? []
@@ -5,6 +5,18 @@ import Default from '@astrojs/starlight/components/Search.astro'
5
5
  <Default />
6
6
 
7
7
  <style is:global>
8
+ site-search {
9
+ & dialog {
10
+ background-color: var(--sl-color-bg);
11
+ }
12
+
13
+ & input:focus-visible {
14
+ outline-style: solid;
15
+ outline-width: 1px;
16
+ outline-color: var(--sl-color-accent);
17
+ }
18
+ }
19
+
8
20
  ::backdrop {
9
21
  --sl-color-backdrop-overlay: hsl(0 0 0% / 0.9);
10
22
  }
@@ -26,14 +38,14 @@ import Default from '@astrojs/starlight/components/Search.astro'
26
38
  }
27
39
 
28
40
  & dialog {
29
- animation-name: sl-ocavue-search-dialog-zoom-out;
41
+ animation-name: nova-search-dialog-zoom-out;
30
42
  animation-duration: 150ms;
31
43
  transform: translateZ(0);
32
44
  }
33
45
 
34
46
  & dialog[open] {
35
47
  animation-duration: 50ms;
36
- animation-name: sl-ocavue-search-dialog-zoom-in;
48
+ animation-name: nova-search-dialog-zoom-in;
37
49
  }
38
50
 
39
51
  & dialog::backdrop {
@@ -41,17 +53,17 @@ import Default from '@astrojs/starlight/components/Search.astro'
41
53
  backdrop-filter: none;
42
54
 
43
55
  animation-duration: 150ms;
44
- animation-name: sl-ocavue-search-backdrop-fade-out;
56
+ animation-name: nova-search-backdrop-fade-out;
45
57
  }
46
58
 
47
59
  & dialog[open]::backdrop {
48
60
  animation-duration: 50ms;
49
- animation-name: sl-ocavue-search-backdrop-fade-in;
61
+ animation-name: nova-search-backdrop-fade-in;
50
62
  }
51
63
  }
52
64
  }
53
65
 
54
- @keyframes sl-ocavue-search-backdrop-fade-in {
66
+ @keyframes nova-search-backdrop-fade-in {
55
67
  from {
56
68
  background-color: transparent;
57
69
  }
@@ -60,7 +72,7 @@ import Default from '@astrojs/starlight/components/Search.astro'
60
72
  }
61
73
  }
62
74
 
63
- @keyframes sl-ocavue-search-backdrop-fade-out {
75
+ @keyframes nova-search-backdrop-fade-out {
64
76
  from {
65
77
  background-color: var(--sl-color-backdrop-overlay);
66
78
  }
@@ -69,23 +81,23 @@ import Default from '@astrojs/starlight/components/Search.astro'
69
81
  }
70
82
  }
71
83
 
72
- :root {
73
- --sl-ocavue-search-dialog-zoom-scale: 1;
74
- --sl-ocavue-search-dialog-zoom-translate-y: 0;
84
+ site-search {
85
+ --nova-search-dialog-zoom-scale: 1;
86
+ --nova-search-dialog-zoom-translate-y: 0;
75
87
  }
76
88
 
77
89
  @media (min-width: 72rem) {
78
- :root {
79
- --sl-ocavue-search-dialog-zoom-scale: 0.95;
80
- --sl-ocavue-search-dialog-zoom-translate-y: -1rem;
90
+ site-search {
91
+ --nova-search-dialog-zoom-scale: 0.95;
92
+ --nova-search-dialog-zoom-translate-y: -1rem;
81
93
  }
82
94
  }
83
95
 
84
- @keyframes sl-ocavue-search-dialog-zoom-in {
96
+ @keyframes nova-search-dialog-zoom-in {
85
97
  from {
86
98
  opacity: 0;
87
- transform: scale(var(--sl-ocavue-search-dialog-zoom-scale))
88
- translateY(var(--sl-ocavue-search-dialog-zoom-translate-y));
99
+ transform: scale(var(--nova-search-dialog-zoom-scale))
100
+ translateY(var(--nova-search-dialog-zoom-translate-y));
89
101
  }
90
102
  to {
91
103
  opacity: 1;
@@ -93,15 +105,15 @@ import Default from '@astrojs/starlight/components/Search.astro'
93
105
  }
94
106
  }
95
107
 
96
- @keyframes sl-ocavue-search-dialog-zoom-out {
108
+ @keyframes nova-search-dialog-zoom-out {
97
109
  from {
98
110
  opacity: 1;
99
111
  transform: scale(1) translateY(0);
100
112
  }
101
113
  to {
102
114
  opacity: 0;
103
- transform: scale(var(--sl-ocavue-search-dialog-zoom-scale))
104
- translateY(var(--sl-ocavue-search-dialog-zoom-translate-y));
115
+ transform: scale(var(--nova-search-dialog-zoom-scale))
116
+ translateY(var(--nova-search-dialog-zoom-translate-y));
105
117
  }
106
118
  }
107
119
  </style>
package/src/index.ts CHANGED
@@ -36,9 +36,7 @@ export default function starlightThemeNova(
36
36
  const newConfig = {
37
37
  customCss: [
38
38
  // Including any user CSS *after* our own.
39
- 'starlight-theme-nova/styles.gen.css',
40
- 'starlight-theme-nova/shiki.css',
41
- 'starlight-theme-nova/markdown.css',
39
+ 'starlight-theme-nova/styles.css',
42
40
  ...(config.customCss || []),
43
41
  ],
44
42
  components: {
@@ -1,7 +1,9 @@
1
1
  import {
2
2
  transformerMetaHighlight,
3
+ transformerMetaWordHighlight,
3
4
  transformerNotationDiff,
4
5
  transformerNotationHighlight,
6
+ transformerNotationWordHighlight,
5
7
  } from '@shikijs/transformers'
6
8
  import { transformerTwoslash } from '@shikijs/twoslash'
7
9
  import type { ShikiTransformer } from '@shikijs/types'
@@ -12,9 +14,12 @@ import { transformerCopyButton } from './shiki-transformer-copy-button'
12
14
 
13
15
  export function createShikiConfig(options: { twoslash: boolean }): ShikiConfig {
14
16
  const transformers: ShikiTransformer[] = [
17
+ transformerMetaHighlight(),
18
+ transformerMetaWordHighlight(),
15
19
  transformerNotationDiff(),
16
20
  transformerNotationHighlight(),
17
- transformerMetaHighlight(),
21
+ transformerNotationWordHighlight(),
22
+
18
23
  transformerCopyButton(),
19
24
  options.twoslash
20
25
  ? transformerTwoslash({
@@ -4,3 +4,19 @@ declare module 'virtual:starlight-theme-nova/user-config' {
4
4
  const options: import('./user-options').ThemeNovaOptions
5
5
  export default options
6
6
  }
7
+ declare module 'virtual:starlight/components/Search' {
8
+ const Search: typeof import('./components/Search.astro').default
9
+ export default Search
10
+ }
11
+ declare module 'virtual:starlight/components/SiteTitle' {
12
+ const SiteTitle: typeof import('./components/SiteTitle.astro').default
13
+ export default SiteTitle
14
+ }
15
+ declare module 'virtual:starlight/components/SocialIcons' {
16
+ const SocialIcons: typeof import('./components/SocialIcons.astro').default
17
+ export default SocialIcons
18
+ }
19
+ declare module 'virtual:starlight/components/ThemeSelect' {
20
+ const ThemeSelect: typeof import('./components/ThemeSelect.astro').default
21
+ export default ThemeSelect
22
+ }