@de-kit/st-ui 0.1.0 → 0.1.1

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.
Files changed (44) hide show
  1. package/README.md +8 -8
  2. package/dist/components/button/button.cjs +2 -4
  3. package/dist/components/button/button.cjs.map +1 -1
  4. package/dist/components/button/button.js +2 -2
  5. package/dist/components/button/button.js.map +1 -1
  6. package/dist/components/button/button.scss +93 -0
  7. package/dist/components/checkbox/checkbox.cjs +4 -6
  8. package/dist/components/checkbox/checkbox.cjs.map +1 -1
  9. package/dist/components/checkbox/checkbox.js +4 -4
  10. package/dist/components/checkbox/checkbox.js.map +1 -1
  11. package/dist/components/checkbox/{checkbox.module.scss → checkbox.scss} +11 -13
  12. package/dist/components/input/input.cjs +2 -4
  13. package/dist/components/input/input.cjs.map +1 -1
  14. package/dist/components/input/input.js +2 -2
  15. package/dist/components/input/input.js.map +1 -1
  16. package/dist/components/input/{input.module.scss → input.scss} +11 -13
  17. package/dist/components/radio/radio.cjs +4 -6
  18. package/dist/components/radio/radio.cjs.map +1 -1
  19. package/dist/components/radio/radio.js +4 -4
  20. package/dist/components/radio/radio.js.map +1 -1
  21. package/dist/components/radio/{radio.module.scss → radio.scss} +14 -13
  22. package/dist/components/spinner/spinner.cjs +2 -4
  23. package/dist/components/spinner/spinner.cjs.map +1 -1
  24. package/dist/components/spinner/spinner.js +2 -2
  25. package/dist/components/spinner/spinner.js.map +1 -1
  26. package/dist/components/spinner/{spinner.module.scss → spinner.scss} +3 -3
  27. package/dist/components/textarea/textarea.cjs +4 -6
  28. package/dist/components/textarea/textarea.cjs.map +1 -1
  29. package/dist/components/textarea/textarea.js +4 -4
  30. package/dist/components/textarea/textarea.js.map +1 -1
  31. package/dist/components/textarea/textarea.scss +58 -0
  32. package/dist/index.cjs +1 -0
  33. package/dist/index.js +1 -0
  34. package/dist/lib/cn.cjs +2 -2
  35. package/dist/lib/cn.cjs.map +1 -1
  36. package/dist/lib/cn.js +2 -2
  37. package/dist/lib/cn.js.map +1 -1
  38. package/dist/styles/global.scss +17 -17
  39. package/dist/styles/mixins.scss +22 -24
  40. package/dist/styles/vars.scss +31 -34
  41. package/package.json +2 -2
  42. package/dist/_virtual/_rolldown/runtime.cjs +0 -22
  43. package/dist/components/button/button.module.scss +0 -95
  44. package/dist/components/textarea/textarea.module.scss +0 -60
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.cjs","names":["cn","styles","when"],"sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import type { FC, SVGProps } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport styles from './spinner.module.scss';\n\nconst spinnerPosition = {\n top: 'top',\n center: 'center',\n} as const;\n\nexport type SpinnerPosition =\n (typeof spinnerPosition)[keyof typeof spinnerPosition];\n\nexport interface SpinnerProps {\n className?: string;\n position?: SpinnerPosition;\n}\n\nconst dotDelays = [\n '0s',\n '0.125s',\n '0.25s',\n '0.375s',\n '0.5s',\n '0.625s',\n '0.75s',\n '0.875s',\n] as const;\n\nconst Dot = ({ begin, rotate }: { begin: string; rotate: number }) => (\n <circle transform={`rotate(${rotate} 16 16)`} cx=\"16\" cy=\"3\" r=\"0\">\n <animate\n attributeName=\"r\"\n values=\"0;3;0;0\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n begin={begin}\n keySplines=\"0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8\"\n calcMode=\"spline\"\n />\n </circle>\n);\n\nconst svgProps: SVGProps<SVGSVGElement> = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': '0 0 32 32',\n 'width': 64,\n 'height': 64,\n 'fill': '#ecebeb',\n 'aria-hidden': true,\n};\n\nexport const Spinner: FC<SpinnerProps> = ({\n className,\n position = spinnerPosition.center,\n}) => (\n <div\n className={cn(\n styles.spinner,\n className,\n when(position === spinnerPosition.top, styles.top),\n )}\n >\n <svg {...svgProps}>\n {dotDelays.map((begin, index) => (\n <Dot key={begin} begin={begin} rotate={index * 45} />\n ))}\n </svg>\n </div>\n);\n"],"mappings":";;;;;;AAKA,MAAM,kBAAkB;CACtB,KAAK;CACL,QAAQ;AACV;AAUA,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,OAAO,EAAE,OAAO,aACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;CAAQ,WAAW,UAAU,OAAO;CAAU,IAAG;CAAK,IAAG;CAAI,GAAE;CAC7D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;EACE,eAAc;EACd,QAAO;EACP,KAAI;EACJ,aAAY;EACL;EACP,YAAW;EACX,UAAS;CACV,CAAA;AACK,CAAA;AAGV,MAAM,WAAoC;CACxC,SAAS;CACT,WAAW;CACX,SAAS;CACT,UAAU;CACV,QAAQ;CACR,eAAe;AACjB;AAEA,MAAa,WAA6B,EACxC,WACA,WAAW,gBAAgB,aAE3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;CACE,WAAWA,WAAAA,GACTC,2CAAAA,QAAO,SACP,WACAC,WAAAA,KAAK,aAAa,gBAAgB,KAAKD,2CAAAA,QAAO,GAAG,CACnD;CAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,GAAI;EACN,UAAA,UAAU,KAAK,OAAO,UACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;GAAwB;GAAO,QAAQ,QAAQ;EAAK,GAA1C,KAA0C,CACrD;CACE,CAAA;AACF,CAAA"}
1
+ {"version":3,"file":"spinner.cjs","names":["cn","when"],"sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import type { FC, SVGProps } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport './spinner.scss';\n\nconst spinnerPosition = {\n top: 'top',\n center: 'center',\n} as const;\n\nexport type SpinnerPosition =\n (typeof spinnerPosition)[keyof typeof spinnerPosition];\n\nexport interface SpinnerProps {\n className?: string;\n position?: SpinnerPosition;\n}\n\nconst dotDelays = [\n '0s',\n '0.125s',\n '0.25s',\n '0.375s',\n '0.5s',\n '0.625s',\n '0.75s',\n '0.875s',\n] as const;\n\nconst Dot = ({ begin, rotate }: { begin: string; rotate: number }) => (\n <circle transform={`rotate(${rotate} 16 16)`} cx=\"16\" cy=\"3\" r=\"0\">\n <animate\n attributeName=\"r\"\n values=\"0;3;0;0\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n begin={begin}\n keySplines=\"0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8\"\n calcMode=\"spline\"\n />\n </circle>\n);\n\nconst svgProps: SVGProps<SVGSVGElement> = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': '0 0 32 32',\n 'width': 64,\n 'height': 64,\n 'fill': '#ecebeb',\n 'aria-hidden': true,\n};\n\nexport const Spinner: FC<SpinnerProps> = ({\n className,\n position = spinnerPosition.center,\n}) => (\n <div\n className={cn(\n 'spinner',\n className,\n when(position === spinnerPosition.top, 'spinner--top'),\n )}\n >\n <svg {...svgProps}>\n {dotDelays.map((begin, index) => (\n <Dot key={begin} begin={begin} rotate={index * 45} />\n ))}\n </svg>\n </div>\n);\n"],"mappings":";;;;AAKA,MAAM,kBAAkB;CACtB,KAAK;CACL,QAAQ;AACV;AAUA,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,OAAO,EAAE,OAAO,aACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;CAAQ,WAAW,UAAU,OAAO;CAAU,IAAG;CAAK,IAAG;CAAI,GAAE;CAC7D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;EACE,eAAc;EACd,QAAO;EACP,KAAI;EACJ,aAAY;EACL;EACP,YAAW;EACX,UAAS;CACV,CAAA;AACK,CAAA;AAGV,MAAM,WAAoC;CACxC,SAAS;CACT,WAAW;CACX,SAAS;CACT,UAAU;CACV,QAAQ;CACR,eAAe;AACjB;AAEA,MAAa,WAA6B,EACxC,WACA,WAAW,gBAAgB,aAE3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;CACE,WAAWA,WAAAA,GACT,WACA,WACAC,WAAAA,KAAK,aAAa,gBAAgB,KAAK,cAAc,CACvD;CAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,GAAI;EACN,UAAA,UAAU,KAAK,OAAO,UACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;GAAwB;GAAO,QAAQ,QAAQ;EAAK,GAA1C,KAA0C,CACrD;CACE,CAAA;AACF,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { cn, when } from "../../lib/cn.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import styles from "./spinner.module.scss";
3
+ import "./spinner.scss";
4
4
  // src/components/spinner/spinner.tsx
