diff --git a/.changeset/giant-cycles-clap.md b/.changeset/giant-cycles-clap.md new file mode 100644 index 00000000000..cea23fd5aa3 --- /dev/null +++ b/.changeset/giant-cycles-clap.md @@ -0,0 +1,57 @@ +--- +"@salt-ds/date-adapters": patch +"@salt-ds/lab": patch +--- + +Refine peer dependency management for DatePicker adapters by splitting them into sub-packages. You now import only the specific date framework adapter you need, simplifying dependency handling. + +- **For `date-fns`:** + + ```diff + - import { AdapterDateFns } from "@salt-ds/date-adapters"; + + import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; + ``` + +- **For `dayjs`:** + + ```diff + - import { AdapterDayjs } from "@salt-ds/date-adapters"; + + import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; + ``` + +- **For `luxon`:** + + ```diff + - import { AdapterLuxon } from "@salt-ds/date-adapters"; + + import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; + ``` + +- **For `moment`:** + + ```diff + - import { AdapterMoment } from "@salt-ds/date-adapters"; + + import { AdapterMoment } from "@salt-ds/date-adapters/moment"; + ``` + +Additionally, `DateDetailErrorEnum` is now a simpler `DateDetailError` of type `DateDetailErrorType`. + +```diff +- import { DateDetailErrorEnum } from "@salt-ds/date-adapters"; ++ import { DateDetailError } from "@salt-ds/date-adapters/moment"; +``` + +### Instructions + +1. Modify your import statements to use the specific sub-package for the date adapter you require. + +2. Ensure your `package.json` includes the necessary date framework as a dependency. For example, if using `date-fns`: + + ```json + { + "dependencies": { + "date-fns": "^x.x.x" + } + } + ``` + +This change helps streamline the integration of date frameworks with the DatePicker component by ensuring only the necessary adapters and dependencies are included. diff --git a/.changeset/poor-scissors-chew.md b/.changeset/poor-scissors-chew.md new file mode 100644 index 00000000000..c8fd1216d98 --- /dev/null +++ b/.changeset/poor-scissors-chew.md @@ -0,0 +1,5 @@ +--- +"@salt-ds/lab": patch +--- + +Overlay and Dialog headers fix alignment for titles spanning into multiple lines, wrap preheader and headers in H2. diff --git a/.changeset/silent-dots-run.md b/.changeset/silent-dots-run.md new file mode 100644 index 00000000000..c1b9bf76464 --- /dev/null +++ b/.changeset/silent-dots-run.md @@ -0,0 +1,5 @@ +--- +"@salt-ds/core": minor +--- + +Added `render` prop to `Link`. The `render` prop enables the substitution of the default anchor tag with an alternate link, such as React Router, facilitating integration with routing libraries. diff --git a/.changeset/ten-lies-explode.md b/.changeset/ten-lies-explode.md new file mode 100644 index 00000000000..2db04429f32 --- /dev/null +++ b/.changeset/ten-lies-explode.md @@ -0,0 +1,5 @@ +--- +"@salt-ds/lab": patch +--- + +Add border box to skip link container to ensure height is correctly measured. diff --git a/.changeset/wet-swans-wave.md b/.changeset/wet-swans-wave.md new file mode 100644 index 00000000000..855e5e03ce0 --- /dev/null +++ b/.changeset/wet-swans-wave.md @@ -0,0 +1,5 @@ +--- +"@salt-ds/core": patch +--- + +Fixed Toast icon alignment. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3dbd96bc9ec..4bd974f2086 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,7 +1,7 @@ name: Bug report 🪲 description: Something is broken and you have a reproduction? Let us know so we can fix it! +type: "bug" labels: - - "type: bug 🪲" - "status: awaiting triage" body: - type: markdown diff --git a/cypress.config.ts b/cypress.config.ts index f2417ff233a..2bf3dbb9e3e 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -56,10 +56,6 @@ async function getViteConfig(config: UserConfig) { __dirname, "./dist/salt-ds-countries", ), - "@salt-ds/date-adapters": path.resolve( - __dirname, - "./dist/salt-ds-date-adapters", - ), "@salt-ds/data-grid": path.resolve( __dirname, "./dist/salt-ds-data-grid", @@ -73,7 +69,6 @@ async function getViteConfig(config: UserConfig) { optimizeDeps: { include: [ "@salt-ds/core", - "@salt-ds/data-adapters", "@salt-ds/data-grid", "@salt-ds/lab", "@salt-ds/icons", diff --git a/docs/decorators/withLocalization.tsx b/docs/decorators/withLocalization.tsx index 0a086d603cb..20099c07ade 100644 --- a/docs/decorators/withLocalization.tsx +++ b/docs/decorators/withLocalization.tsx @@ -1,9 +1,9 @@ import type { Decorator } from "@storybook/react"; import "dayjs/locale/en"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { LocalizationProvider } from "@salt-ds/lab"; import { enUS as dateFnsEnUs } from "date-fns/locale"; diff --git a/package.json b/package.json index 20dc75ff737..f07b7576099 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "vite": "^6.0.0", "vite-plugin-istanbul": "^6.0.0", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^2.0.0", + "vitest": "^3.0.0", "yup": "^1.0.2" }, "resolutions": { @@ -143,6 +143,7 @@ "get-tsconfig": "^4.7.5", "rollup": "^4.24.2", "rollup-plugin-esbuild": "^6.1.1", - "rollup-plugin-postcss": "^4.0.2" + "rollup-plugin-postcss": "^4.0.2", + "vite-tsconfig-paths": "^4.2.0" } } diff --git a/packages/core/src/__tests__/__e2e__/link/Link.cy.tsx b/packages/core/src/__tests__/__e2e__/link/Link.cy.tsx index d200510d44d..6d8711794bb 100644 --- a/packages/core/src/__tests__/__e2e__/link/Link.cy.tsx +++ b/packages/core/src/__tests__/__e2e__/link/Link.cy.tsx @@ -42,4 +42,40 @@ describe("GIVEN a link", () => { cy.findByTestId(/TearOutIcon/i).should("not.exist"); }); + + it("WHEN `render` is passed a render function, THEN should call `render` to create the element", () => { + const testId = "link-testid"; + + const mockRender = cy + .stub() + .as("render") + .returns( + + Action + , + ); + + cy.mount(); + + cy.findByTestId(testId).should("exist"); + + cy.get("@render").should("have.been.calledWithMatch", { + className: Cypress.sinon.match.string, + children: Cypress.sinon.match.any, + }); + }); + + it("WHEN `render` is given a JSX element, THEN should merge the props and render the JSX element", () => { + const testId = "link-testid"; + + const mockRender = ( + + Action + + ); + + cy.mount(); + + cy.findByTestId(testId).should("exist"); + }); }); diff --git a/packages/core/src/link/Link.tsx b/packages/core/src/link/Link.tsx index 0a86426e100..cc4c6b003f8 100644 --- a/packages/core/src/link/Link.tsx +++ b/packages/core/src/link/Link.tsx @@ -2,11 +2,17 @@ import type { IconProps } from "@salt-ds/icons"; import { useComponentCssInjection } from "@salt-ds/styles"; import { useWindow } from "@salt-ds/window"; import { clsx } from "clsx"; -import { type ComponentType, type ReactElement, forwardRef } from "react"; +import { + type ComponentPropsWithoutRef, + type ComponentType, + type ReactElement, + forwardRef, +} from "react"; import { useIcon } from "../semantic-icon-provider"; import { Text, type TextProps } from "../text"; -import { makePrefixer } from "../utils"; +import { type RenderPropsType, makePrefixer } from "../utils"; import linkCss from "./Link.css"; +import { LinkAction } from "./LinkAction"; const withBaseName = makePrefixer("saltLink"); @@ -16,8 +22,14 @@ const withBaseName = makePrefixer("saltLink"); * @example * Action */ -export interface LinkProps extends Omit, "as" | "disabled"> { +export interface LinkProps + extends Omit, "color">, + Pick, "maxRows" | "styleAs" | "color" | "variant"> { IconComponent?: ComponentType | null; + /** + * Render prop to enable customisation of anchor element. + */ + render?: RenderPropsType["render"]; } export const Link = forwardRef(function Link( @@ -47,7 +59,7 @@ export const Link = forwardRef(function Link( return ( {} + +export const LinkAction = forwardRef( + function LinkAction(props, ref) { + return renderProps("a", { ...props, ref }); + }, +); diff --git a/packages/core/src/toast/Toast.css b/packages/core/src/toast/Toast.css index d0b2f793bc2..8d8670e4787 100644 --- a/packages/core/src/toast/Toast.css +++ b/packages/core/src/toast/Toast.css @@ -30,7 +30,7 @@ /* Styles applied to icon */ .saltToast-iconContainer > .saltIcon { - margin: calc(var(--salt-spacing-75) + 2px) 0 var(--salt-spacing-75) 0; + margin-top: calc(var(--salt-spacing-75) + calc((var(--salt-text-lineHeight) - max(var(--salt-size-icon), 12px)) / 2)); color: var(--toast-iconColor); } diff --git a/packages/core/stories/link/link.stories.tsx b/packages/core/stories/link/link.stories.tsx index b61b8c54666..903c69fcf47 100644 --- a/packages/core/stories/link/link.stories.tsx +++ b/packages/core/stories/link/link.stories.tsx @@ -101,3 +101,22 @@ export const Truncation: StoryFn = () => { // // ); // }; + +const CustomLinkImplementation = (props: any) => ( + + Your own Link implementation + +); + +export const RenderElement: StoryFn = () => { + return } />; +}; + +export const RenderProp: StoryFn = () => { + return ( + } + /> + ); +}; diff --git a/packages/date-adapters/package.json b/packages/date-adapters/package.json index 7fb6f523a8d..001de7c202f 100644 --- a/packages/date-adapters/package.json +++ b/packages/date-adapters/package.json @@ -38,6 +38,6 @@ "provenance": true }, "scripts": { - "build": "yarn node ../../scripts/build.mjs" + "build": "yarn node ./scripts/build.mjs" } } diff --git a/packages/date-adapters/scripts/build.mjs b/packages/date-adapters/scripts/build.mjs new file mode 100644 index 00000000000..d8e27b95f1c --- /dev/null +++ b/packages/date-adapters/scripts/build.mjs @@ -0,0 +1,162 @@ +import path from "node:path"; +import commonjs from "@rollup/plugin-commonjs"; +import json from "@rollup/plugin-json"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import browserslistToEsbuild from "browserslist-to-esbuild"; +import fs from "fs-extra"; +import { rollup } from "rollup"; +import esbuild from "rollup-plugin-esbuild"; +import { makeTypings } from "./../../../scripts/makeTypings.mjs"; +import { transformWorkspaceDeps } from "./../../../scripts/transformWorkspaceDeps.mjs"; +import { distinct } from "./../../../scripts/utils.mjs"; + +const cwd = process.cwd(); + +const packageJson = ( + await import(path.join("file://", cwd, "package.json"), { + with: { type: "json" }, + }) +).default; + +const FILES_TO_COPY = ["README.md", "LICENSE", "CHANGELOG.md"].concat( + packageJson.files ?? [], +); + +const packageName = packageJson.name; +const outputDir = path.join(packageJson.publishConfig.directory); + +console.log(`Building ${packageName}`); + +await fs.mkdirp(outputDir); +await fs.emptyDir(outputDir); + +// Define entry points for each adapter +const entryPoints = { + types: path.join(cwd, "src/types/index.ts"), + moment: path.join(cwd, "src/moment-adapter/index.ts"), + luxon: path.join(cwd, "src/luxon-adapter/index.ts"), + dayjs: path.join(cwd, "src/dayjs-adapter/index.ts"), + "date-fns": path.join(cwd, "src/date-fns-adapter/index.ts"), +}; + +for (const [adapterName, inputPath] of Object.entries(entryPoints)) { + await makeTypings(outputDir, path.dirname(inputPath)); + + const bundle = await rollup({ + input: inputPath, + external: (id) => { + if (id === "babel-plugin-transform-async-to-promises/helpers") { + return false; + } + return !id.startsWith(".") && !path.isAbsolute(id); + }, + treeshake: { + propertyReadSideEffects: false, + }, + plugins: [ + nodeResolve({ + extensions: [".ts", ".tsx", ".js", ".jsx"], + browser: true, + mainFields: ["module", "main", "browser"], + }), + commonjs({ include: /\/node_modules\// }), + esbuild({ + target: browserslistToEsbuild(), + minify: false, + sourceMap: true, + }), + json(), + ], + }); + + const transformSourceMap = (relativeSourcePath, sourceMapPath) => { + const absoluteSourcepath = path.resolve( + path.dirname(sourceMapPath), + relativeSourcePath, + ); + const packageRelativeSourcePath = path.relative(cwd, absoluteSourcepath); + + return `../${packageRelativeSourcePath}`; + }; + + await bundle.write({ + freeze: false, + sourcemap: true, + preserveModules: false, + dir: path.join(outputDir, `dist-cjs/${adapterName}`), + format: "cjs", + exports: "named", + sourcemapPathTransform: transformSourceMap, + }); + + await bundle.write({ + freeze: false, + sourcemap: true, + preserveModules: false, + dir: path.join(outputDir, `dist-es/${adapterName}`), + format: "es", + exports: "named", + sourcemapPathTransform: transformSourceMap, + }); + + await bundle.close(); +} + +await fs.writeJSON( + path.join(outputDir, "package.json"), + { + ...packageJson, + dependencies: await transformWorkspaceDeps(packageJson.dependencies), + main: "dist-cjs/index.js", + module: "dist-es/index.js", + typings: "dist-types/types/index.d.ts", + exports: { + ".": { + types: "./dist-types/types/index.d.ts", + import: "./dist-es/types/index.js", + require: "./dist-cjs/types/index.js", + }, + "./date-fns": { + types: "./dist-types/date-fns-adapter/index.d.ts", + import: "./dist-es/date-fns/index.js", + require: "./dist-cjs/date-fns/index.js", + }, + "./dayjs": { + types: "./dist-types/dayjs-adapter/index.d.ts", + import: "./dist-es/dayjs/index.js", + require: "./dist-cjs/dayjs/index.js", + }, + "./luxon": { + types: "./dist-types/luxon-adapter/index.d.ts", + import: "./dist-es/luxon/index.js", + require: "./dist-cjs/luxon/index.js", + }, + "./moment": { + types: "./dist-types/moment-adapter/index.d.ts", + import: "./dist-es/moment/index.js", + require: "./dist-cjs/moment/index.js", + }, + }, + files: distinct([ + ...(packageJson.files ?? []), + "dist-cjs", + "dist-es", + "dist-types", + "CHANGELOG.md", + ]), + }, + { spaces: 2 }, +); + +for (const file of FILES_TO_COPY) { + const filePath = path.join(cwd, file); + try { + await fs.copy(filePath, path.join(outputDir, file)); + } catch (error) { + if (error.code !== "ENOENT") { + throw error; + } + } +} + +console.log(`Built ${packageName} into ${outputDir}`); diff --git a/packages/date-adapters/src/__tests__/date-fns.spec.ts b/packages/date-adapters/src/__tests__/date-fns.spec.ts index 3fb26cf52db..d1ab3f69660 100644 --- a/packages/date-adapters/src/__tests__/date-fns.spec.ts +++ b/packages/date-adapters/src/__tests__/date-fns.spec.ts @@ -1,7 +1,8 @@ import { isValid } from "date-fns"; import { enUS } from "date-fns/locale"; import { describe, expect, it } from "vitest"; -import { AdapterDateFns, DateDetailErrorEnum } from "../index"; +import { AdapterDateFns } from "../date-fns-adapter"; +import { DateDetailError } from "../index"; describe("GIVEN a AdapterDateFns", () => { const adapter = new AdapterDateFns({ locale: enUS }); @@ -34,7 +35,7 @@ describe("GIVEN a AdapterDateFns", () => { expect(result.errors).toEqual([ { message: "not a valid date", - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, }, ]); }); diff --git a/packages/date-adapters/src/__tests__/dayjs.spec.ts b/packages/date-adapters/src/__tests__/dayjs.spec.ts index ceb1183fce4..8ca414c1af8 100644 --- a/packages/date-adapters/src/__tests__/dayjs.spec.ts +++ b/packages/date-adapters/src/__tests__/dayjs.spec.ts @@ -3,7 +3,8 @@ import customParseFormat from "dayjs/plugin/customParseFormat"; import timezone from "dayjs/plugin/timezone"; import utc from "dayjs/plugin/utc"; import { describe, expect, it } from "vitest"; -import { AdapterDayjs, DateDetailErrorEnum } from "../index"; +import { AdapterDayjs } from "../dayjs-adapter"; +import { DateDetailError } from "../index"; // Extend dayjs with necessary plugins dayjs.extend(utc); @@ -70,7 +71,7 @@ describe("GIVEN a AdapterDayjs", () => { expect(result.errors).toEqual([ { message: "not a valid date", - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, }, ]); }); diff --git a/packages/date-adapters/src/__tests__/luxon.spec.ts b/packages/date-adapters/src/__tests__/luxon.spec.ts index 1b80eadf5ea..16050f1b921 100644 --- a/packages/date-adapters/src/__tests__/luxon.spec.ts +++ b/packages/date-adapters/src/__tests__/luxon.spec.ts @@ -1,6 +1,7 @@ import { DateTime } from "luxon"; import { describe, expect, it } from "vitest"; -import { AdapterLuxon, DateDetailErrorEnum } from "../index"; +import { DateDetailError } from "../index"; +import { AdapterLuxon } from "../luxon-adapter"; describe("GIVEN a AdapterLuxon", () => { const adapter = new AdapterLuxon({ locale: "en-US" }); @@ -62,7 +63,7 @@ describe("GIVEN a AdapterLuxon", () => { expect(result.errors).toEqual([ { message: "not a valid date", - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, }, ]); }); diff --git a/packages/date-adapters/src/__tests__/moment.spec.ts b/packages/date-adapters/src/__tests__/moment.spec.ts index 253a75ec384..ebd5f848145 100644 --- a/packages/date-adapters/src/__tests__/moment.spec.ts +++ b/packages/date-adapters/src/__tests__/moment.spec.ts @@ -1,7 +1,8 @@ import moment from "moment"; import { describe, expect, it } from "vitest"; import "moment-timezone"; -import { AdapterMoment, DateDetailErrorEnum } from "../index"; +import { DateDetailError } from "../index"; +import { AdapterMoment } from "../moment-adapter"; describe("GIVEN a AdapterMoment", () => { const adapter = new AdapterMoment({ locale: "en" }); @@ -63,7 +64,7 @@ describe("GIVEN a AdapterMoment", () => { expect(result.errors).toEqual([ { message: "not a valid date", - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, }, ]); }); diff --git a/packages/date-adapters/src/date-fns/index.ts b/packages/date-adapters/src/date-fns-adapter/index.ts similarity index 98% rename from packages/date-adapters/src/date-fns/index.ts rename to packages/date-adapters/src/date-fns-adapter/index.ts index 2765e96a406..83606f7b825 100644 --- a/packages/date-adapters/src/date-fns/index.ts +++ b/packages/date-adapters/src/date-fns-adapter/index.ts @@ -33,7 +33,7 @@ import { import { enUS } from "date-fns/locale"; import { type AdapterOptions, - DateDetailErrorEnum, + DateDetailError, type ParserResult, type RecommendedFormats, type SaltDateAdapter, @@ -41,7 +41,7 @@ import { type Timezone, } from "../types"; -declare module "../types" { +declare module "@salt-ds/date-adapters" { interface DateFrameworkTypeMap { "date-fns": Date; } @@ -213,8 +213,8 @@ export class AdapterDateFns implements SaltDateAdapter { { message: isDateDefined ? "not a valid date" : "no date defined", type: isDateDefined - ? DateDetailErrorEnum.INVALID_DATE - : DateDetailErrorEnum.UNSET, + ? DateDetailError.INVALID_DATE + : DateDetailError.UNSET, }, ], }; diff --git a/packages/date-adapters/src/dayjs/index.ts b/packages/date-adapters/src/dayjs-adapter/index.ts similarity index 99% rename from packages/date-adapters/src/dayjs/index.ts rename to packages/date-adapters/src/dayjs-adapter/index.ts index 17200410876..e391f32f8ce 100644 --- a/packages/date-adapters/src/dayjs/index.ts +++ b/packages/date-adapters/src/dayjs-adapter/index.ts @@ -6,7 +6,7 @@ import utc from "dayjs/plugin/utc"; import weekday from "dayjs/plugin/weekday"; import { type AdapterOptions, - DateDetailErrorEnum, + DateDetailError, type ParserResult, type RecommendedFormats, type SaltDateAdapter, @@ -20,7 +20,7 @@ type Constructor = { utc?: (value?: Parameters[0]) => Dayjs; }; -declare module "../types" { +declare module "@salt-ds/date-adapters" { interface DateFrameworkTypeMap { dayjs: Dayjs; } @@ -223,8 +223,8 @@ export class AdapterDayjs implements SaltDateAdapter { { message: isDateDefined ? "not a valid date" : "no date defined", type: isDateDefined - ? DateDetailErrorEnum.INVALID_DATE - : DateDetailErrorEnum.UNSET, + ? DateDetailError.INVALID_DATE + : DateDetailError.UNSET, }, ], }; diff --git a/packages/date-adapters/src/index.ts b/packages/date-adapters/src/index.ts index 126225dc310..eea524d6557 100644 --- a/packages/date-adapters/src/index.ts +++ b/packages/date-adapters/src/index.ts @@ -1,18 +1 @@ -/** - * To add a new adapter, then, add the adapter's date object to `DateFrameworkTypeMap` interface - * - * declare module "./types" { - * interface DateFrameworkTypeMap { - * luxon: DateTime; - * } - * } - */ -// biome-ignore lint/complexity/noBannedTypes: type augmented by configured adapters -export type DateFrameworkTypeMap = {}; - -export * from "./date-fns"; -export * from "./dayjs"; -export * from "./luxon"; -export * from "./moment"; - export * from "./types"; diff --git a/packages/date-adapters/src/luxon/index.ts b/packages/date-adapters/src/luxon-adapter/index.ts similarity index 98% rename from packages/date-adapters/src/luxon/index.ts rename to packages/date-adapters/src/luxon-adapter/index.ts index 00d78cf1100..13f6ad5d33a 100644 --- a/packages/date-adapters/src/luxon/index.ts +++ b/packages/date-adapters/src/luxon-adapter/index.ts @@ -1,7 +1,7 @@ import { DateTime, Duration, Settings } from "luxon"; import { type AdapterOptions, - DateDetailErrorEnum, + DateDetailError, type ParserResult, type RecommendedFormats, type SaltDateAdapter, @@ -9,7 +9,7 @@ import { type Timezone, } from "../types"; -declare module "../types" { +declare module "@salt-ds/date-adapters" { interface DateFrameworkTypeMap { luxon: DateTime; } @@ -234,8 +234,8 @@ export class AdapterLuxon implements SaltDateAdapter { { message: isDateDefined ? "not a valid date" : "no date defined", type: isDateDefined - ? DateDetailErrorEnum.INVALID_DATE - : DateDetailErrorEnum.UNSET, + ? DateDetailError.INVALID_DATE + : DateDetailError.UNSET, }, ], }; diff --git a/packages/date-adapters/src/moment/index.ts b/packages/date-adapters/src/moment-adapter/index.ts similarity index 99% rename from packages/date-adapters/src/moment/index.ts rename to packages/date-adapters/src/moment-adapter/index.ts index 9d20ca5d2ae..d52d059218e 100644 --- a/packages/date-adapters/src/moment/index.ts +++ b/packages/date-adapters/src/moment-adapter/index.ts @@ -1,7 +1,7 @@ import defaultMoment, { type Moment } from "moment"; import { type AdapterOptions, - DateDetailErrorEnum, + DateDetailError, type ParserResult, type RecommendedFormats, type SaltDateAdapter, @@ -9,7 +9,7 @@ import { type Timezone, } from "../types"; -declare module "../types" { +declare module "@salt-ds/date-adapters" { export interface DateFrameworkTypeMap { moment: Moment; } @@ -215,8 +215,8 @@ export class AdapterMoment implements SaltDateAdapter { { message: isDateDefined ? "not a valid date" : "no date defined", type: isDateDefined - ? DateDetailErrorEnum.INVALID_DATE - : DateDetailErrorEnum.UNSET, + ? DateDetailError.INVALID_DATE + : DateDetailError.UNSET, }, ], }; diff --git a/packages/date-adapters/src/types/DateFrameworkTypeMap.ts b/packages/date-adapters/src/types/DateFrameworkTypeMap.ts new file mode 100644 index 00000000000..0e82963a1f7 --- /dev/null +++ b/packages/date-adapters/src/types/DateFrameworkTypeMap.ts @@ -0,0 +1,12 @@ +/** + * To add a new adapter, then, add the adapter's date object to `DateFrameworkTypeMap` interface + * + * declare module "@salt-ds/date-adapters" { + * interface DateFrameworkTypeMap { + * luxon: DateTime; + * } + * } + */ + +// biome-ignore lint/complexity/noBannedTypes: type augmented by configured adapters +export type DateFrameworkTypeMap = {}; diff --git a/packages/date-adapters/src/types.ts b/packages/date-adapters/src/types/index.ts similarity index 95% rename from packages/date-adapters/src/types.ts rename to packages/date-adapters/src/types/index.ts index 857a978bd75..abcd9d5b159 100644 --- a/packages/date-adapters/src/types.ts +++ b/packages/date-adapters/src/types/index.ts @@ -1,3 +1,4 @@ +import type { DateFrameworkTypeMap } from "./DateFrameworkTypeMap"; /** * Represents the date object of a date framework. * @@ -11,27 +12,29 @@ export type DateFrameworkType = keyof DateFrameworkTypeMap extends never /** * Enum representing possible date detail error types. */ -export enum DateDetailErrorEnum { +export const DateDetailError = { /** Error type for unset values */ - UNSET = "unset", + UNSET: "unset", /** Error type for values that are not a date */ - NOT_A_DATE = "not-a-date", + NOT_A_DATE: "not-a-date", /** Error type for invalid date values */ - INVALID_DATE = "date", + INVALID_DATE: "date", /** Error type for invalid month values */ - INVALID_MONTH = "month", + INVALID_MONTH: "month", /** Error type for invalid day values */ - INVALID_DAY = "day", + INVALID_DAY: "day", /** Error type for invalid year values */ - INVALID_YEAR = "year", -} + INVALID_YEAR: "year", +} as const; +export type DateDetailErrorType = + (typeof DateDetailError)[keyof typeof DateDetailError]; /** * Represents an error detail for a date. */ export type DateDetailError = { /** The error code */ - type: DateDetailErrorEnum | string; + type: DateDetailErrorType | string; /** The error message */ message: string; }; diff --git a/packages/date-adapters/tsconfig.json b/packages/date-adapters/tsconfig.json new file mode 100644 index 00000000000..ce623bd894a --- /dev/null +++ b/packages/date-adapters/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": "./src", + "declaration": false, + "outDir": "./dist", + "module": "commonjs", + "target": "es2016", + "moduleResolution": "node", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true + }, + "include": ["src/**/*"] +} diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.a11y.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.a11y.cy.tsx index 1fa9c6d77e9..87dfe4aa1af 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.a11y.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.a11y.cy.tsx @@ -1,7 +1,7 @@ -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import * as calendarStories from "@stories/calendar/calendar.stories"; import { composeStories } from "@storybook/react"; diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.cy.tsx index 20532957bea..6d2d11e0553 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.cy.tsx @@ -2,10 +2,10 @@ import type { DateFrameworkType, SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.multiselect.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.multiselect.cy.tsx index 89560972b2f..8cc9feaf8fd 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.multiselect.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.multiselect.cy.tsx @@ -2,10 +2,10 @@ import type { DateFrameworkType, SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.offset.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.offset.cy.tsx index c4439f3d5a5..ef9ad5bd2cf 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.offset.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.offset.cy.tsx @@ -2,10 +2,10 @@ import type { DateFrameworkType, SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.range.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.range.cy.tsx index c7b1143b43a..faf9096d3f5 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.range.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.range.cy.tsx @@ -1,11 +1,11 @@ -import { - AdapterDateFns, - AdapterDayjs, - AdapterLuxon, - AdapterMoment, - type DateFrameworkType, - type SaltDateAdapter, +import type { + DateFrameworkType, + SaltDateAdapter, } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, diff --git a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.single.cy.tsx b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.single.cy.tsx index a6327fec61b..c06773f8af3 100644 --- a/packages/lab/src/__tests__/__e2e__/calendar/Calendar.single.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/calendar/Calendar.single.cy.tsx @@ -2,10 +2,10 @@ import type { DateFrameworkType, SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, diff --git a/packages/lab/src/__tests__/__e2e__/date-input/DateInput.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-input/DateInput.cy.tsx index 6fa1bc3a234..33856596a0a 100644 --- a/packages/lab/src/__tests__/__e2e__/date-input/DateInput.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-input/DateInput.cy.tsx @@ -1,7 +1,7 @@ -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import * as dateInputStories from "@stories/date-input/date-input.stories"; import { composeStories } from "@storybook/react"; import { checkAccessibility } from "../../../../../../cypress/tests/checkAccessibility"; diff --git a/packages/lab/src/__tests__/__e2e__/date-input/DateInputRange.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-input/DateInputRange.cy.tsx index d4634c8301c..d2c57b65442 100644 --- a/packages/lab/src/__tests__/__e2e__/date-input/DateInputRange.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-input/DateInputRange.cy.tsx @@ -1,13 +1,13 @@ -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type ParserResult, type SaltDateAdapter, } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { DateInputRange, type DateParserField, @@ -77,7 +77,7 @@ function assertDateChange( // assert empty start date expect(adapter.isValid(date.startDate)).to.equal(false); expect(details.startDate.errors).to.deep.equal([ - { type: DateDetailErrorEnum.UNSET, message: "no date defined" }, + { type: DateDetailError.UNSET, message: "no date defined" }, ]); expect(details.startDate).to.have.property( "value", @@ -87,7 +87,7 @@ function assertDateChange( // assert invalid start date expect(adapter.isValid(date.startDate)).to.equal(false); expect(details.startDate.errors).to.deep.equal([ - { type: DateDetailErrorEnum.INVALID_DATE, message: "not a valid date" }, + { type: DateDetailError.INVALID_DATE, message: "not a valid date" }, ]); expect(details.startDate).to.have.property( "value", @@ -105,14 +105,14 @@ function assertDateChange( // assert empty end date expect(adapter.isValid(date.endDate)).to.equal(false); expect(details.endDate.errors).to.deep.equal([ - { type: DateDetailErrorEnum.UNSET, message: "no date defined" }, + { type: DateDetailError.UNSET, message: "no date defined" }, ]); expect(details.endDate).to.have.property("value", expectedValue.endDate); } else if (expectedDate?.endDate === null) { // assert invalid end date expect(adapter.isValid(date.endDate)).to.equal(false); expect(details.endDate.errors).to.deep.equal([ - { type: DateDetailErrorEnum.INVALID_DATE, message: "not a valid date" }, + { type: DateDetailError.INVALID_DATE, message: "not a valid date" }, ]); expect(details.endDate).to.have.property("value", expectedValue.endDate); } @@ -367,7 +367,7 @@ describe("GIVEN a DateInputRange", () => { value: "", errors: [ { - type: DateDetailErrorEnum.UNSET, + type: DateDetailError.UNSET, message: "no date defined", }, ], diff --git a/packages/lab/src/__tests__/__e2e__/date-input/DateInputSingle.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-input/DateInputSingle.cy.tsx index 7b723f82129..de2a7e23b80 100644 --- a/packages/lab/src/__tests__/__e2e__/date-input/DateInputSingle.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-input/DateInputSingle.cy.tsx @@ -1,13 +1,13 @@ import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type ParserResult, type SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { DateInputSingle } from "@salt-ds/lab"; import { es as dateFnsEs } from "date-fns/locale"; @@ -70,16 +70,14 @@ function assertDateChange( // assert empty date expect(adapter.isValid(date)).to.equal(false); expect(details).to.deep.equal({ - errors: [{ type: DateDetailErrorEnum.UNSET, message: "no date defined" }], + errors: [{ type: DateDetailError.UNSET, message: "no date defined" }], value: expectedValue, }); } else if (expectedValidDate === null) { // assert invalid date expect(adapter.isValid(date)).to.equal(false); expect(details).to.deep.equal({ - errors: [ - { type: DateDetailErrorEnum.UNSET, message: "not a valid date" }, - ], + errors: [{ type: DateDetailError.UNSET, message: "not a valid date" }], value: expectedValue, }); } diff --git a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.cy.tsx index ec1d88c6b68..fc4b15aeafc 100644 --- a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.cy.tsx @@ -1,7 +1,7 @@ -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import * as datePickerStories from "@stories/date-picker/date-picker.stories"; import { composeStories } from "@storybook/react"; import { checkAccessibility } from "../../../../../../cypress/tests/checkAccessibility"; diff --git a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.range.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.range.cy.tsx index d9a2be0fb16..ae1e6e15dfa 100644 --- a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.range.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.range.cy.tsx @@ -1,12 +1,12 @@ import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { DatePicker, DatePickerOverlay, @@ -238,7 +238,7 @@ describe("GIVEN a DatePicker where selectionVariant is single", () => { value: "", errors: [ { - type: DateDetailErrorEnum.UNSET, + type: DateDetailError.UNSET, message: "no date defined", }, ], @@ -284,7 +284,7 @@ describe("GIVEN a DatePicker where selectionVariant is single", () => { value: "bad date", errors: [ { - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, message: "not a valid date", }, ], diff --git a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.single.cy.tsx b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.single.cy.tsx index a1368df1f6f..dc689cc5adc 100644 --- a/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.single.cy.tsx +++ b/packages/lab/src/__tests__/__e2e__/date-picker/DatePicker.single.cy.tsx @@ -1,12 +1,12 @@ import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type SaltDateAdapter, } from "@salt-ds/date-adapters"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { DatePicker, DatePickerOverlay, @@ -176,7 +176,7 @@ describe("GIVEN a DatePicker where selectionVariant is single", () => { value: "bad date", errors: [ { - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, message: "not a valid date", }, ], @@ -193,7 +193,7 @@ describe("GIVEN a DatePicker where selectionVariant is single", () => { value: "another bad date 2", errors: [ { - type: DateDetailErrorEnum.INVALID_DATE, + type: DateDetailError.INVALID_DATE, message: "not a valid date", }, ], diff --git a/packages/lab/src/calendar/useCalendarSelection.ts b/packages/lab/src/calendar/useCalendarSelection.ts index 4d776731258..83eadff1d06 100644 --- a/packages/lab/src/calendar/useCalendarSelection.ts +++ b/packages/lab/src/calendar/useCalendarSelection.ts @@ -400,7 +400,7 @@ export function useCalendarSelection( case "single": return ( isSingleSelectionValueType(selectedDate) && - dateAdapter.isSame(selectedDate, date, "day") + dateAdapter.isSame(selectedDate as TDate, date, "day") ); case "multiselect": return ( diff --git a/packages/lab/src/date-picker/DatePickerRangeInput.tsx b/packages/lab/src/date-picker/DatePickerRangeInput.tsx index e0d15bdf664..4a72956979f 100644 --- a/packages/lab/src/date-picker/DatePickerRangeInput.tsx +++ b/packages/lab/src/date-picker/DatePickerRangeInput.tsx @@ -1,6 +1,6 @@ import { Button, makePrefixer, useControlled, useIcon } from "@salt-ds/core"; import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type SaltDateAdapter, } from "@salt-ds/date-adapters"; @@ -55,7 +55,7 @@ export function defaultRangeValidator( details.startDate = details.startDate || {}; details.startDate.errors = details.startDate.errors || []; details.startDate.errors.push({ - type: DateDetailErrorEnum.UNSET, + type: DateDetailError.UNSET, message: "no start date defined", }); } @@ -63,7 +63,7 @@ export function defaultRangeValidator( details.endDate = details.endDate || {}; details.endDate.errors = details.endDate.errors || []; details.endDate.errors.push({ - type: DateDetailErrorEnum.UNSET, + type: DateDetailError.UNSET, message: "no end date defined", }); } diff --git a/packages/lab/src/date-picker/DatePickerSingleInput.tsx b/packages/lab/src/date-picker/DatePickerSingleInput.tsx index ff45d2b880a..a24cd68fd18 100644 --- a/packages/lab/src/date-picker/DatePickerSingleInput.tsx +++ b/packages/lab/src/date-picker/DatePickerSingleInput.tsx @@ -1,6 +1,6 @@ import { Button, makePrefixer, useControlled } from "@salt-ds/core"; import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type SaltDateAdapter, } from "@salt-ds/date-adapters"; @@ -52,7 +52,7 @@ function defaultSingleValidation( if (!date) { details.errors = details.errors ?? []; details.errors?.push({ - type: DateDetailErrorEnum.UNSET, + type: DateDetailError.UNSET, message: "no date defined", }); } else { diff --git a/packages/lab/src/dialog/DialogHeader.css b/packages/lab/src/dialog/DialogHeader.css index 17aeb97d312..a9003cc1d52 100644 --- a/packages/lab/src/dialog/DialogHeader.css +++ b/packages/lab/src/dialog/DialogHeader.css @@ -3,12 +3,14 @@ padding-bottom: var(--salt-spacing-300); padding-left: var(--salt-spacing-300); padding-right: var(--salt-spacing-300); - align-items: center; display: flex; flex-direction: row; gap: var(--salt-spacing-100); box-sizing: border-box; } +.saltDialogHeader-header { + margin: 0; +} .saltDialogHeader-container { flex-grow: 1; @@ -29,6 +31,7 @@ /* Styles applied to the status indicator icon overriding its default size */ .saltDialogHeader .saltStatusIndicator.saltIcon { --icon-size: var(--salt-text-h2-lineHeight); + padding-top: calc((var(--salt-size-base) - var(--salt-text-h2-lineHeight)) / 2); } /* Styles applied to DialogHeader when accent={true} */ diff --git a/packages/lab/src/dialog/DialogHeader.tsx b/packages/lab/src/dialog/DialogHeader.tsx index 6ea6463beff..6b2eb226b7b 100644 --- a/packages/lab/src/dialog/DialogHeader.tsx +++ b/packages/lab/src/dialog/DialogHeader.tsx @@ -1,4 +1,5 @@ import { + H2, StatusIndicator, Text, type ValidationStatus, @@ -82,12 +83,10 @@ export const DialogHeader = forwardRef( > {status && }
-
- {preheader && ( - {preheader} - )} +

