@nattui/react-components 0.0.12 → 0.0.14
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/dist/index.d.mts +5 -5
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -26
- package/.prettierignore +0 -1
- package/.turbo/turbo-build.log +0 -33
- package/.turbo/turbo-dev.log +0 -1504
- package/dist/button-background.module-T5B7XZ2Z.module.css +0 -39
- package/dist/index.d.ts +0 -71
- package/dist/index.js +0 -178
- package/dist/index.js.map +0 -1
- package/eslint.config.mjs +0 -85
- package/global.d.ts +0 -4
- package/prettier.config.mjs +0 -16
- package/src/button-background.tsx +0 -40
- package/src/button-spinner.module.css +0 -95
- package/src/button-spinner.tsx +0 -21
- package/src/button.module.css +0 -248
- package/src/button.tsx +0 -104
- package/src/index.ts +0 -3
- package/src/input.module.css +0 -57
- package/src/input.tsx +0 -52
- package/src/label.module.css +0 -8
- package/src/label.tsx +0 -21
- package/tsconfig.json +0 -13
- package/tsup.config.ts +0 -13
- package/{src/button-background.module.css → dist/button-background.module-Y3DFESUY.module.css} +5 -5
- package/dist/{button-spinner.module-4TBETQ4T.module.css → button-spinner.module-T3OGVJS4.module.css} +12 -12
- package/dist/{button.module-HTK2BWYK.module.css → button.module-VAXL2INY.module.css} +20 -20
- package/dist/{input.module-M44BKREB.module.css → input.module-GMZ6XJ62.module.css} +15 -15
- package/dist/{label.module-4CZ6ETIR.module.css → label.module-3W6OLN6C.module.css} +2 -2
|
@@ -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,71 +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" | "required"> {
|
|
53
|
-
isActive?: boolean;
|
|
54
|
-
isDisabled?: boolean;
|
|
55
|
-
isReadOnly?: boolean;
|
|
56
|
-
isRequired?: boolean;
|
|
57
|
-
}
|
|
58
|
-
declare function Input(props: InputProps): JSX.Element;
|
|
59
|
-
declare const INPUT_CLASS_NAME: {
|
|
60
|
-
readonly BASE: string;
|
|
61
|
-
readonly PASSWORD: string;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
interface LabelProps extends ComponentProps<"label"> {
|
|
65
|
-
}
|
|
66
|
-
declare function Label(props: LabelProps): JSX.Element;
|
|
67
|
-
declare const LABEL_CLASS_NAME: {
|
|
68
|
-
readonly BASE: string;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
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,178 +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
|
-
isRequired = false,
|
|
133
|
-
type = "text",
|
|
134
|
-
...rest
|
|
135
|
-
} = props;
|
|
136
|
-
const isPassword = type === "password";
|
|
137
|
-
const combinedClassName = `
|
|
138
|
-
${INPUT_CLASS_NAME.BASE}
|
|
139
|
-
${isPassword ? INPUT_CLASS_NAME.PASSWORD : ""}
|
|
140
|
-
${customClassName}
|
|
141
|
-
`.replaceAll(/\s+/g, " ").trim();
|
|
142
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
143
|
-
"input",
|
|
144
|
-
{
|
|
145
|
-
"aria-pressed": isActive,
|
|
146
|
-
className: combinedClassName,
|
|
147
|
-
disabled: isDisabled,
|
|
148
|
-
readOnly: isReadOnly,
|
|
149
|
-
required: isRequired,
|
|
150
|
-
type,
|
|
151
|
-
...rest
|
|
152
|
-
}
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
var INPUT_CLASS_NAME = {
|
|
156
|
-
BASE: styles4__default.default.input,
|
|
157
|
-
PASSWORD: styles4__default.default.input__password
|
|
158
|
-
};
|
|
159
|
-
function Label(props) {
|
|
160
|
-
const { className: customClassName = "", ...rest } = props;
|
|
161
|
-
const combinedClassName = `
|
|
162
|
-
${LABEL_CLASS_NAME.BASE}
|
|
163
|
-
${customClassName}
|
|
164
|
-
`.replaceAll(/\s+/g, " ").trim();
|
|
165
|
-
return /* @__PURE__ */ jsxRuntime.jsx("label", { className: combinedClassName, ...rest });
|
|
166
|
-
}
|
|
167
|
-
var LABEL_CLASS_NAME = {
|
|
168
|
-
BASE: styles5__default.default.label
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
exports.BUTTON_CLASS_NAME = BUTTON_CLASS_NAME;
|
|
172
|
-
exports.Button = Button;
|
|
173
|
-
exports.INPUT_CLASS_NAME = INPUT_CLASS_NAME;
|
|
174
|
-
exports.Input = Input;
|
|
175
|
-
exports.LABEL_CLASS_NAME = LABEL_CLASS_NAME;
|
|
176
|
-
exports.Label = Label;
|
|
177
|
-
//# sourceMappingURL=index.js.map
|
|
178
|
-
//# 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\" | \"required\"\n > {\n isActive?: boolean\n isDisabled?: boolean\n isReadOnly?: boolean\n isRequired?: 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 isRequired = 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 required={isRequired}\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
package/prettier.config.mjs
DELETED
|
@@ -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
|
-
}
|
package/src/button-spinner.tsx
DELETED
|
@@ -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
|
-
}
|