@nattui/react-components 0.0.11 → 0.0.13

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.
@@ -1,39 +0,0 @@
1
- /* Base */
2
- .button_background {
3
- bottom: 50%;
4
- filter: none !important;
5
- left: 0;
6
- opacity: 0.2;
7
- position: absolute;
8
- right: 0;
9
- top: 0;
10
- transition-duration: inherit;
11
- transition-property: opacity;
12
- z-index: -1;
13
- }
14
-
15
- /* Rounded */
16
- .button_background__rounded_base {
17
- border-radius: 7px;
18
- }
19
-
20
- .button_background__rounded_full {
21
- border-radius: 9999px;
22
- }
23
-
24
- /* Variant */
25
- .button_background__variant_accent {
26
- background: linear-gradient(
27
- to bottom,
28
- var(--color-primary-7, #edadc8),
29
- var(--color-primary-8, #e58fb1)
30
- );
31
- }
32
-
33
- .button_background__variant_primary {
34
- background: linear-gradient(
35
- to bottom,
36
- var(--color-gray-10, #86848d),
37
- var(--color-gray-11, #6f6e77)
38
- );
39
- }
package/dist/index.d.ts DELETED
@@ -1,70 +0,0 @@
1
- import { ComponentProps, ReactNode, JSX } from 'react';
2
-
3
- interface ButtonProps extends Omit<ComponentProps<"button">, "aria-pressed" | "disabled"> {
4
- iconEnd?: ReactNode;
5
- iconOnly?: boolean;
6
- iconStart?: ReactNode;
7
- isActive?: boolean;
8
- isDisabled?: boolean;
9
- isFullWidth?: boolean;
10
- isLoading?: boolean;
11
- isRounded?: boolean;
12
- size?: 32 | 36 | 40 | 44;
13
- variant?: "accent" | "ghost" | "primary" | "secondary";
14
- }
15
- type ButtonPropsInternal = ButtonPropsWithIcon | ButtonPropsWithText;
16
- interface ButtonPropsWithIcon extends ButtonProps {
17
- children?: ReactNode;
18
- iconEnd?: never;
19
- iconOnly: true;
20
- iconStart?: never;
21
- }
22
- interface ButtonPropsWithText extends ButtonProps {
23
- children?: string;
24
- iconOnly?: false;
25
- }
26
- declare function Button(props: ButtonPropsInternal): JSX.Element;
27
- declare const BUTTON_CLASS_NAME: {
28
- readonly BASE: string;
29
- readonly ICON_ONLY: string;
30
- readonly ROUNDED: {
31
- readonly BASE: string;
32
- readonly FULL: string;
33
- };
34
- readonly SIZE: {
35
- readonly 32: string;
36
- readonly 36: string;
37
- readonly 40: string;
38
- readonly 44: string;
39
- };
40
- readonly VARIANT: {
41
- readonly ACCENT: string;
42
- readonly GHOST: string;
43
- readonly PRIMARY: string;
44
- readonly SECONDARY: string;
45
- };
46
- readonly WIDTH: {
47
- readonly BASE: string;
48
- readonly FULL: string;
49
- };
50
- };
51
-
52
- interface InputProps extends Omit<ComponentProps<"input">, "aria-pressed" | "disabled" | "readOnly"> {
53
- isActive?: boolean;
54
- isDisabled?: boolean;
55
- isReadOnly?: boolean;
56
- }
57
- declare function Input(props: InputProps): JSX.Element;
58
- declare const INPUT_CLASS_NAME: {
59
- readonly BASE: string;
60
- readonly PASSWORD: string;
61
- };
62
-
63
- interface LabelProps extends ComponentProps<"label"> {
64
- }
65
- declare function Label(props: LabelProps): JSX.Element;
66
- declare const LABEL_CLASS_NAME: {
67
- readonly BASE: string;
68
- };
69
-
70
- export { BUTTON_CLASS_NAME, Button, type ButtonProps, INPUT_CLASS_NAME, Input, type InputProps, LABEL_CLASS_NAME, Label, type LabelProps };
package/dist/index.js DELETED
@@ -1,176 +0,0 @@
1
- 'use strict';
2
-
3
- var styles = require('./button-background.module-T5B7XZ2Z.module.css');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var styles2 = require('./button-spinner.module-4TBETQ4T.module.css');
6
- var styles3 = require('./button.module-HTK2BWYK.module.css');
7
- var styles4 = require('./input.module-M44BKREB.module.css');
8
- var styles5 = require('./label.module-4CZ6ETIR.module.css');
9
-
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var styles__default = /*#__PURE__*/_interopDefault(styles);
13
- var styles2__default = /*#__PURE__*/_interopDefault(styles2);
14
- var styles3__default = /*#__PURE__*/_interopDefault(styles3);
15
- var styles4__default = /*#__PURE__*/_interopDefault(styles4);
16
- var styles5__default = /*#__PURE__*/_interopDefault(styles5);
17
-
18
- // src/button-background.tsx
19
- function ButtonBackground(props) {
20
- const { isRounded = false, variant = "primary" } = props;
21
- const combinedBackgroundStyles = `
22
- ${BUTTON_BACKGROUND_CLASS_NAME.BASE}
23
- ${isRounded ? BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.FULL : BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.BASE}
24
- ${variant === "accent" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.ACCENT : ""}
25
- ${variant === "primary" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.PRIMARY : ""}
26
- `.replaceAll(/\s+/g, " ").trim();
27
- if (!(variant === "accent" || variant === "primary")) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
28
- return /* @__PURE__ */ jsxRuntime.jsx(
29
- "div",
30
- {
31
- className: combinedBackgroundStyles,
32
- "data-element": "button-background"
33
- }
34
- );
35
- }
36
- var BUTTON_BACKGROUND_CLASS_NAME = {
37
- BASE: styles__default.default.button_background,
38
- ROUNDED: {
39
- BASE: styles__default.default.button_background__rounded_base,
40
- FULL: styles__default.default.button_background__rounded_full
41
- },
42
- VARIANT: {
43
- ACCENT: styles__default.default.button_background__variant_accent,
44
- PRIMARY: styles__default.default.button_background__variant_primary
45
- }
46
- };
47
- function ButtonSpinner(props) {
48
- const { size = 16 } = props;
49
- return /* @__PURE__ */ jsxRuntime.jsx(
50
- "div",
51
- {
52
- className: styles2__default.default.button_spinner,
53
- style: { "--size": `${size}px` },
54
- children: Array.from({ length: 12 }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx("div", {}, index))
55
- }
56
- );
57
- }
58
- function Button(props) {
59
- const {
60
- children = "",
61
- className: customClassName = "",
62
- iconEnd = "",
63
- iconOnly = false,
64
- iconStart = "",
65
- isActive = false,
66
- isDisabled = false,
67
- isFullWidth = false,
68
- isLoading = false,
69
- isRounded = false,
70
- size = 36,
71
- type = "button",
72
- variant = "primary",
73
- ...rest
74
- } = props;
75
- const combinedClassName = `
76
- ${BUTTON_CLASS_NAME.BASE}
77
- ${BUTTON_CLASS_NAME.SIZE[size]}
78
- ${BUTTON_CLASS_NAME.VARIANT[variant.toUpperCase()]}
79
- ${isFullWidth ? BUTTON_CLASS_NAME.WIDTH.FULL : BUTTON_CLASS_NAME.WIDTH.BASE}
80
- ${iconOnly ? BUTTON_CLASS_NAME.ICON_ONLY : ""}
81
- ${isRounded ? BUTTON_CLASS_NAME.ROUNDED.FULL : BUTTON_CLASS_NAME.ROUNDED.BASE}
82
- ${customClassName}
83
- `.replaceAll(/\s+/g, " ").trim();
84
- return /* @__PURE__ */ jsxRuntime.jsxs(
85
- "button",
86
- {
87
- "aria-pressed": isActive,
88
- className: combinedClassName,
89
- disabled: isDisabled || isLoading,
90
- type,
91
- ...rest,
92
- children: [
93
- /* @__PURE__ */ jsxRuntime.jsx(ButtonBackground, { isRounded, variant }),
94
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(ButtonSpinner, {}),
95
- !isLoading && iconStart,
96
- iconOnly ? children : /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
97
- !isLoading && iconEnd
98
- ]
99
- }
100
- );
101
- }
102
- var BUTTON_CLASS_NAME = {
103
- BASE: styles3__default.default.button,
104
- ICON_ONLY: styles3__default.default.button__icon_only,
105
- ROUNDED: {
106
- BASE: styles3__default.default.button__rounded_base,
107
- FULL: styles3__default.default.button__rounded_full
108
- },
109
- SIZE: {
110
- 32: styles3__default.default.button__size_32,
111
- 36: styles3__default.default.button__size_36,
112
- 40: styles3__default.default.button__size_40,
113
- 44: styles3__default.default.button__size_44
114
- },
115
- VARIANT: {
116
- ACCENT: styles3__default.default.button__variant_accent,
117
- GHOST: styles3__default.default.button__variant_ghost,
118
- PRIMARY: styles3__default.default.button__variant_primary,
119
- SECONDARY: styles3__default.default.button__variant_secondary
120
- },
121
- WIDTH: {
122
- BASE: styles3__default.default.button__width_base,
123
- FULL: styles3__default.default.button__width_full
124
- }
125
- };
126
- function Input(props) {
127
- const {
128
- className: customClassName = "",
129
- isActive = false,
130
- isDisabled = false,
131
- isReadOnly = false,
132
- type = "text",
133
- ...rest
134
- } = props;
135
- const isPassword = type === "password";
136
- const combinedClassName = `
137
- ${INPUT_CLASS_NAME.BASE}
138
- ${isPassword ? INPUT_CLASS_NAME.PASSWORD : ""}
139
- ${customClassName}
140
- `.replaceAll(/\s+/g, " ").trim();
141
- return /* @__PURE__ */ jsxRuntime.jsx(
142
- "input",
143
- {
144
- "aria-pressed": isActive,
145
- className: combinedClassName,
146
- disabled: isDisabled,
147
- readOnly: isReadOnly,
148
- type,
149
- ...rest
150
- }
151
- );
152
- }
153
- var INPUT_CLASS_NAME = {
154
- BASE: styles4__default.default.input,
155
- PASSWORD: styles4__default.default.input__password
156
- };
157
- function Label(props) {
158
- const { className: customClassName = "", ...rest } = props;
159
- const combinedClassName = `
160
- ${LABEL_CLASS_NAME.BASE}
161
- ${customClassName}
162
- `.replaceAll(/\s+/g, " ").trim();
163
- return /* @__PURE__ */ jsxRuntime.jsx("label", { className: combinedClassName, ...rest });
164
- }
165
- var LABEL_CLASS_NAME = {
166
- BASE: styles5__default.default.label
167
- };
168
-
169
- exports.BUTTON_CLASS_NAME = BUTTON_CLASS_NAME;
170
- exports.Button = Button;
171
- exports.INPUT_CLASS_NAME = INPUT_CLASS_NAME;
172
- exports.Input = Input;
173
- exports.LABEL_CLASS_NAME = LABEL_CLASS_NAME;
174
- exports.Label = Label;
175
- //# sourceMappingURL=index.js.map
176
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/button-background.tsx","../src/button-spinner.tsx","../src/button.tsx","../src/input.tsx","../src/label.tsx"],"names":["jsx","Fragment","styles","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSX } from \"react\"\nimport type { ButtonProps } from \"@/button\"\nimport styles from \"@/button-background.module.css\"\n\nexport interface ButtonBackgroundProps\n extends Pick<ButtonProps, \"isRounded\" | \"variant\"> {}\n\nexport function ButtonBackground(props: ButtonBackgroundProps): JSX.Element {\n const { isRounded = false, variant = \"primary\" } = props\n\n const combinedBackgroundStyles = `\n ${BUTTON_BACKGROUND_CLASS_NAME.BASE}\n ${isRounded ? BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.FULL : BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.BASE}\n ${variant === \"accent\" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.ACCENT : \"\"}\n ${variant === \"primary\" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.PRIMARY : \"\"}\n `\n .replaceAll(/\\s+/g, \" \")\n .trim()\n\n if (!(variant === \"accent\" || variant === \"primary\")) return <></>\n\n return (\n <div\n className={combinedBackgroundStyles}\n data-element=\"button-background\"\n />\n )\n}\n\nexport const BUTTON_BACKGROUND_CLASS_NAME = {\n BASE: styles.button_background,\n ROUNDED: {\n BASE: styles.button_background__rounded_base,\n FULL: styles.button_background__rounded_full,\n },\n VARIANT: {\n ACCENT: styles.button_background__variant_accent,\n PRIMARY: styles.button_background__variant_primary,\n },\n} as const\n","import type { CSSProperties, JSX } from \"react\"\nimport styles from \"@/button-spinner.module.css\"\n\nexport interface ButtonSpinnerProps {\n size?: number\n}\n\nexport function ButtonSpinner(props: ButtonSpinnerProps): JSX.Element {\n const { size = 16 } = props\n\n return (\n <div\n className={styles.button_spinner}\n style={{ \"--size\": `${size}px` } as CSSProperties}\n >\n {Array.from({ length: 12 }).map((_, index) => (\n <div key={index} />\n ))}\n </div>\n )\n}\n","import type { ComponentProps, JSX, ReactNode } from \"react\"\nimport { ButtonBackground } from \"@/button-background\"\nimport { ButtonSpinner } from \"@/button-spinner\"\nimport styles from \"@/button.module.css\"\n\nexport interface ButtonProps\n extends Omit<ComponentProps<\"button\">, \"aria-pressed\" | \"disabled\"> {\n iconEnd?: ReactNode\n iconOnly?: boolean\n iconStart?: ReactNode\n isActive?: boolean\n isDisabled?: boolean\n isFullWidth?: boolean\n isLoading?: boolean\n isRounded?: boolean\n size?: 32 | 36 | 40 | 44\n variant?: \"accent\" | \"ghost\" | \"primary\" | \"secondary\"\n}\n\ntype ButtonPropsInternal = ButtonPropsWithIcon | ButtonPropsWithText\n\ninterface ButtonPropsWithIcon extends ButtonProps {\n children?: ReactNode\n iconEnd?: never\n iconOnly: true\n iconStart?: never\n}\n\ninterface ButtonPropsWithText extends ButtonProps {\n children?: string\n iconOnly?: false\n}\n\nexport function Button(props: ButtonPropsInternal): JSX.Element {\n const {\n children = \"\",\n className: customClassName = \"\",\n iconEnd = \"\",\n iconOnly = false,\n iconStart = \"\",\n isActive = false,\n isDisabled = false,\n isFullWidth = false,\n isLoading = false,\n isRounded = false,\n size = 36,\n type = \"button\",\n variant = \"primary\",\n ...rest\n } = props\n\n const combinedClassName = `\n ${BUTTON_CLASS_NAME.BASE}\n ${BUTTON_CLASS_NAME.SIZE[size]}\n ${BUTTON_CLASS_NAME.VARIANT[variant.toUpperCase() as keyof typeof BUTTON_CLASS_NAME.VARIANT]}\n ${isFullWidth ? BUTTON_CLASS_NAME.WIDTH.FULL : BUTTON_CLASS_NAME.WIDTH.BASE}\n ${iconOnly ? BUTTON_CLASS_NAME.ICON_ONLY : \"\"}\n ${isRounded ? BUTTON_CLASS_NAME.ROUNDED.FULL : BUTTON_CLASS_NAME.ROUNDED.BASE}\n ${customClassName}\n `\n .replaceAll(/\\s+/g, \" \")\n .trim()\n\n return (\n <button\n aria-pressed={isActive}\n className={combinedClassName}\n disabled={isDisabled || isLoading}\n type={type}\n {...rest}\n >\n <ButtonBackground isRounded={isRounded} variant={variant} />\n {isLoading && <ButtonSpinner />}\n {!isLoading && iconStart}\n {iconOnly ? children : <span>{children}</span>}\n {!isLoading && iconEnd}\n </button>\n )\n}\n\nexport const BUTTON_CLASS_NAME = {\n BASE: styles.button,\n ICON_ONLY: styles.button__icon_only,\n ROUNDED: {\n BASE: styles.button__rounded_base,\n FULL: styles.button__rounded_full,\n },\n SIZE: {\n 32: styles.button__size_32,\n 36: styles.button__size_36,\n 40: styles.button__size_40,\n 44: styles.button__size_44,\n },\n VARIANT: {\n ACCENT: styles.button__variant_accent,\n GHOST: styles.button__variant_ghost,\n PRIMARY: styles.button__variant_primary,\n SECONDARY: styles.button__variant_secondary,\n },\n WIDTH: {\n BASE: styles.button__width_base,\n FULL: styles.button__width_full,\n },\n} as const\n","import type { ComponentProps, JSX } from \"react\"\nimport styles from \"@/input.module.css\"\n\nexport interface InputProps\n extends Omit<\n ComponentProps<\"input\">,\n \"aria-pressed\" | \"disabled\" | \"readOnly\"\n > {\n isActive?: boolean\n isDisabled?: boolean\n isReadOnly?: boolean\n}\n\nexport function Input(props: InputProps): JSX.Element {\n const {\n className: customClassName = \"\",\n isActive = false,\n isDisabled = false,\n isReadOnly = false,\n type = \"text\",\n ...rest\n } = props\n\n const isPassword = type === \"password\"\n\n const combinedClassName = `\n ${INPUT_CLASS_NAME.BASE}\n ${isPassword ? INPUT_CLASS_NAME.PASSWORD : \"\"}\n ${customClassName}\n `\n .replaceAll(/\\s+/g, \" \")\n .trim()\n\n return (\n <input\n aria-pressed={isActive}\n className={combinedClassName}\n disabled={isDisabled}\n readOnly={isReadOnly}\n type={type}\n {...rest}\n />\n )\n}\n\nexport const INPUT_CLASS_NAME = {\n BASE: styles.input,\n PASSWORD: styles.input__password,\n} as const\n","import type { ComponentProps, JSX } from \"react\"\nimport styles from \"@/label.module.css\"\n\nexport interface LabelProps extends ComponentProps<\"label\"> {}\n\nexport function Label(props: LabelProps): JSX.Element {\n const { className: customClassName = \"\", ...rest } = props\n\n const combinedClassName = `\n ${LABEL_CLASS_NAME.BASE}\n ${customClassName}\n `\n .replaceAll(/\\s+/g, \" \")\n .trim()\n\n return <label className={combinedClassName} {...rest} />\n}\n\nexport const LABEL_CLASS_NAME = {\n BASE: styles.label,\n} as const\n"]}
package/eslint.config.mjs DELETED
@@ -1,85 +0,0 @@
1
- import js from "@eslint/js"
2
- import pluginPerfectionist from "eslint-plugin-perfectionist"
3
- import pluginReact from "eslint-plugin-react"
4
- import pluginUnicorn from "eslint-plugin-unicorn"
5
- import pluginUnusedImports from "eslint-plugin-unused-imports"
6
- import { defineConfig } from "eslint/config"
7
- import globals from "globals"
8
- import tseslint from "typescript-eslint"
9
-
10
- export default defineConfig([
11
- // Global ignores
12
- {
13
- ignores: ["dist/"],
14
- },
15
- // Base configurations for JS/TS files only
16
- {
17
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
18
- ...pluginPerfectionist.configs["recommended-natural"],
19
- },
20
- {
21
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
22
- ...pluginReact.configs.flat.recommended,
23
- settings: {
24
- react: {
25
- version: "detect",
26
- },
27
- },
28
- },
29
- {
30
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
31
- ...pluginUnicorn.configs.all,
32
- },
33
- ...tseslint.configs.recommended.map((config) => ({
34
- ...config,
35
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
36
- })),
37
- {
38
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
39
- languageOptions: { globals: globals.browser },
40
- },
41
- // JavaScript configuration
42
- {
43
- extends: ["js/recommended"],
44
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
45
- plugins: { js },
46
- },
47
- // Custom rules for JS/TS files only
48
- {
49
- files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
50
- plugins: {
51
- "unused-imports": pluginUnusedImports,
52
- },
53
- rules: {
54
- "@typescript-eslint/no-empty-object-type": [
55
- "error",
56
- {
57
- allowInterfaces: "with-single-extends",
58
- },
59
- ],
60
- "perfectionist/sort-imports": [
61
- "error",
62
- {
63
- newlinesBetween: "never",
64
- sortSideEffects: true,
65
- },
66
- ],
67
- "react/react-in-jsx-scope": "off",
68
- "unicorn/consistent-function-scoping": "off",
69
- "unicorn/import-style": "off",
70
- "unicorn/no-keyword-prefix": "off",
71
- "unicorn/no-unused-properties": "warn",
72
- "unicorn/prevent-abbreviations": "off",
73
- "unused-imports/no-unused-imports": "error",
74
- "unused-imports/no-unused-vars": [
75
- "warn",
76
- {
77
- args: "after-used",
78
- argsIgnorePattern: "^_",
79
- vars: "all",
80
- varsIgnorePattern: "^_",
81
- },
82
- ],
83
- },
84
- },
85
- ])
package/global.d.ts DELETED
@@ -1,4 +0,0 @@
1
- declare module "*.module.css" {
2
- const classes: { [key: string]: string }
3
- export default classes
4
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * @see https://prettier.io/docs/configuration
3
- * @type {import("prettier").Config}
4
- */
5
- const config = {
6
- cssDeclarationSorterOrder: "alphabetical",
7
- jsonRecursiveSort: true,
8
- plugins: [
9
- "prettier-plugin-css-order",
10
- "prettier-plugin-packagejson",
11
- "prettier-plugin-sort-json",
12
- ],
13
- semi: false,
14
- }
15
-
16
- export default config
@@ -1,40 +0,0 @@
1
- import type { JSX } from "react"
2
- import type { ButtonProps } from "@/button"
3
- import styles from "@/button-background.module.css"
4
-
5
- export interface ButtonBackgroundProps
6
- extends Pick<ButtonProps, "isRounded" | "variant"> {}
7
-
8
- export function ButtonBackground(props: ButtonBackgroundProps): JSX.Element {
9
- const { isRounded = false, variant = "primary" } = props
10
-
11
- const combinedBackgroundStyles = `
12
- ${BUTTON_BACKGROUND_CLASS_NAME.BASE}
13
- ${isRounded ? BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.FULL : BUTTON_BACKGROUND_CLASS_NAME.ROUNDED.BASE}
14
- ${variant === "accent" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.ACCENT : ""}
15
- ${variant === "primary" ? BUTTON_BACKGROUND_CLASS_NAME.VARIANT.PRIMARY : ""}
16
- `
17
- .replaceAll(/\s+/g, " ")
18
- .trim()
19
-
20
- if (!(variant === "accent" || variant === "primary")) return <></>
21
-
22
- return (
23
- <div
24
- className={combinedBackgroundStyles}
25
- data-element="button-background"
26
- />
27
- )
28
- }
29
-
30
- export const BUTTON_BACKGROUND_CLASS_NAME = {
31
- BASE: styles.button_background,
32
- ROUNDED: {
33
- BASE: styles.button_background__rounded_base,
34
- FULL: styles.button_background__rounded_full,
35
- },
36
- VARIANT: {
37
- ACCENT: styles.button_background__variant_accent,
38
- PRIMARY: styles.button_background__variant_primary,
39
- },
40
- } as const
@@ -1,95 +0,0 @@
1
- .button_spinner {
2
- animation: spinner 1000ms steps(12, end) infinite;
3
- height: var(--size);
4
- position: relative;
5
- scale: -1 1;
6
- width: var(--size);
7
- }
8
-
9
- @keyframes spinner {
10
- to {
11
- rotate: 1turn;
12
- }
13
- }
14
-
15
- .button_spinner > div {
16
- height: calc(var(--size) / 12);
17
- pointer-events: none;
18
- position: absolute;
19
- right: 0;
20
- top: 50%;
21
- transform-origin: center left;
22
- transition: all 150ms;
23
- translate: 0 -50%;
24
- width: calc(var(--size) / 2);
25
- }
26
-
27
- .button_spinner > div::after {
28
- background-color: currentColor;
29
- border-radius: 9999px;
30
- content: "";
31
- height: 100%;
32
- position: absolute;
33
- right: 0;
34
- width: 50%;
35
- }
36
-
37
- .button_spinner > div:nth-child(1) {
38
- opacity: 1;
39
- rotate: 0deg;
40
- }
41
-
42
- .button_spinner > div:nth-child(2) {
43
- opacity: 0.925;
44
- rotate: 30deg;
45
- }
46
-
47
- .button_spinner > div:nth-child(3) {
48
- opacity: 0.85;
49
- rotate: 60deg;
50
- }
51
-
52
- .button_spinner > div:nth-child(4) {
53
- opacity: 0.775;
54
- rotate: 90deg;
55
- }
56
-
57
- .button_spinner > div:nth-child(5) {
58
- opacity: 0.7;
59
- rotate: 120deg;
60
- }
61
-
62
- .button_spinner > div:nth-child(6) {
63
- opacity: 0.625;
64
- rotate: 150deg;
65
- }
66
-
67
- .button_spinner > div:nth-child(7) {
68
- opacity: 0.55;
69
- rotate: 180deg;
70
- }
71
-
72
- .button_spinner > div:nth-child(8) {
73
- opacity: 0.475;
74
- rotate: 210deg;
75
- }
76
-
77
- .button_spinner > div:nth-child(9) {
78
- opacity: 0.4;
79
- rotate: 240deg;
80
- }
81
-
82
- .button_spinner > div:nth-child(10) {
83
- opacity: 0.325;
84
- rotate: 270deg;
85
- }
86
-
87
- .button_spinner > div:nth-child(11) {
88
- opacity: 0.25;
89
- rotate: 300deg;
90
- }
91
-
92
- .button_spinner > div:nth-child(12) {
93
- opacity: 0.15;
94
- rotate: 330deg;
95
- }
@@ -1,21 +0,0 @@
1
- import type { CSSProperties, JSX } from "react"
2
- import styles from "@/button-spinner.module.css"
3
-
4
- export interface ButtonSpinnerProps {
5
- size?: number
6
- }
7
-
8
- export function ButtonSpinner(props: ButtonSpinnerProps): JSX.Element {
9
- const { size = 16 } = props
10
-
11
- return (
12
- <div
13
- className={styles.button_spinner}
14
- style={{ "--size": `${size}px` } as CSSProperties}
15
- >
16
- {Array.from({ length: 12 }).map((_, index) => (
17
- <div key={index} />
18
- ))}
19
- </div>
20
- )
21
- }