+ {preheader && {preheader}} {header} -

+ {description && ( {description} diff --git a/packages/lab/src/overlay/OverlayHeader.css b/packages/lab/src/overlay/OverlayHeader.css index 2a74f8fd5b0..da5e7af7276 100644 --- a/packages/lab/src/overlay/OverlayHeader.css +++ b/packages/lab/src/overlay/OverlayHeader.css @@ -1,7 +1,6 @@ .saltOverlayHeader { padding: var(--salt-spacing-100); width: 100%; - align-items: center; display: flex; flex-direction: row; justify-content: stretch; diff --git a/packages/lab/src/overlay/OverlayHeader.tsx b/packages/lab/src/overlay/OverlayHeader.tsx index 0375929a124..76bb694390f 100644 --- a/packages/lab/src/overlay/OverlayHeader.tsx +++ b/packages/lab/src/overlay/OverlayHeader.tsx @@ -1,4 +1,4 @@ -import { Text, makePrefixer } from "@salt-ds/core"; +import { H2, Text, makePrefixer } from "@salt-ds/core"; import { useComponentCssInjection } from "@salt-ds/styles"; import { useWindow } from "@salt-ds/window"; import { clsx } from "clsx"; @@ -45,12 +45,10 @@ export const OverlayHeader = forwardRef( return (
-
- {preheader && ( - {preheader} - )} +

+ {preheader && {preheader}} {header} -

+ {description && ( {description} diff --git a/packages/lab/src/skip-link/SkipLink.css b/packages/lab/src/skip-link/SkipLink.css index 1193fd89a4b..2f7b3b7b334 100644 --- a/packages/lab/src/skip-link/SkipLink.css +++ b/packages/lab/src/skip-link/SkipLink.css @@ -9,7 +9,9 @@ padding: 0; overflow: hidden; position: absolute; - + display: flex; + align-items: center; + box-sizing: border-box; color: var(--salt-content-primary-foreground); letter-spacing: var(--salt-text-letterSpacing); text-decoration: var(--salt-navigable-textDecoration); @@ -23,7 +25,7 @@ .saltSkipLink:focus { opacity: 1; width: auto; - height: max(var(--salt-size-base), auto); + height: calc(var(--salt-size-base) + var(--salt-spacing-200)); padding: var(--salt-spacing-100) var(--salt-spacing-300); outline: var(--salt-focused-outline); outline-offset: calc(-1 * var(--salt-focused-outlineWidth)); diff --git a/packages/lab/stories/date-picker/date-picker.stories.tsx b/packages/lab/stories/date-picker/date-picker.stories.tsx index 4c2250a969f..c9b10e2043a 100644 --- a/packages/lab/stories/date-picker/date-picker.stories.tsx +++ b/packages/lab/stories/date-picker/date-picker.stories.tsx @@ -12,7 +12,7 @@ import { ToggleButton, } from "@salt-ds/core"; import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type ParserResult, type TimeFields, @@ -1577,7 +1577,7 @@ export const SingleWithCustomParser: StoryFn< date: parsedDate.date, value: inputDate, errors: [ - { type: DateDetailErrorEnum.UNSET, message: "no date provided" }, + { type: DateDetailError.UNSET, message: "no date provided" }, ], }; } @@ -1716,7 +1716,7 @@ export const RangeWithCustomParser: StoryFn< date: parsedDate.date, value: inputDate, errors: [ - { type: DateDetailErrorEnum.UNSET, message: "no date provided" }, + { type: DateDetailError.UNSET, message: "no date provided" }, ], }; } @@ -1797,7 +1797,7 @@ export const SingleWithCustomValidation: StoryFn< if (date && isWeekend(date)) { updatedDetails.errors = updatedDetails?.errors ?? []; updatedDetails.errors?.push({ - type: DateDetailErrorEnum.INVALID_DAY, + type: DateDetailError.INVALID_DAY, message: "date must be a weekday", }); } @@ -1844,7 +1844,7 @@ export const SingleWithCustomValidation: StoryFn< return details; } details.errors = details.errors.map((error) => { - if (error.type === DateDetailErrorEnum.NOT_A_DATE) { + if (error.type === DateDetailError.NOT_A_DATE) { error.message = "valid dates are any weekday"; } return error; diff --git a/packages/lab/stories/dialog/dialog.qa.stories.tsx b/packages/lab/stories/dialog/dialog.qa.stories.tsx index a3a355afe7e..e9b7cc3ecdc 100644 --- a/packages/lab/stories/dialog/dialog.qa.stories.tsx +++ b/packages/lab/stories/dialog/dialog.qa.stories.tsx @@ -1,4 +1,5 @@ -import { Dialog, H2 } from "@salt-ds/core"; +import { Button, Dialog } from "@salt-ds/core"; +import { CloseIcon } from "@salt-ds/icons"; import { DialogHeader } from "@salt-ds/lab"; import type { Meta, StoryFn } from "@storybook/react"; import { QAContainer, type QAContainerProps } from "docs/components"; @@ -11,7 +12,7 @@ export default { export const DialogHeaders: StoryFn = () => ( Terms and conditions} + header="Terms and conditions" style={{ width: 600, }} @@ -20,40 +21,47 @@ export const DialogHeaders: StoryFn = () => ( style={{ width: 600, }} - header={

Terms and conditions

} + header="Terms and conditions" preheader="Ensure you read and agree to these Terms" /> Terms and conditions} + header="Terms and conditions" preheader="Ensure you read and agree to these Terms" description="Effective date: August 29, 2024" /> Terms and conditions} + header="Terms and conditions" style={{ width: 600, }} /> + + + } status="info" style={{ width: 600, }} - header={

Terms and conditions

} - preheader="Ensure you read and agree to these Terms" + header="Terms and conditions" /> + + + } status="info" style={{ width: 600, }} - header={

Terms and conditions

} - preheader="Ensure you read and agree to these Terms" - description="Effective date: August 29, 2024" + header="Complete terms and conditions for using the services provided by our company" />
); diff --git a/packages/lab/stories/dialog/dialog.stories.tsx b/packages/lab/stories/dialog/dialog.stories.tsx index f1aaa1e77be..0ecb88f20aa 100644 --- a/packages/lab/stories/dialog/dialog.stories.tsx +++ b/packages/lab/stories/dialog/dialog.stories.tsx @@ -5,7 +5,6 @@ import { DialogContent, type DialogContentProps, type DialogProps, - H2, SplitLayout, StackLayout, } from "@salt-ds/core"; @@ -24,7 +23,7 @@ export default { component: Dialog, args: { preheader: "Settlements", - header:

Terms and conditions

, + header: "Terms and conditions", description: "Effective date: August 29, 2024", content: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", @@ -145,6 +144,12 @@ export const Default = DialogTemplate.bind({}); Default.args = { id: "Default", }; +export const LongTitle = DialogTemplate.bind({}); +LongTitle.args = { + id: "LongTitle", + header: + "Complete terms and conditions for using the services provided by our company", +}; const AlertDialogTemplate: StoryFn< DialogProps & { header: ReactNode; content: ReactNode } @@ -201,23 +206,23 @@ const AlertDialogTemplate: StoryFn< export const InfoStatus = AlertDialogTemplate.bind({}); InfoStatus.args = { status: "info", - header:

Info

, + header: "Info", }; export const SuccessStatus = AlertDialogTemplate.bind({}); SuccessStatus.args = { status: "success", - header:

Success

, + header: "Success", }; export const WarningStatus = AlertDialogTemplate.bind({}); WarningStatus.args = { status: "warning", - header:

Warning

, + header: "Warning", }; export const ErrorStatus = AlertDialogTemplate.bind({}); ErrorStatus.args = { status: "error", - header:

Error

, + header: "Error", }; diff --git a/packages/lab/stories/overlay/overlay.qa.stories.tsx b/packages/lab/stories/overlay/overlay.qa.stories.tsx index 1c7b5a5a0c4..a0035e0a75b 100644 --- a/packages/lab/stories/overlay/overlay.qa.stories.tsx +++ b/packages/lab/stories/overlay/overlay.qa.stories.tsx @@ -1,6 +1,5 @@ import { Button, - H4, Overlay, OverlayPanel, OverlayPanelContent, @@ -29,8 +28,8 @@ export const Default: StoryFn = (props) => { return ( = (props) => { - + Header block} + header="Guidelines for optimal use of our application" actions={} /> diff --git a/packages/lab/stories/overlay/overlay.stories.tsx b/packages/lab/stories/overlay/overlay.stories.tsx index cf640781114..228a1f2712c 100644 --- a/packages/lab/stories/overlay/overlay.stories.tsx +++ b/packages/lab/stories/overlay/overlay.stories.tsx @@ -1,6 +1,5 @@ import { Button, - H4, Overlay, OverlayPanel, OverlayPanelContent, @@ -9,20 +8,18 @@ import { StackLayout, Text, Tooltip, - useId, } from "@salt-ds/core"; import { CloseIcon } from "@salt-ds/icons"; import { OverlayHeader } from "@salt-ds/lab"; -import type { Meta } from "@storybook/react"; +import type { Meta, StoryFn } from "@storybook/react"; import { useState } from "react"; export default { title: "Lab/Overlay Header", } as Meta; -export const Header = ({ onOpenChange }: OverlayProps) => { +const HeaderTemplate: StoryFn = ({ onOpenChange, ...props }: OverlayProps) => { const [open, setOpen] = useState(false); - const id = useId(); const onChange = (newOpen: boolean) => { setOpen(newOpen); @@ -35,12 +32,11 @@ export const Header = ({ onOpenChange }: OverlayProps) => { - Header block} /> + @@ -62,9 +58,26 @@ export const Header = ({ onOpenChange }: OverlayProps) => { ); }; +export const Header = HeaderTemplate.bind({}); +Header.args = {}; + +export const LongHeader = HeaderTemplate.bind({}); +LongHeader.args = { + header: + "Comprehensive guidelines and detailed instructions for the optimal use and application of our services to ensure maximum efficiency and user satisfaction", + actions: ( + + ), +}; + export const HeaderWithCloseButton = ({ onOpenChange }: OverlayProps) => { const [open, setOpen] = useState(false); - const id = useId(); const onChange = (newOpen: boolean) => { setOpen(newOpen); @@ -90,7 +103,6 @@ export const HeaderWithCloseButton = ({ onOpenChange }: OverlayProps) => { { Header block} + header="Header block" actions={} /> diff --git a/packages/lab/stories/skip-link/skip-link.stories.css b/packages/lab/stories/skip-link/skip-link.stories.css index 5dc4a6cf325..11b17307d3e 100644 --- a/packages/lab/stories/skip-link/skip-link.stories.css +++ b/packages/lab/stories/skip-link/skip-link.stories.css @@ -1,7 +1,7 @@ .app-header { z-index: var(--salt-zIndex-appHeader); } -.header { +.navbar { padding-left: var(--salt-spacing-300); padding-right: var(--salt-spacing-300); background-color: var(--salt-container-primary-background); @@ -17,12 +17,12 @@ margin: calc(var(--salt-spacing-300) * 2) auto; max-width: 700px; } -.content-header { +.header { padding-top: calc(var(--salt-spacing-300) * 2); } .help-text { position: absolute; top: 0; left: 0; - padding: calc(var(--salt-spacing-300) * 2) var(--salt-spacing-100); + padding: calc(var(--salt-spacing-400) * 2) var(--salt-spacing-300); } diff --git a/packages/lab/stories/skip-link/skip-link.stories.tsx b/packages/lab/stories/skip-link/skip-link.stories.tsx index 5fd9c884057..06bcbf44981 100644 --- a/packages/lab/stories/skip-link/skip-link.stories.tsx +++ b/packages/lab/stories/skip-link/skip-link.stories.tsx @@ -8,9 +8,11 @@ import { GridLayout, H1, H2, + H4, NavigationItem, SplitLayout, StackLayout, + Text, } from "@salt-ds/core"; import { GithubIcon, StackoverflowIcon, SymphonyIcon } from "@salt-ds/icons"; import { SkipLink } from "@salt-ds/lab"; @@ -58,8 +60,10 @@ const DefaultStory: StoryFn = (args) => { Skip to main content - - + + +

LOGO

+
diff --git a/site/src/components/callout/Callout.module.css b/site/src/components/callout/Callout.module.css index 35978cda36f..19208de8255 100644 --- a/site/src/components/callout/Callout.module.css +++ b/site/src/components/callout/Callout.module.css @@ -1,23 +1,7 @@ -.callout { - --callout-color: var(--site-tertiary-accent-teal); +.content p:first-child { + margin-top: 0; } -.callout hr { - border: 0; - margin-bottom: var(--salt-size-unit); - margin-top: calc(3 * var(--salt-size-unit)); - background-color: var(--callout-color); - height: 3px; -} - -.title { - color: var(--callout-color); - font-size: var(--salt-text-h4-fontSize); - font-weight: var(--salt-text-h4-fontWeight-strong); - line-height: var(--salt-text-h4-lineHeight); - margin-bottom: var(--salt-size-unit); -} - -.content { - margin-bottom: 1em; +.content p:last-child { + margin-bottom: 0; } diff --git a/site/src/components/callout/Callout.tsx b/site/src/components/callout/Callout.tsx index 78fb1c01f77..7feb5df61c3 100644 --- a/site/src/components/callout/Callout.tsx +++ b/site/src/components/callout/Callout.tsx @@ -1,3 +1,4 @@ +import { Banner, BannerContent, H4, StackLayout, Text } from "@salt-ds/core"; import type { ReactNode } from "react"; import styles from "./Callout.module.css"; @@ -5,10 +6,13 @@ type CalloutProps = { title: string; children: ReactNode }; export const Callout = ({ title, children }: CalloutProps) => { return ( -
-
-

{title}

-
{children}
-
+ + + +

{title}

+ {children} +
+
+
); }; diff --git a/site/src/components/card/Card.module.css b/site/src/components/card/Card.module.css index a748c8c2403..290161193e6 100644 --- a/site/src/components/card/Card.module.css +++ b/site/src/components/card/Card.module.css @@ -73,7 +73,7 @@ } .cardDescription { - color: var(--salt-content-secondary-foreground); + color: var(--salt-content-primary-foreground); } .inlineCardContent { diff --git a/site/src/components/components/LivePreview.tsx b/site/src/components/components/LivePreview.tsx index 1e4520ccef1..d1c08db6e79 100644 --- a/site/src/components/components/LivePreview.tsx +++ b/site/src/components/components/LivePreview.tsx @@ -14,7 +14,7 @@ import useIsMobileView from "../../utils/useIsMobileView"; import { Pre } from "../mdx/pre"; import { useLivePreviewControls } from "./useLivePreviewControls"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; import { LocalizationProvider } from "@salt-ds/lab"; import styles from "./LivePreview.module.css"; diff --git a/site/src/examples/calendar/WithLocale.tsx b/site/src/examples/calendar/WithLocale.tsx index c10bd40a986..81030819829 100644 --- a/site/src/examples/calendar/WithLocale.tsx +++ b/site/src/examples/calendar/WithLocale.tsx @@ -1,4 +1,4 @@ -import { AdapterDateFns } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; import { Calendar, CalendarGrid, diff --git a/site/src/examples/date-picker/SingleWithCustomParser.tsx b/site/src/examples/date-picker/SingleWithCustomParser.tsx index f91accf8f29..c2f6501bbfe 100644 --- a/site/src/examples/date-picker/SingleWithCustomParser.tsx +++ b/site/src/examples/date-picker/SingleWithCustomParser.tsx @@ -4,7 +4,7 @@ import { FormFieldLabel as FormLabel, } from "@salt-ds/core"; import { - DateDetailErrorEnum, + DateDetailError, type DateFrameworkType, type ParserResult, } from "@salt-ds/date-adapters"; @@ -40,7 +40,7 @@ export const SingleWithCustomParser = (): ReactElement => { >(null); const handleSelectionChange = useCallback( ( - event: SyntheticEvent, + _event: SyntheticEvent, date: SingleDateSelection | null, details: DateInputSingleDetails | undefined, ) => { @@ -83,7 +83,7 @@ export const SingleWithCustomParser = (): ReactElement => { date: parsedDate.date, value: inputDate, errors: [ - { type: DateDetailErrorEnum.UNSET, message: "no date provided" }, + { type: DateDetailError.UNSET, message: "no date provided" }, ], }; } diff --git a/site/src/examples/dialog/WithHeader.tsx b/site/src/examples/dialog/WithHeader.tsx index 14e2902a464..413511f99d9 100644 --- a/site/src/examples/dialog/WithHeader.tsx +++ b/site/src/examples/dialog/WithHeader.tsx @@ -3,7 +3,6 @@ import { Dialog, DialogActions, DialogContent, - H2, H3, StackLayout, useId, @@ -44,7 +43,7 @@ export const WithHeader = (): ReactElement => { Terms and conditions} + header="Terms and conditions" description="Effective date: August 29, 2024" actions={closeButton} /> diff --git a/site/src/examples/link/RenderElement.tsx b/site/src/examples/link/RenderElement.tsx new file mode 100644 index 00000000000..a7d02ee1014 --- /dev/null +++ b/site/src/examples/link/RenderElement.tsx @@ -0,0 +1,19 @@ +import { Link, Text } from "@salt-ds/core"; +import type { ReactElement } from "react"; +import styles from "./index.module.css"; + +const CustomLinkImplementation = (props: any) => ( +
+ Your own Link implementation + +); + +export const RenderElement = (): ReactElement => { + return ( + } + /> + ); +}; diff --git a/site/src/examples/link/RenderProp.tsx b/site/src/examples/link/RenderProp.tsx new file mode 100644 index 00000000000..d36a6b20837 --- /dev/null +++ b/site/src/examples/link/RenderProp.tsx @@ -0,0 +1,19 @@ +import { Link, Text } from "@salt-ds/core"; +import type { ReactElement } from "react"; +import styles from "./index.module.css"; + +const CustomLinkImplementation = (props: any) => ( + + Your own Link implementation + +); + +export const RenderProp = (): ReactElement => { + return ( + } + /> + ); +}; diff --git a/site/src/examples/link/index.ts b/site/src/examples/link/index.ts index 8a3cedda73b..cdf3700890c 100644 --- a/site/src/examples/link/index.ts +++ b/site/src/examples/link/index.ts @@ -3,3 +3,5 @@ export * from "./OpenInANewTab"; export * from "./Variant"; export * from "./Color"; export * from "./Visited"; +export * from "./RenderElement"; +export * from "./RenderProp"; diff --git a/site/src/examples/localization-provider/Locale.tsx b/site/src/examples/localization-provider/Locale.tsx index f173748c36e..dba9220f0c2 100644 --- a/site/src/examples/localization-provider/Locale.tsx +++ b/site/src/examples/localization-provider/Locale.tsx @@ -4,6 +4,10 @@ import { RadioButton, RadioButtonGroup, } from "@salt-ds/core"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; +import { AdapterDayjs } from "@salt-ds/date-adapters/dayjs"; +import { AdapterLuxon } from "@salt-ds/date-adapters/luxon"; +import { AdapterMoment } from "@salt-ds/date-adapters/moment"; import { Calendar, CalendarGrid, @@ -13,10 +17,6 @@ import { } from "@salt-ds/lab"; import { type ChangeEventHandler, type ReactElement, useState } from "react"; import "dayjs/locale/en"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; -import { AdapterDayjs } from "@salt-ds/date-adapters"; -import { AdapterLuxon } from "@salt-ds/date-adapters"; -import { AdapterMoment } from "@salt-ds/date-adapters"; import moment from "moment"; import "moment/locale/zh-cn"; // Import the Chinese locale import { enUS as dateFnsEnUs } from "date-fns/locale"; diff --git a/site/src/examples/localization-provider/MinMax.tsx b/site/src/examples/localization-provider/MinMax.tsx index 1751da85710..408e7b67886 100644 --- a/site/src/examples/localization-provider/MinMax.tsx +++ b/site/src/examples/localization-provider/MinMax.tsx @@ -1,5 +1,6 @@ import { FormField, FormFieldHelperText, FormFieldLabel } from "@salt-ds/core"; -import { AdapterDateFns, type DateFrameworkType } from "@salt-ds/date-adapters"; +import type { DateFrameworkType } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; import { Calendar, CalendarGrid, diff --git a/site/src/examples/overlay/WithHeader.tsx b/site/src/examples/overlay/WithHeader.tsx index 4a3b4099956..7d0afa0bcb4 100644 --- a/site/src/examples/overlay/WithHeader.tsx +++ b/site/src/examples/overlay/WithHeader.tsx @@ -4,7 +4,6 @@ import { OverlayPanel, OverlayPanelContent, OverlayTrigger, - useId, } from "@salt-ds/core"; import { CloseIcon } from "@salt-ds/icons"; import { OverlayHeader } from "@salt-ds/lab"; @@ -12,7 +11,6 @@ import { type ReactElement, useState } from "react"; export const WithHeader = (): ReactElement => { const [open, setOpen] = useState(false); - const id = useId(); const onOpenChange = (newOpen: boolean) => setOpen(newOpen); @@ -32,11 +30,8 @@ export const WithHeader = (): ReactElement => { - - Title} - actions={headerActions} - /> + +
Content of Overlay
diff --git a/site/src/examples/skip-link/Default.module.css b/site/src/examples/skip-link/Default.module.css new file mode 100644 index 00000000000..25c511be15e --- /dev/null +++ b/site/src/examples/skip-link/Default.module.css @@ -0,0 +1,32 @@ +.container { + position: relative; +} +.help { + margin-bottom: var(--salt-spacing-400); +} +.navbar { + padding-left: var(--salt-spacing-300); + padding-right: var(--salt-spacing-300); + background-color: var(--salt-container-primary-background); + border-bottom: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-separable-primary-borderColor); +} +.navigation { + display: flex; + list-style: none; + padding: 0; + margin: 0; +} +.center { + margin: auto; + padding: var(--salt-spacing-200); + max-width: 700px; +} +.section { + padding-top: var(--salt-spacing-200); +} +.header { + margin-bottom: var(--salt-spacing-300); +} +.section h2 { + margin-top: calc(var(--salt-spacing-300) + var(--salt-spacing-200)); +} diff --git a/site/src/examples/skip-link/Default.tsx b/site/src/examples/skip-link/Default.tsx new file mode 100644 index 00000000000..4b20a72469f --- /dev/null +++ b/site/src/examples/skip-link/Default.tsx @@ -0,0 +1,95 @@ +import { + BorderItem, + BorderLayout, + Button, + FlexItem, + FlexLayout, + H2, + H4, + NavigationItem, + SplitLayout, + StackLayout, +} from "@salt-ds/core"; +import { ChevronRightIcon, GithubIcon } from "@salt-ds/icons"; +import { SkipLink } from "@salt-ds/lab"; +import type { ReactElement } from "react"; +import { useState } from "react"; +import styles from "./Default.module.css"; + +export const Default = (): ReactElement => { + const headerItems = ["Glossary", "Components", "Patterns"]; + + const [activeHeaderNav, setActiveHeaderNav] = useState(headerItems[0]); + return ( + <> +

+ Click here and press the Tab key to see the Skip Link. +

+ + + Skip to main content + + +

LOGO

+
+ + + + + + +
+
+ + +
+

+ Glossary +

+

Characteristics

+

+ A Salt characteristic refers to a design token that aligns with + a holistic semantic used throughout the design language. +

+

Components

+

+ Salt components serve as foundational building blocks as well as + representing design primitives. Users of Salt can design and + implement their own patterns within their own scope. For a full + list of foundational components, refer to the component + documentation. +

+
+ + see all glossary terms + + } + /> +
+
+
+ + ); +}; diff --git a/site/src/examples/skip-link/index.ts b/site/src/examples/skip-link/index.ts new file mode 100644 index 00000000000..cb755ece901 --- /dev/null +++ b/site/src/examples/skip-link/index.ts @@ -0,0 +1 @@ +export * from "./Default"; diff --git a/site/src/pages/_app.tsx b/site/src/pages/_app.tsx index 9b9dbd66d75..0ae007c77eb 100755 --- a/site/src/pages/_app.tsx +++ b/site/src/pages/_app.tsx @@ -25,7 +25,7 @@ import { SaltProviderNext, useCurrentBreakpoint, } from "@salt-ds/core"; -import { AdapterDateFns } from "@salt-ds/date-adapters"; +import { AdapterDateFns } from "@salt-ds/date-adapters/date-fns"; import { LocalizationProvider } from "@salt-ds/lab"; import clsx from "clsx"; import { SessionProvider } from "next-auth/react"; diff --git a/site/tsconfig.json b/site/tsconfig.json index 0d49d55a27a..2cb4802ccb3 100644 --- a/site/tsconfig.json +++ b/site/tsconfig.json @@ -3,7 +3,12 @@ "compilerOptions": { "baseUrl": ".", "jsx": "preserve", - "incremental": true + "incremental": true, + "paths": { + "@salt-ds/date-adapters/*": [ + "../packages/date-adapters/src/*-adapter/index.ts" + ] + } }, "include": ["src/**/*", "globals.d.ts"], "exclude": ["node_modules"] diff --git a/tsconfig.json b/tsconfig.json index 3b48ae806c5..036ddfea8b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,6 +27,9 @@ "packages/icons/stories/*", "packages/lab/stories/*", "packages/theme/stories/*" + ], + "@salt-ds/date-adapters/*": [ + "./packages/date-adapters/src/*-adapter/index.ts" ] }, "types": ["cypress", "@testing-library/cypress", "node"] diff --git a/vite.config.ts b/vite.config.ts index f25730da82c..b64743b8084 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,8 @@ +import tsconfigPaths from "vite-tsconfig-paths"; import { defineConfig } from "vitest/config"; export default defineConfig({ + plugins: [tsconfigPaths() as any], test: { include: ["**/*.spec.[jt]s?(x)"], }, diff --git a/yarn.lock b/yarn.lock index 275e1a39e13..d949e0b89b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3385,7 +3385,7 @@ __metadata: vite: "npm:^6.0.0" vite-plugin-istanbul: "npm:^6.0.0" vite-tsconfig-paths: "npm:^4.2.0" - vitest: "npm:^2.0.0" + vitest: "npm:^3.0.0" yup: "npm:^1.0.2" languageName: unknown linkType: soft @@ -5592,35 +5592,34 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/expect@npm:2.1.1" +"@vitest/expect@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/expect@npm:3.0.1" dependencies: - "@vitest/spy": "npm:2.1.1" - "@vitest/utils": "npm:2.1.1" - chai: "npm:^5.1.1" - tinyrainbow: "npm:^1.2.0" - checksum: 10/ece8d7f9e0c083c5cf30c0df9e052bba4402649736293a18e56a8db4be46a847b18dc7b33cdd1c08bea51bf6f2cb021e40e7227d9cfc24fdba4a955bffe371a2 + "@vitest/spy": "npm:3.0.1" + "@vitest/utils": "npm:3.0.1" + chai: "npm:^5.1.2" + tinyrainbow: "npm:^2.0.0" + checksum: 10/5f87921b5893c084aaed5d7f4e7fdfba16aa6eddb8594808368ffa8732ab7c5d103f7e431a7927168cdcf78c0acda35290ca81766fa8852c6269ee58191e385d languageName: node linkType: hard -"@vitest/mocker@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/mocker@npm:2.1.1" +"@vitest/mocker@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/mocker@npm:3.0.1" dependencies: - "@vitest/spy": "npm:^2.1.0-beta.1" + "@vitest/spy": "npm:3.0.1" estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.11" + magic-string: "npm:^0.30.17" peerDependencies: - "@vitest/spy": 2.1.1 - msw: ^2.3.5 - vite: ^5.0.0 + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - checksum: 10/4fbdaac36e3f603235b131e25d9e561381bd989a34e49522e16652077021532ae6653907b47bbca93c14ae4629e3e6a8f61438e3812620dc5654b61595b45208 + checksum: 10/8f93053573a1c1da5518a621c7ea27eff8c5e4ab70e57ef087ef47c005f928e85198ec71625f2f0369d7777b1ad0a353659cd4bb5a4feb1437e2ff78c45ee216 languageName: node linkType: hard @@ -5633,42 +5632,42 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/pretty-format@npm:2.1.1" +"@vitest/pretty-format@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/pretty-format@npm:2.1.5" dependencies: tinyrainbow: "npm:^1.2.0" - checksum: 10/744278a3a91d080e51a94b03eaf7cf43779978d6391060cbfdda6d03194eef744ce8f12a2fe2fa90a9bf9b9f038d4c4c4d88f6192f042c88c5ee4125f38bf892 + checksum: 10/98bf4e20c0efb893ffb2fe7713f84ccafd362d5022222ce097aab2368c2b0eccf3578d7ef4c26ea2f3d52e3c95f5fc7185ba36d7475d95537aab31ec4ac55d3a languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.5, @vitest/pretty-format@npm:^2.1.1": - version: 2.1.5 - resolution: "@vitest/pretty-format@npm:2.1.5" +"@vitest/pretty-format@npm:3.0.1, @vitest/pretty-format@npm:^3.0.1": + version: 3.0.1 + resolution: "@vitest/pretty-format@npm:3.0.1" dependencies: - tinyrainbow: "npm:^1.2.0" - checksum: 10/98bf4e20c0efb893ffb2fe7713f84ccafd362d5022222ce097aab2368c2b0eccf3578d7ef4c26ea2f3d52e3c95f5fc7185ba36d7475d95537aab31ec4ac55d3a + tinyrainbow: "npm:^2.0.0" + checksum: 10/d7ebb42a25ba49a8546be6ac1526953b96e660e3d93ad87539fdd994c560c1f6d1ed12691e13e15a9ff0e8f03a391ec70fde1e594245c616ea22f75e7fbe9abd languageName: node linkType: hard -"@vitest/runner@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/runner@npm:2.1.1" +"@vitest/runner@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/runner@npm:3.0.1" dependencies: - "@vitest/utils": "npm:2.1.1" - pathe: "npm:^1.1.2" - checksum: 10/cf13a2f0bebb494484e60614ff0e7cab06f4310b36c96fe311035ab2eec9cbc057fa5702e904d43e8976fb2214fe550286ceb0b3dc1c72081e23eb1b1f8fa193 + "@vitest/utils": "npm:3.0.1" + pathe: "npm:^2.0.1" + checksum: 10/936e448153e7d81cf794044bdf91cad93773eef959ff97691895d9ff6629fa12d68aed7427e4d603086b2727be4c1cbce5a8c5a9a0dd23f068e4876729c16d8b languageName: node linkType: hard -"@vitest/snapshot@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/snapshot@npm:2.1.1" +"@vitest/snapshot@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/snapshot@npm:3.0.1" dependencies: - "@vitest/pretty-format": "npm:2.1.1" - magic-string: "npm:^0.30.11" - pathe: "npm:^1.1.2" - checksum: 10/820f429d950cf63316464e7f2bc1f0ba4b7d2691c51f6ad03ba1c6edc7dbdc6a86b017c082f2a519b743ae53880b41366bbb596c8b43cf8cd68032f9433ec844 + "@vitest/pretty-format": "npm:3.0.1" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.1" + checksum: 10/6032cb4a192dbb484e3017222679669ca753d2f52f20186e23ce11a673c5ba818539305af2d92752241b3901251bc07dbd7a1739b3c46ad7eda1feea2535abbe languageName: node linkType: hard @@ -5681,12 +5680,12 @@ __metadata: languageName: node linkType: hard -"@vitest/spy@npm:2.1.1, @vitest/spy@npm:^2.1.0-beta.1": - version: 2.1.1 - resolution: "@vitest/spy@npm:2.1.1" +"@vitest/spy@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/spy@npm:3.0.1" dependencies: - tinyspy: "npm:^3.0.0" - checksum: 10/47e83b4a3d091c4fdc2fbf861ccf2df697d3446a6c69d384b168f9c3e0fa1cabec03e52cc8bec1909735969176ac6272cc4dee8dda945ff059183a5c4568a488 + tinyspy: "npm:^3.0.2" + checksum: 10/c977743587be0c1317c1348042302db01e1c7e6e5ef5d703e2f3535c2e57b86bf369198bf5a09c7da246352453e0ea94fc751f580bc599dca58f2f23e34c12da languageName: node linkType: hard @@ -5702,14 +5701,14 @@ __metadata: languageName: node linkType: hard -"@vitest/utils@npm:2.1.1": - version: 2.1.1 - resolution: "@vitest/utils@npm:2.1.1" +"@vitest/utils@npm:3.0.1": + version: 3.0.1 + resolution: "@vitest/utils@npm:3.0.1" dependencies: - "@vitest/pretty-format": "npm:2.1.1" - loupe: "npm:^3.1.1" - tinyrainbow: "npm:^1.2.0" - checksum: 10/605f1807c343ac01cde053b062bda8f0cc51b321a3cd9c751424a1e24549a35120896bd58612a14f068460242013f69e08fc0a69355387e981a5a50bce9ae04e + "@vitest/pretty-format": "npm:3.0.1" + loupe: "npm:^3.1.2" + tinyrainbow: "npm:^2.0.0" + checksum: 10/daf07927a645797ea6796fa71f0d95b07880674289197b78848ec369117d7480c4ddf723516d122f0d18496a7fbe6ea3f866e3d136dd7121c0a1b26a780782a5 languageName: node linkType: hard @@ -6579,16 +6578,16 @@ __metadata: languageName: node linkType: hard -"chai@npm:^5.1.1": - version: 5.1.1 - resolution: "chai@npm:5.1.1" +"chai@npm:^5.1.1, chai@npm:^5.1.2": + version: 5.1.2 + resolution: "chai@npm:5.1.2" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10/ee67279a5613bd36dc1dc13660042429ae2f1dc5a9030a6abcf381345866dfb5bce7bc10b9d74c8de86b6f656489f654bbbef3f3361e06925591e6a00c72afff + checksum: 10/e8c2bbc83cb5a2f87130d93056d4cfbbe04106e12aa798b504816dbe3fa538a9f68541b472e56cbf0f54558b501d7e31867d74b8218abcd5a8cc8ba536fba46c languageName: node linkType: hard @@ -7855,7 +7854,19 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.7, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.3.6": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + +"debug@npm:4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -8396,10 +8407,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.3.1": - version: 1.5.4 - resolution: "es-module-lexer@npm:1.5.4" - checksum: 10/f29c7c97a58eb17640dcbd71bd6ef754ad4f58f95c3073894573d29dae2cad43ecd2060d97ed5b866dfb7804d5590fb7de1d2c5339a5fceae8bd60b580387fc5 +"es-module-lexer@npm:^1.3.1, es-module-lexer@npm:^1.6.0": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10/807ee7020cc46a9c970c78cad1f2f3fc139877e5ebad7f66dbfbb124d451189ba1c48c1c632bd5f8ce1b8af2caef3fca340ba044a410fa890d17b080a59024bb languageName: node linkType: hard @@ -8741,6 +8752,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 10/05fca80ddc7d493a89361f783c6b000750fa04a8226bc24701f3b90adb0efc2fb467f2a0baaed4015a02d8b9034ef5bb87521df9dba980f50b1105bd596ef833 + languageName: node + linkType: hard + "expiry-map@npm:^2.0.0": version: 2.0.0 resolution: "expiry-map@npm:2.0.0" @@ -11293,12 +11311,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.11, magic-string@npm:^0.30.3": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.3": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10/b784d2240252f5b1e755d487354ada4c672cbca16f045144f7185a75b059210e5fcca7be7be03ef1bac2ca754c4428b21d36ae64a9057ba429916f06b8c54eb2 + checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa languageName: node linkType: hard @@ -13622,10 +13640,10 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 +"pathe@npm:^2.0.1": + version: 2.0.1 + resolution: "pathe@npm:2.0.1" + checksum: 10/f6b628b28b228a1960b30c969d8cdc989c0f7041af3904ce794f050b60846c6b599e72e6a491012b4f414c3c441a9adfc1be66ad5d51633ae42793d29e2f03d5 languageName: node linkType: hard @@ -14199,7 +14217,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.32, postcss@npm:^8.4.43, postcss@npm:^8.4.49": +"postcss@npm:^8.4.32, postcss@npm:^8.4.49": version: 8.4.49 resolution: "postcss@npm:8.4.49" dependencies: @@ -15527,7 +15545,7 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.20.0, rollup@npm:^4.23.0, rollup@npm:^4.24.2": +"rollup@npm:^4.23.0, rollup@npm:^4.24.2": version: 4.28.1 resolution: "rollup@npm:4.28.1" dependencies: @@ -16117,10 +16135,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 +"std-env@npm:^3.8.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 languageName: node linkType: hard @@ -16760,17 +16778,17 @@ __metadata: languageName: node linkType: hard -"tinyexec@npm:^0.3.0": - version: 0.3.0 - resolution: "tinyexec@npm:0.3.0" - checksum: 10/317cc536d091ce7e50271287798d91ef53c4dc80088844d890752a2c7387d213004cba83e5e1d9129390ced617625e34f4a8f0ba5779e31c9b6939f9be0d3543 +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10/b9d5fed3166fb1acd1e7f9a89afcd97ccbe18b9c1af0278e429455f6976d69271ba2d21797e7c36d57d6b05025e525d2882d88c2ab435b60d1ddf2fea361de57 languageName: node linkType: hard -"tinypool@npm:^1.0.0": - version: 1.0.1 - resolution: "tinypool@npm:1.0.1" - checksum: 10/eaceb93784b8e27e60c0e3e2c7d11c29e1e79b2a025b2c232215db73b90fe22bd4753ad53fc8e801c2b5a63b94a823af549555d8361272bc98271de7dd4a9925 +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10/6109322f14b3763f65c8fa49fddab72cd3edd96b82dd50e05e63de74867329ff5353bff4377281ec963213d9314f37f4a353e9ee34bbac85fd4c1e4a568d6076 languageName: node linkType: hard @@ -16781,7 +16799,14 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.0": +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10/94d4e16246972614a5601eeb169ba94f1d49752426312d3cf8cc4f2cc663a2e354ffc653aa4de4eebccbf9eeebdd0caef52d1150271fdfde65d7ae7f3dcb9eb5 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.0, tinyspy@npm:^3.0.2": version: 3.0.2 resolution: "tinyspy@npm:3.0.2" checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 @@ -17639,17 +17664,18 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:2.1.1": - version: 2.1.1 - resolution: "vite-node@npm:2.1.1" +"vite-node@npm:3.0.1": + version: 3.0.1 + resolution: "vite-node@npm:3.0.1" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.6" - pathe: "npm:^1.1.2" - vite: "npm:^5.0.0" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.1" + vite: "npm:^5.0.0 || ^6.0.0" bin: vite-node: vite-node.mjs - checksum: 10/c21892b560cad87414ef774d7e53b207e8d66b511b7ef085940fd2f2160d8f6c42dfa9af2ef5465e775b767fc3312ec5b3418b898041f592b8e0b093b4b7110a + checksum: 10/9b54f6748781b3f1530b18351ba531d481c477d8868d455a100ad32a65b9650fdae0f13efdec0e9f2411394d24456868a9e960f2963ae7a9c91e15ec34141755 languageName: node linkType: hard @@ -17695,54 +17721,11 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0": - version: 5.4.7 - resolution: "vite@npm:5.4.7" - dependencies: - esbuild: "npm:^0.21.3" - fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.43" - rollup: "npm:^4.20.0" - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 10/3f27e870930ad83b51e009604c6b69ab090e69bb5bfe85007c7e4ec3326efae4e33ac799645926363f258595b3be3055cc1ebc5ee158cff4bacdf41adf4ef8ed - languageName: node - linkType: hard - -"vite@npm:^6.0.0": - version: 6.0.3 - resolution: "vite@npm:6.0.3" +"vite@npm:^5.0.0 || ^6.0.0, vite@npm:^6.0.0": + version: 6.0.7 + resolution: "vite@npm:6.0.7" dependencies: - esbuild: "npm:^0.24.0" + esbuild: "npm:^0.24.2" fsevents: "npm:~2.3.3" postcss: "npm:^8.4.49" rollup: "npm:^4.23.0" @@ -17786,38 +17769,39 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/eca0949b8cbc887e78977515d8fc22eaa2d03425d60a0a422f2db1da9d26bd1b431b2815a273c798e8e3fe176a99e105c3d87b0ba615ca19b8bf19e0334d807a + checksum: 10/bf76b3647983cb3d76c0db90d1f72cd4f6e80864a112145405ac0046cedfb14814cc4d9c1acbd9c53da8749c3a2fa80570971f7c44c0524b71974981065e9388 languageName: node linkType: hard -"vitest@npm:^2.0.0": - version: 2.1.1 - resolution: "vitest@npm:2.1.1" - dependencies: - "@vitest/expect": "npm:2.1.1" - "@vitest/mocker": "npm:2.1.1" - "@vitest/pretty-format": "npm:^2.1.1" - "@vitest/runner": "npm:2.1.1" - "@vitest/snapshot": "npm:2.1.1" - "@vitest/spy": "npm:2.1.1" - "@vitest/utils": "npm:2.1.1" - chai: "npm:^5.1.1" - debug: "npm:^4.3.6" - magic-string: "npm:^0.30.11" - pathe: "npm:^1.1.2" - std-env: "npm:^3.7.0" +"vitest@npm:^3.0.0": + version: 3.0.1 + resolution: "vitest@npm:3.0.1" + dependencies: + "@vitest/expect": "npm:3.0.1" + "@vitest/mocker": "npm:3.0.1" + "@vitest/pretty-format": "npm:^3.0.1" + "@vitest/runner": "npm:3.0.1" + "@vitest/snapshot": "npm:3.0.1" + "@vitest/spy": "npm:3.0.1" + "@vitest/utils": "npm:3.0.1" + chai: "npm:^5.1.2" + debug: "npm:^4.4.0" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.1" + std-env: "npm:^3.8.0" tinybench: "npm:^2.9.0" - tinyexec: "npm:^0.3.0" - tinypool: "npm:^1.0.0" - tinyrainbow: "npm:^1.2.0" - vite: "npm:^5.0.0" - vite-node: "npm:2.1.1" + tinyexec: "npm:^0.3.2" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.0.1" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" - "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.1.1 - "@vitest/ui": 2.1.1 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.1 + "@vitest/ui": 3.0.1 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -17835,7 +17819,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/5bbbc7298a043c7ca0914817a2c30e18af5a1619f4a750d36056f64f4d907a1fad50b8bab93aaf39f8174eb475108c9287f6e226e24d3a3ccd6f0b71d3f56438 + checksum: 10/7a58579ccbaea4303f9fb02f2bcf6601b2c752ecdff8de86c1d8db7b1ce6d546a6ba628c434ceb97caf0653be391044cfe97a258835f630e062fc47a72f74f22 languageName: node linkType: hard