diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx
index 2fe3c70..09ea840 100644
--- a/.storybook/preview.tsx
+++ b/.storybook/preview.tsx
@@ -14,9 +14,14 @@ import React from "react";
import type { Features } from "../src/services/features";
+import { FeaturesContext } from "../src/contexts/Features";
import "../src/global-type-overrides";
import "../src/index.css";
-import { FeaturesContext } from "../src/contexts/Features";
+import {
+ $userSettings,
+ clearAllSettings,
+ type UserSettings,
+} from "../src/stores/settings";
/**
* Decorator that provides feature flags to stories
@@ -77,6 +82,22 @@ export const withThemeProvider: Decorator = (StoryFn) => (
);
+/**
+ * Decorator that sets user settings for stories
+ * Can be overridden per story using parameters.settings
+ */
+export const withSettings: Decorator = (StoryFn, context) => {
+ const settings = context.parameters?.settings;
+
+ if (settings) {
+ $userSettings.set(settings);
+ } else {
+ clearAllSettings();
+ }
+
+ return ;
+};
+
// Define parameter types
declare module "@storybook/react-vite" {
interface Parameters {
@@ -86,12 +107,14 @@ declare module "@storybook/react-vite" {
initialIndex?: number;
routes?: string[];
};
+ settings?: UserSettings;
}
}
const preview: Preview = {
decorators: [
withFeatures,
+ withSettings,
withRouter,
withThemeByClassName({
defaultTheme: "light",
diff --git a/package-lock.json b/package-lock.json
index 16effb4..76bb383 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,15 +29,15 @@
"zod": "^4.1.13"
},
"devDependencies": {
- "@chromatic-com/storybook": "^4.1.3",
+ "@chromatic-com/storybook": "^5.0.0",
"@eslint/css": "^0.14.1",
"@eslint/js": "^9.39.2",
"@faker-js/faker": "^10.1.0",
- "@storybook/addon-docs": "^10.1.4",
- "@storybook/addon-links": "^10.1.4",
- "@storybook/addon-onboarding": "^10.1.4",
- "@storybook/addon-themes": "^10.1.4",
- "@storybook/react-vite": "^10.1.4",
+ "@storybook/addon-docs": "^10.1.11",
+ "@storybook/addon-links": "^10.1.11",
+ "@storybook/addon-onboarding": "^10.1.11",
+ "@storybook/addon-themes": "^10.1.11",
+ "@storybook/react-vite": "^10.1.11",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/eslint-plugin-query": "^5.91.2",
@@ -63,7 +63,7 @@
"jsdom": "^27.3.0",
"prettier": "^3.7.4",
"prettier-plugin-tailwindcss": "^0.7.2",
- "storybook": "^10.1.10",
+ "storybook": "^10.1.11",
"tailwind-csstree": "^0.1.0",
"tailwindcss": "^4.1.8",
"typescript": "^5.9.3",
@@ -580,14 +580,14 @@
}
},
"node_modules/@chromatic-com/storybook": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.1.3.tgz",
- "integrity": "sha512-hc0HO9GAV9pxqDE6fTVOV5KeLpTiCfV8Jrpk5ogKLiIgeq2C+NPjpt74YnrZTjiK8E19fYcMP+2WY9ZtX7zHmw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.0.0.tgz",
+ "integrity": "sha512-8wUsqL8kg6R5ue8XNE7Jv/iD1SuE4+6EXMIGIuE+T2loBITEACLfC3V8W44NJviCLusZRMWbzICddz0nU0bFaw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@neoconfetti/react": "^1.0.0",
- "chromatic": "^13.3.3",
+ "chromatic": "^13.3.4",
"filesize": "^10.0.12",
"jsonfile": "^6.1.0",
"strip-ansi": "^7.1.0"
@@ -597,7 +597,7 @@
"yarn": ">=1.22.18"
},
"peerDependencies": {
- "storybook": "^0.0.0-0 || ^9.0.0 || ^9.1.0-0 || ^9.2.0-0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0"
+ "storybook": "^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0"
}
},
"node_modules/@csstools/color-helpers": {
@@ -1575,11 +1575,35 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
@@ -1593,13 +1617,13 @@
}
},
"node_modules/@joshwooding/vite-plugin-react-docgen-typescript": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz",
- "integrity": "sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==",
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.3.tgz",
+ "integrity": "sha512-9TGZuAX+liGkNKkwuo3FYJu7gHWT0vkBcf7GkOe7s7fmC19XwH/4u5u7sDIFrMooe558ORcmuBvBz7Ur5PlbHw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "glob": "^10.0.0",
- "magic-string": "^0.30.0",
+ "glob": "^11.1.0",
"react-docgen-typescript": "^2.2.2"
},
"peerDependencies": {
@@ -1723,16 +1747,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/@react-aria/focus": {
"version": "3.20.3",
"resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.3.tgz",
@@ -2175,16 +2189,16 @@
"license": "MIT"
},
"node_modules/@storybook/addon-docs": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.4.tgz",
- "integrity": "sha512-TWLDJNLS/S3AUyTf9x0Hb8k7d+VWMJCH9dWAS0QenvJG8ga9VaehO6r+e+3YyIDbO1ev3UST3GCjh9SY8tzwRA==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.11.tgz",
+ "integrity": "sha512-Jwm291Fhim2eVcZIVlkG1B2skb0ZI9oru6nqMbJxceQZlvZmcIa4oxvS1oaMTKw2DJnCv97gLm57P/YvRZ8eUg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@mdx-js/react": "^3.0.0",
- "@storybook/csf-plugin": "10.1.4",
+ "@storybook/csf-plugin": "10.1.11",
"@storybook/icons": "^2.0.0",
- "@storybook/react-dom-shim": "10.1.4",
+ "@storybook/react-dom-shim": "10.1.11",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"ts-dedent": "^2.0.0"
@@ -2194,13 +2208,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^10.1.4"
+ "storybook": "^10.1.11"
}
},
"node_modules/@storybook/addon-links": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.1.4.tgz",
- "integrity": "sha512-GQplzQFYhClraxH1cQDhhiJAuqAlI2loJjcnLjayS9/O2XJfEPyHc0fjkTh83zhF/nIQ6iMpFgpCsrThRUL4ag==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.1.11.tgz",
+ "integrity": "sha512-PEC+Fn3fyBOlMlCcLX+AUunrQMcH7MEfiFtPkp7QnjfMGwBIyzCjgVxM2OyKyIslQnB1So1pY98uTI26fXz/yg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2212,7 +2226,7 @@
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "storybook": "^10.1.4"
+ "storybook": "^10.1.11"
},
"peerDependenciesMeta": {
"react": {
@@ -2221,9 +2235,9 @@
}
},
"node_modules/@storybook/addon-onboarding": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.1.4.tgz",
- "integrity": "sha512-UdjkuPL9R+sbnkc9xvDKL68r/30jzFXbhtxbRp5MrmT+dFXvBSi0sHChiWUk/sDf142KpcDswv0r21mxdr6F8w==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.1.11.tgz",
+ "integrity": "sha512-DNJv0IDl5XBrY+PPgwnMXLyp3omPkMOS6xe8ejG3csT71B6+3VueL6m7Qivh6739SnAV0QBU5SQlpMA0gQUcSA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2231,13 +2245,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^10.1.4"
+ "storybook": "^10.1.11"
}
},
"node_modules/@storybook/addon-themes": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.1.4.tgz",
- "integrity": "sha512-KQR+GAQ9X+eZOWhALuGvAFeLexlGdZcf7c2nBiLLPbTuPzcIl/ifTN4cZ0LqmGeXI/bfLCjTeqbk+B0E/IHZ5g==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.1.11.tgz",
+ "integrity": "sha512-tUX5C1ms+W4GFK8UBWd3Fq4irkLc3h092BqW90tZghcoOmGY/sfKR+PlcLhoaTs/kkHQSSHPrz8HSFR1AXVbHA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2248,17 +2262,17 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^10.1.4"
+ "storybook": "^10.1.11"
}
},
"node_modules/@storybook/builder-vite": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.4.tgz",
- "integrity": "sha512-3mUQoCzMuhqAIjj8fdbGlwh+GgHaFpCvU+sxL8kIxnZqflW09SuwM5kS47Y5QDzYbHAPYCPqcBFyJ4EfRuf0rw==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.11.tgz",
+ "integrity": "sha512-MMD09Ap7FyzDfWG961pkIMv/w684XXe1bBEi+wCEpHxvrgAd3j3A9w/Rqp9Am2uRDPCEdi1QgSzS3SGW3aGThQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/csf-plugin": "10.1.4",
+ "@storybook/csf-plugin": "10.1.11",
"@vitest/mocker": "3.2.4",
"ts-dedent": "^2.0.0"
},
@@ -2267,14 +2281,14 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "storybook": "^10.1.4",
+ "storybook": "^10.1.11",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/@storybook/csf-plugin": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.4.tgz",
- "integrity": "sha512-nudIBYx8fBz+1j2Xn1pdfGcgMJ78N/1NFB4MYAxI3YEzxGnQwUjihOO1x3siAXPbjFGmnVHoBx7+6IpO3F70GA==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.11.tgz",
+ "integrity": "sha512-Ant0NhgqHKzQsseeVTSetZCuDHHs0W2HRkHt51Kg/sUl0T/sDtfVA+fWZT8nGzGZqYSFkxqYPWjauPmIhPtaRw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2287,7 +2301,7 @@
"peerDependencies": {
"esbuild": "*",
"rollup": "*",
- "storybook": "^10.1.4",
+ "storybook": "^10.1.11",
"vite": "*",
"webpack": "*"
},
@@ -2324,14 +2338,14 @@
}
},
"node_modules/@storybook/react": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.4.tgz",
- "integrity": "sha512-ZBMPdQ99QBv/UtlIZBerDGNsQB30ffxk6twe45FIPutSlKXD6W9r0z7rGa5UWnqmmxa9HjARRhclOFsNGkhs9g==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.11.tgz",
+ "integrity": "sha512-rmMGmEwBaM2YpB8oDk2moM0MNjNMqtwyoPPZxjyruY9WVhYca8EDPGKEdRzUlb4qZJsTgLi7VU4eqg6LD/mL3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
- "@storybook/react-dom-shim": "10.1.4",
+ "@storybook/react-dom-shim": "10.1.11",
"react-docgen": "^8.0.2"
},
"funding": {
@@ -2341,7 +2355,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "storybook": "^10.1.4",
+ "storybook": "^10.1.11",
"typescript": ">= 4.9.x"
},
"peerDependenciesMeta": {
@@ -2351,9 +2365,9 @@
}
},
"node_modules/@storybook/react-dom-shim": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.4.tgz",
- "integrity": "sha512-PARu2HA5nYU1AkioNJNc430pz0oyaHFSSAdN3NEaWwkoGrCOo9ZpAXP9V7wlJANCi1pndbC84gSuHVnBXJBG6g==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.11.tgz",
+ "integrity": "sha512-o8WPhRlZbORUWG9lAgDgJP0pi905VHJUFJr1Kp8980gHqtlemtnzjPxKy5vFwj6glNhAlK8SS8OOYzWP7hloTQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2363,20 +2377,20 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "storybook": "^10.1.4"
+ "storybook": "^10.1.11"
}
},
"node_modules/@storybook/react-vite": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.4.tgz",
- "integrity": "sha512-PneYbxBGArczDtDAvQu6Ug5oeDYM5SQiEDSF0i+TNN0ZKO2ROsmbGSI9/7YTFontXR2CqweIO8GyOGQOcz5K9A==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.11.tgz",
+ "integrity": "sha512-qh1BCD25nIoiDfqwha+qBkl7pcG4WuzM+c8tsE63YEm8AFIbNKg5K8lVUoclF+4CpFz7IwBpWe61YUTDfp+91w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@joshwooding/vite-plugin-react-docgen-typescript": "0.6.1",
+ "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.3",
"@rollup/pluginutils": "^5.0.2",
- "@storybook/builder-vite": "10.1.4",
- "@storybook/react": "10.1.4",
+ "@storybook/builder-vite": "10.1.11",
+ "@storybook/react": "10.1.11",
"empathic": "^2.0.0",
"magic-string": "^0.30.0",
"react-docgen": "^8.0.0",
@@ -2390,7 +2404,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "storybook": "^10.1.4",
+ "storybook": "^10.1.11",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
@@ -3516,6 +3530,7 @@
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
@@ -3525,10 +3540,11 @@
}
},
"node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
}
@@ -3538,6 +3554,7 @@
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
@@ -3989,6 +4006,7 @@
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
"integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@vitest/spy": "3.2.4",
"estree-walker": "^3.0.3",
@@ -4015,6 +4033,7 @@
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0"
}
@@ -4237,10 +4256,11 @@
}
},
"node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -5096,7 +5116,8 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.178",
@@ -5108,7 +5129,8 @@
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/empathic": {
"version": "2.0.0",
@@ -5684,6 +5706,7 @@
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
@@ -5714,6 +5737,7 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -5749,22 +5773,25 @@
}
},
"node_modules/glob": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
- "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
+ "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
+ "foreground-child": "^3.3.1",
+ "jackspeak": "^4.1.1",
+ "minimatch": "^10.1.1",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
+ "path-scurry": "^2.0.0"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
+ "engines": {
+ "node": "20 || >=22"
+ },
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
@@ -5781,6 +5808,22 @@
"node": ">=10.13.0"
}
},
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/globals": {
"version": "16.5.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
@@ -5829,6 +5872,7 @@
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -6092,18 +6136,19 @@
"dev": true
},
"node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz",
+ "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
+ "engines": {
+ "node": "20 || >=22"
+ },
"funding": {
"url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jiti": {
@@ -6841,7 +6886,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
- "dev": true
+ "dev": true,
+ "license": "BlueOak-1.0.0"
},
"node_modules/parent-module": {
"version": "1.0.1",
@@ -6895,26 +6941,31 @@
"license": "MIT"
},
"node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=16 || 14 >=14.18"
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true
+ "version": "11.2.4",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
+ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
},
"node_modules/pathe": {
"version": "2.0.3",
@@ -7199,6 +7250,7 @@
"resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz",
"integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"typescript": ">= 4.3.x"
}
@@ -7333,13 +7385,13 @@
}
},
"node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-core-module": "^2.16.0",
+ "is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -7537,6 +7589,7 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": ">=14"
},
@@ -7628,9 +7681,9 @@
"license": "MIT"
},
"node_modules/storybook": {
- "version": "10.1.10",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.10.tgz",
- "integrity": "sha512-oK0t0jEogiKKfv5Z1ao4Of99+xWw1TMUGuGRYDQS4kp2yyBsJQEgu7NI7OLYsCDI6gzt5p3RPtl1lqdeVLUi8A==",
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.11.tgz",
+ "integrity": "sha512-pKP5jXJYM4OjvNklGuHKO53wOCAwfx79KvZyOWHoi9zXUH5WVMFUe/ZfWyxXG/GTcj0maRgHGUjq/0I43r0dDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7695,6 +7748,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
@@ -7713,6 +7767,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -7726,13 +7781,15 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/string-width-cjs/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -7762,6 +7819,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -7793,14 +7851,11 @@
}
},
"node_modules/strip-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
- "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz",
+ "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.1"
- },
"engines": {
"node": ">=12"
},
@@ -9190,6 +9245,7 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
@@ -9208,6 +9264,7 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -9225,6 +9282,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -9239,13 +9297,15 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -9260,6 +9320,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
diff --git a/package.json b/package.json
index ea38306..ea3892c 100644
--- a/package.json
+++ b/package.json
@@ -25,15 +25,15 @@
"zod": "^4.1.13"
},
"devDependencies": {
- "@chromatic-com/storybook": "^4.1.3",
+ "@chromatic-com/storybook": "^5.0.0",
"@eslint/css": "^0.14.1",
"@eslint/js": "^9.39.2",
"@faker-js/faker": "^10.1.0",
- "@storybook/addon-docs": "^10.1.4",
- "@storybook/addon-links": "^10.1.4",
- "@storybook/addon-onboarding": "^10.1.4",
- "@storybook/addon-themes": "^10.1.4",
- "@storybook/react-vite": "^10.1.4",
+ "@storybook/addon-docs": "^10.1.11",
+ "@storybook/addon-links": "^10.1.11",
+ "@storybook/addon-onboarding": "^10.1.11",
+ "@storybook/addon-themes": "^10.1.11",
+ "@storybook/react-vite": "^10.1.11",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/eslint-plugin-query": "^5.91.2",
@@ -59,7 +59,7 @@
"jsdom": "^27.3.0",
"prettier": "^3.7.4",
"prettier-plugin-tailwindcss": "^0.7.2",
- "storybook": "^10.1.10",
+ "storybook": "^10.1.11",
"tailwind-csstree": "^0.1.0",
"tailwindcss": "^4.1.8",
"typescript": "^5.9.3",
diff --git a/src/components/JobList.stories.ts b/src/components/JobList.stories.ts
index d8c1f12..54bdd71 100644
--- a/src/components/JobList.stories.ts
+++ b/src/components/JobList.stories.ts
@@ -1,23 +1,11 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
-import { useFeatures } from "@contexts/Features.hook";
-import { useSettings } from "@hooks/use-settings";
import { JobState } from "@services/types";
import { jobMinimalFactory } from "@test/factories/job";
import { createFeatures } from "@test/utils/features";
-import { vi } from "vitest";
import JobList from "./JobList";
-// Mock hooks for stories
-vi.mock("@contexts/Features.hook", () => ({
- useFeatures: vi.fn(),
-}));
-
-vi.mock("@hooks/use-settings", () => ({
- useSettings: vi.fn(),
-}));
-
const meta: Meta = {
component: JobList,
title: "Pages/JobList",
@@ -35,22 +23,10 @@ export const Running: Story = {
state: JobState.Running,
},
parameters: {
- mockData: [
- {
- hook: useFeatures,
- mockValue: {
- features: createFeatures({
- jobListHideArgsByDefault: false,
- }),
- },
- },
- {
- hook: useSettings,
- mockValue: {
- settings: {},
- },
- },
- ],
+ features: createFeatures({
+ jobListHideArgsByDefault: false,
+ }),
+ settings: {},
},
};
@@ -61,22 +37,10 @@ export const ArgsHiddenByDefault: Story = {
jobs: jobMinimalFactory.running().buildList(10),
},
parameters: {
- mockData: [
- {
- hook: useFeatures,
- mockValue: {
- features: createFeatures({
- jobListHideArgsByDefault: true,
- }),
- },
- },
- {
- hook: useSettings,
- mockValue: {
- settings: {},
- },
- },
- ],
+ features: createFeatures({
+ jobListHideArgsByDefault: true,
+ }),
+ settings: {},
},
};
@@ -87,22 +51,10 @@ export const ArgsVisibleUserOverride: Story = {
jobs: jobMinimalFactory.running().buildList(10),
},
parameters: {
- mockData: [
- {
- hook: useFeatures,
- mockValue: {
- features: createFeatures({
- jobListHideArgsByDefault: true,
- }),
- },
- },
- {
- hook: useSettings,
- mockValue: {
- settings: { showJobArgs: true },
- },
- },
- ],
+ features: createFeatures({
+ jobListHideArgsByDefault: true,
+ }),
+ settings: { showJobArgs: true },
},
};
@@ -113,21 +65,9 @@ export const ArgsHiddenUserOverride: Story = {
jobs: jobMinimalFactory.running().buildList(10),
},
parameters: {
- mockData: [
- {
- hook: useFeatures,
- mockValue: {
- features: createFeatures({
- jobListHideArgsByDefault: false,
- }),
- },
- },
- {
- hook: useSettings,
- mockValue: {
- settings: { showJobArgs: false },
- },
- },
- ],
+ features: createFeatures({
+ jobListHideArgsByDefault: false,
+ }),
+ settings: { showJobArgs: false },
},
};