diff --git a/app/docs/navigation.ts b/app/docs/navigation.ts
index 1418e90..c540da2 100644
--- a/app/docs/navigation.ts
+++ b/app/docs/navigation.ts
@@ -29,7 +29,13 @@ export const NAVIGATION: NavigationGroup[] = [
children: [
{ name: 'Timeline Rail', href: '/docs/timeline-rail', isNew: true },
{ name: 'Testimonial', href: '/docs/testimonial', isUpdated: true },
+ ],
+ },
+ {
+ name: 'Pricing Card',
+ children: [
{ name: 'Pricing Card One', href: '/docs/pricing-card-one', isNew: true },
+ { name: 'Pricing Card Two', href: '/docs/pricing-card-two', isNew: true },
],
},
{
diff --git a/app/docs/pricing-card-two/page.mdx b/app/docs/pricing-card-two/page.mdx
new file mode 100644
index 0000000..b8aac44
--- /dev/null
+++ b/app/docs/pricing-card-two/page.mdx
@@ -0,0 +1,55 @@
+export const metadata = {
+ title: 'Pricing Card Two – Shadcn-Extras',
+ description:
+ 'Outlined pricing card with colored frame, icon, price and feature list (✓/✕). Simple, accessible, and themable.',
+};
+
+import ComponentCodePreview from '@/components/website/component-code-preview';
+import { Pc2Basic } from './pc2-basic';
+
+# Pricing Card Two
+
+Matches the “3 cards with colored borders” layout. Pass your own icon, data, and tone.
+
+## Example
+
+}
+ filePath='app/docs/pricing-card-two/pc2-basic.tsx'
+/>
+
+## Installation
+
+
+
+ CLI
+ Manual
+
+
+
+
+
+
+
+
+ Copy the component into components/core/pricing-card-two.tsx.
+
+ Use it with your data (icon, price, features, CTA).
+
+
+
+
+## Props
+
+| Prop | Type | Default | Description |
+| ------------- | ---------------------------------------------------- | ---------------------- | ------------------------------------------------ |
+| `icon` | `ReactNode` | — | Large top icon. |
+| `name` | `string` | — | Plan name. |
+| `subtitle` | `string` | `'the starter choise'` | Small helper text. |
+| `price` | `number \| string` | — | Price (number uses `currency`). |
+| `currency` | `string` | `'$'` | Currency prefix when `price` is a number. |
+| `periodLabel` | `string` | `'/month'` | Next to price. |
+| `features` | `{ label: ReactNode; included?: boolean }[]` | `[]` | List of features; `included` defaults to `true`. |
+| `cta` | `href` or `onClick` + `label?` | — | Call-to-action (link or button). |
+| `tone` | `'pink' \| 'blue' \| 'amber' \| 'emerald' \| 'zinc'` | `'blue'` | Accent color. |
+| `*ClassName` | `string` | — | Slot class overrides. |
diff --git a/app/docs/pricing-card-two/pc2-basic.tsx b/app/docs/pricing-card-two/pc2-basic.tsx
new file mode 100644
index 0000000..6ad46db
--- /dev/null
+++ b/app/docs/pricing-card-two/pc2-basic.tsx
@@ -0,0 +1,68 @@
+import PricingCardTwo from '@/components/core/pricing-card-two';
+import { User, Users, Briefcase } from 'lucide-react';
+
+export function Pc2Basic() {
+ return (
+
+
}
+ name='Personal'
+ subtitle='the starter choise'
+ price={5}
+ periodLabel='/month'
+ features={[
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ {
+ label: 'Lorem ipsum dolor sit amet, consectetur.',
+ included: false,
+ },
+ { label: 'Only lorem', included: false },
+ { label: 'Lorem ipsum dolor.', included: false },
+ { label: 'Lorem ipsum.', included: false },
+ ]}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
+
}
+ name='Team'
+ subtitle='the starter choise'
+ price={15}
+ periodLabel='/month'
+ features={[
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum dolor sit amet, consectetur.' },
+ { label: 'Only lorem' },
+ { label: 'Lorem ipsum dolor.', included: false },
+ { label: 'Lorem ipsum.', included: false },
+ ]}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
+
}
+ name='Business'
+ subtitle='the starter choise'
+ price={25}
+ periodLabel='/month'
+ features={[
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum dolor sit amet, consectetur.' },
+ { label: 'Only lorem' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum.' },
+ ]}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
+ );
+}
diff --git a/commitlint.config.cjs b/commitlint.config.cjs
new file mode 100644
index 0000000..84dcb12
--- /dev/null
+++ b/commitlint.config.cjs
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+};
diff --git a/components/core/pricing-card-two.tsx b/components/core/pricing-card-two.tsx
new file mode 100644
index 0000000..22152ab
--- /dev/null
+++ b/components/core/pricing-card-two.tsx
@@ -0,0 +1,295 @@
+'use client';
+
+import * as React from 'react';
+import { cn } from '@/lib/utils';
+
+type AnchorOrButton =
+ | ({
+ href: string;
+ onClick?: never;
+ } & React.AnchorHTMLAttributes)
+ | ({
+ href?: undefined;
+ onClick?: React.MouseEventHandler;
+ } & React.ButtonHTMLAttributes);
+
+type Tone = 'pink' | 'blue' | 'amber' | 'emerald' | 'zinc';
+
+export type PricingFeature = {
+ label: React.ReactNode;
+ included?: boolean; // default true
+};
+
+export type PricingCardTwoProps = {
+ icon?: React.ReactNode;
+ name: string;
+ subtitle?: string;
+
+ price: number | string;
+ currency?: string;
+ periodLabel?: string;
+
+ features: PricingFeature[];
+
+ cta?: AnchorOrButton & { label?: string; 'aria-label'?: string };
+
+ /** Visuals */
+ tone?: Tone;
+ className?: string;
+
+ /** Slot overrides */
+ iconClassName?: string;
+ nameClassName?: string;
+ subtitleClassName?: string;
+ priceClassName?: string;
+ periodClassName?: string;
+ featureListClassName?: string;
+ featureItemClassName?: string;
+ ctaClassName?: string;
+};
+
+const toneMap: Record<
+ Tone,
+ {
+ /** gradient frame */
+ frame: string;
+ /** accent text (icon + price) */
+ accent: string;
+ /** CTA */
+ btn: string;
+ btnHover: string;
+ /** tick / cross badges */
+ okBg: string;
+ okRing: string;
+ okFg: string;
+ noBg: string;
+ noRing: string;
+ noFg: string;
+ }
+> = {
+ pink: {
+ frame: 'bg-gradient-to-b from-pink-400 to-fuchsia-600',
+ accent: 'text-pink-600',
+ btn: 'bg-pink-600 text-white',
+ btnHover: 'hover:bg-pink-700',
+ okBg: 'bg-pink-50 dark:bg-pink-950/40',
+ okRing: 'ring-pink-200 dark:ring-pink-900/50',
+ okFg: 'text-pink-600 dark:text-pink-400',
+ noBg: 'bg-amber-50 dark:bg-amber-950/40',
+ noRing: 'ring-amber-200 dark:ring-amber-900/40',
+ noFg: 'text-amber-500',
+ },
+ blue: {
+ frame: 'bg-gradient-to-b from-blue-400 to-indigo-600',
+ accent: 'text-blue-600',
+ btn: 'bg-blue-600 text-white',
+ btnHover: 'hover:bg-blue-700',
+ okBg: 'bg-blue-50 dark:bg-blue-950/40',
+ okRing: 'ring-blue-200 dark:ring-blue-900/50',
+ okFg: 'text-blue-600 dark:text-blue-400',
+ noBg: 'bg-amber-50 dark:bg-amber-950/40',
+ noRing: 'ring-amber-200 dark:ring-amber-900/40',
+ noFg: 'text-amber-500',
+ },
+ amber: {
+ frame: 'bg-gradient-to-b from-amber-400 to-orange-500',
+ accent: 'text-amber-600',
+ btn: 'bg-amber-500 text-white',
+ btnHover: 'hover:bg-amber-600',
+ okBg: 'bg-amber-50 dark:bg-amber-950/40',
+ okRing: 'ring-amber-200 dark:ring-amber-900/50',
+ okFg: 'text-amber-600 dark:text-amber-400',
+ noBg: 'bg-rose-50 dark:bg-rose-950/40',
+ noRing: 'ring-rose-200 dark:ring-rose-900/40',
+ noFg: 'text-rose-500',
+ },
+ emerald: {
+ frame: 'bg-gradient-to-b from-emerald-400 to-teal-600',
+ accent: 'text-emerald-600',
+ btn: 'bg-emerald-600 text-white',
+ btnHover: 'hover:bg-emerald-700',
+ okBg: 'bg-emerald-50 dark:bg-emerald-950/40',
+ okRing: 'ring-emerald-200 dark:ring-emerald-900/50',
+ okFg: 'text-emerald-600 dark:text-emerald-400',
+ noBg: 'bg-amber-50 dark:bg-amber-950/40',
+ noRing: 'ring-amber-200 dark:ring-amber-900/40',
+ noFg: 'text-amber-500',
+ },
+ zinc: {
+ frame: 'bg-gradient-to-b from-zinc-300 to-zinc-500',
+ accent: 'text-zinc-900 dark:text-zinc-50',
+ btn: 'bg-zinc-900 text-white dark:bg-zinc-100 dark:text-zinc-900',
+ btnHover: 'hover:bg-black/80 dark:hover:bg-white',
+ okBg: 'bg-zinc-100 dark:bg-zinc-800/60',
+ okRing: 'ring-zinc-200 dark:ring-zinc-700',
+ okFg: 'text-zinc-700 dark:text-zinc-300',
+ noBg: 'bg-amber-50 dark:bg-amber-950/40',
+ noRing: 'ring-amber-200 dark:ring-amber-900/40',
+ noFg: 'text-amber-500',
+ },
+};
+
+function priceParts(price: number | string, currency?: string) {
+ if (typeof price === 'number')
+ return { main: `${currency ?? '$'}${price}`, raw: price };
+ return { main: price, raw: price };
+}
+
+export default function PricingCardTwo({
+ icon,
+ name,
+ subtitle = 'the starter choise',
+ price,
+ currency = '$',
+ periodLabel = '/month',
+ features,
+ cta,
+ tone = 'blue',
+ className,
+ iconClassName,
+ nameClassName,
+ subtitleClassName,
+ priceClassName,
+ periodClassName,
+ featureListClassName,
+ featureItemClassName,
+ ctaClassName,
+}: PricingCardTwoProps) {
+ const t = toneMap[tone];
+ const pp = priceParts(price, currency);
+
+ return (
+
+ {/* colored frame */}
+
+ {/* card surface */}
+
+ {/* icon */}
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {/* title + subtitle */}
+
+ {name}
+
+ {subtitle && (
+
+ {subtitle}
+
+ )}
+
+ {/* price */}
+
+ {pp.main}
+
+ {periodLabel}
+
+
+
+ {/* features */}
+
+ {features.map((f, i) => {
+ const ok = f.included !== false;
+ return (
+ -
+
+ {ok ? (
+
+ ) : (
+
+ )}
+
+ {f.label}
+
+ );
+ })}
+
+
+ {/* CTA */}
+ {cta && (
+ <>
+ {cta.href ? (
+
+ {cta.label ?? 'Choose Plan'}
+
+ ) : (
+
+ )}
+ >
+ )}
+
+
+
+ );
+}
diff --git a/package-lock.json b/package-lock.json
index 6e5f680..f9b7f5f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -37,6 +37,8 @@
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
+ "@commitlint/cli": "^19.8.1",
+ "@commitlint/config-conventional": "^19.8.1",
"@storybook/addon-a11y": "^8.6.14",
"@storybook/addon-essentials": "^8.6.14",
"@storybook/addon-interactions": "^8.6.14",
@@ -53,6 +55,8 @@
"eslint": "^8.57.1",
"eslint-config-next": "^14.2.4",
"eslint-config-prettier": "^10.1.8",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.1.5",
"postcss": "^8",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.0.0-insiders.6d3fa07",
@@ -1934,6 +1938,480 @@
"react": "^16.8.3 || ^17 || ^18"
}
},
+ "node_modules/@commitlint/cli": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz",
+ "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/format": "^19.8.1",
+ "@commitlint/lint": "^19.8.1",
+ "@commitlint/load": "^19.8.1",
+ "@commitlint/read": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "tinyexec": "^1.0.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-conventional": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.1.tgz",
+ "integrity": "sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz",
+ "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "ajv": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz",
+ "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/execute-rule": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz",
+ "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz",
+ "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format/node_modules/chalk": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
+ "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@commitlint/is-ignored": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz",
+ "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "semver": "^7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz",
+ "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/is-ignored": "^19.8.1",
+ "@commitlint/parse": "^19.8.1",
+ "@commitlint/rules": "^19.8.1",
+ "@commitlint/types": "^19.8.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz",
+ "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^19.8.1",
+ "@commitlint/execute-rule": "^19.8.1",
+ "@commitlint/resolve-extends": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load/node_modules/chalk": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
+ "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@commitlint/load/node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
+ "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jiti": "^2.4.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=9",
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@commitlint/load/node_modules/jiti": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
+ "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz",
+ "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/parse": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz",
+ "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz",
+ "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/top-level": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz",
+ "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@commitlint/rules": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz",
+ "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/ensure": "^19.8.1",
+ "@commitlint/message": "^19.8.1",
+ "@commitlint/to-lines": "^19.8.1",
+ "@commitlint/types": "^19.8.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/to-lines": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz",
+ "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz",
+ "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/find-up": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/@commitlint/top-level/node_modules/yocto-queue": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
+ "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@commitlint/types": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz",
+ "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types/node_modules/chalk": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
+ "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
"node_modules/@emnapi/runtime": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz",
@@ -5733,6 +6211,16 @@
"@babel/types": "^7.28.2"
}
},
+ "node_modules/@types/conventional-commits-parser": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
+ "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -6476,6 +6964,22 @@
"ajv": "^6.9.1"
}
},
+ "node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ansi-html": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
@@ -6580,6 +7084,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/array-includes": {
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
@@ -7624,93 +8135,235 @@
"node": ">= 8.10.0"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz",
+ "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/chrome-trace-event": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
- "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
- "engines": {
- "node": ">=6.0"
- }
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
- "node_modules/cipher-base": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz",
- "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==",
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "inherits": "^2.0.4",
- "safe-buffer": "^5.2.1"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
},
"engines": {
- "node": ">= 0.10"
+ "node": ">=12"
}
},
- "node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "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,
"license": "MIT"
},
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "dependencies": {
- "clsx": "^2.1.1"
- },
- "funding": {
- "url": "https://polar.sh/cva"
- }
- },
- "node_modules/clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "node_modules/cliui/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": {
- "source-map": "~0.6.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">= 10.0"
+ "node": ">=8"
}
},
- "node_modules/clean-css/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
- },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -7811,6 +8464,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -7830,6 +8494,51 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-conventionalcommits": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -8070,6 +8779,19 @@
"integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
"dev": true
},
+ "node_modules/dargs": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/data-view-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
@@ -8456,6 +9178,19 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -8565,6 +9300,19 @@
"node": ">=6"
}
},
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -9377,6 +10125,13 @@
"node": ">=6"
}
},
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
@@ -9746,6 +10501,29 @@
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -9822,6 +10600,24 @@
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
+ "node_modules/git-raw-commits": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/glob": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
@@ -9886,6 +10682,22 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "4.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -10297,6 +11109,22 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
"node_modules/icss-utils": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
@@ -10372,6 +11200,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -10408,6 +11247,16 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
+ "node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/inline-style-parser": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
@@ -10776,6 +11625,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-path-inside": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
@@ -10877,6 +11736,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-typed-array": {
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
@@ -11103,12 +11975,39 @@
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
- "license": "MIT",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)",
"dependencies": {
- "universalify": "^2.0.0"
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
}
},
"node_modules/jsx-ast-utils": {
@@ -11394,6 +12293,19 @@
"url": "https://opencollective.com/parcel"
}
},
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -11401,6 +12313,173 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lint-staged": {
+ "version": "16.1.5",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz",
+ "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.5.0",
+ "commander": "^14.0.0",
+ "debug": "^4.4.1",
+ "lilconfig": "^3.1.3",
+ "listr2": "^9.0.1",
+ "micromatch": "^4.0.8",
+ "nano-spawn": "^1.0.2",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.2",
+ "yaml": "^2.8.1"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=20.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
+ "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/commander": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz",
+ "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/lint-staged/node_modules/yaml": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz",
+ "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/listr2/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/listr2/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -11409,62 +12488,249 @@
"node": ">=6.11.5"
}
},
- "node_modules/loader-utils": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
- "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
+ "dev": true
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/log-update/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
"engines": {
- "node": ">= 12.13.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/log-update/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "node_modules/log-update/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.castarray": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
- "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
- "dev": true
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
},
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "dev": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
},
"node_modules/longest-streak": {
"version": "3.1.0",
@@ -11919,6 +13185,19 @@
"map-or-similar": "^1.5.0"
}
},
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -12670,6 +13949,19 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/min-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -12754,6 +14046,19 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
+ "node_modules/nano-spawn": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz",
+ "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -13131,6 +14436,22 @@
"wrappy": "1"
}
},
+ "node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/oniguruma-to-js": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz",
@@ -13487,6 +14808,19 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -14543,6 +15877,16 @@
"strip-ansi": "^6.0.1"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -14654,6 +15998,23 @@
"node": ">=0.10.0"
}
},
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -14664,6 +16025,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -15134,6 +16502,49 @@
"node": ">=8"
}
},
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
@@ -15176,6 +16587,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/stackframe": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
@@ -15295,6 +16716,16 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@@ -15685,12 +17116,32 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/timers-browserify": {
"version": "2.0.12",
"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
@@ -15711,6 +17162,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/tinyexec": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
+ "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tinyrainbow": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
@@ -16080,6 +17538,19 @@
"node": ">=4"
}
},
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/unified": {
"version": "11.0.5",
"resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
@@ -16813,6 +18284,16 @@
"node": ">=0.4"
}
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -16830,6 +18311,57 @@
"node": ">= 6"
}
},
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/yargs/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",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 39a319f..423bd63 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,20 @@
"format": "prettier --write .",
"check-format": "prettier --check .",
"storybook": "storybook dev -p 6006",
- "build-storybook": "storybook build -o storybook-static"
+ "build-storybook": "storybook build -o storybook-static",
+ "prepare": "husky",
+ "typecheck": "tsc -p tsconfig.json --noEmit",
+ "precommit:hook": "lint-staged",
+ "test": "echo \"No tests yet\""
+ },
+ "lint-staged": {
+ "*.{js,jsx,ts,tsx}": [
+ "eslint --max-warnings=0 --fix",
+ "prettier --write"
+ ],
+ "*.{md,mdx,css,json,yml,yaml}": [
+ "prettier --write"
+ ]
},
"dependencies": {
"@code-hike/mdx": "^0.9.0",
@@ -64,6 +77,8 @@
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
+ "@commitlint/cli": "^19.8.1",
+ "@commitlint/config-conventional": "^19.8.1",
"@storybook/addon-a11y": "^8.6.14",
"@storybook/addon-essentials": "^8.6.14",
"@storybook/addon-interactions": "^8.6.14",
@@ -80,6 +95,8 @@
"eslint": "^8.57.1",
"eslint-config-next": "^14.2.4",
"eslint-config-prettier": "^10.1.8",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.1.5",
"postcss": "^8",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.0.0-insiders.6d3fa07",
diff --git a/public/c/pricing-card-two.json b/public/c/pricing-card-two.json
new file mode 100644
index 0000000..8b6257f
--- /dev/null
+++ b/public/c/pricing-card-two.json
@@ -0,0 +1,19 @@
+{
+ "name": "pricing-card-two",
+ "type": "registry:ui",
+ "registryDependencies": [],
+ "dependencies": [],
+ "devDependencies": [],
+ "tailwind": {},
+ "cssVars": {
+ "light": {},
+ "dark": {}
+ },
+ "files": [
+ {
+ "path": "pricing-card-two.tsx",
+ "content": "'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\ntype AnchorOrButton =\n | ({\n href: string;\n onClick?: never;\n } & React.AnchorHTMLAttributes)\n | ({\n href?: undefined;\n onClick?: React.MouseEventHandler;\n } & React.ButtonHTMLAttributes);\n\ntype Tone = 'pink' | 'blue' | 'amber' | 'emerald' | 'zinc';\n\nexport type PricingFeature = {\n label: React.ReactNode;\n included?: boolean; // default true\n};\n\nexport type PricingCardTwoProps = {\n icon?: React.ReactNode;\n name: string;\n subtitle?: string;\n\n price: number | string;\n currency?: string;\n periodLabel?: string;\n\n features: PricingFeature[];\n\n cta?: AnchorOrButton & { label?: string; 'aria-label'?: string };\n\n /** Visuals */\n tone?: Tone;\n className?: string;\n\n /** Slot overrides */\n iconClassName?: string;\n nameClassName?: string;\n subtitleClassName?: string;\n priceClassName?: string;\n periodClassName?: string;\n featureListClassName?: string;\n featureItemClassName?: string;\n ctaClassName?: string;\n};\n\nconst toneMap: Record<\n Tone,\n {\n /** gradient frame */\n frame: string;\n /** accent text (icon + price) */\n accent: string;\n /** CTA */\n btn: string;\n btnHover: string;\n /** tick / cross badges */\n okBg: string;\n okRing: string;\n okFg: string;\n noBg: string;\n noRing: string;\n noFg: string;\n }\n> = {\n pink: {\n frame: 'bg-gradient-to-b from-pink-400 to-fuchsia-600',\n accent: 'text-pink-600',\n btn: 'bg-pink-600 text-white',\n btnHover: 'hover:bg-pink-700',\n okBg: 'bg-pink-50 dark:bg-pink-950/40',\n okRing: 'ring-pink-200 dark:ring-pink-900/50',\n okFg: 'text-pink-600 dark:text-pink-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n blue: {\n frame: 'bg-gradient-to-b from-blue-400 to-indigo-600',\n accent: 'text-blue-600',\n btn: 'bg-blue-600 text-white',\n btnHover: 'hover:bg-blue-700',\n okBg: 'bg-blue-50 dark:bg-blue-950/40',\n okRing: 'ring-blue-200 dark:ring-blue-900/50',\n okFg: 'text-blue-600 dark:text-blue-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n amber: {\n frame: 'bg-gradient-to-b from-amber-400 to-orange-500',\n accent: 'text-amber-600',\n btn: 'bg-amber-500 text-white',\n btnHover: 'hover:bg-amber-600',\n okBg: 'bg-amber-50 dark:bg-amber-950/40',\n okRing: 'ring-amber-200 dark:ring-amber-900/50',\n okFg: 'text-amber-600 dark:text-amber-400',\n noBg: 'bg-rose-50 dark:bg-rose-950/40',\n noRing: 'ring-rose-200 dark:ring-rose-900/40',\n noFg: 'text-rose-500',\n },\n emerald: {\n frame: 'bg-gradient-to-b from-emerald-400 to-teal-600',\n accent: 'text-emerald-600',\n btn: 'bg-emerald-600 text-white',\n btnHover: 'hover:bg-emerald-700',\n okBg: 'bg-emerald-50 dark:bg-emerald-950/40',\n okRing: 'ring-emerald-200 dark:ring-emerald-900/50',\n okFg: 'text-emerald-600 dark:text-emerald-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n zinc: {\n frame: 'bg-gradient-to-b from-zinc-300 to-zinc-500',\n accent: 'text-zinc-900 dark:text-zinc-50',\n btn: 'bg-zinc-900 text-white dark:bg-zinc-100 dark:text-zinc-900',\n btnHover: 'hover:bg-black/80 dark:hover:bg-white',\n okBg: 'bg-zinc-100 dark:bg-zinc-800/60',\n okRing: 'ring-zinc-200 dark:ring-zinc-700',\n okFg: 'text-zinc-700 dark:text-zinc-300',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n};\n\nfunction priceParts(price: number | string, currency?: string) {\n if (typeof price === 'number')\n return { main: `${currency ?? '$'}${price}`, raw: price };\n return { main: price, raw: price };\n}\n\nexport default function PricingCardTwo({\n icon,\n name,\n subtitle = 'the starter choise',\n price,\n currency = '$',\n periodLabel = '/month',\n features,\n cta,\n tone = 'blue',\n className,\n iconClassName,\n nameClassName,\n subtitleClassName,\n priceClassName,\n periodClassName,\n featureListClassName,\n featureItemClassName,\n ctaClassName,\n}: PricingCardTwoProps) {\n const t = toneMap[tone];\n const pp = priceParts(price, currency);\n\n return (\n \n {/* colored frame */}\n \n {/* card surface */}\n
\n {/* icon */}\n {icon && (\n
\n {icon}\n
\n )}\n\n {/* title + subtitle */}\n
\n {name}\n
\n {subtitle && (\n
\n {subtitle}\n
\n )}\n\n {/* price */}\n
\n {pp.main}\n \n {periodLabel}\n \n
\n\n {/* features */}\n
\n {features.map((f, i) => {\n const ok = f.included !== false;\n return (\n - \n \n {ok ? (\n \n ) : (\n \n )}\n \n {f.label}\n
\n );\n })}\n
\n\n {/* CTA */}\n {cta && (\n <>\n {cta.href ? (\n
\n {cta.label ?? 'Choose Plan'}\n \n ) : (\n
\n )}\n >\n )}\n
\n
\n \n );\n}\n",
+ "type": "registry:ui"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/public/c/registry.json b/public/c/registry.json
index b3bb597..93035ac 100644
--- a/public/c/registry.json
+++ b/public/c/registry.json
@@ -245,6 +245,25 @@
"ui",
"shadcn-extras"
]
+ },
+ {
+ "name": "pricing-card-two",
+ "type": "registry:ui",
+ "title": "Pricing Card Two",
+ "description": "Outlined pricing card with colored frame, icon, price and feature list.",
+ "dependencies": [],
+ "devDependencies": [],
+ "registryDependencies": [],
+ "files": [
+ {
+ "path": "components/core/pricing-card-two.tsx",
+ "type": "registry:component"
+ }
+ ],
+ "categories": [
+ "ui",
+ "shadcn-extras"
+ ]
}
]
}
\ No newline at end of file
diff --git a/public/e/pc2-basic.json b/public/e/pc2-basic.json
new file mode 100644
index 0000000..17ad8db
--- /dev/null
+++ b/public/e/pc2-basic.json
@@ -0,0 +1,18 @@
+{
+ "name": "pc2-basic",
+ "type": "registry:ui",
+ "componentName": "pc2-basic",
+ "description": "Three cards (Personal / Team / Business).",
+ "files": [
+ {
+ "path": "pc2-basic.tsx",
+ "content": "import PricingCardTwo from '@/components/core/pricing-card-two';\nimport { User, Users, Briefcase } from 'lucide-react';\n\nexport function Pc2Basic() {\n return (\n \n
}\n name='Personal'\n subtitle='the starter choise'\n price={5}\n periodLabel='/month'\n features={[\n { label: 'Lorem ipsum' },\n { label: 'Lorem set' },\n { label: 'Lorem ipsum dolor.' },\n {\n label: 'Lorem ipsum dolor sit amet, consectetur.',\n included: false,\n },\n { label: 'Only lorem', included: false },\n { label: 'Lorem ipsum dolor.', included: false },\n { label: 'Lorem ipsum.', included: false },\n ]}\n cta={{ href: '#', label: 'Choose Plan' }}\n />\n\n
}\n name='Team'\n subtitle='the starter choise'\n price={15}\n periodLabel='/month'\n features={[\n { label: 'Lorem ipsum' },\n { label: 'Lorem set' },\n { label: 'Lorem ipsum dolor.' },\n { label: 'Lorem ipsum dolor sit amet, consectetur.' },\n { label: 'Only lorem' },\n { label: 'Lorem ipsum dolor.', included: false },\n { label: 'Lorem ipsum.', included: false },\n ]}\n cta={{ href: '#', label: 'Choose Plan' }}\n />\n\n
}\n name='Business'\n subtitle='the starter choise'\n price={25}\n periodLabel='/month'\n features={[\n { label: 'Lorem ipsum' },\n { label: 'Lorem set' },\n { label: 'Lorem ipsum dolor.' },\n { label: 'Lorem ipsum dolor sit amet, consectetur.' },\n { label: 'Only lorem' },\n { label: 'Lorem ipsum dolor.' },\n { label: 'Lorem ipsum.' },\n ]}\n cta={{ href: '#', label: 'Choose Plan' }}\n />\n
\n );\n}\n",
+ "type": "registry:component"
+ },
+ {
+ "path": "components/core/pricing-card-two.tsx",
+ "content": "'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\ntype AnchorOrButton =\n | ({\n href: string;\n onClick?: never;\n } & React.AnchorHTMLAttributes)\n | ({\n href?: undefined;\n onClick?: React.MouseEventHandler;\n } & React.ButtonHTMLAttributes);\n\ntype Tone = 'pink' | 'blue' | 'amber' | 'emerald' | 'zinc';\n\nexport type PricingFeature = {\n label: React.ReactNode;\n included?: boolean; // default true\n};\n\nexport type PricingCardTwoProps = {\n icon?: React.ReactNode;\n name: string;\n subtitle?: string;\n\n price: number | string;\n currency?: string;\n periodLabel?: string;\n\n features: PricingFeature[];\n\n cta?: AnchorOrButton & { label?: string; 'aria-label'?: string };\n\n /** Visuals */\n tone?: Tone;\n className?: string;\n\n /** Slot overrides */\n iconClassName?: string;\n nameClassName?: string;\n subtitleClassName?: string;\n priceClassName?: string;\n periodClassName?: string;\n featureListClassName?: string;\n featureItemClassName?: string;\n ctaClassName?: string;\n};\n\nconst toneMap: Record<\n Tone,\n {\n /** gradient frame */\n frame: string;\n /** accent text (icon + price) */\n accent: string;\n /** CTA */\n btn: string;\n btnHover: string;\n /** tick / cross badges */\n okBg: string;\n okRing: string;\n okFg: string;\n noBg: string;\n noRing: string;\n noFg: string;\n }\n> = {\n pink: {\n frame: 'bg-gradient-to-b from-pink-400 to-fuchsia-600',\n accent: 'text-pink-600',\n btn: 'bg-pink-600 text-white',\n btnHover: 'hover:bg-pink-700',\n okBg: 'bg-pink-50 dark:bg-pink-950/40',\n okRing: 'ring-pink-200 dark:ring-pink-900/50',\n okFg: 'text-pink-600 dark:text-pink-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n blue: {\n frame: 'bg-gradient-to-b from-blue-400 to-indigo-600',\n accent: 'text-blue-600',\n btn: 'bg-blue-600 text-white',\n btnHover: 'hover:bg-blue-700',\n okBg: 'bg-blue-50 dark:bg-blue-950/40',\n okRing: 'ring-blue-200 dark:ring-blue-900/50',\n okFg: 'text-blue-600 dark:text-blue-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n amber: {\n frame: 'bg-gradient-to-b from-amber-400 to-orange-500',\n accent: 'text-amber-600',\n btn: 'bg-amber-500 text-white',\n btnHover: 'hover:bg-amber-600',\n okBg: 'bg-amber-50 dark:bg-amber-950/40',\n okRing: 'ring-amber-200 dark:ring-amber-900/50',\n okFg: 'text-amber-600 dark:text-amber-400',\n noBg: 'bg-rose-50 dark:bg-rose-950/40',\n noRing: 'ring-rose-200 dark:ring-rose-900/40',\n noFg: 'text-rose-500',\n },\n emerald: {\n frame: 'bg-gradient-to-b from-emerald-400 to-teal-600',\n accent: 'text-emerald-600',\n btn: 'bg-emerald-600 text-white',\n btnHover: 'hover:bg-emerald-700',\n okBg: 'bg-emerald-50 dark:bg-emerald-950/40',\n okRing: 'ring-emerald-200 dark:ring-emerald-900/50',\n okFg: 'text-emerald-600 dark:text-emerald-400',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n zinc: {\n frame: 'bg-gradient-to-b from-zinc-300 to-zinc-500',\n accent: 'text-zinc-900 dark:text-zinc-50',\n btn: 'bg-zinc-900 text-white dark:bg-zinc-100 dark:text-zinc-900',\n btnHover: 'hover:bg-black/80 dark:hover:bg-white',\n okBg: 'bg-zinc-100 dark:bg-zinc-800/60',\n okRing: 'ring-zinc-200 dark:ring-zinc-700',\n okFg: 'text-zinc-700 dark:text-zinc-300',\n noBg: 'bg-amber-50 dark:bg-amber-950/40',\n noRing: 'ring-amber-200 dark:ring-amber-900/40',\n noFg: 'text-amber-500',\n },\n};\n\nfunction priceParts(price: number | string, currency?: string) {\n if (typeof price === 'number')\n return { main: `${currency ?? '$'}${price}`, raw: price };\n return { main: price, raw: price };\n}\n\nexport default function PricingCardTwo({\n icon,\n name,\n subtitle = 'the starter choise',\n price,\n currency = '$',\n periodLabel = '/month',\n features,\n cta,\n tone = 'blue',\n className,\n iconClassName,\n nameClassName,\n subtitleClassName,\n priceClassName,\n periodClassName,\n featureListClassName,\n featureItemClassName,\n ctaClassName,\n}: PricingCardTwoProps) {\n const t = toneMap[tone];\n const pp = priceParts(price, currency);\n\n return (\n \n {/* colored frame */}\n \n {/* card surface */}\n
\n {/* icon */}\n {icon && (\n
\n {icon}\n
\n )}\n\n {/* title + subtitle */}\n
\n {name}\n
\n {subtitle && (\n
\n {subtitle}\n
\n )}\n\n {/* price */}\n
\n {pp.main}\n \n {periodLabel}\n \n
\n\n {/* features */}\n
\n {features.map((f, i) => {\n const ok = f.included !== false;\n return (\n - \n \n {ok ? (\n \n ) : (\n \n )}\n \n {f.label}\n
\n );\n })}\n
\n\n {/* CTA */}\n {cta && (\n <>\n {cta.href ? (\n
\n {cta.label ?? 'Choose Plan'}\n \n ) : (\n
\n )}\n >\n )}\n
\n
\n \n );\n}\n",
+ "type": "registry:ui"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/scripts/registry-components.ts b/scripts/registry-components.ts
index cf4812a..b1bdf7c 100644
--- a/scripts/registry-components.ts
+++ b/scripts/registry-components.ts
@@ -121,4 +121,12 @@ export const components: ComponentDefinition[] = [
dependencies: [],
description: 'Pricing card with icon, price, features, and CTA.',
},
+ {
+ name: 'pricing-card-two',
+ path: path.join(__dirname, '../components/core/pricing-card-two.tsx'),
+ registryDependencies: [],
+ dependencies: [],
+ description:
+ 'Outlined pricing card with colored frame, icon, price and feature list.',
+ },
];
diff --git a/scripts/registry-examples.ts b/scripts/registry-examples.ts
index 930faa4..f2079d3 100644
--- a/scripts/registry-examples.ts
+++ b/scripts/registry-examples.ts
@@ -443,4 +443,17 @@ export const examples: ExampleDefinition[] = [
},
],
},
+ {
+ name: 'pc2-basic',
+ path: path.join(__dirname, '../app/docs/pricing-card-two/pc2-basic.tsx'),
+ description: 'Three cards (Personal / Team / Business).',
+ componentName: 'pc2-basic',
+ files: [
+ {
+ name: 'pricing-card-two.tsx',
+ path: path.join(__dirname, '../components/core/pricing-card-two.tsx'),
+ type: 'registry:ui',
+ },
+ ],
+ },
];
diff --git a/stories/core/pricing-card-two.stories.tsx b/stories/core/pricing-card-two.stories.tsx
new file mode 100644
index 0000000..85d4a81
--- /dev/null
+++ b/stories/core/pricing-card-two.stories.tsx
@@ -0,0 +1,203 @@
+import type { Meta, StoryObj } from '@storybook/react';
+import PricingCardTwo from '@/components/core/pricing-card-two';
+import type { PricingCardTwoProps } from '@/components/core/pricing-card-two';
+import { User, Users, Briefcase, Rocket, ShieldCheck } from 'lucide-react';
+import { action } from '@storybook/addon-actions';
+import * as React from 'react';
+
+const clickBtn = action(
+ 'choose-plan-click'
+) as React.MouseEventHandler;
+
+const meta: Meta = {
+ title: 'Core/Pricing/Pricing Card Two',
+ component: PricingCardTwo,
+ tags: ['autodocs'],
+ parameters: {
+ layout: 'padded',
+ docs: {
+ description: {
+ component:
+ 'Outlined pricing card with large icon, colored frame, feature list (✓/✕) and accent CTA. Presentational (SRP), controlled via props/slots.',
+ },
+ },
+ },
+ argTypes: {
+ tone: {
+ control: 'inline-radio',
+ options: ['pink', 'blue', 'amber', 'emerald', 'zinc'],
+ },
+ name: { control: 'text' },
+ subtitle: { control: 'text' },
+ price: { control: 'text' },
+ currency: { control: 'text' },
+ periodLabel: { control: 'text' },
+ features: { control: false },
+ className: { control: 'text' },
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+const featuresA: PricingCardTwoProps['features'] = [
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum dolor sit amet, consectetur.', included: false },
+ { label: 'Only lorem', included: false },
+ { label: 'Lorem ipsum dolor.', included: false },
+ { label: 'Lorem ipsum.', included: false },
+];
+
+const featuresB: PricingCardTwoProps['features'] = [
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum dolor sit amet, consectetur.' },
+ { label: 'Only lorem' },
+ { label: 'Lorem ipsum dolor.', included: false },
+ { label: 'Lorem ipsum.', included: false },
+];
+
+/* --------------------------------------------------------------- */
+/* Playground with controls */
+/* --------------------------------------------------------------- */
+
+export const Playground: Story = {
+ args: {
+ tone: 'blue',
+ icon: ,
+ name: 'Starter',
+ subtitle: 'the starter choise',
+ price: 9,
+ periodLabel: '/month',
+ features: featuresA,
+ cta: { onClick: clickBtn, label: 'Choose Plan' },
+ },
+};
+
+/* --------------------------------------------------------------- */
+/* Screenshot layout: three cards (Personal / Team / Business) */
+/* --------------------------------------------------------------- */
+
+export const ThreePlansLikeScreenshot: Story = {
+ render: () => (
+
+
}
+ name='Personal'
+ subtitle='the starter choise'
+ price={5}
+ periodLabel='/month'
+ features={featuresA}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
}
+ name='Team'
+ subtitle='the starter choise'
+ price={15}
+ periodLabel='/month'
+ features={featuresB}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
}
+ name='Business'
+ subtitle='the starter choise'
+ price={25}
+ periodLabel='/month'
+ features={[
+ { label: 'Lorem ipsum' },
+ { label: 'Lorem set' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum dolor sit amet, consectetur.' },
+ { label: 'Only lorem' },
+ { label: 'Lorem ipsum dolor.' },
+ { label: 'Lorem ipsum.' },
+ ]}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
+ ),
+};
+
+/* --------------------------------------------------------------- */
+/* Tones showcase */
+/* --------------------------------------------------------------- */
+
+export const Tones: Story = {
+ render: () => (
+
+
}
+ name='Pink'
+ subtitle='accent frame'
+ price={9}
+ features={featuresB}
+ cta={{ onClick: clickBtn, label: 'Choose Plan' }}
+ />
+
}
+ name='Blue'
+ subtitle='accent frame'
+ price={19}
+ features={featuresB}
+ cta={{ onClick: clickBtn, label: 'Choose Plan' }}
+ />
+
}
+ name='Emerald'
+ subtitle='accent frame'
+ price={29}
+ features={featuresB}
+ cta={{ onClick: clickBtn, label: 'Choose Plan' }}
+ />
+
}
+ name='Zinc'
+ subtitle='accent frame'
+ price={39}
+ features={featuresB}
+ cta={{ onClick: clickBtn, label: 'Choose Plan' }}
+ />
+
+ ),
+};
+
+/* --------------------------------------------------------------- */
+/* Link vs onClick CTA */
+/* --------------------------------------------------------------- */
+
+export const CTAExamples: Story = {
+ render: () => (
+
+
}
+ name='Link CTA'
+ price={12}
+ periodLabel='/mo'
+ features={featuresA}
+ cta={{ href: '#', label: 'Choose Plan' }}
+ />
+
}
+ name='onClick CTA'
+ price={18}
+ periodLabel='/mo'
+ features={featuresA}
+ cta={{ onClick: clickBtn, label: 'Choose Plan' }}
+ />
+
+ ),
+};