@astrojs/starlight 0.17.0 → 0.17.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @astrojs/starlight
2
2
 
3
+ ## 0.17.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1442](https://github.com/withastro/starlight/pull/1442) [`1a642e4`](https://github.com/withastro/starlight/commit/1a642e4d74ee4c30e85bce37b41888b1eae0544a) Thanks [@delucis](https://github.com/delucis)! - Fixes URLs in language picker for sites with `build.format: 'file'`
8
+
9
+ - [#1440](https://github.com/withastro/starlight/pull/1440) [`2ea1e88`](https://github.com/withastro/starlight/commit/2ea1e883186660b48f0ea8c4da7fead5fb74e313) Thanks [@hippotastic](https://github.com/hippotastic)! - Adds JS support to the `@astrojs/starlight/expressive-code` export to allow importing from non-TS environments.
10
+
11
+ ## 0.17.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [#1437](https://github.com/withastro/starlight/pull/1437) [`655aed4`](https://github.com/withastro/starlight/commit/655aed4840cae59e9abd64b4b585e60f1cfab209) Thanks [@hippotastic](https://github.com/hippotastic)! - Adds Starlight-specific types to `defineEcConfig` function and exports `StarlightExpressiveCodeOptions`.
16
+
17
+ This provides Starlight types and IntelliSense support for your Expressive Code configuration options inside an `ec.config.mjs` file. See the [Expressive Code documentation](https://expressive-code.com/key-features/code-component/#using-an-ecconfigmjs-file) for more information.
18
+
19
+ - [#1420](https://github.com/withastro/starlight/pull/1420) [`275f87f`](https://github.com/withastro/starlight/commit/275f87fd7fc676b9ab323354078c06894e0832c7) Thanks [@abdelhalimjean](https://github.com/abdelhalimjean)! - Fix rare `font-family` issue if users have a font installed with a name of `""`
20
+
21
+ - [#1365](https://github.com/withastro/starlight/pull/1365) [`a0af7cc`](https://github.com/withastro/starlight/commit/a0af7cc696da987a76edab96cdd2329779e87724) Thanks [@kevinzunigacuellar](https://github.com/kevinzunigacuellar)! - Correctly format Pagefind search result links when `trailingSlash: 'never'` is used
22
+
3
23
  ## 0.17.0
4
24
 
5
25
  ### Minor Changes
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import '@pagefind/default-ui/css/ui.css';
3
3
  import Icon from '../user-components/Icon.astro';
4
+ import project from 'virtual:starlight/project-context';
4
5
  import type { Props } from '../props';
5
6
 
6
7
  const { labels } = Astro.props;
@@ -15,7 +16,10 @@ const pagefindTranslations = {
15
16
  };
16
17
  ---
17
18
 
18
- <site-search data-translations={JSON.stringify(pagefindTranslations)}>
19
+ <site-search
20
+ data-translations={JSON.stringify(pagefindTranslations)}
21
+ data-strip-trailing-slash={project.trailingSlash === 'never'}
22
+ >
19
23
  <button data-open-modal disabled>
20
24
  {
21
25
  /* The span is `aria-hidden` because it is not shown on small screens. Instead, the icon label is used for accessibility purposes. */
@@ -112,10 +116,15 @@ const pagefindTranslations = {
112
116
  translations = JSON.parse(this.dataset.translations || '{}');
113
117
  } catch {}
114
118
 
119
+ const shouldStrip = this.dataset.stripTrailingSlash !== undefined;
120
+ const stripTrailingSlash = (path: string) => path.replace(/(.)\/(#.*)?$/, '$1$2');
121
+ const formatURL = shouldStrip ? stripTrailingSlash : (path: string) => path;
122
+
115
123
  window.addEventListener('DOMContentLoaded', () => {
116
124
  if (import.meta.env.DEV) return;
117
125
  const onIdle = window.requestIdleCallback || ((cb) => setTimeout(cb, 1));
118
126
  onIdle(async () => {
127
+ // @ts-expect-error — Missing types for @pagefind/default-ui package.
119
128
  const { PagefindUI } = await import('@pagefind/default-ui');
120
129
  new PagefindUI({
121
130
  element: '#starlight__search',
@@ -124,6 +133,13 @@ const pagefindTranslations = {
124
133
  showImages: false,
125
134
  translations,
126
135
  showSubResults: true,
136
+ processResult: (result: { url: string; sub_results: Array<{ url: string }> }) => {
137
+ result.url = formatURL(result.url);
138
+ result.sub_results = result.sub_results.map((sub_result) => {
139
+ sub_result.url = formatURL(sub_result.url);
140
+ return sub_result;
141
+ });
142
+ },
127
143
  });
128
144
  });
129
145
  });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @file This file provides the types for Starlight's `@astrojs/starlight/expressive-code` export.
3
+ */
4
+
5
+ export * from 'astro-expressive-code';
6
+
7
+ import type { StarlightExpressiveCodeOptions } from './integrations/expressive-code';
8
+
9
+ export type { StarlightExpressiveCodeOptions };
10
+
11
+ /**
12
+ * A utility function that helps you define an Expressive Code configuration object. It is meant
13
+ * to be used inside the optional config file `ec.config.mjs` located in the root directory
14
+ * of your Starlight project, and its return value to be exported as the default export.
15
+ *
16
+ * Expressive Code will automatically detect this file and use the exported configuration object
17
+ * to override its own default settings.
18
+ *
19
+ * Using this function is recommended, but not required. It just passes through the given object,
20
+ * but it also provides type information for your editor's auto-completion and type checking.
21
+ *
22
+ * @example
23
+ * ```js
24
+ * // ec.config.mjs
25
+ * import { defineEcConfig } from '@astrojs/starlight/expressive-code'
26
+ *
27
+ * export default defineEcConfig({
28
+ * themes: ['starlight-dark', 'github-light'],
29
+ * styleOverrides: {
30
+ * borderRadius: '0.5rem',
31
+ * },
32
+ * })
33
+ * ```
34
+ */
35
+ export function defineEcConfig(
36
+ config: StarlightExpressiveCodeOptions
37
+ ): StarlightExpressiveCodeOptions;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file This file is exported by Starlight as `@astrojs/starlight/expressive-code`.
3
+ *
4
+ * It is required by the `<Code>` component to access the same configuration preprocessor
5
+ * function as the one used by the integration.
6
+ *
7
+ * It also provides access to all of the Expressive Code classes and functions without having
8
+ * to install `astro-expressive-code` as an additional dependency into a user's project
9
+ * (and thereby risiking version conflicts).
10
+ *
11
+ * Note: This file is intentionally not a TypeScript module to allow access to all exported
12
+ * functionality even if TypeScript is not available, e.g. from the `ec.config.mjs` file
13
+ * that does not get processed by Vite.
14
+ */
15
+
16
+ export * from 'astro-expressive-code';
17
+
18
+ // @ts-ignore - Types are provided by the separate `expressive-code.d.ts` file
19
+ export function defineEcConfig(config) {
20
+ return config;
21
+ }
@@ -179,8 +179,7 @@ export const starlightExpressiveCode = ({
179
179
  }),
180
180
  preprocessComponentConfig: `
181
181
  import starlightConfig from 'virtual:starlight/user-config'
182
- import { useTranslations } from '@astrojs/starlight/internal'
183
- import { getStarlightEcConfigPreprocessor } from '@astrojs/starlight/expressive-code'
182
+ import { useTranslations, getStarlightEcConfigPreprocessor } from '@astrojs/starlight/internal'
184
183
 
185
184
  export default getStarlightEcConfigPreprocessor({ starlightConfig, useTranslations })
186
185
  `,
package/internal.ts CHANGED
@@ -1 +1,6 @@
1
+ /**
2
+ * @file This file contains utility functions imported by the `<Code>` component.
3
+ */
4
+
1
5
  export { useTranslations } from './utils/translations';
6
+ export { getStarlightEcConfigPreprocessor } from './integrations/expressive-code';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrojs/starlight",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Build beautiful, high-performance documentation websites with Astro",
5
5
  "keywords": [
6
6
  "docs",
@@ -154,7 +154,10 @@
154
154
  "./props": "./props.ts",
155
155
  "./schema": "./schema.ts",
156
156
  "./types": "./types.ts",
157
- "./expressive-code": "./integrations/expressive-code/exports.ts",
157
+ "./expressive-code": {
158
+ "types": "./expressive-code.d.ts",
159
+ "default": "./expressive-code.mjs"
160
+ },
158
161
  "./index.astro": "./index.astro",
159
162
  "./404.astro": "./404.astro",
160
163
  "./style/markdown.css": "./style/markdown.css"
@@ -165,9 +168,9 @@
165
168
  "devDependencies": {
166
169
  "@astrojs/markdown-remark": "^4.0.1",
167
170
  "@types/node": "^18.16.19",
168
- "@vitest/coverage-v8": "^0.33.0",
171
+ "@vitest/coverage-v8": "^1.2.2",
169
172
  "astro": "^4.2.1",
170
- "vitest": "^0.33.0"
173
+ "vitest": "^1.2.2"
171
174
  },
172
175
  "dependencies": {
173
176
  "@astrojs/mdx": "^2.0.4",
package/style/props.css CHANGED
@@ -87,8 +87,8 @@
87
87
  'Segoe UI Symbol', 'Noto Color Emoji';
88
88
  --sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
89
89
  'Courier New', monospace;
90
- --__sl-font: var(--sl-font, ''), var(--sl-font-system);
91
- --__sl-font-mono: var(--sl-font-mono, ''), var(--sl-font-system-mono);
90
+ --__sl-font: var(--sl-font, var(--sl-font-system)), var(--sl-font-system);
91
+ --__sl-font-mono: var(--sl-font-mono, var(--sl-font-system-mono)), var(--sl-font-system-mono);
92
92
 
93
93
  /** Key layout values */
94
94
  --sl-nav-height: 3.5rem;
@@ -17,14 +17,26 @@ export function localizedUrl(url: URL, locale: string | undefined): URL {
17
17
  // Temporarily remove base to simplify
18
18
  if (hasBase) url.pathname = url.pathname.replace(base, '');
19
19
  const [_leadingSlash, baseSegment] = url.pathname.split('/');
20
- if (baseSegment && baseSegment in config.locales) {
20
+ // Strip .html extension to handle file output builds where URL might be e.g. `/en.html`
21
+ const htmlExt = '.html';
22
+ const isRootHtml = baseSegment?.endsWith(htmlExt);
23
+ const baseSlug = isRootHtml ? baseSegment?.slice(0, -1 * htmlExt.length) : baseSegment;
24
+ if (baseSlug && baseSlug in config.locales) {
21
25
  // We’re in a localized route, substitute the new locale (or strip for root lang).
22
- url.pathname = locale
23
- ? url.pathname.replace(baseSegment, locale)
24
- : url.pathname.replace('/' + baseSegment, '');
26
+ if (locale) {
27
+ url.pathname = url.pathname.replace(baseSlug, locale);
28
+ } else if (isRootHtml) {
29
+ url.pathname = '/index.html';
30
+ } else {
31
+ url.pathname = url.pathname.replace('/' + baseSlug, '');
32
+ }
25
33
  } else if (locale) {
26
34
  // We’re in the root language. Inject the new locale if we have one.
27
- url.pathname = '/' + locale + url.pathname;
35
+ if (baseSegment === 'index.html') {
36
+ url.pathname = '/' + locale + '.html';
37
+ } else {
38
+ url.pathname = '/' + locale + url.pathname;
39
+ }
28
40
  }
29
41
  // Restore base
30
42
  if (hasBase) url.pathname = base + url.pathname;
@@ -1,38 +0,0 @@
1
- /**
2
- * @file This file is exported by Starlight as `@astrojs/starlight/expressive-code`
3
- * and can be used in your site's configuration to customize Expressive Code.
4
- *
5
- * It provides access to all of the Expressive Code classes and functions without having
6
- * to install `astro-expressive-code` as an additional dependency into your project
7
- * (and thereby risiking version conflicts).
8
- *
9
- * For example, you can use this to load custom themes from a JSONC file (JSON with comments)
10
- * that would otherwise be difficult to import, and pass them to the `themes` option:
11
- *
12
- * @example
13
- * ```js
14
- * // astro.config.mjs
15
- * import fs from 'node:fs';
16
- * import { defineConfig } from 'astro/config';
17
- * import starlight from '@astrojs/starlight';
18
- * import { ExpressiveCodeTheme } from '@astrojs/starlight/expressive-code';
19
- *
20
- * const jsoncString = fs.readFileSync(new URL(`./my-theme.jsonc`, import.meta.url), 'utf-8');
21
- * const myTheme = ExpressiveCodeTheme.fromJSONString(jsoncString);
22
- *
23
- * export default defineConfig({
24
- * integrations: [
25
- * starlight({
26
- * title: 'My Starlight site',
27
- * expressiveCode: {
28
- * themes: [myTheme],
29
- * },
30
- * }),
31
- * ],
32
- * });
33
- * ```
34
- */
35
-
36
- export * from 'astro-expressive-code';
37
-
38
- export { getStarlightEcConfigPreprocessor } from './index';