@shipfox/react-ui 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -5
- package/.turbo/turbo-check.log +2 -2
- package/.turbo/turbo-type.log +1 -1
- package/CHANGELOG.md +7 -0
- package/dist/components/button/button.d.ts +2 -1
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/button.js +17 -2
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button/button.stories.js +25 -0
- package/dist/components/button/button.stories.js.map +1 -1
- package/dist/components/button/icon-button.d.ts +2 -1
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/icon-button.js +17 -2
- package/dist/components/button/icon-button.js.map +1 -1
- package/dist/components/button/icon-button.stories.js +90 -0
- package/dist/components/button/icon-button.stories.js.map +1 -1
- package/dist/components/form/form.d.ts +11 -0
- package/dist/components/form/form.d.ts.map +1 -0
- package/dist/components/form/form.js +106 -0
- package/dist/components/form/form.js.map +1 -0
- package/dist/components/form/form.stories.js +582 -0
- package/dist/components/form/form.stories.js.map +1 -0
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/form/index.js +3 -0
- package/dist/components/form/index.js.map +1 -0
- package/dist/components/icon/custom/spinner.d.ts +1 -1
- package/dist/components/icon/custom/spinner.d.ts.map +1 -1
- package/dist/components/icon/custom/spinner.js +84 -30
- package/dist/components/icon/custom/spinner.js.map +1 -1
- package/dist/components/icon/icon.d.ts +19 -18
- package/dist/components/icon/icon.d.ts.map +1 -1
- package/dist/components/icon/icon.js +17 -17
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -1
- package/src/components/button/button.stories.tsx +18 -0
- package/src/components/button/button.tsx +27 -2
- package/src/components/button/icon-button.stories.tsx +46 -0
- package/src/components/button/icon-button.tsx +26 -1
- package/src/components/form/form.stories.tsx +500 -0
- package/src/components/form/form.tsx +154 -0
- package/src/components/form/index.ts +1 -0
- package/src/components/icon/custom/spinner.tsx +64 -18
- package/src/components/icon/icon.tsx +18 -18
- package/src/components/index.ts +1 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
WARN Issue while reading "/runnertmp/_work/tooling/tooling/.npmrc". Failed to replace env in config: ${NPM_ACCESS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @shipfox/react-ui@0.
|
|
3
|
+
> @shipfox/react-ui@0.8.0 build /runnertmp/_work/tooling/tooling/libs/react/ui
|
|
4
4
|
> swc && pnpm run build:css
|
|
5
5
|
|
|
6
|
-
Successfully compiled:
|
|
6
|
+
Successfully compiled: 119 files with swc (289.23ms)
|
|
7
7
|
WARN Issue while reading "/runnertmp/_work/tooling/tooling/.npmrc". Failed to replace env in config: ${NPM_ACCESS_TOKEN}
|
|
8
8
|
|
|
9
|
-
> @shipfox/react-ui@0.
|
|
9
|
+
> @shipfox/react-ui@0.8.0 build:css /runnertmp/_work/tooling/tooling/libs/react/ui
|
|
10
10
|
> vite build --config vite.css.config.ts && rm -f dist/css-entry.js dist/css-entry.js.map
|
|
11
11
|
|
|
12
12
|
[36mvite v7.2.2 [32mbuilding client environment for production...[36m[39m
|
|
@@ -14,6 +14,6 @@ transforming...
|
|
|
14
14
|
[32m✓[39m 2 modules transformed.
|
|
15
15
|
rendering chunks...
|
|
16
16
|
computing gzip size...
|
|
17
|
-
[2mdist/[22m[35mstyles.css [39m[1m[
|
|
17
|
+
[2mdist/[22m[35mstyles.css [39m[1m[2m85.04 kB[22m[1m[22m[2m │ gzip: 13.51 kB[22m
|
|
18
18
|
[2mdist/[22m[36mcss-entry.js [39m[1m[2m 0.00 kB[22m[1m[22m[2m │ gzip: 0.02 kB[22m
|
|
19
|
-
[32m✓ built in
|
|
19
|
+
[32m✓ built in 478ms[39m
|
package/.turbo/turbo-check.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
WARN Issue while reading "/runnertmp/_work/tooling/tooling/.npmrc". Failed to replace env in config: ${NPM_ACCESS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @shipfox/react-ui@0.
|
|
3
|
+
> @shipfox/react-ui@0.8.0 check /runnertmp/_work/tooling/tooling/libs/react/ui
|
|
4
4
|
> biome-check --fix
|
|
5
5
|
|
|
6
|
-
Checked
|
|
6
|
+
Checked 138 files in 244ms. No fixes applied.
|
package/.turbo/turbo-type.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
WARN Issue while reading "/runnertmp/_work/tooling/tooling/.npmrc". Failed to replace env in config: ${NPM_ACCESS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @shipfox/react-ui@0.
|
|
3
|
+
> @shipfox/react-ui@0.8.0 type /runnertmp/_work/tooling/tooling/libs/react/ui
|
|
4
4
|
> tsc-emit
|
|
5
5
|
|
package/CHANGELOG.md
CHANGED
|
@@ -5,9 +5,10 @@ export declare const buttonVariants: (props?: ({
|
|
|
5
5
|
variant?: "transparent" | "success" | "primary" | "secondary" | "danger" | "transparentMuted" | null | undefined;
|
|
6
6
|
size?: "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
7
7
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
|
-
export declare function Button({ className, variant, size, asChild, children, iconLeft, iconRight, ...props }: ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
|
|
8
|
+
export declare function Button({ className, variant, size, asChild, children, iconLeft, iconRight, isLoading, disabled, ...props }: ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
|
|
9
9
|
asChild?: boolean;
|
|
10
10
|
iconLeft?: IconName;
|
|
11
11
|
iconRight?: IconName;
|
|
12
|
+
isLoading?: boolean;
|
|
12
13
|
}): import("react/jsx-runtime").JSX.Element;
|
|
13
14
|
//# sourceMappingURL=button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,cAAc;;;8EAgC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,cAAc;;;8EAgC1B,CAAC;AAWF,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAiB,EACjB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GACzB,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,2CAuBF"}
|
|
@@ -27,8 +27,17 @@ export const buttonVariants = cva('rounded-6 inline-flex items-center justify-ce
|
|
|
27
27
|
size: 'md'
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
|
-
|
|
30
|
+
const spinnerSizeMap = {
|
|
31
|
+
'2xs': 'size-10',
|
|
32
|
+
xs: 'size-10',
|
|
33
|
+
sm: 'size-12',
|
|
34
|
+
md: 'size-14',
|
|
35
|
+
lg: 'size-16',
|
|
36
|
+
xl: 'size-18'
|
|
37
|
+
};
|
|
38
|
+
export function Button({ className, variant, size, asChild = false, children, iconLeft, iconRight, isLoading = false, disabled, ...props }) {
|
|
31
39
|
const Comp = asChild ? Slot : 'button';
|
|
40
|
+
const spinnerSize = spinnerSizeMap[size ?? 'md'];
|
|
32
41
|
return /*#__PURE__*/ _jsxs(Comp, {
|
|
33
42
|
"data-slot": "button",
|
|
34
43
|
className: cn(buttonVariants({
|
|
@@ -36,9 +45,15 @@ export function Button({ className, variant, size, asChild = false, children, ic
|
|
|
36
45
|
size,
|
|
37
46
|
className
|
|
38
47
|
})),
|
|
48
|
+
disabled: disabled || isLoading,
|
|
49
|
+
"aria-busy": isLoading,
|
|
50
|
+
"aria-live": isLoading ? 'polite' : undefined,
|
|
39
51
|
...props,
|
|
40
52
|
children: [
|
|
41
|
-
|
|
53
|
+
isLoading ? /*#__PURE__*/ _jsx(Icon, {
|
|
54
|
+
name: "spinner",
|
|
55
|
+
className: spinnerSize
|
|
56
|
+
}) : iconLeft && /*#__PURE__*/ _jsx(Icon, {
|
|
42
57
|
name: iconLeft
|
|
43
58
|
}),
|
|
44
59
|
children,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/button.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const buttonVariants = cva(\n 'rounded-6 inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none shrink-0 outline-none',\n {\n variants: {\n variant: {\n primary:\n 'bg-background-button-inverted-default text-foreground-contrast-primary shadow-button-inverted hover:bg-background-button-inverted-hover active:bg-background-button-inverted-pressed focus-visible:shadow-button-inverted-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n secondary:\n 'bg-background-button-neutral-default text-foreground-neutral-base shadow-button-neutral hover:bg-background-button-neutral-hover active:bg-background-button-neutral-pressed disabled:bg-background-neutral-disabled focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled disabled:shadow-none',\n danger:\n 'bg-background-button-danger-default text-foreground-neutral-on-color shadow-button-danger hover:bg-background-button-danger-hover active:bg-background-button-danger-pressed focus-visible:shadow-button-danger-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n success:\n 'bg-background-button-success-default text-foreground-neutral-on-color shadow-button-success hover:bg-background-button-success-hover active:bg-background-button-success-pressed focus-visible:shadow-button-success-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n transparent:\n 'bg-background-button-transparent-default text-foreground-neutral-base hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n transparentMuted:\n 'bg-background-button-transparent-default text-foreground-neutral-muted hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n },\n size: {\n '2xs': 'h-20 px-6 text-xs gap-4',\n xs: 'h-24 px-6 text-xs gap-4',\n sm: 'h-28 px-8 text-sm gap-6',\n md: 'h-32 px-10 text-md gap-8',\n lg: 'h-36 px-12 text-lg gap-8',\n xl: 'h-40 px-12 text-xl gap-10',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n);\n\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n children,\n iconLeft,\n iconRight,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n iconLeft?: IconName;\n iconRight?: IconName;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/button.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const buttonVariants = cva(\n 'rounded-6 inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none shrink-0 outline-none',\n {\n variants: {\n variant: {\n primary:\n 'bg-background-button-inverted-default text-foreground-contrast-primary shadow-button-inverted hover:bg-background-button-inverted-hover active:bg-background-button-inverted-pressed focus-visible:shadow-button-inverted-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n secondary:\n 'bg-background-button-neutral-default text-foreground-neutral-base shadow-button-neutral hover:bg-background-button-neutral-hover active:bg-background-button-neutral-pressed disabled:bg-background-neutral-disabled focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled disabled:shadow-none',\n danger:\n 'bg-background-button-danger-default text-foreground-neutral-on-color shadow-button-danger hover:bg-background-button-danger-hover active:bg-background-button-danger-pressed focus-visible:shadow-button-danger-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n success:\n 'bg-background-button-success-default text-foreground-neutral-on-color shadow-button-success hover:bg-background-button-success-hover active:bg-background-button-success-pressed focus-visible:shadow-button-success-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n transparent:\n 'bg-background-button-transparent-default text-foreground-neutral-base hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n transparentMuted:\n 'bg-background-button-transparent-default text-foreground-neutral-muted hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n },\n size: {\n '2xs': 'h-20 px-6 text-xs gap-4',\n xs: 'h-24 px-6 text-xs gap-4',\n sm: 'h-28 px-8 text-sm gap-6',\n md: 'h-32 px-10 text-md gap-8',\n lg: 'h-36 px-12 text-lg gap-8',\n xl: 'h-40 px-12 text-xl gap-10',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n);\n\nconst spinnerSizeMap: Record<NonNullable<VariantProps<typeof buttonVariants>['size']>, string> = {\n '2xs': 'size-10',\n xs: 'size-10',\n sm: 'size-12',\n md: 'size-14',\n lg: 'size-16',\n xl: 'size-18',\n};\n\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n children,\n iconLeft,\n iconRight,\n isLoading = false,\n disabled,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n iconLeft?: IconName;\n iconRight?: IconName;\n isLoading?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n const spinnerSize =\n spinnerSizeMap[(size ?? 'md') as NonNullable<VariantProps<typeof buttonVariants>['size']>];\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({variant, size, className}))}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n aria-live={isLoading ? 'polite' : undefined}\n {...props}\n >\n {isLoading ? (\n <Icon name=\"spinner\" className={spinnerSize} />\n ) : (\n iconLeft && <Icon name={iconLeft} />\n )}\n {children}\n {iconRight && <Icon name={iconRight} />}\n </Comp>\n );\n}\n"],"names":["Slot","cva","Icon","cn","buttonVariants","variants","variant","primary","secondary","danger","success","transparent","transparentMuted","size","xs","sm","md","lg","xl","defaultVariants","spinnerSizeMap","Button","className","asChild","children","iconLeft","iconRight","isLoading","disabled","props","Comp","spinnerSize","data-slot","aria-busy","aria-live","undefined","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,uBAAuB;AAC1C,SAAQC,GAAG,QAA0B,2BAA2B;AAChE,SAAQC,IAAI,QAAsB,kBAAkB;AAEpD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,MAAMC,iBAAiBH,IAC5B,4IACA;IACEI,UAAU;QACRC,SAAS;YACPC,SACE;YACFC,WACE;YACFC,QACE;YACFC,SACE;YACFC,aACE;YACFC,kBACE;QACJ;QACAC,MAAM;YACJ,OAAO;YACPC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;QACN;IACF;IACAC,iBAAiB;QACfb,SAAS;QACTO,MAAM;IACR;AACF,GACA;AAEF,MAAMO,iBAA2F;IAC/F,OAAO;IACPN,IAAI;IACJC,IAAI;IACJC,IAAI;IACJC,IAAI;IACJC,IAAI;AACN;AAEA,OAAO,SAASG,OAAO,EACrBC,SAAS,EACThB,OAAO,EACPO,IAAI,EACJU,UAAU,KAAK,EACfC,QAAQ,EACRC,QAAQ,EACRC,SAAS,EACTC,YAAY,KAAK,EACjBC,QAAQ,EACR,GAAGC,OAOF;IACD,MAAMC,OAAOP,UAAUvB,OAAO;IAC9B,MAAM+B,cACJX,cAAc,CAAEP,QAAQ,KAAkE;IAE5F,qBACE,MAACiB;QACCE,aAAU;QACVV,WAAWnB,GAAGC,eAAe;YAACE;YAASO;YAAMS;QAAS;QACtDM,UAAUA,YAAYD;QACtBM,aAAWN;QACXO,aAAWP,YAAY,WAAWQ;QACjC,GAAGN,KAAK;;YAERF,0BACC,KAACzB;gBAAKkC,MAAK;gBAAUd,WAAWS;iBAEhCN,0BAAY,KAACvB;gBAAKkC,MAAMX;;YAEzBD;YACAE,2BAAa,KAACxB;gBAAKkC,MAAMV;;;;AAGhC"}
|
|
@@ -34,6 +34,9 @@ const meta = {
|
|
|
34
34
|
},
|
|
35
35
|
asChild: {
|
|
36
36
|
control: 'boolean'
|
|
37
|
+
},
|
|
38
|
+
isLoading: {
|
|
39
|
+
control: 'boolean'
|
|
37
40
|
}
|
|
38
41
|
},
|
|
39
42
|
args: {
|
|
@@ -158,5 +161,27 @@ export const Icons = {
|
|
|
158
161
|
]
|
|
159
162
|
})
|
|
160
163
|
};
|
|
164
|
+
export const Loading = {
|
|
165
|
+
render: (args)=>/*#__PURE__*/ _jsxs("div", {
|
|
166
|
+
className: "flex flex-col gap-16",
|
|
167
|
+
children: [
|
|
168
|
+
/*#__PURE__*/ _jsx("div", {
|
|
169
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
170
|
+
...args,
|
|
171
|
+
isLoading: true,
|
|
172
|
+
children: "Loading..."
|
|
173
|
+
})
|
|
174
|
+
}),
|
|
175
|
+
/*#__PURE__*/ _jsx("div", {
|
|
176
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
177
|
+
...args,
|
|
178
|
+
isLoading: true,
|
|
179
|
+
iconLeft: "google",
|
|
180
|
+
children: "Loading with left icon"
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
]
|
|
184
|
+
})
|
|
185
|
+
};
|
|
161
186
|
|
|
162
187
|
//# sourceMappingURL=button.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/button.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {Button} from './button';\n\nconst variantOptions = [\n 'primary',\n 'secondary',\n 'danger',\n 'success',\n 'transparent',\n 'transparentMuted',\n] as const;\nconst sizeOptions = ['2xs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nconst meta = {\n title: 'Components/Button',\n component: Button,\n tags: ['autodocs'],\n argTypes: {\n variant: {\n control: 'select',\n options: variantOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n asChild: {control: 'boolean'},\n },\n args: {\n children: 'Click me',\n variant: 'primary',\n size: 'md',\n },\n} satisfies Meta<typeof Button>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {};\n\nexport const Variants: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n {sizeOptions.map((size) => (\n <table key={size} className=\"w-fit border-separate border-spacing-x-32 border-spacing-y-16\">\n <thead>\n <tr>\n <th>{size}</th>\n <th>Default</th>\n <th>Hover</th>\n <th>Focus</th>\n <th>Disabled</th>\n </tr>\n </thead>\n <tbody>\n {variantOptions.map((variant) => (\n <tr key={variant}>\n <td>\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {variant}\n </Code>\n </td>\n <td>\n <Button {...args} variant={variant} size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"hover\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"focus\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} disabled size={size}>\n Click me\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n ),\n};\n\nVariants.parameters = {\n pseudo: {\n hover: '.hover',\n focusVisible: '.focus',\n },\n};\n\nexport const Icons: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div>\n <Button {...args} iconLeft=\"google\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconLeft=\"google\" iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n </div>\n ),\n};\n"],"names":["Code","Button","variantOptions","sizeOptions","meta","title","component","tags","argTypes","variant","control","options","size","asChild","args","children","Default","Variants","render","div","className","map","table","thead","tr","th","tbody","td","disabled","parameters","pseudo","hover","focusVisible","Icons","iconLeft","iconRight"],"mappings":";AACA,SAAQA,IAAI,QAAO,wBAAwB;AAC3C,SAAQC,MAAM,QAAO,WAAW;AAEhC,MAAMC,iBAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAMC,cAAc;IAAC;IAAO;IAAM;IAAM;IAAM;IAAM;CAAK;AAEzD,MAAMC,OAAO;IACXC,OAAO;IACPC,WAAWL;IACXM,MAAM;QAAC;KAAW;IAClBC,UAAU;QACRC,SAAS;YACPC,SAAS;YACTC,SAAST;QACX;QACAU,MAAM;YACJF,SAAS;YACTC,SAASR;QACX;QACAU,SAAS;YAACH,SAAS;QAAS;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/button.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {Button} from './button';\n\nconst variantOptions = [\n 'primary',\n 'secondary',\n 'danger',\n 'success',\n 'transparent',\n 'transparentMuted',\n] as const;\nconst sizeOptions = ['2xs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nconst meta = {\n title: 'Components/Button',\n component: Button,\n tags: ['autodocs'],\n argTypes: {\n variant: {\n control: 'select',\n options: variantOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n asChild: {control: 'boolean'},\n isLoading: {control: 'boolean'},\n },\n args: {\n children: 'Click me',\n variant: 'primary',\n size: 'md',\n },\n} satisfies Meta<typeof Button>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {};\n\nexport const Variants: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n {sizeOptions.map((size) => (\n <table key={size} className=\"w-fit border-separate border-spacing-x-32 border-spacing-y-16\">\n <thead>\n <tr>\n <th>{size}</th>\n <th>Default</th>\n <th>Hover</th>\n <th>Focus</th>\n <th>Disabled</th>\n </tr>\n </thead>\n <tbody>\n {variantOptions.map((variant) => (\n <tr key={variant}>\n <td>\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {variant}\n </Code>\n </td>\n <td>\n <Button {...args} variant={variant} size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"hover\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"focus\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} disabled size={size}>\n Click me\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n ),\n};\n\nVariants.parameters = {\n pseudo: {\n hover: '.hover',\n focusVisible: '.focus',\n },\n};\n\nexport const Icons: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div>\n <Button {...args} iconLeft=\"google\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconLeft=\"google\" iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n </div>\n ),\n};\n\nexport const Loading: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div>\n <Button {...args} isLoading>\n Loading...\n </Button>\n </div>\n <div>\n <Button {...args} isLoading iconLeft=\"google\">\n Loading with left icon\n </Button>\n </div>\n </div>\n ),\n};\n"],"names":["Code","Button","variantOptions","sizeOptions","meta","title","component","tags","argTypes","variant","control","options","size","asChild","isLoading","args","children","Default","Variants","render","div","className","map","table","thead","tr","th","tbody","td","disabled","parameters","pseudo","hover","focusVisible","Icons","iconLeft","iconRight","Loading"],"mappings":";AACA,SAAQA,IAAI,QAAO,wBAAwB;AAC3C,SAAQC,MAAM,QAAO,WAAW;AAEhC,MAAMC,iBAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAMC,cAAc;IAAC;IAAO;IAAM;IAAM;IAAM;IAAM;CAAK;AAEzD,MAAMC,OAAO;IACXC,OAAO;IACPC,WAAWL;IACXM,MAAM;QAAC;KAAW;IAClBC,UAAU;QACRC,SAAS;YACPC,SAAS;YACTC,SAAST;QACX;QACAU,MAAM;YACJF,SAAS;YACTC,SAASR;QACX;QACAU,SAAS;YAACH,SAAS;QAAS;QAC5BI,WAAW;YAACJ,SAAS;QAAS;IAChC;IACAK,MAAM;QACJC,UAAU;QACVP,SAAS;QACTG,MAAM;IACR;AACF;AAEA,eAAeR,KAAK;AAGpB,OAAO,MAAMa,UAAiB,CAAC,EAAE;AAEjC,OAAO,MAAMC,WAAkB;IAC7BC,QAAQ,CAACJ,qBACP,KAACK;YAAIC,WAAU;sBACZlB,YAAYmB,GAAG,CAAC,CAACV,qBAChB,MAACW;oBAAiBF,WAAU;;sCAC1B,KAACG;sCACC,cAAA,MAACC;;kDACC,KAACC;kDAAId;;kDACL,KAACc;kDAAG;;kDACJ,KAACA;kDAAG;;kDACJ,KAACA;kDAAG;;kDACJ,KAACA;kDAAG;;;;;sCAGR,KAACC;sCACEzB,eAAeoB,GAAG,CAAC,CAACb,wBACnB,MAACgB;;sDACC,KAACG;sDACC,cAAA,KAAC5B;gDAAKS,SAAQ;gDAAQY,WAAU;0DAC7BZ;;;sDAGL,KAACmB;sDACC,cAAA,KAAC3B;gDAAQ,GAAGc,IAAI;gDAAEN,SAASA;gDAASG,MAAMA;0DAAM;;;sDAIlD,KAACgB;sDACC,cAAA,KAAC3B;gDAAQ,GAAGc,IAAI;gDAAEN,SAASA;gDAASY,WAAU;gDAAQT,MAAMA;0DAAM;;;sDAIpE,KAACgB;sDACC,cAAA,KAAC3B;gDAAQ,GAAGc,IAAI;gDAAEN,SAASA;gDAASY,WAAU;gDAAQT,MAAMA;0DAAM;;;sDAIpE,KAACgB;sDACC,cAAA,KAAC3B;gDAAQ,GAAGc,IAAI;gDAAEN,SAASA;gDAASoB,QAAQ;gDAACjB,MAAMA;0DAAM;;;;mCAtBpDH;;;mBAZHG;;AA6CpB,EAAE;AAEFM,SAASY,UAAU,GAAG;IACpBC,QAAQ;QACNC,OAAO;QACPC,cAAc;IAChB;AACF;AAEA,OAAO,MAAMC,QAAe;IAC1Bf,QAAQ,CAACJ,qBACP,MAACK;YAAIC,WAAU;;8BACb,KAACD;8BACC,cAAA,KAACnB;wBAAQ,GAAGc,IAAI;wBAAEoB,UAAS;kCAAS;;;8BAItC,KAACf;8BACC,cAAA,KAACnB;wBAAQ,GAAGc,IAAI;wBAAEqB,WAAU;kCAAY;;;8BAI1C,KAAChB;8BACC,cAAA,KAACnB;wBAAQ,GAAGc,IAAI;wBAAEoB,UAAS;wBAASC,WAAU;kCAAY;;;;;AAMlE,EAAE;AAEF,OAAO,MAAMC,UAAiB;IAC5BlB,QAAQ,CAACJ,qBACP,MAACK;YAAIC,WAAU;;8BACb,KAACD;8BACC,cAAA,KAACnB;wBAAQ,GAAGc,IAAI;wBAAED,SAAS;kCAAC;;;8BAI9B,KAACM;8BACC,cAAA,KAACnB;wBAAQ,GAAGc,IAAI;wBAAED,SAAS;wBAACqB,UAAS;kCAAS;;;;;AAMtD,EAAE"}
|
|
@@ -7,8 +7,9 @@ export declare const iconButtonVariants: (props?: ({
|
|
|
7
7
|
radius?: "full" | "rounded" | null | undefined;
|
|
8
8
|
muted?: boolean | null | undefined;
|
|
9
9
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
|
-
export declare function IconButton({ className, variant, size, radius, muted, asChild, children, icon, ...props }: ComponentProps<'button'> & VariantProps<typeof iconButtonVariants> & {
|
|
10
|
+
export declare function IconButton({ className, variant, size, radius, muted, asChild, children, icon, isLoading, disabled, ...props }: ComponentProps<'button'> & VariantProps<typeof iconButtonVariants> & {
|
|
11
11
|
asChild?: boolean;
|
|
12
12
|
icon?: IconName;
|
|
13
|
+
isLoading?: boolean;
|
|
13
14
|
}): import("react/jsx-runtime").JSX.Element;
|
|
14
15
|
//# sourceMappingURL=icon-button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/button/icon-button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,kBAAkB;;;;;8EAkC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/button/icon-button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,kBAAkB;;;;;8EAkC9B,CAAC;AAcF,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAe,EACf,QAAQ,EACR,IAAI,EACJ,SAAiB,EACjB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GACzB,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,2CAsBF"}
|
|
@@ -33,8 +33,17 @@ export const iconButtonVariants = cva('inline-flex items-center justify-center w
|
|
|
33
33
|
muted: false
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
|
-
|
|
36
|
+
const spinnerSizeMap = {
|
|
37
|
+
'2xs': 'size-8',
|
|
38
|
+
xs: 'size-10',
|
|
39
|
+
sm: 'size-12',
|
|
40
|
+
md: 'size-14',
|
|
41
|
+
lg: 'size-16',
|
|
42
|
+
xl: 'size-18'
|
|
43
|
+
};
|
|
44
|
+
export function IconButton({ className, variant, size, radius, muted, asChild = false, children, icon, isLoading = false, disabled, ...props }) {
|
|
37
45
|
const Comp = asChild ? Slot : 'button';
|
|
46
|
+
const spinnerSize = spinnerSizeMap[size ?? 'md'];
|
|
38
47
|
return /*#__PURE__*/ _jsx(Comp, {
|
|
39
48
|
"data-slot": "icon-button",
|
|
40
49
|
className: cn(iconButtonVariants({
|
|
@@ -43,8 +52,14 @@ export function IconButton({ className, variant, size, radius, muted, asChild =
|
|
|
43
52
|
radius,
|
|
44
53
|
muted
|
|
45
54
|
}), className),
|
|
55
|
+
disabled: disabled || isLoading,
|
|
56
|
+
"aria-busy": isLoading,
|
|
57
|
+
"aria-live": isLoading ? 'polite' : undefined,
|
|
46
58
|
...props,
|
|
47
|
-
children:
|
|
59
|
+
children: isLoading ? /*#__PURE__*/ _jsx(Icon, {
|
|
60
|
+
name: "spinner",
|
|
61
|
+
className: spinnerSize
|
|
62
|
+
}) : icon ? /*#__PURE__*/ _jsx(Icon, {
|
|
48
63
|
name: icon
|
|
49
64
|
}) : children
|
|
50
65
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/icon-button.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const iconButtonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none shrink-0 outline-none',\n {\n variants: {\n variant: {\n primary:\n 'bg-background-button-inverted-default text-tag-neutral-icon shadow-button-inverted hover:bg-background-button-inverted-hover active:bg-background-button-inverted-pressed focus-visible:shadow-button-inverted-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n transparent:\n 'bg-background-button-transparent-default text-tag-neutral-icon hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n },\n size: {\n '2xs': 'w-20 h-20 text-xs',\n xs: 'w-24 h-24 text-xs',\n sm: 'w-28 h-28 text-sm',\n md: 'w-32 h-32 text-md',\n lg: 'w-36 h-36 text-lg',\n xl: 'w-40 h-40 text-xl',\n },\n radius: {\n rounded: 'rounded-6',\n full: 'rounded-full',\n },\n muted: {\n true: 'opacity-60',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n radius: 'rounded',\n muted: false,\n },\n },\n);\n\nexport function IconButton({\n className,\n variant,\n size,\n radius,\n muted,\n asChild = false,\n children,\n icon,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof iconButtonVariants> & {\n asChild?: boolean;\n icon?: IconName;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"icon-button\"\n className={cn(iconButtonVariants({variant, size, radius, muted}), className)}\n {...props}\n >\n {icon ? <Icon name={icon}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/icon-button.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const iconButtonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none shrink-0 outline-none',\n {\n variants: {\n variant: {\n primary:\n 'bg-background-button-inverted-default text-tag-neutral-icon shadow-button-inverted hover:bg-background-button-inverted-hover active:bg-background-button-inverted-pressed focus-visible:shadow-button-inverted-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n transparent:\n 'bg-background-button-transparent-default text-tag-neutral-icon hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n },\n size: {\n '2xs': 'w-20 h-20 text-xs',\n xs: 'w-24 h-24 text-xs',\n sm: 'w-28 h-28 text-sm',\n md: 'w-32 h-32 text-md',\n lg: 'w-36 h-36 text-lg',\n xl: 'w-40 h-40 text-xl',\n },\n radius: {\n rounded: 'rounded-6',\n full: 'rounded-full',\n },\n muted: {\n true: 'opacity-60',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n radius: 'rounded',\n muted: false,\n },\n },\n);\n\nconst spinnerSizeMap: Record<\n NonNullable<VariantProps<typeof iconButtonVariants>['size']>,\n string\n> = {\n '2xs': 'size-8',\n xs: 'size-10',\n sm: 'size-12',\n md: 'size-14',\n lg: 'size-16',\n xl: 'size-18',\n};\n\nexport function IconButton({\n className,\n variant,\n size,\n radius,\n muted,\n asChild = false,\n children,\n icon,\n isLoading = false,\n disabled,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof iconButtonVariants> & {\n asChild?: boolean;\n icon?: IconName;\n isLoading?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n const spinnerSize = spinnerSizeMap[size ?? 'md'];\n\n return (\n <Comp\n data-slot=\"icon-button\"\n className={cn(iconButtonVariants({variant, size, radius, muted}), className)}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n aria-live={isLoading ? 'polite' : undefined}\n {...props}\n >\n {isLoading ? (\n <Icon name=\"spinner\" className={spinnerSize} />\n ) : icon ? (\n <Icon name={icon} />\n ) : (\n children\n )}\n </Comp>\n );\n}\n"],"names":["Slot","cva","Icon","cn","iconButtonVariants","variants","variant","primary","transparent","size","xs","sm","md","lg","xl","radius","rounded","full","muted","true","false","defaultVariants","spinnerSizeMap","IconButton","className","asChild","children","icon","isLoading","disabled","props","Comp","spinnerSize","data-slot","aria-busy","aria-live","undefined","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,uBAAuB;AAC1C,SAAQC,GAAG,QAA0B,2BAA2B;AAChE,SAAQC,IAAI,QAAsB,kBAAkB;AAEpD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,MAAMC,qBAAqBH,IAChC,kIACA;IACEI,UAAU;QACRC,SAAS;YACPC,SACE;YACFC,aACE;QACJ;QACAC,MAAM;YACJ,OAAO;YACPC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;QACN;QACAC,QAAQ;YACNC,SAAS;YACTC,MAAM;QACR;QACAC,OAAO;YACLC,MAAM;YACNC,OAAO;QACT;IACF;IACAC,iBAAiB;QACff,SAAS;QACTG,MAAM;QACNM,QAAQ;QACRG,OAAO;IACT;AACF,GACA;AAEF,MAAMI,iBAGF;IACF,OAAO;IACPZ,IAAI;IACJC,IAAI;IACJC,IAAI;IACJC,IAAI;IACJC,IAAI;AACN;AAEA,OAAO,SAASS,WAAW,EACzBC,SAAS,EACTlB,OAAO,EACPG,IAAI,EACJM,MAAM,EACNG,KAAK,EACLO,UAAU,KAAK,EACfC,QAAQ,EACRC,IAAI,EACJC,YAAY,KAAK,EACjBC,QAAQ,EACR,GAAGC,OAMF;IACD,MAAMC,OAAON,UAAUzB,OAAO;IAC9B,MAAMgC,cAAcV,cAAc,CAACb,QAAQ,KAAK;IAEhD,qBACE,KAACsB;QACCE,aAAU;QACVT,WAAWrB,GAAGC,mBAAmB;YAACE;YAASG;YAAMM;YAAQG;QAAK,IAAIM;QAClEK,UAAUA,YAAYD;QACtBM,aAAWN;QACXO,aAAWP,YAAY,WAAWQ;QACjC,GAAGN,KAAK;kBAERF,0BACC,KAAC1B;YAAKmC,MAAK;YAAUb,WAAWQ;aAC9BL,qBACF,KAACzB;YAAKmC,MAAMV;aAEZD;;AAIR"}
|
|
@@ -250,5 +250,95 @@ export const Sizes = {
|
|
|
250
250
|
]
|
|
251
251
|
})
|
|
252
252
|
};
|
|
253
|
+
export const Loading = {
|
|
254
|
+
render: ({ children: _children, ...args })=>/*#__PURE__*/ _jsxs("div", {
|
|
255
|
+
className: "flex flex-col gap-32",
|
|
256
|
+
children: [
|
|
257
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
258
|
+
className: "flex flex-col gap-16",
|
|
259
|
+
children: [
|
|
260
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
261
|
+
variant: "label",
|
|
262
|
+
children: "Loading by Size:"
|
|
263
|
+
}),
|
|
264
|
+
/*#__PURE__*/ _jsx("div", {
|
|
265
|
+
className: "flex gap-16 items-center",
|
|
266
|
+
children: sizeOptions.map((size)=>/*#__PURE__*/ _jsxs("div", {
|
|
267
|
+
className: "flex flex-col gap-8 items-center",
|
|
268
|
+
children: [
|
|
269
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
270
|
+
variant: "label",
|
|
271
|
+
className: "text-foreground-neutral-subtle text-xs",
|
|
272
|
+
children: size
|
|
273
|
+
}),
|
|
274
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
275
|
+
...args,
|
|
276
|
+
icon: "addLine",
|
|
277
|
+
"aria-label": "Loading",
|
|
278
|
+
size: size,
|
|
279
|
+
isLoading: true
|
|
280
|
+
})
|
|
281
|
+
]
|
|
282
|
+
}, size))
|
|
283
|
+
})
|
|
284
|
+
]
|
|
285
|
+
}),
|
|
286
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
287
|
+
className: "flex flex-col gap-16",
|
|
288
|
+
children: [
|
|
289
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
290
|
+
variant: "label",
|
|
291
|
+
children: "Loading by Variant:"
|
|
292
|
+
}),
|
|
293
|
+
/*#__PURE__*/ _jsx("div", {
|
|
294
|
+
className: "flex gap-16 items-center",
|
|
295
|
+
children: variantOptions.map((variant)=>/*#__PURE__*/ _jsxs("div", {
|
|
296
|
+
className: "flex flex-col gap-8 items-center",
|
|
297
|
+
children: [
|
|
298
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
299
|
+
variant: "label",
|
|
300
|
+
className: "text-foreground-neutral-subtle text-xs",
|
|
301
|
+
children: variant
|
|
302
|
+
}),
|
|
303
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
304
|
+
...args,
|
|
305
|
+
icon: "addLine",
|
|
306
|
+
"aria-label": "Loading",
|
|
307
|
+
variant: variant,
|
|
308
|
+
isLoading: true
|
|
309
|
+
})
|
|
310
|
+
]
|
|
311
|
+
}, variant))
|
|
312
|
+
})
|
|
313
|
+
]
|
|
314
|
+
}),
|
|
315
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
316
|
+
className: "flex flex-col gap-16",
|
|
317
|
+
children: [
|
|
318
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
319
|
+
variant: "label",
|
|
320
|
+
children: "Normal vs Loading:"
|
|
321
|
+
}),
|
|
322
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
323
|
+
className: "flex gap-16 items-center",
|
|
324
|
+
children: [
|
|
325
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
326
|
+
...args,
|
|
327
|
+
icon: "addLine",
|
|
328
|
+
"aria-label": "Add"
|
|
329
|
+
}),
|
|
330
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
331
|
+
...args,
|
|
332
|
+
icon: "addLine",
|
|
333
|
+
"aria-label": "Loading",
|
|
334
|
+
isLoading: true
|
|
335
|
+
})
|
|
336
|
+
]
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
})
|
|
340
|
+
]
|
|
341
|
+
})
|
|
342
|
+
};
|
|
253
343
|
|
|
254
344
|
//# sourceMappingURL=icon-button.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/icon-button.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {IconButton} from './icon-button';\n\nconst variantOptions = ['primary', 'transparent'] as const;\nconst sizeOptions = ['2xs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\nconst radiusOptions = ['rounded', 'full'] as const;\n\nconst meta = {\n title: 'Components/Button/IconButton',\n component: IconButton,\n tags: ['autodocs'],\n argTypes: {\n variant: {\n control: 'select',\n options: variantOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n radius: {\n control: 'select',\n options: radiusOptions,\n },\n muted: {control: 'boolean'},\n asChild: {control: 'boolean'},\n },\n args: {\n icon: 'addLine',\n variant: 'primary',\n size: 'md',\n radius: 'rounded',\n muted: false,\n },\n} satisfies Meta<typeof IconButton>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {};\n\nexport const Variants: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n {sizeOptions.map((size) => (\n <div key={size} className=\"flex flex-col gap-16\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n Size: {size}\n </Code>\n {radiusOptions.map((radius) => (\n <table\n key={radius}\n className=\"w-fit border-separate border-spacing-x-32 border-spacing-y-16\"\n >\n <thead>\n <tr>\n <th>{radius}</th>\n <th>Default</th>\n <th>Hover</th>\n <th>Focus</th>\n <th>Disabled</th>\n </tr>\n </thead>\n <tbody>\n {variantOptions.map((variant) => (\n <tr key={variant}>\n <td>\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {variant}\n </Code>\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n className=\"hover\"\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n className=\"focus\"\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n disabled\n size={size}\n radius={radius}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n ))}\n </div>\n ),\n};\n\nVariants.parameters = {\n pseudo: {\n hover: '.hover',\n focusVisible: '.focus',\n },\n};\n\nexport const Muted: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Normal:</Code>\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" />\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" variant=\"transparent\" />\n </div>\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Muted:</Code>\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" muted />\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" variant=\"transparent\" muted />\n </div>\n </div>\n ),\n};\n\nexport const Sizes: Story = {\n render: ({children: _children, ...args}) => (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Rounded:</Code>\n {sizeOptions.map((size) => (\n <IconButton\n {...args}\n key={size}\n icon=\"addLine\"\n aria-label=\"Add\"\n size={size}\n radius=\"rounded\"\n />\n ))}\n </div>\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Full:</Code>\n {sizeOptions.map((size) => (\n <IconButton\n {...args}\n key={size}\n icon=\"addLine\"\n aria-label=\"Add\"\n size={size}\n radius=\"full\"\n />\n ))}\n </div>\n </div>\n ),\n};\n"],"names":["Code","IconButton","variantOptions","sizeOptions","radiusOptions","meta","title","component","tags","argTypes","variant","control","options","size","radius","muted","asChild","args","icon","Default","Variants","render","div","className","map","table","thead","tr","th","tbody","td","aria-label","disabled","parameters","pseudo","hover","focusVisible","Muted","Sizes","children","_children","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/icon-button.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {IconButton} from './icon-button';\n\nconst variantOptions = ['primary', 'transparent'] as const;\nconst sizeOptions = ['2xs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\nconst radiusOptions = ['rounded', 'full'] as const;\n\nconst meta = {\n title: 'Components/Button/IconButton',\n component: IconButton,\n tags: ['autodocs'],\n argTypes: {\n variant: {\n control: 'select',\n options: variantOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n radius: {\n control: 'select',\n options: radiusOptions,\n },\n muted: {control: 'boolean'},\n asChild: {control: 'boolean'},\n },\n args: {\n icon: 'addLine',\n variant: 'primary',\n size: 'md',\n radius: 'rounded',\n muted: false,\n },\n} satisfies Meta<typeof IconButton>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {};\n\nexport const Variants: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n {sizeOptions.map((size) => (\n <div key={size} className=\"flex flex-col gap-16\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n Size: {size}\n </Code>\n {radiusOptions.map((radius) => (\n <table\n key={radius}\n className=\"w-fit border-separate border-spacing-x-32 border-spacing-y-16\"\n >\n <thead>\n <tr>\n <th>{radius}</th>\n <th>Default</th>\n <th>Hover</th>\n <th>Focus</th>\n <th>Disabled</th>\n </tr>\n </thead>\n <tbody>\n {variantOptions.map((variant) => (\n <tr key={variant}>\n <td>\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {variant}\n </Code>\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n className=\"hover\"\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n className=\"focus\"\n size={size}\n radius={radius}\n />\n </td>\n <td>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Add\"\n variant={variant}\n disabled\n size={size}\n radius={radius}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n ))}\n </div>\n ),\n};\n\nVariants.parameters = {\n pseudo: {\n hover: '.hover',\n focusVisible: '.focus',\n },\n};\n\nexport const Muted: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Normal:</Code>\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" />\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" variant=\"transparent\" />\n </div>\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Muted:</Code>\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" muted />\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" variant=\"transparent\" muted />\n </div>\n </div>\n ),\n};\n\nexport const Sizes: Story = {\n render: ({children: _children, ...args}) => (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Rounded:</Code>\n {sizeOptions.map((size) => (\n <IconButton\n {...args}\n key={size}\n icon=\"addLine\"\n aria-label=\"Add\"\n size={size}\n radius=\"rounded\"\n />\n ))}\n </div>\n <div className=\"flex gap-16 items-center\">\n <Code variant=\"label\">Full:</Code>\n {sizeOptions.map((size) => (\n <IconButton\n {...args}\n key={size}\n icon=\"addLine\"\n aria-label=\"Add\"\n size={size}\n radius=\"full\"\n />\n ))}\n </div>\n </div>\n ),\n};\n\nexport const Loading: Story = {\n render: ({children: _children, ...args}) => (\n <div className=\"flex flex-col gap-32\">\n <div className=\"flex flex-col gap-16\">\n <Code variant=\"label\">Loading by Size:</Code>\n <div className=\"flex gap-16 items-center\">\n {sizeOptions.map((size) => (\n <div key={size} className=\"flex flex-col gap-8 items-center\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle text-xs\">\n {size}\n </Code>\n <IconButton {...args} icon=\"addLine\" aria-label=\"Loading\" size={size} isLoading />\n </div>\n ))}\n </div>\n </div>\n <div className=\"flex flex-col gap-16\">\n <Code variant=\"label\">Loading by Variant:</Code>\n <div className=\"flex gap-16 items-center\">\n {variantOptions.map((variant) => (\n <div key={variant} className=\"flex flex-col gap-8 items-center\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle text-xs\">\n {variant}\n </Code>\n <IconButton\n {...args}\n icon=\"addLine\"\n aria-label=\"Loading\"\n variant={variant}\n isLoading\n />\n </div>\n ))}\n </div>\n </div>\n <div className=\"flex flex-col gap-16\">\n <Code variant=\"label\">Normal vs Loading:</Code>\n <div className=\"flex gap-16 items-center\">\n <IconButton {...args} icon=\"addLine\" aria-label=\"Add\" />\n <IconButton {...args} icon=\"addLine\" aria-label=\"Loading\" isLoading />\n </div>\n </div>\n </div>\n ),\n};\n"],"names":["Code","IconButton","variantOptions","sizeOptions","radiusOptions","meta","title","component","tags","argTypes","variant","control","options","size","radius","muted","asChild","args","icon","Default","Variants","render","div","className","map","table","thead","tr","th","tbody","td","aria-label","disabled","parameters","pseudo","hover","focusVisible","Muted","Sizes","children","_children","key","Loading","isLoading"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ControllerProps, FieldPath, FieldValues } from 'react-hook-form';
|
|
3
|
+
declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>(props: import("react-hook-form").FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
|
|
4
|
+
declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ ...props }: ControllerProps<TFieldValues, TName>) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare const FormItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
6
|
+
declare const FormLabel: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-label").LabelProps & React.RefAttributes<HTMLLabelElement> & import("class-variance-authority").VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
|
|
7
|
+
declare const FormControl: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-slot").SlotProps & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
8
|
+
declare const FormDescription: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
9
|
+
declare const FormMessage: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
10
|
+
export { Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage };
|
|
11
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/components/form/form.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAC,eAAe,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAI7E,QAAA,MAAM,IAAI,4MAAe,CAAC;AAiB1B,QAAA,MAAM,SAAS,GACb,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,4CAMtC,CAAC;AA4BF,QAAA,MAAM,QAAQ,mKAUb,CAAC;AAGF,QAAA,MAAM,SAAS,gTAad,CAAC;AAGF,QAAA,MAAM,WAAW,8JAchB,CAAC;AAGF,QAAA,MAAM,eAAe,qLAiBpB,CAAC;AAGF,QAAA,MAAM,WAAW,qLAoBhB,CAAC;AAGF,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
3
|
+
import { Label } from '../../components/label/index.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Controller, FormProvider, useFormContext } from 'react-hook-form';
|
|
6
|
+
import { cn } from '../../utils/cn.js';
|
|
7
|
+
const Form = FormProvider;
|
|
8
|
+
const FormFieldContext = /*#__PURE__*/ React.createContext(null);
|
|
9
|
+
const FormItemContext = /*#__PURE__*/ React.createContext(null);
|
|
10
|
+
const FormField = ({ ...props })=>{
|
|
11
|
+
return /*#__PURE__*/ _jsx(FormFieldContext.Provider, {
|
|
12
|
+
value: {
|
|
13
|
+
name: props.name
|
|
14
|
+
},
|
|
15
|
+
children: /*#__PURE__*/ _jsx(Controller, {
|
|
16
|
+
...props
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
const useFormField = ()=>{
|
|
21
|
+
const fieldContext = React.useContext(FormFieldContext);
|
|
22
|
+
const itemContext = React.useContext(FormItemContext);
|
|
23
|
+
const { getFieldState, formState } = useFormContext();
|
|
24
|
+
if (!fieldContext) {
|
|
25
|
+
throw new Error('useFormField should be used within <FormField>');
|
|
26
|
+
}
|
|
27
|
+
if (!itemContext) {
|
|
28
|
+
throw new Error('useFormField should be used within <FormItem>');
|
|
29
|
+
}
|
|
30
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
31
|
+
const { id } = itemContext;
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
name: fieldContext.name,
|
|
35
|
+
formItemId: `${id}-form-item`,
|
|
36
|
+
formDescriptionId: `${id}-form-item-description`,
|
|
37
|
+
formMessageId: `${id}-form-item-message`,
|
|
38
|
+
...fieldState
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const FormItem = /*#__PURE__*/ React.forwardRef(({ className, ...props }, ref)=>{
|
|
42
|
+
const id = React.useId();
|
|
43
|
+
return /*#__PURE__*/ _jsx(FormItemContext.Provider, {
|
|
44
|
+
value: {
|
|
45
|
+
id
|
|
46
|
+
},
|
|
47
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
48
|
+
ref: ref,
|
|
49
|
+
className: className,
|
|
50
|
+
...props
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
FormItem.displayName = 'FormItem';
|
|
55
|
+
const FormLabel = /*#__PURE__*/ React.forwardRef(({ className, ...props }, ref)=>{
|
|
56
|
+
const { error, formItemId } = useFormField();
|
|
57
|
+
return /*#__PURE__*/ _jsx(Label, {
|
|
58
|
+
ref: ref,
|
|
59
|
+
className: cn(error && 'text-foreground-error', className),
|
|
60
|
+
htmlFor: formItemId,
|
|
61
|
+
...props
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
FormLabel.displayName = 'FormLabel';
|
|
65
|
+
const FormControl = /*#__PURE__*/ React.forwardRef(({ ...props }, ref)=>{
|
|
66
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
67
|
+
return /*#__PURE__*/ _jsx(Slot, {
|
|
68
|
+
ref: ref,
|
|
69
|
+
id: formItemId,
|
|
70
|
+
"aria-describedby": error ? formMessageId : formDescriptionId,
|
|
71
|
+
"aria-invalid": !!error,
|
|
72
|
+
...props
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
FormControl.displayName = 'FormControl';
|
|
76
|
+
const FormDescription = /*#__PURE__*/ React.forwardRef(({ className, ...props }, ref)=>{
|
|
77
|
+
const { error, formDescriptionId } = useFormField();
|
|
78
|
+
if (error) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return /*#__PURE__*/ _jsx("p", {
|
|
82
|
+
ref: ref,
|
|
83
|
+
id: formDescriptionId,
|
|
84
|
+
className: cn('text-sm text-foreground-neutral-muted', className),
|
|
85
|
+
...props
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
FormDescription.displayName = 'FormDescription';
|
|
89
|
+
const FormMessage = /*#__PURE__*/ React.forwardRef(({ className, children, ...props }, ref)=>{
|
|
90
|
+
const { error, formMessageId } = useFormField();
|
|
91
|
+
const body = error ? String(error?.message ?? '') : children;
|
|
92
|
+
if (!body) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return /*#__PURE__*/ _jsx("p", {
|
|
96
|
+
ref: ref,
|
|
97
|
+
id: formMessageId,
|
|
98
|
+
className: cn('text-sm font-medium text-foreground-highlight-error', className),
|
|
99
|
+
...props,
|
|
100
|
+
children: body
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
FormMessage.displayName = 'FormMessage';
|
|
104
|
+
export { Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/form/form.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {Label} from 'components/label';\nimport type {ComponentProps} from 'react';\nimport * as React from 'react';\nimport type {ControllerProps, FieldPath, FieldValues} from 'react-hook-form';\nimport {Controller, FormProvider, useFormContext} from 'react-hook-form';\nimport {cn} from 'utils/cn';\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null);\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null);\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{name: props.name}}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const {getFieldState, formState} = useFormContext();\n\n if (!fieldContext) {\n throw new Error('useFormField should be used within <FormField>');\n }\n\n if (!itemContext) {\n throw new Error('useFormField should be used within <FormItem>');\n }\n\n const fieldState = getFieldState(fieldContext.name, formState);\n const {id} = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\nconst FormItem = React.forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({className, ...props}, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{id}}>\n <div ref={ref} className={className} {...props} />\n </FormItemContext.Provider>\n );\n },\n);\nFormItem.displayName = 'FormItem';\n\nconst FormLabel = React.forwardRef<React.ElementRef<typeof Label>, ComponentProps<typeof Label>>(\n ({className, ...props}, ref) => {\n const {error, formItemId} = useFormField();\n\n return (\n <Label\n ref={ref}\n className={cn(error && 'text-foreground-error', className)}\n htmlFor={formItemId}\n {...props}\n />\n );\n },\n);\nFormLabel.displayName = 'FormLabel';\n\nconst FormControl = React.forwardRef<React.ElementRef<typeof Slot>, ComponentProps<typeof Slot>>(\n ({...props}, ref) => {\n const {error, formItemId, formDescriptionId, formMessageId} = useFormField();\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={error ? formMessageId : formDescriptionId}\n aria-invalid={!!error}\n {...props}\n />\n );\n },\n);\nFormControl.displayName = 'FormControl';\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, ComponentProps<'p'>>(\n ({className, ...props}, ref) => {\n const {error, formDescriptionId} = useFormField();\n\n if (error) {\n return null;\n }\n\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-sm text-foreground-neutral-muted', className)}\n {...props}\n />\n );\n },\n);\nFormDescription.displayName = 'FormDescription';\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, ComponentProps<'p'>>(\n ({className, children, ...props}, ref) => {\n const {error, formMessageId} = useFormField();\n const body = error ? String(error?.message ?? '') : children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-sm font-medium text-foreground-highlight-error', className)}\n {...props}\n >\n {body}\n </p>\n );\n },\n);\nFormMessage.displayName = 'FormMessage';\n\nexport {Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage};\n"],"names":["Slot","Label","React","Controller","FormProvider","useFormContext","cn","Form","FormFieldContext","createContext","FormItemContext","FormField","props","Provider","value","name","useFormField","fieldContext","useContext","itemContext","getFieldState","formState","Error","fieldState","id","formItemId","formDescriptionId","formMessageId","FormItem","forwardRef","className","ref","useId","div","displayName","FormLabel","error","htmlFor","FormControl","aria-describedby","aria-invalid","FormDescription","p","FormMessage","children","body","String","message"],"mappings":"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"}
|