diff --git a/.gitignore b/.gitignore index 94fd26027..0ccb0b53f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,18 @@ dist/ .storybook-static/ coverage/ lib/ +# `lib/` above targets compiled build output, but is unanchored, so it also +# swallowed the Astro site's hand-written src/lib/ — leaving that source +# untracked and the package unbuildable from a fresh clone. +!packages/pharos-site-astro/src/lib/ packages/**/package-lock.json packages/pharos-site/public/ packages/pharos-site/.cache/ +packages/pharos-site-astro/.astro/ +# Brand-asset archives carried over from the Gatsby site's static/ directory. +# Nothing in the source or the built HTML links to them, so they are kept out of +# git history here rather than duplicating the ~7.4MB the Gatsby package tracks. +packages/pharos-site-astro/public/files/**/*.zip react-components/ packages/pharos/src/styles/**/*.ts packages/pharos/src/styles/_variables.scss diff --git a/.prettierignore b/.prettierignore index 3d9fe87a4..bd30b828a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,6 +9,19 @@ packages/pharos/custom-elements.json packages/**/package-lock.json packages/pharos-site/public/ packages/pharos-site/.cache/ +packages/pharos-site-astro/.astro/ +# Prettier is not safe on any MDX in this package. It rewrites MDX comment +# delimiters ({/* */} -> {/_ _/}), which produces invalid JSX and fails the +# build outright, and it reflows elements such as
  • /
    / onto several +# lines. MDX treats a tag whose content spans multiple lines as Markdown and +# wraps it in a generated

    , so a purely cosmetic reflow silently adds +# paragraph margins to the rendered page. +# +# This must match src/** and not just src/pages/**: the component pages moved +# to src/content/ in the collection refactor, and a src/pages-only glob left +# all 32 of them unprotected. {/* prettier-ignore */} is not an alternative -- +# prettier corrupts the marker's own delimiters before it can take effect. +packages/pharos-site-astro/src/**/*.mdx package.json package-lock.json .changeset/ diff --git a/.prettierrc.js b/.prettierrc.js index a85491c96..ada48fddc 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,7 @@ module.exports = { + // `.astro` has no built-in parser; without this prettier reports + // "No parser could be inferred" and silently formats none of them. + plugins: ['prettier-plugin-astro'], printWidth: 100, trailingComma: 'es5', tabWidth: 2, diff --git a/build-ignore.sh b/build-ignore.sh index 68caa1308..160c99b3c 100644 --- a/build-ignore.sh +++ b/build-ignore.sh @@ -12,5 +12,5 @@ then git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF packages/pharos/ .storybook/ package.json yarn.lock netlify.toml elif [ "$SITE_NAME" == "pharos" ] then - git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF packages/pharos-site/ package.json yarn.lock netlify.toml + git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF packages/pharos/ packages/pharos-site-astro/ package.json yarn.lock netlify.toml fi diff --git a/eslint.config.mjs b/eslint.config.mjs index b837e2154..1634a428f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,5 @@ import js from '@eslint/js'; +import astroPlugin from 'eslint-plugin-astro'; import reactPlugin from 'eslint-plugin-react'; import prettierPlugin from 'eslint-plugin-prettier'; import storybookPlugin from 'eslint-plugin-storybook'; @@ -12,6 +13,7 @@ const globalIgnores = [ 'packages/pharos/src/styles/**/*.ts', 'packages/pharos-site/public/', 'packages/pharos-site/.cache/', + 'packages/pharos-site-astro/.astro/', '**/dist/', '**/node_modules/', '**/*.css.ts', @@ -84,10 +86,30 @@ const tsxConfig = { }, }; +const astroConfig = [ + ...astroPlugin.configs.recommended, + ...astroPlugin.configs['jsx-a11y-recommended'], + { + files: ['**/*.astro'], + plugins: { + '@typescript-eslint': typeScriptEsLint, + }, + rules: { + // TypeScript resolves identifiers itself, and `no-undef` cannot see + // type-only names, so it only fires falsely in frontmatter. + 'no-undef': 'off', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + '@typescript-eslint/no-explicit-any': ['error'], + }, + }, +]; + export default [ { ignores: globalIgnores }, js.configs.recommended, pharosConfig, tsConfig, tsxConfig, + ...astroConfig, ]; diff --git a/lint-staged.config.js b/lint-staged.config.js index 3cbeb953a..fd6d53142 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,7 @@ module.exports = { 'packages/pharos/assets/icons/*.svg': [`svglint --ci`], '*.{ts,tsx,js,mjs}': ['eslint --fix'], + '*.astro': ['eslint --fix'], '*.{scss,css}': ['stylelint --fix'], '**/!(.changeset)/*.md': (filenames) => filenames.map((filename) => `yarn markdown-toc -i '${filename}'`), diff --git a/netlify.toml b/netlify.toml index 7de10e9e5..4247568bd 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,11 @@ +[build] + command = "yarn site-astro:build" + publish = "packages/pharos-site-astro/dist" + ignore = "bash ./build-ignore.sh" + +[build.environment] + NODE_VERSION = "24" + [[redirects]] from = "/storybook" to = "https://pharos-storybooks.netlify.app/main/" @@ -39,6 +47,3 @@ [headers.values] Access-Control-Allow-Origin = "*" X-Frame-Options = "SAMEORIGIN" - -[build] - ignore = "bash ./build-ignore.sh" diff --git a/package.json b/package.json index e6086a214..fd93824f8 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "build:tokens": "yarn workspace @ithaka/pharos build:tokens", "analyze": "yarn workspace @ithaka/pharos analyze", "format": "prettier packages/* --write", - "lint": "yarn lint:lit-analyzer && yarn lint:eslint && yarn lint:styles && yarn lint:icons", - "lint:eslint": "eslint 'packages/**/*.{ts,tsx,js,jsx,mjs}'", + "lint": "yarn lint:lit-analyzer && yarn lint:eslint && yarn lint:styles && yarn lint:icons && yarn lint:astro", + "lint:astro": "yarn workspace @ithaka/pharos-site-astro check", + "lint:eslint": "eslint 'packages/**/*.{ts,tsx,js,jsx,mjs,astro}'", "lint:lit-analyzer": "lit-analyzer 'packages/*/src/**/!(*.css|*.test).ts' --strict --rules.no-missing-import off --rules.no-unknown-tag-name off", "lint:styles": "stylelint 'packages/**/*.{scss,css}'", "lint:icons": "svglint --ci packages/pharos/assets/icons/*.svg", @@ -42,6 +43,13 @@ "site:develop": "yarn presite:develop && yarn workspace @ithaka/pharos-site develop", "site:serve": "yarn workspace @ithaka/pharos-site serve", "site:clean": "yarn workspace @ithaka/pharos-site clean", + "presite-astro:build": "yarn build:core", + "site-astro:build": "yarn presite-astro:build && yarn workspace @ithaka/pharos-site-astro build", + "presite-astro:develop": "yarn build:core", + "site-astro:develop": "yarn presite-astro:develop && yarn workspace @ithaka/pharos-site-astro develop", + "site-astro:serve": "yarn workspace @ithaka/pharos-site-astro preview", + "site-astro:check": "yarn workspace @ithaka/pharos-site-astro check", + "site-astro:clean": "yarn workspace @ithaka/pharos-site-astro clean", "release": "changeset publish", "prepare": "husky install" }, @@ -80,10 +88,12 @@ "@typescript-eslint/parser": "^8.67.0", "@vitejs/plugin-react": "^6.1.0", "all-contributors-cli": "^6.26.1", + "astro-eslint-parser": "^3.1.0", "concurrently": "^10.0.5", "cssnano": "^8.0.7", "eslint": "^10.9.0", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^3.1.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-lit": "^2.3.1", "eslint-plugin-prettier": "^5.5.6", @@ -102,6 +112,7 @@ "postcss-media-minmax": "^5.0.0", "postcss-preset-env": "^11.4.0", "prettier": "^3.9.6", + "prettier-plugin-astro": "0.14.1", "pretty-quick": "^4.2.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -113,6 +124,7 @@ "stylelint-scss": "^7.2.0", "svglint": "^4.2.1", "typescript": "^6.0.3", + "typescript-eslint": "^8.65.0", "vite": "^8.2.2" }, "resolutions": { diff --git a/packages/pharos-site-astro/MODERNIZATION.md b/packages/pharos-site-astro/MODERNIZATION.md new file mode 100644 index 000000000..df949df87 --- /dev/null +++ b/packages/pharos-site-astro/MODERNIZATION.md @@ -0,0 +1,935 @@ +# Astro site modernization backlog + +Work plan for making `packages/pharos-site-astro` follow Astro best practices. + +**Read this first if you are an agent picking this up cold.** It assumes no prior +context. Read `README.md` in this package before touching anything — it documents +several non-obvious constraints (minification-sensitive custom element +registration, whitespace handling around inline elements, MDX paragraph +wrapping) that will bite you otherwise. + +## Background + +This package is an Astro port of the Gatsby documentation site in +`packages/pharos-site`, added as a candidate replacement for Gatsby. The two +coexist so they can be compared side by side. + +The initial commit (`20b7ce2`) was a deliberate 1:1 reproduction of the Gatsby +site's rendered output. It was validated against the **live production site** by +diffing rendered text and full-page screenshots across all 62 routes. Parity was +the acceptance test, so the port prioritized matching output over idiomatic +Astro. Consequences that look like mistakes but are intentional: + +- Content was hand-written `.astro`, not Markdown. Item 5 below converted it: + 43 pages are MDX today, and the 20 that remain `.astro` are listed there with + the reason each stays. +- Typos, odd spacing, and malformed inline styles from the Gatsby source are + reproduced verbatim. +- 254 inline `style` attributes, because that is what the Gatsby components + emitted. + +This backlog undoes that where it no longer earns its keep. + +## The gating question + +**Is byte-for-byte parity with the Gatsby site still the acceptance test?** + +**Answered: no.** Pixel parity is retired. The standard is now "as close as +reasonable" — match the design intent, and treat a small rendered difference as +acceptable when it buys a real maintainability gain. + +Tier 2 and 3 are therefore unblocked. This does not license carelessness: +measure before and after, keep the copy identical unless a change is a +deliberate fix, and note anything that moves in the item's write-up. + +## Verifying your work + +```bash +yarn site-astro:check # type-check .astro files +yarn site-astro:build # full static build +yarn site-astro:develop # dev server +``` + +Use `yarn`, never `npm`. Run these from the repo root. + +For Tier 1 work, the build output should be byte-identical before and after. A +cheap way to confirm: + +```bash +yarn site-astro:build && cp -r packages/pharos-site-astro/dist /tmp/dist-before +# ...make changes... +yarn site-astro:build && diff -r /tmp/dist-before packages/pharos-site-astro/dist +``` + +--- + +## Tier 1 — parity-safe ✅ DONE + +All four items are complete. The build output was verified byte-identical to +the pre-change `dist/` (`diff -r`, all 63 pages), and the 11 design-token pages +were verified structurally identical to production — matching row counts, cell +counts, and pixel width/height for every table. + +### 1. Delete the empty `src/content/` directory ✅ + +Removed. + +### 2. Fix the positional coupling in `line-height.astro` ✅ + +`fontSizeMap` is now keyed by token name rather than paired by array index, and +throws on an unmapped token instead of silently rendering `undefined`. Adding, +removing or reordering a line-height token can no longer shift every row onto +the wrong font size. + +### 3. Consolidate the design-token tables ✅ + +Added `src/components/TokenRows.astro`, which renders the shared +`Token / Value / Example` `` and the row loop from a `rows` array. All +11 pages use it. The example cell — the one genuine variation — is passed per +row as an HTML string and emitted with `set:html`. + +Pages went from 624 to 453 lines (520 including the new component). Column +widths are a prop because the pages do not agree on them (40/30, 33/33/36, +40/40, and type-scale's four-column 25/20/25). + +The duplicated `comment?: string` interfaces were hoisted into +`src/lib/tokenFormat.ts` as `CommentedToken`, plus `ScaleToken` for the two +pages where `comment` is required. + +### 4. Add a nav-to-page assertion ✅ + +`src/lib/assertNavigation.ts` fails the build in both directions: a +`navigation.ts` entry with no matching page, and a page absent from +`navigation.ts`. Called once from `Sidenav.astro`. Explicit ordering is +preserved — the check only compares sets, it never derives order. + +Both directions were verified by deliberately introducing each failure. + +**Do not reach for `import.meta.glob` here.** The first attempt used it, and +because the sidenav renders on every page, it made every page a style +dependency of every other — each page's ` diff --git a/packages/pharos-site-astro/src/components/ColorCombos.astro b/packages/pharos-site-astro/src/components/ColorCombos.astro new file mode 100644 index 000000000..bd4e3db8d --- /dev/null +++ b/packages/pharos-site-astro/src/components/ColorCombos.astro @@ -0,0 +1,71 @@ +--- +/** Token lookups happen at build time, so no client JavaScript ships. */ +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import CrossOut from '@components/CrossOut.astro'; +import { toTitleCase, toSlug } from '@lib/textConvert'; + +interface Props { + colorNames: string[]; + crossout?: boolean; +} + +const { colorNames, crossout = false } = Astro.props; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const colors: Record = tokens.color; + +let width = '62px'; +switch (colorNames.length) { + case 3: + width = '54px'; + break; + default: + break; +} + +const getStyle = (name: string) => { + const normalizedName = toSlug(name); + let returnValue = colors[normalizedName].value; + if (!returnValue) { + returnValue = colors[normalizedName].base.value; + } + + if (!returnValue) { + console.error(`Couldn't locate value for token color '${name}'`); + return ''; + } + + let returnStyle = `background-color: ${returnValue};`; + if (name === 'White') returnStyle += ' box-shadow: inset 0 0 0 1px #EAE8E1;'; + return returnStyle; +}; + +const swatchStyle = (name: string) => `height: 100%; width: ${width}; ${getStyle(name)}`; + +let textDisplay = ''; +colorNames.forEach( + (name, i) => (textDisplay += `${name} ${i !== colorNames.length - 1 ? ' + ' : ''}`) +); +textDisplay = toTitleCase(textDisplay); +--- + +

    + { + crossout ? ( + +
    + {colorNames.map((name) => ( +
    + ))} +
    + + ) : ( +
    + {colorNames.map((name) => ( +
    + ))} +
    + ) + } + {textDisplay} +
    diff --git a/packages/pharos-site-astro/src/components/ColorGradients.astro b/packages/pharos-site-astro/src/components/ColorGradients.astro new file mode 100644 index 000000000..601bf7353 --- /dev/null +++ b/packages/pharos-site-astro/src/components/ColorGradients.astro @@ -0,0 +1,90 @@ +--- +/** The gradient list is computed at build time. */ +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import { toTitleCase, toSlug } from '@lib/textConvert'; + +interface Gradient { + first: string | string[]; + second: string | string[]; +} + +interface Props { + gradients: Gradient[]; +} + +const { gradients = [] } = Astro.props; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const colors: Record = tokens.color; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const getNestedObject = (nestedObj: Record, pathArr: string[]) => { + return pathArr.reduce( + (obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), + nestedObj + ); +}; + +const getColorName = (path: string[]) => { + return path.length === 2 + ? toTitleCase(path[path.length - 1].replace(/-/g, ' ')) + : toTitleCase( + path + .slice(path.length - 2) + .join(' ') + .replace(/ base+$/g, '') + .replace(/-/g, ' ') + ); +}; + +const gradientsToDisplay = gradients.map((gradient) => { + const firstColor = + typeof gradient.first === 'string' + ? colors[toSlug(gradient.first)] + : getNestedObject( + colors, + gradient.first.map((color) => toSlug(color)) + ); + + const secondColor = + typeof gradient.second === 'string' + ? colors[toSlug(gradient.second)] + : getNestedObject( + colors, + gradient.second.map((color) => toSlug(color)) + ); + + const gradientStyle = [ + `background: linear-gradient(to bottom right, ${firstColor.value} 55%, ${secondColor.value})`, + `border: ${ + firstColor.value === '#ffffff' || secondColor.value === '#ffffff' + ? '1px solid var(--pharos-color-marble-gray-80)' + : 'none' + }`, + ].join('; '); + + return { + style: gradientStyle, + label: `${getColorName(firstColor.path)} to ${getColorName(secondColor.path)}`, + }; +}); + +const containerStyle = [ + `grid-template-columns: repeat(${gradients.length}, min-content)`, + 'column-gap: var(--pharos-spacing-three-and-a-half-x)', + 'justify-content: space-between', +].join('; '); +--- + +
    + { + gradientsToDisplay.map((gradient) => ( +
    +
    +
    +
    {gradient.label}
    +
    +
    + )) + } +
    diff --git a/packages/pharos-site-astro/src/components/ColorSwatches.astro b/packages/pharos-site-astro/src/components/ColorSwatches.astro new file mode 100644 index 000000000..134e130c3 --- /dev/null +++ b/packages/pharos-site-astro/src/components/ColorSwatches.astro @@ -0,0 +1,150 @@ +--- +/** + * Colour conversions are evaluated at build time, so this component ships no + * client JavaScript. + */ +import { converter, parse, formatHex, formatHsl, formatRgb } from 'culori'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import { toTitleCase } from '@lib/textConvert'; + +interface Props { + filter: { key: string; value: string }; + noLabel?: boolean; + hexOnlyLabel?: boolean; + large?: boolean; + colorsPerRow?: number; + smallSpacing?: boolean; +} + +const { + filter, + large = false, + noLabel = false, + hexOnlyLabel = false, + colorsPerRow = 3, + smallSpacing = false, +} = Astro.props; + +interface ColorToken { + value: string; + path: string[]; + order: number; + [key: string]: unknown; +} + +const colors = tokens.color as unknown as Record>; + +const sortItems = (a: { order: number }, b: { order: number }) => { + if (a.order < b.order) return -1; + if (a.order > b.order) return 1; + return 0; +}; + +/** Converts a CSS colour to CMYK percentages. Ported verbatim. */ +function toCMYK(color: string) { + const toRgb = converter('rgb'); + const rgb = toRgb(color); + + if (!rgb) { + throw new Error(`Invalid color format: ${color}`); + } + + const { r, g, b } = rgb; + + if (r === 0 && g === 0 && b === 0) { + return { mode: 'cmyk', c: 0, m: 0, y: 0, k: 1 }; + } + + let computedC = 1 - r; + let computedM = 1 - g; + let computedY = 1 - b; + + const minCMY = Math.min(computedC, Math.min(computedM, computedY)); + computedC = Math.round(((computedC - minCMY) / (1 - minCMY)) * 100); + computedM = Math.round(((computedM - minCMY) / (1 - minCMY)) * 100); + computedY = Math.round(((computedY - minCMY) / (1 - minCMY)) * 100); + const computedK = Math.round(minCMY * 100); + + return { mode: 'cmyk', c: computedC, m: computedM, y: computedY, k: computedK }; +} + +const flattened = Object.keys(colors) + .filter((key) => key !== 'brand' && key !== 'base') + .map((color) => { + const entry = colors[color]; + const isNested = !('value' in entry); + return isNested + ? Object.keys(entry).map((name) => (entry as Record)[name]) + : (entry as ColorToken); + }); + +const filtered = (flattened.flat() as ColorToken[]).sort(sortItems).filter((item) => { + const values = (item?.[filter.key] as string | undefined)?.split(', '); + return values?.includes(filter.value); +}); + +const swatches = filtered.map((color) => { + const name = + color.path.length === 2 + ? color.path[color.path.length - 1] + : color.path.slice(color.path.length - 2).join(' '); + + const colorObject = parse(color.value); + if (!colorObject) { + throw new Error(`Invalid color value: ${color.value}`); + } + + return { + value: color.value, + border: color.value === '#ffffff' ? '1px solid var(--pharos-color-marble-gray-80)' : 'none', + label: toTitleCase(name.replace(/ base+$/g, '').replace('-', ' ')), + hex: formatHex(colorObject), + hsl: formatHsl(colorObject), + rgb: formatRgb(colorObject), + cmyk: toCMYK(color.value), + }; +}); + +const containerStyle = [ + `grid-template-columns: repeat(${colorsPerRow}, ${large ? 'min-content' : '0.25fr'})`, + large ? 'column-gap: var(--pharos-spacing-5-x)' : '', + smallSpacing ? 'column-gap: var(--pharos-spacing-one-and-a-half-x)' : '', +] + .filter(Boolean) + .join('; '); +--- + +
    + { + swatches.map((swatch) => ( +
    +
    + {!noLabel && ( +
    +
    {swatch.label}
    +
    + Hex - {swatch.hex} +
    + {!hexOnlyLabel && ( + <> +
    + HSL - {swatch.hsl} +
    +
    + RGB - {swatch.rgb} +
    +
    + CMYK - cmyk( + {`${swatch.cmyk.c}% ${swatch.cmyk.m}% ${swatch.cmyk.y}% ${swatch.cmyk.k}%`}) +
    + + )} +
    + )} +
    + )) + } +
    diff --git a/packages/pharos-site-astro/src/components/ColorTable.astro b/packages/pharos-site-astro/src/components/ColorTable.astro new file mode 100644 index 000000000..a8e476c76 --- /dev/null +++ b/packages/pharos-site-astro/src/components/ColorTable.astro @@ -0,0 +1,40 @@ +--- +/** Renders a colour token table body: the header row plus one row per token. */ +import { toTokenName, toOriginalTokenName } from '@lib/tokenFormat'; +import type { DesignToken } from '@lib/tokenFormat'; + +interface Props { + tokens: DesignToken[]; +} + +const { tokens } = Astro.props; +--- + + + + Token + Value + Example + + + + { + tokens.map((token) => { + const originalName = toOriginalTokenName(token); + return ( + + + {toTokenName(token.name)} + + + {originalName &&
    {originalName}
    } +
    {token.value}
    + + +
    + + + ); + }) + } + diff --git a/packages/pharos-site-astro/src/components/ColorTextSquares.astro b/packages/pharos-site-astro/src/components/ColorTextSquares.astro new file mode 100644 index 000000000..a263d1a50 --- /dev/null +++ b/packages/pharos-site-astro/src/components/ColorTextSquares.astro @@ -0,0 +1,62 @@ +--- +import { parse, formatHex } from 'culori'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import { toTitleCase, toSlug } from '@lib/textConvert'; + +interface Props { + bgName: string; + fgName: string; + text?: string; + showLabel?: boolean; +} + +const { bgName, fgName, text, showLabel = false } = Astro.props; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const colors: Record = tokens.color; + +const getColor = (name: string) => { + const normalizedName = toSlug(name); + + let returnValue = colors[normalizedName]?.value; + + const splitName = name.split(' '); + if (splitName.length === 3) { + const color = colors[toSlug(`${splitName[0]} ${splitName[1]}`)]; + returnValue = color[splitName[2]]?.value; + } + if (!returnValue) { + returnValue = colors[normalizedName]?.base.value; + } + if (!returnValue) { + console.error(`Couldn't locate value for token color '${name}'`); + return null; + } + return returnValue; +}; + +const getBgStyle = (name: string) => { + let returnStyle = `background-color: ${getColor(name)};`; + if (name === 'White') returnStyle += ' box-shadow: inset 0 0 0 1px #EAE8E1;'; + return returnStyle; +}; + +const getFgStyle = (name: string) => `color: ${getColor(name)};`; + +const hex = showLabel ? formatHex(parse(getColor(fgName))) : undefined; +--- + +
    +
    + + {toTitleCase(text || fgName)} + +
    + { + showLabel ? ( +
    + Hex - {hex} +
    + ) : null + } +
    diff --git a/packages/pharos-site-astro/src/components/ComponentExample.astro b/packages/pharos-site-astro/src/components/ComponentExample.astro new file mode 100644 index 000000000..e7ab73009 --- /dev/null +++ b/packages/pharos-site-astro/src/components/ComponentExample.astro @@ -0,0 +1,25 @@ +--- +import { toSlug } from '@lib/textConvert'; + +interface Props { + storyBookType: string; + componentTitle: string; +} + +const { storyBookType, componentTitle } = Astro.props; + +const url = `https://pharos.jstor.org/storybook/?path=/story/web-components_${storyBookType}-${toSlug( + componentTitle +)}--docs`; +--- + +Example +
    + +
    +
    +
    + + See live code examples in Storybook + +
    diff --git a/packages/pharos-site-astro/src/components/CrossOut.astro b/packages/pharos-site-astro/src/components/CrossOut.astro new file mode 100644 index 000000000..e4ac3f4a9 --- /dev/null +++ b/packages/pharos-site-astro/src/components/CrossOut.astro @@ -0,0 +1,45 @@ +--- +/** + * The diagonal line is sized from the rendered content, so the measurement runs + * in a small client-side script. + */ +--- + +
    +
    +
    + +
    +
    + + diff --git a/packages/pharos-site-astro/src/components/DosAndDonts.astro b/packages/pharos-site-astro/src/components/DosAndDonts.astro new file mode 100644 index 000000000..462af3b5c --- /dev/null +++ b/packages/pharos-site-astro/src/components/DosAndDonts.astro @@ -0,0 +1,48 @@ +--- +interface Props { + /** Renders the "Don'ts" variant when true, otherwise "Dos". */ + dont?: boolean; +} + +const { dont = false } = Astro.props; +--- + +
    +
    + +
    + { + dont ? ( + <> + + + Don'ts + + + ) : ( + <> + + + Dos + + + ) + } +
    +
    + +
    + + diff --git a/packages/pharos-site-astro/src/components/FontDisplay.astro b/packages/pharos-site-astro/src/components/FontDisplay.astro new file mode 100644 index 000000000..f70ce2399 --- /dev/null +++ b/packages/pharos-site-astro/src/components/FontDisplay.astro @@ -0,0 +1,37 @@ +--- +interface Props { + font: string; + title?: string; + dark?: boolean; + large?: boolean; + bold?: boolean; +} + +const { font, title, dark = false, large = false, bold = false } = Astro.props; + +const outerStyle = [ + `font-family: ${font}`, + `font-size: ${large ? '2rem' : '1.5rem'}`, + `font-weight: ${bold ? 'bold' : 'normal'}`, + 'margin-top: -0.5rem', + 'padding: 1rem', + `background-color: ${dark ? 'black' : 'transparent'}`, +].join('; '); +--- + +
    +
    +
    + { + title ? ( +
    + {title} +
    + ) : null + } +
    AaBbCcDdEeFfGgHhIiJjKkLlMm
    +
    NnOoPpQqRrSsTtUuVvWwXxYyZz
    +
    1234567890!@#$%^&*()+=?
    +
    +
    +
    diff --git a/packages/pharos-site-astro/src/components/Footer.astro b/packages/pharos-site-astro/src/components/Footer.astro new file mode 100644 index 000000000..50f80a874 --- /dev/null +++ b/packages/pharos-site-astro/src/components/Footer.astro @@ -0,0 +1,113 @@ +--- +import logoWhite from '@images/footer/logo-white.svg'; + +const currentYear = new Date().getFullYear(); +--- + +
    + +
    + + JSTOR Logo + +
    +
    +
      +
    • + + Changelog + +
    • +
    • + + Web Components Storybook + +
    • +
    • + + React Storybook + +
    • +
    +
    +
    +
      +
    • + + About JSTOR + +
    • + +
    • + + Cookie settings + +
    • +
    +
    +
    + Have questions? +
    + + Email us + or + open an issue on GitHub + . +
    +
    + + + This site is powered by + Netlify + + +
    +
    + + diff --git a/packages/pharos-site-astro/src/components/Grid.astro b/packages/pharos-site-astro/src/components/Grid.astro new file mode 100644 index 000000000..4caff8e9b --- /dev/null +++ b/packages/pharos-site-astro/src/components/Grid.astro @@ -0,0 +1,38 @@ +--- +interface Props { + columns?: number; + vSpace?: number; + hSpace?: number; + bottom?: number; + align?: string; + justify?: string; + minContent?: boolean; + justifyContent?: string; +} + +const { + columns = 2, + vSpace = 1.5, + hSpace = 1.5, + bottom = 5, + align = 'stretch', + justify, + minContent = false, + justifyContent = 'normal', +} = Astro.props; + +const style = [ + 'display: grid', + `column-gap: ${hSpace}rem`, + `row-gap: ${vSpace}rem`, + `grid-template-columns: repeat(${columns}, ${minContent ? 'min-content' : '1fr'})`, + `margin-bottom: ${bottom}rem`, + `align-items: ${align}`, + justify ? `justify-items: ${justify}` : '', + `justify-content: ${justifyContent}`, +] + .filter(Boolean) + .join('; '); +--- + +
    diff --git a/packages/pharos-site-astro/src/components/IconsDisplay.astro b/packages/pharos-site-astro/src/components/IconsDisplay.astro new file mode 100644 index 000000000..13cf0cea7 --- /dev/null +++ b/packages/pharos-site-astro/src/components/IconsDisplay.astro @@ -0,0 +1,33 @@ +--- +/** Renders the icon list directly through the Pharos web components. */ +interface Props { + title: string; + iconsToShow: string[]; + rows: number; +} + +const { title, iconsToShow, rows } = Astro.props; + +const icons = iconsToShow + .filter((name) => iconsToShow.includes(name)) + .map((name) => ({ + name, + displayName: name.replace('-', ' ').replace(/\w\S*/g, (txt: string) => txt.toLowerCase()), + })); +--- + +
    +

    {title}

    +
    +
    + { + icons.map((item) => ( +
    +
    + +
    +
    {item.displayName}
    +
    + )) + } +
    diff --git a/packages/pharos-site-astro/src/components/PageSection.astro b/packages/pharos-site-astro/src/components/PageSection.astro new file mode 100644 index 000000000..b76105174 --- /dev/null +++ b/packages/pharos-site-astro/src/components/PageSection.astro @@ -0,0 +1,57 @@ +--- +import ComponentExample from '@components/ComponentExample.astro'; + +/* + * Sub-section headings are `markdown/Heading.astro`'s job — it maps `###`, + * `####` and `#####` to their own level and preset. This component covers only + * the top-level section heading, so it takes no nesting depth. + */ +interface Props { + title: string; + description?: string; + isHeader?: boolean; + moreTitleSpace?: boolean; + storyBookType?: string; +} + +const { title, description, isHeader = false, moreTitleSpace = false, storyBookType } = Astro.props; + +const heading = isHeader ? { level: '1', preset: '7--bold' } : { level: '2', preset: '6' }; + +const titleClass = isHeader + ? 'section__title--is-header' + : moreTitleSpace + ? 'section__title--more-space' + : undefined; + +const descriptionClass = isHeader ? 'section__description--is-header' : 'section__description'; +--- + +
    +
    + + {title} + +
    + { + /* + * Plain text comes through the `description` prop; richer markup (links, + * inline code) uses the `description` slot instead. + */ + (description || Astro.slots.has('description')) && ( +
    + {description} + +
    + ) + } + { + storyBookType ? ( + + + + ) : ( + + ) + } +
    diff --git a/packages/pharos-site-astro/src/components/Sidenav.astro b/packages/pharos-site-astro/src/components/Sidenav.astro new file mode 100644 index 000000000..721321c14 --- /dev/null +++ b/packages/pharos-site-astro/src/components/Sidenav.astro @@ -0,0 +1,145 @@ +--- +import { siteMetadata } from '@lib/siteMetadata'; +import { toSlug } from '@lib/textConvert'; +import { + brandExpressionPages, + componentPages, + contentStyleGuidePages, + contributingPages, + designTokenPages, + stylePages, +} from '@lib/navigation'; +import { assertNavigationMatchesPages } from '@lib/assertNavigation'; + +interface Props { + /** Current path, used to derive active/expanded state at build time. */ + pathname: string; +} + +const { pathname } = Astro.props; + +/** Normalizes away any trailing slash so `/help/` and `/help` compare equal. */ +const normalize = (path: string) => (path.length > 1 ? path.replace(/\/+$/, '') : path); + +const currentPath = normalize(pathname); + +const isActive = (href: string) => currentPath === normalize(href); +const isExpanded = (root: string) => currentPath.startsWith(`/${root}`); + +/** + * Fails the build if `navigation.ts` and `src/pages` disagree — a nav entry + * with no page, or a page nothing links to. + */ +assertNavigationMatchesPages(); + +const sectionLinks = (root: string, pages: readonly string[]) => + pages.map((page) => ({ label: page, href: `/${root}/${toSlug(page)}` })); +--- + + + +
    +
    {siteMetadata.title}
    +
    {siteMetadata.subtitle}
    +
    +
    + + + + Getting started + + + Help + + + FAQs + + + { + sectionLinks('contributing', contributingPages).map(({ label, href }) => ( + + {label} + + )) + } + + + GitHub + + + JSTOR + + + + + + { + sectionLinks('brand-expressions', brandExpressionPages).map(({ label, href }) => ( + + {label} + + )) + } + + + { + sectionLinks('content-style-guide', contentStyleGuidePages).map(({ label, href }) => ( + + {label} + + )) + } + + + + + + { + sectionLinks('components', componentPages).map(({ label, href }) => ( + + {label} + + )) + } + + + { + sectionLinks('design-tokens', designTokenPages).map(({ label, href }) => ( + + {label} + + )) + } + + + { + sectionLinks('styles', stylePages).map(({ label, href }) => ( + + {label} + + )) + } + + +
    diff --git a/packages/pharos-site-astro/src/components/TokenRows.astro b/packages/pharos-site-astro/src/components/TokenRows.astro new file mode 100644 index 000000000..9a06f3c57 --- /dev/null +++ b/packages/pharos-site-astro/src/components/TokenRows.astro @@ -0,0 +1,53 @@ +--- +/** + * Renders the `thead` and `tbody` shared by the seven design-token tables. + */ +import { toTokenName } from '@lib/tokenFormat'; + +export interface TokenRow { + /** Token name, rendered through `toTokenName` into the first cell. */ + name: string; + /** Second-cell content as HTML. */ + value: string; + /** Remaining cells as HTML, one entry per example column. */ + examples: string[]; +} + +interface Props { + rows: TokenRow[]; + /** Header labels after `Token` and `Value`. */ + exampleHeadings?: string[]; + /** Inline `width` for each column, in order. Empty string means unset. */ + columnWidths?: string[]; +} + +const { rows, exampleHeadings = ['Example'], columnWidths = ['40%', '30%'] } = Astro.props; + +const headings = ['Token', 'Value', ...exampleHeadings]; +--- + + + + { + headings.map((heading, i) => { + const width = columnWidths[i]; + return width ? {heading} : {heading}; + }) + } + + + + { + rows.map((row) => ( + + + {toTokenName(row.name)} + + + {row.examples.map((example) => ( + + ))} + + )) + } + diff --git a/packages/pharos-site-astro/src/components/TokenTable.astro b/packages/pharos-site-astro/src/components/TokenTable.astro new file mode 100644 index 000000000..c608d217d --- /dev/null +++ b/packages/pharos-site-astro/src/components/TokenTable.astro @@ -0,0 +1,22 @@ +--- +interface Props { + title?: string; + subtitle?: string; +} + +const { title, subtitle } = Astro.props; +--- + +
    + { + title && ( + + {title} + + ) + } + {subtitle &&
    {subtitle}
    } +
    +
    +
    +
    diff --git a/packages/pharos-site-astro/src/components/markdown/DemoScript.astro b/packages/pharos-site-astro/src/components/markdown/DemoScript.astro new file mode 100644 index 000000000..ce715eccd --- /dev/null +++ b/packages/pharos-site-astro/src/components/markdown/DemoScript.astro @@ -0,0 +1,21 @@ +--- +/** + * Wraps a page's demo ` + + + + + + + diff --git a/packages/pharos-site-astro/src/layouts/MarkdownLayout.astro b/packages/pharos-site-astro/src/layouts/MarkdownLayout.astro new file mode 100644 index 000000000..bee3b62b0 --- /dev/null +++ b/packages/pharos-site-astro/src/layouts/MarkdownLayout.astro @@ -0,0 +1,28 @@ +--- +/** + * Layout for Markdown/MDX docs pages. Wraps the site and maps the + * frontmatter Astro passes in to the Layout props. + */ +import Layout from '@layouts/Layout.astro'; +import Heading from '@components/markdown/Heading.astro'; + +import '../styles/markdown.css'; + +interface Props { + frontmatter: { + title: string; //Feeds both the `` tag and the page's `<h1>` + description?: string; //The standfirst, and the meta description. + }; +} + +const { frontmatter } = Astro.props; +const { title, description } = frontmatter; +--- + +<Layout title={title} description={description}> + <Heading depth={1}>{title}</Heading> + {description && <div class="md-lede">{description}</div>} + <div class="md-body"> + <slot /> + </div> +</Layout> diff --git a/packages/pharos-site-astro/src/lib/assertNavigation.ts b/packages/pharos-site-astro/src/lib/assertNavigation.ts new file mode 100644 index 000000000..92cce6335 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/assertNavigation.ts @@ -0,0 +1,114 @@ +/** + * Build-time consistency check between `navigation.ts` and the site's pages — + * both the routes under `src/pages` and the entries of each content collection. + * A nav entry with no page would link to a 404; a page absent from the nav is + * reachable only by direct URL. Both are build failures here. + + */ +import { readdirSync } from 'node:fs'; +import { join } from 'node:path'; + +import { toSlug } from './textConvert'; +import { + brandExpressionPages, + componentPages, + contentStyleGuidePages, + contributingPages, + designTokenPages, + stylePages, +} from './navigation'; + +/** + * Resolved from the working directory, not `import.meta.url`: this module is + * bundled into `dist/.prerender/` before it runs, so a self-relative URL points + * at the build output. Both `astro build` and `astro dev` run from the root. + */ +const PAGES_DIR = join(process.cwd(), 'src', 'pages'); + +/** Collections are not routes on disk, so `PAGES_DIR` cannot see them. */ +const CONTENT_DIR = join(process.cwd(), 'src', 'content'); + +/** Collection directory -> the URL prefix its `[...slug]` route renders at. */ +const collectionRoots: Record<string, string> = { components: '/components' }; + +/** Hrefs rendered by the sidenav that are not derived from `navigation.ts`. */ +const standaloneHrefs = ['/getting-started', '/help', '/faqs']; + +/** + * Pages that are deliberately not in the sidenav: `/` is the home page, linked + * from the logo, and `/404` is never linked. + */ +const unlinkedByDesign = new Set(['/', '/404']); + +const sections: [string, readonly string[]][] = [ + ['contributing', contributingPages], + ['brand-expressions', brandExpressionPages], + ['content-style-guide', contentStyleGuidePages], + ['components', componentPages], + ['design-tokens', designTokenPages], + ['styles', stylePages], +]; + +/** Every routable page under `src/pages`, as an href. */ +const collectPageHrefs = (dir = PAGES_DIR, prefix = ''): string[] => + readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + if (entry.isDirectory()) { + return collectPageHrefs(join(dir, entry.name), `${prefix}/${entry.name}`); + } + if (!/\.(astro|mdx)$/.test(entry.name)) { + return []; + } + const base = entry.name.replace(/\.(astro|mdx)$/, ''); + /* + * A `[...slug]` route renders a collection rather than being a page itself; + * its entries come from `collectCollectionHrefs`. Counting the route file + * would add a literal `/components/[...slug]` href nothing can match. + */ + if (base.startsWith('[')) { + return []; + } + return [base === 'index' ? prefix || '/' : `${prefix}/${base}`]; + }); + +/** + * Every collection entry, as the href its `[...slug]` route renders it at. + * Separate from `collectPageHrefs` because the mapping differs: a page's href + * follows its path on disk, an entry's is its slug appended to its route. + */ +const collectCollectionHrefs = (): string[] => + Object.entries(collectionRoots).flatMap(([dir, root]) => + readdirSync(join(CONTENT_DIR, dir), { withFileTypes: true }) + .filter((entry) => entry.isFile() && /\.mdx?$/.test(entry.name)) + .map((entry) => `${root}/${entry.name.replace(/\.mdx?$/, '')}`) + ); + +/** Throws if the nav and the pages disagree. Called from `Sidenav.astro`. */ +export const assertNavigationMatchesPages = (): void => { + const pageHrefs = new Set([...collectPageHrefs(), ...collectCollectionHrefs()]); + + const navHrefs = new Set([ + ...standaloneHrefs, + ...sections.flatMap(([root, pages]) => pages.map((page) => `/${root}/${toSlug(page)}`)), + ]); + + const missing = [...navHrefs].filter((href) => !pageHrefs.has(href)); + if (missing.length > 0) { + throw new Error( + `navigation.ts lists ${missing.length} entr${missing.length === 1 ? 'y' : 'ies'} ` + + `with no matching page under src/pages, so the sidenav would link to a 404: ` + + `${missing.sort().join(', ')}.` + ); + } + + const orphans = [...pageHrefs].filter( + (href) => !navHrefs.has(href) && !unlinkedByDesign.has(href) + ); + if (orphans.length > 0) { + throw new Error( + `${orphans.length} page(s) exist under src/pages but are absent from ` + + `navigation.ts, so nothing links to them: ${orphans.sort().join(', ')}. ` + + `Add them to navigation.ts (order there is the sidenav order), or add them ` + + `to unlinkedByDesign in src/lib/assertNavigation.ts if that is intended.` + ); + } +}; diff --git a/packages/pharos-site-astro/src/lib/codeTheme.ts b/packages/pharos-site-astro/src/lib/codeTheme.ts new file mode 100644 index 000000000..dc97520b6 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/codeTheme.ts @@ -0,0 +1,73 @@ +import nightOwl from '@shikijs/themes/night-owl'; +import type { ThemeRegistration } from 'shiki'; + +/** + * The `night-owl` theme with import/export keywords restyled to match the legacy site's + * code blocks + */ +const KEYWORDS = ['import', 'export', 'from', 'as', 'default']; +const LANGUAGES = ['tsx', 'ts', 'js', 'jsx', 'html']; + +const codeTheme: ThemeRegistration = { + ...nightOwl, + name: 'night-owl-pharos-site', + tokenColors: [ + ...(nightOwl.tokenColors ?? []), + { + scope: LANGUAGES.flatMap((lang) => + KEYWORDS.map((keyword) => `keyword.control.${keyword}.${lang}`) + ), + settings: { + fontStyle: '', + foreground: '#7fdbca', + }, + }, + /* + * Shell snippets (`yarn add @ithaka/pharos`) are highlighted as TSX, + * These restore the intended decorator colouring. + */ + { + scope: LANGUAGES.flatMap((lang) => [ + `punctuation.decorator.${lang}`, + `meta.decorator.${lang} keyword.operator.arithmetic.${lang}`, + ]), + settings: { + fontStyle: '', + foreground: '#7fdbca', + }, + }, + { + scope: LANGUAGES.map((lang) => `meta.decorator.${lang} variable.other.readwrite.${lang}`), + settings: { + fontStyle: '', + foreground: '#82aaff', + }, + }, + /* + * Markup snippets, also highlighted as TSX rather than HTML + */ + { + scope: LANGUAGES.flatMap((lang) => [ + `punctuation.definition.tag.begin.${lang}`, + `punctuation.definition.tag.end.${lang}`, + `punctuation.definition.string.begin.${lang}`, + `punctuation.definition.string.end.${lang}`, + ]), + settings: { fontStyle: '', foreground: '#c792ea' }, + }, + { + scope: LANGUAGES.flatMap((lang) => [ + `entity.name.tag.${lang}`, + `meta.tag.attributes.${lang} string.quoted.double.${lang}`, + `meta.tag.attributes.${lang} string.quoted.single.${lang}`, + ]), + settings: { fontStyle: '', foreground: '#7fdbca' }, + }, + { + scope: LANGUAGES.map((lang) => `entity.other.attribute-name.${lang}`), + settings: { fontStyle: 'italic', foreground: '#addb67' }, + }, + ], +}; + +export default codeTheme; diff --git a/packages/pharos-site-astro/src/lib/initComponents.ts b/packages/pharos-site-astro/src/lib/initComponents.ts new file mode 100644 index 000000000..7f76bbb91 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/initComponents.ts @@ -0,0 +1,106 @@ +import '@webcomponents/scoped-custom-element-registry'; +// @ts-ignore - import is valid at build and runtime, where Vite resolves it against the built package. +import * as pharos from '@ithaka/pharos/lib/index'; +import type { LitElement } from 'lit'; + +/** + * The Pharos component exports to register, by export name. + */ +const COMPONENT_NAMES = [ + 'PharosAlert', + 'PharosBreadcrumb', + 'PharosBreadcrumbItem', + 'PharosButton', + 'PharosCheckbox', + 'PharosCheckboxGroup', + 'PharosCoachMark', + 'PharosCombobox', + 'PharosDropdownMenu', + 'PharosDropdownMenuItem', + 'PharosDropdownMenuNav', + 'PharosDropdownMenuNavLink', + 'PharosDropdownMenuNavCategory', + 'PharosFooter', + 'PharosHeader', + 'PharosHeading', + 'PharosIcon', + 'PharosImageCard', + 'PharosInputGroup', + 'PharosInputGroupSelect', + 'PharosLayout', + 'PharosLink', + 'PharosLoadingSpinner', + 'PharosModal', + 'PharosMultiselectDropdown', + 'PharosPagination', + 'PharosPill', + 'PharosPopover', + 'PharosProgressBar', + 'PharosRadioButton', + 'PharosRadioGroup', + 'PharosSelect', + 'PharosSheet', + 'PharosSidenav', + 'PharosSidenavLink', + 'PharosSidenavMenu', + 'PharosSidenavSection', + 'PharosSwitch', + 'PharosTabs', + 'PharosTab', + 'PharosTable', + 'PharosTabPanel', + 'PharosTextInput', + 'PharosTextarea', + 'PharosToast', + 'PharosToaster', + 'PharosToastButton', + 'PharosToggleButton', + 'PharosToggleButtonGroup', + 'PharosTooltip', +] as const; + +const PREFIX = 'site'; + +/** `PharosDropdownMenuNav` -> `pharos-dropdown-menu-nav`, matching Pharos. */ +const toTagName = (exportName: string): string => + exportName + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/[\s_]+/g, '-') + .toLowerCase(); + +const componentExports = pharos as unknown as Record<string, typeof LitElement | undefined>; + +/** + * Registers the Pharos custom elements under the `site` prefix, so markup such + * as `<site-pharos-button>` resolves. + */ +const registerPharosComponents = (): void => { + for (const exportName of COMPONENT_NAMES) { + const component = componentExports[exportName]; + if (!component) { + continue; + } + + const tagName = `${PREFIX}-${toTagName(exportName)}`; + if (customElements.get(tagName)) { + continue; + } + + // `data-pharos-component` is a styling hook (see global.scss) that Pharos + // stamps from the class `name`, so it is set from the export name here for + // the same minification reason the tag name is. + customElements.define( + tagName, + class extends component { + override connectedCallback(): void { + super.connectedCallback?.(); + this.dataset.pharosComponent = exportName; + } + } + ); + } +}; + +registerPharosComponents(); + +export default registerPharosComponents; diff --git a/packages/pharos-site-astro/src/lib/navigation.ts b/packages/pharos-site-astro/src/lib/navigation.ts new file mode 100644 index 000000000..aeaeea92b --- /dev/null +++ b/packages/pharos-site-astro/src/lib/navigation.ts @@ -0,0 +1,80 @@ +/** + * The site navigation. Order is significant — it is the order links appear in + * the sidenav. + */ + +export const contributingPages = ['Documentation', 'Development'] as const; + +export const brandExpressionPages = [ + 'Logos', + 'Typography', + 'Color', + 'Imagery', + 'Iconography', + 'Elevation', +] as const; + +export const contentStyleGuidePages = [ + 'Voice and tone', + 'JSTOR terms', + 'Web elements', + 'Grammar and style', + 'Editing checklist', +] as const; + +export const componentPages = [ + 'Alert', + 'Button', + 'Breadcrumb', + 'Checkbox', + 'Checkbox group', + 'Coach Mark', + 'Combobox', + 'Dropdown menu', + 'Dropdown menu nav', + 'Footer', + 'Header', + 'Heading', + 'Icon', + 'Image card', + 'Input group', + 'Layout', + 'Link', + 'Loading spinner', + 'Modal', + 'Multiselect dropdown', + 'Pagination', + 'Pill', + 'Popover', + 'Progress bar', + 'Radio button', + 'Radio group', + 'Select', + 'Sheet', + 'Sidenav', + 'Switch', + 'Table', + 'Tabs', + 'Toast', + 'Tooltip', + 'Text input', + 'Textarea', + 'Toggle button group', +] as const; + +export const designTokenPages = [ + 'Overview', + 'Alias colors', + 'Global colors', + 'Font family', + 'Font size', + 'Font weight', + 'Line height', + 'Elevation', + 'Radius', + 'Spacing', + 'Transitions', + 'Type scale', +] as const; + +export const stylePages = ['Type styles'] as const; diff --git a/packages/pharos-site-astro/src/lib/rehypeUnwrapPharosParagraphs.ts b/packages/pharos-site-astro/src/lib/rehypeUnwrapPharosParagraphs.ts new file mode 100644 index 000000000..49faf2952 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/rehypeUnwrapPharosParagraphs.ts @@ -0,0 +1,66 @@ +/** + * Removes the `<p>` CommonMark puts around a Pharos element's content. + * + * Written naturally, a demo reads + * + * <site-pharos-button large> + * Large primary button + * </site-pharos-button> + * + * and CommonMark treats that indented run of text as a paragraph, so the output + * is `<site-pharos-button><p>Large primary button</p></site-pharos-button>`. + * + * That is not configurable. It is core Markdown semantics, and neither Astro's + * `markdown` options nor the MDX integration exposes a switch for it. The only + * alternative is to keep every element's content on the same line as its tag. + * + * Only a *lone* paragraph is unwrapped — an element whose body is genuinely + * several paragraphs keeps them. + */ +import type { Root, RootContent } from 'hast'; + +type MdxJsxNode = { + type: 'mdxJsxFlowElement' | 'mdxJsxTextElement'; + name?: string | null; + children: RootContent[]; +}; + +type Parent = Root | MdxJsxNode | (RootContent & { children?: RootContent[] }); + +const isMdxJsx = (node: unknown): node is MdxJsxNode => + typeof node === 'object' && + node !== null && + ((node as { type?: string }).type === 'mdxJsxFlowElement' || + (node as { type?: string }).type === 'mdxJsxTextElement'); + +const isPharos = (node: unknown): boolean => + isMdxJsx(node) && typeof node.name === 'string' && node.name.startsWith('site-pharos-'); + +/** Whitespace-only text between tags is formatting, not content. */ +const isInsignificant = (node: RootContent): boolean => + node.type === 'text' && node.value.trim() === ''; + +/** Exclude any`p` the has a class, it can't be something added automatically. */ +const isBareParagraph = (node: RootContent): boolean => + node.type === 'element' && node.tagName === 'p' && !node.properties?.className; + +export const rehypeUnwrapPharosParagraphs = () => (tree: Root) => { + const visit = (node: Parent): void => { + const children = (node as { children?: RootContent[] }).children; + if (!Array.isArray(children)) return; + + for (const child of children) visit(child as Parent); + + if (!isPharos(node)) return; + + const significant = children.filter((c) => !isInsignificant(c)); + if (significant.length !== 1) return; + + const [only] = significant; + if (isBareParagraph(only)) { + (node as MdxJsxNode).children = (only as { children: RootContent[] }).children; + } + }; + + visit(tree); +}; diff --git a/packages/pharos-site-astro/src/lib/siteMetadata.ts b/packages/pharos-site-astro/src/lib/siteMetadata.ts new file mode 100644 index 000000000..f859dc554 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/siteMetadata.ts @@ -0,0 +1,30 @@ +export const siteMetadata = { + title: 'Pharos', + subtitle: `JSTOR's Design System`, + description: + 'The Pharos design system is our guiding light toward creating cohesive, supportive, and beautiful experiences for the intellectually curious.', + author: '@jstor', + image: { + path: '/images/pharos-orb.png', + height: '1000', + width: '1700', + }, + siteUrl: 'https://pharos.jstor.org', +} as const; + +/** + * Normalizes a build-time pathname to the URL visitors actually see. + * + * `build.format: 'file'` emits `/help.html`, so `Astro.url.pathname` carries a + * `.html` suffix during the build while the site is served at `/help`. Stripping + * it (and any trailing slash) keeps sidenav active state and canonical URLs + * pointing at the served paths. + */ +export const toCleanPath = (pathname: string): string => { + const withoutHtml = pathname.replace(/\.html$/, ''); + const withoutIndex = withoutHtml.replace(/\/index$/, '/'); + const trimmed = withoutIndex.length > 1 ? withoutIndex.replace(/\/+$/, '') : withoutIndex; + return trimmed === '' ? '/' : trimmed; +}; + +export default siteMetadata; diff --git a/packages/pharos-site-astro/src/lib/textConvert.ts b/packages/pharos-site-astro/src/lib/textConvert.ts new file mode 100644 index 000000000..4211a0711 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/textConvert.ts @@ -0,0 +1,14 @@ +export const toTitleCase = (name: string): string => + name + .split(' ') + .map((word) => `${word.charAt(0).toUpperCase()}${word.substring(1)}`) + .join(' ') + .replace('Jstor', 'JSTOR'); // Special case for JSTOR + +export const toSlug = (name: string): string => + name + .toLowerCase() + .replace(/[^a-z0-9\s-]/g, '') // Remove special characters except spaces and hyphens + .trim() + .replace(/\s+/g, '-') // Replace spaces with hyphens + .replace(/-+/g, '-'); // Replace multiple hyphens with a single hyphen diff --git a/packages/pharos-site-astro/src/lib/tokenFormat.ts b/packages/pharos-site-astro/src/lib/tokenFormat.ts new file mode 100644 index 000000000..db647ad62 --- /dev/null +++ b/packages/pharos-site-astro/src/lib/tokenFormat.ts @@ -0,0 +1,49 @@ +export const toTokenName = (text: string): string => + '$' + + text + .replace(/([a-z])([A-Z]|[0-9])/g, '$1-$2') + .replace(/([0-9])([a-z]|[A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z])/g, '$1-$2') + .toLowerCase(); + +/** A design token as emitted by `@ithaka/pharos/lib/styles/tokens`. */ +export interface DesignToken { + name: string; + value: string; + original: { value: string }; +} + +/** + * A token carrying a human-readable `comment` . + */ +export interface CommentedToken extends DesignToken { + comment?: string; +} + +/** + * A token whose `comment` is always present + */ +export interface ScaleToken extends DesignToken { + comment: string; +} + +/** + * For alias tokens (whose original value references another token, e.g. + * `{color.marbleGray.30.value}`) returns the referenced global token's name. + */ +export const toOriginalTokenName = (token: DesignToken): string | undefined => { + if (!token.original.value.startsWith('{color.')) { + return undefined; + } + + return ( + '$pharos-' + + token.original.value + .substring(1) + .split('.') + .slice(0, -1) + .join('-') + .replace(' ', '-') + .toLowerCase() + ); +}; diff --git a/packages/pharos-site-astro/src/pages/404.astro b/packages/pharos-site-astro/src/pages/404.astro new file mode 100644 index 000000000..40fe54a29 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/404.astro @@ -0,0 +1,8 @@ +--- +import Layout from '@layouts/Layout.astro'; +--- + +<Layout title="404: Not found"> + <h1>NOT FOUND</h1> + <p>You just hit a route that doesn't exist... the sadness.</p> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/color.astro b/packages/pharos-site-astro/src/pages/brand-expressions/color.astro new file mode 100644 index 000000000..cfaab8231 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/color.astro @@ -0,0 +1,425 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import CrossOut from '@components/CrossOut.astro'; +import DosAndDonts from '@components/DosAndDonts.astro'; +import ColorSwatches from '@components/ColorSwatches.astro'; +import ColorGradients from '@components/ColorGradients.astro'; +import ColorCombos from '@components/ColorCombos.astro'; +import ColorTextSquares from '@components/ColorTextSquares.astro'; +import colorBrochure from '@images/brand-expressions/color/color-brochure.jpg'; +import colorIllustration from '@images/brand-expressions/color/color-illustration.jpg'; +import colorNotebook from '@images/brand-expressions/color/color-notebook.jpg'; + +const redCircle = + 'height: var(--pharos-spacing-7-x); width: var(--pharos-spacing-7-x); border-radius: 50%;'; +--- + +<Layout title="Color"> + <PageSection + title="Color" + description={`The color palette is inspired directly by the brand story and the line "JSTOR is for the intellectually Curious". JSTOR red is our primary brand color, our users know it and positively associate it with our brand. The other colors in our palette complement JSTOR red, and each other.`} + isHeader + > + <Grid columns={1} vSpace={0} hSpace={0} bottom={0} justify="center"> + <div> + <div class="swatch-row"> + <ColorSwatches filter={{ key: 'group', value: 'primary' }} noLabel large smallSpacing /> + </div> + <ColorSwatches filter={{ key: 'group', value: 'secondary' }} noLabel large smallSpacing /> + </div> + </Grid> + </PageSection> + + <PageSection + title="Primary colors" + description="Our primary colors are JSTOR Red, Night Blue and Glacier Blue. JSTOR Red should have prominence in most materials or have a presence, even if it isn't the central color." + > + <ColorSwatches filter={{ key: 'group', value: 'primary' }} large /> + </PageSection> + + <PageSection + title="Secondary colors" + description="Our secondary colors are Living Coral, Marble Gray, and Black. These should be used with the primary palette to support and enhance those colors." + > + <ColorSwatches filter={{ key: 'group', value: 'secondary' }} large={true} /> + </PageSection> + + <PageSection + title="Neutral colors" + description="Our neutral palette is a set of warm grays. Use these to enhance information especially in the UI, but also ask if gray is even necessary for larger areas. The number next to the color name indicates saturation of the color. A lower number equates to a darker color." + > + <ColorSwatches filter={{ key: 'group', value: 'neutrals' }} colorsPerRow={4} /> + </PageSection> + + <PageSection title="Principles" moreTitleSpace> + <div> + <site-pharos-heading level="3" preset="4">Expressive</site-pharos-heading> + <p>Colors are used at memorable moments to reinforce our brand's style.</p> + </div> + <div> + <site-pharos-heading level="3" preset="4">Legible</site-pharos-heading> + <p> + Text and important elements, like icons, meet legibility standards when appearing on colored + backgrounds across all screen and device types. + </p> + </div> + <div> + <site-pharos-heading level="3" preset="4">Hierarchical</site-pharos-heading> + <p> + Color indicates which elements are interactive, how they relate to other components, and + their level of prominence. Important elements should stand out the most. + </p> + </div> + <div> + <site-pharos-heading level="3" preset="4">Consistent</site-pharos-heading> + <p> + Color should be applied throughout a UI consistently and be compatible with the brand it + represents. + </p> + </div> + </PageSection> + + <PageSection title="Best practices"> + <DosAndDonts> + <div class="guidance"> + <site-pharos-heading level="3" preset="2--bold"> + Use recommended color combinations + </site-pharos-heading> + <p>JSTOR Red has prominence and is present in most materials.</p> + </div> + <div class="guidance"> + <site-pharos-heading level="4" preset="1--bold">2-color combinations</site-pharos-heading> + </div> + <div class="specimen"> + <Grid + columns={4} + vSpace={2} + hSpace={3} + bottom={0} + minContent + justifyContent="space-between" + > + <ColorCombos colorNames={['JSTOR red', 'Night blue']} /> + <ColorCombos colorNames={['JSTOR red', 'Glacier blue']} /> + <ColorCombos colorNames={['JSTOR red', 'Living coral']} /> + <ColorCombos colorNames={['JSTOR red', 'Marble gray']} /> + <ColorCombos colorNames={['JSTOR red', 'Black']} /> + </Grid> + </div> + <div class="guidance"> + <site-pharos-heading level="4" preset="1--bold">3-color combinations</site-pharos-heading> + </div> + <div> + <Grid columns={3} vSpace={2} hSpace={3} bottom={0} minContent> + <ColorCombos colorNames={['JSTOR red', 'Night blue', 'Living coral']} /> + <ColorCombos colorNames={['JSTOR red', 'Black', 'White']} /> + <ColorCombos colorNames={['JSTOR red', 'Glacier blue', 'Marble gray']} /> + </Grid> + </div> + </DosAndDonts> + <DosAndDonts dont> + <div class="guidance guidance--dont"> + <site-pharos-heading level="3" preset="2--bold"> + Don't use non-complimentary color combinations + </site-pharos-heading> + <p> + These colors do not compliment each other well; therefore, do not pair them in your + experiences. + </p> + </div> + <div class="specimen specimen--dont"> + <Grid columns={3} vSpace={2} hSpace={3} bottom={0} align="start"> + <ColorCombos colorNames={['Black', 'Living coral']} crossout /> + <ColorCombos colorNames={['Glacier blue', 'Living coral']} crossout /> + <ColorCombos colorNames={['JSTOR red', 'White', 'Night blue']} crossout /> + </Grid> + </div> + <div class="guidance guidance--dont"> + <site-pharos-heading level="3" preset="2--bold">Don't alter JSTOR Red</site-pharos-heading> + <p> + Please do not darken or lighten JSTOR Red. It should always be used in its true color. + </p> + </div> + <div class="specimen specimen--dont"> + <Grid + columns={5} + vSpace={2} + hSpace={1.5} + bottom={0} + minContent + justifyContent="space-between" + > + <CrossOut> + <div style={`background-color: #4D0000; ${redCircle}`}></div> + </CrossOut> + <CrossOut> + <div style={`background-color: #660000; ${redCircle}`}></div> + </CrossOut> + <Grid columns={1} justify="center" minContent> + <div style={`background-color: #990000; ${redCircle}`}></div> + <div>JSTOR Red</div> + </Grid> + <CrossOut> + <div style={`background-color: #CC8080; ${redCircle}`}></div> + </CrossOut> + <CrossOut> + <div style={`background-color: #E5BFBF; ${redCircle}`}></div> + </CrossOut> + </Grid> + </div> + <div class="guidance guidance--dont"> + <site-pharos-heading level="3" preset="2--bold"> + Don't use inaccessible colors + </site-pharos-heading> + <p> + Don't use inaccessible versions in digital materials such as graphs, presentation, social + graphics and emails. + </p> + </div> + <div> + <Grid + columns={5} + vSpace={2} + hSpace={3.5} + bottom={0} + minContent + justifyContent="space-between" + > + <CrossOut> + <ColorTextSquares fgName="Marble gray" bgName="White" /> + </CrossOut> + <CrossOut> + <ColorTextSquares fgName="Glacier blue" bgName="White" /> + </CrossOut> + <CrossOut> + <ColorTextSquares fgName="Living coral" bgName="White" /> + </CrossOut> + <CrossOut> + <ColorTextSquares fgName="White" bgName="Glacier blue" /> + </CrossOut> + <CrossOut> + <ColorTextSquares fgName="White" bgName="Living coral" /> + </CrossOut> + </Grid> + </div> + </DosAndDonts> + </PageSection> + + <PageSection + title="Gradients" + description="Gradients provide depth and create visual interest helping move users through a design. Gradients should be used as subtle details in the corners of materials." + > + <div class="palette-note"> + <ColorGradients + gradients={[ + { first: 'JSTOR red', second: ['Living coral', 'base'] }, + { first: ['Living coral', 'base'], second: 'JSTOR red' }, + { first: ['Night blue', 'base'], second: ['Glacier blue', 'base'] }, + { first: ['Glacier blue', 'base'], second: ['Night blue', 'base'] }, + ]} + /> + <ColorGradients + gradients={[ + { first: ['Living coral', 'base'], second: ['Night blue', 'base'] }, + { first: ['Night blue', 'base'], second: ['Living coral', 'base'] }, + { first: ['Night blue', 'base'], second: 'Black' }, + { first: 'Black', second: ['Night blue', 'base'] }, + ]} + /> + <ColorGradients + gradients={[ + { first: ['Marble gray', 'base'], second: 'White' }, + { first: 'White', second: ['Marble gray', 'base'] }, + { first: 'Black', second: ['Marble gray', 'base'] }, + { first: ['Marble gray', 'base'], second: 'Black' }, + ]} + /> + </div> + </PageSection> + + <PageSection + title="Tints" + description="Lighter and darker versions of Night Blue, Glacier Blue and Living Coral should be used to help differentiate information in graphs and data visualizations. " + > + <Grid columns={4} vSpace={2} hSpace={5} bottom={2} align="start" minContent> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorNightBlueBase' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorNightBlue15' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorNightBlue60' }} + colorsPerRow={1} + hexOnlyLabel + /> + </Grid> + <Grid columns={4} vSpace={2} hSpace={5} bottom={2} align="start" minContent> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorGlacierBlueBase' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorGlacierBlue70' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorGlacierBlue80' }} + colorsPerRow={1} + hexOnlyLabel + /> + </Grid> + <Grid columns={4} vSpace={2} hSpace={5} bottom={0} align="start" minContent> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorLivingCoralBase' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorLivingCoral50' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorLivingCoral80' }} + colorsPerRow={1} + hexOnlyLabel + /> + <ColorSwatches + filter={{ key: 'name', value: 'PharosColorLivingCoral90' }} + colorsPerRow={1} + hexOnlyLabel + /> + </Grid> + </PageSection> + + <PageSection title="Accessibility" description="Colors have been tested for on screen contrast."> + <div class="specimen"> + <Grid + columns={4} + vSpace={2} + hSpace={3} + bottom={0} + align="start" + minContent + justifyContent="space-between" + > + <ColorTextSquares bgName="White" fgName="JSTOR red" showLabel /> + <ColorTextSquares bgName="White" fgName="Night blue" showLabel /> + <ColorTextSquares bgName="White" fgName="Glacier blue 40" showLabel /> + <ColorTextSquares bgName="White" fgName="Living coral 53" showLabel /> + <ColorTextSquares bgName="JSTOR red" fgName="White" showLabel /> + <ColorTextSquares bgName="Night blue" fgName="White" showLabel /> + <ColorTextSquares bgName="Glacier blue" fgName="Black" showLabel /> + <ColorTextSquares bgName="Living coral" fgName="Black" showLabel /> + <ColorTextSquares bgName="Black" fgName="Glacier blue" showLabel /> + <ColorTextSquares bgName="Black" fgName="Marble gray" showLabel /> + </Grid> + </div> + <site-pharos-heading level="4" preset="2">Color test tools</site-pharos-heading> + <div class="tool-links"> + <site-pharos-link href="https://color.review/" target="_blank">Color Review</site-pharos-link> + <site-pharos-icon name="link-external" class="swatch-label" a11y-hidden="true" + ></site-pharos-icon> + <site-pharos-link href="https://webaim.org/resources/contrastchecker/" target="_blank"> + WebAIM Color Contrast Checker + </site-pharos-link> + <site-pharos-icon name="link-external" a11y-hidden="true"></site-pharos-icon> + </div> + </PageSection> + + <PageSection title="Colors in action"> + <Grid columns={3} vSpace={2} hSpace={0} bottom={0} align="start"> + <div> + <div class="figure-caption">Product Card</div> + <Image + src={colorBrochure} + alt="Product card" + width="227" + height="350" + class="color-image" + /> + </div> + <div> + <div class="figure-caption">Illustration</div> + <Image + src={colorIllustration} + alt="Illustration" + width="300" + height="450" + class="color-image" + /> + </div> + <div> + <div class="figure-caption">Notebook</div> + <Image src={colorNotebook} alt="Notebook" width="215" height="320" class="color-image" /> + </div> + </Grid> + </PageSection> +</Layout> + +<style> + /* + * Page-specific layout, scoped to this page. + * + * The spacing here is named for what the block *is*, not what it measures. + * The page alternates a block of guidance (a heading plus prose) with the + * specimen it describes, and the two take different gaps: guidance sits close + * to the thing it explains, specimens are separated from the next section. + */ + .guidance { + margin-bottom: var(--pharos-spacing-1-x); + } + + /* + * The don't-column runs slightly looser than the do-column, and its specimens + * looser still. Left as-is rather than unified — matching them is a design + * decision, not a refactor. + * + * Marked with an explicit modifier rather than inferred from the surrounding + * `DosAndDonts`: Astro scopes each component's styles with its own + * `data-astro-cid`, so a descendant selector written here does not reach + * markup that component renders. + */ + .guidance--dont { + margin-bottom: var(--pharos-spacing-one-and-a-half-x); + } + + .specimen { + margin-bottom: var(--pharos-spacing-5-x); + } + + .specimen--dont { + margin-bottom: var(--pharos-spacing-three-and-a-half-x); + } + + .swatch-row { + margin-bottom: var(--pharos-spacing-2-x); + } + + .figure-caption { + margin-bottom: var(--pharos-spacing-1-x); + } + + .tool-links { + margin-bottom: var(--pharos-spacing-2-x); + } + + .palette-note { + margin-top: 4rem; + margin-bottom: 4rem; + } + + .swatch-label { + margin-right: var(--pharos-spacing-1-x); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/elevation.astro b/packages/pharos-site-astro/src/pages/brand-expressions/elevation.astro new file mode 100644 index 000000000..8a195037d --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/elevation.astro @@ -0,0 +1,249 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import DosAndDonts from '@components/DosAndDonts.astro'; +import dontChangeSource from '@images/brand-expressions/elevation/dont_change_source.jpg'; +import dontVisuallyPlease from '@images/brand-expressions/elevation/dont_visually_please.jpg'; +import dosContentBehind from '@images/brand-expressions/elevation/dos_content_behind.png'; +import effectStacking from '@images/brand-expressions/elevation/effect_stacking.jpg'; +import elevationStackGuide from '@images/brand-expressions/elevation/elevation_stack_guide.jpg'; +import topDropShadow from '@images/brand-expressions/elevation/top_drop_shadow.jpg'; +import upAndDown from '@images/brand-expressions/elevation/up_and_down.jpg'; +import withIconography from '@images/brand-expressions/elevation/with_iconography.jpg'; + +const swatch = 'width: 201px; height: 142px; border-radius: var(--pharos-radius-base-standard);'; +--- + +<Layout title="Elevation"> + <PageSection + title="Elevation" + description="Elevation is used to provide visual cues about a components' depth from a website's surface and its distance in relation to other components. It signals users that a component is being prioritized, emphasized, or requires their focus. This can come from the visual cue of dynamic elevation or static elevation." + isHeader + /> + + <PageSection title="Elevation system"> + <div class="intro"> + JSTOR uses an elevation system to assign consistent elevation levels to certain components. By + following the guide, usage will remain uniform across all JSTOR platforms. + </div> + <site-pharos-heading level="3" preset="4">Elevation guide</site-pharos-heading> + <p> + <strong> View CSS Codes under Design Tokens. </strong> + </p> + <Image + src={elevationStackGuide} + alt="Elevation stack guide" + width={800} + class="figure figure--stack-guide" + /> + <site-pharos-heading level="3" preset="4">Shadow definitions</site-pharos-heading> + <ul class="shadow-definitions"> + <li>Blur - How diffused a shadow will be.</li> + <li>Spread - How large a shadow will be.</li> + <li>Z-index - How elevated a shadow will be.</li> + <li> + X - Our light source. This will not be altered because our light source is consistently set + at 12 o'clock. + </li> + </ul> + <site-pharos-heading level="3" preset="4">Shadow stacking</site-pharos-heading> + <p> + To avoid the harsh outline of a stroke, and also so that the stroke won't be misrepresented as + a container, the outline of a component using elevation will be achieved by stacking shadows. + </p> + <Image + src={effectStacking} + alt="Two different shadow effects" + width={220} + class="figure figure--effect" + /> + <p> + The top shadow gives the illusion of a stroke, while the bottom shadow tackles the actual + shadow. If you only have the top shadow, the component will blend into the background. If you + only have the bottom shadow, the component will be undefined. + </p> + <Grid columns={4}> + <strong>Border only</strong> + <strong>Top shadow only</strong> + <strong>Bottom shadow only</strong> + <strong>Both shadows</strong> + <div style={`${swatch} border: 1px solid var(--pharos-color-marble-gray-80);`}></div> + <div style={`${swatch} box-shadow: 0px 1px 2px 0px rgba(18, 18, 18, 0.30);`}></div> + <div style={`${swatch} box-shadow: 0px 4px 8px 3px rgba(18, 18, 18, 0.15);`}></div> + <div style={`${swatch} box-shadow: var(--pharos-elevation-level-3);`}></div> + </Grid> + </PageSection> + + <PageSection title="Elevation calculations"> + <site-pharos-heading level="3" preset="4">Elevation values</site-pharos-heading> + <p> + JSTOR uses a consistent equation to calculate elevation levels as they rise. To maintain + elevation levels, follow this important two-step system calculation: + </p> + <ol class="calc-list"> + <li> + The top shadow should consistently stay at these values no matter the elevation level: + <ul> + <li>X = 0</li> + <li>Blur = 2</li> + <li>Y = 1</li> + <li>Spread = 0</li> + </ul> + <Image + src={topDropShadow} + alt="Top drop shadow" + width={220} + class="figure figure--shadow" + /> + </li> + <li class="calc-list__item"> + Calculations are used beginning at Level 2. The bottom shadow should comply with the + following system as each level rises: + <ul> + <li>X = 0</li> + <li>Blur + 2</li> + <li>Y + 2</li> + <li>Spread + 1</li> + </ul> + </li> + </ol> + <Grid columns={3}> + <strong>Level 2</strong> + <strong>Level 3</strong> + <strong>Level 4</strong> + <div style={`${swatch} box-shadow: var(--pharos-elevation-level-2);`}></div> + <div style={`${swatch} box-shadow: var(--pharos-elevation-level-3);`}></div> + <div style={`${swatch} box-shadow: var(--pharos-elevation-level-4);`}></div> + </Grid> + </PageSection> + + <PageSection title="Principles"> + <site-pharos-heading level="3" preset="4">Consistent</site-pharos-heading> + <div class="practice-intro"> + All elevation is used at the appropriate level assigned to that component. Always follow the + recommended shadow pairings. + </div> + <site-pharos-heading level="3" preset="4">Suitable</site-pharos-heading> + <div class="practice-intro"> + Dynamic elevation should only change values when it is suitable for a component's behavior. + </div> + <site-pharos-heading level="3" preset="4">Practical</site-pharos-heading> + <div class="practice-intro"> + Elevation is not solely used for visually enjoyment. It should communicate to users that there + is an emphasis or prioritization when it comes to a given component. + </div> + </PageSection> + + <PageSection title="Best Practices"> + <DosAndDonts> + <div class="best-practice best-practice--spaced"> + <site-pharos-heading level="3" preset="2--bold"> + Use when there is content behind a component. + </site-pharos-heading> + <p>Use elevation when a component can be interacted with, as well.</p> + <Image + src={dosContentBehind} + alt="For example a sticky header" + width={220} + class="figure figure--practice" + /> + <site-pharos-heading level="3" preset="2--bold"> + Alter the Y-axis for directional movement. + </site-pharos-heading> + <p>For example, changing Y = 2 to Y = -2.</p> + <Image + src={upAndDown} + alt="Y eequals positive 2 when a drawer slides up, Y equals negative 2 when a drawer slides down" + width={450} + /> + </div> + </DosAndDonts> + <DosAndDonts dont> + <div class="best-practice"> + <site-pharos-heading level="3" preset="2--bold"> + Apply elevation to make components visually pleasing. + </site-pharos-heading> + <p> + The reason these components require elevation is because the reason can be articulated. If + there is no plausible reason for elevation to be used, do not use it. + </p> + <Image + src={dontVisuallyPlease} + alt="don't add elevation to components for fun" + width={450} + class="figure figure--practice" + /> + <site-pharos-heading level="3" preset="2--bold"> + Add elevation when content already includes icons to communicate user cues. + </site-pharos-heading> + <p> + The ability to move content is already visually communicated through the reorder icon. + Hover elevation is not needed for any purpose other than to provide visual enjoyment. + </p> + <Image + src={withIconography} + alt="don't add to components that communicate user interactivity" + width={190} + class="figure figure--practice" + /> + <site-pharos-heading level="3" preset="2--bold"> + Change the light source. + </site-pharos-heading> + <p> + Don't change the positioning of the shadow. By not following the elevation system + guidelines, inconsistencies will start to pop up across ITHAKA platforms. + </p> + <Image src={dontChangeSource} alt="X value has been altered" width={195} /> + </div> + </DosAndDonts> + </PageSection> +</Layout> + +<style> + .intro { + width: 75%; + margin-bottom: 3rem; + color: var(--pharos-color-text-20); + } + + .practice-intro { + margin-bottom: var(--pharos-spacing-2-x); + color: var(--pharos-color-text-20); + } + + .calc-list, + .calc-list__item { + color: var(--pharos-color-text-20); + } + + .shadow-definitions { + margin-bottom: 50px; + } + + .figure--stack-guide { + margin-bottom: 70px; + } + + .figure--effect { + margin-bottom: 24px; + } + + .figure--shadow { + margin-bottom: 40px; + } + + .figure--practice { + margin-bottom: 60px; + } + /* + * Every heading inside a best-practice block labels the sample beneath it. + * Pharos deliberately sets no top margin on a heading (that is page layout, + * not a component concern), so the gap is supplied here once rather than as a + * class repeated on each heading. + */ + .best-practice site-pharos-heading { + margin-bottom: var(--pharos-spacing-1-x); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/iconography.astro b/packages/pharos-site-astro/src/pages/brand-expressions/iconography.astro new file mode 100644 index 000000000..d93aeece0 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/iconography.astro @@ -0,0 +1,379 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import BestPractices from '@components/BestPractices.astro'; +import IconsDisplay from '@components/IconsDisplay.astro'; +import iconOverviewHero from '@images/brand-expressions/iconography/icon_overview_hero.svg'; +import iconographyClearConceptualDo from '@images/brand-expressions/iconography/iconography_clear-conceptual_do.svg'; +import iconographyClearConceptualDont from '@images/brand-expressions/iconography/iconography_clear-conceptual_dont.svg'; +import iconographyFamilyFriendsDo from '@images/brand-expressions/iconography/iconography_family-friends_do.svg'; +import iconographyFamilyFriendsDont from '@images/brand-expressions/iconography/iconography_family-friends_dont.svg'; +import iconographyLabelsDo from '@images/brand-expressions/iconography/iconography_labels_do.svg'; +import iconographyLabelsDont from '@images/brand-expressions/iconography/iconography_labels_dont.svg'; +import iconographySimpleDetailedDo from '@images/brand-expressions/iconography/iconography_simple-detailed_do.svg'; +import iconographySimpleDetailedDont from '@images/brand-expressions/iconography/iconography_simple-detailed_dont.svg'; +import icons2pxStroke from '@images/brand-expressions/iconography/icons-2px-stroke.png'; +import iconsAlignOptically from '@images/brand-expressions/iconography/icons-align-optically.png'; +import iconsCenterStroke from '@images/brand-expressions/iconography/icons-center-stroke.png'; +import iconsLogoInspired from '@images/brand-expressions/iconography/icons-logo-inspired.png'; +import iconsSquareCaps from '@images/brand-expressions/iconography/icons-square-caps.png'; +import iconsSquareJoins from '@images/brand-expressions/iconography/icons-square-joins.png'; +--- + +<Layout title="Iconography"> + <PageSection + title="Iconography" + description="JSTOR icons seek to provide clarity and convey brand personality through color and style, but must first communicate meaning in the content." + isHeader + > + <site-pharos-button + icon-right="link-external" + href="/storybook/?path=/story/webcomponents_components-icon--names" + target="_blank" + > + View icons in Storybook + </site-pharos-button> + <div class="hero"> + <Grid columns={1} justifyContent="center" minContent align="end"> + <img + src={iconOverviewHero.src} + width={iconOverviewHero.width} + height={iconOverviewHero.height} + alt="Iconography" + /> + </Grid> + </div> + </PageSection> + + <PageSection title="Icons"> + <IconsDisplay + title="System" + rows={6} + iconsToShow={[ + 'arrow-up', + 'arrow-down', + 'arrow-left', + 'arrow-right', + 'attachment', + 'calendar', + 'chevron-down', + 'chevron-up', + 'chevron-left', + 'chevron-right', + 'chevron-left-large', + 'chevron-right-large', + 'close', + 'close-inverse', + 'copy', + 'ellipses-horizontal', + 'ellipses-vertical', + 'link-external', + 'menu', + 'view-gallery', + 'view-grid', + 'view-list', + ]} + /> + <IconsDisplay + title="Workspace" + rows={4} + iconsToShow={[ + 'academic-content', + 'add', + 'delete', + 'folder', + 'folder-new', + 'folder-selected', + 'image', + 'link', + 'link-add', + 'move', + 'workspace', + 'workspace-selected', + 'primary-source', + 'video', + ]} + /> + <IconsDisplay + title="Alerts, feedback" + rows={2} + iconsToShow={[ + 'checkmark', + 'checkmark-small', + 'exclamation', + 'dash-small', + 'checkmark-inverse', + 'exclamation-inverse', + 'info-inverse', + 'question-inverse', + ]} + /> + <IconsDisplay + title="Item actions" + rows={3} + iconsToShow={[ + 'cite', + 'download', + 'collapse', + 'expand', + 'fit-to-view', + 'fit-to-width', + 'fullscreen', + 'fullscreen-minimize', + 'save', + 'search', + 'share', + 'zoom-in', + 'zoom-out', + ]} + /> + <IconsDisplay + title="Social" + rows={2} + iconsToShow={[ + 'email', + 'facebook', + 'google-color', + 'instagram', + 'linkedin', + 'twitter', + 'tumblr', + 'youtube', + ]} + /> + </PageSection> + + <PageSection title="Principles"> + <div class="icon-group"> + <site-pharos-heading level="3" preset="4" class="icon-group__title"> + Simple over detailed + </site-pharos-heading> + <Grid columns={2} justify="center" bottom={1}> + <img + src={iconographySimpleDetailedDo.src} + width={iconographySimpleDetailedDo.width} + height={iconographySimpleDetailedDo.height} + alt="Simple over detailed do" + /> + <img + src={iconographySimpleDetailedDont.src} + width={iconographySimpleDetailedDont.width} + height={iconographySimpleDetailedDont.height} + alt="Simple over detailed dont" + /> + </Grid> + <BestPractices> + <ul slot="do"> + <li>Icons should have simple lines and shapes</li> + <li> + Limit the creation of icon variations. No need for different icons to represent the same + concept (e.g. "admin settings" vs. "user settings") + </li> + </ul> + <ul slot="dont"> + <li> + Icons should not be too heavy in details, this increases cognitive load on the user + </li> + </ul> + </BestPractices> + </div> + <div class="icon-group"> + <site-pharos-heading level="3" preset="4" class="icon-group__title"> + Clear over conceptual + </site-pharos-heading> + <Grid columns={2} justify="center" bottom={1}> + <img + src={iconographyClearConceptualDo.src} + width={iconographyClearConceptualDo.width} + height={iconographyClearConceptualDo.height} + alt="Clear over conceptual do" + /> + <img + src={iconographyClearConceptualDont.src} + width={iconographyClearConceptualDont.width} + height={iconographyClearConceptualDont.height} + alt="Clear over conceptual dont" + /> + </Grid> + <BestPractices> + <ul slot="do"> + <li> + Users should be able to understand what the icon represents. Interpreting abstract + (symbolic) icons can take more time and effort. + </li> + <li>Needs to be quickly recognizable on smaller screens.</li> + <li>Use well-known icons.</li> + </ul> + <ul slot="dont"> + <li> + Don't reinvent an icon that's already been accepted as a convention. (e.g. a "gear" icon + for "settings"). + </li> + </ul> + </BestPractices> + </div> + <div class="icon-group"> + <site-pharos-heading level="3" preset="4" class="icon-group__title icon-group__title--tight"> + Family over friends + </site-pharos-heading> + <Grid columns={2} justify="center" bottom={1}> + <img + src={iconographyFamilyFriendsDo.src} + width={iconographyFamilyFriendsDo.width} + height={iconographyFamilyFriendsDo.height} + alt="Family over friends do" + /> + <img + src={iconographyFamilyFriendsDont.src} + width={iconographyFamilyFriendsDont.width} + height={iconographyFamilyFriendsDont.height} + alt="Family over friends dont" + /> + </Grid> + <BestPractices> + <ul slot="do"> + <li>The icon set needs to look and feel related.</li> + </ul> + <ul slot="dont"> + <li> + Icons that aren't related may look out of place, cheapening the design or leading a user + to mistrust your design. + </li> + </ul> + </BestPractices> + </div> + <div> + <site-pharos-heading level="3" preset="4" class="icon-group__title"> + Labels over no labels + </site-pharos-heading> + <Grid columns={2} justify="center" bottom={1}> + <img + src={iconographyLabelsDo.src} + width={iconographyLabelsDo.width} + height={iconographyLabelsDo.height} + alt="Labels over no labels do" + /> + <img + src={iconographyLabelsDont.src} + width={iconographyLabelsDont.width} + height={iconographyLabelsDont.height} + alt="Labels over no labels dont" + /> + </Grid> + <BestPractices> + <ul slot="do"> + <li> + Whenever possible, pair an icon with text, it's more quickly recognizable and + understood. + </li> + <li> + If an icon cannot have text pair next to it, the use of a tooltip will suffice (e.g. + zoom in/zoom out on the viewer). + </li> + </ul> + <ul slot="dont"> + <li>Avoid using icons alone. Icons with labels are more effective.</li> + </ul> + </BestPractices> + </div> + </PageSection> + + <PageSection title="Design and production guidelines"> + <Image src={icons2pxStroke} alt="All icons have a 2px stroke width" width="220" /> + <Image src={iconsCenterStroke} alt="Center the weight of icons" width="220" /> + <Image src={iconsAlignOptically} alt="Center the icons optically" width="220" /> + <Image src={iconsSquareJoins} alt="Make sure the icons have 90 degree angles" width="220" /> + <Image src={iconsSquareCaps} alt="Icons have square caps" width="220" /> + <Image + src={iconsLogoInspired} + alt="Icons are inspired by the square shape of the logo" + width="220" + /> + <div class="closing-note"> + <site-pharos-heading level="3" preset="4">Steps</site-pharos-heading> + <ol> + <li> + Please review our current icons to see if one can work for your need. All icons should be + unique and not redundant. + </li> + <li> + Create a 24x24px rectangle or artboard with a 1px grid. All lines and shapes of the icon + are to snap to a pixel on the grid, so there shouldn't be any decimal sizes of the lines + or shapes you create. + </li> + <li> + Then, you'll need to use our grid template. Most product-based icons should be 16px, with + a max size of 20px. The grid's internal boxes decrease from 24px at 2px increments down to + 12px. These will serve as guidelines to snap your lines to. + </li> + <li>All icons have a 2px stroke width.</li> + <li> + When designing icons that include closed shapes, the weight needs to be "centered" as + opposed to "inside or "outside" the shape. This provides enough thickness and crisp + silhouettes. + </li> + <li>All existing corners need to be square angles, or 90 degrees</li> + <li>The caps/ends of the lines need to be square</li> + <li>Align elements optically (e.g., a play button)</li> + </ol> + <div class="usage-note"> + <site-pharos-heading level="4" preset="1--bold"> + Implementation details when creating icons + </site-pharos-heading> + <ul> + <li> + It's important that the icons sit on the pixel so they always appeared crisp and sharp + </li> + <li>Please do not use the "line" tool, this can place vectors on half pixels</li> + <li>Be aware of automatic alignments which can place vectors on uneven or half pixels</li> + </ul> + </div> + </div> + <site-pharos-heading level="3" preset="4">Exporting for the product</site-pharos-heading> + <ul> + <li> + Icons should be at whole pixels. No decimals are allowed in x and y coordinates or width and + height fields. + </li> + <li>Each artboard and the artwork within it must be aligned to the pixel grid.</li> + <li>All strokes must be expanded and at whole pixel values.</li> + <li> + Convert your strokes to outlines, all shapes and paths should be combined and converted into + a single path. + </li> + </ul> + </PageSection> +</Layout> + +<style> + .hero { + margin-top: var(--pharos-spacing-5-x); + margin-bottom: var(--pharos-spacing-7-x); + } + + .icon-group { + margin-bottom: 4rem; + } + + .icon-group__title { + margin-bottom: 1rem; + } + + /* One group sets its title tighter than the rest; preserved from the port. */ + .icon-group__title--tight { + margin-bottom: 0.5rem; + } + + .closing-note { + margin-top: 4rem; + margin-bottom: 5rem; + width: 66%; + } + + .usage-note { + margin-top: var(--pharos-spacing-2-x); + margin-bottom: var(--pharos-spacing-2-x); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/imagery.astro b/packages/pharos-site-astro/src/pages/brand-expressions/imagery.astro new file mode 100644 index 000000000..f0d85a7bc --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/imagery.astro @@ -0,0 +1,196 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import BestPractices from '@components/BestPractices.astro'; + +import heroCover from '@images/brand-expressions/imagery/imagery_hero_cover.png'; +import artstor1 from '@images/brand-expressions/imagery/imagery_artstor_1.png'; +import artstor2 from '@images/brand-expressions/imagery/imagery_artstor_2.png'; +import artstor3 from '@images/brand-expressions/imagery/imagery_artstor_3.png'; +import artstor4 from '@images/brand-expressions/imagery/imagery_artstor_4.png'; +import artstor5 from '@images/brand-expressions/imagery/imagery_artstor_5.png'; +import community1 from '@images/brand-expressions/imagery/imagery_community_1.png'; +import community2 from '@images/brand-expressions/imagery/imagery_community_2.png'; +import community3 from '@images/brand-expressions/imagery/imagery_community_3.png'; +import community4 from '@images/brand-expressions/imagery/imagery_community_4.png'; +import community5 from '@images/brand-expressions/imagery/imagery_community_5.png'; +import brand1 from '@images/brand-expressions/imagery/imagery_brand_1.png'; +import brand2 from '@images/brand-expressions/imagery/imagery_brand_2.png'; +import brand3 from '@images/brand-expressions/imagery/imagery_brand_3.png'; +import brand4 from '@images/brand-expressions/imagery/imagery_brand_4.png'; +import brand5 from '@images/brand-expressions/imagery/imagery_brand_5.png'; + +/** + * The thumbnail rows. Each image is displayed at `.thumb`'s 124px, so the + * widths below cover 1x and 2x on that box rather than the source's 272px. + */ +const THUMB_WIDTHS = [124, 248]; + +const artstor = [artstor1, artstor2, artstor3, artstor4, artstor5]; +const community = [community1, community2, community3, community4, community5]; +const brand = [brand1, brand2, brand3, brand4, brand5]; +--- + +<Layout title="Imagery"> + <PageSection + title="Imagery" + description="We have a great opportunity to use imagery for expression. Our imagery style falls into two categories: Archival and Brand images." + isHeader + > + <Grid columns={1} justifyContent="center" minContent align="end"> + <Image src={heroCover} alt="Archive images - Hero" width={552} height={443} /> + </Grid> + </PageSection> + + <PageSection + title="Image types" + description="The two main categories of images are Archival and Brand. Archival includes content from Artstor, Community Collections, Primary Source, Journal and Book covers. Brand images are images portray users, research, and the places JSTOR is used." + > + <site-pharos-heading level="3" preset="4">Artstor</site-pharos-heading> + <Grid columns={5} hSpace={0.5} bottom={5} minContent align="end"> + { + artstor.map((image, i) => ( + <div> + <Image + src={image} + alt={`Archival - Artstor ${i + 1}`} + widths={THUMB_WIDTHS} + sizes="124px" + class="thumb" + /> + </div> + )) + } + </Grid> + <site-pharos-heading level="3" preset="4">Community Collections</site-pharos-heading> + <Grid columns={5} hSpace={0.5} bottom={5} minContent align="end"> + { + community.map((image, i) => ( + <div> + <Image + src={image} + alt={`Archive - Community Collections ${i + 1}`} + widths={THUMB_WIDTHS} + sizes="124px" + class="thumb" + /> + </div> + )) + } + </Grid> + <site-pharos-heading level="3" preset="4">Brand</site-pharos-heading> + <Grid columns={5} hSpace={0.5} bottom={5} minContent align="end"> + { + brand.map((image, i) => ( + <div> + <Image + src={image} + alt={`Archival - Brand ${i + 1}`} + widths={THUMB_WIDTHS} + sizes="124px" + class="thumb" + /> + </div> + )) + } + </Grid> + </PageSection> + + <PageSection + title="Principles" + description="Visuals are the most immediate aspect of our brand, and we must be mindful of how we select them. Here are some basic guidelines to consider as you pick images for promoting services and products." + > + <div class="principle"> + <site-pharos-heading level="3" preset="4">Diverse</site-pharos-heading> + <p> + Archive images pull from collections on JSTOR (Artstor, Open Community Collections, Primary + Sources) as well as the diverse content types in them (art, objects, historical + documentation, science). When choosing non-western items, take care to look at their + intended purpose and not just how they look. + </p> + <p> + Images of art or artifacts should represent different cultures and time periods, including + diversity in the creators (e.g., race, gender, location, etc.). Similarly, images of people + should be diverse (e.g., representing different demographics and abilities). + </p> + <p> + For global or international campaigns, make sure the people pictured adhere to dress codes + of most countries (e.g. non-revealing outfits). + </p> + </div> + <div class="principle"> + <site-pharos-heading level="3" preset="4">Genuine</site-pharos-heading> + <p> + Images should have an authentic feel to them, avoid staged or obvious stock photography. + </p> + </div> + <div class="principle"> + <site-pharos-heading level="3" preset="4">Representative</site-pharos-heading> + <p> + Carefully select images that best represent the content of the message or associated + content. For example, if we're highlighting eBooks, don't display images of posters; if + we're contacting secondary schools, don't show images of a large research library. + </p> + </div> + <div> + <site-pharos-heading level="3" preset="4">Excellence</site-pharos-heading> + <p>The images should be aesthetically pleasing and reflect our brand framework:</p> + <div class="caption"> + <strong>It feels</strong> - Dependable, Intriguing, Focused + </div> + <div class="caption"> + <strong>It looks</strong> - Uncomplicated, Composed, Modern + </div> + <p class="caption caption--spaced"> + Also, consider the <site-pharos-link href="/brand-expressions/color" + >brand color palette</site-pharos-link + > when making selections. + </p> + </div> + </PageSection> + + <PageSection title="Best Practices"> + <BestPractices> + <ul slot="do"> + <li>Choose bright, light, and colorful images</li> + <li> + Select images that fit the space, e.g., a landscape orientation for a landing page banner + </li> + <li>For Archival images, include credit information</li> + <li>Review the Imagery Principles when selecting images</li> + </ul> + <ul slot="dont"> + <li> + Manipulate the image such as changing the color, adding or removing elements, or combining + two different images + </li> + <li>Overlap imagery</li> + </ul> + </BestPractices> + </PageSection> +</Layout> + +<style> + .thumb { + max-width: 124px; + /* `<Image>` emits intrinsic width/height to reserve layout space; without + this the explicit height attribute wins over the aspect ratio and the + thumbnails render at full height. */ + height: auto; + } + + .caption { + color: var(--pharos-color-text-20); + } + + /* One named principle: a heading plus its explanatory prose. */ + .principle { + margin-bottom: var(--pharos-spacing-2-x); + } + + .caption--spaced { + margin-top: var(--pharos-spacing-one-and-a-half-x); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/logos.astro b/packages/pharos-site-astro/src/pages/brand-expressions/logos.astro new file mode 100644 index 000000000..552320467 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/logos.astro @@ -0,0 +1,218 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import DosAndDonts from '@components/DosAndDonts.astro'; +import logoBestPracticesDonts1 from '@images/brand-expressions/logos/logo_best-practices_donts_1.svg'; +import logoBestPracticesDonts2 from '@images/brand-expressions/logos/logo_best-practices_donts_2.svg'; +import logoBestPracticesDonts3 from '@images/brand-expressions/logos/logo_best-practices_donts_3.svg'; +import logoBestPracticesDonts4 from '@images/brand-expressions/logos/logo_best-practices_donts_4.svg'; +import logoBestPracticesDonts5 from '@images/brand-expressions/logos/logo_best-practices_donts_5.svg'; +import logoBestPracticesDonts6 from '@images/brand-expressions/logos/logo_best-practices_donts_6.svg'; +import logoBestPracticesDonts7 from '@images/brand-expressions/logos/logo_best-practices_donts_7.svg'; +import logoBestPracticesDos1 from '@images/brand-expressions/logos/logo_best-practices_dos_1.svg'; +import logoBestPracticesDos2 from '@images/brand-expressions/logos/logo_best-practices_dos_2.svg'; +import logoBestPracticesDos3 from '@images/brand-expressions/logos/logo_best-practices_dos_3.svg'; +import logoBestPracticesDos4 from '@images/brand-expressions/logos/logo_best-practices_dos_4.svg'; +import logoHero from '@images/brand-expressions/logos/logo_hero.svg'; +import logoJstorHorizontal from '@images/brand-expressions/logos/logo_jstor-horizontal.svg'; +import logoJstorVertical from '@images/brand-expressions/logos/logo_jstor-vertical.svg'; +import logoKnockout from '@images/brand-expressions/logos/logo_knockout.svg'; +--- + +<Layout title="Logos"> + <PageSection + title="Logos" + description={`Our logo is based on turn of the century ornate bookplates. The filigree pattern is inspired by acanthus leaves; these are the same leaves that appear at the top of the Corinthian column. "JSTOR" is set in a modified Orpheus typeface.`} + isHeader + > + <img + src={logoHero.src} + width={logoHero.width} + height={logoHero.height} + alt="Hero logo" + class="logo-hero" + /> + </PageSection> + + <PageSection title="Logo types" moreTitleSpace> + <Grid columns={2}> + <div> + <site-pharos-heading level="3" preset="4">Primary Logo</site-pharos-heading> + <p>The vertical logo orientation should be the primary logo treatment used.</p> + </div> + <img + src={logoJstorVertical.src} + width={logoJstorVertical.width} + height={logoJstorVertical.height} + alt="Vertical logo" + /> + </Grid> + <Grid columns={2}> + <div> + <site-pharos-heading level="3" preset="4">Secondary Logo</site-pharos-heading> + <p> + The horizontal logo orientation should be used when the logo needs to scale small or the + placement area is horizontal in width. + </p> + </div> + <img src={logoJstorHorizontal.src} alt="Horizontal logo" height="70" /> + </Grid> + <Grid columns={2}> + <div> + <site-pharos-heading level="3" preset="4">Knocked out</site-pharos-heading> + <p>On dark backgrounds the logo should be white.</p> + </div> + <img + src={logoKnockout.src} + width={logoKnockout.width} + height={logoKnockout.height} + alt="Knocked out logo" + /> + </Grid> + </PageSection> + + <PageSection title="Principles" moreTitleSpace> + <Grid columns={2}> + <div> + <site-pharos-heading level="3" preset="4">Heritage</site-pharos-heading> + <p>Our logo is the first and primary expression.</p> + </div> + <div> + <site-pharos-heading level="3" preset="4">Consistent</site-pharos-heading> + <p>The logo should be used according to the standards outlined in this guide.</p> + </div> + </Grid> + </PageSection> + + <PageSection title="Best Practices"> + <DosAndDonts> + <Grid columns={3}> + <div> + <img + src={logoBestPracticesDos1.src} + width={logoBestPracticesDos1.width} + height={logoBestPracticesDos1.height} + alt="Logos best practice 1" + class="logo-variant" + /> + <p>Use the primary logo whenever possible</p> + </div> + <div> + <img + src={logoBestPracticesDos2.src} + width={logoBestPracticesDos2.width} + height={logoBestPracticesDos2.height} + alt="Logos best practice 2" + class="logo-variant" + /> + <p>Use the logo in red or white, no other colors</p> + </div> + <div> + <img + src={logoBestPracticesDos3.src} + width={logoBestPracticesDos3.width} + height={logoBestPracticesDos3.height} + alt="Logos best practice 3" + class="logo-variant" + /> + <p> + The filigree and J are transparent and the "surface" they're put on can be seen through + </p> + </div> + <div> + <img + src={logoBestPracticesDos4.src} + width={logoBestPracticesDos4.width} + height={logoBestPracticesDos4.height} + alt="Logos best practice 3" + class="logo-variant" + /> + <p>On gradient backgrounds the logo should be white</p> + </div> + </Grid> + </DosAndDonts> + <DosAndDonts dont> + <Grid columns={3}> + <div> + <img + src={logoBestPracticesDonts1.src} + width={logoBestPracticesDonts1.width} + height={logoBestPracticesDonts1.height} + alt="Logos don'ts 1" + /> + <p>Use just the square mark</p> + </div> + <div> + <img + src={logoBestPracticesDonts2.src} + width={logoBestPracticesDonts2.width} + height={logoBestPracticesDonts2.height} + alt="Logos don'ts 2" + /> + <p>Stretch or distort the logo</p> + </div> + <div> + <img + src={logoBestPracticesDonts3.src} + width={logoBestPracticesDonts3.width} + height={logoBestPracticesDonts3.height} + alt="Logos don'ts 3" + /> + <p>Delete the red box around the filigree</p> + </div> + <div> + <img + src={logoBestPracticesDonts4.src} + width={logoBestPracticesDonts4.width} + height={logoBestPracticesDonts4.height} + alt="Logos don'ts 4" + /> + <p>Use the original logo design</p> + </div> + <div> + <img + src={logoBestPracticesDonts5.src} + width={logoBestPracticesDonts5.width} + height={logoBestPracticesDonts5.height} + alt="Logos don'ts 5" + /> + <p>Change the color of the logo, use it in JSTOR red or knocked out white only</p> + </div> + <div> + <img + src={logoBestPracticesDonts6.src} + width={logoBestPracticesDonts6.width} + height={logoBestPracticesDonts6.height} + alt="Logos don'ts 6" + /> + <p>Use just the JSTOR words</p> + </div> + <div> + <img + src={logoBestPracticesDonts7.src} + width={logoBestPracticesDonts7.width} + height={logoBestPracticesDonts7.height} + alt="Logos don'ts 7" + /> + <p>Put the logo on a black background</p> + </div> + </Grid> + </DosAndDonts> + </PageSection> +</Layout> + +<style> + .logo-hero { + width: 100%; + /* Intrinsic width/height are emitted to reserve the box; height must + follow the aspect ratio so this width rule sizes the image. */ + height: auto; + } + + .logo-variant { + width: 100%; + height: auto; + margin-bottom: 1rem; + } +</style> diff --git a/packages/pharos-site-astro/src/pages/brand-expressions/typography.astro b/packages/pharos-site-astro/src/pages/brand-expressions/typography.astro new file mode 100644 index 000000000..371dc95e2 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/brand-expressions/typography.astro @@ -0,0 +1,342 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import Grid from '@components/Grid.astro'; +import DosAndDonts from '@components/DosAndDonts.astro'; +import FontDisplay from '@components/FontDisplay.astro'; +import clearTerminal from '@images/brand-expressions/typography/clear_terminal.svg'; +import evenSpacing from '@images/brand-expressions/typography/even_spacing.svg'; +import humanistTerminals from '@images/brand-expressions/typography/humanist_terminals.svg'; +import openAperturesImage from '@images/brand-expressions/typography/open_apertures_image.svg'; +import sansSerif from '@images/brand-expressions/typography/sans-serif.svg'; +import typeInActionPresentation from '@images/brand-expressions/typography/type-in-action_presentation.jpg'; +import typeInActionSocialGraphic from '@images/brand-expressions/typography/type-in-action_social-graphic.jpg'; +import xHeight from '@images/brand-expressions/typography/x-height.svg'; +--- + +<Layout title="Typography"> + <PageSection + title="Typography" + description={`We selected two typefaces that represent our brand qualities—Ivar, a serif to be used primarily for headlines, and GT America, a sans serif to be used for body copy.`} + isHeader + > + <div style="display: grid; justify-items: center;"> + <div> + <FontDisplay font="Ivar Headline" title="Ivar" large /> + <FontDisplay font="GT America Standard" title="GT America" large /> + </div> + </div> + </PageSection> + + <PageSection title="Headline Typefaces"> + <div class="intro intro--headline"> + <strong>Ivar</strong> is influenced by the grace and sturdy construction of Times. The typeface + stands on the shoulders of giants: the design refers to the dependable text faces from the mid-1900s, + which in turn were rooted in classic designs from the 16th and 17th century. + </div> + <site-pharos-heading level="3" preset="4">Product headline font</site-pharos-heading> + <p>This is to be used on JSTOR.org and related websites.</p> + <Grid columns={2} bottom={2}> + <div> + <FontDisplay font="Ivar Headline" title="Ivar headline regular" dark /> + </div> + <div> + <FontDisplay font="Ivar Headline" title="Ivar headline medium" dark bold /> + </div> + </Grid> + <site-pharos-heading level="3" preset="4">Marketing headline font</site-pharos-heading> + <p>This is to be used in off platform materials</p> + <Grid columns={2}> + <FontDisplay font="IvarDisplay-Regular" title="Ivar display regular" dark /> + <FontDisplay font="IvarDisplay-Medium" title="Ivar display medium" dark /> + </Grid> + </PageSection> + + <PageSection title="Bodycopy"> + <div class="intro intro--bodycopy"> + <strong>GT America</strong> is a grotesque sans serif with more of a human touch than usual in the + genre, leading to a much better performance in legibility and readability, especially on screens. + </div> + <site-pharos-heading level="3" preset="4">Product bodycopy font</site-pharos-heading> + <p>This is to be used on JSTOR.org and related websites.</p> + <Grid columns={2} bottom={2}> + <FontDisplay font="GT America Standard" title="GT America regular" dark /> + <FontDisplay font="GT America Standard" title="GT America medium" dark bold /> + </Grid> + <site-pharos-heading level="3" preset="4">Marketing bodycopy font</site-pharos-heading> + <p>This is to be used on off platform materials</p> + <Grid columns={2} bottom={2}> + <FontDisplay font="GT America Standard" title="GT America regular" dark /> + <FontDisplay font="GT America Standard" title="GT America medium" dark bold /> + </Grid> + </PageSection> + + <PageSection title="Principles"> + <site-pharos-heading level="3" preset="4">Legibility</site-pharos-heading> + <div class="principle-intro"> + We focused on setting typefaces where it is easy to distinguish one letter from another. + </div> + <Grid columns={2}> + <div> + <site-pharos-heading level="4" preset="1--bold">Generous x-height</site-pharos-heading> + </div> + <div> + <site-pharos-heading level="4" preset="1--bold">Open apertures</site-pharos-heading> + </div> + <img src={xHeight.src} width={xHeight.width} height={xHeight.height} alt="x-height" /> + <img + src={openAperturesImage.src} + width={openAperturesImage.width} + height={openAperturesImage.height} + alt="open apertures" + /> + <div> + X-height is the vertical measure of a lowercase x. The shorter the x-height, the smaller the + letter will appear, which can cause the type to become illegible. + </div> + <div> + Apertures distinguish letters from similar letters and minimize bleed into surrounding + letters. + </div> + </Grid> + <Grid columns={2}> + <div> + <site-pharos-heading level="4" preset="1--bold">Clear terminals</site-pharos-heading> + </div> + <div> + <site-pharos-heading level="4" preset="1--bold">Even spacing</site-pharos-heading> + </div> + <div class="principle-figure"> + <img + src={clearTerminal.src} + width={clearTerminal.width} + height={clearTerminal.height} + alt="Clear Terminals" + /> + </div> + <div class="principle-figure"> + <img + src={evenSpacing.src} + width={evenSpacing.width} + height={evenSpacing.height} + alt="Even Spacing" + /> + </div> + <div> + Terminals are the ends of the letter form. Clear terminals are easier to spot and signal + what the letterform is without a lot of decoding. + </div> + <div> + Well-designed typefaces for the web should have even letter-spacing to establish a steady + rhythm for reading. The space around the letters are as important as the space within them. + </div> + </Grid> + <site-pharos-heading level="3" preset="4">Represents our brand</site-pharos-heading> + <div class="principle-intro"> + Using our brand framework our typefaces look uncomplicated, composed and modern + </div> + <Grid columns={2}> + <div> + <site-pharos-heading level="4" preset="1--bold">Humanist</site-pharos-heading> + </div> + <div> + <site-pharos-heading level="4" preset="1--bold"> + Serif and sans-serif pairing + </site-pharos-heading> + </div> + <img + src={humanistTerminals.src} + width={humanistTerminals.width} + height={humanistTerminals.height} + alt="Humanist Terminals" + /> + <img + src={sansSerif.src} + width={sansSerif.width} + height={sansSerif.height} + alt="Serif and sans-serif pairing" + /> + <div> + Humanist fonts have a natural stroke, looking more like they're written by the human hand. + </div> + <div> + A serif heading typeface and a sans-serif body copy typeface maximize legibility and divide + page content visibly. + </div> + </Grid> + </PageSection> + + <PageSection title="Best Practices"> + <DosAndDonts> + <div class="best-practice best-practice--spaced"> + <site-pharos-heading level="3" preset="2--bold"> + Headings that use Ivar need to be 24 pts or larger in the product + </site-pharos-heading> + <div + class="sample" + style="font-size: var(--pharos-type-scale-6); font-family: Ivar Headline;" + > + JSTOR is for the intellectually curious + </div> + </div> + <div class="best-practice"> + <site-pharos-heading level="3" preset="2--bold"> + Use a combination of Ivar as headline and GT America as bodycopy + </site-pharos-heading> + <div + class="sample" + style="font-size: 2.25rem; margin-bottom: var(--pharos-spacing-1-x); font-family: IvarDisplay-Regular;" + > + JSTOR is for the intellectually curious + </div> + <div + style="font-size: var(--pharos-font-size-large); margin-bottom: var(--pharos-spacing-1-x); line-height: var(--pharos-line-height-medium);" + > + Both lifelong learners and those searching for answers to specific questions. We support + them because the humanities, social sciences, and the arts help us contend with complex + moral issues and show us how to lead a more meaningful life. + </div> + </div> + </DosAndDonts> + <DosAndDonts dont> + <div class="best-practice"> + <site-pharos-heading level="3" preset="2--bold"> + Don't use Ivar in sizes smaller than 24 pts when using for a headline in the product + </site-pharos-heading> + <div + class="sample" + style="font-family: var(--pharos-font-family-serif); margin-bottom: 4rem;" + > + JSTOR is for the intellectually curious + </div> + </div> + <div class="best-practice"> + <site-pharos-heading level="3" preset="2--bold"> + Don't use all caps for headings and bodycopy + </site-pharos-heading> + <div + class="sample sample--display" + style="font-family: var(--pharos-font-family-sans-serif);" + > + JSTOR IS FOR THE INTELLECTUALLY CURIOUS + </div> + <div + class="sample sample--display" + style="font-family: Ivar-Headline; margin-bottom: 4rem;" + > + JSTOR IS FOR THE INTELLECTUALLY CURIOUS + </div> + </div> + <div class="best-practice"> + <site-pharos-heading level="3" preset="2--bold"> + Don't use the bold weights + </site-pharos-heading> + <p class="best-practice__note"> + To emphasize text, use the medium weight of the typefaces. + </p> + <div class="sample sample--display" style="font-family: IvarDisplay-Bold;"> + JSTOR is for the intellectually curious + </div> + <div class="sample sample--display" style="font-family: GT-America-Standard-Bold;"> + JSTOR is for the intellectually curious + </div> + </div> + </DosAndDonts> + </PageSection> + + <PageSection + title="System typefaces" + description="When it is not possible to use our brand typefaces, use the following system typefaces when appropriate for things like presentations, documents, etc." + > + <site-pharos-heading class="specimen-label" level="3" preset="4"> + Headline + </site-pharos-heading> + <Grid columns={2}> + <FontDisplay font="Times" title="Times" dark /> + </Grid> + <site-pharos-heading class="specimen-label" level="3" preset="4"> + Bodycopy + </site-pharos-heading> + <Grid columns={2}> + <FontDisplay font="Roboto" title="Roboto" dark /> + <FontDisplay font="Arial" title="Arial" dark /> + </Grid> + </PageSection> + + <PageSection title="Typography in action" moreTitleSpace> + <Grid columns={2}> + <div>Presentation</div> + <div>Social graphic</div> + <div class="type-in-action"> + <Image src={typeInActionPresentation} alt="x-height" /> + </div> + <div class="type-in-action"> + <Image src={typeInActionSocialGraphic} alt="x-height" /> + </div> + </Grid> + </PageSection> +</Layout> + +<style> + .intro { + margin-bottom: 3rem; + color: var(--pharos-color-text-20); + } + + .intro--headline { + width: 75%; + } + + .intro--bodycopy { + width: 66%; + } + + .principle-intro { + margin-bottom: var(--pharos-spacing-2-x); + color: var(--pharos-color-text-20); + } + + .principle-figure { + width: 100%; + /* Intrinsic width/height are emitted to reserve the box; height must + follow the aspect ratio so this width rule sizes the image. */ + height: auto; + } + + /* The shared scaffolding of a type specimen; the typeface itself is inline. */ + .sample--display { + font-size: 1.5rem; + line-height: 2rem; + } + + .best-practice__note { + margin-bottom: var(--pharos-spacing-2-x); + color: var(--pharos-color-text-40); + } + + .type-in-action, + .type-in-action img { + max-width: 100%; + } + + .type-in-action img { + height: auto; + } + /* + * A heading inside a best-practice block labels the sample beneath it. Pharos + * deliberately sets no top margin on a heading (that is page layout, not a + * component concern), so the gap is supplied here once rather than as a class + * repeated on each heading. + * + * Excluded where a paragraph follows: that paragraph carries its own spacing. + */ + .best-practice site-pharos-heading:not(:has(+ p)) { + margin-bottom: var(--pharos-spacing-1-x); + } + + /* Labels a grid of font specimens, outside any best-practice block. */ + .specimen-label { + margin-bottom: var(--pharos-spacing-1-x); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/components/[slug].astro b/packages/pharos-site-astro/src/pages/components/[slug].astro new file mode 100644 index 000000000..c5912fe6a --- /dev/null +++ b/packages/pharos-site-astro/src/pages/components/[slug].astro @@ -0,0 +1,27 @@ +--- +/** + * Renders every page in the `components` collection at `/components/<slug>`. + * + * `components={mdxComponents}` is required: MDX honours a + * file's own `export const components` only when that file is itself a route, + * so rendered through `<Content />` it is ignored. Without the prop the pages + * still build, but every `##` falls back to a plain `<h2>`. + */ +import { getCollection, render } from 'astro:content'; +import type { GetStaticPaths } from 'astro'; + +import MarkdownLayout from '@layouts/MarkdownLayout.astro'; +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const getStaticPaths = (async () => { + const pages = await getCollection('components'); + return pages.map((page) => ({ params: { slug: page.id }, props: { page } })); +}) satisfies GetStaticPaths; + +const { page } = Astro.props; +const { Content } = await render(page); +--- + +<MarkdownLayout frontmatter={page.data}> + <Content components={mdxComponents} /> +</MarkdownLayout> diff --git a/packages/pharos-site-astro/src/pages/content-style-guide/editing-checklist.mdx b/packages/pharos-site-astro/src/pages/content-style-guide/editing-checklist.mdx new file mode 100644 index 000000000..90fd7f877 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/content-style-guide/editing-checklist.mdx @@ -0,0 +1,112 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Editing checklist' +description: 'Check your writing against these 10 points for clear and concise copy.' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import BestPractices from '@components/BestPractices.astro'; + +export const components = mdxComponents; + +export const pdf = '/files/content-style-guide/Content_Style_Guide_Editing_checklist.pdf'; + +<site-pharos-button icon-left="download" href={pdf}>Download PDF</site-pharos-button> + +## 1. Use simple words + +Short, simple words are preferable to fancy ones. + +<BestPractices> + <Fragment slot="do">Use the new Publishers dashboard to monitor downloads.</Fragment> + <Fragment slot="dont"> + You can now utilize the new Publishers dashboard to monitor download activity. + </Fragment> +</BestPractices> + +## 2. Main point first + +When you are describing a goal and the action needed to achieve it, start the sentence with the +goal. + +<BestPractices> + <Fragment slot="do">To save the item to your Workspace, log in to your account</Fragment> + <Fragment slot="dont">Log in to your account to save the item to your Workspace</Fragment> +</BestPractices> + +## 3. Be concise + +It's worth saying again: The way we write is simple and direct. + +<BestPractices> + <Fragment slot="do">Save changes?</Fragment> + <Fragment slot="dont">Would you like to save your changes?</Fragment> +</BestPractices> + +## 4. Be positive + +Emphasize the action a user can take, not the action they can't. + +<BestPractices> + <Fragment slot="do">To sign in, you must be an authorized user.</Fragment> + <Fragment slot="dont">You're not authorized to view this page.</Fragment> +</BestPractices> + +## 5. Avoid jargon, idioms, and slang + +Communications need to be understood by users the world over. Even the most common expressions in +the US aren't always understandable in other countries. "Catch you later" for "goodbye" or "no +problem" instead of "you're welcome" can lead to confusion. Jargon and internal terminology are also +to be avoided. + +<BestPractices> + <Fragment slot="do">Video is loading</Fragment> + <Fragment slot="dont">Buffering…</Fragment> +</BestPractices> + +## 6. Be consistent + +Use the same wording to refer to the same items and actions; don't talk about the archive in one +paragraph and switch to database in the next. + +<BestPractices> + <Fragment slot="do"> + Click here to download the PDF. If the PDF is large, it may take some time for the download to + start. + </Fragment> + <Fragment slot="dont"> + Click here to download the PDF. If the document is large, it may take some time for the file + transfer to start. + </Fragment> +</BestPractices> + +## 7. Stay active + +Avoid passive voice. Use active verbs and direct forms of speech whenever possible. It's clearer and +sounds more personal. Things aren't done, we do things. It's clearer, and it sounds better. + +<BestPractices> + <Fragment slot="do">We are extending expanded access through December 31.</Fragment> + <Fragment slot="dont">Expanded access has been extended through December 31.</Fragment> +</BestPractices> + +## 8. Avoid negative constructions + +<BestPractices> + <Fragment slot="do">Sign up to access the content.</Fragment> + <Fragment slot="dont">You cannot access the content without signing up.</Fragment> +</BestPractices> + +## 9. Use contractions + +Contractions sound more conversational. + +<BestPractices> + <Fragment slot="do">Don't hesitate to reach out.</Fragment> + <Fragment slot="dont">Do not hesitate to get in touch with us.</Fragment> +</BestPractices> + +## 10. Read it aloud + +If it doesn't sound right, it doesn't read right either. It's also a good way to catch typos and +errors. diff --git a/packages/pharos-site-astro/src/pages/content-style-guide/grammar-and-style.mdx b/packages/pharos-site-astro/src/pages/content-style-guide/grammar-and-style.mdx new file mode 100644 index 000000000..d71633a9e --- /dev/null +++ b/packages/pharos-site-astro/src/pages/content-style-guide/grammar-and-style.mdx @@ -0,0 +1,142 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Grammar and Style' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import BestPractices from '@components/BestPractices.astro'; + +export const components = mdxComponents; + +export const actions = [ + 'They "visit" or "go to" a webpage', + 'They "open" a drop-down menu.', + 'They "select" a subpage, tab, or dropdown menu item.', + 'They "select" a button or link.', +]; + +export const acronyms = ['First: Single Sign-On (SSO)', 'Second: SSO']; + +{/* prettier-ignore */} +<div style="margin-bottom: var(--pharos-spacing-5-x); font-size: var(--pharos-type-scale-6); line-height: 2rem;"> + <p>This is our house style; for anything not covered here we follow the <site-pharos-link href="https://www.chicagomanualofstyle.org/home.html" target="_blank">Chicago Manual of Style</site-pharos-link>.</p> +</div> + +### Actions + +<div> + <p>These are the actions that people take as they use our sites:</p> + <ul> + {actions.map((string) => <li style="list-style: none;">{string}</li>)} + </ul> + <p>Try device-agnostic words that describe the action, irrespective of the interface. When in doubt, use "select." Don't use "navigate" or "navigate to."</p> +</div> + +### Acronyms + +If there's a chance your reader won't recognize an abbreviation or acronym, spell it out the first +time you mention it and follow with the acronym in parenthesis. After that, you can just use the +acronym. + +<ul> + {acronyms.map((string) => <li style="list-style: none;">{string}</li>)} +</ul> + +If the acronym is only used once in the copy, consider skipping it altogether and just use the full +term. + +### Ampersands + +Don't use ampersands unless they're part of an official title (e.g. Register & Read or Language +& Literature). Instead use "and." + +### Commas + +Use a comma before a conjunction (e.g. "and," "or," and "but") when it joins two independent +clauses. + +<BestPractices> + <Fragment slot="do"> + We believe education is key to the well-being of individuals and society, and we work to make it + more effective and affordable. + </Fragment> + <Fragment slot="dont"> + We believe education is key to the well-being of individuals, and society. + </Fragment> +</BestPractices> + +### Dates + +When specific dates are expressed, cardinal numbers are used (e.g., November 5). Do not write +"November 5th." Wherever possible, spell out the full month or shorten it to three characters (i.e. +Nov 5). Where appropriate, represent dates or date ranges numerically as YYYY-MM-DD to align with +the COUNTER 5 standard (i.e. in reporting and tables). + +<BestPractices> + <Fragment slot="do">Join us on November 19 for the final session.</Fragment> + <Fragment slot="dont">Sign up for a webinar on 5/11/2020.</Fragment> +</BestPractices> + +### Email addresses + +When referencing contact information, ask for an email address. An "email" is the correspondence +sent to that address. + +### Exclamation marks + +Use exclamation points sparingly and only for positive messages; never use exclamation marks in +feature announcements, error messages, or alerts. Also, don't use them more than once in a message, +and never more than one exclamation mark at a time. + +<BestPractices> + <Fragment slot="do">Thanks for your participation!</Fragment> + <Fragment slot="dont">Your username/password are wrong!!</Fragment> +</BestPractices> + +### Ellipses (...) + +There are two main uses for ellipses in the product: to show that an action is in progress (e.g. +"Loading…" "Connecting…" "Uploading…"), and to shorten words when the text gets too long (a.k.a. +truncation). + +### Home page + +Two words. Not "homepage." + +### Login, log in, log in to + +"Log in" is the verb and "login" is the noun. That is, use "log in" when describing the action, +"login" when describing an account. Also: you "log in to" your JSTOR account, not "log into." + +### Numbers + +The numbers zero through nine should be spelled out. Use numerals for all higher numbers unless the +number is the first word in the sentence. In numbers of more than three digits, use a comma after +every third digit from right to left (e.g. 1,537,000). + +### Content on JSTOR + +Both when quoting something and when using quotation marks for other reasons (such as an article +title), punctuation goes within the quotation marks. + +<BestPractices> + <Fragment slot="do"> + "The Open Community Collections initiative is a great opportunity for our organization," said + Stephen Brooks. + </Fragment> + <Fragment slot="dont"> + You can download "Proposals Relating to the Education of Youth in Pennsylvania", written by + Benjamin Franklin. + </Fragment> +</BestPractices> + +### Single space after periods + +Double spacing after periods is a leftover from writing on typewriters, and it's no longer +necessary. + +### Time + +We are communicating with users around the world, so always indicate the time zone we're referring +to (usually ET or EST, but it depends on the area we are targeting). Use uppercase "AM" and "PM" +with one space after the numerical time. diff --git a/packages/pharos-site-astro/src/pages/content-style-guide/jstor-terms.mdx b/packages/pharos-site-astro/src/pages/content-style-guide/jstor-terms.mdx new file mode 100644 index 000000000..74bf43963 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/content-style-guide/jstor-terms.mdx @@ -0,0 +1,161 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'JSTOR terms' +description: 'Consistency is key in branding. It helps our users remember our products and services, and it makes our brand easily recognizable across our many channels and touch points.' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import BestPractices from '@components/BestPractices.astro'; + +export const components = mdxComponents; + +## Organization and products + +### ITHAKA + +ITHAKA should always be spelled in all capital letters. ITHAKA is described as an "organization," not +a company. We are a not-for-profit (believe it or not, there is a legal difference between a +nonprofit and a not-for-profit). + +### JSTOR + +Use "library," "platform," or simply "JSTOR" as a proper noun. JSTOR is a digital library; a research +and teaching platform; a not-for-profit service. + +As with a website, you find elements "on" JSTOR. Not "at" or "in." + +Don't use jstor.org when you mean JSTOR the service, only use it when you are pointing to the page, +and always spell the URL in lowercase. + +### JSTOR Forum + +Always call it JSTOR Forum on the first mention; you may just call it Forum after that. + +### Artstor + +As we prepare for the integration of Artstor into the JSTOR platform, we are no longer referring to +the Artstor Digital Library (ADL); it is now simply Artstor. + +Some categories of Artstor include Artstor Public Collections (capitalized since it's a proper name), +which are freely available collections contributed by institutions using JSTOR Forum, and Open +Artstor, Creative Commons-licensed collections aggregated from museums, libraries and archives. + +Artstor Image Workspace (AIW) is an internal way to refer to the platform (in distinction to the +collections); don't use this term externally. + +## Individual access programs + +We offer a few different individual access programs for independent researchers. + +### Free online reading + +Free online reading enables any user with a JSTOR account to read a number of articles free each +month. This access program is often referred to internally as register & read. + +<BestPractices> + <Fragment slot="do"> + Journals on JSTOR span hundreds of years and more than 50 disciplines. + </Fragment> + <Fragment slot="dont"> + JSTOR's journals span hundreds of years and more than 50 disciplines. + </Fragment> +</BestPractices> + +### JPASS + +JPASS offers monthly or annual access to 2,000+ journals on JSTOR and the Struggles for Freedom: +Southern Africa primary sources collection. When referring to the JPASS program, say "JPASS" or +"JPASS plans." When referencing an individual's JPASS subscription, refer to it as their "JPASS +plan." + +<BestPractices> + <Fragment slot="do">We offer an auto-renew option for the JPASS monthly plan.</Fragment> + <Fragment slot="dont">Buy your JPASS now!</Fragment> +</BestPractices> + +### PSS + +Independent researchers can purchase lifetime access to individual articles and issues through +Publisher Sales Service (PSS). PSS is most frequently used internally. + +<BestPractices> + <Fragment slot="do">Purchase article</Fragment> + <Fragment slot="dont">Buy this article through PSS.</Fragment> +</BestPractices> + +## Books at JSTOR + +JSTOR offers the following ebook acquisition models: Demand-Driven Acquisition (DDA), Evidence-Based +Acquisition (EBA), and individual title acquisition (sometimes referred internally as Pick 'n' Mix). +Our DDA payment models are deposit and pay-as-you-go. + +Do not abbreviate as "Books @ JSTOR" or "B@J. Use the word "books" when talking about high-level +descriptions of Books at JSTOR. Use "ebooks" on descriptions and more granular explanations. + +<BestPractices> + <Fragment slot="do"><span>Do you know about our books program?</span><p>We have over 50,000 ebooks in the Books at JSTOR program.</p></Fragment> + <Fragment slot="dont">Check out our B@JSTOR program to learn all about our e-Books.</Fragment> +</BestPractices> + +### Ebook + +We use the compound word ebook (except when talking about Books at JSTOR at a higher level). When +using at the beginning of a sentence and in title case headings, capitalize the e. + +<BestPractices> + <Fragment slot="do">Ebooks preserved in Portico</Fragment> + <Fragment slot="dont">Portico preserves e-Books</Fragment> +</BestPractices> + +## Other terms + +### Collections + +Capitalize "collection" when it is used in the title of a collection (e.g., "the Arts & Sciences I +Collection"), but not when it is used more generally to refer to groups of titles (e.g., "archival +journal collections on JSTOR"). For all Arts & Sciences collections, an ampersand (&) should always +be used—never the word "and." + +We refer to Open Community Collections as an initiative, and it's composed of collections that are +made freely available to everyone. The institutions that provide the content are referred to as +contributors. + +### Content on JSTOR + +Avoid using the possessive in relation to content on JSTOR. JSTOR does not publish its own content, +but rather provides a platform for it. + +<BestPractices> + <Fragment slot="do">Journals on JSTOR span hundreds of years and more than 50 disciplines.</Fragment> + <Fragment slot="dont">JSTOR's journals span hundreds of years and more than 50 disciplines.</Fragment> +</BestPractices> + +### JSTOR Support + +We refer to our "Partner and User Services" team as "JSTOR Support" externally. If you are directing +users to get in touch with our support team, say contact JSTOR Support and link the full phrase. + +### Participant + +Institutions that provide access to content on JSTOR are called "participants," not customers, +clients, etc. + +Use "participant" and its variants when referring to an institution. + +<BestPractices> + <Fragment slot="do">Participants include small institutions, large universities, and secondary schools.</Fragment> + <Fragment slot="dont">Our clients are anyone from high schools to large institutions.</Fragment> +</BestPractices> + +### User + +Use the term "user" when referring to an individual. + +<BestPractices> + <Fragment slot="do">JSTOR offers more than 6,000 Open Access ebooks at no cost to users.</Fragment> + <Fragment slot="dont">JSTOR is offering expanded access to participants through June 31, 2021.</Fragment> +</BestPractices> + +### User accounts + +For the most part, we refer to accounts for which users register as JSTOR accounts. diff --git a/packages/pharos-site-astro/src/pages/content-style-guide/voice-and-tone.mdx b/packages/pharos-site-astro/src/pages/content-style-guide/voice-and-tone.mdx new file mode 100644 index 000000000..128f06684 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/content-style-guide/voice-and-tone.mdx @@ -0,0 +1,130 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Voice and tone' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import voiceToneStyleImage from '@images/content-style-guide/voice-tone-style_image.jpg'; +import { Image } from 'astro:assets'; + +export const components = mdxComponents; + +{/* +Most of this page's structure is hand-written markup rather than PageSection: +the inline styles carry the type scale and spacing, so the divs are preserved +verbatim instead of being flattened into Markdown. Headings that a PageSection +would have rendered are written as Markdown; the ones inside the styled divs +stay as <site-pharos-heading> so they keep their place in the wrapper. +*/} + +{/* prettier-ignore */} +<div style="margin-bottom: var(--pharos-spacing-5-x); font-size: var(--pharos-type-scale-6); line-height: 2rem;"> + <p>This guide provides a central resource for writing and editing communications using a consistent voice and style to support and reinforce the core tenets of our brand.</p> +</div> + +{/* prettier-ignore */} +<div style="padding: 0 var(--pharos-spacing-5-x);"> + <div> + <Image + src={voiceToneStyleImage} + alt="Felice Feliciano da Verona, Letters, 15th century, Bodleian Library, University of Oxford" + style="height: auto; max-width: 100%;" + /> + </div> + <div> + <site-pharos-link href="https://www.jstor.org/stable/community.14612489" target="_blank">Felice Feliciano da Verona, Letters, 15th century, Bodleian Library, University of Oxford</site-pharos-link> + </div> +</div> + +## Introduction + +{/* prettier-ignore */} +<div style="font-size: var(--pharos-type-scale-4);"> + <p>JSTOR is a partner to libraries, museums, and publishers. We work hard to reduce costs and extend access to underserved populations. The way we communicate with the world is a reflection of these efforts.</p> + <p>The essence of our mission at JSTOR comes through in all our interactions consistently, whether we're emailing librarians about our services, helping a user who lost their password, or presenting images in their search results. By being consistent, we provide our users with a seamless experience and build their trust.</p> + <p>This guide will help you keep a consistent voice and style when writing for JSTOR to maintain this trust.</p> +</div> + +## Voice + +{/* prettier-ignore */} +<p style="font-size: var(--pharos-type-scale-4);">The JSTOR voice is clear, trustworthy, and authentic. Copy is conversational, answers users' questions, and guides them through tasks. This conversation is the core of UX writing, and it runs through the entire user experience.</p> + +{/* prettier-ignore */} +<div class="doc-topic--section"> + <site-pharos-heading level="3" preset="4">Clear</site-pharos-heading> + <p>People use JSTOR for their research; our efforts to communicate should make this as easy as possible, which is why clarity is the most important aspect in our writing.</p> + <p>Writing is conversational and at times delightful, but doesn't get in the way of telling the user what's going on. There is room for personality in our one-on-one interactions, but always keep in mind that our communications need to be understood by users the world over.</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic--section"> + <site-pharos-heading level="3" preset="4">Trustworthy</site-pharos-heading> + <p>We are a resource for research and knowledge. Good writing and proper grammar reinforces our users' trust in our reliability. Keeping this trust is also why we never make any claims without backing them up.</p> +</div> + +{/* prettier-ignore */} +<site-pharos-heading level="3" preset="4">Authentic</site-pharos-heading> + +{/* prettier-ignore */} +<p>We sound like who we are: real people talking about real things. We write like we speak—no salesy language or robotic instructions. As genuine partners of the academic and research communities, we write authentically.</p> + +## Tone + +{/* prettier-ignore */} +<div style="margin-bottom: var(--pharos-spacing-3-x); font-size: var(--pharos-type-scale-4);"> + <p>While we maintain the same voice through all our communications — clear, trustworthy, and authentic — different touch points and scenarios along the user's journey call for different tones.</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic"> + <site-pharos-heading level="3" preset="4">The four dimensions of tone</site-pharos-heading> + <p>As outlined by UX researchers at the Nielsen Norman Group, there are four main dimensions of tone: funny/serious, formal/casual, respectful/irreverent, and enthusiastic/matter-of-fact. While generally JSTOR will lean towards being serious, casual, respectful, and matter of fact, we adjust these dimensions according to the context of our message, both in what we're trying to communicate and the channels in which we are communicating.</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic"> + <site-pharos-heading level="4" preset="2">Serious over funny</site-pharos-heading> + <p>Our users are on JSTOR primarily to do research — they may be writing a paper, studying for an exam, or preparing a course, so they want information, not jokes. Occasionally, there may be opportunities for humor, but tread with care. Ask yourself: will a stressed-out university student having difficulties logging in really find this amusing?</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic"> + <site-pharos-heading level="4" preset="2">Casual over formal</site-pharos-heading> + <p>While academic content is often formal, we want JSTOR itself to be accessible and personal, so we take a casual tone as a reminder that there are real people behind the platform and the organization.</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic"> + <site-pharos-heading level="4" preset="2">Respectful over irreverent</site-pharos-heading> + <p>Not unlike serious vs. funny, to earn our users' trust, our tone is always respectful.</p> +</div> + +{/* prettier-ignore */} +<div> + <site-pharos-heading level="4" preset="2">Matter-of-fact over enthusiastic</site-pharos-heading> + <p>As part of our authenticity, we use a matter-of-fact tone — no hyperbole, no fuss, no hard sell. You could say we keep things cool. These are all subjective qualities, of course. Just remember, as we do in personal conversations, we adapt our tone depending on who we're communicating with and what we're saying to them. Not sure if you're getting it quite right? Try saying it out loud.</p> +</div> + +## Writing Principles + +{/* prettier-ignore */} +<div class="doc-topic--section"> + <site-pharos-heading level="3" preset="4">Useful</site-pharos-heading> + <p>Our job, always, is to help. Keep the user in mind and the particular needs we're addressing in each message. Our copy is focused on getting the user to take a specific action; help them understand what our product can do for them and how to do it.</p> +</div> + +{/* prettier-ignore */} +<div class="doc-topic--section"> + <site-pharos-heading level="3" preset="4">Concise</site-pharos-heading> + <p>We use plain language — it's how people speak, and it's how they search the web. Short, simple words are preferable to fancy ones.</p> + <p>The way we write is simple and direct, and for all reading levels. It should be understandable by anyone regardless of their culture, language, or ability.</p> +</div> + +{/* prettier-ignore */} +<div> + <site-pharos-heading level="3" preset="4">Consistent</site-pharos-heading> + <p>Our voice is consistent across all products and interfaces, as if it were written by the same person. Users should experience a seamless transition as they make their way through our systems.</p> + <p>We address readers directly. Use the word "you" for them and "we" for our organization.</p> + <p>Use the same wording to refer to the same items and actions; don't talk about the archive in one paragraph and switch to database in the next.</p> +</div> diff --git a/packages/pharos-site-astro/src/pages/content-style-guide/web-elements.mdx b/packages/pharos-site-astro/src/pages/content-style-guide/web-elements.mdx new file mode 100644 index 000000000..8e1a91f75 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/content-style-guide/web-elements.mdx @@ -0,0 +1,273 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Web elements' +description: 'Web elements are the components on a page that users interact with, such as forms, dropdown menus, and error messages, as well as the items that help guide them through the content, like headers and hyperlinks.' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import BestPractices from '@components/BestPractices.astro'; + +export const components = mdxComponents; + +## General + +Perhaps more than any other writing on our sites, web elements call for clarity and conciseness. +They should help our users complete whatever they are there to do without confusing or distracting +them. + +### Alerts + +Alerts should be as specific as possible, explaining what the issue is, what actions the user can +take, and whenever possible, how long we expect the issue will take (such as in the case of expected +updates or maintenance). Use sentence case and appropriate punctuation. + +### Calls to action (CTAs) + +CTAs such as buttons should suggest the action the user would take in the fewest words possible. Be +clear and concise and write in sentence case. + +<BestPractices> + <Fragment slot="do">Cite</Fragment> + <Fragment slot="dont">Click here to copy or download citation</Fragment> +</BestPractices> + +### Dropdown menus + +Keep the content on dropdown menus brief, no longer than three words. When using the term, use it as +an adjective preceding a word like 'menu'. Use as a noun sparingly. + +<BestPractices> + <Fragment slot="do">Open the dropdown menu</Fragment> + <Fragment slot="dont">Tap the dropdown</Fragment> +</BestPractices> + +### Error messages + +Error messages should be specific about what went wrong, then suggest what to do next, including a +link to the appropriate Support page if available. Don't include error codes in the message. + +If the user made an error, the messaging should provide a reason for the error, a recommended next +step, and a way to contact us, if needed. If there are multiple errors, summarize them in a logical +order. + +<BestPractices> + <Fragment slot="do"> + Please correct the following highlighted fields before continuing: + + - Username + - Password + - Terms and Conditions + + </Fragment> + <Fragment slot="dont"> + You left multiple fields below blank. In order to continue, you must fill them in. + </Fragment> +</BestPractices> + +If there is a system error or something went wrong on our end, be apologetic, take the blame, +provide a reason for the alert, and a way to contact us. + +<BestPractices> + <Fragment slot="do"> + Sorry, there was an issue processing your report. Please try again. If the issue persists, [contact JSTOR Support](#). + </Fragment> + <Fragment slot="dont">We cannot currently fulfill API requests at this time.</Fragment> +</BestPractices> + +If the error message is a single sentence, don't add a period at the end. If it is more than one +sentence, punctuate normally. + +<BestPractices> + <Fragment slot="do">Password does not meet requirements</Fragment> +</BestPractices> + +<BestPractices> + <Fragment slot="do"> + Sorry, we couldn't create your folder. Please try again later. If the issue persists, [contact JSTOR Support](#). + </Fragment> +</BestPractices> + +Error messaging should be action oriented. Be as specific as possible when writing field validation +errors. + +<BestPractices> + <Fragment slot="do">Enter an email address</Fragment> + <Fragment slot="dont">This field is required.</Fragment> +</BestPractices> + +### Forms + +Form titles should describe the purpose of the form concisely. As with headings and subheadings, use +sentence case. + +Labels are written in sentence case, and they should not end in punctuation. Labels are concise with +no more than three words. Avoid punctuation and articles ("the," "a," "an"). Choose nouns over +verbs. + +<BestPractices> + <label slot="do">Role</label> + <label slot="dont">Choose a role.</label> +</BestPractices> + +As with labels, also use sentence case for checkboxes and radio button fields. + +### Headings and subheadings + +Organize your content with headings and subheadings to identify sections and groupings of content +and make it easy for readers to scan. Headings are also important for accessibility, as they are +used to navigate the page. + +The heading and subheadings should provide a glimpse of the most important aspect of the information +that follows. Organize them by size (i.e. H1 > H2 > H3) corresponding to the content they're +covering (main topic > aspect of that topic > finer points). + +Wherever possible, write headlines in sentence case — studies indicate that sentence case is easier +to read, plus title case can come across as heavy and overly serious. + +### Links + +{/* + The bare URLs on this page are examples of copy, not links. GFM autolinks a + bare URL, which would turn this guidance — and the "don't" example below — + into clickable links. Passing the string through a JSX expression keeps it out + of the Markdown scanner; a wrapping element does not, because autolinking + happens inside it. +*/} + +Don't use URLs unless there's a compelling reason (such as an easy-to-memorize link like +jstor.org/open). If you do use an URL, don't include "{'https://www.'}" + +Don't use "here" or "on this page" as a link. The link text should accurately describe what the user +can expect when they click the link. It's good practice for accessibility, and it makes for better +copy. + +<BestPractices> + <Fragment slot="do"> + Your reports are [available for download](#). + </Fragment> + <Fragment slot="dont"> + You can download your report [here](#). + </Fragment> +</BestPractices> + +<BestPractices> + <Fragment slot="dont"> + You can download your report at {'https://www.jstor.org/showLogin?redirect=/librarians'}. + </Fragment> +</BestPractices> + +### Lists + +Lists are easier to scan than blocks of text; use them to present steps, groups, or sets of +information. Start with a brief introduction to give context. + +Capitalize the first word of each item, but only use punctuation if any of the list items is a +complete sentence. Number lists only when the order is important, otherwise use bullet points. Make +the list items parallel in structure—don't change the subject in the list. + +<BestPractices> + <Fragment slot="do"> + How to participate: + + 1. Choose your content + 2. Find your classification + 3. Request a quote + 4. Sign and submit the agreement + + </Fragment> + <Fragment slot="dont"> + We offer collections of the latest book titles in core disciplines that are highly used on JSTOR, as listed below: + + 1. History + 2. Language and Literature + 3. Political Science + 4. JSTOR collections provide perpetual access with no recurring fees + + </Fragment> +</BestPractices> + +### Navigation menus + +Menu headings and items should be clear and concise. Use one to three words. + +<BestPractices> + <Fragment slot="do">Browse</Fragment> + <Fragment slot="dont">Browse Content on JSTOR</Fragment> +</BestPractices> + +<BestPractices> + <Fragment slot="do">Support</Fragment> + <Fragment slot="dont">Visit our Support Site</Fragment> +</BestPractices> + +### Placeholder text + +In text inputs, placeholder text is shown inside the text input to help users know what information +they can enter. Field placeholder text is used for supplementary information. The text should be +written as examples instead of instructions. + +<BestPractices> + <Fragment slot="do">Sample University</Fragment> + <Fragment slot="dont">Enter the name of your institution</Fragment> +</BestPractices> + +For selects (dropdown inputs), without a default option, the placeholder text should start with +'Select' and follow with the label text. + +<BestPractices> + <Fragment slot="do">Select a role</Fragment> + <Fragment slot="dont">Type your role here.</Fragment> +</BestPractices> + +## Accessibility + +Our job, always, is to help. Keep the user in mind and the particular needs we're addressing in each +message. Our copy is focused on getting the user to take a specific action; help them understand +what our product can do for them and how to do it. + +### Aria-label/writing for assistive technology + +Make the visual label and the accessible name the same when possible; otherwise, have the visible +label text at the beginning of the accessible name. + +Make labels visible, unique, and descriptive, as having the same label for different items makes it +difficult for speech software to understand which one the user is requesting. + +### Alt text + +Alt text should describe an image, graph, or chart briefly. While alt text is good for search engine +optimization (SEO), our main focus is to help those who can't see the images on our website. + +Consider three aspects in the description: object (the main focus), action (what is happening), and +context (the environment in which you find the object and action). + +Don't start with "image of…" Avoid describing the gender, age, or race of subjects in images, unless +it's necessary to understand the content. If the image is just decorative, leave the alt tag blank +so screen-readers will skip it. + +<BestPractices> + <Fragment slot="do">Three students looking at a tablet in a library.</Fragment> + <Fragment slot="dont">Image of a young Asian man in a museum</Fragment> +</BestPractices> + +<BestPractices> + <Fragment slot="do">Chart representing the 12% growth of journal articles in 2019</Fragment> +</BestPractices> + +### Consistent identification + +Make interactive elements consistent in identification and functionality. Don't label a search +button "submit" on one page and "find" on another. + +### Directional language + +Avoid using phrases like "above," "below," "on the right," etc. or describing an element by color. + +<BestPractices> + <Fragment slot="do">Click Continue</Fragment> + <Fragment slot="dont">Click the large red button below</Fragment> +</BestPractices> + +<div> + <p>For more on writing accessible content, visit the <site-pharos-link href="https://www.w3.org/WAI/standards-guidelines/wcag/">Web Content Accessibility Guidelines (WCAG)</site-pharos-link>.</p> +</div> diff --git a/packages/pharos-site-astro/src/pages/contributing/development.mdx b/packages/pharos-site-astro/src/pages/contributing/development.mdx new file mode 100644 index 000000000..dc627d943 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/contributing/development.mdx @@ -0,0 +1,73 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Contributing development' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const components = mdxComponents; + +Pharos is a living design system that continues to expand with help from the community. We're +excited to work with contributors like you to further enrich the system. Discussions about issues, +bugs, and features for Pharos take place on GitHub. If you don't have a GitHub account, +[create one](https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F&source=header-home) +to join the community. + +You can contribute to Pharos in three ways: + +1. **Open an issue or feature request:** The maintainers will review the issue or request and + respond with appropriate next steps. If accepted, it will be added to an upcoming milestone. When + possible, a tentative timeline will be shared to give members an estimate of when to expect the + next release. +2. **Make the change in Pharos:** To make the contribution yourself please follow the process + outlined below. The maintainers are more than happy to assist and support you through the + contribution. +3. **Join a discussion:** Community members can get involved with asking or helping answer + questions, sharing updates, and following along with potential decisions in the project's + [open communication forum](https://github.com/ithaka/pharos/discussions) on GitHub. + +## The Pharos community + +### Users + +Pharos users follow the [system's guidelines](/brand-expressions/logos) to implement Pharos into +their product or marketing needs. + +### Contributors + +Contributors are community members who report bugs, request new features, or make changes to the +system. Changes can include adding a new feature, fixing a bug, or updating documentation. + +### Maintainers + +Maintainers are community members who are involved with helping maintain the repository, +participating in planning future needs and milestones, triaging issues. This involves labeling, +closing, and merging pull requests. + +## The process + +1. **Open a GitHub issue:** + 1. If so, please comment on the issue that you'd like to address it so that the maintainers are + aware of your intent and can assign you. + 2. If not, create one using either the + [feature request](https://github.com/ithaka/pharos/issues/new?assignees=&labels=feature+request&template=feature_request.md) + or + [bug report](https://github.com/ithaka/pharos/issues/new?assignees=&labels=bug&template=bug_report.md) + template, depending on the type of contribution. Then assign yourself to it for visibility. +2. **Make the change:** If you haven't already done so, clone the + [repo](https://github.com/ithaka/pharos) and create a new branch for your contribution. Review + the [development guidelines](https://github.com/ithaka/pharos/blob/develop/docs/README.md) to + learn about contributing code to Pharos. +3. **Open a pull request:** Follow the + [guidelines](https://github.com/ithaka/pharos/blob/develop/docs/development/conventions/pull-requests.md), + fill out the pull request template as best you can, and request a review from the <i>Pharos + maintainers</i> team. +4. **Pass checks:** + 1. Lint - Analyzes your code for problematic patterns + 2. Test - Runs browser tests and validates code coverage thresholds are met + 3. Chromatic (for Storybook and component related changes) - Takes snapshots of all stories in + Storybook and compares them against the baseline + 4. Netlify preview (for site related changes) - Generates a preview build of the site for the + maintainers to review and provide feedback +5. **Await approval:** Address feedback and get approval from development and design. From here the + maintainers will merge your changes and include it in the next release. diff --git a/packages/pharos-site-astro/src/pages/contributing/documentation.mdx b/packages/pharos-site-astro/src/pages/contributing/documentation.mdx new file mode 100644 index 000000000..266e3e8a8 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/contributing/documentation.mdx @@ -0,0 +1,128 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Contributing documentation' +description: 'For all Pharos components and elements, contributors create useful, thorough documentation to provide an understanding of its proper usage and context.' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const components = mdxComponents; + +export const pdf = '/files/documentations/documentation-template.pdf'; + +{/* +The <site-pharos-heading level="4" preset="2"> headings below are kept as +hand-written elements: no Markdown level maps to that pair (`####` renders +level 4 with preset `1--bold`), so writing them as `####` would change the +type. The `level="4" preset="1--bold"` ones are left explicit too, so the two +tiers stay visibly distinct. +*/} + +## Importance + +Documentation is essential to upholding quality and cohesion. Articulate and thorough documentation +allows for users and contributors to acquire knowledge more efficiently, motivating further +contribution and information sharing. Referring to documentation helps to reduce redundancy in +components and features while ensuring all implemented features are being used appropriately and to +their fullest potential. + +## When documentation is needed + +When a new component or feature is added, supporting documentation should be written to communicate +and provide guidelines for its proper usage. Additionally, if changes are made to existing +components that affect their usage or functionality, the documentation should reflect these changes. + +## Writing documentation + +### Getting started + +To get started, use the <site-pharos-link href={pdf}>documentation template</site-pharos-link> to +ensure all needed sections are included and consistent. + +### Writing guidelines + +Please refer to the [JSTOR content style guide](/content-style-guide/voice-and-tone) to gain a +better understanding of our collective writing style and structure. We apply our writing principles +when creating documentation. + +<site-pharos-heading level="4" preset="2">Concise</site-pharos-heading> + +The way we write is simple and direct, and for all reading levels. It should be understandable by +anyone regardless of their culture, language, or ability. We aim to provide the right amount of +context so our users know how to use Pharos components or elements successfully. + +<site-pharos-heading level="4" preset="2">Consistent</site-pharos-heading> + +We use the same template for each of the components to create predictability in understanding their +purpose, standards, and variations. We also aim to use consistent language in all documentation so +users experience a seamless transition as they make their way through the site. + +<site-pharos-heading level="4" preset="2">Style</site-pharos-heading> + +Wherever possible, write headings and titles in sentence case — studies indicate that sentence case +is easier to read, plus title case can come across as heavy and overly serious. + +### Documentation categories + +<site-pharos-heading level="4" preset="2">Title</site-pharos-heading> + +Title of the Component (singular) + +<site-pharos-heading level="4" preset="2">Deck</site-pharos-heading> + +Tweet-length description of the component and its purpose. + +<site-pharos-heading level="4" preset="2">Usage</site-pharos-heading> + +Explain the implementation of the element (e.g. orientation, placement, use cases). Indicate any +behavior that a user would need to know that should happen when using this component in their UI. + +<site-pharos-heading level="4" preset="2">Best practices</site-pharos-heading> + +<site-pharos-heading level="4" preset="1--bold">Do's</site-pharos-heading> + +Explain appropriate use cases for the component, general guidelines to follow when using, and other +considerations that should be made in the component's usage. + +<site-pharos-heading level="4" preset="1--bold">Don'ts</site-pharos-heading> + +Include common misuse cases for the component, common errors made in its usage, and other actions to +avoid. + +<site-pharos-heading level="4" preset="2">Content guidelines (If applicable)</site-pharos-heading> + +If a component has content, please include guidelines for how the content should be written for the +needs of the component (e.g., how labels should be written). + +<site-pharos-heading level="4" preset="2">Variants (If applicable)</site-pharos-heading> + +If a component has variants, display an example of the Pharos variant along with their title, +purposes, and use cases (e.g. Error, Warning, Info, and Success Alerts). + +<site-pharos-heading level="4" preset="2">States (If applicable)</site-pharos-heading> + +If a component has multiple states (e.g. disabled, enabled, error, required), please include them. +Include an example of the component in each state. + +<site-pharos-heading level="4" preset="2">Accessibility</site-pharos-heading> + +<site-pharos-heading level="4" preset="1--bold">Relevant guidelines</site-pharos-heading> + +Include any WCAG guidelines that are applicable to the component for reference. + +<site-pharos-heading level="4" preset="1--bold">Visual expectations</site-pharos-heading> + +If a component has any design elements that are specifically for accessibility reasons add that +here. This section will not always appear as previous sections in the documentation may cover this +content. + +<site-pharos-heading level="4" preset="1--bold">Code expectations</site-pharos-heading> + +Outlines any code needed to successfully implement the component. Semantic elements should be +indicated with <code><code></code> tags for clarity. In addition, include any important points +pertaining to implementation. + +<site-pharos-heading level="4" preset="1--bold">Expected actions</site-pharos-heading> + +Include any relevant keyboard commands and their behavior. There also needs to be a screen reader +section, which should list what to expect audibly when interacting with a component. diff --git a/packages/pharos-site-astro/src/pages/design-tokens/alias-colors.astro b/packages/pharos-site-astro/src/pages/design-tokens/alias-colors.astro new file mode 100644 index 000000000..c0a4692da --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/alias-colors.astro @@ -0,0 +1,41 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import ColorTable from '@components/ColorTable.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +const color = tokens.color as Record<string, never>; + +/** Flattens a token group (e.g. `color.interactive`) into a list of tokens. */ +const group = (name: string): DesignToken[] => + Object.values((color[name] ?? {}) as Record<string, DesignToken>); + +/** A group that is itself a single token, such as `color.disabled`. */ +const single = (name: string): DesignToken[] => (color[name] ? [color[name] as DesignToken] : []); + +const baseTokens = [ + ...group('interactive'), + ...group('ui'), + ...single('disabled'), + ...single('overlay'), + ...group('feedback'), +]; +const textTokens = group('text'); +const interactionTokens = [...single('focus'), ...group('hover')]; +--- + +<Layout title="Alias colors"> + <PageSection title="Alias colors" isHeader> + <TokenTable> + <ColorTable tokens={baseTokens} /> + </TokenTable> + <TokenTable title="Text color"> + <ColorTable tokens={textTokens} /> + </TokenTable> + <TokenTable title="Interaction color"> + <ColorTable tokens={interactionTokens} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/elevation.astro b/packages/pharos-site-astro/src/pages/design-tokens/elevation.astro new file mode 100644 index 000000000..15efc61cb --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/elevation.astro @@ -0,0 +1,28 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +const levels = tokens.elevation.level as unknown as Record<string, DesignToken>; +const rows = Object.keys(levels) + .filter((key) => key !== 'gutter') + .map((key) => levels[key]) + .map((token) => ({ + name: token.name, + value: token.value, + examples: [ + `<div style="box-shadow: ${token.value}; background: #FFFFF; width: 201px; height: 142px; display: inline-block; border-radius: 2px;"></div>`, + ], + })); +--- + +<Layout title="Elevation"> + <PageSection title="Elevation" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/font-family.astro b/packages/pharos-site-astro/src/pages/design-tokens/font-family.astro new file mode 100644 index 000000000..5f3d5d6f9 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/font-family.astro @@ -0,0 +1,29 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +const families = Object.values(tokens.font.family as Record<string, DesignToken>); + +const rows = families.map((token) => { + const style = `font-family: ${token.value}; font-size: 1.5rem; line-height: normal;`; + return { + name: token.name, + value: token.value, + examples: [ + `<div style="${style}">ABCDEFGHIJKLMNOPQRSTUVWXYZ</div><div style="${style}">abcdefghijklmnopqrstuvwxyz</div>`, + ], + }; +}); +--- + +<Layout title="Font family"> + <PageSection title="Font family" isHeader> + <TokenTable> + <TokenRows rows={rows} columnWidths={['33%', '33%', '36%']} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/font-size.astro b/packages/pharos-site-astro/src/pages/design-tokens/font-size.astro new file mode 100644 index 000000000..9ab84c425 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/font-size.astro @@ -0,0 +1,38 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken, ScaleToken } from '@lib/tokenFormat'; + +const scale = tokens.type.scale as unknown as Record<string, ScaleToken>; +const sizes = tokens.font.size as unknown as Record<string, DesignToken>; + +const baseValue = sizes['base'].value; +const basePixels = scale[baseValue].comment; +const basePx = Number(basePixels.substring(0, basePixels.length - 2)); + +const rows = Object.keys(sizes).map((key) => { + const token = sizes[key]; + const tokenPixel = scale[token.value].comment; + const tokenPx = Number(tokenPixel.substring(0, tokenPixel.length - 2)); + const style = `font-size: ${tokenPixel}; line-height: normal;`; + + return { + name: token.name, + value: `${tokenPx}px | ${tokenPx / basePx}rem`, + examples: [ + `<div style="${style}">ABCDEFGHIJKLMNOPQRSTUVWXYZ</div><div style="${style}">abcdefghijklmnopqrstuvwxyz</div>`, + ], + }; +}); +--- + +<Layout title="Font size"> + <PageSection title="Font size" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/font-weight.astro b/packages/pharos-site-astro/src/pages/design-tokens/font-weight.astro new file mode 100644 index 000000000..2df711892 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/font-weight.astro @@ -0,0 +1,29 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +const weights = Object.values(tokens.font.weight as Record<string, DesignToken>); + +const rows = weights.map((token) => { + const style = `font-weight: ${token.value}; line-height: normal;`; + return { + name: token.name, + value: token.value, + examples: [ + `<div style="${style}">ABCDEFGHIJKLMNOPQRSTUVWXYZ</div><div style="${style}">abcdefghijklmnopqrstuvwxyz</div>`, + ], + }; +}); +--- + +<Layout title="Font weight"> + <PageSection title="Font weight" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/global-colors.astro b/packages/pharos-site-astro/src/pages/design-tokens/global-colors.astro new file mode 100644 index 000000000..74c09c465 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/global-colors.astro @@ -0,0 +1,56 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import ColorTable from '@components/ColorTable.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +/** Global colour tokens carry palette groupings the alias tokens do not. */ +interface GlobalColorToken extends DesignToken { + group?: string; + palette?: string; +} + +const color = tokens.color as Record<string, never>; + +/** Flattens `tokens.color` into a single list, skipping brand/base groupings. */ +const colorTokens: GlobalColorToken[] = Object.keys(color) + .filter((key) => key !== 'brand' && key !== 'base') + .flatMap((key) => { + const currentToken = color[key] as Record<string, GlobalColorToken> & { value?: string }; + if (currentToken.value) { + return [currentToken as unknown as GlobalColorToken]; + } + return Object.keys(currentToken) + .filter((k) => k !== 'brand' && k !== 'base') + .map((k) => currentToken[k]) + .filter((token) => token?.value); + }); + +const byGroup = (group: string) => colorTokens.filter((c) => c.group === group); +const byPalette = (palette: string) => colorTokens.filter((c) => c.palette === palette); + +const marbleGrayBase = (color['marble-gray'] as unknown as Record<string, DesignToken>)?.base; +const secondaryTokens = [...byGroup('secondary'), ...(marbleGrayBase ? [marbleGrayBase] : [])]; +--- + +<Layout title="Global colors"> + <PageSection title="Global colors" isHeader> + <TokenTable title="Primary colors"> + <ColorTable tokens={byGroup('primary')} /> + </TokenTable> + <TokenTable title="Secondary colors"> + <ColorTable tokens={secondaryTokens} /> + </TokenTable> + <TokenTable title="Grayscale colors"> + <ColorTable tokens={byPalette('grayscale')} /> + </TokenTable> + <TokenTable title="Tints"> + <ColorTable tokens={byGroup('tint')} /> + </TokenTable> + <TokenTable title="Feedback colors"> + <ColorTable tokens={byPalette('feedback')} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/line-height.astro b/packages/pharos-site-astro/src/pages/design-tokens/line-height.astro new file mode 100644 index 000000000..6ce2c5ed3 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/line-height.astro @@ -0,0 +1,61 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { CommentedToken } from '@lib/tokenFormat'; + +/** + * Example font size per row, keyed by token name. Keyed rather than positional + * so that adding, removing or reordering a line-height token cannot silently + * shift every row onto the wrong font size. + */ +const fontSizeMap: Record<string, number> = { + xsmall: 12, + small: 14, + medium: 16, + large: 24, + xlarge: 32, + 'heading-large': 54, + 'text-base-condensed': 16, +}; + +const lineHeights = tokens['line-height'] as unknown as Record<string, CommentedToken>; + +const rows = Object.keys(lineHeights) + .filter((key) => key !== 'brand' && key !== 'base') + .map((key) => { + const token = lineHeights[key]; + const fontSize = fontSizeMap[key]; + if (fontSize === undefined) { + throw new Error( + `line-height.astro: no example font size mapped for token "${key}". ` + + `Add it to fontSizeMap.` + ); + } + + const fontFamily = + fontSize >= 24 ? 'var(--pharos-font-family-serif)' : 'var(--pharos-font-family-sans-serif)'; + const text = + key === 'heading-large' + ? 'Lorem ipsum dolor sit amet...' + : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; + + return { + name: token.name, + value: `${token.comment ? token.comment + ' | ' : ''}${token.value}`, + examples: [ + `<div class="line-height-example" style="line-height: ${token.value}; font-size: ${fontSize}px; font-family: ${fontFamily};">${text}</div>`, + ], + }; + }); +--- + +<Layout title="Line height"> + <PageSection title="Line height" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/overview.mdx b/packages/pharos-site-astro/src/pages/design-tokens/overview.mdx new file mode 100644 index 000000000..ff8cc6d4c --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/overview.mdx @@ -0,0 +1,70 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Design tokens' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const components = mdxComponents; + +export const jstorRed = { color: 'var(--pharos-color-jstor-red)' }; +export const nightBlue = { color: 'var(--pharos-color-night-blue-base)' }; +export const glacierBlue = { color: 'var(--pharos-color-glacier-blue-30)' }; +export const livingCoral = { color: 'var(--pharos-color-living-coral-50)' }; + +{/* +These paragraphs are plain Markdown rather than explicit <p> elements. MDX +wraps a block-level tag it finds here inside its own generated paragraph, so +`<p>...</p>` becomes `<p><p>...</p>`; the browser closes the outer one +immediately, leaving an empty paragraph whose 24px bottom margin does not +collapse. Three of those made this page 72px taller than production. +*/} + +We capture visual design decisions in named entities called _design tokens_. Tokens help us avoid +using and repeating hard-coded values throughout the code base, which in turn helps carry new +decisions forward everywhere tokens are used. + +Tokens provide a bridge between design and development teams to ensure everyone is using the same +values, whether they're designing pages or implementing those designs. + +Although tokens capture high-level brand decisions like core <a href="/brand-expressions/color">color</a> and <a href="/brand-expressions/typography">typography</a> choices, they're also useful for capturing +more granular decisions like border radii or padding for specific components. + +## Token naming structure + +Because of the broad range of information they capture, design tokens benefit from a well-defined +naming structure. Tokens in Pharos are named using the following structure: + +{/* prettier-ignore */} +<p><code><span>pharos</span>[-<span style={jstorRed}><component><sup class="segment-marker" aria-hidden="true">1</sup></span>]-<span style={nightBlue}><category><sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}><property/context><sup class="segment-marker" aria-hidden="true">3</sup></span>[-<span style={livingCoral}><state/variant/name><sup class="segment-marker" aria-hidden="true">4</sup></span>]</code></p> + +{/* + Each <dd> must stay on ONE line. MDX treats a tag whose content spans several + lines as Markdown and wraps it in a generated <p>, which adds ~35px per entry + (104px across this list) and does not match production. Prettier reflows these + by default, hence the ignore. +*/} + +{/* prettier-ignore */} +<dl> + <div><dt style={jstorRed}><sup class="segment-marker" aria-hidden="true">1</sup>Component</dt><dd>Describes the specific component for which the token is relevant, if any.</dd></div> + <div><dt style={nightBlue}><sup class="segment-marker" aria-hidden="true">2</sup>Category</dt><dd>Describes the broad type for the token. Categories are things like color, type, spacing, size, and so on.</dd></div> + <div><dt style={glacierBlue}><sup class="segment-marker" aria-hidden="true">3</sup>Property/context</dt><dd>Describes the attribute the token affects, or adds context about where the token should be used.</dd></div> + <div><dt style={livingCoral}><sup class="segment-marker" aria-hidden="true">4</sup>State/variant/name</dt><dd>Defines the name that differentiates the token from others, or the state for which the token is used. Whereas preceding segments of a token name help navigate available tokens, this segment helps choose a specific token to use.</dd></div> +</dl> + +### Examples + +{/* prettier-ignore */} +<ul> + <li><code><span>pharos</span>-<span style={nightBlue}>color<sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}>brand<sup class="segment-marker" aria-hidden="true">3</sup></span>-<span style={livingCoral}>jstor-red<sup class="segment-marker" aria-hidden="true">4</sup></span></code></li> + <li><code><span>pharos</span>-<span style={jstorRed}>alert<sup class="segment-marker" aria-hidden="true">1</sup></span>-<span style={nightBlue}>color<sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}>icon<sup class="segment-marker" aria-hidden="true">3</sup></span>-<span style={livingCoral}>warning<sup class="segment-marker" aria-hidden="true">4</sup></span></code></li> + <li><code><span>pharos</span>-<span style={nightBlue}>transition<sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}>duration<sup class="segment-marker" aria-hidden="true">3</sup></span>-<span style={livingCoral}>longer<sup class="segment-marker" aria-hidden="true">4</sup></span></code></li> + <li><code><span>pharos</span>-<span style={nightBlue}>type<sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}>scale<sup class="segment-marker" aria-hidden="true">3</sup></span>-<span style={livingCoral}>5<sup class="segment-marker" aria-hidden="true">4</sup></span></code></li> + <li><code><span>pharos</span>-<span style={nightBlue}>spacing<sup class="segment-marker" aria-hidden="true">2</sup></span>-<span style={glacierBlue}>brand<sup class="segment-marker" aria-hidden="true">3</sup></span>-<span style={livingCoral}>one-and-a-half-x<sup class="segment-marker" aria-hidden="true">4</sup></span></code></li> +</ul> + +## Token architecture + +Read more about how tokens are created and stored in [the development +documentation](https://github.com/ithaka/pharos/blob/develop/docs/development/design-tokens.md#token-architecture). diff --git a/packages/pharos-site-astro/src/pages/design-tokens/radius.astro b/packages/pharos-site-astro/src/pages/design-tokens/radius.astro new file mode 100644 index 000000000..401ca9ac5 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/radius.astro @@ -0,0 +1,26 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { CommentedToken } from '@lib/tokenFormat'; + +const radii = Object.values(tokens.radius.base as unknown as Record<string, CommentedToken>); + +const rows = radii.map((token) => ({ + name: token.name, + value: `${token.comment} | ${token.value}`, + examples: [ + `<div class="radius-example" style="border-radius: ${token.value}; background: var(--pharos-color-living-coral-80); width: 2rem; height: 2rem; display: inline-block;"></div>`, + ], +})); +--- + +<Layout title="Radius"> + <PageSection title="Radius" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/spacing.astro b/packages/pharos-site-astro/src/pages/design-tokens/spacing.astro new file mode 100644 index 000000000..e53ea94a2 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/spacing.astro @@ -0,0 +1,29 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { CommentedToken } from '@lib/tokenFormat'; + +const spacing = tokens.spacing as unknown as Record<string, CommentedToken>; + +const rows = Object.keys(spacing) + .filter((key) => key !== 'gutter') + .map((key) => spacing[key]) + .map((token) => ({ + name: token.name, + value: `${token.comment} | ${token.value}`, + examples: [ + `<div style="height: ${token.value}; background: var(--pharos-color-living-coral-80); width: 100%; display: inline-block;"></div>`, + ], + })); +--- + +<Layout title="Spacing"> + <PageSection title="Spacing" isHeader> + <TokenTable> + <TokenRows rows={rows} /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/transitions.astro b/packages/pharos-site-astro/src/pages/design-tokens/transitions.astro new file mode 100644 index 000000000..ba2393f7d --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/transitions.astro @@ -0,0 +1,58 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { DesignToken } from '@lib/tokenFormat'; + +const exampleRems = [1, 2, 5, 10, 20]; +const exampleColors = [ + '--pharos-color-living-coral-90', + '--pharos-color-living-coral-80', + '--pharos-color-glacier-blue-80', + '--pharos-color-glacier-blue-40', + '--pharos-color-night-blue-base', +]; + +const durations = tokens.transition.duration as unknown as Record<string, DesignToken>; + +const rows = [ + { token: tokens.transition.base as DesignToken, widthRem: 5, color: exampleColors[1] }, + ...Object.keys(durations).map((key, i) => ({ + token: durations[key], + widthRem: exampleRems[i], + color: exampleColors[i], + })), +].map(({ token, widthRem, color }) => ({ + name: token.name, + value: token.value, + examples: [ + `<div class="transition-example" style="width: ${widthRem}rem; transition: ${token.value}; --example-color: var(${color}); height: 3rem;"></div>`, + ], +})); +--- + +<Layout title="Transitions"> + <PageSection title="Transitions" isHeader> + <p>Hover over the colorful boxes to view the transitions.</p> + <TokenTable> + <TokenRows rows={rows} columnWidths={['40%', '40%']} /> + </TokenTable> + </PageSection> +</Layout> + +<style is:global> + /* + * A CSS hover swaps the background colour without any client JS. Each row + * passes its own colour as `--example-color` so the hover rule can override + * it without needing `!important`. + */ + .token-table .transition-example { + background: var(--example-color); + } + + .token-table .transition-example:hover { + background: var(--pharos-color-jstor-red); + } +</style> diff --git a/packages/pharos-site-astro/src/pages/design-tokens/type-scale.astro b/packages/pharos-site-astro/src/pages/design-tokens/type-scale.astro new file mode 100644 index 000000000..0401af87d --- /dev/null +++ b/packages/pharos-site-astro/src/pages/design-tokens/type-scale.astro @@ -0,0 +1,43 @@ +--- +import Layout from '@layouts/Layout.astro'; +import PageSection from '@components/PageSection.astro'; +import TokenTable from '@components/TokenTable.astro'; +import TokenRows from '@components/TokenRows.astro'; +import tokens from '@ithaka/pharos/lib/styles/tokens'; +import type { ScaleToken } from '@lib/tokenFormat'; + +const scale = Object.values(tokens.type.scale as unknown as Record<string, ScaleToken>); + +/** Placeholder shown when a size is out of range for one of the two typefaces. */ +const dash = '<site-pharos-icon name="dash-small" a11y-hidden="true"></site-pharos-icon>'; + +const rows = scale.map((token) => { + const px = token.comment; + const sansSerif = + Number(token.value) < 10 + ? `<span class="token-type-sans-serif" style="font-size: ${px};">GT America</span>` + : dash; + const serif = + Number(token.value) > 5 + ? `<span class="token-type-serif" style="font-size: ${px}; font-family: var(--pharos-font-family-serif); line-height: var(--pharos-line-height-heading-large);">Ivar Headline</span>` + : dash; + + return { + name: token.name, + value: `${px} | ${Number(px.substring(0, px.length - 2)) / 16}rem`, + examples: [sansSerif, serif], + }; +}); +--- + +<Layout title="Type scale"> + <PageSection title="Type scale" isHeader> + <TokenTable> + <TokenRows + rows={rows} + exampleHeadings={['Sans-Serif', 'Serif']} + columnWidths={['25%', '20%', '25%']} + /> + </TokenTable> + </PageSection> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/faqs.mdx b/packages/pharos-site-astro/src/pages/faqs.mdx new file mode 100644 index 000000000..0bb82a511 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/faqs.mdx @@ -0,0 +1,46 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Pharos FAQ' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const components = mdxComponents; + +#### How can Pharos help my development? + +Pharos contains visual and behavioral components that are consistent with our design decisions out of +the box. + +#### What do I do if I still run into issues? + +Give us the gift of feedback! When you run into issues it's important that you be vocal about it and +not let that inhibit or discourage you from adopting Pharos. We need your help to identify the gaps +and sincerely welcome feedback no matter how tough it is. + +You can start providing feed back via [GitHub issues](https://github.com/ithaka/pharos/issues). For +more on dealing with issues, check out the +[contribution guide](https://pharos.jstor.org/contributing/development). + +#### What are the risks of adopting components late or infrequently? How will we manage this? + +Design systems help bring consistency to platforms, so falling behind may result in duplication of +effort in replicating styles and behaviors. It may also result in more catch up. Finally, if you're +on an unsupported version of Pharos you may not benefit from the latest bug and security fixes. + +We'll be managing this by developing a support policy, using semantic versioning, and communicating +changes through change logs and discussions. + +#### I expected Pharos components to make my page more performant, but they made my bundle bigger. Why is that happening? + +The Pharos core package delivers components that are +[tree shakable](https://webpack.js.org/guides/tree-shaking/), so that you can be sure you only end up +with the code you need. To benefit from tree shaking, though, you may need to update your build +process to match it. + +#### I don't know enough about components before trying to use them. How can I find out more? + +We're continuously working on the documentation—for both +[development](https://pharos.jstor.org/storybook/?path=/story/pharos-10-1-0-intro--page) and +[design](https://pharos.jstor.org)—to make sure it's accurate and thorough. If you find that a +component isn't documented properly or thoroughly, please communicate how it can be improved. diff --git a/packages/pharos-site-astro/src/pages/getting-started.astro b/packages/pharos-site-astro/src/pages/getting-started.astro new file mode 100644 index 000000000..c37bb946d --- /dev/null +++ b/packages/pharos-site-astro/src/pages/getting-started.astro @@ -0,0 +1,277 @@ +--- +import Layout from '@layouts/Layout.astro'; +import CodeBlock from '@components/CodeBlock.astro'; + +const installInstructions = ` + # yarn + yarn add @ithaka/pharos + \n + # npm + npm install @ithaka/pharos + `; +const directoryLayout = ` + @ithaka/pharos/lib + ├── assets/ + │ ├── icons // Pharos icons (used with the icon component) + ├── components/ // Folder containing web components + ├── react-components/ // Folder containing React components + ├── styles/ + │ ├── _variables.css // Commonly used tokens for styling + │ ├── fonts.css // CSS to have fonts available to use + │ ├── typography.scss // CSS styles to apply fonts and styles to root elements + └── ...`; +--- + +<Layout title="Getting started"> + <site-pharos-heading level="1" preset="7--bold">Getting Started</site-pharos-heading> + <br /> + <site-pharos-heading level="2" preset="6">Installation</site-pharos-heading> + <p>Install the Pharos design system using one of the following commands:</p> + <CodeBlock code={installInstructions} /> + <br /> + <p> + Once installed, the <code>node_modules/</code> directory should contain directories similar to following + structure: + </p> + <CodeBlock code={directoryLayout} /> + <br /> + <br /> + <site-pharos-heading level="2" preset="6">Using Pharos components</site-pharos-heading> + <p> + Pharos uses <site-pharos-link href="https://developer.mozilla.org/en-US/docs/Web/Web_Components" + >Web Components</site-pharos-link + > to remain compatible with modern JavaScript frameworks, such as Vue or React. To accomodate patterns + of each framework, the implementations vary slightly. + </p> + <p> + You will first need to provide the scoped custom element registry to your application. This is + generally achieved by including this script tag in the head of your application. + </p> + <CodeBlock + code={`<script src="https://cdn.jsdelivr.net/npm/@webcomponents/scoped-custom-element-registry@0.0.3/scoped-custom-element-registry.min.js"></script>`} + /> + <p> + You then need to register components on the <site-pharos-link + href="https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry" + >custom element registry</site-pharos-link + > for them to be usable in your code. To register components, you can use the + <code>registerComponents</code> utility to define all the Pharos components your application uses, + with a consistent scoping prefix: + </p> + <CodeBlock + code={` + import {PharosAlert, PharosButton, PharosIcon} from '@ithaka/pharos'; + import registerComponents from '@ithaka/pharos/lib/utils/registerComponents'; + + registerComponents('homepage', [PharosAlert, PharosButton, PharosIcon]); + `} + /> + <p> + To manually register a component, import the classes you wish to use in your application's + entrypoint and define the custom element with a tag name in the form of <code + >{`{app / bundle}-pharos-{component}`}</code + > and a trivial subclass that extends the Pharos class wrapped in the <code + >PharosComponentMixin</code + >: + </p> + <CodeBlock + code={` + import {PharosAlert} from '@ithaka/pharos'; + import PharosComponentMixin from '@ithaka/pharos/lib/utils/mixins/pharos-component'; + + customElements.define('homepage-pharos-alert', class extends PharosComponentMixin(PharosAlert) { }); + `} + /> + <p> + To demonstrate the usage in both Vue and React, you'll next see how to use the Button component. + </p> + <br /> + <site-pharos-heading level="3" preset="4">Pharos + React</site-pharos-heading> + <p> + The following code shows how to use Pharos's button component with <strong>React</strong> to produce + a basic button, as seen below the code + </p> + <CodeBlock + code={` + import {PharosButton} from '@ithaka/pharos/lib/react-components'; + ... + + <PharosButton> + React button + </PharosButton> + `} + /> + <br /> + <br /> + <br /> + <site-pharos-heading level="3" preset="4">Pharos + Vue</site-pharos-heading> + <p> + Similarly, the following code shows how to use Pharos's button component with <strong + >Vue</strong + > to produce a basic button, as seen below the code + </p> + <CodeBlock + code={` + <template> + ... + <pharos-button> + Vue button + </pharos-button> + </template> + `} + /> + <br /> + <br /> + <site-pharos-heading level="3" preset="4">Props + Storybook</site-pharos-heading> + <p> + The props for each component control various parts of the component, from style to function. + Learning which props are available for each component, along with how they interact with the + component, is crucial in using the Pharos design system. Pharos components are fully documented + to allow IDEs to take advantage of intellisense features, which in turn allows you to browse + through props. + </p> + <p> + For a more interactive approach to understand props, Pharos provides a <site-pharos-link + href="https://storybook.js.org/">Storybook</site-pharos-link + >. Our Storybook stories demonstrates the usage of props for each component, while providing the + code used in the demonstration. Many components' stories allow you adjust the values of + different props to preview and understand the impact of those props. + </p> + <site-pharos-link href="https://pharos.jstor.org/storybooks/wc/"> + Visit the Web Component Pharos Storybook + </site-pharos-link> + <br /> + <site-pharos-link href="https://pharos.jstor.org/storybooks/react/"> + Visit the React Pharos Storybook + </site-pharos-link> + <br /> + <br /> + <br /> + <br /> + <site-pharos-heading level="2" preset="6">Style with Pharos</site-pharos-heading> + <site-pharos-heading level="3" preset="4">Using the Recommended Fonts</site-pharos-heading> + <p> + As part of the package, Pharos includes a few curated fonts that are integrated into components. + To allow consistency between components and other elements, you should use these fonts for other + parts of the site. If you want to read more about Pharos' typography, including guidelines for + font usage scenarios, head over to the <site-pharos-link href="/brand-expressions/typography" + >typography</site-pharos-link + > page. + </p> + <p> + To use the correct fonts, start by importing them by importing <code + >@ithaka/pharos/lib/styles/fonts.css</code + > at the top level of your web app. Once imported, set the root body font and styles by importing{ + ' ' + } + <code>@ithaka/pharos/lib/styles/typography.scss</code>. If there are places where the body font + is being overwritten, apply the font wherever the style is being overwritten by setting the <code + >font-family</code + > property to include either <code>GT America Standard</code> (generally for body) or <code + >Ivar Headline</code + > (generally for headers). + </p> + <p> + The following examples use inline styling, but the same principles remain for other methods of + styling. + </p> + <site-pharos-heading level="4" preset="2">Pharos fonts with Vue</site-pharos-heading> + <CodeBlock + code={` + <script> + ... + import "@ithaka/pharos/lib/styles/fonts.css"; + import "@ithaka/pharos/lib/styles/typography.scss"; + ... + </script> + + <template> + ... + <div class="text"> + This is an example of text with Pharos fonts. + </div> + ... + </template> + + <style lang="scss"> + ... + .text { + font-family: GT America Standard; + } + ... + </style> + `} + /> + <br /> + <site-pharos-heading level="4" preset="2">Pharos fonts with React</site-pharos-heading> + <CodeBlock + code={` + import "@ithaka/pharos/lib/styles/fonts.css"; + import "@ithaka/pharos/lib/styles/typography.scss"; + + const styleObject = { + fontFamily: "GT America Standard" + } + + ... //in render method + <div style={styleObject}> + This is an example of text with Pharos fonts. + </div> + ... + `} + /> + <br /> + <br /> + <site-pharos-heading level="3" preset="4">Pharos Design Tokens</site-pharos-heading> + <p> + Pharos components use design tokens to keep values consistent for all facets of design, + including spacing, size, and colors. These design tokens are also provided to developers using + Pharos in order to provide assistance in creating a consistent look and feel in pages where both + Pharos components and other elements exist. + </p> + <p> + To start using the design tokens, import the <code + >@ithaka/pharos/lib/styles/_variables.scss</code + > file and use the desired token in the styles for your web app. You can inspect the imported file + to see all the tokens and their corresponding values. + </p> + <br /> + <br /> + <site-pharos-heading level="2" preset="6">Get to know Pharos</site-pharos-heading> + <p> + To use Pharos efficiently, you should understand the principles and structure surrounding the + design system. Start by getting familiarized with <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/docs/development/code-structure.md" + >Code structure</site-pharos-link + > and <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/docs/development/conventions/README.md" + >Conventions</site-pharos-link + >. <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/docs/development/anatomy-of-a-component.md" + >The anatomy of components</site-pharos-link + > covers the general structures and how-tos of components, stories and styles. + </p> + <p> + Going through the <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/CHANGELOG.md">change log</site-pharos-link + > will help you stay up-to-date on important changes. + </p> + <site-pharos-heading level="3" preset="4">Brand guidelines</site-pharos-heading> + <p> + Learn more about JSTOR's visual language and brand expressions that create consistency and + clarity across our experiences. + </p> + <site-pharos-link href="/brand-expressions/logos">View our brand guidelines</site-pharos-link> + <br /> + <br /> + <site-pharos-heading level="3" preset="4">Contribute</site-pharos-heading> + <p> + Interested in contributing to the design system? Pharos is the result of collective + contributions of code, design, and guidance—we'd love to hear your input and ideas! + </p> + <site-pharos-link href="https://github.com/ithaka/pharos">Help build Pharos</site-pharos-link> + <br /> + <site-pharos-link href="https://github.com/ithaka/pharos/blob/main/docs/README.md"> + See the contribution guidelines + </site-pharos-link> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/help.mdx b/packages/pharos-site-astro/src/pages/help.mdx new file mode 100644 index 000000000..c90267be3 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/help.mdx @@ -0,0 +1,30 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Help' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; + +export const components = mdxComponents; + +## GitHub + +Code for all our components, styles, tokens, assets, documentation, and this site lives in our +[Pharos repository](https://github.com/ithaka/pharos). + +<p> + <site-pharos-button + variant="secondary" + icon-right="link-external" + href="https://github.com/ithaka/pharos" + target="_blank" + > + Go to GitHub + </site-pharos-button> +</p> + +## Report an issue + +If you find an issue with this site or a Pharos component, you can bring it to the maintainers' +attention by creating a [Github issue](https://github.com/ithaka/pharos/issues) in the Pharos +repository. diff --git a/packages/pharos-site-astro/src/pages/index.astro b/packages/pharos-site-astro/src/pages/index.astro new file mode 100644 index 000000000..9670e8d13 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/index.astro @@ -0,0 +1,211 @@ +--- +import { Image } from 'astro:assets'; +import Layout from '@layouts/Layout.astro'; +import pharosPkg from '@ithaka/pharos/package.json'; + +// fonts.css is imported by Layout.astro so every route gets the @font-face +// rules, not just this one. +import '../styles/home.css'; +import homeBrandGuidelines from '@images/homepage/home-brand-guidelines.png'; +import homeComponents from '@images/homepage/home-components.svg'; +import homeGetStarted from '@images/homepage/home-get-started.svg'; +--- + +<Layout title="Home" fill bodyClass="home"> + <site-pharos-layout slot="hero" preset="1-col--sidenav-comfy" row-gap="0" class="hero"> + <h1 class="hero__heading"> + Pharos, JSTOR's design system, guides us to create <i>cohesive, </i><i>supportive, </i> and <i + >beautiful</i + > experiences for the <i>intellectually curious</i>. + </h1> + </site-pharos-layout> + + <div class="card__image"> + <div class="thumbnail"> + <Image src={homeBrandGuidelines} alt="Brand Guideline" /> + </div> + <site-pharos-heading level="2" preset="4">Brand guidelines</site-pharos-heading> + <p class="description"> + Learn more about JSTOR's visual language and brand expressions that create consistency and + clarity across our experiences. + </p> + <site-pharos-button + class="button__card" + variant="secondary" + href="/brand-expressions/color" + data-sc="link:logos" + > + Start with color + </site-pharos-button> + </div> + + <div class="card__image"> + <div class="thumbnail"> + <img + src={homeComponents.src} + alt="Components" + width={homeComponents.width} + height={homeComponents.height} + /> + </div> + <site-pharos-heading level="2" preset="4">Components</site-pharos-heading> + <p class="description"> + Utilize our collection of reusable components, styles and their guidelines to build your + products and sites. + </p> + <site-pharos-button class="button__card" variant="secondary" href="/storybook/"> + View components + </site-pharos-button> + </div> + + <div class="card__image"> + <div class="thumbnail"> + <img + src={homeGetStarted.src} + alt="Get Started" + width={homeGetStarted.width} + height={homeGetStarted.height} + /> + </div> + <site-pharos-heading level="2" preset="4">Get started</site-pharos-heading> + <p class="description"> + Pharos streamlines the development and design process. Check out our resources to use Pharos + for your project. + </p> + <site-pharos-button + class="button__card" + variant="secondary" + href="/getting-started" + data-sc="link:getting started" + > + Get started + </site-pharos-button> + </div> + + <hr /> + + <div class="card"> + <div class="icon"> + <site-pharos-icon name="new" a11y-hidden="true"></site-pharos-icon> + </div> + <site-pharos-heading level="2" preset="4"> + What's new: Pharos {pharosPkg.version} + </site-pharos-heading> + <p class="description"> + Upgrade to the latest version of Pharos today to explore new possibilities for your apps and + projects, and help maintain consistency on JSTOR. + </p> + <ul class="list"> + <li> + <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/packages/pharos/CHANGELOG.md" + target="_blank" + data-sc="link:changelog" + > + Changelog + </site-pharos-link> + </li> + <li> + <site-pharos-link + href="https://pharos.jstor.org/storybooks/wc/" + target="_blank" + data-sc="link:wc storybook" + > + Web Components Storybook + </site-pharos-link> + </li> + <li> + <site-pharos-link + href="https://pharos.jstor.org/storybooks/react/" + target="_blank" + data-sc="link:react storybook" + > + React Components Storybook + </site-pharos-link> + </li> + </ul> + </div> + + <div class="card"> + <div class="icon"> + <site-pharos-icon name="question-inverse" a11y-hidden="true"></site-pharos-icon> + </div> + <site-pharos-heading level="2" preset="4">Support</site-pharos-heading> + <p class="description"> + Experiencing a Pharos-related issue or just need some help? Report an issue in GitHub or get + in touch via Slack. + </p> + <ul class="list"> + <li> + <site-pharos-link href="/help" data-sc="link:help">Help</site-pharos-link> + </li> + <li> + <site-pharos-link href="mailto:opensource@ithaka.org">Contact us</site-pharos-link> + </li> + <li> + <site-pharos-link href="https://github.com/ithaka/pharos/issues" target="_blank"> + Report an issue + </site-pharos-link> + </li> + </ul> + </div> + + <div class="card"> + <div class="icon"> + <site-pharos-icon name="add" a11y-hidden="true"></site-pharos-icon> + </div> + <site-pharos-heading level="2" preset="4">Contribute to Pharos</site-pharos-heading> + <p class="description"> + Interested in contributing to the design system? Pharos is the result of collective + contributions of code, design, and guidance, we'd love to hear your input and ideas! + </p> + <ul class="list"> + <li> + <site-pharos-link + href="https://github.com/ithaka/pharos" + target="_blank" + data-sc="link:repo" + > + Help build Pharos + </site-pharos-link> + </li> + <li> + <site-pharos-link + href="https://github.com/ithaka/pharos/blob/main/docs/README.md" + target="_blank" + data-sc="link:contribution guidelines" + > + See the contribution guidelines + </site-pharos-link> + </li> + </ul> + </div> + + <div class="card"> + <div class="icon"> + <site-pharos-icon name="workspace" a11y-hidden="true"></site-pharos-icon> + </div> + <div class="container__heading"> + <site-pharos-heading level="2" preset="4" no-margin> + Work with us at ITHAKA + </site-pharos-heading> + <strong class="badge">We're hiring!</strong> + </div> + <p class="description"> + JSTOR is part of ITHAKA, a not-for-profit dedicated to expanding access to knowledge and + education worldwide. Our staff makes us who we are. We're hiring — join us! + </p> + <ul class="list"> + <li> + <site-pharos-link href="https://www.ithaka.org/careers/" target="_blank"> + See career opportunities + </site-pharos-link> + </li> + <li> + <site-pharos-link href="https://www.ithaka.org/" target="_blank"> + Learn more about ITHAKA + </site-pharos-link> + </li> + </ul> + </div> +</Layout> diff --git a/packages/pharos-site-astro/src/pages/styles/type-styles.mdx b/packages/pharos-site-astro/src/pages/styles/type-styles.mdx new file mode 100644 index 000000000..e457557d6 --- /dev/null +++ b/packages/pharos-site-astro/src/pages/styles/type-styles.mdx @@ -0,0 +1,168 @@ +--- +layout: '@layouts/MarkdownLayout.astro' +title: 'Type styles' +description: 'Pharos type styles and mixins allow us to express our brand consistently and efficiently in our products.' +--- + +import { mdxComponents } from '@components/markdown/mdxComponents'; +import Canvas from '@components/Canvas.astro'; + +export const components = mdxComponents; + +{/* +The demo markup below keeps its inline styles and hand-written headings. The +`level="4" preset="2"` pair has no Markdown equivalent (`####` renders preset +`1--bold`), and the `level="5"` headings sit inside spacing wrappers, so both +stay as explicit elements rather than becoming `####`/`#####`. +*/} + +<site-pharos-link href="https://pharos.jstor.org/storybooks/wc/?path=/story/styles-typography--plain-text" target="_blank">See in Storybook</site-pharos-link> + +## Font Stack + +### Branded + +{/* prettier-ignore */} +<p style="font-family: var(--pharos-font-family-sans-serif); font-size: var(--pharos-font-size-large);">GT America</p> + +{/* prettier-ignore */} +<p style="font-family: var(--pharos-font-family-serif); font-size: var(--pharos-font-size-large);">Ivar Headline</p> + +### Fallback + +{/* prettier-ignore */} +<p style="font-family: Helvetica Neue; font-size: var(--pharos-font-size-large);">Helvetica Neue, Arial</p> + +{/* prettier-ignore */} +<p style="font-family: Times; font-size: var(--pharos-font-size-large);">Times</p> + +## Usage + +### Design Tokens + +Please refer to our type tokens to see font-sizes, line-heights, letter-spacing, font-families, +font-weights, and type-scale. + +### Formatting Styles + +{/* prettier-ignore */} +<Canvas> + <table class="typography-table-example" style="border-collapse: collapse;"> + <thead> + <tr> + <th class="typography-table-example">Style</th> + <th class="typography-table-example">Directions</th> + </tr> + </thead> + <tbody> + <tr> + <td class="typography-table-example"><span>Plain text</span></td> + <td class="typography-table-example">Use <code><span></code> to display plain text when needed.</td> + </tr> + <tr> + <td class="typography-table-example"><b>Bold</b></td> + <td class="typography-table-example">Use <code><strong></code> to indicate importance and display text in bold type.</td> + </tr> + <tr> + <td class="typography-table-example"><i>Italic</i></td> + <td class="typography-table-example">Use <code><em></code> to stress emphasis and italicize text.</td> + </tr> + <tr> + <td class="typography-table-example"><small>Small</small></td> + <td class="typography-table-example">Use <code><small></code> to decrease the font size for secondary supporting text. It should be used sparingly as the design token "pharos-font-size-small" will suffice.</td> + </tr> + </tbody> + </table> +</Canvas> + +### Other Styles + +{/* prettier-ignore */} +<div class="doc-topic"> + <site-pharos-heading level="4" preset="2">Tables</site-pharos-heading> + <p>Tables consist of rows and columns that are used to display and organize information efficiently.</p> + <Canvas> + <table class="typography-table-example" style="border-collapse: collapse;"> + <thead> + <tr> + <th>Influential Women</th> + </tr> + </thead> + <tbody> + <tr> + <td class="typography-table-example">Claudette Colvin</td> + </tr> + <tr> + <td class="typography-table-example">Maude Ballou</td> + </tr> + <tr> + <td class="typography-table-example">Diane Nash</td> + </tr> + </tbody> + </table> + </Canvas> +</div> + +{/* prettier-ignore */} +<div> + <site-pharos-heading level="4" preset="2">Lists</site-pharos-heading> + <div class="doc-topic"> + <site-pharos-heading level="5" preset="1--bold">Ordered Lists</site-pharos-heading> + <p>Use ordered or numbered lists to convey a priority, hierarchy, or sequence between list items.</p> + <Canvas> + <ol> + <li>Claudette Colvin</li> + <li>Maude Ballou</li> + <li>Diane Nash</li> + <li>Rev. Dr. Pauli Murray</li> + <li>Mamie Till Mobley</li> + </ol> + </Canvas> + </div> + <div class="doc-topic"> + <site-pharos-heading level="5" preset="1--bold">Unordered Lists</site-pharos-heading> + <p>Use bulleted lists when you don't need to convey a specific order for list items.</p> + <Canvas> + <ul> + <li>Claudette Colvin</li> + <li>Maude Ballou</li> + <li>Diane Nash</li> + <li>Rev. Dr. Pauli Murray</li> + <li>Mamie Till Mobley</li> + </ul> + </Canvas> + </div> + <div class="doc-topic"> + <site-pharos-heading level="5" preset="1--bold">Nested Lists</site-pharos-heading> + <p>Nested lists help to arrange information into related, hierarchical structures.</p> + <Canvas> + <ul class="list-example__nested"> + <li> + Claudette Colvin + <ul> + <li>As a teenager, Colvin refused to give up her bus seat nine months before Rosa Parks.</li> + </ul> + </li> + <li> + Maude Ballou + <ul> + <li>Maude served as MLK's personal secretary, his right-hand woman from 1955 until 1960. In 1957, she was listed as number 21 on the Montgomery Improvement Associations list of "persons and churches most vulnerable to violent attacks."</li> + </ul> + </li> + </ul> + </Canvas> + </div> + <div> + <site-pharos-heading level="5" preset="1--bold">List without Bullets</site-pharos-heading> + <p>Use lists without bullets when you don't need to display a list indicator.</p> + <Canvas> + <ul class="list-example__no-bullets"> + <li>Claudette Colvin</li> + <li>Maude Ballou</li> + <li>Diane Nash</li> + <li>Rev. Dr. Pauli Murray</li> + <li>Mamie Till Mobley</li> + </ul> + </Canvas> + </div> +</div> diff --git a/packages/pharos-site-astro/src/styles/components.css b/packages/pharos-site-astro/src/styles/components.css new file mode 100644 index 000000000..4a25b81a8 --- /dev/null +++ b/packages/pharos-site-astro/src/styles/components.css @@ -0,0 +1,343 @@ +/* Component styles, as plain global class names. */ + +/* PageSection */ +.section { + margin-bottom: var(--pharos-spacing-7-x); +} + +.section__title--more-space { + margin-bottom: var(--pharos-spacing-one-and-a-half-x); + color: var(--pharos-color-black); +} + +.section__title--is-header { + margin-bottom: var(--pharos-spacing-2-x); +} + +.section__description { + width: 75%; + color: var(--pharos-color-text-20); + margin-bottom: var(--pharos-spacing-2-x); +} + +.section__description--is-header { + font-size: var(--pharos-type-scale-6); + line-height: 2rem; + margin-bottom: var(--pharos-spacing-3-x); +} + +/* BestPractices */ +.best-practices__icon--do { + fill: var(--pharos-color-feedback-success); +} + +.best-practices__icon--dont { + fill: var(--pharos-color-feedback-error); +} + +.best-practices__container { + display: grid; + grid-template-columns: max-content 1fr; + column-gap: var(--pharos-spacing-1-x); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.best-practices__line--dont { + border: none; + height: 2px; + background-color: var(--pharos-color-feedback-error); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.best-practices__line--do { + border: none; + height: 2px; + background-color: var(--pharos-color-feedback-success); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.best-practices__text--do { + color: var(--pharos-color-feedback-success); + font-weight: bold; + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.best-practices__text--dont { + color: var(--pharos-color-feedback-error); + font-weight: var(--pharos-font-weight-bold); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.best-practices__guideline { + color: var(--pharos-color-marble-gray-20); +} + +/* + * MDX wraps a tag whose children span several lines in a generated `<p>`, so + * whether slot content is written on one line or three decides whether it + * renders as bare text or as a paragraph — with a 24px margin the one-line + * version does not have. Dropping the margin on a `<p>` that is the slot's only + * child makes the two render identically, so an author reformatting for + * readability cannot change the output. + * + * Scoped to `:only-child` so a slot deliberately holding several paragraphs + * keeps its spacing. + */ +.best-practices__guideline > p:only-child { + margin-bottom: 0; +} + +.best-practices__guideline ul li:not(:last-child) { + margin-bottom: var(--pharos-spacing-1-x); +} + +.best-practices__guideline ::marker { + color: var(--pharos-color-marble-gray-20); +} + +/* DosAndDonts */ +.dos-and-donts { + margin-bottom: var(--pharos-spacing-5-x); +} + +.dos-and-donts__line--dont { + border: none; + height: 2px; + background-color: var(--pharos-color-feedback-error); + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.dos-and-donts__line--do { + border: none; + height: 2px; + background-color: var(--pharos-color-feedback-success); + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.dos-and-donts__title { + display: flex; + justify-content: flex-start; + align-items: center; + margin-bottom: var(--pharos-spacing-2-x); + font-size: var(--pharos-spacing-one-and-a-half-x); + line-height: 0; +} + +.dos-and-donts__text-container { + display: grid; + align-items: center; + grid-template-columns: 1fr 10fr; +} + +.dos-and-donts__text--do { + color: var(--pharos-color-feedback-success); + margin-left: var(--pharos-spacing-one-half-x); +} + +.dos-and-donts__text--dont { + color: var(--pharos-color-feedback-error); + margin-left: var(--pharos-spacing-one-half-x); +} + +/* CrossOut */ +.cross-out__line { + transform: rotate(-45deg); + height: 3px; + background-color: var(--pharos-color-black); + border: 0; + position: relative; +} + +/* Design token tables — ported from src/components/statics/design-token/*.module.css */ +.token-table { + width: 100%; +} + +.token-table td { + padding-bottom: var(--pharos-spacing-one-and-a-half-x); + padding-right: var(--pharos-spacing-2-x); + padding-top: var(--pharos-spacing-one-and-a-half-x); + vertical-align: top; + border-top: 1px solid var(--pharos-color-ui-30); +} + +.token-table__first-column { + width: 40%; +} + +.token-table__second-column { + width: 40%; +} + +.token-table__third-column { + width: 20%; +} + +.token-table__color-example { + width: 10rem; + height: 3rem; + border: 1px solid #eee; +} + +.token-code { + font-size: var(--pharos-font-size-small); + background: var(--pharos-color-ui-20); + border-radius: 1px; + padding: var(--pharos-spacing-one-quarter-x) var(--pharos-spacing-one-half-x); + white-space: nowrap; +} + +/* Color swatches — ported from src/components/statics/color/ColorSwatches.module.css */ +.color-swatch { + width: 8.25rem; + height: 8.25rem; + border-radius: 50%; + display: inline-block; +} + +.colors-container { + display: grid; + gap: var(--pharos-spacing-2-x); +} + +.color-name { + font-size: 18px; +} + +.color-label { + margin-top: var(--pharos-spacing-one-and-a-half-x); + margin-left: var(--pharos-spacing-three-quarters-x); + line-height: var(--pharos-line-height-small); + white-space: nowrap; +} + +.color-label div { + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.large-swatch { + width: 11rem; + height: 11rem; +} + +.color-image { + margin-right: 3rem; + margin-bottom: 3rem; +} + +.color-figure { + line-height: 0; +} + +/* --- ColorCombos (ported from statics/color/ColorCombos.module.css) --- */ +.color-combos__box { + height: 7.75rem; + display: flex; + margin-bottom: var(--pharos-spacing-1-x); +} + +/* --- ColorGradients (ported from statics/color/ColorGradients.module.css) --- */ +.color-gradient { + width: 8.25rem; + height: 8.25rem; + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.gradient-container { + display: grid; + column-gap: var(--pharos-spacing-2-x); +} + +.gradient-label { + margin-bottom: var(--pharos-spacing-2-x); + line-height: var(--pharos-line-height-small); +} + +/* --- ColorTextSquares (ported from statics/color/ColorTextSquares.module.css) --- */ +.color-text-square { + height: var(--pharos-spacing-7-x); + width: var(--pharos-spacing-7-x); + display: grid; + margin-bottom: var(--pharos-spacing-1-x); + padding: var(--pharos-spacing-one-half-x); +} + +.color-text-square__text { + place-self: center; + text-align: center; + font-family: var(--pharos-font-family-body); + font-size: var(--pharos-spacing-one-and-a-half-x); +} + +/* --- FontDisplay (ported from statics/typography/FontDisplay.module.css) --- */ +.font-display__text-color { + color: var(--pharos-color-text-base); + line-height: var(--pharos-line-height-xlarge); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.font-display__text-color--dark { + color: var(--pharos-color-text-white); + line-height: var(--pharos-line-height-xlarge); +} + +.font-display__title-size { + font-size: var(--pharos-type-scale-8); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.font-display__title-size--large { + font-size: var(--pharos-type-scale-11); + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.font-display__text-size { + font-size: var(--pharos-type-scale-6); + line-height: 2rem; +} + +.font-display__text-size--large { + font-size: var(--pharos-type-scale-8); +} + +/* --- IconsDisplay (ported from statics/iconography/IconsDisplay.module.css) --- */ +.all-icon-container { + display: grid; + grid-auto-flow: column; + grid-template-columns: repeat(3, 1fr); + gap: var(--pharos-spacing-2-x); + margin-bottom: var(--pharos-spacing-5-x); +} + +.icon__title { + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.icon-container { + display: grid; + grid-template-columns: min-content auto; + gap: 0.5rem; +} + +.icons-display__icon { + max-width: var(--pharos-spacing-one-and-a-half-x); + max-height: var(--pharos-spacing-one-and-a-half-x); + stroke: var(--pharos-color-black); + stroke-width: 0; +} + +.icons-display__text { + margin-bottom: var(--pharos-spacing-one-half-x); + font-weight: var(--pharos-font-weight-bold); + color: var(--pharos-color-black); + line-height: var(--pharos-line-height-medium); + font-size: var(--pharos-font-size-small); +} + +/* + * A `.best-practice` block that is followed by another one inside the same + * `DosAndDonts` column + */ +.best-practice--spaced { + margin-bottom: 4rem; +} diff --git a/packages/pharos-site-astro/src/styles/fonts-site.css b/packages/pharos-site-astro/src/styles/fonts-site.css new file mode 100644 index 000000000..3e5fed45e --- /dev/null +++ b/packages/pharos-site-astro/src/styles/fonts-site.css @@ -0,0 +1,51 @@ +/* + * Site-specific @font-face declarations. + * + * These are separate from `@ithaka/pharos/lib/styles/fonts.css` (which defines + * the "GT America Standard" and "Ivar Headline" families used for body copy). + * The families below are referenced by name on individual pages -- notably + * /brand-expressions/typography, which renders specimens in IvarDisplay-*. + * + * Astro scopes page CSS, so these live here and are imported by Layout.astro to + * reach every route. Declared inside a single page's styles instead, specimen + * pages elsewhere would silently fall back to the default serif. + */ + +@font-face { + font-family: GT-America-Standard-Bold; + src: + local('GT-America-Standard-Bold'), + url('https://static.ithaka.org/pharos/assets/fonts/GT-America-Standard-Bold.woff') + format('woff'); +} + +@font-face { + font-family: IvarDisplay-Regular; + src: + local('IvarDisplay-Regular'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Regular.woff') format('woff'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Regular.woff2') format('woff2'); +} + +@font-face { + font-family: IvarDisplay-Medium; + src: + local('IvarDisplay-Medium'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Medium.woff') format('woff'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Medium.woff2') format('woff2'); +} + +@font-face { + font-family: IvarDisplay-Bold; + src: + local('IvarDisplay-Bold'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Bold.woff') format('woff'), + url('https://static.ithaka.org/pharos/assets/fonts/IvarDisplay-Bold.woff2') format('woff2'); +} + +@font-face { + font-family: Roboto; + src: + local('Roboto'), + url('https://static.ithaka.org/pharos/assets/fonts/Roboto-Regular.ttf') format('truetype'); +} diff --git a/packages/pharos-site-astro/src/styles/global.scss b/packages/pharos-site-astro/src/styles/global.scss new file mode 100644 index 000000000..89c942c75 --- /dev/null +++ b/packages/pharos-site-astro/src/styles/global.scss @@ -0,0 +1,235 @@ +@use '@ithaka/pharos/lib/styles/pharos'; +@use '@ithaka/pharos/lib/utils/scss/mixins'; + +kbd { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + color: #333; + background-color: #fcfcfc; + border: 0.1rem solid #e8e8e8; + border-bottom-color: #9c9c9c; + box-shadow: + 0 1px 0 #9c9c9c, + 0 0 0 2px #fcfcfc inset; +} + +.tooltip-example__target { + border-radius: 50%; + border: none; + fill: var(--pharos-color-night-blue-base); + padding: 0; + cursor: pointer; + background: none; +} + +.tooltip-example__container { + display: grid; + grid-template-columns: repeat(3, auto); + gap: 5rem; + margin-top: 5rem; + margin-bottom: 5rem; + justify-content: space-evenly; +} + +.alert-example__content { + margin: 0; +} + +p.alert-example__content + p.alert-example__content { + margin-top: 1rem; +} + +.alert-example__content > li { + margin-top: 0; +} + +.token-table-container { + width: 80%; + margin: auto; + + h2 { + font-weight: normal; + } +} + +.token-table { + width: 100%; + + code { + background: var(--pharos-color-ui-20); + border-radius: 1px; + padding: var(--pharos-spacing-one-quarter-x) var(--pharos-spacing-one-half-x); + white-space: nowrap; + } + + [data-pharos-component='PharosIcon'] { + fill: var(--pharos-color-black); + stroke: var(--pharos-color-black); + } + + /* + * Notably there is no `th` rule -- the header picks up its 4px padding and + * 14px size from Pharos' own typography styles, and adding one here overrode + * them. The rule below must use `border-top` rather than a `border-bottom` on + * each row: the bottom variant adds a trailing 1px per table, which + * accumulates into multi-pixel height drift across every /design-tokens/* page. + */ + td { + padding-bottom: var(--pharos-spacing-one-and-a-half-x); + padding-right: var(--pharos-spacing-2-x); + padding-top: var(--pharos-spacing-one-and-a-half-x); + vertical-align: top; + border-top: 1px solid var(--pharos-color-ui-30); + } + + .color-example { + width: 10rem; + height: 3rem; + border: 1px solid #eee; + } + + /* + * No max-height/overflow here: each example grows to its own line-height. + * Clipping it truncates the sample text mid-sentence and makes the page + * ~790px shorter. + */ + + .radius-example { + background: var(--pharos-color-living-coral-80); + width: 2rem; + height: 2rem; + display: inline-block; + } + + /* + * These specimens are sized entirely through inline `style` attributes; the + * classes carry only the family. In particular there is no + * `white-space: nowrap` -- adding it stops "Ivar Headline" wrapping at the + * large end of the scale, so the text overflows the table instead of growing + * the row, leaving the page ~250px short. + */ + .token-type-sans-serif { + font-family: var(--pharos-font-family-sans-serif); + } + + .token-type-serif { + font-family: var(--pharos-font-family-serif); + } + + /* + * No `display` here. The example is a plain <div> with only + * width/height/transition/background set inline, so it stays block-level; + * making it inline-block puts each example on a text baseline and adds ~6px + * to every row. + */ + .transition-example { + height: 3rem; + } +} + +.typography-table-example { + border: 1px solid var(--pharos-color-ui-40); + padding: var(--pharos-spacing-one-quarter-x) var(--pharos-spacing-one-half-x); +} + +.icon-example__icon { + stroke: var(--pharos-color-black); + stroke-width: 0; +} + +.icon-example__container { + display: flex; + align-items: center; + padding: var(--pharos-spacing-one-quarter-x); +} + +.icon-example__name { + margin-left: var(--pharos-spacing-three-quarters-x); +} + +/* + * The do/don't lists on the `button` and `toast` pages: a coloured tick or + * cross followed by an example of the copy. + * + * These were 12 inline `style` attributes, three of which were malformed — + * `var(--pharos-spacing-one-half-x;` never closed its parenthesis, so the + * browser's error recovery swallowed the `fill` after it and resolved the + * unterminated `var()` at end-of-input. It happened to produce the right 8px + * margin, and the red came from the `<li>` rather than the dropped `fill`, so + * the page looked correct and the bug stayed invisible. That is the failure + * mode inline styles are prone to: nothing parses them until a browser does. + */ +.guideline-example__item { + display: flex; +} + +/* + * Chained to `.guideline-example__item` to outrank `markdown.css`'s + * `.md-body li`, which sets the body text colour and would otherwise win on + * source order at equal specificity. Sidestepping that rule is exactly what the + * inline styles were doing. + */ +.guideline-example__item.guideline-example__item--do { + color: var(--pharos-color-green-base); +} + +.guideline-example__item.guideline-example__item--dont { + color: var(--pharos-color-living-coral-53); +} + +.guideline-example__icon { + margin-right: var(--pharos-spacing-one-half-x); + + /* Inherits the colour set on the row, so the pair cannot drift apart. */ + fill: currentcolor; + + /* The row is a flex container, so the icon would otherwise stretch to the + height of the text beside it. Visible on `toast`, where MDX wraps the + example copy in a `<p>` and the icon rendered 24x48 against 24x24 on the + live site. */ + flex-shrink: 0; + align-self: start; +} + +/* + * MDX wraps a lone run of text in a `<p>`, which as a flex item brings its own + * margin into the row. The row supplies the spacing between examples. + */ +.guideline-example__item > p { + margin: 0; +} + +.list-example__no-bullets { + @include pharos.no-bullet; +} + +.list-example__nested { + @include pharos.list-nested; +} + +.list-example__inline { + @include pharos.list-inline; +} + +[tabindex='0'] { + @include pharos.interactive-focus; +} + +@media only screen and (width <= 570px) { + .hide-for-small { + display: none !important; /* stylelint-disable-line declaration-no-important */ + } + + .show-for-small { + display: inherit !important; /* stylelint-disable-line declaration-no-important */ + } +} + +.header-example__input-group { + padding-bottom: var(--pharos-spacing-one-half-x); +} + +// hide something from sighted users but still be accessible to screen readers +.visually-hidden { + @include mixins.hidden; +} diff --git a/packages/pharos-site-astro/src/styles/home.css b/packages/pharos-site-astro/src/styles/home.css new file mode 100644 index 000000000..f4067de7d --- /dev/null +++ b/packages/pharos-site-astro/src/styles/home.css @@ -0,0 +1,163 @@ +/* + * Home page styles. + * + * The @font-face blocks sit in fonts-site.css, which the shared layout imports, + * rather than here: pages such as /brand-expressions/typography rely on them, + * so they must not be scoped to this one page. + */ + +.home .hero { + /* + * The hero is rendered just above the fill layout rather than inside it, so + * it spans the main column naturally and needs no grid placement. + */ + background: linear-gradient( + to right bottom, + var(--pharos-color-night-blue-base) 55%, + var(--pharos-color-living-coral-base) + ); + padding: var(--pharos-spacing-7-x) 0 var(--pharos-spacing-5-x) 0; + color: var(--pharos-color-text-white); + margin-bottom: var(--pharos-spacing-5-x); +} + +.home .hero__heading { + font-size: var(--pharos-type-scale-14); + font-family: var(--pharos-font-family-serif); + line-height: 1.1; + font-weight: normal; + grid-column: span 10; + margin: 0 0 var(--pharos-spacing-5-x) 0; +} + +.home .thumbnail { + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.home .thumbnail img { + width: 100%; + height: auto; +} + +.home .section-title { + margin-bottom: var(--pharos-spacing-one-quarter-x); +} + +.home .description { + color: var(--pharos-color-text-20); + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.home .icon { + margin-bottom: var(--pharos-spacing-one-quarter-x); +} + +.home .caption { + font-size: var(--pharos-font-size-small); +} + +.home p { + color: var(--pharos-color-text-20); + margin-top: 0; +} + +.home hr { + grid-column: span 12; + border: 1px var(--pharos-color-ui-20); + width: 100%; + height: 2px; + background-color: var(--pharos-color-ui-20); +} + +.home .list { + list-style-type: none; +} + +.home .list > li { + margin-left: 0; +} + +.home .icon__arrow { + margin-left: var(--pharos-spacing-one-quarter-x); + fill: var(--pharos-color-text-white); +} + +.home .heading__status { + grid-column: span 12; +} + +.home .link__status { + grid-column: span 12; +} + +.home .card { + grid-column: span 6; +} + +.home .card__image { + grid-column: span 4; + display: grid; +} + +.home figure { + margin: 0; +} + +.home .button__card { + align-self: end; +} + +.home .badge { + text-transform: uppercase; + font-size: var(--pharos-font-size-micro); + line-height: var(--pharos-line-height-xsmall); + background-color: var(--pharos-color-glacier-blue-80); + padding: var(--pharos-spacing-one-quarter-x) var(--pharos-spacing-one-half-x); +} + +.home .container__heading { + display: flex; + align-items: center; + margin-bottom: var(--pharos-spacing-three-quarters-x); + column-gap: var(--pharos-spacing-three-quarters-x); +} + +@media screen and (width <= 48rem) { + .home hr, + .home .heading__status, + .home .link__status, + .home .hero__heading { + grid-column: span 8; + } + + .home .card, + .home .card__image { + grid-column: span 4; + } +} + +@media screen and (width <= 22.5rem) { + .home hr, + .home .heading__status, + .home .link__status, + .home .hero__heading { + grid-column: span 4; + } + + .home .card, + .home .card__image { + grid-column: span 4; + } + + .home .hero { + padding: var(--pharos-spacing-5-x) 0; + } + + .home .hero__heading { + font-size: var(--pharos-type-scale-10); + } + + .home .badge { + display: none; + } +} diff --git a/packages/pharos-site-astro/src/styles/layout.css b/packages/pharos-site-astro/src/styles/layout.css new file mode 100644 index 000000000..1e8651f45 --- /dev/null +++ b/packages/pharos-site-astro/src/styles/layout.css @@ -0,0 +1,259 @@ +/* + * Layout, sidenav and footer styles. These are plain global class names, so the + * selectors are namespaced by hand. + */ + +* { + box-sizing: border-box; +} + +body, +ul, +ol { + margin: 0; + padding: 0; +} + +a { + color: var(--pharos-color-black); +} + +.container { + display: grid; + grid: + 'sidenav main' 1fr + 'sidenav footer' auto + / max-content 1fr; + min-height: 100vh; +} + +@media screen and (width <= 1055px) { + .container { + grid-template-areas: + 'sidenav' + 'main' + 'footer'; + grid-template-columns: auto; + } +} + +.main { + grid-area: main; +} + +.content { + padding: var(--main-spacing-padding) 0; + display: grid; +} + +/* + * The hero is rendered above this layout (see Layout.astro's `hero` slot) + * rather than placed into a named grid area, so only spacing overrides remain. + */ +.content--fill { + padding: 0; + margin-bottom: var(--pharos-spacing-5-x); +} + +p, +ul { + max-width: 100%; + margin-bottom: var(--pharos-spacing-one-and-a-half-x); +} + +.main li { + margin-left: var(--pharos-spacing-one-and-a-half-x); +} + +.main ul > li::marker { + color: var(--pharos-color-living-coral-base); +} + +.top-bar { + display: flex; + align-items: center; + background-color: var(--pharos-color-black); +} + +/* + * Definition lists render as inline "Term: description" pairs. Both the + * homepage and the design-tokens overview page depend on these, so they are + * global rather than page-scoped. The `dt::after` colon also absorbs the + * whitespace between the two elements, keeping the rendered text tight. + */ +dt { + font-weight: var(--pharos-font-weight-bold); + display: inline; +} + +dt::after { + content: ': '; +} + +dd { + display: inline; +} + +dl { + margin: var(--pharos-spacing-1-x) 0 var(--pharos-spacing-2-x); +} + +dl > div { + margin: var(--pharos-spacing-one-half-x) 0; +} + +/* + * A site-wide paragraph reset. Astro scopes page CSS, so this has to live here + * to reach every route. + * + * Without the `margin-top` reset the user-agent's `margin-block-start: 1em` + * shows through on every paragraph, adding 16px per section and pushing long + * pages hundreds of pixels taller than intended. + */ +p { + color: var(--pharos-color-text-20); + margin-top: 0; +} + +hr { + grid-column: span 12; + border: 1px var(--pharos-color-ui-20); + width: 100%; + height: 2px; + background-color: var(--pharos-color-ui-20); +} + +/* Also from index.module.css; overrides the user-agent's ~1em figure margin. */ +figure { + margin: 0; +} + +.page { + grid-column: span 8; +} + +@media screen and (width <= 22.5rem) { + .page { + grid-column: span 4; + } +} + +/* Sidenav */ +.sidenav { + grid-area: sidenav; +} + +.site-brand__title { + display: block; + font-size: var(--pharos-type-scale-10); + letter-spacing: -1px; + font-family: var(--pharos-font-family-serif); + line-height: var(--pharos-type-scale-10); + margin-bottom: var(--pharos-spacing-one-quarter-x); + color: var(--pharos-color-white); +} + +.site-brand__sub-title { + text-decoration: none; + font-family: var(--pharos-font-family-sans); + line-height: var(--pharos-line-height-small); + color: var(--pharos-color-marble-gray-80); +} + +/* Footer */ +.footer__container { + grid-area: footer; +} + +.footer { + background: var(--pharos-color-marble-gray-10); + color: var(--pharos-color-text-white); + padding: var(--pharos-spacing-3-x) 0; +} + +.footer .right-text { + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.footer .note { + color: var(--pharos-color-marble-gray-80); + font-size: var(--pharos-font-size-small); + line-height: var(--pharos-line-height-small); +} + +.footer .list { + list-style-type: none; +} + +.footer .list > li:not(:last-child) { + margin-bottom: var(--pharos-spacing-one-half-x); +} + +.footer .container__start { + grid-column: span 3; + display: grid; +} + +.footer .container__center { + grid-column: span 3; + display: grid; +} + +.footer .container__end { + grid-column: span 3; + display: grid; + grid-template-rows: max-content 1fr; +} + +.footer .netlify-link { + grid-column: 10 / span 3; +} + +.footer .copyright-statement { + grid-column: span 6; +} + +.footer .badge { + color: var(--pharos-color-text-white); + text-transform: uppercase; + font-size: var(--pharos-font-size-micro); + line-height: var(--pharos-line-height-xsmall); + background-color: var(--pharos-color-marble-gray-20); + padding: var(--pharos-spacing-one-quarter-x) var(--pharos-spacing-one-half-x); +} + +.footer .container__link { + display: flex; + align-items: center; + column-gap: var(--pharos-spacing-three-quarters-x); +} + +.footer .logo__link { + display: flex; +} + +@media screen and (width <= 48rem) { + .footer .container__start, + .footer .container__center, + .footer .container__end, + .footer .netlify-link { + grid-column: span 4; + } + + .footer .copyright-statement { + grid-column: span 8; + } +} + +@media screen and (width <= 22.5rem) { + .footer .container__start, + .footer .container__center, + .footer .container__end, + .footer .netlify-link { + grid-column: span 4; + } + + .footer .copyright-statement { + grid-column: span 4; + } +} diff --git a/packages/pharos-site-astro/src/styles/markdown.css b/packages/pharos-site-astro/src/styles/markdown.css new file mode 100644 index 000000000..51cc6b7df --- /dev/null +++ b/packages/pharos-site-astro/src/styles/markdown.css @@ -0,0 +1,198 @@ +/* + * Spacing for Markdown-authored pages. + * + * The hand-written `.astro` pages nested `PageSection` components and put the + * spacing on each section's wrapper as `margin-bottom`. Markdown emits a flat + * document, so there is no wrapper to hang that margin on. + * + * The gaps are reproduced by moving them to `margin-top` on the headings. That + * works because a section's bottom margin only ever separated its content from + * the *next* heading, so the same visual gap appears whether it is spelled as + * the previous section's bottom margin or the next heading's top margin. + * + * The values are the gaps *measured* on the rendered hand-written pages, not + * the section declarations copied across — see the comment on the heading rules + * below for why those differ. + * + * One consequence of the flat model is worth knowing: the hand-written pages + * nest sections, so the same `###` can take a different gap depending on the + * section it sits in. A single `margin-top` per level cannot express that, so + * individual headings do not line up with those pages exactly. + * + * Bottom margins are deliberately left to Pharos — the component's own `0.5em`, + * turned off on `##` with its `no-margin` attribute. Only the top margins + * (the inter-section gaps) live here. That makes converted pages ~7% shorter + * than the hand-written ones, which is intended. + */ + +/* + * The measured gaps on the hand-written pages, which these reproduce: + * + * before a `##` 112px (`.section`, 7x) + * before a `###` 48px (a 24px section gap plus the paragraph's own 24px, + * which collapsed inside the section wrapper) + * before a `####` 24px + * + * The `###` figure is the one worth not guessing at: 80px looks like the + * obvious value, but that applied only where a sub-section was nested directly + * under a top-level one. The common case on these pages is the 48px above. + */ +.md-heading--2 { + margin-top: var(--pharos-spacing-7-x); + + /* Matches `.section__title--more-space`, which top-level section titles used. */ + color: var(--pharos-color-black); +} + +.md-heading--3 { + margin-top: var(--pharos-spacing-3-x); +} + +.md-heading--4 { + margin-top: var(--pharos-spacing-2-x); +} + +.md-heading--5 { + margin-top: var(--pharos-spacing-1-x); +} + +/* + * A heading that immediately follows another heading (`##` then `###` with no + * prose between) drops the full section gap — the section it would separate + * from is empty. It takes no top margin at all: the `##` above it keeps its own + * bottom margin, which is the whole gap, and production shows exactly 0 here. + */ +.md-heading + .md-heading { + margin-top: 0; +} + +/* + * The first heading in the body still needs its gap: the page title and lede + * sit above `.md-body`, so this is not the top of the page. + * + * It takes the full 112px, not the difference between that and the lede's own + * 48px bottom margin. The lede and the heading are in separate parents, and + * `.md-body` establishes the boundary, so the two margins collapse to the + * larger rather than adding — 48px of the gap comes free. + */ +.md-body > .md-heading:first-child { + margin-top: var(--pharos-spacing-7-x); +} + +/* + * The page-title block, equivalent to `PageSection`'s `isHeader`. The + * description under an `#` heading is the page's standfirst and is styled from + * `.section__description--is-header`. + */ +.md-heading--1 { + margin-bottom: var(--pharos-spacing-2-x); +} + +/* + * The page standfirst, rendered from the `description` frontmatter. Equivalent + * to what `PageSection` produced for a section marked `isHeader`. + * + * These are exactly the declarations in `.section__description--is-header`. + * Note what is *not* here: `.section__description` sets `width: 75%` and + * `color`, but `PageSection` picks between the two classes with a ternary + * rather than applying both, so a header description never received either. It + * inherits the default text colour and spans the full column. + */ +.md-lede { + font-size: var(--pharos-type-scale-6); + line-height: 2rem; + margin-bottom: var(--pharos-spacing-3-x); +} + +/* + * Paragraph and list spacing is left to the browser default (24px bottom; + * `layout.css` only resets `margin-top`), which is the gap the hand-written + * pages showed between paragraphs. Setting `margin-bottom` here stacks on top + * of that rather than replacing it. + * + * The margin does have to be cancelled immediately before a heading. In the + * `.astro` pages that 24px sat *inside* the section wrapper and collapsed + * against its bottom margin, so the gap was the section value alone. Here the + * heading is a sibling, and a wrapper with its own `margin-top` does not + * collapse with the paragraph above it — the two add up, putting 104px where + * the original had 80px. Zeroing the trailing margin restores the single gap + * and hands spacing control to the heading. + */ +.md-body :is(p, ul, ol):has(+ .md-heading) { + margin-bottom: 0; +} + +/* `layout.css` colours `p` only, so list text would otherwise be darker. */ +.md-body li { + color: var(--pharos-color-text-20); +} + +/* + * Named blocks for MDX pages. + * + * MDX cannot carry Astro's scoped `<style>`, so the spacing these express has + * to be global. They are named for the role the block plays in the document — + * a topic, the specimen demonstrating it, the label above it — rather than the + * amount of space they add, so the markup says why the gap exists. + * + * `.doc-topic` is the common case: a heading plus the prose explaining it, + * forming one unit of documentation. + */ +.doc-topic { + margin-bottom: var(--pharos-spacing-2-x); +} + +/* A topic that opens a section rather than continuing one. */ +.doc-topic--section { + margin-bottom: var(--pharos-spacing-3-x); +} + +/* A live demo or specimen, separated from the discussion that follows it. */ +.doc-specimen { + margin-bottom: var(--pharos-spacing-5-x); +} + +/* The label immediately above a demo, which sits tight to it. */ +.doc-label { + margin-bottom: var(--pharos-spacing-1-x); +} + +/* + * The numeral marking each segment of a token name on the design-tokens + * overview. Colour alone cannot carry the mapping from a segment to its + * definition — WCAG 1.4.1 rules out colour as the sole means of conveying + * information, and the four hues include two reds and two blues close in + * lightness — so the numeral repeats the mapping in a form that survives + * monochrome printing and colour-blindness. + * + * The markup sets `aria-hidden` on these: a screen reader gets the mapping + * from the <dt> text, and reading the examples as "pharos dash color two + * dash brand three" would be noise. + */ +.segment-marker { + font-size: 0.75em; + font-weight: var(--pharos-font-weight-bold); + margin-left: 1px; + + /* Keeps the raised numeral from stretching the code line's height. */ + line-height: 0; +} + +/* + * The term/description list on the design-tokens overview runs each pair + * inline, as one sentence. Pharos already separates the two with a `": "` on + * `dt::after`, so the UA stylesheet's `margin-inline-start: 40px` on <dd> — + * meant to indent a block-level description under its term — only stacks on + * top of it, opening a hole whose width varies with the length of the + * preceding term. + * + * The trailing space in `": "` collapses at the element boundary, so the gap + * is set on the pseudo-element rather than left to that space. + */ +.md-body dd { + margin-inline-start: 0; +} + +.md-body dt::after { + margin-right: 0.25em; +} diff --git a/packages/pharos-site-astro/src/styles/undefined-elements.css b/packages/pharos-site-astro/src/styles/undefined-elements.css new file mode 100644 index 000000000..9f1fb06b0 --- /dev/null +++ b/packages/pharos-site-astro/src/styles/undefined-elements.css @@ -0,0 +1,221 @@ +/* + * Prevents a flash of unstyled content before the Pharos custom elements + * register. + * + * Astro server-renders the real `<site-pharos-*>` markup, so the browser paints + * it as soon as the HTML arrives. Registration happens in a `<script + * type="module">`, which is deferred by spec and additionally has to download + * and execute the Lit bundle, so there is a window where the elements exist in + * the DOM but are still *undefined*. An undefined custom element is an unknown + * tag, and unknown tags compute to `display: inline` -- so the whole page + * collapses into a run of inline text (the sidenav renders as one ~4300px-wide + * line of run-together link labels) and then snaps into place when the bundle + * lands. + * + * A client-rendered site does not show this: with an empty container div and + * every element created during hydration there is no server-rendered markup to + * flash. Static server-rendered markup is the better tradeoff, but it does mean + * the flash is real here and needs its own fix. + * + * `:not(:defined)` matches only while an element is unregistered and stops + * matching the instant `customElements.define` runs, so this costs nothing + * after boot and needs no JS to clean it up. A CSS-animation failsafe at the + * bottom of this file guarantees the content appears even if that never + * happens. + * + * Two deliberate choices: + * + * 1. `visibility: hidden` rather than `display: none`. Both hide the flash, but + * `display: none` takes the elements out of layout, so the page height jumps + * when they appear. `visibility: hidden` keeps them in flow. + * + * 2. The blocks below still restore each element's *final* `display` while + * hidden. Reserving the right box means the surrounding layout settles + * before paint instead of reflowing when registration completes. + * + * This file must be imported ahead of any stylesheet that styles these + * elements, and must not be loaded asynchronously -- it only works if it is in + * effect for the first paint. + */ + +/* + * CSS has no tag-name-prefix selector, so the tags are listed explicitly. They + * are grouped by the `display` each element resolves to once registered, so the + * box reserved while hidden matches the final one and nothing reflows. + * + * This list is the full set registered in `src/lib/initComponents.ts`, not just + * the tags in use today, so adding a component to a page needs no change here. + */ +site-pharos-layout:not(:defined) { + display: grid; + visibility: hidden; +} + +site-pharos-alert:not(:defined), +site-pharos-breadcrumb:not(:defined), +site-pharos-button:not(:defined), +site-pharos-checkbox:not(:defined), +site-pharos-checkbox-group:not(:defined), +site-pharos-coach-mark:not(:defined), +site-pharos-combobox:not(:defined), +site-pharos-dropdown-menu:not(:defined), +site-pharos-dropdown-menu-item:not(:defined), +site-pharos-dropdown-menu-nav:not(:defined), +site-pharos-dropdown-menu-nav-category:not(:defined), +site-pharos-dropdown-menu-nav-link:not(:defined), +site-pharos-footer:not(:defined), +site-pharos-header:not(:defined), +site-pharos-heading:not(:defined), +site-pharos-icon:not(:defined), +site-pharos-image-card:not(:defined), +site-pharos-input-group:not(:defined), +site-pharos-link:not(:defined), +site-pharos-loading-spinner:not(:defined), +site-pharos-modal:not(:defined), +site-pharos-multiselect-dropdown:not(:defined), +site-pharos-pagination:not(:defined), +site-pharos-pill:not(:defined), +site-pharos-progress-bar:not(:defined), +site-pharos-radio-button:not(:defined), +site-pharos-radio-group:not(:defined), +site-pharos-select:not(:defined), +site-pharos-sidenav:not(:defined), +site-pharos-sidenav-link:not(:defined), +site-pharos-sidenav-menu:not(:defined), +site-pharos-sidenav-section:not(:defined), +site-pharos-switch:not(:defined), +site-pharos-tab:not(:defined), +site-pharos-tab-panel:not(:defined), +site-pharos-table:not(:defined), +site-pharos-tabs:not(:defined), +site-pharos-text-input:not(:defined), +site-pharos-textarea:not(:defined), +site-pharos-toast:not(:defined), +site-pharos-toast-button:not(:defined), +site-pharos-toaster:not(:defined), +site-pharos-toggle-button:not(:defined), +site-pharos-toggle-button-group:not(:defined), +site-pharos-tooltip:not(:defined) { + display: block; + visibility: hidden; +} + +/* + * The skip link is a special case. Once registered it collapses to a 1px + * visually-hidden box that only expands on keyboard focus, so the `display: + * block` above over-reserves: an undefined one lays out as a full 24px line of + * text, which inflates the black `.top-bar` it sits in into a visible bar + * during the very window this file exists to smooth over. + * + * Reserving no height matches the registered state. + */ +#skip-link:not(:defined) { + display: block; + height: 0; + overflow: hidden; +} + +/* + * Failsafe: reveal everything after 3s no matter what. + * + * Hiding content until JS runs means any failure to run it -- the bundle 404s, + * a CDN blocks it, it throws on an old browser, the user has JS off -- would + * otherwise leave the page permanently blank. That is a far worse outcome than + * the flash this file exists to prevent, so the reveal must not itself depend + * on JS. + * + * A JS-set flag (`data-pharos-ready`) was tried first and is wrong for exactly + * that reason: it cannot fire in the case it is meant to protect against. + * Blocking the module bundle left all 61 sidenav links hidden forever. + * + * A CSS animation runs off the document timeline, so it fires whether or not + * any script executes. It ends on `visibility: visible`, and because the + * animation is `forwards`-filled that value sticks. Elements that register + * normally stop matching `:not(:defined)` long before the delay elapses, so in + * the normal case this never becomes visible to the user. + * + * 3s is chosen to sit beyond a realistic slow-3G bundle fetch (~1.5-2s in + * testing) while still being well under the point where a visitor would give up + * on a blank page. + */ +@keyframes pharos-undefined-failsafe { + to { + visibility: visible; + } +} + +/* + * Scoped to the same tag list hidden above rather than a bare + * `:not(:defined)` -- that pseudo-class matches every ordinary HTML element + * too (a `<div>` is not a defined custom element), so an unscoped rule would + * attach an animation to every node in the document. + */ +site-pharos-alert:not(:defined), +site-pharos-breadcrumb:not(:defined), +site-pharos-button:not(:defined), +site-pharos-checkbox:not(:defined), +site-pharos-checkbox-group:not(:defined), +site-pharos-coach-mark:not(:defined), +site-pharos-combobox:not(:defined), +site-pharos-dropdown-menu:not(:defined), +site-pharos-dropdown-menu-item:not(:defined), +site-pharos-dropdown-menu-nav:not(:defined), +site-pharos-dropdown-menu-nav-category:not(:defined), +site-pharos-dropdown-menu-nav-link:not(:defined), +site-pharos-footer:not(:defined), +site-pharos-header:not(:defined), +site-pharos-heading:not(:defined), +site-pharos-icon:not(:defined), +site-pharos-image-card:not(:defined), +site-pharos-input-group:not(:defined), +site-pharos-layout:not(:defined), +site-pharos-link:not(:defined), +site-pharos-loading-spinner:not(:defined), +site-pharos-modal:not(:defined), +site-pharos-multiselect-dropdown:not(:defined), +site-pharos-pagination:not(:defined), +site-pharos-pill:not(:defined), +site-pharos-progress-bar:not(:defined), +site-pharos-radio-button:not(:defined), +site-pharos-radio-group:not(:defined), +site-pharos-select:not(:defined), +site-pharos-sidenav:not(:defined), +site-pharos-sidenav-link:not(:defined), +site-pharos-sidenav-menu:not(:defined), +site-pharos-sidenav-section:not(:defined), +site-pharos-switch:not(:defined), +site-pharos-tab:not(:defined), +site-pharos-tab-panel:not(:defined), +site-pharos-table:not(:defined), +site-pharos-tabs:not(:defined), +site-pharos-text-input:not(:defined), +site-pharos-textarea:not(:defined), +site-pharos-toast:not(:defined), +site-pharos-toast-button:not(:defined), +site-pharos-toaster:not(:defined), +site-pharos-toggle-button:not(:defined), +site-pharos-toggle-button-group:not(:defined), +site-pharos-tooltip:not(:defined) { + animation: pharos-undefined-failsafe 1ms linear 3s forwards; +} + +/* + * The skip link needs its box back as well, not just its visibility, since the + * rule above collapses it to `height: 0`. + */ +@keyframes pharos-undefined-failsafe-skip-link { + to { + visibility: visible; + height: auto; + } +} + +#skip-link:not(:defined) { + animation: pharos-undefined-failsafe-skip-link 1ms linear 3s forwards; +} + +/* + * Users who have asked for reduced motion still need the failsafe -- it is a + * visibility switch, not motion -- so it is deliberately not disabled here. + * Keeping the duration at 1ms means there is nothing to perceive as animation. + */ diff --git a/packages/pharos-site-astro/src/styles/variables.css b/packages/pharos-site-astro/src/styles/variables.css new file mode 100644 index 000000000..e39873262 --- /dev/null +++ b/packages/pharos-site-astro/src/styles/variables.css @@ -0,0 +1,24 @@ +:root { + --color-black: var(--pharos-color-black); + --color-white: var(--pharos-color-white); + --color-gray: var(--pharos-color-marble-gray-base); + --color-marble-gray-80: var(--pharos-color-marble-gray-80); + --color-marble-gray-50: var(--pharos-color-marble-gray-50); + --font-family-main-heading: var(--pharos-font-family-serif); + --font-family-body: var(--pharos-font-family-body); + --font-family-code: consolas, monospace; + --font-color: var(--color-black); + --font-color-inverse: var(--color-white); + + /* Component tokens */ + --sidebar-color-background: var(--color-black); + --sidebar-color-text: var(--font-color-inverse); + --sidebar-spacing-padding: var(--pharos-spacing-one-and-a-half-x); + --main-spacing-padding: var(--pharos-spacing-7-x); +} + +@media screen and (width <= 1055px) { + :root { + --main-spacing-padding: var(--pharos-spacing-2-x); + } +} diff --git a/packages/pharos-site-astro/src/types.d.ts b/packages/pharos-site-astro/src/types.d.ts new file mode 100644 index 000000000..ee0eb159f --- /dev/null +++ b/packages/pharos-site-astro/src/types.d.ts @@ -0,0 +1,29 @@ +/** + * The Pharos components are registered at runtime under the `site-` prefix (see + * src/lib/initComponents.ts), so TypeScript has no intrinsic element for them. + * An index signature lets `astro check` run without inventing per-component + * prop types that would drift from the real Pharos definitions. + */ +declare namespace astroHTML.JSX { + interface IntrinsicElements { + [tagName: `site-pharos-${string}`]: Record<string, unknown>; + } +} + +/** + * The generated design tokens ship without type declarations. The tree is + * deeply nested and varies per category, so it is typed as a recursive record; + * pages narrow to the shape they need (`DesignToken` in lib/tokenFormat.ts). + */ +declare module '@ithaka/pharos/lib/styles/tokens' { + interface TokenTree { + [key: string]: TokenTree & { + name?: string; + value?: string; + comment?: string; + original?: { value: string }; + }; + } + const tokens: TokenTree; + export default tokens; +} diff --git a/packages/pharos-site-astro/tsconfig.json b/packages/pharos-site-astro/tsconfig.json new file mode 100644 index 000000000..164e21490 --- /dev/null +++ b/packages/pharos-site-astro/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@components/*": ["src/components/*"], + "@layouts/*": ["src/layouts/*"], + "@lib/*": ["src/lib/*"] + }, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "types": ["astro/client"] + }, + "include": ["src/**/*", ".astro/types.d.ts"], + "exclude": ["dist"] +} diff --git a/yarn.lock b/yarn.lock index bd587902c..b5486a2d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,6 +41,397 @@ __metadata: languageName: node linkType: hard +"@astrojs/check@npm:~0.9.10": + version: 0.9.10 + resolution: "@astrojs/check@npm:0.9.10" + dependencies: + "@astrojs/language-server": "npm:^2.16.7" + chokidar: "npm:^4.0.3" + kleur: "npm:^4.1.5" + yargs: "npm:^18.0.0" + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + bin: + astro-check: ./bin/astro-check.js + checksum: 10c0/a5de46d71e2c295bbee3c575af73b015e070c2a418f1bc1196b115fddacf60681b5313d9f6ea0427cec5f138bdf6d3c894d8e1938fd54025624b7bab2f52e7eb + languageName: node + linkType: hard + +"@astrojs/compiler-binding-darwin-arm64@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-darwin-arm64@npm:0.3.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-darwin-arm64@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-darwin-arm64@npm:0.4.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-darwin-x64@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-darwin-x64@npm:0.3.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-darwin-x64@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-darwin-x64@npm:0.4.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-arm64-gnu@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-linux-arm64-gnu@npm:0.3.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-arm64-gnu@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-linux-arm64-gnu@npm:0.4.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-arm64-musl@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-linux-arm64-musl@npm:0.3.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-arm64-musl@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-linux-arm64-musl@npm:0.4.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-x64-gnu@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-linux-x64-gnu@npm:0.3.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-x64-gnu@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-linux-x64-gnu@npm:0.4.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-x64-musl@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-linux-x64-musl@npm:0.3.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@astrojs/compiler-binding-linux-x64-musl@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-linux-x64-musl@npm:0.4.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@astrojs/compiler-binding-wasm32-wasi@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-wasm32-wasi@npm:0.3.1" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-wasm32-wasi@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-wasm32-wasi@npm:0.4.0" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.2.2" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-win32-arm64-msvc@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-win32-arm64-msvc@npm:0.3.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-win32-arm64-msvc@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-win32-arm64-msvc@npm:0.4.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-win32-x64-msvc@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding-win32-x64-msvc@npm:0.3.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding-win32-x64-msvc@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding-win32-x64-msvc@npm:0.4.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@astrojs/compiler-binding@npm:0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-binding@npm:0.3.1" + dependencies: + "@astrojs/compiler-binding-darwin-arm64": "npm:0.3.1" + "@astrojs/compiler-binding-darwin-x64": "npm:0.3.1" + "@astrojs/compiler-binding-linux-arm64-gnu": "npm:0.3.1" + "@astrojs/compiler-binding-linux-arm64-musl": "npm:0.3.1" + "@astrojs/compiler-binding-linux-x64-gnu": "npm:0.3.1" + "@astrojs/compiler-binding-linux-x64-musl": "npm:0.3.1" + "@astrojs/compiler-binding-wasm32-wasi": "npm:0.3.1" + "@astrojs/compiler-binding-win32-arm64-msvc": "npm:0.3.1" + "@astrojs/compiler-binding-win32-x64-msvc": "npm:0.3.1" + dependenciesMeta: + "@astrojs/compiler-binding-darwin-arm64": + optional: true + "@astrojs/compiler-binding-darwin-x64": + optional: true + "@astrojs/compiler-binding-linux-arm64-gnu": + optional: true + "@astrojs/compiler-binding-linux-arm64-musl": + optional: true + "@astrojs/compiler-binding-linux-x64-gnu": + optional: true + "@astrojs/compiler-binding-linux-x64-musl": + optional: true + "@astrojs/compiler-binding-wasm32-wasi": + optional: true + "@astrojs/compiler-binding-win32-arm64-msvc": + optional: true + "@astrojs/compiler-binding-win32-x64-msvc": + optional: true + checksum: 10c0/4b4b583d5b49960e8c7f10154c38d8f914bf0dbb09a8db1bf0fcbae31367604769a4e7aec02fc6e328de8c51da889780ef701f74b8e9718276c2611457f81e26 + languageName: node + linkType: hard + +"@astrojs/compiler-binding@npm:0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-binding@npm:0.4.0" + dependencies: + "@astrojs/compiler-binding-darwin-arm64": "npm:0.4.0" + "@astrojs/compiler-binding-darwin-x64": "npm:0.4.0" + "@astrojs/compiler-binding-linux-arm64-gnu": "npm:0.4.0" + "@astrojs/compiler-binding-linux-arm64-musl": "npm:0.4.0" + "@astrojs/compiler-binding-linux-x64-gnu": "npm:0.4.0" + "@astrojs/compiler-binding-linux-x64-musl": "npm:0.4.0" + "@astrojs/compiler-binding-wasm32-wasi": "npm:0.4.0" + "@astrojs/compiler-binding-win32-arm64-msvc": "npm:0.4.0" + "@astrojs/compiler-binding-win32-x64-msvc": "npm:0.4.0" + dependenciesMeta: + "@astrojs/compiler-binding-darwin-arm64": + optional: true + "@astrojs/compiler-binding-darwin-x64": + optional: true + "@astrojs/compiler-binding-linux-arm64-gnu": + optional: true + "@astrojs/compiler-binding-linux-arm64-musl": + optional: true + "@astrojs/compiler-binding-linux-x64-gnu": + optional: true + "@astrojs/compiler-binding-linux-x64-musl": + optional: true + "@astrojs/compiler-binding-wasm32-wasi": + optional: true + "@astrojs/compiler-binding-win32-arm64-msvc": + optional: true + "@astrojs/compiler-binding-win32-x64-msvc": + optional: true + checksum: 10c0/bed8bd622549a3b60a867938a715bb826493c93ac24425c6ca19ecf9cd8b97abd8b6ce6a3f13d8a96538fffe4b019be010202a83120abb47f3c1322903e842c1 + languageName: node + linkType: hard + +"@astrojs/compiler-rs@npm:^0.3.1": + version: 0.3.1 + resolution: "@astrojs/compiler-rs@npm:0.3.1" + dependencies: + "@astrojs/compiler-binding": "npm:0.3.1" + checksum: 10c0/423d48f711f3753f22df4f5686c7d3b9bae903423b9eeb810f962a2476e159ec786e0d2bd727c6ae05980e1d23c237e408c5db95f4511cff04bb2fa1d7ee5c66 + languageName: node + linkType: hard + +"@astrojs/compiler-rs@npm:^0.4.0": + version: 0.4.0 + resolution: "@astrojs/compiler-rs@npm:0.4.0" + dependencies: + "@astrojs/compiler-binding": "npm:0.4.0" + checksum: 10c0/663810868196c5af67ed6d737e47fc1b626bee88e95d3e4ecf3997d90aa71afd4c63f0d7d0d32b1f3dda5d9ae8a791c1c9e7be08fd851d0dab5dddf43650f5a6 + languageName: node + linkType: hard + +"@astrojs/compiler@npm:^2.13.1, @astrojs/compiler@npm:^2.9.1": + version: 2.13.1 + resolution: "@astrojs/compiler@npm:2.13.1" + checksum: 10c0/83d85c30c8b1bd6d2382f1bc3d99126732838dc747e3a9defa55f726ccc2276c710e6af81bfb68d8fb17fde452c69cf0187cb1d2f8eb022764f1ccc4cf3a3db1 + languageName: node + linkType: hard + +"@astrojs/internal-helpers@npm:0.10.1": + version: 0.10.1 + resolution: "@astrojs/internal-helpers@npm:0.10.1" + dependencies: + "@types/hast": "npm:^3.0.4" + "@types/mdast": "npm:^4.0.4" + js-yaml: "npm:^4.1.1" + picomatch: "npm:^4.0.4" + retext-smartypants: "npm:^6.2.0" + shiki: "npm:^4.0.2" + smol-toml: "npm:^1.6.0" + unified: "npm:^11.0.5" + checksum: 10c0/1176a1399ae40fdc2bbfce69bc3c3937d298d8b284194aa965f51341edad6b9938bc5ddf5d14d8eafabe353d2de87f0b7bb1fa47605999434a5a634cf460c4ec + languageName: node + linkType: hard + +"@astrojs/language-server@npm:^2.16.7": + version: 2.16.13 + resolution: "@astrojs/language-server@npm:2.16.13" + dependencies: + "@astrojs/compiler": "npm:^2.13.1" + "@astrojs/yaml2ts": "npm:^0.2.4" + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + "@volar/kit": "npm:~2.4.28" + "@volar/language-core": "npm:~2.4.28" + "@volar/language-server": "npm:~2.4.28" + "@volar/language-service": "npm:~2.4.28" + muggle-string: "npm:^0.4.1" + tinyglobby: "npm:^0.2.16" + volar-service-css: "npm:0.0.71" + volar-service-emmet: "npm:0.0.71" + volar-service-html: "npm:0.0.71" + volar-service-prettier: "npm:0.0.71" + volar-service-typescript: "npm:0.0.71" + volar-service-typescript-twoslash-queries: "npm:0.0.71" + volar-service-yaml: "npm:0.0.71" + vscode-html-languageservice: "npm:^5.6.2" + vscode-uri: "npm:^3.1.0" + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: ">=0.11.0" + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + bin: + astro-ls: ./bin/nodeServer.js + checksum: 10c0/ea46894ba994d45deb8c86696587dbd2a99013c352eef066f505a1583cd24e050d3fb4af0db9828be89d597a42e895fcbbd0fd2cb33ea9127f9752405a093068 + languageName: node + linkType: hard + +"@astrojs/markdown-remark@npm:7.2.1": + version: 7.2.1 + resolution: "@astrojs/markdown-remark@npm:7.2.1" + dependencies: + "@astrojs/internal-helpers": "npm:0.10.1" + "@astrojs/prism": "npm:4.0.2" + github-slugger: "npm:^2.0.0" + hast-util-from-html: "npm:^2.0.3" + hast-util-to-text: "npm:^4.0.2" + mdast-util-definitions: "npm:^6.0.0" + rehype-raw: "npm:^7.0.0" + rehype-stringify: "npm:^10.0.1" + remark-gfm: "npm:^4.0.1" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.1.2" + remark-smartypants: "npm:^3.0.2" + unified: "npm:^11.0.5" + unist-util-remove-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.1.0" + unist-util-visit-parents: "npm:^6.0.2" + vfile: "npm:^6.0.3" + checksum: 10c0/5d1b519b95ffe040bfa3d1811764852bc0148f567a889d5c5d08d0d0a8ce2addaa8a9e8cc5d2aa6127af9b7189671a4197d4c2984f9b3346223e912dafc156ce + languageName: node + linkType: hard + +"@astrojs/markdown-satteri@npm:0.3.4": + version: 0.3.4 + resolution: "@astrojs/markdown-satteri@npm:0.3.4" + dependencies: + "@astrojs/internal-helpers": "npm:0.10.1" + "@astrojs/prism": "npm:4.0.2" + github-slugger: "npm:^2.0.0" + hast-util-from-html: "npm:^2.0.3" + satteri: "npm:^0.9.1" + checksum: 10c0/b6df9043068f5e54a7e673f5ba724f7e9ee1334a30fdbeef16c644763a445fc8d34cb904095eda7acecbb3b471a25602c5a805031b756264d4e878895ba5e035 + languageName: node + linkType: hard + +"@astrojs/mdx@npm:~7.0.4": + version: 7.0.4 + resolution: "@astrojs/mdx@npm:7.0.4" + dependencies: + "@astrojs/internal-helpers": "npm:0.10.1" + "@astrojs/markdown-remark": "npm:7.2.1" + "@mdx-js/mdx": "npm:^3.1.1" + acorn: "npm:^8.16.0" + es-module-lexer: "npm:^2.0.0" + estree-util-visit: "npm:^2.0.0" + hast-util-to-html: "npm:^9.0.5" + piccolore: "npm:^0.1.3" + rehype-raw: "npm:^7.0.0" + remark-gfm: "npm:^4.0.1" + remark-smartypants: "npm:^3.0.2" + source-map: "npm:^0.7.6" + unist-util-visit: "npm:^5.1.0" + vfile: "npm:^6.0.3" + peerDependencies: + "@astrojs/markdown-satteri": ^0.3.1 + astro: ^7.0.0 + peerDependenciesMeta: + "@astrojs/markdown-satteri": + optional: true + checksum: 10c0/41bb0b65f40edbbe70c2e1398aae743fff770b0c1308cb8b10dfeba9d9ca652c3a4fd7c5e3674b1135df11b24f1b906f52bddcbbe0338c76a1bebf4337f4a173 + languageName: node + linkType: hard + +"@astrojs/prism@npm:4.0.2": + version: 4.0.2 + resolution: "@astrojs/prism@npm:4.0.2" + dependencies: + prismjs: "npm:^1.30.0" + checksum: 10c0/23a5bc096f966c08be6f8e89adfe9287fd6d08eeb9c4ec7de8172280aa638f2684dcefc5f848f55e211ff63369abc4f0661698daa5e2de6078c8f269215a7101 + languageName: node + linkType: hard + +"@astrojs/telemetry@npm:3.3.3": + version: 3.3.3 + resolution: "@astrojs/telemetry@npm:3.3.3" + dependencies: + ci-info: "npm:^4.4.0" + dset: "npm:^3.1.4" + is-docker: "npm:^4.0.0" + package-manager-detector: "npm:^1.6.0" + checksum: 10c0/d5373e0aa8cbfd684143027dce4e31f7fd45e90df799ce4d255fb750109173a3dd2fc3ef26532b298c715fe063d6e955984d238e323d96e1d8f6c0a03fbbbc73 + languageName: node + linkType: hard + +"@astrojs/yaml2ts@npm:^0.2.4": + version: 0.2.4 + resolution: "@astrojs/yaml2ts@npm:0.2.4" + dependencies: + yaml: "npm:^2.8.3" + checksum: 10c0/bb0a25ae730ea2b8ba20da4626c9d023ba27898396c2ad71384e0aae10c4479bb5d6e9f4f27aad1f486f1d287200c4753ff949ab16af367788f085b078d4b4e6 + languageName: node + linkType: hard + "@babel/code-frame@npm:7.12.11": version: 7.12.11 resolution: "@babel/code-frame@npm:7.12.11" @@ -2673,6 +3064,73 @@ __metadata: languageName: node linkType: hard +"@bruits/satteri-darwin-arm64@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-darwin-arm64@npm:0.9.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@bruits/satteri-darwin-x64@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-darwin-x64@npm:0.9.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@bruits/satteri-linux-arm64-gnu@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-linux-arm64-gnu@npm:0.9.5" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@bruits/satteri-linux-arm64-musl@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-linux-arm64-musl@npm:0.9.5" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@bruits/satteri-linux-x64-gnu@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-linux-x64-gnu@npm:0.9.5" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@bruits/satteri-linux-x64-musl@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-linux-x64-musl@npm:0.9.5" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@bruits/satteri-wasm32-wasi@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-wasm32-wasi@npm:0.9.5" + dependencies: + "@emnapi/core": "npm:1.11.1" + "@emnapi/runtime": "npm:1.11.1" + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@bruits/satteri-win32-arm64-msvc@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-win32-arm64-msvc@npm:0.9.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@bruits/satteri-win32-x64-msvc@npm:0.9.5": + version: 0.9.5 + resolution: "@bruits/satteri-win32-x64-msvc@npm:0.9.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@builder.io/partytown@npm:^0.7.5": version: 0.7.6 resolution: "@builder.io/partytown@npm:0.7.6" @@ -2743,6 +3201,15 @@ __metadata: languageName: node linkType: hard +"@capsizecss/unpack@npm:^4.0.0": + version: 4.0.1 + resolution: "@capsizecss/unpack@npm:4.0.1" + dependencies: + fontkitten: "npm:^1.0.3" + checksum: 10c0/72ce03871e137bae1c4925f9dc916a6250cf9b9630a8bb28d2ef7575d20fd7ef0e8966b361aaa3a54c0e8d5ff40b133490bd97a9beb6dc209529102947d392b1 + languageName: node + linkType: hard + "@changesets/apply-release-plan@npm:^7.1.1": version: 7.1.1 resolution: "@changesets/apply-release-plan@npm:7.1.1" @@ -3002,6 +3469,28 @@ __metadata: languageName: node linkType: hard +"@clack/core@npm:1.4.3": + version: 1.4.3 + resolution: "@clack/core@npm:1.4.3" + dependencies: + fast-wrap-ansi: "npm:^0.2.0" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16cda430974bc02844cfa6e3f0e6e19695d97e915a580ab74603d34a1f00dcbdd8dc856adc3f89405e3555b5cf42568ae8687e748cb92c3434fe4d9fc7ebe664 + languageName: node + linkType: hard + +"@clack/prompts@npm:^1.1.0": + version: 1.7.0 + resolution: "@clack/prompts@npm:1.7.0" + dependencies: + "@clack/core": "npm:1.4.3" + fast-string-width: "npm:^3.0.2" + fast-wrap-ansi: "npm:^0.2.0" + sisteransi: "npm:^1.0.5" + checksum: 10c0/a11e4f8d4a03cfe2d9eb21c3263f0252648573977b96e495a7d4f159f7efa929fe775a6ac3fe7ae30d8acb72514d94418a2c4335855d05b575a41aa885c9ff26 + languageName: node + linkType: hard + "@colordx/core@npm:^5.5.0": version: 5.5.0 resolution: "@colordx/core@npm:5.5.0" @@ -3934,37 +4423,75 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:1.11.0": - version: 1.11.0 - resolution: "@emnapi/core@npm:1.11.0" +"@emmetio/abbreviation@npm:^2.3.3": + version: 2.3.3 + resolution: "@emmetio/abbreviation@npm:2.3.3" dependencies: - "@emnapi/wasi-threads": "npm:1.2.2" - tslib: "npm:^2.4.0" - checksum: 10c0/268498d6ea42ff1e51d543725c7c9c3ce01d39be19a5790d1587ebe98dcfb9329666f0ce9864bb23e067caa064199a45ec2c63c4050b5e42166c1d7d40750135 + "@emmetio/scanner": "npm:^1.0.4" + checksum: 10c0/835b460706d5920a6f9a569a44b7d98e88d5530e3983af3678b44fa38b4cbdf68b5df933476d72e340779b16e7e7962ffa63142db8d2f59b1175a11c30c14635 languageName: node linkType: hard -"@emnapi/core@npm:1.9.2": - version: 1.9.2 - resolution: "@emnapi/core@npm:1.9.2" +"@emmetio/css-abbreviation@npm:^2.1.8": + version: 2.1.8 + resolution: "@emmetio/css-abbreviation@npm:2.1.8" dependencies: - "@emnapi/wasi-threads": "npm:1.2.1" - tslib: "npm:^2.4.0" - checksum: 10c0/5500393f953951bad0768fafaa9191f2d938956b20c6d6a79e5ab696a613a25ce6ad23422bc18e86e6ce8deb147619d8d0d7d413a69f84adc01a6633cc353cd9 + "@emmetio/scanner": "npm:^1.0.4" + checksum: 10c0/b5b3b39e773185d848b634e48e1b520e6ebffd28bfd0ba34fbcf877ca77e0edb8c7bbf58230cb0621f80f579bd7fd0265f00ab5e09ac482a835897cbdb6182a6 + languageName: node + linkType: hard + +"@emmetio/css-parser@npm:^0.4.1": + version: 0.4.1 + resolution: "@emmetio/css-parser@npm:0.4.1" + dependencies: + "@emmetio/stream-reader": "npm:^2.2.0" + "@emmetio/stream-reader-utils": "npm:^0.1.0" + checksum: 10c0/d34bf6c8d431eaa2b8b9cdff14360755ca7e235392a23666fe89f2e2b14ac54657712c196bbb6cb016b5bbf3e19faf7f413f7de815d35a26fce82a507191950e + languageName: node + linkType: hard + +"@emmetio/html-matcher@npm:^1.3.0": + version: 1.3.0 + resolution: "@emmetio/html-matcher@npm:1.3.0" + dependencies: + "@emmetio/scanner": "npm:^1.0.0" + checksum: 10c0/354f6d4d52ffb124883cc350d6a09942f2ec352b03dfb928ba8c3078b0f570041b6095367367094a307388c158e6b053565c09a9c1db699517801435a0eadb5c + languageName: node + linkType: hard + +"@emmetio/scanner@npm:^1.0.0, @emmetio/scanner@npm:^1.0.4": + version: 1.0.4 + resolution: "@emmetio/scanner@npm:1.0.4" + checksum: 10c0/ae6244e563caaff0f88d7afefc33fd6cfb7cc767ce914b54d35b46002637948cfc65951dba6d6941328afa54c721c225836fafce2de40fb7643660ba09fe7372 + languageName: node + linkType: hard + +"@emmetio/stream-reader-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "@emmetio/stream-reader-utils@npm:0.1.0" + checksum: 10c0/8630a066200976aa07ce25708484e5c2458182961280dc4637a7a6e98e1f3bb59fb7bf3bf26380f74c6ff1fd40d3dbf1143f21c721833199e45f669614a33b87 + languageName: node + linkType: hard + +"@emmetio/stream-reader@npm:^2.2.0": + version: 2.2.0 + resolution: "@emmetio/stream-reader@npm:2.2.0" + checksum: 10c0/d1a5c83b1ef062ce89b48e1fc170cd5f21b0dfa6132dc41421ef7eda455563227c047977cd4c7b70f072fa73b5af553b04cafe381c600df9bd17c58ca8238e8b languageName: node linkType: hard -"@emnapi/core@npm:2.0.0-alpha.3": - version: 2.0.0-alpha.3 - resolution: "@emnapi/core@npm:2.0.0-alpha.3" +"@emnapi/core@npm:1.11.0": + version: 1.11.0 + resolution: "@emnapi/core@npm:1.11.0" dependencies: - "@emnapi/wasi-threads": "npm:2.0.1" + "@emnapi/wasi-threads": "npm:1.2.2" tslib: "npm:^2.4.0" - checksum: 10c0/dfc26f53eb40dab0e316206cabe01e6e98d21ef8a0b820f81ce7e0fa7b4307c94f2a9599c11e6c601ad7bd77e8efb9b7cb9f86dbc3b6237f799405e0cb60c587 + checksum: 10c0/268498d6ea42ff1e51d543725c7c9c3ce01d39be19a5790d1587ebe98dcfb9329666f0ce9864bb23e067caa064199a45ec2c63c4050b5e42166c1d7d40750135 languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3": +"@emnapi/core@npm:1.11.1, @emnapi/core@npm:^1.4.3": version: 1.11.1 resolution: "@emnapi/core@npm:1.11.1" dependencies: @@ -3974,6 +4501,16 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/core@npm:1.9.2" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10c0/5500393f953951bad0768fafaa9191f2d938956b20c6d6a79e5ab696a613a25ce6ad23422bc18e86e6ce8deb147619d8d0d7d413a69f84adc01a6633cc353cd9 + languageName: node + linkType: hard + "@emnapi/runtime@npm:1.11.0": version: 1.11.0 resolution: "@emnapi/runtime@npm:1.11.0" @@ -3983,30 +4520,30 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:1.9.2": - version: 1.9.2 - resolution: "@emnapi/runtime@npm:1.9.2" +"@emnapi/runtime@npm:1.11.1, @emnapi/runtime@npm:^1.4.3": + version: 1.11.1 + resolution: "@emnapi/runtime@npm:1.11.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/61c3a59e0c36784558b8d58eb02bd04815aa5fb0dbfbaf84d1b3050a78aa0cc63ea129ae806bd1e48062bfeb7fc36eb0e5431740d62f64ea51bdf426404b8caa + checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f languageName: node linkType: hard -"@emnapi/runtime@npm:2.0.0-alpha.3": - version: 2.0.0-alpha.3 - resolution: "@emnapi/runtime@npm:2.0.0-alpha.3" +"@emnapi/runtime@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/runtime@npm:1.9.2" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/c8f6e0ad2f9c0ced8bc156a7ec3ab5fbbd2d3b7147b6a37537f6892131844b969d3aa450749807fc238160b5db61d6160b8066abfce4b2c40acfb1941bb31dd1 + checksum: 10c0/61c3a59e0c36784558b8d58eb02bd04815aa5fb0dbfbaf84d1b3050a78aa0cc63ea129ae806bd1e48062bfeb7fc36eb0e5431740d62f64ea51bdf426404b8caa languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3": - version: 1.11.1 - resolution: "@emnapi/runtime@npm:1.11.1" +"@emnapi/runtime@npm:^1.11.1": + version: 1.11.3 + resolution: "@emnapi/runtime@npm:1.11.3" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f + checksum: 10c0/a00f1020fefb9d4145c367f93a9fddb383a00da8ffd7871e20b19659890379b83aeecb9f84d7d0eda5456343f4a09eb05b0acb5153b0d3d889539dedb1ed87c3 languageName: node linkType: hard @@ -4028,15 +4565,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/wasi-threads@npm:2.0.1": - version: 2.0.1 - resolution: "@emnapi/wasi-threads@npm:2.0.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/5f7bf4cc4f6a1c31ec2084c9321d054f3b3b6c7e89430bb23fc3487d55e7be40f1ff31b2cb9a51721b444d4e8ac1f065b8749606771f6e4e7ccb32bbb709a303 - languageName: node - linkType: hard - "@emotion/babel-plugin@npm:^11.13.5": version: 11.13.5 resolution: "@emotion/babel-plugin@npm:11.13.5" @@ -4290,6 +4818,17 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.5.1": + version: 4.10.1 + resolution: "@eslint-community/eslint-utils@npm:4.10.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/b514586655698bc6b74db72a496c77e813c78b63e36a83429845ac7057dd77113b0b6c31e6e590d5baaeee2abae6ea22363a41209bcafa078d895ab83ce83011 + languageName: node + linkType: hard + "@eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.4.0": version: 4.12.2 resolution: "@eslint-community/regexpp@npm:4.12.2" @@ -4820,6 +5359,251 @@ __metadata: languageName: node linkType: hard +"@img/colour@npm:^1.1.0": + version: 1.1.0 + resolution: "@img/colour@npm:1.1.0" + checksum: 10c0/2ebea2c0bbaee73b99badcefa04e1e71d83f36e5369337d3121dca841f4569533c4e2faddda6d62dd247f0d5cca143711f9446c59bcce81e427ba433a7a94a17 + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-darwin-arm64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-darwin-x64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-freebsd-wasm32@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-freebsd-wasm32@npm:0.35.3" + dependencies: + "@img/sharp-wasm32": "npm:0.35.3" + conditions: os=freebsd + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.3.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.3.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.3.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-arm@npm:1.3.2" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.3.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.3.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.3.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linux-x64@npm:1.3.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.3.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.3.2": + version: 1.3.2 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.3.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-arm64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-arm@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-ppc64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-riscv64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-s390x@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linux-x64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-linuxmusl-x64@npm:0.35.3" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.3.2" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-wasm32@npm:0.35.3" + dependencies: + "@emnapi/runtime": "npm:^1.11.1" + checksum: 10c0/627125c330ab96e324c888d3c43fa72eb7c975e653277755121df14447373b7b47b011a1eae9c8c360a9535a7072bd6205b6498974006124b513c033a07e0e32 + languageName: node + linkType: hard + +"@img/sharp-webcontainers-wasm32@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-webcontainers-wasm32@npm:0.35.3" + dependencies: + "@img/sharp-wasm32": "npm:0.35.3" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-win32-arm64@npm:0.35.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-win32-ia32@npm:0.35.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.35.3": + version: 0.35.3 + resolution: "@img/sharp-win32-x64@npm:0.35.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@inquirer/external-editor@npm:^1.0.2": version: 1.0.3 resolution: "@inquirer/external-editor@npm:1.0.3" @@ -4904,6 +5688,23 @@ __metadata: languageName: unknown linkType: soft +"@ithaka/pharos-site-astro@workspace:packages/pharos-site-astro": + version: 0.0.0-use.local + resolution: "@ithaka/pharos-site-astro@workspace:packages/pharos-site-astro" + dependencies: + "@astrojs/check": "npm:~0.9.10" + "@astrojs/markdown-remark": "npm:7.2.1" + "@astrojs/mdx": "npm:~7.0.4" + "@ithaka/pharos": "npm:^14.25.0" + "@webcomponents/scoped-custom-element-registry": "npm:^0.0.10" + astro: "npm:~7.1.4" + cookie: "npm:^2.0.1" + culori: "npm:^4.0.2" + sass: "npm:^1.101.0" + typescript: "npm:^6.0.3" + languageName: unknown + linkType: soft + "@ithaka/pharos-site@workspace:packages/pharos-site": version: 0.0.0-use.local resolution: "@ithaka/pharos-site@workspace:packages/pharos-site" @@ -5782,6 +6583,39 @@ __metadata: languageName: node linkType: hard +"@mdx-js/mdx@npm:^3.1.1": + version: 3.1.1 + resolution: "@mdx-js/mdx@npm:3.1.1" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdx": "npm:^2.0.0" + acorn: "npm:^8.0.0" + collapse-white-space: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + estree-util-scope: "npm:^1.0.0" + estree-walker: "npm:^3.0.0" + hast-util-to-jsx-runtime: "npm:^2.0.0" + markdown-extensions: "npm:^2.0.0" + recma-build-jsx: "npm:^1.0.0" + recma-jsx: "npm:^1.0.0" + recma-stringify: "npm:^1.0.0" + rehype-recma: "npm:^1.0.0" + remark-mdx: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.0.0" + source-map: "npm:^0.7.0" + unified: "npm:^11.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/371ed95e2bee7731f30a7ce57db66383a0b7470e66c38139427174cb456d6a40bf7d259f3652716370c1de64acfba50a1ba27eb8c556e7a431dc7940b04cb1a1 + languageName: node + linkType: hard + "@mdx-js/react@npm:^3.0.0": version: 3.1.1 resolution: "@mdx-js/react@npm:3.1.1" @@ -5858,7 +6692,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.1, @napi-rs/wasm-runtime@npm:^1.1.4, @napi-rs/wasm-runtime@npm:^1.2.0": +"@napi-rs/wasm-runtime@npm:^1.1.1, @napi-rs/wasm-runtime@npm:^1.1.4": version: 1.2.2 resolution: "@napi-rs/wasm-runtime@npm:1.2.2" dependencies: @@ -5870,7 +6704,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.5": +"@napi-rs/wasm-runtime@npm:^1.1.5, @napi-rs/wasm-runtime@npm:^1.2.2": version: 1.2.3 resolution: "@napi-rs/wasm-runtime@npm:1.2.3" dependencies: @@ -5882,6 +6716,18 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^1.1.6": + version: 1.1.6 + resolution: "@napi-rs/wasm-runtime@npm:1.1.6" + dependencies: + "@tybys/wasm-util": "npm:^0.10.3" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/344518bf3ef65051dda4c00969f293aa4a21ab7dc7822b3f48519b17cd5eaa3f0bc34898d115d50ba59b1817a0cb905d46f7a7223c8249239cd14c28db388e10 + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -5964,6 +6810,13 @@ __metadata: languageName: node linkType: hard +"@oslojs/encoding@npm:^1.1.0": + version: 1.1.0 + resolution: "@oslojs/encoding@npm:1.1.0" + checksum: 10c0/5553a0974dca60e1a8b247b7b97abcb141cc7ee4e22444f424a07921d6a5f76a43c316f3ee669222787fdef6549f8749cc6d68ff5a631e2542521c56fe36417f + languageName: node + linkType: hard + "@oxc-parser/binding-android-arm-eabi@npm:0.127.0": version: 0.127.0 resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.127.0" @@ -6108,10 +6961,17 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.142.0": - version: 0.142.0 - resolution: "@oxc-project/types@npm:0.142.0" - checksum: 10c0/e4fa60b8fe1a77b0db6b9a2dcbc78d9a5a18ef64dffde01d909108f3ddbc562b876c568cb01e297ba71a256fc8aaafc928d4562475a9b2a25b276fee5bf635c3 +"@oxc-project/types@npm:=0.137.0": + version: 0.137.0 + resolution: "@oxc-project/types@npm:0.137.0" + checksum: 10c0/5a6a50174e5ac79aebf38a120fe57be7a84c8bb0c77117f30de15183aa5ab0161e78364d2d3725397090e362e5c5f6eda754b53057b0b63983e3ee604f888aca + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.139.0": + version: 0.139.0 + resolution: "@oxc-project/types@npm:0.139.0" + checksum: 10c0/ad57d1bee4b972ecf6784183da12ac6865edfff326bd83712fb75262b901868bc2b72d6fb502465a5f0dbaaded2910003f73365caf3821901dad565cc0b7fdf2 languageName: node linkType: hard @@ -7027,9 +7887,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-android-arm64@npm:1.2.1" +"@rolldown/binding-android-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-android-arm64@npm:1.1.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-android-arm64@npm:1.1.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -7041,23 +7908,37 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-darwin-arm64@npm:1.2.1" +"@rolldown/binding-darwin-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.1.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.2.5": +"@rolldown/binding-darwin-arm64@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-darwin-arm64@npm:1.1.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.2.5": version: 1.2.5 resolution: "@rolldown/binding-darwin-arm64@npm:1.2.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-darwin-x64@npm:1.2.1" +"@rolldown/binding-darwin-x64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.1.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-darwin-x64@npm:1.1.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -7069,9 +7950,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-freebsd-x64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-freebsd-x64@npm:1.2.1" +"@rolldown/binding-freebsd-x64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.1.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-freebsd-x64@npm:1.1.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -7083,9 +7971,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-arm-gnueabihf@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.2.1" +"@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.1.5" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -7097,9 +7992,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-arm64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.2.1" +"@rolldown/binding-linux-arm64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.1.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.1.5" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -7111,9 +8013,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-arm64-musl@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.2.1" +"@rolldown/binding-linux-arm64-musl@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.1.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.1.5" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -7125,9 +8034,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-ppc64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.2.1" +"@rolldown/binding-linux-ppc64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.1.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-ppc64-gnu@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.1.5" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard @@ -7139,9 +8055,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-s390x-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.2.1" +"@rolldown/binding-linux-s390x-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.1.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-s390x-gnu@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.1.5" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard @@ -7153,9 +8076,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-x64-gnu@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.2.1" +"@rolldown/binding-linux-x64-gnu@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.1.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.1.5" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -7167,9 +8097,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-linux-x64-musl@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.2.1" +"@rolldown/binding-linux-x64-musl@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.1.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.1.5" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -7181,9 +8118,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-openharmony-arm64@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.2.1" +"@rolldown/binding-openharmony-arm64@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.1.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.1.5" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard @@ -7195,20 +8139,38 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-wasm32-wasi@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.2.1" +"@rolldown/binding-wasm32-wasi@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.1.3" dependencies: - "@emnapi/core": "npm:2.0.0-alpha.3" - "@emnapi/runtime": "npm:2.0.0-alpha.3" - "@napi-rs/wasm-runtime": "npm:^1.2.0" - checksum: 10c0/e5bbfad1862187c60cd9cab802af22c71b2496f89fe73a161931f04594f9db1e09ad7a503a2f980f55a2f6d5a4d2013ad1d17260970ac170a1aa6b9286a41738 + "@emnapi/core": "npm:1.11.1" + "@emnapi/runtime": "npm:1.11.1" + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 languageName: node linkType: hard -"@rolldown/binding-win32-arm64-msvc@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.2.1" +"@rolldown/binding-wasm32-wasi@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.1.5" + dependencies: + "@emnapi/core": "npm:1.11.1" + "@emnapi/runtime": "npm:1.11.1" + "@napi-rs/wasm-runtime": "npm:^1.1.6" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.1.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.1.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -7220,9 +8182,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-win32-x64-msvc@npm:1.2.1": - version: 1.2.1 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.2.1" +"@rolldown/binding-win32-x64-msvc@npm:1.1.3": + version: 1.1.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.1.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.1.5": + version: 1.1.5 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.1.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7257,6 +8226,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.3.0": + version: 5.4.0 + resolution: "@rollup/pluginutils@npm:5.4.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ccc2cbd3a05df642df60ab05ffb81b2e564bd945e2a118bb8a474ea75b941033c8f44273133d4865643cca1492d0c80b14de1281f74779a64285a80fc3a194d8 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -7264,6 +8249,86 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/core@npm:4.3.1" + dependencies: + "@shikijs/primitive": "npm:4.3.1" + "@shikijs/types": "npm:4.3.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + hast-util-to-html: "npm:^9.0.5" + checksum: 10c0/75faa9aba4251e412764844d2329862350ef31ac21d0f07658b8a975029bd25f192ef069e757e6689a8bd9f1b19999e6f47b308ce1dee7c352543f435dd5d189 + languageName: node + linkType: hard + +"@shikijs/engine-javascript@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/engine-javascript@npm:4.3.1" + dependencies: + "@shikijs/types": "npm:4.3.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + oniguruma-to-es: "npm:^4.3.6" + checksum: 10c0/683312ded6648c6a1bfc003d1b628dda293128ad6eebbd2f4627c900ee3951cc606343fc4e87d79e6c4f32f1a51bc66b2d0998f7bcd75da803a7364c7272ffa1 + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/engine-oniguruma@npm:4.3.1" + dependencies: + "@shikijs/types": "npm:4.3.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/a6522fc5a55966a811b20396bdf1678f89e4fcd8e41f07dc6532acf7b111a161fad0656eb0dc1855275fdf7107890099c373bd23eb200e2145fe725cc91e8544 + languageName: node + linkType: hard + +"@shikijs/langs@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/langs@npm:4.3.1" + dependencies: + "@shikijs/types": "npm:4.3.1" + checksum: 10c0/89785ca417021780891598b1eacfbe89272fa068bd02215dbc6945553e5e7164a3825c2f09285d2809003e3421d577366a2fc19b7996e1a0621a2adfb73cad12 + languageName: node + linkType: hard + +"@shikijs/primitive@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/primitive@npm:4.3.1" + dependencies: + "@shikijs/types": "npm:4.3.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/33397d0d60842d74ce07db588dec3818241713c4812de6fe76c40a477e464d319f20f50f3dfa40ebc2c10964754a256d9bb4ac6f8b49a09fca1bc206a7c7b46f + languageName: node + linkType: hard + +"@shikijs/themes@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/themes@npm:4.3.1" + dependencies: + "@shikijs/types": "npm:4.3.1" + checksum: 10c0/3d578a981630e880fa18bbab14ab81e61308163c10e1967fb40fcce9d6e321d340595c7ade66275a0e80a6f3e5417ac5785052aacd7ae19c9e67bbb06eb0f278 + languageName: node + linkType: hard + +"@shikijs/types@npm:4.3.1": + version: 4.3.1 + resolution: "@shikijs/types@npm:4.3.1" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/e1586b7e8fc0610f9896c622307274c5876fe7f2a40919e08cde8947ef5022d545641c47763f29505eaad6e4b4f7c180890fd1c220146e5e75f69f384a4dc228 + languageName: node + linkType: hard + +"@shikijs/vscode-textmate@npm:^10.0.2": + version: 10.0.2 + resolution: "@shikijs/vscode-textmate@npm:10.0.2" + checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.5": version: 4.1.5 resolution: "@sideway/address@npm:4.1.5" @@ -8145,6 +9210,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.13 + resolution: "@types/debug@npm:4.1.13" + dependencies: + "@types/ms": "npm:*" + checksum: 10c0/e5e124021bbdb23a82727eee0a726ae0fc8a3ae1f57253cbcc47497f259afb357de7f6941375e773e1abbfa1604c1555b901a409d762ec2bb4c1612131d4afb7 + languageName: node + linkType: hard + "@types/deep-eql@npm:*": version: 4.0.2 resolution: "@types/deep-eql@npm:4.0.2" @@ -8196,6 +9270,15 @@ __metadata: languageName: node linkType: hard +"@types/estree-jsx@npm:^1.0.0, @types/estree-jsx@npm:^1.0.5": + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" @@ -8233,6 +9316,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": + version: 3.0.5 + resolution: "@types/hast@npm:3.0.5" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/f3af8594a6903a507ed191eda944af18099198d6708c29102ae17118c3e20779f6929e91ed37e033541fd28d58055d8a5910a4366dbdf976cf81b13a464741fb + languageName: node + linkType: hard + "@types/html-minifier@npm:^3.5.3": version: 3.5.3 resolution: "@types/html-minifier@npm:3.5.3" @@ -8387,6 +9479,15 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.4": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82 + languageName: node + linkType: hard + "@types/mdx@npm:^2.0.0": version: 2.0.13 resolution: "@types/mdx@npm:2.0.13" @@ -8394,12 +9495,28 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 + languageName: node + linkType: hard + +"@types/nlcst@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/nlcst@npm:2.0.3" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/d83549aaee59681ae8fa2a78d8a1b968a41eb7c0422773dff12acbf3661e4b2b2859740c3effdad9d0cd12ea14a0ec33ca302da12106476b627e09d2a029d3c1 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 26.1.2 - resolution: "@types/node@npm:26.1.2" + version: 26.0.1 + resolution: "@types/node@npm:26.0.1" dependencies: undici-types: "npm:~8.3.0" - checksum: 10c0/a45503222c7db8f374afd5c9381db63dd95b6b1f703abea0890dd3d4a09eeb41da489e08a1a45baf18fe89fb77fbf310ff2789f680c490b04dafc41a60800a86 + checksum: 10c0/31d204333c70124da6bcac7d1f27d8980149fe3f95a8419bfcd19c3e5823705c0e370d71ac34399352e1263b2d5fc41c87af964ec81e5a05a32224d65d8d224e languageName: node linkType: hard @@ -8579,6 +9696,20 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:*, @types/unist@npm:^3.0.0, @types/unist@npm:^3.0.3": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 + languageName: node + linkType: hard + +"@types/unist@npm:^2.0.0": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d + languageName: node + linkType: hard + "@types/uuid@npm:^11.0.0": version: 11.0.0 resolution: "@types/uuid@npm:11.0.0" @@ -8638,6 +9769,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:8.67.0, @typescript-eslint/eslint-plugin@npm:^8.67.0": + version: 8.67.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.67.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.67.0" + "@typescript-eslint/type-utils": "npm:8.67.0" + "@typescript-eslint/utils": "npm:8.67.0" + "@typescript-eslint/visitor-keys": "npm:8.67.0" + ignore: "npm:^7.0.5" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + "@typescript-eslint/parser": ^8.67.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/5962baaa764cd6350dfdf51c9a09fdd9ee6be65982ac562ee9b732f851744158e5006bf8ce61556a93534d831be8300fd89d7b79b6b4d7170dc2381d987dc8d9 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.60.1": version: 5.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" @@ -8662,23 +9813,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^8.67.0": +"@typescript-eslint/parser@npm:8.67.0, @typescript-eslint/parser@npm:^8.67.0": version: 8.67.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.67.0" + resolution: "@typescript-eslint/parser@npm:8.67.0" dependencies: - "@eslint-community/regexpp": "npm:^4.12.2" "@typescript-eslint/scope-manager": "npm:8.67.0" - "@typescript-eslint/type-utils": "npm:8.67.0" - "@typescript-eslint/utils": "npm:8.67.0" + "@typescript-eslint/types": "npm:8.67.0" + "@typescript-eslint/typescript-estree": "npm:8.67.0" "@typescript-eslint/visitor-keys": "npm:8.67.0" - ignore: "npm:^7.0.5" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.5.0" + debug: "npm:^4.4.3" peerDependencies: - "@typescript-eslint/parser": ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/5962baaa764cd6350dfdf51c9a09fdd9ee6be65982ac562ee9b732f851744158e5006bf8ce61556a93534d831be8300fd89d7b79b6b4d7170dc2381d987dc8d9 + checksum: 10c0/8f6f8fbea429509ca0c95c4d48a45da0c890172a590606d65587e75a3ca762c3e5678a20a63fc9e386b0b21b7aa643ba9724354ceaa75bc8f62d0b22cb0198c8 languageName: node linkType: hard @@ -8699,22 +9846,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^8.67.0": - version: 8.67.0 - resolution: "@typescript-eslint/parser@npm:8.67.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.67.0" - "@typescript-eslint/types": "npm:8.67.0" - "@typescript-eslint/typescript-estree": "npm:8.67.0" - "@typescript-eslint/visitor-keys": "npm:8.67.0" - debug: "npm:^4.4.3" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10c0/8f6f8fbea429509ca0c95c4d48a45da0c890172a590606d65587e75a3ca762c3e5678a20a63fc9e386b0b21b7aa643ba9724354ceaa75bc8f62d0b22cb0198c8 - languageName: node - linkType: hard - "@typescript-eslint/project-service@npm:8.65.0": version: 8.65.0 resolution: "@typescript-eslint/project-service@npm:8.65.0" @@ -8761,7 +9892,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.67.0": +"@typescript-eslint/scope-manager@npm:8.67.0, @typescript-eslint/scope-manager@npm:^8.61.0": version: 8.67.0 resolution: "@typescript-eslint/scope-manager@npm:8.67.0" dependencies: @@ -8836,7 +9967,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.67.0, @typescript-eslint/types@npm:^8.67.0": +"@typescript-eslint/types@npm:8.67.0, @typescript-eslint/types@npm:^8.61.0, @typescript-eslint/types@npm:^8.67.0": version: 8.67.0 resolution: "@typescript-eslint/types@npm:8.67.0" checksum: 10c0/b892a00d4cbea9604a0abf6eedd0ea019b27df4220a1d90e0035101cb4f846722c9e3eeadce40b423c1e0240709bbc787c6ca49bcc4f8c25ba23b4bd0436492a @@ -8977,6 +10108,13 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.0.0": + version: 1.3.3 + resolution: "@ungap/structured-clone@npm:1.3.3" + checksum: 10c0/b199e280ee06e9c447e0ccd38df60a65c2b2c13d3c77af50b1e6d77230aee1ea7da309d7b80c5a4850c8e22e4eee9e4b2813c6a33f8c360560d7f2e99a9f6e8f + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.3.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -9328,33 +10466,124 @@ __metadata: languageName: node linkType: hard -"@vscode/web-custom-data@npm:^0.4.2": - version: 0.4.13 - resolution: "@vscode/web-custom-data@npm:0.4.13" - checksum: 10c0/22ed808d610da340cc3783cacf8541689b67dfeffcb2ab8454b72f1450ff5066b120cba8143cc19dbb1831cec69172ae38c431f17ee25487f75af9daf8ff44d5 +"@volar/kit@npm:~2.4.28": + version: 2.4.28 + resolution: "@volar/kit@npm:2.4.28" + dependencies: + "@volar/language-service": "npm:2.4.28" + "@volar/typescript": "npm:2.4.28" + typesafe-path: "npm:^0.2.2" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + peerDependencies: + typescript: "*" + checksum: 10c0/c097b930eeb94d432ba7d21e0286ec787931d9fbf1c07e47e0df2d01dfa5a8d9413bac5c2fb4e342edfe57bec29b916427e62d40792ba39b614a2ff1fe3907a1 languageName: node linkType: hard -"@web/browser-logs@npm:^1.0.0": - version: 1.0.0 - resolution: "@web/browser-logs@npm:1.0.0" +"@volar/language-core@npm:2.4.28, @volar/language-core@npm:~2.4.28": + version: 2.4.28 + resolution: "@volar/language-core@npm:2.4.28" dependencies: - errorstacks: "npm:^2.4.1" - checksum: 10c0/0cb1eb0eefe1c97696d0c2d5fee9f3499931b0e6b8de52b3665abea066a5cb6cdffcff83cc6218ae79cb154b0d0780489a3e945b1bebe6c2321d2e27d30526ad + "@volar/source-map": "npm:2.4.28" + checksum: 10c0/d41f7327fed7fa5301fbf2d8f96753d645a976b21dbbeb869794a780aa6523d1e6bf258242bc3d8ccd37f8e8b98a04fea9574e6f63badc585a8a3c2e068c4a86 languageName: node linkType: hard -"@web/config-loader@npm:0.1.3": - version: 0.1.3 - resolution: "@web/config-loader@npm:0.1.3" +"@volar/language-server@npm:~2.4.28": + version: 2.4.28 + resolution: "@volar/language-server@npm:2.4.28" dependencies: - semver: "npm:^7.3.4" - checksum: 10c0/165376a525f2690b6266229d4e4f82a3e877ed1aaaea0b1131081d10650704f37d5dbdb5c959c4efcf3f4f91ccf97dcdc2b99df233d21317ee25ed7e00afacc6 + "@volar/language-core": "npm:2.4.28" + "@volar/language-service": "npm:2.4.28" + "@volar/typescript": "npm:2.4.28" + path-browserify: "npm:^1.0.1" + request-light: "npm:^0.7.0" + vscode-languageserver: "npm:^9.0.1" + vscode-languageserver-protocol: "npm:^3.17.5" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + checksum: 10c0/8266fdab264dbe449501e7d05e584069e6eb6cc5a06bf02968107c3fa32f8eb49b363d57d7abd76e5f637265469be8e13ebce1dd4b3e6ebdfae030691879d283 languageName: node linkType: hard -"@web/dev-server-core@npm:^1.0.0": - version: 1.0.0 +"@volar/language-service@npm:2.4.28, @volar/language-service@npm:~2.4.28": + version: 2.4.28 + resolution: "@volar/language-service@npm:2.4.28" + dependencies: + "@volar/language-core": "npm:2.4.28" + vscode-languageserver-protocol: "npm:^3.17.5" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + checksum: 10c0/a150d34f0c1c92641ff978eb6045ac6f0717cf16a51cfd3d0798267ccdc91aca21e6746403bf0254c747fa510ea92e3eb064acfa42320c0ebae959fd4a88add8 + languageName: node + linkType: hard + +"@volar/source-map@npm:2.4.28": + version: 2.4.28 + resolution: "@volar/source-map@npm:2.4.28" + checksum: 10c0/24b0b02c7f66febe47f0bfda4a5ed4beaf949041eddc6325c7478b900faeb071795b696d97a4f326dde47217d06e40b67129300bc544f054772c5cb84c2f254e + languageName: node + linkType: hard + +"@volar/typescript@npm:2.4.28": + version: 2.4.28 + resolution: "@volar/typescript@npm:2.4.28" + dependencies: + "@volar/language-core": "npm:2.4.28" + path-browserify: "npm:^1.0.1" + vscode-uri: "npm:^3.0.8" + checksum: 10c0/075c890b9ec1cb17f17e38aaed035f8ee7d507439e87270d8e3c394356fc9387fd0bda9ec1069b36ea4c378d9375a08f5bc64c063a83427010ddd86d472124fc + languageName: node + linkType: hard + +"@vscode/emmet-helper@npm:^2.9.3": + version: 2.11.0 + resolution: "@vscode/emmet-helper@npm:2.11.0" + dependencies: + emmet: "npm:^2.4.3" + jsonc-parser: "npm:^2.3.0" + vscode-languageserver-textdocument: "npm:^1.0.1" + vscode-languageserver-types: "npm:^3.15.1" + vscode-uri: "npm:^3.0.8" + checksum: 10c0/41c743258f958ff143f5152a7c8e8e1c6f96336f4147d537ace7c81337d5f9d7f93efd6df16c80e6d9506c51df9c8deb6440765a1deae219e31cdbead3cfd841 + languageName: node + linkType: hard + +"@vscode/l10n@npm:^0.0.18": + version: 0.0.18 + resolution: "@vscode/l10n@npm:0.0.18" + checksum: 10c0/d1fc797001f7d508ab3fa91175f7a50ea98516c4e47830ff2be79163cde9279279514a167a3bad15b7ab7fc243e7808d8f32d3eb41f4a7d6721d9dfdbb38d89e + languageName: node + linkType: hard + +"@vscode/web-custom-data@npm:^0.4.2": + version: 0.4.13 + resolution: "@vscode/web-custom-data@npm:0.4.13" + checksum: 10c0/22ed808d610da340cc3783cacf8541689b67dfeffcb2ab8454b72f1450ff5066b120cba8143cc19dbb1831cec69172ae38c431f17ee25487f75af9daf8ff44d5 + languageName: node + linkType: hard + +"@web/browser-logs@npm:^1.0.0": + version: 1.0.0 + resolution: "@web/browser-logs@npm:1.0.0" + dependencies: + errorstacks: "npm:^2.4.1" + checksum: 10c0/0cb1eb0eefe1c97696d0c2d5fee9f3499931b0e6b8de52b3665abea066a5cb6cdffcff83cc6218ae79cb154b0d0780489a3e945b1bebe6c2321d2e27d30526ad + languageName: node + linkType: hard + +"@web/config-loader@npm:0.1.3": + version: 0.1.3 + resolution: "@web/config-loader@npm:0.1.3" + dependencies: + semver: "npm:^7.3.4" + checksum: 10c0/165376a525f2690b6266229d4e4f82a3e877ed1aaaea0b1131081d10650704f37d5dbdb5c959c4efcf3f4f91ccf97dcdc2b99df233d21317ee25ed7e00afacc6 + languageName: node + linkType: hard + +"@web/dev-server-core@npm:^1.0.0": + version: 1.0.0 resolution: "@web/dev-server-core@npm:1.0.0" dependencies: "@types/koa": "npm:^2.11.6" @@ -9722,7 +10951,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -9767,6 +10996,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.0.0": + version: 8.18.0 + resolution: "acorn@npm:8.18.0" + bin: + acorn: bin/acorn + checksum: 10c0/be771be2135cc07910cf76f444ad514d7dcfd6d4a8026e597e93155275abc8ef61eee12211d52146e9d962874269b634f397464942087be013c89d0c54c5f8e5 + languageName: node + linkType: hard + "acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.16.0, acorn@npm:^8.4.1": version: 8.16.0 resolution: "acorn@npm:8.16.0" @@ -9819,6 +11057,18 @@ __metadata: languageName: node linkType: hard +"ajv-draft-04@npm:^1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 + languageName: node + linkType: hard + "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -9833,6 +11083,15 @@ __metadata: languageName: node linkType: hard +"ajv-i18n@npm:^4.2.0": + version: 4.2.0 + resolution: "ajv-i18n@npm:4.2.0" + peerDependencies: + ajv: ^8.0.0-beta.0 + checksum: 10c0/8c27882f2d46147600538aa8f48a633c72cd65baa37e0fae7159e832122b4ee504f4076f81ea3f78c15d7236a2d499d42a34d1a27b202066edc620f23963f6db + languageName: node + linkType: hard + "ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -9877,6 +11136,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.17.1": + version: 8.20.0 + resolution: "ajv@npm:8.20.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/5df9a1c8f83863cde1bd3a9ddb426f599718f88e3dc9153616c79fb28e0be455335830d7f21d745576519f057b371352daa31047b6a33d7036fe08777d60cf2a + languageName: node + linkType: hard + "all-contributors-cli@npm:^6.26.1": version: 6.26.1 resolution: "all-contributors-cli@npm:6.26.1" @@ -9901,6 +11172,17 @@ __metadata: languageName: node linkType: hard +"am-i-vibing@npm:^0.4.0": + version: 0.4.0 + resolution: "am-i-vibing@npm:0.4.0" + dependencies: + process-ancestry: "npm:^0.1.0" + bin: + am-i-vibing: dist/cli.mjs + checksum: 10c0/af511ee621c78957e7e9e86b15498d64b9d73c54689e571a03531fe123002d3a5f7bd2d7fadda9cc07511c8f7cfdcc888d897bebeb12d2bc8b725161e64fd3f5 + languageName: node + linkType: hard + "anser@npm:^2.1.1": version: 2.3.5 resolution: "anser@npm:2.3.5" @@ -10171,6 +11453,13 @@ __metadata: languageName: node linkType: hard +"array-iterate@npm:^2.0.0": + version: 2.0.1 + resolution: "array-iterate@npm:2.0.1" + checksum: 10c0/756c08334f95e290f03ab2141b034514af1311ef7b62f15b0f5ea6f8f3033ee9cc6a8f1c3e9ff4803d4d723cf992aa61460acf5fce884936972db966b1da287d + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -10316,6 +11605,104 @@ __metadata: languageName: node linkType: hard +"astring@npm:^1.8.0": + version: 1.9.0 + resolution: "astring@npm:1.9.0" + bin: + astring: bin/astring + checksum: 10c0/e7519544d9824494e80ef0e722bb3a0c543a31440d59691c13aeaceb75b14502af536b23f08db50aa6c632dafaade54caa25f0788aa7550b6b2d6e2df89e0830 + languageName: node + linkType: hard + +"astro-eslint-parser@npm:^3.0.0, astro-eslint-parser@npm:^3.1.0": + version: 3.1.0 + resolution: "astro-eslint-parser@npm:3.1.0" + dependencies: + "@astrojs/compiler-rs": "npm:^0.4.0" + "@typescript-eslint/scope-manager": "npm:^8.61.0" + "@typescript-eslint/types": "npm:^8.61.0" + debug: "npm:^4.4.3" + eslint-scope: "npm:^9.1.2" + eslint-visitor-keys: "npm:^5.0.1" + espree: "npm:^11.2.0" + semver: "npm:^7.8.4" + tinyglobby: "npm:^0.2.17" + checksum: 10c0/867f45368063d9751775807821afbfdc15ee6a497c8f39ca9d8a8881c51d4eafb59ae0c0386bc3512c9119dcf3b68e1610228b92752edc008dbdb5e5e8e6b901 + languageName: node + linkType: hard + +"astro@npm:~7.1.4": + version: 7.1.4 + resolution: "astro@npm:7.1.4" + dependencies: + "@astrojs/compiler-rs": "npm:^0.3.1" + "@astrojs/internal-helpers": "npm:0.10.1" + "@astrojs/markdown-satteri": "npm:0.3.4" + "@astrojs/telemetry": "npm:3.3.3" + "@capsizecss/unpack": "npm:^4.0.0" + "@clack/prompts": "npm:^1.1.0" + "@oslojs/encoding": "npm:^1.1.0" + "@rollup/pluginutils": "npm:^5.3.0" + am-i-vibing: "npm:^0.4.0" + aria-query: "npm:^5.3.2" + axobject-query: "npm:^4.1.0" + ci-info: "npm:^4.4.0" + clsx: "npm:^2.1.1" + common-ancestor-path: "npm:^2.0.0" + cookie: "npm:^2.0.1" + devalue: "npm:^5.8.1" + diff: "npm:^8.0.3" + dset: "npm:^3.1.4" + es-module-lexer: "npm:^2.0.0" + esbuild: "npm:^0.28.0" + flattie: "npm:^1.1.1" + fontace: "npm:~0.4.1" + get-tsconfig: "npm:5.0.0-beta.4" + github-slugger: "npm:^2.0.0" + html-escaper: "npm:3.0.3" + http-cache-semantics: "npm:^4.2.0" + js-yaml: "npm:^4.1.1" + jsonc-parser: "npm:^3.3.1" + magic-string: "npm:^1.0.0" + magicast: "npm:^0.5.2" + mrmime: "npm:^2.0.1" + neotraverse: "npm:^1.0.1" + obug: "npm:^2.1.1" + p-limit: "npm:^7.3.0" + p-queue: "npm:^9.1.0" + package-manager-detector: "npm:^1.6.0" + piccolore: "npm:^0.1.3" + picomatch: "npm:^4.0.4" + semver: "npm:^7.7.4" + sharp: "npm:^0.34.0 || ^0.35.0" + shiki: "npm:^4.0.2" + smol-toml: "npm:^1.6.0" + svgo: "npm:^4.0.1" + tinyclip: "npm:^0.1.12" + tinyexec: "npm:^1.0.4" + tinyglobby: "npm:^0.2.15" + ultrahtml: "npm:^1.6.0" + unifont: "npm:~0.7.4" + unstorage: "npm:^1.17.5" + vite: "npm:^8.0.13" + vitefu: "npm:^1.1.2" + xxhash-wasm: "npm:^1.1.0" + yargs-parser: "npm:^22.0.0" + zod: "npm:^4.3.6" + peerDependencies: + "@astrojs/markdown-remark": 7.2.1 + dependenciesMeta: + sharp: + optional: true + peerDependenciesMeta: + "@astrojs/markdown-remark": + optional: true + bin: + astro: ./bin/astro.mjs + checksum: 10c0/2e039b0d54688c48af801f76913fb1338806ed139de55b9145d5439a3d8ab879c14b37d941d66589a5336e83645d6efd5324646cfb236c210aaa27bdabb92e51 + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -10410,9 +11797,9 @@ __metadata: linkType: hard "axe-core@npm:^4.10.0, axe-core@npm:^4.2.0": - version: 4.12.1 - resolution: "axe-core@npm:4.12.1" - checksum: 10c0/03438bd98cef38ad57554feea0d8de21705001db2655c27e0c33ff55e16dd7d6f49c28fb420dc93f7532e68ff363c0953056a5836e6f47068f193eb1765c7db7 + version: 4.11.1 + resolution: "axe-core@npm:4.11.1" + checksum: 10c0/1e6997454b61c7c9a4d740f395952835dcf87f2c04fd81577217d68634d197d602c224f9e8f17b22815db4c117a2519980cfc8911fc0027c54a6d8ebca47c6a7 languageName: node linkType: hard @@ -10775,6 +12162,13 @@ __metadata: languageName: node linkType: hard +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -11022,11 +12416,11 @@ __metadata: linkType: hard "brace-expansion@npm:^2.0.2": - version: 2.1.4 - resolution: "brace-expansion@npm:2.1.4" + version: 2.1.2 + resolution: "brace-expansion@npm:2.1.2" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/6c0a0e2573eac1dc565b52b1e1bfbeba39bf1830d106ebbc61ff1eaefcf610e9111cd3baa091addd18e33292135c99e019d3184d966389d85dc958fdcdc1449f + checksum: 10c0/5442ecab84045d21826268bc56c81a6ef4215327ee1f5ee153f67928e93f7a915d130ecec9966623143277fa3cce036ebb50020024bcc4d78853cdd6af9a19f8 languageName: node linkType: hard @@ -11397,6 +12791,13 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 + languageName: node + linkType: hard + "cdocparser@npm:^0.13.0": version: 0.13.0 resolution: "cdocparser@npm:0.13.0" @@ -11543,6 +12944,34 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 + languageName: node + linkType: hard + +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 + languageName: node + linkType: hard + +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 + languageName: node + linkType: hard + +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -11650,7 +13079,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^4.0.1": +"chokidar@npm:^4.0.1, chokidar@npm:^4.0.3": version: 4.0.3 resolution: "chokidar@npm:4.0.3" dependencies: @@ -11703,7 +13132,7 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.2.0": +"ci-info@npm:^4.2.0, ci-info@npm:^4.4.0": version: 4.4.0 resolution: "ci-info@npm:4.4.0" checksum: 10c0/44156201545b8dde01aa8a09ee2fe9fc7a73b1bef9adbd4606c9f61c8caeeb73fb7a575c88b0443f7b4edb5ee45debaa59ed54ba5f99698339393ca01349eb3a @@ -11882,7 +13311,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0": +"clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 @@ -11926,6 +13355,13 @@ __metadata: languageName: node linkType: hard +"collapse-white-space@npm:^2.0.0": + version: 2.1.0 + resolution: "collapse-white-space@npm:2.1.0" + checksum: 10c0/b2e2800f4ab261e62eb27a1fbe853378296e3a726d6695117ed033e82d61fb6abeae4ffc1465d5454499e237005de9cfc52c9562dc7ca4ac759b9a222ef14453 + languageName: node + linkType: hard + "collect-v8-coverage@npm:^1.0.2": version: 1.0.3 resolution: "collect-v8-coverage@npm:1.0.3" @@ -12022,6 +13458,13 @@ __metadata: languageName: node linkType: hard +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 + languageName: node + linkType: hard + "command-line-args@npm:5.1.2": version: 5.1.2 resolution: "command-line-args@npm:5.1.2" @@ -12104,6 +13547,13 @@ __metadata: languageName: node linkType: hard +"common-ancestor-path@npm:^2.0.0": + version: 2.0.0 + resolution: "common-ancestor-path@npm:2.0.0" + checksum: 10c0/fa0872dc8d5ffb2c0bb006d1f9e7ba4586773df4f0cf3dfa4b4c95710cedb8a78246fbbcc1392c71c882bd5428a2d003851bdd9033f549a445ac2c5deacb45ca + languageName: node + linkType: hard + "common-tags@npm:1.8.2, common-tags@npm:^1.8.0, common-tags@npm:^1.8.2": version: 1.8.2 resolution: "common-tags@npm:1.8.2" @@ -12333,6 +13783,13 @@ __metadata: languageName: node linkType: hard +"cookie-es@npm:^1.2.3": + version: 1.2.3 + resolution: "cookie-es@npm:1.2.3" + checksum: 10c0/429eae6f5130a7380ea024d787d7e1ecc644ca84f9c43dfb70f18761a831d2ba591d28f837ce350892cfff0857d711f3a4ad93a082637bceb478823c339c1a97 + languageName: node + linkType: hard + "cookie-signature@npm:~1.0.6": version: 1.0.7 resolution: "cookie-signature@npm:1.0.7" @@ -12347,6 +13804,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^2.0.1": + version: 2.0.1 + resolution: "cookie@npm:2.0.1" + checksum: 10c0/dcf3bd6ec9d0f4f32be7575e23242866cb53be55fc3d4cf36215638596661cec1327a3b4ca286ba15eba8f2abd443e422b8c5f708af4ea9f75b4d3dedc67ee4c + languageName: node + linkType: hard + "cookie@npm:~0.7.1, cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" @@ -12534,6 +13998,15 @@ __metadata: languageName: node linkType: hard +"crossws@npm:^0.3.5": + version: 0.3.5 + resolution: "crossws@npm:0.3.5" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10c0/9e873546f0806606c4f775219f6811768fc3b3b0765ca8230722e849058ad098318af006e1faa39a8008c03009c37c519f6bccad41b0d78586237585c75fb38b + languageName: node + linkType: hard + "crypto-random-string@npm:^2.0.0": version: 2.0.0 resolution: "crypto-random-string@npm:2.0.0" @@ -12668,7 +14141,7 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:^3.0.1, css-tree@npm:^3.2.1": +"css-tree@npm:^3.0.1, css-tree@npm:^3.1.0, css-tree@npm:^3.2.1": version: 3.2.1 resolution: "css-tree@npm:3.2.1" dependencies: @@ -12991,7 +14464,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.3, debug@npm:~4.4.1": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.3, debug@npm:~4.4.1": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -13019,6 +14492,15 @@ __metadata: languageName: node linkType: hard +"decode-named-character-reference@npm:^1.0.0": + version: 1.3.0 + resolution: "decode-named-character-reference@npm:1.3.0" + dependencies: + character-entities: "npm:^2.0.0" + checksum: 10c0/787f4c87f3b82ea342aa7c2d7b1882b6fb9511bb77f72ae44dcaabea0470bacd1e9c6a0080ab886545019fa0cb3a7109573fad6b61a362844c3a0ac52b36e4bb + languageName: node + linkType: hard + "decode-uri-component@npm:^0.2.0": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" @@ -13176,6 +14658,13 @@ __metadata: languageName: node linkType: hard +"defu@npm:^6.1.6": + version: 6.1.7 + resolution: "defu@npm:6.1.7" + checksum: 10c0/e6635388103c8be3c574ac31302f6930e5e6eeedba32cb1b30cf993c7d9fb571aec2485446dfa23bfa63e55e66156fe109027a9695db82a50f931e91e8d4bedb + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -13211,13 +14700,20 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.3": +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 languageName: node linkType: hard +"destr@npm:^2.0.5": + version: 2.0.5 + resolution: "destr@npm:2.0.5" + checksum: 10c0/efabffe7312a45ad90d79975376be958c50069f1156b94c181199763a7f971e113bd92227c26b94a169c71ca7dbc13583b7e96e5164743969fc79e1ff153e646 + languageName: node + linkType: hard + "destroy@npm:1.2.0, destroy@npm:^1.0.4, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -13241,7 +14737,7 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1, detect-libc@npm:^2.0.2, detect-libc@npm:^2.0.3": +"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1, detect-libc@npm:^2.0.2, detect-libc@npm:^2.0.3, detect-libc@npm:^2.1.2": version: 2.1.2 resolution: "detect-libc@npm:2.1.2" checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 @@ -13281,6 +14777,22 @@ __metadata: languageName: node linkType: hard +"devalue@npm:^5.8.1": + version: 5.8.2 + resolution: "devalue@npm:5.8.2" + checksum: 10c0/bba684bba39cbe95b973645e7685eca90acb2a4e2d8d0377979592bc7e5c65d09e95c45b4232ebb5953ce34ec55e6ed0edd0ea57b249f294685be9b58a32ad9b + languageName: node + linkType: hard + +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: "npm:^2.0.0" + checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e + languageName: node + linkType: hard + "diacritics-map@npm:^0.1.0": version: 0.1.0 resolution: "diacritics-map@npm:0.1.0" @@ -13313,6 +14825,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^8.0.3": + version: 8.0.4 + resolution: "diff@npm:8.0.4" + checksum: 10c0/7ee5d03926db4039be7252ac3b0abaae1bd122a2ca971e5ca7270e444e36ff83dd906fad1a719740ca347e97ed5dc8f458a76a8391dbcd7aff363bdafb348a00 + languageName: node + linkType: hard + "diffable-html@npm:^4.1.0": version: 4.1.0 resolution: "diffable-html@npm:4.1.0" @@ -13540,6 +15059,13 @@ __metadata: languageName: node linkType: hard +"dset@npm:^3.1.4": + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 10c0/b67bbd28dd8a539e90c15ffb61100eb64ef995c5270a124d4f99bbb53f4d82f55a051b731ba81f3215dd9dce2b4c8d69927dc20b3be1c5fc88bab159467aa438 + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -13621,6 +15147,16 @@ __metadata: languageName: node linkType: hard +"emmet@npm:^2.4.3": + version: 2.4.11 + resolution: "emmet@npm:2.4.11" + dependencies: + "@emmetio/abbreviation": "npm:^2.3.3" + "@emmetio/css-abbreviation": "npm:^2.1.8" + checksum: 10c0/4099d9d0d5dee766603c4ea03e1b87296bd397a0e8c6d8d5d6dcfdaad3e4581df5d48939a00eb4437dc08c83e857e231222ee037cb34ad63b1f2cce4041c6fc2 + languageName: node + linkType: hard + "emoji-regex@npm:^10.3.0": version: 10.6.0 resolution: "emoji-regex@npm:10.6.0" @@ -14100,7 +15636,31 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0, esbuild@npm:^0.28.1": +"esast-util-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "esast-util-from-estree@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-visit: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + checksum: 10c0/6c619bc6963314f8f64b32e3b101b321bf121f659e62b11e70f425619c2db6f1d25f4c594a57fd00908da96c67d9bfbf876eb5172abf9e13f47a71796f6630ff + languageName: node + linkType: hard + +"esast-util-from-js@npm:^2.0.0": + version: 2.0.1 + resolution: "esast-util-from-js@npm:2.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + acorn: "npm:^8.0.0" + esast-util-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/3a446fb0b0d7bcd7e0157aa44b3b692802a08c93edbea81cc0f7fe4437bfdfb4b72e4563fe63b4e36d390086b71185dba4ac921f4180cc6349985c263cc74421 + languageName: node + linkType: hard + +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0, esbuild@npm:^0.28.0, esbuild@npm:^0.28.1": version: 0.28.1 resolution: "esbuild@npm:0.28.1" dependencies: @@ -14231,6 +15791,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "eslint-config-prettier@npm:^10.1.8": version: 10.1.8 resolution: "eslint-config-prettier@npm:10.1.8" @@ -14291,6 +15858,34 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-astro@npm:^3.1.0": + version: 3.1.0 + resolution: "eslint-plugin-astro@npm:3.1.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.5.1" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@typescript-eslint/types": "npm:^8.61.0" + astro-eslint-parser: "npm:^3.0.0" + espree: "npm:^11.0.0" + globals: "npm:^17.0.0" + postcss: "npm:^8.5.3" + postcss-selector-parser: "npm:^7.1.0" + peerDependencies: + "@typescript-eslint/parser": ">=8.61.0" + eslint: ">=10.0.0" + eslint-plugin-jsx-a11y: ">=6.10.2" + typescript-eslint: ">=8.61.0" + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + eslint-plugin-jsx-a11y: + optional: true + typescript-eslint: + optional: true + checksum: 10c0/be090c8a5fdb7bfd8b40108a552a4e5e1e33de11d651688d864203d75d7e3b735eb92b9b1911f63aaee44e65f994ec4d754d18ea9cc4a38a7a142deb1ab72f96 + languageName: node + linkType: hard + "eslint-plugin-flowtype@npm:^5.10.0": version: 5.10.0 resolution: "eslint-plugin-flowtype@npm:5.10.0" @@ -14648,7 +16243,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^11.2.0": +"espree@npm:^11.0.0, espree@npm:^11.2.0": version: 11.2.0 resolution: "espree@npm:11.2.0" dependencies: @@ -14712,43 +16307,102 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" +"estree-util-attach-comments@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-attach-comments@npm:3.0.0" dependencies: "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + checksum: 10c0/ee69bb5c45e2ad074725b90ed181c1c934b29d81bce4b0c7761431e83c4c6ab1b223a6a3d6a4fbeb92128bc5d5ee201d5dd36cf1770aa5e16a40b0cf36e8a1f1 languageName: node linkType: hard -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 +"estree-util-build-jsx@npm:^3.0.0": + version: 3.0.1 + resolution: "estree-util-build-jsx@npm:3.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + estree-walker: "npm:^3.0.0" + checksum: 10c0/274c119817b8e7caa14a9778f1e497fea56cdd2b01df1a1ed037f843178992d3afe85e0d364d485e1e2e239255763553d1b647b15e4a7ba50851bcb43dc6bf80 languageName: node linkType: hard -"etag@npm:^1.8.1, etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b languageName: node linkType: hard -"event-emitter@npm:^0.3.5": - version: 0.3.5 - resolution: "event-emitter@npm:0.3.5" +"estree-util-scope@npm:^1.0.0": + version: 1.0.0 + resolution: "estree-util-scope@npm:1.0.0" dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + checksum: 10c0/ef8a573cc899277c613623a1722f630e2163abbc6e9e2f49e758c59b81b484e248b585df6df09a38c00fbfb6390117997cc80c1347b7a86bc1525d9e462b60d5 + languageName: node + linkType: hard + +"estree-util-to-js@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-to-js@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + astring: "npm:^1.8.0" + source-map: "npm:^0.7.0" + checksum: 10c0/ac88cb831401ef99e365f92f4af903755d56ae1ce0e0f0fb8ff66e678141f3d529194f0fb15f6c78cd7554c16fda36854df851d58f9e05cfab15bddf7a97cea0 + languageName: node + linkType: hard + +"estree-util-visit@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-visit@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/unist": "npm:^3.0.0" + checksum: 10c0/acda8b03cc8f890d79c7c7361f6c95331ba84b7ccc0c32b49f447fc30206b20002b37ffdfc97b6ad16e6fe065c63ecbae1622492e2b6b4775c15966606217f39 + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"etag@npm:^1.8.1, etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"event-emitter@npm:^0.3.5": + version: 0.3.5 + resolution: "event-emitter@npm:0.3.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 languageName: node linkType: hard @@ -14766,6 +16420,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^5.0.4": + version: 5.0.4 + resolution: "eventemitter3@npm:5.0.4" + checksum: 10c0/575b8cac8d709e1473da46f8f15ef311b57ff7609445a7c71af5cd42598583eee6f098fa7a593e30f27e94b8865642baa0689e8fa97c016f742abdb3b1bf6d9a + languageName: node + linkType: hard + "events-universal@npm:^1.0.0": version: 1.0.1 resolution: "events-universal@npm:1.0.1" @@ -15031,10 +16692,35 @@ __metadata: languageName: node linkType: hard +"fast-string-truncated-width@npm:^3.0.2": + version: 3.0.3 + resolution: "fast-string-truncated-width@npm:3.0.3" + checksum: 10c0/043b8663397d14a3880ce4f3407bcda60b40db9bbeafe62863a35d1f9c69ea17c8da3fcd72de235553e6c9cd053128cde9e24ca0d4a7463208f48db3cd23d981 + languageName: node + linkType: hard + +"fast-string-width@npm:^3.0.2": + version: 3.0.2 + resolution: "fast-string-width@npm:3.0.2" + dependencies: + fast-string-truncated-width: "npm:^3.0.2" + checksum: 10c0/c8822d175315bb353ebe782b65214ac53b13e3bf704e03b132ea7bdfa8de6a636375b3ab7a4097545393d109381c37c4f387c72a462c90b61412dbc4632f39a7 + languageName: node + linkType: hard + "fast-uri@npm:^3.0.1": - version: 3.1.5 - resolution: "fast-uri@npm:3.1.5" - checksum: 10c0/2bf60eb800dd610c65e17be436425dcb21c92aff3a87d442a8bccab0b7b071e88cf1a5d7d1ea946370b937e6fc0375c405c0296c10587e57de4f78be4646d1d0 + version: 3.1.4 + resolution: "fast-uri@npm:3.1.4" + checksum: 10c0/f90948821ceb49980f64f89b8216ba498f5957f26035be813526a55b6145d26cbd63ef5618d5205a3292b31edc9c08589749350cd72bd86c7095eb434dceb757 + languageName: node + linkType: hard + +"fast-wrap-ansi@npm:^0.2.0": + version: 0.2.2 + resolution: "fast-wrap-ansi@npm:0.2.2" + dependencies: + fast-string-width: "npm:^3.0.2" + checksum: 10c0/1aa7be4f7cb86f4bdb14691cb6bcc0b8df8b3b89df142ade3ae1602332dcf6f990cd750a923cd581ca0847808cb4ec1aa5afaafa7a72f849e87a2a62c98fa370 languageName: node linkType: hard @@ -15391,6 +17077,13 @@ __metadata: languageName: node linkType: hard +"flattie@npm:^1.1.1": + version: 1.1.1 + resolution: "flattie@npm:1.1.1" + checksum: 10c0/a8f8242c7af126cb2f1aa4a067af338fce609fc4c4df183c626fcc70a46c1878ce4aa88cd0dc8ef8f583ad4e7088a3b11ebeb6a62c9c97d75c0b1b0f08182ee3 + languageName: node + linkType: hard + "flush-write-stream@npm:^1.0.2": version: 1.1.1 resolution: "flush-write-stream@npm:1.1.1" @@ -15420,6 +17113,24 @@ __metadata: languageName: node linkType: hard +"fontace@npm:~0.4.1": + version: 0.4.1 + resolution: "fontace@npm:0.4.1" + dependencies: + fontkitten: "npm:^1.0.2" + checksum: 10c0/2b3b8bc60192b0e9d87c369f1d72bf5da6c5b0f6055d5eeb0c06693455c55395f9592844273035399289f410202306c1d7f7329312e6e42a2694912d39c70709 + languageName: node + linkType: hard + +"fontkitten@npm:^1.0.2, fontkitten@npm:^1.0.3": + version: 1.0.3 + resolution: "fontkitten@npm:1.0.3" + dependencies: + tiny-inflate: "npm:^1.0.3" + checksum: 10c0/edee7bde2f824a778cf401a2019ada63376fc8bcc5303d09a11e8a9245f35bd945934abea04aef1ca52e8dbb6ce3a17fe9ecdfa52cc0c92f56b25709fb865a76 + languageName: node + linkType: hard + "for-each@npm:^0.3.3, for-each@npm:^0.3.5": version: 0.3.5 resolution: "for-each@npm:0.3.5" @@ -16461,6 +18172,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:5.0.0-beta.4": + version: 5.0.0-beta.4 + resolution: "get-tsconfig@npm:5.0.0-beta.4" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/6b908fc5d2abc937fca6938f5e9218238f49b11cd07362831383aa5815b25ce6f5fff36d4bcd70caa17778a54922b654745ce6c0b1bb19be8eac87da4e3fc087 + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -16468,6 +18188,13 @@ __metadata: languageName: node linkType: hard +"github-slugger@npm:^2.0.0": + version: 2.0.0 + resolution: "github-slugger@npm:2.0.0" + checksum: 10c0/21b912b6b1e48f1e5a50b2292b48df0ff6abeeb0691b161b3d93d84f4ae6b1acd6ae23702e914af7ea5d441c096453cf0f621b72d57893946618d21dd1a1c486 + languageName: node + linkType: hard + "glob-parent@npm:^3.1.0": version: 3.1.0 resolution: "glob-parent@npm:3.1.0" @@ -16665,7 +18392,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^17.11.0": +"globals@npm:^17.0.0, globals@npm:^17.11.0": version: 17.11.0 resolution: "globals@npm:17.11.0" checksum: 10c0/5e1be3d816e04d4d0d01b1cdd40e46b5fb6b5e9f15aece9a5919b060e0fb1b3f1b9e7327dce97ef19e05513a6d65872e0834999ddea251557556dddd0f5fde30 @@ -16918,6 +18645,23 @@ __metadata: languageName: node linkType: hard +"h3@npm:^1.15.10": + version: 1.15.11 + resolution: "h3@npm:1.15.11" + dependencies: + cookie-es: "npm:^1.2.3" + crossws: "npm:^0.3.5" + defu: "npm:^6.1.6" + destr: "npm:^2.0.5" + iron-webcrypto: "npm:^1.2.1" + node-mock-http: "npm:^1.0.4" + radix3: "npm:^1.1.2" + ufo: "npm:^1.6.3" + uncrypto: "npm:^0.1.3" + checksum: 10c0/6ccb421b9f92e02e6330c2b6697b18ef18e9550e4a1708f224ca517c40ecd201cd00967d0feb26e718595e86e985edec1755933cf8792d34fb8504f1c7cc261d + languageName: node + linkType: hard + "handlebars@npm:^4.7.9": version: 4.7.9 resolution: "handlebars@npm:4.7.9" @@ -17040,6 +18784,190 @@ __metadata: languageName: node linkType: hard +"hast-util-from-html@npm:^2.0.3": + version: 2.0.3 + resolution: "hast-util-from-html@npm:2.0.3" + dependencies: + "@types/hast": "npm:^3.0.0" + devlop: "npm:^1.1.0" + hast-util-from-parse5: "npm:^8.0.0" + parse5: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764 + languageName: node + linkType: hard + +"hast-util-from-parse5@npm:^8.0.0": + version: 8.0.3 + resolution: "hast-util-from-parse5@npm:8.0.3" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + hastscript: "npm:^9.0.0" + property-information: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-location: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545 + languageName: node + linkType: hard + +"hast-util-is-element@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-is-element@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f + languageName: node + linkType: hard + +"hast-util-raw@npm:^9.0.0": + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-from-parse5: "npm:^8.0.0" + hast-util-to-parse5: "npm:^8.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + parse5: "npm:^7.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc + languageName: node + linkType: hard + +"hast-util-to-estree@npm:^3.0.0": + version: 3.1.3 + resolution: "hast-util-to-estree@npm:3.1.3" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-attach-comments: "npm:^3.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-js: "npm:^1.0.0" + unist-util-position: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/8e86c075319082c8a6304c5bcdf24ec02466074571e993f58bfa2cfd70850ef46d33b5c402208597a87fe0f02f1e620bda5958217efb1b7396c81c486373b75f + languageName: node + linkType: hard + +"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.5": + version: 9.0.5 + resolution: "hast-util-to-html@npm:9.0.5" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-whitespace: "npm:^3.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + stringify-entities: "npm:^4.0.0" + zwitch: "npm:^2.0.4" + checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836 + languageName: node + linkType: hard + +"hast-util-to-jsx-runtime@npm:^2.0.0": + version: 2.3.6 + resolution: "hast-util-to-jsx-runtime@npm:2.3.6" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-js: "npm:^1.0.0" + unist-util-position: "npm:^5.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/27297e02848fe37ef219be04a26ce708d17278a175a807689e94a821dcffc88aa506d62c3a85beed1f9a8544f7211bdcbcde0528b7b456a57c2e342c3fd11056 + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.1 + resolution: "hast-util-to-parse5@npm:8.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/8e8a1817c7ff8906ac66e7201b1b8d19d9e1b705e695a6e71620270d498d982ec1ecc0e227bd517f723e91e7fdfb90ef75f9ae64d14b3b65239a7d5e1194d7dd + languageName: node + linkType: hard + +"hast-util-to-text@npm:^4.0.2": + version: 4.0.2 + resolution: "hast-util-to-text@npm:4.0.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + unist-util-find-after: "npm:^5.0.0" + checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946 + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 + languageName: node + linkType: hard + +"hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^4.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce + languageName: node + linkType: hard + "he@npm:1.2.0, he@npm:1.2.x, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -17114,6 +19042,13 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:3.0.3": + version: 3.0.3 + resolution: "html-escaper@npm:3.0.3" + checksum: 10c0/a042fa4139127ff7546513e90ea39cc9161a1938ce90122dbc4260d4b7252c9aa8452f4509c0c2889901b8ae9a8699179150f1f99d3f80bcf7317573c5f08f4e + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -17162,6 +19097,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 + languageName: node + linkType: hard + "htmlparser2@npm:^10.1.0": version: 10.1.0 resolution: "htmlparser2@npm:10.1.0" @@ -17222,7 +19164,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1, http-cache-semantics@npm:^4.2.0": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 @@ -17557,6 +19499,13 @@ __metadata: languageName: node linkType: hard +"inline-style-parser@npm:0.2.7": + version: 0.2.7 + resolution: "inline-style-parser@npm:0.2.7" + checksum: 10c0/d884d76f84959517430ae6c22f0bda59bb3f58f539f99aac75a8d786199ec594ed648c6ab4640531f9fc244b0ed5cd8c458078e592d016ef06de793beb1debff + languageName: node + linkType: hard + "inquirer@npm:^7.0.0, inquirer@npm:^7.3.3": version: 7.3.3 resolution: "inquirer@npm:7.3.3" @@ -17611,9 +19560,9 @@ __metadata: linkType: hard "ip-address@npm:^10.0.1": - version: 10.4.0 - resolution: "ip-address@npm:10.4.0" - checksum: 10c0/d7b0bd2624fd861afbae6e49036a9b56f9506eaff7ff38592b7b4492dd5c272b53f5356dc8cc019e318acf29a96c90a3d1af1df761960267d23efa96858270fa + version: 10.2.0 + resolution: "ip-address@npm:10.2.0" + checksum: 10c0/5a00aada6e922c9c69dfc800ed5d0fa3348675ebdeed0e1575f503f27ca385b5f534363c9af7ad1daf64c1f1409388cdd3cc2e9b9b0fe1c924a431378d55075a languageName: node linkType: hard @@ -17631,6 +19580,13 @@ __metadata: languageName: node linkType: hard +"iron-webcrypto@npm:^1.2.1": + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: 10c0/5cf27c6e2bd3ef3b4970e486235fd82491ab8229e2ed0ac23307c28d6c80d721772a86ed4e9fe2a5cabadd710c2f024b706843b40561fb83f15afee58f809f66 + languageName: node + linkType: hard + "is-absolute-url@npm:^3.0.0": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" @@ -17648,6 +19604,23 @@ __metadata: languageName: node linkType: hard +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 + languageName: node + linkType: hard + +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" + dependencies: + is-alphabetical: "npm:^2.0.0" + is-decimal: "npm:^2.0.0" + checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4": version: 1.2.0 resolution: "is-arguments@npm:1.2.0" @@ -17779,6 +19752,13 @@ __metadata: languageName: node linkType: hard +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 + languageName: node + linkType: hard + "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -17797,6 +19777,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^4.0.0": + version: 4.0.0 + resolution: "is-docker@npm:4.0.0" + bin: + is-docker: cli.js + checksum: 10c0/4ee05c305b545422b172cab17f42900b940a5fa77820380d3244784fde69279d6881305f249b3b7fa2e261c2294804100548f5638880842e5b43df72cec29087 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -17899,6 +19888,13 @@ __metadata: languageName: node linkType: hard +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 + languageName: node + linkType: hard + "is-inside-container@npm:^1.0.0": version: 1.0.0 resolution: "is-inside-container@npm:1.0.0" @@ -18046,7 +20042,7 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.1.0": +"is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e @@ -19093,14 +21089,14 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0, js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.1": - version: 3.15.1 - resolution: "js-yaml@npm:3.15.1" + version: 3.15.0 + resolution: "js-yaml@npm:3.15.0" dependencies: argparse: "npm:^1.0.7" esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/6c693b8c59ffe12021df3b36994b090df19d920826dd810baab81652b40861e1974509dd11fe92225ab4c00cc14de053300c94db015c2c0e211edea39b118737 + checksum: 10c0/ca966bd354ac5b1b7a4694ebdba46526796aa3a6a99529fa540af2abf85918bd155a50ccc0166b413130a00622999973754458ec01e7095bc902177bfdbd5b64 languageName: node linkType: hard @@ -19204,7 +21200,14 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0, jsonc-parser@npm:^3.3.1": +"jsonc-parser@npm:^2.3.0": + version: 2.3.1 + resolution: "jsonc-parser@npm:2.3.1" + checksum: 10c0/b5e823612f6518a4d35e65d3c642e87b994c52a71b6d83d306d59f9b57003a1f6c64659808f0f1c3448991c28916d56faca45222f31ddb1a32effecdef0f0485 + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.0.0, jsonc-parser@npm:^3.2.0, jsonc-parser@npm:^3.3.1": version: 3.3.1 resolution: "jsonc-parser@npm:3.3.1" checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 @@ -19319,6 +21322,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + "klona@npm:^2.0.4": version: 2.0.6 resolution: "klona@npm:2.0.6" @@ -19489,6 +21499,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "lightningcss-android-arm64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-android-arm64@npm:1.33.0" @@ -19496,6 +21513,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "lightningcss-darwin-arm64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-darwin-arm64@npm:1.33.0" @@ -19503,6 +21527,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "lightningcss-darwin-x64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-darwin-x64@npm:1.33.0" @@ -19510,6 +21541,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "lightningcss-freebsd-x64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-freebsd-x64@npm:1.33.0" @@ -19517,6 +21555,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "lightningcss-linux-arm-gnueabihf@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm-gnueabihf@npm:1.33.0" @@ -19524,6 +21569,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "lightningcss-linux-arm64-gnu@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm64-gnu@npm:1.33.0" @@ -19531,6 +21583,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "lightningcss-linux-arm64-musl@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm64-musl@npm:1.33.0" @@ -19538,6 +21597,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "lightningcss-linux-x64-gnu@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-x64-gnu@npm:1.33.0" @@ -19545,6 +21611,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "lightningcss-linux-x64-musl@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-x64-musl@npm:1.33.0" @@ -19552,6 +21625,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "lightningcss-win32-arm64-msvc@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-win32-arm64-msvc@npm:1.33.0" @@ -19559,6 +21639,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "lightningcss-win32-x64-msvc@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-win32-x64-msvc@npm:1.33.0" @@ -19566,22 +21653,22 @@ __metadata: languageName: node linkType: hard -"lightningcss@npm:^1.33.0": - version: 1.33.0 - resolution: "lightningcss@npm:1.33.0" +"lightningcss@npm:^1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" dependencies: detect-libc: "npm:^2.0.3" - lightningcss-android-arm64: "npm:1.33.0" - lightningcss-darwin-arm64: "npm:1.33.0" - lightningcss-darwin-x64: "npm:1.33.0" - lightningcss-freebsd-x64: "npm:1.33.0" - lightningcss-linux-arm-gnueabihf: "npm:1.33.0" - lightningcss-linux-arm64-gnu: "npm:1.33.0" - lightningcss-linux-arm64-musl: "npm:1.33.0" - lightningcss-linux-x64-gnu: "npm:1.33.0" - lightningcss-linux-x64-musl: "npm:1.33.0" - lightningcss-win32-arm64-msvc: "npm:1.33.0" - lightningcss-win32-x64-msvc: "npm:1.33.0" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" dependenciesMeta: lightningcss-android-arm64: optional: true @@ -19605,11 +21692,54 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: 10c0/ce1f8279fbae636dbf37fa6e7385d5f98ed881d72af3362f24afbd4685e19c1fcdfecf17e5dd77f2ebee3d0c23ade276230d85842d07292229a2cffba8ff20a3 + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 languageName: node linkType: hard -"lilconfig@npm:^2.0.3": +"lightningcss@npm:^1.33.0": + version: 1.33.0 + resolution: "lightningcss@npm:1.33.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.33.0" + lightningcss-darwin-arm64: "npm:1.33.0" + lightningcss-darwin-x64: "npm:1.33.0" + lightningcss-freebsd-x64: "npm:1.33.0" + lightningcss-linux-arm-gnueabihf: "npm:1.33.0" + lightningcss-linux-arm64-gnu: "npm:1.33.0" + lightningcss-linux-arm64-musl: "npm:1.33.0" + lightningcss-linux-x64-gnu: "npm:1.33.0" + lightningcss-linux-x64-musl: "npm:1.33.0" + lightningcss-win32-arm64-msvc: "npm:1.33.0" + lightningcss-win32-x64-msvc: "npm:1.33.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/ce1f8279fbae636dbf37fa6e7385d5f98ed881d72af3362f24afbd4685e19c1fcdfecf17e5dd77f2ebee3d0c23ade276230d85842d07292229a2cffba8ff20a3 + languageName: node + linkType: hard + +"lilconfig@npm:^2.0.3": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" checksum: 10c0/64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 @@ -20200,6 +22330,13 @@ __metadata: languageName: node linkType: hard +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -20288,6 +22425,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.2.7": + version: 11.5.2 + resolution: "lru-cache@npm:11.5.2" + checksum: 10c0/ece1ad731f5b655e85d67047d04bfc13823dc77aa61c5454924a9869ba600a0104e39cc33d726021feef812bc347ca34a5608a5eb1972a5dd0870b7ecd42c3f2 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -20349,6 +22493,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^1.0.0": + version: 1.1.0 + resolution: "magic-string@npm:1.1.0" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/f904dee2fd190ee5450c754234d8a831228677e9092ed2e545e42746beecf18d617156eb911af55a14496ebe1e60179678c4080c919f74eca7738eba3f38f13a + languageName: node + linkType: hard + "magicast@npm:^0.5.2": version: 0.5.3 resolution: "magicast@npm:0.5.3" @@ -20420,6 +22573,13 @@ __metadata: languageName: node linkType: hard +"markdown-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-extensions@npm:2.0.0" + checksum: 10c0/406139da2aa0d5ebad86195c8e8c02412f873c452b4c087ae7bc767af37956141be449998223bb379eea179b5fd38dfa610602b6f29c22ddab5d51e627a7e41d + languageName: node + linkType: hard + "markdown-link@npm:^0.1.1": version: 0.1.1 resolution: "markdown-link@npm:0.1.1" @@ -20427,6 +22587,13 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^3.0.0": + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b + languageName: node + linkType: hard + "markdown-toc@npm:^1.2.0": version: 1.2.0 resolution: "markdown-toc@npm:1.2.0" @@ -20479,6 +22646,240 @@ __metadata: languageName: node linkType: hard +"mdast-util-definitions@npm:^6.0.0": + version: 6.0.0 + resolution: "mdast-util-definitions@npm:6.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/a2e0e51122a3eff4f35379de2c50ee3d8a89bea58488a390b1b40ada95727eb769f87d4bc885e5935d61820d19e0567bc047876db302a2139f3a29668b612b80 + languageName: node + linkType: hard + +"mdast-util-find-and-replace@npm:^3.0.0": + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + escape-string-regexp: "npm:^5.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2 + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.3 + resolution: "mdast-util-from-markdown@npm:2.0.3" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark: "npm:^4.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10c0/d3eac9ac2b88e3b41fb85aa81c7bfd1f4f8a2fde497ad805e66fea7b2abfe486ffd94d2a20f9fd2951dcdebe4916f3bdcf851319891dd62d343e26c2f02583ba + languageName: node + linkType: hard + +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.0.0" + mdast-util-find-and-replace: "npm:^3.0.0" + micromark-util-character: "npm:^2.0.0" + checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0 + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + markdown-table: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e + languageName: node + linkType: hard + +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 + languageName: node + linkType: hard + +"mdast-util-gfm@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-gfm-autolink-literal: "npm:^2.0.0" + mdast-util-gfm-footnote: "npm:^2.0.0" + mdast-util-gfm-strikethrough: "npm:^2.0.0" + mdast-util-gfm-table: "npm:^2.0.0" + mdast-util-gfm-task-list-item: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81 + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/9a1e57940f66431f10312fa239096efa7627f375e7933b5d3162c0b5c1712a72ac87447aff2b6838d2bbd5c1311b188718cc90b33b67dc67a88550e0a6ef6183 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.2.0 + resolution: "mdast-util-mdx-jsx@npm:3.2.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + parse-entities: "npm:^4.0.0" + stringify-entities: "npm:^4.0.0" + unist-util-stringify-position: "npm:^4.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613 + languageName: node + linkType: hard + +"mdast-util-mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-mdx@npm:3.0.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/4faea13f77d6bc9aa64ee41a5e4779110b73444a17fda363df6ebe880ecfa58b321155b71f8801c3faa6d70d6222a32a00cbd6dbf5fad8db417f4688bc9c74e1 + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.1 + resolution: "mdast-util-to-hast@npm:13.2.1" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + trim-lines: "npm:^3.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/3eeaf28a5e84e1e08e6d54a1a8a06c0fca88cb5d36f4cf8086f0177248d1ce6e4e751f4ad0da19a3dea1c6ea61bd80784acc3ae021e44ceeb21aa5413a375e43 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^4.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -20605,17 +23006,454 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-destination: "npm:^2.0.0" + micromark-factory-label: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-factory-title: "npm:^2.0.0" + micromark-factory-whitespace: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-html-tag-name: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee + languageName: node + linkType: hard + +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-extension-gfm-table@npm:2.1.1" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: "npm:^2.0.0" + micromark-extension-gfm-footnote: "npm:^2.0.0" + micromark-extension-gfm-strikethrough: "npm:^2.0.0" + micromark-extension-gfm-table: "npm:^2.0.0" + micromark-extension-gfm-tagfilter: "npm:^2.0.0" + micromark-extension-gfm-task-list-item: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^3.0.0": + version: 3.0.1 + resolution: "micromark-extension-mdx-expression@npm:3.0.1" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-mdx-expression: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/4d8cc5353b083b06bd51c98389de9c198261a5b2b440b75e85000a18d10511f21ba77538d6dfde0e0589df9de3fba9a1d14c2448d30c92d6b461c26d86e397f4 + languageName: node + linkType: hard + +"micromark-extension-mdx-jsx@npm:^3.0.0": + version: 3.0.2 + resolution: "micromark-extension-mdx-jsx@npm:3.0.2" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + micromark-factory-mdx-expression: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/5693b2e51934ac29a6aab521eaa2151f891d1fe092550bbd4ce24e4dd7567c1421a54f5e585a57dfa1769a79570f6df57ddd7a98bf0889dd11d495847a266dd7 + languageName: node + linkType: hard + +"micromark-extension-mdx-md@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-mdx-md@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bae91c61273de0e5ba80a980c03470e6cd9d7924aa936f46fbda15d780704d9386e945b99eda200e087b96254fbb4271a9545d5ce02676cd6ae67886a8bf82df + languageName: node + linkType: hard + +"micromark-extension-mdxjs-esm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/13e3f726495a960650cdedcba39198ace5bdc953ccb12c14d71fc9ed9bb88e40cc3ba9231e973f6984da3b3573e7ddb23ce409f7c16f52a8d57b608bf46c748d + languageName: node + linkType: hard + +"micromark-extension-mdxjs@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs@npm:3.0.0" + dependencies: + acorn: "npm:^8.0.0" + acorn-jsx: "npm:^5.0.0" + micromark-extension-mdx-expression: "npm:^3.0.0" + micromark-extension-mdx-jsx: "npm:^3.0.0" + micromark-extension-mdx-md: "npm:^2.0.0" + micromark-extension-mdxjs-esm: "npm:^3.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/fd84f036ddad0aabbc12e7f1b3e9dcfe31573bbc413c5ae903779ef0366d7a4c08193547e7ba75718c9f45654e45f52e575cfc2f23a5f89205a8a70d9a506aea + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 + languageName: node + linkType: hard + +"micromark-factory-mdx-expression@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-factory-mdx-expression@npm:2.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/a6004ef6272dd01a5d718f2affd7bfb5e08f0849340f5fd96ac823fbc5e9d3b3343acedda50805873ccda5e3b8af4d5fbb302abc874544044ac90c217345cf97 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 + languageName: node + linkType: hard + +"micromark-util-character@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" + dependencies: + micromark-util-chunked: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a + languageName: node + linkType: hard + +"micromark-util-events-to-acorn@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-util-events-to-acorn@npm:2.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + estree-util-visit: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/a4e0716e943ffdd16a918edf51d4f8291ec2692f5c4d04693dbef3358716fba891f288197afd102c14f4d98dac09d52351046ab7aad1d50b74677bdd5fa683c0 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 +"micromark-util-types@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-types@npm:2.0.2" + checksum: 10c0/c8c15b96c858db781c4393f55feec10004bf7df95487636c9a9f7209e51002a5cca6a047c5d2a5dc669ff92da20e57aaa881e81a268d9ccadb647f9dce305298 + languageName: node + linkType: hard + +"micromark@npm:^4.0.0": + version: 4.0.2 + resolution: "micromark@npm:4.0.2" + dependencies: + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6 languageName: node linkType: hard @@ -20893,7 +23731,7 @@ __metadata: languageName: node linkType: hard -"mrmime@npm:^2.0.0": +"mrmime@npm:^2.0.0, mrmime@npm:^2.0.1": version: 2.0.1 resolution: "mrmime@npm:2.0.1" checksum: 10c0/af05afd95af202fdd620422f976ad67dc18e6ee29beb03dd1ce950ea6ef664de378e44197246df4c7cdd73d47f2e7143a6e26e473084b9e4aa2095c0ad1e1761 @@ -20957,6 +23795,13 @@ __metadata: languageName: node linkType: hard +"muggle-string@npm:^0.4.1": + version: 0.4.1 + resolution: "muggle-string@npm:0.4.1" + checksum: 10c0/e914b63e24cd23f97e18376ec47e4ba3aa24365e4776212b666add2e47bb158003212980d732c49abf3719568900af7861873844a6e2d3a7ca7e86952c0e99e9 + languageName: node + linkType: hard + "multer@npm:^2.0.1": version: 2.2.0 resolution: "multer@npm:2.2.0" @@ -21002,6 +23847,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb + languageName: node + linkType: hard + "nanoid@npm:^3.3.17": version: 3.3.18 resolution: "nanoid@npm:3.3.18" @@ -21100,6 +23954,13 @@ __metadata: languageName: node linkType: hard +"neotraverse@npm:^1.0.1": + version: 1.0.1 + resolution: "neotraverse@npm:1.0.1" + checksum: 10c0/98e5d2d1974f91d527851a9dcfceb62701a1d31970b324b9f35fbdd244d173edc7a379ea1773f64771a9dc282486e3d3b693b24e14b1e969291612b2ff6b5054 + languageName: node + linkType: hard + "next-tick@npm:^1.1.0": version: 1.1.0 resolution: "next-tick@npm:1.1.0" @@ -21107,6 +23968,15 @@ __metadata: languageName: node linkType: hard +"nlcst-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "nlcst-to-string@npm:4.0.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + checksum: 10c0/a192c8b3365a7c076812004e72ae5b4a1734e582be2a6f3c062f3beecf18868a9fe2d1bad870bfead320fb39830f2c4f3752e5ae6574c4e59157126fd1ddba70 + languageName: node + linkType: hard + "no-case@npm:^2.2.0": version: 2.3.2 resolution: "no-case@npm:2.3.2" @@ -21174,6 +24044,13 @@ __metadata: languageName: node linkType: hard +"node-fetch-native@npm:^1.6.7": + version: 1.6.7 + resolution: "node-fetch-native@npm:1.6.7" + checksum: 10c0/8b748300fb053d21ca4d3db9c3ff52593d5e8f8a2d9fe90cbfad159676e324b954fdaefab46aeca007b5b9edab3d150021c4846444e4e8ab1f4e44cd3807be87 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.11, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" @@ -21249,6 +24126,13 @@ __metadata: languageName: node linkType: hard +"node-mock-http@npm:^1.0.4": + version: 1.0.4 + resolution: "node-mock-http@npm:1.0.4" + checksum: 10c0/86e3f7453cf07ad6b8bd17cf89ff91d45f486a861cf6d891618cf29647d559cbcde1d1f90c9cc02e014ff9f7900b2fb21c96b03ea4b4a415dbe2d65badadceba + languageName: node + linkType: hard + "node-object-hash@npm:^2.3.10": version: 2.3.10 resolution: "node-object-hash@npm:2.3.10" @@ -21566,6 +24450,24 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.5.1": + version: 1.5.1 + resolution: "ofetch@npm:1.5.1" + dependencies: + destr: "npm:^2.0.5" + node-fetch-native: "npm:^1.6.7" + ufo: "npm:^1.6.1" + checksum: 10c0/97ebc600512ea0ab401e97c73313218cc53c9b530b32ec8c995c347b0c68887129993168d1753f527761a64c6f93a5d823ce1378ccec95fc65a606f323a79a6c + languageName: node + linkType: hard + +"ohash@npm:^2.0.11": + version: 2.0.11 + resolution: "ohash@npm:2.0.11" + checksum: 10c0/d07c8d79cc26da082c1a7c8d5b56c399dd4ed3b2bd069fcae6bae78c99a9bcc3ad813b1e1f49ca2f335292846d689c6141a762cf078727d2302a33d414e69c79 + languageName: node + linkType: hard + "on-finished@npm:^2.3.0, on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -21618,6 +24520,24 @@ __metadata: languageName: node linkType: hard +"oniguruma-parser@npm:^0.12.2": + version: 0.12.2 + resolution: "oniguruma-parser@npm:0.12.2" + checksum: 10c0/fe5255d2cd5a6b845d5a0abe1725898ef40cea5522290dba6ccc08cc388891e9e8007af4baa5059942b786ad44b2b677ef25948039c9ba3f057bd35d2c52076a + languageName: node + linkType: hard + +"oniguruma-to-es@npm:^4.3.6": + version: 4.3.6 + resolution: "oniguruma-to-es@npm:4.3.6" + dependencies: + oniguruma-parser: "npm:^0.12.2" + regex: "npm:^6.1.0" + regex-recursion: "npm:^6.0.2" + checksum: 10c0/044e08b98e706987c2882ccf228de2a671de4aff33e3bd370da137ba599c0d520549625ad26ecc8898502445c991e19f106f584e94382262ba2af02c908ca3cf + languageName: node + linkType: hard + "only@npm:~0.0.2": version: 0.0.2 resolution: "only@npm:0.0.2" @@ -22003,6 +24923,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^7.3.0": + version: 7.3.1 + resolution: "p-limit@npm:7.3.1" + dependencies: + yocto-queue: "npm:^1.2.1" + checksum: 10c0/49b7d7fcc244d4659fa3b260c7b4e632bc72333c60e76e4cd24c7befdeb9b8e22da644e5064e83df9e2ded75245e3e3b9df0e9cf8500b08db8ebf58ac18c6764 + languageName: node + linkType: hard + "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -22053,6 +24982,16 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^9.1.0": + version: 9.3.3 + resolution: "p-queue@npm:9.3.3" + dependencies: + eventemitter3: "npm:^5.0.4" + p-timeout: "npm:^7.0.0" + checksum: 10c0/0d88a35cb3301bee2aac654c0a7018a2e40775fa597f3a06da66f33b0311d106bebbe9732c8e5968ae1e0e0b49f79c874333d2a7b0a57fad469189f236c066d7 + languageName: node + linkType: hard + "p-timeout@npm:^3.1.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" @@ -22062,6 +25001,13 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^7.0.0": + version: 7.0.1 + resolution: "p-timeout@npm:7.0.1" + checksum: 10c0/87d96529d1096d506607218dba6f9ec077c6dbedd0c2e2788c748e33bcd05faae8a81009fd9d22ec0b3c95fc83f4717306baba223f6e464737d8b99294c3e863 + languageName: node + linkType: hard + "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -22121,6 +25067,13 @@ __metadata: languageName: node linkType: hard +"package-manager-detector@npm:^1.6.0": + version: 1.8.0 + resolution: "package-manager-detector@npm:1.8.0" + checksum: 10c0/4c8e2c47fdc874465d3b3b11934401db9d73470ccbdabeb092e46cb94abbc491d5befc8c271b5ea1ae9c6a881f44c2997e011873365bde9fd6c3dc001221ff7a + languageName: node + linkType: hard + "param-case@npm:2.1.x, param-case@npm:^2.1.1": version: 2.1.1 resolution: "param-case@npm:2.1.1" @@ -22149,6 +25102,21 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.2 + resolution: "parse-entities@npm:4.0.2" + dependencies: + "@types/unist": "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + character-reference-invalid: "npm:^2.0.0" + decode-named-character-reference: "npm:^1.0.0" + is-alphanumerical: "npm:^2.0.0" + is-decimal: "npm:^2.0.0" + is-hexadecimal: "npm:^2.0.0" + checksum: 10c0/a13906b1151750b78ed83d386294066daf5fb559e08c5af9591b2d98cc209123103016a01df776f65f8219ad26652d6d6b210d0974d452049cddfc53a8916c34 + languageName: node + linkType: hard + "parse-filepath@npm:^1.0.2": version: 1.0.2 resolution: "parse-filepath@npm:1.0.2" @@ -22172,6 +25140,20 @@ __metadata: languageName: node linkType: hard +"parse-latin@npm:^7.0.0": + version: 7.0.0 + resolution: "parse-latin@npm:7.0.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + "@types/unist": "npm:^3.0.0" + nlcst-to-string: "npm:^4.0.0" + unist-util-modify-children: "npm:^4.0.0" + unist-util-visit-children: "npm:^3.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/4232a464f98c41c6680575c54bc2c9b21ac4b82a1f796a871bfef5efa6eddaab9bccf734b08cde6b0a5504ef46a0a14041ddd0bc5d9cc70f73a507f93f610596 + languageName: node + linkType: hard + "parse-literals@npm:^1.2.1": version: 1.2.1 resolution: "parse-literals@npm:1.2.1" @@ -22464,10 +25446,12 @@ __metadata: "@typescript-eslint/parser": "npm:^8.67.0" "@vitejs/plugin-react": "npm:^6.1.0" all-contributors-cli: "npm:^6.26.1" + astro-eslint-parser: "npm:^3.1.0" concurrently: "npm:^10.0.5" cssnano: "npm:^8.0.7" eslint: "npm:^10.9.0" eslint-config-prettier: "npm:^10.1.8" + eslint-plugin-astro: "npm:^3.1.0" eslint-plugin-jsx-a11y: "npm:^6.10.2" eslint-plugin-lit: "npm:^2.3.1" eslint-plugin-prettier: "npm:^5.5.6" @@ -22486,6 +25470,7 @@ __metadata: postcss-media-minmax: "npm:^5.0.0" postcss-preset-env: "npm:^11.4.0" prettier: "npm:^3.9.6" + prettier-plugin-astro: "npm:0.14.1" pretty-quick: "npm:^4.2.2" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" @@ -22497,6 +25482,7 @@ __metadata: stylelint-scss: "npm:^7.2.0" svglint: "npm:^4.2.1" typescript: "npm:^6.0.3" + typescript-eslint: "npm:^8.65.0" vite: "npm:^8.2.2" languageName: unknown linkType: soft @@ -22508,6 +25494,13 @@ __metadata: languageName: node linkType: hard +"piccolore@npm:^0.1.3": + version: 0.1.3 + resolution: "piccolore@npm:0.1.3" + checksum: 10c0/999666bb32eccc96a26b0cf3b8afe72f9d4cd4ca0eab5802b404cc84c601d81db4485b5feee5c50dbc8436ba6e1bc6a2310f99c18cee6687e430cc0eb4a36470 + languageName: node + linkType: hard + "picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -23721,7 +26714,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^7.1.5": +"postcss-selector-parser@npm:^7.1.0, postcss-selector-parser@npm:^7.1.5": version: 7.1.5 resolution: "postcss-selector-parser@npm:7.1.5" dependencies: @@ -23795,7 +26788,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.2.9, postcss@npm:^8.4.24, postcss@npm:^8.5.16, postcss@npm:^8.5.23": +"postcss@npm:^8.2.15, postcss@npm:^8.2.9, postcss@npm:^8.4.24": version: 8.5.25 resolution: "postcss@npm:8.5.25" dependencies: @@ -23806,7 +26799,40 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.26": +"postcss@npm:^8.5.15": + version: 8.5.16 + resolution: "postcss@npm:8.5.16" + dependencies: + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/625de7a02f662f3a340964d14b487bd5097adf16f5f171e257d19005ba37aea8768ee446557500e88e91ca46b4d14d6cb4a0bf033c6ec0c8c0b660d85719f1ef + languageName: node + linkType: hard + +"postcss@npm:^8.5.16": + version: 8.5.22 + resolution: "postcss@npm:8.5.22" + dependencies: + nanoid: "npm:^3.3.16" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/9e143ee457988049d5f187116fd37f2750ae9d8d71cc99eae690b776e549e134b34086cbaa2f0360ecd1729b15d918227bd0fc3a2ffbe341f7212d0827080793 + languageName: node + linkType: hard + +"postcss@npm:^8.5.17": + version: 8.5.19 + resolution: "postcss@npm:8.5.19" + dependencies: + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/302af9e4dfa8cce4f43af1798576b3a77ab7b23abac5522328c6c7a830d49b31281cba9d6071e478e6970a05ef82346d1570b8fbffae912f26a4f1a1a07f0a44 + languageName: node + linkType: hard + +"postcss@npm:^8.5.26, postcss@npm:^8.5.3": version: 8.5.26 resolution: "postcss@npm:8.5.26" dependencies: @@ -23862,6 +26888,17 @@ __metadata: languageName: node linkType: hard +"prettier-plugin-astro@npm:0.14.1": + version: 0.14.1 + resolution: "prettier-plugin-astro@npm:0.14.1" + dependencies: + "@astrojs/compiler": "npm:^2.9.1" + prettier: "npm:^3.0.0" + sass-formatter: "npm:^0.7.6" + checksum: 10c0/f812607d422ff36df1bf58534a96590a861dedf41e70f8f36fa9546b91def65b17f4507e1c9212dab56cbbae2f4ab5ff6e7e31370b9198261360c6444daa297c + languageName: node + linkType: hard + "prettier@npm:^2, prettier@npm:^2.7.1": version: 2.8.8 resolution: "prettier@npm:2.8.8" @@ -23871,7 +26908,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.3.3, prettier@npm:^3.9.6": +"prettier@npm:^3.0.0, prettier@npm:^3.3.3, prettier@npm:^3.8.1, prettier@npm:^3.9.6": version: 3.9.6 resolution: "prettier@npm:3.9.6" bin: @@ -23951,6 +26988,13 @@ __metadata: languageName: node linkType: hard +"prismjs@npm:^1.30.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 + languageName: node + linkType: hard + "probe-image-size@npm:^7.2.3": version: 7.2.3 resolution: "probe-image-size@npm:7.2.3" @@ -23969,6 +27013,13 @@ __metadata: languageName: node linkType: hard +"process-ancestry@npm:^0.1.0": + version: 0.1.0 + resolution: "process-ancestry@npm:0.1.0" + checksum: 10c0/3b20263db7c2eeb567efcef21bf4b3f3363c4bf7041796943fd8a467f888d94eb093a022b8fcc49c8d843f3fc81d15047255d4c2b4990f2d5a4f851f3c5c9cd4 + languageName: node + linkType: hard + "process-nextick-args@npm:^2.0.0, process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -24050,6 +27101,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^7.0.0": + version: 7.2.0 + resolution: "property-information@npm:7.2.0" + checksum: 10c0/03662c8f9e1544510914c5e594ae72963f67d261027a5fdc06c4134742584fe40dd49b959470d30e757e9fb70b297d8546ab1362a040364144029926ad4e07c4 + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -24210,6 +27268,13 @@ __metadata: languageName: node linkType: hard +"radix3@npm:^1.1.2": + version: 1.1.2 + resolution: "radix3@npm:1.1.2" + checksum: 10c0/d4a295547f71af079868d2c2ed3814a9296ee026c5488212d58c106e6b4797c6eaec1259b46c9728913622f2240c9a944bfc8e2b3b5f6e4a5045338b1609f1e4 + languageName: node + linkType: hard + "randomatic@npm:^3.0.0": version: 3.1.1 resolution: "randomatic@npm:3.1.1" @@ -24595,6 +27660,56 @@ __metadata: languageName: node linkType: hard +"recma-build-jsx@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-build-jsx@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-util-build-jsx: "npm:^3.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/ca30f5163887b44c74682355da2625f7b49f33267699d22247913e513e043650cbdd6a7497cf13c60f09ad9e7bc2bd35bd20853672773c19188569814b56bb04 + languageName: node + linkType: hard + +"recma-jsx@npm:^1.0.0": + version: 1.0.1 + resolution: "recma-jsx@npm:1.0.1" + dependencies: + acorn-jsx: "npm:^5.0.0" + estree-util-to-js: "npm:^2.0.0" + recma-parse: "npm:^1.0.0" + recma-stringify: "npm:^1.0.0" + unified: "npm:^11.0.0" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/9921b1270581ff133b94678868e665ba0fb6285ee60a6936106bac4899196c2ffb02dde894d9bc088fbf3deacb3e2426a3452e72066bf1203cbefebd7809d93f + languageName: node + linkType: hard + +"recma-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-parse@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + esast-util-from-js: "npm:^2.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/37c0990859a562d082e02d475ca5f4c8ef0840d285270f6699fe888cbb06260f97eb098585eda4aae416182c207fd19cf05e4f0b2dcf55cbf81dde4406d95545 + languageName: node + linkType: hard + +"recma-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-stringify@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-util-to-js: "npm:^2.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/c2ed4c0e8cf8a09aedcd47c5d016d47f6e1ff6c2d4b220e2abaf1b77713bf404756af2ea3ea7999aec5862e8825aff035edceb370c7fd8603a7e9da03bd6987e + languageName: node + linkType: hard + "recursive-readdir@npm:^2.2.2": version: 2.2.3 resolution: "recursive-readdir@npm:2.2.3" @@ -24685,6 +27800,31 @@ __metadata: languageName: node linkType: hard +"regex-recursion@npm:^6.0.2": + version: 6.0.2 + resolution: "regex-recursion@npm:6.0.2" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10c0/68e8b6889680e904b75d7f26edaf70a1a4dc1087406bff53face4c2929d918fd77c72223843fe816ac8ed9964f96b4160650e8d5909e26a998c6e9de324dadb1 + languageName: node + linkType: hard + +"regex-utilities@npm:^2.3.0": + version: 2.3.0 + resolution: "regex-utilities@npm:2.3.0" + checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893 + languageName: node + linkType: hard + +"regex@npm:^6.1.0": + version: 6.1.0 + resolution: "regex@npm:6.1.0" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10c0/6e0ee2a1c17d5a66dc1120dfc51899dedf6677857e83a0df4d5a822ebb8645a54a079772efc1ade382b67aad35e4e22b5bd2d33c05ed28b0e000f8f57eb0aec1 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -24774,6 +27914,39 @@ __metadata: languageName: node linkType: hard +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-raw: "npm:^9.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 + languageName: node + linkType: hard + +"rehype-recma@npm:^1.0.0": + version: 1.0.0 + resolution: "rehype-recma@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + hast-util-to-estree: "npm:^3.0.0" + checksum: 10c0/be60d7433a7f788a14f41da3e93ba9d9272c908ddef47757026cc4bbcc912f6301d56810349adf876d294a8d048626a0dbf6988aaa574afbfc29eac1ddc1eb74 + languageName: node + linkType: hard + +"rehype-stringify@npm:^10.0.1": + version: 10.0.1 + resolution: "rehype-stringify@npm:10.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-to-html: "npm:^9.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/c643ae3a4862465033e0f1e9f664433767279b4ee9296570746970a79940417ec1fb1997a513659aab97063cf971c5d97e0af8129f590719f01628c8aa480765 + languageName: node + linkType: hard + "relateurl@npm:0.2.x, relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -24801,6 +27974,78 @@ __metadata: languageName: node linkType: hard +"remark-gfm@npm:^4.0.1": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-gfm: "npm:^3.0.0" + micromark-extension-gfm: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-stringify: "npm:^11.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7 + languageName: node + linkType: hard + +"remark-mdx@npm:^3.0.0": + version: 3.1.1 + resolution: "remark-mdx@npm:3.1.1" + dependencies: + mdast-util-mdx: "npm:^3.0.0" + micromark-extension-mdxjs: "npm:^3.0.0" + checksum: 10c0/3e5585d4c2448d8ac7548b1d148f04b89251ff47fbfc80be1428cecec2fc2530abe30a5da53bb031283f8a78933259df6120c1cd4cc7cc1d43978d508798ba88 + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 + languageName: node + linkType: hard + +"remark-rehype@npm:^11.0.0, remark-rehype@npm:^11.1.2": + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + mdast-util-to-hast: "npm:^13.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb + languageName: node + linkType: hard + +"remark-smartypants@npm:^3.0.2": + version: 3.0.3 + resolution: "remark-smartypants@npm:3.0.3" + dependencies: + retext: "npm:^9.0.0" + retext-smartypants: "npm:^6.0.0" + unified: "npm:^11.0.4" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/24f210e64d44b13559aa6c7423b29a0a3b7fb1b603c3b997c70ad923e1bf1cebff9f234db801c689c02ff5bebdfd5256481c6690928a2465c09cd54a03076514 + languageName: node + linkType: hard + +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f + languageName: node + linkType: hard + "remarkable@npm:^1.7.1": version: 1.7.4 resolution: "remarkable@npm:1.7.4" @@ -24895,6 +28140,20 @@ __metadata: languageName: node linkType: hard +"request-light@npm:^0.5.7": + version: 0.5.8 + resolution: "request-light@npm:0.5.8" + checksum: 10c0/65d47f79cbe13c46c10eecb9264ad06ea5f76ea64855766448937c0fe888a70b9c854bf9dc4c2dc1949ea5400030b55bea7d4ba0807fae0202004cee796ea819 + languageName: node + linkType: hard + +"request-light@npm:^0.7.0": + version: 0.7.0 + resolution: "request-light@npm:0.7.0" + checksum: 10c0/1c98f0d74b8a28a6fecb96d4b30c255a27b402f5e10b2696b67ede7257389a7533fba9e8ea122ccec9a7c6f06db36eab5d0b563bd5ff27b15aaa9d3910e31894 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -24982,6 +28241,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve-url-loader@npm:^3.1.5": version: 3.1.5 resolution: "resolve-url-loader@npm:3.1.5" @@ -25112,6 +28378,51 @@ __metadata: languageName: node linkType: hard +"retext-latin@npm:^4.0.0": + version: 4.0.0 + resolution: "retext-latin@npm:4.0.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + parse-latin: "npm:^7.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/51530be66db9ef6ab8e9cda5dd0598377ff4321481d6a941bf70dac16fa6e9123ff7d8ff093a05c30a3e00e282e37094b845b6130a8005a3cb7186a961ab99cb + languageName: node + linkType: hard + +"retext-smartypants@npm:^6.0.0, retext-smartypants@npm:^6.2.0": + version: 6.2.0 + resolution: "retext-smartypants@npm:6.2.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + nlcst-to-string: "npm:^4.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/36f925353dd7f31df642bca2493524a8daee15f9b0e0dfe7fb8982462d23ccb12a99864989db22f0bacb6d7fea1f696ba96e031d3fbac4f013e1c95ef3fed881 + languageName: node + linkType: hard + +"retext-stringify@npm:^4.0.0": + version: 4.0.0 + resolution: "retext-stringify@npm:4.0.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + nlcst-to-string: "npm:^4.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/eb2930356c85999a8978092a5d6ba3695fea859c71f221dcdc485704552922641bc17e50fea2ae0599d665192eaad002e98bb4236ecac94a570b73581b99004d + languageName: node + linkType: hard + +"retext@npm:^9.0.0": + version: 9.0.0 + resolution: "retext@npm:9.0.0" + dependencies: + "@types/nlcst": "npm:^2.0.0" + retext-latin: "npm:^4.0.0" + retext-stringify: "npm:^4.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/eee9f66ff6fae5670a5eeccc0b5e2639112f868475273ce307d3079cfe7deb9d1b0f2b8fa28b4ab30abaf8538345185a44908f461a27bbf43c4f94feda90ecac + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -25172,31 +28483,89 @@ __metadata: glob: "npm:^13.0.3" package-json-from-dist: "npm:^1.0.1" bin: - rimraf: dist/esm/bin.mjs - checksum: 10c0/4a56537850102e20ba5d5eb49f366b4b7b2435389734b4b8480cf0e0eb0f6f5d0c44120a171aeb0d8f9ab40312a10d2262f3f50acbad803e32caef61b6cf86fc + rimraf: dist/esm/bin.mjs + checksum: 10c0/4a56537850102e20ba5d5eb49f366b4b7b2435389734b4b8480cf0e0eb0f6f5d0c44120a171aeb0d8f9ab40312a10d2262f3f50acbad803e32caef61b6cf86fc + languageName: node + linkType: hard + +"rolldown@npm:~1.1.2": + version: 1.1.3 + resolution: "rolldown@npm:1.1.3" + dependencies: + "@oxc-project/types": "npm:=0.137.0" + "@rolldown/binding-android-arm64": "npm:1.1.3" + "@rolldown/binding-darwin-arm64": "npm:1.1.3" + "@rolldown/binding-darwin-x64": "npm:1.1.3" + "@rolldown/binding-freebsd-x64": "npm:1.1.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.1.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.1.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.1.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.1.3" + "@rolldown/binding-linux-x64-musl": "npm:1.1.3" + "@rolldown/binding-openharmony-arm64": "npm:1.1.3" + "@rolldown/binding-wasm32-wasi": "npm:1.1.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.1.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.1.3" + "@rolldown/pluginutils": "npm:^1.0.0" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-ppc64-gnu": + optional: true + "@rolldown/binding-linux-s390x-gnu": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: ./bin/cli.mjs + checksum: 10c0/6dae11bee45c56d000d5d2608ac78b2c7125b7f10337e0b0bbdee7290c352104f1f76072f8c0e6ccad331f51f1a131fc37faa179d9c4a10cc16abc87f85f6e86 languageName: node linkType: hard -"rolldown@npm:~1.2.0": - version: 1.2.1 - resolution: "rolldown@npm:1.2.1" - dependencies: - "@oxc-project/types": "npm:=0.142.0" - "@rolldown/binding-android-arm64": "npm:1.2.1" - "@rolldown/binding-darwin-arm64": "npm:1.2.1" - "@rolldown/binding-darwin-x64": "npm:1.2.1" - "@rolldown/binding-freebsd-x64": "npm:1.2.1" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.2.1" - "@rolldown/binding-linux-arm64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-arm64-musl": "npm:1.2.1" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-s390x-gnu": "npm:1.2.1" - "@rolldown/binding-linux-x64-gnu": "npm:1.2.1" - "@rolldown/binding-linux-x64-musl": "npm:1.2.1" - "@rolldown/binding-openharmony-arm64": "npm:1.2.1" - "@rolldown/binding-wasm32-wasi": "npm:1.2.1" - "@rolldown/binding-win32-arm64-msvc": "npm:1.2.1" - "@rolldown/binding-win32-x64-msvc": "npm:1.2.1" +"rolldown@npm:~1.1.5": + version: 1.1.5 + resolution: "rolldown@npm:1.1.5" + dependencies: + "@oxc-project/types": "npm:=0.139.0" + "@rolldown/binding-android-arm64": "npm:1.1.5" + "@rolldown/binding-darwin-arm64": "npm:1.1.5" + "@rolldown/binding-darwin-x64": "npm:1.1.5" + "@rolldown/binding-freebsd-x64": "npm:1.1.5" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.1.5" + "@rolldown/binding-linux-arm64-gnu": "npm:1.1.5" + "@rolldown/binding-linux-arm64-musl": "npm:1.1.5" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.1.5" + "@rolldown/binding-linux-s390x-gnu": "npm:1.1.5" + "@rolldown/binding-linux-x64-gnu": "npm:1.1.5" + "@rolldown/binding-linux-x64-musl": "npm:1.1.5" + "@rolldown/binding-openharmony-arm64": "npm:1.1.5" + "@rolldown/binding-wasm32-wasi": "npm:1.1.5" + "@rolldown/binding-win32-arm64-msvc": "npm:1.1.5" + "@rolldown/binding-win32-x64-msvc": "npm:1.1.5" "@rolldown/pluginutils": "npm:^1.0.0" dependenciesMeta: "@rolldown/binding-android-arm64": @@ -25231,7 +28600,7 @@ __metadata: optional: true bin: rolldown: ./bin/cli.mjs - checksum: 10c0/d22c80c70d71a36abde7dca7217f66d94cdb5d0c03185205de808d368ab1b8fd5e78ff4db10efc69c5f68a5f9d03d59c8ace848f1f85c4aab79330162a10b3e7 + checksum: 10c0/93072aa9d95882f9fa5cd57fe7db6a48efd6f85a25a32137425052ecca02df653651eed0c33a865c33511681bd6a40691d5c88900b8e95ce1334f4f75ba826ff languageName: node linkType: hard @@ -25370,6 +28739,13 @@ __metadata: languageName: node linkType: hard +"s.color@npm:0.0.15": + version: 0.0.15 + resolution: "s.color@npm:0.0.15" + checksum: 10c0/50532b1307a65ac5e1076f5b556f5ce7e5c8ea3ff1c73810a226a0109efe84ff196e10017cd906c78a87d9600a26ca7016ac78896232aa05949a98bf2100adf1 + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -25455,6 +28831,15 @@ __metadata: languageName: node linkType: hard +"sass-formatter@npm:^0.7.6": + version: 0.7.9 + resolution: "sass-formatter@npm:0.7.9" + dependencies: + suf-log: "npm:^2.5.3" + checksum: 10c0/172eb326121ace1a48e689a1419efab2d780623631d106ac306ac2a055e96813bda36044f20bc4cc28d761427efc136a08d07153d1b8a8ccf0a032dca5fdce3c + languageName: node + linkType: hard + "sass-loader@npm:^10.4.1": version: 10.5.2 resolution: "sass-loader@npm:10.5.2" @@ -25480,6 +28865,23 @@ __metadata: languageName: node linkType: hard +"sass@npm:^1.101.0": + version: 1.101.0 + resolution: "sass@npm:1.101.0" + dependencies: + "@parcel/watcher": "npm:^2.4.1" + chokidar: "npm:^5.0.0" + immutable: "npm:^5.1.5" + source-map-js: "npm:>=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true + bin: + sass: sass.js + checksum: 10c0/1fbbcef2f767dec4d97773a2a084f4e1ef2e4abecf574e08743e52237069f1129a6b43b07b5c23aa3bcbf395509e40db758d9748a07940da227aa1626329a74d + languageName: node + linkType: hard + "sass@npm:^1.103.1": version: 1.103.1 resolution: "sass@npm:1.103.1" @@ -25557,6 +28959,46 @@ __metadata: languageName: node linkType: hard +"satteri@npm:^0.9.1": + version: 0.9.5 + resolution: "satteri@npm:0.9.5" + dependencies: + "@bruits/satteri-darwin-arm64": "npm:0.9.5" + "@bruits/satteri-darwin-x64": "npm:0.9.5" + "@bruits/satteri-linux-arm64-gnu": "npm:0.9.5" + "@bruits/satteri-linux-arm64-musl": "npm:0.9.5" + "@bruits/satteri-linux-x64-gnu": "npm:0.9.5" + "@bruits/satteri-linux-x64-musl": "npm:0.9.5" + "@bruits/satteri-wasm32-wasi": "npm:0.9.5" + "@bruits/satteri-win32-arm64-msvc": "npm:0.9.5" + "@bruits/satteri-win32-x64-msvc": "npm:0.9.5" + "@types/estree-jsx": "npm:^1.0.5" + "@types/hast": "npm:^3.0.4" + "@types/mdast": "npm:^4.0.4" + "@types/unist": "npm:^3.0.3" + dependenciesMeta: + "@bruits/satteri-darwin-arm64": + optional: true + "@bruits/satteri-darwin-x64": + optional: true + "@bruits/satteri-linux-arm64-gnu": + optional: true + "@bruits/satteri-linux-arm64-musl": + optional: true + "@bruits/satteri-linux-x64-gnu": + optional: true + "@bruits/satteri-linux-x64-musl": + optional: true + "@bruits/satteri-wasm32-wasi": + optional: true + "@bruits/satteri-win32-arm64-msvc": + optional: true + "@bruits/satteri-win32-x64-msvc": + optional: true + checksum: 10c0/4a204a57b7b84750cb0fc9a1ab153c0c99dd3c57cac20b785705f6b723c1a465263951ad624eb47808a9501418eb81fa526bbc71f57f8fd07472fdf114e73a9c + languageName: node + linkType: hard + "sax@npm:^1.2.4, sax@npm:^1.5.0": version: 1.5.0 resolution: "sax@npm:1.5.0" @@ -25668,7 +29110,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3, semver@npm:^7.8.5": +"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.7.2, semver@npm:^7.7.3, semver@npm:^7.7.4, semver@npm:^7.8.4, semver@npm:^7.8.5": version: 7.8.5 resolution: "semver@npm:7.8.5" bin: @@ -25835,6 +29277,96 @@ __metadata: languageName: node linkType: hard +"sharp@npm:^0.34.0 || ^0.35.0": + version: 0.35.3 + resolution: "sharp@npm:0.35.3" + dependencies: + "@img/colour": "npm:^1.1.0" + "@img/sharp-darwin-arm64": "npm:0.35.3" + "@img/sharp-darwin-x64": "npm:0.35.3" + "@img/sharp-freebsd-wasm32": "npm:0.35.3" + "@img/sharp-libvips-darwin-arm64": "npm:1.3.2" + "@img/sharp-libvips-darwin-x64": "npm:1.3.2" + "@img/sharp-libvips-linux-arm": "npm:1.3.2" + "@img/sharp-libvips-linux-arm64": "npm:1.3.2" + "@img/sharp-libvips-linux-ppc64": "npm:1.3.2" + "@img/sharp-libvips-linux-riscv64": "npm:1.3.2" + "@img/sharp-libvips-linux-s390x": "npm:1.3.2" + "@img/sharp-libvips-linux-x64": "npm:1.3.2" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.3.2" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.3.2" + "@img/sharp-linux-arm": "npm:0.35.3" + "@img/sharp-linux-arm64": "npm:0.35.3" + "@img/sharp-linux-ppc64": "npm:0.35.3" + "@img/sharp-linux-riscv64": "npm:0.35.3" + "@img/sharp-linux-s390x": "npm:0.35.3" + "@img/sharp-linux-x64": "npm:0.35.3" + "@img/sharp-linuxmusl-arm64": "npm:0.35.3" + "@img/sharp-linuxmusl-x64": "npm:0.35.3" + "@img/sharp-webcontainers-wasm32": "npm:0.35.3" + "@img/sharp-win32-arm64": "npm:0.35.3" + "@img/sharp-win32-ia32": "npm:0.35.3" + "@img/sharp-win32-x64": "npm:0.35.3" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.8.5" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-freebsd-wasm32": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-webcontainers-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/d99d60fc716aacbf42fcb0eb6d129142e0912eb23310adf48bc94e6989e27c838c5b5f507b928c723c72d265f9ceea3d4b1207e8fd5929797b23005663ce1d07 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -25858,6 +29390,22 @@ __metadata: languageName: node linkType: hard +"shiki@npm:^4.0.2": + version: 4.3.1 + resolution: "shiki@npm:4.3.1" + dependencies: + "@shikijs/core": "npm:4.3.1" + "@shikijs/engine-javascript": "npm:4.3.1" + "@shikijs/engine-oniguruma": "npm:4.3.1" + "@shikijs/langs": "npm:4.3.1" + "@shikijs/themes": "npm:4.3.1" + "@shikijs/types": "npm:4.3.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/b25fbd2fd65a69a680c9be4b38712e3864402dfa08d0343ce1f10de73cb930295d8dd768f7d6857b877f8240f42f1c6771d9c20301007b1eb4dcdb5fb082f6b7 + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.1": version: 1.0.1 resolution: "side-channel-list@npm:1.0.1" @@ -26041,6 +29589,13 @@ __metadata: languageName: node linkType: hard +"smol-toml@npm:^1.6.0": + version: 1.7.1 + resolution: "smol-toml@npm:1.7.1" + checksum: 10c0/c2494e19e748578cf9f81f918dd66a548dfe5a0e581ab9f980d5420f2319c882c661a62d01d216a43f2db490faaccd2185bcdb6f2ba0658eb303eda9db871d76 + languageName: node + linkType: hard + "snake-case@npm:^3.0.4": version: 3.0.4 resolution: "snake-case@npm:3.0.4" @@ -26074,12 +29629,12 @@ __metadata: linkType: hard "socket.io-parser@npm:~4.2.4": - version: 4.2.7 - resolution: "socket.io-parser@npm:4.2.7" + version: 4.2.6 + resolution: "socket.io-parser@npm:4.2.6" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" debug: "npm:~4.4.1" - checksum: 10c0/16a5579718b871114ca644d688987dd3cf9292010c949fb083633eefbc1d8fdaf424691d6511d746e5c10f5c88cbd8911cd0b1e807242159f40989be90842b4e + checksum: 10c0/ba0a0b541b0a8e9d02b45c04c4c93a02331be5ea3478073c65bb9ff87032f12469c9adb309728eb90c0a352618d645ab88999c167a11c783cac861d7fd35c9d1 languageName: node linkType: hard @@ -26187,7 +29742,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.3": +"source-map@npm:^0.7.0, source-map@npm:^0.7.3, source-map@npm:^0.7.6": version: 0.7.6 resolution: "source-map@npm:0.7.6" checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c @@ -26201,6 +29756,13 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 + languageName: node + linkType: hard + "spawn-wrap@npm:^2.0.0": version: 2.0.0 resolution: "spawn-wrap@npm:2.0.0" @@ -26619,6 +30181,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448 + languageName: node + linkType: hard + "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -26813,6 +30385,24 @@ __metadata: languageName: node linkType: hard +"style-to-js@npm:^1.0.0": + version: 1.1.21 + resolution: "style-to-js@npm:1.1.21" + dependencies: + style-to-object: "npm:1.0.14" + checksum: 10c0/94231aa80f58f442c3a5ae01a21d10701e5d62f96b4b3e52eab3499077ee52df203cc0df4a1a870707f5e99470859136ea8657b782a5f4ca7934e0ffe662a588 + languageName: node + linkType: hard + +"style-to-object@npm:1.0.14": + version: 1.0.14 + resolution: "style-to-object@npm:1.0.14" + dependencies: + inline-style-parser: "npm:0.2.7" + checksum: 10c0/854d9e9b77afc336e6d7b09348e7939f2617b34eb0895824b066d8cd1790284cb6d8b2ba36be88025b2595d715dba14b299ae76e4628a366541106f639e13679 + languageName: node + linkType: hard + "style-to-object@npm:^0.4.1": version: 0.4.4 resolution: "style-to-object@npm:0.4.4" @@ -26972,6 +30562,15 @@ __metadata: languageName: node linkType: hard +"suf-log@npm:^2.5.3": + version: 2.5.3 + resolution: "suf-log@npm:2.5.3" + dependencies: + s.color: "npm:0.0.15" + checksum: 10c0/67edce59cce30964b2bec4f2e726c980c1e83d266adb186e3a92f8d267916cd2ae38f8e5aa14af9df675837708d93b212a7e3241505abec948d7fd3705781f0a + languageName: node + linkType: hard + "supports-color@npm:10.2.2, supports-color@npm:^10.2.2": version: 10.2.2 resolution: "supports-color@npm:10.2.2" @@ -27075,6 +30674,23 @@ __metadata: languageName: node linkType: hard +"svgo@npm:^4.0.1": + version: 4.0.1 + resolution: "svgo@npm:4.0.1" + dependencies: + commander: "npm:^11.1.0" + css-select: "npm:^5.1.0" + css-tree: "npm:^3.0.1" + css-what: "npm:^6.1.0" + csso: "npm:^5.0.5" + picocolors: "npm:^1.1.1" + sax: "npm:^1.5.0" + bin: + svgo: ./bin/svgo.js + checksum: 10c0/f61f9957b42e0c97593b49a01f3b93cb239b2e818efccb056fcc866d622704d9021c4ef8bd0287264c3e4f33da60e4af14d841b4a624b87ff8888e3b896d13d5 + languageName: node + linkType: hard + "svgo@npm:^4.0.2": version: 4.0.2 resolution: "svgo@npm:4.0.2" @@ -27205,15 +30821,15 @@ __metadata: linkType: hard "tar@npm:^7.5.4": - version: 7.5.22 - resolution: "tar@npm:7.5.22" + version: 7.5.20 + resolution: "tar@npm:7.5.20" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/1311f6be85a8157ac4c9147bae43e13923d2a1aae15e4aa1bd5239e4e03d2cf53cfe103dde7f35832fbb4c938b042856bc8e9a0afd29abd05e2d1608788c4fea + checksum: 10c0/4df4335c6d958b76adf1eaced55889dec3ca1c51f450658a074af80694bb0d9c154a8e93fdf4da617372d1575b121295379993961bbe4cd4b0867c0e5689846a languageName: node linkType: hard @@ -27343,6 +30959,13 @@ __metadata: languageName: node linkType: hard +"tiny-inflate@npm:^1.0.3": + version: 1.0.3 + resolution: "tiny-inflate@npm:1.0.3" + checksum: 10c0/fab687537254f6ec44c9a2e880048fe70da3542aba28f73cda3e74c95cabf342a339372f2a6c032e322324f01accc03ca26c04ba2bad9b3eb8cf3ee99bba7f9b + languageName: node + linkType: hard + "tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" @@ -27357,6 +30980,13 @@ __metadata: languageName: node linkType: hard +"tinyclip@npm:^0.1.12": + version: 0.1.15 + resolution: "tinyclip@npm:0.1.15" + checksum: 10c0/8ebdcc60e0e9ba54edeae28158a7a96e94657ac9387cc03cd5ef6c51c36b92be2ebe10cf5e34c9382124ef766cf82784cca2c5db57cd7ab447b7d04880ee7579 + languageName: node + linkType: hard + "tinycolor2@npm:^1.6.0": version: 1.6.0 resolution: "tinycolor2@npm:1.6.0" @@ -27371,14 +31001,14 @@ __metadata: languageName: node linkType: hard -"tinyexec@npm:^1.0.0, tinyexec@npm:^1.0.2, tinyexec@npm:^1.2.4": +"tinyexec@npm:^1.0.0, tinyexec@npm:^1.0.2, tinyexec@npm:^1.0.4, tinyexec@npm:^1.2.4": version: 1.2.4 resolution: "tinyexec@npm:1.2.4" checksum: 10c0/153b8db6b080194b558ff145b9cffc36b80a6e07babd644dcfbe49c807eee668c876049d28bdee90b96304476f883352f2dad91b3f86bc23832532f4363e66ff languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16, tinyglobby@npm:^0.2.17": version: 0.2.17 resolution: "tinyglobby@npm:0.2.17" dependencies: @@ -27541,6 +31171,13 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: 10c0/3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94 + languageName: node + linkType: hard + "trim-repeated@npm:^1.0.0": version: 1.0.0 resolution: "trim-repeated@npm:1.0.0" @@ -27550,6 +31187,13 @@ __metadata: languageName: node linkType: hard +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0 + languageName: node + linkType: hard + "true-case-path@npm:^2.2.1": version: 2.2.1 resolution: "true-case-path@npm:2.2.1" @@ -27897,6 +31541,37 @@ __metadata: languageName: node linkType: hard +"typesafe-path@npm:^0.2.2": + version: 0.2.2 + resolution: "typesafe-path@npm:0.2.2" + checksum: 10c0/05027ea6a52a1e879da39c53fae7f5059e50cf578d586cc6c7741c3eca0b37ee2da4ef16d35ecf9f60cd0e8ca5aca98ea47902672907a19470f2260e8769b933 + languageName: node + linkType: hard + +"typescript-auto-import-cache@npm:^0.3.5": + version: 0.3.6 + resolution: "typescript-auto-import-cache@npm:0.3.6" + dependencies: + semver: "npm:^7.3.8" + checksum: 10c0/aad48d6aa9985f9a056c5c89ab91b6781c5430c0b80652586c2a997f2cc394f3ed70ec18c0c818a8423991a1cfe7e64d010cc2fded9ea192067a3188476c2b51 + languageName: node + linkType: hard + +"typescript-eslint@npm:^8.65.0": + version: 8.67.0 + resolution: "typescript-eslint@npm:8.67.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.67.0" + "@typescript-eslint/parser": "npm:8.67.0" + "@typescript-eslint/typescript-estree": "npm:8.67.0" + "@typescript-eslint/utils": "npm:8.67.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/6ec860f6763be8a5fabf143ff8b6d4e43b98be0c781afc4725eda578ba0e0cecfcc1f06bd1b56fcccc41fa3fc15e4661ec32120d28f2e7abe4953e91ee346de1 + languageName: node + linkType: hard + "typescript@npm:^2.9.2 || ^3.0.0 || ^4.0.0": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -27993,6 +31668,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.6.1, ufo@npm:^1.6.3": + version: 1.6.4 + resolution: "ufo@npm:1.6.4" + checksum: 10c0/3a2b29e7e3d772fbf6893d7d23bf442981457adb2fe122828abdbda89bedcb81aafd0dcc080e41b45f9a877db00cb42cbfee9639753a19d9b9bd39b5627039cf + languageName: node + linkType: hard + "uglify-js@npm:3.4.x": version: 3.4.10 resolution: "uglify-js@npm:3.4.10" @@ -28014,6 +31696,13 @@ __metadata: languageName: node linkType: hard +"ultrahtml@npm:^1.6.0": + version: 1.7.0 + resolution: "ultrahtml@npm:1.7.0" + checksum: 10c0/a56907b3ea4b0c16d30c37cb814138f8ae47044892a9d1c5ecca0731e24c2c4cd1c9cfa53d57bf508b21bc3b993e3c02bf3f9c3bfc156d18ed7e12c62a140f75 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -28033,6 +31722,13 @@ __metadata: languageName: node linkType: hard +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 10c0/74a29afefd76d5b77bedc983559ceb33f5bbc8dada84ff33755d1e3355da55a4e03a10e7ce717918c436b4dfafde1782e799ebaf2aadd775612b49f7b5b2998e + languageName: node + linkType: hard + "undici-types@npm:~8.3.0": version: 8.3.0 resolution: "undici-types@npm:8.3.0" @@ -28041,9 +31737,9 @@ __metadata: linkType: hard "undici@npm:^7.19.0": - version: 7.29.0 - resolution: "undici@npm:7.29.0" - checksum: 10c0/85ea96e91e7f3de24de678cbbc54230fdd641a3b0643005f2aef044af1f1a2db8fbecb88b28e6fa78bb41ffeafda4479b57075b6b6ab92beac4b7b5ab53f9b10 + version: 7.28.0 + resolution: "undici@npm:7.28.0" + checksum: 10c0/fe781983a26098795e99bb1f64906cbb7d0bcaa029a26baade007b53ea67f2631d189b8f9671a31f4c8d0cb3773b7559608628ba54452fef51fec90e7c78bb0d languageName: node linkType: hard @@ -28085,6 +31781,32 @@ __metadata: languageName: node linkType: hard +"unified@npm:^11.0.0, unified@npm:^11.0.4, unified@npm:^11.0.5": + version: 11.0.5 + resolution: "unified@npm:11.0.5" + dependencies: + "@types/unist": "npm:^3.0.0" + bail: "npm:^2.0.0" + devlop: "npm:^1.0.0" + extend: "npm:^3.0.0" + is-plain-obj: "npm:^4.0.0" + trough: "npm:^2.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9 + languageName: node + linkType: hard + +"unifont@npm:~0.7.4": + version: 0.7.4 + resolution: "unifont@npm:0.7.4" + dependencies: + css-tree: "npm:^3.1.0" + ofetch: "npm:^1.5.1" + ohash: "npm:^2.0.11" + checksum: 10c0/2b1c23e13083ce52382ac3e430b24c7f7a9a8657480f82847e254d5e3aa8a639c1178fda9ad157c21d2ceff5f7a037021c547501856dca7a93bc75bef6fe2f7d + languageName: node + linkType: hard + "unique-filename@npm:^5.0.0": version: 5.0.0 resolution: "unique-filename@npm:5.0.0" @@ -28098,27 +31820,123 @@ __metadata: version: 6.0.0 resolution: "unique-slug@npm:6.0.0" dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/da7ade4cb04eb33ad0499861f82fe95ce9c7c878b7139dc54d140ecfb6a6541c18a5c8dac16188b8b379fe62c0c1f1b710814baac910cde5f4fec06212126c6a + imurmurhash: "npm:^0.1.4" + checksum: 10c0/da7ade4cb04eb33ad0499861f82fe95ce9c7c878b7139dc54d140ecfb6a6541c18a5c8dac16188b8b379fe62c0c1f1b710814baac910cde5f4fec06212126c6a + languageName: node + linkType: hard + +"unique-stream@npm:^2.0.2": + version: 2.4.0 + resolution: "unique-stream@npm:2.4.0" + dependencies: + json-stable-stringify-without-jsonify: "npm:^1.0.1" + through2-filter: "npm:3.0.0" + checksum: 10c0/ac52c2e373d92f0c70bd7de58b666e7365558dba318e8b3bcb044c39389a08f5f9c949b0698a249110e9b133f2a93c1c52b761daee74516ed9a4ca1aa8281bb7 + languageName: node + linkType: hard + +"unique-string@npm:^2.0.0": + version: 2.0.0 + resolution: "unique-string@npm:2.0.0" + dependencies: + crypto-random-string: "npm:^2.0.0" + checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + languageName: node + linkType: hard + +"unist-util-find-after@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-find-after@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb + languageName: node + linkType: hard + +"unist-util-is@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-is@npm:6.0.1" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/5a487d390193811d37a68264e204dbc7c15c40b8fc29b5515a535d921d071134f571d7b5cbd59bcd58d5ce1c0ab08f20fc4a1f0df2287a249c979267fc32ce06 + languageName: node + linkType: hard + +"unist-util-modify-children@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-modify-children@npm:4.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + array-iterate: "npm:^2.0.0" + checksum: 10c0/63d44b09a2e4c674c72816d4328d668972e68cc965ea719fef1c642b66a3ebe3b102e284a3213b4920ebccff05e0f689b4eaae8a0e5c3dafcad117d1577496da + languageName: node + linkType: hard + +"unist-util-position-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "unist-util-position-from-estree@npm:2.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/39127bf5f0594e0a76d9241dec4f7aa26323517120ce1edd5ed91c8c1b9df7d6fb18af556e4b6250f1c7368825720ed892e2b6923be5cdc08a9bb16536dc37b3 + languageName: node + linkType: hard + +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400 + languageName: node + linkType: hard + +"unist-util-remove-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-remove-position@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e + languageName: node + linkType: hard + +"unist-util-visit-children@npm:^3.0.0": + version: 3.0.0 + resolution: "unist-util-visit-children@npm:3.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/51e95f54fbf11d414952c011c761c3960864948ad3fd2abe3989eb18b18d96b8f48e7ea5ab6f23264d1a3f4f5a1ff76312dd8f2196c78b762098403505c3abb9 languageName: node linkType: hard -"unique-stream@npm:^2.0.2": - version: 2.4.0 - resolution: "unique-stream@npm:2.4.0" +"unist-util-visit-parents@npm:^6.0.0, unist-util-visit-parents@npm:^6.0.2": + version: 6.0.2 + resolution: "unist-util-visit-parents@npm:6.0.2" dependencies: - json-stable-stringify-without-jsonify: "npm:^1.0.1" - through2-filter: "npm:3.0.0" - checksum: 10c0/ac52c2e373d92f0c70bd7de58b666e7365558dba318e8b3bcb044c39389a08f5f9c949b0698a249110e9b133f2a93c1c52b761daee74516ed9a4ca1aa8281bb7 + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/f1e4019dbd930301825895e3737b1ee0cd682f7622ddd915062135cbb39f8c090aaece3a3b5eae1f2ea52ec33f0931abb8f8a8b5c48a511a4203e3d360a8cd49 languageName: node linkType: hard -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" +"unist-util-visit@npm:^5.0.0, unist-util-visit@npm:^5.1.0": + version: 5.1.0 + resolution: "unist-util-visit@npm:5.1.0" dependencies: - crypto-random-string: "npm:^2.0.0" - checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/a56e1bbbf63fcb55abe379e660b9a3367787e8be1e2473bdb7e86cfa6f32b6c1fa0092432d7040b8a30b2fc674bbbe024ffe6d03c3d6bf4839b064f584463a4e languageName: node linkType: hard @@ -28231,6 +32049,81 @@ __metadata: languageName: node linkType: hard +"unstorage@npm:^1.17.5": + version: 1.17.5 + resolution: "unstorage@npm:1.17.5" + dependencies: + anymatch: "npm:^3.1.3" + chokidar: "npm:^5.0.0" + destr: "npm:^2.0.5" + h3: "npm:^1.15.10" + lru-cache: "npm:^11.2.7" + node-fetch-native: "npm:^1.6.7" + ofetch: "npm:^1.5.1" + ufo: "npm:^1.6.3" + peerDependencies: + "@azure/app-configuration": ^1.8.0 + "@azure/cosmos": ^4.2.0 + "@azure/data-tables": ^13.3.0 + "@azure/identity": ^4.6.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.26.0 + "@capacitor/preferences": ^6 || ^7 || ^8 + "@deno/kv": ">=0.9.0" + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.1" + "@vercel/functions": ^2.2.12 || ^3.0.0 + "@vercel/kv": ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: ">=0.2.1" + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@deno/kv": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/blob": + optional: true + "@vercel/functions": + optional: true + "@vercel/kv": + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + checksum: 10c0/52bc07d0951129f493cc2d2a5204f49df90c85e7ab3faac0019e3a31f22f507f7a8263fca7ca4d019950c14cbfed4d43e15c9afe4b5dcb307249ebb60d2e538e + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.2.3": version: 1.2.3 resolution: "update-browserslist-db@npm:1.2.3" @@ -28496,6 +32389,36 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^5.0.0": + version: 5.0.3 + resolution: "vfile-location@npm:5.0.3" + dependencies: + "@types/unist": "npm:^3.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966 + languageName: node + linkType: hard + +"vfile-message@npm:^4.0.0": + version: 4.0.3 + resolution: "vfile-message@npm:4.0.3" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10c0/33d9f219610d27987689bb14fa5573d2daa146941d1a05416dd7702c4215b23f44ed81d059e70d0e4e24f9a57d5f4dc9f18d35a993f04cf9446a7abe6d72d0c0 + languageName: node + linkType: hard + +"vfile@npm:^6.0.0, vfile@npm:^6.0.3": + version: 6.0.3 + resolution: "vfile@npm:6.0.3" + dependencies: + "@types/unist": "npm:^3.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/e5d9eb4810623f23758cfc2205323e33552fb5972e5c2e6587babe08fe4d24859866277404fb9e2a20afb71013860d96ec806cb257536ae463c87d70022ab9ef + languageName: node + linkType: hard + "vinyl-fs@npm:^3.0.3": version: 3.0.3 resolution: "vinyl-fs@npm:3.0.3" @@ -28591,18 +32514,75 @@ __metadata: linkType: hard "vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.2.0 - resolution: "vite@npm:8.2.0" + version: 8.1.0 + resolution: "vite@npm:8.1.0" dependencies: fsevents: "npm:~2.3.3" - lightningcss: "npm:^1.33.0" + lightningcss: "npm:^1.32.0" + picomatch: "npm:^4.0.4" + postcss: "npm:^8.5.15" + rolldown: "npm:~1.1.2" + tinyglobby: "npm:^0.2.17" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: ">=1.21.0" + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + "@vitejs/devtools": + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/d7e2da70169a7d93c68f5d0e246bdf2fb35d8835170663a28f01191d73e16b80322b5f229973ce754de80136be843481b0afa616bb8530b51e7454e4887c4b45 + languageName: node + linkType: hard + +"vite@npm:^8.0.13": + version: 8.1.5 + resolution: "vite@npm:8.1.5" + dependencies: + fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.32.0" picomatch: "npm:^4.0.5" - postcss: "npm:^8.5.23" - rolldown: "npm:~1.2.0" + postcss: "npm:^8.5.17" + rolldown: "npm:~1.1.5" tinyglobby: "npm:^0.2.17" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 - "@vitejs/devtools": ^0.4.0 + "@vitejs/devtools": ^0.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: ">=1.21.0" less: ^4.0.0 @@ -28643,7 +32623,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/bd6a5e7b28973bac06f0e8e54833800e16d1bf38a8aef2acbfea5bbaed6d8fc715fd7cc9b0ec75ef1adbde149bb9167b085c17fe7edcd3a190b4eda16d474e5c + checksum: 10c0/3231e24dd4394d0bc8b4f0f5d6d6a2eda8737e5053042892b4163564456a03d67f953c4c7498621f9517eebc30a492ea136c728a767a122eb84bf6d7cf60e1e6 languageName: node linkType: hard @@ -28704,6 +32684,18 @@ __metadata: languageName: node linkType: hard +"vitefu@npm:^1.1.2": + version: 1.1.3 + resolution: "vitefu@npm:1.1.3" + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + checksum: 10c0/6cfcd52a17339f63f71ef08787a68850a17a9d9dd7a688e29e41067f963eb2cd5192bb65d38df87fa3a733a21e0229aaa6382201655c1599699e5d6669e3e094 + languageName: node + linkType: hard + "vitest@npm:^4.1.11": version: 4.1.11 resolution: "vitest@npm:4.1.11" @@ -28772,6 +32764,120 @@ __metadata: languageName: node linkType: hard +"volar-service-css@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-css@npm:0.0.71" + dependencies: + vscode-css-languageservice: "npm:^6.3.0" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/fd07e55786a18db2f671eea087e2d43116d8c0f504aac699a3b47fc9d6f53d66c0b3652062ca6ae08d8e59905564f72c63af9727d956165061849ab488462e2e + languageName: node + linkType: hard + +"volar-service-emmet@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-emmet@npm:0.0.71" + dependencies: + "@emmetio/css-parser": "npm:^0.4.1" + "@emmetio/html-matcher": "npm:^1.3.0" + "@vscode/emmet-helper": "npm:^2.9.3" + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/a3c95991859d0e7e06a23d1201fcbdddbb7be0c525a553881f14ab941efe331adbb27431caf67962ec43a077e424f7e30bada6a52254272572b93b01f55bcf73 + languageName: node + linkType: hard + +"volar-service-html@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-html@npm:0.0.71" + dependencies: + vscode-html-languageservice: "npm:^5.3.0" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/b1ff293413945cf7357aadc9484080863e7a855a919ccc4f379123ebabe16f9905f5bd19db60e08028a7282c2926762a006daddabd0e373d5040d32afe2ab364 + languageName: node + linkType: hard + +"volar-service-prettier@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-prettier@npm:0.0.71" + dependencies: + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + prettier: + optional: true + checksum: 10c0/f3498260e51a5ee6d762fac0f332e745a5705db9ccd9aca9d154985cff733d22e8be6a41239bdce4cd5dcdaa05f8bd6e1baf27c5585f9b968e93155eb74e2118 + languageName: node + linkType: hard + +"volar-service-typescript-twoslash-queries@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-typescript-twoslash-queries@npm:0.0.71" + dependencies: + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/deaea07b08c6dc54763c98217b1b206c885e4434a07018f058e22602f8445ee29ceac70217b1271b6182c979e8ccfe2fbdaa464e327ab8ae8a0eb87517d0adba + languageName: node + linkType: hard + +"volar-service-typescript@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-typescript@npm:0.0.71" + dependencies: + path-browserify: "npm:^1.0.1" + semver: "npm:^7.6.2" + typescript-auto-import-cache: "npm:^0.3.5" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-nls: "npm:^5.2.0" + vscode-uri: "npm:^3.0.8" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/c197666fca9810e72e9db81d15c527b21dbebd493966199b5e8d690204ba17cbc6cfaeed6be7d72b285bb795ff7fbb45a939463db0cb804360c4966e5811bbc0 + languageName: node + linkType: hard + +"volar-service-yaml@npm:0.0.71": + version: 0.0.71 + resolution: "volar-service-yaml@npm:0.0.71" + dependencies: + vscode-uri: "npm:^3.0.8" + yaml-language-server: "npm:~1.23.0" + peerDependencies: + "@volar/language-service": ~2.4.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + checksum: 10c0/6d56a6c77a100208e1ae0c5cbc80f547a066012a21574f476b37b59dfb212129efaf1a98fdc4cde8bcc71c61e9d26e0ac326d6c8ea300dffd681bf2c55b50f35 + languageName: node + linkType: hard + "vscode-css-languageservice@npm:4.3.0": version: 4.3.0 resolution: "vscode-css-languageservice@npm:4.3.0" @@ -28784,6 +32890,18 @@ __metadata: languageName: node linkType: hard +"vscode-css-languageservice@npm:^6.3.0": + version: 6.3.10 + resolution: "vscode-css-languageservice@npm:6.3.10" + dependencies: + "@vscode/l10n": "npm:^0.0.18" + vscode-languageserver-textdocument: "npm:^1.0.12" + vscode-languageserver-types: "npm:3.17.5" + vscode-uri: "npm:^3.1.0" + checksum: 10c0/3f6228d85579c0306343c734716c17128757f3a6e44625deac06622fe248f05fe15da1901581aa50cb8d9539137a49d19f05dca6d13feb2e6bc9f3d9784236bd + languageName: node + linkType: hard + "vscode-html-languageservice@npm:3.1.0": version: 3.1.0 resolution: "vscode-html-languageservice@npm:3.1.0" @@ -28796,6 +32914,65 @@ __metadata: languageName: node linkType: hard +"vscode-html-languageservice@npm:^5.3.0, vscode-html-languageservice@npm:^5.6.2": + version: 5.6.2 + resolution: "vscode-html-languageservice@npm:5.6.2" + dependencies: + "@vscode/l10n": "npm:^0.0.18" + vscode-languageserver-textdocument: "npm:^1.0.12" + vscode-languageserver-types: "npm:^3.17.5" + vscode-uri: "npm:^3.1.0" + checksum: 10c0/5ef5f3cb959435a3f29d9b5844fb223140b8b5b616c3f54d0c627427853e8c8806d5d93f3a4e3354a3c9d2e9acdf6cb8043479837d20d9dd30ad6d07bf22286d + languageName: node + linkType: hard + +"vscode-json-languageservice@npm:4.1.8": + version: 4.1.8 + resolution: "vscode-json-languageservice@npm:4.1.8" + dependencies: + jsonc-parser: "npm:^3.0.0" + vscode-languageserver-textdocument: "npm:^1.0.1" + vscode-languageserver-types: "npm:^3.16.0" + vscode-nls: "npm:^5.0.0" + vscode-uri: "npm:^3.0.2" + checksum: 10c0/9165703884e5eef52d4bf52294051df6623461cc7a3d458ef1f4fa3f98ac93c3a79efc8c4a15fda6ddf6e43d155c207c3c13534dcac3fe7982ddf1926dbf22a7 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:8.2.0": + version: 8.2.0 + resolution: "vscode-jsonrpc@npm:8.2.0" + checksum: 10c0/0789c227057a844f5ead55c84679206227a639b9fb76e881185053abc4e9848aa487245966cc2393fcb342c4541241b015a1a2559fddd20ac1e68945c95344e6 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:9.0.1": + version: 9.0.1 + resolution: "vscode-jsonrpc@npm:9.0.1" + checksum: 10c0/6ca63393dd78675ed33b5537c147e673865557ff93915cd5189ceae039ca7fe01808ffd9a14016732d4789f2102a037d68d4216f557c3380d1c7f3ea50fd85b4 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-protocol@npm:3.17.5" + dependencies: + vscode-jsonrpc: "npm:8.2.0" + vscode-languageserver-types: "npm:3.17.5" + checksum: 10c0/5f38fd80da9868d706eaa4a025f4aff9c3faad34646bcde1426f915cbd8d7e8b6c3755ce3fef6eebd256ba3145426af1085305f8a76e34276d2e95aaf339a90b + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:^3.17.5": + version: 3.18.2 + resolution: "vscode-languageserver-protocol@npm:3.18.2" + dependencies: + vscode-jsonrpc: "npm:9.0.1" + vscode-languageserver-types: "npm:3.18.0" + checksum: 10c0/c77862958063b2d6edcdbab7da1abece58b251051338083296c468d5caafc2c249aba63f1a15011d8b8354e145937252520fe6a9632c146606a833bdeae9784c + languageName: node + linkType: hard + "vscode-languageserver-textdocument@npm:^1.0.1": version: 1.0.12 resolution: "vscode-languageserver-textdocument@npm:1.0.12" @@ -28803,6 +32980,13 @@ __metadata: languageName: node linkType: hard +"vscode-languageserver-textdocument@npm:^1.0.11, vscode-languageserver-textdocument@npm:^1.0.12": + version: 1.0.13 + resolution: "vscode-languageserver-textdocument@npm:1.0.13" + checksum: 10c0/1de174f1de3bfa9e1660a4b3c1b1c711497196d761e33f4d00785fdbfc556ae5a1f440db04771cbc0f6bd66c2a6f303062bc17d8dc46e76820e39fa2d5626564 + languageName: node + linkType: hard + "vscode-languageserver-types@npm:3.16.0-next.2": version: 3.16.0-next.2 resolution: "vscode-languageserver-types@npm:3.16.0-next.2" @@ -28810,6 +32994,31 @@ __metadata: languageName: node linkType: hard +"vscode-languageserver-types@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 10c0/1e1260de79a2cc8de3e46f2e0182cdc94a7eddab487db5a3bd4ee716f67728e685852707d72c059721ce500447be9a46764a04f0611e94e4321ffa088eef36f8 + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.18.0, vscode-languageserver-types@npm:^3.15.1, vscode-languageserver-types@npm:^3.16.0, vscode-languageserver-types@npm:^3.17.5": + version: 3.18.0 + resolution: "vscode-languageserver-types@npm:3.18.0" + checksum: 10c0/d8c51cd286cc55b4c1f333e87fa3cefc66d2aae8c65f6209e7ecf88032d3326308b333d62b05243c194be8a3304760445b87630b298116c6c612607f011b4de0 + languageName: node + linkType: hard + +"vscode-languageserver@npm:^9.0.0, vscode-languageserver@npm:^9.0.1": + version: 9.0.1 + resolution: "vscode-languageserver@npm:9.0.1" + dependencies: + vscode-languageserver-protocol: "npm:3.17.5" + bin: + installServerIntoExtension: bin/installServerIntoExtension + checksum: 10c0/8a0838d77c98a211c76e54bd3a6249fc877e4e1a73322673fb0e921168d8e91de4f170f1d4ff7e8b6289d0698207afc6aba6662d4c1cd8e4bd7cae96afd6b0c2 + languageName: node + linkType: hard + "vscode-nls@npm:^4.1.2": version: 4.1.2 resolution: "vscode-nls@npm:4.1.2" @@ -28817,6 +33026,13 @@ __metadata: languageName: node linkType: hard +"vscode-nls@npm:^5.0.0, vscode-nls@npm:^5.2.0": + version: 5.2.0 + resolution: "vscode-nls@npm:5.2.0" + checksum: 10c0/dc9e48f58ebbc807f435d351008813a2ea0c9432d51e778bcac9163c0642f929ddb518411ad654e775ce31e24d6acfa8fb7db8893c05b42c2019894e08b050f9 + languageName: node + linkType: hard + "vscode-uri@npm:^2.1.2": version: 2.1.2 resolution: "vscode-uri@npm:2.1.2" @@ -28824,6 +33040,13 @@ __metadata: languageName: node linkType: hard +"vscode-uri@npm:^3.0.2, vscode-uri@npm:^3.0.8, vscode-uri@npm:^3.1.0": + version: 3.1.0 + resolution: "vscode-uri@npm:3.1.0" + checksum: 10c0/5f6c9c10fd9b1664d71fab4e9fbbae6be93c7f75bb3a1d9d74399a88ab8649e99691223fd7cef4644376cac6e94fa2c086d802521b9a8e31c5af3e60f0f35624 + languageName: node + linkType: hard + "wait-on@npm:^7.0.0": version: 7.2.0 resolution: "wait-on@npm:7.2.0" @@ -28902,6 +33125,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd + languageName: node + linkType: hard + "web-vitals@npm:^1.1.2": version: 1.1.2 resolution: "web-vitals@npm:1.1.2" @@ -29512,6 +33742,13 @@ __metadata: languageName: node linkType: hard +"xxhash-wasm@npm:^1.1.0": + version: 1.1.0 + resolution: "xxhash-wasm@npm:1.1.0" + checksum: 10c0/35aa152fc7d775ae13364fe4fb20ebd89c6ac1f56cdb6060a6d2f1ed68d15180694467e63a4adb3d11936a4798ccd75a540979070e70d9b911e9981bbdd9cea6 + languageName: node + linkType: hard + "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -29554,6 +33791,28 @@ __metadata: languageName: node linkType: hard +"yaml-language-server@npm:~1.23.0": + version: 1.23.0 + resolution: "yaml-language-server@npm:1.23.0" + dependencies: + "@vscode/l10n": "npm:^0.0.18" + ajv: "npm:^8.17.1" + ajv-draft-04: "npm:^1.0.0" + ajv-i18n: "npm:^4.2.0" + prettier: "npm:^3.8.1" + request-light: "npm:^0.5.7" + vscode-json-languageservice: "npm:4.1.8" + vscode-languageserver: "npm:^9.0.0" + vscode-languageserver-textdocument: "npm:^1.0.1" + vscode-languageserver-types: "npm:^3.16.0" + vscode-uri: "npm:^3.0.2" + yaml: "npm:2.8.3" + bin: + yaml-language-server: bin/yaml-language-server + checksum: 10c0/d5ed44bb542ad9b9a38171983257f47c391120fb703e043395f3490c22d99f0807d90a0cdb7b4b7955f39557162936f41bd0d6f121c95b473bc1deac597c41a1 + languageName: node + linkType: hard + "yaml-loader@npm:^0.8.0": version: 0.8.1 resolution: "yaml-loader@npm:0.8.1" @@ -29565,6 +33824,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:2.8.3": + version: 2.8.3 + resolution: "yaml@npm:2.8.3" + bin: + yaml: bin.mjs + checksum: 10c0/ddff0e11c1b467728d7eb4633db61c5f5de3d8e9373cf84d08fb0cdee03e1f58f02b9f1c51a4a8a865751695addbd465a77f73f1079be91fe5493b29c305fd77 + languageName: node + linkType: hard + "yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.3 resolution: "yaml@npm:1.10.3" @@ -29572,7 +33840,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.9.0": +"yaml@npm:^2.0.0, yaml@npm:^2.8.3, yaml@npm:^2.9.0": version: 2.9.0 resolution: "yaml@npm:2.9.0" bin: @@ -29688,6 +33956,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.2.1": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 10c0/36d4793e9cf7060f9da543baf67c55e354f4862c8d3d34de1a1b1d7c382d44171315cc54abf84d8900b8113d742b830108a1434f4898fb244f9b7e8426d4b8f5 + languageName: node + linkType: hard + "yoga-layout-prebuilt@npm:^1.10.0": version: 1.10.0 resolution: "yoga-layout-prebuilt@npm:1.10.0" @@ -29725,3 +34000,17 @@ __metadata: checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 languageName: node linkType: hard + +"zod@npm:^4.3.6": + version: 4.4.3 + resolution: "zod@npm:4.4.3" + checksum: 10c0/7ea31b558e88f9faf44f31dd185e2e1cbf51fed3081787fb96cc2534749b50c0acfc6da7f0922a7353ed092dd358c7d50c28ea96c94d04af64191bd33152eca3 + languageName: node + linkType: hard + +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e + languageName: node + linkType: hard