5
5
  const spinnerPosition = {
6
6
  top: "top",
@@ -40,7 +40,7 @@ const svgProps = {
40
40
  "aria-hidden": true
41
41
  };
42
42
  const Spinner = ({ className, position = spinnerPosition.center }) => /* @__PURE__ */ jsx("div", {
43
- className: cn(styles.spinner, className, when(position === spinnerPosition.top, styles.top)),
43
+ className: cn("spinner", className, when(position === spinnerPosition.top, "spinner--top")),
44
44
  children: /* @__PURE__ */ jsx("svg", {
45
45
  ...svgProps,
46
46
  children: dotDelays.map((begin, index) => /* @__PURE__ */ jsx(Dot, {
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.js","names":[],"sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import type { FC, SVGProps } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport styles from './spinner.module.scss';\n\nconst spinnerPosition = {\n top: 'top',\n center: 'center',\n} as const;\n\nexport type SpinnerPosition =\n (typeof spinnerPosition)[keyof typeof spinnerPosition];\n\nexport interface SpinnerProps {\n className?: string;\n position?: SpinnerPosition;\n}\n\nconst dotDelays = [\n '0s',\n '0.125s',\n '0.25s',\n '0.375s',\n '0.5s',\n '0.625s',\n '0.75s',\n '0.875s',\n] as const;\n\nconst Dot = ({ begin, rotate }: { begin: string; rotate: number }) => (\n <circle transform={`rotate(${rotate} 16 16)`} cx=\"16\" cy=\"3\" r=\"0\">\n <animate\n attributeName=\"r\"\n values=\"0;3;0;0\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n begin={begin}\n keySplines=\"0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8\"\n calcMode=\"spline\"\n />\n </circle>\n);\n\nconst svgProps: SVGProps<SVGSVGElement> = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': '0 0 32 32',\n 'width': 64,\n 'height': 64,\n 'fill': '#ecebeb',\n 'aria-hidden': true,\n};\n\nexport const Spinner: FC<SpinnerProps> = ({\n className,\n position = spinnerPosition.center,\n}) => (\n <div\n className={cn(\n styles.spinner,\n className,\n when(position === spinnerPosition.top, styles.top),\n )}\n >\n <svg {...svgProps}>\n {dotDelays.map((begin, index) => (\n <Dot key={begin} begin={begin} rotate={index * 45} />\n ))}\n </svg>\n </div>\n);\n"],"mappings":";;;;AAKA,MAAM,kBAAkB;CACtB,KAAK;CACL,QAAQ;AACV;AAUA,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,OAAO,EAAE,OAAO,aACpB,oBAAC,UAAD;CAAQ,WAAW,UAAU,OAAO;CAAU,IAAG;CAAK,IAAG;CAAI,GAAE;CAC7D,UAAA,oBAAC,WAAD;EACE,eAAc;EACd,QAAO;EACP,KAAI;EACJ,aAAY;EACL;EACP,YAAW;EACX,UAAS;CACV,CAAA;AACK,CAAA;AAGV,MAAM,WAAoC;CACxC,SAAS;CACT,WAAW;CACX,SAAS;CACT,UAAU;CACV,QAAQ;CACR,eAAe;AACjB;AAEA,MAAa,WAA6B,EACxC,WACA,WAAW,gBAAgB,aAE3B,oBAAC,OAAD;CACE,WAAW,GACT,OAAO,SACP,WACA,KAAK,aAAa,gBAAgB,KAAK,OAAO,GAAG,CACnD;CAEA,UAAA,oBAAC,OAAD;EAAK,GAAI;EACN,UAAA,UAAU,KAAK,OAAO,UACrB,oBAAC,KAAD;GAAwB;GAAO,QAAQ,QAAQ;EAAK,GAA1C,KAA0C,CACrD;CACE,CAAA;AACF,CAAA"}
1
+ {"version":3,"file":"spinner.js","names":[],"sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import type { FC, SVGProps } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport './spinner.scss';\n\nconst spinnerPosition = {\n top: 'top',\n center: 'center',\n} as const;\n\nexport type SpinnerPosition =\n (typeof spinnerPosition)[keyof typeof spinnerPosition];\n\nexport interface SpinnerProps {\n className?: string;\n position?: SpinnerPosition;\n}\n\nconst dotDelays = [\n '0s',\n '0.125s',\n '0.25s',\n '0.375s',\n '0.5s',\n '0.625s',\n '0.75s',\n '0.875s',\n] as const;\n\nconst Dot = ({ begin, rotate }: { begin: string; rotate: number }) => (\n <circle transform={`rotate(${rotate} 16 16)`} cx=\"16\" cy=\"3\" r=\"0\">\n <animate\n attributeName=\"r\"\n values=\"0;3;0;0\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n begin={begin}\n keySplines=\"0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8\"\n calcMode=\"spline\"\n />\n </circle>\n);\n\nconst svgProps: SVGProps<SVGSVGElement> = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': '0 0 32 32',\n 'width': 64,\n 'height': 64,\n 'fill': '#ecebeb',\n 'aria-hidden': true,\n};\n\nexport const Spinner: FC<SpinnerProps> = ({\n className,\n position = spinnerPosition.center,\n}) => (\n <div\n className={cn(\n 'spinner',\n className,\n when(position === spinnerPosition.top, 'spinner--top'),\n )}\n >\n <svg {...svgProps}>\n {dotDelays.map((begin, index) => (\n <Dot key={begin} begin={begin} rotate={index * 45} />\n ))}\n </svg>\n </div>\n);\n"],"mappings":";;;;AAKA,MAAM,kBAAkB;CACtB,KAAK;CACL,QAAQ;AACV;AAUA,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,OAAO,EAAE,OAAO,aACpB,oBAAC,UAAD;CAAQ,WAAW,UAAU,OAAO;CAAU,IAAG;CAAK,IAAG;CAAI,GAAE;CAC7D,UAAA,oBAAC,WAAD;EACE,eAAc;EACd,QAAO;EACP,KAAI;EACJ,aAAY;EACL;EACP,YAAW;EACX,UAAS;CACV,CAAA;AACK,CAAA;AAGV,MAAM,WAAoC;CACxC,SAAS;CACT,WAAW;CACX,SAAS;CACT,UAAU;CACV,QAAQ;CACR,eAAe;AACjB;AAEA,MAAa,WAA6B,EACxC,WACA,WAAW,gBAAgB,aAE3B,oBAAC,OAAD;CACE,WAAW,GACT,WACA,WACA,KAAK,aAAa,gBAAgB,KAAK,cAAc,CACvD;CAEA,UAAA,oBAAC,OAAD;EAAK,GAAI;EACN,UAAA,UAAU,KAAK,OAAO,UACrB,oBAAC,KAAD;GAAwB;GAAO,QAAQ,QAAQ;EAAK,GAA1C,KAA0C,CACrD;CACE,CAAA;AACF,CAAA"}
@@ -5,8 +5,8 @@
5
5
  padding: 30px 0;
6
6
  align-items: center;
7
7
  justify-content: center;
8
- }
9
8
 
10
- .top {
11
- align-items: flex-start;
9
+ &--top {
10
+ align-items: flex-start;
11
+ }
12
12
  }
@@ -1,22 +1,20 @@
1
- const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
2
1
  const require_cn = require("../../lib/cn.cjs");
3
2
  let react = require("react");
4
3
  let react_jsx_runtime = require("react/jsx-runtime");
5
- let src_components_textarea_textarea_module_scss = require("./textarea.module.scss");
6
- src_components_textarea_textarea_module_scss = require_runtime.__toESM(src_components_textarea_textarea_module_scss, 1);
4
+ require("./textarea.scss");
7
5
  // src/components/textarea/textarea.tsx
8
6
  const TextArea = (0, react.forwardRef)(function TextArea({ maxLength, value = "", recommended, error, hideCounter = false, className, ...props }, ref) {
9
7
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10
- className: src_components_textarea_textarea_module_scss.default.wrap,
8
+ className: "textarea__wrap",
11
9
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
12
10
  ref,
13
- className: require_cn.cn(src_components_textarea_textarea_module_scss.default.textarea, className, require_cn.when(recommended, src_components_textarea_textarea_module_scss.default["textarea--recommended"]), require_cn.when(error, src_components_textarea_textarea_module_scss.default["textarea--error"])),
11
+ className: require_cn.cn("textarea", className, require_cn.when(recommended, "textarea--recommended"), require_cn.when(error, "textarea--error")),
14
12
  value,
15
13
  maxLength,
16
14
  "aria-invalid": error || void 0,
17
15
  ...props
18
16
  }), maxLength && !hideCounter ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19
- className: src_components_textarea_textarea_module_scss.default.counter,
17
+ className: "textarea__counter",
20
18
  children: [
21
19
  "Максимум ",
22
20
  maxLength,
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.cjs","names":["forwardRef","styles","cn","when"],"sources":["../../../src/components/textarea/textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport styles from './textarea.module.scss';\n\nexport interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n recommended?: boolean;\n error?: boolean;\n /** В приложении проп называется `noMaxMoty`. */\n hideCounter?: boolean;\n}\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n maxLength,\n value = '',\n recommended,\n error,\n hideCounter = false,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div className={styles.wrap}>\n <textarea\n ref={ref}\n className={cn(\n styles.textarea,\n className,\n when(recommended, styles['textarea--recommended']),\n when(error, styles['textarea--error']),\n )}\n value={value}\n maxLength={maxLength}\n aria-invalid={error || undefined}\n {...props}\n />\n {maxLength && !hideCounter ? (\n <span className={styles.counter}>Максимум {maxLength} символов</span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;AAYA,MAAa,YAAA,GAAWA,MAAAA,WAAAA,CACtB,SAAS,SACP,EACE,WACA,QAAQ,IACR,aACA,OACA,cAAc,OACd,WACA,GAAG,SAEL,KACA;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAWC,6CAAAA,QAAO;EAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;GACO;GACL,WAAWC,WAAAA,GACTD,6CAAAA,QAAO,UACP,WACAE,WAAAA,KAAK,aAAaF,6CAAAA,QAAO,wBAAwB,GACjDE,WAAAA,KAAK,OAAOF,6CAAAA,QAAO,kBAAkB,CACvC;GACO;GACI;GACX,gBAAc,SAAS,KAAA;GACvB,GAAI;EACL,CAAA,GACA,aAAa,CAAC,cACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAM,WAAWA,6CAAAA,QAAO;GAAxB,UAAA;IAAiC;IAAU;IAAU;GAAe;EAClE,CAAA,IAAA,IACD;;AAET,CACF"}
1
+ {"version":3,"file":"textarea.cjs","names":["forwardRef","cn","when"],"sources":["../../../src/components/textarea/textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport './textarea.scss';\n\nexport interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n recommended?: boolean;\n error?: boolean;\n /** В приложении проп называется `noMaxMoty`. */\n hideCounter?: boolean;\n}\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n maxLength,\n value = '',\n recommended,\n error,\n hideCounter = false,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div className=\"textarea__wrap\">\n <textarea\n ref={ref}\n className={cn(\n 'textarea',\n className,\n when(recommended, 'textarea--recommended'),\n when(error, 'textarea--error'),\n )}\n value={value}\n maxLength={maxLength}\n aria-invalid={error || undefined}\n {...props}\n />\n {maxLength && !hideCounter ? (\n <span className=\"textarea__counter\">\n Максимум {maxLength} символов\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;AAYA,MAAa,YAAA,GAAWA,MAAAA,WAAAA,CACtB,SAAS,SACP,EACE,WACA,QAAQ,IACR,aACA,OACA,cAAc,OACd,WACA,GAAG,SAEL,KACA;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;GACO;GACL,WAAWC,WAAAA,GACT,YACA,WACAC,WAAAA,KAAK,aAAa,uBAAuB,GACzCA,WAAAA,KAAK,OAAO,iBAAiB,CAC/B;GACO;GACI;GACX,gBAAc,SAAS,KAAA;GACvB,GAAI;EACL,CAAA,GACA,aAAa,CAAC,cACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IAAoC;IACxB;IAAU;GAChB;EACJ,CAAA,IAAA,IACD;;AAET,CACF"}
@@ -1,20 +1,20 @@
1
1
  import { cn, when } from "../../lib/cn.js";
2
2
  import { forwardRef } from "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import styles from "./textarea.module.scss";
4
+ import "./textarea.scss";
5
5
  // src/components/textarea/textarea.tsx
6
6
  const TextArea = forwardRef(function TextArea({ maxLength, value = "", recommended, error, hideCounter = false, className, ...props }, ref) {
7
7
  return /* @__PURE__ */ jsxs("div", {
8
- className: styles.wrap,
8
+ className: "textarea__wrap",
9
9
  children: [/* @__PURE__ */ jsx("textarea", {
10
10
  ref,
11
- className: cn(styles.textarea, className, when(recommended, styles["textarea--recommended"]), when(error, styles["textarea--error"])),
11
+ className: cn("textarea", className, when(recommended, "textarea--recommended"), when(error, "textarea--error")),
12
12
  value,
13
13
  maxLength,
14
14
  "aria-invalid": error || void 0,
15
15
  ...props
16
16
  }), maxLength && !hideCounter ? /* @__PURE__ */ jsxs("span", {
17
- className: styles.counter,
17
+ className: "textarea__counter",
18
18
  children: [
19
19
  "Максимум ",
20
20
  maxLength,
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport styles from './textarea.module.scss';\n\nexport interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n recommended?: boolean;\n error?: boolean;\n /** В приложении проп называется `noMaxMoty`. */\n hideCounter?: boolean;\n}\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n maxLength,\n value = '',\n recommended,\n error,\n hideCounter = false,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div className={styles.wrap}>\n <textarea\n ref={ref}\n className={cn(\n styles.textarea,\n className,\n when(recommended, styles['textarea--recommended']),\n when(error, styles['textarea--error']),\n )}\n value={value}\n maxLength={maxLength}\n aria-invalid={error || undefined}\n {...props}\n />\n {maxLength && !hideCounter ? (\n <span className={styles.counter}>Максимум {maxLength} символов</span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;AAYA,MAAa,WAAW,WACtB,SAAS,SACP,EACE,WACA,QAAQ,IACR,aACA,OACA,cAAc,OACd,WACA,GAAG,SAEL,KACA;CACA,OACE,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAvB,UAAA,CACE,oBAAC,YAAD;GACO;GACL,WAAW,GACT,OAAO,UACP,WACA,KAAK,aAAa,OAAO,wBAAwB,GACjD,KAAK,OAAO,OAAO,kBAAkB,CACvC;GACO;GACI;GACX,gBAAc,SAAS,KAAA;GACvB,GAAI;EACL,CAAA,GACA,aAAa,CAAC,cACb,qBAAC,QAAD;GAAM,WAAW,OAAO;GAAxB,UAAA;IAAiC;IAAU;IAAU;GAAe;EAClE,CAAA,IAAA,IACD;;AAET,CACF"}
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn, when } from '../../lib/cn';\nimport './textarea.scss';\n\nexport interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n recommended?: boolean;\n error?: boolean;\n /** В приложении проп называется `noMaxMoty`. */\n hideCounter?: boolean;\n}\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n maxLength,\n value = '',\n recommended,\n error,\n hideCounter = false,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div className=\"textarea__wrap\">\n <textarea\n ref={ref}\n className={cn(\n 'textarea',\n className,\n when(recommended, 'textarea--recommended'),\n when(error, 'textarea--error'),\n )}\n value={value}\n maxLength={maxLength}\n aria-invalid={error || undefined}\n {...props}\n />\n {maxLength && !hideCounter ? (\n <span className=\"textarea__counter\">\n Максимум {maxLength} символов\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;AAYA,MAAa,WAAW,WACtB,SAAS,SACP,EACE,WACA,QAAQ,IACR,aACA,OACA,cAAc,OACd,WACA,GAAG,SAEL,KACA;CACA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,YAAD;GACO;GACL,WAAW,GACT,YACA,WACA,KAAK,aAAa,uBAAuB,GACzC,KAAK,OAAO,iBAAiB,CAC/B;GACO;GACI;GACX,gBAAc,SAAS,KAAA;GACvB,GAAI;EACL,CAAA,GACA,aAAa,CAAC,cACb,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IAAoC;IACxB;IAAU;GAChB;EACJ,CAAA,IAAA,IACD;;AAET,CACF"}
@@ -0,0 +1,58 @@
1
+ .textarea__wrap {
2
+ position: relative;
3
+ }
4
+
5
+ .textarea {
6
+ box-sizing: border-box;
7
+ width: 100%;
8
+ min-height: 160px;
9
+ display: flex;
10
+ align-items: center;
11
+ padding: 10px 15px;
12
+ font-size: 14px;
13
+ line-height: 20px;
14
+ background-color: transparent;
15
+ color: var(--color-black);
16
+ border-radius: var(--radius-sm);
17
+ resize: none;
18
+ font-family: var(--font-sans);
19
+ border: 1px solid var(--color-input);
20
+ outline: 1px solid transparent;
21
+ transition:
22
+ background 0.3s,
23
+ border-color 0.3s,
24
+ box-shadow 0.2s;
25
+
26
+ &:focus {
27
+ border-color: var(--color-black);
28
+ outline: 1px solid var(--color-black);
29
+ }
30
+
31
+ &:disabled {
32
+ background-color: var(--color-neutral-200);
33
+ border-color: var(--color-neutral-200);
34
+ color: color-mix(in srgb, var(--color-black) 50%, transparent);
35
+ fill: var(--color-neutral-500);
36
+ }
37
+
38
+ @media (min-width: 680px) {
39
+ min-height: 80px;
40
+ }
41
+
42
+ &--recommended {
43
+ background-color: color-mix(in srgb, var(--color-yellow) 10%, transparent);
44
+ }
45
+
46
+ &--error {
47
+ border-color: color-mix(in srgb, var(--color-red) 50%, transparent);
48
+ }
49
+ }
50
+
51
+ .textarea__counter {
52
+ display: block;
53
+ margin-top: 5px;
54
+ font-size: 11px;
55
+ line-height: 20px;
56
+ color: color-mix(in srgb, var(--color-black) 50%, transparent);
57
+ text-align: left;
58
+ }
package/dist/index.cjs CHANGED
@@ -5,6 +5,7 @@ const require_input = require("./components/input/input.cjs");
5
5
  const require_radio = require("./components/radio/radio.cjs");
6
6
  const require_spinner = require("./components/spinner/spinner.cjs");
7
7
  const require_textarea = require("./components/textarea/textarea.cjs");
8
+ require("./styles/vars.scss");
8
9
  exports.Button = require_button.Button;
9
10
  exports.CheckboxInput = require_checkbox.CheckboxInput;
10
11
  exports.Input = require_input.Input;
package/dist/index.js CHANGED
@@ -4,4 +4,5 @@ import { Input } from "./components/input/input.js";
4
4
  import { RadioInput } from "./components/radio/radio.js";
5
5
  import { Spinner } from "./components/spinner/spinner.js";
6
6
  import { TextArea } from "./components/textarea/textarea.js";
7
+ import "./styles/vars.scss";
7
8
  export { Button, CheckboxInput, Input, RadioInput, Spinner, TextArea };
package/dist/lib/cn.cjs CHANGED
@@ -11,13 +11,13 @@ const pushClass = (classes, value) => {
11
11
  }
12
12
  for (const key of Object.keys(value)) if (value[key]) classes.push(key);
13
13
  };
14
- /** Склейка классов. Без tailwind-merge: в модулях класс один, конфликт решает последний в списке. */
14
+ /** Склейка классов. Без tailwind-merge: одноимённые правила решает специфичность. */
15
15
  const cn = (...inputs) => {
16
16
  const classes = [];
17
17
  inputs.forEach((input) => pushClass(classes, input));
18
18
  return classes.join(" ");
19
19
  };
20
- /** Класс из CSS-модуля. Индекс `*.scss` под `noUncheckedIndexedAccess` — `string | undefined`. */
20
+ /** Условный класс. Пустая строка и `undefined` в `cn` не попадают. */
21
21
  const when = (enabled, className) => Boolean(enabled) && className ? className : false;
22
22
  exports.cn = cn;
23
23
  exports.when = when;
@@ -1 +1 @@
1
- {"version":3,"file":"cn.cjs","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["type ClassDictionary = Record<string, boolean | null | undefined>;\ntype ClassValue =\n | string\n | number\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassValue[];\n\nconst pushClass = (classes: string[], value: ClassValue): void => {\n if (!value) return;\n\n if (typeof value === 'string' || typeof value === 'number') {\n classes.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach(item => pushClass(classes, item));\n return;\n }\n\n for (const key of Object.keys(value)) {\n if (value[key]) classes.push(key);\n }\n};\n\n/** Склейка классов. Без tailwind-merge: в модулях класс один, конфликт решает последний в списке. */\nexport const cn = (...inputs: ClassValue[]): string => {\n const classes: string[] = [];\n inputs.forEach(input => pushClass(classes, input));\n return classes.join(' ');\n};\n\n/** Класс из CSS-модуля. Индекс `*.scss` под `noUncheckedIndexedAccess` — `string | undefined`. */\nexport const when = (\n enabled: boolean | undefined,\n className: string | undefined,\n): string | false => (Boolean(enabled) && className ? className : false);\n"],"mappings":";AAUA,MAAM,aAAa,SAAmB,UAA4B;CAChE,IAAI,CAAC,OAAO;CAEZ,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;EAC1D,QAAQ,KAAK,OAAO,KAAK,CAAC;EAC1B;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAQ,SAAQ,UAAU,SAAS,IAAI,CAAC;EAC9C;CACF;CAEA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,GAAG;AAEpC;;AAGA,MAAa,MAAM,GAAG,WAAiC;CACrD,MAAM,UAAoB,CAAC;CAC3B,OAAO,SAAQ,UAAS,UAAU,SAAS,KAAK,CAAC;CACjD,OAAO,QAAQ,KAAK,GAAG;AACzB;;AAGA,MAAa,QACX,SACA,cACoB,QAAQ,OAAO,KAAK,YAAY,YAAY"}
1
+ {"version":3,"file":"cn.cjs","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["type ClassDictionary = Record<string, boolean | null | undefined>;\ntype ClassValue =\n | string\n | number\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassValue[];\n\nconst pushClass = (classes: string[], value: ClassValue): void => {\n if (!value) return;\n\n if (typeof value === 'string' || typeof value === 'number') {\n classes.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach(item => pushClass(classes, item));\n return;\n }\n\n for (const key of Object.keys(value)) {\n if (value[key]) classes.push(key);\n }\n};\n\n/** Склейка классов. Без tailwind-merge: одноимённые правила решает специфичность. */\nexport const cn = (...inputs: ClassValue[]): string => {\n const classes: string[] = [];\n inputs.forEach(input => pushClass(classes, input));\n return classes.join(' ');\n};\n\n/** Условный класс. Пустая строка и `undefined` в `cn` не попадают. */\nexport const when = (\n enabled: boolean | undefined,\n className: string | undefined,\n): string | false => (Boolean(enabled) && className ? className : false);\n"],"mappings":";AAUA,MAAM,aAAa,SAAmB,UAA4B;CAChE,IAAI,CAAC,OAAO;CAEZ,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;EAC1D,QAAQ,KAAK,OAAO,KAAK,CAAC;EAC1B;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAQ,SAAQ,UAAU,SAAS,IAAI,CAAC;EAC9C;CACF;CAEA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,GAAG;AAEpC;;AAGA,MAAa,MAAM,GAAG,WAAiC;CACrD,MAAM,UAAoB,CAAC;CAC3B,OAAO,SAAQ,UAAS,UAAU,SAAS,KAAK,CAAC;CACjD,OAAO,QAAQ,KAAK,GAAG;AACzB;;AAGA,MAAa,QACX,SACA,cACoB,QAAQ,OAAO,KAAK,YAAY,YAAY"}
package/dist/lib/cn.js CHANGED
@@ -11,13 +11,13 @@ const pushClass = (classes, value) => {
11
11
  }
12
12
  for (const key of Object.keys(value)) if (value[key]) classes.push(key);
13
13
  };
14
- /** Склейка классов. Без tailwind-merge: в модулях класс один, конфликт решает последний в списке. */
14
+ /** Склейка классов. Без tailwind-merge: одноимённые правила решает специфичность. */
15
15
  const cn = (...inputs) => {
16
16
  const classes = [];
17
17
  inputs.forEach((input) => pushClass(classes, input));
18
18
  return classes.join(" ");
19
19
  };
20
- /** Класс из CSS-модуля. Индекс `*.scss` под `noUncheckedIndexedAccess` — `string | undefined`. */
20
+ /** Условный класс. Пустая строка и `undefined` в `cn` не попадают. */
21
21
  const when = (enabled, className) => Boolean(enabled) && className ? className : false;
22
22
  export { cn, when };
23
23
 
@@ -1 +1 @@
1
- {"version":3,"file":"cn.js","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["type ClassDictionary = Record<string, boolean | null | undefined>;\ntype ClassValue =\n | string\n | number\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassValue[];\n\nconst pushClass = (classes: string[], value: ClassValue): void => {\n if (!value) return;\n\n if (typeof value === 'string' || typeof value === 'number') {\n classes.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach(item => pushClass(classes, item));\n return;\n }\n\n for (const key of Object.keys(value)) {\n if (value[key]) classes.push(key);\n }\n};\n\n/** Склейка классов. Без tailwind-merge: в модулях класс один, конфликт решает последний в списке. */\nexport const cn = (...inputs: ClassValue[]): string => {\n const classes: string[] = [];\n inputs.forEach(input => pushClass(classes, input));\n return classes.join(' ');\n};\n\n/** Класс из CSS-модуля. Индекс `*.scss` под `noUncheckedIndexedAccess` — `string | undefined`. */\nexport const when = (\n enabled: boolean | undefined,\n className: string | undefined,\n): string | false => (Boolean(enabled) && className ? className : false);\n"],"mappings":";AAUA,MAAM,aAAa,SAAmB,UAA4B;CAChE,IAAI,CAAC,OAAO;CAEZ,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;EAC1D,QAAQ,KAAK,OAAO,KAAK,CAAC;EAC1B;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAQ,SAAQ,UAAU,SAAS,IAAI,CAAC;EAC9C;CACF;CAEA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,GAAG;AAEpC;;AAGA,MAAa,MAAM,GAAG,WAAiC;CACrD,MAAM,UAAoB,CAAC;CAC3B,OAAO,SAAQ,UAAS,UAAU,SAAS,KAAK,CAAC;CACjD,OAAO,QAAQ,KAAK,GAAG;AACzB;;AAGA,MAAa,QACX,SACA,cACoB,QAAQ,OAAO,KAAK,YAAY,YAAY"}
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["type ClassDictionary = Record<string, boolean | null | undefined>;\ntype ClassValue =\n | string\n | number\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassValue[];\n\nconst pushClass = (classes: string[], value: ClassValue): void => {\n if (!value) return;\n\n if (typeof value === 'string' || typeof value === 'number') {\n classes.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach(item => pushClass(classes, item));\n return;\n }\n\n for (const key of Object.keys(value)) {\n if (value[key]) classes.push(key);\n }\n};\n\n/** Склейка классов. Без tailwind-merge: одноимённые правила решает специфичность. */\nexport const cn = (...inputs: ClassValue[]): string => {\n const classes: string[] = [];\n inputs.forEach(input => pushClass(classes, input));\n return classes.join(' ');\n};\n\n/** Условный класс. Пустая строка и `undefined` в `cn` не попадают. */\nexport const when = (\n enabled: boolean | undefined,\n className: string | undefined,\n): string | false => (Boolean(enabled) && className ? className : false);\n"],"mappings":";AAUA,MAAM,aAAa,SAAmB,UAA4B;CAChE,IAAI,CAAC,OAAO;CAEZ,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;EAC1D,QAAQ,KAAK,OAAO,KAAK,CAAC;EAC1B;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAQ,SAAQ,UAAU,SAAS,IAAI,CAAC;EAC9C;CACF;CAEA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,GAAG;AAEpC;;AAGA,MAAa,MAAM,GAAG,WAAiC;CACrD,MAAM,UAAoB,CAAC;CAC3B,OAAO,SAAQ,UAAS,UAAU,SAAS,KAAK,CAAC;CACjD,OAAO,QAAQ,KAAK,GAAG;AACzB;;AAGA,MAAa,QACX,SACA,cACoB,QAAQ,OAAO,KAAK,YAAY,YAAY"}
@@ -1,5 +1,5 @@
1
1
  // База приложения. Шрифт Inter подключает хост — файлы лежат в splittest-frontend/src/app/fonts.
2
- @import './vars.scss';
2
+ // Токены (`--color-*`) подключает вход пакета, этот файл их не эмитит.
3
3
 
4
4
  :root {
5
5
  --pink: #ff00ff;
@@ -7,7 +7,7 @@
7
7
  --window-max-height: 100vh;
8
8
  --wrapper-padding: 20px;
9
9
 
10
- @media (min-width: $tabletWidth) {
10
+ @media (min-width: 680px) {
11
11
  --wrapper-padding: 30px;
12
12
  }
13
13
  }
@@ -32,19 +32,19 @@ body {
32
32
  display: flex;
33
33
  flex-direction: column;
34
34
  margin: 0;
35
- font-family: $mainFontName;
35
+ font-family: var(--font-sans);
36
36
  -webkit-font-smoothing: antialiased;
37
37
  -moz-osx-font-smoothing: grayscale;
38
- color: $colorBlack;
39
- background-color: $mainBgColor;
40
- font-size: $bodyFontSize;
38
+ color: var(--color-black);
39
+ background-color: var(--color-white);
40
+ font-size: var(--text-sm);
41
41
  line-height: 20px;
42
42
  font-weight: 400;
43
43
 
44
44
  &::after {
45
45
  content: '';
46
46
  display: block;
47
- background-color: rgba($colorBlack, 0.3);
47
+ background-color: color-mix(in srgb, var(--color-black) 30%, transparent);
48
48
  position: fixed;
49
49
  left: 0;
50
50
  top: 0;
@@ -91,11 +91,11 @@ body {
91
91
  padding-left: var(--wrapper-padding);
92
92
  padding-right: var(--wrapper-padding);
93
93
 
94
- @media (min-width: $tabletWidth) {
94
+ @media (min-width: 680px) {
95
95
  max-width: 680px;
96
96
  }
97
97
 
98
- @media (min-width: $laptopWidth) {
98
+ @media (min-width: 1000px) {
99
99
  max-width: 1000px;
100
100
  }
101
101
  }
@@ -115,13 +115,13 @@ body {
115
115
  a {
116
116
  text-decoration: none;
117
117
  transition: color 0.3s ease;
118
- color: $colorBlack;
118
+ color: var(--color-black);
119
119
  }
120
120
 
121
121
  button {
122
- color: $colorBlack;
123
- font-size: $bodyFontSize;
124
- font-family: $mainFontName;
122
+ color: var(--color-black);
123
+ font-size: var(--text-sm);
124
+ font-family: var(--font-sans);
125
125
 
126
126
  &:not(:disabled) {
127
127
  cursor: pointer;
@@ -144,16 +144,16 @@ table {
144
144
 
145
145
  td {
146
146
  word-break: break-word;
147
- border-top: 1px solid $borderColor;
147
+ border-top: 1px solid var(--color-border);
148
148
  padding: 15px 0;
149
149
  }
150
150
 
151
151
  tr:last-of-type td {
152
- border-bottom: 1px solid $borderColor;
152
+ border-bottom: 1px solid var(--color-border);
153
153
  }
154
154
 
155
155
  th {
156
- color: rgba($colorBlack, 0.5);
156
+ color: color-mix(in srgb, var(--color-black) 50%, transparent);
157
157
  font-size: 11px;
158
158
  line-height: 15px;
159
159
  text-align: left;
@@ -173,7 +173,7 @@ h1 {
173
173
  font-size: 28px;
174
174
  line-height: 30px;
175
175
 
176
- @media (min-width: $tabletWidth) {
176
+ @media (min-width: 680px) {
177
177
  font-size: 45px;
178
178
  line-height: 50px;
179
179
  }
@@ -1,5 +1,3 @@
1
- @import './vars.scss';
2
-
3
1
  @mixin btn-focus {
4
2
  &:focus {
5
3
  outline: initial;
@@ -10,7 +8,7 @@
10
8
  }
11
9
 
12
10
  &:focus-visible {
13
- outline: 1px solid $colorBlack;
11
+ outline: 1px solid var(--color-black);
14
12
  background: transparent;
15
13
  }
16
14
  }
@@ -39,12 +37,12 @@
39
37
  padding: 0 9px;
40
38
  font-size: 14px;
41
39
  font-weight: 700;
42
- color: $colorWhite;
43
- background-color: $colorBlue;
40
+ color: var(--color-white);
41
+ background-color: var(--color-blue);
44
42
  border: none;
45
43
  border-radius: 5px;
46
44
  cursor: pointer;
47
- transition: $tr;
45
+ transition: all var(--default-transition-duration) var(--default-transition-timing-function);
48
46
 
49
47
  &:disabled {
50
48
  background-color: rgba(0, 0, 0, 0.1);
@@ -54,19 +52,19 @@
54
52
 
55
53
  &:active,
56
54
  &:hover {
57
- background-color: $colorBlack;
55
+ background-color: var(--color-black);
58
56
  }
59
57
  }
60
58
 
61
59
  @mixin input-min {
62
60
  height: 38px;
63
- border-radius: $borderRadius;
64
- border: 4px solid $colorWhite;
61
+ border-radius: var(--radius-sm);
62
+ border: 4px solid var(--color-white);
65
63
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
66
64
  padding: 0 15px;
67
65
  font-size: 14px;
68
- transition: $tr;
69
- background-color: $colorWhite;
66
+ transition: all var(--default-transition-duration) var(--default-transition-timing-function);
67
+ background-color: var(--color-white);
70
68
  appearance: none;
71
69
  outline: none;
72
70
 
@@ -76,10 +74,10 @@
76
74
  }
77
75
 
78
76
  &--recommend {
79
- background-color: rgba(#ffbf00, 0.1);
77
+ background-color: color-mix(in srgb, var(--color-yellow) 10%, transparent);
80
78
 
81
79
  &:not([value='']) {
82
- background-color: $colorWhite;
80
+ background-color: var(--color-white);
83
81
  }
84
82
  }
85
83
 
@@ -87,14 +85,14 @@
87
85
  background-color: rgba(#ff002a, 0.1);
88
86
 
89
87
  &:valid {
90
- background-color: $colorWhite;
88
+ background-color: var(--color-white);
91
89
  }
92
90
  }
93
91
 
94
92
  &:disabled {
95
93
  background-color: rgba(0, 0, 0, 0.1);
96
- border-color: $borderColor;
97
- color: rgba($colorBlack, 0.5);
94
+ border-color: var(--color-border);
95
+ color: color-mix(in srgb, var(--color-black) 50%, transparent);
98
96
  outline-offset: 0;
99
97
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
100
98
 
@@ -105,10 +103,10 @@
105
103
  }
106
104
 
107
105
  &::-webkit-input-placeholder {
108
- color: rgba($colorBlack, 0.5);
106
+ color: color-mix(in srgb, var(--color-black) 50%, transparent);
109
107
  }
110
108
 
111
- @media (max-width: $tabletWidth) {
109
+ @media (max-width: 680px) {
112
110
  font-size: 16px;
113
111
  }
114
112
  }
@@ -122,7 +120,7 @@
122
120
  display: block;
123
121
  width: calc(100% - 1px);
124
122
  height: 2px;
125
- background-color: $colorBlack;
123
+ background-color: var(--color-black);
126
124
  }
127
125
 
128
126
  @mixin popupShow {
@@ -141,11 +139,11 @@
141
139
  z-index: 0;
142
140
  max-width: $maxWidth;
143
141
  padding: $padding;
144
- box-shadow: $popupBoxShadow;
145
- background: $colorWhite;
142
+ box-shadow: var(--shadow-xl);
143
+ background: var(--color-white);
146
144
  border-radius: 5px;
147
145
  text-align: left;
148
- color: $colorBlack;
146
+ color: var(--color-black);
149
147
  }
150
148
 
151
149
  @mixin buttonArea($width: 20px) {
@@ -168,7 +166,7 @@
168
166
  line-height: 20px;
169
167
  font-weight: 900;
170
168
 
171
- @media (min-width: $tabletWidth) {
169
+ @media (min-width: 680px) {
172
170
  margin-bottom: 15px;
173
171
  }
174
172
  }
@@ -177,7 +175,7 @@
177
175
  display: flex;
178
176
  align-items: center;
179
177
  justify-content: center;
180
- border: 1px solid $borderColor;
178
+ border: 1px solid var(--color-border);
181
179
  overflow: hidden;
182
180
 
183
181
  img {
@@ -1,39 +1,36 @@
1
- // Токены splittest. Источник: splittest-frontend/src/app/styles/vars.scss
2
- $colorBlack: #000;
3
- $colorWhite: #fff;
1
+ // Токены splittest. Имена как у Tailwind, значения свои — не дефолтная шкала.
2
+ // В @media custom properties нельзя: там те же px, что у --breakpoint-*.
3
+ :root {
4
+ --color-black: #000;
5
+ --color-white: #fff;
6
+ --color-blue: #002bff;
7
+ --color-red: #ff0000;
8
+ --color-green: #00a66f;
9
+ --color-yellow: #ffbf00;
10
+ --color-orange: #ff7f00;
11
+ --color-gray: #808080;
12
+ --color-neutral-100: #f7f7f7;
13
+ --color-neutral-200: #e5e5e5;
14
+ --color-neutral-500: #727272;
15
+ --color-input: #d9d9d9;
16
+ --color-border: color-mix(in srgb, var(--color-black) 10%, transparent);
17
+ --color-sidebar: color-mix(in srgb, var(--color-black) 3%, transparent);
4
18
 
5
- $colorBlue: #002bff;
6
- $colorRed: #ff0000;
7
- $colorGreen: #00a66f;
8
- $colorYellow: #ffbf00;
9
- $colorGray: #e5e5e5;
10
- $colorGrayIcon: #727272;
11
- $colorGrayTwo: #808080;
12
- $colorOrange: #ff7f00;
13
- $colorBackground: #f7f7f7;
19
+ --radius-sm: 5px;
20
+ --radius-lg: 10px;
14
21
 
15
- $borderRadius: 5px;
16
- $borderRadiusBig: 10px;
17
- $borderColor: rgba($colorBlack, 0.1);
18
- $borderShadowTop: 0 -1px 0 0 $borderColor;
19
- $borderShadowBottom: 0 1px 0 0 $borderColor;
20
- $borderInputColor: #d9d9d9;
21
- $tr: all 0.3s ease;
22
- $trParam: 0.3s ease;
23
- $trBg: background-color 0.3s ease;
24
- $popupBoxShadow: 0px 10px 40px 0px rgba(0, 0, 0, 0.15);
25
- $bgColorSidebarBlock: rgba(0, 0, 0, 0.03);
22
+ --font-sans: 'Inter', sans-serif;
23
+ --text-sm: 14px;
26
24
 
27
- $inputRecomendBg: rgba(#ffbf00, 0.1);
28
- $inputRequiredBg: rgba(#ff0000, 0.1);
29
- $inputErrorBorder: rgba(#ff0000, 0.5);
25
+ --shadow-xl: 0 10px 40px 0 rgb(0 0 0 / 0.15);
26
+ --shadow-t: 0 -1px 0 0 var(--color-border);
27
+ --shadow-b: 0 1px 0 0 var(--color-border);
30
28
 
31
- $desktopWidth: 1200px;
32
- $laptopWidth: 1000px;
33
- $tabletWidth: 680px;
34
- $mobileWidth: 576px;
29
+ --breakpoint-sm: 576px;
30
+ --breakpoint-md: 680px;
31
+ --breakpoint-lg: 1000px;
32
+ --breakpoint-xl: 1200px;
35
33
 
36
- $mainFontName: 'Inter', sans-serif;
37
- $bodyFontSize: 14px;
38
- $mainBgColor: #fff;
39
- $mainIndexBgColor: #f0f1f5;
34
+ --default-transition-duration: 0.3s;
35
+ --default-transition-timing-function: ease;
36
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@de-kit/st-ui",
3
- "version": "0.1.0",
4
- "description": "React-компоненты splittest: SCSS-модули и токены из основного фронтенда",
3
+ "version": "0.1.1",
4
+ "description": "React-компоненты splittest: глобальный SCSS и токены из основного фронтенда",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1,22 +0,0 @@
1
- // \0rolldown/runtime.js
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
- key = keys[i];
11
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
- get: ((k) => from[k]).bind(null, key),
13
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
- });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
- value: mod,
20
- enumerable: true
21
- }) : target, mod));
22
- exports.__toESM = __toESM;